)]}' {"version":3,"file":"WebClient.js","sources":["../../../../../DelphiComps/TMS/WEB Core RSXE12/Core Source/RTL/tms.js","../../../../../DelphiComps/TMS/WEB Core RSXE12/Core Source/RTL/rtl.js","../../../../../DelphiComps/TMS/WEB Core RSXE12/Core Source/RTL/system.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/Core Source/RTL/rtlconsts.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/Core Source/RTL/types.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/Core Source/RTL/js.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/Core Source/RTL/sysutils.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/Core Source/RTL/typinfo.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/Core Source/RTL/simplelinkedlist.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/Core Source/RTL/web.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/Core Source/RTL/classes.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/Core Source/RTL/math.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/Core Source/WEBLib.Consts.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/Core Source/WEBLib.Utils.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/Core Source/WEBLib.WebTools.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/Core Source/RTL/contnrs.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/Core Source/WEBLib.Graphics.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/Core Source/WEBLib.WebCtrls.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/Core Source/WEBLib.Controls.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/Core Source/WEBLib.Dialogs.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/Core Source/WEBLib.Modules.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/Core Source/WEBLib.Lang.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/Core Source/WEBLib.Menus.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/Core Source/WEBLib.JSON.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/Core Source/WEBLib.ClientConnector.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/Core Source/WEBLib.Forms.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/Core Source/WEBLib.StdCtrls.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/Core Source/WEBLib.ExtCtrls.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/TMS WEB Core RSXE12/Core Source/XData/Bcl.Json.Common.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/TMS WEB Core RSXE12/Core Source/XData/Bcl.Collections.Common.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/TMS WEB Core RSXE12/Core Source/XData/XData.Web.Headers.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/TMS WEB Core RSXE12/Core Source/XData/XData.Web.Request.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/TMS WEB Core RSXE12/Core Source/XData/XData.Web.Response.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/Core Source/RTL/strutils.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/Core Source/RTL/generics.strings.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/Core Source/RTL/generics.defaults.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/Core Source/RTL/generics.collections.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/TMS WEB Core RSXE12/Core Source/XData/Bcl.Json.Attributes.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/TMS WEB Core RSXE12/Core Source/XData/Bcl.Rtti.Common.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/TMS WEB Core RSXE12/Core Source/XData/Bcl.SysUtils.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/Core Source/RTL/dateutils.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/TMS WEB Core RSXE12/Core Source/XData/Bcl.Utils.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/TMS WEB Core RSXE12/Core Source/XData/XData.Model.Types.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/TMS WEB Core RSXE12/Core Source/XData/XData.Types.Converters.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/TMS WEB Core RSXE12/Core Source/XData/XData.Utils.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/TMS WEB Core RSXE12/Core Source/XData/XData.Model.Classes.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/TMS WEB Core RSXE12/Core Source/XData/Bcl.TypInfo.Common.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/TMS WEB Core RSXE12/Core Source/XData/XData.Model.Deserializer.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/TMS WEB Core RSXE12/Core Source/XData/XData.Web.Connection.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/TMS WEB Core RSXE12/Core Source/XData/XData.Bind.Converter.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/TMS WEB Core RSXE12/Core Source/XData/XData.Web.Client.pas","../../Parameters.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/Core Source/WEBLib.Imaging.gifimg.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/Core Source/WEBLib.Storage.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/Core Source/WEBLib.REST.pas","../../Utilities.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/Core Source/WEBLib.TreeNodes.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/Core Source/WEBLib.ComCtrls.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/Core Source/WEBLib.Buttons.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/Core Source/RTL/dbconst.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/Core Source/RTL/db.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/Core Source/jsdelphisystem.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/Core Source/WEBLib.Mask.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/Core Source/WEBLib.Grids.pas","../../entData.pas","../../TaxpayerDM.pas","../../entFieldValues.pas","../../../../../DelphiComps/TMS/WEB Core RSXE12/Core Source/WEBLib.EditAutocomplete.pas","../../UploadFiles.pas","../../TransferWeb.pas","../../ClientConnectionsDM.pas","../../Formulas.pas","../../Main.pas","../../Return.pas","../../Verification.pas","../../SectionPanels.pas","../../OCCForm.pas","../../PayServiceClient.pas","../../FieldPanelFactory.pas","../../entForms.pas","../../entReturns.pas","../../ClientCurrent.pas","../../OptionsDM.pas","../../Login.pas","../../WebClient.dpr"],"sourcesContent":["//***********************************************************************************\r\n// TMS WEB CORE framework code is copyright (c) 2018 - 2021 by tmssoftware.com bvba\r\n// The code or parts of the code cannot be used in any way outside \r\n// a TMS WEB Core application generated by a licensed user or company.\r\n//***********************************************************************************\r\n","var pas = {};\n\nvar rtl = {\n\n version: 20006,\n\n quiet: false,\n debug_load_units: false,\n debug_rtti: false,\n\n $res : {},\n\n debug: function(){\n if (rtl.quiet || !console || !console.log) return;\n console.log(arguments);\n },\n\n error: function(s){\n rtl.debug('Error: ',s);\n throw s;\n },\n\n warn: function(s){\n rtl.debug('Warn: ',s);\n },\n\n checkVersion: function(v){\n if (rtl.version != v) throw \"expected rtl version \"+v+\", but found \"+rtl.version;\n },\n\n hiInt: Math.pow(2,53),\n\n hasString: function(s){\n return rtl.isString(s) && (s.length>0);\n },\n\n isArray: function(a) {\n return Array.isArray(a);\n },\n\n isFunction: function(f){\n return typeof(f)===\"function\";\n },\n\n isModule: function(m){\n return rtl.isObject(m) && rtl.hasString(m.$name) && (pas[m.$name]===m);\n },\n\n isImplementation: function(m){\n return rtl.isObject(m) && rtl.isModule(m.$module) && (m.$module.$impl===m);\n },\n\n isNumber: function(n){\n return typeof(n)===\"number\";\n },\n\n isObject: function(o){\n var s=typeof(o);\n return (typeof(o)===\"object\") && (o!=null);\n },\n\n isString: function(s){\n return typeof(s)===\"string\";\n },\n\n getNumber: function(n){\n return typeof(n)===\"number\"?n:NaN;\n },\n\n getChar: function(c){\n return ((typeof(c)===\"string\") && (c.length===1)) ? c : \"\";\n },\n\n getObject: function(o){\n return ((typeof(o)===\"object\") || (typeof(o)==='function')) ? o : null;\n },\n\n isTRecord: function(type){\n return (rtl.isObject(type) && type.hasOwnProperty('$new') && (typeof(type.$new)==='function'));\n },\n\n isPasClass: function(type){\n return (rtl.isObject(type) && type.hasOwnProperty('$classname') && rtl.isObject(type.$module));\n },\n\n isPasClassInstance: function(type){\n return (rtl.isObject(type) && rtl.isPasClass(type.$class));\n },\n\n hexStr: function(n,digits){\n return (\"000000000000000\"+n.toString(16).toUpperCase()).slice(-digits);\n },\n\n m_loading: 0,\n m_loading_intf: 1,\n m_intf_loaded: 2,\n m_loading_impl: 3, // loading all used unit\n m_initializing: 4, // running initialization\n m_initialized: 5,\n\n module: function(module_name, intfuseslist, intfcode, impluseslist){\n if (rtl.debug_load_units) rtl.debug('rtl.module name=\"'+module_name+'\" intfuses='+intfuseslist+' impluses='+impluseslist);\n if (!rtl.hasString(module_name)) rtl.error('invalid module name \"'+module_name+'\"');\n if (!rtl.isArray(intfuseslist)) rtl.error('invalid interface useslist of \"'+module_name+'\"');\n if (!rtl.isFunction(intfcode)) rtl.error('invalid interface code of \"'+module_name+'\"');\n if (!(impluseslist==undefined) && !rtl.isArray(impluseslist)) rtl.error('invalid implementation useslist of \"'+module_name+'\"');\n\n if (pas[module_name])\n rtl.error('module \"'+module_name+'\" is already registered');\n\n var r = Object.create(rtl.tSectionRTTI);\n var module = r.$module = pas[module_name] = {\n $name: module_name,\n $intfuseslist: intfuseslist,\n $impluseslist: impluseslist,\n $state: rtl.m_loading,\n $intfcode: intfcode,\n $implcode: null,\n $impl: null,\n $rtti: r\n };\n if (impluseslist) module.$impl = {\n $module: module,\n $rtti: r\n };\n },\n\n exitcode: 0,\n\n run: function(module_name){\n try {\n if (!rtl.hasString(module_name)) module_name='program';\n if (rtl.debug_load_units) rtl.debug('rtl.run module=\"'+module_name+'\"');\n rtl.initRTTI();\n var module = pas[module_name];\n if (!module) rtl.error('rtl.run module \"'+module_name+'\" missing');\n rtl.loadintf(module);\n rtl.loadimpl(module);\n if (module_name=='program'){\n if (rtl.debug_load_units) rtl.debug('running $main');\n var r = pas.program.$main();\n if (rtl.isNumber(r)) rtl.exitcode = r;\n }\n } catch(re) {\n if (!rtl.showUncaughtExceptions) {\n throw re\n } else { \n if (!rtl.handleUncaughtException(re)) {\n rtl.showException(re);\n rtl.exitcode = 216;\n } \n }\n } \n return rtl.exitcode;\n },\n \n showException : function (re) {\n var errMsg = rtl.hasString(re.$classname) ? re.$classname : '';\n errMsg += ((errMsg) ? ': ' : '') + (re.hasOwnProperty('fMessage') ? re.fMessage : re);\n alert('Uncaught Exception : '+errMsg);\n },\n\n handleUncaughtException: function (e) {\n if (rtl.onUncaughtException) {\n try {\n rtl.onUncaughtException(e);\n return true;\n } catch (ee) {\n return false; \n }\n } else {\n return false;\n }\n },\n\n loadintf: function(module){\n if (module.$state>rtl.m_loading_intf) return; // already finished\n if (rtl.debug_load_units) rtl.debug('loadintf: \"'+module.$name+'\"');\n if (module.$state===rtl.m_loading_intf)\n rtl.error('unit cycle detected \"'+module.$name+'\"');\n module.$state=rtl.m_loading_intf;\n // load interfaces of interface useslist\n rtl.loaduseslist(module,module.$intfuseslist,rtl.loadintf);\n // run interface\n if (rtl.debug_load_units) rtl.debug('loadintf: run intf of \"'+module.$name+'\"');\n module.$intfcode(module.$intfuseslist);\n // success\n module.$state=rtl.m_intf_loaded;\n // Note: units only used in implementations are not yet loaded (not even their interfaces)\n },\n\n loaduseslist: function(module,useslist,f){\n if (useslist==undefined) return;\n var len = useslist.length;\n for (var i = 0; i=rtl.m_loading_impl) return; // already processing\n if (module.$state0){\n o = this[newinstancefnname](fn,args);\n } else if(isFunc) {\n o = new this.$func(args);\n } else {\n o = Object.create(c);\n }\n if (o.$init) o.$init();\n try{\n if (typeof(fn)===\"string\"){\n this[fn].apply(o,args);\n } else {\n fn.apply(o,args);\n };\n if (o.AfterConstruction) o.AfterConstruction();\n } catch($e){\n // do not call BeforeDestruction\n if (o.Destroy) o.Destroy();\n if (o.$final) o.$final();\n throw $e;\n }\n return o;\n };\n c.$destroy = function(fnname){\n if (this.BeforeDestruction) this.BeforeDestruction();\n if (this[fnname]) this[fnname]();\n if (this.$final) this.$final();\n };\n rtl.initClass(c,parent,name,initfn,rttiname);\n if (isFunc){\n function f(){}\n f.prototype = c;\n c.$func = f;\n }\n },\n\n createHelper: function(parent,name,ancestor,initfn,rttiname){\n // create a helper,\n // ancestor must be null or a helper,\n var c = null;\n if (ancestor != null){\n c = Object.create(ancestor);\n c.$ancestor = ancestor;\n // c.$ancestor === Object.getPrototypeOf(c)\n } else {\n c = { $ancestor: null };\n };\n parent[name] = c;\n c.$class = c; // Note: o.$class === Object.getPrototypeOf(o)\n c.$classname = rttiname?rttiname:name;\n parent = rtl.initStruct(c,parent,name);\n c.$fullname = parent.$name+'.'+name;\n // rtti\n var t = c.$module.$rtti.$Helper(c.$classname,{ \"helper\": c });\n c.$rtti = t;\n if (rtl.isObject(ancestor)) t.ancestor = ancestor.$rtti;\n if (!t.ancestor) t.ancestor = null;\n // init members\n initfn.call(c);\n },\n\n tObjectDestroy: \"Destroy\",\n\n free: function(obj,name){\n if (obj[name]==null) return null;\n obj[name].$destroy(rtl.tObjectDestroy);\n obj[name]=null;\n },\n\n freeLoc: function(obj){\n if (obj==null) return null;\n obj.$destroy(rtl.tObjectDestroy);\n return null;\n },\n\n hideProp: function(o,p,v){\n Object.defineProperty(o,p, {\n enumerable: false,\n configurable: true,\n writable: true\n });\n if(arguments.length>2){ o[p]=v; }\n },\n\n recNewT: function(parent,name,initfn,full){\n // create new record type\n var t = {};\n if (parent) parent[name] = t;\n var h = rtl.hideProp;\n if (full){\n rtl.initStruct(t,parent,name);\n t.$record = t;\n h(t,'$record');\n h(t,'$name');\n h(t,'$parent');\n h(t,'$module');\n h(t,'$initSpec');\n }\n initfn.call(t);\n if (!t.$new){\n t.$new = function(){ return Object.create(t); };\n }\n t.$clone = function(r){ return t.$new().$assign(r); };\n h(t,'$new');\n h(t,'$clone');\n h(t,'$eq');\n h(t,'$assign');\n return t;\n },\n\n is: function(instance,type){\n return type.isPrototypeOf(instance) || (instance===type);\n },\n\n isExt: function(instance,type,mode){\n // mode===1 means instance must be a Pascal class instance\n // mode===2 means instance must be a Pascal class\n // Notes:\n // isPrototypeOf and instanceof return false on equal\n // isPrototypeOf does not work for Date.isPrototypeOf(new Date())\n // so if isPrototypeOf is false test with instanceof\n // instanceof needs a function on right side\n if (instance == null) return false; // Note: ==null checks for undefined too\n if ((typeof(type) !== 'object') && (typeof(type) !== 'function')) return false;\n if (instance === type){\n if (mode===1) return false;\n if (mode===2) return rtl.isPasClass(instance);\n return true;\n }\n if (type.isPrototypeOf && type.isPrototypeOf(instance)){\n if (mode===1) return rtl.isPasClassInstance(instance);\n if (mode===2) return rtl.isPasClass(instance);\n return true;\n }\n if ((typeof type == 'function') && (instance instanceof type)) return true;\n return false;\n },\n\n Exception: null,\n EInvalidCast: null,\n EAbstractError: null,\n ERangeError: null,\n EIntOverflow: null,\n EPropWriteOnly: null,\n\n raiseE: function(typename){\n var t = rtl[typename];\n if (t==null){\n var mod = pas.SysUtils;\n if (!mod) mod = pas.sysutils;\n if (mod){\n t = mod[typename];\n if (!t) t = mod[typename.toLowerCase()];\n if (!t) t = mod['Exception'];\n if (!t) t = mod['exception'];\n }\n }\n if (t){\n if (t.Create){\n throw t.$create(\"Create\");\n } else if (t.create){\n throw t.$create(\"create\");\n }\n }\n if (typename === \"EInvalidCast\") throw \"invalid type cast\";\n if (typename === \"EAbstractError\") throw \"Abstract method called\";\n if (typename === \"ERangeError\") throw \"range error\";\n throw typename;\n },\n\n as: function(instance,type){\n if((instance === null) || rtl.is(instance,type)) return instance;\n rtl.raiseE(\"EInvalidCast\");\n },\n\n asExt: function(instance,type,mode){\n if((instance === null) || rtl.isExt(instance,type,mode)) return instance;\n rtl.raiseE(\"EInvalidCast\");\n },\n\n createInterface: function(module, name, guid, fnnames, ancestor, initfn){\n //console.log('createInterface name=\"'+name+'\" guid=\"'+guid+'\" names='+fnnames);\n var i = ancestor?Object.create(ancestor):{};\n module[name] = i;\n i.$module = module;\n i.$name = name;\n i.$fullname = module.$name+'.'+name;\n i.$guid = guid;\n i.$guidr = null;\n i.$names = fnnames?fnnames:[];\n if (rtl.isFunction(initfn)){\n // rtti\n if (rtl.debug_rtti) rtl.debug('createInterface '+i.$fullname);\n var t = i.$module.$rtti.$Interface(name,{ \"interface\": i, module: module });\n i.$rtti = t;\n if (ancestor) t.ancestor = ancestor.$rtti;\n if (!t.ancestor) t.ancestor = null;\n initfn.call(i);\n }\n return i;\n },\n\n strToGUIDR: function(s,g){\n var p = 0;\n function n(l){\n var h = s.substr(p,l);\n p+=l;\n return parseInt(h,16);\n }\n p+=1; // skip {\n g.D1 = n(8);\n p+=1; // skip -\n g.D2 = n(4);\n p+=1; // skip -\n g.D3 = n(4);\n p+=1; // skip -\n if (!g.D4) g.D4=[];\n g.D4[0] = n(2);\n g.D4[1] = n(2);\n p+=1; // skip -\n for(var i=2; i<8; i++) g.D4[i] = n(2);\n return g;\n },\n\n guidrToStr: function(g){\n if (g.$intf) return g.$intf.$guid;\n var h = rtl.hexStr;\n var s='{'+h(g.D1,8)+'-'+h(g.D2,4)+'-'+h(g.D3,4)+'-'+h(g.D4[0],2)+h(g.D4[1],2)+'-';\n for (var i=2; i<8; i++) s+=h(g.D4[i],2);\n s+='}';\n return s;\n },\n\n createTGUID: function(guid){\n var TGuid = (pas.System)?pas.System.TGuid:pas.system.tguid;\n var g = rtl.strToGUIDR(guid,TGuid.$new());\n return g;\n },\n\n getIntfGUIDR: function(intfTypeOrVar){\n if (!intfTypeOrVar) return null;\n if (!intfTypeOrVar.$guidr){\n var g = rtl.createTGUID(intfTypeOrVar.$guid);\n if (!intfTypeOrVar.hasOwnProperty('$guid')) intfTypeOrVar = Object.getPrototypeOf(intfTypeOrVar);\n g.$intf = intfTypeOrVar;\n intfTypeOrVar.$guidr = g;\n }\n return intfTypeOrVar.$guidr;\n },\n\n addIntf: function (aclass, intf, map){\n function jmp(fn){\n if (typeof(fn)===\"function\"){\n return function(){ return fn.apply(this.$o,arguments); };\n } else {\n return function(){ rtl.raiseE('EAbstractError'); };\n }\n }\n if(!map) map = {};\n var t = intf;\n var item = Object.create(t);\n if (!aclass.hasOwnProperty('$intfmaps')) aclass.$intfmaps = {};\n aclass.$intfmaps[intf.$guid] = item;\n do{\n var names = t.$names;\n if (!names) break;\n for (var i=0; i=-0x1fffffffffffff) && (i<=0x1fffffffffffff)) return i;\n rtl.raiseE('EIntOverflow');\n },\n\n rc: function(i,minval,maxval){\n // range check integer\n if ((Math.floor(i)===i) && (i>=minval) && (i<=maxval)) return i;\n rtl.raiseE('ERangeError');\n },\n\n rcc: function(c,minval,maxval){\n // range check char\n if ((typeof(c)==='string') && (c.length===1)){\n var i = c.charCodeAt(0);\n if ((i>=minval) && (i<=maxval)) return c;\n }\n rtl.raiseE('ERangeError');\n },\n\n rcSetCharAt: function(s,index,c){\n // range check setCharAt\n if ((typeof(s)!=='string') || (index<0) || (index>=s.length)) rtl.raiseE('ERangeError');\n return rtl.setCharAt(s,index,c);\n },\n\n rcCharAt: function(s,index){\n // range check charAt\n if ((typeof(s)!=='string') || (index<0) || (index>=s.length)) rtl.raiseE('ERangeError');\n return s.charAt(index);\n },\n\n rcArrR: function(arr,index){\n // range check read array\n if (Array.isArray(arr) && (typeof(index)==='number') && (index>=0) && (index2){\n // arr,index1,index2,...\n arr=arr[index];\n for (var i=2; i=0) && (index0){\n item=stack[depth-1];\n src = (item.src && item.src.length>item.i)?item.src[item.i]:null;\n }\n if (!src){\n a = [];\n srclen = 0;\n oldlen = 0;\n } else if (src.$pas2jsrefcnt>0 || depth>=s){\n a = [];\n srclen = src.length;\n oldlen = srclen;\n } else {\n a = src;\n srclen = 0;\n oldlen = a.length;\n }\n lastlen = stack[depth].dim;\n a.length = lastlen;\n if (depth>0){\n item.a[item.i]=a;\n item.i++;\n if ((lastlen===0) && (item.i0){\n if (depthlastlen) srclen=lastlen;\n if (rtl.isArray(defaultvalue)){\n // array of dyn array\n for (var i=0; i0) && (stack[depth-1].i>=stack[depth-1].dim)){\n depth--;\n };\n if (depth===0){\n if (dimmax===0) return a;\n return stack[0].a;\n }\n }while (true);\n },\n\n arrayEq: function(a,b){\n if (a===null) return b===null;\n if (b===null) return false;\n if (a.length!==b.length) return false;\n for (var i=0; isrcarray.length) end = srcarray.length;\n if (index>=end) return [];\n if (type===0){\n return srcarray.slice(index,end);\n } else {\n var a = [];\n a.length = end-index;\n rtl.arrayClone(type,srcarray,index,end,a,0);\n return a;\n }\n },\n\n arrayInsert: function(item, arr, index){\n if (arr){\n arr.splice(index,0,item);\n return arr;\n } else {\n return [item];\n }\n },\n\n setCharAt: function(s,index,c){\n return s.substr(0,index)+c+s.substr(index+1);\n },\n\n getResStr: function(mod,name){\n var rs = mod.$resourcestrings[name];\n return rs.current?rs.current:rs.org;\n },\n\n createSet: function(){\n var s = {};\n for (var i=0; i newlen){\n return s.substring(0,newlen);\n } else if (s.repeat){\n // Note: repeat needs ECMAScript6!\n return s+' '.repeat(newlen-oldlen);\n } else {\n while (oldlen=width) return s;\n if (s.repeat){\n // Note: repeat needs ECMAScript6!\n return ' '.repeat(width-l) + s;\n } else {\n while (l2){\n return rtl.spaceLeft(d.toFixed(p),w);\n } else {\n\t // exponent width\n\t var pad = \"\";\n\t var ad = Math.abs(d);\n\t if (ad<1.0e+10) {\n\t\tpad='00';\n\t } else if (ad<1.0e+100) {\n\t\tpad='0';\n } \t\n\t if (arguments.length<2) {\n\t w=9;\t\t\n } else if (w<9) {\n\t\tw=9;\n }\t\t \n var p = w-8;\n var s=(d>0 ? \" \" : \"\" ) + d.toExponential(p);\n s=s.replace(/e(.)/,'E$1'+pad);\n return rtl.spaceLeft(s,w);\n }\n },\n\n valEnum: function(s, enumType, setCodeFn){\n s = s.toLowerCase();\n for (var key in enumType){\n if((typeof(key)==='string') && (key.toLowerCase()===s)){\n setCodeFn(0);\n return enumType[key];\n }\n }\n setCodeFn(1);\n return 0;\n },\n\n lw: function(l){\n // fix longword bitwise operation\n return l<0?l+0x100000000:l;\n },\n\n and: function(a,b){\n var hi = 0x80000000;\n var low = 0x7fffffff;\n var h = (a / hi) & (b / hi);\n var l = (a & low) & (b & low);\n return h*hi + l;\n },\n\n or: function(a,b){\n var hi = 0x80000000;\n var low = 0x7fffffff;\n var h = (a / hi) | (b / hi);\n var l = (a & low) | (b & low);\n return h*hi + l;\n },\n\n xor: function(a,b){\n var hi = 0x80000000;\n var low = 0x7fffffff;\n var h = (a / hi) ^ (b / hi);\n var l = (a & low) ^ (b & low);\n return h*hi + l;\n },\n\n shr: function(a,b){\n if (a<0) a += rtl.hiInt;\n if (a<0x80000000) return a >> b;\n if (b<=0) return a;\n if (b>54) return 0;\n return Math.floor(a / Math.pow(2,b));\n },\n\n shl: function(a,b){\n if (a<0) a += rtl.hiInt;\n if (b<=0) return a;\n if (b>54) return 0;\n var r = a * Math.pow(2,b);\n if (r <= rtl.hiInt) return r;\n return r % rtl.hiInt;\n },\n\n initRTTI: function(){\n if (rtl.debug_rtti) rtl.debug('initRTTI');\n\n // base types\n rtl.tTypeInfo = { name: \"tTypeInfo\" };\n function newBaseTI(name,kind,ancestor){\n if (!ancestor) ancestor = rtl.tTypeInfo;\n if (rtl.debug_rtti) rtl.debug('initRTTI.newBaseTI \"'+name+'\" '+kind+' (\"'+ancestor.name+'\")');\n var t = Object.create(ancestor);\n t.name = name;\n t.kind = kind;\n rtl[name] = t;\n return t;\n };\n function newBaseInt(name,minvalue,maxvalue,ordtype){\n var t = newBaseTI(name,1 /* tkInteger */,rtl.tTypeInfoInteger);\n t.minvalue = minvalue;\n t.maxvalue = maxvalue;\n t.ordtype = ordtype;\n return t;\n };\n newBaseTI(\"tTypeInfoInteger\",1 /* tkInteger */);\n newBaseInt(\"shortint\",-0x80,0x7f,0);\n newBaseInt(\"byte\",0,0xff,1);\n newBaseInt(\"smallint\",-0x8000,0x7fff,2);\n newBaseInt(\"word\",0,0xffff,3);\n newBaseInt(\"longint\",-0x80000000,0x7fffffff,4);\n newBaseInt(\"longword\",0,0xffffffff,5);\n newBaseInt(\"nativeint\",-0x10000000000000,0xfffffffffffff,6);\n newBaseInt(\"nativeuint\",0,0xfffffffffffff,7);\n newBaseTI(\"char\",2 /* tkChar */);\n newBaseTI(\"string\",3 /* tkString */);\n newBaseTI(\"tTypeInfoEnum\",4 /* tkEnumeration */,rtl.tTypeInfoInteger);\n newBaseTI(\"tTypeInfoSet\",5 /* tkSet */);\n newBaseTI(\"double\",6 /* tkDouble */);\n newBaseTI(\"boolean\",7 /* tkBool */);\n newBaseTI(\"tTypeInfoProcVar\",8 /* tkProcVar */);\n newBaseTI(\"tTypeInfoMethodVar\",9 /* tkMethod */,rtl.tTypeInfoProcVar);\n newBaseTI(\"tTypeInfoArray\",10 /* tkArray */);\n newBaseTI(\"tTypeInfoDynArray\",11 /* tkDynArray */);\n newBaseTI(\"tTypeInfoPointer\",15 /* tkPointer */);\n var t = newBaseTI(\"pointer\",15 /* tkPointer */,rtl.tTypeInfoPointer);\n t.reftype = null;\n newBaseTI(\"jsvalue\",16 /* tkJSValue */);\n newBaseTI(\"tTypeInfoRefToProcVar\",17 /* tkRefToProcVar */,rtl.tTypeInfoProcVar);\n\n // member kinds\n rtl.tTypeMember = {};\n function newMember(name,kind){\n var m = Object.create(rtl.tTypeMember);\n m.name = name;\n m.kind = kind;\n rtl[name] = m;\n };\n newMember(\"tTypeMemberField\",1); // tmkField\n newMember(\"tTypeMemberMethod\",2); // tmkMethod\n newMember(\"tTypeMemberProperty\",3); // tmkProperty\n\n // base object for storing members: a simple object\n rtl.tTypeMembers = {};\n\n // tTypeInfoStruct - base object for tTypeInfoClass, tTypeInfoRecord, tTypeInfoInterface\n var tis = newBaseTI(\"tTypeInfoStruct\",0);\n tis.$addMember = function(name,ancestor,options){\n if (rtl.debug_rtti){\n if (!rtl.hasString(name) || (name.charAt()==='$')) throw 'invalid member \"'+name+'\", this=\"'+this.name+'\"';\n if (!rtl.is(ancestor,rtl.tTypeMember)) throw 'invalid ancestor \"'+ancestor+':'+ancestor.name+'\", \"'+this.name+'.'+name+'\"';\n if ((options!=undefined) && (typeof(options)!='object')) throw 'invalid options \"'+options+'\", \"'+this.name+'.'+name+'\"';\n };\n var t = Object.create(ancestor);\n t.name = name;\n this.members[name] = t;\n this.names.push(name);\n if (rtl.isObject(options)){\n for (var key in options) if (options.hasOwnProperty(key)) t[key] = options[key];\n };\n return t;\n };\n tis.addField = function(name,type,options){\n var t = this.$addMember(name,rtl.tTypeMemberField,options);\n if (rtl.debug_rtti){\n if (!rtl.is(type,rtl.tTypeInfo)) throw 'invalid type \"'+type+'\", \"'+this.name+'.'+name+'\"';\n };\n t.typeinfo = type;\n this.fields.push(name);\n return t;\n };\n tis.addFields = function(){\n var i=0;\n while(i = array of T;\r\n\r\n{*****************************************************************************\r\n TObject, TClass, IUnknown, IInterface, TInterfacedObject\r\n*****************************************************************************}\r\ntype\r\n TGuid = record\r\n D1: DWord;\r\n D2: word;\r\n D3: word;\r\n D4: array[0..7] of byte;\r\n end;\r\n TGUIDString = type string;\r\n\r\n PMethod = ^TMethod;\r\n TMethod = record\r\n Code : CodePointer;\r\n Data : Pointer;\r\n end;\r\n\r\n TClass = class of TObject;\r\n\r\n { TObject }\r\n\r\n {$DispatchField Msg} // enable checking message methods for record field name \"Msg\"\r\n {$DispatchStrField MsgStr}\r\n TObject = class\r\n private\r\n class var FClassName: String; external name '$classname';\r\n class var FClassParent: TClass; external name '$ancestor';\r\n class var FUnitName: String; external name '$module.$name';\r\n public\r\n constructor Create;\r\n destructor Destroy; virtual;\r\n\r\n // Free is using compiler magic.\r\n // Reasons:\r\n // 1. In JS calling obj.Free when obj=nil would crash.\r\n // 2. In JS freeing memory requires to set all references to nil.\r\n // Therefore any obj.free call is replaced by the compiler with some rtl magic.\r\n procedure Free;\r\n\r\n class function ClassType: TClass; assembler;\r\n class property ClassName: String read FClassName;\r\n class function ClassNameIs(const Name: string): boolean;\r\n class property ClassParent: TClass read FClassParent;\r\n class function InheritsFrom(aClass: TClass): boolean; assembler;\r\n class property UnitName: String read FUnitName;\r\n Class function MethodName(aCode : Pointer) : String;\r\n Class function MethodAddress(aName : String) : Pointer;\r\n Class Function FieldAddress(aName : String) : Pointer;\r\n Class Function ClassInfo : Pointer;\r\n\r\n procedure AfterConstruction; virtual;\r\n procedure BeforeDestruction; virtual;\r\n\r\n // message handling routines\r\n procedure Dispatch(var aMessage); virtual;\r\n procedure DispatchStr(var aMessage); virtual;\r\n procedure DefaultHandler(var aMessage); virtual;\r\n procedure DefaultHandlerStr(var aMessage); virtual;\r\n\r\n function GetInterface(const iid: TGuid; out obj): boolean;\r\n function GetInterface(const iidstr: String; out obj): boolean; inline;\r\n function GetInterfaceByStr(const iidstr: String; out obj): boolean;\r\n function GetInterfaceWeak(const iid: TGuid; out obj): boolean; // equal to GetInterface but the interface returned is not referenced\r\n\r\n function Equals(Obj: TObject): boolean; virtual;\r\n function ToString: String; virtual;\r\n end;\r\n\r\n { TCustomAttribute - base class of all user defined attributes. }\r\n\r\n TCustomAttribute = class\r\n end;\r\n TCustomAttributeArray = array of TCustomAttribute;\r\n\r\nconst\r\n { IInterface }\r\n S_OK = 0;\r\n S_FALSE = 1;\r\n E_NOINTERFACE = -2147467262; // FPC: longint($80004002)\r\n E_UNEXPECTED = -2147418113; // FPC: longint($8000FFFF)\r\n E_NOTIMPL = -2147467263; // FPC: longint($80004001)\r\n\r\ntype\r\n {$Interfaces COM}\r\n IUnknown = interface\r\n ['{00000000-0000-0000-C000-000000000046}']\r\n function QueryInterface(const iid: TGuid; out obj): Integer;\r\n function _AddRef: Integer;\r\n function _Release: Integer;\r\n end;\r\n IInterface = IUnknown;\r\n\r\n {$M+}\r\n IInvokable = interface(IInterface)\r\n end;\r\n {$M-}\r\n\r\n { Enumerator support }\r\n IEnumerator = interface(IInterface)\r\n function GetCurrent: TObject;\r\n function MoveNext: Boolean;\r\n procedure Reset;\r\n property Current: TObject read GetCurrent;\r\n end;\r\n\r\n IEnumerable = interface(IInterface)\r\n function GetEnumerator: IEnumerator;\r\n end;\r\n\r\n { TInterfacedObject }\r\n\r\n TInterfacedObject = class(TObject,IUnknown)\r\n protected\r\n fRefCount: Integer;\r\n { implement methods of IUnknown }\r\n function QueryInterface(const iid: TGuid; out obj): Integer; virtual;\r\n function _AddRef: Integer; virtual;\r\n function _Release: Integer; virtual;\r\n public\r\n procedure BeforeDestruction; override;\r\n property RefCount: Integer read fRefCount;\r\n end;\r\n TInterfacedClass = class of TInterfacedObject;\r\n\r\n { TAggregatedObject - sub or satellite object using same interface as controller }\r\n\r\n TAggregatedObject = class(TObject)\r\n private\r\n fController: Pointer;\r\n function GetController: IUnknown;\r\n protected\r\n { implement methods of IUnknown }\r\n function QueryInterface(const iid: TGuid; out obj): Integer; virtual;\r\n function _AddRef: Integer; virtual;\r\n function _Release: Integer; virtual;\r\n public\r\n constructor Create(const aController: IUnknown); reintroduce;\r\n property Controller: IUnknown read GetController;\r\n end;\r\n\r\n { TContainedObject }\r\n\r\n TContainedObject = class(TAggregatedObject,IInterface)\r\n protected\r\n function QueryInterface(const iid: TGuid; out obj): Integer; override;\r\n end;\r\n\r\nconst\r\n { for safe as operator support }\r\n IObjectInstance: TGuid = '{D91C9AF4-3C93-420F-A303-BF5BA82BFD23}';\r\n\r\nfunction GUIDToString(const GUID: TGUID): string; external name 'rtl.guidrToStr';\r\n\r\n{*****************************************************************************\r\n RTTI support\r\n*****************************************************************************}\r\ntype\r\n // if you change the following enumeration type in any way\r\n // you also have to change the rtl.js in an appropriate way !\r\n TTypeKind = (\r\n tkUnknown, // 0\r\n tkInteger, // 1\r\n tkChar, // 2 in Delphi/FPC tkWChar, tkUChar\r\n tkString, // 3 in Delphi/FPC tkSString, tkWString or tkUString\r\n tkEnumeration, // 4\r\n tkSet, // 5\r\n tkDouble, // 6\r\n tkBool, // 7\r\n tkProcVar, // 8 function or procedure\r\n tkMethod, // 9 proc var of object\r\n tkArray, // 10 static array\r\n tkDynArray, // 11\r\n tkRecord, // 12\r\n tkClass, // 13\r\n tkClassRef, // 14\r\n tkPointer, // 15\r\n tkJSValue, // 16\r\n tkRefToProcVar, // 17 variable of procedure type\r\n tkInterface, // 18\r\n //tkObject,\r\n //tkSString,tkLString,tkAString,tkWString,\r\n //tkVariant,\r\n //tkWChar,\r\n //tkInt64,\r\n //tkQWord,\r\n //tkInterfaceRaw,\r\n //tkUString,tkUChar,\r\n tkHelper, // 19\r\n //tkFile,\r\n tkExtClass // 20\r\n );\r\n TTypeKinds = set of TTypeKind;\r\n\r\nconst\r\n tkFloat = tkDouble; // for compatibility with Delphi/FPC\r\n tkProcedure = tkProcVar; // for compatibility with Delphi\r\n tkAny = [Low(TTypeKind)..High(TTypeKind)];\r\n tkMethods = [tkMethod];\r\n tkProperties = tkAny-tkMethods-[tkUnknown];\r\n\r\n{*****************************************************************************\r\n Array of const support\r\n*****************************************************************************}\r\n\r\nconst\r\n vtInteger = 0;\r\n vtBoolean = 1;\r\n //vtChar = 2; // Delphi/FPC: ansichar\r\n vtExtended = 3; // Note: double in pas2js, PExtended in Delphi/FPC\r\n //vtString = 4; // Delphi/FPC: PShortString\r\n vtPointer = 5;\r\n //vtPChar = 6;\r\n vtObject = 7;\r\n vtClass = 8;\r\n vtWideChar = 9;\r\n //vtPWideChar = 10;\r\n //vtAnsiString = 11;\r\n vtCurrency = 12; // Note: currency in pas2js, PCurrency in Delphi/FPC\r\n //vtVariant = 13;\r\n vtInterface = 14;\r\n //vtWideString = 15;\r\n //vtInt64 = 16;\r\n //vtQWord = 17;\r\n vtUnicodeString = 18;\r\n // only pas2js, not in Delphi/FPC:\r\n vtNativeInt = 19;\r\n vtJSValue = 20;\r\n\r\ntype\r\n PVarRec = ^TVarRec;\r\n TVarRec = record\r\n VType: byte;\r\n VJSValue: JSValue;\r\n VInteger: LongInt external name 'VJSValue';\r\n VBoolean: Boolean external name 'VJSValue';\r\n VExtended: Double external name 'VJSValue';\r\n VPointer: Pointer external name 'VJSValue';\r\n VObject: TObject external name 'VJSValue';\r\n VClass: TClass external name 'VJSValue';\r\n VWideChar: WideChar external name 'VJSValue';\r\n VCurrency: Currency external name 'VJSValue';\r\n VInterface: Pointer external name 'VJSValue';\r\n VUnicodeString: UnicodeString external name 'VJSValue';\r\n VNativeInt: NativeInt external name 'VJSValue';\r\n end;\r\n TVarRecArray = array of TVarRec;\r\n\r\nfunction VarRecs: TVarRecArray; varargs;\r\n\r\n{*****************************************************************************\r\n Init / Exit / ExitProc\r\n*****************************************************************************}\r\nvar\r\n ExitCode: Integer; external name 'rtl.exitcode';\r\n IsConsole: Boolean = {$IFDEF NodeJS}true{$ELSE}false{$ENDIF};\r\n FirstDotAtFileNameStartIsExtension : Boolean = False;\r\n\r\ntype\r\n TOnParamCount = function: Longint;\r\n TOnParamStr = function(Index: Longint): String;\r\nvar\r\n OnParamCount: TOnParamCount;\r\n OnParamStr: TOnParamStr;\r\n\r\nfunction ParamCount: Longint;\r\nfunction ParamStr(Index: Longint): String;\r\n\r\n{*****************************************************************************\r\n Math\r\n*****************************************************************************}\r\nconst\r\n PI: Double; external name 'Math.PI';\r\n MathE: Double; external name 'Math.E'; // Euler's number\r\n MathLN10: Double; external name 'Math.LN10'; // ln(10)\r\n MathLN2: Double; external name 'Math.LN2'; // ln(2)\r\n MathLog10E: Double; external name 'Math.Log10E'; // log10(e)\r\n MathLog2E: Double; external name 'Math.LOG2E'; // log2(e)\r\n MathSQRT1_2: Double; external name 'Math.SQRT1_2'; // sqrt(0.5)\r\n MathSQRT2: Double; external name 'Math.SQRT2'; // sqrt(2)\r\n\r\nfunction Abs(const A: integer): integer; overload; external name 'Math.abs';\r\nfunction Abs(const A: NativeInt): integer; overload; external name 'Math.abs';\r\nfunction Abs(const A: Double): Double; overload; external name 'Math.abs';\r\nfunction ArcTan(const A: Double): Double; external name 'Math.atan';\r\nfunction ArcTan2(const A,B: Double): Double; external name 'Math.atan2';\r\nfunction Cos(const A: Double): Double; external name 'Math.cos';\r\nfunction Exp(const A: Double): Double; external name 'Math.exp';\r\nfunction Frac(const A: Double): Double; assembler;\r\nfunction Ln(const A: Double): Double; external name 'Math.log';\r\nfunction Odd(const A: Integer): Boolean; assembler;\r\nfunction Random(const Range: Integer): Integer; overload; assembler;\r\nfunction Random: Double; overload; external name 'Math.random';\r\nfunction Round(const A: Double): NativeInt; external name 'Math.round';\r\nfunction Sin(const A: Double): Double; external name 'Math.sin';\r\nfunction Sqr(const A: Integer): Integer; assembler; overload;\r\nfunction Sqr(const A: Double): Double; assembler; overload;\r\nfunction sqrt(const A: Double): Double; external name 'Math.sqrt';\r\nfunction Trunc(const A: Double): NativeInt;\r\n\r\n{*****************************************************************************\r\n String functions\r\n*****************************************************************************}\r\nconst\r\n DefaultTextLineBreakStyle : TTextLineBreakStyle = tlbsLF;\r\n\r\nfunction Int(const A: Double): double;\r\nfunction Copy(const S: string; Index, Size: Integer): String; assembler; overload;\r\nfunction Copy(const S: string; Index: Integer): String; assembler; overload;\r\nprocedure Delete(var S: String; Index, Size: Integer); overload;\r\nfunction Pos(const Search, InString: String): Integer; assembler; overload;\r\nfunction Pos(const Search, InString: String; StartAt : Integer): Integer; assembler; overload;\r\nprocedure Insert(const Insertion: String; var Target: String; Index: Integer); overload;\r\nfunction upcase(c : char) : char; assembler;\r\nfunction HexStr(Val: NativeInt; cnt: byte): string; external name 'rtl.hexStr'; overload;\r\nfunction binstr(val : NativeUInt; cnt : byte) : string;\r\n\r\nprocedure val(const S: String; out NI : NativeInt; out Code: Integer); overload;\r\nprocedure val(const S: String; out NI : NativeUInt; out Code: Integer); overload;\r\nprocedure val(const S: String; out SI : ShortInt; out Code: Integer); overload;\r\nprocedure val(const S: String; out B : Byte; out Code: Integer); overload;\r\nprocedure val(const S: String; out SI : smallint; out Code: Integer); overload;\r\nprocedure val(const S: String; out W : word; out Code : Integer); overload;\r\nprocedure val(const S: String; out I : integer; out Code : Integer); overload;\r\nprocedure val(const S: String; out C : Cardinal; out Code: Integer); overload;\r\nprocedure val(const S: String; out d : double; out Code : Integer); overload;\r\nprocedure val(const S: String; out b : boolean; out Code: Integer); overload;\r\nfunction StringOfChar(c: Char; l: NativeInt): String;\r\n\r\n{*****************************************************************************\r\n Other functions\r\n*****************************************************************************}\r\nprocedure Write; varargs; // ToDo: should be compiler built-in function\r\nprocedure Writeln; varargs; // ToDo: should be compiler built-in function\r\n\r\nType\r\n TConsoleHandler = Procedure (S : JSValue; NewLine : Boolean);\r\nFunction SetWriteCallBack(H : TConsoleHandler) : TConsoleHandler;\r\n\r\nfunction Assigned(const V: JSValue): boolean; assembler; overload;\r\nfunction StrictEqual(const A: JSValue; const B): boolean; assembler;\r\nfunction StrictInequal(const A: JSValue; const B): boolean; assembler;\r\n\r\nimplementation\r\n\r\ntype\r\n\r\n { TJSObj - simple access to JS Object }\r\n\r\n TJSObj = class external name 'Object'\r\n private\r\n function GetProperties(Name: String): JSValue; external name '[]';\r\n procedure SetProperties(Name: String; const AValue: JSValue); external name '[]';\r\n public\r\n //constructor new;\r\n //function hasOwnProperty(prop: String): boolean;\r\n property Properties[Name: String]: JSValue read GetProperties write SetProperties; default;\r\n end;\r\n\r\n TJSArray = class external name 'Array'\r\n public\r\n //length: nativeint;\r\n //constructor new; overload;\r\n function push(aElement : JSValue) : NativeInt; varargs;\r\n end;\r\n\r\n TJSArguments = class external name 'arguments'\r\n private\r\n FLength: NativeInt; external name 'length';\r\n function GetElements(Index: NativeInt): JSValue; external name '[]';\r\n public\r\n property Length: NativeInt read FLength;\r\n property Elements[Index: NativeInt]: JSValue read GetElements; default;\r\n end;\r\nvar\r\n JSArguments: TJSArguments; external name 'arguments';\r\n\r\nfunction isNumber(const v: JSValue): boolean; external name 'rtl.isNumber';\r\nfunction isObject(const v: JSValue): boolean; external name 'rtl.isObject'; // true if not null and a JS Object\r\nfunction isString(const v: JSValue): boolean; external name 'rtl.isString';\r\nfunction isNaN(i: JSValue): boolean; external name 'isNaN'; // may result NaN\r\n\r\n// needed by ClassNameIs, the real SameText is in SysUtils\r\nfunction SameText(const s1, s2: String): Boolean; assembler;\r\nasm\r\n return s1.toLowerCase() == s2.toLowerCase();\r\nend;\r\n\r\nfunction VarRecs: TVarRecArray;\r\nvar\r\n i: nativeint;\r\n v: PVarRec;\r\nbegin\r\n Result:=nil;\r\n while i0) ? S.substring(Index-1,Index+Size-1) : \"\";\r\nend;\r\n\r\nfunction Copy(const S: string; Index: Integer): String; assembler;\r\nasm\r\n if (Index<1) Index = 1;\r\n return S.substr(Index-1);\r\nend;\r\n\r\nprocedure Delete(var S: String; Index, Size: Integer);\r\nvar\r\n h: String;\r\nbegin\r\n if (Index<1) or (Index>length(S)) or (Size<=0) then exit;\r\n h:=S;\r\n S:=copy(h,1,Index-1)+copy(h,Index+Size);\r\nend;\r\n\r\nfunction Pos(const Search, InString: String): Integer; assembler;\r\nasm\r\n return InString.indexOf(Search)+1;\r\nend;\r\n\r\nfunction Pos(const Search, InString: String; StartAt : Integer): Integer; assembler; overload;\r\nasm\r\n return InString.indexOf(Search,StartAt-1)+1;\r\nend;\r\n\r\nprocedure Insert(const Insertion: String; var Target: String; Index: Integer);\r\nvar\r\n t: String;\r\nbegin\r\n if Insertion='' then exit;\r\n t:=Target;\r\n if Index<1 then\r\n Target:=Insertion+t\r\n else if Index>length(t) then\r\n Target:=t+Insertion\r\n else\r\n Target:=copy(t,1,Index-1)+Insertion+copy(t,Index,length(t));\r\nend;\r\n\r\nvar\r\n WriteBuf: String;\r\n WriteCallBack : TConsoleHandler;\r\n\r\nFunction SetWriteCallBack(H : TConsoleHandler) : TConsoleHandler;\r\n\r\nbegin\r\n Result:=WriteCallBack;\r\n WriteCallBack:=H;\r\nend;\r\n\r\nprocedure Write;\r\nvar\r\n i: Integer;\r\nbegin\r\n for i:=0 to JSArguments.Length-1 do\r\n if Assigned(WriteCallBack) then\r\n WriteCallBack(JSArguments[i],False)\r\n else\r\n WriteBuf:=WriteBuf+String(JSArguments[i]);\r\nend;\r\n\r\nprocedure Writeln;\r\n\r\nvar\r\n i,l: Integer;\r\n s: String;\r\n\r\nbegin\r\n L:=JSArguments.Length-1;\r\n if Assigned(WriteCallBack) then\r\n begin\r\n for i:=0 to L do\r\n WriteCallBack(JSArguments[i],I=L);\r\n end\r\n else\r\n begin\r\n s:=WriteBuf;\r\n for i:=0 to L do\r\n s:=s+String(JSArguments[i]);\r\n asm\r\n console.log(s);\r\n end;\r\n WriteBuf:='';\r\n end;\r\nend;\r\n\r\nfunction Int(const A: Double): double;\r\n\r\nbegin\r\n // trunc contains fix for missing Math.trunc in IE\r\n Result:=Trunc(A);\r\nend;\r\n\r\nfunction Number(S: String): Double; external name 'Number';\r\n\r\nfunction valint(const S: String; MinVal, MaxVal: NativeInt; out Code: Integer): NativeInt;\r\nvar\r\n x: double;\r\nbegin\r\n x:=Number(S);\r\n if isNaN(x) then\r\n case copy(s,1,1) of\r\n '$': x:=Number('0x'+copy(S,2));\r\n '&': x:=Number('0o'+copy(S,2));\r\n '%': x:=Number('0b'+copy(S,2));\r\n else\r\n Code:=1;\r\n exit;\r\n end;\r\n if isNaN(x) or (X<>Int(X)) then\r\n Code:=1\r\n else if (xMaxVal) then\r\n Code:=2\r\n else\r\n begin\r\n Result:=Trunc(x);\r\n Code:=0;\r\n end;\r\nend;\r\n\r\nprocedure val(const S: String; out NI : NativeInt; out Code: Integer);\r\nbegin\r\n NI:=valint(S,low(NI),high(NI),Code);\r\nend;\r\n\r\nprocedure val(const S: String; out NI: NativeUInt; out Code: Integer);\r\nvar\r\n x : double;\r\nbegin\r\n x:=Number(S);\r\n if isNaN(x) or (X<>Int(X)) or (X<0) then\r\n Code:=1\r\n else\r\n begin\r\n Code:=0;\r\n NI:=Trunc(x);\r\n end;\r\nend;\r\n\r\nprocedure val(const S: String; out SI : ShortInt; out Code: Integer);\r\nbegin\r\n SI:=valint(S,low(SI),high(SI),Code);\r\nend;\r\n\r\nprocedure val(const S: String; out SI: smallint; out Code: Integer);\r\nbegin\r\n SI:=valint(S,low(SI),high(SI),Code);\r\nend;\r\n\r\nprocedure val(const S: String; out C: Cardinal; out Code: Integer);\r\nbegin\r\n C:=valint(S,low(C),high(C),Code);\r\nend;\r\n\r\nprocedure val(const S: String; out B: Byte; out Code: Integer);\r\nbegin\r\n B:=valint(S,low(B),high(B),Code);\r\nend;\r\n\r\nprocedure val(const S: String; out W: word; out Code: Integer);\r\nbegin\r\n W:=valint(S,low(W),high(W),Code);\r\nend;\r\n\r\nprocedure val(const S : String; out I : integer; out Code : Integer);\r\nbegin\r\n I:=valint(S,low(I),high(I),Code);\r\nend;\r\n\r\nprocedure val(const S : String; out d : double; out Code : Integer);\r\nVar\r\n x: double;\r\nbegin\r\n x:=Number(S);\r\n if isNaN(x) then\r\n Code:=1\r\n else\r\n begin\r\n Code:=0;\r\n d:=x;\r\n end;\r\nend;\r\n\r\nprocedure val(const S: String; out b: boolean; out Code: Integer);\r\nbegin\r\n if SameText(S,'true') then\r\n begin\r\n Code:=0;\r\n b:=true;\r\n end\r\n else if SameText(S,'false') then\r\n begin\r\n Code:=0;\r\n b:=false;\r\n end\r\n else\r\n Code:=1;\r\nend;\r\n\r\nfunction binstr(val : NativeUInt;cnt : byte) : string;\r\nvar\r\n i : Integer;\r\nbegin\r\n SetLength(Result,cnt);\r\n for i:=cnt downto 1 do\r\n begin\r\n Result[i]:=char(48+val and 1);\r\n val:=val shr 1;\r\n end;\r\nend;\r\n\r\nfunction upcase(c : char) : char; assembler;\r\nasm\r\n return c.toUpperCase();\r\nend;\r\n\r\nfunction StringOfChar(c: Char; l: NativeInt): String;\r\nvar\r\n i: Integer;\r\nbegin\r\n asm\r\n if ((l>0) && c.repeat) return c.repeat(l);\r\n end;\r\n Result:='';\r\n for i:=1 to l do Result:=Result+c;\r\nend;\r\n\r\nfunction Assigned(const V: JSValue): boolean; assembler;\r\nasm\r\n return (V!=undefined) && (V!=null) && (!rtl.isArray(V) || (V.length > 0));\r\nend;\r\n\r\nfunction StrictEqual(const A: JSValue; const B): boolean; assembler;\r\nasm\r\n return A === B;\r\nend;\r\n\r\nfunction StrictInequal(const A: JSValue; const B): boolean; assembler;\r\nasm\r\n return A !== B;\r\nend;\r\n\r\n{ TContainedObject }\r\n\r\nfunction TContainedObject.QueryInterface(const iid: TGuid; out obj): Integer;\r\nbegin\r\n if GetInterface(iid,obj) then\r\n Result:=S_OK\r\n else\r\n Result:=Integer(E_NOINTERFACE);\r\nend;\r\n\r\n{ TAggregatedObject }\r\n\r\nfunction TAggregatedObject.GetController: IUnknown;\r\nbegin\r\n Result := IUnknown(fController);\r\nend;\r\n\r\nfunction TAggregatedObject.QueryInterface(const iid: TGuid; out obj): Integer;\r\nbegin\r\n Result := IUnknown(fController).QueryInterface(iid, obj);\r\nend;\r\n\r\nfunction TAggregatedObject._AddRef: Integer;\r\nbegin\r\n Result := IUnknown(fController)._AddRef;\r\nend;\r\n\r\nfunction TAggregatedObject._Release: Integer;\r\nbegin\r\n Result := IUnknown(fController)._Release;\r\nend;\r\n\r\nconstructor TAggregatedObject.Create(const aController: IUnknown);\r\nbegin\r\n inherited Create;\r\n { do not keep a counted reference to the controller! }\r\n fController := Pointer(aController);\r\nend;\r\n\r\n{ TInterfacedObject }\r\n\r\nfunction TInterfacedObject.QueryInterface(const iid: TGuid; out obj): Integer;\r\nbegin\r\n if GetInterface(iid,obj) then\r\n Result:=S_OK\r\n else\r\n Result:=Integer(E_NOINTERFACE);\r\nend;\r\n\r\nfunction TInterfacedObject._AddRef: Integer;\r\nbegin\r\n inc(fRefCount);\r\n Result:=fRefCount;\r\nend;\r\n\r\nfunction TInterfacedObject._Release: Integer;\r\nbegin\r\n dec(fRefCount);\r\n Result:=fRefCount;\r\n if fRefCount=0 then\r\n Destroy;\r\nend;\r\n\r\nprocedure TInterfacedObject.BeforeDestruction;\r\nbegin\r\n if fRefCount<>0 then\r\n asm\r\n rtl.raiseE('EHeapMemoryError');\r\n end;\r\nend;\r\n\r\n{ TObject }\r\n\r\nconstructor TObject.Create;\r\nbegin\r\n\r\nend;\r\n\r\ndestructor TObject.Destroy;\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TObject.Free;\r\nbegin\r\n Destroy;\r\nend;\r\n\r\nclass function TObject.ClassType: TClass; assembler;\r\nasm\r\n return this;\r\nend;\r\n\r\nclass function TObject.ClassNameIs(const Name: string): boolean;\r\nbegin\r\n Result:=SameText(Name,ClassName);\r\nend;\r\n\r\nclass function TObject.InheritsFrom(aClass: TClass): boolean; assembler;\r\nasm\r\n return (aClass!=null) && ((this==aClass) || aClass.isPrototypeOf(this));\r\nend;\r\n\r\n\r\nClass function TObject.MethodName(aCode : Pointer) : String;\r\n\r\nbegin\r\n Result:='';\r\n if aCode=Nil then\r\n exit;\r\nasm\r\n if (typeof(aCode)!=='function') return \"\";\r\n var i = 0;\r\n var TI = this.$rtti;\r\n if (rtl.isObject(aCode.scope)){\r\n // callback\r\n if (typeof aCode.fn === \"string\") return aCode.fn;\r\n aCode = aCode.fn;\r\n }\r\n // Not a callback, check rtti\r\n while ((Result === \"\") && (TI != null)) {\r\n i = 0;\r\n while ((Result === \"\") && (i < TI.methods.length)) {\r\n if (this[TI.getMethod(i).name] === aCode)\r\n Result=TI.getMethod(i).name;\r\n i += 1;\r\n };\r\n if (Result === \"\") TI = TI.ancestor;\r\n };\r\n // return Result;\r\nend;\r\nend;\r\n\r\nClass function TObject.MethodAddress(aName : String) : Pointer;\r\n\r\n// We must do this in asm, because the typinfo unit is not available.\r\nbegin\r\n Result:=Nil;\r\n if AName='' then\r\n exit;\r\nasm\r\n var i = 0;\r\n var TI = this.$rtti;\r\n var N = \"\";\r\n var MN = \"\";\r\n N = aName.toLowerCase();\r\n while ((MN === \"\") && (TI != null)) {\r\n i = 0;\r\n while ((MN === \"\") && (i < TI.methods.length)) {\r\n if (TI.getMethod(i).name.toLowerCase() === N) MN = TI.getMethod(i).name;\r\n i += 1;\r\n };\r\n if (MN === \"\") TI = TI.ancestor;\r\n };\r\n if (MN !== \"\") Result = this[MN];\r\n// return Result;\r\nend;\r\nend;\r\n\r\nclass function TObject.FieldAddress(aName: String): Pointer;\r\n\r\nbegin\r\n Result:=Nil;\r\n if aName='' then exit;\r\n asm\r\n var aClass = null;\r\n var i = 0;\r\n var ClassTI = null;\r\n var myName = aName.toLowerCase();\r\n var MemberTI = null;\r\n aClass = this.$class;\r\n while (aClass !== null) {\r\n ClassTI = aClass.$rtti;\r\n for (var $l1 = 0, $end2 = ClassTI.fields.length - 1; $l1 <= $end2; $l1++) {\r\n i = $l1;\r\n MemberTI = ClassTI.getField(i);\r\n if (MemberTI.name.toLowerCase() === myName) {\r\n return MemberTI;\r\n };\r\n };\r\n aClass = aClass.$ancestor ? aClass.$ancestor : null;\r\n };\r\n end;\r\nend;\r\n\r\nClass Function TObject.ClassInfo : Pointer;\r\n\r\nbegin\r\n // This works different from FPC/Delphi.\r\n // We get the actual type info.\r\n Result:=TypeInfo(Self);\r\nend;\r\n\r\nprocedure TObject.AfterConstruction;\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TObject.BeforeDestruction;\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TObject.Dispatch(var aMessage);\r\n// aMessage is a record with an integer field 'Msg'\r\nvar\r\n aClass: TClass;\r\n Msg: TJSObj absolute aMessage;\r\n Id: jsvalue;\r\nbegin\r\n if not isObject(Msg) then exit;\r\n Id:=Msg['Msg'];\r\n if not isNumber(Id) then exit;\r\n aClass:=ClassType;\r\n while aClass<>nil do\r\n begin\r\n asm\r\n var Handlers = aClass.$msgint;\r\n if (rtl.isObject(Handlers) && Handlers.hasOwnProperty(Id)){\r\n this[Handlers[Id]](aMessage);\r\n return;\r\n }\r\n end;\r\n aClass:=aClass.ClassParent;\r\n end;\r\n DefaultHandler(aMessage);\r\nend;\r\n\r\nprocedure TObject.DispatchStr(var aMessage);\r\n// aMessage is a record with a string field 'MsgStr'\r\nvar\r\n aClass: TClass;\r\n Msg: TJSObj absolute aMessage;\r\n Id: jsvalue;\r\nbegin\r\n if not isObject(Msg) then exit;\r\n Id:=Msg['MsgStr'];\r\n if not isString(Id) then exit;\r\n aClass:=ClassType;\r\n while (aClass<>Nil) do\r\n begin\r\n asm\r\n var Handlers = aClass.$msgstr;\r\n if (rtl.isObject(Handlers) && Handlers.hasOwnProperty(Id)){\r\n this[Handlers[Id]](aMessage);\r\n return;\r\n }\r\n end;\r\n aClass:=aClass.ClassParent;\r\n end;\r\n DefaultHandlerStr(aMessage);\r\nend;\r\n\r\nprocedure TObject.DefaultHandler(var aMessage);\r\nbegin\r\n if jsvalue(TMethod(aMessage)) then ;\r\nend;\r\n\r\nprocedure TObject.DefaultHandlerStr(var aMessage);\r\nbegin\r\n if jsvalue(TMethod(aMessage)) then ;\r\nend;\r\n\r\nfunction TObject.GetInterface(const iid: TGuid; out obj): boolean;\r\nbegin\r\n asm\r\n var i = iid.$intf;\r\n if (i){\r\n // iid is the private TGuid of an interface\r\n i = rtl.getIntfG(this,i.$guid,2);\r\n if (i){\r\n obj.set(i);\r\n return true;\r\n }\r\n }\r\n end;\r\n Result := GetInterfaceByStr(GUIDToString(iid),obj);\r\nend;\r\n\r\nfunction TObject.GetInterface(const iidstr: String; out obj): boolean;\r\nbegin\r\n Result := GetInterfaceByStr(iidstr,obj);\r\nend;\r\n\r\nfunction TObject.GetInterfaceByStr(const iidstr: String; out obj): boolean;\r\nbegin\r\n Result:=false;\r\n if not TJSObj(IObjectInstance)['$str'] then\r\n TJSObj(IObjectInstance)['$str']:=GUIDToString(IObjectInstance);\r\n if iidstr = TJSObj(IObjectInstance)['$str'] then\r\n begin\r\n obj:=Self;\r\n exit(true);\r\n end;\r\n asm\r\n var i = rtl.getIntfG(this,iidstr,2);\r\n obj.set(i);\r\n Result=(i!==null);\r\n end;\r\nend;\r\n\r\nfunction TObject.GetInterfaceWeak(const iid: TGuid; out obj): boolean;\r\nbegin\r\n Result:=GetInterface(iid,obj);\r\n asm\r\n if (Result){\r\n var o = obj.get();\r\n if (o.$kind==='com'){\r\n o._Release();\r\n }\r\n }\r\n end;\r\nend;\r\n\r\nfunction TObject.Equals(Obj: TObject): boolean;\r\nbegin\r\n Result:=Obj=Self;\r\nend;\r\n\r\nfunction TObject.ToString: String;\r\nbegin\r\n Result:=ClassName;\r\nend;\r\n\r\n\r\ninitialization\r\n ExitCode:=0; // set it here, so that WPO does not remove it\r\n\r\nend.\r\n\r\n","{\r\n This file is part of the Pas2JS run time library.\r\n Copyright (c) 2017 by Mattias Gaertner\r\n\r\n See the file COPYING.FPC, included in this distribution,\r\n for details about the copyright.\r\n\r\n This program is distributed in the hope that it will be useful,\r\n but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r\n\r\n **********************************************************************}\r\nunit RTLConsts;\r\n\r\ninterface\r\n\r\nResourcestring\r\n SArgumentMissing = 'Missing argument in format \"%s\"';\r\n SInvalidFormat = 'Invalid format specifier : \"%s\"';\r\n SInvalidArgIndex = 'Invalid argument index in format: \"%s\"';\r\n SListCapacityError = 'List capacity (%s) exceeded.';\r\n SListCountError = 'List count (%s) out of bounds.';\r\n SMapKeyError = 'Key not found : %s';\r\n SListIndexError = 'List index (%s) out of bounds';\r\n SSortedListError = 'Operation not allowed on sorted list';\r\n SDuplicateString = 'String list does not allow duplicates';\r\n SDuplicateItem = 'ThreadList does not allow duplicates';\r\n SErrFindNeedsSortedList = 'Cannot use find on unsorted list';\r\n\r\n SInvalidName = 'Invalid component name: \"%s\"';\r\n SInvalidBoolean = '\"%s\" is not a valid boolean.';\r\n SDuplicateName = 'Duplicate component name: \"%s\"';\r\n\r\n SErrInvalidDate = 'Invalid date: \"%s\"';\r\n SErrInvalidTimeFormat = 'Invalid time format: \"%s\"';\r\n SInvalidDateFormat = 'Invalid date format: \"%s\"';\r\n\r\n SCantReadPropertyS = 'Cannot read property \"%s\"';\r\n SCantWritePropertyS = 'Cannot write property \"%s\"';\r\n SErrPropertyNotFound = 'Unknown property: \"%s\"';\r\n SIndexedPropertyNeedsParams = 'Indexed property \"%s\" needs parameters';\r\n SErrInvalidTypecast = 'Invalid class typecast';\r\n\r\n SErrInvalidInteger = 'Invalid integer value: \"%s\"';\r\n SErrInvalidFloat = 'Invalid floating-point value: \"%s\"';\r\n SInvalidDateTime = 'Invalid date-time value: %s';\r\n SInvalidCurrency = 'Invalid currency value: %s';\r\n SErrInvalidDayOfWeek = '%d is not a valid day of the week';\r\n SErrInvalidTimeStamp = 'Invalid date/timestamp : \"%s\"';\r\n SErrInvalidDateWeek = '%d %d %d is not a valid dateweek';\r\n SErrInvalidDayOfYear = 'Year %d does not have a day number %d';\r\n SErrInvalidDateMonthWeek = 'Year %d, month %d, Week %d and day %d is not a valid date.';\r\n SErrInvalidDayOfWeekInMonth = 'Year %d Month %d NDow %d DOW %d is not a valid date';\r\n SInvalidJulianDate = '%f Julian cannot be represented as a DateTime';\r\n SErrInvalidHourMinuteSecMsec = '%d:%d:%d.%d is not a valid time specification';\r\n\r\n SInvalidGUID = '\"%s\" is not a valid GUID value';\r\n\r\n SEmptyStreamIllegalReader = 'Illegal Nil stream for TReader constructor';\r\n SInvalidPropertyValue = 'Invalid value for property';\r\n SInvalidImage = 'Invalid stream format';\r\n SUnknownProperty = 'Unknown property: \"%s\"';\r\n SUnknownPropertyType = 'Unknown property type %s';\r\n SAncestorNotFound = 'Ancestor class for \"%s\" not found.';\r\n SUnsupportedPropertyVariantType = 'Unsupported property variant type %d';\r\n SPropertyException = 'Error reading %s%s%s: %s';\r\n SInvalidPropertyPath = 'Invalid property path';\r\n SReadOnlyProperty = 'Property is read-only';\r\n SClassNotFound = 'Class \"%s\" not found';\r\n\r\n SEmptyStreamIllegalWriter = 'Illegal Nil stream for TWriter constructor';\r\n SErrInvalidPropertyType = 'Invalid property type from streamed property: %d';\r\n SParserExpected = 'Wrong token type: %s expected';\r\n SParserInvalidFloat = 'Invalid floating point number: %s';\r\n SParserInvalidInteger = 'Invalid integer number: %s';\r\n SParserUnterminatedString = 'Unterminated string';\r\n SParserWrongTokenType = 'Wrong token type: %s expected but %s found';\r\n SParserWrongTokenSymbol = 'Wrong token symbol: %s expected but %s found';\r\n SParserLocInfo = ' (at %d,%d, stream offset %.8x)';\r\n SParserUnterminatedBinValue = 'Unterminated byte value';\r\n SParserInvalidProperty = 'Invalid property';\r\n SRangeError = 'Range error';\r\n\r\nimplementation\r\n\r\nend.\r\n\r\n","{\r\n This file is part of the Pas2JS run time library.\r\n Copyright (c) 2018 by Mattias Gaertner\r\n\r\n See the file COPYING.FPC, included in this distribution,\r\n for details about the copyright.\r\n\r\n This program is distributed in the hope that it will be useful,\r\n but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r\n\r\n **********************************************************************}\r\nunit Types;\r\n\r\n{$mode objfpc}\r\n\r\ninterface\r\n\r\ntype\r\n TDirection = (FromBeginning, FromEnd);\r\n\r\n TBooleanDynArray = array of Boolean;\r\n TIntegerDynArray = array of Integer;\r\n TNativeIntDynArray = array of NativeInt;\r\n TStringDynArray = array of String;\r\n TDoubleDynArray = array of Double;\r\n TJSValueDynArray = array of JSValue;\r\n TObjectDynArray = array of TObject;\r\n TByteDynArray = array of Byte;\r\n\r\n TDuplicates = (dupIgnore, dupAccept, dupError);\r\n TProc = Reference to Procedure;\r\n TProcString = Reference to Procedure(Const aString : String);\r\n\r\n TListCallback = procedure(data, arg: JSValue) of object;\r\n TListStaticCallback = procedure(data, arg: JSValue);\r\n\r\n TSize = record\r\n cx, cy: integer;\r\n end;\r\n\r\n TPoint = record\r\n x, y: integer;\r\n end;\r\n\r\n TRect = record\r\n Left, Top, Right, Bottom: Integer;\r\n end;\r\n \r\nfunction EqualRect(const r1,r2 : TRect) : Boolean;\r\nfunction Rect(Left, Top, Right, Bottom : Integer) : TRect;\r\nfunction Bounds(ALeft, ATop, AWidth, AHeight : Integer) : TRect;\r\nfunction Point(x,y : Integer): TPoint; {$IFDEF Has_Inline}inline;{$ENDIF}\r\nfunction PtInRect(const aRect: TRect; const p: TPoint) : Boolean;\r\nfunction IntersectRect(out aRect: TRect; const R1,R2: TRect) : Boolean;\r\nfunction UnionRect(out aRect: TRect; const R1,R2: TRect) : Boolean;\r\nfunction IsRectEmpty(const aRect: TRect) : Boolean;\r\nfunction OffsetRect(var aRect: TRect; DX, DY: Integer) : Boolean;\r\nfunction CenterPoint(const aRect: TRect): TPoint;\r\nfunction InflateRect(var aRect: TRect; dx, dy: Integer): Boolean;\r\nfunction Size(AWidth, AHeight: Integer): TSize;\r\nfunction Size(const aRect: TRect): TSize;\r\n\r\nimplementation\r\n\r\nfunction EqualRect(const r1, r2: TRect): Boolean;\r\nbegin\r\n Result:=(r1.left=r2.left) and (r1.right=r2.right) and (r1.top=r2.top) and (r1.bottom=r2.bottom);\r\nend;\r\n\r\nfunction Rect(Left, Top, Right, Bottom: Integer): TRect;\r\nbegin\r\n Result.Left:=Left;\r\n Result.Top:=Top;\r\n Result.Right:=Right;\r\n Result.Bottom:=Bottom;\r\nend;\r\n\r\nfunction Bounds(ALeft, ATop, AWidth, AHeight: Integer): TRect;\r\nbegin\r\n Result.Left:=ALeft;\r\n Result.Top:=ATop;\r\n Result.Right:=ALeft+AWidth;\r\n Result.Bottom:=ATop+AHeight;\r\nend;\r\n\r\nfunction Point(x, y: Integer): TPoint;\r\nbegin\r\n Result.x:=x;\r\n Result.y:=y;\r\nend;\r\n\r\nfunction PtInRect(const aRect: TRect; const p: TPoint): Boolean;\r\nbegin\r\n Result:=(p.y>=aRect.Top) and\r\n (p.y=aRect.Left) and\r\n (p.x R1.Left then\r\n lRect.Left := R2.Left;\r\n if R2.Top > R1.Top then\r\n lRect.Top := R2.Top;\r\n if R2.Right < R1.Right then\r\n lRect.Right := R2.Right;\r\n if R2.Bottom < R1.Bottom then\r\n lRect.Bottom := R2.Bottom;\r\n\r\n // The var parameter is only assigned in the end to avoid problems\r\n // when passing the same rectangle in the var and const parameters.\r\n if IsRectEmpty(lRect) then\r\n begin\r\n aRect:=Rect(0,0,0,0);\r\n Result:=false;\r\n end\r\n else\r\n begin\r\n Result:=true;\r\n aRect := lRect;\r\n end;\r\nend;\r\n\r\nfunction UnionRect(out aRect: TRect; const R1, R2: TRect): Boolean;\r\nvar\r\n lRect: TRect;\r\nbegin\r\n lRect:=R1;\r\n if R2.LeftR1.Right then\r\n lRect.Right:=R2.Right;\r\n if R2.Bottom>R1.Bottom then\r\n lRect.Bottom:=R2.Bottom;\r\n\r\n if IsRectEmpty(lRect) then\r\n begin\r\n aRect:=Rect(0,0,0,0);\r\n Result:=false;\r\n end\r\n else\r\n begin\r\n aRect:=lRect;\r\n Result:=true;\r\n end;\r\nend;\r\n\r\nfunction IsRectEmpty(const aRect: TRect): Boolean;\r\nbegin\r\n Result:=(aRect.Right<=aRect.Left) or (aRect.Bottom<=aRect.Top);\r\nend;\r\n\r\nfunction OffsetRect(var aRect: TRect; DX, DY: Integer): Boolean;\r\nbegin\r\n with aRect do\r\n begin\r\n inc(Left,dx);\r\n inc(Top,dy);\r\n inc(Right,dx);\r\n inc(Bottom,dy);\r\n end;\r\n Result:=true;\r\nend;\r\n\r\nfunction CenterPoint(const aRect: TRect): TPoint;\r\n\r\n function Avg(a, b: Longint): Longint;\r\n begin\r\n if a < b then\r\n Result := a + ((b - a) shr 1)\r\n else\r\n Result := b + ((a - b) shr 1);\r\n end;\r\n\r\nbegin\r\n with aRect do\r\n begin\r\n Result.X := Avg(Left, Right);\r\n Result.Y := Avg(Top, Bottom);\r\n end;\r\nend;\r\n\r\nfunction InflateRect(var aRect: TRect; dx, dy: Integer): Boolean;\r\nbegin\r\n with aRect do\r\n begin\r\n dec(Left, dx);\r\n dec(Top, dy);\r\n inc(Right, dx);\r\n inc(Bottom, dy);\r\n end;\r\n Result := True;\r\nend;\r\n\r\nfunction Size(AWidth, AHeight: Integer): TSize;\r\nbegin\r\n Result.cx := AWidth;\r\n Result.cy := AHeight;\r\nend;\r\n\r\nfunction Size(const aRect: TRect): TSize;\r\nbegin\r\n Result.cx := aRect.Right - aRect.Left;\r\n Result.cy := aRect.Bottom - aRect.Top;\r\nend;\r\n\r\nend.\r\n\r\n","{\r\n This file is part of the Pas2JS run time library.\r\n Copyright (c) 2017-2020 by the Pas2JS development team.\r\n\r\n See the file COPYING.FPC, included in this distribution,\r\n for details about the copyright.\r\n\r\n This program is distributed in the hope that it will be useful,\r\n but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r\n\r\n **********************************************************************}\r\nunit JS;\r\n\r\n{$mode objfpc}\r\n{$modeswitch externalclass}\r\n\r\ninterface\r\n\r\nuses\r\n Types;\r\n\r\ntype\r\n // We cannot use EConvertError or Exception, this would result in a circular dependency.\r\n\r\n AsyncAttribute = class(TCustomAttribute);\r\n\r\n { EJS }\r\n\r\n EJS = class(TObject)\r\n private\r\n FMessage: string;\r\n Public\r\n constructor Create(const Msg: String); reintroduce;\r\n property Message : string Read FMessage Write FMessage;\r\n end;\r\n\r\n TJSObjectPropertyDescriptor = JSValue;\r\n Float32 = Double;\r\n Float64 = Double;\r\n\r\n { TJSObject }\r\n\r\n TJSObject = class external name 'Object'\r\n private\r\n function GetProperties(Name: String): JSValue; external name '[]';\r\n procedure SetProperties(Name: String; const AValue: JSValue); external name '[]';\r\n public\r\n constructor new;\r\n class function create(const proto: TJSObject): TJSObject;\r\n class function create(const proto, propertiesObject: TJSObject): TJSObject;\r\n class function assign(const Target, Source1: TJSObject): TJSObject; varargs;\r\n class procedure defineProperty(const obj: TJSObject; propname: String; const descriptor: TJSObjectPropertyDescriptor);\r\n //class procedure defineProperties\r\n class function freeze(const obj: TJSObject): TJSObject;\r\n class function getOwnPropertyDescriptor(const obj: TJSObject; propname: String): TJSObjectPropertyDescriptor;\r\n //class function getOwnPropertyDescriptors\r\n class function getOwnPropertyNames(const obj: TJSObject): TStringDynArray;\r\n {$IFDEF FIREFOX}\r\n class function getOwnPropertySymbols(const obj: TJSObject): TJSValueDynArray;\r\n {$ENDIF}\r\n class function getPrototypeOf(const obj: TJSObject): TJSObject;\r\n {$IFDEF FIREFOX}\r\n class function _is(const value1, value2: JSValue): boolean;\r\n {$ENDIF}\r\n class function isExtensible(const obj: TJSObject): boolean;\r\n class function isFrozen(const obj: TJSObject): boolean;\r\n class function isSealed(const obj: TJSObject): boolean;\r\n class function keys(const obj: TJSObject): TStringDynArray;\r\n class function preventExtensions(const obj: TJSObject): TJSObject;\r\n class function seal(const obj: TJSObject): TJSObject;\r\n class function setPrototypeOf(const obj, prototype: TJSObject): TJSObject;\r\n function hasOwnProperty(prop: String): boolean;\r\n function isPrototypeOf(const obj: TJSObject): boolean;\r\n function propertyIsEnumerable(propname: String): boolean;\r\n function toLocaleString: String;\r\n function toString: String;\r\n function valueOf: JSValue;\r\n property Properties[Name: String]: JSValue read GetProperties write SetProperties; default;\r\n end;\r\n\r\n TJSObjectDynArray = Array of TJSObject;\r\n TJSObjectDynArrayArray = Array of TJSObjectDynArray;\r\n TJSStringDynArray = Array of String;\r\n\r\n\r\n { TJSIteratorValue }\r\n TJSIteratorValue = class external name 'IteratorValue'\r\n public\r\n value : JSValue; external name 'value';\r\n done : boolean; external name 'done';\r\n end;\r\n\r\n { TJSIterator }\r\n TJSIterator = class external name 'Iterator'\r\n Public\r\n function next: TJSIteratorValue;\r\n end;\r\n\r\n\r\n TJSSet = class;\r\n\r\n TJSSetEventProc = reference to procedure(value : JSValue; key: NativeInt; set_: TJSSet);\r\n TJSSetProcCallBack = reference to procedure(value: JSValue; key: JSValue);\r\n\r\n { TJSSet }\r\n TJSSet = class external name 'Set'\r\n private\r\n FSize : NativeInt; external name 'size';\r\n public\r\n constructor new; overload;\r\n constructor new(aElement1 : JSValue); varargs; overload;\r\n function add(value: JSValue): TJSSet;\r\n function has(value: JSValue): Boolean;\r\n function delete(value: JSValue): Boolean;\r\n procedure clear;\r\n function values: TJSIterator;\r\n procedure forEach(const aCallBack: TJSSetEventProc); overload;\r\n procedure forEach(const aCallBack: TJSSetProcCallBack); overload;\r\n procedure forEach(const aCallBack: TJSSetEventProc; thisArg: JSValue); overload;\r\n function entries: TJSIterator;\r\n function keys: TJSIterator;\r\n Property size : NativeInt Read FSize;\r\n end;\r\n\r\n TJSMapFunctionCallBack = reference to function(arg : JSValue): JSValue;\r\n TJSMapProcCallBack = reference to procedure(value: JSValue; key: JSValue);\r\n\r\n { TJSMap }\r\n TJSMap = class external name 'Map'\r\n Private\r\n FSize : NativeInt; external name 'size';\r\n public\r\n constructor new; varargs; overload;\r\n constructor new(aElement1 : JSValue); varargs; overload;\r\n function &set(key: JSValue; value: JSValue) :TJSMap;\r\n function get(key : JSValue): JSValue;\r\n function has(key: JSValue): Boolean;\r\n function delete(key: JSValue): Boolean;\r\n procedure clear;\r\n function entries: TJSIterator;\r\n procedure forEach(const aCallBack: TJSMapFunctionCallBack); overload;\r\n procedure forEach(const aCallBack: TJSMapFunctionCallBack; thisArg: JSValue); overload;\r\n procedure forEach(const aCallBack: TJSMapProcCallBack); overload;\r\n function keys: TJSIterator;\r\n function values: TJSIterator;\r\n property size : NativeInt Read FSize;\r\n end;\r\n\r\n { TJSFunction }\r\n\r\n TJSFunction = class external name 'Function'(TJSObject)\r\n private\r\n Flength: NativeInt external name 'length';\r\n Fprototyp: TJSFunction external name 'prototyp';\r\n public\r\n name: String;\r\n property prototyp: TJSFunction read Fprototyp;\r\n property length: NativeInt read Flength;\r\n function apply(thisArg: TJSObject; const ArgArray: TJSValueDynArray): JSValue; varargs;\r\n function bind(thisArg: TJSObject): JSValue; varargs;\r\n function call(thisArg: TJSObject): JSValue; varargs;\r\n end;\r\n\r\n { TJSDate - wrapper for JavaScript Date }\r\n\r\n TJSDate = class external name 'Date'(TJSFunction)\r\n private\r\n function getDate: NativeInt;\r\n function getFullYear: NativeInt;\r\n function getHours: NativeInt;\r\n function getMilliseconds: NativeInt;\r\n function getMinutes: NativeInt;\r\n function getMonth: NativeInt;\r\n function getSeconds: NativeInt;\r\n function getYear: NativeInt;\r\n function getTime: NativeInt;\r\n function getUTCDate: NativeInt;\r\n function getUTCFullYear: NativeInt;\r\n function getUTCHours: NativeInt;\r\n function getUTCMilliseconds: NativeInt;\r\n function getUTCMinutes: NativeInt;\r\n function getUTCMonth: NativeInt;\r\n function getUTCSeconds: NativeInt;\r\n procedure setDate(const AValue: NativeInt);\r\n procedure setFullYear(const AValue: NativeInt);\r\n procedure setHours(const AValue: NativeInt);\r\n procedure setMilliseconds(const AValue: NativeInt);\r\n procedure setMinutes(const AValue: NativeInt);\r\n procedure setMonth(const AValue: NativeInt);\r\n procedure setSeconds(const AValue: NativeInt);\r\n procedure setYear(const AValue: NativeInt);\r\n procedure setTime(const AValue: NativeInt);\r\n procedure setUTCDate(const AValue: NativeInt);\r\n procedure setUTCFullYear(const AValue: NativeInt);\r\n procedure setUTCHours(const AValue: NativeInt);\r\n procedure setUTCMilliseconds(const AValue: NativeInt);\r\n procedure setUTCMinutes(const AValue: NativeInt);\r\n procedure setUTCMonth(const AValue: NativeInt);\r\n procedure setUTCSeconds(const AValue: NativeInt);\r\n public\r\n constructor New; reintroduce;\r\n constructor New(const MilliSecsSince1970: NativeInt); // milliseconds since 1 January 1970 00:00:00 UTC, with leap seconds ignored\r\n constructor New(const aDateString: String); // RFC 2822, ISO8601\r\n constructor New(aYear: NativeInt; aMonth: NativeInt; aDayOfMonth: NativeInt = 1;\r\n TheHours: NativeInt = 0; TheMinutes: NativeInt = 0; TheSeconds: NativeInt = 0;\r\n TheMilliseconds: NativeInt = 0);\r\n class function now: NativeInt; // current date and time in milliseconds since 1 January 1970 00:00:00 UTC, with leap seconds ignored\r\n class function parse(const aDateString: string): NativeInt; // format depends on browser\r\n class function UTC(aYear: NativeInt; aMonth: NativeInt = 0; aDayOfMonth: NativeInt = 1;\r\n TheHours: NativeInt = 0; TheMinutes: NativeInt = 0; TheSeconds: NativeInt = 0;\r\n TheMilliseconds: NativeInt = 0): NativeInt;\r\n function getDay: NativeInt;\r\n function getTimezoneOffset: NativeInt;\r\n function getUTCDay: NativeInt; // day of the week\r\n function toDateString: string; // human readable date, without time\r\n function toISOString: string; // ISO 8601 Extended Format\r\n function toJSON: string;\r\n function toGMTString: string; // in GMT timezone\r\n function toLocaleDateString: string; // date in locale timezone, no time\r\n function toLocaleString: string; reintroduce; // date and time in locale timezone\r\n function toLocaleTimeString: string; // time in locale timezone, no date\r\n function toTimeString: string; // time human readable, no date\r\n function toUTCString: string; // date and time using UTC timezone\r\n property Year: NativeInt read getYear write setYear;\r\n property Time: NativeInt read getTime write setTime; // milliseconds since 1 January 1970 00:00:00 UTC, with leap seconds ignored\r\n property FullYear: NativeInt read getFullYear write setFullYear;\r\n property UTCDate: NativeInt read getUTCDate write setUTCDate; // day of month\r\n property UTCFullYear: NativeInt read getUTCFullYear write setUTCFullYear;\r\n property UTCHours: NativeInt read getUTCHours write setUTCHours;\r\n property UTCMilliseconds: NativeInt read getUTCMilliseconds write setUTCMilliseconds;\r\n property UTCMinutes: NativeInt read getUTCMinutes write setUTCMinutes;\r\n property UTCMonth: NativeInt read getUTCMonth write setUTCMonth;\r\n property UTCSeconds: NativeInt read getUTCSeconds write setUTCSeconds;\r\n property Month: NativeInt read getMonth write setMonth;\r\n property Date: NativeInt read getDate write setDate; // day of the month, starting at 1\r\n property Hours: NativeInt read getHours write setHours;\r\n property Minutes: NativeInt read getMinutes write setMinutes;\r\n property Seconds: NativeInt read getSeconds write setSeconds;\r\n property Milliseconds: NativeInt read getMilliseconds write setMilliseconds;\r\n end;\r\n\r\n TLocaleCompareOptions = record\r\n localematched : string;\r\n usage: string;\r\n sensitivity : string;\r\n ignorePunctuation : Boolean;\r\n numeric : boolean;\r\n caseFirst : string;\r\n end;\r\n\r\n TJSRegexp = class external name 'RegExp'\r\n private\r\n {$IFDEF FIREFOX}\r\n // not on all browsers:\r\n FFlags : string; external name 'flags';\r\n FSticky : boolean; external name 'sticky';\r\n {$endif}\r\n fglobal: boolean; external name 'global';\r\n fignoreCase : boolean; external name 'ignoreCase';\r\n fmultiline : boolean; external name 'multiline';\r\n fsource : string; external name 'source';\r\n funicode : boolean; external name 'unicode';\r\n public\r\n Constructor New(Pattern : string);\r\n Constructor New(Pattern, Flags : string);\r\n lastIndex: NativeInt;\r\n function exec(aString : string): TStringDynArray;\r\n function test(aString : string) : boolean;\r\n function toString : String;\r\n property Global : boolean read fglobal;\r\n property IgnoreCase : Boolean read FIgnoreCase;\r\n property Multiline : Boolean Read FMultiLine;\r\n Property Source : string Read FSource;\r\n Property Unicode : boolean Read FUnicode;\r\n {$IFDEF FIREFOX}\r\n // not on all browsers:\r\n property Flags : string read FFlags;\r\n property Sticky : boolean read FSticky;\r\n {$endif}\r\n end;\r\n\r\n\r\n TReplaceCallBack = reference to Function (Const match : string) : string; varargs;\r\n TReplaceCallBack0 = reference to Function (Const match : string; offset : Integer; AString : String) : string;\r\n TReplaceCallBack1 = reference to Function (Const match,p1 : string; offset : Integer; AString : String) : string;\r\n TReplaceCallBack2 = reference to Function (Const match,p1,p2 : string; offset : Integer; AString : String) : string;\r\n\r\n TJSString = class external name 'String'\r\n private\r\n flength : NativeInt; external name 'length';\r\n public \r\n constructor New(Const S : String);\r\n constructor New(Const I : NativeInt);\r\n constructor New(Const D : double);\r\n property length : NativeInt read flength; \r\n class function fromCharCode() : string; varargs;\r\n class function fromCodePoint() : string; varargs;\r\n function anchor(const aName : string) : string;\r\n function charAt(aIndex : NativeInt) : string;\r\n function charCodeAt(aIndex : NativeInt) : NativeInt;\r\n function codePointAt(aIndex : NativeInt) : NativeInt;\r\n function concat(s : string) : string; varargs;\r\n function endsWith(aSearchString : string) : boolean; overload;\r\n function endsWith(aSearchString : string; Pos : NativeInt) : boolean; overload;\r\n function includes(aSearchString : string; Pos : NativeInt = 0) : boolean;\r\n function indexOf(aSearchString : String; Pos : NativeInt = 0) : Integer;\r\n function lastIndexOf(aSearchString : String) : NativeInt;overload;\r\n function lastIndexOf(aSearchString : String; Pos : NativeInt) : Integer;overload;\r\n function link(aUrl : string) : String;\r\n function localeCompare(aCompareString : string) : NativeInt; overload;\r\n function localeCompare(aCompareString : string; aLocales: string) : integer; overload;\r\n function localeCompare(compareString : string; locales: string; Options : TlocaleCompareOptions) : integer; overload;\r\n function match(aRegexp : TJSRegexp) : TStringDynArray; overload;\r\n function match(aRegexp : String) : TStringDynArray;overload;\r\n {$IFDEF ECMAScript6}\r\n function normalize : string;\r\n function normalize(aForm : string) : string;\r\n {$ENDIF}\r\n function _repeat(aCount : NativeInt) : Integer; external name 'repeat';\r\n function replace(aRegexp : String; NewString : String) : String; overload;\r\n function replace(aRegexp : TJSRegexp; NewString : String) : String; overload;\r\n function replace(Regexp : String; aCallback : TReplaceCallBack) : String; overload;\r\n function replace(Regexp : TJSRegexp; aCallback : TReplaceCallBack) : String; overload;\r\n function replace(Regexp : String; aCallback : TReplaceCallBack0) : String; overload;\r\n function replace(Regexp : TJSRegexp; aCallback : TReplaceCallBack0) : String; overload;\r\n function replace(Regexp : String; aCallback : TReplaceCallBack1) : String; overload;\r\n function replace(Regexp : TJSRegexp; aCallback : TReplaceCallBack1) : String; overload;\r\n function replace(Regexp : String; aCallback : TReplaceCallBack2) : String; overload;\r\n function replace(Regexp : TJSRegexp; aCallback : TReplaceCallBack2) : String; overload;\r\n function search(Regexp : TJSRegexp) : NativeInt; overload;\r\n function search(Regexp : JSValue) : NativeInt; overload;\r\n function slice(aBeginIndex : NativeInt) : String; overload;\r\n function slice(aBeginIndex, aEndIndex : NativeInt) : String; overload;\r\n function split : TStringDynArray; overload;\r\n function split(aRegexp : TJSRegexp) : TStringDynArray; overload;\r\n function split(aSeparator : string) : TStringDynArray; overload;\r\n function split(aSeparator : string; aLimit : NativeInt) : TStringDynArray; overload;\r\n function split(aSeparator : array of string) : TStringDynArray; overload;\r\n function split(aSeparator : array of string; aLimit : NativeInt) : TStringDynArray; overload;\r\n function startsWith(aSearchString : String) : Boolean; overload;\r\n function startsWith(aSearchString : String; aPosition : NativeInt) : Boolean; overload;\r\n function substr(aStartIndex : NativeInt) : String; overload;\r\n function substr(aStartIndex,aLength : NativeInt) : String; overload;\r\n function substring(aStartIndex : NativeInt) : String; overload;\r\n function substring(aStartIndex,aEndIndex : NativeInt) : String; overload;\r\n function toLocaleLowerCase : String;\r\n function toLocaleUpperCase : String;\r\n function toLowerCase : String;\r\n function toString : string;\r\n function toUpperCase : String;\r\n function trim : string;\r\n function valueOf : string;\r\n end;\r\n\r\n TJSArray = Class;\r\n \r\n TJSArrayEventProc = reference to procedure(element : JSValue; index: NativeInt; anArray : TJSArray);\r\n TJSArrayEvent = reference to function (element : JSValue; index: NativeInt; anArray : TJSArray) : Boolean;\r\n TJSArrayMapEvent = reference to function (element : JSValue; index: NativeInt; anArray : TJSArray) : JSValue;\r\n TJSArrayReduceEvent = reference to function (accumulator, currentValue : JSValue; currentIndex : NativeInt; anArray : TJSArray) : JSValue;\r\n TJSArrayCompareEvent = reference to function (a,b : JSValue) : NativeInt;\r\n TJSArrayCallback = TJSArrayEvent;\r\n TJSArrayMapCallback = TJSArrayMapEvent;\r\n TJSArrayReduceCallBack = TJSArrayReduceEvent;\r\n TJSArrayCompareCallBack = TJSArrayCompareEvent;\r\n\r\n { TJSArray }\r\n\r\n TJSArray = Class external name 'Array'\r\n private\r\n function GetElements(Index: NativeInt): JSValue; external name '[]';\r\n procedure SetElements(Index: NativeInt; const AValue: JSValue); external name '[]';\r\n public\r\n FLength : NativeInt; external name 'length';\r\n constructor new; overload;\r\n constructor new(aLength : NativeInt); overload;\r\n constructor new(aElement1 : JSValue); varargs; overload;\r\n class function _of() : TJSArray; varargs; external name 'of'; \r\n class function isArray(a: JSValue) : Boolean;\r\n{$IFDEF JAVASCRIPT2015} \r\n class function from(a : JSValue) : TJSArray;\r\n class function from(arrayLike : JSValue; mapFunction : TJSMapFunctionCallBack): TJSArray; overload;\r\n class function from(arrayLike : JSValue; mapFunction : TJSMapFunctionCallBack; thisArg : JSValue): TJSArray; overload;\r\n{$ENDIF}\r\n function concat(el : JSValue) : TJSArray; varargs;\r\n function copyWithin(aTarget : NativeInt) : TJSarray;overload; // not in IE\r\n function copyWithin(aTarget, aStart : NativeInt) : TJSarray;overload; // not in IE\r\n function copyWithin(aTarget, aStart, aEnd : NativeInt) : TJSarray;overload; // not in IE\r\n function entries: TJSIterator;\r\n Function every(const aCallback : TJSArrayCallBack) : boolean;overload;\r\n Function every(const aCallback : TJSArrayEvent; aThis : TObject) : boolean;overload;\r\n Function filter(const aCallBack : TJSArrayCallBack) : TJSArray; overload;\r\n Function filter(const aCallBack : TJSArrayEvent; aThis : TObject) : TJSArray;overload;\r\n Function fill(aValue : JSValue) : TJSArray; overload;\r\n Function fill(aValue : JSValue; aStartIndex : NativeInt) : TJSArray; overload;\r\n Function fill(aValue : JSValue; aStartIndex,aEndIndex : NativeInt) : TJSArray; overload;\r\n Function find(const aCallBack : TJSArrayCallBack) : JSValue; overload;\r\n Function find(const aCallBack : TJSArrayEvent; aThis : TObject) : JSValue; overload;\r\n Function findIndex(const aCallBack : TJSArrayCallBack) : NativeInt; overload;\r\n Function findIndex(const aCallBack : TJSArrayEvent; aThis : TObject) : NativeInt; overload;\r\n procedure forEach(const aCallBack : TJSArrayEventProc); overload;\r\n procedure forEach(const aCallBack : TJSArrayEvent); overload;\r\n procedure forEach(const aCallBack : TJSArrayEvent; aThis : TObject); overload;\r\n function includes(aElement : JSValue) : Boolean; overload;\r\n function includes(aElement : JSValue; FromIndex : NativeInt) : Boolean; overload;\r\n function indexOf(aElement : JSValue) : NativeInt; overload;\r\n function indexOf(aElement : JSValue; FromIndex : NativeInt) : NativeInt; overload;\r\n function join : String; overload;\r\n function join (aSeparator : string) : String; overload;\r\n function keys: TJSIterator;\r\n function lastIndexOf(aElement : JSValue) : NativeInt; overload;\r\n function lastIndexOf(aElement : JSValue; FromIndex : NativeInt) : NativeInt; overload;\r\n// Function map(const aCallBack : TJSArrayMapEventArray) : JSValue; overload;\r\n Function map(const aCallBack : TJSArrayMapCallBack) : TJSArray; overload;\r\n Function map(const aCallBack : TJSArrayMapEvent; aThis : TObject) : TJSArray; overload;\r\n function pop : JSValue; \r\n function push(aElement : JSValue) : NativeInt; varargs;\r\n function reduce(const aCallBack : TJSArrayReduceCallBack) : JSValue; overload;\r\n function reduce(const aCallBack : TJSArrayReduceCallBack; initialValue : JSValue) : JSValue; overload;\r\n function reduceRight(const aCallBack : TJSArrayReduceCallBack) : JSValue; overload;\r\n function reduceRight(const aCallBack : TJSArrayReduceCallBack; initialValue : JSValue) : JSValue; overload;\r\n Function reverse : TJSArray;\r\n Function shift : JSValue;\r\n Function slice : TJSArray; overload;\r\n function slice(aBegin : NativeInt) : TJSArray; overload;\r\n function slice(aBegin,aEnd : NativeInt) : TJSArray; overload;\r\n Function some(const aCallback : TJSArrayCallBack) : boolean; overload;\r\n Function some(const aCallback : TJSArrayEvent; aThis : TObject) : boolean; overload;\r\n Function sort(const aCallback : TJSArrayCompareCallBack) : TJSArray; overload;\r\n Function sort() : TJSArray; overload;\r\n function splice(aStart : NativeInt) : TJSArray; overload;\r\n function splice(aStart,aDeleteCount : NativeInt) : TJSArray; varargs; overload;\r\n function toLocaleString: String; overload;\r\n function toLocaleString(locales : string) : String; overload;\r\n function toLocaleString(locales : string; const Options : TLocaleCompareOptions) : String; overload;\r\n function toString : String;\r\n function unshift : NativeInt; varargs;\r\n function values: TJSIterator;\r\n Property Length : NativeInt Read FLength Write FLength;\r\n property Elements[Index: NativeInt]: JSValue read GetElements write SetElements; default;\r\n end;\r\n\r\n TJSArrayBuffer = Class external name 'ArrayBuffer' (TJSObject)\r\n private\r\n fLength : NativeInt; external name 'byteLength';\r\n public\r\n constructor new(aByteLength : NativeInt);\r\n class function isView(aValue : JSValue) : Boolean; \r\n function slice(aBegin : NativeInt) : TJSArrayBuffer; overload;\r\n function slice(aBegin,aEnd : NativeInt) : TJSArrayBuffer; overload;\r\n Property byteLength : NativeInt Read fLength;\r\n end;\r\n\r\n TJSBufferSource = class external name 'BufferSource'\r\n end;\r\n\r\n { TJSTypedArray }\r\n TJSTypedArray = Class;\r\n\r\n TJSTypedArrayCallBack = function (element : JSValue; index: NativeInt; anArray : TJSTypedArray) : Boolean;\r\n TJSTypedArrayEvent = function (element : JSValue; index: NativeInt; anArray : TJSTypedArray) : Boolean of object;\r\n TJSTypedArrayMapCallBack = function (element : JSValue; index: NativeInt; anArray : TJSTypedArray) : JSValue;\r\n TJSTypedArrayMapEvent = function (element : JSValue; index: NativeInt; anArray : TJSTypedArray) : JSValue of object;\r\n TJSTypedArrayReduceCallBack = function (accumulator, currentValue : JSValue; currentIndex : NativeInt; anArray : TJSTypedArray) : JSValue;\r\n TJSTypedArrayCompareCallBack = function (a,b : JSValue) : NativeInt;\r\n\r\n TJSTypedArray = class external name 'TypedArray' (TJSBufferSource)\r\n Private\r\n FBuffer: TJSArrayBuffer; external name 'buffer';\r\n FByteLength: NativeInt; external name 'byteLength';\r\n FLength: NativeInt; external name 'length';\r\n FByteOffset: NativeInt; external name 'byteOffset';\r\n FBytesPerElement : NativeInt; external name 'BYTES_PER_ELEMENT';\r\n function getValue(Index : NativeInt) : JSValue; external name '[]';\r\n procedure setValue(Index : NativeInt;AValue : JSValue); external name '[]';\r\n Public\r\n property BYTES_PER_ELEMENT : NativeInt Read FBytesPerElement;\r\n class var name : string;\r\n// class function from(aValue : jsValue) : TJSTypedArray;\r\n// class function from(aValue : jsValue; Map : TJSTypedArrayMapCallBack) : TJSTypedArray;\r\n// class function from(aValue : jsValue; aMap : TJSTypedArrayMapEvent) : TJSTypedArray;\r\n class function _of(aValue : jsValue) : TJSTypedArray; varargs; external name 'of';\r\n function copyWithin(aTarget : NativeInt) : TJSTypedArray;overload;\r\n function copyWithin(aTarget, aStart : NativeInt) : TJSTypedArray;overload;\r\n function copyWithin(aTarget, aStart, aEnd : NativeInt) : TJSTypedArray;overload;\r\n Function every(const aCallback : TJSTypedArrayCallBack) : boolean;overload;\r\n Function every(const aCallback : TJSTypedArrayEvent; aThis : TObject) : boolean;overload;\r\n Function fill(aValue : JSValue) : TJSTypedArray; overload;\r\n Function fill(aValue : JSValue; aStartIndex : NativeInt) : TJSTypedArray; overload;\r\n Function fill(aValue : JSValue; aStartIndex,aEndIndex : NativeInt) : TJSTypedArray; overload;\r\n Function filter(const aCallBack : TJSTypedArrayCallBack) : TJSTypedArray; overload;\r\n Function filter(const aCallBack : TJSTypedArrayEvent; aThis : TObject) : TJSTypedArray;overload;\r\n Function find(const aCallBack : TJSTypedArrayCallBack) : JSValue; overload;\r\n Function find(const aCallBack : TJSTypedArrayEvent; aThis : TObject) : JSValue; overload;\r\n Function findIndex(const aCallBack : TJSTypedArrayCallBack) : NativeInt; overload;\r\n Function findIndex(const aCallBack : TJSTypedArrayEvent; aThis : TObject) : NativeInt; overload;\r\n procedure forEach(const aCallBack : TJSTypedArrayCallBack); overload;\r\n procedure forEach(const aCallBack : TJSTypedArrayEvent; aThis : TObject); overload;\r\n function includes(aElement : JSValue) : Boolean; overload;\r\n function includes(aElement : JSValue; FromIndex : NativeInt) : Boolean; overload;\r\n function indexOf(aElement : JSValue) : NativeInt; overload;\r\n function indexOf(aElement : JSValue; FromIndex : NativeInt) : NativeInt; overload;\r\n function join : String; overload;\r\n function join (aSeparator : string) : String; overload;\r\n function lastIndexOf(aElement : JSValue) : NativeInt; overload;\r\n function lastIndexOf(aElement : JSValue; FromIndex : NativeInt) : NativeInt; overload;\r\n Function map(const aCallBack : TJSTypedArrayCallBack) : TJSTypedArray; overload;\r\n Function map(const aCallBack : TJSTypedArrayEvent; aThis : TObject) : TJSTypedArray; overload;\r\n function reduce(const aCallBack : TJSTypedArrayReduceCallBack) : JSValue; overload;\r\n function reduce(const aCallBack : TJSTypedArrayReduceCallBack; initialValue : JSValue) : JSValue; overload;\r\n function reduceRight(const aCallBack : TJSTypedArrayReduceCallBack) : JSValue; overload;\r\n function reduceRight(const aCallBack : TJSTypedArrayReduceCallBack; initialValue : JSValue) : JSValue; overload;\r\n Function reverse : TJSTypedArray;\r\n procedure _set(anArray : TJSArray); external name 'set';\r\n procedure _set(anArray : TJSArray; anOffset : NativeInt); external name 'set';\r\n procedure _set(anArray : TJSTypedArray); external name 'set';\r\n procedure _set(anArray : TJSTypedArray; anOffset : NativeInt); external name 'set';\r\n Function slice : TJSTypedArray; overload;\r\n function slice(aBegin : NativeInt) : TJSTypedArray; overload;\r\n function slice(aBegin,aEnd : NativeInt) : TJSTypedArray; overload;\r\n Function some(const aCallback : TJSTypedArrayCallBack) : boolean; overload;\r\n Function some(const aCallback : TJSTypedArrayEvent; aThis : TObject) : boolean; overload;\r\n Function sort(const aCallback : TJSTypedArrayCompareCallBack) : TJSTypedArray; overload;\r\n Function sort() : TJSTypedArray; overload;\r\n function splice(aStart : NativeInt) : TJSTypedArray; overload;\r\n function splice(aStart,aDeleteCount : NativeInt) : TJSTypedArray; varargs; overload;\r\n function toLocaleString: String; overload;\r\n function toLocaleString(locales : string) : String; overload;\r\n function toLocaleString(locales : string; const Options : TLocaleCompareOptions) : String; overload;\r\n function toString : String;\r\n function unshift : NativeInt; varargs;\r\n property buffer : TJSArrayBuffer read FBuffer;\r\n property byteLength : NativeInt Read FByteLength;\r\n property byteOffset : NativeInt Read FByteOffset;\r\n property length : NativeInt Read FLength;\r\n property values[Index : NativeInt] : JSValue Read getValue Write SetValue; default;\r\n end;\r\n\r\n { TJSInt8Array }\r\n\r\n TJSInt8Array = class external name 'Int8Array' (TJSTypedArray)\r\n private\r\n function getTypedValue(Index : NativeInt): Shortint; external name '[]';\r\n procedure setTypedValue(Index : NativeInt; AValue: Shortint);external name '[]';\r\n public\r\n{$IFDEF JAVASCRIPT2017}\r\n constructor new; // new in ES2017\r\n{$ENDIF}\r\n constructor new (length : NativeInt);\r\n constructor new (atypedArray : TJSTypedArray);\r\n constructor new (aObject : TJSObject);\r\n constructor new (buffer : TJSArrayBuffer);\r\n constructor new (buffer : TJSArrayBuffer; aByteOffset: NativeInt);\r\n constructor new (buffer : TJSArrayBuffer; aByteOffset, aLength: NativeInt);\r\n class function from(aValue : jsValue) : TJSInt8Array; reintroduce;\r\n class function from(aValue : jsValue; Map : TJSTypedArrayMapCallBack) : TJSInt8Array; reintroduce;\r\n class function from(aValue : jsValue; aMap : TJSTypedArrayMapEvent) : TJSInt8Array; reintroduce;\r\n class function _of(aValue : jsValue) : TJSInt8Array; varargs; external name 'of'; reintroduce;overload;\r\n class function _of(aValue : TJSValueDynArray) : TJSInt8Array; varargs; external name 'of'; reintroduce; overload;\r\n function subarray(aBegin, aEnd: Integer): TJSInt8Array; overload;\r\n function subarray(aBegin: Integer): TJSInt8Array; overload;\r\n procedure _set(anArray : Array of ShortInt); external name 'set'; reintroduce; overload;\r\n procedure _set(anArray : Array of ShortInt; anOffset : NativeInt); external name 'set';\r\n property values[Index : NativeInt] : Shortint Read getTypedValue Write setTypedValue; default;\r\n end;\r\n\r\n TJSUint8Array = class external name 'Uint8Array' (TJSTypedArray)\r\n private\r\n function getTypedValue(Index : NativeInt): Byte; external name '[]';\r\n procedure setTypedValue(Index : NativeInt; AValue: Byte);external name '[]';\r\n public\r\n constructor new (length : NativeInt);\r\n constructor new (atypedArray : TJSTypedArray);\r\n constructor new (aObject : TJSObject);\r\n constructor new (buffer : TJSArrayBuffer);\r\n constructor new (buffer : TJSArrayBuffer; aByteOffset: NativeInt);\r\n constructor new (buffer : TJSArrayBuffer; aByteOffset, aLength: NativeInt);\r\n class function from(aValue : jsValue) : TJSUInt8Array; reintroduce; overload;\r\n class function from(aValue : jsValue; Map : TJSTypedArrayMapCallBack) : TJSUInt8Array; reintroduce;overload;\r\n class function from(aValue : jsValue; aMap : TJSTypedArrayMapEvent) : TJSUInt8Array; reintroduce;overload;\r\n class function _of(aValue : jsValue) : TJSUInt8Array; varargs; external name 'of'; reintroduce; overload;\r\n function subarray(aBegin, aEnd: Integer): TJSUInt8Array; overload;\r\n function subarray(aBegin: Integer): TJSUInt8Array; overload;\r\n procedure _set(anArray : Array of Byte); external name 'set'; reintroduce; overload;\r\n procedure _set(anArray : Array of Byte; anOffset : NativeInt); external name 'set'; overload;\r\n Property values[Index : NativeInt] : Byte Read getTypedValue Write setTypedValue; default;\r\n end;\r\n\r\n TJSUint8ClampedArray = class external name 'Uint8ClampedArray' (TJSTypedArray)\r\n private\r\n function getTypedValue(Index : NativeInt): Byte; external name '[]';\r\n procedure setTypedValue(Index : NativeInt; AValue: Byte);external name '[]';\r\n public\r\n constructor new (length : NativeInt);\r\n constructor new (atypedArray : TJSTypedArray);\r\n constructor new (aObject : TJSObject);\r\n constructor new (buffer : TJSArrayBuffer);\r\n constructor new (buffer : TJSArrayBuffer; aByteOffset: NativeInt);\r\n constructor new (buffer : TJSArrayBuffer; aByteOffset, aLength: NativeInt);\r\n class function from(aValue : jsValue) : TJSUInt8ClampedArray; reintroduce;\r\n class function from(aValue : jsValue; Map : TJSTypedArrayMapCallBack) : TJSUInt8ClampedArray; reintroduce;overload;\r\n class function from(aValue : jsValue; aMap : TJSTypedArrayMapEvent) : TJSUInt8ClampedArray; reintroduce;overload;\r\n class function _of(aValue : jsValue) : TJSUInt8ClampedArray; varargs; external name 'of'; reintroduce;overload;\r\n procedure _set(anArray : Array of Byte); external name 'set'; reintroduce;overload;\r\n procedure _set(anArray : Array of Byte; anOffset : NativeInt); external name 'set';overload;\r\n function subarray(aBegin, aEnd: Integer): TJSUInt8ClampedArray; overload;\r\n function subarray(aBegin: Integer): TJSUInt8ClampedArray; overload;\r\n Property values[Index : NativeInt] : Byte Read getTypedValue Write setTypedValue; default;\r\n end;\r\n\r\n TJSInt16Array = class external name 'Int16Array' (TJSTypedArray)\r\n private\r\n function getTypedValue(Index : NativeInt): smallint; external name '[]';\r\n procedure setTypedValue(Index : NativeInt; AValue: Smallint);external name '[]';\r\n public\r\n constructor new (length : NativeInt);\r\n constructor new (atypedArray : TJSTypedArray);\r\n constructor new (aObject : TJSObject);\r\n constructor new (buffer : TJSArrayBuffer);\r\n constructor new (buffer : TJSArrayBuffer; aByteOffset: NativeInt);\r\n constructor new (buffer : TJSArrayBuffer; aByteOffset, aLength: NativeInt);\r\n class function from(aValue : jsValue) : TJSInt16Array; reintroduce;\r\n class function from(aValue : jsValue; Map : TJSTypedArrayMapCallBack) : TJSInt16Array; reintroduce;overload;\r\n class function from(aValue : jsValue; aMap : TJSTypedArrayMapEvent) : TJSInt16Array; reintroduce;overload;\r\n class function _of(aValue : jsValue) : TJSInt16Array; varargs; external name 'of'; reintroduce;overload;\r\n procedure _set(anArray : Array of SmallInt); external name 'set'; reintroduce;overload;\r\n procedure _set(anArray : Array of SmallInt; anOffset : NativeInt); external name 'set';overload;\r\n function subarray(aBegin, aEnd: Integer): TJSInt16Array; overload;\r\n function subarray(aBegin: Integer): TJSInt16Array; overload;\r\n Property values[Index : NativeInt] : SmallInt Read getTypedValue Write setTypedValue; default;\r\n end;\r\n\r\n TJSUint16Array = class external name 'Uint16Array' (TJSTypedArray)\r\n private\r\n function getTypedValue(Index : NativeInt): Word; external name '[]';\r\n procedure setTypedValue(Index : NativeInt; AValue: Word);external name '[]';\r\n public\r\n constructor new (length : NativeInt);\r\n constructor new (atypedArray : TJSTypedArray);\r\n constructor new (aObject : TJSObject);\r\n constructor new (buffer : TJSArrayBuffer);\r\n constructor new (buffer : TJSArrayBuffer; aByteOffset: NativeInt);\r\n constructor new (buffer : TJSArrayBuffer; aByteOffset, aLength: NativeInt);\r\n class function from(aValue : jsValue) : TJSUInt16Array; reintroduce;\r\n class function from(aValue : jsValue; Map : TJSTypedArrayMapCallBack) : TJSUInt16Array; reintroduce;\r\n class function from(aValue : jsValue; aMap : TJSTypedArrayMapEvent) : TJSUInt16Array; reintroduce;\r\n class function _of(aValue : jsValue) : TJSUInt16Array; varargs; external name 'of'; reintroduce;\r\n procedure _set(anArray : Array of Word); external name 'set'; reintroduce;\r\n procedure _set(anArray : Array of Word; anOffset : NativeInt); external name 'set';\r\n function subarray(aBegin, aEnd: Integer): TJSUInt16Array; overload;\r\n function subarray(aBegin: Integer): TJSUInt16Array; overload;\r\n Property values[Index : NativeInt] : Word Read getTypedValue Write setTypedValue; default;\r\n end;\r\n\r\n TJSInt32Array = class external name 'Int32Array' (TJSTypedArray)\r\n private\r\n function getTypedValue(Index : NativeInt): longint; external name '[]';\r\n procedure setTypedValue(Index : NativeInt; AValue: longint);external name '[]';\r\n public\r\n constructor new (length : NativeInt);\r\n constructor new (atypedArray : TJSTypedArray);\r\n constructor new (aObject : TJSObject);\r\n constructor new (buffer : TJSArrayBuffer);\r\n constructor new (buffer : TJSArrayBuffer; aByteOffset: NativeInt);\r\n constructor new (buffer : TJSArrayBuffer; aByteOffset, aLength: NativeInt);\r\n class function from(aValue : jsValue) : TJSInt32Array; reintroduce;\r\n class function from(aValue : jsValue; Map : TJSTypedArrayMapCallBack) : TJSInt32Array; reintroduce;\r\n class function from(aValue : jsValue; aMap : TJSTypedArrayMapEvent) : TJSInt32Array; reintroduce;\r\n class function _of(aValue : jsValue) : TJSInt32Array; varargs;external name 'of'; reintroduce;\r\n procedure _set(anArray : Array of LongInt); external name 'set'; reintroduce;\r\n procedure _set(anArray : Array of LongInt; anOffset : NativeInt); external name 'set';\r\n function subarray(aBegin, aEnd: Integer): TJSInt32Array; overload;\r\n function subarray(aBegin: Integer): TJSInt32Array; overload;\r\n Property values[Index : NativeInt] : longint Read getTypedValue Write setTypedValue; default;\r\n end;\r\n\r\n TJSUint32Array = class external name 'Uint32Array' (TJSTypedArray)\r\n private\r\n function getTypedValue(Index : NativeInt): LongWord; external name '[]';\r\n procedure setTypedValue(Index : NativeInt; AValue: LongWord);external name '[]';\r\n public\r\n constructor new (length : NativeInt);\r\n constructor new (atypedArray : TJSTypedArray);\r\n constructor new (aObject : TJSObject);\r\n constructor new (buffer : TJSArrayBuffer);\r\n constructor new (buffer : TJSArrayBuffer; aByteOffset: NativeInt);\r\n constructor new (buffer : TJSArrayBuffer; aByteOffset, aLength: NativeInt);\r\n class function from(aValue : jsValue) : TJSUInt32Array; reintroduce;\r\n class function from(aValue : jsValue; Map : TJSTypedArrayMapCallBack) : TJSUInt32Array; reintroduce;\r\n class function from(aValue : jsValue; aMap : TJSTypedArrayMapEvent) : TJSUInt32Array; reintroduce;\r\n class function _of(aValue : jsValue) : TJSUInt32Array; varargs; external name 'of'; reintroduce;\r\n procedure _set(anArray : Array of Cardinal); external name 'set'; reintroduce;\r\n procedure _set(anArray : Array of Cardinal; anOffset : NativeInt); external name 'set';\r\n function subarray(aBegin, aEnd: Integer): TJSUInt32Array; overload;\r\n function subarray(aBegin: Integer): TJSUInt32Array; overload;\r\n Property values[Index : NativeInt] : LongWord Read getTypedValue Write setTypedValue; default;\r\n end;\r\n\r\n TJSFloat32Array = class external name 'Float32Array' (TJSTypedArray)\r\n private\r\n function getTypedValue(Index : NativeInt): Float32; external name '[]';\r\n procedure setTypedValue(Index : NativeInt; AValue: Float32);external name '[]';\r\n public\r\n constructor new (length : NativeInt);\r\n constructor new (atypedArray : TJSTypedArray);\r\n constructor new (aObject : TJSObject);\r\n constructor new (buffer : TJSArrayBuffer);\r\n constructor new (buffer : TJSArrayBuffer; aByteOffset: NativeInt);\r\n constructor new (buffer : TJSArrayBuffer; aByteOffset, aLength: NativeInt);\r\n class function from(aValue : jsValue) : TJSFloat32Array; reintroduce;\r\n class function from(aValue : jsValue; Map : TJSTypedArrayMapCallBack) : TJSFloat32Array; reintroduce;\r\n class function from(aValue : jsValue; aMap : TJSTypedArrayMapEvent) : TJSFloat32Array; reintroduce;\r\n class function _of(aValue : jsValue) : TJSFloat32Array; varargs; reintroduce;\r\n procedure _set(anArray : Array of Double); external name 'set'; reintroduce;\r\n procedure _set(anArray : Array of Double; anOffset : NativeInt); external name 'set'; reintroduce;\r\n function subarray(aBegin, aEnd: Integer): TJSFloat32Array; overload;\r\n function subarray(aBegin: Integer): TJSFloat32Array; overload;\r\n Property values[Index : NativeInt] : Float32 Read getTypedValue Write setTypedValue; default;\r\n end;\r\n\r\n TJSFloat64Array = class external name 'Float64Array' (TJSTypedArray)\r\n private\r\n function getTypedValue(Index : NativeInt): Float64; external name '[]';\r\n procedure setTypedValue(Index : NativeInt; AValue: Float64);external name '[]';\r\n public\r\n constructor new (length : NativeInt);\r\n constructor new (atypedArray : TJSTypedArray);\r\n constructor new (aObject : TJSObject);\r\n constructor new (buffer : TJSArrayBuffer);\r\n constructor new (buffer : TJSArrayBuffer; aByteOffset: NativeInt);\r\n constructor new (buffer : TJSArrayBuffer; aByteOffset, aLength: NativeInt);\r\n class function from(aValue : jsValue) : TJSFloat64Array; reintroduce;\r\n class function from(aValue : jsValue; Map : TJSTypedArrayMapCallBack) : TJSFloat64Array; reintroduce;\r\n class function from(aValue : jsValue; aMap : TJSTypedArrayMapEvent) : TJSFloat64Array; reintroduce;\r\n class function _of(aValue : jsValue) : TJSFloat64Array; varargs; reintroduce;\r\n procedure _set(anArray : Array of Double); external name 'set'; reintroduce;\r\n procedure _set(anArray : Array of Double; anOffset : NativeInt); external name 'set'; reintroduce;\r\n function subarray(aBegin, aEnd: Integer): TJSFloat64Array; overload;\r\n function subarray(aBegin: Integer): TJSFloat64Array; overload;\r\n Property values[Index : NativeInt] : Float64 Read getTypedValue Write setTypedValue; default;\r\n end;\r\n\r\n TJSDataView = Class external name 'DataView' (TJSBufferSource)\r\n private\r\n fBuffer : TJSArrayBuffer; external name 'buffer';\r\n fLength : NativeInt; external name 'byteLength';\r\n fOffset : NativeInt; external name 'byteOffset';\r\n public\r\n constructor new(aBuffer : TJSArrayBuffer); overload;\r\n constructor new(aBuffer : TJSArrayBuffer; aOffset : NativeInt); overload;\r\n constructor new(aBuffer : TJSArrayBuffer; aOffset,aByteLength : NativeInt); overload;\r\n function getFloat32(aByteOffset : NativeInt) : double; overload;\r\n function getFloat32(aByteOffset : NativeInt; aLittleEndian: Boolean) : double; overload;\r\n function getFloat64(aByteOffset : NativeInt) : double; overload;\r\n function getFloat64(aByteOffset : NativeInt; aLittleEndian: Boolean) : double; overload;\r\n function getInt8(aByteOffset : NativeInt) : ShortInt; \r\n function getInt16(aByteOffset : NativeInt) : SmallInt; overload;\r\n function getInt16(aByteOffset : NativeInt; aLittleEndian : Boolean) : SmallInt; overload;\r\n function getInt32(aByteOffset : NativeInt) : Longint; overload;\r\n function getInt32(aByteOffset : NativeInt; aLittleEndian : Boolean) : Longint; overload;\r\n function getUint8(aByteOffset : NativeInt) : Byte; overload;\r\n function getUint16(aByteOffset : NativeInt) : Word; overload;\r\n function getUint16(aByteOffset : NativeInt; aLittleEndian : Boolean) : Word; overload;\r\n function getUint32(aByteOffset : NativeInt) : LongWord; overload;\r\n function getUint32(aByteOffset : NativeInt; aLittleEndian : Boolean) : LongWord; overload;\r\n\r\n procedure setFloat32(aByteOffset : NativeInt; aValue : double); overload;\r\n procedure setFloat32(aByteOffset : NativeInt; aValue : double; aLittleEndian: Boolean); overload;\r\n procedure setFloat64(aByteOffset : NativeInt; aValue : double); overload;\r\n procedure setFloat64(aByteOffset : NativeInt; aValue : double; aLittleEndian: Boolean); overload;\r\n procedure setInt8(aByteOffset : NativeInt; aValue : ShortInt); \r\n procedure setInt16(aByteOffset : NativeInt; aValue : SmallInt); overload;\r\n procedure setInt16(aByteOffset : NativeInt; aValue : SmallInt; aLittleEndian : Boolean); overload;\r\n procedure setInt32(aByteOffset : NativeInt; aValue : Longint); overload;\r\n procedure setInt32(aByteOffset : NativeInt; aValue : Longint; aLittleEndian : Boolean); overload;\r\n procedure setUint8(aByteOffset : NativeInt; aValue : Byte); overload;\r\n procedure setUint16(aByteOffset : NativeInt; aValue : Word); overload;\r\n procedure setUint16(aByteOffset : NativeInt; aValue : Word; aLittleEndian : Boolean); overload;\r\n procedure setUint32(aByteOffset : NativeInt; aValue : LongWord); overload;\r\n procedure setUint32(aByteOffset : NativeInt; aValue: LongWord; aLittleEndian : Boolean); overload;\r\n Property byteLength : NativeInt Read fLength;\r\n Property byteOffset : NativeInt read fOffset;\r\n property buffer : TJSArrayBuffer Read fBuffer;\r\n end;\r\n\r\n TJSJSON = class external name 'JSON' (TJSObject)\r\n Public\r\n class function parse(aJSON : String) : JSValue;\r\n // Use this only when you are sure you will get an object, no checking is done.\r\n class function parseObject(aJSON : String) : TJSObject; external name 'parse';\r\n class function stringify(aValue : JSValue) : string;\r\n class function stringify(aValue,aReplacer : JSValue) : string;\r\n class function stringify(aValue,aReplacer : JSValue; space: NativeInt) : string;\r\n class function stringify(aValue,aReplacer : JSValue; space: String) : string;\r\n end;\r\n\r\n { TJSError }\r\n\r\n TJSError = Class external name 'Error' (TJSObject)\r\n private\r\n FMessage: String; external name 'message';\r\n {$ifdef NodeJS}\r\n FStack: JSValue; external name 'stack';\r\n {$endif}\r\n Public\r\n Constructor new;\r\n Constructor new(Const aMessage : string);\r\n Constructor new(Const aMessage,aFileName : string);\r\n Constructor new(Const aMessage,aFileName : string; aLineNumber : NativeInt);\r\n Property Message : String Read FMessage;\r\n {$ifdef NodeJS}\r\n Property Stack: JSValue read FStack;\r\n {$endif}\r\n end;\r\n\r\n\r\n TJSPromiseResolver = reference to function (aValue : JSValue) : JSValue;\r\n TJSPromiseExecutor = reference to procedure (resolve,reject : TJSPromiseResolver);\r\n TJSPromiseFinallyHandler = reference to procedure;\r\n TJSPromise = Class;\r\n TJSPromiseArray = array of TJSPromise;\r\n\r\n TJSPromise = class external name 'Promise'\r\n constructor new(Executor : TJSPromiseExecutor);\r\n class function all(arg : Array of JSValue) : TJSPromise; overload;\r\n class function all(arg : JSValue) : TJSPromise; overload;\r\n class function all(arg : TJSPromiseArray) : TJSPromise; overload;\r\n class function race(arg : Array of JSValue) : TJSPromise; overload;\r\n class function race(arg : JSValue) : TJSPromise; overload;\r\n class function race(arg : TJSPromiseArray) : TJSPromise; overload;\r\n class function reject(reason : JSValue) : TJSPromise;\r\n class function resolve(value : JSValue): TJSPromise; overload;\r\n class function resolve : TJSPromise; overload;\r\n function _then (onAccepted : TJSPromiseResolver) : TJSPromise; external name 'then';\r\n function _then (onAccepted,OnRejected: TJSPromiseResolver) : TJSPromise; external name 'then';\r\n function catch (onRejected : TJSPromiseResolver) : TJSPromise;\r\n function _finally(value : TJSPromiseFinallyHandler): TJSPromise;\r\n end;\r\n\r\n\r\n TJSFunctionArguments = class external name 'arguments'\r\n private\r\n FLength: NativeInt; external name 'length';\r\n function GetElements(Index: NativeInt): JSValue; external name '[]';\r\n procedure SetElements(Index: NativeInt; const AValue: JSValue); external name '[]';\r\n public\r\n property Length: NativeInt read FLength;\r\n property Elements[Index: NativeInt]: JSValue read GetElements write SetElements; default;\r\n end;\r\n\r\n TJSIteratorResult = Class external name 'IteratorResult' (TJSObject)\r\n Private\r\n fDone : Boolean; external name 'done';\r\n fValue : JSValue; external name 'value';\r\n Public\r\n property done : boolean Read FDone;\r\n property value : JSValue read FValue;\r\n end;\r\n\r\n TJSAsyncIterator = Class external name 'AsyncIterator' (TJSObject)\r\n function next: TJSIteratorResult;\r\n end;\r\n\r\n\r\nvar\r\n // JSArguments can be used in procedures/functions to provide access to the 'arguments' array.\r\n JSArguments: TJSFunctionArguments; external name 'arguments';\r\n // JSThis can be used in all code to access the javascript 'this' object.\r\n JSThis: TJSObject; external name 'this';\r\n // JSExceptValue can be used in catch blocks to access the JS throw value\r\n JSExceptValue: JSValue; external name '$e';\r\n\r\nfunction new(aElements: TJSValueDynArray) : TJSObject; overload;\r\nfunction JSDelete(const Obj: JSValue; const PropName: string): boolean; assembler; overload;\r\n\r\nfunction decodeURIComponent(encodedURI : String) : String; external name 'decodeURIComponent';\r\nfunction encodeURIComponent(str : String) : String; external name 'encodeURIComponent';\r\n\r\nfunction parseInt(s: String; Radix: NativeInt): NativeInt; overload; external name 'parseInt'; // may result NaN\r\nfunction parseInt(s: String): NativeInt; overload; external name 'parseInt'; // may result NaN\r\nfunction parseFloat(s: String): double; overload; external name 'parseFloat'; // may result NaN\r\n\r\nfunction hasString(const v: JSValue): boolean; external name 'rtl.hasString';// isString(v) and v<>''\r\nfunction hasValue(const v: JSValue): boolean; assembler; // returns the JS definition of if(v): v is not false, undefined, null, 0, NaN, or the empty string. Note: JS if(new Boolean(false)) returns true.\r\nfunction isArray(const v: JSValue): boolean; external name 'rtl.isArray';\r\nfunction isBoolean(const v: JSValue): boolean; assembler;\r\nfunction isDate(const v: JSValue): boolean; assembler;\r\nfunction isCallback(const v: JSValue): boolean; assembler;\r\nfunction isChar(const v: JSValue): boolean; assembler;\r\nfunction isClass(const v: JSValue): boolean; assembler; // is a Pascal class, e.g. a TClass\r\nfunction isClassInstance(const v: JSValue): boolean; assembler;// is a Pascal class instance, e.g. a TObject\r\nfunction isFunction(const v: JSValue): boolean; external name 'rtl.isFunction';\r\nfunction isInteger(const v: JSValue): boolean; assembler;\r\nfunction isModule(const v: JSValue): boolean; external name 'rtl.isModule';\r\nfunction isNull(const v: JSValue): boolean; assembler;\r\nfunction isNumber(const v: JSValue): boolean; external name 'rtl.isNumber';\r\nfunction isObject(const v: JSValue): boolean; external name 'rtl.isObject'; // true if not null and a JS Object\r\nfunction isRecord(const v: JSValue): boolean; assembler;\r\nfunction isString(const v: JSValue): boolean; external name 'rtl.isString';\r\nfunction isUndefined(const v: JSValue): boolean; assembler;\r\nfunction isDefined(const v: JSValue): boolean; assembler;\r\nfunction isUTF16Char(const v: JSValue): boolean; assembler;\r\nfunction isExt(const InstanceOrClass, aClass: JSValue): boolean; external name 'rtl.isExt'; // aClass can be a JS object or function\r\nfunction jsInstanceOf(const aFunction, aFunctionWithPrototype: JSValue): Boolean; assembler;\r\nfunction jsTypeOf(const v: JSValue): String; external name 'typeof';\r\nfunction jsIsNaN(const v: JSValue): boolean; external name 'isNaN';// true if value cannot be converted to a number. e.g. True on NaN, undefined, {}, '123'. False on true, null, '', ' ', '1A'\r\nfunction jsIsFinite(const v: JSValue): boolean; external name 'isFinite';// true if value is a Finite number\r\nfunction toNumber(const v: JSValue): double; assembler; // if not possible, returns NaN\r\nfunction toInteger(const v: JSValue): NativeInt; // if v is not an integer, returns 0\r\nfunction toObject(Value: JSValue): TJSObject; // If Value is not a Javascript object, returns Nil\r\nfunction toArray(Value: JSValue): TJSArray; // If Value is not a Javascript array, returns Nil\r\nfunction toBoolean(Value: JSValue): Boolean; // If Value is not a Boolean, returns False\r\nfunction toString(Value: JSValue): String; // If Value is not a string, returns ''\r\n\r\nType\r\n TJSValueType = (jvtNull,jvtBoolean,jvtInteger,jvtFloat,jvtString,jvtObject,jvtArray);\r\n\r\nFunction GetValueType(JS : JSValue) : TJSValueType;\r\n\r\nConst\r\n Null : JSValue; external name 'null';\r\n Undefined : JSValue; external name 'undefined';\r\n\r\nimplementation\r\n\r\nfunction new(aElements: TJSValueDynArray): TJSObject;\r\n\r\n function toString(I : Integer): string; external name 'String';\r\n\r\nVar\r\n L,I : integer;\r\n S : String;\r\n\r\nbegin\r\n L:=length(aElements);\r\n if (L mod 2)=1 then\r\n raise EJS.Create('Number of arguments must be even');\r\n I:=0;\r\n // Check all arguments;\r\n While (i2)) return false;\r\n var code = v.charCodeAt(0);\r\n if (code < 0xD800){\r\n if (v.length == 1) return true;\r\n } else if (code <= 0xDBFF){\r\n if (v.length==2){\r\n code = v.charCodeAt(1);\r\n if (code >= 0xDC00 && code <= 0xDFFF) return true;\r\n };\r\n };\r\n return false;\r\nend;\r\n\r\nfunction jsInstanceOf(const aFunction, aFunctionWithPrototype: JSValue\r\n ): Boolean; assembler;\r\nasm\r\n return aFunction instanceof aFunctionWithPrototype;\r\nend;\r\n\r\nfunction toNumber(const v: JSValue): double; assembler;\r\nasm\r\n return v-0;\r\nend;\r\n\r\nfunction toInteger(const v: JSValue): NativeInt;\r\nbegin\r\n if IsInteger(v) then\r\n Result:=NativeInt(v)\r\n else\r\n Result:=0;\r\nend;\r\n\r\nfunction toObject(Value: JSValue): TJSObject;\r\n\r\nbegin\r\n if IsObject(Value) then\r\n Result:=TJSObject(Value)\r\n else\r\n Result:=Nil;\r\nend;\r\n\r\nfunction toArray(Value: JSValue): TJSArray; // If not possible, returns Nil\r\n\r\nbegin\r\n if IsArray(Value) then\r\n Result:=TJSArray(Value)\r\n else\r\n Result:=Nil;\r\nend;\r\n\r\nfunction toBoolean(Value: JSValue): Boolean; // If not possible, returns False\r\n\r\nbegin\r\n if isBoolean(Value) then\r\n Result:=Boolean(Value)\r\n else\r\n Result:=False;\r\nend;\r\n\r\nfunction toString(Value: JSValue): String; // If not possible, returns ''\r\n\r\nbegin\r\n if IsString(Value) then\r\n Result:=String(Value)\r\n else\r\n Result:='';\r\nend;\r\n\r\n{ EJS }\r\n\r\nconstructor EJS.Create(const Msg: String);\r\nbegin\r\n FMessage:=Msg;\r\nend;\r\n\r\n\r\nfunction GetValueType(JS: JSValue): TJSValueType;\r\n\r\nVar\r\n t : string;\r\n\r\nbegin\r\n if isNull(js) then // null reported as object\r\n result:=jvtNull\r\n else\r\n begin\r\n t:=jsTypeOf(js);\r\n if (t='string') then\r\n Result:=jvtString\r\n else if (t='boolean') then\r\n Result:=jvtBoolean\r\n else if (t='object') then\r\n begin\r\n if IsArray(JS) then\r\n Result:=jvtArray\r\n else\r\n Result:=jvtObject;\r\n end\r\n else if (t='number') then\r\n if isInteger(JS) then\r\n result:=jvtInteger\r\n else\r\n result:=jvtFloat\r\n end;\r\nend;\r\n\r\nend.\r\n\r\n","{\r\n This file is part of the Pas2JS run time library.\r\n Copyright (c) 2017 by Mattias Gaertner\r\n\r\n See the file COPYING.FPC, included in this distribution,\r\n for details about the copyright.\r\n\r\n This program is distributed in the hope that it will be useful,\r\n but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r\n\r\n **********************************************************************}\r\nunit SysUtils;\r\n\r\n{$mode objfpc}\r\n{$modeswitch typehelpers}\r\n{$modeswitch advancedrecords}\r\n{$WARN 5078 off : }\r\ninterface\r\n\r\nuses\r\n RTLConsts, js;\r\n\r\nprocedure FreeAndNil(var Obj);\r\n\r\ntype\r\n TProcedure = procedure;\r\n\r\n {*****************************************************************************\r\n Various types\r\n *****************************************************************************}\r\nConst\r\n FloatRecDigits = 19;\r\n\r\ntype\r\n { TFloatRec }\r\n TFloatRec = Record\r\n Exponent: Integer;\r\n Negative: Boolean;\r\n Digits: Array[0..FloatRecDigits-1] of Char;\r\n End;\r\n TEndian = (Little,Big);\r\n TFileName = String;\r\n TByteArray = array [0..32767] of Byte;\r\n TWordArray = array [0..16383] of Word;\r\n TBytes = Array of byte;\r\n TStringArray = array of string;\r\n\r\n TMonthNameArray = array [1..12] of string;\r\n TDayTable = array [1..12] of Word;\r\n TWeekNameArray = array [1..7] of string;\r\n TMonthNames = TMonthNameArray;\r\n TDayNames = array[0..6] of string;\r\n\r\n TSysCharSet = array of Char;\r\n\r\n\r\n{*****************************************************************************\r\n Exception handling\r\n*****************************************************************************}\r\n\r\n { Exception }\r\n\r\n Exception = class(TObject)\r\n private\r\n fMessage: String;\r\n FJSError: TJSError;\r\n fHelpContext: Integer;\r\n {$ifdef NodeJS}\r\n FNodeJSError: TJSError;\r\n {$endif}\r\n public\r\n class var\r\n LogMessageOnCreate : Boolean;\r\n Public\r\n constructor Create(const Msg: String); reintroduce;\r\n constructor CreateFmt(const Msg: string; const Args: array of jsvalue);\r\n constructor CreateHelp(const Msg: String; AHelpContext: Integer);\r\n constructor CreateFmtHelp(const Msg: string; const Args: array of jsvalue; AHelpContext: Integer);\r\n function ToString: String; override;\r\n property HelpContext: Integer read fHelpContext write fHelpContext;\r\n property Message: String read fMessage write fMessage;\r\n {$ifdef NodeJS}\r\n property NodeJSError: TJSError read FNodeJSError write FNodeJSError;\r\n {$endif}\r\n property JSError: TJSError read FJSError write FJSError;\r\n end;\r\n\r\n ExceptClass = class of Exception;\r\n\r\n EExternal = class(Exception);\r\n\r\n { General math errors }\r\n EMathError = class(EExternal);\r\n EInvalidOp = class(EMathError);\r\n EZeroDivide = class(EMathError);\r\n EOverflow = class(EMathError);\r\n EUnderflow = class(EMathError);\r\n\r\n EAbort = class(Exception);\r\n EInvalidCast = class(Exception);\r\n EAssertionFailed = class(Exception);\r\n EObjectCheck = class(Exception);\r\n\r\n { String conversion errors }\r\n EConvertError = class(Exception);\r\n EFormatError = class(Exception);\r\n\r\n\r\n { integer math exceptions }\r\n EIntError = Class(EExternal);\r\n EDivByZero = Class(EIntError);\r\n ERangeError = Class(EIntError);\r\n EIntOverflow = Class(EIntError);\r\n\r\n { General math errors }\r\n\r\n { Run-time and I/O Errors }\r\n EInOutError = class(Exception)\r\n public\r\n ErrorCode : Integer;\r\n end;\r\n\r\n EHeapMemoryError = class(Exception);\r\n EHeapException = EHeapMemoryError;\r\n\r\n EExternalException = class(EExternal);\r\n EInvalidPointer = Class(EHeapMemoryError);\r\n EOutOfMemory = Class(EHeapMemoryError);\r\n\r\n { EVariantError }\r\n\r\n EVariantError = Class(Exception)\r\n ErrCode : longint;\r\n Constructor CreateCode(Code : Longint);\r\n end;\r\n\r\n EAccessViolation = Class(EExternal);\r\n EBusError = Class(EAccessViolation);\r\n EPrivilege = class(EExternal);\r\n EStackOverflow = class(EExternal);\r\n EControlC = class(EExternal);\r\n\r\n { String conversion errors }\r\n\r\n { Other errors }\r\n EAbstractError = Class(Exception);\r\n\r\n EPropReadOnly = class(Exception);\r\n EPropWriteOnly = class(Exception);\r\n\r\n EIntfCastError = class(Exception);\r\n EInvalidContainer = class(Exception);\r\n EInvalidInsert = class(Exception);\r\n\r\n EPackageError = class(Exception);\r\n\r\n EOSError = class(Exception)\r\n public\r\n ErrorCode: Longint;\r\n end;\r\n\r\n ESafecallException = class(Exception);\r\n ENoThreadSupport = Class(Exception);\r\n ENoWideStringSupport = Class(Exception);\r\n ENotImplemented = class(Exception);\r\n\r\n EArgumentException = class(Exception);\r\n EArgumentOutOfRangeException = class(EArgumentException);\r\n EArgumentNilException = class(EArgumentException);\r\n\r\n EPathTooLongException = class(Exception);\r\n ENotSupportedException = class(Exception);\r\n EDirectoryNotFoundException = class(Exception);\r\n EFileNotFoundException = class(Exception);\r\n EPathNotFoundException = class(Exception);\r\n\r\n ENoConstructException = class(Exception);\r\n\r\n//function GetTickCount: Integer;\r\n\r\n\r\n{*****************************************************************************\r\n String function\r\n*****************************************************************************}\r\n\r\nConst\r\n EmptyStr = '';\r\n EmptyWideStr = ''; // No difference here.\r\n HexDisplayPrefix: string = '$';\r\n LeadBytes = [] unimplemented;\r\n\r\nFunction CharInSet(Ch: Char;Const CSet : array of char) : Boolean; overload;\r\n\r\nfunction LeftStr(const S: string; Count: Integer): String; assembler;\r\nfunction RightStr(const S: string; Count: Integer): String; assembler;\r\n\r\nfunction Trim(const S: String): String; assembler;\r\nfunction TrimLeft(const S: String): String; assembler;\r\nfunction TrimRight(const S: String): String; assembler;\r\n\r\nfunction UpperCase(const s: String): String; assembler; overload;\r\nfunction LowerCase(const s: String): String; assembler; overload;\r\n\r\nfunction CompareStr(const s1, s2: String): Integer; assembler;\r\nfunction SameStr(const s1, s2: String): Boolean; assembler;\r\nfunction CompareText(const s1, s2: String): Integer; assembler;\r\nfunction SameText(const s1, s2: String): Boolean; assembler;\r\nfunction AnsiCompareText(const s1, s2: String): Integer; assembler;\r\nfunction AnsiSameText(const s1, s2: String): Boolean; assembler;\r\nfunction AnsiCompareStr(const s1, s2: String): Integer;\r\nprocedure AppendStr(var Dest: String; const S: string);\r\n\r\nfunction Format(const Fmt: String; const Args: array of JSValue): String;\r\n\r\nfunction BytesOf(const AVal: string): TBytes;\r\nfunction StringOf(const ABytes: TBytes): string;\r\n\r\n// JavaScript built-in functions\r\nfunction LocaleCompare(const s1, s2, locales: String): Boolean; assembler; overload;\r\nfunction NormalizeStr(const S: String; const Norm: String = 'NFC'): String; assembler; overload; // not in IE\r\n\r\nfunction IsValidIdent(const Ident: string; AllowDots: Boolean = False; StrictDots: Boolean = False): Boolean;\r\n\r\nType\r\n TStringReplaceFlag = (rfReplaceAll, rfIgnoreCase);\r\n TReplaceFlag = TStringReplaceFlag;\r\n TStringReplaceFlags = set of TStringReplaceFlag;\r\n TReplaceFlags = TStringReplaceFlags;\r\n\r\nfunction StringReplace(aOriginal, aSearch, aReplace: string; Flags: TStringReplaceFlags): String;\r\nfunction QuoteString(aOriginal: String; AQuote: Char): String;\r\nfunction QuotedStr(const s: string; QuoteChar: Char = ''''): string;\r\nfunction DeQuoteString(aQuoted: String; AQuote: Char): String;\r\nFunction LastDelimiter(const Delimiters, S: string): SizeInt;\r\nfunction IsDelimiter(const Delimiters, S: string; Index: Integer): Boolean;\r\nfunction AdjustLineBreaks(const S: string): string;\r\nfunction AdjustLineBreaks(const S: string; Style: TTextLineBreakStyle): string;\r\nfunction WrapText(const Line, BreakStr: string; const BreakChars: Array of char; MaxCol: Integer): string;\r\nfunction WrapText(const Line: string; MaxCol: Integer): string;\r\n\r\n{ *****************************************************************************\r\n Integer conversions\r\n *****************************************************************************}\r\n\r\nfunction IntToStr(const Value: Integer): string;\r\nfunction UIntToStr(const Value: Cardinal): string;\r\nFunction TryStrToInt(const S : String; Out res : Integer) : Boolean;\r\nFunction TryStrToInt(const S : String; Out res : NativeInt) : Boolean;\r\nFunction StrToIntDef(const S : String; Const aDef : Integer) : Integer;\r\nFunction StrToIntDef(const S : String; Const aDef : NativeInt) : NativeInt;\r\nFunction StrToInt(const S : String) : Integer;\r\nFunction StrToNativeInt(const S : String) : NativeInt;\r\n// For compatibility\r\nFunction StrToInt64(const S : String) : NativeLargeInt;\r\nFunction StrToInt64Def(const S : String; ADefault : NativeLargeInt) : NativeLargeInt;\r\nFunction TryStrToInt64(const S : String; Out res : NativeLargeInt) : Boolean;\r\nFunction StrToQWord(const S : String) : NativeLargeUInt;\r\nFunction StrToQWordDef(const S : String; ADefault : NativeLargeUInt) : NativeLargeUInt;\r\nFunction TryStrToQWord(const S : String; Out res : NativeLargeUInt) : Boolean;\r\nFunction StrToUInt64(const S : String) : NativeLargeUInt;\r\nFunction StrToUInt64Def(const S : String; ADefault : NativeLargeUInt) : NativeLargeUInt;\r\nFunction TryStrToUInt64(const S : String; Out res : NativeLargeUInt) : Boolean;\r\nFunction StrToDWord(const S : String) : DWord;\r\nFunction StrToDWordDef(const S : String; ADefault : DWord) : DWord;\r\nFunction TryStrToDWord(const S : String; Out res : DWord) : Boolean;\r\n\r\nfunction IntToHex(Value: NativeInt; Digits: Integer): string; overload;\r\n\r\n{ *****************************************************************************\r\n Float conversions\r\n *****************************************************************************}\r\n\r\nconst\r\n // Note: Currency is internally a double, multiplied by 10000 and truncated.\r\n // The below values are the safe limits, within every step exists.\r\n // Since currency is a double it can take much larger values, but the result\r\n // may differ from Delphi/FPC\r\n MaxCurrency: Currency = 900719925474.0991; // fpc: 922337203685477.5807;\r\n MinCurrency: Currency = -900719925474.0991; // fpc: -922337203685477.5808;\r\n\r\nType\r\n TFloatFormat = (ffFixed,ffGeneral,ffExponent,ffNumber,ffCurrency);\r\n\r\nFunction FloatToDecimal(Value : double; Precision, Decimals : integer) : TFloatRec;\r\nFunction FloatToStr(Value: Double): String;\r\nFunction FloatToStrF(const Value : double; format: TFloatFormat; Precision, Digits: Integer): String;\r\nFunction TryStrToFloat(const S : String; Out res : Extended) : Boolean; overload;\r\nFunction TryStrToFloat(const S : String; Out res : Double) : Boolean; overload;\r\nFunction StrToFloatDef(const S : String; Const aDef : Double) : Double;\r\nFunction StrToFloat(const S : String) : Double;\r\nFunction FormatFloat (Fmt : String; aValue : Double) : String;\r\nFunction SwapEndian(W : Word) : Word;\r\nFunction SwapEndian(C : Cardinal) : Cardinal;\r\n\r\n{ *****************************************************************************\r\n Boolean conversions\r\n *****************************************************************************}\r\n\r\nVar\r\n TrueBoolStrs, FalseBoolStrs : Array of String;\r\n\r\nfunction StrToBool(const S: String): Boolean;\r\nfunction BoolToStr(B: Boolean; UseBoolStrs:Boolean=False): string;\r\nfunction BoolToStr(B: Boolean; const TrueS, FalseS: String): string;\r\nfunction StrToBoolDef(const S: String; Default: Boolean): Boolean;\r\nfunction TryStrToBool(const S: String; out Value: Boolean): Boolean;\r\n\r\n\r\n{*****************************************************************************\r\n OS/Environment\r\n*****************************************************************************}\r\n\r\nConst\r\n ConfigExtension : String = '.cfg';\r\n SysConfigDir : String = '';\r\n\r\ntype\r\n TOnGetEnvironmentVariable = function(Const EnvVar: String): String;\r\n TOnGetEnvironmentString = function(Index: Integer): String;\r\n TOnGetEnvironmentVariableCount = function: Integer;\r\n TShowExceptionHandler = Procedure (Const Msg : String);\r\n TUncaughtPascalExceptionHandler = reference to Procedure(aObject : TObject);\r\n TUncaughtJSExceptionHandler = reference to Procedure(aObject : TJSObject);\r\n\r\nvar\r\n OnGetEnvironmentVariable: TOnGetEnvironmentVariable;\r\n OnGetEnvironmentString: TOnGetEnvironmentString;\r\n OnGetEnvironmentVariableCount: TOnGetEnvironmentVariableCount;\r\n // Handler to show an exception (used when showexception is called)\r\n OnShowException : TShowExceptionHandler = nil;\r\n\r\n// Set handlers for uncaught exceptions. These will call HookUncaughtExceptions\r\n// They return the old exception handler, if there was any.\r\nFunction SetOnUnCaughtExceptionHandler(aValue : TUncaughtPascalExceptionHandler) : TUncaughtPascalExceptionHandler;\r\nFunction SetOnUnCaughtExceptionHandler(aValue : TUncaughtJSExceptionHandler) : TUncaughtJSExceptionHandler;\r\n// Hook the rtl handler for uncaught exceptions. If any exception handlers were set, they will be called.\r\n// If none were set, the exceptions will be displayed using ShowException.\r\nProcedure HookUncaughtExceptions;\r\n\r\nfunction GetEnvironmentVariable(Const EnvVar: String): String;\r\nfunction GetEnvironmentVariableCount: Integer;\r\nfunction GetEnvironmentString(Index: Integer): String;\r\n\r\n\r\nprocedure ShowException(ExceptObject: TObject; ExceptAddr: Pointer = Nil);\r\nProcedure Abort;\r\n\r\n\r\n{*****************************************************************************\r\n Events\r\n*****************************************************************************}\r\nType\r\n TEventType = (etCustom,etInfo,etWarning,etError,etDebug);\r\n TEventTypes = Set of TEventType;\r\n\r\n{*****************************************************************************\r\n Date and time\r\n*****************************************************************************}\r\nType\r\n \r\n TSystemTime = record\r\n Year, Month, Day, DayOfWeek: word;\r\n Hour, Minute, Second, MilliSecond: word;\r\n end ;\r\n TTimeStamp = record\r\n Time: longint; { Number of milliseconds since midnight }\r\n Date: longint; { One plus number of days since 1/1/0001 }\r\n end ;\r\n\r\n\r\nVar\r\n TimeSeparator : char = ':';\r\n DateSeparator : char = '-';\r\n ShortDateFormat : string = 'yyyy-mm-dd';\r\n LongDateFormat : string = 'ddd, yyyy-mm-dd';\r\n ShortTimeFormat : string = 'hh:nn';\r\n LongTimeFormat : string = 'hh:nn:ss';\r\n DecimalSeparator : string = '.';\r\n ThousandSeparator : string = ',';\r\n TimeAMString : string = 'AM';\r\n TimePMString : string = 'PM';\r\n\r\nconst\r\n\r\n HoursPerDay = 24;\r\n MinsPerHour = 60;\r\n SecsPerMin = 60;\r\n MSecsPerSec = 1000;\r\n MinsPerDay = HoursPerDay * MinsPerHour;\r\n SecsPerDay = MinsPerDay * SecsPerMin;\r\n MSecsPerDay = SecsPerDay * MSecsPerSec;\r\n MaxDateTime: TDateTime = 2958465.99999999;\r\n MinDateTime: TDateTime = -693593.99999999;\r\n\r\n JulianEpoch = TDateTime(-2415018.5);\r\n UnixEpoch = JulianEpoch + TDateTime(2440587.5);\r\n\r\n DateDelta = 693594; // Days between 1/1/0001 and 12/31/1899\r\n UnixDateDelta = 25569;\r\n\r\n { True=Leapyear }\r\n\r\nVar\r\n MonthDays : array [Boolean] of TDayTable =\r\n ((31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31),\r\n (31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31));\r\n ShortMonthNames : TMonthNames = (\r\n 'Jan',\r\n 'Feb',\r\n 'Mar',\r\n 'Apr',\r\n 'May',\r\n 'Jun',\r\n 'Jul',\r\n 'Aug',\r\n 'Sep',\r\n 'Oct',\r\n 'Nov',\r\n 'Dec');\r\n LongMonthNames : TMonthNames = (\r\n 'January',\r\n 'February',\r\n 'March',\r\n 'April',\r\n 'May',\r\n 'June',\r\n 'July',\r\n 'August',\r\n 'September',\r\n 'October',\r\n 'November',\r\n 'December');\r\n ShortDayNames : TDayNames = (\r\n 'Sun',\r\n 'Mon',\r\n 'Tue',\r\n 'Wed',\r\n 'Thu',\r\n 'Fri',\r\n 'Sat');\r\n\r\n LongDayNames : TDayNames = (\r\n 'Sunday',\r\n 'Monday',\r\n 'Tuesday',\r\n 'Wednesday',\r\n 'Thursday',\r\n 'Friday',\r\n 'Saturday');\r\n\r\ntype\r\n // Stub, for easier porting of FPC/Delphi code.\r\n // Reading/Writing the properties will actually set the global variables\r\n\r\n { TFormatSettings }\r\n\r\n TFormatSettings = class(TObject)\r\n private\r\n function GetCurrencyDecimals: Byte;\r\n function GetCurrencyFormat: Byte;\r\n function GetCurrencyString: String;\r\n function GetDateSeparator: char;\r\n function GetDecimalSeparator: string;\r\n function GetLongDateFormat: string;\r\n function GetLongDayNames: TDayNames;\r\n function GetLongMonthNames: TMonthNames;\r\n function GetLongTimeFormat: string;\r\n function GetNegCurrFormat: Byte;\r\n function GetShortDateFormat: string;\r\n function GetShortDayNames: TDayNames;\r\n function GetShortMonthNames: TMonthNames;\r\n function GetShortTimeFormat: string;\r\n function GetThousandSeparator: string;\r\n function GetTimeAMString: string;\r\n function GetTimePMString: string;\r\n function GetTimeSeparator: char;\r\n procedure SetCurrencyFormat(AValue: Byte);\r\n procedure SetCurrencyString(AValue: String);\r\n procedure SetDateSeparator(const Value: char);\r\n procedure SetDecimalSeparator(const Value: string);\r\n procedure SetLongDateFormat(const Value: string);\r\n procedure SetLongDayNames(AValue: TDayNames);\r\n procedure SetLongMonthNames(AValue: TMonthNames);\r\n procedure SetLongTimeFormat(const Value: string);\r\n procedure SetNegCurrFormat(AValue: Byte);\r\n procedure SetShortDateFormat(const Value: string);\r\n procedure SetShortDayNames(AValue: TDayNames);\r\n procedure SetShortMonthNames(AValue: TMonthNames);\r\n procedure SetShortTimeFormat(const Value: string);\r\n procedure SetCurrencyDecimals(AValue: Byte);\r\n procedure SetThousandSeparator(const Value: string);\r\n procedure SetTimeAMString(const Value: string);\r\n procedure SetTimePMString(const Value: string);\r\n procedure SetTimeSeparator(const Value: char);\r\n public\r\n class constructor Init;\r\n Property ShortMonthNames : TMonthNames Read GetShortMonthNames Write SetShortMonthNames;\r\n Property LongMonthNames : TMonthNames Read GetLongMonthNames Write SetLongMonthNames;\r\n Property ShortDayNames : TDayNames Read GetShortDayNames Write SetShortDayNames;\r\n Property LongDayNames : TDayNames Read GetLongDayNames Write SetLongDayNames;\r\n property TimeSeparator : char read GetTimeSeparator write SetTimeSeparator;\r\n property DateSeparator : char read GetDateSeparator write SetDateSeparator;\r\n property ShortDateFormat : string read GetShortDateFormat write SetShortDateFormat;\r\n property LongDateFormat : string read GetLongDateFormat write SetLongDateFormat;\r\n property ShortTimeFormat : string read GetShortTimeFormat write SetShortTimeFormat;\r\n property LongTimeFormat : string read GetLongTimeFormat write SetLongTimeFormat;\r\n property DecimalSeparator : string read GetDecimalSeparator write SetDecimalSeparator;\r\n property ThousandSeparator : string read GetThousandSeparator write SetThousandSeparator;\r\n property TimeAMString : string read GetTimeAMString write SetTimeAMString;\r\n property TimePMString : string read GetTimePMString write SetTimePMString;\r\n Property CurrencyFormat : Byte read GetCurrencyFormat Write SetCurrencyFormat;\r\n Property NegCurrFormat : Byte read GetNegCurrFormat Write SetNegCurrFormat;\r\n Property CurrencyDecimals : Byte Read GetCurrencyDecimals Write SetCurrencyDecimals;\r\n Property CurrencyString : String Read GetCurrencyString Write SetCurrencyString;\r\n end;\r\n\r\nVar\r\n FormatSettings: TFormatSettings;\r\n TwoDigitYearCenturyWindow : word = 50;\r\n { Threshold to be subtracted from year before age-detection.}\r\n\r\n\r\nfunction DateTimeToJSDate(aDateTime : TDateTime) : TJSDate;\r\nfunction JSDateToDateTime(aDate : TJSDate) : TDateTime;\r\n\r\nfunction DateTimeToTimeStamp(DateTime: TDateTime): TTimeStamp;\r\nfunction TimeStampToDateTime(const TimeStamp: TTimeStamp): TDateTime;\r\nfunction MSecsToTimeStamp(MSecs: NativeInt): TTimeStamp;\r\nfunction TimeStampToMSecs(const TimeStamp: TTimeStamp): NativeInt;\r\nfunction TryEncodeDate(Year, Month, Day: Word; out Date: TDateTime): Boolean;\r\nfunction TryEncodeTime(Hour, Min, Sec, MSec: Word; out Time: TDateTime): Boolean;\r\nfunction EncodeDate(Year, Month, Day :word): TDateTime;\r\nfunction EncodeTime(Hour, Minute, Second, MilliSecond:word): TDateTime;\r\nfunction ComposeDateTime(Date,Time : TDateTime) : TDateTime;\r\nprocedure DecodeDate(Date: TDateTime; out Year, Month, Day: word);\r\nfunction DecodeDateFully(const DateTime: TDateTime; out Year, Month, Day, DOW: Word): Boolean;\r\nprocedure DecodeTime(Time: TDateTime; out Hour, Minute, Second, MilliSecond: word);\r\nprocedure DateTimeToSystemTime(DateTime: TDateTime; out SystemTime: TSystemTime);\r\nfunction SystemTimeToDateTime(const SystemTime: TSystemTime): TDateTime;\r\nfunction DayOfWeek(DateTime: TDateTime): integer;\r\nfunction Date: TDateTime;\r\nfunction Time: TDateTime;\r\nfunction Now: TDateTime;\r\nfunction IncMonth(const DateTime: TDateTime; NumberOfMonths: integer = 1 ): TDateTime;\r\nprocedure IncAMonth(var Year, Month, Day: Word; NumberOfMonths: Integer = 1);\r\nfunction IsLeapYear(Year: Word): boolean;\r\nfunction DateToStr(Date: TDateTime): string;\r\n// function DateToStr(Date: TDateTime; const FormatSettings: TFormatSettings): string;\r\nfunction TimeToStr(Time: TDateTime): string;\r\n// function TimeToStr(Time: TDateTime; const FormatSettings: TFormatSettings): string;\r\nfunction DateTimeToStr(DateTime: TDateTime; ForceTimeIfZero : Boolean = False): string;\r\n// function DateTimeToStr(DateTime: TDateTime; const FormatSettings: TFormatSettings; ForceTimeIfZero : Boolean = False): string;\r\nfunction StrToDate(const S: String): TDateTime;\r\nfunction StrToDate(const S: String; separator : char): TDateTime;\r\nfunction StrToDate(const S: String; const useformat : string; separator : char): TDateTime;\r\n//function StrToDate(const S: string; FormatSettings : TFormatSettings): TDateTime;\r\nfunction StrToTime(const S: String): TDateTime;\r\nfunction StrToTime(const S: String; separator : char): TDateTime;\r\n// function StrToTime(const S: string; FormatSettings : TFormatSettings): TDateTime;\r\nfunction StrToDateTime(const S: String): TDateTime;\r\n//function StrToDateTime(const s: ShortString; const FormatSettings : TFormatSettings): TDateTime;\r\nfunction FormatDateTime(const FormatStr: string; const DateTime: TDateTime): string;\r\n// function FormatDateTime(const FormatStr: string; DateTime: TDateTime; const FormatSettings: TFormatSettings; Options : TFormatDateTimeOptions = []): string;\r\nfunction TryStrToDate(const S: String; out Value: TDateTime): Boolean;\r\nfunction TryStrToDate(const S: String; out Value: TDateTime; separator : char): Boolean;\r\nfunction TryStrToDate(const S: String; out Value: TDateTime; const useformat : string; separator : char): Boolean;\r\n// function TryStrToDate(const S: string; out Value: TDateTime; const FormatSettings: TFormatSettings): Boolean;\r\nfunction TryStrToTime(const S: String; out Value: TDateTime): Boolean;\r\nfunction TryStrToTime(const S: String; out Value: TDateTime; separator : char): Boolean;\r\nfunction TryStrToDateTime(const S: String; out Value: TDateTime): Boolean;\r\n// function TryStrToTime(const S: string; out Value: TDateTime; const FormatSettings: TFormatSettings): Boolean;\r\n// function TryStrToDateTime(const S: string; out Value: TDateTime; const FormatSettings: TFormatSettings): Boolean;\r\nfunction StrToDateDef(const S: String; const Defvalue : TDateTime): TDateTime;\r\nfunction StrToDateDef(const S: String; const Defvalue : TDateTime; separator : char): TDateTime;\r\nfunction StrToTimeDef(const S: String; const Defvalue : TDateTime): TDateTime;\r\nfunction StrToTimeDef(const S: String; const Defvalue : TDateTime; separator : char): TDateTime;\r\nfunction StrToDateTimeDef(const S: String; const Defvalue : TDateTime): TDateTime;\r\nfunction CurrentYear:Word;\r\nprocedure ReplaceTime(var dati: TDateTime; NewTime : TDateTime);\r\nprocedure ReplaceDate(var DateTime: TDateTime; const NewDate: TDateTime);\r\nFunction FloatToDateTime (Const Value : Extended) : TDateTime;\r\n\r\n{ *****************************************************************************\r\n Currency support\r\n *****************************************************************************}\r\n\r\nVar\r\n CurrencyFormat : Byte = 0;\r\n NegCurrFormat : Byte = 0;\r\n CurrencyDecimals : Byte = 2;\r\n CurrencyString : String = '$';\r\n\r\nFunction FloattoCurr (Const Value : Extended) : Currency;\r\nfunction TryFloatToCurr(const Value: Extended; var AResult: Currency): Boolean;\r\nFunction CurrToStr(Value: Currency): string;\r\n//Function CurrToStr(Value: Currency; Const FormatSettings: TFormatSettings): string;\r\nfunction StrToCurr(const S: string): Currency;\r\n//function StrToCurr(const S: string; Const FormatSettings: TFormatSettings): Currency;\r\nfunction TryStrToCurr(const S: string;Out Value : Currency): Boolean;\r\n//function TryStrToCurr(const S: string;Out Value : Currency; Const FormatSettings: TFormatSettings): Boolean;\r\nfunction StrToCurrDef(const S: string; Default : Currency): Currency;\r\n//function StrToCurrDef(const S: string; Default : Currency; Const FormatSettings: TFormatSettings): Currency;\r\n\r\n{*****************************************************************************\r\n File Paths\r\n*****************************************************************************}\r\ntype\r\n PathStr = String;\r\n TPathStrArray = Array of PathStr;\r\n\r\nfunction ChangeFileExt(const FileName, Extension: PathStr): PathStr;\r\nfunction ExtractFilePath(const FileName: PathStr): PathStr;\r\nfunction ExtractFileDrive(const FileName: PathStr): PathStr;\r\nfunction ExtractFileName(const FileName: PathStr): PathStr;\r\nfunction ExtractFileExt(const FileName: PathStr): PathStr;\r\nfunction ExtractFileDir(Const FileName : PathStr): PathStr;\r\nfunction ExtractRelativepath (Const BaseName,DestName : PathStr): PathStr;\r\nfunction IncludeTrailingPathDelimiter(Const Path : PathStr) : PathStr;\r\nfunction ExcludeTrailingPathDelimiter(Const Path: PathStr): PathStr;\r\nfunction IncludeLeadingPathDelimiter(Const Path : PathStr) : PathStr;\r\nfunction ExcludeLeadingPathDelimiter(Const Path: PathStr): PathStr;\r\nfunction IsPathDelimiter(Const Path: PathStr; Index: Integer): Boolean;\r\nFunction SetDirSeparators (Const FileName : PathStr) : PathStr;\r\nFunction GetDirs (DirName : PathStr) : TPathStrArray;\r\nfunction ConcatPaths(const Paths: array of PathStr): PathStr;\r\n\r\n\r\n{*****************************************************************************\r\n Interfaces\r\n*****************************************************************************}\r\n\r\nconst\r\n GUID_NULL: TGuid = '{00000000-0000-0000-0000-000000000000}';\r\n\r\nfunction Supports(const Instance: IInterface; const AClass: TClass; out Obj): Boolean; overload;\r\nfunction Supports(const Instance: IInterface; const IID: TGuid; out Intf): Boolean; overload;\r\nfunction Supports(const Instance: TObject; const IID: TGuid; out Intf): Boolean; overload;\r\nfunction Supports(const Instance: TObject; const IID: TGuidString; out Intf): Boolean; overload;\r\n\r\nfunction Supports(const Instance: IInterface; const AClass: TClass): Boolean; overload;\r\nfunction Supports(const Instance: IInterface; const IID: TGuid): Boolean; overload;\r\nfunction Supports(const Instance: TObject; const IID: TGuid): Boolean; overload;\r\nfunction Supports(const Instance: TObject; const IID: TGuidString): Boolean; overload;\r\n\r\nfunction Supports(const AClass: TClass; const IID: TGuid): Boolean; overload;\r\nfunction Supports(const AClass: TClass; const IID: TGuidString): Boolean; overload;\r\n\r\nfunction TryStringToGUID(const s: string; out Guid: TGuid): Boolean;\r\nfunction StringToGUID(const S: string): TGuid;\r\nfunction GUIDToString(const guid: TGuid): string;\r\nfunction IsEqualGUID(const guid1, guid2: TGuid): Boolean;\r\nfunction GuidCase(const guid: TGuid; const List: array of TGuid): Integer;\r\nFunction CreateGUID(out GUID : TGUID) : Integer;\r\n\r\nFunction EncodeHTMLEntities (S : String) : String;\r\n\r\n{ ---------------------------------------------------------------------\r\n Type Helpers\r\n ---------------------------------------------------------------------}\r\n\r\nType\r\n TCharArray = Array of char;\r\n\r\n TByteBitIndex = 0..7;\r\n TShortIntBitIndex = 0..7;\r\n TWordBitIndex = 0..15;\r\n TSmallIntBitIndex = 0..15;\r\n TCardinalBitIndex = 0..31;\r\n TIntegerBitIndex = 0..31;\r\n TLongIntBitIndex = TIntegerBitIndex;\r\n TQwordBitIndex = 0..52;\r\n TInt64BitIndex = 0..52;\r\n TNativeIntBitIndex = 0..52;\r\n TNativeUIntBitIndex = 0..52;\r\n\r\nConst\r\n CPUEndian = {$IFNDEF FPC_LITTLE_ENDIAN}TEndian.Big{$ELSE}TEndian.Little{$ENDIF};\r\n\r\nType\r\n\r\n { TGuidHelper }\r\n\r\n TGuidHelper = record helper for TGUID\r\n class function Create(Src : TGUID; BigEndian: Boolean): TGUID; overload; static;\r\n class function Create(const Buf : TJSArrayBuffer; AStartIndex: Cardinal; BigEndian: Boolean): TGUID; overload; static;\r\n class function Create(const Data: array of Byte; AStartIndex: Cardinal; BigEndian: Boolean): TGUID; overload; static;\r\n Class Function Create(const B: TBytes; DataEndian: TEndian = CPUEndian): TGUID; overload; static; inline;\r\n Class Function Create(const B: TBytes; AStartIndex: Cardinal; DataEndian: TEndian = CPUEndian): TGUID; overload; static;\r\n Class Function Create(const S: string): TGUID; overload; static;\r\n Class Function Create(A: Integer; B: SmallInt; C: SmallInt; const D: TBytes): TGUID; overload; static;\r\n// Class Function Create(A: Integer; B: SmallInt; C: SmallInt; D, E, F, G, H, I, J, K: Byte): TGUID; overload; static;\r\n Class Function Create(A: Cardinal; B: Word; C: Word; D, E, F, G, H, I, J, K: Byte): TGUID; overload; static;\r\n Class Function NewGuid: TGUID; static;\r\n Function ToByteArray(DataEndian: TEndian = CPUEndian): TBytes;\r\n Function ToString(SkipBrackets: Boolean = False): string;\r\n end;\r\n\r\n\r\n{$SCOPEDENUMS ON}\r\n TStringSplitOptions = (None, ExcludeEmpty);\r\n{$SCOPEDENUMS OFF}\r\n\r\n { TStringHelper }\r\n\r\n TStringHelper = Type Helper for String\r\n Private\r\n Function GetChar(AIndex : SizeInt) : Char;\r\n Function GetLength : SizeInt;\r\n public\r\n const Empty = '';\r\n // Methods\r\n Class Function Compare(const A: string; const B: string): Integer; overload; static; //inline;\r\n Class Function Compare(const A: string; const B: string; IgnoreCase: Boolean): Integer; overload; static; //inline; //deprecated 'Use same with TCompareOptions';\r\n Class Function Compare(const A: string; const B: string; Options: TCompareOptions): Integer; overload; static; // inline;\r\n Class Function Compare(const A: string; IndexA: SizeInt; const B: string; IndexB: SizeInt; ALen: SizeInt): Integer; overload; static; // inline;\r\n Class Function Compare(const A: string; IndexA: SizeInt; const B: string; IndexB: SizeInt; ALen: SizeInt; IgnoreCase: Boolean): Integer; overload; static; // inline; //deprecated 'Use same with TCompareOptions';\r\n Class Function Compare(const A: string; IndexA: SizeInt; const B: string; IndexB: SizeInt; ALen: SizeInt; Options: TCompareOptions): Integer; overload; static;// inline;\r\n Class Function CompareOrdinal(const A: string; const B: string): Integer; overload; static;\r\n Class Function CompareOrdinal(const A: string; IndexA: SizeInt; const B: string; IndexB: SizeInt; ALen: SizeInt): Integer; overload; static;\r\n Class Function CompareText(const A: string; const B: string): Integer; static; inline;\r\n Class Function Copy(const Str: string): string; inline; static;\r\n Class Function Create(AChar: Char; ACount: SizeInt): string; overload; inline; static;\r\n Class Function Create(const AValue: array of Char): string; overload; static;\r\n Class Function Create(const AValue: array of Char; StartIndex: SizeInt; ALen: SizeInt): string; overload; static;\r\n Class Function EndsText(const ASubText, AText: string): Boolean; static;\r\n Class Function Equals(const a: string; const b: string): Boolean; overload; static;\r\n Class Function Format(const AFormat: string; const args: array of JSValue): string; overload; static;\r\n Class Function IsNullOrEmpty(const AValue: string): Boolean; static;\r\n Class Function IsNullOrWhiteSpace(const AValue: string): Boolean; static;\r\n Class Function Join(const Separator: string; const Values: array of JSValue): string; overload; static;\r\n Class Function Join(const Separator: string; const Values: array of string): string; overload; static;\r\n Class Function Join(const Separator: string; const Values: array of string; StartIndex: SizeInt; ACount: SizeInt): string; overload; static;\r\n Class Function LowerCase(const S: string): string; overload; static; inline;\r\n Class Function Parse(const AValue: Boolean): string; overload; static; inline;\r\n Class Function Parse(const AValue: Extended): string; overload; static;inline;\r\n Class Function Parse(const AValue: NativeInt): string; overload; static; inline;\r\n Class Function Parse(const AValue: Integer): string; overload; static; inline;\r\n Class Function ToBoolean(const S: string): Boolean; overload; static; inline;\r\n Class Function ToDouble(const S: string): Double; overload; static; inline;\r\n Class Function ToExtended(const S: string): Extended; overload; static; inline;\r\n Class Function ToNativeInt(const S: string): NativeInt; overload; static; inline;\r\n Class Function ToInteger(const S: string): Integer; overload; static; inline;\r\n Class Function UpperCase(const S: string): string; overload; static; inline;\r\n Class Function ToCharArray(const S : String) : TCharArray; static;\r\n Function CompareTo(const B: string): Integer;\r\n Function Contains(const AValue: string): Boolean;\r\n Function CountChar(const C: Char): SizeInt;\r\n Function DeQuotedString: string; overload;\r\n Function DeQuotedString(const AQuoteChar: Char): string; overload;\r\n Function EndsWith(const AValue: string): Boolean; overload; inline;\r\n Function EndsWith(const AValue: string; IgnoreCase: Boolean): Boolean; overload;\r\n Function Equals(const AValue: string): Boolean; overload;\r\n Function Format(const args: array of jsValue): string; overload;\r\n Function GetHashCode: Integer;\r\n Function IndexOf(AValue: Char): SizeInt; overload; inline;\r\n Function IndexOf(const AValue: string): SizeInt; overload; inline;\r\n Function IndexOf(AValue: Char; StartIndex: SizeInt): SizeInt; overload;\r\n Function IndexOf(const AValue: string; StartIndex: SizeInt): SizeInt; overload;\r\n Function IndexOf(AValue: Char; StartIndex: SizeInt; ACount: SizeInt): SizeInt; overload;\r\n Function IndexOf(const AValue: string; StartIndex: SizeInt; ACount: SizeInt): SizeInt; overload;\r\n Function IndexOfUnQuoted(const AValue: string; StartQuote, EndQuote: Char; StartIndex: SizeInt = 0): SizeInt; overload;\r\n Function IndexOfAny(const AnyOf: string): SizeInt; overload;\r\n Function IndexOfAny(const AnyOf: array of Char): SizeInt; overload;\r\n Function IndexOfAny(const AnyOf: String; StartIndex: SizeInt): SizeInt; overload;\r\n Function IndexOfAny(const AnyOf: array of Char; StartIndex: SizeInt): SizeInt; overload;\r\n Function IndexOfAny(const AnyOf: String; StartIndex: SizeInt; ACount: SizeInt): SizeInt; overload;\r\n Function IndexOfAny(const AnyOf: array of Char; StartIndex: SizeInt; ACount: SizeInt): SizeInt; overload;\r\n Function IndexOfAny(const AnyOf: array of String): SizeInt; overload;\r\n Function IndexOfAny(const AnyOf: array of String; StartIndex: SizeInt): SizeInt; overload;\r\n Function IndexOfAny(const AnyOf: array of String; StartIndex: SizeInt; ACount: SizeInt): SizeInt; overload;\r\n Function IndexOfAny(const AnyOf: array of String; StartIndex: SizeInt; ACount: SizeInt; Out AMatch : SizeInt): SizeInt; overload;\r\n Function IndexOfAnyUnquoted(const AnyOf: array of Char; StartQuote, EndQuote: Char): SizeInt; overload;\r\n Function IndexOfAnyUnquoted(const AnyOf: array of Char; StartQuote, EndQuote: Char; StartIndex: SizeInt): SizeInt; overload;\r\n Function IndexOfAnyUnquoted(const AnyOf: array of Char; StartQuote, EndQuote: Char; StartIndex: SizeInt; ACount: SizeInt): SizeInt; overload;\r\n function IndexOfAnyUnquoted(const AnyOf: array of string; StartQuote, EndQuote: Char; StartIndex: SizeInt; Out Matched: SizeInt): SizeInt; overload;\r\n Function Insert(StartIndex: SizeInt; const AValue: string): string;\r\n Function IsDelimiter(const Delimiters: string; Index: SizeInt): Boolean;\r\n Function IsEmpty: Boolean;\r\n Function LastDelimiter(const Delims: string): SizeInt;\r\n Function LastIndexOf(AValue: Char): SizeInt; overload;\r\n Function LastIndexOf(const AValue: string): SizeInt; overload;\r\n Function LastIndexOf(AValue: Char; AStartIndex: SizeInt): SizeInt; overload;\r\n Function LastIndexOf(const AValue: string; AStartIndex: SizeInt): SizeInt; overload;\r\n Function LastIndexOf(AValue: Char; AStartIndex: SizeInt; ACount: SizeInt): SizeInt; overload;\r\n Function LastIndexOf(const AValue: string; AStartIndex: SizeInt; ACount: SizeInt): SizeInt; overload;\r\n Function LastIndexOfAny(const AnyOf: array of Char): SizeInt; overload;\r\n Function LastIndexOfAny(const AnyOf: array of Char; AStartIndex: SizeInt): SizeInt; overload;\r\n Function LastIndexOfAny(const AnyOf: array of Char; AStartIndex: SizeInt; ACount: SizeInt): SizeInt; overload;\r\n Function PadLeft(ATotalWidth: SizeInt): string; overload; inline;\r\n Function PadLeft(ATotalWidth: SizeInt; PaddingChar: Char): string; overload; inline;\r\n Function PadRight(ATotalWidth: SizeInt): string; overload; inline;\r\n Function PadRight(ATotalWidth: SizeInt; PaddingChar: Char): string; overload; inline;\r\n Function QuotedString: string; overload;\r\n Function QuotedString(const AQuoteChar: Char): string; overload;\r\n Function Remove(StartIndex: SizeInt): string; overload; inline;\r\n Function Remove(StartIndex: SizeInt; ACount: SizeInt): string; overload; inline;\r\n Function Replace(OldChar: Char; NewChar: Char): string; overload;\r\n Function Replace(OldChar: Char; NewChar: Char; ReplaceFlags: TReplaceFlags): string; overload;\r\n Function Replace(const OldValue: string; const NewValue: string): string; overload;\r\n Function Replace(const OldValue: string; const NewValue: string; ReplaceFlags: TReplaceFlags): string; overload;\r\n Function Split(const Separators: String): TStringArray; overload;\r\n Function Split(const Separators: array of Char): TStringArray; overload;\r\n Function Split(const Separators: string; ACount: SizeInt): TStringArray; overload;\r\n Function Split(const Separators: array of Char; ACount: SizeInt): TStringArray; overload;\r\n Function Split(const Separators: string; Options: TStringSplitOptions): TStringArray; overload;\r\n Function Split(const Separators: array of Char; Options: TStringSplitOptions): TStringArray; overload;\r\n Function Split(const Separators: string; ACount: SizeInt; Options: TStringSplitOptions): TStringArray; overload;\r\n Function Split(const Separators: array of Char; ACount: SizeInt; Options: TStringSplitOptions): TStringArray; overload;\r\n Function Split(const Separators: array of string): TStringArray; overload;\r\n Function Split(const Separators: array of string; ACount: SizeInt): TStringArray; overload;\r\n Function Split(const Separators: array of string; Options: TStringSplitOptions): TStringArray; overload;\r\n Function Split(const Separators: array of string; ACount: SizeInt; Options: TStringSplitOptions): TStringArray; overload;\r\n Function Split(const Separators: String; AQuote: Char): TStringArray; overload;\r\n Function Split(const Separators: array of Char; AQuote: Char): TStringArray; overload;\r\n Function Split(const Separators: String; AQuoteStart, AQuoteEnd: Char): TStringArray; overload;\r\n Function Split(const Separators: array of Char; AQuoteStart, AQuoteEnd: Char): TStringArray; overload;\r\n Function Split(const Separators: string; AQuoteStart, AQuoteEnd: Char; Options: TStringSplitOptions): TStringArray; overload;\r\n Function Split(const Separators: array of Char; AQuoteStart, AQuoteEnd: Char; Options: TStringSplitOptions): TStringArray; overload;\r\n Function Split(const Separators: string; AQuoteStart, AQuoteEnd: Char; ACount: SizeInt): TStringArray; overload;\r\n Function Split(const Separators: array of Char; AQuoteStart, AQuoteEnd: Char; ACount: SizeInt): TStringArray; overload;\r\n Function Split(const Separators: string; AQuoteStart, AQuoteEnd: Char; ACount: SizeInt; Options: TStringSplitOptions): TStringArray; overload;\r\n Function Split(const Separators: array of Char; AQuoteStart, AQuoteEnd: Char; ACount: SizeInt; Options: TStringSplitOptions): TStringArray; overload;\r\n Function Split(const Separators: array of string; AQuote: Char): TStringArray; overload;\r\n Function Split(const Separators: array of string; AQuoteStart, AQuoteEnd: Char): TStringArray; overload;\r\n Function Split(const Separators: array of string; AQuoteStart, AQuoteEnd: Char; Options: TStringSplitOptions): TStringArray; overload;\r\n Function Split(const Separators: array of string; AQuoteStart, AQuoteEnd: Char; ACount: SizeInt): TStringArray; overload;\r\n Function Split(const Separators: array of string; AQuoteStart, AQuoteEnd: Char; ACount: SizeInt; Options: TStringSplitOptions): TStringArray; overload;\r\n Function StartsWith(const AValue: string): Boolean; overload; inline;\r\n Function StartsWith(const AValue: string; IgnoreCase: Boolean): Boolean; overload;\r\n Function Substring(AStartIndex: SizeInt): string; overload;\r\n Function Substring(AStartIndex: SizeInt; ALen: SizeInt): string; overload;\r\n Function ToBoolean: Boolean; overload; inline;\r\n Function ToInteger: Integer; overload; inline;\r\n Function ToNativeInt: NativeInt; overload; inline;\r\n Function ToDouble: Double; overload; inline;\r\n Function ToExtended: Extended; overload; inline;\r\n Function ToCharArray: TCharArray; overload;\r\n Function ToCharArray(AStartIndex: SizeInt; ALen: SizeInt): TCharArray; overload;\r\n Function ToLower: string; overload; inline;\r\n Function ToLowerInvariant: string;\r\n Function ToUpper: string; overload; inline;\r\n Function ToUpperInvariant: string; inline;\r\n Function Trim: string; overload;\r\n Function TrimLeft: string; overload;\r\n Function TrimRight: string; overload;\r\n Function Trim(const ATrimChars: array of Char): string; overload;\r\n Function TrimLeft(const ATrimChars: array of Char): string; overload;\r\n Function TrimRight(const ATrimChars: array of Char): string; overload;\r\n Function TrimEnd(const ATrimChars: array of Char): string; deprecated 'Use TrimRight';\r\n Function TrimStart(const ATrimChars: array of Char): string; deprecated 'Use TrimLeft';\r\n property Chars[AIndex: SizeInt]: Char read GetChar;\r\n property Length: SizeInt read GetLength;\r\n end;\r\n\r\n TDoubleHelper = Type Helper for Double\r\n private\r\n Function GetB(AIndex: Cardinal): Byte;\r\n Function GetW(AIndex: Cardinal): Word;\r\n Function GetE: NativeUInt; inline;\r\n Function GetF: NativeUInt; inline;\r\n Function GetS: Boolean; inline;\r\n Procedure SetS(aValue : Boolean); inline;\r\n procedure SetB(AIndex: Cardinal; const AValue: Byte);\r\n procedure SetW(AIndex: Cardinal; const AValue: Word);\r\n public\r\n const\r\n {$push}\r\n {$R-}\r\n {$Q-}\r\n Epsilon : Double = 4.9406564584124654418e-324;\r\n MaxValue : Double = 1.7976931348623157081e+308;\r\n MinValue : Double = -1.7976931348623157081e+308;\r\n // PositiveInfinity : Double = 1.0/0.0;\r\n // NegativeInfinity : Double = -1.0/0.0;\r\n // NaN : Double = 0.0/0.0;\r\n {$POP}\r\n Class Function IsInfinity(const AValue: Double): Boolean; overload; inline; static;\r\n Class Function IsNan(const AValue: Double): Boolean; overload; inline; static;\r\n Class Function IsNegativeInfinity(const AValue: Double): Boolean; overload; inline; static;\r\n Class Function IsPositiveInfinity(const AValue: Double): Boolean; overload; inline; static;\r\n Class Function Parse(const AString: string): Double; overload; inline; static;\r\n Class Function ToString(const AValue: Double): string; overload; inline; static;\r\n Class Function ToString(const AValue: Double; const AFormat: TFloatFormat; const APrecision, ADigits: Integer): string; overload; inline; static;\r\n Class Function TryParse(const AString: string; out AValue: Double): Boolean; overload; inline; static;\r\n\r\n Procedure BuildUp(const ASignFlag: Boolean; const AMantissa: NativeUInt; const AExponent: Integer);\r\n Function Exponent: Integer;\r\n Function Fraction: Extended;\r\n Function IsInfinity: Boolean; overload; inline;\r\n Function IsNan: Boolean; overload; inline;\r\n Function IsNegativeInfinity: Boolean; overload; inline;\r\n Function IsPositiveInfinity: Boolean; overload; inline;\r\n Function Mantissa: NativeUInt;\r\n\r\n Function ToString(const AFormat: TFloatFormat; const APrecision, ADigits: Integer): string; overload; inline;\r\n Function ToString: string; overload; inline;\r\n\r\n property Bytes[AIndex: Cardinal]: Byte read GetB write SetB; // 0..7\r\n property Words[AIndex: Cardinal]: Word read GetW write SetW; // 0..3\r\n property Sign: Boolean read GetS Write SetS;\r\n property Exp: NativeUInt read GetE;\r\n property Frac: NativeUInt read GetF;\r\n end;\r\n\r\n TByteHelper = Type Helper for Byte\r\n public\r\n const\r\n MaxValue = 255;\r\n MinValue = 0;\r\n public\r\n Class Function Parse(const AString: string): Byte; inline; static;\r\n Class Function Size: Integer; inline; static;\r\n Class Function ToString(const AValue: Byte): string; overload; inline; static;\r\n Class Function TryParse(const AString: string; out AValue: Byte): Boolean; inline; static;\r\n Public\r\n Function ToBoolean: Boolean; inline;\r\n Function ToDouble: Double; inline;\r\n Function ToExtended: Extended; inline;\r\n Function ToBinString:string; inline;\r\n Function ToHexString(const AMinDigits: Integer): string; overload; inline;\r\n Function ToHexString: string; overload; inline;\r\n Function ToString: string; overload; inline;\r\n Function SetBit(const Index: TByteBitIndex) : Byte; inline;\r\n Function ClearBit(const Index: TByteBitIndex) : Byte; inline;\r\n Function ToggleBit(const Index: TByteBitIndex) : Byte; inline;\r\n Function TestBit(const Index:TByteBitIndex):Boolean; inline;\r\n end;\r\n\r\n TShortIntHelper = Type Helper for ShortInt\r\n public\r\n const\r\n MaxValue = 127;\r\n MinValue = -128;\r\n public\r\n Class Function Parse(const AString: string): ShortInt; inline; static;\r\n Class Function Size: Integer; inline; static;\r\n Class Function ToString(const AValue: ShortInt): string; overload; inline; static;\r\n Class Function TryParse(const AString: string; out AValue: ShortInt): Boolean; inline; static;\r\n public\r\n Function ToBoolean: Boolean; inline;\r\n Function ToDouble: Double; inline;\r\n Function ToExtended: Extended; inline;\r\n Function ToBinString:string; inline;\r\n Function ToHexString(const AMinDigits: Integer): string; overload; inline;\r\n Function ToHexString: string; overload; inline;\r\n Function ToString: string; overload; inline;\r\n Function SetBit(const Index: TShortIntBitIndex): Shortint; inline;\r\n Function ClearBit(const Index: TShortIntBitIndex): Shortint; inline;\r\n Function ToggleBit(const Index: TShortIntBitIndex): Shortint; inline;\r\n Function TestBit(const Index:TShortIntBitIndex):Boolean; inline;\r\n end;\r\n\r\n TSmallIntHelper = Type Helper for SmallInt\r\n public\r\n const\r\n MaxValue = 32767;\r\n MinValue = -32768;\r\n public\r\n Class Function Parse(const AString: string): SmallInt; inline; static;\r\n Class Function Size: Integer; inline; static;\r\n Class Function ToString(const AValue: SmallInt): string; overload; inline; static;\r\n Class Function TryParse(const AString: string; out AValue: SmallInt): Boolean; inline; static;\r\n public\r\n Function ToString: string; overload; inline;\r\n Function ToBoolean: Boolean; inline;\r\n Function ToBinString:string; inline;\r\n Function ToHexString: string; overload; inline;\r\n Function ToHexString(const AMinDigits: Integer): string; overload; inline;\r\n Function ToDouble: Double; inline;\r\n Function ToExtended: Extended; inline;\r\n Function SetBit(const Index: TSmallIntBitIndex) : Smallint; inline;\r\n Function ClearBit(const Index: TSmallIntBitIndex) : Smallint; inline;\r\n Function ToggleBit(const Index: TSmallIntBitIndex) : Smallint; inline;\r\n Function TestBit(const Index:TSmallIntBitIndex):Boolean; inline;\r\n end;\r\n\r\n TWordHelper = Type Helper for Word\r\n public\r\n const\r\n MaxValue = 65535;\r\n MinValue = 0;\r\n Public\r\n Class Function Parse(const AString: string): Word; inline; static;\r\n Class Function Size: Integer; inline; static;\r\n Class Function ToString(const AValue: Word): string; overload; inline; static;\r\n Class Function TryParse(const AString: string; out AValue: Word): Boolean; inline; static;\r\n Public\r\n Function ToBoolean: Boolean; inline;\r\n Function ToDouble: Double; inline;\r\n Function ToExtended: Extended; inline;\r\n Function ToBinString:string; inline;\r\n Function ToHexString(const AMinDigits: Integer): string; overload; inline;\r\n Function ToHexString: string; overload; inline;\r\n Function ToString: string; overload; inline;\r\n Function SetBit(const Index: TWordBitIndex) : Word; inline;\r\n Function ClearBit(const Index: TWordBitIndex) : Word; inline;\r\n Function ToggleBit(const Index: TWordBitIndex) : Word; inline;\r\n Function TestBit(const Index:TWordBitIndex):Boolean; inline;\r\n end;\r\n\r\n TCardinalHelper = Type Helper for Cardinal { for LongWord Type too }\r\n public\r\n const\r\n MaxValue = 4294967295;\r\n MinValue = 0;\r\n Public\r\n Class Function Parse(const AString: string): Cardinal; inline; static;\r\n Class Function Size: Integer; inline; static;\r\n Class Function ToString(const AValue: Cardinal): string; overload; inline; static;\r\n Class Function TryParse(const AString: string; out AValue: Cardinal): Boolean; inline; static;\r\n Public\r\n Function ToBoolean: Boolean; inline;\r\n Function ToDouble: Double; inline;\r\n Function ToExtended: Extended; inline;\r\n Function ToBinString:string; inline;\r\n Function ToHexString(const AMinDigits: Integer): string; overload; inline;\r\n Function ToHexString: string; overload; inline;\r\n Function ToString: string; overload; inline;\r\n Function SetBit(const Index: TCardinalBitIndex) : Cardinal; inline;\r\n Function ClearBit(const Index: TCardinalBitIndex) : Cardinal; inline;\r\n Function ToggleBit(const Index: TCardinalBitIndex) : Cardinal; inline;\r\n Function TestBit(const Index:TCardinalBitIndex):Boolean; inline;\r\n end;\r\n\r\n TIntegerHelper = Type Helper for Integer { for LongInt Type too }\r\n public\r\n const\r\n MaxValue = 2147483647;\r\n MinValue = -2147483648;\r\n Public\r\n Class Function Size: Integer; inline; static;\r\n Class Function ToString(const AValue: Integer): string; overload; inline; static;\r\n Class Function Parse(const AString: string): Integer; inline; static;\r\n Class Function TryParse(const AString: string; out AValue: Integer): Boolean; inline; static;\r\n Public\r\n Function ToBoolean: Boolean; inline;\r\n Function ToDouble: Double; inline;\r\n Function ToExtended: Extended; inline;\r\n Function ToBinString:string; inline;\r\n Function ToHexString(const AMinDigits: Integer): string; overload; inline;\r\n Function ToHexString: string; overload; inline;\r\n Function ToString: string; overload; inline;\r\n Function SetBit(const Index: TIntegerBitIndex) : Integer; inline;\r\n Function ClearBit(const Index: TIntegerBitIndex) : Integer; inline;\r\n Function ToggleBit(const Index: TIntegerBitIndex) : Integer; inline;\r\n Function TestBit(const Index:TIntegerBitIndex):Boolean; inline;\r\n end;\r\n\r\n TNativeIntHelper = Type Helper for NativeInt\r\n public\r\n const\r\n MaxValue = High(NativeInt);\r\n MinValue = Low(NativeInt);\r\n Public\r\n Class Function Parse(const AString: string): NativeInt; inline; static;\r\n Class Function Size: Integer; inline; static;\r\n Class Function ToString(const AValue: NativeInt): string; overload; inline; static;\r\n Class Function TryParse(const AString: string; out AValue: NativeInt): Boolean; inline; static;\r\n Public\r\n Function ToBoolean: Boolean; inline;\r\n Function ToDouble: Double; inline;\r\n Function ToExtended: Extended; inline;\r\n Function ToBinString:string; inline;\r\n Function ToHexString(const AMinDigits: Integer): string; overload; inline;\r\n Function ToHexString: string; overload; inline;\r\n Function ToString: string; overload; inline;\r\n Function SetBit(const Index: TNativeIntBitIndex) : NativeInt; inline;\r\n Function ClearBit(const Index: TNativeIntBitIndex) : NativeInt; inline;\r\n Function ToggleBit(const Index: TNativeIntBitIndex) : NativeInt; inline;\r\n Function TestBit(const Index:TNativeIntBitIndex):Boolean; inline;\r\n end;\r\n\r\n TNativeUIntHelper = Type Helper for NativeUInt\r\n public\r\n const\r\n MaxValue = High(NativeUInt);\r\n MinValue = 0;\r\n Public\r\n Class Function Parse(const AString: string): NativeUInt; inline; static;\r\n Class Function Size: Integer; inline; static;\r\n Class Function ToString(const AValue: NativeUInt): string; overload; inline; static;\r\n Class Function TryParse(const AString: string; out AValue: NativeUInt): Boolean; inline; static;\r\n Public\r\n Function ToBoolean: Boolean; inline;\r\n Function ToDouble: Double; inline;\r\n Function ToExtended: Extended; inline;\r\n Function ToBinString:string; inline;\r\n Function ToHexString(const AMinDigits: Integer): string; overload; inline;\r\n Function ToHexString: string; overload; inline;\r\n Function ToSingle: Single; inline;\r\n Function ToString: string; overload; inline;\r\n Function SetBit(const Index: TNativeUIntBitIndex) : NativeUint; inline;\r\n Function ClearBit(const Index: TNativeUIntBitIndex): NativeUint; inline;\r\n Function ToggleBit(const Index: TNativeUIntBitIndex) : NativeUint; inline;\r\n Function TestBit(const Index:TNativeUIntBitIndex) :Boolean; inline;\r\n end;\r\n\r\n TBooleanHelper = Type Helper for Boolean\r\n public\r\n Class Function Parse(const S: string): Boolean; inline; static;\r\n Class Function Size: Integer; inline; static;\r\n Class Function ToString(const AValue: Boolean; UseBoolStrs: Boolean = false): string; overload; inline; static;\r\n Class Function TryToParse(const S: string; out AValue: Boolean): Boolean; inline; static;\r\n Public\r\n Function ToInteger: Integer; inline;\r\n Function ToString(UseBoolStrs: Boolean = False): string; overload; inline;\r\n end;\r\n\r\n TByteBoolHelper = Type Helper for ByteBool\r\n public\r\n Class Function Parse(const S: string): Boolean; inline; static;\r\n Class Function Size: Integer; inline; static;\r\n Class Function ToString(const AValue: Boolean; UseBoolStrs : Boolean = False): string; overload; inline; static;\r\n Class Function TryToParse(const S: string; out AValue: Boolean): Boolean; inline; static;\r\n Public\r\n Function ToInteger: Integer; inline;\r\n Function ToString(UseBoolStrs: Boolean = False): string; overload; inline;\r\n end;\r\n\r\n TWordBoolHelper = Type Helper for WordBool\r\n public\r\n Class Function Parse(const S: string): Boolean; inline; static;\r\n Class Function Size: Integer; inline; static;\r\n Class Function ToString(const AValue: Boolean; UseBoolStrs: Boolean = False): string; overload; inline; static;\r\n Class Function TryToParse(const S: string; out AValue: Boolean): Boolean; inline; static;\r\n Public\r\n Function ToInteger: Integer; inline;\r\n Function ToString(UseBoolStrs: boolean = False): string; overload; inline;\r\n end;\r\n\r\n TLongBoolHelper = Type Helper for LongBool\r\n public\r\n Class Function Parse(const S: string): Boolean; inline; static;\r\n Class Function Size: Integer; inline; static;\r\n Class Function ToString(const AValue: Boolean; UseBoolStrs: Boolean= False): string; overload; inline; static;\r\n Class Function TryToParse(const S: string; out AValue: Boolean): Boolean; inline; static;\r\n public\r\n Function ToInteger: Integer; inline;\r\n Function ToString(UseBoolStrs: Boolean = False): string; overload; inline;\r\n end;\r\n\r\n\r\nimplementation\r\n\r\n{ ---------------------------------------------------------------------\r\n Exception handling\r\n ---------------------------------------------------------------------}\r\nResourcestring\r\n SAbortError = 'Operation aborted';\r\n SApplicationException = 'Application raised an exception: ';\r\n SErrUnknownExceptionType = 'Caught unknown exception type : ';\r\n\r\nprocedure DoShowException(S : String);\r\n\r\nbegin\r\n if Assigned(OnShowException) then\r\n OnShowException(S)\r\n else\r\n begin\r\n {$IFDEF BROWSER}\r\n asm\r\n window.alert(S);\r\n end;\r\n {$ENDIF}\r\n {$IFDEF NODEJS}\r\n Writeln(S);\r\n {$ENDIF}\r\n end;\r\nend;\r\n\r\nprocedure ShowException(ExceptObject: TObject; ExceptAddr: Pointer = Nil);\r\n\r\nVar\r\n S : String;\r\n\r\nbegin\r\n S:=SApplicationException+ExceptObject.ClassName;\r\n if ExceptObject is Exception then\r\n S:=S+' : '+Exception(ExceptObject).Message;\r\n DoShowException(S);\r\n if ExceptAddr=nil then;\r\nend;\r\n\r\nType\r\n TRTLExceptionHandler = procedure (aError : JSValue);\r\n\r\nVar\r\n rtlExceptionHandler : TRTLExceptionHandler; External name 'rtl.onUncaughtException';\r\n rtlShowUncaughtExceptions : Boolean; External name 'rtl.showUncaughtExceptions';\r\n OnPascalException : TUncaughtPascalExceptionHandler;\r\n OnJSException : TUncaughtJSExceptionHandler;\r\n\r\nProcedure RTLExceptionHook(aError : JSValue);\r\n\r\nVar\r\n S : String;\r\n\r\nbegin\r\n if isClassInstance(aError) then\r\n begin\r\n if Assigned(OnPascalException) then\r\n OnPascalException(TObject(aError))\r\n else\r\n ShowException(TObject(aError),Nil);\r\n end\r\n else if isObject(aError) then\r\n begin\r\n if Assigned(OnJSException) then\r\n OnJSException(TJSObject(aError))\r\n else\r\n begin\r\n if TJSObject(aError).hasOwnProperty('message') then\r\n S:=SErrUnknownExceptionType+String(TJSObject(aError).Properties['message'])\r\n else\r\n S:=SErrUnknownExceptionType+TJSObject(aError).toString;\r\n DoShowException(S);\r\n end\r\n end\r\n else\r\n begin\r\n S:=SErrUnknownExceptionType+String(aError);\r\n DoShowException(S);\r\n end;\r\nend;\r\n\r\n\r\n\r\nFunction SetOnUnCaughtExceptionHandler(aValue : TUncaughtPascalExceptionHandler) : TUncaughtPascalExceptionHandler;\r\n\r\nbegin\r\n Result:=OnPascalException;\r\n OnPascalException:=aValue;\r\n HookUncaughtExceptions;\r\nend;\r\n\r\nFunction SetOnUnCaughtExceptionHandler(aValue : TUncaughtJSExceptionHandler) : TUncaughtJSExceptionHandler;\r\n\r\nbegin\r\n Result:=OnJSException;\r\n OnJSException:=aValue;\r\n HookUncaughtExceptions;\r\nend;\r\n\r\nProcedure HookUncaughtExceptions;\r\n\r\nbegin\r\n rtlExceptionHandler:=@RTLExceptionHook;\r\n rtlShowUncaughtExceptions:=True;\r\nend;\r\n\r\nprocedure Abort;\r\nbegin\r\n Raise EAbort.Create(SAbortError);\r\nend;\r\n\r\n{$IFNDEF MAKESTUB}\r\nType\r\n TCharSet = Set of Char;\r\n\r\nFunction CharInSet(Ch: Char;Const CSet : TCharSet) : Boolean; overload;\r\n\r\nbegin\r\n Result:=Ch in CSet;\r\nend;\r\n{$ENDIF}\r\n\r\nfunction CharInSet(Ch: Char; const CSet: array of char): Boolean; overload;\r\n\r\nVar\r\n I : integer;\r\n\r\nbegin\r\n Result:=False;\r\n I:=Length(CSet)-1;\r\n While (Not Result) and (I>=0) do\r\n begin\r\n Result:=(Ch=CSet[i]);\r\n Dec(I);\r\n end;\r\nend;\r\n\r\nfunction LeftStr(const S: string; Count: Integer): String; assembler;\r\nasm\r\n return (Count>0) ? S.substr(0,Count) : \"\";\r\nend;\r\n\r\nfunction RightStr(const S: string; Count: Integer): String; assembler;\r\nasm\r\n var l = S.length;\r\n return (Count<1) ? \"\" : ( Count>=l ? S : S.substr(l-Count));\r\nend;\r\n\r\nfunction Trim(const S: String): String; assembler;\r\nasm\r\n return S.replace(/^[\\s\\uFEFF\\xA0\\x00-\\x1f]+/,'').replace(/[\\s\\uFEFF\\xA0\\x00-\\x1f]+$/,'');\r\nend;\r\n\r\nfunction TrimLeft(const S: String): String; assembler;\r\nasm\r\n return S.replace(/^[\\s\\uFEFF\\xA0\\x00-\\x1f]+/,'');\r\nend;\r\n\r\nfunction TrimRight(const S: String): String; assembler;\r\nasm\r\n return S.replace(/[\\s\\uFEFF\\xA0\\x00-\\x1f]+$/,'');\r\nend;\r\n\r\nfunction IntToStr(const Value: Integer): string;\r\nbegin\r\n Result:=str(Value);\r\nend;\r\n\r\nfunction UIntToStr(const Value: Cardinal): string;\r\nbegin\r\n Result:=str(Value);\r\nend;\r\n\r\nfunction FloatToDecimal(Value: double; Precision, Decimals: integer): TFloatRec;\r\n\r\nConst\r\n Rounds = '123456789:';\r\n\r\nvar\r\n Buffer: String; //Though str func returns only 25 chars, this might change in the future\r\n InfNan: string;\r\n OutPos,Error, N, L, C: Integer;\r\n GotNonZeroBeforeDot, BeforeDot : boolean;\r\n\r\nbegin\r\n Result.Negative:=False;\r\n Result.Exponent:=0;\r\n For C:=0 to FloatRecDigits do\r\n Result.Digits[C]:='0';\r\n if Value=0 then\r\n exit;\r\n asm\r\n Buffer=Value.toPrecision(21); // Double precision\r\n end;\r\n // Writeln('Buffer :',Buffer);\r\n N := 1;\r\n L := Length(Buffer);\r\n while Buffer[N]=' ' do\r\n Inc(N);\r\n Result.Negative := (Buffer[N] = '-');\r\n if Result.Negative then\r\n Inc(N)\r\n else if (Buffer[N] = '+') then\r\n inc(N);\r\n { special cases for Inf and Nan }\r\n if (L>=N+2) then\r\n begin\r\n InfNan:=copy(Buffer,N,3);\r\n if (InfNan='Inf') then\r\n begin\r\n Result.Digits[0]:=#0;\r\n Result.Exponent:=32767;\r\n exit\r\n end;\r\n if (InfNan='Nan') then\r\n begin\r\n Result.Digits[0]:=#0;\r\n Result.Exponent:=-32768;\r\n exit\r\n end;\r\n end;\r\n //Start := N; //Start of digits\r\n Outpos:=0;\r\n Result.Exponent := 0; BeforeDot := true;\r\n GotNonZeroBeforeDot := false;\r\n while (L>=N) and (Buffer[N]<>'E') do\r\n begin\r\n // Writeln('Examining : ',Buffer[N],'( output pos: ',outPos,')');\r\n if Buffer[N]='.' then\r\n BeforeDot := false\r\n else\r\n begin\r\n if BeforeDot then\r\n begin // Currently this is always 1 char\r\n Inc(Result.Exponent);\r\n Result.Digits[Outpos] := Buffer[N];\r\n if Buffer[N] <> '0' then\r\n GotNonZeroBeforeDot := true;\r\n end\r\n else\r\n Result.Digits[Outpos] := Buffer[N];\r\n Inc(outpos);\r\n end;\r\n Inc(N);\r\n end;\r\n Inc(N); // Pass through 'E'\r\n if N<=L then\r\n begin\r\n Val(Copy(Buffer, N, L-N+1), C, Error); // Get exponent after 'E'\r\n Inc(Result.Exponent, C);\r\n end;\r\n // Calculate number of digits we have from str\r\n N:=OutPos;\r\n // Writeln('Number of digits: ',N,' requested precision : ',Precision);\r\n L:=Length(Result.Digits);\r\n While N= L Then\r\n N := L-1;\r\n // Writeln('Rounding on digit : ',N);\r\n if N = 0 Then\r\n begin\r\n if Result.Digits[0] >= '5' Then\r\n begin\r\n Result.Digits[0] := '1';\r\n Result.Digits[1] := #0;\r\n Inc(Result.Exponent);\r\n end\r\n Else\r\n Result.Digits[0] := #0;\r\n end //N=0\r\n Else if N > 0 Then\r\n begin\r\n if Result.Digits[N] >= '5' Then\r\n begin\r\n Repeat\r\n Result.Digits[N] := #0;\r\n Dec(N);\r\n // Writeln(N,': ',Result.Digits[N],', Rounding to : ',Rounds[StrToInt(Result.Digits[N])]);\r\n Result.Digits[N]:=Rounds[StrToInt(Result.Digits[N])+1];\r\n Until (N = 0) Or (Result.Digits[N] < ':');\r\n If Result.Digits[0] = ':' Then\r\n begin\r\n Result.Digits[0] := '1';\r\n Inc(Result.Exponent);\r\n end;\r\n end\r\n Else\r\n begin\r\n Result.Digits[N] := '0';\r\n While (N > -1) And (Result.Digits[N] = '0') Do\r\n begin\r\n Result.Digits[N] := #0;\r\n Dec(N);\r\n end;\r\n end;\r\n end //N>0\r\n Else\r\n Result.Digits[0] := #0;\r\n if (Result.Digits[0] = #0) and\r\n not GotNonZeroBeforeDot then\r\n begin\r\n Result.Exponent := 0;\r\n Result.Negative := False;\r\n end;\r\nend;\r\n\r\n\r\nfunction FloatToStr(Value: Double): String;\r\nbegin\r\n Result:=FloatToStrF(Value,ffGeneral,15,0);\r\nend;\r\n\r\nfunction TryStrToFloat(const S: String; out res: Extended): Boolean;\r\nbegin\r\n Result:=TryStrToFloat(S,double(res));\r\nend;\r\n\r\nfunction TryStrToFloat(const S: String; out res: Double): Boolean;\r\n\r\nVar\r\n J : JSValue;\r\n N : String;\r\n\r\nbegin\r\n N:=S;\r\n // Delocalize\r\n if (ThousandSeparator <>'') then\r\n N:=StringReplace(N,ThousandSeparator,'',[rfReplaceAll]);\r\n if (DecimalSeparator<>'.') then\r\n N:=StringReplace(N,DecimalSeparator,'.',[]);\r\n J:=parseFloat(N);\r\n Result:=Not jsIsNaN(J);\r\n if Result then\r\n Res:=Double(J);\r\nend;\r\n\r\nfunction StrToFloatDef(const S: String; const aDef: Double): Double;\r\nbegin\r\n if not TryStrToFloat(S,Result) then\r\n Result:=aDef;\r\nend;\r\n\r\nfunction StrToFloat(const S: String): Double;\r\nbegin\r\n if not TryStrToFloat(S,Result) then\r\n Raise EConvertError.CreateFmt(SErrInvalidFloat,[S]);\r\nend;\r\n\r\nfunction FormatFloat(Fmt: String; aValue: Double): String;\r\n\r\nType\r\n TPosArray = Array of Integer;\r\n\r\nconst\r\n MaxPrecision = 18; // Extended precision\r\n\r\nvar\r\n // Input in usable format\r\n E : Extended; // Value as extended.\r\n FV: TFloatRec; // Value as floatrec.\r\n Section : String; // Format can contain 3 sections, semicolon separated: Pos;Neg;Zero. This is the one to use.\r\n SectionLength : Integer; // Length of section.\r\n // Calculated based on section. Static during output\r\n ThousandSep: Boolean; // Thousands separator detected in format ?\r\n IsScientific: Boolean; // Use Scientific notation ? (E detected in format)\r\n DecimalPos: Integer; // Position of decimal point in pattern.\r\n FirstDigit: Integer; // First actual digit in input (# or 0), relative to decimal point\r\n LastDigit: Integer; // Last required (0) digit, relative to decimal point\r\n RequestedDigits: Integer; // Number of requested digits, # and 0 alike\r\n ExpSize : Integer; // Number of digits in exponent\r\n Available: Integer; // Available digits in FV.\r\n // These change during output loop\r\n Current: Integer; // Current digit in available digits\r\n PadZeroes: Integer; // Difference in requested digits before comma and exponent, needs to be padded with zeroes.\r\n DistToDecimal: Integer; // Place of current digit, relative to decimal point taking in account PadZeroes!\r\n\r\n Procedure InitVars;\r\n\r\n begin\r\n E:=aValue;\r\n Section:='';\r\n SectionLength:=0;\r\n ThousandSep:=false;\r\n IsScientific:=false;\r\n DecimalPos:=0;\r\n FirstDigit:=MaxInt;\r\n LastDigit:=0;\r\n RequestedDigits:=0;\r\n ExpSize:=0;\r\n Available:=-1;\r\n end;\r\n\r\n procedure ToResult(const AChar: Char);\r\n begin\r\n Result:=Result+AChar;\r\n end;\r\n\r\n procedure AddToResult(const AStr: String);\r\n\r\n begin\r\n Result:=Result+AStr;\r\n end;\r\n\r\n procedure WriteDigit(ADigit: Char);\r\n\r\n // Write a digit to result, prepend with decimalseparator or append with 1000 separator\r\n\r\n begin\r\n if ADigit=#0 then exit;\r\n // Writeln('WriteDigit: ',ADigit,', DistToDecimal: ',DistToDecimal);\r\n Dec(DistToDecimal);\r\n // -1 -> we've arrived behind the decimal\r\n if (DistToDecimal=-1) then\r\n begin\r\n AddToResult(DecimalSeparator);\r\n ToResult(ADigit);\r\n end\r\n else\r\n begin\r\n // We're still before the decimal.\r\n ToResult(ADigit);\r\n if ThousandSep and ((DistToDecimal mod 3)=0) and (DistToDecimal>1) then\r\n AddToResult(ThousandSeparator);\r\n end;\r\n end;\r\n\r\n Function GetDigit : Char;\r\n\r\n // Return next digit from available digits.\r\n // May return #0 if none available.\r\n // Will return '0' if applicable.\r\n\r\n begin\r\n // Writeln(' DistToDecimal <= LastDigit : ',DistToDecimal,' <= ',LastDigit,' have digit: ',Current<=Available, ' (',Current,')');\r\n Result:=#0;\r\n if (Current<=Available) then\r\n begin\r\n Result:=FV.Digits[Current];\r\n Inc(Current);\r\n end\r\n else if (DistToDecimal <= LastDigit) then\r\n Dec(DistToDecimal)\r\n else\r\n Result:='0';\r\n // Writeln('GetDigit ->: ',Result);\r\n end;\r\n\r\n procedure CopyDigit;\r\n\r\n // Copy a digit (#, 0) to the output with the correct value\r\n\r\n begin\r\n // Writeln('CopyDigit: Padzeroes: ',PadZeroes,', DistToDecimal: ',DistToDecimal);\r\n if (PadZeroes=0) then\r\n WriteDigit(GetDigit) // No shift needed, just copy what is available.\r\n else if (PadZeroes<0) then\r\n begin\r\n // We must prepend zeroes\r\n Inc(PadZeroes);\r\n if (DistToDecimal<=FirstDigit) then\r\n WriteDigit('0')\r\n else\r\n Dec(DistToDecimal);\r\n end\r\n else\r\n begin\r\n // We must append zeroes\r\n while PadZeroes > 0 do\r\n begin\r\n WriteDigit(GetDigit);\r\n Dec(PadZeroes);\r\n end;\r\n WriteDigit(GetDigit);\r\n end;\r\n end;\r\n\r\n Function GetSections(Var SP : TPosArray) : Integer;\r\n\r\n var\r\n FL : Integer;\r\n i : Integer;\r\n C,Q : Char;\r\n inQuote : Boolean;\r\n\r\n begin\r\n Result:=1;\r\n SP[1]:=-1;\r\n SP[2]:=-1;\r\n SP[3]:=-1;\r\n inQuote:=False;\r\n Q:=#0;\r\n I:=1;\r\n FL:=Length(Fmt);\r\n while (I<=FL) do\r\n begin\r\n C:=Fmt[I];\r\n case C of\r\n ';':\r\n begin\r\n if not InQuote then\r\n begin\r\n if Result>3 then\r\n Raise Exception.Create('Invalid float format');\r\n SP[Result]:=I+1;\r\n Inc(Result);\r\n end;\r\n end;\r\n '\"','''':\r\n begin\r\n if InQuote then\r\n InQuote:=C<>Q\r\n else\r\n begin\r\n InQuote:=True;\r\n Q:=C;\r\n end;\r\n end;\r\n end;\r\n Inc(I);\r\n end;\r\n if SP[Result]=-1 then\r\n SP[Result]:=FL+1;\r\n end;\r\n\r\n Procedure AnalyzeFormat;\r\n\r\n var\r\n I,Len: Integer;\r\n Q,C: Char;\r\n InQuote : Boolean;\r\n\r\n begin\r\n Len:=Length(Section);\r\n I:=1;\r\n InQuote:=False;\r\n Q:=#0;\r\n while (I<=Len) do\r\n begin\r\n C:=Section[i];\r\n if C in ['\"',''''] then\r\n begin\r\n if InQuote then\r\n InQuote:=C<>Q\r\n else\r\n begin\r\n InQuote:=True;\r\n Q:=C;\r\n end;\r\n end\r\n else if not InQuote then\r\n case C of\r\n '.':\r\n if (DecimalPos=0) then\r\n DecimalPos:=RequestedDigits+1;\r\n ',':\r\n ThousandSep:=ThousandSeparator<>#0;\r\n 'e', 'E':\r\n begin\r\n Inc(I);\r\n if (I4 then\r\n ExpSize:=4;\r\n end;\r\n end;\r\n '#':\r\n Inc(RequestedDigits);\r\n '0':\r\n begin\r\n if RequestedDigits0 then\r\n LastDigit:=0;\r\n // Writeln('FirstDigit: ',DecimalPos,'-',FirstDigit);\r\n FirstDigit:=DecimalPos-FirstDigit;\r\n if FirstDigit<0 then\r\n FirstDigit:=0;\r\n end;\r\n\r\n Function ValueOutSideScope : Boolean;\r\n begin\r\n With FV do\r\n Result:=((Exponent >= 18) and (not IsScientific)) or (Exponent = $7FF) or (Exponent = $800)\r\n end;\r\n\r\n Procedure CalcRunVars;\r\n\r\n Var\r\n D,P: Integer;\r\n\r\n begin\r\n if IsScientific then\r\n begin\r\n P:=RequestedDigits;\r\n D:=9999;\r\n end\r\n else\r\n begin\r\n P:=MaxPrecision;\r\n D:=RequestedDigits-DecimalPos+1;\r\n end;\r\n FV:=FloatToDecimal(aValue,P,D);\r\n // Writeln('Number of digits available : ',Length(FV.Digits));\r\n // For p:=0 to Length(FV.Digits)-1 do\r\n // Writeln(P,': ',FV.Digits[p]);\r\n DistToDecimal:=DecimalPos-1;\r\n // Writeln('DistToDecimal : ',DistToDecimal);\r\n if IsScientific then\r\n PadZeroes:=0 // No padding.\r\n else\r\n begin\r\n PadZeroes:=FV.Exponent-(DecimalPos-1);\r\n if (PadZeroes>=0) then\r\n DistToDecimal:=FV.Exponent\r\n end;\r\n // Writeln('PadZeroes : ',PadZeroes, ', DistToDecimal : ',DistToDecimal);\r\n Available:=-1;\r\n while (Available#0) do\r\n Inc(Available);\r\n // Writeln('Available: ',Available);\r\n end;\r\n\r\n Function FormatExponent(ASign: Char; aExponent: Integer) : String;\r\n\r\n begin\r\n Result:=IntToStr(aExponent);\r\n Result:=StringOfChar('0',ExpSize-Length(Result))+Result;\r\n if (aExponent<0) then\r\n Result:='-'+Result\r\n else if (aExponent>0) and (aSign='+') then\r\n Result:=aSign+Result;\r\n end;\r\n\r\nvar\r\n I,S : Integer;\r\n C,Q : Char;\r\n PA : TPosArray;\r\n InLiteral : Boolean;\r\n\r\nbegin\r\n SetLength(PA,4);\r\n Result:='';\r\n Initvars;\r\n // What section to use ?\r\n if (E>0) then\r\n S:=1\r\n else if (E<0) then\r\n S:=2\r\n else\r\n S:=3;\r\n PA[0]:=0;\r\n I:=GetSections(PA);\r\n if (IQ\r\n else\r\n begin\r\n inLiteral:=True;\r\n Q:=C;\r\n end;\r\n end\r\n else if InLiteral then\r\n ToResult(C)\r\n else\r\n case C of\r\n '0', '#':\r\n CopyDigit;\r\n '.', ',':\r\n ; // Do nothing, handled by CopyDigit\r\n 'e', 'E':\r\n begin\r\n ToResult(C); // Always needed\r\n Inc(I);\r\n if I<=Length(Section) then\r\n begin\r\n C:=Section[I];\r\n if (C in ['+','-']) then\r\n begin\r\n AddToResult(FormatExponent(C,FV.Exponent-DecimalPos+1));\r\n // Skip rest\r\n while (I0.0)\r\n else\r\n begin\r\n CheckBoolStrs;\r\n for I:=low(TrueBoolStrs) to High(TrueBoolStrs) do\r\n if Temp=uppercase(TrueBoolStrs[I]) then\r\n begin\r\n Value:=true;\r\n exit;\r\n end;\r\n for I:=low(FalseBoolStrs) to High(FalseBoolStrs) do\r\n if Temp=uppercase(FalseBoolStrs[I]) then\r\n begin\r\n Value:=false;\r\n exit;\r\n end;\r\n Result:=false;\r\n end;\r\nend;\r\n\r\nfunction UpperCase(const s: String): String; assembler;\r\nasm\r\n return s.toUpperCase();\r\nend;\r\n\r\nfunction LowerCase(const s: String): String; assembler;\r\nasm\r\n return s.toLowerCase();\r\nend;\r\n\r\nfunction CompareStr(const s1, s2: String): Integer; assembler;\r\nasm\r\n var l1 = s1.length;\r\n var l2 = s2.length;\r\n if (l1<=l2){\r\n var s = s2.substr(0,l1);\r\n if (s1s){ return 1;\r\n } else { return l1l2){ return 1;\r\n } else if (l10 then\r\n Result:=Copy(S,1,P-1)+DS+Copy(S,P+1,Length(S)-P)\r\n else\r\n Result:=S;\r\nend;\r\n\r\nfunction FormatGeneralFloat(Value : double; Precision : Integer; DS : String) : string;\r\n\r\nVar\r\n P, PE, Q, Exponent: Integer;\r\n\r\nBegin\r\n If (Precision = -1) Or (Precision > maxdigits) Then\r\n Precision := maxdigits;\r\n { First convert to scientific format, with correct precision }\r\n Str(Value:precision+7, Result);\r\n { Delete leading spaces }\r\n Result:=TrimLeft(Result);\r\n P:=Pos('.',Result);\r\n if P=0 then\r\n exit;\r\n { Consider removing exponent }\r\n PE:=Pos('E',Result);\r\n if PE=0 then\r\n begin\r\n Result:=ReplaceDecimalSep(Result,DS);\r\n exit;\r\n end;\r\n { Read exponent }\r\n Q:=PE+2;\r\n Exponent := 0;\r\n while (Q <= Length(Result)) do\r\n begin\r\n Exponent := Exponent*10 + Ord(Result[Q])-Ord('0');\r\n Inc(Q);\r\n end;\r\n if Result[PE+1] = '-' then\r\n Exponent := -Exponent;\r\n if (P+Exponent < PE) and (Exponent > -6) then\r\n begin\r\n { OK to remove exponent }\r\n SetLength(Result,PE-1); { Trim exponent }\r\n if Exponent >= 0 then\r\n begin\r\n { Shift point to right }\r\n for Q := 0 to Exponent-1 do\r\n begin\r\n Result[P] := Result[P+1];\r\n Inc(P);\r\n end;\r\n Result[P] := '.';\r\n P := 1;\r\n if Result[P] = '-' then\r\n Inc(P);\r\n while (Result[P] = '0') and (P < Length(Result)) and (Copy(Result,P+1,Length(DS))<>DS) do\r\n { Trim leading zeros; conversion above should not give any, but occasionally does\r\n because of rounding }\r\n System.Delete(Result,P,1);\r\n end\r\n else\r\n begin\r\n { Add zeros at start }\r\n Insert(Copy('00000',1,-Exponent),Result,P-1);\r\n Result[P-Exponent] := Result[P-Exponent-1]; { Copy leading digit }\r\n Result[P] := '.';\r\n if Exponent <> -1 then\r\n Result[P-Exponent-1] := '0';\r\n end;\r\n { Remove trailing zeros }\r\n Q := Length(Result);\r\n while (Q > 0) and (Result[Q] = '0') do\r\n Dec(Q);\r\n if Result[Q] = '.' then\r\n Dec(Q); { Remove trailing decimal point }\r\n if (Q = 0) or ((Q=1) and (Result[1] = '-')) then\r\n Result := '0'\r\n else\r\n SetLength(Result,Q);\r\n end\r\n else\r\n begin\r\n { Need exponent, but remove superfluous characters }\r\n { Delete trailing zeros }\r\n while Result[PE-1] = '0' do\r\n begin\r\n System.Delete(Result,PE-1,1);\r\n Dec(PE);\r\n end;\r\n { If number ends in decimal point, remove it }\r\n if Result[PE-1] = DS then\r\n begin\r\n System.Delete(Result,PE-1,1);\r\n Dec(PE);\r\n end;\r\n { delete superfluous + in exponent }\r\n if Result[PE+1]='+' then\r\n System.Delete(Result,PE+1,1)\r\n else\r\n Inc(PE);\r\n while Result[PE+1] = '0' do\r\n { Delete leading zeros in exponent }\r\n System.Delete(Result,PE+1,1)\r\n end;\r\n Result:=ReplaceDecimalSep(Result,DS)\r\nend;\r\n\r\nfunction FormatExponentFloat(Value : double; Precision,Digits : Integer;DS : String) : string;\r\n\r\nVar\r\n P: Integer;\r\nBegin\r\n DS:=DecimalSeparator;\r\n If (Precision = -1) Or (Precision > maxdigits) Then\r\n Precision := maxdigits;\r\n Str(Value:Precision+7, Result);\r\n { Delete leading spaces }\r\n while Result[1] = ' ' do\r\n System.Delete(Result, 1, 1);\r\n P:=Pos('E',Result);\r\n if P=0 then\r\n begin\r\n Result:=ReplaceDecimalSep(Result,DS);\r\n exit;\r\n end;\r\n Inc(P, 2);\r\n if Digits > 4 then\r\n Digits:=4;\r\n Digits:=Length(Result) - P - Digits + 1;\r\n if Digits < 0 then\r\n insert(copy('0000',1,-Digits),Result,P)\r\n else\r\n while (Digits > 0) and (Result[P] = '0') do\r\n begin\r\n System.Delete(Result, P, 1);\r\n if P > Length(Result) then\r\n begin\r\n System.Delete(Result, P - 2, 2);\r\n break;\r\n end;\r\n Dec(Digits);\r\n end;\r\n Result:=ReplaceDecimalSep(Result,DS);\r\nEnd;\r\n\r\nfunction FormatFixedFloat(Value : double; Digits : Integer; DS : String) : string;\r\n\r\nBegin\r\n If Digits = -1 Then\r\n Digits := 2\r\n Else If Digits > 18 Then\r\n Digits := 18;\r\n Str(Value:0:Digits, Result);\r\n if (Result<>'') and (Result[1]=' ') then\r\n Delete(Result,1,1);\r\n Result:=ReplaceDecimalSep(Result,DS);\r\nend;\r\n\r\n\r\nfunction FormatNumberFloat(Value : double; Digits : Integer; DS,TS : String) : string;\r\n\r\nVar\r\n P : integer;\r\n\r\nBegin\r\n If Digits = -1 Then\r\n Digits := 2\r\n else If Digits > maxdigits Then\r\n Digits := maxdigits;\r\n Str(Value:0:Digits, Result);\r\n if (Result<>'') and (Result[1]=' ') then\r\n Delete(Result,1,1);\r\n P:=Pos('.',Result);\r\n if (P<=0) then\r\n P:=Length(Result)+1;\r\n Result:=ReplaceDecimalSep(Result,DS);\r\n Dec(P,3);\r\n if (TS<>'') and (TS<>#0) then\r\n While (P>1) Do\r\n Begin\r\n If (Result[P-1] <> '-') Then\r\n Insert(TS, Result, P);\r\n Dec(P, 3);\r\n End;\r\nEnd;\r\n\r\nfunction RemoveLeadingNegativeSign(var AValue: String; DS : String): Boolean;\r\n\r\n// removes negative sign in case when result is zero eg. -0.00\r\n\r\nvar\r\n i: PtrInt;\r\n TS: String;\r\n StartPos: PtrInt;\r\n\r\nbegin\r\n Result:=False;\r\n StartPos := 2;\r\n TS := ThousandSeparator;\r\n for i :=StartPos to length(AValue) do\r\n begin\r\n Result := (AValue[i] in ['0', DS, 'E', '+']) or (aValue[i]=TS);\r\n if not Result then\r\n break;\r\n end;\r\n if (Result) and (AValue[1]='-') then\r\n Delete(AValue, 1, 1);\r\nend;\r\n\r\nFunction FormatNumberCurrency(const Value : Currency; Digits : Integer; DS,TS : String) : string;\r\n\r\nVar\r\n Negative: Boolean;\r\n P : Integer;\r\n\r\nBegin\r\n // Writeln('Value ',D);\r\n If Digits = -1 Then\r\n Digits := CurrencyDecimals\r\n Else If Digits > 18 Then\r\n Digits := 18;\r\n Str(Value:0:Digits, Result);\r\n // Writeln('1. Result ',Result,' currencystring : ',CurrencyString);\r\n Negative:=Result[1] = '-';\r\n if Negative then\r\n System.Delete(Result, 1, 1);\r\n P := Pos('.', Result);\r\n // Writeln('2. Result ',Result,' currencystring : ',CurrencyString);\r\n If TS<>'' Then\r\n begin\r\n If P <> 0 Then\r\n Result:=ReplaceDecimalSep(Result,DS)\r\n else\r\n P := Length(Result)+1;\r\n Dec(P, 3);\r\n While (P > 1) Do\r\n Begin\r\n Insert(TS, Result, P);\r\n Dec(P, 3);\r\n End;\r\n end;\r\n // Writeln('3. Result ',Result,' currencystring : ',CurrencyString);\r\n if Negative then\r\n RemoveLeadingNegativeSign(Result,DS);\r\n // Writeln('4. Result ',Result,' currencystring : ',CurrencyString);\r\n // Writeln('CurrencyFormat: ',CurrencyFormat,'NegcurrencyFormat: ',NegCurrFormat);\r\n If Not Negative Then\r\n Case CurrencyFormat Of\r\n 0: Result := CurrencyString + Result;\r\n 1: Result := Result + CurrencyString;\r\n 2: Result := CurrencyString + ' ' + Result;\r\n 3: Result := Result + ' ' + CurrencyString;\r\n end\r\n else\r\n Case NegCurrFormat Of\r\n 0: Result := '(' + CurrencyString + Result + ')';\r\n 1: Result := '-' + CurrencyString + Result;\r\n 2: Result := CurrencyString + '-' + Result;\r\n 3: Result := CurrencyString + Result + '-';\r\n 4: Result := '(' + Result + CurrencyString + ')';\r\n 5: Result := '-' + Result + CurrencyString;\r\n 6: Result := Result + '-' + CurrencyString;\r\n 7: Result := Result + CurrencyString + '-';\r\n 8: Result := '-' + Result + ' ' + CurrencyString;\r\n 9: Result := '-' + CurrencyString + ' ' + Result;\r\n 10: Result := Result + ' ' + CurrencyString + '-';\r\n 11: Result := CurrencyString + ' ' + Result + '-';\r\n 12: Result := CurrencyString + ' ' + '-' + Result;\r\n 13: Result := Result + '-' + ' ' + CurrencyString;\r\n 14: Result := '(' + CurrencyString + ' ' + Result + ')';\r\n 15: Result := '(' + Result + ' ' + CurrencyString + ')';\r\n end;\r\nend;\r\n\r\nfunction FloatToStrF(const Value: double; format: TFloatFormat; Precision,\r\n Digits: Integer): String;\r\n\r\nVar\r\n DS: string;\r\n\r\nBegin\r\n DS:=DecimalSeparator;\r\n Case format Of\r\n ffGeneral:\r\n Result:=FormatGeneralFloat(Value,Precision,DS);\r\n ffExponent:\r\n Result:=FormatExponentFloat(Value,Precision,Digits,DS);\r\n ffFixed:\r\n Result:=FormatFixedFloat(Value,Digits,DS);\r\n ffNumber:\r\n Result:=FormatNumberFloat(Value,Digits,DS,ThousandSeparator);\r\n ffCurrency:\r\n Result:=FormatNumberCurrency(Value,Digits,DS,ThousandSeparator);\r\n end;\r\n if (Format<>ffCurrency) and (length(Result)>1) and (Result[1]='-') then\r\n RemoveLeadingNegativeSign(Result,DS);\r\nend;\r\n\r\nfunction Format(const Fmt: String; const Args: array of JSValue): String;\r\n\r\nVar ChPos,OldPos,ArgPos,DoArg,Len : SizeInt;\r\n Hs,ToAdd : String;\r\n Index : Byte;\r\n Width,Prec : Longint;\r\n Left : Boolean;\r\n Fchar : char;\r\n vq : nativeint;\r\n\r\n {\r\n ReadFormat reads the format string. It returns the type character in\r\n uppercase, and sets index, Width, Prec to their correct values,\r\n or -1 if not set. It sets Left to true if left alignment was requested.\r\n In case of an error, DoFormatError is called.\r\n }\r\n\r\n Function ReadFormat : Char;\r\n\r\n Var Value : NativeInt;\r\n\r\n Procedure ReadInteger;\r\n\r\n var\r\n Code: integer;\r\n ArgN: SizeInt;\r\n begin\r\n If Value<>-1 then exit; // Was already read.\r\n OldPos:=ChPos;\r\n While (ChPos<=Len) and\r\n (Fmt[ChPos]<='9') and (Fmt[ChPos]>='0') do inc(ChPos);\r\n If ChPos>len then\r\n DoFormatError(feInvalidFormat,Fmt);\r\n If Fmt[ChPos]='*' then\r\n begin\r\n\r\n if Index=High(byte) then\r\n ArgN:=Argpos\r\n else\r\n begin\r\n ArgN:=Index;\r\n Inc(Index);\r\n end;\r\n\r\n If (ChPos>OldPos) or (ArgN>High(Args)) then\r\n DoFormatError(feInvalidFormat,Fmt);\r\n\r\n ArgPos:=ArgN+1;\r\n\r\n if IsNumber(Args[ArgN]) and IsInteger(Args[ArgN]) then\r\n Value:=Integer(Args[ArgN])\r\n else\r\n DoFormatError(feInvalidFormat,Fmt);\r\n Inc(ChPos);\r\n end\r\n else\r\n begin\r\n If (OldPos0 then DoFormatError (feInvalidFormat,Fmt);\r\n end\r\n else\r\n Value:=-1;\r\n end;\r\n end;\r\n\r\n Procedure ReadIndex;\r\n\r\n begin\r\n If Fmt[ChPos]<>':' then\r\n ReadInteger\r\n else\r\n value:=0; // Delphi undocumented behaviour, assume 0, #11099\r\n If Fmt[ChPos]=':' then\r\n begin\r\n If Value=-1 then DoFormatError(feMissingArgument,Fmt);\r\n Index:=Value;\r\n Value:=-1;\r\n Inc(ChPos);\r\n end;\r\n end;\r\n\r\n Procedure ReadLeft;\r\n\r\n begin\r\n If Fmt[ChPos]='-' then\r\n begin\r\n left:=True;\r\n Inc(ChPos);\r\n end\r\n else\r\n Left:=False;\r\n end;\r\n\r\n Procedure ReadWidth;\r\n\r\n begin\r\n ReadInteger;\r\n If Value<>-1 then\r\n begin\r\n Width:=Value;\r\n Value:=-1;\r\n end;\r\n end;\r\n\r\n Procedure ReadPrec;\r\n\r\n begin\r\n If Fmt[ChPos]='.' then\r\n begin\r\n inc(ChPos);\r\n ReadInteger;\r\n If Value=-1 then\r\n Value:=0;\r\n prec:=Value;\r\n end;\r\n end;\r\n\r\n\r\n begin\r\n Index:=High(byte);\r\n Width:=-1;\r\n Prec:=-1;\r\n Value:=-1;\r\n inc(ChPos);\r\n If Fmt[ChPos]='%' then\r\n begin\r\n Result:='%';\r\n exit; // VP fix\r\n end;\r\n ReadIndex;\r\n ReadLeft;\r\n ReadWidth;\r\n ReadPrec;\r\n Result:=Upcase(Fmt[ChPos]);\r\n end;\r\n\r\n\r\n function Checkarg (AT : TJSValueType; err:boolean):boolean;\r\n {\r\n Check if argument INDEX is of correct type (AT)\r\n If Index=-1, ArgPos is used, and argpos is augmented with 1\r\n DoArg is set to the argument that must be used.\r\n }\r\n begin\r\n result:=false;\r\n if Index=High(Byte) then\r\n DoArg:=Argpos\r\n else\r\n DoArg:=Index;\r\n ArgPos:=DoArg+1;\r\n If (Doarg>High(Args)) or (GetValueTYpe(Args[Doarg])<>AT) then\r\n begin\r\n if err then\r\n DoFormatError(feInvalidArgindex,Fmt);\r\n dec(ArgPos);\r\n exit;\r\n end;\r\n result:=true;\r\n end;\r\n\r\nbegin\r\n Result:='';\r\n Len:=Length(Fmt);\r\n ChPos:=1;\r\n OldPos:=1;\r\n ArgPos:=0;\r\n While ChPos<=len do\r\n begin\r\n While (ChPos<=Len) and (Fmt[ChPos]<>'%') do\r\n inc(ChPos);\r\n If ChPos>OldPos Then\r\n Result:=Result+Copy(Fmt,OldPos,ChPos-Oldpos);\r\n If ChPos'-' then\r\n ToAdd:=StringOfChar('0',Index)+ToAdd\r\n else\r\n // + 1 to accomodate for - sign in length !!\r\n Insert(StringOfChar('0',Index+1),toadd,2);\r\n end;\r\n 'U' : begin\r\n Checkarg(jvtinteger,True);\r\n if NativeInt(Args[Doarg])<0 then\r\n DoFormatError(feInvalidArgindex,Fmt);\r\n Toadd:=IntToStr(NativeInt(Args[Doarg]));\r\n Width:=Abs(width);\r\n Index:=Prec-Length(ToAdd);\r\n ToAdd:=StringOfChar('0',Index)+ToAdd\r\n end;\r\n 'E' : begin\r\n if CheckArg(jvtFloat,false) or CheckArg(jvtInteger,True) then\r\n ToAdd:=FloatToStrF(Double(Args[doarg]),ffFixed,9999,Prec);\r\n end;\r\n 'F' : begin\r\n if CheckArg(jvtFloat,false) or CheckArg(jvtInteger,True) then\r\n ToAdd:=FloatToStrF(Double(Args[doarg]),ffFixed,9999,Prec);\r\n end;\r\n 'G' : begin\r\n if CheckArg(jvtFloat,false) or CheckArg(jvtInteger,True) then\r\n ToAdd:=FloatToStrF(Double(Args[doarg]),ffGeneral,Prec,3);\r\n end;\r\n 'N' : begin\r\n if CheckArg(jvtFloat,false) or CheckArg(jvtInteger,True) then\r\n ToAdd:=FloatToStrF(Double(Args[doarg]),ffNumber,9999,Prec);\r\n end;\r\n 'M' : begin\r\n if CheckArg(jvtFloat,false) or CheckArg(jvtInteger,True) then\r\n ToAdd:=FloatToStrF(Double(Args[doarg]),ffCurrency,9999,Prec);\r\n end;\r\n 'S' : begin\r\n CheckArg(jvtString,true);\r\n hs:=String(Args[doarg]);\r\n Index:=Length(hs);\r\n If (Prec<>-1) and (Index>Prec) then\r\n Index:=Prec;\r\n ToAdd:=Copy(hs,1,Index);\r\n end;\r\n 'P' : Begin\r\n CheckArg(jvtInteger,true);\r\n ToAdd:=IntToHex(NativeInt(Args[DoArg]),31);\r\n end;\r\n 'X' : begin\r\n Checkarg(jvtinteger,true);\r\n vq:=nativeInt(Args[Doarg]);\r\n index:=31; // May need to adjust to NativeInt\r\n If Prec>index then\r\n ToAdd:=IntToHex(NativeInt(vq),index)\r\n else\r\n begin\r\n // determine minimum needed number of hex digits.\r\n Index:=1;\r\n While (NativeInt(1) shl (Index*4)<=vq) and (index<16) do\r\n inc(Index);\r\n If Index>Prec then\r\n Prec:=Index;\r\n ToAdd:=IntToHex(vq,Prec);\r\n end;\r\n end;\r\n '%': ToAdd:='%';\r\n end;\r\n If Width<>-1 then\r\n If Length(ToAdd)= Len then exit;\r\n First := True;\r\n end;\r\n end\r\n else\r\n if not (Ident[I] in AlphaNum) then exit;\r\n I:=I+1;\r\n end;\r\n Result:=true;\r\nend;\r\n\r\nprocedure FreeAndNil(var Obj);\r\nvar\r\n o: TObject;\r\nbegin\r\n o:=TObject(Obj);\r\n if o=nil then exit;\r\n TObject(Obj):=nil;\r\n o.Destroy;\r\nend;\r\n\r\n{ EVariantError }\r\n\r\nconstructor EVariantError.CreateCode(Code: Longint);\r\nbegin\r\n ErrCode:=Code;\r\nend;\r\n\r\n{ Exception }\r\n\r\nconstructor Exception.Create(const Msg: String);\r\nbegin\r\n fMessage := Msg;\r\n FJSError := TJSError.new(Msg);\r\n {$ifdef nodejs}\r\n FNodeJSError := TJSError.new;\r\n {$endif}\r\n if LogMessageOnCreate then\r\n Writeln('Created exception ',ClassName,' with message: ',Msg);\r\nend;\r\n\r\nconstructor Exception.CreateFmt(const Msg: string; const Args: array of jsvalue\r\n );\r\nbegin\r\n //writeln('Exception.CreateFmt START ',ClassName,' \"',Msg,'\" Args=',Args);\r\n Create(Format(Msg,Args));\r\n //writeln('Exception.CreateFmt END ',ClassName,' \"',Msg,'\" fMessage=',fMessage);\r\nend;\r\n\r\nconstructor Exception.CreateHelp(const Msg: String; AHelpContext: Integer);\r\nbegin\r\n Create(Msg);\r\n fHelpContext:=AHelpContext;\r\nend;\r\n\r\nconstructor Exception.CreateFmtHelp(const Msg: string;\r\n const Args: array of jsvalue; AHelpContext: Integer);\r\nbegin\r\n Create(Format(Msg,Args));\r\n fHelpContext:=AHelpContext;\r\nend;\r\n\r\nfunction Exception.ToString: String;\r\nbegin\r\n Result:=ClassName+': '+Message;\r\nend;\r\n\r\nConst\r\n RESpecials = '([\\$\\+\\[\\]\\(\\)\\\\\\.\\*\\^])';\r\n\r\nfunction StringReplace(aOriginal, aSearch, aReplace: string;\r\n Flags: TStringReplaceFlags): String;\r\n\r\nVar\r\n REFlags : String;\r\n REString : String;\r\n\r\nbegin\r\n REFlags:='';\r\n if rfReplaceAll in flags then\r\n ReFlags:='g';\r\n if rfIgnoreCase in flags then\r\n ReFlags:=ReFlags+'i';\r\n REString:=TJSString(aSearch).replace(TJSRegexp.new(RESpecials,'g'),'\\$1');\r\n Result:=TJSString(aOriginal).replace(TJSRegexp.new(REString,REFlags),aReplace);\r\nend;\r\n\r\nfunction QuoteString(aOriginal: String; AQuote: Char): String;\r\n\r\nbegin\r\n Result:=AQuote+StringReplace(aOriginal,aQuote,aQuote+aQuote,[rfReplaceAll])+AQuote;\r\nend;\r\n\r\nfunction QuotedStr(const s: string; QuoteChar : Char = ''''): string;\r\n\r\nbegin\r\n Result:=QuoteString(S,QuoteChar);\r\nend;\r\n\r\nfunction DeQuoteString(aQuoted: String; AQuote: Char): String;\r\nvar\r\n i: Integer;\r\nbegin\r\n Result:=aQuoted;\r\n if TJSString(Result).substr(0,1)<>AQuote then exit;\r\n Result:=TJSString(Result).slice(1);\r\n i:=1;\r\n while i<=length(Result) do\r\n begin\r\n if Result[i]=AQuote then\r\n begin\r\n if (i=length(Result)) or (Result[i+1]<>AQuote) then\r\n begin\r\n Result:=TJSString(Result).slice(0,i-1);\r\n exit;\r\n end\r\n else\r\n Result:=TJSString(Result).slice(0,i-1)+TJSString(Result).slice(i);\r\n end\r\n else\r\n inc(i);\r\n end;\r\nend;\r\n\r\nfunction IsDelimiter(const Delimiters, S: string; Index: Integer): Boolean;\r\nbegin\r\n Result:=False;\r\n if (Index>0) and (Index<=Length(S)) then\r\n Result:=Pos(S[Index],Delimiters)<>0; // Note we don't do MBCS yet\r\nend;\r\n\r\nFunction LastDelimiter(const Delimiters, S: string): SizeInt;\r\n\r\nbegin\r\n Result:=Length(S);\r\n While (Result>0) and (Pos(S[Result],Delimiters)=0) do\r\n Dec(Result);\r\nend;\r\n\r\n\r\nfunction AdjustLineBreaks(const S: string): string;\r\n\r\nbegin\r\n Result:=AdjustLineBreaks(S,DefaultTextLineBreakStyle);\r\nend;\r\n\r\nfunction AdjustLineBreaks(const S: string; Style: TTextLineBreakStyle): string;\r\n\r\nvar\r\n I,L: Longint;\r\n Res : String;\r\n\r\n Procedure Add(C : Char);\r\n begin\r\n Res:=Res+C;\r\n end;\r\n\r\nbegin\r\n I:=0;\r\n L:=Length(S);\r\n Result:='';\r\n While (I<=L) do\r\n case S[I] of\r\n #10: begin\r\n if Style in [tlbsCRLF,tlbsCR] then\r\n Add(#13);\r\n if Style=tlbsCRLF then\r\n Add(#10);\r\n Inc(I);\r\n end;\r\n #13: begin\r\n if Style=tlbsCRLF then\r\n Add(#13);\r\n Add(#10);\r\n Inc(I);\r\n if S[I]=#10 then\r\n Inc(I);\r\n end;\r\n else\r\n Add(S[i]);\r\n Inc(I);\r\n end;\r\n Result:=Res;\r\nend;\r\n\r\nfunction WrapText(const Line, BreakStr: string;\r\n const BreakChars: array of char; MaxCol: Integer): string;\r\n\r\nconst\r\n Quotes = ['''', '\"'];\r\n\r\nVar\r\n L : String;\r\n C,LQ,BC : Char;\r\n P,BLen,Len : Integer;\r\n HB,IBC : Boolean;\r\n\r\nbegin\r\n Result:='';\r\n L:=Line;\r\n Blen:=Length(BreakStr);\r\n If (BLen>0) then\r\n BC:=BreakStr[1]\r\n else\r\n BC:=#0;\r\n Len:=Length(L);\r\n While (Len>0) do\r\n begin\r\n P:=1;\r\n LQ:=#0;\r\n HB:=False;\r\n IBC:=False;\r\n While ((P<=Len) and ((P<=MaxCol) or not IBC)) and ((LQ<>#0) or Not HB) do\r\n begin\r\n C:=L[P];\r\n If (C=LQ) then\r\n LQ:=#0\r\n else If (C in Quotes) then\r\n LQ:=C;\r\n If (LQ<>#0) then\r\n Inc(P)\r\n else\r\n begin\r\n HB:=((C=BC) and (BreakStr=Copy(L,P,BLen)));\r\n If HB then\r\n Inc(P,Blen)\r\n else\r\n begin\r\n If (P>=MaxCol) then\r\n IBC:=CharInSet(C,BreakChars);\r\n Inc(P);\r\n end;\r\n end;\r\n// Writeln('\"',C,'\" : IBC : ',IBC,' HB : ',HB,' LQ : ',LQ,' P>MaxCol : ',P>MaxCol);\r\n end;\r\n Result:=Result+Copy(L,1,P-1);\r\n Delete(L,1,P-1);\r\n Len:=Length(L);\r\n If (Len>0) and Not HB then\r\n Result:=Result+BreakStr;\r\n end;\r\nend;\r\n\r\nfunction WrapText(const Line: string; MaxCol: Integer): string;\r\n\r\nbegin\r\n Result:=WrapText(Line,sLineBreak, [' ', '-', #9], MaxCol);\r\nend;\r\n\r\n\r\nfunction GetEnvironmentVariable(const EnvVar: String): String;\r\nbegin\r\n if Assigned(OnGetEnvironmentVariable) then\r\n Result:=OnGetEnvironmentVariable(EnvVar)\r\n else\r\n Result:='';\r\nend;\r\n\r\nfunction GetEnvironmentVariableCount: Integer;\r\nbegin\r\n if Assigned(OnGetEnvironmentVariableCount) then\r\n Result:=OnGetEnvironmentVariableCount()\r\n else\r\n Result:=0;\r\nend;\r\n\r\nfunction GetEnvironmentString(Index: Integer): String;\r\nbegin\r\n if Assigned(OnGetEnvironmentString) then\r\n Result:=OnGetEnvironmentString(Index)\r\n else\r\n Result:='';\r\nend;\r\n\r\n{ Date/Time routines}\r\n\r\nFunction DoEncodeDate(Year, Month, Day: Word): longint;\r\n\r\nVar\r\n D : TDateTime;\r\n\r\nbegin\r\n If TryEncodeDate(Year,Month,Day,D) then\r\n Result:=Trunc(D)\r\n else\r\n Result:=0;\r\nend;\r\n\r\nfunction DoEncodeTime(Hour, Minute, Second, MilliSecond: word): TDateTime;\r\n\r\nbegin\r\n If not TryEncodeTime(Hour,Minute,Second,MilliSecond,Result) then\r\n Result:=0;\r\nend;\r\n\r\nfunction DateTimeToJSDate(aDateTime: TDateTime): TJSDate;\r\n\r\nVar\r\n Y,M,D,h,n,s,z : Word;\r\n\r\nbegin\r\n DecodeDate(Trunc(aDateTime),Y,M,D);\r\n DecodeTime(Frac(aDateTime),H,N,S,Z);\r\n Result:=TJSDate.New(Y,M-1,D,h,n,s,z);\r\nend;\r\n\r\nfunction JSDateToDateTime(aDate: TJSDate): TDateTime;\r\n\r\nbegin\r\n Result:=EncodeDate(ADate.FullYear,ADate.Month+1,ADate.Date) +\r\n EncodeTime(ADate.Hours,ADate.Minutes,ADate.Seconds,ADate.Milliseconds);\r\nend;\r\n\r\n\r\n{ ComposeDateTime converts a Date and a Time into one TDateTime }\r\nfunction ComposeDateTime(Date,Time : TDateTime) : TDateTime;\r\n\r\nbegin\r\n if Date < 0 then\r\n Result := trunc(Date) - Abs(frac(Time))\r\n else\r\n Result := trunc(Date) + Abs(frac(Time));\r\nend;\r\n\r\nfunction TryEncodeDate(Year, Month, Day: Word; out Date: TDateTime): Boolean;\r\n\r\nvar\r\n c, ya: LongWord;\r\nbegin\r\n Result:=(Year>0) and (Year<10000) and\r\n (Month >= 1) and (Month<=12) and\r\n (Day>0) and (Day<=MonthDays[IsleapYear(Year),Month]);\r\n If Result then\r\n begin\r\n if month > 2 then\r\n Dec(Month,3)\r\n else\r\n begin\r\n Inc(Month,9);\r\n Dec(Year);\r\n end;\r\n c:= Year DIV 100;\r\n ya:= Year - 100*c;\r\n Date := (146097*c) SHR 2 + (1461*ya) SHR 2 + (153*LongWord(Month)+2) DIV 5 + LongWord(Day);\r\n // Note that this line can't be part of the line above, since TDateTime is\r\n // signed and c and ya are not\r\n Date := Date - 693900;\r\n end\r\nend;\r\n\r\nfunction TryEncodeTime(Hour, Min, Sec, MSec: Word; out Time: TDateTime\r\n ): Boolean;\r\n\r\nbegin\r\n Result:=(Hour<24) and (Min<60) and (Sec<60) and (MSec<1000);\r\n If Result then\r\n Time:=TDateTime(LongWord(Hour)*3600000+LongWord(Min)*60000+LongWord(Sec)*1000+MSec)/MSecsPerDay;\r\nend;\r\n\r\n{ EncodeDate packs three variables Year, Month and Day into a\r\n TDateTime value the result is the number of days since 12/30/1899 }\r\n\r\nfunction EncodeDate(Year, Month, Day: word): TDateTime;\r\n\r\nbegin\r\n If Not TryEncodeDate(Year,Month,Day,Result) then\r\n Raise EConvertError.CreateFmt('%s-%s-%s is not a valid date specification',\r\n [IntToStr(Year),IntToStr(Month),IntToStr(Day)]);\r\nend;\r\n\r\n{ EncodeTime packs four variables Hour, Minute, Second and MilliSecond into\r\n a TDateTime value }\r\n\r\nfunction EncodeTime(Hour, Minute, Second, MilliSecond:word):TDateTime;\r\n\r\nbegin\r\n If not TryEncodeTime(Hour,Minute,Second,MilliSecond,Result) then\r\n Raise EConvertError.CreateFmt('%s:%s:%s.%s is not a valid time specification',\r\n [IntToStr(Hour),IntToStr(Minute),IntToStr(Second),IntToStr(MilliSecond)]);\r\nend;\r\n\r\n\r\n{ DecodeDate unpacks the value Date into three values:\r\n Year, Month and Day }\r\n\r\nprocedure DecodeDate(Date: TDateTime; out Year, Month, Day: word);\r\nvar\r\n ly,ld,lm,j : LongWord;\r\nbegin\r\n if Date <= -datedelta then // If Date is before 1-1-1 then return 0-0-0\r\n begin\r\n Year := 0;\r\n Month := 0;\r\n Day := 0;\r\n end\r\n else\r\n begin\r\n if Date>0 then\r\n Date:=(Date+(1/(msecsperday*2)))\r\n else\r\n Date:=Date-(1/(msecsperday*2));\r\n if Date>MaxDateTime then\r\n Date:=MaxDateTime;\r\n// Raise EConvertError.CreateFmt('%f is not a valid TDatetime encoding, maximum value is %f.',[Date,MaxDateTime]);\r\n j := ((Trunc(Date) + 693900) SHL 2)-1;\r\n ly:= j DIV 146097;\r\n j:= j - 146097 * LongWord(ly);\r\n ld := j SHR 2;\r\n j:=(ld SHL 2 + 3) DIV 1461;\r\n ld:= ((ld SHL 2) + 7 - 1461*j) SHR 2;\r\n lm:=(5 * ld-3) DIV 153;\r\n ld:= (5 * ld +2 - 153*lm) DIV 5;\r\n ly:= 100 * LongWord(ly) + j;\r\n if lm < 10 then\r\n inc(lm,3)\r\n else\r\n begin\r\n dec(lm,9);\r\n inc(ly);\r\n end;\r\n year:=ly;\r\n month:=lm;\r\n day:=ld;\r\n end;\r\nend;\r\n\r\n\r\nfunction DecodeDateFully(const DateTime: TDateTime; out Year, Month, Day, DOW: Word): Boolean;\r\nbegin\r\n DecodeDate(DateTime,Year,Month,Day);\r\n DOW:=DayOfWeek(DateTime);\r\n Result:=IsLeapYear(Year);\r\nend;\r\n { DateTimeToTimeStamp converts DateTime to a TTimeStamp }\r\n\r\nfunction DateTimeToTimeStamp(DateTime: TDateTime): TTimeStamp;\r\n\r\nVar\r\n D : Double;\r\nbegin\r\n D:=DateTime * Double(MSecsPerDay);\r\n if D<0 then\r\n D:=D-0.5\r\n else\r\n D:=D+0.5;\r\n result.Time := Trunc(Abs(Trunc(D)) Mod MSecsPerDay);\r\n result.Date := DateDelta + (Trunc(D) div MSecsPerDay);\r\nend;\r\n\r\n{ TimeStampToDateTime converts TimeStamp to a TDateTime value }\r\n\r\nfunction TimeStampToDateTime(const TimeStamp: TTimeStamp): TDateTime;\r\nbegin\r\n Result := ComposeDateTime(TimeStamp.Date - DateDelta,TimeStamp.Time/MSecsPerDay)\r\nend;\r\n\r\n{ MSecsToTimeStamp }\r\n\r\nfunction MSecsToTimeStamp(MSecs: NativeInt): TTimeStamp;\r\nbegin\r\n result.Date := Trunc(msecs/msecsperday);\r\n msecs:= msecs-NativeInt(result.date)*msecsperday;\r\n result.Time := Round(MSecs);\r\nend;\r\n\r\nfunction TimeStampToMSecs(const TimeStamp: TTimeStamp): NativeInt;\r\nbegin\r\n result := TimeStamp.Time + (timestamp.date*msecsperday);\r\nend ;\r\n\r\n\r\n\r\n{ DecodeTime unpacks Time into four values:\r\n Hour, Minute, Second and MilliSecond }\r\n\r\nprocedure DecodeTime(Time: TDateTime; out Hour, Minute, Second, MilliSecond: word);\r\nVar\r\n l : LongWord;\r\nbegin\r\n l := DateTimeToTimeStamp(Time).Time;\r\n Hour := l div 3600000;\r\n l := l mod 3600000;\r\n Minute := l div 60000;\r\n l := l mod 60000;\r\n Second := l div 1000;\r\n l := l mod 1000;\r\n MilliSecond := l;\r\nend;\r\n\r\n{ DateTimeToSystemTime converts DateTime value to SystemTime }\r\n\r\nprocedure DateTimeToSystemTime(DateTime: TDateTime; out SystemTime: TSystemTime);\r\nbegin\r\n DecodeDateFully(DateTime, SystemTime.Year, SystemTime.Month, SystemTime.Day,SystemTime.DayOfWeek);\r\n DecodeTime(DateTime, SystemTime.Hour, SystemTime.Minute, SystemTime.Second, SystemTime.MilliSecond);\r\n Dec(SystemTime.DayOfWeek);\r\nend ;\r\n\r\n{ SystemTimeToDateTime converts SystemTime to a TDateTime value }\r\n\r\nfunction SystemTimeToDateTime(const SystemTime: TSystemTime): TDateTime;\r\nbegin\r\n result := ComposeDateTime(DoEncodeDate(SystemTime.Year, SystemTime.Month, SystemTime.Day),\r\n DoEncodeTime(SystemTime.Hour, SystemTime.Minute, SystemTime.Second, SystemTime.MilliSecond));\r\nend ;\r\n\r\nfunction DayOfWeek(DateTime: TDateTime): integer;\r\nbegin\r\n Result:= 1+((Trunc(DateTime) - 1) mod 7);\r\n If (Result<=0) then\r\n Inc(Result,7);\r\nend;\r\n\r\n\r\n\r\nfunction Now: TDateTime;\r\nbegin\r\n Result:=JSDateToDateTime(TJSDate.New());\r\nend;\r\n\r\nfunction Date: TDateTime;\r\n\r\nbegin\r\n Result:=Trunc(Now);\r\nend;\r\n\r\nfunction Time: TDateTime;\r\nbegin\r\n Result:=Now-Date;\r\nend ;\r\n\r\n{ IncMonth increments DateTime with NumberOfMonths months,\r\n NumberOfMonths can be less than zero }\r\n\r\nfunction IncMonth(const DateTime: TDateTime; NumberOfMonths: integer = 1 ): TDateTime;\r\nvar\r\n Year, Month, Day : word;\r\nbegin\r\n DecodeDate(DateTime, Year, Month, Day);\r\n IncAMonth(Year, Month, Day, NumberOfMonths);\r\n result := ComposeDateTime(DoEncodeDate(Year, Month, Day), DateTime);\r\nend ;\r\n\r\n{ IncAMonth is the same as IncMonth, but operates on decoded date }\r\n\r\nprocedure IncAMonth(var Year, Month, Day: Word; NumberOfMonths: Integer = 1);\r\nvar\r\n TempMonth, S: Integer;\r\nbegin\r\n If NumberOfMonths>=0 then\r\n s:=1\r\n else\r\n s:=-1;\r\n inc(Year,(NumberOfMonths div 12));\r\n TempMonth:=Month+(NumberOfMonths mod 12)-1;\r\n if (TempMonth>11) or\r\n (TempMonth<0) then\r\n begin\r\n Dec(TempMonth, S*12);\r\n Inc(Year, S);\r\n end;\r\n Month:=TempMonth+1; { Months from 1 to 12 }\r\n If (Day>MonthDays[IsLeapYear(Year)][Month]) then\r\n Day:=MonthDays[IsLeapYear(Year)][Month];\r\nend;\r\n\r\n{ IsLeapYear returns true if Year is a leap year }\r\n\r\nfunction IsLeapYear(Year: Word): boolean;\r\nbegin\r\n Result := (Year mod 4 = 0) and ((Year mod 100 <> 0) or (Year mod 400 = 0));\r\nend;\r\n\r\n{ DateToStr returns a string representation of Date using ShortDateFormat }\r\n\r\nfunction DateToStr(Date: TDateTime): string;\r\nbegin\r\n Result:=FormatDateTime('ddddd', Date);\r\nend ;\r\n\r\n{ TimeToStr returns a string representation of Time using LongTimeFormat }\r\n\r\nfunction TimeToStr(Time: TDateTime): string;\r\nbegin\r\n Result:=FormatDateTime('tt',Time);\r\nend ;\r\n\r\n{ DateTimeToStr returns a string representation of DateTime using LongDateTimeFormat }\r\n\r\nVar\r\n DateTimeToStrFormat : Array[Boolean] of string = ('c','f');\r\n\r\nfunction DateTimeToStr(DateTime: TDateTime; ForceTimeIfZero : Boolean = False): string;\r\nbegin\r\n Result:=FormatDateTime(DateTimeToStrFormat[ForceTimeIfZero], DateTime)\r\nend ;\r\n\r\n\r\n{ StrToDate converts the string S to a TDateTime value\r\n if S does not represent a valid date value\r\n an EConvertError will be raised }\r\n\r\nfunction IntStrToDate(Out ErrorMsg : String; const S: String; const useformat : string; separator : char): TDateTime;\r\n\r\nConst\r\n WhiteSpace = ' '#8#9#10#12#13;\r\n Digits = '0123456789';\r\n\r\n procedure FixErrorMsg(const errmarg : String);\r\n\r\n begin\r\n ErrorMsg:=Format(SInvalidDateFormat,[errmarg]);\r\n end;\r\n\r\nvar\r\n df:string;\r\n d,m,y,ly,ld,lm:word;\r\n n,i,len:longint;\r\n c: integer;\r\n dp,mp,yp,which : Byte;\r\n s1:string;\r\n values: array of integer;\r\n YearMoreThenTwoDigits : boolean;\r\n\r\nbegin\r\n SetLength(values,4);\r\n Result:=0;\r\n Len:=Length(S);\r\n ErrorMsg:='';\r\n While (Len>0) and (Pos(S[Len],WhiteSpace)>0) do\r\n Dec(len);\r\n if (Len=0) then\r\n begin\r\n FixErrorMsg(S);\r\n exit;\r\n end;\r\n YearMoreThenTwoDigits := False;\r\n if separator = #0 then\r\n if (DateSeparator<>#0) then\r\n separator := DateSeparator\r\n else\r\n separator:='-';\r\n // Writeln('Separator: ',Separator);\r\n df := UpperCase(useFormat);\r\n { Determine order of D,M,Y }\r\n yp:=0;\r\n mp:=0;\r\n dp:=0;\r\n Which:=0;\r\n i:=0;\r\n while (i0 then\r\n s1 := s1 + s[i];\r\n { space can be part of the shortdateformat, and is defaultly in slovak\r\n windows, therefor it shouldn't be taken as separator (unless so specified)\r\n and ignored }\r\n if (Separator <> ' ') and (s[i] = ' ') then\r\n Continue;\r\n if (s[i] = separator) or ((i = len) and (Pos(s[i],Digits)>0)) then\r\n begin\r\n inc(n);\r\n if n>3 then\r\n begin\r\n// Writeln('More than 3 separators');\r\n FixErrorMsg(S);\r\n exit;\r\n end;\r\n // Check if the year has more then two digits (if n=yp, then we are evaluating the year.)\r\n if (n=yp) and (length(s1)>2) then YearMoreThenTwoDigits := True;\r\n val(s1, values[n], c);\r\n if c<>0 then\r\n begin\r\n// Writeln('S1 not a number ',S1);\r\n FixErrorMsg(s);\r\n Exit;\r\n end;\r\n s1 := '';\r\n end\r\n else if (Pos(s[i],Digits)=0) then\r\n begin\r\n// Writeln('Not a number at pos ',I,' ',S[i]);\r\n FixErrorMsg(s);\r\n Exit;\r\n end;\r\n end ;\r\n// Writeln('Which : ',Which,' N : ',N);\r\n if (Which<3) and (N>Which) then\r\n begin\r\n FixErrorMsg(s);\r\n Exit;\r\n end;\r\n // Fill in values.\r\n DecodeDate(Date,Ly,LM,LD);\r\n If N=3 then\r\n begin\r\n y:=values[yp];\r\n m:=values[mp];\r\n d:=values[dp];\r\n end\r\n Else\r\n begin\r\n Y:=ly;\r\n If n<2 then\r\n begin\r\n d:=values[1];\r\n m := LM;\r\n end\r\n else\r\n If dp= 0) and (y < 100) and not YearMoreThenTwoDigits then\r\n begin\r\n ly := ly - TwoDigitYearCenturyWindow;\r\n Inc(Y, ly div 100 * 100);\r\n if (TwoDigitYearCenturyWindow > 0) and (Y < ly) then\r\n Inc(Y, 100);\r\n end;\r\n if not TryEncodeDate(y, m, d, result) then\r\n errormsg:=SErrInvalidDate;\r\nend;\r\n\r\nfunction StrToDate(const S: String; const useformat : string; separator : char): TDateTime;\r\nVar\r\n MSg : String;\r\nbegin\r\n Result:=IntStrToDate(Msg,S,useFormat,Separator);\r\n If (Msg<>'') then\r\n Raise EConvertError.Create(Msg);\r\nend;\r\n\r\nfunction StrToDate(const S: String; separator : char): TDateTime;\r\nbegin\r\n result := StrToDate(S,ShortDateFormat,separator)\r\nend;\r\n\r\nfunction StrToDate(const S: String): TDateTime;\r\nbegin\r\n result := StrToDate(S,ShortDateFormat,#0);\r\nend;\r\n\r\n{ StrToTime converts the string S to a TDateTime value\r\n if S does not represent a valid time value an\r\n EConvertError will be raised }\r\n\r\n\r\nfunction IntStrToTime(Out ErrorMsg : String; const S: String; Len : integer; separator : char): TDateTime;\r\n\r\nconst\r\n AMPM_None = 0;\r\n AMPM_AM = 1;\r\n AMPM_PM = 2;\r\n tiHour = 0;\r\n tiMin = 1;\r\n tiSec = 2;\r\n tiMSec = 3;\r\n\r\ntype\r\n TTimeValues = array of Word;\r\n\r\nvar\r\n AmPm: integer;\r\n TimeValues: TTimeValues;\r\n\r\n\r\n function SplitElements(out TimeValues: TTimeValues; out AmPm: Integer): Boolean;\r\n //Strict version. It does not allow #32 as Separator, it will treat it as whitespace always\r\n const\r\n Digits = '0123456789';\r\n var\r\n Cur, Offset, ElemLen, Err, TimeIndex, FirstSignificantDigit: Integer;\r\n Value: Integer;\r\n DigitPending, MSecPending: Boolean;\r\n AmPmStr: String;\r\n CurChar: Char;\r\n I : Integer;\r\n allowedchars : string;\r\n\r\n begin\r\n Result := False;\r\n AmPm := AMPM_None; //No Am or PM in string found yet\r\n MSecPending := False;\r\n TimeIndex := 0; //indicating which TTimeValue must be filled next\r\n For I:=tiHour to tiMSec do\r\n TimeValues[i]:=0;\r\n Cur := 1;\r\n //skip leading blanks\r\n While (Cur < Len) and (S[Cur] =#32) do Inc(Cur);\r\n Offset := Cur;\r\n //First non-blank cannot be Separator or DecimalSeparator\r\n if (Cur > Len - 1) or (S[Cur] = Separator) or (S[Cur] = Decimalseparator) then\r\n begin\r\n // Writeln('Error in sep S[Cur]',S[Cur],' ',separator,' ',GetDecimalSeparator);\r\n Exit;\r\n end;\r\n DigitPending := (Pos(S[Cur],Digits)>0);\r\n While (Cur <= Len) do\r\n begin\r\n //writeln;\r\n // writeln('Main While loop: Cur = ',Cur,' S[Cur] = \"',S[Cur],'\" Len = ',Len,' separator : ',Separator);\r\n CurChar := S[Cur];\r\n if Pos(CurChar,Digits)>0 then\r\n begin//Digits\r\n //HH, MM, SS, or Msec?\r\n // writeln('Digit: ', CurChar);\r\n //Digits are only allowed after starting Am/PM or at beginning of string or after Separator\r\n //and TimeIndex must be <= tiMSec\r\n //Uncomment \"or (#32 = Separator)\" and it will allllow #32 as separator\r\n if (not (DigitPending {or (#32 = Separator)})) or (TimeIndex > tiMSec) then\r\n begin\r\n // Writeln('DigitPending',ElemLen);\r\n Exit;\r\n end;\r\n OffSet := Cur;\r\n if (CurChar <> '0') then FirstSignificantDigit := OffSet else FirstSignificantDigit := -1;\r\n while (Cur < Len) and (Pos(S[Cur + 1],Digits)>0) do\r\n begin\r\n //Mark first Digit that is not '0'\r\n if (FirstSignificantDigit = -1) and (S[Cur] <> '0') then FirstSignificantDigit := Cur;\r\n Inc(Cur);\r\n end;\r\n if (FirstSignificantDigit = -1) then FirstSignificantDigit := Cur;\r\n ElemLen := 1+ Cur - FirstSignificantDigit;\r\n // writeln(' S[FirstSignificantDigit] = ',S[FirstSignificantDigit], ' S[Cur] = ',S[Cur],' ElemLen = ',ElemLen,' -> ', S[Offset], ElemLen);\r\n // writeln(' Cur = ',Cur);\r\n //this way we know that Val() will never overflow Value !\r\n if (ElemLen <= 2) or ((ElemLen <= 3) and (TimeIndex = tiMSec) ) then\r\n begin\r\n Val(Copy(S,FirstSignificantDigit, ElemLen), Value, Err);\r\n // writeln(' Value = ',Value,' HH = ',TimeValues[0],' MM = ',TimeValues[1],' SS = ',TimeValues[2],' MSec = ',Timevalues[3]);\r\n //This is safe now, because we know Value < High(Word)\r\n TimeValues[TimeIndex] := Value;\r\n Inc(TimeIndex);\r\n DigitPending := False;\r\n end\r\n else\r\n begin\r\n // Writeln('Wrong elemlen: ',ElemLen, ' timeIndex: ',timeindex);\r\n Exit; //Value to big, so it must be a wrong timestring\r\n end;\r\n end//Digits\r\n else if (CurChar = #32) then\r\n begin\r\n //writeln('#32');\r\n //just skip, but we must adress this, or it will be parsed by either AM/PM or Separator\r\n end\r\n else if (CurChar = Separator) then\r\n begin\r\n // writeln('Separator ',Separator);\r\n if DigitPending or (TimeIndex > tiSec) then\r\n begin\r\n // Writeln ('DigitPending ',DigitPending,' or (TimeIndex',Timeindex,' > tiSec,', tiSec,')');\r\n Exit;\r\n end;\r\n DigitPending := True;\r\n MSecPending := False;\r\n end\r\n else if (CurChar = DecimalSeparator) then\r\n begin\r\n //writeln('DecimalSeparator');\r\n if DigitPending or MSecPending or (TimeIndex <> tiMSec) then\r\n begin\r\n // Writeln('DigitPending ',DigitPending,' or MSecPending ',MSecPending,' (',TimeIndex,',Timeindex, >', tiMSec,' tiSec)');\r\n Exit;\r\n end;\r\n DigitPending := True;\r\n MSecPending := True;\r\n end\r\n else\r\n begin//AM/PM?\r\n //None of the above, so this char _must_ be the start of AM/PM string\r\n //If we already have found AM/PM or we expect a digit then then timestring must be wrong at this point\r\n //writeln('AM/PM?');\r\n if (AmPm <> AMPM_None) or DigitPending then\r\n begin\r\n // Writeln('AmPm <> AMPM_None) or DigitPending');\r\n Exit;\r\n end;\r\n OffSet := Cur;\r\n allowedchars:=DecimalSeparator+' ';\r\n if Separator<>#0 then\r\n allowedchars:=allowedchars+Separator;\r\n while (Cur < Len) and (Pos(S[Cur + 1],AllowedChars)=0)\r\n and (Pos(S[Cur + 1],Digits)=0) do Inc(Cur);\r\n ElemLen := 1 + Cur - OffSet;\r\n// writeln(' S[Offset] = ',S[Offset], ' S[Cur] = ',S[Cur],' ElemLen = ',ElemLen,' -> ', S[1+Offset], ElemLen);\r\n// writeln(' Cur = ',Cur, ', S =',S);\r\n AmPmStr := Copy(S,OffSet, ElemLen);\r\n\r\n // writeln('AmPmStr = ',ampmstr,' (',length(ampmstr),')');\r\n //We must compare to TimeAMString before hardcoded 'AM' for delphi compatibility\r\n //Also it is perfectly legal, though insane to have TimeAMString = 'PM' and vice versa\r\n if (CompareText(AmPmStr, TimeAMString) = 0) then AmPm := AMPM_AM\r\n else if (CompareText(AmPmStr, TimePMString) = 0) then AmPm := AMPM_PM\r\n else if (CompareText(AmPmStr, 'AM') = 0) then AmPm := AMPM_AM\r\n else if (CompareText(AmPmStr, 'PM') = 0) then AmPm := AMPM_PM\r\n else\r\n begin\r\n // Writeln('No timestring ',AmPmStr);\r\n Exit; //If text does not match any of these, timestring must be wrong;\r\n end;\r\n //if AM/PM is at beginning of string, then a digit is mandatory after it\r\n if (TimeIndex = tiHour) then\r\n begin\r\n DigitPending := True;\r\n end\r\n //otherwise, no more TimeValues allowed after this\r\n else\r\n begin\r\n TimeIndex := tiMSec + 1;\r\n DigitPending := False;\r\n end;\r\n end;//AM/PM\r\n Inc(Cur)\r\n end;//while\r\n\r\n //If we arrive here, parsing the elements has been successfull\r\n //if not at least Hours specified then input is not valid\r\n //when am/pm is specified Hour must be <= 12 and not 0\r\n if (TimeIndex = tiHour) or ((AmPm <> AMPM_None) and ((TimeValues[tiHour] > 12) or (TimeValues[tiHour] = 0))) or DigitPending then\r\n Exit;\r\n Result := True;\r\n end;\r\n\r\nbegin\r\n setlength(timevalues,4);\r\n if separator = #0 then\r\n if (TimeSeparator<>#0) then\r\n separator := TimeSeparator\r\n else\r\n separator:=':';\r\n AmPm := AMPM_None;\r\n if not SplitElements(TimeValues, AmPm) then\r\n begin\r\n ErrorMsg:=Format(SErrInvalidTimeFormat,[S]);\r\n Exit;\r\n end;\r\n if (AmPm=AMPM_PM) and (TimeValues[tiHour]<>12) then Inc(TimeValues[tiHour], 12)\r\n else if (AmPm=AMPM_AM) and (TimeValues[tiHour]=12) then TimeValues[tiHour]:=0;\r\n // Writeln( TimeValues[tiHour], TimeValues[tiMin], TimeValues[tiSec], TimeValues[tiMSec]);\r\n if not TryEncodeTime(TimeValues[tiHour], TimeValues[tiMin], TimeValues[tiSec], TimeValues[tiMSec], result) Then\r\n\r\n ErrorMsg:=Format(SErrInvalidTimeFormat,[S]);\r\nend ;\r\n\r\nfunction StrToTime(const S: String; separator: char): TDateTime;\r\n\r\nVar\r\n Msg : String;\r\n\r\nbegin\r\n Result:=IntStrToTime(Msg,S,Length(S),Separator);\r\n If (Msg<>'') then\r\n Raise EConvertError.Create(Msg);\r\nend;\r\n\r\nfunction StrToTime(const S: String): TDateTime;\r\nbegin\r\n result:= StrToTime(s, TimeSeparator);\r\nend;\r\n\r\n{ StrToDateTime converts the string S to a TDateTime value\r\n if S does not represent a valid date and/or time value\r\n an EConvertError will be raised }\r\n\r\nfunction SplitDateTimeStr(DateTimeStr: String; out DateStr, TimeStr: String): Integer;\r\n\r\n{ Helper function for StrToDateTime\r\n Pre-condition\r\n Date is before Time\r\n If either Date or Time is omitted then see what fits best, a time or a date (issue #0020522)\r\n Date and Time are separated by whitespace (space Tab, Linefeed or carriage return)\r\n FS.DateSeparator can be the same as FS.TimeSeparator (issue #0020522)\r\n If they are both #32 and TrimWhite(DateTimeStr) contains a #32 a date is assumed.\r\n Post-condition\r\n DateStr holds date as string or is empty\r\n TimeStr holds time as string or is empty\r\n Result = number of strings returned, 0 = error\r\n}\r\nconst\r\n WhiteSpace = #9#10#13#32;\r\n\r\nvar\r\n p: Integer;\r\n DummyDT: TDateTime;\r\nbegin\r\n Result := 0;\r\n DateStr := '';\r\n TimeStr := '';\r\n DateTimeStr := Trim(DateTimeStr);\r\n if Length(DateTimeStr) = 0 then exit;\r\n if (DateSeparator = #32) and (TimeSeparator = #32) and (Pos(#32, DateTimeStr) > 0) then\r\n begin\r\n DateStr:=DateTimeStr;\r\n {\r\n Assume a date: dd [mm [yy]].\r\n Really fancy would be counting the number of whitespace occurrences and decide\r\n and split accordingly\r\n }\r\n Exit(1);\r\n end;\r\n p:=1;\r\n //find separator\r\n if (DateSeparator<>#32) then\r\n begin\r\n while (p0)) do\r\n Inc(p);\r\n end\r\n else\r\n begin\r\n p:=Pos(TimeSeparator, DateTimeStr);\r\n if (p<>0) then\r\n repeat\r\n Dec(p);\r\n until (p=0) or (Pos(DateTimeStr[p],WhiteSpace)>0);\r\n end;\r\n //Always fill DateStr, it eases the algorithm later\r\n if (p=0) then\r\n p:=Length(DateTimeStr);\r\n DateStr:=Copy(DateTimeStr,1,p);\r\n TimeStr:=Trim(Copy(DateTimeStr,p+1,100));\r\n if (Length(TimeStr)<>0) then\r\n Result:=2\r\n else\r\n begin\r\n Result:=1; //found 1 string\r\n // 2 cases when DateTimeStr only contains a time:\r\n // Date/time separator differ, and string contains a timeseparator\r\n // Date/time separators are equal, but transformation to date fails.\r\n if ((DateSeparator<>TimeSeparator) and (Pos(TimeSeparator,DateStr) > 0))\r\n or ((DateSeparator=TimeSeparator) and (not TryStrToDate(DateStr, DummyDT))) then\r\n begin\r\n TimeStr := DateStr;\r\n DateStr := '';\r\n end;\r\n end;\r\nend;\r\n\r\nfunction StrToDateTime(const S: String): TDateTime;\r\n\r\nvar\r\n TimeStr, DateStr: String;\r\n PartsFound: Integer;\r\nbegin\r\n PartsFound := SplitDateTimeStr(S, DateStr, TimeStr);\r\n case PartsFound of\r\n 0: Result:=StrToDate('');\r\n 1: if (Length(DateStr) > 0) then\r\n Result := StrToDate(DateStr,ShortDateFormat,DateSeparator)\r\n else\r\n Result := StrToTime(TimeStr);\r\n 2: Result := ComposeDateTime(StrTodate(DateStr,ShortDateFormat,DateSeparator),\r\n StrToTime(TimeStr));\r\n end;\r\nend;\r\n\r\nfunction FormatDateTime(const FormatStr: string; const DateTime: TDateTime\r\n ): string;\r\n\r\n procedure StoreStr(APos,Len: Integer);\r\n begin\r\n// Writeln('StoreStr: ',Result,'+',Copy(FormatStr,APos,Len));\r\n Result:=Result+Copy(FormatStr,APos,Len);\r\n end;\r\n\r\n procedure StoreString(const AStr: string);\r\n\r\n begin\r\n// Writeln('StoreString: ',Result,'+',AStr);\r\n Result:=Result+AStr;\r\n end;\r\n\r\n procedure StoreInt(Value, Digits: Integer);\r\n var\r\n S: string;\r\n\r\n begin\r\n S:=IntToStr(Value);\r\n While (Length(S) 1 then // 0 is original string, 1 is included FormatString\r\n Exit;\r\n FormatCurrent := 1;\r\n FormatEnd := Length(FormatStr);\r\n Clock12 := false;\r\n isInterval := false;\r\n // look for unquoted 12-hour clock token\r\n P:=1;\r\n while P<=FormatEnd do\r\n begin\r\n Token := FormatStr[P];\r\n case Token of\r\n '''', '\"':\r\n begin\r\n Inc(P);\r\n while (P < FormatEnd) and (FormatStr[P]<>Token) do\r\n Inc(P);\r\n end;\r\n 'A', 'a':\r\n begin\r\n if (CompareText(Copy(FormatStr,P,3),'A/P')=0) or\r\n (CompareText(Copy(FormatStr,P,4),'AMPM')=0) or\r\n (CompareText(Copy(FormatStr,P,5),'AM/PM')=0) then\r\n begin\r\n Clock12 := true;\r\n break;\r\n end;\r\n end;\r\n end; // case\r\n Inc(P);\r\n end ;\r\n token := #255;\r\n lastformattoken := ' ';\r\n prevlasttoken := 'H';\r\n while FormatCurrent <= FormatEnd do\r\n begin\r\n Token := UpperCase(FormatStr[FormatCurrent])[1];\r\n // Writeln('Treating token at pos ',FormatCurrent,', : ',Token,' (',FormatStr,')');\r\n Count := 1;\r\n P := FormatCurrent + 1;\r\n case Token of\r\n '''', '\"':\r\n begin\r\n while (P < FormatEnd) and (FormatStr[P]<>Token) do\r\n Inc(P);\r\n Inc(P);\r\n Count := P - FormatCurrent;\r\n StoreStr(FormatCurrent + 1, Count - 2);\r\n end ;\r\n 'A':\r\n begin\r\n if CompareText(Copy(FormatStr,FormatCurrent,4), 'AMPM') = 0 then\r\n begin\r\n Count := 4;\r\n if Hour < 12 then\r\n StoreString(TimeAMString)\r\n else\r\n StoreString(TimePMString);\r\n end\r\n else if CompareText(Copy(FormatStr,FormatCurrent,5), 'AM/PM') = 0 then\r\n begin\r\n Count := 5;\r\n if Hour < 12 then StoreStr(FormatCurrent, 2)\r\n else StoreStr(FormatCurrent+3, 2);\r\n end\r\n else if CompareText(Copy(FormatStr,FormatCurrent,3), 'A/P') = 0 then\r\n begin\r\n Count := 3;\r\n if Hour < 12 then StoreStr(FormatCurrent, 1)\r\n else StoreStr(FormatCurrent+2, 1);\r\n end\r\n else\r\n raise EConvertError.Create('Illegal character in format string');\r\n end ;\r\n '/':\r\n begin\r\n // Writeln('Detected date separator');\r\n StoreString(DateSeparator);\r\n end;\r\n ':': StoreString(TimeSeparator);\r\n ' ', 'C', 'D', 'H', 'M', 'N', 'S', 'T', 'Y', 'Z', 'F' :\r\n begin\r\n // Writeln(FormatCurrent,' Special Token: ',Token,', Count: ',Count,', P: ',P);\r\n while (P <= FormatEnd) and (UpperCase(FormatStr[P]) = Token) do\r\n Inc(P);\r\n Count := P - FormatCurrent;\r\n // Writeln(FormatCurrent,' Special Token: ',Token,', Count: ',Count,', P: ',P);\r\n case Token of\r\n ' ': StoreStr(FormatCurrent, Count);\r\n 'Y': begin\r\n if Count > 2 then\r\n StoreInt(Year, 4)\r\n else\r\n StoreInt(Year mod 100, 2);\r\n end;\r\n 'M': begin\r\n\t if isInterval and ((prevlasttoken = 'H') or TimeFlag) then\r\n\t StoreInt(Minute + (Hour + trunc(abs(DateTime))*24)*60, 0)\r\n\t else\r\n if (lastformattoken = 'H') or TimeFlag then\r\n begin\r\n if Count = 1 then\r\n StoreInt(Minute, 0)\r\n else\r\n StoreInt(Minute, 2);\r\n end\r\n else\r\n begin\r\n case Count of\r\n 1: StoreInt(Month, 0);\r\n 2: StoreInt(Month, 2);\r\n 3: StoreString(ShortMonthNames[Month]);\r\n else\r\n StoreString(LongMonthNames[Month]);\r\n end;\r\n end;\r\n end;\r\n 'D': begin\r\n case Count of\r\n 1: StoreInt(Day, 0);\r\n 2: StoreInt(Day, 2);\r\n 3: StoreString(ShortDayNames[DayOfWeek]);\r\n 4: StoreString(LongDayNames[DayOfWeek]);\r\n 5: StoreFormat(ShortDateFormat, Nesting+1, False);\r\n else\r\n StoreFormat(LongDateFormat, Nesting+1, False);\r\n end ;\r\n end ;\r\n 'H':\r\n\t if isInterval then\r\n\t StoreInt(Hour + trunc(abs(DateTime))*24, 0)\r\n\t else\r\n\t if Clock12 then\r\n begin\r\n tmp := hour mod 12;\r\n if tmp=0 then tmp:=12;\r\n if Count = 1 then\r\n StoreInt(tmp, 0)\r\n else\r\n StoreInt(tmp, 2);\r\n end\r\n else begin\r\n if Count = 1 then\r\n\t\t StoreInt(Hour, 0)\r\n else\r\n StoreInt(Hour, 2);\r\n end;\r\n 'N': if isInterval then\r\n\t StoreInt(Minute + (Hour + trunc(abs(DateTime))*24)*60, 0)\r\n\t\t else\r\n\t\t if Count = 1 then\r\n StoreInt(Minute, 0)\r\n else\r\n StoreInt(Minute, 2);\r\n 'S': if isInterval then\r\n\t StoreInt(Second + (Minute + (Hour + trunc(abs(DateTime))*24)*60)*60, 0)\r\n\t else\r\n\t if Count = 1 then\r\n StoreInt(Second, 0)\r\n else\r\n StoreInt(Second, 2);\r\n 'Z': if Count = 1 then\r\n StoreInt(MilliSecond, 0)\r\n else\r\n\t\t StoreInt(MilliSecond, 3);\r\n 'T': if Count = 1 then\r\n\t\t StoreFormat(ShortTimeFormat, Nesting+1, True)\r\n else\r\n\t StoreFormat(LongTimeFormat, Nesting+1, True);\r\n 'C': begin\r\n StoreFormat(ShortDateFormat, Nesting+1, False);\r\n if (Hour<>0) or (Minute<>0) or (Second<>0) then\r\n begin\r\n StoreString(' ');\r\n StoreFormat(LongTimeFormat, Nesting+1, True);\r\n end;\r\n end;\r\n 'F': begin\r\n StoreFormat(ShortDateFormat, Nesting+1, False);\r\n StoreString(' ');\r\n StoreFormat(LongTimeFormat, Nesting+1, True);\r\n end;\r\n end;\r\n\t prevlasttoken := lastformattoken;\r\n lastformattoken := token;\r\n end;\r\n else\r\n StoreString(Token);\r\n end ;\r\n Inc(FormatCurrent, Count);\r\n end;\r\n end;\r\n\r\nbegin\r\n DecodeDateFully(DateTime, Year, Month, Day, DayOfWeek);\r\n DecodeTime(DateTime, Hour, Minute, Second, MilliSecond);\r\n // Writeln(DateTime,'->',Year,',', Month, ',',Day, ',',DayOfWeek,',',Hour, ',',Minute, ',',Second, ',',MilliSecond);\r\n if FormatStr <> '' then\r\n StoreFormat(FormatStr, 0, False)\r\n else\r\n StoreFormat('C', 0, False);\r\nend ;\r\n\r\n\r\n\r\nfunction CurrentYear: Word;\r\n\r\nbegin\r\n Result:=TJSDate.New().FullYear;\r\nend;\r\n\r\nfunction TryStrToDate(const S: String; out Value: TDateTime): Boolean;\r\nbegin\r\n Result:=TryStrToDate(S,Value,ShortDateFormat,#0);\r\nend;\r\n\r\nfunction TryStrToDate(const S: String; out Value: TDateTime; separator : char): Boolean;\r\n\r\nbegin\r\n Result:=TryStrToDate(S,Value,ShortDateFormat,Separator);\r\nend;\r\n\r\nfunction TryStrToDate(const S: String; out Value: TDateTime;\r\n const useformat : string; separator : char): Boolean;\r\n\r\nVar\r\n Msg : String;\r\n\r\nbegin\r\n Result:=Length(S)<>0;\r\n If Result then\r\n begin\r\n Value:=IntStrToDate(Msg,S,useformat,Separator);\r\n Result:=(Msg='');\r\n end;\r\nend;\r\n\r\n\r\n\r\n\r\nfunction TryStrToTime(const S: String; out Value: TDateTime; separator : char): Boolean;\r\nVar\r\n Msg : String;\r\nbegin\r\n Result:=Length(S)<>0;\r\n If Result then\r\n begin\r\n Value:=IntStrToTime(Msg,S,Length(S),Separator);\r\n Result:=(Msg='');\r\n end;\r\nend;\r\n\r\nfunction TryStrToTime(const S: String; out Value: TDateTime): Boolean;\r\nbegin\r\n result:=TryStrToTime(S,Value,#0);\r\nend;\r\n\r\nfunction TryStrToDateTime(const S: String; out Value: TDateTime): Boolean;\r\n\r\nvar\r\n I: integer;\r\n dtdate, dttime :TDateTime;\r\nbegin\r\n result:=false;\r\n I:=Pos(TimeSeparator,S);\r\n If (I>0) then\r\n begin\r\n While (I>0) and (S[I]<>' ') do\r\n Dec(I);\r\n If I>0 then\r\n begin\r\n if not TryStrToDate(Copy(S,1,I-1),dtdate) then\r\n exit;\r\n if not TryStrToTime(Copy(S,i+1, Length(S)-i),dttime) then\r\n exit;\r\n Value:=ComposeDateTime(dtdate,dttime);\r\n result:=true;\r\n end\r\n else\r\n result:=TryStrToTime(s,Value);\r\n end\r\n else\r\n result:=TryStrToDate(s,Value);\r\nend;\r\n\r\n\r\n\r\nfunction StrToDateDef(const S: String; const Defvalue : TDateTime): TDateTime;\r\nbegin\r\n result := StrToDateDef(S,DefValue,#0);\r\nend;\r\n\r\nfunction StrToTimeDef(const S: String; const Defvalue : TDateTime): TDateTime;\r\nbegin\r\n result := StrToTimeDef(S,DefValue,#0);\r\nend;\r\n\r\nfunction StrToDateTimeDef(const S: String; const Defvalue : TDateTime): TDateTime;\r\nbegin\r\n if not TryStrToDateTime(s,Result) Then\r\n result:=defvalue;\r\nend;\r\n\r\nfunction StrToDateDef(const S: String; const Defvalue : TDateTime; separator : char): TDateTime;\r\nbegin\r\n if not TryStrToDate(s,Result, separator) Then\r\n result:=defvalue;\r\nend;\r\n\r\nfunction StrToTimeDef(const S: String; const Defvalue : TDateTime; separator : char): TDateTime;\r\nbegin\r\n if not TryStrToTime(s,Result, separator) Then\r\n result:=defvalue;\r\nend;\r\n\r\nprocedure ReplaceTime(var dati:TDateTime; NewTime : TDateTime);\r\nbegin\r\n dati:= ComposeDateTime(dati, newtime);\r\nend;\r\n\r\nprocedure ReplaceDate(var DateTime: TDateTime; const NewDate: TDateTime);\r\nvar\r\n tmp : TDateTime;\r\nbegin\r\n tmp:=NewDate;\r\n ReplaceTime(tmp,DateTime);\r\n DateTime:=tmp;\r\nend;\r\n\r\nfunction FloatToDateTime(const Value: Extended): TDateTime;\r\nbegin\r\n If (ValueMaxDateTime) then\r\n Raise EConvertError.CreateFmt (SInvalidDateTime,[FloatToStr(Value)]);\r\n Result:=Value;\r\nend;\r\n\r\nfunction FloattoCurr(const Value: Extended): Currency;\r\nbegin\r\n if not TryFloatToCurr(Value, Result) then\r\n Raise EConvertError.CreateFmt(SInvalidCurrency, [FloatToStr(Value)]);\r\nend;\r\n\r\nfunction TryFloatToCurr(const Value: Extended; var AResult: Currency): Boolean;\r\nbegin\r\n Result:=(Value>=MinCurrency) and (Value<=MaxCurrency);\r\n if Result then\r\n AResult := Value;\r\nend;\r\n\r\nfunction CurrToStr(Value: Currency): string;\r\nbegin\r\n Result:=FloatToStrF(Value,ffGeneral,-1,0);\r\nend;\r\n\r\n(*\r\nfunction CurrToStr(Value: Currency; const FormatSettings: TFormatSettings): string;\r\nbegin\r\n\r\nend;\r\n*)\r\n\r\nfunction StrToCurr(const S: string): Currency;\r\n\r\nbegin\r\n if not TryStrToCurr(S,Result) then\r\n Raise EConvertError.createfmt(SInvalidCurrency,[S]);\r\nend;\r\n\r\n(*\r\nfunction StrToCurr(const S: string; const FormatSettings: TFormatSettings): Currency;\r\nbegin\r\n\r\nend;\r\n*)\r\n\r\nfunction TryStrToCurr(const S: string; out Value: Currency): Boolean;\r\n\r\nVar\r\n D : Double;\r\n\r\nbegin\r\n Result:=TryStrToFloat(S,D);\r\n if Result then\r\n Value:=D;\r\nend;\r\n\r\n(*\r\nfunction TryStrToCurr(const S: string; out Value: Currency; const FormatSettings: TFormatSettings): Boolean;\r\nbegin\r\n\r\nend;\r\n*)\r\n\r\nfunction StrToCurrDef(const S: string; Default: Currency): Currency;\r\n\r\nVar\r\n R : Currency;\r\n\r\nbegin\r\n if TryStrToCurr(S,R) then\r\n Result:=R\r\n else\r\n Result:=Default;\r\nend;\r\n\r\n(*\r\nfunction StrToCurrDef(const S: string; Default: Currency; const FormatSettings: TFormatSettings): Currency;\r\nbegin\r\n\r\nend;\r\n*)\r\n\r\n{ ---------------------------------------------------------------------\r\n Interface related\r\n ---------------------------------------------------------------------}\r\nfunction Supports(const Instance: IInterface; const AClass: TClass; out Obj\r\n ): Boolean;\r\nbegin\r\n Result := (Instance<>nil) and (Instance.QueryInterface(IObjectInstance,Obj)=S_OK)\r\n and (TObject(Obj).InheritsFrom(AClass));\r\nend;\r\n\r\nfunction Supports(const Instance: IInterface; const IID: TGuid; out Intf\r\n ): Boolean;\r\nbegin\r\n Result:=(Instance<>nil) and (Instance.QueryInterface(IID,Intf)=S_OK);\r\nend;\r\n\r\nfunction Supports(const Instance: TObject; const IID: TGuid; out Intf): Boolean;\r\nbegin\r\n Result:=(Instance<>nil) and Instance.GetInterface(IID,Intf);\r\nend;\r\n\r\nfunction Supports(const Instance: TObject; const IID: TGuidString; out Intf\r\n ): Boolean;\r\nbegin\r\n Result:=(Instance<>nil) and Instance.GetInterfaceByStr(IID,Intf);\r\nend;\r\n\r\nfunction Supports(const Instance: IInterface; const AClass: TClass): Boolean;\r\nvar\r\n Temp: TObject;\r\nbegin\r\n Result:=Supports(Instance,AClass,Temp);\r\nend;\r\n\r\nfunction Supports(const Instance: IInterface; const IID: TGuid): Boolean;\r\nvar\r\n Temp: IInterface;\r\nbegin\r\n Result:=Supports(Instance,IID,Temp);\r\nend;\r\n\r\nfunction Supports(const Instance: TObject; const IID: TGuid): Boolean;\r\nvar\r\n Temp: TJSObject;\r\nbegin\r\n Result:=Supports(Instance,IID,Temp);\r\n asm\r\n if (Temp && Temp.$kind==='com') Temp._Release();\r\n end;\r\nend;\r\n\r\nfunction Supports(const Instance: TObject; const IID: TGuidString): Boolean;\r\nvar\r\n Temp: TJSObject;\r\nbegin\r\n Result:=Supports(Instance,IID,Temp);\r\n asm\r\n if (Temp && Temp.$kind==='com') Temp._Release();\r\n end;\r\nend;\r\n\r\nfunction Supports(const AClass: TClass; const IID: TGuid): Boolean;\r\nvar\r\n maps: JSValue;\r\nbegin\r\n if AClass=nil then exit(false);\r\n maps := TJSObject(AClass)['$intfmaps'];\r\n if not maps then exit(false);\r\n if TJSObject(maps)[GUIDToString(IID)] then exit(true);\r\n Result:=false;\r\nend;\r\n\r\nfunction Supports(const AClass: TClass; const IID: TGuidString): Boolean;\r\nvar\r\n maps: JSValue;\r\nbegin\r\n if AClass=nil then exit(false);\r\n maps := TJSObject(AClass)['$intfmaps'];\r\n if not maps then exit(false);\r\n if TJSObject(maps)[uppercase(IID)] then exit(true);\r\n Result:=false;\r\nend;\r\n\r\nfunction TryStringToGUID(const s: string; out Guid: TGuid): Boolean;\r\nvar\r\n re: TJSRegexp;\r\nbegin\r\n if Length(s)<>38 then Exit(False);\r\n re:=TJSRegexp.new('^\\{[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}\\}$');\r\n Result:=re.test(s);\r\n if not Result then\r\n begin\r\n Guid.D1:=0;\r\n exit;\r\n end;\r\n asm\r\n rtl.strToGUIDR(s,Guid);\r\n end;\r\n Result:=true;\r\nend;\r\n\r\nfunction StringToGUID(const S: string): TGuid;\r\nbegin\r\n if not TryStringToGUID(S, Result) then\r\n raise EConvertError.CreateFmt(SInvalidGUID, [S]);\r\nend;\r\n\r\nfunction GUIDToString(const guid: TGuid): string;\r\nbegin\r\n Result:=System.GUIDToString(guid);\r\nend;\r\n\r\nfunction IsEqualGUID(const guid1, guid2: TGuid): Boolean;\r\nvar\r\n i: integer;\r\nbegin\r\n if (guid1.D1<>guid2.D1) or (guid1.D2<>guid2.D2) or (guid1.D3<>guid2.D3) then\r\n exit(false);\r\n for i:=0 to 7 do if guid1.D4[i]<>guid2.D4[i] then exit(false);\r\n Result:=true;\r\nend;\r\n\r\nfunction GuidCase(const guid: TGuid; const List: array of TGuid): Integer;\r\nbegin\r\n for Result := High(List) downto 0 do\r\n if IsEqualGUID(guid, List[Result]) then\r\n Exit;\r\n Result := -1;\r\nend;\r\n\r\nfunction CreateGUID(out GUID: TGUID): Integer;\r\n\r\n Function R(B: Integer) : NativeInt;\r\n\r\n Var\r\n v : NativeInt;\r\n begin\r\n v:=Random(256);\r\n While B>1 do\r\n begin\r\n v:=v*256+Random(256);\r\n Dec(B);\r\n end;\r\n Result:=V;\r\n end;\r\n\r\nVar\r\n I : Integer;\r\n\r\nbegin\r\n Result:=0;\r\n GUID.D1:= R(4);\r\n GUID.D2:= R(2);\r\n GUID.D3:= R(2);\r\n For I:=0 to 7 do\r\n GUID.D4[I]:=R(1);\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n Integer/Ordinal related\r\n ---------------------------------------------------------------------}\r\n\r\nfunction TryStrToInt(const S: String; out res: Integer): Boolean;\r\n\r\nVar\r\n NI : NativeInt;\r\n\r\nbegin\r\n Result:=TryStrToInt(S,NI);\r\n if Result then\r\n res:=NI;\r\nend;\r\n\r\nfunction TryStrToInt(const S: String; out res: NativeInt): Boolean;\r\n\r\nVar\r\n Radix : Integer = 10;\r\n N : String;\r\n J : JSValue;\r\n\r\nbegin\r\n N:=S;\r\n // Javascript Parseint allows 1.0 or 1E0 to be an integer, so we must check for this to get the same behaviour as FPC/Delphi.\r\n if (Pos(DecimalSeparator,N)<>0) or (Pos('.',N)<>0) then\r\n exit(False);\r\n case Copy(N,1,1) of\r\n '$': Radix:=16;\r\n '&': Radix:=8;\r\n '%': Radix:=2;\r\n end;\r\n // Check for E after we know radix\r\n if (Radix<>16) and (Pos('e',LowerCase(N))<>0) then\r\n exit(False);\r\n If Radix<>10 then\r\n Delete(N,1,1);\r\n J:=parseInt(N,Radix);\r\n Result:=Not jsIsNan(j);\r\n if Result then\r\n res:=NativeInt(J);\r\nend;\r\n\r\nfunction StrToIntDef(const S: String; const aDef: Integer): Integer;\r\n\r\nVar\r\n R : NativeInt;\r\n\r\nbegin\r\n if TryStrToInt(S,R) then\r\n Result:=R\r\n else\r\n Result:=aDef;\r\nend;\r\n\r\nfunction StrToIntDef(const S: String; const aDef: NativeInt): NativeInt;\r\n\r\nVar\r\n R : NativeInt;\r\n\r\nbegin\r\n if TryStrToInt(S,R) then\r\n Result:=R\r\n else\r\n Result:=aDef;\r\nend;\r\n\r\nfunction StrToInt(const S: String): Integer;\r\n\r\nVar\r\n R : NativeInt;\r\n\r\nbegin\r\n if not TryStrToInt(S,R) then\r\n Raise EConvertError.CreateFmt(SErrInvalidInteger,[S]);\r\n Result:=R;\r\nend;\r\n\r\nfunction StrToNativeInt(const S: String): NativeInt;\r\n\r\nbegin\r\n if not TryStrToInt(S,Result) then\r\n Raise EConvertError.CreateFmt(SErrInvalidInteger,[S]);\r\nend;\r\n\r\nfunction StrToInt64(const S: String): NativeLargeInt;\r\n\r\nVar\r\n N : NativeInt;\r\n\r\nbegin\r\n if not TryStrToInt(S,N) then\r\n Raise EConvertError.CreateFmt(SErrInvalidInteger,[S]);\r\n Result:=N;\r\nend;\r\n\r\nfunction TryStrToInt64(const S: String; out res: NativeLargeInt): Boolean;\r\n\r\nVar\r\n R : nativeint;\r\n\r\nbegin\r\n Result:=TryStrToInt(S,R);\r\n If Result then\r\n Res:=R;\r\nend;\r\n\r\nfunction StrToInt64Def(const S: String; ADefault: NativeLargeInt\r\n ): NativeLargeInt;\r\n\r\n\r\nbegin\r\n if not TryStrToInt64(S,Result) then\r\n Result:=ADefault;\r\nend;\r\n\r\nfunction StrToQWord(const S: String): NativeLargeUInt;\r\n\r\nVar\r\n N : NativeInt;\r\n\r\nbegin\r\n if (not TryStrToInt(S,N)) or (N<0) then\r\n Raise EConvertError.CreateFmt(SErrInvalidInteger,[S]);\r\n Result:=N;\r\nend;\r\n\r\nfunction TryStrToQWord(const S: String; out res: NativeLargeUInt): Boolean;\r\n\r\nVar\r\n R : nativeint;\r\n\r\nbegin\r\n Result:=TryStrToInt(S,R) and (R>=0);\r\n If Result then\r\n Res:=R;\r\nend;\r\n\r\nfunction StrToQWordDef(const S: String; ADefault: NativeLargeUInt\r\n ): NativeLargeUInt;\r\n\r\nbegin\r\n if Not TryStrToQword(S,Result) then\r\n Result:=ADefault;\r\nend;\r\n\r\n\r\nfunction StrToUInt64(const S: String): NativeLargeUInt;\r\n\r\nVar\r\n N : NativeInt;\r\n\r\nbegin\r\n if (not TryStrToInt(S,N)) or (N<0) then\r\n Raise EConvertError.CreateFmt(SErrInvalidInteger,[S]);\r\n Result:=N;\r\nend;\r\n\r\nfunction TryStrToUInt64(const S: String; out res: NativeLargeUInt): Boolean;\r\n\r\nVar\r\n R : nativeint;\r\n\r\nbegin\r\n Result:=TryStrToInt(S,R) and (R>=0);\r\n If Result then\r\n Res:=R;\r\nend;\r\n\r\nfunction StrToUInt64Def(const S: String; ADefault: NativeLargeUInt\r\n ): NativeLargeUInt;\r\n\r\n\r\nbegin\r\n if Not TryStrToUInt64(S,Result) then\r\n Result:=ADefault;\r\nend;\r\n\r\nfunction TryStrToDWord(const S: String; out res: DWord): Boolean;\r\n\r\nVar\r\n R : nativeint;\r\n\r\nbegin\r\n Result:=TryStrToInt(S,R) and (R>=0) and (R<=DWord($FFFFFFFF));\r\n If Result then\r\n Res:=R;\r\nend;\r\n\r\nfunction StrToDWord(const S: String): DWord;\r\n\r\nbegin\r\n if not TryStrToDWord(S,Result) then\r\n Raise EConvertError.CreateFmt(SErrInvalidInteger,[S]);\r\nend;\r\n\r\n\r\nfunction StrToDWordDef(const S: String; ADefault: DWord): DWord;\r\n\r\nbegin\r\n if Not TryStrToDWord(S,Result) then\r\n Result:=ADefault;\r\nend;\r\n\r\n\r\nfunction IntToHex(Value: NativeInt; Digits: integer): string;\r\n\r\nbegin\r\n// Result:=HexStr(Value,Digits); // TestNegLongintHelper Failed: \"ToHexString\" expected: but was: <00-20000> !\r\n Result:='';\r\n if Value<0 then\r\n asm\r\n if (Value<0) Value = 0xFFFFFFFF + Value + 1;\r\n end;\r\n asm\r\n Result=Value.toString(16);\r\n end;\r\n Result:=UpperCase(Result);\r\n while (Length(Result) 0) and not(FileName[I] in EndSep) do\r\n Dec(I);\r\n if (I = 0) or (FileName[I] <> ExtensionSeparator) then\r\n I := Length(FileName)+1\r\n else\r\n begin\r\n SOF:=(I=1) or (FileName[i-1] in AllowDirectorySeparators);\r\n if (SOF) and not FirstDotAtFileNameStartIsExtension then\r\n I:=Length(FileName)+1;\r\n end;\r\n Result := Copy(FileName, 1, I - 1) + Extension;\r\nend;\r\n\r\nfunction ExtractFilePath(const FileName: PathStr): PathStr;\r\nvar\r\n i : longint;\r\n EndSep : Set of Char;\r\nbegin\r\n i := Length(FileName);\r\n EndSep:=AllowDirectorySeparators+AllowDriveSeparators;\r\n while (i > 0) and not CharInSet(FileName[i],EndSep) do\r\n Dec(i);\r\n If I>0 then\r\n Result := Copy(FileName, 1, i)\r\n else\r\n Result:='';\r\nend;\r\n\r\nfunction ExtractFileDir(const FileName: PathStr): PathStr;\r\nvar\r\n i : longint;\r\n EndSep : Set of Char;\r\nbegin\r\n I := Length(FileName);\r\n EndSep:=AllowDirectorySeparators+AllowDriveSeparators;\r\n while (I > 0) and not CharInSet(FileName[I],EndSep) do\r\n Dec(I);\r\n if (I > 1) and CharInSet(FileName[I],AllowDirectorySeparators) and\r\n not CharInSet(FileName[I - 1],EndSep) then\r\n Dec(I);\r\n Result := Copy(FileName, 1, I);\r\nend;\r\n\r\nfunction ExtractFileDrive(const FileName: PathStr): PathStr;\r\nvar\r\n i,l: longint;\r\nbegin\r\n Result := '';\r\n l:=Length(FileName);\r\n if (l<2) then\r\n exit;\r\n If CharInSet(FileName[2],AllowDriveSeparators) then\r\n result:=Copy(FileName,1,2)\r\n else if CharInSet(FileName[1],AllowDirectorySeparators) and\r\n CharInSet(FileName[2],AllowDirectorySeparators) then\r\n begin\r\n i := 2;\r\n\r\n { skip share }\r\n While (i 0) and not CharInSet(FileName[I],EndSep) do\r\n Dec(I);\r\n Result := Copy(FileName, I + 1, MaxInt);\r\nend;\r\n\r\nfunction ExtractFileExt(const FileName: PathStr): PathStr;\r\nvar\r\n i : longint;\r\n EndSep : Set of Char;\r\n SOF : Boolean; // Dot at Start of filename ?\r\n\r\nbegin\r\n Result:='';\r\n I := Length(FileName);\r\n EndSep:=AllowDirectorySeparators+AllowDriveSeparators+[ExtensionSeparator];\r\n while (I > 0) and not CharInSet(FileName[I],EndSep) do\r\n Dec(I);\r\n if (I > 0) and (FileName[I] = ExtensionSeparator) then\r\n begin\r\n SOF:=(I=1) or (FileName[i-1] in AllowDirectorySeparators);\r\n if (Not SOF) or FirstDotAtFileNameStartIsExtension then\r\n Result := Copy(FileName, I, MaxInt);\r\n end\r\n else\r\n Result := '';\r\nend;\r\n\r\nfunction ExtractRelativepath(const BaseName, DestName: PathStr): PathStr;\r\n\r\nVar\r\n OneLevelBack,Source, Dest : PathStr;\r\n Sc,Dc,I,J : Longint;\r\n SD,DD : TPathStrArray;\r\n\r\n\r\nbegin\r\n OneLevelBack := '..'+PathDelim;\r\n If Uppercase(ExtractFileDrive(BaseName))<>Uppercase(ExtractFileDrive(DestName)) Then\r\n begin\r\n Result:=DestName;\r\n exit;\r\n end;\r\n Source:=ExcludeTrailingPathDelimiter(ExtractFilePath(BaseName));\r\n Dest:=ExcludeTrailingPathDelimiter(ExtractFilePath(DestName));\r\n SD:=GetDirs (Source);\r\n SC:=Length(SD);\r\n DD:=GetDirs (Dest);\r\n DC:=Length(SD);\r\n I:=0;\r\n While (I'') then\r\n begin\r\n Result[L]:=D;\r\n Inc(L);\r\n end;\r\n J:=I;\r\n end;\r\n Inc(I);\r\n end;\r\n SetLength(Result,L);\r\nend;\r\n\r\nfunction IncludeTrailingPathDelimiter(const Path: PathStr): PathStr;\r\n\r\nVar\r\n l : Integer;\r\n\r\nbegin\r\n Result:=Path;\r\n l:=Length(Result);\r\n If (L=0) or not CharInSet(Result[l],AllowDirectorySeparators) then\r\n Result:=Result+PathDelim;\r\nend;\r\n\r\nfunction ExcludeTrailingPathDelimiter(const Path: PathStr): PathStr;\r\n\r\nVar\r\n L : Integer;\r\n\r\nbegin\r\n L:=Length(Path);\r\n If (L>0) and CharInSet(Path[L],AllowDirectorySeparators) then\r\n Dec(L);\r\n Result:=Copy(Path,1,L);\r\nend;\r\n\r\nfunction IncludeLeadingPathDelimiter(const Path: PathStr): PathStr;\r\n\r\nVar\r\n l : Integer;\r\n\r\nbegin\r\n Result:=Path;\r\n l:=Length(Result);\r\n If (L=0) or not CharInSet(Result[1],AllowDirectorySeparators) then\r\n Result:=PathDelim+Result;\r\nend;\r\n\r\nfunction ExcludeLeadingPathDelimiter(const Path: PathStr): PathStr;\r\n\r\nVar\r\n L : Integer;\r\n\r\nbegin\r\n Result:=Path;\r\n L:=Length(Result);\r\n If (L>0) and CharInSet(Result[1],AllowDirectorySeparators) then\r\n Delete(Result,1,1);\r\nend;\r\n\r\nfunction IsPathDelimiter(const Path: PathStr; Index: Integer): Boolean;\r\n\r\nbegin\r\n Result:=(Index>0) and (Index<=Length(Path)) and CharInSet(Path[Index],AllowDirectorySeparators);\r\nend;\r\n\r\nfunction ConcatPaths(const Paths: array of PathStr): PathStr;\r\nvar\r\n I: Integer;\r\nbegin\r\n if Length(Paths) > 0 then\r\n begin\r\n Result := Paths[0];\r\n for I := 1 to Length(Paths) - 1 do\r\n Result := IncludeTrailingPathDelimiter(Result) + ExcludeLeadingPathDelimiter(Paths[I]);\r\n end else\r\n Result := '';\r\nend;\r\n\r\nFunction EncodeHTMLEntities (S : String) : String;\r\n\r\nbegin\r\n Result:='';\r\n if S='' then exit;\r\n asm\r\n return S.replace(/[\\u00A0-\\u9999<>\\&]/gim, function(i) {\r\n return '&#'+i.charCodeAt(0)+';';\r\n });\r\n end;\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n Type helpers implementation\r\n ---------------------------------------------------------------------}\r\n\r\n{ ---------------------------------------------------------------------\r\n TGUIDHelper\r\n ---------------------------------------------------------------------}\r\n\r\nProcedure NotImplemented(S : String);\r\n\r\nbegin\r\n Raise Exception.Create('Not yet implemented : '+S);\r\nend;\r\n\r\nclass function TGuidHelper.Create(Src: TGUID; BigEndian: Boolean): TGUID;\r\nbegin\r\n Result:=Src;\r\n if Not Bigendian then\r\n begin\r\n Result.D1:=SwapEndian(Result.D1);\r\n Result.D2:=SwapEndian(Result.D2);\r\n Result.D3:=SwapEndian(Result.D3);\r\n end;\r\nend;\r\n\r\nclass function TGuidHelper.Create(const Buf: TJSArrayBuffer; AStartIndex: Cardinal; BigEndian: Boolean): TGUID;\r\n\r\nVar\r\n A : Cardinal;\r\n B,C : Word;\r\n V : TJSDataView;\r\n\r\nbegin\r\n V:=TJSDataView.New(Buf);\r\n // The get functions return by default correct endianness.\r\n if BigEndian then\r\n begin\r\n A:=V.getUint32(aStartIndex);\r\n B:=V.getUint16(AStartIndex+4);\r\n C:=V.getUint16(AStartIndex+6);\r\n end\r\n else\r\n begin\r\n A:=SwapEndian(V.getUint32(aStartIndex));\r\n B:=SwapEndian(V.getUint16(AStartIndex+4));\r\n C:=SwapEndian(V.getUint16(AStartIndex+6));\r\n end;\r\n Result:=Create(A,B,C,V.GetUint8(AStartIndex+8),V.GetUint8(AStartIndex+9),V.GetUint8(AStartIndex+10),V.GetUint8(AStartIndex+11),V.GetUint8(AStartIndex+12),V.GetUint8(AStartIndex+13),V.GetUint8(AStartIndex+14),V.GetUint8(AStartIndex+15));\r\nend;\r\n\r\n\r\nclass function TGuidHelper.Create(const Data: array of Byte; AStartIndex: Cardinal; BigEndian: Boolean): TGUID;\r\n\r\nVar\r\n D : TJSUint8Array;\r\n\r\nbegin\r\n if ((System.Length(Data)-AStartIndex)<16) then\r\n raise EArgumentException.CreateFmt('The length of a GUID array must be at least %d',[]);\r\n D:=TJSUint8Array.From(Data);\r\n Result:=Create(D.buffer,aStartIndex,BigEndian);\r\nend;\r\n\r\n\r\nclass function TGuidHelper.Create(const B: TBytes; DataEndian: TEndian): TGUID;\r\n\r\nbegin\r\n Result:=Create(B,0,DataEndian);\r\nend;\r\n\r\nclass function TGuidHelper.Create(const B: TBytes; AStartIndex: Cardinal; DataEndian: TEndian): TGUID;\r\n\r\nbegin\r\n if ((System.Length(B)-AStartIndex)<16) then\r\n raise EArgumentException.CreateFmt('The length of a GUID array must be at least %d',[]);\r\n Result:=Create(B,AStartIndex,DataEndian=TEndian.Big);\r\nend;\r\n\r\nclass function TGuidHelper.Create(const S: string): TGUID;\r\n\r\nbegin\r\n Result:=StringToGUID(S);\r\nend;\r\n\r\nclass function TGuidHelper.Create(A: Integer; B: SmallInt; C: SmallInt; const D: TBytes): TGUID;\r\n\r\nbegin\r\n if (System.Length(D)<>8) then\r\n raise EArgumentException.CreateFmt('The length of a GUID array must be %d',[]);\r\n Result:=Create(Cardinal(A),Word(B),Word(C),D[0],D[1],D[2],D[3],D[4],D[5],D[6],D[7]);\r\nend;\r\n\r\n(*\r\nclass function TGuidHelper.Create(A: Integer; B: SmallInt; C: SmallInt; D, E, F, G, H, I, J, K: Byte): TGUID;\r\n\r\nbegin\r\n Result:=Create(Cardinal(A),Word(B),Word(C),D,E,F,G,H,I,J,K);\r\nend;\r\n*)\r\nclass function TGuidHelper.Create(A: Cardinal; B: Word; C: Word; D, E, F, G, H, I, J, K: Byte): TGUID;\r\n\r\nbegin\r\n Result.D1 := Cardinal(A);\r\n Result.D2 := Word(B);\r\n Result.D3 := Word(C);\r\n Result.D4[0] := D;\r\n Result.D4[1] := E;\r\n Result.D4[2] := F;\r\n Result.D4[3] := G;\r\n Result.D4[4] := H;\r\n Result.D4[5] := I;\r\n Result.D4[6] := J;\r\n Result.D4[7] := K;\r\nend;\r\n\r\nclass function TGuidHelper.NewGuid: TGUID;\r\n\r\nbegin\r\n CreateGUID(Result)\r\nend;\r\n\r\nfunction TGuidHelper.ToByteArray(DataEndian: TEndian): TBytes;\r\n\r\nVar\r\n D : TJSUint8Array;\r\n V : TJSDataView;\r\n I : Integer;\r\n\r\nbegin\r\n D:=TJSUint8array.New(16);\r\n V:=TJSDataView.New(D.buffer);\r\n V.setUint32(0,D1,DataEndian=TEndian.Little);\r\n V.setUint16(4,D2,DataEndian=TEndian.Little);\r\n V.setUint16(6,D3,DataEndian=TEndian.Little);\r\n for I:=0 to 7 do\r\n V.setUint8(8+I,D4[i]);\r\n SetLength(Result, 16);\r\n for I:=0 to 15 do\r\n Result[i]:=V.getUint8(I);\r\nend;\r\n\r\nfunction TGuidHelper.ToString(SkipBrackets: Boolean): string;\r\n\r\nbegin\r\n Result:=GuidToString(Self);\r\n If SkipBrackets then\r\n Result:=Copy(Result,2,Length(Result)-2);\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n TStringHelper\r\n ---------------------------------------------------------------------}\r\n\r\nFunction HaveChar(AChar : Char; const AList: array of Char) : Boolean;\r\n\r\nVar\r\n I : SizeInt;\r\n\r\nbegin\r\n I:=0;\r\n Result:=False;\r\n While (Not Result) and (ISystem.Length(A) then\r\n L:=System.Length(A);\r\n Result:=CompareOrdinal(A,0,B,0,L);\r\nend;\r\n\r\n\r\nclass function TStringHelper.CompareOrdinal(const A: string; IndexA: SizeInt;\r\n const B: string; IndexB: SizeInt; ALen: SizeInt): Integer;\r\n\r\nVar\r\n I,M : integer;\r\n\r\nbegin\r\n M:=System.Length(A)-IndexA;\r\n If M>(System.Length(B)-IndexB) then\r\n M:=(System.Length(B)-IndexB);\r\n if M>aLen then\r\n M:=aLen;\r\n I:=0;\r\n Result:=0;\r\n While (Result=0) and (I'') and (sysutils.CompareText(System.Copy(AText,System.Length(AText)-System.Length(ASubText)+1,System.Length(ASubText)),ASubText)=0);\r\nend;\r\n\r\n\r\nclass function TStringHelper.Equals(const a: string; const b: string): Boolean;\r\nbegin\r\n Result:=A=B;\r\nend;\r\n\r\n\r\nclass function TStringHelper.Format(const AFormat: string; const args: array of JSValue): string;\r\nbegin\r\n Result:=Sysutils.Format(AFormat,Args);\r\nend;\r\n\r\n\r\nclass function TStringHelper.IsNullOrEmpty(const AValue: string): Boolean;\r\nbegin\r\n Result:=system.Length(AValue)=0;\r\nend;\r\n\r\n\r\nclass function TStringHelper.IsNullOrWhiteSpace(const AValue: string): Boolean;\r\nbegin\r\n Result:=system.Length(sysutils.Trim(AValue))=0;\r\nend;\r\n\r\n\r\nclass function TStringHelper.Join(const Separator: string; const Values: array of JSValue): string;\r\n\r\nbegin\r\n Result:=TJSArray(Values).Join(Separator);\r\nend;\r\n\r\nclass function TStringHelper.Join(const Separator: string;\r\n const Values: array of string): string;\r\nbegin\r\n Result:=TJSArray(Values).Join(Separator);\r\nend;\r\n\r\n\r\nclass function TStringHelper.Join(const Separator: string;\r\n const Values: array of string; StartIndex: SizeInt; ACount: SizeInt): string;\r\n\r\nVar\r\n VLen : SizeInt;\r\n\r\nbegin\r\n VLen:=High(Values);\r\n If (ACount<0) or ((StartIndex>0) and (StartIndex>VLen)) then\r\n raise ERangeError.Create(SRangeError);\r\n If (ACount=0) or (VLen<0) then\r\n Result:=''\r\n else\r\n Result:=TJSArray(Values).Slice(StartIndex,StartIndex+aCount).Join(Separator);\r\nend;\r\n\r\n\r\nclass function TStringHelper.LowerCase(const S: string): string;\r\nbegin\r\n Result:=sysutils.Lowercase(S);\r\nend;\r\n\r\n\r\nclass function TStringHelper.Parse(const AValue: Boolean): string;\r\nbegin\r\n Result:=BoolToStr(AValue);\r\nend;\r\n\r\n\r\nclass function TStringHelper.Parse(const AValue: Extended): string;\r\nbegin\r\n Result:=FloatToStr(AValue);\r\nend;\r\n\r\n\r\nclass function TStringHelper.Parse(const AValue: NativeInt): string;\r\nbegin\r\n Result:=IntToStr(AValue);\r\nend;\r\n\r\n\r\nclass function TStringHelper.Parse(const AValue: Integer): string;\r\nbegin\r\n Result:=IntToStr(AValue);\r\nend;\r\n\r\n\r\nclass function TStringHelper.ToBoolean(const S: string): Boolean;\r\nbegin\r\n Result:=StrToBool(S);\r\nend;\r\n\r\n\r\nclass function TStringHelper.ToDouble(const S: string): Double;\r\nbegin\r\n Result:=StrToFloat(S);\r\nend;\r\n\r\n\r\nclass function TStringHelper.ToExtended(const S: string): Extended;\r\nbegin\r\n Result:=StrToFloat(S);\r\nend;\r\n\r\n\r\nclass function TStringHelper.ToNativeInt(const S: string): NativeInt;\r\nbegin\r\n Result:=StrToInt64(S);\r\nend;\r\n\r\n\r\nclass function TStringHelper.ToInteger(const S: string): Integer;\r\nbegin\r\n Result:=StrToInt(S);\r\nend;\r\n\r\n\r\nclass function TStringHelper.UpperCase(const S: string): string;\r\nbegin\r\n Result:=sysutils.Uppercase(S);\r\nend;\r\n\r\nclass function TStringHelper.ToCharArray(const S: String): TCharArray;\r\n\r\nVar\r\n I,Len: integer;\r\n\r\nbegin\r\n Len:=System.Length(S);\r\n SetLength(Result,Len);\r\n For I:=1 to Len do\r\n Result[I-1]:=S[I];\r\nend;\r\n\r\nfunction TStringHelper.CompareTo(const B: string): Integer;\r\nbegin\r\n // Order is important\r\n Result:=Compare(Self,B);\r\nend;\r\n\r\n\r\nfunction TStringHelper.Contains(const AValue: string): Boolean;\r\nbegin\r\n Result:=(AValue<>'') and (Pos(AValue,Self)>0);\r\nend;\r\n\r\n\r\nfunction TStringHelper.CountChar(const C: Char): SizeInt;\r\n\r\nVar\r\n S : Char;\r\nbegin\r\n Result:=0;\r\n For S in Self do\r\n if (S=C) then\r\n Inc(Result);\r\nend;\r\n\r\n\r\nfunction TStringHelper.DeQuotedString: string;\r\nbegin\r\n Result:=DeQuotedString('''');\r\nend;\r\n\r\n\r\nfunction TStringHelper.DeQuotedString(const AQuoteChar: Char): string;\r\n\r\nvar\r\n L,I : SizeInt;\r\n Res : Array of Char;\r\n PS,PD : SizeInt;\r\n IsQuote : Boolean;\r\n\r\nbegin\r\n L:=System.Length(Self);\r\n if (L<2) or Not ((Self[1]=AQuoteChar) and (Self[L]=AQuoteChar)) then\r\n Exit(Self);\r\n SetLength(Res,L);\r\n IsQuote:=False;\r\n PS:=2;\r\n PD:=1;\r\n For I:=2 to L-1 do\r\n begin\r\n if (Self[PS]=AQuoteChar) then\r\n begin\r\n IsQuote:=Not IsQuote;\r\n if Not IsQuote then\r\n begin\r\n Result[PD]:=Self[PS];\r\n Inc(PD);\r\n end;\r\n end\r\n else\r\n begin\r\n if IsQuote then\r\n IsQuote:=false;\r\n Result[PD]:=Self[PS];\r\n Inc(PD);\r\n end;\r\n Inc(PS);\r\n end;\r\n SetLength(Result,PD-1);\r\nend;\r\n\r\n\r\nfunction TStringHelper.EndsWith(const AValue: string): Boolean;\r\nbegin\r\n Result:=EndsWith(AValue,False);\r\nend;\r\n\r\n\r\nfunction TStringHelper.EndsWith(const AValue: string; IgnoreCase: Boolean): Boolean;\r\n\r\nVar\r\n L : SizeInt;\r\n S : String;\r\n\r\nbegin\r\n L:=system.Length(AVAlue);\r\n Result:=L=0;\r\n if Not Result then\r\n begin\r\n S:=system.Copy(Self,Length-L+1,L);\r\n Result:=system.Length(S)=L;\r\n if Result then\r\n if IgnoreCase then\r\n Result:=CompareText(S,AValue)=0\r\n else\r\n Result:=S=AValue;\r\n end;\r\nend;\r\n\r\n\r\nfunction TStringHelper.Equals(const AValue: string): Boolean;\r\n\r\nbegin\r\n Result:=(Self=AValue);\r\nend;\r\n\r\n\r\nfunction TStringHelper.Format(const args: array of jsValue): string;\r\n\r\nbegin\r\n Result:=Sysutils.Format(Self,Args);\r\nend;\r\n\r\n\r\nfunction TStringHelper.GetHashCode: Integer;\r\n\r\n// Taken from contnrs, fphash\r\nvar\r\n P,pmax : Integer;\r\n L : TJSString;\r\n\r\nbegin\r\n{$push}\r\n{$Q-}\r\n L:=TJSString(Self);\r\n Result:=0;\r\n\r\n P:=1;\r\n pmax:=length+1;\r\n while (p-1 then\r\n Result:=Result+StartIndex;\r\nend;\r\n\r\n\r\nfunction TStringHelper.IndexOf(const AValue: string; StartIndex: SizeInt;\r\n ACount: SizeInt): SizeInt;\r\n\r\nVar\r\n S : String;\r\n\r\nbegin\r\n S:=System.Copy(Self,StartIndex+1,ACount);\r\n Result:=Pos(AValue,S)-1;\r\n if Result<>-1 then\r\n Result:=Result+StartIndex;\r\nend;\r\n\r\nfunction TStringHelper.IndexOfUnQuoted(const AValue: string; StartQuote,\r\n EndQuote: Char; StartIndex: SizeInt = 0): SizeInt;\r\n\r\nVar\r\n LV : SizeInt;\r\n S : String;\r\n\r\n Function MatchAt(I : SizeInt) : Boolean ; Inline;\r\n\r\n Var\r\n J : SizeInt;\r\n\r\n begin\r\n J:=1;\r\n Repeat\r\n Result:=(S[I+J-1]=AValue[j]);\r\n Inc(J);\r\n Until (Not Result) or (J>LV);\r\n end;\r\n\r\nVar\r\n I,L,Q: SizeInt;\r\n\r\nbegin\r\n S:=Self;\r\n Result:=-1;\r\n LV:=system.Length(AValue);\r\n L:=Length-LV+1;\r\n if L<0 then\r\n L:=0;\r\n I:=StartIndex+1;\r\n Q:=0;\r\n if StartQuote=EndQuote then\r\n begin\r\n While (Result=-1) and (I<=L) do\r\n begin\r\n if (S[I]=StartQuote) then\r\n Q:=1-Q;\r\n if (Q=0) and MatchAt(i) then\r\n Result:=I-1;\r\n Inc(I);\r\n end;\r\n end\r\n else\r\n begin\r\n While (Result=-1) and (I<=L) do\r\n begin\r\n if S[I]=StartQuote then\r\n Inc(Q)\r\n else if (S[I]=EndQuote) and (Q>0) then\r\n Dec(Q);\r\n if (Q=0) and MatchAt(i) then\r\n Result:=I-1;\r\n Inc(I);\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TStringHelper.IndexOfAny(const AnyOf: string): SizeInt;\r\nbegin\r\n Result:=IndexOfAny(AnyOf.ToCharArray);\r\nend;\r\n\r\n\r\nfunction TStringHelper.IndexOfAny(const AnyOf: array of Char): SizeInt;\r\nbegin\r\n Result:=IndexOfAny(AnyOf,0,Length);\r\nend;\r\n\r\nfunction TStringHelper.IndexOfAny(const AnyOf: String; StartIndex: SizeInt): SizeInt;\r\nbegin\r\n Result:=IndexOfAny(AnyOf.ToCharArray,StartIndex);\r\nend;\r\n\r\n\r\nfunction TStringHelper.IndexOfAny(const AnyOf: array of Char;\r\n StartIndex: SizeInt): SizeInt;\r\nbegin\r\n Result:=IndexOfAny(AnyOf,StartIndex,Length);\r\nend;\r\n\r\nfunction TStringHelper.IndexOfAny(const AnyOf: String; StartIndex: SizeInt; ACount: SizeInt): SizeInt;\r\nbegin\r\n Result:=IndexOfAny(AnyOf.ToCharArray,StartIndex,aCount);\r\nend;\r\n\r\nfunction TStringHelper.IndexOfAny(const AnyOf: array of Char;\r\n StartIndex: SizeInt; ACount: SizeInt): SizeInt;\r\n\r\nVar\r\n i,L : SizeInt;\r\n\r\nbegin\r\n I:=StartIndex+1;\r\n L:=I+ACount-1;\r\n If L>Length then\r\n L:=Length;\r\n Result:=-1;\r\n While (Result=-1) and (I<=L) do\r\n begin\r\n if HaveChar(Self[i],AnyOf) then\r\n Result:=I-1;\r\n Inc(I);\r\n end;\r\nend;\r\n\r\nfunction TStringHelper.IndexOfAny(const AnyOf: array of String): SizeInt;\r\nbegin\r\n Result:=IndexOfAny(AnyOf,0,Length);\r\nend;\r\n\r\nfunction TStringHelper.IndexOfAny(const AnyOf: array of String;\r\n StartIndex: SizeInt): SizeInt;\r\nbegin\r\n Result:=IndexOfAny(AnyOf,StartIndex,Length-StartIndex);\r\nend;\r\n\r\nfunction TStringHelper.IndexOfAny(const AnyOf: array of String;\r\n StartIndex: SizeInt; ACount: SizeInt): SizeInt;\r\n\r\nVar\r\n M : SizeInt;\r\n\r\nbegin\r\n Result:=IndexOfAny(AnyOf,StartIndex,ACount,M);\r\nend;\r\n\r\nfunction TStringHelper.IndexOfAny(const AnyOf: array of String;\r\n StartIndex: SizeInt; ACount: SizeInt; out AMatch: SizeInt): SizeInt;\r\n\r\nVar\r\n L,I : SizeInt;\r\n\r\nbegin\r\n Result:=-1;\r\n For I:=0 to System.Length(AnyOf)-1 do\r\n begin\r\n L:=IndexOf(AnyOf[i],StartIndex,ACount);\r\n If (L>=0) and ((Result=-1) or (LLength then\r\n L:=Length;\r\n I:=StartIndex+1;\r\n Q:=0;\r\n if StartQuote=EndQuote then\r\n begin\r\n While (Result=-1) and (I<=L) do\r\n begin\r\n if (Self[I]=StartQuote) then\r\n Q:=1-Q;\r\n if (Q=0) and HaveChar(Self[i],AnyOf) then\r\n Result:=I-1;\r\n Inc(I);\r\n end;\r\n end\r\n else\r\n begin\r\n While (Result=-1) and (I<=L) do\r\n begin\r\n if Self[I]=StartQuote then\r\n Inc(Q)\r\n else if (Self[I]=EndQuote) and (Q>0) then\r\n Dec(Q);\r\n if (Q=0) and HaveChar(Self[i],AnyOf) then\r\n Result:=I-1;\r\n Inc(I);\r\n end;\r\n end;\r\n\r\nend;\r\n\r\nfunction TStringHelper.IndexOfAnyUnquoted(const AnyOf: array of string;\r\n StartQuote, EndQuote: Char; StartIndex: SizeInt; out Matched: SizeInt\r\n ): SizeInt;\r\n\r\nVar\r\n L,I : SizeInt;\r\n\r\nbegin\r\n Result:=-1;\r\n For I:=0 to System.Length(AnyOf)-1 do\r\n begin\r\n L:=IndexOfUnquoted(AnyOf[i],StartQuote,EndQuote,StartIndex);\r\n If (L>=0) and ((Result=-1) or (L=Min) and (Self[Result]<>AValue) do\r\n Dec(Result);\r\n if ResultaCount then\r\n Result:=-1;\r\nend;\r\n\r\n\r\nfunction TStringHelper.LastIndexOfAny(const AnyOf: array of Char): SizeInt;\r\nbegin\r\n Result:=LastIndexOfAny(AnyOf,Length-1,Length);\r\nend;\r\n\r\n\r\nfunction TStringHelper.LastIndexOfAny(const AnyOf: array of Char;\r\n AStartIndex: SizeInt): SizeInt;\r\nbegin\r\n Result:=LastIndexOfAny(AnyOf,AStartIndex,Length);\r\nend;\r\n\r\n\r\nfunction TStringHelper.LastIndexOfAny(const AnyOf: array of Char;\r\n AStartIndex: SizeInt; ACount: SizeInt): SizeInt;\r\n\r\nVar\r\n Min : SizeInt;\r\n\r\nbegin\r\n Result:=AStartIndex+1;\r\n Min:=Result-ACount+1;\r\n If Min<1 then\r\n Min:=1;\r\n While (Result>=Min) and Not HaveChar(Self[Result],AnyOf) do\r\n Dec(Result);\r\n if Result0 then\r\n Result:=StringOfChar(PaddingChar,L)+Result;\r\nend;\r\n\r\n\r\nfunction TStringHelper.PadRight(ATotalWidth: SizeInt): string;\r\nbegin\r\n Result:=PadRight(ATotalWidth,' ');\r\nend;\r\n\r\n\r\nfunction TStringHelper.PadRight(ATotalWidth: SizeInt; PaddingChar: Char\r\n ): string;\r\n\r\nVar\r\n L : SizeInt;\r\n\r\nbegin\r\n Result:=Self;\r\n L:=ATotalWidth-Length;\r\n If L>0 then\r\n Result:=Result+StringOfChar(PaddingChar,L);\r\nend;\r\n\r\n\r\nfunction TStringHelper.QuotedString: string;\r\nbegin\r\n Result:=QuotedStr(Self);\r\nend;\r\n\r\n\r\nfunction TStringHelper.QuotedString(const AQuoteChar: Char): string;\r\nbegin\r\n Result:=QuotedStr(Self,AQuoteChar);\r\nend;\r\n\r\n\r\nfunction TStringHelper.Remove(StartIndex: SizeInt): string;\r\nbegin\r\n Result:=Remove(StartIndex,Self.Length-StartIndex);\r\nend;\r\n\r\n\r\nfunction TStringHelper.Remove(StartIndex: SizeInt; ACount: SizeInt): string;\r\nbegin\r\n Result:=Self;\r\n System.Delete(Result,StartIndex+1,ACount);\r\nend;\r\n\r\n\r\nfunction TStringHelper.Replace(OldChar: Char; NewChar: Char): string;\r\nbegin\r\n Result:=Replace(OldChar,NewChar,[rfReplaceAll]);\r\nend;\r\n\r\n\r\nfunction TStringHelper.Replace(OldChar: Char; NewChar: Char;\r\n ReplaceFlags: TReplaceFlags): string;\r\nbegin\r\n Result:=StringReplace(Self,OldChar,NewChar,ReplaceFlags);\r\nend;\r\n\r\n\r\nfunction TStringHelper.Replace(const OldValue: string; const NewValue: string\r\n ): string;\r\nbegin\r\n Result:=Replace(OldValue,NewValue,[rfReplaceAll]);\r\nend;\r\n\r\n\r\nfunction TStringHelper.Replace(const OldValue: string; const NewValue: string;\r\n ReplaceFlags: TReplaceFlags): string;\r\nbegin\r\n Result:=StringReplace(Self,OldValue,NewValue,ReplaceFlags);\r\nend;\r\n\r\n\r\n\r\nfunction TStringHelper.Split(const Separators: String): TStringArray;\r\nbegin\r\n Result:=Split(Separators.ToCharArray);\r\nend;\r\n\r\n\r\nfunction TStringHelper.Split(const Separators: array of Char): TStringArray;\r\nbegin\r\n Result:=Split(Separators,#0,#0,Length+1,TStringSplitOptions.None);\r\nend;\r\n\r\nfunction TStringHelper.Split(const Separators: string; ACount: SizeInt): TStringArray;\r\nbegin\r\n Result:=Split(Separators.ToCharArray,aCount);\r\nend;\r\n\r\n\r\nfunction TStringHelper.Split(const Separators: array of Char; ACount: SizeInt\r\n ): TStringArray;\r\nbegin\r\n Result:=Split(Separators,#0,#0,ACount,TStringSplitOptions.None);\r\nend;\r\n\r\nfunction TStringHelper.Split(const Separators: string; Options: TStringSplitOptions): TStringArray;\r\nbegin\r\n Result:=Split(Separators.ToCharArray,Options);\r\nend;\r\n\r\n\r\nfunction TStringHelper.Split(const Separators: array of Char;\r\n Options: TStringSplitOptions): TStringArray;\r\nbegin\r\n Result:=Split(Separators,Length+1,Options);\r\nend;\r\n\r\nfunction TStringHelper.Split(const Separators: string; ACount: SizeInt; Options: TStringSplitOptions): TStringArray;\r\nbegin\r\n Result:=Split(Separators.ToCharArray,aCount,Options);\r\nend;\r\n\r\n\r\nfunction TStringHelper.Split(const Separators: array of Char; ACount: SizeInt;\r\n Options: TStringSplitOptions): TStringArray;\r\nbegin\r\n Result:=Split(Separators,#0,#0,ACount,Options);\r\nend;\r\n\r\n\r\nfunction TStringHelper.Split(const Separators: array of string): TStringArray;\r\nbegin\r\n Result:=Split(Separators,Length+1);\r\nend;\r\n\r\n\r\nfunction TStringHelper.Split(const Separators: array of string; ACount: SizeInt\r\n ): TStringArray;\r\nbegin\r\n Result:=Split(Separators,ACount,TStringSplitOptions.None);\r\nend;\r\n\r\n\r\nfunction TStringHelper.Split(const Separators: array of string;\r\n Options: TStringSplitOptions): TStringArray;\r\nbegin\r\n Result:=Split(Separators,Length+1,Options);\r\nend;\r\n\r\n\r\nfunction TStringHelper.Split(const Separators: array of string;\r\n ACount: SizeInt; Options: TStringSplitOptions): TStringArray;\r\nbegin\r\n Result:=Split(Separators,#0,#0,ACount,Options);\r\nend;\r\n\r\nfunction TStringHelper.Split(const Separators: String; AQuote: Char): TStringArray;\r\nbegin\r\n Result:=Split(Separators.ToCharArray,aQuote);\r\nend;\r\n\r\n\r\nfunction TStringHelper.Split(const Separators: array of Char; AQuote: Char\r\n ): TStringArray;\r\nbegin\r\n Result:=Split(Separators,AQuote,AQuote);\r\nend;\r\n\r\nfunction TStringHelper.Split(const Separators: String; AQuoteStart, AQuoteEnd: Char): TStringArray;\r\nbegin\r\n Result:=Split(Separators.ToCharArray,aQuoteStart,aQuoteEnd);\r\nend;\r\n\r\n\r\nfunction TStringHelper.Split(const Separators: array of Char; AQuoteStart,\r\n AQuoteEnd: Char): TStringArray;\r\nbegin\r\n Result:=Split(Separators,AQuoteStart,AQuoteEnd,TStringSplitOptions.None);\r\nend;\r\n\r\nfunction TStringHelper.Split(const Separators: string; AQuoteStart, AQuoteEnd: Char; Options: TStringSplitOptions): TStringArray;\r\nbegin\r\n Result:=Split(Separators.ToCharArray,aQuoteStart,aQuoteEnd,Options);\r\nend;\r\n\r\n\r\nfunction TStringHelper.Split(const Separators: array of Char; AQuoteStart,\r\n AQuoteEnd: Char; Options: TStringSplitOptions): TStringArray;\r\nbegin\r\n Result:=Split(Separators,AQuoteStart,AQuoteEnd,Length+1,Options);\r\nend;\r\n\r\nfunction TStringHelper.Split(const Separators: string; AQuoteStart, AQuoteEnd: Char; ACount: SizeInt): TStringArray;\r\nbegin\r\n Result:=Split(Separators.ToCharArray,aQuoteStart,aQuoteEnd,aCount);\r\nend;\r\n\r\n\r\nfunction TStringHelper.Split(const Separators: array of Char; AQuoteStart,\r\n AQuoteEnd: Char; ACount: SizeInt): TStringArray;\r\nbegin\r\n Result:=Split(Separators,AQuoteStart,AQuoteEnd,ACount,TStringSplitOptions.None);\r\nend;\r\n\r\nfunction TStringHelper.Split(const Separators: string; AQuoteStart, AQuoteEnd: Char; ACount: SizeInt; Options: TStringSplitOptions\r\n ): TStringArray;\r\nbegin\r\n Result:=Split(Separators.ToCharArray,aQuoteStart,aQuoteEnd,aCount,Options);\r\nend;\r\n\r\n\r\nfunction TStringHelper.Split(const Separators: array of Char; AQuoteStart,\r\n AQuoteEnd: Char; ACount: SizeInt; Options: TStringSplitOptions): TStringArray;\r\n\r\n\r\nConst\r\n BlockSize = 10;\r\n\r\nVar\r\n S : String;\r\n\r\n Function NextSep(StartIndex : SizeInt) : SizeInt;\r\n\r\n begin\r\n if (AQuoteStart<>#0) then\r\n Result:=S.IndexOfAnyUnQuoted(Separators,AQuoteStart,AQuoteEnd,StartIndex)\r\n else\r\n Result:=S.IndexOfAny(Separators,StartIndex);\r\n end;\r\n\r\n Procedure MaybeGrow(Curlen : SizeInt);\r\n\r\n begin\r\n if System.Length(Result)<=CurLen then\r\n SetLength(Result,System.Length(Result)+BlockSize);\r\n end;\r\n\r\nVar\r\n Sep,LastSep,Len : SizeInt;\r\n T : String;\r\n\r\nbegin\r\n\r\n S:=Self;\r\n SetLength(Result,BlockSize);\r\n Len:=0;\r\n LastSep:=0;\r\n Sep:=NextSep(0);\r\n While (Sep<>-1) and ((ACount=0) or (Len',T,'< at pos ',LastSep,', till pos ',Sep);\r\n If (T<>'') or (not (TStringSplitOptions.ExcludeEmpty=Options)) then\r\n begin\r\n MaybeGrow(Len);\r\n Result[Len]:=T;\r\n Inc(Len);\r\n end;\r\n LastSep:=Sep+1;\r\n Sep:=NextSep(LastSep);\r\n end;\r\n if (LastSep<=Length) and ((ACount=0) or (Len',T,'< at pos,',LastSep,' till pos ',Sep);\r\n If (T<>'') or (not (TStringSplitOptions.ExcludeEmpty=Options)) then\r\n begin\r\n MaybeGrow(Len);\r\n Result[Len]:=T;\r\n Inc(Len);\r\n end;\r\n end;\r\n SetLength(Result,Len);\r\n\r\nend;\r\n\r\n\r\nfunction TStringHelper.Split(const Separators: array of string; AQuote: Char\r\n ): TStringArray;\r\nbegin\r\n Result:=SPlit(Separators,AQuote,AQuote);\r\nend;\r\n\r\n\r\nfunction TStringHelper.Split(const Separators: array of string; AQuoteStart,\r\n AQuoteEnd: Char): TStringArray;\r\nbegin\r\n Result:=SPlit(Separators,AQuoteStart,AQuoteEnd,Length+1,TStringSplitOptions.None);\r\nend;\r\n\r\n\r\nfunction TStringHelper.Split(const Separators: array of string; AQuoteStart,\r\n AQuoteEnd: Char; Options: TStringSplitOptions): TStringArray;\r\nbegin\r\n Result:=SPlit(Separators,AQuoteStart,AQuoteEnd,Length+1,Options);\r\nend;\r\n\r\n\r\nfunction TStringHelper.Split(const Separators: array of string; AQuoteStart,\r\n AQuoteEnd: Char; ACount: SizeInt): TStringArray;\r\nbegin\r\n Result:=SPlit(Separators,AQuoteStart,AQuoteEnd,ACount,TStringSplitOptions.None);\r\nend;\r\n\r\n\r\nfunction TStringHelper.Split(const Separators: array of string; AQuoteStart,\r\n AQuoteEnd: Char; ACount: SizeInt; Options: TStringSplitOptions): TStringArray;\r\n\r\nConst\r\n BlockSize = 10;\r\n\r\nVar\r\n S : String;\r\n\r\n Function NextSep(StartIndex : SizeInt; out Match : SizeInt) : SizeInt;\r\n\r\n begin\r\n if (AQuoteStart<>#0) then\r\n Result:=S.IndexOfAnyUnQuoted(Separators,AQuoteStart,AQuoteEnd,StartIndex,Match)\r\n else\r\n Result:=S.IndexOfAny(Separators,StartIndex,Length,Match);\r\n end;\r\n\r\n Procedure MaybeGrow(Curlen : SizeInt);\r\n\r\n begin\r\n if System.Length(Result)<=CurLen then\r\n SetLength(Result,System.Length(Result)+BlockSize);\r\n end;\r\n\r\nVar\r\n Sep,LastSep,Len,Match : SizeInt;\r\n T : String;\r\n\r\nbegin\r\n S:=Self;\r\n SetLength(Result,BlockSize);\r\n Len:=0;\r\n LastSep:=0;\r\n Sep:=NextSep(0,Match);\r\n While (Sep<>-1) and ((ACount=0) or (Len'') or (not (TStringSplitOptions.ExcludeEmpty=Options)) then\r\n begin\r\n MaybeGrow(Len);\r\n Result[Len]:=T;\r\n Inc(Len);\r\n end;\r\n LastSep:=Sep+System.Length(Separators[Match]);\r\n Sep:=NextSep(LastSep,Match);\r\n end;\r\n if (LastSep<=Length) and ((ACount=0) or (Len',T,'< at pos,',LastSep,' till pos ',Sep);\r\n If (T<>'') or (not (TStringSplitOptions.ExcludeEmpty=Options)) then\r\n begin\r\n MaybeGrow(Len);\r\n Result[Len]:=T;\r\n Inc(Len);\r\n end;\r\n end;\r\n SetLength(Result,Len);\r\n\r\nend;\r\n\r\n\r\nfunction TStringHelper.StartsWith(const AValue: string): Boolean;\r\nbegin\r\n Result:=StartsWith(AValue,False);\r\nend;\r\n\r\n\r\nfunction TStringHelper.StartsWith(const AValue: string; IgnoreCase: Boolean\r\n ): Boolean;\r\nVar\r\n L : SizeInt;\r\n S : String;\r\n\r\nbegin\r\n L:=System.Length(AValue);\r\n Result:=L<=0;\r\n if not Result then\r\n begin\r\n S:=System.Copy(Self,1,L);\r\n Result:=(System.Length(S)=L);\r\n if Result then\r\n if IgnoreCase then\r\n Result:=SameText(S,aValue)\r\n else\r\n Result:=SameStr(S,AValue);\r\n end;\r\nend;\r\n\r\n\r\nfunction TStringHelper.Substring(AStartIndex: SizeInt): string;\r\nbegin\r\n Result:=Self.SubString(AStartIndex,Self.Length-AStartIndex);\r\nend;\r\n\r\n\r\nfunction TStringHelper.Substring(AStartIndex: SizeInt; ALen: SizeInt): string;\r\nbegin\r\n Result:=system.Copy(Self,AStartIndex+1,ALen);\r\nend;\r\n\r\n\r\nfunction TStringHelper.ToBoolean: Boolean;\r\nbegin\r\n Result:=StrToBool(Self);\r\nend;\r\n\r\n\r\nfunction TStringHelper.ToInteger: Integer;\r\nbegin\r\n Result:=StrToInt(Self);\r\nend;\r\n\r\n\r\nfunction TStringHelper.ToNativeInt: NativeInt;\r\nbegin\r\n Result:=StrToNativeInt(Self);\r\nend;\r\n\r\nfunction TStringHelper.ToDouble: Double;\r\nbegin\r\n Result:=StrToFLoat(Self);\r\nend;\r\n\r\n\r\nfunction TStringHelper.ToExtended: Extended;\r\nbegin\r\n Result:=StrToFLoat(Self);\r\nend;\r\n\r\n\r\nfunction TStringHelper.ToCharArray: TCharArray;\r\n\r\nbegin\r\n Result:=ToCharArray(0,Self.Length);\r\nend;\r\n\r\n\r\nfunction TStringHelper.ToCharArray(AStartIndex: SizeInt; ALen: SizeInt\r\n ): TCharArray;\r\n\r\nVar\r\n I : SizeInt;\r\n\r\nbegin\r\n SetLength(Result,ALen);\r\n For I:=0 to ALen-1 do\r\n Result[I]:=Self[AStartIndex+I+1];\r\nend;\r\n\r\n\r\nfunction TStringHelper.ToLower: string;\r\nbegin\r\n Result:=LowerCase(Self);\r\nend;\r\n\r\n\r\nfunction TStringHelper.ToLowerInvariant: string;\r\nbegin\r\n Result:=LowerCase(Self);\r\nend;\r\n\r\n\r\nfunction TStringHelper.ToUpper: string;\r\nbegin\r\n Result:=UpperCase(Self);\r\nend;\r\n\r\n\r\nfunction TStringHelper.ToUpperInvariant: string;\r\nbegin\r\n Result:=UpperCase(Self);\r\nend;\r\n\r\n\r\nfunction TStringHelper.Trim: string;\r\nbegin\r\n Result:=SysUtils.Trim(self);\r\nend;\r\n\r\n\r\nfunction TStringHelper.TrimLeft: string;\r\nbegin\r\n Result:=SysUtils.TrimLeft(Self);\r\nend;\r\n\r\n\r\nfunction TStringHelper.TrimRight: string;\r\nbegin\r\n Result:=SysUtils.TrimRight(Self);\r\nend;\r\n\r\n\r\nfunction TStringHelper.Trim(const ATrimChars: array of Char): string;\r\nbegin\r\n Result:=Self.TrimLeft(ATrimChars).TrimRight(ATrimChars);\r\nend;\r\n\r\n\r\nfunction TStringHelper.TrimLeft(const ATrimChars: array of Char): string;\r\n\r\nVar\r\n I,Len : SizeInt;\r\n\r\nbegin\r\n I:=1;\r\n Len:=Self.Length;\r\n While (I<=Len) and HaveChar(Self[i],ATrimChars) do Inc(I);\r\n if I=1 then\r\n Result:=Self\r\n else if I>Len then\r\n Result:=''\r\n else\r\n Result:=system.Copy(Self,I,Len-I+1);\r\nend;\r\n\r\n\r\nfunction TStringHelper.TrimRight(const ATrimChars: array of Char): string;\r\n\r\nVar\r\n I,Len : SizeInt;\r\n\r\nbegin\r\n Len:=Self.Length;\r\n I:=Len;\r\n While (I>=1) and HaveChar(Self[i],ATrimChars) do Dec(I);\r\n if I<1 then\r\n Result:=''\r\n else if I=Len then\r\n Result:=Self\r\n else\r\n Result:=system.Copy(Self,1,I);\r\nend;\r\n\r\n\r\nfunction TStringHelper.TrimEnd(const ATrimChars: array of Char): string;\r\nbegin\r\n Result:=TrimRight(ATrimChars);\r\nend;\r\n\r\n\r\nfunction TStringHelper.TrimStart(const ATrimChars: array of Char): string;\r\nbegin\r\n Result:=TrimLeft(ATrimChars);\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n TDoubleHelper\r\n ---------------------------------------------------------------------}\r\n\r\nClass Function TDoubleHelper.IsNan(const AValue: Double): Boolean; overload; inline;\r\n\r\nbegin\r\n Result:=JS.jsIsNaN(AValue);\r\nend;\r\n\r\nClass Function TDoubleHelper.IsInfinity(const AValue: Double): Boolean; overload; inline;\r\n\r\nbegin\r\n Result:=Not jsIsFinite(aValue);\r\nend;\r\n\r\nClass Function TDoubleHelper.IsNegativeInfinity(const AValue: Double): Boolean; overload; inline;\r\n\r\nbegin\r\n asm\r\n return (AValue=Number.NEGATIVE_INFINITY);\r\n end;\r\n Result:=aValue=0; // Fool compiler\r\nend;\r\n\r\nClass Function TDoubleHelper.IsPositiveInfinity(const AValue: Double): Boolean; overload; inline;\r\n\r\nbegin\r\n asm\r\n return (AValue=Number.POSITIVE_INFINITY);\r\n end;\r\n Result:=aValue=0; // Fool compiler.\r\nend;\r\n\r\nClass Function TDoubleHelper.Parse(const AString: string): Double; overload; inline;\r\n\r\nbegin\r\n Result:=StrToFloat(AString);\r\nend;\r\n\r\n\r\nClass Function TDoubleHelper.ToString(const AValue: Double): string; overload; inline;\r\n\r\nbegin\r\n Result:=FloatToStr(AValue);\r\nend;\r\n\r\n\r\nClass Function TDoubleHelper.ToString(const AValue: Double; const AFormat: TFloatFormat; const APrecision, ADigits: Integer): string; overload; inline;\r\n\r\nbegin\r\n Result:=FloatToStrF(AValue,AFormat,APrecision,ADigits);\r\nend;\r\n\r\n\r\nClass Function TDoubleHelper.TryParse(const AString: string; out AValue: Double): Boolean; overload; inline;\r\n\r\nbegin\r\n Result:=TryStrToFloat(AString,AValue);\r\nend;\r\n\r\n\r\n\r\nFunction TDoubleHelper.GetB(AIndex: Cardinal): Byte;\r\n\r\nvar\r\n F : TJSFloat64Array;\r\n B : TJSUInt8array;\r\n\r\nbegin\r\n F:=TJSFloat64Array.New(1);\r\n B:=TJSUInt8array.New(F.Buffer);\r\n F[0]:=Self;\r\n Result:=B[AIndex];\r\nend;\r\n\r\nFunction TDoubleHelper.GetW(AIndex: Cardinal): Word;\r\n\r\nvar\r\n F : TJSFloat64Array;\r\n W : TJSUInt16array;\r\n\r\nbegin\r\n F:=TJSFloat64Array.New(1);\r\n W:=TJSUInt16array.New(F.Buffer);\r\n F[0]:=Self;\r\n Result:=W[AIndex];\r\nend;\r\n\r\nType\r\n TFloatParts = Record\r\n sign : boolean;\r\n exp : integer;\r\n mantissa : double;\r\n end;\r\n\r\n// See https://stackoverflow.com/questions/9383593/extracting-the-exponent-and-mantissa-of-a-javascript-number\r\n\r\nFunction FloatToParts(aValue : Double) : TFloatParts;\r\n\r\nvar\r\n F : TJSFloat64Array;\r\n B : TJSUInt8array;\r\n\r\nbegin\r\n F:=TJSFloat64Array.New(1);\r\n B:=TJSUInt8array.New(F.Buffer);\r\n F[0]:=aValue;\r\n Result.Sign:=(B[7] shr 7)=0;\r\n Result.exp:=(((B[7] and $7f) shl 4) or (B[6] shr 4))- $3ff;\r\n B[3]:=$3F;\r\n B[6]:=B[6] or $F0;\r\n Result.Mantissa:=F[0];\r\nend;\r\n\r\nFunction TDoubleHelper.GetE: NativeUInt; inline;\r\n\r\nbegin\r\n Result:=FloatToParts(Self).Exp;\r\nend;\r\n\r\nFunction TDoubleHelper.GetF: NativeUInt; inline;\r\n\r\nbegin\r\n Result:=0;\r\n NotImplemented('GetF');\r\nend;\r\n\r\nFunction TDoubleHelper.GetS: Boolean; inline;\r\n\r\nbegin\r\n Result:=FloatToParts(Self).Sign;\r\nend;\r\n\r\nprocedure TDoubleHelper.SetB(AIndex: Cardinal; const AValue: Byte);\r\n\r\nvar\r\n F : TJSFloat64Array;\r\n B : TJSUInt8array;\r\n\r\nbegin\r\n if (AIndex>=8) then\r\n raise ERangeError.Create(SRangeError);\r\n F:=TJSFloat64Array.New(1);\r\n B:=TJSUInt8array.New(F.Buffer);\r\n F[0]:=Self;\r\n B[AIndex]:=aValue;\r\n Self:=F[0];\r\nend;\r\n\r\nprocedure TDoubleHelper.SetW(AIndex: Cardinal; const AValue: Word);\r\n\r\nVar\r\n F : TJSFloat64Array;\r\n W : TJSUInt16array;\r\n\r\nbegin\r\n if (AIndex>=4) then\r\n raise ERangeError.Create(SRangeError);\r\n F:=TJSFloat64Array.New(1);\r\n W:=TJSUInt16array.New(F.Buffer);\r\n F[0]:=Self;\r\n W[AIndex]:=aValue;\r\n Self:=F[0];\r\nend;\r\n\r\n\r\n\r\nprocedure TDoubleHelper.SetS(AValue: Boolean);\r\n\r\n\r\nVar\r\n F : TJSFloat64Array;\r\n B : TJSUInt8array;\r\n\r\nbegin\r\n F:=TJSFloat64Array.New(1);\r\n B:=TJSUInt8array.New(F.Buffer);\r\n F[0]:=Self;\r\n if aValue then\r\n B[7]:=B[7] or (1 shr 7)\r\n else\r\n B[7]:=B[7] and not (1 shr 7);\r\n Self:=F[0];\r\nend;\r\n\r\n\r\nProcedure TDoubleHelper.BuildUp(const ASignFlag: Boolean; const AMantissa: NativeUInt; const AExponent: Integer);\r\n\r\nbegin\r\n NotImplemented('BuildUp');\r\n // Following statement is just to fool the compiler\r\n if ASignFlag and (AMantissa>0) and (AExponent<0) then exit;\r\n// TFloatRec(Self).BuildUp(ASignFlag, AMantissa, AExponent);\r\nend;\r\n\r\nFunction TDoubleHelper.Exponent: Integer;\r\n\r\nbegin\r\n Result:=FloatToParts(Self).Exp;\r\nend;\r\n\r\nFunction TDoubleHelper.Fraction: Extended;\r\n\r\nbegin\r\n Result:=system.Frac(Self);\r\nend;\r\n\r\nFunction TDoubleHelper.IsInfinity: Boolean; overload; inline;\r\n\r\nbegin\r\n Result:=Double.IsInfinity(Self);\r\nend;\r\n\r\nFunction TDoubleHelper.IsNan: Boolean; overload; inline;\r\n\r\nbegin\r\n Result:=Double.IsNan(Self);\r\nend;\r\n\r\nFunction TDoubleHelper.IsNegativeInfinity: Boolean; overload; inline;\r\n\r\nbegin\r\n Result:=Double.IsNegativeInfinity(Self);\r\nend;\r\n\r\nFunction TDoubleHelper.IsPositiveInfinity: Boolean; overload; inline;\r\n\r\nbegin\r\n Result:=Double.IsPositiveInfinity(Self);\r\nend;\r\n\r\nFunction TDoubleHelper.Mantissa: NativeUInt;\r\n\r\nbegin\r\n Result:=Trunc(FloatToParts(Self).mantissa);\r\nend;\r\n\r\nFunction TDoubleHelper.ToString(const AFormat: TFloatFormat; const APrecision, ADigits: Integer): string; overload; inline;\r\n\r\nbegin\r\n Result:=FloatToStrF(Self,AFormat,APrecision,ADigits);\r\nend;\r\n\r\nFunction TDoubleHelper.ToString: string; overload; inline;\r\n\r\nbegin\r\n Result:=FloatToStr(Self);\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n TByteHelper\r\n ---------------------------------------------------------------------}\r\n\r\nClass Function TByteHelper.Parse(const AString: string): Byte; inline;\r\n\r\nbegin\r\n Result:=StrToInt(AString);\r\nend;\r\n\r\nClass Function TByteHelper.Size: Integer; inline;\r\n\r\nbegin\r\n Result:=1;\r\nend;\r\n\r\nClass Function TByteHelper.ToString(const AValue: Byte): string; overload; inline;\r\n\r\nbegin\r\n Result:=IntToStr(AValue);\r\nend;\r\n\r\nClass Function TByteHelper.TryParse(const AString: string; out AValue: Byte): Boolean; inline;\r\n\r\nVar\r\n C : Integer;\r\n\r\nbegin\r\n Val(AString,AValue,C);\r\n Result:=(C=0);\r\nend;\r\n\r\nFunction TByteHelper.ToBoolean: Boolean; inline;\r\n\r\nbegin\r\n Result:=(Self<>0);\r\nend;\r\n\r\nFunction TByteHelper.ToDouble: Double; inline;\r\n\r\nbegin\r\n Result:=Self;\r\nend;\r\n\r\nFunction TByteHelper.ToExtended: Extended; inline;\r\n\r\nbegin\r\n Result:=Self;\r\nend;\r\n\r\nFunction TByteHelper.ToBinString: string; inline;\r\n\r\nbegin\r\n Result:=BinStr(Self,Size*8);\r\nend;\r\n\r\nFunction TByteHelper.ToHexString(const AMinDigits: Integer): string;\r\noverload; inline;\r\n\r\nbegin\r\n Result:=IntToHex(Self,AMinDigits);\r\nend;\r\n\r\nFunction TByteHelper.ToHexString: string; overload; inline;\r\n\r\nbegin\r\n Result:=IntToHex(Self,Size*2);\r\nend;\r\n\r\nFunction TByteHelper.ToString: string; overload; inline;\r\n\r\nbegin\r\n Result:=IntToStr(Self);\r\nend;\r\n\r\nFunction TByteHelper.SetBit(const index: TByteBitIndex) : Byte; inline;\r\n\r\nbegin\r\n Self := Self or (Byte(1) shl index);\r\n Result:=Self;\r\nend;\r\n\r\nFunction TByteHelper.ClearBit(const index: TByteBitIndex) : Byte; inline;\r\n\r\nbegin\r\n Self:=Self and not Byte((Byte(1) shl index));\r\n Result:=Self;\r\nend;\r\n\r\nFunction TByteHelper.ToggleBit(const index: TByteBitIndex) : Byte; inline;\r\n\r\nbegin\r\n Self := Self xor Byte((Byte(1) shl index));\r\n Result:=Self;\r\nend;\r\n\r\nFunction TByteHelper.TestBit(const Index: TByteBitIndex):Boolean; inline;\r\n\r\nbegin\r\n Result := (Self and Byte((Byte(1) shl index)))<>0;\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n TShortintHelper\r\n ---------------------------------------------------------------------}\r\n\r\nClass Function TShortIntHelper.Parse(const AString: string): ShortInt; inline;\r\n\r\nbegin\r\n Result:=StrToInt(AString);\r\nend;\r\n\r\nClass Function TShortIntHelper.Size: Integer; inline;\r\n\r\nbegin\r\n Result:=1;\r\nend;\r\n\r\nClass Function TShortIntHelper.ToString(const AValue: ShortInt): string; overload; inline;\r\n\r\nbegin\r\n Result:=IntToStr(AValue);\r\nend;\r\n\r\nClass Function TShortIntHelper.TryParse(const AString: string; out AValue: ShortInt): Boolean; inline;\r\n\r\nVar\r\n C : Integer;\r\n\r\nbegin\r\n Val(AString,AValue,C);\r\n Result:=(C=0);\r\nend;\r\n\r\nFunction TShortIntHelper.ToBoolean: Boolean; inline;\r\n\r\nbegin\r\n Result:=(Self<>0);\r\nend;\r\n\r\nFunction TShortIntHelper.ToDouble: Double; inline;\r\n\r\nbegin\r\n Result:=Self;\r\nend;\r\n\r\nFunction TShortIntHelper.ToExtended: Extended; inline;\r\n\r\nbegin\r\n Result:=Self;\r\nend;\r\n\r\nFunction TShortIntHelper.ToBinString: string; inline;\r\n\r\nbegin\r\n Result:=BinStr(Self,Size*8);\r\nend;\r\n\r\nFunction TShortIntHelper.ToHexString(const AMinDigits: Integer): string; overload; inline;\r\n\r\nVar\r\n B : Word;\r\n U : TJSUInt8Array;\r\n S : TJSInt8array;\r\n\r\nbegin\r\n if Self>=0 then\r\n B:=Self\r\n else\r\n begin\r\n S:=TJSInt8Array.New(1);\r\n S[0]:=Self;\r\n U:=TJSUInt8Array.New(S);\r\n B:=U[0];\r\n if AMinDigits>2 then\r\n B:=$FF00+B;\r\n end;\r\n Result:=IntToHex(B,AMinDigits);\r\nend;\r\n\r\nFunction TShortIntHelper.ToHexString: string; overload; inline;\r\n\r\nbegin\r\n Result:=ToHexString(Size*2);\r\nend;\r\n\r\nFunction TShortIntHelper.ToString: string; overload; inline;\r\n\r\nbegin\r\n Result:=IntToStr(Self);\r\nend;\r\n\r\nFunction TShortIntHelper.SetBit(const index: TShortIntBitIndex) : ShortInt; inline;\r\n\r\nbegin\r\n Self := Self or (ShortInt(1) shl index);\r\n Result:=Self;\r\nend;\r\n\r\nFunction TShortIntHelper.ClearBit(const index: TShortIntBitIndex) : ShortInt; inline;\r\n\r\nbegin\r\n Self:=Self and not ShortInt((ShortInt(1) shl index));\r\n Result:=Self;\r\nend;\r\n\r\nFunction TShortIntHelper.ToggleBit(const index: TShortIntBitIndex) : ShortInt; inline;\r\n\r\nbegin\r\n Self := Self xor ShortInt((ShortInt(1) shl index));\r\n Result:=Self;\r\nend;\r\n\r\nFunction TShortIntHelper.TestBit(const Index: TShortIntBitIndex):Boolean; inline;\r\n\r\nbegin\r\n Result := (Self and ShortInt((ShortInt(1) shl index)))<>0;\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n TSmallintHelper\r\n ---------------------------------------------------------------------}\r\n\r\nClass Function TSmallIntHelper.Parse(const AString: string): SmallInt; inline;\r\n\r\nbegin\r\n Result:=StrToInt(AString);\r\nend;\r\n\r\nClass Function TSmallIntHelper.Size: Integer; inline;\r\n\r\nbegin\r\n Result:=2;\r\nend;\r\n\r\nClass Function TSmallIntHelper.ToString(const AValue: SmallInt): string; overload; inline;\r\n\r\nbegin\r\n Result:=IntToStr(AValue);\r\nend;\r\n\r\nClass Function TSmallIntHelper.TryParse(const AString: string; out AValue: SmallInt): Boolean; inline;\r\n\r\nVar\r\n C : Integer;\r\n\r\nbegin\r\n Val(AString,AValue,C);\r\n Result:=(C=0);\r\nend;\r\n\r\nFunction TSmallIntHelper.ToBoolean: Boolean; inline;\r\n\r\nbegin\r\n Result:=(Self<>0);\r\nend;\r\n\r\nFunction TSmallIntHelper.ToDouble: Double; inline;\r\n\r\nbegin\r\n Result:=Self;\r\nend;\r\n\r\nFunction TSmallIntHelper.ToExtended: Extended; inline;\r\n\r\nbegin\r\n Result:=Self;\r\nend;\r\n\r\nFunction TSmallIntHelper.ToBinString: string; inline;\r\n\r\nbegin\r\n Result:=BinStr(Self,Size*8);\r\nend;\r\n\r\nFunction TSmallIntHelper.ToHexString(const AMinDigits: Integer): string; overload; inline;\r\n\r\nVar\r\n B : Cardinal;\r\n U : TJSUInt16Array;\r\n S : TJSInt16array;\r\n\r\n\r\nbegin\r\n if Self>=0 then\r\n B:=Self\r\n else\r\n begin\r\n S:=TJSInt16Array.New(1);\r\n S[0]:=Self;\r\n U:=TJSUInt16Array.New(S);\r\n B:=U[0];\r\n if AMinDigits>6 then\r\n B:=$FFFF0000+B\r\n else if AMinDigits>4 then\r\n B:=$FF0000+B;\r\n end;\r\n Result:=IntToHex(B,AMinDigits);\r\nend;\r\n\r\nFunction TSmallIntHelper.ToHexString: string; overload; inline;\r\n\r\nbegin\r\n Result:=ToHexString(Size*2);\r\nend;\r\n\r\n\r\nFunction TSmallIntHelper.ToString: string; overload; inline;\r\n\r\nbegin\r\n Result:=IntToStr(Self);\r\nend;\r\n\r\nFunction TSmallIntHelper.SetBit(const index: TSmallIntBitIndex) : SmallInt; inline;\r\n\r\nbegin\r\n Self := Self or (SmallInt(1) shl index);\r\n Result:=Self;\r\nend;\r\n\r\nFunction TSmallIntHelper.ClearBit(const index: TSmallIntBitIndex) : SmallInt; inline;\r\n\r\nbegin\r\n Self:=Self and not SmallInt((SmallInt(1) shl index));\r\n Result:=Self;\r\nend;\r\n\r\nFunction TSmallIntHelper.ToggleBit(const index: TSmallIntBitIndex) : SmallInt; inline;\r\n\r\nbegin\r\n Self := Self xor SmallInt((SmallInt(1) shl index));\r\n Result:=Self;\r\nend;\r\n\r\nFunction TSmallIntHelper.TestBit(const Index: TSmallIntBitIndex):Boolean; inline;\r\n\r\nbegin\r\n Result := (Self and SmallInt((SmallInt(1) shl index)))<>0;\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n TWordHelper\r\n ---------------------------------------------------------------------}\r\n\r\nClass Function TWordHelper.Parse(const AString: string): Word; inline;\r\n\r\nbegin\r\n Result:=StrToInt(AString);\r\nend;\r\n\r\nClass Function TWordHelper.Size: Integer; inline;\r\n\r\nbegin\r\n Result:=2;\r\nend;\r\n\r\nClass Function TWordHelper.ToString(const AValue: Word): string; overload; inline;\r\n\r\nbegin\r\n Result:=IntToStr(AValue);\r\nend;\r\n\r\nClass Function TWordHelper.TryParse(const AString: string; out AValue: Word): Boolean; inline;\r\n\r\nVar\r\n C : Integer;\r\n\r\nbegin\r\n Val(AString,AValue,C);\r\n Result:=(C=0);\r\nend;\r\n\r\nFunction TWordHelper.ToBoolean: Boolean; inline;\r\n\r\nbegin\r\n Result:=(Self<>0);\r\nend;\r\n\r\nFunction TWordHelper.ToDouble: Double; inline;\r\n\r\nbegin\r\n Result:=Self;\r\nend;\r\n\r\nFunction TWordHelper.ToExtended: Extended; inline;\r\n\r\nbegin\r\n Result:=Self;\r\nend;\r\n\r\nFunction TWordHelper.ToBinString: string; inline;\r\n\r\nbegin\r\n Result:=BinStr(Self,Size*8);\r\nend;\r\n\r\nFunction TWordHelper.ToHexString(const AMinDigits: Integer): string;\r\noverload; inline;\r\n\r\nbegin\r\n Result:=IntToHex(Self,AMinDigits);\r\nend;\r\n\r\nFunction TWordHelper.ToHexString: string; overload; inline;\r\n\r\nbegin\r\n Result:=IntToHex(Self,Size*2);\r\nend;\r\n\r\n\r\nFunction TWordHelper.ToString: string; overload; inline;\r\n\r\nbegin\r\n Result:=IntToStr(Self);\r\nend;\r\n\r\nFunction TWordHelper.SetBit(const index: TWordBitIndex) : Word; inline;\r\n\r\nbegin\r\n Self := Self or (Word(1) shl index);\r\n Result:=Self;\r\nend;\r\n\r\nFunction TWordHelper.ClearBit(const index: TWordBitIndex) : Word; inline;\r\n\r\nbegin\r\n Self:=Self and not Word((Word(1) shl index));\r\n Result:=Self;\r\nend;\r\n\r\nFunction TWordHelper.ToggleBit(const index: TWordBitIndex) : Word; inline;\r\n\r\nbegin\r\n Self := Self xor Word((Word(1) shl index));\r\n Result:=Self;\r\nend;\r\n\r\nFunction TWordHelper.TestBit(const Index: TWordBitIndex):Boolean; inline;\r\n\r\nbegin\r\n Result := (Self and Word((Word(1) shl index)))<>0;\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n TCardinalHelper\r\n ---------------------------------------------------------------------}\r\n\r\nClass Function TCardinalHelper.Parse(const AString: string): Cardinal; inline;\r\n\r\nbegin\r\n Result:=StrToInt(AString);\r\nend;\r\n\r\nClass Function TCardinalHelper.Size: Integer; inline;\r\n\r\nbegin\r\n Result:=4;\r\nend;\r\n\r\nClass Function TCardinalHelper.ToString(const AValue: Cardinal): string; overload; inline;\r\n\r\nbegin\r\n Result:=IntToStr(AValue);\r\nend;\r\n\r\nClass Function TCardinalHelper.TryParse(const AString: string; out AValue: Cardinal): Boolean; inline;\r\n\r\nVar\r\n C : Integer;\r\n\r\nbegin\r\n Val(AString,AValue,C);\r\n Result:=(C=0);\r\nend;\r\n\r\nFunction TCardinalHelper.ToBoolean: Boolean; inline;\r\n\r\nbegin\r\n Result:=(Self<>0);\r\nend;\r\n\r\nFunction TCardinalHelper.ToDouble: Double; inline;\r\n\r\nbegin\r\n Result:=Self;\r\nend;\r\n\r\nFunction TCardinalHelper.ToExtended: Extended; inline;\r\n\r\nbegin\r\n Result:=Self;\r\nend;\r\n\r\nFunction TCardinalHelper.ToBinString: string; inline;\r\n\r\nbegin\r\n Result:=BinStr(Self,Size*8);\r\nend;\r\n\r\nFunction TCardinalHelper.ToHexString(const AMinDigits: Integer): string;\r\noverload; inline;\r\n\r\nbegin\r\n Result:=IntToHex(Self,AMinDigits);\r\nend;\r\n\r\nFunction TCardinalHelper.ToHexString: string; overload; inline;\r\n\r\nbegin\r\n Result:=ToHexString(Size*2);\r\nend;\r\n\r\nFunction TCardinalHelper.ToString: string; overload; inline;\r\n\r\nbegin\r\n Result:=IntToStr(Self);\r\nend;\r\n\r\nFunction TCardinalHelper.SetBit(const index: TCardinalBitIndex) : Cardinal; inline;\r\n\r\nbegin\r\n Self := Self or (Cardinal(1) shl index);\r\n Result:=Self;\r\nend;\r\n\r\nFunction TCardinalHelper.ClearBit(const index: TCardinalBitIndex) : Cardinal; inline;\r\n\r\nbegin\r\n Self:=Self and not Cardinal((Cardinal(1) shl index));\r\n Result:=Self;\r\nend;\r\n\r\nFunction TCardinalHelper.ToggleBit(const index: TCardinalBitIndex) : Cardinal; inline;\r\n\r\nbegin\r\n Self := Self xor Cardinal((Cardinal(1) shl index));\r\n Result:=Self;\r\nend;\r\n\r\nFunction TCardinalHelper.TestBit(const Index: TCardinalBitIndex):Boolean; inline;\r\n\r\nbegin\r\n Result := (Self and Cardinal((Cardinal(1) shl index)))<>0;\r\nend;\r\n\r\n\r\n{ ---------------------------------------------------------------------\r\n TIntegerHelper\r\n ---------------------------------------------------------------------}\r\n\r\nClass Function TIntegerHelper.Parse(const AString: string): Integer; inline;\r\n\r\nbegin\r\n Result:=StrToInt(AString);\r\nend;\r\n\r\nClass Function TIntegerHelper.Size: Integer; inline;\r\n\r\nbegin\r\n Result:=4;\r\nend;\r\n\r\nClass Function TIntegerHelper.ToString(const AValue: Integer): string; overload; inline;\r\n\r\nbegin\r\n Result:=IntToStr(AValue);\r\nend;\r\n\r\nClass Function TIntegerHelper.TryParse(const AString: string; out AValue: Integer): Boolean; inline;\r\n\r\nVar\r\n C : Integer;\r\n\r\nbegin\r\n Val(AString,AValue,C);\r\n Result:=(C=0);\r\nend;\r\n\r\nFunction TIntegerHelper.ToBoolean: Boolean; inline;\r\n\r\nbegin\r\n Result:=(Self<>0);\r\nend;\r\n\r\nFunction TIntegerHelper.ToDouble: Double; inline;\r\n\r\nbegin\r\n Result:=Self;\r\nend;\r\n\r\nFunction TIntegerHelper.ToExtended: Extended; inline;\r\n\r\nbegin\r\n Result:=Self;\r\nend;\r\n\r\nFunction TIntegerHelper.ToBinString: string; inline;\r\n\r\nbegin\r\n Result:=BinStr(Self,Size*8);\r\nend;\r\n\r\nFunction TIntegerHelper.ToHexString(const AMinDigits: Integer): string;\r\noverload; inline;\r\n\r\n\r\nVar\r\n B : Word;\r\n U : TJSUInt32Array;\r\n S : TJSInt32array;\r\n\r\nbegin\r\n if Self>=0 then\r\n B:=Self\r\n else\r\n begin\r\n S:=TJSInt32Array.New(1);\r\n S[0]:=Self;\r\n U:=TJSUInt32Array.New(S);\r\n B:=U[0];\r\n end;\r\n Result:=IntToHex(B,AMinDigits);\r\nend;\r\n\r\nFunction TIntegerHelper.ToHexString: string; overload; inline;\r\n\r\nbegin\r\n Result:=ToHexString(Size*2);\r\nend;\r\n\r\n\r\nFunction TIntegerHelper.ToString: string; overload; inline;\r\n\r\nbegin\r\n Result:=IntToStr(Self);\r\nend;\r\n\r\nFunction TIntegerHelper.SetBit(const index: TIntegerBitIndex) : Integer; inline;\r\n\r\nbegin\r\n Self := Self or (Integer(1) shl index);\r\n Result:=Self;\r\nend;\r\n\r\nFunction TIntegerHelper.ClearBit(const index: TIntegerBitIndex) : Integer; inline;\r\n\r\nbegin\r\n Self:=Self and not Integer((Integer(1) shl index));\r\n Result:=Self;\r\nend;\r\n\r\nFunction TIntegerHelper.ToggleBit(const index: TIntegerBitIndex) : Integer; inline;\r\n\r\nbegin\r\n Self := Self xor Integer((Integer(1) shl index));\r\n Result:=Self;\r\nend;\r\n\r\nFunction TIntegerHelper.TestBit(const Index: TIntegerBitIndex):Boolean; inline;\r\n\r\nbegin\r\n Result := (Self and Integer((Integer(1) shl index)))<>0;\r\nend;\r\n\r\n\r\n{ ---------------------------------------------------------------------\r\n TNativeIntHelper\r\n ---------------------------------------------------------------------}\r\n\r\nClass Function TNativeIntHelper.Parse(const AString: string): NativeInt; inline;\r\n\r\nbegin\r\n Result:=StrToInt(AString);\r\nend;\r\n\r\nClass Function TNativeIntHelper.Size: Integer; inline;\r\n\r\nbegin\r\n Result:=7;\r\nend;\r\n\r\nClass Function TNativeIntHelper.ToString(const AValue: NativeInt): string; overload; inline;\r\n\r\nbegin\r\n Result:=IntToStr(AValue);\r\nend;\r\n\r\nClass Function TNativeIntHelper.TryParse(const AString: string; out AValue: NativeInt): Boolean; inline;\r\n\r\nVar\r\n C : Integer;\r\n\r\nbegin\r\n Val(AString,AValue,C);\r\n Result:=(C=0);\r\nend;\r\n\r\nFunction TNativeIntHelper.ToBoolean: Boolean; inline;\r\n\r\nbegin\r\n Result:=(Self<>0);\r\nend;\r\n\r\nFunction TNativeIntHelper.ToDouble: Double; inline;\r\n\r\nbegin\r\n Result:=Self;\r\nend;\r\n\r\nFunction TNativeIntHelper.ToExtended: Extended; inline;\r\n\r\nbegin\r\n Result:=Self;\r\nend;\r\n\r\nFunction TNativeIntHelper.ToBinString: string; inline;\r\n\r\nbegin\r\n Result:=BinStr(Self,Size*8);\r\nend;\r\n\r\nFunction TNativeIntHelper.ToHexString(const AMinDigits: Integer): string;\r\noverload; inline;\r\n\r\nbegin\r\n Result:=IntToHex(Self,AMinDigits);\r\nend;\r\n\r\nFunction TNativeIntHelper.ToHexString: string; overload; inline;\r\n\r\nbegin\r\n Result:=IntToHex(Self,Size*2);\r\nend;\r\n\r\nFunction TNativeIntHelper.ToString: string; overload; inline;\r\n\r\nbegin\r\n Result:=IntToStr(Self);\r\nend;\r\n\r\nFunction TNativeIntHelper.SetBit(const index: TNativeIntBitIndex) : NativeInt; inline;\r\n\r\nbegin\r\n Self := Self or (NativeInt(1) shl index);\r\n Result:=Self;\r\nend;\r\n\r\nFunction TNativeIntHelper.ClearBit(const index: TNativeIntBitIndex) : NativeInt; inline;\r\n\r\nbegin\r\n Self:=Self and not NativeInt((NativeInt(1) shl index));\r\n Result:=Self;\r\nend;\r\n\r\nFunction TNativeIntHelper.ToggleBit(const index: TNativeIntBitIndex) : NativeInt; inline;\r\n\r\nbegin\r\n Self := Self xor NativeInt((NativeInt(1) shl index));\r\n Result:=Self;\r\nend;\r\n\r\nFunction TNativeIntHelper.TestBit(const Index: TNativeIntBitIndex):Boolean; inline;\r\n\r\nbegin\r\n Result := (Self and NativeInt((NativeInt(1) shl index)))<>0;\r\nend;\r\n\r\n\r\n{ ---------------------------------------------------------------------\r\n TNativeUIntHelper\r\n ---------------------------------------------------------------------}\r\n\r\nClass Function TNativeUIntHelper.Parse(const AString: string): NativeUInt; inline;\r\n\r\nbegin\r\n Result:=StrToInt(AString);\r\nend;\r\n\r\nClass Function TNativeUIntHelper.Size: Integer; inline;\r\n\r\nbegin\r\n Result:=7;\r\nend;\r\n\r\nClass Function TNativeUIntHelper.ToString(const AValue: NativeUInt): string; overload; inline;\r\n\r\nbegin\r\n Result:=IntToStr(AValue);\r\nend;\r\n\r\nClass Function TNativeUIntHelper.TryParse(const AString: string; out AValue: NativeUInt): Boolean; inline;\r\n\r\nVar\r\n C : Integer;\r\n\r\nbegin\r\n Val(AString,AValue,C);\r\n Result:=(C=0);\r\nend;\r\n\r\nFunction TNativeUIntHelper.ToBoolean: Boolean; inline;\r\n\r\nbegin\r\n Result:=(Self<>0);\r\nend;\r\n\r\nFunction TNativeUIntHelper.ToDouble: Double; inline;\r\n\r\nbegin\r\n Result:=Self;\r\nend;\r\n\r\nFunction TNativeUIntHelper.ToExtended: Extended; inline;\r\n\r\nbegin\r\n Result:=Self;\r\nend;\r\n\r\nFunction TNativeUIntHelper.ToBinString: string; inline;\r\n\r\nbegin\r\n Result:=BinStr(Self,Size*8);\r\nend;\r\n\r\nFunction TNativeUIntHelper.ToHexString(const AMinDigits: Integer): string;\r\noverload; inline;\r\n\r\nbegin\r\n Result:=IntToHex(Self,AMinDigits);\r\nend;\r\n\r\nFunction TNativeUIntHelper.ToHexString: string; overload; inline;\r\n\r\nbegin\r\n Result:=IntToHex(Self,Size*2);\r\nend;\r\n\r\nFunction TNativeUIntHelper.ToSingle: Single; inline;\r\n\r\nbegin\r\n Result:=Self;\r\nend;\r\n\r\nFunction TNativeUIntHelper.ToString: string; overload; inline;\r\n\r\nbegin\r\n Result:=IntToStr(Self);\r\nend;\r\n\r\nFunction TNativeUIntHelper.SetBit(const index: TNativeUIntBitIndex) : NativeUInt; inline;\r\n\r\nbegin\r\n Self := Self or (NativeUInt(1) shl index);\r\n Result:=Self;\r\nend;\r\n\r\nFunction TNativeUIntHelper.ClearBit(const index: TNativeUIntBitIndex) : NativeUInt; inline;\r\n\r\nbegin\r\n Self:=Self and not NativeUInt((NativeUInt(1) shl index));\r\n Result:=Self;\r\nend;\r\n\r\nFunction TNativeUIntHelper.ToggleBit(const index: TNativeUIntBitIndex) : NativeUInt; inline;\r\n\r\nbegin\r\n Self := Self xor NativeUInt((NativeUInt(1) shl index));\r\n Result:=Self;\r\nend;\r\n\r\nFunction TNativeUIntHelper.TestBit(const Index: TNativeUIntBitIndex):Boolean; inline;\r\n\r\nbegin\r\n Result := (Self and NativeUInt((NativeUInt(1) shl index)))<>0;\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n TBooleanHelper\r\n ---------------------------------------------------------------------}\r\n\r\nClass Function TBooleanHelper.Parse(const S: string): Boolean; inline;\r\n\r\nbegin\r\n Result:=StrToBool(S);\r\nend;\r\n\r\nClass Function TBooleanHelper.Size: Integer; inline;\r\n\r\nbegin\r\n Result:=1;\r\nend;\r\n\r\nClass Function TBooleanHelper.ToString(const AValue: Boolean; UseBoolStrs: Boolean = False): string; overload; inline;\r\n\r\nbegin\r\n Result:=BoolToStr(AValue,UseBoolStrs);\r\nend;\r\n\r\nClass Function TBooleanHelper.TryToParse(const S: string; out AValue: Boolean): Boolean; inline;\r\n\r\nbegin\r\n Result:=TryStrToBool(S,AValue);\r\nend;\r\n\r\nFunction TBooleanHelper.ToInteger: Integer; inline;\r\n\r\nbegin\r\n Result:=Integer(Self);\r\nend;\r\n\r\nFunction TBooleanHelper.ToString(UseBoolStrs: Boolean= False): string; overload; inline;\r\n\r\nbegin\r\n Result:=BoolToStr(Self,UseBoolStrs);\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n TByteBoolHelper\r\n ---------------------------------------------------------------------}\r\n\r\nClass Function TByteBoolHelper.Parse(const S: string): Boolean; inline;\r\n\r\nbegin\r\n Result:=StrToBool(S);\r\nend;\r\n\r\nClass Function TByteBoolHelper.Size: Integer; inline;\r\n\r\nbegin\r\n Result:=1;\r\nend;\r\n\r\nClass Function TByteBoolHelper.ToString(const AValue: Boolean; UseBoolStrs: Boolean = False): string; overload; inline;\r\n\r\nbegin\r\n Result:=BoolToStr(AValue,UseBoolStrs);\r\nend;\r\n\r\nClass Function TByteBoolHelper.TryToParse(const S: string; out AValue: Boolean): Boolean; inline;\r\n\r\nbegin\r\n Result:=TryStrToBool(S,AValue);\r\nend;\r\n\r\nFunction TByteBoolHelper.ToInteger: Integer; inline;\r\n\r\nbegin\r\n Result:=Integer(Self);\r\nend;\r\n\r\nFunction TByteBoolHelper.ToString(UseBoolStrs: Boolean = False): string; overload; inline;\r\n\r\nbegin\r\n Result:=BoolToStr(Self,UseBoolStrs);\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n TWordBoolHelper\r\n ---------------------------------------------------------------------}\r\n\r\nClass Function TWordBoolHelper.Parse(const S: string): Boolean; inline;\r\n\r\nbegin\r\n Result:=StrToBool(S);\r\nend;\r\n\r\nClass Function TWordBoolHelper.Size: Integer; inline;\r\n\r\nbegin\r\n Result:=2;\r\nend;\r\n\r\nClass Function TWordBoolHelper.ToString(const AValue: Boolean; UseBoolStrs: boolean = False): string; overload; inline;\r\n\r\nbegin\r\n Result:=BoolToStr(AValue,UseBoolStrs);\r\nend;\r\n\r\nClass Function TWordBoolHelper.TryToParse(const S: string; out AValue: Boolean): Boolean; inline;\r\n\r\nbegin\r\n Result:=TryStrToBool(S,AValue);\r\nend;\r\n\r\nFunction TWordBoolHelper.ToInteger: Integer; inline;\r\n\r\nbegin\r\n Result:=Integer(Self);\r\nend;\r\n\r\nFunction TWordBoolHelper.ToString(UseBoolStrs: Boolean = False): string; overload; inline;\r\n\r\nbegin\r\n Result:=BoolToStr(Self,UseBoolStrs);\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n TLongBoolHelper\r\n ---------------------------------------------------------------------}\r\n\r\n\r\nClass Function TLongBoolHelper.Parse(const S: string): Boolean; inline;\r\n\r\nbegin\r\n Result:=StrToBool(S);\r\nend;\r\n\r\nClass Function TLongBoolHelper.Size: Integer; inline;\r\n\r\nbegin\r\n Result:=4;\r\nend;\r\n\r\nClass Function TLongBoolHelper.ToString(const AValue: Boolean; UseBoolStrs: Boolean = False): string; overload; inline;\r\n\r\nbegin\r\n Result:=BoolToStr(AValue,UseBoolStrs);\r\nend;\r\n\r\nClass Function TLongBoolHelper.TryToParse(const S: string; out AValue: Boolean): Boolean; inline;\r\n\r\nbegin\r\n Result:=TryStrToBool(S,AValue);\r\nend;\r\n\r\nFunction TLongBoolHelper.ToInteger: Integer; inline;\r\n\r\nbegin\r\n Result:=Integer(Self);\r\nend;\r\n\r\nFunction TLongBoolHelper.ToString(UseBoolStrs: Boolean = False): string; overload; inline;\r\n\r\nbegin\r\n Result:=BoolToStr(Self,UseBoolStrs);\r\nend;\r\n\r\nend.\r\n\r\n","{\r\n This file is part of the Pas2JS run time library.\r\n Copyright (c) 2018 by Mattias Gaertner\r\n\r\n See the file COPYING.FPC, included in this distribution,\r\n for details about the copyright.\r\n\r\n This program is distributed in the hope that it will be useful,\r\n but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r\n\r\n **********************************************************************}\r\nunit TypInfo;\r\n\r\n{$mode objfpc}\r\n{$modeswitch externalclass}\r\n\r\ninterface\r\n\r\nuses\r\n SysUtils, Types, RTLConsts, JS;\r\n\r\ntype\r\n // TCallConv for compatibility with Delphi/FPC, ignored under pas2js\r\n TCallConv = (ccReg, ccCdecl, ccPascal, ccStdCall, ccSafeCall, ccCppdecl,\r\n ccFar16, ccOldFPCCall, ccInternProc, ccSysCall, ccSoftFloat, ccMWPascal);\r\n\r\n { TTypeInfoModule }\r\n\r\n TTypeInfoModule = class external name 'pasmodule'\r\n public\r\n Name: String external name '$name';\r\n end;\r\n\r\n TTypeInfoAttributes = type TJSValueDynArray;\r\n\r\n { TTypeInfo }\r\n\r\n TTypeInfo = class external name 'rtl.tTypeInfo'\r\n public\r\n Name: String external name 'name';\r\n Kind: TTypeKind external name 'kind';\r\n Attributes: TTypeInfoAttributes external name 'attr'; // can be undefined\r\n Module: TTypeInfoModule external name '$module'; // can be undefined\r\n end;\r\n TTypeInfoClassOf = class of TTypeInfo;\r\n\r\n PTypeInfo = Pointer; // for compatibility with Delphi/FPC, under pas2js it is a TTypeInfo\r\n\r\n TOrdType = (\r\n otSByte, // 0\r\n otUByte, // 1\r\n otSWord, // 2\r\n otUWord, // 3\r\n otSLong, // 4\r\n otULong, // 5\r\n otSIntDouble, // 6 NativeInt\r\n otUIntDouble // 7 NativeUInt\r\n );\r\n\r\n { TTypeInfoInteger - Kind = tkInteger }\r\n\r\n TTypeInfoInteger = class external name 'rtl.tTypeInfoInteger'(TTypeInfo)\r\n public\r\n MinValue: NativeInt external name 'minvalue';\r\n MaxValue: NativeInt external name 'maxvalue';\r\n OrdType : TOrdType external name 'ordtype';\r\n end;\r\n\r\n { TEnumType }\r\n\r\n TEnumType = class external name 'anonymous'\r\n private\r\n function GetIntToName(Index: NativeInt): String; external name '[]';\r\n function GetNameToInt(Name: String): NativeInt; external name '[]';\r\n public\r\n property IntToName[Index: NativeInt]: String read GetIntToName;\r\n property NameToInt[Name: String]: NativeInt read GetNameToInt;\r\n end;\r\n\r\n { TTypeInfoEnum - Kind = tkEnumeration }\r\n\r\n TTypeInfoEnum = class external name 'rtl.tTypeInfoEnum'(TTypeInfoInteger)\r\n public\r\n // not supported: BaseType: TTypeInfo\r\n EnumType: TEnumType external name 'enumtype';\r\n end;\r\n\r\n { TTypeInfoSet - Kind = tkSet }\r\n\r\n TTypeInfoSet = class external name 'rtl.tTypeInfoSet'(TTypeInfo)\r\n public\r\n // not supported: BaseType: TTypeInfo\r\n CompType: TTypeInfo external name 'comptype';\r\n end;\r\n\r\n { TTypeInfoStaticArray - Kind = tkArray }\r\n\r\n TTypeInfoStaticArray = class external name 'rtl.tTypeInfoStaticArray'(TTypeInfo)\r\n public\r\n Dims: TIntegerDynArray;\r\n ElType: TTypeInfo external name 'eltype';\r\n end;\r\n\r\n { TTypeInfoDynArray - Kind = tkDynArray }\r\n\r\n TTypeInfoDynArray = class external name 'rtl.tTypeInfoDynArray'(TTypeInfo)\r\n public\r\n DimCount: NativeInt external name 'dimcount';\r\n ElType: TTypeInfo external name 'eltype';\r\n end;\r\n\r\n TParamFlag = (\r\n pfVar, // 2^0 = 1\r\n pfConst, // 2^1 = 2\r\n pfOut, // 2^2 = 4\r\n pfArray, // 2^3 = 8\r\n pfAddress, // 2^4 = 16\r\n pfReference // 2^5 = 32\r\n );\r\n TParamFlags = set of TParamFlag;\r\n\r\n { TProcedureParam }\r\n\r\n TProcedureParam = class external name 'anonymous'\r\n public\r\n Name: String external name 'name';\r\n TypeInfo: TTypeInfo external name 'typeinfo';\r\n Flags: NativeInt external name 'flags'; // TParamFlags as bit vector\r\n end;\r\n\r\n TProcedureParams = array of TProcedureParam;\r\n\r\n TProcedureFlag = (\r\n pfStatic, // 2^0 = 1\r\n pfVarargs, // 2^1 = 2\r\n pfExternal // 2^2 = 4 name may be an expression\r\n );\r\n TProcedureFlags = set of TProcedureFlag;\r\n\r\n { TProcedureSignature }\r\n\r\n TProcedureSignature = class external name 'anonymous'\r\n public\r\n Params: TProcedureParams external name 'params'; // can be null\r\n ResultType: TTypeInfo external name 'resulttype'; // can be null\r\n Flags: NativeInt external name 'flags'; // TProcedureFlags as bit vector\r\n end;\r\n\r\n { TTypeInfoProcVar - Kind = tkProcVar }\r\n\r\n TTypeInfoProcVar = class external name 'rtl.tTypeInfoProcVar'(TTypeInfo)\r\n public\r\n ProcSig: TProcedureSignature external name 'procsig';\r\n end;\r\n\r\n { TTypeInfoRefToProcVar - Kind = tkRefToProcVar }\r\n\r\n TTypeInfoRefToProcVar = class external name 'rtl.tTypeInfoRefToProcVar'(TTypeInfoProcVar)\r\n end;\r\n\r\n TMethodKind = (\r\n mkProcedure, // 0 default\r\n mkFunction, // 1\r\n mkConstructor, // 2\r\n mkDestructor, // 3\r\n mkClassProcedure,// 4\r\n mkClassFunction // 5\r\n //mkClassConstructor,mkClassDestructor,mkOperatorOverload\r\n );\r\n TMethodKinds = set of TMethodKind;\r\n\r\n { TTypeInfoMethodVar - Kind = tkMethod }\r\n\r\n TTypeInfoMethodVar = class external name 'rtl.tTypeInfoMethodVar'(TTypeInfoProcVar)\r\n public\r\n MethodKind: TMethodKind external name 'methodkind';\r\n end;\r\n\r\n TTypeMemberKind = (\r\n tmkUnknown, // 0\r\n tmkField, // 1\r\n tmkMethod, // 2\r\n tmkProperty // 3\r\n );\r\n TTypeMemberKinds = set of TTypeMemberKind;\r\n\r\n { TTypeMember }\r\n\r\n TTypeMember = class external name 'rtl.tTypeMember'\r\n public\r\n Name: String external name 'name';\r\n Kind: TTypeMemberKind external name 'kind';\r\n Attributes: TTypeInfoAttributes external name 'attr'; // can be undefined\r\n end;\r\n TTypeMemberDynArray = array of TTypeMember;\r\n\r\n { TTypeMemberField - Kind = tmkField }\r\n\r\n TTypeMemberField = class external name 'rtl.tTypeMemberField'(TTypeMember)\r\n public\r\n TypeInfo: TTypeInfo external name 'typeinfo';\r\n end;\r\n\r\n { TTypeMemberMethod - Kind = tmkMethod }\r\n\r\n TTypeMemberMethod = class external name 'rtl.tTypeMemberMethod'(TTypeMember)\r\n public\r\n MethodKind: TMethodKind external name 'methodkind';\r\n ProcSig: TProcedureSignature external name 'procsig';\r\n end;\r\n TTypeMemberMethodDynArray = array of TTypeMemberMethod;\r\n\r\nconst\r\n pfGetFunction = 1; // getter is a function\r\n pfSetProcedure = 2; // setter is a procedure\r\n // stored is a 2-bit vector:\r\n pfStoredFalse = 4; // stored false, never\r\n pfStoredField = 8; // stored field, field name is in Stored\r\n pfStoredFunction = 12; // stored function, function name is in Stored\r\n pfHasIndex = 16; { if getter is function, append Index as last param\r\n if setter is function, append Index as second last param }\r\ntype\r\n { TTypeMemberProperty - Kind = tmkProperty }\r\n\r\n TTypeMemberProperty = class external name 'rtl.tTypeMemberProperty'(TTypeMember)\r\n public\r\n TypeInfo: TTypeInfo external name 'typeinfo';\r\n Flags: NativeInt external name 'flags'; // bit vector, see pf constants above\r\n Params: TProcedureParams external name 'params'; // can be null or undefined\r\n Index: JSValue external name 'index'; // can be undefined\r\n Getter: String external name 'getter'; // name of field or function\r\n Setter: String external name 'setter'; // name of field or function\r\n Stored: String external name 'stored'; // name of field or function, can be undefined\r\n Default: JSValue external name 'Default'; // can be undefined\r\n end;\r\n TTypeMemberPropertyDynArray = array of TTypeMemberProperty;\r\n\r\n { TTypeMembers }\r\n\r\n TTypeMembers = class external name 'rtl.tTypeMembers'\r\n private\r\n function GetItems(Name: String): TTypeMember; external name '[]';\r\n procedure SetItems(Name: String; const AValue: TTypeMember); external name '[]';\r\n public\r\n property Members[Name: String]: TTypeMember read GetItems write SetItems; default;\r\n end;\r\n\r\n { TTypeInfoStruct }\r\n\r\n TTypeInfoStruct = class external name 'rtl.tTypeInfoStruct'(TTypeInfo)\r\n private\r\n FFieldCount: NativeInt external name 'fields.length';\r\n FMethodCount: NativeInt external name 'methods.length';\r\n FPropCount: NativeInt external name 'properties.length';\r\n public\r\n Members: TTypeMembers external name 'members';\r\n Names: TStringDynArray external name 'names'; // all member names with TTypeInfo\r\n Fields: TStringDynArray external name 'fields';\r\n Methods: TStringDynArray external name 'methods';\r\n Properties: TStringDynArray external name 'properties';\r\n property FieldCount: NativeInt read FFieldCount;\r\n function GetField(Index: NativeInt): TTypeMemberField; external name 'getField';\r\n function AddField(aName: String; aType: TTypeInfo; Options: TJSObject = nil\r\n ): TTypeMemberField; external name 'addField';\r\n property MethodCount: NativeInt read FMethodCount;\r\n function GetMethod(Index: NativeInt): TTypeMemberMethod; external name 'getMethod';\r\n function AddMethod(aName: String; MethodKind: TMethodKind = mkProcedure;\r\n Params: TJSArray = nil; ResultType: TTypeInfo = nil;\r\n Options: TJSObject = nil): TTypeMemberMethod; external name 'addMethod';\r\n property PropCount: NativeInt read FPropCount;\r\n function GetProp(Index: NativeInt): TTypeMemberProperty; external name 'getProperty';\r\n function AddProperty(aName: String; Flags: NativeInt; ResultType: TTypeInfo;\r\n Getter, Setter: String; Options: TJSObject = nil): TTypeMemberProperty; external name 'addProperty';\r\n end;\r\n\r\n { TTypeInfoRecord - Kind = tkRecord }\r\n\r\n TTypeInfoRecord = class external name 'rtl.tTypeInfoRecord'(TTypeInfoStruct)\r\n public\r\n RecordType: TJSObject external name 'record';\r\n end;\r\n\r\n { TTypeInfoClass - Kind = tkClass }\r\n\r\n TTypeInfoClass = class external name 'rtl.tTypeInfoClass'(TTypeInfoStruct)\r\n public\r\n ClassType: TClass external name 'class';\r\n Ancestor: TTypeInfoClass external name 'ancestor';\r\n end;\r\n\r\n { TTypeInfoExtClass - Kind = tkExtClass }\r\n\r\n TTypeInfoExtClass = class external name 'rtl.tTypeInfoExtClass'(TTypeInfoClass)\r\n public\r\n JSClassName: String external name 'jsclass';\r\n end;\r\n\r\n { TTypeInfoClassRef - class-of, Kind = tkClassRef }\r\n\r\n TTypeInfoClassRef = class external name 'rtl.tTypeInfoClassRef'(TTypeInfo)\r\n public\r\n InstanceType: TTypeInfo external name 'instancetype';\r\n end;\r\n\r\n { TTypeInfoPointer - Kind = tkPointer }\r\n\r\n TTypeInfoPointer = class external name 'rtl.tTypeInfoPointer'(TTypeInfo)\r\n public\r\n RefType: TTypeInfo external name 'reftype'; // can be null\r\n end;\r\n\r\n { TTypeInfoInterface - Kind = tkInterface }\r\n\r\n TTypeInfoInterface = class external name 'rtl.tTypeInfoInterface'(TTypeInfoStruct)\r\n public\r\n InterfaceType: TJSObject external name 'interface';\r\n Ancestor: TTypeInfoInterface external name 'ancestor';\r\n end;\r\n\r\n { TTypeInfoHelper - Kind = tkHelper }\r\n\r\n TTypeInfoHelper = class external name 'rtl.tTypeInfoHelper'(TTypeInfoStruct)\r\n public\r\n HelperType: TJSObject external name 'helper';\r\n Ancestor: TTypeInfoHelper external name 'ancestor';\r\n HelperFor: TTypeInfo external name 'helperfor';\r\n end;\r\n\r\n EPropertyError = class(Exception);\r\n\r\nfunction GetClassMembers(aTIStruct: TTypeInfoStruct): TTypeMemberDynArray;\r\nfunction GetClassMember(aTIStruct: TTypeInfoStruct; const aName: String): TTypeMember;\r\nfunction GetInstanceMethod(Instance: TObject; const aName: String): Pointer;\r\nfunction GetClassMethods(aTIStruct: TTypeInfoStruct): TTypeMemberMethodDynArray;\r\nfunction CreateMethod(Instance: TObject; FuncName: String): Pointer; external name 'rtl.createCallback';\r\n\r\nfunction GetInterfaceMembers(aTIInterface: TTypeInfoInterface): TTypeMemberDynArray;\r\nfunction GetInterfaceMember(aTIInterface: TTypeInfoInterface; const aName: String): TTypeMember;\r\nfunction GetInterfaceMethods(aTIInterface: TTypeInfoInterface): TTypeMemberMethodDynArray;\r\n\r\nfunction GetRTTIAttributes(const Attributes: TTypeInfoAttributes): TCustomAttributeArray;\r\n\r\nfunction GetPropInfos(aTIStruct: TTypeInfoStruct): TTypeMemberPropertyDynArray;\r\nfunction GetPropList(aTIStruct: TTypeInfoStruct; TypeKinds: TTypeKinds; Sorted: boolean = true): TTypeMemberPropertyDynArray;\r\nfunction GetPropList(aTIStruct: TTypeInfoStruct): TTypeMemberPropertyDynArray;\r\nfunction GetPropList(AClass: TClass): TTypeMemberPropertyDynArray;\r\nfunction GetPropList(Instance: TObject): TTypeMemberPropertyDynArray;\r\n\r\nfunction GetPropInfo(TI: TTypeInfoStruct; const PropName: String): TTypeMemberProperty;\r\nfunction GetPropInfo(TI: TTypeInfoStruct; const PropName: String; const Kinds: TTypeKinds): TTypeMemberProperty;\r\nfunction GetPropInfo(Instance: TObject; const PropName: String): TTypeMemberProperty;\r\nfunction GetPropInfo(Instance: TObject; const PropName: String; const Kinds: TTypeKinds): TTypeMemberProperty;\r\nfunction GetPropInfo(aClass: TClass; const PropName: String): TTypeMemberProperty;\r\nfunction GetPropInfo(aClass: TClass; const PropName: String; const Kinds: TTypeKinds): TTypeMemberProperty;\r\n\r\nfunction FindPropInfo(Instance: TObject; const PropName: String): TTypeMemberProperty;\r\nfunction FindPropInfo(Instance: TObject; const PropName: String; const Kinds: TTypeKinds): TTypeMemberProperty;\r\nfunction FindPropInfo(aClass: TClass; const PropName: String): TTypeMemberProperty;\r\nfunction FindPropInfo(aClass: TClass; const PropName: String; const Kinds: TTypeKinds): TTypeMemberProperty;\r\n\r\n// Property information routines.\r\nFunction IsStoredProp(Instance: TObject; const PropInfo: TTypeMemberProperty): Boolean;\r\nFunction IsStoredProp(Instance: TObject; const PropName: string): Boolean;\r\nfunction IsPublishedProp(Instance: TObject; const PropName: String): Boolean;\r\nfunction IsPublishedProp(aClass: TClass; const PropName: String): Boolean;\r\nfunction PropType(Instance: TObject; const PropName: string): TTypeKind;\r\nfunction PropType(aClass: TClass; const PropName: string): TTypeKind;\r\nfunction PropIsType(Instance: TObject; const PropName: string; const TypeKind: TTypeKind): Boolean;\r\nfunction PropIsType(aClass: TClass; const PropName: string; const TypeKind: TTypeKind): Boolean;\r\n\r\nfunction GetJSValueProp(Instance: TJSObject; TI: TTypeInfoStruct; const PropName: String): JSValue;\r\nfunction GetJSValueProp(Instance: TJSObject; const PropInfo: TTypeMemberProperty): JSValue;\r\nfunction GetJSValueProp(Instance: TObject; const PropName: String): JSValue;\r\nfunction GetJSValueProp(Instance: TObject; const PropInfo: TTypeMemberProperty): JSValue;\r\nprocedure SetJSValueProp(Instance: TJSObject; TI: TTypeInfoStruct; const PropName: String; Value: JSValue);\r\nprocedure SetJSValueProp(Instance: TJSObject; const PropInfo: TTypeMemberProperty; Value: JSValue);\r\nprocedure SetJSValueProp(Instance: TObject; const PropName: String; Value: JSValue);\r\nprocedure SetJSValueProp(Instance: TObject; const PropInfo: TTypeMemberProperty; Value: JSValue);\r\n\r\nfunction GetNativeIntProp(Instance: TObject; const PropName: String): NativeInt;\r\nfunction GetNativeIntProp(Instance: TObject; const PropInfo: TTypeMemberProperty): NativeInt;\r\nprocedure SetNativeIntProp(Instance: TObject; const PropName: String; Value: NativeInt);\r\nprocedure SetNativeIntProp(Instance: TObject; const PropInfo: TTypeMemberProperty; Value: NativeInt);\r\n\r\nfunction GetOrdProp(Instance: TObject; const PropName: String): longint;\r\nfunction GetOrdProp(Instance: TObject; const PropInfo: TTypeMemberProperty): longint;\r\nprocedure SetOrdProp(Instance: TObject; const PropName: String; Value: longint);\r\nprocedure SetOrdProp(Instance: TObject; const PropInfo: TTypeMemberProperty; Value: longint);\r\n\r\nfunction GetEnumProp(Instance: TObject; const PropName: String): String;\r\nfunction GetEnumProp(Instance: TObject; const PropInfo: TTypeMemberProperty): String;\r\nprocedure SetEnumProp(Instance: TObject; const PropName: String; const Value: String);\r\nprocedure SetEnumProp(Instance: TObject; const PropInfo: TTypeMemberProperty; const Value: String);\r\n// Auxiliary routines, which may be useful\r\nfunction GetEnumName(TypeInfo: TTypeInfoEnum; Value: Integer): String;\r\nfunction GetEnumValue(TypeInfo: TTypeInfoEnum; const Name: string): Longint;\r\nfunction GetEnumNameCount(TypeInfo: TTypeInfoEnum): Longint;\r\n\r\nfunction GetSetProp(Instance: TObject; const PropName: String): String; overload;\r\nfunction GetSetProp(Instance: TObject; const PropInfo: TTypeMemberProperty): String; overload;\r\nfunction GetSetPropArray(Instance: TObject; const PropName: String): TIntegerDynArray; overload;\r\nfunction GetSetPropArray(Instance: TObject; const PropInfo: TTypeMemberProperty): TIntegerDynArray; overload;\r\nprocedure SetSetPropArray(Instance: TObject; const PropName: String; const Arr: TIntegerDynArray); overload;\r\nprocedure SetSetPropArray(Instance: TObject; const PropInfo: TTypeMemberProperty; const Arr: TIntegerDynArray); overload;\r\n\r\nfunction GetBoolProp(Instance: TObject; const PropName: String): boolean;\r\nfunction GetBoolProp(Instance: TObject; const PropInfo: TTypeMemberProperty): boolean;\r\nprocedure SetBoolProp(Instance: TObject; const PropName: String; Value: boolean);\r\nprocedure SetBoolProp(Instance: TObject; const PropInfo: TTypeMemberProperty; Value: boolean);\r\n\r\nfunction GetStrProp(Instance: TObject; const PropName: String): String;\r\nfunction GetStrProp(Instance: TObject; const PropInfo: TTypeMemberProperty): String;\r\nprocedure SetStrProp(Instance: TObject; const PropName: String; Value: String);\r\nprocedure SetStrProp(Instance: TObject; const PropInfo: TTypeMemberProperty; Value: String);\r\n\r\nfunction GetStringProp(Instance: TObject; const PropName: String): String; deprecated; // use GetStrProp\r\nfunction GetStringProp(Instance: TObject; const PropInfo: TTypeMemberProperty): String; deprecated; // use GetStrProp\r\nprocedure SetStringProp(Instance: TObject; const PropName: String; Value: String); deprecated; // use GetStrProp\r\nprocedure SetStringProp(Instance: TObject; const PropInfo: TTypeMemberProperty; Value: String); deprecated; // use GetStrProp\r\n\r\nfunction GetFloatProp(Instance: TObject; const PropName: string): Double;\r\nfunction GetFloatProp(Instance: TObject; PropInfo : TTypeMemberProperty) : Double;\r\nprocedure SetFloatProp(Instance: TObject; const PropName: string; Value: Double);\r\nprocedure SetFloatProp(Instance: TObject; PropInfo : TTypeMemberProperty; Value : Double);\r\n\r\nfunction GetObjectProp(Instance: TObject; const PropName: String): TObject;\r\nfunction GetObjectProp(Instance: TObject; const PropName: String; MinClass: TClass): TObject;\r\nfunction GetObjectProp(Instance: TObject; const PropInfo: TTypeMemberProperty): TObject;\r\nfunction GetObjectProp(Instance: TObject; const PropInfo: TTypeMemberProperty; MinClass: TClass): TObject;\r\nprocedure SetObjectProp(Instance: TObject; const PropName: String; Value: TObject) ;\r\nprocedure SetObjectProp(Instance: TObject; const PropInfo: TTypeMemberProperty; Value: TObject);\r\n\r\nfunction GetMethodProp(Instance: TObject; PropInfo: TTypeMemberProperty): TMethod;\r\nfunction GetMethodProp(Instance: TObject; const PropName: string): TMethod;\r\nprocedure SetMethodProp(Instance: TObject; PropInfo: TTypeMemberProperty; const Value : TMethod);\r\nprocedure SetMethodProp(Instance: TObject; const PropName: string; const Value: TMethod);\r\n\r\nfunction GetInterfaceProp(Instance: TObject; const PropName: string): IInterface;\r\nfunction GetInterfaceProp(Instance: TObject; PropInfo: TTypeMemberProperty): IInterface;\r\nprocedure SetInterfaceProp(Instance: TObject; const PropName: string; const Value: IInterface);\r\nprocedure SetInterfaceProp(Instance: TObject; PropInfo: TTypeMemberProperty; const Value: IInterface);\r\n\r\nfunction GetRawInterfaceProp(Instance: TObject; const PropName: string): Pointer;\r\nfunction GetRawInterfaceProp(Instance: TObject; PropInfo: TTypeMemberProperty): Pointer;\r\nprocedure SetRawInterfaceProp(Instance: TObject; const PropName: string; const Value: Pointer);\r\nprocedure SetRawInterfaceProp(Instance: TObject; PropInfo: TTypeMemberProperty; const Value: Pointer);\r\n\r\nimplementation\r\n\r\nfunction GetClassMembers(aTIStruct: TTypeInfoStruct): TTypeMemberDynArray;\r\nvar\r\n C: TTypeInfoStruct;\r\n i: Integer;\r\n PropName: String;\r\n Names: TJSObject;\r\nbegin\r\n Result:=nil;\r\n Names:=TJSObject.new;\r\n C:=aTIStruct;\r\n while C<>nil do\r\n begin\r\n for i:=0 to length(C.Names)-1 do\r\n begin\r\n PropName:=C.Names[i];\r\n if Names.hasOwnProperty(PropName) then continue;\r\n TJSArray(Result).push(C.Members[PropName]);\r\n Names[PropName]:=true;\r\n end;\r\n if not (C is TTypeInfoClass) then break;\r\n C:=TTypeInfoClass(C).Ancestor;\r\n end;\r\nend;\r\n\r\nfunction GetClassMember(aTIStruct: TTypeInfoStruct; const aName: String): TTypeMember;\r\nvar\r\n C: TTypeInfoStruct;\r\n i: Integer;\r\nbegin\r\n // quick search: case sensitive\r\n C:=aTIStruct;\r\n while C<>nil do\r\n begin\r\n if TJSObject(C.Members).hasOwnProperty(aName) then\r\n exit(C.Members[aName]);\r\n if not (C is TTypeInfoClass) then break;\r\n C:=TTypeInfoClass(C).Ancestor;\r\n end;\r\n // slow search: case insensitive\r\n C:=aTIStruct;\r\n while C<>nil do\r\n begin\r\n for i:=0 to length(C.Names)-1 do\r\n if CompareText(C.Names[i],aName)=0 then\r\n exit(C.Members[C.Names[i]]);\r\n if not (C is TTypeInfoClass) then break;\r\n C:=TTypeInfoClass(C).Ancestor;\r\n end;\r\n Result:=nil;\r\nend;\r\n\r\nfunction GetInstanceMethod(Instance: TObject; const aName: String): Pointer;\r\nvar\r\n TI: TTypeMember;\r\nbegin\r\n if Instance=nil then exit(nil);\r\n TI:=GetClassMember(TypeInfo(Instance),aName);\r\n if not (TI is TTypeMemberMethod) then exit(nil);\r\n Result:=CreateMethod(Instance,TI.Name); // Note: use TI.Name for the correct case!\r\nend;\r\n\r\nfunction GetClassMethods(aTIStruct: TTypeInfoStruct): TTypeMemberMethodDynArray;\r\nvar\r\n C: TTypeInfoStruct;\r\n i, Cnt, j: Integer;\r\nbegin\r\n Cnt:=0;\r\n C:=aTIStruct;\r\n while C<>nil do\r\n begin\r\n inc(Cnt,C.MethodCount);\r\n if not (C is TTypeInfoClass) then break;\r\n C:=TTypeInfoClass(C).Ancestor;\r\n end;\r\n SetLength(Result,Cnt);\r\n C:=aTIStruct;\r\n i:=0;\r\n while C<>nil do\r\n begin\r\n for j:=0 to C.MethodCount-1 do\r\n begin\r\n Result[i]:=TTypeMemberMethod(C.Members[C.Methods[j]]);\r\n inc(i);\r\n end;\r\n if not (C is TTypeInfoClass) then break;\r\n C:=TTypeInfoClass(C).Ancestor;\r\n end;\r\nend;\r\n\r\nfunction GetInterfaceMembers(aTIInterface: TTypeInfoInterface\r\n ): TTypeMemberDynArray;\r\nvar\r\n Intf: TTypeInfoInterface;\r\n i, Cnt, j: Integer;\r\nbegin\r\n Cnt:=0;\r\n Intf:=aTIInterface;\r\n while Intf<>nil do\r\n begin\r\n inc(Cnt,length(Intf.Names));\r\n Intf:=Intf.Ancestor;\r\n end;\r\n SetLength(Result,Cnt);\r\n Intf:=aTIInterface;\r\n i:=0;\r\n while Intf<>nil do\r\n begin\r\n for j:=0 to length(Intf.Names)-1 do\r\n begin\r\n Result[i]:=Intf.Members[Intf.Names[j]];\r\n inc(i);\r\n end;\r\n Intf:=Intf.Ancestor;\r\n end;\r\nend;\r\n\r\nfunction GetInterfaceMember(aTIInterface: TTypeInfoInterface;\r\n const aName: String): TTypeMember;\r\nvar\r\n Intf: TTypeInfoInterface;\r\n i: Integer;\r\nbegin\r\n // quick search: case sensitive\r\n Intf:=aTIInterface;\r\n while Intf<>nil do\r\n begin\r\n if TJSObject(Intf.Members).hasOwnProperty(aName) then\r\n exit(Intf.Members[aName]);\r\n Intf:=Intf.Ancestor;\r\n end;\r\n // slow search: case insensitive\r\n Intf:=aTIInterface;\r\n while Intf<>nil do\r\n begin\r\n for i:=0 to length(Intf.Names)-1 do\r\n if CompareText(Intf.Names[i],aName)=0 then\r\n exit(Intf.Members[Intf.Names[i]]);\r\n Intf:=Intf.Ancestor;\r\n end;\r\n Result:=nil;\r\nend;\r\n\r\nfunction GetInterfaceMethods(aTIInterface: TTypeInfoInterface\r\n ): TTypeMemberMethodDynArray;\r\nvar\r\n Intf: TTypeInfoInterface;\r\n i, Cnt, j: Integer;\r\nbegin\r\n Cnt:=0;\r\n Intf:=aTIInterface;\r\n while Intf<>nil do\r\n begin\r\n inc(Cnt,Intf.MethodCount);\r\n Intf:=Intf.Ancestor;\r\n end;\r\n SetLength(Result,Cnt);\r\n Intf:=aTIInterface;\r\n i:=0;\r\n while Intf<>nil do\r\n begin\r\n for j:=0 to Intf.MethodCount-1 do\r\n begin\r\n Result[i]:=TTypeMemberMethod(Intf.Members[Intf.Methods[j]]);\r\n inc(i);\r\n end;\r\n Intf:=Intf.Ancestor;\r\n end;\r\nend;\r\n\r\ntype\r\n TCreatorAttribute = class external name 'attr'\r\n class function Create(const ProcName: string): TCustomAttribute; overload; external name '$create';\r\n class function Create(const ProcName: string; Params: jsvalue): TCustomAttribute; overload; external name '$create';\r\n end;\r\n TCreatorAttributeClass = class of TCreatorAttribute;\r\n\r\nfunction GetRTTIAttributes(const Attributes: TTypeInfoAttributes\r\n ): TCustomAttributeArray;\r\nvar\r\n i, len: Integer;\r\n AttrClass: TCreatorAttributeClass;\r\n ProcName: String;\r\n Attr: TCustomAttribute;\r\nbegin\r\n Result:=nil;\r\n if Attributes=Undefined then exit;\r\n i:=0;\r\n len:=length(Attributes);\r\n while inil do\r\n begin\r\n for i:=0 to C.PropCount-1 do\r\n begin\r\n PropName:=C.Properties[i];\r\n if Names.hasOwnProperty(PropName) then continue;\r\n TJSArray(Result).push(TTypeMemberProperty(C.Members[PropName]));\r\n Names[PropName]:=true;\r\n end;\r\n if not (C is TTypeInfoClass) then\r\n break;\r\n C:=TTypeInfoClass(C).Ancestor;\r\n end;\r\nend;\r\n\r\nfunction GetPropList(aTIStruct: TTypeInfoStruct; TypeKinds: TTypeKinds;\r\n Sorted: boolean): TTypeMemberPropertyDynArray;\r\n\r\n function NameSort(a,b: JSValue): NativeInt;\r\n begin\r\n if TTypeMemberProperty(a).NameTTypeMemberProperty(b).Name then\r\n Result:=1\r\n else\r\n Result:=0;\r\n end;\r\n\r\nvar\r\n C: TTypeInfoStruct;\r\n i: Integer;\r\n Names: TJSObject;\r\n PropName: String;\r\n Prop: TTypeMemberProperty;\r\nbegin\r\n Result:=nil;\r\n C:=aTIStruct;\r\n Names:=TJSObject.new;\r\n while C<>nil do\r\n begin\r\n for i:=0 to C.PropCount-1 do\r\n begin\r\n PropName:=C.Properties[i];\r\n if Names.hasOwnProperty(PropName) then continue;\r\n Prop:=TTypeMemberProperty(C.Members[PropName]);\r\n if not (Prop.TypeInfo.Kind in TypeKinds) then continue;\r\n TJSArray(Result).push(Prop);\r\n Names[PropName]:=true;\r\n end;\r\n if not (C is TTypeInfoClass) then\r\n break;\r\n C:=TTypeInfoClass(C).Ancestor;\r\n end;\r\n if Sorted then\r\n TJSArray(Result).sort(@NameSort);\r\nend;\r\n\r\nfunction GetPropList(aTIStruct: TTypeInfoStruct): TTypeMemberPropertyDynArray;\r\nbegin\r\n Result:=GetPropInfos(aTIStruct);\r\nend;\r\n\r\nfunction GetPropList(AClass: TClass): TTypeMemberPropertyDynArray;\r\nbegin\r\n Result:=GetPropInfos(TypeInfo(AClass));\r\nend;\r\n\r\nfunction GetPropList(Instance: TObject): TTypeMemberPropertyDynArray;\r\nbegin\r\n Result:=GetPropList(Instance.ClassType);\r\nend;\r\n\r\nfunction GetPropInfo(TI: TTypeInfoStruct; const PropName: String\r\n ): TTypeMemberProperty;\r\nvar\r\n m: TTypeMember;\r\n i: Integer;\r\n C: TTypeInfoStruct;\r\nbegin\r\n // quick search case sensitive\r\n C:=TI;\r\n while C<>nil do\r\n begin\r\n m:=C.Members[PropName];\r\n if m is TTypeMemberProperty then\r\n exit(TTypeMemberProperty(m));\r\n if not (C is TTypeInfoClass) then\r\n break;\r\n C:=TTypeInfoClass(C).Ancestor;\r\n end;\r\n\r\n // slow search case insensitive\r\n Result:=nil;\r\n repeat\r\n for i:=0 to TI.PropCount-1 do\r\n if CompareText(PropName,TI.Properties[i])=0 then\r\n begin\r\n m:=TI.Members[TI.Properties[i]];\r\n if m is TTypeMemberProperty then\r\n Result:=TTypeMemberProperty(m);\r\n exit;\r\n end;\r\n if not (TI is TTypeInfoClass) then\r\n break;\r\n TI:=TTypeInfoClass(TI).Ancestor;\r\n until TI=nil;\r\nend;\r\n\r\nfunction GetPropInfo(TI: TTypeInfoStruct; const PropName: String;\r\n const Kinds: TTypeKinds): TTypeMemberProperty;\r\nbegin\r\n Result:=GetPropInfo(TI,PropName);\r\n if (Kinds<>[]) and (Result<>nil) and not (Result.TypeInfo.Kind in Kinds) then\r\n Result:=nil;\r\nend;\r\n\r\nfunction GetPropInfo(Instance: TObject; const PropName: String\r\n ): TTypeMemberProperty;\r\nbegin\r\n Result:=GetPropInfo(TypeInfo(Instance),PropName,[]);\r\nend;\r\n\r\nfunction GetPropInfo(Instance: TObject; const PropName: String;\r\n const Kinds: TTypeKinds): TTypeMemberProperty;\r\nbegin\r\n Result:=GetPropInfo(TypeInfo(Instance),PropName,Kinds);\r\nend;\r\n\r\nfunction GetPropInfo(aClass: TClass; const PropName: String\r\n ): TTypeMemberProperty;\r\nbegin\r\n Result:=GetPropInfo(TypeInfo(AClass),PropName,[]);\r\nend;\r\n\r\nfunction GetPropInfo(aClass: TClass; const PropName: String;\r\n const Kinds: TTypeKinds): TTypeMemberProperty;\r\nbegin\r\n Result:=GetPropInfo(TypeInfo(AClass),PropName,Kinds);\r\nend;\r\n\r\nfunction FindPropInfo(Instance: TObject; const PropName: String\r\n ): TTypeMemberProperty;\r\nbegin\r\n Result:=GetPropInfo(TypeInfo(Instance), PropName);\r\n if Result=nil then\r\n raise EPropertyError.CreateFmt(SErrPropertyNotFound, [PropName]);\r\nend;\r\n\r\nfunction FindPropInfo(Instance: TObject; const PropName: String;\r\n const Kinds: TTypeKinds): TTypeMemberProperty;\r\nbegin\r\n Result:=GetPropInfo(TypeInfo(Instance), PropName, Kinds);\r\n if Result=nil then\r\n raise EPropertyError.CreateFmt(SErrPropertyNotFound, [PropName]);\r\nend;\r\n\r\nfunction FindPropInfo(aClass: TClass; const PropName: String\r\n ): TTypeMemberProperty;\r\nbegin\r\n Result:=GetPropInfo(TypeInfo(aClass), PropName);\r\n if Result=nil then\r\n raise EPropertyError.CreateFmt(SErrPropertyNotFound, [PropName]);\r\nend;\r\n\r\nfunction FindPropInfo(aClass: TClass; const PropName: String;\r\n const Kinds: TTypeKinds): TTypeMemberProperty;\r\nbegin\r\n Result:=GetPropInfo(TypeInfo(aClass), PropName, Kinds);\r\n if Result=nil then\r\n raise EPropertyError.CreateFmt(SErrPropertyNotFound, [PropName]);\r\nend;\r\n\r\nfunction IsStoredProp(Instance: TObject; const PropInfo: TTypeMemberProperty\r\n ): Boolean;\r\ntype\r\n TIsStored = function: Boolean of object;\r\nbegin\r\n case PropInfo.Flags and 12 of\r\n 0: Result:=true;\r\n 4: Result:=false;\r\n 8: Result:=Boolean(TJSObject(Instance)[PropInfo.Stored]);\r\n else Result:=TIsStored(TJSObject(Instance)[PropInfo.Stored])();\r\n end;\r\nend;\r\n\r\nfunction IsStoredProp(Instance: TObject; const PropName: string): Boolean;\r\nbegin\r\n Result:=IsStoredProp(Instance,FindPropInfo(Instance,PropName));\r\nend;\r\n\r\nfunction IsPublishedProp(Instance: TObject; const PropName: String): Boolean;\r\nbegin\r\n Result:=GetPropInfo(Instance,PropName)<>nil;\r\nend;\r\n\r\nfunction IsPublishedProp(aClass: TClass; const PropName: String): Boolean;\r\nbegin\r\n Result:=GetPropInfo(aClass,PropName)<>nil;\r\nend;\r\n\r\nfunction PropType(Instance: TObject; const PropName: string): TTypeKind;\r\nbegin\r\n Result:=FindPropInfo(Instance,PropName).TypeInfo.Kind;\r\nend;\r\n\r\nfunction PropType(aClass: TClass; const PropName: string): TTypeKind;\r\nbegin\r\n Result:=FindPropInfo(aClass,PropName).TypeInfo.Kind;\r\nend;\r\n\r\nfunction PropIsType(Instance: TObject; const PropName: string;\r\n const TypeKind: TTypeKind): Boolean;\r\nbegin\r\n Result:=PropType(Instance,PropName)=TypeKind;\r\nend;\r\n\r\nfunction PropIsType(aClass: TClass; const PropName: string;\r\n const TypeKind: TTypeKind): Boolean;\r\nbegin\r\n Result:=PropType(aClass,PropName)=TypeKind;\r\nend;\r\n\r\ntype\r\n TGetterKind = (\r\n gkNone,\r\n gkField,\r\n gkFunction,\r\n gkFunctionWithParams\r\n );\r\n\r\nfunction GetPropGetterKind(const PropInfo: TTypeMemberProperty): TGetterKind;\r\nbegin\r\n if PropInfo.Getter='' then\r\n Result:=gkNone\r\n else if (pfGetFunction and PropInfo.Flags)>0 then\r\n begin\r\n if length(PropInfo.Params)>0 then\r\n // array property\r\n Result:=gkFunctionWithParams\r\n else\r\n Result:=gkFunction;\r\n end\r\n else\r\n Result:=gkField;\r\nend;\r\n\r\ntype\r\n TSetterKind = (\r\n skNone,\r\n skField,\r\n skProcedure,\r\n skProcedureWithParams\r\n );\r\n\r\nfunction GetPropSetterKind(const PropInfo: TTypeMemberProperty): TSetterKind;\r\nbegin\r\n if PropInfo.Setter='' then\r\n Result:=skNone\r\n else if (pfSetProcedure and PropInfo.Flags)>0 then\r\n begin\r\n if length(PropInfo.Params)>0 then\r\n // array property\r\n Result:=skProcedureWithParams\r\n else\r\n Result:=skProcedure;\r\n end\r\n else\r\n Result:=skField;\r\nend;\r\n\r\nfunction GetJSValueProp(Instance: TJSObject; TI: TTypeInfoStruct;\r\n const PropName: String): JSValue;\r\nvar\r\n PropInfo: TTypeMemberProperty;\r\nbegin\r\n PropInfo:=GetPropInfo(TI,PropName);\r\n if PropInfo=nil then\r\n raise EPropertyError.CreateFmt(SErrPropertyNotFound, [PropName]);\r\n Result:=GetJSValueProp(Instance,PropInfo);\r\nend;\r\n\r\nfunction GetJSValueProp(Instance: TJSObject;\r\n const PropInfo: TTypeMemberProperty): JSValue;\r\ntype\r\n TGetter = function: JSValue of object;\r\n TGetterWithIndex = function(Index: JSValue): JSValue of object;\r\nvar\r\n gk: TGetterKind;\r\nbegin\r\n gk:=GetPropGetterKind(PropInfo);\r\n case gk of\r\n gkNone:\r\n raise EPropertyError.CreateFmt(SCantReadPropertyS, [PropInfo.Name]);\r\n gkField:\r\n Result:=Instance[PropInfo.Getter];\r\n gkFunction:\r\n if (pfHasIndex and PropInfo.Flags)>0 then\r\n Result:=TGetterWithIndex(Instance[PropInfo.Getter])(PropInfo.Index)\r\n else\r\n Result:=TGetter(Instance[PropInfo.Getter])();\r\n gkFunctionWithParams:\r\n raise EPropertyError.CreateFmt(SIndexedPropertyNeedsParams, [PropInfo.Name]);\r\n end;\r\nend;\r\n\r\nfunction GetJSValueProp(Instance: TObject; const PropName: String): JSValue;\r\nbegin\r\n Result:=GetJSValueProp(Instance,FindPropInfo(Instance,PropName));\r\nend;\r\n\r\nfunction GetJSValueProp(Instance: TObject; const PropInfo: TTypeMemberProperty\r\n ): JSValue;\r\nbegin\r\n Result:=GetJSValueProp(TJSObject(Instance),PropInfo);\r\nend;\r\n\r\nprocedure SetJSValueProp(Instance: TJSObject; TI: TTypeInfoStruct;\r\n const PropName: String; Value: JSValue);\r\nvar\r\n PropInfo: TTypeMemberProperty;\r\nbegin\r\n PropInfo:=GetPropInfo(TI,PropName);\r\n if PropInfo=nil then\r\n raise EPropertyError.CreateFmt(SErrPropertyNotFound, [PropName]);\r\n SetJSValueProp(Instance,PropInfo,Value);\r\nend;\r\n\r\nprocedure SetJSValueProp(Instance: TJSObject;\r\n const PropInfo: TTypeMemberProperty; Value: JSValue);\r\ntype\r\n TSetter = procedure(Value: JSValue) of object;\r\n TSetterWithIndex = procedure(Index, Value: JSValue) of object;\r\nvar\r\n sk: TSetterKind;\r\nbegin\r\n sk:=GetPropSetterKind(PropInfo);\r\n case sk of\r\n skNone:\r\n raise EPropertyError.CreateFmt(SCantWritePropertyS, [PropInfo.Name]);\r\n skField:\r\n Instance[PropInfo.Setter]:=Value;\r\n skProcedure:\r\n if (pfHasIndex and PropInfo.Flags)>0 then\r\n TSetterWithIndex(Instance[PropInfo.Setter])(PropInfo.Index,Value)\r\n else\r\n TSetter(Instance[PropInfo.Setter])(Value);\r\n skProcedureWithParams:\r\n raise EPropertyError.CreateFmt(SIndexedPropertyNeedsParams, [PropInfo.Name]);\r\n end;\r\nend;\r\n\r\nprocedure SetJSValueProp(Instance: TObject; const PropName: String;\r\n Value: JSValue);\r\nbegin\r\n SetJSValueProp(Instance,FindPropInfo(Instance,PropName),Value);\r\nend;\r\n\r\nprocedure SetJSValueProp(Instance: TObject;\r\n const PropInfo: TTypeMemberProperty; Value: JSValue);\r\nbegin\r\n SetJSValueProp(TJSObject(Instance),PropInfo,Value);\r\nend;\r\n\r\nfunction GetNativeIntProp(Instance: TObject; const PropName: String): NativeInt;\r\nbegin\r\n Result:=GetNativeIntProp(Instance,FindPropInfo(Instance,PropName));\r\nend;\r\n\r\nfunction GetNativeIntProp(Instance: TObject; const PropInfo: TTypeMemberProperty\r\n ): NativeInt;\r\nbegin\r\n Result:=NativeInt(GetJSValueProp(Instance,PropInfo));\r\nend;\r\n\r\nprocedure SetNativeIntProp(Instance: TObject; const PropName: String;\r\n Value: NativeInt);\r\nbegin\r\n SetJSValueProp(Instance,FindPropInfo(Instance,PropName),Value);\r\nend;\r\n\r\nprocedure SetNativeIntProp(Instance: TObject;\r\n const PropInfo: TTypeMemberProperty; Value: NativeInt);\r\nbegin\r\n SetJSValueProp(Instance,PropInfo,Value);\r\nend;\r\n\r\nfunction GetOrdProp(Instance: TObject; const PropName: String): longint;\r\nbegin\r\n Result:=GetOrdProp(Instance,FindPropInfo(Instance,PropName));\r\nend;\r\n\r\nfunction GetOrdProp(Instance: TObject; const PropInfo: TTypeMemberProperty\r\n ): longint;\r\nvar\r\n o: TJSObject;\r\n Key: String;\r\n n: NativeInt;\r\nbegin\r\n if PropInfo.TypeInfo.Kind=tkSet then\r\n begin\r\n // a set is a JS object, with the following property: o[ElementDecimal]=true\r\n o:=TJSObject(GetJSValueProp(Instance,PropInfo));\r\n Result:=0;\r\n for Key in o do\r\n begin\r\n n:=parseInt(Key,10);\r\n if n<32 then\r\n Result:=Result+(1 shl n);\r\n end;\r\n end else\r\n Result:=longint(GetJSValueProp(Instance,PropInfo));\r\nend;\r\n\r\nprocedure SetOrdProp(Instance: TObject; const PropName: String; Value: longint);\r\nbegin\r\n SetOrdProp(Instance,FindPropInfo(Instance,PropName),Value);\r\nend;\r\n\r\nprocedure SetOrdProp(Instance: TObject; const PropInfo: TTypeMemberProperty;\r\n Value: longint);\r\nvar\r\n o: TJSObject;\r\n i: Integer;\r\nbegin\r\n if PropInfo.TypeInfo.Kind=tkSet then\r\n begin\r\n o:=TJSObject.new;\r\n for i:=0 to 31 do\r\n if (1 shl i) and Value>0 then\r\n o[str(i)]:=true;\r\n SetJSValueProp(Instance,PropInfo,o);\r\n end else\r\n SetJSValueProp(Instance,PropInfo,Value);\r\nend;\r\n\r\nfunction GetEnumProp(Instance: TObject; const PropName: String): String;\r\nbegin\r\n Result:=GetEnumProp(Instance,FindPropInfo(Instance,PropName));\r\nend;\r\n\r\nfunction GetEnumProp(Instance: TObject; const PropInfo: TTypeMemberProperty): String;\r\nvar\r\n n: NativeInt;\r\n TIEnum: TTypeInfoEnum;\r\nbegin\r\n TIEnum:=PropInfo.TypeInfo as TTypeInfoEnum;\r\n n:=NativeInt(GetJSValueProp(Instance,PropInfo));\r\n if (n>=TIEnum.MinValue) and (n<=TIEnum.MaxValue) then\r\n Result:=TIEnum.EnumType.IntToName[n]\r\n else\r\n Result:=str(n);\r\nend;\r\n\r\nprocedure SetEnumProp(Instance: TObject; const PropName: String;\r\n const Value: String);\r\nbegin\r\n SetEnumProp(Instance,FindPropInfo(Instance,PropName),Value);\r\nend;\r\n\r\nprocedure SetEnumProp(Instance: TObject; const PropInfo: TTypeMemberProperty;\r\n const Value: String);\r\nvar\r\n TIEnum: TTypeInfoEnum;\r\n n: NativeInt;\r\nbegin\r\n TIEnum:=PropInfo.TypeInfo as TTypeInfoEnum;\r\n n:=TIEnum.EnumType.NameToInt[Value];\r\n if not isUndefined(n) then\r\n SetJSValueProp(Instance,PropInfo,n);\r\nend;\r\n\r\nfunction GetEnumName(TypeInfo: TTypeInfoEnum; Value: Integer): String;\r\nbegin\r\n Result:=TypeInfo.EnumType.IntToName[Value];\r\nend;\r\n\r\nfunction GetEnumValue(TypeInfo: TTypeInfoEnum; const Name: string): Longint;\r\nbegin\r\n Result:=TypeInfo.EnumType.NameToInt[Name];\r\nend;\r\n\r\nfunction GetEnumNameCount(TypeInfo: TTypeInfoEnum): Longint;\r\nvar\r\n o: TJSObject;\r\n l, r: LongInt;\r\nbegin\r\n o:=TJSObject(TypeInfo.EnumType);\r\n // as of pas2js 1.0 the RTTI does not contain a min/max value\r\n // -> use exponential search\r\n // ToDo: adapt this once enums with gaps are supported\r\n Result:=1;\r\n while o.hasOwnProperty(String(JSValue(Result))) do\r\n Result:=Result*2;\r\n l:=Result div 2;\r\n r:=Result;\r\n while l<=r do\r\n begin\r\n Result:=(l+r) div 2;\r\n if o.hasOwnProperty(String(JSValue(Result))) then\r\n l:=Result+1\r\n else\r\n r:=Result-1;\r\n end;\r\n if o.hasOwnProperty(String(JSValue(Result))) then\r\n inc(Result);\r\nend;\r\n\r\nfunction GetSetProp(Instance: TObject; const PropName: String): String;\r\nbegin\r\n Result:=GetSetProp(Instance,FindPropInfo(Instance,PropName));\r\nend;\r\n\r\nfunction GetSetProp(Instance: TObject; const PropInfo: TTypeMemberProperty\r\n ): String;\r\nvar\r\n o: TJSObject;\r\n key, Value: String;\r\n n: NativeInt;\r\n TIEnum: TTypeInfoEnum;\r\n TISet: TTypeInfoSet;\r\nbegin\r\n Result:='';\r\n // get enum type if available\r\n TISet:=PropInfo.TypeInfo as TTypeInfoSet;\r\n TIEnum:=nil;\r\n if TISet.CompType is TTypeInfoEnum then\r\n TIEnum:=TTypeInfoEnum(TISet.CompType);\r\n // read value\r\n o:=TJSObject(GetJSValueProp(Instance,PropInfo));\r\n // a set is a JS object, where included element is stored as: o[ElementDecimal]=true\r\n for Key in o do\r\n begin\r\n n:=parseInt(Key,10);\r\n if (TIEnum<>nil) and (n>=TIEnum.MinValue) and (n<=TIEnum.MaxValue) then\r\n Value:=TIEnum.EnumType.IntToName[n]\r\n else\r\n Value:=str(n);\r\n if Result<>'' then Result:=Result+',';\r\n Result:=Result+Value;\r\n end;\r\n Result:='['+Result+']';\r\nend;\r\n\r\nfunction GetSetPropArray(Instance: TObject; const PropName: String\r\n ): TIntegerDynArray;\r\nbegin\r\n Result:=GetSetPropArray(Instance,FindPropInfo(Instance,PropName));\r\nend;\r\n\r\nfunction GetSetPropArray(Instance: TObject; const PropInfo: TTypeMemberProperty\r\n ): TIntegerDynArray;\r\nvar\r\n o: TJSObject;\r\n Key: string;\r\nbegin\r\n Result:=[];\r\n // read value\r\n o:=TJSObject(GetJSValueProp(Instance,PropInfo));\r\n // a set is a JS object, where included element is stored as: o[ElementDecimal]=true\r\n for Key in o do\r\n TJSArray(Result).push(parseInt(Key,10));\r\nend;\r\n\r\nprocedure SetSetPropArray(Instance: TObject; const PropName: String;\r\n const Arr: TIntegerDynArray);\r\nbegin\r\n SetSetPropArray(Instance,FindPropInfo(Instance,PropName),Arr);\r\nend;\r\n\r\nprocedure SetSetPropArray(Instance: TObject;\r\n const PropInfo: TTypeMemberProperty; const Arr: TIntegerDynArray);\r\nvar\r\n o: TJSObject;\r\n i: integer;\r\nbegin\r\n o:=TJSObject.new;\r\n for i in Arr do\r\n o[str(i)]:=true;\r\n SetJSValueProp(Instance,PropInfo,o);\r\nend;\r\n\r\nfunction GetStrProp(Instance: TObject; const PropName: String): String;\r\nbegin\r\n Result:=GetStrProp(Instance,FindPropInfo(Instance,PropName));\r\nend;\r\n\r\nfunction GetStrProp(Instance: TObject; const PropInfo: TTypeMemberProperty\r\n ): String;\r\nbegin\r\n Result:=String(GetJSValueProp(Instance,PropInfo));\r\nend;\r\n\r\nprocedure SetStrProp(Instance: TObject; const PropName: String; Value: String\r\n );\r\nbegin\r\n SetStrProp(Instance,FindPropInfo(Instance,PropName),Value);\r\nend;\r\n\r\nprocedure SetStrProp(Instance: TObject; const PropInfo: TTypeMemberProperty;\r\n Value: String);\r\nbegin\r\n SetJSValueProp(Instance,PropInfo,Value);\r\nend;\r\n\r\nfunction GetStringProp(Instance: TObject; const PropName: String): String;\r\nbegin\r\n Result:=GetStrProp(Instance,PropName);\r\nend;\r\n\r\nfunction GetStringProp(Instance: TObject; const PropInfo: TTypeMemberProperty\r\n ): String;\r\nbegin\r\n Result:=GetStrProp(Instance,PropInfo);\r\nend;\r\n\r\nprocedure SetStringProp(Instance: TObject; const PropName: String; Value: String\r\n );\r\nbegin\r\n SetStrProp(Instance,PropName,Value);\r\nend;\r\n\r\nprocedure SetStringProp(Instance: TObject; const PropInfo: TTypeMemberProperty;\r\n Value: String);\r\nbegin\r\n SetStrProp(Instance,PropInfo,Value);\r\nend;\r\n\r\nfunction GetBoolProp(Instance: TObject; const PropName: String): boolean;\r\nbegin\r\n Result:=GetBoolProp(Instance,FindPropInfo(Instance,PropName));\r\nend;\r\n\r\nfunction GetBoolProp(Instance: TObject; const PropInfo: TTypeMemberProperty\r\n ): boolean;\r\nbegin\r\n Result:=Boolean(GetJSValueProp(Instance,PropInfo));\r\nend;\r\n\r\nprocedure SetBoolProp(Instance: TObject; const PropName: String; Value: boolean\r\n );\r\nbegin\r\n SetBoolProp(Instance,FindPropInfo(Instance,PropName),Value);\r\nend;\r\n\r\nprocedure SetBoolProp(Instance: TObject; const PropInfo: TTypeMemberProperty;\r\n Value: boolean);\r\nbegin\r\n SetJSValueProp(Instance,PropInfo,Value);\r\nend;\r\n\r\nfunction GetObjectProp(Instance: TObject; const PropName: String): TObject;\r\nbegin\r\n Result:=GetObjectProp(Instance,FindPropInfo(Instance,PropName));\r\nend;\r\n\r\nfunction GetObjectProp(Instance: TObject; const PropName: String; MinClass : TClass): TObject;\r\nbegin\r\n Result:=GetObjectProp(Instance,FindPropInfo(Instance,PropName));\r\n if (MinClass<>Nil) and (Result<>Nil) Then\r\n if not Result.InheritsFrom(MinClass) then\r\n Result:=Nil;\r\nend;\r\n\r\nfunction GetObjectProp(Instance: TObject; const PropInfo: TTypeMemberProperty): TObject;\r\n\r\nbegin\r\n Result:=GetObjectProp(Instance,PropInfo,Nil);\r\nend;\r\n\r\nfunction GetObjectProp(Instance: TObject; const PropInfo: TTypeMemberProperty; MinClass : TClass): TObject;\r\n\r\nVar\r\n O : TObject;\r\n\r\nbegin\r\n O:=TObject(GetJSValueProp(Instance,PropInfo));\r\n if (MinClass<>Nil) and not O.InheritsFrom(MinClass) then\r\n Result:=Nil\r\n else\r\n Result:=O;\r\nend;\r\n\r\nprocedure SetObjectProp(Instance: TObject; const PropName: String; Value: TObject) ;\r\n\r\nbegin\r\n SetObjectProp(Instance,FindPropInfo(Instance,PropName),Value);\r\nend;\r\n\r\nprocedure SetObjectProp(Instance: TObject; const PropInfo: TTypeMemberProperty; Value: TObject);\r\n\r\nbegin\r\n SetJSValueProp(Instance,PropInfo,Value);\r\nend;\r\n\r\nfunction GetMethodProp(Instance: TObject; PropInfo: TTypeMemberProperty\r\n ): TMethod;\r\nvar\r\n v, fn: JSValue;\r\nbegin\r\n Result.Code:=nil;\r\n Result.Data:=nil;\r\n v:=GetJSValueProp(Instance,PropInfo);\r\n if not isFunction(v) then exit;\r\n Result.Data:=Pointer(TJSObject(v)['scope']);\r\n fn:=TJSObject(v)['fn'];\r\n if isString(fn) then\r\n begin\r\n if Result.Data<>nil then\r\n // named callback\r\n Result.Code:=CodePointer(TJSObject(Result.Data)[String(fn)])\r\n else\r\n // this is not an rtl callback, return the value\r\n Result.Code:=CodePointer(v);\r\n end\r\n else\r\n // anonymous callback\r\n Result.Code:=CodePointer(fn);\r\nend;\r\n\r\nfunction GetMethodProp(Instance: TObject; const PropName: string): TMethod;\r\nbegin\r\n Result:=GetMethodProp(Instance,FindPropInfo(Instance,PropName));\r\nend;\r\n\r\nfunction createCallbackPtr(scope: Pointer; fn: CodePointer): TJSFunction; external name 'rtl.createCallback';\r\nfunction createCallbackStr(scope: Pointer; fn: string): TJSFunction; external name 'rtl.createCallback';\r\n\r\nprocedure SetMethodProp(Instance: TObject; PropInfo: TTypeMemberProperty;\r\n const Value: TMethod);\r\nvar\r\n cb: TJSFunction;\r\n Code: Pointer;\r\nbegin\r\n // Note: Value.Data=nil is allowed and can be used by designer code\r\n Code:=Value.Code;\r\n if Code=nil then\r\n cb:=nil\r\n else if isFunction(Code) then\r\n begin\r\n if (TJSObject(Code)['scope']=Value.Data)\r\n and (isFunction(TJSObject(Code)['fn']) or isString(TJSObject(Code)['fn']))\r\n then\r\n begin\r\n // Value.Code is already the needed callback\r\n cb:=TJSFunction(Code);\r\n end\r\n else if isString(TJSObject(Code)['fn']) then\r\n // named callback, different scope\r\n cb:=createCallbackStr(Value.Data,string(TJSObject(Code)['fn']))\r\n else\r\n // normal function\r\n cb:=createCallbackPtr(Value.Data,Code);\r\n end\r\n else\r\n // not a valid value -> for compatibility set it anyway\r\n cb:=createCallbackPtr(Value.Data,Code);\r\n SetJSValueProp(Instance,PropInfo,cb);\r\nend;\r\n\r\nprocedure SetMethodProp(Instance: TObject; const PropName: string;\r\n const Value: TMethod);\r\nbegin\r\n SetMethodProp(Instance,FindPropInfo(Instance,PropName),Value);\r\nend;\r\n\r\nfunction GetInterfaceProp(Instance: TObject; const PropName: string\r\n ): IInterface;\r\nbegin\r\n Result:=GetInterfaceProp(Instance,FindPropInfo(Instance,PropName));\r\nend;\r\n\r\nfunction GetInterfaceProp(Instance: TObject; PropInfo: TTypeMemberProperty\r\n ): IInterface;\r\ntype\r\n TGetter = function: IInterface of object;\r\n TGetterWithIndex = function(Index: JSValue): IInterface of object;\r\nvar\r\n gk: TGetterKind;\r\nbegin\r\n if Propinfo.TypeInfo.Kind<>tkInterface then\r\n raise Exception.Create('Cannot get RAW interface from IInterface interface');\r\n gk:=GetPropGetterKind(PropInfo);\r\n case gk of\r\n gkNone:\r\n raise EPropertyError.CreateFmt(SCantReadPropertyS, [PropInfo.Name]);\r\n gkField:\r\n Result:=IInterface(TJSObject(Instance)[PropInfo.Getter]);\r\n gkFunction:\r\n if (pfHasIndex and PropInfo.Flags)>0 then\r\n Result:=TGetterWithIndex(TJSObject(Instance)[PropInfo.Getter])(PropInfo.Index)\r\n else\r\n Result:=TGetter(TJSObject(Instance)[PropInfo.Getter])();\r\n gkFunctionWithParams:\r\n raise EPropertyError.CreateFmt(SIndexedPropertyNeedsParams, [PropInfo.Name]);\r\n end;\r\nend;\r\n\r\nprocedure SetInterfaceProp(Instance: TObject; const PropName: string;\r\n const Value: IInterface);\r\nbegin\r\n SetInterfaceProp(Instance,FindPropInfo(Instance,PropName),Value);\r\nend;\r\n\r\nprocedure SetInterfaceProp(Instance: TObject; PropInfo: TTypeMemberProperty;\r\n const Value: IInterface);\r\ntype\r\n TSetter = procedure(Value: IInterface) of object;\r\n TSetterWithIndex = procedure(Index: JSValue; Value: IInterface) of object;\r\nprocedure setIntfP(Instance: TObject; const PropName: string; value: jsvalue); external name 'rtl.setIntfP';\r\nvar\r\n sk: TSetterKind;\r\n Setter: String;\r\nbegin\r\n if Propinfo.TypeInfo.Kind<>tkInterface then\r\n raise Exception.Create('Cannot set RAW interface from IInterface interface');\r\n sk:=GetPropSetterKind(PropInfo);\r\n Setter:=PropInfo.Setter;\r\n case sk of\r\n skNone:\r\n raise EPropertyError.CreateFmt(SCantWritePropertyS, [PropInfo.Name]);\r\n skField:\r\n setIntfP(Instance,Setter,Value);\r\n skProcedure:\r\n if (pfHasIndex and PropInfo.Flags)>0 then\r\n TSetterWithIndex(TJSObject(Instance)[Setter])(PropInfo.Index,Value)\r\n else\r\n TSetter(TJSObject(Instance)[Setter])(Value);\r\n skProcedureWithParams:\r\n raise EPropertyError.CreateFmt(SIndexedPropertyNeedsParams, [PropInfo.Name]);\r\n end;\r\nend;\r\n\r\nfunction GetRawInterfaceProp(Instance: TObject; const PropName: string\r\n ): Pointer;\r\nbegin\r\n Result:=GetRawInterfaceProp(Instance,FindPropInfo(Instance,PropName));\r\nend;\r\n\r\nfunction GetRawInterfaceProp(Instance: TObject; PropInfo: TTypeMemberProperty\r\n ): Pointer;\r\nbegin\r\n Result:=Pointer(GetJSValueProp(Instance,PropInfo));\r\nend;\r\n\r\nprocedure SetRawInterfaceProp(Instance: TObject; const PropName: string;\r\n const Value: Pointer);\r\nbegin\r\n SetRawInterfaceProp(Instance,FindPropInfo(Instance,PropName),Value);\r\nend;\r\n\r\nprocedure SetRawInterfaceProp(Instance: TObject; PropInfo: TTypeMemberProperty;\r\n const Value: Pointer);\r\nbegin\r\n SetJSValueProp(Instance,PropInfo,Value);\r\nend;\r\n\r\nfunction GetFloatProp(Instance: TObject; PropInfo: TTypeMemberProperty): Double;\r\nbegin\r\n Result:=Double(GetJSValueProp(Instance,PropInfo));\r\nend;\r\n\r\nfunction GetFloatProp(Instance: TObject; const PropName: string): Double;\r\nbegin\r\n Result:=GetFloatProp(Instance,FindPropInfo(Instance,PropName));\r\nend;\r\n\r\nprocedure SetFloatProp(Instance: TObject; const PropName: string; Value: Double\r\n );\r\nbegin\r\n SetFloatProp(Instance,FindPropInfo(Instance,PropName),Value);\r\nend;\r\n\r\nprocedure SetFloatProp(Instance: TObject; PropInfo: TTypeMemberProperty;\r\n Value: Double);\r\nbegin\r\n SetJSValueProp(Instance,PropInfo,Value);\r\nend;\r\n\r\nend.\r\n\r\n","unit simplelinkedlist;\r\n\r\n{$mode objfpc}\r\n\r\ninterface\r\n\r\nType\r\n TLinkedListItem = Class\r\n Public\r\n Next : TLinkedListItem;\r\n end;\r\n TLinkedListItemClass = Class of TLinkedListItem;\r\n\r\n { TLinkedListVisitor }\r\n\r\n TLinkedListVisitor = Class\r\n Function Visit(Item : TLinkedListItem) : Boolean; virtual; abstract;\r\n end;\r\n { TLinkedList }\r\n\r\n TLinkedList = Class\r\n private\r\n FItemClass: TLinkedListItemClass;\r\n FRoot: TLinkedListItem;\r\n function GetCount: Integer;\r\n Public\r\n Constructor Create(AnItemClass : TLinkedListItemClass); virtual;\r\n Destructor Destroy; override;\r\n Procedure Clear;\r\n Function Add : TLinkedListItem;\r\n Procedure ForEach(Visitor: TLinkedListVisitor);\r\n Procedure RemoveItem(Item : TLinkedListItem; FreeItem : Boolean = False);\r\n Property Root : TLinkedListItem Read FRoot;\r\n Property ItemClass : TLinkedListItemClass Read FItemClass;\r\n Property Count : Integer Read GetCount;\r\n end;\r\n\r\nimplementation\r\n\r\nuses sysutils;\r\n\r\n{ TLinkedList }\r\n\r\nfunction TLinkedList.GetCount: Integer;\r\n\r\nVar\r\n I : TLinkedListItem;\r\n\r\nbegin\r\n I:=FRoot;\r\n Result:=0;\r\n While I<>Nil do\r\n begin\r\n I:=I.Next;\r\n Inc(Result);\r\n end;\r\nend;\r\n\r\nconstructor TLinkedList.Create(AnItemClass: TLinkedListItemClass);\r\nbegin\r\n FItemClass:=AnItemClass;\r\nend;\r\n\r\ndestructor TLinkedList.Destroy;\r\nbegin\r\n Clear;\r\n inherited Destroy;\r\nend;\r\n\r\nprocedure TLinkedList.Clear;\r\n\r\nVar\r\n I : TLinkedListItem;\r\n\r\nbegin\r\n // Can't use visitor, because it'd kill the next pointer...\r\n I:=FRoot;\r\n While I<>Nil do\r\n begin\r\n FRoot:=I;\r\n I:=I.Next;\r\n FRoot.Next:=Nil;\r\n FreeAndNil(FRoot);\r\n end;\r\nend;\r\n\r\nfunction TLinkedList.Add: TLinkedListItem;\r\nbegin\r\n Result:=FItemClass.Create;\r\n Result.Next:=FRoot;\r\n FRoot:=Result;\r\nend;\r\n\r\nprocedure TLinkedList.ForEach(Visitor : TLinkedListVisitor);\r\n\r\nVar\r\n I : TLinkedListItem;\r\n\r\nbegin\r\n I:=FRoot;\r\n While (I<>Nil) and Visitor.Visit(I) do\r\n I:=I.Next;\r\nend;\r\n\r\nprocedure TLinkedList.RemoveItem(Item: TLinkedListItem; FreeItem : Boolean = False);\r\n\r\nVar\r\n I : TLinkedListItem;\r\n\r\nbegin\r\n If (Item<>Nil) and (FRoot<>Nil) then\r\n begin\r\n If (Item=FRoot) then\r\n FRoot:=Item.Next\r\n else\r\n begin\r\n I:=FRoot;\r\n While (I.Next<>Nil) and (I.Next<>Item) do\r\n I:=I.Next;\r\n If (I.Next=Item) then\r\n I.Next:=Item.Next;\r\n end;\r\n If FreeItem Then\r\n Item.Free;\r\n end;\r\nend;\r\n\r\n\r\n\r\nend.\r\n\r\n","{\r\n This file is part of the Pas2JS run time library.\r\n Copyright (c) 2017-2020 by the Pas2JS development team.\r\n\r\n See the file COPYING.FPC, included in this distribution,\r\n for details about the copyright.\r\n\r\n This program is distributed in the hope that it will be useful,\r\n but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r\n\r\n **********************************************************************}\r\n\r\n{$mode objfpc}\r\n{$modeswitch externalclass}\r\n\r\nunit Web;\r\n\r\ninterface\r\n\r\nuses Types, JS;\r\n\r\nType\r\n TJSEvent = Class;\r\n // Forward definitions\r\n TJSWindow = class;\r\n TJSDOMTokenList = class;\r\n TJSXPathResult = CLass;\r\n TJSNodeList = class;\r\n TJSDocument = class;\r\n TJSElement = class;\r\n TJSCSSStyleSheet = Class;\r\n TJSNodeFilter = Class;\r\n TJSIDBObjectStore = Class;\r\n TIDBDatabase = class;\r\n TJSIDBRequest = class;\r\n TJSEventTarget = class;\r\n TJSMouseEvent = Class;\r\n TJSWheelEvent = Class;\r\n TJSKeyBoardEvent = class;\r\n TJSPointerEvent = Class;\r\n TJSUIEvent = class;\r\n TJSTouchEvent = Class;\r\n TJSInputEvent = class;\r\n\r\n\r\n { TEventListenerEvent }\r\n\r\n(*\r\nTEventListenerEvent = class external name 'EventListener_Event' (TJSObject)\r\n private\r\n FTarget: TJSEventTarget; external name 'target';\r\n public\r\n Property target: TJSEventTarget Read FTarget;\r\n end;\r\n*)\r\n TEventListenerEvent = TJSEvent;\r\n\r\n TJSEventHandler = reference to function(Event: TEventListenerEvent): boolean; safecall;\r\n TJSRawEventHandler = reference to Procedure(Event: TJSEvent); safecall;\r\n\r\n TJSEventTarget = class external name 'EventTarget' (TJSObject)\r\n public\r\n procedure addEventListener(aname : string; aListener : TJSEventHandler);\r\n procedure addEventListener(aname : string; aListener : TJSRawEventHandler);\r\n procedure addEventListener(aname : string; aListener : JSValue);\r\n function dispatchEvent(event : JSValue) : Boolean;\r\n procedure removeEventListener(aname : string; aListener : TJSEventHandler);\r\n procedure removeEventListener(aname : string; aListener : TJSRawEventHandler);\r\n procedure removeEventListener(aname : string; aListener : JSValue);\r\n end;\r\n\r\n TJSNode = class external name 'Node' (TJSEventTarget)\r\n Private\r\n FBaseURI : String; external name 'baseURI';\r\n FChildNodes: TJSNodeList; external name 'childNodes';\r\n FFirstChild : TJSNode; external name 'firstChild';\r\n FNextSibling : TJSNode; external name 'nextSibling';\r\n FNodeName : String; external name 'nodeName';\r\n FNodeType : NativeInt; external name 'nodeType';\r\n FOwnerDocument : TJSDocument; external name 'ownerDocument';\r\n FParentElement : TJSElement; external name 'parentElement';\r\n FParentNode : TJSNode; external name 'parentNode';\r\n FPreviousSibling : TJSNode; external name 'previousSibling';\r\n Public \r\n Const\r\n ELEMENT_NODE \t=1;\r\n TEXT_NODE \t=3;\r\n PROCESSING_INSTRUCTION_NODE = \t7;\r\n COMMENT_NODE \t=8;\r\n DOCUMENT_NODE \t=9;\r\n DOCUMENT_TYPE_NODE \t= 10;\r\n DOCUMENT_FRAGMENT_NODE = 11;\r\n\r\n DOCUMENT_POSITION_DISCONNECTED \t= 1;\r\n DOCUMENT_POSITION_PRECEDING \t= 2;\r\n DOCUMENT_POSITION_FOLLOWING \t= 4;\r\n DOCUMENT_POSITION_CONTAINS \t= 8;\r\n DOCUMENT_POSITION_CONTAINED_BY \t= 16;\r\n DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC = 32;\r\n Public \r\n nodeValue: string;\r\n innerText : string;\r\n textContent : string;\r\n function appendChild(aChild : TJSNode) : TJSNode;\r\n function cloneNode(deep: boolean): TJSNode;\r\n function compareDocumentPosition(aNode : TJSNode) : NativeInt;\r\n function contains(aNode : TJSNode) : boolean;\r\n function hasChildNodes : boolean;\r\n function insertBefore(newNode, referenceNode : TJSNode) : TJSNode;\r\n function isDefaultNameSpace(aNameSpaceURI : String) : Boolean;\r\n function isEqualNode(aNode : TJSNode) : boolean;\r\n function isSameNode(aNode : TJSNode) : boolean;\r\n function lookupNamespaceURI(aPrefix : string) : string;\r\n function lookupPrefix(aPrefix : string) : string;\r\n procedure normalize;\r\n function removeChild(aChild: TJSNode) : TJSNode;\r\n function replaceChild(aNewChild, aOldChild : TJSNode) : TJSNode;\r\n property baseURI : string read FBaseURI;\r\n property childNodes : TJSNodeList read FChildNodes;\r\n property firstChild : TJSNode Read FFirstChild;\r\n property nextSibling : TJSNode Read FNextSibling;\r\n property nodeName : String Read FNodeName;\r\n property nodeType : NativeInt Read FNodeType;\r\n property ownerDocument : TJSDocument read FOwnerDocument; \r\n property parentElement : TJSElement read FParentElement;\r\n property parentNode : TJSNode read FParentNode;\r\n property previousSibling : TJSNode Read FPreviousSibling;\r\n end;\r\n\r\n\r\n TJSNodeListCallBack = procedure (currentValue : TJSNode; currentIndex: NativeInt; list : TJSNodeList);\r\n TJSNodeListEvent = procedure (currentValue : TJSNode; currentIndex: NativeInt; list : TJSNodeList) of object;\r\n \r\n TJSNodeList = class external name 'NodeList' (TJSObject)\r\n Private\r\n FLength : NativeInt; external name 'length';\r\n Public\r\n procedure forEach(const aCallBack : TJSNodeListCallBack);\r\n procedure forEach(const aCallBack : TJSNodeListEvent);\r\n function item(aIndex : NativeInt) : TJSNode;\r\n Property length : NativeInt Read FLength;\r\n Property Nodes [aIndex : NativeInt] : TJSNode Read item; default;\r\n end;\r\n\r\n TJSAttr = class external name 'Attr' (TJSNode)\r\n Private\r\n fLocalName : String; external name 'localName';\r\n fNameSpaceURI : String external name 'namespaceURI';\r\n fPrefix : string; external name 'prefix';\r\n fName : string; external name 'name';\r\n fSpecified : Boolean; external name 'specified';\r\n public\r\n value : JSValue;\r\n property localName : String Read fLocalName;\r\n property namespaceURI : string Read fNameSpaceURI;\r\n property prefix : string read fPrefix;\r\n property name : string Read fName;\r\n property specified : boolean Read fSpecified; // Useless, always true\r\n end;\r\n\r\n\r\n TJSNamedNodeMap = class external name 'NamedNodeMap' (TJSObject)\r\n Public\r\n function getNamedItem(aName : string) : TJSAttr;\r\n Property Attrs[aIndex : String] : TJSattr Read getNamedItem; default;\r\n end;\r\n \r\n TJSHTMLCollection = class external name 'HTMLCollection' (TJSObject)\r\n Private\r\n FLength : NativeInt; external name 'length';\r\n public\r\n Function item(aIndex : Integer) : TJSNode;\r\n Function namedItem(aName : string) : TJSNode;\r\n property Items[aIndex : Integer] : TJSNode Read item; default;\r\n property NamedItems[aName : String] : TJSNode Read namedItem; \r\n Property length : NativeInt Read FLength;\r\n end; \r\n \r\n TJSDOMString = String;\r\n\r\n TDOMTokenlistCallBack = Procedure (Current : JSValue; currentIndex : NativeInt; list : TJSDOMTokenList);\r\n \r\n // Interface\r\n TJSDOMTokenList = class external name 'DOMTokenList' (TJSObject)\r\n Private\r\n FLength : NativeInt; external name 'length';\r\n public\r\n Procedure add(aToken : TJSDOMString); varargs;\r\n Procedure remove(aToken : TJSDOMString); varargs;\r\n function item(aIndex : NativeInt) : String;\r\n function contains(aToken : TJSDOMString) : Boolean;\r\n Procedure replace(aOldToken, ANewToken : TJSDOMString);\r\n function supports(aToken : TJSDOMString) : Boolean;\r\n function toggle(aToken : TJSDOMString) : Boolean;\r\n // entries,keys, values\r\n procedure forEach(const callback: TDOMTokenlistCallBack);\r\n property length : NativeInt read FLength;\r\n end;\r\n\r\n TJSDOMRect = class external name 'DOMRect' (TJSObject)\r\n public\r\n left,top,right,bottom,x,y,width,height : double;\r\n {$IFDEF FIREFOX}\r\n constructor New;\r\n {$ENDIF}\r\n end;\r\n TJSClientRect = record\r\n left,top,right,bottom : double;\r\n {$IFDEF FIREFOX}\r\n width, height: double;\r\n {$ENDIF}\r\n end;\r\n \r\n TJSClientRectArray = array of TJSClientRect;\r\n \r\n TJSElement = class external name 'Element' (TJSNode)\r\n Private\r\n FAttributes : TJSNamedNodeMap; external name 'attributes';\r\n FChildElementCount : NativeInt; external name 'childElementCount';\r\n FChildren : TJSHTMLCollection; external name 'children';\r\n FClassList : TJSDOMTokenList; external name 'classList';\r\n FCLientHeight : NativeInt; external name 'clientHeight';\r\n FCLientLeft : NativeInt; external name 'clientLeft';\r\n FCLientTop : NativeInt; external name 'clientTop';\r\n FCLientWidth : NativeInt; external name 'clientWidth';\r\n FFirstElementChild : TJSElement; external name 'firstElementChild';\r\n FLastElementChild : TJSElement; external name 'lastElementChild';\r\n FLocalName : string; external name 'localName';\r\n FNameSpaceURI : String; external name 'namespaceURI';\r\n FNextElementSibling : TJSElement; external name 'nextElementSibling';\r\n FPreviousElementSibling : TJSElement; external name 'previousElementSibling';\r\n FPrefix : String; external name 'prefix';\r\n FScrollHeight : NativeInt; external name 'scrollHeight';\r\n{$IFDEF FIREFOX}\r\n FScrollLeftMax : NativeInt; external name 'scrollLeftMax';\r\n FScrollTopMax : NativeInt; external name 'scrollTopMax';\r\n{$endif}\r\n FScrollWidth : NativeInt; external name 'scrollWidth';\r\n FTagName : string; external name 'tagName';\r\n Public\r\n name : string;\r\n className : string;\r\n id : string;\r\n innerHTML : String;\r\n outerHTML : string;\r\n scrollLeft : NativeInt;\r\n scrollTop : NativeInt;\r\n procedure append(aText : String); overload;\r\n procedure append(aNode : TJSElement); overload;\r\n procedure append(aText : String; aNode : TJSElement); varargs; overload;\r\n procedure append(aNode1,aNode2: TJSElement); varargs; overload;\r\n function getAttribute(aName : string) : string;\r\n function getAttributeNode(aName : string) : TJSAttr;\r\n function getAttributeNodeNS(aNameSpace, aName : string) : TJSAttr;\r\n function getAttributeNS(aNameSpace, aName : string) : string;\r\n function getBoundingClientRect : TJSDOMRect;\r\n function getClientRects : TJSClientRectArray;\r\n function getElementsByClassName(aClassName: string) : TJSHTMLCollection;\r\n function getElementsByTagNameNS(aNameSpace, aTagName : String): TJSHTMLCollection;\r\n function getElementsByTagName(aTagName : String): TJSHTMLCollection;\r\n function hasAttribute(aName : String) : Boolean;\r\n function hasAttributeNS(aNameSpace,aName : String) : Boolean;\r\n function hasAttributes : Boolean;\r\n function insertAdjacentElement(aPosition : string; aElement : TJSElement) : TJSElement;\r\n procedure insertAdjacentHTML(aPosition,aHTML : string);\r\n procedure insertAdjacentText(aPosition,aText : string);\r\n function matches(aSelectorString : String) : Boolean;\r\n function querySelector(aSelectors : String) : TJSElement;\r\n function querySelectorAll(aSelectors : String) : TJSNodeList;\r\n procedure releasePointerCapture(evID : JSValue);\r\n procedure removeAttribute(aName: string);\r\n procedure removeAttributeNS(aNameSpace,aName: string);\r\n function removeAttributeNode(aAttr : TJSAttr) : TJSAttr;\r\n procedure setAttribute(aName : string; AValue : String);\r\n function setAttributeNode(aNode: TJSAttr) : TJSAttr;\r\n function setAttributeNodeNS(aNode: TJSAttr) : TJSAttr;\r\n procedure setAttributeNS(aNameSpace,aName : string; AValue : String);\r\n procedure setCapture(retargetToElement : Boolean);\r\n procedure setPointerCapture(pointerID : JSValue);\r\n procedure requestFullScreen; \r\n Property attributes : TJSNamedNodeMap read FAttributes;\r\n Property childElementCount : NativeInt Read FChildElementCount;\r\n Property children : TJSHTMLCollection Read FChildren;\r\n Property classList : TJSDOMTokenList read FClassList;\r\n property clientHeight : NativeInt read FClientHeight;\r\n property clientLeft : NativeInt read FClientLeft;\r\n property clientTop : NativeInt read FClientTop;\r\n property clientWidth : NativeInt read FClientWidth;\r\n property firstElementChild : TJSElement Read FFirstElementChild;\r\n property lastElementChild : TJSElement Read FLastElementChild;\r\n property localName : string Read FLocalName;\r\n property namespaceURI : String read FNameSpaceURI;\r\n property nextElementSibling : TJSElement Read FNextElementSibling;\r\n property previousElementSibling : TJSElement Read FPreviousElementSibling;\r\n property prefix : String read FPrefix;\r\n property scrollHeight : NativeInt Read FScrollHeight;\r\n{$IFDEF FIREFOX}\r\n property scrollLeftMax : NativeInt Read FScrollLeftMax;\r\n property scrollTopMax : NativeInt Read FScrollTopMax;\r\n{$ENDIF}\r\n property scrollWidth : NativeInt Read FScrollWidth;\r\n property tagName : String read FTagName;\r\n Property Attrs[aName : string] : String read getAttribute write setAttribute; default;\r\n end;\r\n \r\n TJSElementCreationOptions = record\r\n named : string;\r\n end;\r\n \r\n TJSDocumentType = class external name 'DocumentType' (TJSNode)\r\n private\r\n FName : String; external name 'name';\r\n FPublicID : String; external name 'publicId';\r\n FSystemID : String; external name 'systemId';\r\n public\r\n property name : String read FName;\r\n property publicId : String Read FPublicID;\r\n property systemId : String read FSystemID;\r\n end;\r\n\r\n TJSDOMImplementation = class external name 'DocumentImplementation' (TJSObject)\r\n Public \r\n function createDocument(aNamespaceURI, aQualifiedNameStr : String; aDocumentType : TJSDocumentType) : TJSDocument;\r\n function createDocumentType(aQualifiedNameStr,aPublicId,aSystemId : String) : TJSDocumentType;\r\n function createHTMLDocument(aTitle : String) : TJSDocument;\r\n end;\r\n\r\n TJSLocation = class external name 'Location' (TJSObject)\r\n Private\r\n FOrigin : string; external name 'origin';\r\n Public\r\n hash : string;\r\n host : string;\r\n hostname : string;\r\n href : string;\r\n password : string;\r\n pathname : string;\r\n port : string;\r\n protocol : string;\r\n search : string;\r\n username : string;\r\n procedure assign(aURL : String); overload;\r\n procedure reload(aForce : Boolean);\r\n procedure replace(aURL : String);\r\n property origin : string read FOrigin;\r\n end;\r\n \r\n TJSStyleSheet = class external name 'StyleSheet' (TJSEventTarget)\r\n Private\r\n FHRef : String; external name 'href';\r\n FOwnerNode : TJSNode; external name 'ownerNode';\r\n FParentStyleSheet : TJSStyleSheet; external name 'parentStyleSheet';\r\n FTitle : String; external name 'title';\r\n FType : String; external name 'type';\r\n Public\r\n disabled : String;\r\n Property href : String read FHRef;\r\n property ownerNode : TJSNode Read FOwnerNode;\r\n property parentStyleSheet : TJSStyleSheet read FParentStyleSheet;\r\n property title : string Read FTitle;\r\n property _type : String read FType;\r\n end;\r\n\r\n\r\n TJSCSSRule = class external name 'CSSRule' (TJSObject)\r\n Private\r\n FCSSText : String; external name 'cssText';\r\n FParentStyleSheet : TJSCSSStyleSheet; external name 'parentStyleSheet';\r\n FparentRule : TJSCSSRule; external name 'parentRule';\r\n Public\r\n property cssText : String Read FCSSText;\r\n property parentRule : TJSCSSRule read FparentRule;\r\n property parentStyleSheet : TJSCSSStyleSheet Read FParentStyleSheet;\r\n end;\r\n \r\n TJSCSSRuleList = Class external name 'CSSRuleList' (TJSObject)\r\n Private\r\n FLength : NativeInt; external name 'length';\r\n Public\r\n function item(index : NativeInt) : TJSCSSRule;\r\n property length : NativeInt Read FLength;\r\n Property items[aIndex : NativeInt] : TJSCSSRule read item; default;\r\n end;\r\n \r\n \r\n TJSCSSStyleSheet = class external name 'CSSStyleSheet' (TJSStyleSheet)\r\n Private\r\n FCSSRules : TJSCSSRuleList; external name 'cssRules';\r\n Public\r\n procedure deleteRule(aIndex : NativeInt);\r\n function insertRule(aRule : String; aIndex : NativeInt) : NativeInt;\r\n Property cssRules : TJSCSSRuleList read FCSSRules;\r\n end;\r\n\r\n TJSStyleSheetList = Class external name 'StyleSheetList' (TJSObject)\r\n Private\r\n FLength : NativeInt; external name 'length';\r\n Public\r\n function item(index : NativeInt) : TJSStyleSheet;\r\n property length : NativeInt Read FLength;\r\n Property items[aIndex : NativeInt] : TJSStyleSheet read item; default;\r\n end;\r\n\r\n { TJSDocumentFragment }\r\n\r\n TJSDocumentFragment = Class external name 'DocumentFragment' (TJSNode)\r\n private\r\n FchildElementCount: Integer; external name 'childElementCount';\r\n Fchildren: TJSHTMLCollection; external name 'children';\r\n FfirstElementChild: TJSElement; external name 'firstElementChild';\r\n FlastElementChild: TJSElement; external name 'lastElementChild';\r\n public\r\n constructor new;\r\n function querySelector(aSelector : String) : TJSElement;\r\n function querySelectorAll(aSelector : String) : TJSNodeList;\r\n property childElementCount : Integer read FchildElementCount;\r\n property children : TJSHTMLCollection read Fchildren;\r\n property firstElementChild : TJSElement read FfirstElementChild;\r\n property lastElementChild : TJSElement read FlastElementChild;\r\n end;\r\n\r\n TJSEventInit = record\r\n bubbles : boolean;\r\n cancelable : boolean;\r\n scoped : boolean;\r\n composed : boolean;\r\n end;\r\n\r\n TJSEvent = class external name 'Event' (TJSObject)\r\n Private\r\n FBubbles : Boolean; external name 'bubbles';\r\n FCancelable : Boolean; external name 'cancelable';\r\n FComposed : Boolean; external name 'composed';\r\n FCurrentTarget : TJSEventTarget; external name 'currentTarget';\r\n FCurrentTargetElement : TJSElement; external name 'currentTarget';\r\n FdefaultPrevented : Boolean; external name 'defaultPrevented';\r\n FEventPhase : NativeInt; external name 'eventPhase';\r\n FTarget : TJSEventTarget; external name 'target';\r\n FTargetElement : TJSElement; external name 'target';\r\n FTimeStamp : NativeInt; external name 'timestamp';\r\n FType : String; external name 'type';\r\n FIsTrusted : Boolean; external name 'isTrusted';\r\n Public\r\n Const\r\n NONE = 0;\r\n CAPTURING_PHASE = 1;\r\n AT_TARGET = 2;\r\n BUBBLING_PHASE = 3;\r\n public \r\n cancelBubble : Boolean;\r\n constructor new (aType : String; const aInit : TJSEventInit); overload;\r\n constructor new (aType : String); overload;\r\n procedure preventDefault;\r\n procedure stopImmediatePropagation;\r\n procedure stopPropagation;\r\n Property bubbles : Boolean Read FBubbles;\r\n Property cancelable : Boolean Read FCancelable;\r\n Property composed : Boolean Read FComposed;\r\n property currentTarget : TJSEventTarget Read FCurrentTarget;\r\n property currentTargetElement : TJSElement Read FCurrentTargetElement;\r\n property defaultPrevented : Boolean Read FdefaultPrevented;\r\n property eventPhase : NativeInt Read FEventPhase;\r\n property target : TJSEventTarget Read FTarget;\r\n property targetElement : TJSElement Read FTargetElement;\r\n Property timestamp : NativeInt Read FTimeStamp;\r\n property _type : string read FType;\r\n property isTrusted : Boolean Read FIsTrusted;\r\n end;\r\n\r\n\r\n TJSXPathExpression = class external name 'XPathExpression' (TJSObject)\r\n Public\r\n function evaluate(contextNode : TJSNode; aType : NativeInt; aResult : TJSXPathResult) : TJSXPathResult;\r\n function evaluateWithContext(contextNode : TJSNode; aPosition, aSize, aType : NativeInt; aResult : TJSXPathResult) : TJSXPathResult;\r\n end;\r\n\r\n TJSXPathNSResolver = class external name 'XPathNSResolver' (TJSObject)\r\n Public\r\n function lookupNamespaceURI(prefix : string) : string;\r\n end;\r\n\r\n { TJSCharacterData }\r\n\r\n TJSCharacterData = class external name 'CharacterData' (TJSNode)\r\n private\r\n FnextElementSibling: TJSElement; external name 'nextElementSibling';\r\n FpreviousElementSibling: TJSElement; external name 'previousElementSibling';\r\n public\r\n property nextElementSibling : TJSElement read FnextElementSibling;\r\n property previousElementSibling : TJSElement read FpreviousElementSibling;\r\n end;\r\n\r\n TJSProcessingInstruction = class external name 'ProcessingInstruction' (TJSCharacterData);\r\n\r\n { TJSRange }\r\n\r\n TJSRange = class external name 'Range' (TJSObject)\r\n private\r\n FCollapsed: boolean; external name 'collapsed';\r\n FcommonAncestorContainer: TJSNode; external name 'commonAncestorContainer';\r\n FendContainer: TJSNode; external name 'endContainer';\r\n FEndOffset: NativeInt; external name 'endOffset';\r\n FstartContainer: TJSNode; external name 'startContainer';\r\n FstartOffset: NativeInt; external name 'startOffset';\r\n Public\r\n const\r\n END_TO_END = 0;\r\n END_TO_START = 1;\r\n START_TO_END = 2;\r\n START_TO_START = 3;\r\n Public\r\n constructor new;\r\n function cloneContents : TJSDocumentFragment;\r\n function cloneRange : TJSRange;\r\n procedure collapse;\r\n function compareBoundaryPoints(aHow : NativeInt) : NativeInt;\r\n function createContextualFragment(aTagstring : String) : TJSDocumentFragment;\r\n procedure deleteContents;\r\n procedure detach;\r\n function extractContents : TJSDocumentFragment;\r\n procedure insertNode(aNode : TJSNode);\r\n procedure selectNode(aNode : TJSNode);\r\n procedure selectNodeContents(aNode : TJSNode);\r\n procedure setEnd(aEndNode : TJSNode; aEndOffset : NativeInt); \r\n procedure setEndAfter(aEndNode : TJSNode);\r\n procedure setEndBefore(aEndNode : TJSNode);\r\n procedure setStart(aStartNode : TJSNode; aStartOffset : NativeInt); \r\n procedure setStartAfter(aStartNode : TJSNode);\r\n procedure setStartBefore(aStartNode : TJSNode);\r\n procedure surroundContents(aNode : TJSNode);\r\n property collapsed : boolean read FCollapsed;\r\n property commonAncestorContainer : TJSNode read FcommonAncestorContainer ;\r\n property endContainer : TJSNode read FendContainer;\r\n property endOffset : NativeInt Read FEndOffset;\r\n property startContainer : TJSNode read FstartContainer;\r\n property startOffset : NativeInt Read FstartOffset;\r\n end;\r\n\r\n\r\n { TJSTreeWalker }\r\n\r\n TJSTreeWalker = class external name 'TreeWalker' (TJSObject)\r\n private\r\n FCurrentNode: TJSNode; external name 'currentNode';\r\n FexpandEntityReference: Boolean; external name 'expandEntityReference';\r\n FFilter: TJSNodeFilter; external name 'filter';\r\n FRoot: TJSNode; external name 'root';\r\n FWhatToShow: NativeInt; external name 'whatToShow';\r\n Public\r\n function firstChild : TJSNode;\r\n function lastChild : TJSNode;\r\n function nextNode : TJSNode;\r\n function nextSibling : TJSNode;\r\n function parentNode : TJSNode;\r\n function previousNode : TJSNode;\r\n function previousSibling : TJSNode;\r\n\r\n property root : TJSNode read FRoot;\r\n property whatToShow : NativeInt read FWhatToShow;\r\n property filter : TJSNodeFilter Read FFilter;\r\n property expandEntityReference : Boolean Read FexpandEntityReference;\r\n property currentNode : TJSNode Read FCurrentNode;\r\n end;\r\n\r\n TJSNodeFilter = class external name 'NodeFilter' (TJSObject)\r\n const\r\n SHOW_ALL = -1;\r\n SHOW_ATTRIBUTE = 2;\r\n SHOW_CDATA_SECTION = 8;\r\n SHOW_COMMENT = 128;\r\n SHOW_DOCUMENT = 256;\r\n SHOW_DOCUMENT_FRAGMENT = 1024;\r\n SHOW_DOCUMENT_TYPE = 512;\r\n SHOW_ELEMENT = 1;\r\n SHOW_ENTITY = 32;\r\n SHOW_ENTITY_REFERENCE = 16;\r\n SHOW_NOTATION = 2048;\r\n SHOW_PROCESSING_INSTRUCTION = 64;\r\n SHOW_TEXT = 4;\r\n function acceptNode (aNode : TJSNode) : NativeInt;\r\n end;\r\n\r\n TJSXPathResult = class external name 'XPathResult' (TJSObject)\r\n private\r\n FBooleanValue : Boolean; external name 'booleanValue';\r\n FNumberValue : Double; external name 'numberValue';\r\n FResultType : NativeInt; external name 'resultType';\r\n FSingleNodeValue : TJSNode; external name 'singleNodeValue';\r\n FSnaphotLength : NativeInt; external name 'snapshotLength';\r\n FStringValue : String; external name 'stringValue';\r\n public \r\n Function iterateNext : TJSNode;\r\n Function snapshotItem(Index: NativeInt) : TJSNode;\r\n Property booleanValue : Boolean Read FBooleanValue;\r\n Property numberValue : Double Read FNumberValue;\r\n property resultType : NativeInt Read FResultType;\r\n Property singleNodeValue : TJSNode Read FSingleNodeValue;\r\n property snapshotLength : NativeInt read FSnaphotLength;\r\n property stringValue : String Read FStringValue;\r\n end;\r\n\r\n TJSSelection = class external name 'Selection' (TJSObject)\r\n Private\r\n FanchorNode : TJSNode ; external name 'anchorNode';\r\n FanchorOffset : NativeInt ; external name 'anchorOffset';\r\n FfocusNode : TJSNode ; external name 'focusNode';\r\n FfocusOffset : NativeInt ; external name 'focusOffset';\r\n FisCollapsed : Boolean ; external name 'isCollapsed';\r\n FrangeCount : NativeInt ; external name 'rangeCount';\r\n Ftype : String ; external name 'type';\r\n Public\r\n function getRangeAt(aIndex : NativeInt) : TJSRange;\r\n procedure collapse(aParentNode : TJSNode; Offset : NativeInt);\r\n procedure extend(aParentNode : TJSNode; Offset : NativeInt);\r\n procedure collapseToStart;\r\n procedure collapseToEnd;\r\n procedure selectAllChildren(aParentNode : TJSNode);\r\n procedure addRange(aRange : TJSRange);\r\n procedure removeRange(aRange : TJSRange);\r\n procedure removeAllRanges;\r\n procedure deleteFromDocument;\r\n function containsNode(aNode : TJSNode; aPartlyContained : Boolean) : Boolean;\r\n procedure setBaseAndExtent(aAnchorNode : TJSNode; aAnchorOffset : NativeInt; aFocusNode : TJSNode; aFocusOffset : NativeInt);\r\n property anchorNode : TJSNode read FAnchorNode;\r\n property anchorOffset : NativeInt read FAnchorOffset;\r\n property focusNode : TJSNode read FFocusNode;\r\n property focusOffset : NativeInt read FFocusOffset;\r\n property isCollapsed : Boolean read FIsCollapsed;\r\n property rangeCount : NativeInt read FRangeCount;\r\n property _type : String Read FType;\r\n end;\r\n TJSNameSpaceMapperCallback = function (aNameSpace : string ) : String;\r\n\r\n TJSHTMLFile = class;\r\n TJSHTMLFileList = Class;\r\n\r\n { TJSDataTransferItem }\r\n\r\n TJSDataTransferItemCallBack = reference to Procedure(aData : String); safecall;\r\n\r\n TJSDataTransferItem = class external name 'DataTransferItem' (TJSObject)\r\n private\r\n FKind: String; external name 'kind';\r\n FType: string; external name 'type';\r\n Public\r\n function getAsFile : TJSHTMLFile;\r\n Procedure getAsString(aCallBack : TJSDataTransferItemCallBack);\r\n property Kind : String read FKind;\r\n property _Type : string read FType;\r\n end;\r\n\r\n TJSDataTransferItemList = class external name 'DataTransferItemList' (TJSObject)\r\n private\r\n FLength: NativeInt; external name 'length';\r\n function getitem(aIndex : nativeInt) : TJSDataTransferItem ; external name '[]';\r\n Public\r\n Function add(aData : string; AType: string) : TJSDataTransferItem; overload;\r\n Function add(aFile : TJSHTMLFile) : TJSDataTransferItem; overload;\r\n Procedure clear;\r\n procedure remove(aIndex : integer);\r\n property length : NativeInt read FLength;\r\n property Items[aIndex : NativeInt] : TJSDataTransferItem Read getitem; default;\r\n end;\r\n\r\n { TJSDataTransfer }\r\n\r\n TJSDataTransfer = class external name 'DataTransfer' (TJSObject)\r\n private\r\n FFiles: TJSHTMLFileList; external name 'files';\r\n FItems: TJSDataTransferItemList; external name 'items';\r\n FTypes: TJSStringDynArray; external name 'types';\r\n Public\r\n dropEffect : string;\r\n effectAllowed : string;\r\n Procedure clearData; overload;\r\n Procedure clearData(aFormat : string); overload;\r\n function getData(aFormat : string) : String;\r\n procedure setData(aFormat : String; aData : String);\r\n procedure setDragImage(aImage: TJSElement; xOffset,yOffset : integer);\r\n property files : TJSHTMLFileList Read FFiles;\r\n property items : TJSDataTransferItemList read FItems;\r\n property types : TJSStringDynArray read FTypes;\r\n end;\r\n\r\n { TJSDragEvent }\r\n\r\n TJSDragEvent = class external name 'DragEvent' (TJSEvent)\r\n Private\r\n FDataTransfer: TJSDataTransfer; external name 'dataTransfer';\r\n FrelatedTarget : TJSEventTarget external name 'relatedTarget';\r\n FscreenX : NativeInt external name 'screenX';\r\n FscreenY : NativeInt external name 'screenY';\r\n FclientX : NativeInt external name 'clientX';\r\n FclientY : NativeInt external name 'clientY';\r\n Fbutton : NativeInt external name 'button';\r\n Fbuttons : NativeInt external name 'buttons';\r\n FctrlKey : Boolean external name 'ctrlKey';\r\n FshiftKey : Boolean external name 'shiftKey';\r\n FaltKey : Boolean external name 'altKey';\r\n FmetaKey : Boolean external name 'metaKey';\r\n Public\r\n Property relatedTarget : TJSEventTarget Read FRelatedTarget;\r\n Property screenX : NativeInt Read FScreenX;\r\n Property screenY : NativeInt Read FScreenY;\r\n Property clientX : NativeInt Read FClientX;\r\n Property clientY : NativeInt Read FClientY;\r\n Property button : NativeInt Read FButton;\r\n Property buttons : NativeInt Read FButtons;\r\n Property ctrlKey : Boolean Read FctrlKey;\r\n Property shiftKey : Boolean Read FshiftKey;\r\n Property altKey : Boolean Read FaltKey;\r\n Property metaKey : Boolean Read FmetaKey;\r\n property dataTransfer : TJSDataTransfer Read FDataTransfer;\r\n end;\r\n TJSDragDropEventHandler = reference to function(aEvent: TJSDragEvent) : Boolean; safecall;\r\n THTMLClickEventHandler = reference to function(aEvent : TJSMouseEvent) : boolean; safecall;\r\n { Various events }\r\n\r\n{$IFNDEF FIREFOX}\r\n TJSFocusEvent = TJSEvent;\r\n{$ELSE}\r\n TJSFocusEvent = Class(TJSEvent)\r\n private\r\n FrelatedTarget : TJSElement external name 'relatedTarget';\r\n public\r\n property relatedTarget : TJSElement Read FrelatedTarget;\r\n end;\r\n{$ENDIF}\r\n TJSAnimationEvent = Class(TJSEvent);\r\n TJSLoadEvent = Class(TJSEvent);\r\n\r\n TJSErrorEvent = class external name 'ErrorEvent' (TJSEvent)\r\n Private\r\n Fmessage : String external name 'message';\r\n Ffilename : string external name 'filename';\r\n Flineno : integer external name 'lineno';\r\n Fcolno : integer external name 'colno';\r\n Ferror : TJSObject external name 'error';\r\n Public\r\n Property message : String read FMessage;\r\n property filename : string Read FFileName;\r\n property lineno : integer read FLineNo;\r\n Property colno : integer read FColNo;\r\n Property error : TJSObject read FError;\r\n end;\r\n\r\n TJSPageTransitionEvent = class(TJSEvent)\r\n end;\r\n\r\n TJSHashChangeEvent = class external name 'HashChangeEvent' (TJSEvent)\r\n Private\r\n FnewURL : String external name 'newURL';\r\n FoldURL : String external name 'oldURL';\r\n public\r\n property newURL : String Read FNewURL;\r\n property oldURL : String Read FOldURL;\r\n end;\r\n\r\n TJSPopStateEvent = class external name 'PopStateEvent' (TJSEvent)\r\n Private\r\n FState : JSValue; external name 'state';\r\n Public\r\n property state : JSValue read FState;\r\n end;\r\n\r\n TJSStorageEvent = class external name 'StorageEvent' (TJSEvent)\r\n private\r\n Fkey : String external name 'key';\r\n FoldValue : String external name 'oldValue';\r\n FnewValue : String external name 'newValue';\r\n Furl : String external name 'url';\r\n FstorageArea : String external name 'storageArea';\r\n public\r\n Property key : String Read FKey;\r\n Property oldValue : String Read FOldValue;\r\n Property newValue : String Read FNewValue;\r\n Property url : String Read FURL;\r\n Property storageArea : String Read FstorageArea;\r\n end;\r\n\r\n { TJSProgressEvent }\r\n\r\n TJSProgressEvent = class external name 'ProgressEvent' (TJSEvent)\r\n Private\r\n FlengthComputable : Boolean external name 'lengthComputable';\r\n Floaded : NativeUINT external name 'loaded';\r\n FTotal : NativeUINT external name 'Total';\r\n Public\r\n property lengthComputable : Boolean Read FlengthComputable;\r\n property loaded : NativeUINT Read FLoaded;\r\n property Total : NativeUINT Read FTotal;\r\n end;\r\n\r\n TJSCloseEvent = class external name 'CloseEvent' (TJSEvent)\r\n private\r\n fcode: Word; external name 'code';\r\n freason: TJSDOMString; external name 'reason';\r\n fwasClean: Boolean; external name 'wasClean';\r\n public\r\n property code: Word read fcode;\r\n property reason: TJSDOMString read freason;\r\n property wasClean: Boolean read fwasClean;\r\n end; \r\n\r\n TJSPageTransitionEventHandler = reference to function(aEvent : TJsPageTransitionEvent) : boolean; safecall;\r\n TJSHashChangeEventhandler = reference to function(aEvent : TJSHashChangeEvent) : boolean; safecall;\r\n TJSMouseWheelEventHandler = reference to function(aEvent : TJSWheelEvent) : boolean; safecall;\r\n TJSMouseEventHandler = reference to function(aEvent : TJSMouseEvent) : boolean; safecall;\r\n THTMLAnimationEventHandler = reference to function(aEvent : TJSAnimationEvent) : boolean; safecall;\r\n TJSErrorEventHandler = reference to function(aEvent : TJSErrorEvent) : boolean; safecall;\r\n TJSFocusEventHandler = reference to function(aEvent : TJSFocusEvent) : boolean; safecall;\r\n TJSKeyEventhandler = reference to function (aEvent : TJSKeyBoardEvent) : boolean; safecall;\r\n TJSLoadEventhandler = reference to function (aEvent : TJSLoadEvent) : boolean; safecall;\r\n TJSPointerEventHandler = reference to function(aEvent : TJSPointerEvent) : boolean; safecall;\r\n TJSUIEventHandler = reference to function(aEvent : TJSUIEvent) : Boolean; safecall;\r\n TJSPopStateEventHandler = reference to function(aEvent : TJSPopStateEvent) : Boolean; safecall;\r\n TJSStorageEventHandler = reference to function(aEvent : TJSStorageEvent) : Boolean; safecall;\r\n TJSProgressEventhandler = reference to function(aEvent : TJSProgressEvent) : Boolean; safecall;\r\n TJSTouchEventHandler = reference to function(aEvent : TJSTouchEvent) : boolean; safecall;\r\n\r\n TJSDocument = class external name 'Document' (TJSNode)\r\n Private\r\n fActiveElement : TJSElement; external name 'activeElement';\r\n FCharacterSet: String; external name 'characterSet';\r\n FChildElementCount: NativeInt; external name 'childElementCount';\r\n FCompatMode: String; external name 'compatMode';\r\n FCurrentScript: TJSElement; external name 'currentScript';\r\n FDefaultView: TJSWindow; external name 'defaultView';\r\n FDocType: TJSDocumentType; external name 'docrype';\r\n FDocumentElement: TJSElement; external name 'documentElement';\r\n FDocumentURI: String; external name 'documentURI';\r\n FEmbeds: TJSHTMLCollection; external name 'embeds';\r\n FFirstElementChild : TJSElement; external name 'firstElementChild';\r\n FForms: TJSHTMLCollection; external name 'forms';\r\n FFullScreenElement: TJSElement; external name 'fullscreenElement';\r\n FFullscreenEnabled: Boolean; external name 'fullscreenEnabled';\r\n FHead: TJSElement; external name 'head';\r\n FHidden: Boolean; external name 'hidden';\r\n FImages: TJSHTMLCollection; external name 'images';\r\n FImplementation: TJSDOMImplementation; external name 'implementation';\r\n FLastElementChild : TJSElement; external name 'lastElementChild';\r\n FLastModified: String; external name 'lastModified';\r\n FLastStyleSheetSet: String; external name 'lastStyleSheetSet';\r\n FLinks: TJSHTMLCollection; external name 'links';\r\n FLocation: TJSLocation; external name 'location';\r\n FLocationString: String; external name 'location';\r\n FPlugins: TJSHTMLCollection; external name 'plugins';\r\n FPointerLockElement: TJSElement; external name 'pointerLockElement';\r\n FPreferredStyleSheetSet: String; external name 'preferredStyleSheetSet';\r\n FReadyState: String; external name 'readyState';\r\n FReferrer: String; external name 'referrer';\r\n FScripts: TJSHTMLCollection; external name 'scripts';\r\n FStyleSheets: TJSStyleSheetList; external name 'styleSheets';\r\n FStyleSheetSets: TJSValueDynArray; external name 'styleSheetSets';\r\n FURL: String; external name 'URL';\r\n FVisibilityState: string; external name 'visibilityState';\r\n Public\r\n function adoptNode(aExternalNode : TJSNode) : TJSNode;\r\n procedure close;\r\n function createAttribute(aName : string) : TJSAttr;\r\n function createCDATASection(S : String) : TJSNode;\r\n function createComment(S : String) : TJSNode;\r\n function createDocumentFragment : TJSDocumentFragment;\r\n function createElement(tagName : string) : TJSElement; overload;\r\n function createElement(tagName : string; const options : TJSElementCreationOptions) : TJSElement; overload;\r\n function createElementNS(aNameSpace,tagName : string) : TJSElement; overload;\r\n function createElementNS(aNameSpace,tagName : string; const options : TJSElementCreationOptions) : TJSElement; overload;\r\n function createEvent(aType : string) : TJSEvent;\r\n function createExpression(xPathText : String; aNameSpaceMapper: TJSNameSpaceMapperCallback) : TJSXPathExpression;\r\n function createNSResolver(aNode : TJSNode) : TJSXPathNSResolver;\r\n function createProcessingInstruction(target, data : String) : TJSProcessingInstruction;\r\n function createRange : TJSRange;\r\n function createTextNode(S : String) : TJSNode;\r\n function createTreeWalker(root : TJSNode; whatToShow : NativeInt; filter : TJSNodeFilter) : TJSTreeWalker;\r\n function elementFromPoint(x,y : integer) : TJSElement;\r\n procedure enableStyleSheetsForSet(aSet : String);\r\n function evaluate(xpathExpression : String; ContextNode : TJSNode; NameSpaceResolver : TJSNamespaceMapperCallBack; resultType : NativeInt; aResult : TJSXPathResult) : TJSXPathResult;\r\n function execCommand(aCommandName : String; aShowDefaultUI : Boolean; AValueArgument : String) : boolean; overload;\r\n function execCommand(aCommandName : String; aShowDefaultUI : Boolean) : boolean; overload;\r\n Procedure exitFullScreen;\r\n function getElementById(aID : String) : TJSElement;\r\n function getElementsByClassName(aNames : string) : TJSHTMLCollection;\r\n function getElementsByName(aName : String) : TJSNodeList;\r\n function getElementsByTagName(aName : String) : TJSHTMLCollection;\r\n function getElementsByTagNameNS(aNameSpace,aName : String) : TJSHTMLCollection;\r\n function getSelection : TJSSelection;\r\n function hasFocus : boolean;\r\n function importNode(aExternalNode : TJSNode; Deep: boolean) : TJSNode;\r\n function querySelector(aSelectors : String) : TJSElement;\r\n function querySelectorAll(aSelectors : String) : TJSNodeList;\r\n procedure open;\r\n procedure releaseCapture;\r\n procedure write(aLine : string);\r\n procedure writeln(aLine : String);\r\n Public\r\n body : TJSElement;\r\n cookie: TJSString;\r\n designMode : string;\r\n dir : string;\r\n domain : string;\r\n selectedStyleSheetSet : string;\r\n title : string;\r\n onabort : TJSEventHandler;\r\n onblur : TJSEventHandler;\r\n oncancel : TJSEventHandler;\r\n oncanplay : TJSEventHandler;\r\n oncanplaythrough : TJSEventHandler;\r\n onchange : TJSEventHandler;\r\n onclick: THTMLClickEventHandler;\r\n onclose : TJSEventHandler;\r\n oncontextmenu : TJSEventHandler;\r\n oncuechange : TJSEventHandler;\r\n ondblclick : THTMLClickEventHandler;\r\n ondrag : TJSDragDropEventHandler;\r\n ondragend : TJSDragDropEventHandler;\r\n ondragenter : TJSDragDropEventHandler;\r\n ondragexit : TJSDragDropEventHandler;\r\n ondragover : TJSDragDropEventHandler;\r\n ondragleave : TJSDragDropEventHandler;\r\n ondragstart: TJSDragDropEventHandler;\r\n ondrop : TJSDragDropEventHandler;\r\n ondurationchange : TJSEventHandler;\r\n onemptied : TJSEventHandler;\r\n onended : TJSEventHandler;\r\n onerror : TJSErrorEventHandler;\r\n onfocus : TJSFocusEventhandler;\r\n ongotpointercapture : TJSPointerEventHandler;\r\n oninput : TJSEventhandler;\r\n oninvalid : TJSEventhandler;\r\n onkeydown : TJSKeyEventhandler;\r\n onkeypress : TJSKeyEventhandler;\r\n onkeyup : TJSKeyEventhandler;\r\n onload : TJSEventhandler;\r\n onloadeddata : TJSEventhandler;\r\n onloadedmetadata : TJSEventhandler;\r\n onloadend : TJSProgressEventhandler;\r\n onloadstart : TJSProgressEventhandler;\r\n onlostpointercapture : TJSPointerEventHandler;\r\n onmessage : TJSEventHandler;\r\n onmousedown : TJSMouseEventHandler;\r\n onmouseenter : TJSMouseEventHandler;\r\n onmouseleave : TJSMouseEventHandler;\r\n onmousemove : TJSMouseEventHandler;\r\n onmouseout : TJSMouseEventHandler;\r\n onmouseover : TJSMouseEventHandler;\r\n onmouseup : TJSMouseEventHandler;\r\n onmousewheel : TJSMouseEventHandler;\r\n onpause : TJSEventHandler;\r\n onplay : TJSEventHandler;\r\n onplaying : TJSEventHandler;\r\n onpointercancel : TJSPointerEventHandler;\r\n onpointerdown : TJSPointerEventHandler;\r\n onpointerenter : TJSPointerEventHandler;\r\n onpointerleave : TJSPointerEventHandler;\r\n onpointermove : TJSPointerEventHandler;\r\n onpointerout : TJSPointerEventHandler;\r\n onpointerover : TJSPointerEventHandler;\r\n onpointerup : TJSPointerEventHandler;\r\n onpointerlockchange : TJSPointerEventHandler;\r\n onprogress : TJSProgressEventhandler;\r\n onreset : TJSUIEventHandler;\r\n onratechange : TJSEventHandler;\r\n onscroll : TJSUIEventHandler;\r\n onseekend : TJSEventHandler;\r\n onseeking : TJSEventHandler;\r\n onselect : TJSEventHandler;\r\n onselectionchange : TJSEventHandler;\r\n onsshow : TJSEventHandler;\r\n onsubmit : TJSEventHandler;\r\n onunload : TJSUIEventHandler;\r\n onwaiting : TJSEventHandler;\r\n touchstart : TJSTouchEventHandler;\r\n touchend : TJSTouchEventHandler;\r\n touchmove : TJSTouchEventHandler;\r\n touchcancel : TJSTouchEventHandler;\r\n Property activeElement : TJSElement Read FActiveElement;\r\n Property characterSet : String Read FCharacterSet;\r\n property childElementCount : NativeInt Read FChildElementCount;\r\n property compatMode : String Read FCompatMode;\r\n property currentScript : TJSElement Read FCurrentScript;\r\n property defaultView : TJSWindow Read FDefaultView;\r\n property doctype : TJSDocumentType read FDocType;\r\n property documentElement : TJSElement read FDocumentElement;\r\n property documentURI : String Read FDocumentURI;\r\n property embeds : TJSHTMLCollection Read FEmbeds;\r\n property firstElementChild : TJSElement Read FFirstElementChild;\r\n property lastElementChild : TJSElement Read FLastElementChild;\r\n property Forms : TJSHTMLCollection Read FForms;\r\n property fullscreenElement : TJSElement Read FFullScreenElement;\r\n property fullscreenEnabled : Boolean Read FFullscreenEnabled;\r\n property head : TJSElement read FHead;\r\n Property hidden : Boolean read FHidden;\r\n property images : TJSHTMLCollection Read FImages;\r\n property _implementation : TJSDOMImplementation Read FImplementation;\r\n property lastModified : String Read FLastModified;\r\n property lastStyleSheetSet : String read FLastStyleSheetSet;\r\n property links : TJSHTMLCollection Read FLinks;\r\n property location : TJSLocation read FLocation;\r\n Property LocationString : String Read FURL Write FLocationString; // On purpose\r\n property plugins : TJSHTMLCollection Read FPlugins;\r\n property pointerLockElement : TJSElement Read FPointerLockElement;\r\n property preferredStyleSheetSet : String Read FPreferredStyleSheetSet;\r\n Property readyState : String Read FReadyState;\r\n Property referrer : String Read FReferrer;\r\n property scripts : TJSHTMLCollection Read FScripts;\r\n property styleSheets : TJSStyleSheetList Read FStyleSheets;\r\n property styleSheetSets : TJSValueDynArray Read FStyleSheetSets; // No type documented ?\r\n Property URL : String Read FURL;\r\n property visibilityState : string read FVisibilityState;\r\n end;\r\n\r\n TJSConsole = class external name 'Console' (TJSObject)\r\n Public\r\n procedure assert(anAssertion : string; Obj1 : JSValue); varargs;\r\n Procedure clear; \r\n procedure count; overload;\r\n procedure count(aCounter : String);\r\n procedure debug(Obj1 : JSValue); varargs of JSValue;\r\n procedure error(Obj1 : JSValue); varargs of JSValue;\r\n procedure group; overload;\r\n procedure group(aLabel : String); overload;\r\n procedure groupCollapsed; overload;\r\n procedure groupCollapsed(aLabel : String);overload;\r\n procedure groupEnd;\r\n procedure info(Obj1 : JSValue); varargs of JSValue;\r\n procedure log(Obj1 : JSValue); varargs of JSValue;\r\n procedure table(args: array of JSValue); overload;\r\n procedure table(args: array of JSValue; Columns : Array of string);\r\n procedure table(args: TJSObject); overload;\r\n procedure table(args: TJSObject; Columns : Array of string); overload;\r\n procedure time(aName : string);\r\n procedure timeEnd(aName : string);\r\n procedure trace;\r\n procedure warn(Obj1 : JSValue); varargs of JSValue;\r\n end;\r\n\r\n// TJSBufferSource = class external name 'BufferSource' end;\r\n// TJSTypedArray = class external name 'TypedArray' end;\r\n\r\n // Forward class definitions\r\n TJSCryptoKey = Class;\r\n TJSSubtleCrypto = Class;\r\n KeyType = String;\r\n KeyUsage = String;\r\n NamedCurve = String;\r\n BigInteger = TJSUint8Array;\r\n KeyFormat = String;\r\n // Union of object, DOMString\r\n AlgorithmIdentifier = JSValue; \r\n \r\n { --------------------------------------------------------------------\r\n Algorithm\r\n --------------------------------------------------------------------}\r\n \r\n Algorithm = record\r\n name : String;\r\n end;\r\n \r\n { --------------------------------------------------------------------\r\n AesCbcParams\r\n --------------------------------------------------------------------}\r\n \r\n AesCbcParams = record\r\n iv : TJSBufferSource;\r\n end;\r\n \r\n { --------------------------------------------------------------------\r\n AesCtrParams\r\n --------------------------------------------------------------------}\r\n \r\n AesCtrParams = record\r\n counter : TJSBufferSource;\r\n length_ : Byte;external name 'length';\r\n end;\r\n \r\n { --------------------------------------------------------------------\r\n AesGcmParams\r\n --------------------------------------------------------------------}\r\n \r\n AesGcmParams = record\r\n iv : TJSBufferSource;\r\n additionalData : TJSBufferSource;\r\n tagLength : Byte;\r\n end;\r\n \r\n { --------------------------------------------------------------------\r\n HmacImportParams\r\n --------------------------------------------------------------------}\r\n \r\n HmacImportParams = record\r\n hash : AlgorithmIdentifier;\r\n end;\r\n \r\n { --------------------------------------------------------------------\r\n Pbkdf2Params\r\n --------------------------------------------------------------------}\r\n \r\n Pbkdf2Params = record\r\n salt : TJSBufferSource;\r\n iterations : NativeInt;\r\n hash : AlgorithmIdentifier;\r\n end;\r\n \r\n { --------------------------------------------------------------------\r\n RsaHashedImportParams\r\n --------------------------------------------------------------------}\r\n \r\n RsaHashedImportParams = record\r\n hash : AlgorithmIdentifier;\r\n end;\r\n \r\n { --------------------------------------------------------------------\r\n AesKeyGenParams\r\n --------------------------------------------------------------------}\r\n \r\n AesKeyGenParams = record\r\n length_ : Integer;external name 'length';\r\n end;\r\n \r\n { --------------------------------------------------------------------\r\n HmacKeyGenParams\r\n --------------------------------------------------------------------}\r\n \r\n HmacKeyGenParams = record\r\n hash : AlgorithmIdentifier;\r\n length_ : Integer;external name 'length';\r\n end;\r\n \r\n { --------------------------------------------------------------------\r\n RsaHashedKeyGenParams\r\n --------------------------------------------------------------------}\r\n \r\n RsaHashedKeyGenParams = record\r\n modulusLength : Integer;\r\n publicExponent : BigInteger;\r\n hash : AlgorithmIdentifier;\r\n end;\r\n \r\n { --------------------------------------------------------------------\r\n RsaOaepParams\r\n --------------------------------------------------------------------}\r\n \r\n RsaOaepParams = record\r\n label_ : TJSBufferSource;external name 'label';\r\n end;\r\n \r\n { --------------------------------------------------------------------\r\n RsaPssParams\r\n --------------------------------------------------------------------}\r\n \r\n RsaPssParams = record\r\n saltLength : Integer;\r\n end;\r\n \r\n { --------------------------------------------------------------------\r\n DhKeyGenParams\r\n --------------------------------------------------------------------}\r\n \r\n DhKeyGenParams = record\r\n prime : BigInteger;\r\n generator : BigInteger;\r\n end;\r\n \r\n { --------------------------------------------------------------------\r\n EcKeyGenParams\r\n --------------------------------------------------------------------}\r\n \r\n EcKeyGenParams = record\r\n _namedCurve : NamedCurve;external name 'namedCurve';\r\n end;\r\n \r\n { --------------------------------------------------------------------\r\n AesDerivedKeyParams\r\n --------------------------------------------------------------------}\r\n \r\n AesDerivedKeyParams = record\r\n length_ : Integer;external name 'length';\r\n end;\r\n \r\n { --------------------------------------------------------------------\r\n HmacDerivedKeyParams\r\n --------------------------------------------------------------------}\r\n \r\n HmacDerivedKeyParams = record\r\n length_ : Integer;external name 'length';\r\n end;\r\n \r\n { --------------------------------------------------------------------\r\n EcdhKeyDeriveParams\r\n --------------------------------------------------------------------}\r\n \r\n EcdhKeyDeriveParams = record\r\n public_ : TJSCryptoKey; external name 'public';\r\n end;\r\n \r\n { --------------------------------------------------------------------\r\n DhKeyDeriveParams\r\n --------------------------------------------------------------------}\r\n \r\n DhKeyDeriveParams = record\r\n public_ : TJSCryptoKey; external name 'public';\r\n end;\r\n \r\n { --------------------------------------------------------------------\r\n DhImportKeyParams\r\n --------------------------------------------------------------------}\r\n \r\n DhImportKeyParams = record\r\n prime : BigInteger;\r\n generator : BigInteger;\r\n end;\r\n \r\n { --------------------------------------------------------------------\r\n EcdsaParams\r\n --------------------------------------------------------------------}\r\n \r\n EcdsaParams = record\r\n hash : AlgorithmIdentifier;\r\n end;\r\n \r\n { --------------------------------------------------------------------\r\n EcKeyImportParams\r\n --------------------------------------------------------------------}\r\n \r\n EcKeyImportParams = record\r\n _namedCurve : NamedCurve;external name 'namedCurve';\r\n end;\r\n \r\n { --------------------------------------------------------------------\r\n HkdfParams\r\n --------------------------------------------------------------------}\r\n \r\n HkdfParams = record\r\n hash : AlgorithmIdentifier;\r\n salt : TJSBufferSource;\r\n info : TJSBufferSource;\r\n end;\r\n \r\n { --------------------------------------------------------------------\r\n RsaOtherPrimesInfo\r\n --------------------------------------------------------------------}\r\n \r\n RsaOtherPrimesInfo = record\r\n r : String;\r\n d : String;\r\n t : String;\r\n end;\r\n \r\n { --------------------------------------------------------------------\r\n JsonWebKey\r\n --------------------------------------------------------------------}\r\n \r\n TRsaOtherPrimesInfoDynArray = Array of RsaOtherPrimesInfo;\r\n JsonWebKey = record\r\n kty : String;\r\n use : String;\r\n key_ops : TStringDynArray;\r\n alg : String;\r\n ext : boolean;\r\n crv : String;\r\n x : String;\r\n y : String;\r\n d : String;\r\n n : String;\r\n e : String;\r\n p : String;\r\n q : String;\r\n dp : String;\r\n dq : String;\r\n qi : String;\r\n oth : TRsaOtherPrimesInfoDynArray;\r\n k : String;\r\n end;\r\n \r\n { --------------------------------------------------------------------\r\n CryptoKeyPair\r\n --------------------------------------------------------------------}\r\n \r\n CryptoKeyPair = record\r\n publicKey : TJSCryptoKey;\r\n privateKey : TJSCryptoKey;\r\n end;\r\n \r\n { --------------------------------------------------------------------\r\n TJSCryptoKey\r\n --------------------------------------------------------------------}\r\n \r\n TKeyUsageDynArray = Array of KeyUsage;\r\n TJSCryptoKey = class external name 'CryptoKey' \r\n Private\r\n Ftype_ : KeyType; external name 'type'; \r\n Fextractable : boolean; external name 'extractable'; \r\n Falgorithm : TJSObject; external name 'algorithm'; \r\n Fusages : TKeyUsageDynArray; external name 'usages'; \r\n Public\r\n \r\n Property type_ : KeyType Read Ftype_; \r\n Property extractable : boolean Read Fextractable; \r\n Property algorithm : TJSObject Read Falgorithm; \r\n Property usages : TKeyUsageDynArray Read Fusages; \r\n end;\r\n \r\n { --------------------------------------------------------------------\r\n TJSSubtleCrypto\r\n --------------------------------------------------------------------}\r\n \r\n TJSSubtleCrypto = class external name 'SubtleCrypto' \r\n Private\r\n Public\r\n function encrypt(algorithm : AlgorithmIdentifier; key : TJSCryptoKey; data : TJSBufferSource): TJSPromise;\r\n function decrypt(algorithm : AlgorithmIdentifier; key : TJSCryptoKey; data : TJSBufferSource): TJSPromise;\r\n function sign(algorithm : AlgorithmIdentifier; key : TJSCryptoKey; data : TJSBufferSource): TJSPromise;\r\n function verify(algorithm : AlgorithmIdentifier; key : TJSCryptoKey; signature : TJSBufferSource; data : TJSBufferSource): TJSPromise;\r\n function digest(algorithm : AlgorithmIdentifier; data : TJSBufferSource): TJSPromise;\r\n function generateKey(algorithm : AlgorithmIdentifier; extractable : boolean; keyUsages : TKeyUsageDynArray): TJSPromise;\r\n function deriveKey(algorithm : AlgorithmIdentifier; baseKey : TJSCryptoKey; derivedKeyType : AlgorithmIdentifier; extractable : boolean; keyUsages : TKeyUsageDynArray): TJSPromise;\r\n function deriveBits(algorithm : AlgorithmIdentifier; baseKey : TJSCryptoKey; length_ : NativeInt): TJSPromise;\r\n function importKey(format : KeyFormat; keyData : TJSObject; algorithm : AlgorithmIdentifier; extractable : boolean; keyUsages : TKeyUsageDynArray): TJSPromise;\r\n function exportKey(format : KeyFormat; key : TJSCryptoKey): TJSPromise;\r\n function wrapKey(format : KeyFormat; key : TJSCryptoKey; wrappingKey : TJSCryptoKey; wrapAlgorithm : AlgorithmIdentifier): TJSPromise;\r\n function unwrapKey(format : KeyFormat; wrappedKey : TJSBufferSource; unwrappingKey : TJSCryptoKey; unwrapAlgorithm : AlgorithmIdentifier; unwrappedKeyAlgorithm : AlgorithmIdentifier; extractable : boolean; keyUsages : TKeyUsageDynArray): TJSPromise;\r\n end;\r\n { TJSCrypto }\r\n\r\n TJSCrypto = class external name 'Crypto' (TJSObject)\r\n private\r\n Fsubtle: TJSSubtleCrypto; external name 'subtle';\r\n Public\r\n procedure getRandomValues (anArray : TJSTypedArray);\r\n property subtle : TJSSubtleCrypto Read Fsubtle;\r\n end;\r\n \r\n { TJSHistory }\r\n\r\n TJSHistory = class external name 'History' (TJSObject)\r\n private\r\n FLength: NativeInt; external name 'length';\r\n{$IFDEF FIREFOX}\r\n FState : JSValue; external name 'state';\r\n{$ENDIF}\r\n Public\r\n procedure back;\r\n procedure forward;\r\n procedure go(aIndex : NativeInt);\r\n procedure go;\r\n procedure pushState(aState : jsValue; aTitle : String; AURL : String);\r\n procedure pushState(aState : jsValue; aTitle : String);\r\n procedure replaceState(aState : jsValue; aTitle : String; AURL : String);\r\n procedure replaceState(aState : jsValue; aTitle : String);\r\n procedure replaceState(aState : jsValue);\r\n{$IFDEF FIREFOX}\r\n property state : JSValue read FState;\r\n{$ENDIF}\r\n property length: NativeInt read FLength;\r\n end;\r\n\r\n TJSIDBTransactionMode = class\r\n const\r\n readonly = 'readonly';\r\n readwrite = 'readwrite';\r\n versionchange = 'versionchange';\r\n end;\r\n\r\n\r\n { TJSIDBTransaction }\r\n\r\n TJSIDBTransaction = class external name 'IDBTransaction' (TJSEventTarget)\r\n private\r\n FDB : TIDBDatabase; external name 'db';\r\n FError: JSValue; external name 'error';\r\n FMode: String; external name 'mode';\r\n FObjectStoreNames: TStringDynArray; external name 'objectStoreNames';\r\n public\r\n procedure abort;\r\n function objectStore(aName : String) : TJSIDBObjectStore;\r\n property db : TIDBDatabase read FDB;\r\n property mode : String read FMode;\r\n property objectStoreNames : TStringDynArray read FObjectStoreNames;\r\n property error : JSValue read FError;\r\n end;\r\n\r\n\r\n { TJSIDBKeyRange }\r\n\r\n TJSIDBKeyRange = class external name 'IDBKeyRange' (TJSObject)\r\n private\r\n FLower: JSValue;\r\n FLowerOpen: Boolean;\r\n FUpper: JSValue;\r\n FUpperOpen: Boolean;\r\n Public\r\n Class Function bound(aLower,aUpper : JSValue) : TJSIDBKeyRange; overload;\r\n Class Function bound(aLower,aUpper : JSValue; aLowerOpen : Boolean) : TJSIDBKeyRange; overload;\r\n Class Function bound(aLower,aUpper : JSValue; aLowerOpen,aUpperOpen : Boolean) : TJSIDBKeyRange; overload;\r\n Class Function lowerBound(aLower : JSValue) : TJSIDBKeyRange; overload;\r\n Class Function lowerBound(aLower : JSValue; aOpen: Boolean) : TJSIDBKeyRange; overload;\r\n Class Function only(aValue : JSValue) : TJSIDBKeyRange;\r\n Class Function upperBound(aUpper : JSValue) : TJSIDBKeyRange; overload;\r\n Class Function upperBound(aUpper : JSValue; aOpen: Boolean) : TJSIDBKeyRange; overload;\r\n function includes (aValue : JSValue) : Boolean;\r\n property lower : JSValue read FLower;\r\n property lowerOpen : Boolean read FLowerOpen;\r\n property upper : JSValue read FUpper;\r\n property upperOpen : Boolean read FUpperOpen;\r\n end;\r\n\r\n TJSIDBIndexParameters = record\r\n unique : boolean;\r\n multiEntry : boolean;\r\n locale : string;\r\n end;\r\n\r\n\r\n { TJSIDBIndex }\r\n\r\n TJSIDBIndex = class external name 'IDBIndex' (TJSObject)\r\n private\r\n FKeyPath: JSValue; external name 'keyPath';\r\n FMultiEntry: Boolean; external name 'multiEntry';\r\n FObjectStore: TJSIDBObjectStore; external name 'objectStore';\r\n FUnique: boolean; external name 'unique';\r\n public\r\n name : string;\r\n function count : TJSIDBRequest;\r\n function get(aKey : jsValue) : TJSIDBRequest; overload;\r\n function get(aKey : TJSIDBKeyRange) : TJSIDBRequest; overload;\r\n function getAll(aKey : jsValue) : TJSIDBRequest; overload;\r\n function getAll(aKey : TJSIDBKeyRange) : TJSIDBRequest; overload;\r\n function getAll(aKey : jsValue; ACount : NativeInt) : TJSIDBRequest; overload;\r\n function getAll(aKey : TJSIDBKeyRange; ACount : NativeInt) : TJSIDBRequest; overload;\r\n function getAllKeys(aKey : jsValue) : TJSIDBRequest; overload;\r\n function getAllKeys(aKey : TJSIDBKeyRange) : TJSIDBRequest; overload;\r\n function getAllKeys(aKey : jsValue; ACount : NativeInt) : TJSIDBRequest; overload;\r\n function getAllKeys(aKey : TJSIDBKeyRange; ACount : NativeInt) : TJSIDBRequest; overload;\r\n function getKey(aKey : jsValue) : TJSIDBRequest;\r\n function openCursor : TJSIDBRequest; overload;\r\n function openCursor(aKeyRange : TJSIDBKeyRange) : TJSIDBRequest; overload;\r\n function openCursor(aKeyRange : TJSIDBKeyRange; ADirection : String) : TJSIDBRequest;overload;\r\n function openKeyCursor : TJSIDBRequest;overload;\r\n function openKeyCursor(aKeyRange : TJSIDBKeyRange) : TJSIDBRequest;overload;\r\n function openKeyCursor(aKeyRange : TJSIDBKeyRange; ADirection : String) : TJSIDBRequest;overload;\r\n Property keyPath : JSValue Read FKeyPath;\r\n property multiEntry : Boolean read FMultiEntry;\r\n property objectStore : TJSIDBObjectStore read FObjectStore;\r\n property unique : boolean read FUnique;\r\n end;\r\n\r\n TJSIDBCursorDirection = class external name 'IDBCursorDirection' (TJSObject)\r\n Const\r\n next = 'next';\r\n nextUnique = 'nextUnique';\r\n prev = 'prev';\r\n prevUnique = 'prevUnique';\r\n end;\r\n\r\n\r\n { TJSIDBCursor }\r\n\r\n TJSIDBCursor = class external name 'IDBCursor' (TJSObject)\r\n private\r\n FDirection: string; external name 'direction';\r\n FKey: JSValue; external name 'key';\r\n FValue : JSValue; external name 'value';\r\n FPrimaryKey: JSValue; external name 'primaryKey';\r\n FSource: JSValue; external name 'source';\r\n FSourceAsIndex: TJSIDBIndex; external name 'source';\r\n FSourceAsStore: TJSIDBObjectStore; external name 'source';\r\n Public\r\n procedure advance(aCount : NativeInt); overload;\r\n procedure advance(aKey : JSValue); overload;\r\n procedure continue(aKey : JSValue); overload;\r\n procedure continue; overload;\r\n procedure continuePrimaryKey(aKey : JSValue); overload;\r\n procedure continuePrimaryKey(aKey,aPrimaryKey : JSValue); overload;\r\n procedure delete;\r\n procedure update(aValue : JSValue);\r\n property source : JSValue read FSource;\r\n property sourceAsStore : TJSIDBObjectStore read FSourceAsStore;\r\n property sourceAsIndex : TJSIDBIndex read FSourceAsIndex;\r\n property key : JSValue read FKey;\r\n Property Value : JSValue Read FValue;\r\n property primaryKey : JSValue read FPrimaryKey;\r\n property direction : string read FDirection;\r\n end;\r\n\r\n TJSIDBObjectStore = class external name 'IDBObjectStore' (TJSEventTarget)\r\n public\r\n function add(aValue : JSValue; aKey : String) : TJSIDBRequest;\r\n function add(aValue : JSValue) : TJSIDBRequest;\r\n function clear : TJSIDBRequest;\r\n function delete(aKey : string) : TJSIDBRequest;\r\n function delete(aKeyRange : TJSIDBKeyRange) : TJSIDBRequest;\r\n function get(aKey : string) : TJSIDBRequest; overload;\r\n function get(aKeyRange : TJSIDBKeyRange) : TJSIDBRequest; overload;\r\n function getKey(aKey : string) : TJSIDBRequest; overload;\r\n function getKey(aKeyRange : TJSIDBKeyRange) : TJSIDBRequest; overload;\r\n function getAll : TJSIDBRequest; overload;\r\n function getAll(aKey : String) : TJSIDBRequest; overload;\r\n function getAll(aKeyRange : TJSIDBKeyRange) : TJSIDBRequest; overload;\r\n function getAll(aKey : String; aCount: NativeInt) : TJSIDBRequest; overload;\r\n function getAll(aKeyRange : TJSIDBKeyRange; aCount: NativeInt) : TJSIDBRequest; overload;\r\n function getAllKeys(aKey : String) : TJSIDBRequest; overload;\r\n function getAllKeys(aKeyRange : TJSIDBKeyRange) : TJSIDBRequest; overload;\r\n function getAllKeys(aKey : String; aCount: NativeInt) : TJSIDBRequest; overload;\r\n function getAllKeys(aKeyRange : TJSIDBKeyRange; aCount: NativeInt) : TJSIDBRequest; overload;\r\n function createIndex (aIndexName : String; KeyPath : String) : TJSIDBIndex; overload;\r\n function createIndex (aIndexName : String; KeyPath : String; Options : TJSIDBIndexParameters) : TJSIDBIndex; overload;\r\n function createIndex (aIndexName : String; KeyPath : Array of String) : TJSIDBIndex; overload;\r\n function createIndex (aIndexName : String; KeyPath : Array of String; Options : TJSIDBIndexParameters) : TJSIDBIndex; overload;\r\n Procedure deleteIndex (aIndexName : String);\r\n function index (aIndexName : String) : TJSIDBIndex;\r\n function put(aValue : JSValue; aKey : String) : TJSIDBRequest; overload;\r\n function put(aValue : JSValue) : TJSIDBRequest; overload;\r\n function openCursor : TJSIDBRequest; overload;\r\n function openCursor(aKey : String) : TJSIDBRequest; overload;\r\n function openCursor(aKeyRange : TJSIDBKeyRange) : TJSIDBRequest; overload;\r\n function openCursor(aKey : String; aDirection : string) : TJSIDBRequest; overload;\r\n function openCursor(aKeyRange : TJSIDBKeyRange; aDirection : string) : TJSIDBRequest; overload;\r\n function openKeyCursor : TJSIDBRequest; overload;\r\n function openKeyCursor(aKey : String) : TJSIDBRequest; overload;\r\n function openKeyCursor(aKeyRange : TJSIDBKeyRange) : TJSIDBRequest; overload;\r\n function openKeyCursor(aKey : String; aDirection : string) : TJSIDBRequest; overload;\r\n function openKeyCursor(aKeyRange : TJSIDBKeyRange; aDirection : string) : TJSIDBRequest; overload;\r\n function count : TJSIDBRequest; overload;\r\n function count(aKey : String) : TJSIDBRequest; overload;\r\n function count(aKeyRange : TJSIDBKeyRange) : TJSIDBRequest; overload;\r\n property Indexes [aIndexName : String] : TJSIDBIndex read index;\r\n end;\r\n\r\n { TJSIDBRequest }\r\n\r\n TJSIDBRequest = class external name 'IDBRequest' (TJSEventTarget)\r\n private\r\n Ferror : JSValue; external name 'error'; // standards are not quite clear on this one\r\n FReadyState: string; external name 'readyState';\r\n FResult: JSValue; external name 'result';\r\n FResultDatabase: TIDBDatabase; external name 'result';\r\n FResultIndex: TJSIDBIndex; external name 'result';\r\n FResultObjectStore : TJSIDBObjectStore; external name 'result';\r\n FResultCursor : TJSIDBCursor; external name 'result';\r\n FSourceDatabase: TIDBDatabase; external name 'source';\r\n FSourceIndex: TJSIDBIndex; external name 'source';\r\n FSourceObjectStore : TJSIDBObjectStore; external name 'source';\r\n FSourceCursor : TJSIDBCursor; external name 'source';\r\n FSource: JSValue; external name 'source';\r\n FTransaction: TJSIDBTransaction; external name 'transaction';\r\n Public\r\n onerror : TJSEventHandler;\r\n onsuccess : TJSEventHandler;\r\n Property error : JSValue read FError;\r\n property readyState : string read FReadyState;\r\n\r\n property result : JSValue read FResult;\r\n property resultAsObjectStore : TJSIDBObjectStore read FResultObjectStore;\r\n property resultAsCursor : TJSIDBCursor read FResultCursor;\r\n property resultAsIndex : TJSIDBIndex read FResultIndex;\r\n property resultAsDatabase : TIDBDatabase read FResultDatabase;\r\n\r\n property source : JSValue read FSource;\r\n property sourceAsObjectStore : TJSIDBObjectStore read FSourceObjectStore;\r\n property sourceAsCursor : TJSIDBCursor read FSourceCursor;\r\n property sourceAsIndex : TJSIDBIndex read FSourceIndex;\r\n property sourceAsDatabase : TIDBDatabase read FSourceDatabase;\r\n\r\n property transaction : TJSIDBTransaction read FTransaction;\r\n end;\r\n\r\n TJSIDBOpenDBRequest = class external name 'IDBOpenDBRequest' (TJSIDBRequest)\r\n Public\r\n onblocked : TJSEventHandler;\r\n onupgradeneeded : TJSEventHandler;\r\n end;\r\n\r\n TJSCreateObjectStoreOptions = record\r\n keyPath : jsValue;\r\n autoIncrement : boolean;\r\n end;\r\n\r\n { TIDBDatabase }\r\n\r\n TIDBDatabase = class external name 'IDBDatabase' (TJSEventTarget)\r\n private\r\n FName: string; external name 'name';\r\n FobjectStoreNames: TStringDynArray; external name 'objectStoreNames';\r\n FVersion: integer; external name 'version';\r\n public\r\n procedure close;\r\n function createObjectStore(aName : string) : TJSIDBObjectStore; overload;\r\n function createObjectStore(aName : string; Options: TJSCreateObjectStoreOptions) : TJSIDBObjectStore; overload;\r\n procedure deleteObjectStore(aName : string);\r\n function transaction(aStoreNames : array of string) : TJSIDBTransaction; overload;\r\n function transaction(aStoreNames : array of string; aMode : string) : TJSIDBTransaction; overload;\r\n property name : string read FName;\r\n property version : integer read FVersion;\r\n property objectStoreNames : TStringDynArray read FobjectStoreNames;\r\n end;\r\n\r\n TJSIDBFactory = class external name 'IDBFactory' (TJSEventTarget)\r\n public\r\n function open(aName : string) : TJSIDBOpenDBRequest;\r\n function open(aName : string; aVersion : Integer) : TJSIDBOpenDBRequest;\r\n function deleteDatabase(aName : string) : TJSIDBOpenDBRequest;\r\n function cmp (a,b : jsValue) : NativeInt;\r\n end;\r\n \r\n { TJSStorage }\r\n\r\n TJSStorage = class external name 'Storage' (TJSEventTarget)\r\n private\r\n FLength: NativeInt; external name 'length';\r\n public\r\n function key(aIndex : Integer) : String;\r\n function getItem(aKeyName : string) : string;\r\n procedure setItem(aKeyName : string; aValue : string);\r\n procedure removeItem(aKeyName : string);\r\n procedure clear;\r\n property Keys[AIndex : Integer] : String read key;\r\n property Items[aKeyName: String] : String read getItem write setItem; default;\r\n property length : NativeInt Read FLength;\r\n end;\r\n\r\n // Fake object, used for objects whose visible can be checked\r\n TJSVisibleItem = class external name 'IVisible' (TJSObject)\r\n Private\r\n FVisible : boolean; external name 'visible';\r\n Public\r\n Property visible : boolean read FVisible;\r\n end;\r\n \r\n TJSLocationBar = class external name 'LocationBar' (TJSVisibleItem);\r\n TJSMenuBar = class external name 'MenuBar' (TJSVisibleItem);\r\n TJSToolBar = class external name 'ToolBar' (TJSVisibleItem);\r\n TJSPersonalBar = class external name 'PersonalBar' (TJSVisibleItem);\r\n TJSScrollBars = class external name 'ScrollBars' (TJSVisibleItem);\r\n\r\n TJSPositionError = record\r\n code : integer;\r\n message : string;\r\n end;\r\n\r\n TJSPositionOptions = record\r\n enableHighAccuracy : boolean;\r\n timeout : integer;\r\n maximumAge : integer;\r\n end;\r\n\r\n TJSCoordinates = record\r\n latitude : double;\r\n longitude : double;\r\n altitude : double;\r\n accuracy : double;\r\n altitudeAccuracy : double;\r\n heading : double;\r\n speed : double;\r\n end;\r\n\r\n TJSPosition = record\r\n coords : TJSCoordinates;\r\n timestamp : String;\r\n end;\r\n\r\n TJSGeoLocationCallback = procedure (aPosition : TJSPosition);\r\n TJSGeoLocationEvent = procedure (aPosition : TJSPosition) of object;\r\n TJSGeoLocationErrorCallback = procedure (aValue : TJSPositionError);\r\n TJSGeoLocationErrorEvent = procedure (aValue : TJSPositionError) of object;\r\n\r\n TJSGeoLocation = class external name 'GeoLocation' (TJSObject)\r\n Public\r\n Procedure getCurrentPosition(ASuccess : TJSGeoLocationCallback); overload;\r\n Procedure getCurrentPosition(ASuccess : TJSGeoLocationCallback;aError : TJSGeoLocationErrorCallback); overload;\r\n Procedure getCurrentPosition(ASuccess : TJSGeoLocationCallback;aError : TJSGeoLocationErrorCallback; AOptions : TJSPositionOptions); overload;\r\n Function watchPosition(ASuccess : TJSGeoLocationCallback) : NativeInt; overload;\r\n Function watchPosition(ASuccess : TJSGeoLocationCallback;aError : TJSGeoLocationErrorCallback) : NativeInt; overload;\r\n Function watchPosition(ASuccess : TJSGeoLocationCallback;aError : TJSGeoLocationErrorCallback; AOptions : TJSPositionOptions) : NativeInt; overload;\r\n procedure clearWatch(AID : NativeInt);\r\n end;\r\n\r\n TJSMediaStreamTrack = class external name 'MediaStreamTrack' (TJSEventTarget)\r\n end;\r\n\r\n TJSMediaDevices = class external name 'MediaDevices' (TJSEventTarget)\r\n end;\r\n\r\n TJSWorker = class external name 'Worker' (TJSEventTarget)\r\n public\r\n constructor new(aURL : string);\r\n procedure postMessage(aValue : JSValue);\r\n procedure postMessage(aValue : JSValue; aList : TJSValueDynArray);\r\n end;\r\n\r\n TJSMessagePort = class external name 'MessagePort' (TJSEventTarget)\r\n Public\r\n procedure close;\r\n procedure postMessage(aValue : JSValue);\r\n procedure postMessage(aValue : JSValue; aList : TJSValueDynArray);\r\n procedure start;\r\n end;\r\n\r\n { TJSSharedWorker }\r\n\r\n TJSSharedWorker = class external name 'SharedWorker' (TJSEventTarget)\r\n private\r\n FPort: TJSMessagePort; external name 'port';\r\n Public\r\n constructor new(aURL : String); overload;\r\n constructor new(aURL : String; aName : string); overload;\r\n property port : TJSMessagePort Read FPort;\r\n end;\r\n\r\n { TJSServiceWorker }\r\n\r\n TJSServiceWorker = class external name 'ServiceWorker' (TJSWorker)\r\n private\r\n FscriptURL: String; external name 'scriptURL';\r\n FState: string; external name 'state';\r\n Public\r\n property state : string read FState;\r\n property scriptURL : String Read FscriptURL;\r\n end;\r\n\r\n { TJSServiceWorkerRegistration }\r\n\r\n TJSServiceWorkerRegistration = class external name 'ServiceWorkerRegistration' (TJSObject)\r\n private\r\n FActive: TJSServiceWorker; external name 'active';\r\n FInstalling: TJSServiceWorker; external name 'installing';\r\n FScope: string; external name 'scope';\r\n FWaiting: TJSServiceWorker; external name 'waiting';\r\n public\r\n function unregister : TJSPromise;\r\n procedure update;\r\n property active : TJSServiceWorker read FActive;\r\n property scope : string read FScope;\r\n property waiting : TJSServiceWorker read FWaiting;\r\n property installing : TJSServiceWorker read FInstalling;\r\n end;\r\n\r\n TJSServiceWorkerContainerOptions = record\r\n scope : string;\r\n end;\r\n\r\n { TJSServiceWorkerContainer }\r\n\r\n TJSServiceWorkerContainer = class external name 'ServiceWorkerContainer' (TJSObject)\r\n private\r\n FController: TJSServiceWorker; external name 'controller';\r\n FReady: TJSPromise; external name 'ready';\r\n Public\r\n function register(aURL : String) : TJSPromise; overload;\r\n function register(aURL : String; aOptions : TJSServiceWorkerContainerOptions) : TJSPromise; overload;\r\n function getRegistration(aURL : String) : TJSPromise; overload;\r\n function getRegistration : TJSPromise; overload;\r\n function getRegistrations : TJSPromise;\r\n property controller : TJSServiceWorker read FController;\r\n property ready : TJSPromise read FReady;\r\n end;\r\n\r\n\r\n { TJSNavigator }\r\n\r\n TJSNavigator = class external name 'Navigator' (TJSObject)\r\n{$IFDEF FIREFOX}\r\n FbuildID : String ; external name 'buildID';\r\n FOSCPU : String ; external name 'oscpu';\r\n FproductSub : string; external name 'productSub';\r\n FVendor : string; external name 'vendor';\r\n{$ENDIF}\r\n private\r\n FCookieEnabled: Boolean; external name 'cookieEnabled';\r\n FGeoLocation: TJSGeoLocation; external name 'geolocation';\r\n FLanguage: String; external name 'language';\r\n FMaxTouchPoints: NativeInt; external name 'maxTouchPoints';\r\n FMediaDevices: TJSMediaDevices; external name 'mediaDevices';\r\n FOnline: boolean; external name 'onLine';\r\n FPlatform: string; external name 'platform';\r\n FServiceWorker: TJSServiceWorkerContainer; external name 'serviceWorker';\r\n FUserAgent: string; external name 'userAgent';\r\n public\r\n function getBattery : TJSPromise;\r\n function requestMediaKeySystemAccess(aKeySystem : String; supportedConfigurations : TJSValueDynArray) : TJSPromise;\r\n Procedure registerContentHandler(aMimeType,aURI,aTitle : string);\r\n Procedure registerProtocolHandler(aProtocol,aURI,aTitle : string);\r\n Procedure vibrate(aPattern : NativeInt);\r\n Procedure vibrate(aPattern : Array of NativeInt);\r\n{$IFDEF FIREFOX}\r\n property buildID : String read FBuildID;\r\n property oscpu : string read FOSCPU;\r\n property productSub: string read FproductSub;\r\n property vendor : string read Fvendor;\r\n{$ENDIF}\r\n property cookieEnabled : Boolean read FCookieEnabled;\r\n property geoLocation : TJSGeoLocation Read FGeoLocation;\r\n property language : String read FLanguage;\r\n property maxTouchPoints : NativeInt read FMaxTouchPoints;\r\n property mediaDevices : TJSMediaDevices read FMediaDevices;\r\n property onLine : boolean read FOnline;\r\n property platform : string read FPlatform;\r\n property userAgent : string read FUserAgent;\r\n property serviceWorker : TJSServiceWorkerContainer read FServiceWorker;\r\n end;\r\n\r\n { TJSTouchEvent }\r\n TTouchCoord = longint;\r\n\r\n TJSTouch = class external name 'Touch' (TJSObject)\r\n private\r\n FClientX: TTouchCoord; external name 'clientX';\r\n FClientY: TTouchCoord; external name 'clientY';\r\n FIDentifier: longint; external name 'identifier';\r\n FPageX: TTouchCoord; external name 'pageX';\r\n FPageY: TTouchCoord; external name 'pageY';\r\n FScreenX: TTouchCoord; external name 'screenX';\r\n FScreenY: TTouchCoord; external name 'screenY';\r\n FTarget: TJSElement; external name 'target';\r\n Public\r\n Property identifier : longint read FIDentifier;\r\n Property ScreenX : TTouchCoord Read FScreenX;\r\n Property ScreenY : TTouchCoord Read FScreenY;\r\n Property ClientX : TTouchCoord Read FClientX;\r\n Property ClientY : TTouchCoord Read FClientY;\r\n Property PageX : TTouchCoord Read FPageX;\r\n Property PageY : TTouchCoord Read FPageY;\r\n Property Target : TJSElement Read FTarget;\r\n end;\r\n\r\n { TJSTouchList }\r\n\r\n TJSTouchList = class external name 'TouchList' (TJSObject)\r\n private\r\n FLength: NativeInt; external name 'length';\r\n Public\r\n function item (aIndex : Integer) : TJSTouch;\r\n property length : NativeInt Read FLength;\r\n Property Touches[AIndex : Integer] : TJSTouch Read item; default;\r\n end;\r\n\r\n\r\n TJSPerformance = class external name 'Performance' (TJSObject);\r\n\r\n TJSScreen = class external name 'Screen' (TJSObject)\r\n private\r\n FavailHeight: Integer; external name 'availHeight';\r\n FavailWidth: Integer; external name 'availWidth';\r\n FcolorDepth: Integer; external name 'colorDepth';\r\n FPixelDepth: Integer; external name 'pixelDepth';\r\n Fheight: Integer; external name 'height';\r\n Fwidth: Integer; external name 'width';\r\n public\r\n { Properties declarations }\r\n property availHeight: Integer read FavailHeight;\r\n property availWidth: Integer read FavailWidth;\r\n property colorDepth: Integer read FcolorDepth;\r\n property pixelDepth: Integer read FPixelDepth;\r\n property height: Integer read Fheight;\r\n property width: Integer read Fwidth;\r\n end;\r\n\r\n TJSBlob = class;\r\n\r\n TJSParamEnumCallBack = reference to procedure (const aKey,aValue : string);\r\n TJSURLSearchParams = class external name 'URLSearchParams' (TJSObject)\r\n Public\r\n Procedure append(const aName,aValue : string);\r\n Procedure delete(const aName : string);\r\n Function entries : TJSIterator;\r\n Procedure foreach(aEnumCallBack : TJSParamEnumCallBack);\r\n function get(const aName : string) : JSValue;\r\n // If you're sure the value exists...\r\n function getString(const aName : string) : string; external name 'get';\r\n function getAll(const aName : string) : TStringDynArray;\r\n function has(const aName : string) : Boolean;\r\n Function keys : TJSIterator; reintroduce;\r\n Procedure set_(const aName,aValue : string); external name 'set';\r\n Procedure sort;\r\n Function values : TJSIterator; reintroduce;\r\n end;\r\n\r\n TJSURL = class external name 'URL' (TJSObject)\r\n Private\r\n FOrigin : String; external name 'origin';\r\n FSearchParams : TJSURLSearchParams; external name 'searchParams';\r\n public\r\n hash : string;\r\n host : string;\r\n hostname : string;\r\n href : string;\r\n password : string;\r\n pathname : string;\r\n port : string;\r\n protocol : string;\r\n search : string;\r\n username : string;\r\n constructor new(aURL : String);\r\n constructor new(aURL,aBase : String);\r\n class function createObjectURL(const v: JSValue): string;\r\n class function revokeObjectURL(const S : String): string;\r\n function toJSON : String;\r\n Property Origin : String Read FOrigin;\r\n property SearchParams : TJSURLSearchParams read FSearchParams;\r\n end;\r\n\r\n TJSCSSStyleDeclaration = class; // forward\r\n\r\n TJSTimerCallBack = reference to procedure; safecall;\r\n Theader = Array [0..1] of String;\r\n THeaderArray = Array of Theader;\r\n\r\n TJSHTMLHeaders = Class external name 'Headers' (TJSObject)\r\n Public\r\n constructor new(values : THeaderArray); overload;\r\n procedure append(aName, aValue : String);\r\n procedure delete(aName : String);\r\n function entries : TJSIterator;\r\n Function get(aName: String): string;\r\n Function has(aName: String): Boolean;\r\n function keys : TJSIterator; reintroduce;\r\n function values : TJSIterator; reintroduce;\r\n procedure set_(aName, aValue : String);\r\n Property Headers[aName : string] : string Read Get Write Set_;\r\n end;\r\n\r\n\r\n { TJSMediaQueryList }\r\n\r\n TJSMediaQueryList = class external name 'MediaQueryList' (TJSObject)\r\n private\r\n FMatches: Boolean; external name 'matches';\r\n FMedia: String; external name 'media';\r\n Public\r\n Property matches : Boolean Read FMatches;\r\n Property media : String Read FMedia;\r\n end;\r\n\r\n TJSReadableStream = class external name 'ReadableStream' (TJSObject)\r\n private\r\n flocked: Boolean; external name 'locked';\r\n public\r\n property locked: Boolean read flocked;\r\n constructor new(underlyingSource: TJSObject);\r\n constructor new(underlyingSource, queueingStrategy: TJSObject);\r\n function cancel(reason: TJSDOMString): TJSPromise;\r\n function getReader(): TJSObject; overload;\r\n function getReader(mode: TJSObject): TJSObject; overload;\r\n function pipeThrough(transformStream: TJSObject): TJSReadableStream; overload;\r\n function pipeThrough(transformStream, options: TJSObject): TJSReadableStream; overload;\r\n function pipeTo(destination: TJSObject): TJSPromise; overload;\r\n function pipeTo(destination, options: TJSObject): TJSPromise; overload;\r\n function tee(): TJSArray; // array containing two TJSReadableStream instances\r\n end;\r\n\r\n TJSBody = class external name 'Body' (TJSObject)\r\n private\r\n fbody: TJSReadableStream; external name 'body';\r\n fbodyUsed: Boolean; external name 'bodyUsed';\r\n public\r\n property body: TJSReadableStream read fbody;\r\n property bodyUsed: Boolean read fbodyUsed;\r\n function arrayBuffer(): TJSPromise; // resolves to TJSArrayBuffer\r\n //function blob(): TJSPromise; // resolves to TJSBlob\r\n function blob: TJSBlob; {$IFNDEF SkipAsync}async;{$ENDIF}\r\n function json(): TJSPromise; // resolves to JSON / TJSValue\r\n //function text(): TJSPromise; // resolves to USVString, always decoded using UTF-8\r\n function text(): string; {$IFNDEF SkipAsync}async;{$ENDIF}\r\n end;\r\n\r\n TJSResponse = class external name 'Response' (TJSBody)\r\n private\r\n fheaders: TJSObject;external name 'headers';\r\n fok: Boolean; external name 'ok';\r\n fredirected: Boolean; external name 'redirected';\r\n fstatus: NativeInt; external name 'status';\r\n fstatusText: String; external name 'statusText';\r\n ftype: String; external name 'type';\r\n furl: String; external name 'url';\r\n fuseFinalUrl: Boolean; external name 'useFinalUrl';\r\n public\r\n property headers: TJSObject read fheaders; //\r\n property ok: Boolean read fok;\r\n property redirected: Boolean read fredirected;\r\n property status: NativeInt read fstatus;\r\n property statusText: String read fstatusText; //\r\n property type_: String read ftype; //\r\n property url: String read furl; //\r\n property useFinalUrl: Boolean read fuseFinalUrl write fuseFinalUrl;\r\n constructor new(body: TJSObject; init: TJSObject); varargs; external name 'new';\r\n function clone(): TJSResponse;\r\n function error(): TJSResponse;\r\n function redirect(url: String; Status: NativeInt): TJSResponse;\r\n end;\r\n\r\n { TJSWindow }\r\n TJSDOMHighResTimeStamp = Double;\r\n TFrameRequestCallback = procedure (aTime: TJSDOMHighResTimeStamp);\r\n\r\n TJSPostMessageOptions = class external name 'Object' (TJSObject)\r\n targetOrigin : string;\r\n transfer : TJSValueDynArray;\r\n end;\r\n\r\n TJSWindowArray = Array of TJSWindow;\r\n TJSWindow = class external name 'Window' (TJSObject)\r\n Private\r\n FClosed: boolean; external name 'closed';\r\n FConsole : TJSConsole; external name 'console';\r\n FCrypto: TJSCrypto; external name 'crypto';\r\n FDevicePixelRatio: Double; external name 'devicePixelRatio';\r\n FDocument: TJSDocument; external name 'document';\r\n FFrameElement: TJSElement; external name 'frameElement';\r\n FFrames: TJSWindowArray; external name 'frames';\r\n FHistory: TJSHistory; external name 'history';\r\n FIndexedDB: TJSIDBFactory; external name 'indexedDB';\r\n FInnerheight: NativeInt; external name 'innerHeight';\r\n FInnerWidth: NativeInt; external name 'innerWidth';\r\n FLength: NativeInt; external name 'length';\r\n FLocalStorage: TJSStorage; external name 'localStorage';\r\n FLocation: TJSLocation; external name 'location';\r\n FLocationBar: TJSLocationBar; external name 'locationbar';\r\n FLocationString: string; external name 'location';\r\n FMenuBar: TJSMenuBar; external name 'menubar';\r\n FNavigator: TJSNavigator; external name 'navigator';\r\n FOpener: TJSWindow; external name 'opener';\r\n FOuterheight: NativeInt; external name 'outerHeight';\r\n FOuterWidth: NativeInt; external name 'outerWidth';\r\n FParent: TJSWindow; external name 'parent';\r\n FPerformance: TJSPerformance; external name 'Performance';\r\n FPersonalBar: TJSPersonalBar; external name 'personalbar';\r\n FScreen: TJSScreen; external name 'screen';\r\n FScreenX: NativeInt; external name 'screenX';\r\n FScreenY: NativeInt; external name 'screenY';\r\n FScrollbar: TJSScrollBars; external name 'scrollbar';\r\n FScrollX: NativeInt; external name 'scrollX';\r\n FScrollY: NativeInt; external name 'scrollY';\r\n FSelf: TJSWindow; external name 'self';\r\n FSessionStorage: TJSStorage; external name 'sessionStorage';\r\n FToolBar: TJSToolBar; external name 'toolbar';\r\n FTop: TJSWindow; external name 'top';\r\n FURL: TJSURL; external name 'URL';\r\n Public\r\n fullSreen : Boolean; \r\n name : string;\r\n status : string;\r\n onabort : TJSEventHandler;\r\n onafterprint : TJSEventHandler;\r\n onbeforeprint : TJSEventHandler;\r\n onbeforeinstallprompt : TJSEventHandler;\r\n onbeforeunloadprompt : TJSEventHandler;\r\n onblur : TJSEventHandler;\r\n onchange : TJSEventHandler;\r\n onclick: THTMLClickEventHandler;\r\n onclose : TJSEventHandler;\r\n oncontextmenu : TJSEventHandler;\r\n ondblclick : THTMLClickEventHandler;\r\n onerror : TJSErrorEventHandler;\r\n onfocus : TJSFocusEventhandler;\r\n onhashchange : TJSHashChangeEventhandler;\r\n oninput : TJSEventhandler;\r\n onkeydown : TJSKeyEventhandler;\r\n onkeypress : TJSKeyEventhandler;\r\n onkeyup : TJSKeyEventhandler;\r\n onlanguagechange : TJSEventhandler;\r\n onload : TJSEventhandler;\r\n onloadend : TJSLoadEventhandler;\r\n onloadstart : TJSLoadEventhandler;\r\n onmessage : TJSEventHandler;\r\n onmousedown : TJSMouseEventHandler;\r\n onmouseenter : TJSMouseEventHandler;\r\n onmouseleave : TJSMouseEventHandler;\r\n onmousemove : TJSMouseEventHandler;\r\n onmouseout : TJSMouseEventHandler;\r\n onmouseover : TJSMouseEventHandler;\r\n onmouseup : TJSMouseEventHandler;\r\n onmousewheel : TJSMouseEventHandler;\r\n onoffline : TJSEventHandler;\r\n ononline : TJSEventHandler;\r\n onpagehide : TJSPageTransitionEventHandler;\r\n onpageshow : TJSPageTransitionEventHandler;\r\n onpaint : TJSEventHandler;\r\n onpointercancel : TJSPointerEventHandler;\r\n onpointerdown : TJSPointerEventHandler;\r\n onpointerenter : TJSPointerEventHandler;\r\n onpointerleave : TJSPointerEventHandler;\r\n onpointermove : TJSPointerEventHandler;\r\n onpointerout : TJSPointerEventHandler;\r\n onpointerover : TJSPointerEventHandler;\r\n onpointerup : TJSPointerEventHandler;\r\n onpointerlockchange : TJSPointerEventHandler;\r\n onprogress : TJSProgressEventhandler;\r\n onpopstate : TJSPopStateEventHandler;\r\n onreset : TJSUIEventHandler;\r\n onresize : TJSUIEventHandler;\r\n onscroll : TJSUIEventHandler;\r\n onselect : TJSEventHandler;\r\n onselectionchange : TJSEventHandler;\r\n onstorage : TJSStorageEventHandler;\r\n onsubmit : TJSEventHandler;\r\n onunload : TJSUIEventHandler;\r\n touchstart : TJSTouchEventHandler;\r\n touchend : TJSTouchEventHandler;\r\n touchmove : TJSTouchEventHandler;\r\n touchcancel : TJSTouchEventHandler;\r\n procedure addEventListener(aname : string; aListener : TJSEventHandler);\r\n procedure addEventListener(aname : string; aListener : TJSRawEventHandler);\r\n procedure addEventListener(aname : string; aListener : JSValue);\r\n Procedure alert(Const Msg : String);\r\n Function atob(Const aValue : string) : string;\r\n procedure blur;\r\n Procedure clearInterval(aID: NativeInt);\r\n Procedure clearTimeout(aID: NativeInt);\r\n Function btoa(Const aValue : string) : string;\r\n procedure cancelAnimationFrame(aHandle: Integer);\r\n Procedure close;\r\n Function confirm(Const aMsg : String) : boolean;\r\n function fetch(resource: String; init: TJSObject): TJSPromise; overload; external name 'fetch';\r\n //function fetch(resource: String): TJSPromise; overload; external name 'fetch';\r\n function fetch(resource: String): TJSResponse; {$IFNDEF SkipAsync}async;{$ENDIF} overload; external name 'fetch';\r\n function fetch(resource: TJSObject; init: TJSObject): TJSPromise; overload; external name 'fetch';\r\n function fetch(resource: TJSObject): TJSPromise; overload; external name 'fetch';\r\n function asyncfetch(resource: String): TJSResponse; {$IFNDEF SkipAsync}async;{$ENDIF} overload; external name 'fetch';\r\n function asyncfetch(resource: TJSObject; init: TJSObject): TJSResponse; {$IFNDEF SkipAsync} async;{$ENDIF} overload; external name 'fetch';\r\n function asyncfetch(resource: TJSObject): TJSResponse; {$IFNDEF SkipAsync}async;{$ENDIF} overload;external name 'fetch';\r\n procedure focus;\r\n Function getComputedStyle(aElement : TJSElement) : TJSCSSStyleDeclaration; overload;\r\n Function getComputedStyle(aElement,aPseudoElement : TJSElement) : TJSCSSStyleDeclaration; overload;\r\n function matchMedia(aQuery : String) : TJSMediaQueryList;\r\n procedure moveBy(x,y : NativeInt);\r\n procedure moveTo(x,y : NativeInt);\r\n function open : TJSWindow;\r\n function open(Const aURL : String) : TJSWindow; overload;\r\n function open(Const aURL,aTarget : String) : TJSWindow; overload;\r\n function open(Const aURL,aTarget : String; AOptions : TJSObject) : TJSWindow; overload;\r\n procedure postMessage(aMessage : JSValue);\r\n procedure postMessage(aMessage : JSValue; aOptions : TJSPostMessageOptions);\r\n procedure postMessage(aMessage : JSValue; aTransfer : TJSValueDynArray);\r\n procedure postMessage(aMessage : JSValue; aTarget : string);\r\n procedure postMessage(aMessage : JSValue; aTarget : string; aTransfer : TJSValueDynArray);\r\n procedure print;\r\n function prompt(const aMessage : String) : String; overload;\r\n function prompt(const aMessage,aDefault : String) : String; overload;\r\n procedure removeEventListener(aname : string; aListener : TJSEventHandler);\r\n procedure removeEventListener(aname : string; aListener : JSValue);\r\n function requestAnimationFrame(aCallback: TFrameRequestCallback): Integer;\r\n procedure resizeBy(aWidth,aHeight : NativeInt);\r\n procedure resizeTo(aWidth,aHeight : NativeInt);\r\n procedure scrollBy(x,y : NativeInt);\r\n procedure scrollTo(x,y : NativeInt);\r\n Function setInterval(ahandler : TJSTimerCallBack; aInterval : NativeUInt) : NativeInt; varargs;\r\n Function setTimeout(ahandler : TJSTimerCallBack; aTimeout : NativeUInt) : NativeInt; varargs;\r\n Function setTimeout(ahandler : TJSTimerCallBack) : NativeInt;\r\n procedure stop;\r\n { public properties }\r\n property console : TJSConsole Read FConsole;\r\n property closed : boolean read FClosed;\r\n property crypto : TJSCrypto Read FCrypto;\r\n property devicePixelRatio : Double read FDevicePixelRatio;\r\n property document : TJSDocument read FDocument;\r\n property frameElement : TJSElement Read FFrameElement;\r\n Property frames : TJSWindowArray read FFrames;\r\n Property history : TJSHistory read FHistory;\r\n Property indexedDB : TJSIDBFactory read FIndexedDB;\r\n Property innerHeight : NativeInt Read FInnerheight;\r\n Property innerWidth : NativeInt Read FInnerWidth;\r\n Property length : NativeInt Read FLength;\r\n Property localStorage : TJSStorage Read FLocalStorage; \r\n property location : TJSLocation Read FLocation;\r\n Property locationString : String read FLocationString write FLocationString;\r\n property locationbar : TJSLocationBar Read FLocationBar;\r\n property menubar : TJSMenuBar Read FMenuBar;\r\n property navigator : TJSNavigator Read FNavigator;\r\n property opener : TJSWindow read FOpener;\r\n Property outerHeight : NativeInt Read FOuterheight;\r\n Property outerWidth : NativeInt Read FOuterWidth;\r\n Property parent : TJSWindow Read FParent;\r\n Property Performance : TJSPerformance Read FPerformance;\r\n property personalbar : TJSPersonalBar Read FPersonalBar;\r\n property screen : TJSScreen read FScreen;\r\n property screenX : NativeInt read FScreenX;\r\n Property screenY : NativeInt read FScreenY;\r\n Property scrollbar : TJSScrollBars Read FScrollbar;\r\n property scrollX : NativeInt read FScrollX;\r\n Property scrollY : NativeInt read FScrollY;\r\n Property _Self : TJSWindow read FSelf;\r\n Property sessionStorage : TJSStorage Read FSessionStorage; \r\n property toolbar : TJSToolBar Read FToolBar;\r\n property top : TJSWindow Read FTop;\r\n property URL : TJSURL Read FURL; \r\n end;\r\n\r\n { TJSCSSStyleDeclaration }\r\n\r\n TJSCSSStyleDeclaration = class external name 'CSSStyleDeclaration' (TJSObject)\r\n private\r\n FLength: NativeInt; external name 'length';\r\n FParentRule: TJSCSSRule; external name 'parentRule';\r\n public\r\n cssText : string;\r\n function item(aIndex : Integer) : string;\r\n function removeProperty(const aProperty : String) : string;\r\n function getPropertyPriority(const aProperty : String) : string;\r\n function getPropertyValue(const aProperty : String) : string;\r\n procedure setProperty(const aProperty,aValue : String);overload;\r\n procedure setProperty(const aProperty,aValue,aPriority : string); overload;\r\n property length : NativeInt read FLength;\r\n property parentRule : TJSCSSRule read FParentRule;\r\n end;\r\n\r\n\r\n\r\n\r\n\r\n { TJSHTMLElement }\r\n TJSHTMLElement = class external name 'HTMLElement' (TJSElement)\r\n private\r\n FDataset: TJSObject ; external name 'dataset';\r\n FIsContentEditable: Boolean ; external name 'isContentEditable';\r\n FOffsetHeight: Double; external name 'offsetHeight';\r\n FOffsetLeft: Double; external name 'offsetLeft';\r\n FOffsetParent: TJSElement; external name 'offsetParent';\r\n FOffsetTop: Double; external name 'offsetTop';\r\n FOffsetWidth: Double; external name 'offsetWidth';\r\n Public\r\n accessKey : string;\r\n contentEditable : string;\r\n dir : string;\r\n draggable : boolean;\r\n hidden : boolean;\r\n lang : string;\r\n spellcheck : boolean;\r\n style : TJSCSSStyleDeclaration;\r\n tabIndex : Integer;\r\n title: string;\r\n onabort : TJSEventHandler;\r\n onanimationcancel: THTMLAnimationEventHandler;\r\n onanimationend: THTMLAnimationEventHandler;\r\n onblur : TJSEventHandler;\r\n oncancel : TJSEventHandler;\r\n oncanplay : TJSEventHandler;\r\n oncanplaythrough : TJSEventHandler;\r\n onchange : TJSEventHandler;\r\n onclick: THTMLClickEventHandler;\r\n onclose : TJSEventHandler;\r\n oncontextmenu : TJSEventHandler;\r\n ondblclick : THTMLClickEventHandler;\r\n ondrag : TJSDragDropEventHandler;\r\n ondragend : TJSDragDropEventHandler;\r\n ondragenter : TJSDragDropEventHandler;\r\n ondragexit : TJSDragDropEventHandler;\r\n ondragover : TJSDragDropEventHandler;\r\n ondragleave : TJSDragDropEventHandler;\r\n ondragstart: TJSDragDropEventHandler;\r\n ondrop : TJSDragDropEventHandler;\r\n onerror : TJSErrorEventHandler;\r\n onfocus : TJSFocusEventhandler;\r\n ondurationchange : TJSEventHandler;\r\n onemptied : TJSEventHandler;\r\n onended : TJSEventHandler;\r\n ongotpointercapture : TJSPointerEventHandler;\r\n oninput : TJSEventhandler;\r\n oninvalid : TJSEventhandler;\r\n onkeydown : TJSKeyEventhandler;\r\n onkeypress : TJSKeyEventhandler;\r\n onkeyup : TJSKeyEventhandler;\r\n onload : TJSEventhandler;\r\n onloadeddata : TJSEventhandler;\r\n onloadedmetadata : TJSEventhandler;\r\n onloadend : TJSLoadEventhandler;\r\n onloadstart : TJSLoadEventhandler;\r\n onlostpointercapture : TJSPointerEventHandler;\r\n onmousedown : TJSMouseEventHandler;\r\n onmouseenter : TJSMouseEventHandler;\r\n onmouseleave : TJSMouseEventHandler;\r\n onmousemove : TJSMouseEventHandler;\r\n onmouseout : TJSMouseEventHandler;\r\n onmouseover : TJSMouseEventHandler;\r\n onmouseup : TJSMouseEventHandler;\r\n onmousewheel : TJSMouseEventHandler;\r\n onpause : TJSPointerEventHandler;\r\n onplay : TJSPointerEventHandler;\r\n onplaying : TJSPointerEventHandler;\r\n onpointercancel : TJSPointerEventHandler;\r\n onpointerdown : TJSPointerEventHandler;\r\n onpointerenter : TJSPointerEventHandler;\r\n onpointerleave : TJSPointerEventHandler;\r\n onpointermove : TJSPointerEventHandler;\r\n onpointerout : TJSPointerEventHandler;\r\n onpointerover : TJSPointerEventHandler;\r\n onpointerup : TJSPointerEventHandler;\r\n onpointerlockchange : TJSPointerEventHandler;\r\n onprogress : TJSProgressEventhandler;\r\n onseeked : TJSEventHandler;\r\n onseeking : TJSEventHandler;\r\n onreset : TJSUIEventHandler;\r\n onscroll : TJSUIEventHandler;\r\n onselect : TJSEventHandler;\r\n onselectstart : TJSEventHandler;\r\n onselectionchange : TJSEventHandler;\r\n onshow : TJSEventHandler;\r\n onstalled : TJSEventHandler;\r\n ontimeupdate : TJSEventHandler;\r\n ontransitioncancel : TJSEventHandler;\r\n ontransitionend : TJSEventHandler;\r\n onvolumechange : TJSEventHandler;\r\n onsubmit : TJSEventHandler;\r\n onwheel : TJSMouseWheelEventHandler;\r\n onwaiting : TJSEventHandler;\r\n touchstart : TJSTouchEventHandler;\r\n touchend : TJSTouchEventHandler;\r\n touchmove : TJSTouchEventHandler;\r\n touchcancel : TJSTouchEventHandler;\r\n Procedure blur;\r\n Procedure focus;\r\n Procedure click;\r\n property dataset : TJSObject read FDataset;\r\n property isContentEditable : Boolean read FIsContentEditable;\r\n property offsetHeight : Double Read FOffsetHeight;\r\n property offsetLeft : Double Read FOffsetLeft;\r\n property offsetTop : Double Read FOffsetTop;\r\n property offsetWidth : Double Read FOffsetWidth;\r\n property offsetParent : TJSElement Read FOffsetParent;\r\n end;\r\n\r\n TJSHTMLFormControlsCollection = class external name 'HTMLFormControlsCollection' (TJSHTMLCollection)\r\n Public\r\n function namedItem(S : String) : TJSElement; reintroduce; external name 'namedItem';\r\n property Items[S : String] : TJSElement read namedItem; default;\r\n end;\r\n\r\n { TJSHTMLFormElement }\r\n\r\n TJSHTMLFormElement = class external name 'HTMLFormElement' (TJSHTMLElement)\r\n private\r\n FElements: TJSHTMLFormControlsCollection; external name 'elements';\r\n FLength: NativeInt; external name 'length';\r\n Public\r\n Procedure reset;\r\n function reportValidity : Boolean;\r\n function checkValidity : Boolean;\r\n procedure submit;\r\n method : string;\r\n target : string;\r\n action : string;\r\n encoding : string;\r\n enctype : string;\r\n acceptCharset : string;\r\n autocomplete : string;\r\n noValidate : boolean;\r\n property elements : TJSHTMLFormControlsCollection read FElements;\r\n Property length : NativeInt Read FLength;\r\n end;\r\n\r\n { TJSValidityState }\r\n\r\n TJSValidityState = class external name 'ValidityState' (TJSObject)\r\n private\r\n FBadInput: Boolean; external name 'badInput';\r\n FCustomError: Boolean; external name 'customError';\r\n FPatternMismatch: Boolean; external name 'patternMisMatch';\r\n FRangeOverflow: Boolean; external name 'rangeOverflow';\r\n FRangeUnderflow: Boolean; external name 'rangeUnderflow';\r\n FStepMismatch: Boolean; external name 'stepMismatch';\r\n FTooLong: Boolean; external name 'tooLong';\r\n FTooShort: Boolean; external name 'tooShort';\r\n FTypeMismatch: Boolean; external name 'typeMisMatch';\r\n FValid: Boolean; external name 'valid';\r\n FValueMissing: Boolean; external name 'valueMissing';\r\n public\r\n property badInput : Boolean read FBadInput;\r\n property customError : Boolean read FCustomError;\r\n property patternMisMatch : Boolean read FPatternMismatch;\r\n property rangeOverflow : Boolean read FRangeOverflow;\r\n property rangeUnderflow : Boolean read FRangeUnderflow;\r\n property stepMismatch : Boolean read FStepMismatch;\r\n property tooLong : Boolean read FTooLong;\r\n property tooShort : Boolean read FTooShort;\r\n property typeMisMatch : Boolean read FTypeMismatch;\r\n property valid : Boolean Read FValid;\r\n property valueMissing : Boolean read FValueMissing;\r\n end;\r\n\r\n { TJSBlob }\r\n\r\n TJSBlob = class external name 'Blob' (TJSEventTarget)\r\n private\r\n FSize: NativeInt; external name 'size';\r\n FType: string; external name 'type';\r\n Public\r\n procedure close;\r\n function slice : TJSBlob; overload;\r\n function slice(aStart : NativeInt) : TJSBlob; overload;\r\n function slice(aStart,aEnd : NativeInt) : TJSBlob; overload;\r\n function slice(aStart,aEnd : NativeInt; AContentType : String) : TJSBlob; overload;\r\n function arrayBuffer : TJSPromise;\r\n property size : NativeInt read FSize;\r\n property _type : string read FType;\r\n end;\r\n\r\n\r\n { TJSHTMLFile }\r\n\r\n TJSHTMLFile = class external name 'File' (TJSBlob)\r\n private\r\n FLastModified: NativeInt; external name 'lastModified';\r\n FLastModifiedDate: TJSDate; external name 'lastModifiedDate';\r\n FName: string; external name 'name';\r\n Public\r\n property name : string read FName;\r\n property lastModified : NativeInt read FLastModified;\r\n property lastModifiedDate : TJSDate read FLastModifiedDate;\r\n end;\r\n\r\n { TJSHTMLFileList }\r\n\r\n TJSHTMLFileList = class external name 'FileList' (TJSEventTarget)\r\n private\r\n FLength: NativeInt; external name 'length';\r\n Public\r\n function item(aIndex : NativeInt) : TJSHTMLFile;\r\n property length : NativeInt read FLength;\r\n property Files[aIndex : NativeInt] : TJSHTMLFile Read item; default;\r\n end;\r\n\r\n { TJSHTMLInputElement }\r\n // https://html.spec.whatwg.org/multipage/forms.html#the-input-element\r\n\r\n TJSHTMLInputElement = class external name 'HTMLInputElement' (TJSHTMLElement)\r\n private\r\n FFiles: TJSHTMLFileList; external name 'files';\r\n FForm: TJSHTMLFormElement; external name 'form';\r\n FLabels: TJSNodeList; external name 'labels';\r\n FList: TJSHTMLElement; external name 'list';\r\n FValidationmMessage: string; external name 'validationMessage';\r\n FValidity: TJSValidityState; external name 'validity';\r\n FWillValidate: boolean; external name 'willValidate';\r\n Public\r\n procedure select;\r\n procedure setCustomValidity(aText : string);\r\n procedure stepUp; overload;\r\n procedure stepUp(n : Integer); overload;\r\n function checkValidity : Boolean;\r\n function reportValidity : Boolean;\r\n procedure setSelectionRange(selectionStart, selectionEnd: NativeInt) ; overload;\r\n procedure setSelectionRange(selectionStart, selectionEnd: NativeInt; Direction : string) ; overload;\r\n procedure setRangeText(aText : string; selectionStart, selectionEnd: NativeInt) ; overload;\r\n procedure setRangeText(aText : string; selectionStart, selectionEnd: NativeInt; Direction : string) ; overload;\r\n Public\r\n accept : string;\r\n allowDirs : boolean;\r\n align : string;\r\n alt : string;\r\n autofocus : boolean;\r\n autocapitalize : string;\r\n autocomplete : string;\r\n defaultValue : string;\r\n defaultChecked : string;\r\n checked : boolean;\r\n dirName : string;\r\n disabled : boolean;\r\n formAction : string;\r\n formEncType : string;\r\n formMethod : string;\r\n formNoValidate : Boolean;\r\n formTarget : string;\r\n height : string;\r\n indeterminate : boolean;\r\n inputMode : string;\r\n max : string;\r\n maxLength : NativeInt;\r\n min : string;\r\n minLength : NativeInt;\r\n multiple : boolean;\r\n pattern : string;\r\n placeholder : string;\r\n readOnly : boolean;\r\n required : boolean;\r\n size : NativeInt;\r\n src : string;\r\n step : string;\r\n _type : string; external name 'type';\r\n selectionStart : NativeInt;\r\n selectionEnd : NativeInt;\r\n selectionDirection : string;\r\n useMap : string;\r\n value : string;\r\n width : string;\r\n property files : TJSHTMLFileList Read FFiles;\r\n property form : TJSHTMLFormElement read FForm;\r\n property labels : TJSNodeList read FLabels;\r\n property list : TJSHTMLElement Read FList;\r\n property validationMessage : string read FValidationmMessage;\r\n property willValidate : boolean read FWillValidate;\r\n property validity : TJSValidityState read FValidity;\r\n end;\r\n\r\n TJSDOMSettableTokenList = class external name 'DOMSettableTokenList' (TJSDOMTokenList)\r\n private\r\n fvalue: TJSDOMString; external name 'value';\r\n public\r\n property value: TJSDOMString read fvalue; // readonly\r\n end;\r\n\r\n TJSHTMLOutputElement = class external name 'HTMLOutputElement' (TJSHTMLElement)\r\n private\r\n flabels: TJSNodeList; external name 'labels';\r\n fform: TJSHTMLFormElement; external name 'form';\r\n ftype: TJSDOMString; external name 'type';\r\n fdefaultValue: TJSDOMString; external name 'defaultValue';\r\n fvalue: TJSDOMString; external name 'value';\r\n fwillValidate: Boolean; external name 'willValidate';\r\n fvalidity: TJSValidityState; external name 'validity';\r\n fvalidationMessage: TJSDOMString; external name 'validationMessage';\r\n public\r\n htmlFor: TJSDOMSettableTokenList;\r\n function checkValidity: Boolean;\r\n function reportValidity: Boolean;\r\n procedure setCustomValidity(error: TJSDOMString);\r\n public\r\n property labels: TJSNodeList read flabels;\r\n property form: TJSHTMLFormElement read fform;\r\n property type_: TJSDOMString read ftype;\r\n property defaultValue: TJSDOMString read fdefaultValue;\r\n property value: TJSDOMString read fvalue write fvalue;\r\n property willValidate: Boolean read fwillValidate;\r\n property validity: TJSValidityState read fvalidity;\r\n property validationMessage: TJSDOMString read fvalidationMessage;\r\n end;\r\n\r\n { TJSHTMLImageElement }\r\n\r\n TJSHTMLImageElement = class external name 'Image' (TJSHTMLElement)\r\n Private\r\n FComplete: boolean; external name 'complete';\r\n FCurrentSrc: String; external name 'currentSrc';\r\n FNaturalHeight: NativeUInt; external name 'naturalHeight';\r\n FNaturalWidth: NativeUInt; external name 'naturalWidth';\r\n FX: NativeInt; external name 'x';\r\n FY: NativeInt; external name 'y';\r\n Public\r\n constructor New(x,y : Cardinal); overload;\r\n alt: String;\r\n crossOrigin: String;\r\n decoding: String;\r\n height: NativeUInt;\r\n isMap: boolean;\r\n referrerPolicy: String;\r\n src: String;\r\n sizes: String;\r\n srcset: String;\r\n useMap: String;\r\n width: NativeUInt;\r\n function decode : TJSPromise;\r\n property complete: boolean read FComplete;\r\n property currentSrc: String read FCurrentSrc;\r\n property naturalHeight: NativeUInt read FNaturalHeight;\r\n property naturalWidth: NativeUInt read FNaturalWidth;\r\n property x: NativeInt read FX;\r\n property y: NativeInt read FY;\r\n end;\r\n\r\n TJSHTMLLinkElement = class external name 'HTMLLinkElement'(TJSHTMLElement)\r\n Private\r\n frelList: TJSDOMTokenList; external name 'relList';\r\n fsizes: TJSDOMSettableTokenList {TJSDOMTokenList}; external name 'sizes';\r\n Public\r\n href: string;\r\n crossOrigin: string;\r\n rel: string;\r\n as_: string; external name 'as';\r\n media: string;\r\n integrity: string;\r\n hreflang: string;\r\n type_: string external name 'type';\r\n imageSrcset: string;\r\n imageSizes: string;\r\n referrerPolicy: string;\r\n disabled: string;\r\n charset: string deprecated; // obsolete\r\n rev: string deprecated; // obsolete property\r\n target: string deprecated; // obsolete property\r\n Property relList: TJSDOMTokenList read frelList;\r\n Property sizes: TJSDOMSettableTokenList{TJSDOMTokenList} read fsizes;\r\n end;\r\n\r\n { TJSHTMLAnchorElement }\r\n\r\n TJSHTMLAnchorElement = class external name 'HTMLAnchorElement' (TJSHTMLElement)\r\n Private\r\n FOrigin: string;external name 'origin';\r\n frelList: TJSDOMTokenList; external name 'relList';\r\n Public\r\n href: string;\r\n download: string;\r\n hash: string;\r\n host: string;\r\n hostname: string;\r\n hreflang: string;\r\n media: string ;\r\n password: string;\r\n Protocol: string;\r\n referrerPolicy : string;\r\n rel: string ;\r\n rev: string deprecated; // obsolete property\r\n target: string ;\r\n text : string;\r\n type_ : string external name 'type';\r\n username : string;\r\n Property relList: TJSDOMTokenList read frelList;\r\n Property origin: string Read FOrigin;\r\n end;\r\n\r\n { TJSHTMLMenuElement }\r\n\r\n TJSHTMLMenuElement = class external name 'HTMLMenuElement' (TJSHTMLElement) // uhm... should it be declared? it is experimental at Mozilla docs...\r\n end;\r\n\r\n { TJSHTMLButtonElement }\r\n\r\n TJSHTMLButtonElement = class external name 'HTMLButtonElement' (TJSHTMLElement)\r\n private\r\n FForm: TJSHTMLFormElement; external name 'form';\r\n FLabels: TJSNodeList; external name 'labels';\r\n FValidationmMessage: String; external name 'validationMessage';\r\n FValidity: TJSValidityState; external name 'validity';\r\n FWillValidate: boolean; external name 'willValidate';\r\n Public\r\n autofocus : boolean;\r\n disabled : boolean;\r\n formAction : String;\r\n formEnctype : String;\r\n formMethod : String;\r\n formNoValidate : Boolean;\r\n formTarget : String;\r\n menu: TJSHTMLMenuElement;\r\n _type : String; external name 'type';\r\n value : string;\r\n Public\r\n property form : TJSHTMLFormElement Read FForm;\r\n property labels : TJSNodeList Read FLabels;\r\n property validationMessage : String Read FValidationmMessage;\r\n property validity : TJSValidityState Read FValidity;\r\n property willValidate : boolean read FWillValidate;\r\n end;\r\n\r\n TJSHTMLLabelElement = class external name 'HTMLLabelElement' (TJSHTMLElement)\r\n Public\r\n For_ : String; external name 'for';\r\n form : String;\r\n end;\r\n\r\n { TJSHTMLTextAreaElement }\r\n\r\n TJSHTMLTextAreaElement = class external name 'HTMLTextAreaElement' (TJSHTMLElement)\r\n private\r\n FForm: TJSHTMLFormElement; external name 'form';\r\n FTextLength: NativeInt; external name 'textKength';\r\n FType: String; external name 'type';\r\n FValidationMessage: String; external name 'validationMessage';\r\n FValidity: TJSValidityState; external name 'validity';\r\n FWillValidate: boolean; external name 'willValidate';\r\n Public\r\n defaultValue : string;\r\n value : string;\r\n rows : cardinal;\r\n cols : cardinal;\r\n autofocus : boolean;\r\n disabled : boolean;\r\n maxLength : nativeInt;\r\n readOnly : Boolean;\r\n required : Boolean;\r\n selectionStart : Cardinal;\r\n selectionEnd : Cardinal;\r\n selectionDirection : String;\r\n wrap : string;\r\n Property Form : TJSHTMLFormElement Read FForm;\r\n Property Type_: String Read FType;\r\n Property textLength : NativeInt Read FTextLength;\r\n Property validity : TJSValidityState Read FValidity;\r\n property willValidate : boolean read FWillValidate;\r\n property validationMessage : String Read FValidationMessage;\r\n end;\r\n\r\n { TJSHTMLEmbedElement }\r\n\r\n TJSHTMLEmbedElement = class external name 'HTMLEmbedElement' (TJSHTMLElement)\r\n Public\r\n height: String;\r\n src: String;\r\n _type : String; external name 'type';\r\n width: String;\r\n end;\r\n\r\n { TJSHTMLOptionElement }\r\n\r\n TJSHTMLOptionElement = class external name 'Option' (TJSHTMLElement)\r\n private\r\n FForm: TJSHTMLFormElement; external name 'form';\r\n FIndex: NativeInt; external name 'index';\r\n Public\r\n Constructor New; overload;\r\n Constructor New(aText : String); overload;\r\n Constructor New(aText,aValue : String); overload;\r\n Constructor New(aText,aValue : String; aDefaultSelected : Boolean); overload;\r\n Constructor New(aText,aValue : String; aDefaultSelected,Selected : Boolean); overload;\r\n Public\r\n defaultSelected : boolean;\r\n disabled : boolean;\r\n _label : string ; external name 'label';\r\n selected : boolean;\r\n text : string;\r\n value : string;\r\n property index : NativeInt Read FIndex;\r\n property form : TJSHTMLFormElement Read FForm;\r\n end;\r\n\r\n TJSHTMLOptGroupElement = class external name 'HTMLOptGroupElement' (TJSHTMLElement)\r\n end;\r\n\r\n TJSHTMLOptionsCollection = class external name 'HTMLOptionsCollection' (TJSHTMLCollection)\r\n end;\r\n\r\n { TJSHTMLSelectElement }\r\n\r\n TJSHTMLSelectElement = Class external name 'HTMLSelectElement' (TJSHTMLElement)\r\n private\r\n FForm: TJSHTMLFormElement; external name 'form';\r\n FLabels: TJSNodeList; external name 'labels';\r\n FLength: NativeInt; external name 'length';\r\n FOptions: TJSHTMLOptionsCollection; external name 'options';\r\n FSelectedOptions: TJSHTMLCollection; external name 'selectedOptions';\r\n FType: String; external name 'type';\r\n FValidationMessage: string; external name 'validationMessage';\r\n FValidity: TJSValidityState; external name 'validity';\r\n fwillValidate: Boolean; external name 'willValidate';\r\n Public\r\n Procedure add(anItem : TJSHTMLOptionElement); overload;\r\n Procedure add(anItem, before : TJSHTMLOptionElement); overload;\r\n function item(aIndex : NativeInt): TJSHTMLOptionElement;\r\n function namedItem(aName : String): TJSHTMLOptionElement;\r\n procedure remove(aIndex : NativeInt);\r\n procedure checkValidity;\r\n procedure setCustomValidity(aMessage : String);\r\n Public\r\n autofocus : Boolean;\r\n disabled : Boolean;\r\n multiple : boolean;\r\n required: boolean;\r\n selectedIndex : NativeInt;\r\n size : NativeInt;\r\n value : string;\r\n property length : NativeInt read FLength;\r\n Property options : TJSHTMLOptionsCollection read FOptions;\r\n Property selectedOptions : TJSHTMLCollection read FSelectedOptions;\r\n Property form : TJSHTMLFormElement read FForm;\r\n property labels : TJSNodeList Read FLabels;\r\n property _type : String Read FType;\r\n property validity : TJSValidityState Read FValidity;\r\n property validationMessage : string Read FValidationMessage;\r\n property willValidate : Boolean read fwillValidate;\r\n end;\r\n\r\n { TJSHTMLTableElement }\r\n\r\n TJSHTMLTableSectionElement = class;\r\n TJSHTMLTableRowElement = class;\r\n\r\n TJSHTMLTableElement = Class external name 'HTMLTableElement'(TJSHTMLElement)\r\n private\r\n FAlign: String; external name 'align';\r\n FBGColor: String; external name 'bgColor';\r\n FBorder: String; external name 'border';\r\n FCaption: TJSHTMLElement; external name 'caption';\r\n FCellPadding: String; external name 'cellPadding';\r\n FCellSpacing: String; external name 'cellSpacing';\r\n FFrame: String; external name 'frame';\r\n FRows: TJSHTMLCollection; external name 'rows';\r\n FRules: String; external name 'rules';\r\n FSummary: String; external name 'summary';\r\n FTBodies: TJSHTMLCollection; external name 'tBodies';\r\n FTfoot: TJSHTMLTableSectionElement; external name 'tfoot';\r\n FTHead: TJSHTMLTableSectionElement; external name 'tHead';\r\n FWidth: String; external name 'width';\r\n public\r\n { Methods }\r\n function createCaption: TJSHTMLElement;\r\n function createTFoot: TJSHTMLTableSectionElement;\r\n function createTHead: TJSHTMLTableSectionElement;\r\n procedure deleteCaption;\r\n procedure deleteRow(index: Integer);\r\n procedure deleteTFoot;\r\n procedure deleteTHead;\r\n function insertRow(index: Integer): TJSHTMLTableRowElement;\r\n { Properties }\r\n property align: String read FAlign write FAlign;\r\n property bgColor: String read FBGColor write FBGColor;\r\n property border: String read FBorder write FBorder;\r\n property caption: TJSHTMLElement read FCaption;\r\n property cellPadding: String read FCellPadding write FCellPadding;\r\n property cellSpacing: String read FCellSpacing write FCellSpacing;\r\n property frame: String read FFrame write FFrame;\r\n property rows: TJSHTMLCollection read FRows;\r\n property rules: String read FRules write FRules;\r\n property summary: String read FSummary write FSummary;\r\n property tBodies: TJSHTMLCollection read FTBodies;\r\n property tfoot: TJSHTMLTableSectionElement read FTfoot;\r\n property tHead: TJSHTMLTableSectionElement read FTHead;\r\n property width: String read FWidth write FWidth;\r\n end;\r\n\r\n { TJSHTMLTableSectionElement }\r\n\r\n TJSHTMLTableSectionElement = Class external name 'HTMLTableSectionElement' (TJSHTMLElement)\r\n private\r\n Falign: String; external name 'align';\r\n Frows: TJSHTMLCollection external name 'rows';\r\n Fch: String; external name 'ch';\r\n FchOff: String; external name 'chOff';\r\n FvAlign: String; external name 'vAlign';\r\n public\r\n { Methods }\r\n procedure deleteRow(index: Integer);\r\n function insertRow(index: Integer): TJSHTMLTableRowElement;\r\n { Properties }\r\n property align: String read Falign write Falign;\r\n property rows: TJSHTMLCollection read Frows;\r\n property ch: String read Fch write Fch;\r\n property chOff: String read FchOff write FchOff;\r\n property vAlign: String read FvAlign write FvAlign;\r\n end;\r\n\r\n { TJSHTMLTableCellElement }\r\n\r\n TJSHTMLTableCellElement = Class external name 'HTMLTableCellElement' (TJSHTMLElement)\r\n private\r\n Fabbr: String; external name 'abbr';\r\n Falign: String; external name 'align';\r\n Faxis: String; external name 'axis';\r\n FbgColor: String; external name 'bgColor';\r\n FcellIndex: Integer; external name 'cellIndex';\r\n Fch: String; external name 'ch';\r\n FchOff: String; external name 'chOff';\r\n FcolSpan: Integer; external name 'colSpan';\r\n Fheaders: String; external name 'headers';\r\n Fheight: String; external name 'height';\r\n FnoWrap: Boolean; external name 'noWrap';\r\n FrowSpan: Integer; external name 'rowSpan';\r\n Fscope: String; external name 'scope';\r\n FvAlign: String; external name 'vAlign';\r\n Fwidth: String; external name 'width';\r\n public\r\n { Properties }\r\n property abbr: String read Fabbr write Fabbr;\r\n property align: String read Falign write Falign;\r\n property axis: String read Faxis write Faxis;\r\n property bgColor: String read FbgColor write FbgColor;\r\n property cellIndex: Integer read FcellIndex;\r\n property ch: String read Fch write Fch;\r\n property chOff: String read FchOff write FchOff;\r\n property colSpan: Integer read FcolSpan write FcolSpan;\r\n property headers: String read Fheaders;\r\n property height: String read Fheight write Fheight;\r\n property noWrap: Boolean read FnoWrap write FnoWrap;\r\n property rowSpan: Integer read FrowSpan write FrowSpan;\r\n property scope: String read Fscope write Fscope;\r\n property vAlign: String read FvAlign write FvAlign;\r\n property width: String read Fwidth write Fwidth;\r\n end;\r\n\r\n { TJSHTMLTableRowElement }\r\n\r\n TJSHTMLTableRowElement = Class external name 'HTMLTableRowElement' (TJSHTMLElement)\r\n private\r\n Falign: String; external name 'align';\r\n FbgColor: String; external name 'bgColor';\r\n Fcells: TJSHTMLCollection; external name 'cells';\r\n Fch: String; external name 'ch';\r\n FchOff: String; external name 'chOff';\r\n FrowIndex: Integer; external name 'rowIndex';\r\n FsectionRowIndex: Integer; external name 'sectionRowIndex';\r\n FvAlign: String; external name 'vAlign';\r\n public\r\n { Methods }\r\n procedure deleteCell(index: Integer);\r\n function insertCell(index: Integer): TJSHTMLTableCellElement;\r\n { Properties }\r\n property align: String read Falign write Falign;\r\n property bgColor: String read FbgColor write FbgColor;\r\n property cells: TJSHTMLCollection read Fcells;\r\n property ch: String read Fch write Fch;\r\n property chOff: String read FchOff write FchOff;\r\n property rowIndex: Integer read FrowIndex;\r\n property sectionRowIndex: Integer read FsectionRowIndex;\r\n property vAlign: String read FvAlign write FvAlign;\r\n end;\r\n\r\n { TJSHTMLTableDataCellElement }\r\n\r\n TJSHTMLTableDataCellElement = Class external name 'HTMLTableDataCellElement' (TJSHTMLElement)\r\n private\r\n Fabbr: String; external name 'abbr';\r\n public\r\n { Properties }\r\n property abbr: String read Fabbr write Fabbr;\r\n end;\r\n\r\n\r\n TJSCanvasRenderingContext2D = Class;\r\n\r\n THTMLCanvasToBlobCallback = Reference to function (aBlob : TJSBlob) : boolean; safecall;\r\n\r\n TJSHTMLCanvasElement = Class external name 'HTMLCanvasElement' (TJSHTMLElement)\r\n Public\r\n height : integer;\r\n width : integer;\r\n Function getContext(contextType : string) : TJSObject;\r\n Function getContext(contextType : string; contextAttributes : TJSObject) : TJSObject;\r\n Function getContextAs2DContext(contextType : string; contextAttributes : TJSObject) : TJSCanvasRenderingContext2D; external name 'getContext';\r\n Function getContextAs2DContext(contextType : string) : TJSCanvasRenderingContext2D; external name 'getContext';\r\n Procedure toBlob (aCallBack : THTMLCanvasToBlobCallback; aMimeType : String); overload;\r\n Procedure toBlob (aCallBack : THTMLCanvasToBlobCallback; aMimeType : String; aQuality : Double); overload;\r\n Function toDataURL : String; overload;\r\n Function toDataURL(aMimeType : String) : String; overload;\r\n Function toDataURL(aMimeType : String; aQuality : Double) : String; overload;\r\n end;\r\n\r\n TJSHTMLProgressElement = class external name 'HTMLProgressElement' (TJSHTMLElement)\r\n private\r\n Fposition: Double; external name 'position';\r\n Flabels: TJSNodeList; external name 'labels';\r\n public\r\n max: Double;\r\n value: Double;\r\n property position: Double read Fposition;\r\n property labels: TJSNodeList read Flabels;\r\n end;\r\n Type\r\n\r\n { TJSDOMException }\r\n\r\n TJSDOMException = class external name 'DOMException' (TJSObject)\r\n private\r\n FCode: Integer; external name 'code';\r\n FMessage: String; external name 'message';\r\n FName: string; external name 'name';\r\n Public\r\n Property code : Integer Read FCode;\r\n Property Message : String Read FMessage;\r\n Property name : string Read FName;\r\n end;\r\n\r\n { TJSFileReader }\r\n\r\n TJSFileReader = class external name 'FileReader' (TJSEventTarget)\r\n private\r\n FError: TJSDOMException; external name 'error';\r\n fReadyState: Integer; external name 'readyState';\r\n FResult: JSValue; external name 'result';\r\n Public\r\n Const EMPTY : Integer;\r\n Const LOADING : Integer;\r\n Const DONE : Integer;\r\n Public\r\n onabort : TJSEventHandler;\r\n onerror : TJSEventHandler;\r\n onload : TJSEventHandler;\r\n onloadstart : TJSEventHandler;\r\n onloadend : TJSEventHandler;\r\n onprogress : TJSEventHandler;\r\n Public\r\n constructor new;\r\n Procedure abort;\r\n procedure readAsArrayBuffer(Blob: TJSBlob);\r\n procedure readAsBinaryString(Blob: TJSBlob);\r\n procedure readAsDataURL(Blob: TJSBlob);\r\n procedure readAsText(Blob: TJSBlob; encoding : string);\r\n procedure readAsText(Blob: TJSBlob);\r\n property Error : TJSDOMException read FError;\r\n Property readyState : Integer Read fReadyState;\r\n property Result : JSValue Read FResult;\r\n end;\r\n\r\n TCanvasCoordType = double; // Is in fact a number.\r\n\r\n // Opaque objects\r\n TJSCanvasGradient = class external name 'CanvasGradient' (TJSObject)\r\n end;\r\n\r\n TJSCanvasPattern = class external name 'CanvasPattern' (TJSObject)\r\n end;\r\n\r\n TJSPath2D = class external name 'Path2D' (TJSObject)\r\n Public\r\n constructor new; overload;\r\n constructor new(aPath : TJSPath2D); overload;\r\n constructor new(SVGPath : String); overload;\r\n Procedure addPath(aPath : TJSPath2D);\r\n procedure arc(x,y, radius,startAngle,endAngle : TCanvasCoordType); overload;\r\n procedure arc(x,y, radius,startAngle,endAngle : TCanvasCoordType; antiClockWise : boolean); overload;\r\n procedure arcTo(x1,y1,x2,y2,radius : TCanvasCoordType); overload;\r\n procedure bezierCurveTo(cp1x,cp1y,cp2x,cp2y,x,y : TCanvasCoordType); overload;\r\n Procedure closePath;\r\n procedure ellipse(x, y, radiusX, radiusY : TCanvasCoordType; rotation, startAngle, endAngle : Double); overload;\r\n procedure ellipse(x, y, radiusX, radiusY : TCanvasCoordType; rotation, startAngle, endAngle : Double; anticlockwise : Boolean); overload;\r\n Procedure lineTo(X,Y : TCanvasCoordType);\r\n Procedure moveTo(X,Y : TCanvasCoordType);\r\n procedure quadraticCurveTo(cpx,cpy,x,y : TCanvasCoordType);\r\n procedure rect(x,y,awidth,aheight: TCanvasCoordType); overload;\r\n end;\r\n\r\n { TJSImageData }\r\n\r\n TJSImageData = class external name 'ImageData' (TJSObject)\r\n private\r\n FData: TJSUint8ClampedArray; external name 'data';\r\n FHeight: Integer; external name 'height';\r\n FWidth: Integer; external name 'width';\r\n Public\r\n constructor new(awidth,aheight : integer); overload;\r\n constructor new(anArray :TJSUint8ClampedArray; awidth,aheight : integer); overload;\r\n property data : TJSUint8ClampedArray read FData;\r\n property height : Integer Read FHeight;\r\n property width : Integer Read FWidth;\r\n end;\r\n\r\n\r\n TJSTextMetrics = class external name 'TextMetrics' (TJSObject)\r\n width : TCanvasCoordType;\r\n actualBoundingBoxLeft : TCanvasCoordType;\r\n actualBoundingBoxRight : TCanvasCoordType;\r\n fontBoundingBoxAscent : TCanvasCoordType;\r\n fontBoundingBoxDescent : TCanvasCoordType;\r\n actualBoundingBoxAscent : TCanvasCoordType;\r\n actualBoundingBoxDescent : TCanvasCoordType;\r\n emHeightAscent : TCanvasCoordType;\r\n emHeightDescent : TCanvasCoordType;\r\n hangingBaseline : TCanvasCoordType;\r\n alphabeticBaseline : TCanvasCoordType;\r\n ideographicBaseline : TCanvasCoordType;\r\n end;\r\n\r\n { TJSCanvasRenderingContext2D }\r\n TJSCanvasRenderingContext2D = class external name 'CanvasRenderingContext2D' (TJSObject)\r\n private\r\n FCanvas: TJSHTMLCanvasElement; external name 'canvas';\r\n FfillStyleColor: String; external name 'fillStyle';\r\n FfillStyleGradient: TJSCanvasGradient; external name 'fillStyle';\r\n FfillStylePattern: TJSCanvasPattern; external name 'fillStyle';\r\n FstrokeStyleColor: String; external name 'strokeStyle';\r\n FstrokeStyleGradient: TJSCanvasGradient; external name 'strokeStyle';\r\n FstrokeStylePattern: TJSCanvasPattern; external name 'strokeStyle';\r\n Public\r\n fillStyle : JSValue;\r\n font : string;\r\n globalAlpha : double;\r\n globalCompositeOperation : String;\r\n lineCap : string;\r\n lineDashOffset : Double;\r\n lineJoin : String;\r\n lineWidth : Double;\r\n miterLimit : Double;\r\n shadowBlur : Double;\r\n shadowColor : String;\r\n shadowOffsetX : Double;\r\n shadowOffsetY : Double;\r\n strokeStyle : JSValue;\r\n textAlign : String;\r\n textBaseline : String;\r\n procedure arc(x,y, radius,startAngle,endAngle : TCanvasCoordType); overload;\r\n procedure arc(x,y, radius,startAngle,endAngle : TCanvasCoordType; antiClockWise : boolean); overload;\r\n procedure arcTo(x1,y1,x2,y2,radius : TCanvasCoordType); overload;\r\n procedure beginPath;\r\n procedure bezierCurveTo(cp1x,cp1y,cp2x,cp2y,x,y : TCanvasCoordType); overload;\r\n procedure clearRect(x,y,width,height : TCanvasCoordType);\r\n procedure clip; overload;\r\n procedure clip(aFillRule : String); overload;\r\n procedure clip(aPath : TJSPath2D); overload;\r\n procedure closePath;\r\n function createImageData(aWidth,aHeight : Integer) : TJSImageData; overload;\r\n function createImageData(aImage : TJSImageData) : TJSImageData; overload;\r\n function createLinearGradient(x0,y0,x1,y1 : TCanvasCoordType) : TJSCanvasGradient;\r\n function createPattern(aImage : TJSObject; repetition : string) : TJSCanvasPattern;\r\n function createRadialGradient(x0,y0,r0,x1,y1,r1 : TCanvasCoordType) : TJSCanvasGradient;\r\n procedure drawFocusIfNeeded(aElement : TJSElement); overload;\r\n procedure drawFocusIfNeeded(aPath : TJSPath2D; aElement : TJSElement); overload;\r\n procedure drawImage(image : TJSObject; dx,dy : TCanvasCoordType); overload;\r\n procedure drawImage(image : TJSObject; dx,dy,dwidth,dheight : TCanvasCoordType); overload;\r\n procedure drawImage(image : TJSObject; sx,sy,sWidth,sHeight,dx,dy,dwidth,dheight : TCanvasCoordType); overload;\r\n procedure ellipse(x, y, radiusX, radiusY : TCanvasCoordType; rotation, startAngle, endAngle : Double); overload;\r\n procedure ellipse(x, y, radiusX, radiusY : TCanvasCoordType; rotation, startAngle, endAngle : Double; anticlockwise : Boolean); overload;\r\n procedure fill; overload;\r\n procedure fill(aRule : String); overload;\r\n procedure fill(aPath : TJSPath2D); overload;\r\n procedure fill(aPath : TJSPath2D;aRule : String); overload;\r\n procedure fillRect(x,y,awidth,aheight: TCanvasCoordType); overload;\r\n procedure fillText(aText : string; x,y : TCanvasCoordType); overload;\r\n procedure fillText(aText : string; x,y, aMaxWidth : TCanvasCoordType); overload;\r\n function getImageData(x,y,awidth,aheight: TCanvasCoordType) : TJSImageData; overload;\r\n function getLineDash : TJSArray;\r\n function isPointInPath(x,y : TCanvasCoordType) : Boolean; overload;\r\n function isPointInPath(x,y : TCanvasCoordType; aFillRule : String) : Boolean; overload;\r\n function isPointInPath(aPath : TJSPath2D; x,y : TCanvasCoordType) : Boolean; overload;\r\n function isPointInPath(aPath : TJSPath2D; x,y : TCanvasCoordType; aFillRule : String) : Boolean; overload;\r\n function isPointInStroke(x,y : TCanvasCoordType) : Boolean; overload;\r\n function isPointInStroke(aPath : TJSPath2D; x,y : TCanvasCoordType) : Boolean; overload;\r\n procedure lineTo(x,y : TCanvasCoordType);\r\n function measureText(S : String) : TJSTextMetrics;\r\n procedure moveTo(x,y : TCanvasCoordType);\r\n procedure putImageData(aData : TJSImageData; x,y: TCanvasCoordType) ; overload;\r\n procedure putImageData(aData : TJSImageData; x,y,dityX,dirtyY,dirtyWidth,dirtyHeight: TCanvasCoordType) ; overload;\r\n procedure quadraticCurveTo(cpx,cpy,x,y : TCanvasCoordType);\r\n procedure rect(x,y,awidth,aheight: TCanvasCoordType); overload;\r\n procedure restore;\r\n procedure rotate(anAngle : double);\r\n procedure save;\r\n procedure scale(x,y : double);\r\n procedure setLineDash(segments : TJSArray); overload;\r\n procedure setLineDash(segments : array of integer); overload;\r\n procedure setTransform(a,b,c,d,e,f : double);\r\n procedure stroke; overload;\r\n procedure stroke(aPath : TJSPath2D); overload;\r\n procedure strokeRect(x,y,awidth,aheight: TCanvasCoordType);\r\n procedure strokeText(aText : string; x,y : TCanvasCoordType); overload;\r\n procedure strokeText(aText : string; x,y, aMaxWidth : TCanvasCoordType); overload;\r\n procedure transform(a,b,c,d,e,f : double);\r\n procedure translate(x,y : TCanvasCoordType);\r\n\r\n property canvas : TJSHTMLCanvasElement Read FCanvas;\r\n property fillStyleAsColor : String Read FfillStyleColor Write FfillStyleColor;\r\n property fillStyleAsGradient : TJSCanvasGradient Read FfillStyleGradient Write FfillStyleGradient;\r\n property fillStyleAsPattern : TJSCanvasPattern Read FfillStylePattern Write FfillStylePattern;\r\n property strokeStyleAsColor : String Read FstrokeStyleColor Write FstrokeStyleColor;\r\n property strokeStyleAsGradient : TJSCanvasGradient Read FstrokeStyleGradient Write FstrokeStyleGradient;\r\n property strokeStyleAsPattern : TJSCanvasPattern Read FstrokeStylePattern Write FstrokeStylePattern;\r\n end;\r\n\r\n { TJSHTMLIFrameElement }\r\n\r\n TJSHTMLIFrameElement = Class external name 'HTMLIFrameElement' (TJSHTMLElement)\r\n private\r\n FAllowPaymentRequest: Boolean; external name 'allowPaymentRequest';\r\n FContentDocument: TJSDocument; external name 'contentDocument';\r\n FContentWindow: TJSWindow; external name 'contentWindow';\r\n FSandbox: string; external name 'sandbox';\r\n Public\r\n height : string;\r\n src : string;\r\n srcdoc : string;\r\n width : string;\r\n Property allowPaymentRequest : Boolean Read FAllowPaymentRequest;\r\n property contentWindow : TJSWindow Read FContentWindow;\r\n property contentDocument : TJSDocument Read FContentDocument;\r\n property sandbox : string read FSandbox;\r\n end;\r\n\r\n TJSHTMLScriptElement = Class external name 'HTMLScriptElement' (TJSHTMLElement)\r\n Public\r\n type_ : String external name 'type';\r\n src : String;\r\n charset : string;\r\n integrity : string;\r\n async : boolean;\r\n defer : boolean;\r\n text : string;\r\n crossOrigin : string;\r\n referrerPolicy : string;\r\n noModule : boolean;\r\n end;\r\n\r\n\r\n\r\n\r\n TJSXMLHttpRequestEventTarget = class external name 'XMLHttpRequestEventTarget' (TJSEventTarget)\r\n end;\r\n\r\n TJSXMLHttpRequestUpload = class external name 'XMLHttpRequestUpload' (TJSXMLHttpRequestEventTarget)\r\n end;\r\n\r\n { TJSXMLHttpRequest }\r\n TJSOnReadyStateChangeHandler = reference to procedure; safecall;\r\n\r\n TJSXMLHttpRequest = class external name 'XMLHttpRequest' (TJSXMLHttpRequestEventTarget)\r\n private\r\n FReadyState: NativeInt; external name 'readyState';\r\n FResponse: JSValue; external name 'response';\r\n FResponseText: string; external name 'responseText';\r\n FResponseType: string; external name 'responseType';\r\n FresponseURL: string; external name 'responseURL';\r\n FresponseXML: TJSDocument; external name 'responseXML';\r\n FUpload: TJSXMLHttpRequestUpload; external name 'upload';\r\n FStatus : integer; external name 'status';\r\n FStatusText : string; external name 'statusText';\r\n public\r\n const\r\n UNSENT = 0;\r\n OPENED = 1;\r\n HEADERS_RECEIVED = 2;\r\n LOADING = 3;\r\n DONE = 4;\r\n public\r\n timeout : LongWord;\r\n withCredentials : Boolean;\r\n onreadystatechange : TJSOnReadyStateChangeHandler;\r\n constructor new;\r\n procedure abort;\r\n function getResponseHeader(aName : string) : String;\r\n function getAllResponseHeaders : String;\r\n procedure open(aMethod,aURL : String); overload;\r\n procedure open(aMethod,aURL : String; Async : Boolean); overload;\r\n procedure open(aMethod,aURL : String; Async : Boolean; AUserame : String); overload;\r\n procedure open(aMethod,aURL : String; Async : Boolean; AUserame,APassword : String); overload;\r\n procedure overrideMimeType(aType : String);\r\n procedure send(aBody : jsValue);overload;\r\n procedure send;overload;\r\n procedure setRequestHeader(aName, AValue : string);\r\n\r\n property readyState : NativeInt read FReadyState;\r\n property ResponseHeaders[aName : string] : string Read getResponseHeader;\r\n property responseXML : TJSDocument read FresponseXML;\r\n property responseURL : string read FresponseURL;\r\n property responseType : string read FResponseType Write FResponseType;\r\n property response : JSValue Read FResponse;\r\n property responseText : string read FResponseText;\r\n property Status : integer read FStatus;\r\n property StatusText : string read FStatusText;\r\n property upload : TJSXMLHttpRequestUpload read FUpload;\r\n\r\n end;\r\n\r\n { TJSUIEvent }\r\n\r\n TJSUIEvent = class external name 'UIEvent' (TJSEvent)\r\n private\r\n FDetail: NativeInt; external name 'detail';\r\n FView: TJSWindow; external name 'view';\r\n Public\r\n property detail : NativeInt read FDetail;\r\n property view : TJSWindow read FView;\r\n end;\r\n\r\n { TJSMouseEvent }\r\n\r\n TJSMouseEvent = class external name 'MouseEvent' (TJSUIevent)\r\n private\r\n FAltKey: Boolean; external name 'altKey';\r\n FBUtton: NativeInt; external name 'button';\r\n FBUttons: NativeInt; external name 'buttons';\r\n FClientX: Double; external name 'clientX';\r\n FClientY: Double; external name 'clientY';\r\n FCtrlKey: Boolean; external name 'ctrlKey';\r\n FMetaKey: Boolean; external name 'metaKey';\r\n FmovementX: Double; external name 'movementX';\r\n FmovementY: Double; external name 'movementY';\r\n FoffsetX: Double; external name 'offsetX';\r\n FoffsetY: Double; external name 'offsetY';\r\n FRegion: String; external name 'region';\r\n FRelatedTarget: TJSEventTarget; external name 'relatedTarget';\r\n FscreenX: Double; external name 'screenX';\r\n FscreenY: Double; external name 'screenY';\r\n FShiftKey: Boolean; external name 'shiftKey';\r\n Public\r\n function getModifierState(keyArg: String): boolean;\r\n Property altKey : Boolean read FAltKey;\r\n Property button: NativeInt read FBUtton;\r\n Property buttons: NativeInt read FBUttons;\r\n property clientX : Double read FClientX;\r\n property clientY : Double read FClientY;\r\n property ctrlKey : Boolean read FCtrlKey;\r\n property metaKey : Boolean read FMetaKey;\r\n property movementX : Double read FmovementX;\r\n property movementY : Double read FmovementY;\r\n property offsetX : Double read FoffsetX;\r\n property offsetY : Double read FoffsetY;\r\n{$IFDEF FIREFOX}\r\n property pageX : Double read FpageX;\r\n property pageY : Double read FpageY;\r\n{$ENDIF}\r\n property region : String read FRegion;\r\n property relatedTarget : TJSEventTarget read FRelatedTarget;\r\n property screenX : Double read FscreenX;\r\n property screenY : Double read FscreenY;\r\n property shiftKey : Boolean read FShiftKey;\r\n property x : Double read FClientX;\r\n property y : Double read FClientY;\r\n end;\r\n\r\n { TJSWheelEvent }\r\n TJSWheelEventInit = record\r\n deltaX : Double;\r\n deltaY : Double;\r\n deltaZ : Double;\r\n deltaMode : NativeInt;\r\n end;\r\n\r\n TJSWheelEvent = class external name 'WheelEvent' (TJSMouseEvent)\r\n private\r\n FDeltaMode: NativeInt; external name 'deltaMode';\r\n FDeltaX: Double; external name 'deltaX';\r\n FDeltaY: Double; external name 'deltaY';\r\n FDeltaZ: Double; external name 'deltaZ';\r\n Public\r\n constructor new(atype : String); overload;\r\n constructor new(atype : String; aInit : TJSWheelEventInit); overload;\r\n Property deltaX : Double Read FDeltaX;\r\n Property deltaY : Double Read FDeltaY;\r\n Property deltaZ : Double Read FDeltaZ;\r\n Property deltaMode : NativeInt Read FDeltaMode;\r\n end;\r\n\r\n TJSPointerEvent = Class external name 'PointerEvent' (TJSMouseEvent);\r\n\r\n TJSTouchEvent = Class external name 'TouchEvent'(TJSUIEvent)\r\n private\r\n FAltKey: Boolean; external name 'altKey';\r\n FChangedTouches: TJSTouchList; external name 'changedTouches';\r\n FCtrlKey: Boolean; external name 'ctrlKey';\r\n FMetaKey: Boolean; external name 'metaKey';\r\n FShiftKey: Boolean; external name 'shiftKey';\r\n FTargetTouches: TJSTouchList; external name 'targetTouches';\r\n FTouches: TJSTouchList; external name 'touches';\r\n Public\r\n Property altKey : Boolean Read FAltKey;\r\n Property ctrlKey : Boolean Read FCtrlKey;\r\n Property metaKey : Boolean Read FMetaKey;\r\n Property shiftKey : Boolean Read FShiftKey;\r\n property changedTouches : TJSTouchList Read FChangedTouches;\r\n property touches : TJSTouchList Read FTouches;\r\n property targetTouches : TJSTouchList Read FTargetTouches;\r\n end;\r\n\r\n\r\n // Namespace for standard key names.\r\n // See list at https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key/Key_Values\r\n TJSKeyNames = Class\r\n Const\r\n Alt = 'Alt';\r\n AltGraph = 'AltGraph';\r\n CapsLock = 'CapsLock';\r\n Control = 'Control';\r\n Fn = 'Fn';\r\n FnLock = 'FnLock';\r\n Hyper = 'Hyper';\r\n Meta = 'Meta';\r\n NumLock = 'NumLock';\r\n ScrollLock = 'ScrollLock';\r\n Shift = 'Shift';\r\n Super = 'Super';\r\n Symbol = 'Symbol';\r\n SymbolLock = 'SymbolLock';\r\n Enter = 'Enter';\r\n Tab = 'Tab';\r\n Space = 'Space';\r\n ArrowDown = 'ArrowDown';\r\n ArrowLeft = 'ArrowLeft';\r\n ArrowRight = 'ArrowRight';\r\n ArrowUp = 'ArrowUp';\r\n _End = 'End';\r\n Home = 'Home';\r\n PageDown = 'PageDown';\r\n PageUp = 'PageUp';\r\n BackSpace = 'Backspace';\r\n Clear = 'Clear';\r\n Copy = 'Copy';\r\n CrSel = 'CrSel';\r\n Cut = 'Cut';\r\n Delete = 'Delete';\r\n EraseEof = 'EraseEof';\r\n ExSel = 'ExSel';\r\n Insert = 'Insert';\r\n Paste = 'Paste';\r\n Redo = 'Redo';\r\n Undo = 'Undo';\r\n Accept = 'Accept';\r\n Again = 'Again';\r\n Attn = 'Attn';\r\n Cancel = 'Cancel';\r\n ContextMenu = 'Contextmenu';\r\n Escape = 'Escape';\r\n Execute = 'Execute';\r\n Find = 'Find';\r\n Finish = 'Finish';\r\n Help = 'Help';\r\n Pause = 'Pause';\r\n Play = 'Play';\r\n Props = 'Props';\r\n Select = 'Select';\r\n ZoomIn = 'ZoomIn';\r\n ZoomOut = 'ZoomOut';\r\n BrightnessDown = 'BrightnessDown';\r\n BrightnessUp = 'BrightnessUp';\r\n Eject = 'Eject';\r\n LogOff = 'LogOff';\r\n Power = 'Power';\r\n PowerOff = 'PowerOff';\r\n PrintScreen = 'PrintScreen';\r\n Hibernate = 'Hibernate';\r\n Standby = 'Standby';\r\n WakeUp = 'WakeUp';\r\n AllCandidates = 'AllCandidates';\r\n Alphanumeric = 'Alphanumeric';\r\n CodeInput = 'CodeInput';\r\n Compose = 'Compose';\r\n Convert = 'Convert';\r\n Dead = 'Dead';\r\n FinalMode = 'FinalMode';\r\n GroupFirst = 'GroupFirst';\r\n GroupLast = 'GroupLast';\r\n GroupNext = 'GroupNext';\r\n GroupPrevious = 'GroupPrevious';\r\n ModelChange = 'ModelChange';\r\n NextCandidate = 'NextCandidate';\r\n NonConvert = 'NonConvert';\r\n PreviousCandidate = 'PreviousCandidate';\r\n Process = 'Process';\r\n SingleCandidate = 'SingleCandidate';\r\n HangulMode = 'HangulMode';\r\n HanjaMode = 'HanjaMode';\r\n JunjaMode = 'JunjaMode';\r\n Eisu = 'Eisu';\r\n Hankaku = 'Hankaku';\r\n Hiranga = 'Hiranga';\r\n HirangaKatakana = 'HirangaKatakana';\r\n KanaMode = 'KanaMode';\r\n Katakana = 'Katakana';\r\n Romaji = 'Romaji';\r\n Zenkaku = 'Zenkaku';\r\n ZenkakuHanaku = 'ZenkakuHanaku';\r\n F1 = 'F1';\r\n F2 = 'F2';\r\n F3 = 'F3';\r\n F4 = 'F4';\r\n F5 = 'F5';\r\n F6 = 'F6';\r\n F7 = 'F7';\r\n F8 = 'F8';\r\n F9 = 'F9';\r\n F10 = 'F10';\r\n F11 = 'F11';\r\n F12 = 'F12';\r\n F13 = 'F13';\r\n F14 = 'F14';\r\n F15 = 'F15';\r\n F16 = 'F16';\r\n F17 = 'F17';\r\n F18 = 'F18';\r\n F19 = 'F19';\r\n F20 = 'F20';\r\n Soft1 = 'Soft1';\r\n Soft2 = 'Soft2';\r\n Soft3 = 'Soft3';\r\n Soft4 = 'Soft4';\r\n Decimal = 'Decimal';\r\n Key11 = 'Key11';\r\n Key12 = 'Key12';\r\n Multiply = 'Multiply';\r\n Add = 'Add';\r\n NumClear = 'Clear';\r\n Divide = 'Divide';\r\n Subtract = 'Subtract';\r\n Separator = 'Separator';\r\n AppSwitch = 'AppSwitch';\r\n Call = 'Call';\r\n Camera = 'Camera';\r\n CameraFocus = 'CameraFocus';\r\n EndCall = 'EndCall';\r\n GoBack = 'GoBack';\r\n GoHome = 'GoHome';\r\n HeadsetHook = 'HeadsetHook';\r\n LastNumberRedial = 'LastNumberRedial';\r\n Notification = 'Notification';\r\n MannerMode = 'MannerMode';\r\n VoiceDial = 'VoiceDial';\r\n // TODO : Multimedia keys\r\n // TODO : Audio control keys\r\n // TODO : TV control keys\r\n // TODO : Media controller keys\r\n // TODO : Speech recognition keys\r\n // TODO : Document keys\r\n // TODO : Application selector keys\r\n // TODO : Browser Control keys\r\n end;\r\n\r\n\r\n { TJSKeyboardEvent }\r\n\r\n TJSKeyboardEvent = class external name 'KeyboardEvent' (TJSUIEvent)\r\n private\r\n FAltKey: Boolean; external name 'altKey';\r\n FCode: string; external name 'code';\r\n FCtrlKey: Boolean; external name 'ctrlKey';\r\n FIsComposing: Boolean; external name 'isComposing';\r\n FKey: String; external name 'key';\r\n FLocale: string; external name 'locale';\r\n FLocation: NativeInt; external name 'location';\r\n FMetaKey: Boolean; external name 'metaKey';\r\n FRepeat: Boolean; external name 'repeat';\r\n FShiftKey: Boolean; external name 'shiftKey';\r\n Public\r\n function getModifierState(aKey : string) : Boolean;\r\n property code : string read FCode;\r\n Property altKey : Boolean read FAltKey;\r\n property ctrlKey : Boolean read FCtrlKey;\r\n property isComposing : Boolean read FIsComposing;\r\n property Key : String read FKey;\r\n property locale : string read FLocale;\r\n property location : NativeInt read FLocation;\r\n property metaKey : Boolean read FMetaKey;\r\n property _repeat : Boolean read FRepeat;\r\n property shiftKey : Boolean read FShiftKey;\r\n end;\r\n\r\n { MutationObserver }\r\n\r\n TJSMutationObserver = Class;\r\n\r\n TJSMutationRecord = record\r\n type_ : string;\r\n target : TJSNode;\r\n addedNodes : TJSNodeList;\r\n removedNodes : TJSNodeList;\r\n previousSibling : TJSNode;\r\n nextSibling : TJSNode;\r\n attributeName : String;\r\n attributeNamespace : String;\r\n oldValue : String;\r\n end;\r\n\r\n TJSMutationRecordArray = array of TJSMutationRecord;\r\n TJSMutationCallback = reference to procedure(mutations: TJSMutationRecordArray; observer: TJSMutationObserver); safecall;\r\n\r\n TJSMutationObserverInit = record\r\n attributes: boolean;\r\n attributeOldValue: boolean;\r\n characterData: boolean;\r\n characterDataOldValue: boolean;\r\n childList: boolean;\r\n subTree: boolean;\r\n attributeFilter: TJSArray;\r\n end;\r\n\r\n TJSMutationObserver = class external name 'MutationObserver' (TJSObject)\r\n public\r\n { constructor }\r\n constructor new(mutationCallback: TJSMutationCallback); overload;\r\n { public methods }\r\n procedure observe(target: TJSNode); overload;\r\n procedure observe(target: TJSNode; options: TJSMutationObserverInit); overload;\r\n procedure observe(target: TJSNode; options: TJSObject); overload;\r\n procedure disconnect;\r\n function takeRecords: TJSMutationRecordArray;\r\n end;\r\n\r\n { --------------------------------------------------------------------\r\n TJSWebSocket\r\n --------------------------------------------------------------------}\r\n\r\n TJSMessagePortArray = Array of TJSMessagePort;\r\n\r\n { TJSInputEvent }\r\n\r\n TJSInputEvent = class external name 'InputEvent' (TJSUIEvent)\r\n private\r\n FData: TJSDOMString; external name 'data';\r\n FDataTransfer: TJSObject; external name 'dataTransfer';\r\n FInputType: TJSDOMString; external name 'inputType';\r\n FIsComposing: Boolean; external name 'isComposing';\r\n public\r\n property data: TJSDOMString read FData;\r\n property dataTransfer: TJSObject read FDataTransfer;\r\n property inputType: TJSDOMString read FInputType;\r\n property isComposing: Boolean read FIsComposing;\r\n end;\r\n\r\n { TJSMessageEvent }\r\n\r\n TJSMessageEvent = class external name 'MessageEvent' (TEventListenerEvent)\r\n private\r\n FData: JSValue; external name 'data';\r\n FLastEventID: String; external name 'lastEventID';\r\n FOrigin: String; external name 'origin';\r\n FPorts: TJSMessagePortArray; external name 'ports';\r\n Public\r\n Property Data : JSValue Read FData;\r\n Property LastEventID : String Read FLastEventID;\r\n Property Origin : String Read FOrigin;\r\n Property Ports : TJSMessagePortArray Read FPorts;\r\n end;\r\n\r\n TJSWebSocket = class external name 'WebSocket' (TJSEventTarget)\r\n Private\r\n Furl : String; external name 'url';\r\n FreadyState : Cardinal; external name 'readyState';\r\n FbufferedAmount : NativeInt; external name 'bufferedAmount';\r\n Fextensions : String; external name 'extensions';\r\n Fprotocol : String; external name 'protocol';\r\n Public\r\n Const\r\n CONNECTING = 0;\r\n OPEN = 1;\r\n CLOSING = 2;\r\n CLOSED = 3;\r\n Public\r\n onopen : TJSEventHandler;\r\n onerror : TJSEventHandler;\r\n onclose : TJSEventHandler;\r\n onmessage : TJSEventHandler;\r\n binaryType : String;\r\n constructor new(url : String); overload;\r\n constructor new(url : String; protocol: String); overload;\r\n constructor new(url : String; protocols: array of String); overload;\r\n Procedure close; overload;\r\n Procedure close(code : Cardinal); overload;\r\n Procedure close(code : Cardinal; reason : String); overload;\r\n Procedure send(data : String);\r\n Procedure send(data : TJSBlob);\r\n Procedure send(data : TJSArrayBuffer);\r\n Procedure send(data : TJSTypedArray);\r\n Property url : String Read Furl;\r\n Property readyState : Cardinal Read FreadyState;\r\n Property bufferedAmount : NativeInt Read FbufferedAmount;\r\n Property extensions : String Read Fextensions;\r\n Property protocol : String Read Fprotocol;\r\n end;\r\n\r\n TJSHTMLAudioTrack = class external name 'AudioTrack' (TJSObject)\r\n end;\r\n\r\n TJSHTMLAudioTrackList = class external name 'AudioTrackList' (TJSObject)\r\n FLength : Integer; external name 'length';\r\n function getitem(aIndex : nativeInt) : TJSHTMLAudioTrack ; external name '[]';\r\n Public\r\n onaddtrack : TJSEventHandler;\r\n onchange : TJSEventHandler;\r\n onremovetrack : TJSEventHandler;\r\n Property Length : Integer Read FLength;\r\n Property tracks [aIndex : NativeInt] : TJSHTMLAudioTrack read Getitem;\r\n end;\r\n\r\n TJSHTMLVideoTrack = class external name 'VideoTrack' (TJSObject)\r\n end;\r\n\r\n TJSHTMLVideoTrackList = class external name 'VideoTrackList' (TJSObject)\r\n FLength : Integer; external name 'length';\r\n function getitem(aIndex : nativeInt) : TJSHTMLVideoTrack ; external name '[]';\r\n Public\r\n onaddtrack : TJSEventHandler;\r\n onchange : TJSEventHandler;\r\n onremovetrack : TJSEventHandler;\r\n Property Length : Integer Read FLength;\r\n Property tracks [aIndex : NativeInt] : TJSHTMLVideoTrack read Getitem;\r\n end;\r\n\r\n TJSHTMLTextTrack = class external name 'TextTrack' (TJSObject)\r\n end;\r\n\r\n TJSHTMLTextTrackList = class external name 'TextTrackList' (TJSObject)\r\n FLength : Integer; external name 'length';\r\n function getitem(aIndex : nativeInt) : TJSHTMLTextTrack ; external name '[]';\r\n Public\r\n onaddtrack : TJSEventHandler;\r\n onchange : TJSEventHandler;\r\n onremovetrack : TJSEventHandler;\r\n Property Length : Integer Read FLength;\r\n Property tracks [aIndex : NativeInt] : TJSHTMLTextTrack read Getitem;\r\n end;\r\n\r\n\r\n { TJSHTMLMediaElement }\r\n TJSMEdiaError = class external name 'MediaError' (TJSObject)\r\n code : NativeInt;\r\n message : string;\r\n end;\r\n\r\n TJSHTMLMediaStream = class external name 'MediaStream' (TJSObject);\r\n\r\n TJSHTMLMediaController = class external name 'MediaController' (TJSObject);\r\n\r\n TJSHTMLMediaElement = Class external name 'HTMLMediaElement' (TJSHTMLElement)\r\n private\r\n FAudioTracks: TJSHTMLAudioTrackList; external name 'audioTracks';\r\n FVideoTracks: TJSHTMLVideoTrackList; external name 'videoTracks';\r\n FTextTracks: TJSHTMLTextTrackList; external name 'textTracks';\r\n FControlsList: TJSDOMTokenList; external name 'controlslist';\r\n FCurrentSrc: String; external name 'currentSrc';\r\n FDuration: Double; external name 'duration';\r\n FEnded: Boolean;external name 'ended';\r\n FError: TJSMEdiaError; external name 'error';\r\n FNetworkState: NativeInt; external name 'networkState';\r\n FPaused: boolean; external name 'paused';\r\n FReadyState: NativeInt; external name 'readyState';\r\n FSeeking: boolean; external name 'seeking';\r\n FSinkID: string; external name 'sinkId';\r\n Public\r\n autoplay : Boolean;\r\n buffered : Boolean;\r\n controls : Boolean;\r\n controller : TJSHTMLMediaController;\r\n crossOrigin : String;\r\n currentTime : Double;\r\n defaultMuted : boolean;\r\n defaultPlaybackRate : Double;\r\n disableRemotePlayback : Boolean;\r\n loop : boolean;\r\n mediaGroup : string;\r\n muted : boolean;\r\n preload : string;\r\n preservesPitch : boolean;\r\n src : string;\r\n srcObject : TJSHTMLMediaStream;\r\n volume : double;\r\n onencrypted : TJSEventHandler;\r\n onwaitingforkey : TJSEventHandler;\r\n function canPlayType(aType : String) : String;\r\n Function captureStream : TJSHTMLMediaStream;\r\n Procedure play;\r\n Procedure load;\r\n Procedure pause;\r\n\r\n Property AudioTracks : TJSHTMLAudioTrackList Read FAudioTracks;\r\n Property Controlslist : TJSDOMTokenList Read FControlsList;\r\n Property CurrentSrc : String Read FCurrentSrc;\r\n Property Duration : Double read FDuration;\r\n Property Ended : Boolean read FEnded;\r\n Property Error : TJSMEdiaError read FError;\r\n property networkState : NativeInt read FNetworkState;\r\n property paused : boolean read FPaused;\r\n property readyState : NativeInt read FReadyState;\r\n property seeking : boolean read FSeeking;\r\n property sinkID : string read FSinkID;\r\n Property TextTracks : TJSHTMLTextTrackList Read FTextTracks;\r\n Property VideoTracks : TJSHTMLVideoTrackList Read FVideoTracks;\r\n end;\r\n\r\n TJSHTMLAudioElement = Class external name 'HTMLAudioElement' (TJSHTMLMediaElement)\r\n\r\n end;\r\n TJSHTMLVideoElement = Class external name 'HTMLVideoElement' (TJSHTMLMediaElement)\r\n end;\r\n\r\n TJSFormDataEntryValue = String;\r\n TJSFormDataEntryValueArray = Array of TJSFormDataEntryValue;\r\n\r\n TJSFormData = Class external name 'FormData' (TJSObject)\r\n constructor new;\r\n constructor new(aForm : TJSHTMLElement);\r\n Procedure append(const aName,aValue : String);\r\n Procedure append(const aName : String; aBlob : TJSBlob);\r\n Procedure delete(const aName : String);\r\n Function entries : TJSFormDataEntryValueArray;\r\n Function get(const aName : String): TJSFormDataEntryValue;\r\n function has(const aName : String): Boolean;\r\n Function keys : TStringDynArray; reintroduce;\r\n Procedure set_(const aName,aValue : String); external name 'set';\r\n Procedure set_(const aName : String; aBlob : TJSBlob); external name 'set';\r\n Function getAll(const aName : String) : TJSFormDataEntryValueArray;\r\n Function values : TJSValueDynArray; reintroduce;\r\n Property Entry[const aIndex : String] : TJSFormDataEntryValue read Get;\r\n end;\r\n\r\n TJSHTMLTemplateElement = class external name 'HTMLTemplateElement' (TJSHTMLElement)\r\n content : TJSHTMLElement;\r\n end;\r\n\r\n\r\nvar\r\n document : TJSDocument; external name 'document';\r\n window : TJSWindow; external name 'window';\r\n console : TJSConsole; external name 'window.console';\r\n\r\nimplementation\r\n \r\nend.\r\n","{\r\n This file is part of the Pas2JS run time library.\r\n Copyright (c) 2017 by Mattias Gaertner\r\n\r\n See the file COPYING.FPC, included in this distribution,\r\n for details about the copyright.\r\n\r\n This program is distributed in the hope that it will be useful,\r\n but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r\n\r\n **********************************************************************}\r\nunit Classes;\r\n\r\n{$mode objfpc}\r\n\r\ninterface\r\n\r\nuses\r\n RTLConsts, Types, SysUtils, JS, TypInfo;\r\n\r\ntype\r\n TNotifyEvent = procedure(Sender: TObject) of object;\r\n TNotifyEventRef = reference to procedure(Sender: TObject);\r\n TStringNotifyEventRef = reference to Procedure(Sender: TObject; Const aString : String);\r\n\r\n // Notification operations :\r\n // Observer has changed, is freed, item added to/deleted from list, custom event.\r\n TFPObservedOperation = (ooChange,ooFree,ooAddItem,ooDeleteItem,ooCustom);\r\n\r\n EStreamError = class(Exception);\r\n EFCreateError = class(EStreamError);\r\n EFOpenError = class(EStreamError);\r\n EFilerError = class(EStreamError);\r\n EReadError = class(EFilerError);\r\n EWriteError = class(EFilerError);\r\n EClassNotFound = class(EFilerError);\r\n EMethodNotFound = class(EFilerError);\r\n EInvalidImage = class(EFilerError);\r\n EResNotFound = class(Exception);\r\n EListError = class(Exception);\r\n EBitsError = class(Exception);\r\n EStringListError = class(EListError);\r\n EComponentError = class(Exception);\r\n EParserError = class(Exception);\r\n EOutOfResources = class(EOutOfMemory);\r\n EInvalidOperation = class(Exception);\r\n\r\n TListAssignOp = (laCopy, laAnd, laOr, laXor, laSrcUnique, laDestUnique);\r\n TListSortCompare = function(Item1, Item2: JSValue): Integer;\r\n TListSortCompareFunc = reference to function (Item1, Item2: JSValue): Integer;\r\n TListCallback = Types.TListCallback;\r\n TListStaticCallback = Types.TListStaticCallback;\r\n TAlignment = (taLeftJustify, taRightJustify, taCenter);\r\n\r\n // Forward class definitions\r\n TFPList = Class;\r\n TReader = Class;\r\n TWriter = Class;\r\n TFiler = Class;\r\n\r\n { TFPListEnumerator }\r\n TFPListEnumerator = class\r\n private\r\n FList: TFPList;\r\n FPosition: Integer;\r\n public\r\n constructor Create(AList: TFPList); reintroduce;\r\n function GetCurrent: JSValue;\r\n function MoveNext: Boolean;\r\n property Current: JSValue read GetCurrent;\r\n end;\r\n\r\n { TFPList }\r\n\r\n TFPList = class(TObject)\r\n private\r\n FList: TJSValueDynArray;\r\n FCount: Integer;\r\n FCapacity: Integer;\r\n procedure CopyMove(aList: TFPList);\r\n procedure MergeMove(aList: TFPList);\r\n procedure DoCopy(ListA, ListB: TFPList);\r\n procedure DoSrcUnique(ListA, ListB: TFPList);\r\n procedure DoAnd(ListA, ListB: TFPList);\r\n procedure DoDestUnique(ListA, ListB: TFPList);\r\n procedure DoOr(ListA, ListB: TFPList);\r\n procedure DoXOr(ListA, ListB: TFPList);\r\n protected\r\n function Get(Index: Integer): JSValue; {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}\r\n procedure Put(Index: Integer; Item: JSValue); {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}\r\n procedure SetCapacity(NewCapacity: Integer);\r\n procedure SetCount(NewCount: Integer);\r\n Procedure RaiseIndexError(Index: Integer);\r\n public\r\n //Type\r\n // TDirection = (FromBeginning, FromEnd);\r\n destructor Destroy; override;\r\n procedure AddList(AList: TFPList);\r\n function Add(Item: JSValue): Integer; {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}\r\n procedure Clear;\r\n procedure Delete(Index: Integer); {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}\r\n class procedure Error(const Msg: string; const Data: String);\r\n procedure Exchange(Index1, Index2: Integer);\r\n function Expand: TFPList; {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}\r\n function Extract(Item: JSValue): JSValue;\r\n function First: JSValue;\r\n function GetEnumerator: TFPListEnumerator;\r\n function IndexOf(Item: JSValue): Integer;\r\n function IndexOfItem(Item: JSValue; Direction: TDirection): Integer;\r\n procedure Insert(Index: Integer; Item: JSValue); {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}\r\n function Last: JSValue;\r\n procedure Move(CurIndex, NewIndex: Integer);\r\n procedure Assign (ListA: TFPList; AOperator: TListAssignOp=laCopy; ListB: TFPList=nil);\r\n function Remove(Item: JSValue): Integer;\r\n procedure Pack;\r\n procedure Sort(const Compare: TListSortCompare);\r\n procedure SortList(const Compare: TListSortCompareFunc);\r\n procedure ForEachCall(const proc2call: TListCallback; const arg: JSValue);\r\n procedure ForEachCall(const proc2call: TListStaticCallback; const arg: JSValue);\r\n property Capacity: Integer read FCapacity write SetCapacity;\r\n property Count: Integer read FCount write SetCount;\r\n property Items[Index: Integer]: JSValue read Get write Put; default;\r\n property List: TJSValueDynArray read FList;\r\n end;\r\n\r\n TListNotification = (lnAdded, lnExtracted, lnDeleted);\r\n TList = class;\r\n\r\n { TListEnumerator }\r\n\r\n TListEnumerator = class\r\n private\r\n FList: TList;\r\n FPosition: Integer;\r\n public\r\n constructor Create(AList: TList); reintroduce;\r\n function GetCurrent: JSValue;\r\n function MoveNext: Boolean;\r\n property Current: JSValue read GetCurrent;\r\n end;\r\n\r\n { TList }\r\n\r\n TList = class(TObject)\r\n private\r\n FList: TFPList;\r\n procedure CopyMove (aList : TList);\r\n procedure MergeMove (aList : TList);\r\n procedure DoCopy(ListA, ListB : TList);\r\n procedure DoSrcUnique(ListA, ListB : TList);\r\n procedure DoAnd(ListA, ListB : TList);\r\n procedure DoDestUnique(ListA, ListB : TList);\r\n procedure DoOr(ListA, ListB : TList);\r\n procedure DoXOr(ListA, ListB : TList);\r\n protected\r\n function Get(Index: Integer): JSValue;\r\n procedure Put(Index: Integer; Item: JSValue);\r\n procedure Notify(aValue: JSValue; Action: TListNotification); virtual;\r\n procedure SetCapacity(NewCapacity: Integer);\r\n function GetCapacity: integer;\r\n procedure SetCount(NewCount: Integer);\r\n function GetCount: integer;\r\n function GetList: TJSValueDynArray;\r\n property FPList : TFPList Read FList;\r\n public\r\n constructor Create; reintroduce;\r\n destructor Destroy; override;\r\n Procedure AddList(AList : TList);\r\n function Add(Item: JSValue): Integer;\r\n procedure Clear; virtual;\r\n procedure Delete(Index: Integer);\r\n class procedure Error(const Msg: string; Data: String); virtual;\r\n procedure Exchange(Index1, Index2: Integer);\r\n function Expand: TList;\r\n function Extract(Item: JSValue): JSValue;\r\n function First: JSValue;\r\n function GetEnumerator: TListEnumerator;\r\n function IndexOf(Item: JSValue): Integer;\r\n procedure Insert(Index: Integer; Item: JSValue);\r\n function Last: JSValue;\r\n procedure Move(CurIndex, NewIndex: Integer);\r\n procedure Assign (ListA: TList; AOperator: TListAssignOp=laCopy; ListB: TList=nil);\r\n function Remove(Item: JSValue): Integer;\r\n procedure Pack;\r\n procedure Sort(const Compare: TListSortCompare);\r\n procedure SortList(const Compare: TListSortCompareFunc);\r\n property Capacity: Integer read GetCapacity write SetCapacity;\r\n property Count: Integer read GetCount write SetCount;\r\n property Items[Index: Integer]: JSValue read Get write Put; default;\r\n property List: TJSValueDynArray read GetList;\r\n end;\r\n\r\n { TPersistent }\r\n \r\n{$M+}\r\n\r\n TPersistent = class(TObject)\r\n private\r\n //FObservers : TFPList;\r\n procedure AssignError(Source: TPersistent);\r\n protected\r\n procedure DefineProperties(Filer: TFiler); virtual;\r\n procedure AssignTo(Dest: TPersistent); virtual;\r\n function GetOwner: TPersistent; virtual;\r\n public\r\n procedure Assign(Source: TPersistent); virtual;\r\n //procedure FPOAttachObserver(AObserver : TObject);\r\n //procedure FPODetachObserver(AObserver : TObject);\r\n //procedure FPONotifyObservers(ASender : TObject; AOperation: TFPObservedOperation; Data: TObject);\r\n function GetNamePath: string; virtual;\r\n procedure SetEvent(const ALookupRoot: TPersistent; const APropName, AMethodName: string); overload;\r\n procedure SetEvent(const AInstance: TPersistent; const ALookupRoot: TPersistent; const APropName, AMethodName: string); overload;\r\n end;\r\n TPersistentClass = Class of TPersistent;\r\n\r\n { TInterfacedPersistent }\r\n\r\n TInterfacedPersistent = class(TPersistent, IInterface)\r\n private\r\n FOwnerInterface: IInterface;\r\n protected\r\n function _AddRef: Integer; {$IFDEF MAKESTUB}stdcall;{$ENDIF}\r\n function _Release: Integer; {$IFDEF MAKESTUB}stdcall;{$ENDIF}\r\n public\r\n function QueryInterface(const IID: TGUID; out Obj): HRESULT; virtual;{$IFDEF MAKESTUB} stdcall;{$ENDIF}\r\n procedure AfterConstruction; override;\r\n end;\r\n\r\n\r\n TStrings = Class;\r\n { TStringsEnumerator class }\r\n\r\n TStringsEnumerator = class\r\n private\r\n FStrings: TStrings;\r\n FPosition: Integer;\r\n public\r\n constructor Create(AStrings: TStrings); reintroduce;\r\n function GetCurrent: String;\r\n function MoveNext: Boolean;\r\n property Current: String read GetCurrent;\r\n end;\r\n\r\n\r\n { TStrings class }\r\n TStrings = class(TPersistent)\r\n private\r\n FSpecialCharsInited : boolean;\r\n FAlwaysQuote: Boolean;\r\n FQuoteChar : Char;\r\n FDelimiter : Char;\r\n FNameValueSeparator : Char;\r\n FUpdateCount: Integer;\r\n FLBS : TTextLineBreakStyle;\r\n FSkipLastLineBreak : Boolean;\r\n FStrictDelimiter : Boolean;\r\n FLineBreak : String;\r\n function GetCommaText: string;\r\n function GetName(Index: Integer): string;\r\n function GetValue(const Name: string): string;\r\n Function GetLBS : TTextLineBreakStyle;\r\n Procedure SetLBS (AValue : TTextLineBreakStyle);\r\n procedure SetCommaText(const Value: string);\r\n procedure SetValue(const Name : String; Const Value: string);\r\n procedure SetDelimiter(c:Char);\r\n procedure SetQuoteChar(c:Char);\r\n procedure SetNameValueSeparator(c:Char);\r\n procedure DoSetTextStr(const Value: string; DoClear : Boolean);\r\n Function GetDelimiter : Char;\r\n Function GetNameValueSeparator : Char;\r\n Function GetQuoteChar: Char;\r\n Function GetLineBreak : String;\r\n procedure SetLineBreak(const S : String);\r\n Function GetSkipLastLineBreak : Boolean;\r\n procedure SetSkipLastLineBreak(const AValue : Boolean);\r\n procedure ReadData(Reader: TReader);\r\n procedure WriteData(Writer: TWriter);\r\n protected\r\n procedure DefineProperties(Filer: TFiler); override;\r\n procedure Error(const Msg: string; Data: Integer);\r\n function Get(Index: Integer): string; virtual; abstract;\r\n function GetCapacity: Integer; virtual;\r\n function GetCount: Integer; virtual; abstract;\r\n function GetObject(Index: Integer): TObject; virtual;\r\n function GetTextStr: string; virtual;\r\n procedure Put(Index: Integer; const S: string); virtual;\r\n procedure PutObject(Index: Integer; AObject: TObject); virtual;\r\n procedure SetCapacity(NewCapacity: Integer); virtual;\r\n procedure SetTextStr(const Value: string); virtual;\r\n procedure SetUpdateState(Updating: Boolean); virtual;\r\n property UpdateCount: Integer read FUpdateCount;\r\n Function DoCompareText(const s1,s2 : string) : PtrInt; virtual;\r\n Function GetDelimitedText: string;\r\n Procedure SetDelimitedText(Const AValue: string);\r\n Function GetValueFromIndex(Index: Integer): string;\r\n Procedure SetValueFromIndex(Index: Integer; const Value: string);\r\n Procedure CheckSpecialChars;\r\n// Class Function GetNextLine (Const Value : String; Var S : String; Var P : Integer) : Boolean;\r\n Function GetNextLinebreak (Const Value : String; Out S : String; Var P : Integer) : Boolean;\r\n public\r\n constructor Create; reintroduce;\r\n destructor Destroy; override;\r\n function ToObjectArray: TObjectDynArray; overload;\r\n function ToObjectArray(aStart,aEnd : Integer): TObjectDynArray; overload;\r\n function ToStringArray: TStringDynArray; overload;\r\n function ToStringArray(aStart,aEnd : Integer): TStringDynArray; overload;\r\n function Add(const S: string): Integer; virtual; overload;\r\n function Add(const Fmt : string; const Args : Array of JSValue): Integer; overload;\r\n function AddFmt(const Fmt : string; const Args : Array of JSValue): Integer;\r\n function AddObject(const S: string; AObject: TObject): Integer; virtual; overload;\r\n function AddObject(const Fmt: string; Args : Array of JSValue; AObject: TObject): Integer; overload;\r\n procedure Append(const S: string);\r\n procedure AddStrings(TheStrings: TStrings); overload; virtual;\r\n procedure AddStrings(TheStrings: TStrings; ClearFirst : Boolean); overload;\r\n procedure AddStrings(const TheStrings: array of string); overload; virtual;\r\n procedure AddStrings(const TheStrings: array of string; ClearFirst : Boolean); overload;\r\n function AddPair(const AName, AValue: string): TStrings; overload;\r\n function AddPair(const AName, AValue: string; AObject: TObject): TStrings; overload;\r\n Procedure AddText(Const S : String); virtual;\r\n procedure Assign(Source: TPersistent); override;\r\n procedure BeginUpdate;\r\n procedure Clear; virtual; abstract;\r\n procedure Delete(Index: Integer); virtual; abstract;\r\n procedure EndUpdate;\r\n function Equals(Obj: TObject): Boolean; override; overload;\r\n function Equals(TheStrings: TStrings): Boolean; overload;\r\n procedure Exchange(Index1, Index2: Integer); virtual;\r\n function GetEnumerator: TStringsEnumerator;\r\n function IndexOf(const S: string): Integer; virtual;\r\n function IndexOfName(const Name: string): Integer; virtual;\r\n function IndexOfObject(AObject: TObject): Integer; virtual;\r\n procedure Insert(Index: Integer; const S: string); virtual; abstract;\r\n procedure InsertObject(Index: Integer; const S: string; AObject: TObject);\r\n procedure Move(CurIndex, NewIndex: Integer); virtual;\r\n procedure GetNameValue(Index : Integer; Out AName,AValue : String);\r\n Procedure LoadFromURL(Const aURL : String; Async : Boolean = True; OnLoaded : TNotifyEventRef = Nil; OnError: TStringNotifyEventRef = Nil); virtual;\r\n // Delphi compatibility. Must be an URL\r\n Procedure LoadFromFile(Const aFileName : String); overload;\r\n Procedure LoadFromFile(Const aFileName : String; const OnLoaded: TProc; const AError: TProcString); overload;\r\n function LoadFromFileAsync(const aFileName: string): TJSPromise;\r\n function ExtractName(Const S:String):String;\r\n procedure SaveToFile(const FileName: string); overload; virtual;\r\n Property TextLineBreakStyle : TTextLineBreakStyle Read GetLBS Write SetLBS;\r\n property Delimiter: Char read GetDelimiter write SetDelimiter;\r\n property DelimitedText: string read GetDelimitedText write SetDelimitedText;\r\n property LineBreak : string Read GetLineBreak write SetLineBreak;\r\n Property StrictDelimiter : Boolean Read FStrictDelimiter Write FStrictDelimiter;\r\n property AlwaysQuote: Boolean read FAlwaysQuote write FAlwaysQuote;\r\n property QuoteChar: Char read GetQuoteChar write SetQuoteChar;\r\n Property NameValueSeparator : Char Read GetNameValueSeparator Write SetNameValueSeparator;\r\n property ValueFromIndex[Index: Integer]: string read GetValueFromIndex write SetValueFromIndex;\r\n property Capacity: Integer read GetCapacity write SetCapacity;\r\n property CommaText: string read GetCommaText write SetCommaText;\r\n property Count: Integer read GetCount;\r\n property Names[Index: Integer]: string read GetName;\r\n property Objects[Index: Integer]: TObject read GetObject write PutObject;\r\n property Values[const Name: string]: string read GetValue write SetValue;\r\n property Strings[Index: Integer]: string read Get write Put; default;\r\n property Text: string read GetTextStr write SetTextStr;\r\n Property SkipLastLineBreak : Boolean Read GetSkipLastLineBreak Write SetSkipLastLineBreak;\r\n end;\r\n\r\n { TStringList}\r\n TStringItem = record\r\n FString: string;\r\n FObject: TObject;\r\n end;\r\n\r\n TStringItemArray = Array of TStringItem;\r\n\r\n TStringList = class;\r\n TStringListSortCompare = function(List: TStringList; Index1, Index2: Integer): Integer;\r\n\r\n TStringsSortStyle = (sslNone,sslUser,sslAuto);\r\n TStringsSortStyles = Set of TStringsSortStyle;\r\n\r\n TStringList = class(TStrings)\r\n private\r\n FList: TStringItemArray;\r\n FCount: Integer;\r\n FOnChange: TNotifyEvent;\r\n FOnChanging: TNotifyEvent;\r\n FDuplicates: TDuplicates;\r\n FCaseSensitive : Boolean;\r\n FForceSort : Boolean;\r\n FOwnsObjects : Boolean;\r\n FSortStyle: TStringsSortStyle;\r\n procedure ExchangeItemsInt(Index1, Index2: Integer);\r\n function GetSorted: Boolean;\r\n procedure Grow;\r\n procedure InternalClear(FromIndex : Integer = 0; ClearOnly : Boolean = False);\r\n procedure QuickSort(L, R: Integer; CompareFn: TStringListSortCompare);\r\n procedure SetSorted(Value: Boolean);\r\n procedure SetCaseSensitive(b : boolean);\r\n procedure SetSortStyle(AValue: TStringsSortStyle);\r\n protected\r\n Procedure CheckIndex(AIndex : Integer);\r\n procedure ExchangeItems(Index1, Index2: Integer); virtual;\r\n procedure Changed; virtual;\r\n procedure Changing; virtual;\r\n function Get(Index: Integer): string; override;\r\n function GetCapacity: Integer; override;\r\n function GetCount: Integer; override;\r\n function GetObject(Index: Integer): TObject; override;\r\n procedure Put(Index: Integer; const S: string); override;\r\n procedure PutObject(Index: Integer; AObject: TObject); override;\r\n procedure SetCapacity(NewCapacity: Integer); override;\r\n procedure SetUpdateState(Updating: Boolean); override;\r\n procedure InsertItem(Index: Integer; const S: string); virtual;\r\n procedure InsertItem(Index: Integer; const S: string; O: TObject); virtual;\r\n Function DoCompareText(const s1,s2 : string) : PtrInt; override;\r\n function CompareStrings(const s1,s2 : string) : Integer; virtual;\r\n public\r\n destructor Destroy; override;\r\n function Add(const S: string): Integer; override;\r\n procedure Clear; override;\r\n procedure Delete(Index: Integer); override;\r\n procedure Exchange(Index1, Index2: Integer); override;\r\n function Find(const S: string; Out Index: Integer): Boolean; virtual;\r\n function IndexOf(const S: string): Integer; override;\r\n procedure Insert(Index: Integer; const S: string); override;\r\n procedure Sort; virtual;\r\n procedure CustomSort(CompareFn: TStringListSortCompare); virtual;\r\n property Duplicates: TDuplicates read FDuplicates write FDuplicates;\r\n property Sorted: Boolean read GetSorted write SetSorted;\r\n property CaseSensitive: Boolean read FCaseSensitive write SetCaseSensitive;\r\n property OnChange: TNotifyEvent read FOnChange write FOnChange;\r\n property OnChanging: TNotifyEvent read FOnChanging write FOnChanging;\r\n property OwnsObjects : boolean read FOwnsObjects write FOwnsObjects;\r\n Property SortStyle : TStringsSortStyle Read FSortStyle Write SetSortStyle;\r\n end;\r\n\r\n TCollection = class;\r\n\r\n { TCollectionItem }\r\n\r\n TCollectionItem = class(TPersistent)\r\n private\r\n FCollection: TCollection;\r\n FID: Integer;\r\n FUpdateCount: Integer;\r\n function GetIndex: Integer;\r\n protected\r\n procedure SetCollection(Value: TCollection);virtual;\r\n procedure Changed(AllItems: Boolean);\r\n function GetOwner: TPersistent; override;\r\n function GetDisplayName: string; virtual;\r\n procedure SetIndex(Value: Integer); virtual;\r\n procedure SetDisplayName(const Value: string); virtual;\r\n property UpdateCount: Integer read FUpdateCount;\r\n public\r\n constructor Create(ACollection: TCollection); virtual; reintroduce;\r\n destructor Destroy; override;\r\n function GetNamePath: string; override;\r\n property Collection: TCollection read FCollection write SetCollection;\r\n property ID: Integer read FID;\r\n property Index: Integer read GetIndex write SetIndex;\r\n property DisplayName: string read GetDisplayName write SetDisplayName;\r\n end;\r\n\r\n TCollectionEnumerator = class\r\n private\r\n FCollection: TCollection;\r\n FPosition: Integer;\r\n public\r\n constructor Create(ACollection: TCollection); reintroduce;\r\n function GetCurrent: TCollectionItem;\r\n function MoveNext: Boolean;\r\n property Current: TCollectionItem read GetCurrent;\r\n end;\r\n\r\n TCollectionItemClass = class of TCollectionItem;\r\n TCollectionNotification = (cnAdded, cnExtracting, cnDeleting);\r\n TCollectionSortCompare = function (Item1, Item2: TCollectionItem): Integer;\r\n TCollectionSortCompareFunc = reference to function (Item1, Item2: TCollectionItem): Integer;\r\n\r\n TCollection = class(TPersistent)\r\n private\r\n FItemClass: TCollectionItemClass;\r\n FItems: TFpList;\r\n FUpdateCount: Integer;\r\n FNextID: Integer;\r\n FPropName: string;\r\n function GetCount: Integer;\r\n function GetPropName: string;\r\n procedure InsertItem(Item: TCollectionItem);\r\n procedure RemoveItem(Item: TCollectionItem);\r\n procedure DoClear;\r\n protected\r\n { Design-time editor support }\r\n function GetAttrCount: Integer; virtual;\r\n function GetAttr(Index: Integer): string; virtual;\r\n function GetItemAttr(Index, ItemIndex: Integer): string; virtual;\r\n procedure Changed;\r\n function GetItem(Index: Integer): TCollectionItem;\r\n procedure SetItem(Index: Integer; Value: TCollectionItem);\r\n procedure SetItemName(Item: TCollectionItem); virtual;\r\n procedure SetPropName; virtual;\r\n procedure Update(Item: TCollectionItem); virtual;\r\n procedure Notify(Item: TCollectionItem;Action: TCollectionNotification); virtual;\r\n property PropName: string read GetPropName write FPropName;\r\n property UpdateCount: Integer read FUpdateCount;\r\n property FPList : TFPList Read FItems;\r\n public\r\n constructor Create(AItemClass: TCollectionItemClass); reintroduce;\r\n destructor Destroy; override;\r\n function Owner: TPersistent;\r\n function Add: TCollectionItem;\r\n procedure Assign(Source: TPersistent); override;\r\n procedure BeginUpdate; virtual;\r\n procedure Clear;\r\n procedure EndUpdate; virtual;\r\n procedure Delete(Index: Integer);\r\n function GetEnumerator: TCollectionEnumerator;\r\n function GetNamePath: string; override;\r\n function Insert(Index: Integer): TCollectionItem;\r\n function FindItemID(ID: Integer): TCollectionItem;\r\n procedure Exchange(Const Index1, index2: integer);\r\n procedure Sort(Const Compare : TCollectionSortCompare);\r\n procedure SortList(Const Compare : TCollectionSortCompareFunc);\r\n property Count: Integer read GetCount;\r\n property ItemClass: TCollectionItemClass read FItemClass;\r\n property Items[Index: Integer]: TCollectionItem read GetItem write SetItem;\r\n end;\r\n\r\n TOwnedCollection = class(TCollection)\r\n private\r\n FOwner: TPersistent;\r\n protected\r\n Function GetOwner: TPersistent; override;\r\n public\r\n Constructor Create(AOwner: TPersistent; AItemClass: TCollectionItemClass); reintroduce;\r\n end;\r\n\r\n TComponent = Class;\r\n\r\n TOperation = (opInsert, opRemove);\r\n\r\n TComponentStateItem = ( csLoading, csReading, csWriting, csDestroying,\r\n csDesigning, csAncestor, csUpdating, csFixups, csFreeNotification,\r\n csInline, csDesignInstance);\r\n TComponentState = set of TComponentStateItem;\r\n TComponentStyleItem = (csInheritable, csCheckPropAvail, csSubComponent, csTransient);\r\n TComponentStyle = set of TComponentStyleItem;\r\n\r\n TGetChildProc = procedure (Child: TComponent) of object;\r\n\r\n TComponentName = string;\r\n\r\n { TComponentEnumerator }\r\n\r\n TComponentEnumerator = class\r\n private\r\n FComponent: TComponent;\r\n FPosition: Integer;\r\n public\r\n constructor Create(AComponent: TComponent); reintroduce;\r\n function GetCurrent: TComponent;\r\n function MoveNext: Boolean;\r\n property Current: TComponent read GetCurrent;\r\n end;\r\n\r\n TComponent = class(TPersistent, IInterface)\r\n private\r\n FOwner: TComponent;\r\n FName: TComponentName;\r\n FTag: Ptrint;\r\n FComponents: TFpList;\r\n FFreeNotifies: TFpList;\r\n FDesignInfo: Longint;\r\n FComponentState: TComponentState;\r\n function GetComponent(AIndex: Integer): TComponent;\r\n function GetComponentCount: Integer;\r\n function GetComponentIndex: Integer;\r\n procedure Insert(AComponent: TComponent);\r\n procedure ReadLeft(AReader: TReader);\r\n procedure ReadTop(AReader: TReader);\r\n procedure Remove(AComponent: TComponent);\r\n procedure RemoveNotification(AComponent: TComponent);\r\n procedure SetComponentIndex(Value: Integer);\r\n procedure SetReference(Enable: Boolean);\r\n procedure WriteLeft(AWriter: TWriter);\r\n procedure WriteTop(AWriter: TWriter);\r\n protected\r\n FComponentStyle: TComponentStyle;\r\n procedure ChangeName(const NewName: TComponentName);\r\n procedure DefineProperties(Filer: TFiler); override;\r\n procedure GetChildren(Proc: TGetChildProc; Root: TComponent); virtual;\r\n function GetChildOwner: TComponent; virtual;\r\n function GetChildParent: TComponent; virtual;\r\n function GetOwner: TPersistent; override;\r\n procedure Loaded; virtual;\r\n procedure Loading; virtual;\r\n procedure SetWriting(Value: Boolean); virtual;\r\n procedure SetReading(Value: Boolean); virtual;\r\n procedure Notification(AComponent: TComponent; Operation: TOperation); virtual;\r\n procedure PaletteCreated; virtual;\r\n procedure ReadState(Reader: TReader); virtual;\r\n procedure SetAncestor(Value: Boolean);\r\n procedure SetDesigning(Value: Boolean; SetChildren : Boolean = True);\r\n procedure SetDesignInstance(Value: Boolean);\r\n procedure SetInline(Value: Boolean);\r\n procedure SetName(const NewName: TComponentName); virtual;\r\n procedure SetChildOrder(Child: TComponent; Order: Integer); virtual;\r\n procedure SetParentComponent(Value: TComponent); virtual;\r\n procedure Updating; virtual;\r\n procedure Updated; virtual;\r\n procedure ValidateRename(AComponent: TComponent; const CurName, NewName: string); virtual;\r\n procedure ValidateContainer(AComponent: TComponent); virtual;\r\n procedure ValidateInsert(AComponent: TComponent); virtual;\r\n protected\r\n function _AddRef: Integer; {$IFDEF MAKESTUB}stdcall;{$ENDIF}\r\n FLeft: Integer;\r\n FTop: Integer;\r\n function GetLeft: Integer; virtual;\r\n function GetTop: Integer; virtual;\r\n procedure SetLeft(AValue: Integer); virtual;\r\n procedure SetTop(AValue: Integer); virtual;\r\n function _Release: Integer; {$IFDEF MAKESTUB}stdcall;{$ENDIF}\r\n public\r\n constructor Create(AOwner: TComponent); virtual; reintroduce;\r\n destructor Destroy; override;\r\n procedure BeforeDestruction; override;\r\n procedure DestroyComponents;\r\n procedure Destroying;\r\n function QueryInterface(const IID: TGUID; out Obj): HRESULT; virtual; {$IFDEF MAKESTUB} stdcall;{$ENDIF}\r\n procedure AfterLoadDFMValues; virtual;\r\n procedure BeforeLoadDFMValues; virtual;\r\n procedure BeginUpdate; virtual;\r\n procedure EndUpdate; virtual;\r\n procedure WriteState(Writer: TWriter); virtual;\r\n// function ExecuteAction(Action: TBasicAction): Boolean; virtual;\r\n function FindComponent(const AName: string): TComponent;\r\n procedure FreeNotification(AComponent: TComponent);\r\n procedure RemoveFreeNotification(AComponent: TComponent);\r\n function GetNamePath: string; override;\r\n function GetParentComponent: TComponent; virtual;\r\n function HasParent: Boolean; virtual;\r\n procedure InsertComponent(AComponent: TComponent);\r\n procedure RemoveComponent(AComponent: TComponent);\r\n procedure SetSubComponent(ASubComponent: Boolean);\r\n function GetEnumerator: TComponentEnumerator;\r\n// function UpdateAction(Action: TBasicAction): Boolean; dynamic;\r\n property Components[Index: Integer]: TComponent read GetComponent;\r\n property ComponentCount: Integer read GetComponentCount;\r\n property ComponentIndex: Integer read GetComponentIndex write SetComponentIndex;\r\n property ComponentState: TComponentState read FComponentState;\r\n property ComponentStyle: TComponentStyle read FComponentStyle;\r\n property DesignInfo: Longint read FDesignInfo write FDesignInfo;\r\n property Left: Integer read GetLeft write SetLeft;\r\n property Owner: TComponent read FOwner;\r\n property Top: Integer read GetTop write SetTop;\r\n published\r\n property Name: TComponentName read FName write SetName stored False;\r\n property Tag: PtrInt read FTag write FTag default 0;\r\n end;\r\n TComponentClass = Class of TComponent;\r\n\r\n TSeekOrigin = (soBeginning, soCurrent, soEnd);\r\n\r\n { TStream }\r\n\r\n TStream = class(TObject)\r\n private\r\n FEndian: TEndian;\r\n function MakeInt(B: TBytes; aSize: Integer; Signed: Boolean): NativeInt;\r\n function MakeBytes(B: NativeInt; aSize: Integer; Signed: Boolean): TBytes;\r\n protected\r\n procedure InvalidSeek; virtual;\r\n procedure Discard(const Count: NativeInt);\r\n procedure DiscardLarge(Count: NativeInt; const MaxBufferSize: Longint);\r\n procedure FakeSeekForward(Offset: NativeInt; const Origin: TSeekOrigin; const Pos: NativeInt);\r\n function GetPosition: NativeInt; virtual;\r\n procedure SetPosition(const Pos: NativeInt); virtual;\r\n function GetSize: NativeInt; virtual;\r\n procedure SetSize(const NewSize: NativeInt); virtual;\r\n procedure SetSize64(const NewSize: NativeInt); virtual;\r\n procedure ReadNotImplemented;\r\n procedure WriteNotImplemented;\r\n function ReadMaxSizeData(Buffer : TBytes; aSize,aCount : NativeInt) : NativeInt;\r\n Procedure ReadExactSizeData(Buffer : TBytes; aSize,aCount : NativeInt);\r\n function WriteMaxSizeData(Const Buffer : TBytes; aSize,aCount : NativeInt) : NativeInt;\r\n Procedure WriteExactSizeData(Const Buffer : TBytes; aSize,aCount : NativeInt);\r\n public\r\n function Read(var Buffer: TBytes; Count: Longint): Longint; overload;\r\n function Read(Buffer : TBytes; aOffset, Count: Longint): Longint; virtual; abstract; overload;\r\n\r\n function Write(const Buffer: TBytes; Count: Longint): Longint; virtual; overload;\r\n function Write(const Buffer: TBytes; Offset, Count: Longint): Longint; virtual; abstract; overload;\r\n\r\n function Seek(const Offset: NativeInt; Origin: TSeekOrigin): NativeInt; virtual; abstract; overload;\r\n\r\n function ReadData(Buffer: TBytes; Count: NativeInt): NativeInt; overload;\r\n function ReadData(var Buffer: Boolean): NativeInt; overload;\r\n function ReadData(var Buffer: Boolean; Count: NativeInt): NativeInt; overload;\r\n function ReadData(var Buffer: WideChar): NativeInt; overload;\r\n function ReadData(var Buffer: WideChar; Count: NativeInt): NativeInt; overload;\r\n function ReadData(var Buffer: Int8): NativeInt; overload;\r\n function ReadData(var Buffer: Int8; Count: NativeInt): NativeInt; overload;\r\n function ReadData(var Buffer: UInt8): NativeInt; overload;\r\n function ReadData(var Buffer: UInt8; Count: NativeInt): NativeInt; overload;\r\n function ReadData(var Buffer: Int16): NativeInt; overload;\r\n function ReadData(var Buffer: Int16; Count: NativeInt): NativeInt; overload;\r\n function ReadData(var Buffer: UInt16): NativeInt; overload;\r\n function ReadData(var Buffer: UInt16; Count: NativeInt): NativeInt; overload;\r\n function ReadData(var Buffer: Int32): NativeInt; overload;\r\n function ReadData(var Buffer: Int32; Count: NativeInt): NativeInt; overload;\r\n function ReadData(var Buffer: UInt32): NativeInt; overload;\r\n function ReadData(var Buffer: UInt32; Count: NativeInt): NativeInt; overload;\r\n // NativeLargeint. Stored as a float64, Read as float64.\r\n function ReadData(var Buffer: NativeLargeInt): NativeInt; overload;\r\n function ReadData(var Buffer: NativeLargeInt; Count: NativeInt): NativeInt; overload;\r\n function ReadData(var Buffer: NativeLargeUInt): NativeInt; overload;\r\n function ReadData(var Buffer: NativeLargeUInt; Count: NativeInt): NativeInt; overload;\r\n function ReadData(var Buffer: Double): NativeInt; overload;\r\n function ReadData(var Buffer: Double; Count: NativeInt): NativeInt; overload;\r\n procedure ReadBuffer(var Buffer: TBytes; Count: NativeInt); overload;\r\n procedure ReadBuffer(var Buffer: TBytes; Offset, Count: NativeInt); overload;\r\n\r\n procedure ReadBufferData(var Buffer: Boolean); overload;\r\n procedure ReadBufferData(var Buffer: Boolean; Count: NativeInt); overload;\r\n procedure ReadBufferData(var Buffer: WideChar); overload;\r\n procedure ReadBufferData(var Buffer: WideChar; Count: NativeInt); overload;\r\n procedure ReadBufferData(var Buffer: Int8); overload;\r\n procedure ReadBufferData(var Buffer: Int8; Count: NativeInt); overload;\r\n procedure ReadBufferData(var Buffer: UInt8); overload;\r\n procedure ReadBufferData(var Buffer: UInt8; Count: NativeInt); overload;\r\n procedure ReadBufferData(var Buffer: Int16); overload;\r\n procedure ReadBufferData(var Buffer: Int16; Count: NativeInt); overload;\r\n procedure ReadBufferData(var Buffer: UInt16); overload;\r\n procedure ReadBufferData(var Buffer: UInt16; Count: NativeInt); overload;\r\n procedure ReadBufferData(var Buffer: Int32); overload;\r\n procedure ReadBufferData(var Buffer: Int32; Count: NativeInt); overload;\r\n procedure ReadBufferData(var Buffer: UInt32); overload;\r\n procedure ReadBufferData(var Buffer: UInt32; Count: NativeInt); overload;\r\n // NativeLargeint. Stored as a float64, Read as float64.\r\n procedure ReadBufferData(var Buffer: NativeLargeInt); overload;\r\n procedure ReadBufferData(var Buffer: NativeLargeInt; Count: NativeInt); overload;\r\n procedure ReadBufferData(var Buffer: NativeLargeUInt); overload;\r\n procedure ReadBufferData(var Buffer: NativeLargeUInt; Count: NativeInt); overload;\r\n procedure ReadBufferData(var Buffer: Double); overload;\r\n procedure ReadBufferData(var Buffer: Double; Count: NativeInt); overload;\r\n procedure WriteBuffer(const Buffer: TBytes; Count: NativeInt); overload;\r\n procedure WriteBuffer(const Buffer: TBytes; Offset, Count: NativeInt); overload;\r\n\r\n function WriteData(const Buffer: TBytes; Count: NativeInt): NativeInt; overload;\r\n function WriteData(const Buffer: Boolean): NativeInt; overload;\r\n function WriteData(const Buffer: Boolean; Count: NativeInt): NativeInt; overload;\r\n function WriteData(const Buffer: WideChar): NativeInt; overload;\r\n function WriteData(const Buffer: WideChar; Count: NativeInt): NativeInt; overload;\r\n function WriteData(const Buffer: Int8): NativeInt; overload;\r\n function WriteData(const Buffer: Int8; Count: NativeInt): NativeInt; overload;\r\n function WriteData(const Buffer: UInt8): NativeInt; overload;\r\n function WriteData(const Buffer: UInt8; Count: NativeInt): NativeInt; overload;\r\n function WriteData(const Buffer: Int16): NativeInt; overload;\r\n function WriteData(const Buffer: Int16; Count: NativeInt): NativeInt; overload;\r\n function WriteData(const Buffer: UInt16): NativeInt; overload;\r\n function WriteData(const Buffer: UInt16; Count: NativeInt): NativeInt; overload;\r\n function WriteData(const Buffer: Int32): NativeInt; overload;\r\n function WriteData(const Buffer: Int32; Count: NativeInt): NativeInt; overload;\r\n function WriteData(const Buffer: UInt32): NativeInt; overload;\r\n function WriteData(const Buffer: UInt32; Count: NativeInt): NativeInt; overload;\r\n // NativeLargeint. Stored as a float64, Read as float64.\r\n function WriteData(const Buffer: NativeLargeInt): NativeInt; overload;\r\n function WriteData(const Buffer: NativeLargeInt; Count: NativeInt): NativeInt; overload;\r\n function WriteData(const Buffer: NativeLargeUInt): NativeInt; overload;\r\n function WriteData(const Buffer: NativeLargeUInt; Count: NativeInt): NativeInt; overload;\r\n function WriteData(const Buffer: Double): NativeInt; overload;\r\n function WriteData(const Buffer: Double; Count: NativeInt): NativeInt; overload;\r\n{$IFDEF FPC_HAS_TYPE_EXTENDED}\r\n function WriteData(const Buffer: Extended): NativeInt; overload;\r\n function WriteData(const Buffer: Extended; Count: NativeInt): NativeInt; overload;\r\n function WriteData(const Buffer: TExtended80Rec): NativeInt; overload;\r\n function WriteData(const Buffer: TExtended80Rec; Count: NativeInt): NativeInt; overload;\r\n{$ENDIF}\r\n procedure WriteBufferData(Buffer: Int32); overload;\r\n procedure WriteBufferData(Buffer: Int32; Count: NativeInt); overload;\r\n procedure WriteBufferData(Buffer: Boolean); overload;\r\n procedure WriteBufferData(Buffer: Boolean; Count: NativeInt); overload;\r\n procedure WriteBufferData(Buffer: WideChar); overload;\r\n procedure WriteBufferData(Buffer: WideChar; Count: NativeInt); overload;\r\n procedure WriteBufferData(Buffer: Int8); overload;\r\n procedure WriteBufferData(Buffer: Int8; Count: NativeInt); overload;\r\n procedure WriteBufferData(Buffer: UInt8); overload;\r\n procedure WriteBufferData(Buffer: UInt8; Count: NativeInt); overload;\r\n procedure WriteBufferData(Buffer: Int16); overload;\r\n procedure WriteBufferData(Buffer: Int16; Count: NativeInt); overload;\r\n procedure WriteBufferData(Buffer: UInt16); overload;\r\n procedure WriteBufferData(Buffer: UInt16; Count: NativeInt); overload;\r\n procedure WriteBufferData(Buffer: UInt32); overload;\r\n procedure WriteBufferData(Buffer: UInt32; Count: NativeInt); overload;\r\n // NativeLargeint. Stored as a float64, Read as float64.\r\n procedure WriteBufferData(Buffer: NativeLargeInt); overload;\r\n procedure WriteBufferData(Buffer: NativeLargeInt; Count: NativeInt); overload;\r\n procedure WriteBufferData(Buffer: NativeLargeUInt); overload;\r\n procedure WriteBufferData(Buffer: NativeLargeUInt; Count: NativeInt); overload;\r\n procedure WriteBufferData(Buffer: Double); overload;\r\n procedure WriteBufferData(Buffer: Double; Count: NativeInt); overload;\r\n function CopyFrom(Source: TStream; Count: NativeInt): NativeInt;\r\n function ReadComponent(Instance: TComponent): TComponent;\r\n function ReadComponentRes(Instance: TComponent): TComponent;\r\n procedure WriteComponent(Instance: TComponent);\r\n procedure WriteComponentRes(const ResName: string; Instance: TComponent);\r\n procedure WriteDescendent(Instance, Ancestor: TComponent);\r\n procedure WriteDescendentRes(const ResName: string; Instance, Ancestor: TComponent);\r\n procedure WriteResourceHeader(const ResName: string; {!!!:out} var FixupInfo: Longint);\r\n procedure FixupResourceHeader(FixupInfo: Longint);\r\n procedure ReadResHeader;\r\n function ReadByte : Byte;\r\n function ReadWord : Word;\r\n function ReadDWord : Cardinal;\r\n function ReadQWord : NativeLargeUInt;\r\n procedure WriteByte(b : Byte);\r\n procedure WriteWord(w : Word);\r\n procedure WriteDWord(d : Cardinal);\r\n procedure WriteQWord(q : NativeLargeUInt);\r\n property Position: NativeInt read GetPosition write SetPosition;\r\n property Size: NativeInt read GetSize write SetSize64;\r\n Property Endian: TEndian Read FEndian Write FEndian;\r\n end;\r\n\r\n { TCustomMemoryStream abstract class }\r\n\r\n TCustomMemoryStream = class(TStream)\r\n private\r\n FMemory: TJSArrayBuffer;\r\n FDataView : TJSDataView;\r\n FDataArray : TJSUint8Array;\r\n FSize, FPosition: PtrInt;\r\n FSizeBoundsSeek : Boolean;\r\n function GetDataArray: TJSUint8Array;\r\n function GetDataView: TJSDataview;\r\n protected\r\n Function GetSize : NativeInt; Override;\r\n function GetPosition: NativeInt; Override;\r\n procedure SetPointer(Ptr: TJSArrayBuffer; ASize: PtrInt);\r\n Property DataView : TJSDataview Read GetDataView;\r\n Property DataArray : TJSUint8Array Read GetDataArray;\r\n public\r\n Class Function MemoryToBytes(Mem : TJSArrayBuffer) : TBytes; overload;\r\n Class Function MemoryToBytes(Mem : TJSUint8Array) : TBytes; overload;\r\n Class Function BytesToMemory(aBytes : TBytes) : TJSArrayBuffer;\r\n function Read(Buffer : TBytes; Offset, Count: LongInt): LongInt; override;\r\n function Read(Buffer : TBytes; Count: LongInt): LongInt; virtual;\r\n function Seek(const Offset: NativeInt; Origin: TSeekOrigin): NativeInt; override;\r\n procedure SaveToStream(Stream: TStream);\r\n Procedure LoadFromURL(Const aURL : String; Async : Boolean = True; OnLoaded : TNotifyEventRef = Nil; OnError: TStringNotifyEventRef = Nil); virtual;\r\n // Delphi compatibility. Must be an URL\r\n Procedure LoadFromFile(Const aFileName : String; const OnLoaded : TProc = Nil; const AError: TProcString = Nil);\r\n property Memory: TJSArrayBuffer read FMemory;\r\n Property SizeBoundsSeek : Boolean Read FSizeBoundsSeek Write FSizeBoundsSeek;\r\n end;\r\n\r\n { TMemoryStream }\r\n\r\n TMemoryStream = class(TCustomMemoryStream)\r\n private\r\n FCapacity: PtrInt;\r\n procedure SetCapacity(NewCapacity: PtrInt);\r\n protected\r\n function Realloc(var NewCapacity: PtrInt): TJSArrayBuffer; virtual;\r\n property Capacity: PtrInt read FCapacity write SetCapacity;\r\n public\r\n destructor Destroy; override;\r\n procedure Clear;\r\n procedure LoadFromStream(Stream: TStream);\r\n procedure SetSize(const NewSize: NativeInt); override;\r\n function Write(const Buffer: TBytes; Offset, Count: LongInt): LongInt; override;\r\n function Write(const Buffer: TBytes; Count: LongInt): LongInt; override;\r\n end;\r\n\r\n{ TBytesStream }\r\n\r\n TBytesStream = class(TMemoryStream)\r\n private\r\n function GetBytes: TBytes;\r\n public\r\n constructor Create(const ABytes: TBytes); virtual; overload;\r\n property Bytes: TBytes read GetBytes;\r\n end;\r\n\r\n { TStringStream }\r\n\r\n TStringStream = class(TMemoryStream)\r\n private\r\n function GetDataString : String;\r\n public\r\n constructor Create; reintroduce; overload;\r\n constructor Create(const aString: String); virtual; overload;\r\n function ReadString(Count: Integer): string;\r\n procedure WriteString(const AString: string);\r\n property DataString: String read GetDataString;\r\n end;\r\n\r\n\r\n TFilerFlag = (ffInherited, ffChildPos, ffInline);\r\n TFilerFlags = set of TFilerFlag;\r\n\r\n TReaderProc = procedure(Reader: TReader) of object;\r\n TWriterProc = procedure(Writer: TWriter) of object;\r\n TStreamProc = procedure(Stream: TStream) of object;\r\n\r\n TFiler = class(TObject)\r\n private\r\n FRoot: TComponent;\r\n FLookupRoot: TComponent;\r\n FAncestor: TPersistent;\r\n FIgnoreChildren: Boolean;\r\n protected\r\n procedure SetRoot(ARoot: TComponent); virtual;\r\n public\r\n procedure DefineProperty(const Name: string;\r\n ReadData: TReaderProc; WriteData: TWriterProc;\r\n HasData: Boolean); virtual; abstract;\r\n procedure DefineBinaryProperty(const Name: string;\r\n ReadData, WriteData: TStreamProc;\r\n HasData: Boolean); virtual; abstract;\r\n Procedure FlushBuffer; virtual; abstract;\r\n property Root: TComponent read FRoot write SetRoot;\r\n property LookupRoot: TComponent read FLookupRoot;\r\n property Ancestor: TPersistent read FAncestor write FAncestor;\r\n property IgnoreChildren: Boolean read FIgnoreChildren write FIgnoreChildren;\r\n end;\r\n\r\n\r\n TValueType = (\r\n vaNull, vaList, vaInt8, vaInt16, vaInt32, vaDouble,\r\n vaString, vaIdent, vaFalse, vaTrue, vaBinary, vaSet,\r\n vaNil, vaCollection, vaCurrency, vaDate, vaNativeInt\r\n );\r\n\r\n { TAbstractObjectReader }\r\n\r\n TAbstractObjectReader = class\r\n public\r\n Procedure FlushBuffer; virtual;\r\n function NextValue: TValueType; virtual; abstract;\r\n function ReadValue: TValueType; virtual; abstract;\r\n procedure BeginRootComponent; virtual; abstract;\r\n procedure BeginComponent(var Flags: TFilerFlags; var AChildPos: Integer;\r\n var CompClassName, CompName: String); virtual; abstract;\r\n function BeginProperty: String; virtual; abstract;\r\n\r\n //Please don't use read, better use ReadBinary whenever possible\r\n procedure Read(var Buffer : TBytes; Count: Longint); virtual;abstract;\r\n\r\n { All ReadXXX methods are called _after_ the value type has been read! }\r\n procedure ReadBinary(const DestData: TMemoryStream); virtual; abstract;\r\n function ReadFloat: Extended; virtual; abstract;\r\n function ReadCurrency: Currency; virtual; abstract;\r\n function ReadIdent(ValueType: TValueType): String; virtual; abstract;\r\n function ReadInt8: ShortInt; virtual; abstract;\r\n function ReadInt16: SmallInt; virtual; abstract;\r\n function ReadInt32: LongInt; virtual; abstract;\r\n function ReadNativeInt: NativeInt; virtual; abstract;\r\n function ReadSet(EnumType: TTypeInfoEnum): Integer; virtual; abstract;\r\n procedure ReadSignature; virtual; abstract;\r\n function ReadStr: String; virtual; abstract;\r\n function ReadString(StringType: TValueType): String; virtual; abstract;\r\n function ReadWideString: WideString;virtual;abstract;\r\n function ReadUnicodeString: UnicodeString;virtual;abstract;\r\n procedure SkipComponent(SkipComponentInfos: Boolean); virtual; abstract;\r\n procedure SkipValue; virtual; abstract;\r\n end;\r\n\r\n { TBinaryObjectReader }\r\n\r\n TBinaryObjectReader = class(TAbstractObjectReader)\r\n protected\r\n FStream: TStream;\r\n function ReadWord : word;\r\n function ReadDWord : longword;\r\n procedure SkipProperty;\r\n procedure SkipSetBody;\r\n public\r\n constructor Create(Stream: TStream);\r\n function NextValue: TValueType; override;\r\n function ReadValue: TValueType; override;\r\n procedure BeginRootComponent; override;\r\n procedure BeginComponent(var Flags: TFilerFlags; var AChildPos: Integer;\r\n var CompClassName, CompName: String); override;\r\n function BeginProperty: String; override;\r\n //Please don't use read, better use ReadBinary whenever possible\r\n procedure Read(var Buffer : TBytes; Count: Longint); override;\r\n procedure ReadBinary(const DestData: TMemoryStream); override;\r\n function ReadFloat: Extended; override;\r\n function ReadCurrency: Currency; override;\r\n function ReadIdent(ValueType: TValueType): String; override;\r\n function ReadInt8: ShortInt; override;\r\n function ReadInt16: SmallInt; override;\r\n function ReadInt32: LongInt; override;\r\n function ReadNativeInt: NativeInt; override;\r\n function ReadSet(EnumType: TTypeInfoEnum): Integer; override;\r\n procedure ReadSignature; override;\r\n function ReadStr: String; override;\r\n function ReadString(StringType: TValueType): String; override;\r\n function ReadWideString: WideString;override;\r\n function ReadUnicodeString: UnicodeString;override;\r\n procedure SkipComponent(SkipComponentInfos: Boolean); override;\r\n procedure SkipValue; override;\r\n end;\r\n\r\n\r\n TFindMethodEvent = procedure(Reader: TReader; const MethodName: string; var Address: CodePointer; var Error: Boolean) of object;\r\n TSetNameEvent = procedure(Reader: TReader; Component: TComponent; var Name: string) of object;\r\n TReferenceNameEvent = procedure(Reader: TReader; var Name: string) of object;\r\n TAncestorNotFoundEvent = procedure(Reader: TReader; const ComponentName: string; ComponentClass: TPersistentClass; var Component: TComponent) of object;\r\n TReadComponentsProc = procedure(Component: TComponent) of object;\r\n TReaderError = procedure(Reader: TReader; const Message: string; var Handled: Boolean) of object;\r\n TPropertyNotFoundEvent = procedure(Reader: TReader; Instance: TPersistent; var PropName: string; IsPath: boolean; var Handled, Skip: Boolean) of object;\r\n TFindComponentClassEvent = procedure(Reader: TReader; const ClassName: string; var ComponentClass: TComponentClass) of object;\r\n TCreateComponentEvent = procedure(Reader: TReader; ComponentClass: TComponentClass; var Component: TComponent) of object;\r\n\r\n TSetMethodPropertyEvent = procedure(Reader: TReader; Instance: TPersistent; PropInfo: TTypeMemberProperty; const TheMethodName: string;\r\n var Handled: boolean) of object;\r\n TReadWriteStringPropertyEvent = procedure(Sender:TObject; const Instance: TPersistent; PropInfo: TTypeMemberProperty; var Content:string) of object;\r\n\r\n\r\n { TReader }\r\n\r\n TReader = class(TFiler)\r\n private\r\n FDriver: TAbstractObjectReader;\r\n FOwner: TComponent;\r\n FParent: TComponent;\r\n FFixups: TObject;\r\n FLoaded: TFpList;\r\n FOnFindMethod: TFindMethodEvent;\r\n FOnSetMethodProperty: TSetMethodPropertyEvent;\r\n FOnSetName: TSetNameEvent;\r\n FOnReferenceName: TReferenceNameEvent;\r\n FOnAncestorNotFound: TAncestorNotFoundEvent;\r\n FOnError: TReaderError;\r\n FOnPropertyNotFound: TPropertyNotFoundEvent;\r\n FOnFindComponentClass: TFindComponentClassEvent;\r\n FOnCreateComponent: TCreateComponentEvent;\r\n FPropName: string;\r\n FCanHandleExcepts: Boolean;\r\n FOnReadStringProperty:TReadWriteStringPropertyEvent;\r\n procedure DoFixupReferences;\r\n function FindComponentClass(const AClassName: string): TComponentClass;\r\n protected\r\n function Error(const Message: string): Boolean; virtual;\r\n function FindMethod(ARoot: TComponent; const AMethodName: string): CodePointer; virtual;\r\n procedure ReadProperty(AInstance: TPersistent);\r\n procedure ReadPropValue(Instance: TPersistent; PropInfo: TTypeMemberProperty);\r\n procedure PropertyError;\r\n procedure ReadData(Instance: TComponent);\r\n property PropName: string read FPropName;\r\n property CanHandleExceptions: Boolean read FCanHandleExcepts;\r\n function CreateDriver(Stream: TStream): TAbstractObjectReader; virtual;\r\n public\r\n constructor Create(Stream: TStream);\r\n destructor Destroy; override;\r\n Procedure FlushBuffer; override;\r\n procedure BeginReferences;\r\n procedure CheckValue(Value: TValueType);\r\n procedure DefineProperty(const Name: string;\r\n AReadData: TReaderProc; WriteData: TWriterProc;\r\n HasData: Boolean); override;\r\n procedure DefineBinaryProperty(const Name: string;\r\n AReadData, WriteData: TStreamProc;\r\n HasData: Boolean); override;\r\n function EndOfList: Boolean;\r\n procedure EndReferences;\r\n procedure FixupReferences;\r\n function NextValue: TValueType;\r\n //Please don't use read, better use ReadBinary whenever possible\r\n //uuups, ReadBinary is protected ..\r\n procedure Read(var Buffer : TBytes; Count: LongInt); virtual;\r\n\r\n function ReadBoolean: Boolean;\r\n function ReadChar: Char;\r\n function ReadWideChar: WideChar;\r\n function ReadUnicodeChar: UnicodeChar;\r\n procedure ReadCollection(Collection: TCollection);\r\n function ReadComponent(Component: TComponent): TComponent;\r\n procedure ReadComponents(AOwner, AParent: TComponent;\r\n Proc: TReadComponentsProc);\r\n function ReadFloat: Extended;\r\n function ReadCurrency: Currency;\r\n function ReadIdent: string;\r\n function ReadInteger: Longint;\r\n function ReadNativeInt: NativeInt;\r\n function ReadSet(EnumType: Pointer): Integer;\r\n procedure ReadListBegin;\r\n procedure ReadListEnd;\r\n function ReadRootComponent(ARoot: TComponent): TComponent;\r\n function ReadVariant: JSValue;\r\n procedure ReadSignature;\r\n function ReadString: string;\r\n function ReadWideString: WideString;\r\n function ReadUnicodeString: UnicodeString;\r\n function ReadValue: TValueType;\r\n procedure CopyValue(Writer: TWriter);\r\n property Driver: TAbstractObjectReader read FDriver;\r\n property Owner: TComponent read FOwner write FOwner;\r\n property Parent: TComponent read FParent write FParent;\r\n property OnError: TReaderError read FOnError write FOnError;\r\n property OnPropertyNotFound: TPropertyNotFoundEvent read FOnPropertyNotFound write FOnPropertyNotFound;\r\n property OnFindMethod: TFindMethodEvent read FOnFindMethod write FOnFindMethod;\r\n property OnSetMethodProperty: TSetMethodPropertyEvent read FOnSetMethodProperty write FOnSetMethodProperty;\r\n property OnSetName: TSetNameEvent read FOnSetName write FOnSetName;\r\n property OnReferenceName: TReferenceNameEvent read FOnReferenceName write FOnReferenceName;\r\n property OnAncestorNotFound: TAncestorNotFoundEvent read FOnAncestorNotFound write FOnAncestorNotFound;\r\n property OnCreateComponent: TCreateComponentEvent read FOnCreateComponent write FOnCreateComponent;\r\n property OnFindComponentClass: TFindComponentClassEvent read FOnFindComponentClass write FOnFindComponentClass;\r\n property OnReadStringProperty: TReadWriteStringPropertyEvent read FOnReadStringProperty write FOnReadStringProperty;\r\n end;\r\n\r\n\r\n { TAbstractObjectWriter }\r\n\r\n TAbstractObjectWriter = class\r\n public\r\n { Begin/End markers. Those ones who don't have an end indicator, use\r\n \"EndList\", after the occurrence named in the comment. Note that this\r\n only counts for \"EndList\" calls on the same level; each BeginXXX call\r\n increases the current level. }\r\n procedure BeginCollection; virtual; abstract; { Ends with the next \"EndList\" }\r\n procedure BeginComponent(Component: TComponent; Flags: TFilerFlags;\r\n ChildPos: Integer); virtual; abstract; { Ends after the second \"EndList\" }\r\n procedure WriteSignature; virtual; abstract;\r\n procedure BeginList; virtual; abstract;\r\n procedure EndList; virtual; abstract;\r\n procedure BeginProperty(const PropName: String); virtual; abstract;\r\n procedure EndProperty; virtual; abstract;\r\n //Please don't use write, better use WriteBinary whenever possible\r\n procedure Write(const Buffer : TBytes; Count: Longint); virtual;abstract;\r\n Procedure FlushBuffer; virtual; abstract;\r\n\r\n procedure WriteBinary(const Buffer : TBytes; Count: Longint); virtual; abstract;\r\n procedure WriteBoolean(Value: Boolean); virtual; abstract;\r\n // procedure WriteChar(Value: Char);\r\n procedure WriteFloat(const Value: Extended); virtual; abstract;\r\n procedure WriteCurrency(const Value: Currency); virtual; abstract;\r\n procedure WriteIdent(const Ident: string); virtual; abstract;\r\n procedure WriteInteger(Value: NativeInt); virtual; abstract;\r\n procedure WriteNativeInt(Value: NativeInt); virtual; abstract;\r\n procedure WriteVariant(const Value: JSValue); virtual; abstract;\r\n procedure WriteMethodName(const Name: String); virtual; abstract;\r\n procedure WriteSet(Value: LongInt; SetType: Pointer); virtual; abstract;\r\n procedure WriteString(const Value: String); virtual; abstract;\r\n procedure WriteWideString(const Value: WideString);virtual;abstract;\r\n procedure WriteUnicodeString(const Value: UnicodeString);virtual;abstract;\r\n end;\r\n\r\n { TBinaryObjectWriter }\r\n\r\n TBinaryObjectWriter = class(TAbstractObjectWriter)\r\n protected\r\n FStream: TStream;\r\n FBuffer: Pointer;\r\n FBufSize: Integer;\r\n FBufPos: Integer;\r\n FBufEnd: Integer;\r\n procedure WriteWord(w : word);\r\n procedure WriteDWord(lw : longword);\r\n procedure WriteValue(Value: TValueType);\r\n public\r\n constructor Create(Stream: TStream);\r\n procedure WriteSignature; override;\r\n procedure BeginCollection; override;\r\n procedure BeginComponent(Component: TComponent; Flags: TFilerFlags;\r\n ChildPos: Integer); override;\r\n procedure BeginList; override;\r\n procedure EndList; override;\r\n procedure BeginProperty(const PropName: String); override;\r\n procedure EndProperty; override;\r\n Procedure FlushBuffer; override;\r\n\r\n //Please don't use write, better use WriteBinary whenever possible\r\n procedure Write(const Buffer : TBytes; Count: Longint); override;\r\n procedure WriteBinary(const Buffer : TBytes; Count: LongInt); override;\r\n procedure WriteBoolean(Value: Boolean); override;\r\n procedure WriteFloat(const Value: Extended); override;\r\n procedure WriteCurrency(const Value: Currency); override;\r\n procedure WriteIdent(const Ident: string); override;\r\n procedure WriteInteger(Value: NativeInt); override;\r\n procedure WriteNativeInt(Value: NativeInt); override;\r\n procedure WriteMethodName(const Name: String); override;\r\n procedure WriteSet(Value: LongInt; SetType: Pointer); override;\r\n procedure WriteStr(const Value: String);\r\n procedure WriteString(const Value: String); override;\r\n procedure WriteWideString(const Value: WideString); override;\r\n procedure WriteUnicodeString(const Value: UnicodeString); override;\r\n procedure WriteVariant(const VarValue: JSValue);override;\r\n end;\r\n\r\n TFindAncestorEvent = procedure (Writer: TWriter; Component: TComponent;\r\n const Name: string; var Ancestor, RootAncestor: TComponent) of object;\r\n TWriteMethodPropertyEvent = procedure (Writer: TWriter; Instance: TPersistent;\r\n PropInfo: TTypeMemberProperty;\r\n const MethodValue, DefMethodValue: TMethod;\r\n var Handled: boolean) of object;\r\n\r\n { TWriter }\r\n\r\n TWriter = class(TFiler)\r\n private\r\n FDriver: TAbstractObjectWriter;\r\n FDestroyDriver: Boolean;\r\n FRootAncestor: TComponent;\r\n FPropPath: String;\r\n FAncestors: TStringList;\r\n FAncestorPos: Integer;\r\n FCurrentPos: Integer;\r\n FOnFindAncestor: TFindAncestorEvent;\r\n FOnWriteMethodProperty: TWriteMethodPropertyEvent;\r\n FOnWriteStringProperty:TReadWriteStringPropertyEvent;\r\n procedure AddToAncestorList(Component: TComponent);\r\n procedure WriteComponentData(Instance: TComponent);\r\n Procedure DetermineAncestor(Component: TComponent);\r\n procedure DoFindAncestor(Component : TComponent);\r\n protected\r\n procedure SetRoot(ARoot: TComponent); override;\r\n procedure WriteBinary(AWriteData: TStreamProc);\r\n procedure WriteProperty(Instance: TPersistent; PropInfo: TTypeMemberProperty);\r\n procedure WriteProperties(Instance: TPersistent);\r\n procedure WriteChildren(Component: TComponent);\r\n function CreateDriver(Stream: TStream): TAbstractObjectWriter; virtual;\r\n public\r\n constructor Create(ADriver: TAbstractObjectWriter);\r\n constructor Create(Stream: TStream);\r\n destructor Destroy; override;\r\n procedure DefineProperty(const Name: string;\r\n ReadData: TReaderProc; AWriteData: TWriterProc;\r\n HasData: Boolean); override;\r\n procedure DefineBinaryProperty(const Name: string;\r\n ReadData, AWriteData: TStreamProc;\r\n HasData: Boolean); override;\r\n Procedure FlushBuffer; override;\r\n procedure Write(const Buffer : TBytes; Count: Longint); virtual;\r\n procedure WriteBoolean(Value: Boolean);\r\n procedure WriteCollection(Value: TCollection);\r\n procedure WriteComponent(Component: TComponent);\r\n procedure WriteChar(Value: Char);\r\n procedure WriteWideChar(Value: WideChar);\r\n procedure WriteDescendent(ARoot: TComponent; AAncestor: TComponent);\r\n procedure WriteFloat(const Value: Extended);\r\n procedure WriteCurrency(const Value: Currency);\r\n procedure WriteIdent(const Ident: string);\r\n procedure WriteInteger(Value: Longint); overload;\r\n procedure WriteInteger(Value: NativeInt); overload;\r\n procedure WriteSet(Value: LongInt; SetType: Pointer);\r\n procedure WriteListBegin;\r\n procedure WriteListEnd;\r\n Procedure WriteSignature;\r\n procedure WriteRootComponent(ARoot: TComponent);\r\n procedure WriteString(const Value: string);\r\n procedure WriteWideString(const Value: WideString);\r\n procedure WriteUnicodeString(const Value: UnicodeString);\r\n procedure WriteVariant(const VarValue: JSValue);\r\n property RootAncestor: TComponent read FRootAncestor write FRootAncestor;\r\n property OnFindAncestor: TFindAncestorEvent read FOnFindAncestor write FOnFindAncestor;\r\n property OnWriteMethodProperty: TWriteMethodPropertyEvent read FOnWriteMethodProperty write FOnWriteMethodProperty;\r\n property OnWriteStringProperty: TReadWriteStringPropertyEvent read FOnWriteStringProperty write FOnWriteStringProperty;\r\n\r\n property Driver: TAbstractObjectWriter read FDriver;\r\n property PropertyPath: string read FPropPath;\r\n end;\r\n\r\n TParserToken = (toUnknown, // everything else\r\n toEOF, // EOF\r\n toSymbol, // Symbol (identifier)\r\n toString, // ''string''\r\n toInteger, // 123\r\n toFloat, // 12.3\r\n toMinus, // -\r\n toSetStart, // [\r\n toListStart, // (\r\n toCollectionStart, // <\r\n toBinaryStart, // {\r\n toSetEnd, // ]\r\n toListEnd, // )\r\n toCollectionEnd, // >\r\n toBinaryEnd, // }\r\n toComma, // ,\r\n toDot, // .\r\n toEqual, // =\r\n toColon, // :\r\n toPlus // +\r\n );\r\n\r\n TParser = class(TObject)\r\n private\r\n fStream : TStream;\r\n fBuf : Array of Char;\r\n FBufLen : integer;\r\n fPos : integer;\r\n fDeltaPos : integer;\r\n fFloatType : char;\r\n fSourceLine : integer;\r\n fToken : TParserToken;\r\n fEofReached : boolean;\r\n fLastTokenStr : string;\r\n function GetTokenName(aTok : TParserToken) : string;\r\n procedure LoadBuffer;\r\n procedure CheckLoadBuffer; {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}\r\n procedure ProcessChar; {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}\r\n function IsNumber : boolean; {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}\r\n function IsHexNum : boolean; {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}\r\n function IsAlpha : boolean; {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}\r\n function IsAlphaNum : boolean; {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}\r\n function GetHexValue(c : char) : byte; {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}\r\n function GetAlphaNum : string;\r\n procedure HandleNewLine;\r\n procedure SkipBOM;\r\n procedure SkipSpaces;\r\n procedure SkipWhitespace;\r\n procedure HandleEof;\r\n procedure HandleAlphaNum;\r\n procedure HandleNumber;\r\n procedure HandleHexNumber;\r\n function HandleQuotedString : string;\r\n Function HandleDecimalCharacter: char;\r\n procedure HandleString;\r\n procedure HandleMinus;\r\n procedure HandleUnknown;\r\n procedure GotoToNextChar;\r\n public\r\n // Input stream is expected to be UTF16 !\r\n constructor Create(Stream: TStream);\r\n destructor Destroy; override;\r\n procedure CheckToken(T: TParserToken);\r\n procedure CheckTokenSymbol(const S: string);\r\n procedure Error(const Ident: string);\r\n procedure ErrorFmt(const Ident: string; const Args: array of JSValue);\r\n procedure ErrorStr(const Message: string);\r\n procedure HexToBinary(Stream: TStream);\r\n function NextToken: TParserToken;\r\n function SourcePos: Longint;\r\n function TokenComponentIdent: string;\r\n function TokenFloat: Double;\r\n function TokenInt: NativeInt;\r\n function TokenString: string;\r\n function TokenSymbolIs(const S: string): Boolean;\r\n property FloatType: Char read fFloatType;\r\n property SourceLine: Integer read fSourceLine;\r\n property Token: TParserToken read fToken;\r\n end;\r\n\r\n\r\n { TObjectStreamConverter }\r\n\r\n TObjectTextEncoding = (oteDFM,oteLFM);\r\n\r\n TObjectStreamConverter = Class\r\n private\r\n FIndent: String;\r\n FInput : TStream;\r\n FOutput : TStream;\r\n FEncoding : TObjectTextEncoding;\r\n Private\r\n // Low level writing\r\n procedure OutLn(s: String); virtual;\r\n procedure OutStr(s: String); virtual;\r\n procedure OutString(s: String); virtual;\r\n // Low level reading\r\n function ReadWord: word;\r\n function ReadDWord: longword;\r\n function ReadDouble: Double;\r\n function ReadInt(ValueType: TValueType): NativeInt;\r\n function ReadInt: NativeInt;\r\n function ReadNativeInt: NativeInt;\r\n function ReadStr: String;\r\n function ReadString(StringType: TValueType): String; virtual;\r\n // High-level\r\n procedure ProcessBinary; virtual;\r\n procedure ProcessValue(ValueType: TValueType; Indent: String); virtual;\r\n procedure ReadObject(indent: String); virtual;\r\n procedure ReadPropList(indent: String); virtual;\r\n Public\r\n procedure ObjectBinaryToText(aInput, aOutput: TStream);\r\n procedure ObjectBinaryToText(aInput, aOutput: TStream; aEncoding: TObjectTextEncoding);\r\n Procedure Execute;\r\n Property Input : TStream Read FInput Write FInput;\r\n Property Output : TStream Read Foutput Write FOutput;\r\n Property Encoding : TObjectTextEncoding Read FEncoding Write FEncoding;\r\n Property Indent : String Read FIndent Write Findent;\r\n end;\r\n\r\n { TObjectTextConverter }\r\n\r\n TObjectTextConverter = Class\r\n private\r\n FParser: TParser;\r\n private\r\n FInput: TStream;\r\n Foutput: TStream;\r\n procedure WriteDouble(e: double);\r\n procedure WriteDWord(lw: longword);\r\n procedure WriteInteger(value: nativeInt);\r\n //procedure WriteLString(const s: String);\r\n procedure WriteQWord(q: nativeint);\r\n procedure WriteString(s: String);\r\n procedure WriteWord(w: word);\r\n procedure WriteWString(const s: WideString);\r\n procedure ProcessObject; virtual;\r\n procedure ProcessProperty; virtual;\r\n procedure ProcessValue; virtual;\r\n procedure ProcessWideString(const left: string);\r\n Property Parser : TParser Read FParser;\r\n Public\r\n // Input stream must be UTF16 !\r\n procedure ObjectTextToBinary(aInput, aOutput: TStream);\r\n Procedure Execute; virtual;\r\n Property Input : TStream Read FInput Write FInput;\r\n Property Output: TStream Read Foutput Write Foutput;\r\n end;\r\n\r\n TLoadHelper = Class (TObject)\r\n Public\r\n Type\r\n TTextLoadedCallBack = reference to procedure (const aText : String);\r\n TBytesLoadedCallBack = reference to procedure (const aBuffer : TJSArrayBuffer);\r\n TErrorCallBack = reference to procedure (const aError : String);\r\n Class Procedure LoadText(aURL : String; aSync : Boolean; OnLoaded : TTextLoadedCallBack; OnError : TErrorCallBack); virtual; abstract;\r\n Class Procedure LoadBytes(aURL : String; aSync : Boolean; OnLoaded : TBytesLoadedCallBack; OnError : TErrorCallBack); virtual; abstract;\r\n end;\r\n\r\n TLoadHelperClass = Class of TLoadHelper;\r\n\r\ntype\r\n TIdentMapEntry = record\r\n Value: Integer;\r\n Name: String;\r\n end;\r\n\r\n TIdentToInt = function(const Ident: string; var Int: Longint): Boolean;\r\n TIntToIdent = function(Int: Longint; var Ident: string): Boolean;\r\n TFindGlobalComponent = function(const Name: string): TComponent;\r\n TInitComponentHandler = function(Instance: TComponent; RootAncestor : TClass): boolean;\r\n\r\n// Start TMS extension----------------------------------------------------------\r\n\r\n TEncoding = class(TObject)\r\n strict private class var\r\n FANSI: TEncoding;\r\n FUnicode: TEncoding;\r\n FUTF7: TEncoding;\r\n FUTF8: TEncoding;\r\n FASCII: TEncoding;\r\n protected\r\n function GetEncoding: string; virtual;\r\n class function GetANSI: TEncoding;\r\n class function GetASCII: TEncoding;\r\n class function GetUTF7: TEncoding;\r\n class function GetUTF8: TEncoding;\r\n class function GetUnicode: TEncoding;\r\n public\r\n property Encoding: string read GetEncoding;\r\n class property ANSI: TEncoding read GetANSI;\r\n class property ASCII: TEncoding read GetASCII;\r\n class property UTF7: TEncoding read GetUTF7;\r\n class property UTF8: TEncoding read GetUTF8;\r\n class property Unicode: TEncoding read GetUnicode;\r\n end;\r\n\r\n TStringsHelper = class helper for TStrings\r\n public\r\n procedure LoadFromStream(Stream: TStream); overload;\r\n procedure LoadFromStream(Stream: TStream; Encoding: TEncoding); overload;\r\n procedure SaveToStream(Stream: TStream); overload;\r\n procedure SaveToStream(Stream: TStream; Encoding: TEncoding); overload;\r\n end;\r\n\r\n TANSIEncoding = class(TEncoding)\r\n protected\r\n function GetEncoding: string; override;\r\n end;\r\n\r\n TASCIIEncoding = class(TEncoding)\r\n protected\r\n function GetEncoding: string; override;\r\n end;\r\n\r\n TUTF7Encoding = class(TEncoding)\r\n protected\r\n function GetEncoding: string; override;\r\n end;\r\n\r\n TUTF8Encoding = class(TEncoding)\r\n protected\r\n function GetEncoding: string; override;\r\n end;\r\n\r\n TUnicodeEncoding = class(TEncoding)\r\n protected\r\n function GetEncoding: string; override;\r\n end;\r\n\r\n TPlatformIds = UInt32;\r\n\r\nconst\r\n TMSPlatformsWeb = 1;\r\n\r\ntype\r\n ComponentPlatformsAttribute = class(TCustomAttribute)\r\n private\r\n FPlatforms: TPlatformIds;\r\n public\r\n constructor Create(const Platforms: TPlatformIds);\r\n property Platforms: TPlatformIds read FPlatforms write FPlatforms;\r\n end;\r\n\r\n\r\n// End TMS extension------------------------------------------------------------\r\n\r\n\r\nprocedure RegisterInitComponentHandler(ComponentClass: TComponentClass; Handler: TInitComponentHandler);\r\nProcedure RegisterClass(AClass : TPersistentClass);\r\nProcedure RegisterClasses(AClasses : specialize TArray);\r\nFunction GetClass(AClassName : string) : TPersistentClass;\r\nprocedure RegisterFindGlobalComponentProc(AFindGlobalComponent: TFindGlobalComponent);\r\nprocedure UnregisterFindGlobalComponentProc(AFindGlobalComponent: TFindGlobalComponent);\r\nfunction FindGlobalComponent(const Name: string): TComponent;\r\nFunction FindNestedComponent(Root : TComponent; APath : String; CStyle : Boolean = True) : TComponent;\r\nprocedure RedirectFixupReferences(Root: TComponent; const OldRootName, NewRootName: string);\r\nprocedure RemoveFixupReferences(Root: TComponent; const RootName: string);\r\nprocedure RegisterIntegerConsts(IntegerType: Pointer; IdentToIntFn: TIdentToInt; IntToIdentFn: TIntToIdent);\r\nfunction IdentToInt(const Ident: string; out Int: Longint; const Map: array of TIdentMapEntry): Boolean;\r\nfunction IntToIdent(Int: Longint; var Ident: string; const Map: array of TIdentMapEntry): Boolean;\r\nfunction FindIntToIdent(AIntegerType: Pointer): TIntToIdent;\r\nfunction FindIdentToInt(AIntegerType: Pointer): TIdentToInt;\r\nfunction FindClass(const AClassName: string): TPersistentClass;\r\nfunction CollectionsEqual(C1, C2: TCollection): Boolean;\r\nfunction CollectionsEqual(C1, C2: TCollection; Owner1, Owner2: TComponent): Boolean;\r\nprocedure GetFixupReferenceNames(Root: TComponent; Names: TStrings);\r\nprocedure GetFixupInstanceNames(Root: TComponent; const ReferenceRootName: string; Names: TStrings);\r\nprocedure ObjectBinaryToText(aInput, aOutput: TStream);\r\nprocedure ObjectBinaryToText(aInput, aOutput: TStream; aEncoding: TObjectTextEncoding);\r\nprocedure ObjectTextToBinary(aInput, aOutput: TStream);\r\nFunction SetLoadHelperClass(aClass : TLoadHelperClass) : TLoadHelperClass;\r\n\r\nConst\r\n // Some aliases\r\n vaSingle = vaDouble;\r\n vaExtended = vaDouble;\r\n vaLString = vaString;\r\n vaUTF8String = vaString;\r\n vaUString = vaString;\r\n vaWString = vaString;\r\n vaQWord = vaNativeInt;\r\n vaInt64 = vaNativeInt;\r\n toWString = toString;\r\n\r\nimplementation\r\n\r\nuses simplelinkedlist, web;\r\n\r\nvar\r\n GlobalLoaded,\r\n IntConstList: TFPList;\r\n GlobalLoadHelper : TLoadHelperClass;\r\n\r\n\r\ntype\r\n TReqLoadProc = reference to procedure(AResponse: string);\r\n TReqErrorProc = reference to procedure;\r\n\r\n\r\nFunction SetLoadHelperClass(aClass : TLoadHelperClass) : TLoadHelperClass;\r\n\r\nbegin\r\n Result:=GlobalLoadHelper;\r\n GlobalLoadHelper:=aClass;\r\nend;\r\n\r\nProcedure CheckLoadHelper;\r\n\r\nbegin\r\n If (GlobalLoadHelper=Nil) then\r\n Raise EInOutError.Create('No support for loading URLS. Include Rtl.BrowserLoadHelper in your project uses clause');\r\nend;\r\n\r\nFunction StringToBuffer(aString : String; aLen : Integer) : TJSArrayBuffer;\r\n\r\nvar\r\n I : Integer;\r\n\r\nbegin\r\n Result:=TJSArrayBuffer.new(aLen*2);// 2 bytes for each char\r\n With TJSUint16Array.new(Result) do\r\n for i:=0 to aLen-1 do\r\n values[i] := TJSString(aString).charCodeAt(i);\r\nend;\r\n\r\nfunction BufferToString(aBuffer: TJSArrayBuffer; aPos, aLen: Integer): String;\r\n\r\nvar\r\n a : TJSUint16Array;\r\n\r\nbegin\r\n Result:=''; // Silence warning\r\n a:=TJSUint16Array.New(aBuffer.slice(aPos,aLen));\r\n if a<>nil then\r\n Result:=String(TJSFunction(@TJSString.fromCharCode).apply(nil,TJSValueDynArray(JSValue(a))));\r\nend;\r\n\r\n\r\ntype\r\n TIntConst = class\r\n Private\r\n IntegerType: PTypeInfo; // The integer type RTTI pointer\r\n IdentToIntFn: TIdentToInt; // Identifier to Integer conversion\r\n IntToIdentFn: TIntToIdent; // Integer to Identifier conversion\r\n Public\r\n constructor Create(AIntegerType: PTypeInfo; AIdentToInt: TIdentToInt;\r\n AIntToIdent: TIntToIdent);\r\n end;\r\n\r\n{ TStringStream }\r\n\r\nfunction TStringStream.GetDataString: String;\r\nvar\r\n a : TJSUint16Array;\r\nbegin\r\n Result:=''; // Silence warning\r\n a:=TJSUint16Array.New(Memory.slice(0,Size));\r\n if a<>nil then\r\n asm\r\n // Result=String.fromCharCode.apply(null, new Uint16Array(a));\r\n Result=String.fromCharCode.apply(null, a);\r\n end;\r\nend;\r\n\r\nconstructor TStringStream.Create;\r\nbegin\r\n Create('');\r\nend;\r\n\r\nconstructor TStringStream.Create(const aString: String);\r\n\r\n// function StrToBuf(aLen : Integer) : TJSArrayBuffer;\r\n//\r\n// var\r\n// I : Integer;\r\n//\r\n// begin\r\n// Result:=TJSArrayBuffer.new(aLen*2);// 2 bytes for each char\r\n// With TJSUint16Array.new(Result) do\r\n// for i:=0 to aLen-1 do\r\n// values[i] := TJSString(aString).charCodeAt(i);\r\n// end;\r\n\r\nvar\r\n Len : Integer;\r\n\r\nbegin\r\n inherited Create;\r\n Len:=Length(aString);\r\n SetPointer(StringToBuffer(aString,Len),Len*2);\r\n FCapacity:=Len*2;\r\nend;\r\n\r\nfunction TStringStream.ReadString(Count: Integer): string;\r\n\r\n\r\nVar\r\n B : TBytes;\r\n Buf : TJSArrayBuffer;\r\n BytesLeft : Integer;\r\n\r\nbegin\r\n // Top off\r\n BytesLeft:=(Size-Position);\r\n if BytesLeftc2.classtype) or\r\n (c1.count<>c2.count) then\r\n exit;\r\n if c1.count = 0 then\r\n begin\r\n result:= true;\r\n exit;\r\n end;\r\n s2:=Nil;\r\n s1:=tbytesstream.create;\r\n try\r\n s2:=tbytesstream.create;\r\n stream_collection(s1,c1,owner1);\r\n stream_collection(s2,c2,owner2);\r\n result:=(s1.size=s2.size);\r\n if Result then\r\n begin\r\n b1:=S1.Bytes;\r\n b2:=S2.Bytes;\r\n I:=0;\r\n Len:=S1.Size; // Not length of B\r\n While Result and (Inil) then\r\n GetOwner.GetInterface(IInterface, FOwnerInterface);\r\nend;\r\n\r\n{ TComponentEnumerator }\r\n\r\nconstructor TComponentEnumerator.Create(AComponent: TComponent);\r\nbegin\r\n inherited Create;\r\n FComponent := AComponent;\r\n FPosition := -1;\r\nend;\r\n\r\nfunction TComponentEnumerator.GetCurrent: TComponent;\r\nbegin\r\n Result := FComponent.Components[FPosition];\r\nend;\r\n\r\nfunction TComponentEnumerator.MoveNext: Boolean;\r\nbegin\r\n Inc(FPosition);\r\n Result := FPosition < FComponent.ComponentCount;\r\nend;\r\n\r\n{ TListEnumerator }\r\n\r\nconstructor TListEnumerator.Create(AList: TList);\r\nbegin\r\n inherited Create;\r\n FList := AList;\r\n FPosition := -1;\r\nend;\r\n\r\nfunction TListEnumerator.GetCurrent: JSValue;\r\nbegin\r\n Result := FList[FPosition];\r\nend;\r\n\r\nfunction TListEnumerator.MoveNext: Boolean;\r\nbegin\r\n Inc(FPosition);\r\n Result := FPosition < FList.Count;\r\nend;\r\n\r\n{ TFPListEnumerator }\r\n\r\nconstructor TFPListEnumerator.Create(AList: TFPList);\r\nbegin\r\n inherited Create;\r\n FList := AList;\r\n FPosition := -1;\r\nend;\r\n\r\nfunction TFPListEnumerator.GetCurrent: JSValue;\r\nbegin\r\n Result := FList[FPosition];\r\nend;\r\n\r\nfunction TFPListEnumerator.MoveNext: Boolean;\r\nbegin\r\n Inc(FPosition);\r\n Result := FPosition < FList.Count;\r\nend;\r\n\r\n{ TFPList }\r\n\r\nprocedure TFPList.CopyMove(aList: TFPList);\r\nvar r : integer;\r\nbegin\r\n Clear;\r\n for r := 0 to aList.count-1 do\r\n Add(aList[r]);\r\nend;\r\n\r\nprocedure TFPList.MergeMove(aList: TFPList);\r\nvar r : integer;\r\nbegin\r\n For r := 0 to aList.count-1 do\r\n if IndexOf(aList[r]) < 0 then\r\n Add(aList[r]);\r\nend;\r\n\r\nprocedure TFPList.DoCopy(ListA, ListB: TFPList);\r\nbegin\r\n if Assigned(ListB) then\r\n CopyMove(ListB)\r\n else\r\n CopyMove(ListA);\r\nend;\r\n\r\nprocedure TFPList.DoSrcUnique(ListA, ListB: TFPList);\r\nvar r : integer;\r\nbegin\r\n if Assigned(ListB) then\r\n begin\r\n Clear;\r\n for r := 0 to ListA.Count-1 do\r\n if ListB.IndexOf(ListA[r]) < 0 then\r\n Add(ListA[r]);\r\n end\r\n else\r\n begin\r\n for r := Count-1 downto 0 do\r\n if ListA.IndexOf(Self[r]) >= 0 then\r\n Delete(r);\r\n end;\r\nend;\r\n\r\nprocedure TFPList.DoAnd(ListA, ListB: TFPList);\r\nvar r : integer;\r\nbegin\r\n if Assigned(ListB) then\r\n begin\r\n Clear;\r\n for r := 0 to ListA.count-1 do\r\n if ListB.IndexOf(ListA[r]) >= 0 then\r\n Add(ListA[r]);\r\n end\r\n else\r\n begin\r\n for r := Count-1 downto 0 do\r\n if ListA.IndexOf(Self[r]) < 0 then\r\n Delete(r);\r\n end;\r\nend;\r\n\r\nprocedure TFPList.DoDestUnique(ListA, ListB: TFPList);\r\n\r\n procedure MoveElements(Src, Dest: TFPList);\r\n var r : integer;\r\n begin\r\n Clear;\r\n for r := 0 to Src.count-1 do\r\n if Dest.IndexOf(Src[r]) < 0 then\r\n self.Add(Src[r]);\r\n end;\r\n\r\nvar Dest : TFPList;\r\nbegin\r\n if Assigned(ListB) then\r\n MoveElements(ListB, ListA)\r\n else\r\n Dest := TFPList.Create;\r\n try\r\n Dest.CopyMove(Self);\r\n MoveElements(ListA, Dest)\r\n finally\r\n Dest.Destroy;\r\n end;\r\nend;\r\n\r\nprocedure TFPList.DoOr(ListA, ListB: TFPList);\r\nbegin\r\n if Assigned(ListB) then\r\n begin\r\n CopyMove(ListA);\r\n MergeMove(ListB);\r\n end\r\n else\r\n MergeMove(ListA);\r\nend;\r\n\r\nprocedure TFPList.DoXOr(ListA, ListB: TFPList);\r\nvar\r\n r : integer;\r\n l : TFPList;\r\nbegin\r\n if Assigned(ListB) then\r\n begin\r\n Clear;\r\n for r := 0 to ListA.Count-1 do\r\n if ListB.IndexOf(ListA[r]) < 0 then\r\n Add(ListA[r]);\r\n for r := 0 to ListB.Count-1 do\r\n if ListA.IndexOf(ListB[r]) < 0 then\r\n Add(ListB[r]);\r\n end\r\n else\r\n begin\r\n l := TFPList.Create;\r\n try\r\n l.CopyMove(Self);\r\n for r := Count-1 downto 0 do\r\n if listA.IndexOf(Self[r]) >= 0 then\r\n Delete(r);\r\n for r := 0 to ListA.Count-1 do\r\n if l.IndexOf(ListA[r]) < 0 then\r\n Add(ListA[r]);\r\n finally\r\n l.Destroy;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TFPList.Get(Index: Integer): JSValue;\r\nbegin\r\n If (Index < 0) or (Index >= FCount) then\r\n RaiseIndexError(Index);\r\n Result:=FList[Index];\r\nend;\r\n\r\nprocedure TFPList.Put(Index: Integer; Item: JSValue);\r\nbegin\r\n if (Index < 0) or (Index >= FCount) then\r\n RaiseIndexError(Index);\r\n FList[Index] := Item;\r\nend;\r\n\r\nprocedure TFPList.SetCapacity(NewCapacity: Integer);\r\nbegin\r\n If (NewCapacity < FCount) then\r\n Error (SListCapacityError, str(NewCapacity));\r\n if NewCapacity = FCapacity then\r\n exit;\r\n SetLength(FList,NewCapacity);\r\n FCapacity := NewCapacity;\r\nend;\r\n\r\nprocedure TFPList.SetCount(NewCount: Integer);\r\nbegin\r\n if (NewCount < 0) then\r\n Error(SListCountError, str(NewCount));\r\n If NewCount > FCount then\r\n begin\r\n If NewCount > FCapacity then\r\n SetCapacity(NewCount);\r\n end;\r\n FCount := NewCount;\r\nend;\r\n\r\nprocedure TFPList.RaiseIndexError(Index: Integer);\r\nbegin\r\n Error(SListIndexError, str(Index));\r\nend;\r\n\r\ndestructor TFPList.Destroy;\r\nbegin\r\n Clear;\r\n inherited Destroy;\r\nend;\r\n\r\nprocedure TFPList.AddList(AList: TFPList);\r\n\r\nVar\r\n I : Integer;\r\n\r\nbegin\r\n If (Capacity=FCount) then\r\n Error (SListIndexError, str(Index));\r\n FCount := FCount-1;\r\n System.Delete(FList,Index,1);\r\n Dec(FCapacity);\r\nend;\r\n\r\nclass procedure TFPList.Error(const Msg: string; const Data: String);\r\nbegin\r\n Raise EListError.CreateFmt(Msg,[Data]);\r\nend;\r\n\r\nprocedure TFPList.Exchange(Index1, Index2: Integer);\r\nvar\r\n Temp : JSValue;\r\nbegin\r\n If (Index1 >= FCount) or (Index1 < 0) then\r\n Error(SListIndexError, str(Index1));\r\n If (Index2 >= FCount) or (Index2 < 0) then\r\n Error(SListIndexError, str(Index2));\r\n Temp := FList[Index1];\r\n FList[Index1] := FList[Index2];\r\n FList[Index2] := Temp;\r\nend;\r\n\r\nfunction TFPList.Expand: TFPList;\r\nvar\r\n IncSize : Integer;\r\nbegin\r\n if FCount < FCapacity then exit(self);\r\n IncSize := 4;\r\n if FCapacity > 3 then IncSize := IncSize + 4;\r\n if FCapacity > 8 then IncSize := IncSize+8;\r\n if FCapacity > 127 then Inc(IncSize, FCapacity shr 2);\r\n SetCapacity(FCapacity + IncSize);\r\n Result := Self;\r\nend;\r\n\r\nfunction TFPList.Extract(Item: JSValue): JSValue;\r\nvar\r\n i : Integer;\r\nbegin\r\n i := IndexOf(Item);\r\n if i >= 0 then\r\n begin\r\n Result := Item;\r\n Delete(i);\r\n end\r\n else\r\n Result := nil;\r\nend;\r\n\r\nfunction TFPList.First: JSValue;\r\nbegin\r\n If FCount = 0 then\r\n Result := Nil\r\n else\r\n Result := Items[0];\r\nend;\r\n\r\nfunction TFPList.GetEnumerator: TFPListEnumerator;\r\nbegin\r\n Result:=TFPListEnumerator.Create(Self);\r\nend;\r\n\r\nfunction TFPList.IndexOf(Item: JSValue): Integer;\r\n\r\nVar\r\n C : Integer;\r\n\r\nbegin\r\n Result:=0;\r\n C:=Count;\r\n while (ResultItem) do\r\n Inc(Result);\r\n If Result>=C then\r\n Result:=-1;\r\n\r\nend;\r\n\r\nfunction TFPList.IndexOfItem(Item: JSValue; Direction: TDirection): Integer;\r\n\r\nbegin\r\n if Direction=fromBeginning then\r\n Result:=IndexOf(Item)\r\n else\r\n begin\r\n Result:=Count-1;\r\n while (Result >=0) and (Flist[Result]<>Item) do\r\n Result:=Result - 1;\r\n end;\r\nend;\r\n\r\n\r\nprocedure TFPList.Insert(Index: Integer; Item: JSValue);\r\nbegin\r\n if (Index < 0) or (Index > FCount )then\r\n Error(SlistIndexError, str(Index));\r\n TJSArray(FList).splice(Index, 0, Item);\r\n inc(FCapacity);\r\n inc(FCount);\r\nend;\r\n\r\nfunction TFPList.Last: JSValue;\r\nbegin\r\n If FCount = 0 then\r\n Result := nil\r\n else\r\n Result := Items[FCount - 1];\r\nend;\r\n\r\nprocedure TFPList.Move(CurIndex, NewIndex: Integer);\r\nvar\r\n Temp: JSValue;\r\nbegin\r\n if (CurIndex < 0) or (CurIndex > Count - 1) then\r\n Error(SListIndexError, str(CurIndex));\r\n if (NewIndex < 0) or (NewIndex > Count -1) then\r\n Error(SlistIndexError, str(NewIndex));\r\n if CurIndex=NewIndex then exit;\r\n Temp:=FList[CurIndex];\r\n // ToDo: use TJSArray.copyWithin if available\r\n TJSArray(FList).splice(CurIndex,1);\r\n TJSArray(FList).splice(NewIndex,0,Temp);\r\nend;\r\n\r\nprocedure TFPList.Assign(ListA: TFPList; AOperator: TListAssignOp;\r\n ListB: TFPList);\r\nbegin\r\n case AOperator of\r\n laCopy : DoCopy (ListA, ListB); // replace dest with src\r\n laSrcUnique : DoSrcUnique (ListA, ListB); // replace dest with src that are not in dest\r\n laAnd : DoAnd (ListA, ListB); // remove from dest that are not in src\r\n laDestUnique: DoDestUnique (ListA, ListB);// remove from dest that are in src\r\n laOr : DoOr (ListA, ListB); // add to dest from src and not in dest\r\n laXOr : DoXOr (ListA, ListB); // add to dest from src and not in dest, remove from dest that are in src\r\n end;\r\nend;\r\n\r\nfunction TFPList.Remove(Item: JSValue): Integer;\r\nbegin\r\n Result := IndexOf(Item);\r\n If Result <> -1 then\r\n Delete(Result);\r\nend;\r\n\r\nprocedure TFPList.Pack;\r\nvar\r\n Dst, i: Integer;\r\n V: JSValue;\r\nbegin\r\n Dst:=0;\r\n for i:=0 to Count-1 do\r\n begin\r\n V:=FList[i];\r\n if not Assigned(V) then continue;\r\n FList[Dst]:=V;\r\n inc(Dst);\r\n end;\r\nend;\r\n\r\n// Needed by Sort method.\r\n\r\nProcedure QuickSort(aList: TJSValueDynArray; L, R : Longint;\r\n const Compare: TListSortCompareFunc\r\n );\r\nvar\r\n I, J, PivotIdx : SizeUInt;\r\n P, Q : JSValue;\r\nbegin\r\n repeat\r\n I := L;\r\n J := R;\r\n PivotIdx := L + ((R - L) shr 1); { same as ((L + R) div 2), but without the possibility of overflow }\r\n P := aList[PivotIdx];\r\n repeat\r\n while (I < PivotIdx) and (Compare(P, aList[i]) > 0) do\r\n Inc(I);\r\n while (J > PivotIdx) and (Compare(P, aList[J]) < 0) do\r\n Dec(J);\r\n if I < J then\r\n begin\r\n Q := aList[I];\r\n aList[I] := aList[J];\r\n aList[J] := Q;\r\n if PivotIdx = I then\r\n begin\r\n PivotIdx := J;\r\n Inc(I);\r\n end\r\n else if PivotIdx = J then\r\n begin\r\n PivotIdx := I;\r\n Dec(J);\r\n end\r\n else\r\n begin\r\n Inc(I);\r\n Dec(J);\r\n end;\r\n end;\r\n until I >= J;\r\n // sort the smaller range recursively\r\n // sort the bigger range via the loop\r\n // Reasons: memory usage is O(log(n)) instead of O(n) and loop is faster than recursion\r\n if (PivotIdx - L) < (R - PivotIdx) then\r\n begin\r\n if (L + 1) < PivotIdx then\r\n QuickSort(aList, L, PivotIdx - 1, Compare);\r\n L := PivotIdx + 1;\r\n end\r\n else\r\n begin\r\n if (PivotIdx + 1) < R then\r\n QuickSort(aList, PivotIdx + 1, R, Compare);\r\n if (L + 1) < PivotIdx then\r\n R := PivotIdx - 1\r\n else\r\n exit;\r\n end;\r\n until L >= R;\r\nend;\r\n\r\n(*\r\nProcedure QuickSort(aList: TJSValueDynArray; L, R : Longint;\r\n const Compare: TListSortCompareFunc);\r\nvar\r\n I, J : Longint;\r\n P, Q : JSValue;\r\nbegin\r\n repeat\r\n I := L;\r\n J := R;\r\n P := aList[ (L + R) div 2 ];\r\n repeat\r\n while Compare(P, aList[i]) > 0 do\r\n I := I + 1;\r\n while Compare(P, aList[J]) < 0 do\r\n J := J - 1;\r\n If I <= J then\r\n begin\r\n Q := aList[I];\r\n aList[I] := aList[J];\r\n aList[J] := Q;\r\n I := I + 1;\r\n J := J - 1;\r\n end;\r\n until I > J;\r\n // sort the smaller range recursively\r\n // sort the bigger range via the loop\r\n // Reasons: memory usage is O(log(n)) instead of O(n) and loop is faster than recursion\r\n if J - L < R - I then\r\n begin\r\n if L < J then\r\n QuickSort(aList, L, J, Compare);\r\n L := I;\r\n end\r\n else\r\n begin\r\n if I < R then\r\n QuickSort(aList, I, R, Compare);\r\n R := J;\r\n end;\r\n until L >= R;\r\nend;\r\n*)\r\n\r\nprocedure TFPList.Sort(const Compare: TListSortCompare);\r\nbegin\r\n if Not Assigned(FList) or (FCount < 2) then exit;\r\n QuickSort(Flist, 0, FCount-1,\r\n function(Item1, Item2: JSValue): Integer\r\n begin\r\n Result := Compare(Item1, Item2);\r\n end);\r\nend;\r\n\r\nprocedure TFPList.SortList(const Compare: TListSortCompareFunc);\r\nbegin\r\n if Not Assigned(FList) or (FCount < 2) then exit;\r\n QuickSort(Flist, 0, FCount-1, Compare);\r\nend;\r\n\r\nprocedure TFPList.ForEachCall(const proc2call: TListCallback; const arg: JSValue\r\n );\r\nvar\r\n i : integer;\r\n v : JSValue;\r\nbegin\r\n For I:=0 To Count-1 Do\r\n begin\r\n v:=FList[i];\r\n if Assigned(v) then\r\n proc2call(v,arg);\r\n end;\r\nend;\r\n\r\nprocedure TFPList.ForEachCall(const proc2call: TListStaticCallback;\r\n const arg: JSValue);\r\nvar\r\n i : integer;\r\n v : JSValue;\r\nbegin\r\n For I:=0 To Count-1 Do\r\n begin\r\n v:=FList[i];\r\n if Assigned(v) then\r\n proc2call(v,arg);\r\n end;\r\nend;\r\n\r\n{ TList }\r\n\r\nprocedure TList.CopyMove(aList: TList);\r\nvar\r\n r : integer;\r\nbegin\r\n Clear;\r\n for r := 0 to aList.count-1 do\r\n Add(aList[r]);\r\nend;\r\n\r\nprocedure TList.MergeMove(aList: TList);\r\nvar r : integer;\r\nbegin\r\n For r := 0 to aList.count-1 do\r\n if IndexOf(aList[r]) < 0 then\r\n Add(aList[r]);\r\nend;\r\n\r\nprocedure TList.DoCopy(ListA, ListB: TList);\r\nbegin\r\n if Assigned(ListB) then\r\n CopyMove(ListB)\r\n else\r\n CopyMove(ListA);\r\nend;\r\n\r\nprocedure TList.DoSrcUnique(ListA, ListB: TList);\r\nvar r : integer;\r\nbegin\r\n if Assigned(ListB) then\r\n begin\r\n Clear;\r\n for r := 0 to ListA.Count-1 do\r\n if ListB.IndexOf(ListA[r]) < 0 then\r\n Add(ListA[r]);\r\n end\r\n else\r\n begin\r\n for r := Count-1 downto 0 do\r\n if ListA.IndexOf(Self[r]) >= 0 then\r\n Delete(r);\r\n end;\r\nend;\r\n\r\nprocedure TList.DoAnd(ListA, ListB: TList);\r\nvar r : integer;\r\nbegin\r\n if Assigned(ListB) then\r\n begin\r\n Clear;\r\n for r := 0 to ListA.Count-1 do\r\n if ListB.IndexOf(ListA[r]) >= 0 then\r\n Add(ListA[r]);\r\n end\r\n else\r\n begin\r\n for r := Count-1 downto 0 do\r\n if ListA.IndexOf(Self[r]) < 0 then\r\n Delete(r);\r\n end;\r\nend;\r\n\r\nprocedure TList.DoDestUnique(ListA, ListB: TList);\r\n\r\n procedure MoveElements(Src, Dest : TList);\r\n var r : integer;\r\n begin\r\n Clear;\r\n for r := 0 to Src.Count-1 do\r\n if Dest.IndexOf(Src[r]) < 0 then\r\n Add(Src[r]);\r\n end;\r\n\r\nvar Dest : TList;\r\nbegin\r\n if Assigned(ListB) then\r\n MoveElements(ListB, ListA)\r\n else\r\n try\r\n Dest := TList.Create;\r\n Dest.CopyMove(Self);\r\n MoveElements(ListA, Dest)\r\n finally\r\n Dest.Destroy;\r\n end;\r\nend;\r\n\r\nprocedure TList.DoOr(ListA, ListB: TList);\r\nbegin\r\n if Assigned(ListB) then\r\n begin\r\n CopyMove(ListA);\r\n MergeMove(ListB);\r\n end\r\n else\r\n MergeMove(ListA);\r\nend;\r\n\r\nprocedure TList.DoXOr(ListA, ListB: TList);\r\nvar\r\n r : integer;\r\n l : TList;\r\nbegin\r\n if Assigned(ListB) then\r\n begin\r\n Clear;\r\n for r := 0 to ListA.Count-1 do\r\n if ListB.IndexOf(ListA[r]) < 0 then\r\n Add(ListA[r]);\r\n for r := 0 to ListB.Count-1 do\r\n if ListA.IndexOf(ListB[r]) < 0 then\r\n Add(ListB[r]);\r\n end\r\n else\r\n try\r\n l := TList.Create;\r\n l.CopyMove (Self);\r\n for r := Count-1 downto 0 do\r\n if listA.IndexOf(Self[r]) >= 0 then\r\n Delete(r);\r\n for r := 0 to ListA.Count-1 do\r\n if l.IndexOf(ListA[r]) < 0 then\r\n Add(ListA[r]);\r\n finally\r\n l.Destroy;\r\n end;\r\nend;\r\n\r\nfunction TList.Get(Index: Integer): JSValue;\r\nbegin\r\n Result := FList.Get(Index);\r\nend;\r\n\r\nprocedure TList.Put(Index: Integer; Item: JSValue);\r\nvar V : JSValue;\r\nbegin\r\n V := Get(Index);\r\n FList.Put(Index, Item);\r\n if Assigned(V) then\r\n Notify(V, lnDeleted);\r\n if Assigned(Item) then\r\n Notify(Item, lnAdded);\r\nend;\r\n\r\nprocedure TList.Notify(aValue: JSValue; Action: TListNotification);\r\nbegin\r\n if Assigned(aValue) then ;\r\n if Action=lnExtracted then ;\r\nend;\r\n\r\nprocedure TList.SetCapacity(NewCapacity: Integer);\r\nbegin\r\n FList.SetCapacity(NewCapacity);\r\nend;\r\n\r\nfunction TList.GetCapacity: integer;\r\nbegin\r\n Result := FList.Capacity;\r\nend;\r\n\r\nprocedure TList.SetCount(NewCount: Integer);\r\nbegin\r\n if NewCount < FList.Count then\r\n while FList.Count > NewCount do\r\n Delete(FList.Count - 1)\r\n else\r\n FList.SetCount(NewCount);\r\nend;\r\n\r\nfunction TList.GetCount: integer;\r\nbegin\r\n Result := FList.Count;\r\nend;\r\n\r\nfunction TList.GetList: TJSValueDynArray;\r\nbegin\r\n Result := FList.List;\r\nend;\r\n\r\nconstructor TList.Create;\r\nbegin\r\n inherited Create;\r\n FList := TFPList.Create;\r\nend;\r\n\r\ndestructor TList.Destroy;\r\nbegin\r\n if Assigned(FList) then\r\n Clear;\r\n FreeAndNil(FList);\r\nend;\r\n\r\nprocedure TList.AddList(AList: TList);\r\nvar\r\n I: Integer;\r\nbegin\r\n { this only does FList.AddList(AList.FList), avoiding notifications }\r\n FList.AddList(AList.FList);\r\n\r\n { make lnAdded notifications }\r\n for I := 0 to AList.Count - 1 do\r\n if Assigned(AList[I]) then\r\n Notify(AList[I], lnAdded);\r\nend;\r\n\r\nfunction TList.Add(Item: JSValue): Integer;\r\nbegin\r\n Result := FList.Add(Item);\r\n if Assigned(Item) then\r\n Notify(Item, lnAdded);\r\nend;\r\n\r\nprocedure TList.Clear;\r\nbegin\r\n While (FList.Count>0) do\r\n Delete(Count-1);\r\nend;\r\n\r\nprocedure TList.Delete(Index: Integer);\r\n\r\nvar V : JSValue;\r\n\r\nbegin\r\n V:=FList.Get(Index);\r\n FList.Delete(Index);\r\n if assigned(V) then\r\n Notify(V, lnDeleted);\r\nend;\r\n\r\nclass procedure TList.Error(const Msg: string; Data: String);\r\nbegin\r\n Raise EListError.CreateFmt(Msg,[Data]);\r\nend;\r\n\r\nprocedure TList.Exchange(Index1, Index2: Integer);\r\nbegin\r\n FList.Exchange(Index1, Index2);\r\nend;\r\n\r\nfunction TList.Expand: TList;\r\nbegin\r\n FList.Expand;\r\n Result:=Self;\r\nend;\r\n\r\nfunction TList.Extract(Item: JSValue): JSValue;\r\nvar c : integer;\r\nbegin\r\n c := FList.Count;\r\n Result := FList.Extract(Item);\r\n if c <> FList.Count then\r\n Notify (Result, lnExtracted);\r\nend;\r\n\r\nfunction TList.First: JSValue;\r\nbegin\r\n Result := FList.First;\r\nend;\r\n\r\nfunction TList.GetEnumerator: TListEnumerator;\r\nbegin\r\n Result:=TListEnumerator.Create(Self);\r\nend;\r\n\r\nfunction TList.IndexOf(Item: JSValue): Integer;\r\nbegin\r\n Result := FList.IndexOf(Item);\r\nend;\r\n\r\nprocedure TList.Insert(Index: Integer; Item: JSValue);\r\nbegin\r\n FList.Insert(Index, Item);\r\n if Assigned(Item) then\r\n Notify(Item,lnAdded);\r\nend;\r\n\r\nfunction TList.Last: JSValue;\r\nbegin\r\n Result := FList.Last;\r\nend;\r\n\r\nprocedure TList.Move(CurIndex, NewIndex: Integer);\r\nbegin\r\n FList.Move(CurIndex, NewIndex);\r\nend;\r\n\r\nprocedure TList.Assign(ListA: TList; AOperator: TListAssignOp; ListB: TList);\r\nbegin\r\n case AOperator of\r\n laCopy : DoCopy (ListA, ListB); // replace dest with src\r\n laSrcUnique : DoSrcUnique (ListA, ListB); // replace dest with src that are not in dest\r\n laAnd : DoAnd (ListA, ListB); // remove from dest that are not in src\r\n laDestUnique: DoDestUnique (ListA, ListB);// remove from dest that are in src\r\n laOr : DoOr (ListA, ListB); // add to dest from src and not in dest\r\n laXOr : DoXOr (ListA, ListB); // add to dest from src and not in dest, remove from dest that are in src\r\n end;\r\nend;\r\n\r\nfunction TList.Remove(Item: JSValue): Integer;\r\nbegin\r\n Result := IndexOf(Item);\r\n if Result <> -1 then\r\n Self.Delete(Result);\r\nend;\r\n\r\nprocedure TList.Pack;\r\nbegin\r\n FList.Pack;\r\nend;\r\n\r\nprocedure TList.Sort(const Compare: TListSortCompare);\r\nbegin\r\n FList.Sort(Compare);\r\nend;\r\n\r\nprocedure TList.SortList(const Compare: TListSortCompareFunc);\r\nbegin\r\n FList.SortList(Compare);\r\nend;\r\n\r\n{ TPersistent }\r\n\r\nprocedure TPersistent.AssignError(Source: TPersistent);\r\nvar\r\n SourceName: String;\r\nbegin\r\n if Source<>Nil then\r\n SourceName:=Source.ClassName\r\n else\r\n SourceName:='Nil';\r\n raise EConvertError.Create('Cannot assign a '+SourceName+' to a '+ClassName+'.');\r\nend;\r\n\r\nprocedure TPersistent.DefineProperties(Filer: TFiler);\r\nbegin\r\n if Filer=Nil then exit;\r\n // Do nothing\r\nend;\r\n\r\nprocedure TPersistent.AssignTo(Dest: TPersistent);\r\nbegin\r\n Dest.AssignError(Self);\r\nend;\r\n\r\nfunction TPersistent.GetOwner: TPersistent;\r\nbegin\r\n Result:=nil;\r\nend;\r\n\r\nprocedure TPersistent.Assign(Source: TPersistent);\r\nbegin\r\n If Source<>Nil then\r\n Source.AssignTo(Self)\r\n else\r\n AssignError(Nil);\r\nend;\r\n\r\nfunction TPersistent.GetNamePath: string;\r\nvar\r\n OwnerName: String;\r\n TheOwner: TPersistent;\r\nbegin\r\n Result:=ClassName;\r\n TheOwner:=GetOwner;\r\n if TheOwner<>Nil then\r\n begin\r\n OwnerName:=TheOwner.GetNamePath;\r\n if OwnerName<>'' then Result:=OwnerName+'.'+Result;\r\n end;\r\nend;\r\n\r\nprocedure TPersistent.SetEvent(const ALookupRoot: TPersistent; const APropName, AMethodName: string);\r\nbegin\r\n SetEvent(Self, ALookupRoot, APropName, AMethodName);\r\nend;\r\n\r\nprocedure TPersistent.SetEvent(const AInstance, ALookupRoot: TPersistent; const APropName, AMethodName: string);\r\nvar\r\n lMethod: TMethod;\r\nbegin\r\n lMethod.Code := ALookupRoot.MethodAddress(AMethodName);\r\n if lMethod.Code = nil then\r\n raise Exception.Create(ALookupRoot.ClassName +' has no published method \"'+ AMethodName + '\"');\r\n lMethod.Data := ALookupRoot;\r\n SetMethodProp(AInstance, APropName, lMethod);\r\nend;\r\n\r\n{\r\n This file is part of the Free Component Library (FCL)\r\n Copyright (c) 1999-2000 by the Free Pascal development team\r\n\r\n See the file COPYING.FPC, included in this distribution,\r\n for details about the copyright.\r\n\r\n This program is distributed in the hope that it will be useful,\r\n but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r\n\r\n **********************************************************************}\r\n\r\n{****************************************************************************}\r\n{* TStringsEnumerator *}\r\n{****************************************************************************}\r\n\r\nconstructor TStringsEnumerator.Create(AStrings: TStrings);\r\nbegin\r\n inherited Create;\r\n FStrings := AStrings;\r\n FPosition := -1;\r\nend;\r\n\r\nfunction TStringsEnumerator.GetCurrent: String;\r\nbegin\r\n Result := FStrings[FPosition];\r\nend;\r\n\r\nfunction TStringsEnumerator.MoveNext: Boolean;\r\nbegin\r\n Inc(FPosition);\r\n Result := FPosition < FStrings.Count;\r\nend;\r\n\r\n{****************************************************************************}\r\n{* TStrings *}\r\n{****************************************************************************}\r\n\r\n// Function to quote text. Should move maybe to sysutils !!\r\n// Also, it is not clear at this point what exactly should be done.\r\n\r\n{ //!! is used to mark unsupported things. }\r\n\r\n{\r\n For compatibility we can't add a Constructor to TSTrings to initialize\r\n the special characters. Therefore we add a routine which is called whenever\r\n the special chars are needed.\r\n}\r\n\r\nprocedure TStrings.CheckSpecialChars;\r\n\r\nbegin\r\n If Not FSpecialCharsInited then\r\n begin\r\n FQuoteChar:='\"';\r\n FDelimiter:=',';\r\n FNameValueSeparator:='=';\r\n FLBS:=DefaultTextLineBreakStyle;\r\n FSpecialCharsInited:=true;\r\n FLineBreak:=sLineBreak;\r\n end;\r\nend;\r\n\r\nfunction TStrings.GetSkipLastLineBreak: Boolean;\r\n\r\nbegin\r\n CheckSpecialChars;\r\n Result:=FSkipLastLineBreak;\r\nend;\r\n\r\nprocedure TStrings.SetSkipLastLineBreak(const AValue : Boolean);\r\n\r\nbegin\r\n CheckSpecialChars;\r\n FSkipLastLineBreak:=AValue;\r\nend;\r\n\r\nprocedure TStrings.ReadData(Reader: TReader);\r\nbegin\r\n Reader.ReadListBegin;\r\n BeginUpdate;\r\n try\r\n Clear;\r\n while not Reader.EndOfList do\r\n Add(Reader.ReadString);\r\n finally\r\n EndUpdate;\r\n end;\r\n Reader.ReadListEnd;\r\nend;\r\n\r\nprocedure TStrings.WriteData(Writer: TWriter);\r\nvar\r\n i: Integer;\r\nbegin\r\n Writer.WriteListBegin;\r\n for i := 0 to Count - 1 do\r\n Writer.WriteString(Strings[i]);\r\n Writer.WriteListEnd;\r\nend;\r\n\r\nprocedure TStrings.DefineProperties(Filer: TFiler);\r\nvar\r\n HasData: Boolean;\r\nbegin\r\n if Assigned(Filer.Ancestor) then\r\n // Only serialize if string list is different from ancestor\r\n if Filer.Ancestor.InheritsFrom(TStrings) then\r\n HasData := not Equals(TStrings(Filer.Ancestor))\r\n else\r\n HasData := True\r\n else\r\n HasData := Count > 0;\r\n Filer.DefineProperty('Strings', @ReadData, @WriteData, HasData);\r\nend;\r\n\r\nfunction TStrings.GetLBS: TTextLineBreakStyle;\r\nbegin\r\n CheckSpecialChars;\r\n Result:=FLBS;\r\nend;\r\n\r\nprocedure TStrings.SetLBS(AValue: TTextLineBreakStyle);\r\nbegin\r\n CheckSpecialChars;\r\n FLBS:=AValue;\r\nend;\r\n\r\nprocedure TStrings.SetDelimiter(c:Char);\r\nbegin\r\n CheckSpecialChars;\r\n FDelimiter:=c;\r\nend;\r\n\r\nfunction TStrings.GetDelimiter: Char;\r\nbegin\r\n CheckSpecialChars;\r\n Result:=FDelimiter;\r\nend;\r\n\r\nprocedure TStrings.SetLineBreak(const S: String);\r\nbegin\r\n CheckSpecialChars;\r\n FLineBreak:=S;\r\nend;\r\n\r\nfunction TStrings.GetLineBreak: String;\r\nbegin\r\n CheckSpecialChars;\r\n Result:=FLineBreak;\r\nend;\r\n\r\n\r\nprocedure TStrings.SetQuoteChar(c:Char);\r\nbegin\r\n CheckSpecialChars;\r\n FQuoteChar:=c;\r\nend;\r\n\r\nfunction TStrings.GetQuoteChar: Char;\r\nbegin\r\n CheckSpecialChars;\r\n Result:=FQuoteChar;\r\nend;\r\n\r\nprocedure TStrings.SetNameValueSeparator(c:Char);\r\nbegin\r\n CheckSpecialChars;\r\n FNameValueSeparator:=c;\r\nend;\r\n\r\nfunction TStrings.GetNameValueSeparator: Char;\r\nbegin\r\n CheckSpecialChars;\r\n Result:=FNameValueSeparator;\r\nend;\r\n\r\n\r\nfunction TStrings.GetCommaText: string;\r\n\r\nVar\r\n C1,C2 : Char;\r\n FSD : Boolean;\r\n\r\nbegin\r\n CheckSpecialChars;\r\n FSD:=StrictDelimiter;\r\n C1:=Delimiter;\r\n C2:=QuoteChar;\r\n Delimiter:=',';\r\n QuoteChar:='\"';\r\n StrictDelimiter:=False;\r\n Try\r\n Result:=GetDelimitedText;\r\n Finally\r\n Delimiter:=C1;\r\n QuoteChar:=C2;\r\n StrictDelimiter:=FSD;\r\n end;\r\nend;\r\n\r\n\r\nfunction TStrings.GetDelimitedText: string;\r\n\r\nVar\r\n I: integer;\r\n RE : string;\r\n S : String;\r\n doQuote : Boolean;\r\n\r\nbegin\r\n CheckSpecialChars;\r\n result:='';\r\n RE:=QuoteChar+'|'+Delimiter;\r\n if not StrictDelimiter then\r\n RE:=' |'+RE;\r\n RE:='/'+RE+'/';\r\n // Check for break characters and quote if required.\r\n For i:=0 to count-1 do\r\n begin\r\n S:=Strings[i];\r\n doQuote:=FAlwaysQuote or (TJSString(s).search(RE)<>-1);\r\n if DoQuote then\r\n Result:=Result+QuoteString(S,QuoteChar)\r\n else\r\n Result:=Result+S;\r\n if I0 then\r\n begin\r\n AName:=Copy(AValue,1,L-1);\r\n // System.Delete(AValue,1,L);\r\n AValue:=Copy(AValue,L+1,length(AValue)-L);\r\n end\r\n else\r\n AName:='';\r\nend;\r\n\r\nprocedure TStrings.LoadFromURL(const aURL: String; Async: Boolean; OnLoaded: TNotifyEventRef; OnError: TStringNotifyEventRef);\r\n\r\n procedure DoLoaded(const aString : String);\r\n begin\r\n Text:=aString;\r\n if Assigned(OnLoaded) then\r\n OnLoaded(Self);\r\n end;\r\n\r\n procedure DoError(const AError : String);\r\n begin\r\n if Assigned(OnError) then\r\n OnError(Self,aError)\r\n else\r\n Raise EInOutError.Create('Failed to load from URL:'+aError);\r\n end;\r\n\r\nbegin\r\n CheckLoadHelper;\r\n GlobalLoadHelper.LoadText(aURL,aSync,@DoLoaded,@DoError);\r\nend;\r\n\r\n{$HINTS OFF}\r\nfunction URLToArrayOfString(URL: string): TJSStringDynArray;\r\nvar\r\n a: TJSStringDynArray;\r\n cors_api_url: string;\r\nbegin\r\n cors_api_url := '';//'https://cors-anywhere.herokuapp.com/';\r\n asm\r\n var xhr = new XMLHttpRequest();\r\n xhr.open(\"GET\", cors_api_url + URL, false);\r\n xhr.send();\r\n\r\n if (xhr.status==200)\r\n {\r\n var obj = xhr.responseText.split(/\\r\\n|\\n/);\r\n for (var i = 0; i < obj.length; i++) {\r\n a.push(obj[i]);\r\n }\r\n }\r\n end;\r\n\r\n Result := a;\r\nend;\r\n{$HINTS ON}\r\n\r\nprocedure TStrings.LoadFromFile(const aFileName: String);\r\nvar\r\n a: TJSStringDynArray;\r\nbegin\r\n a := URLToArrayOfString(aFileName);\r\n AddStrings(a, True);\r\nend;\r\n\r\nprocedure TStrings.LoadFromFile(const aFileName: String; const OnLoaded: TProc; const AError: TProcString);\r\n\r\nbegin\r\n LoadFromURL(aFileName,False,\r\n Procedure (Sender : TObject)\r\n begin\r\n If Assigned(OnLoaded) then\r\n OnLoaded\r\n end,\r\n Procedure (Sender : TObject; Const ErrorMsg : String)\r\n begin\r\n if Assigned(aError) then\r\n aError(ErrorMsg)\r\n end);\r\nend;\r\n\r\nprocedure ReqAsync(AURL: string; LoadProc: TReqLoadProc; ErrorProc: TReqErrorProc);\r\nvar\r\n req: TJSXMLHttpRequest;\r\n\r\n function HandleResponse(Event: TEventListenerEvent): boolean;\r\n var\r\n s:string;\r\n status: integer;\r\n begin\r\n asm\r\n status = Event.target.status;\r\n s = Event.target.responseText;\r\n end;\r\n\r\n if status div 100 = 2 then\r\n LoadProc(s)\r\n else\r\n ErrorProc();\r\n Result := true;\r\n end;\r\n\r\n function HandleError(Event: TEventListenerEvent): boolean;\r\n begin\r\n ErrorProc();\r\n Result := true;\r\n end;\r\n\r\nbegin\r\n req := TJSXMLHttpRequest.new;\r\n req.addEventListener('load', @HandleResponse);\r\n req.addEventListener('abort',@HandleError);\r\n req.addEventListener('timeout',@HandleError);\r\n req.addEventListener('error',@HandleError);\r\n req.open('GET', AURL);\r\n req.send;\r\nend;\r\n\r\nfunction TStrings.LoadFromFileAsync(const aFileName: string): TJSPromise;\r\nbegin\r\n Result := TJSPromise.new(\r\n procedure(ASuccess, AFailed: TJSPromiseResolver)\r\n begin\r\n ReqAsync(aFileName,\r\n procedure(AResponse: string)\r\n begin\r\n ASuccess(True);\r\n Text := AResponse;\r\n end,\r\n procedure()\r\n begin\r\n ASuccess(False);\r\n end);\r\n end);\r\n\r\nend;\r\n\r\nfunction TStrings.ExtractName(const S: String): String;\r\nvar\r\n L: Longint;\r\nbegin\r\n CheckSpecialChars;\r\n L:=Pos(FNameValueSeparator,S);\r\n If L<>0 then\r\n Result:=Copy(S,1,L-1)\r\n else\r\n Result:='';\r\nend;\r\n\r\nfunction TStrings.GetName(Index: Integer): string;\r\n\r\nVar\r\n V : String;\r\n\r\nbegin\r\n GetNameValue(Index,Result,V);\r\nend;\r\n\r\nfunction TStrings.GetValue(const Name: string): string;\r\n\r\nVar\r\n L : longint;\r\n N : String;\r\n\r\nbegin\r\n Result:='';\r\n L:=IndexOfName(Name);\r\n If L<>-1 then\r\n GetNameValue(L,N,Result);\r\nend;\r\n\r\nfunction TStrings.GetValueFromIndex(Index: Integer): string;\r\n\r\nVar\r\n N : String;\r\n\r\nbegin\r\n GetNameValue(Index,N,Result);\r\nend;\r\n\r\nprocedure TStrings.SetValueFromIndex(Index: Integer; const Value: string);\r\n\r\nbegin\r\n If (Value='') then\r\n Delete(Index)\r\n else\r\n begin\r\n If (Index<0) then\r\n Index:=Add('');\r\n CheckSpecialChars;\r\n Strings[Index]:=GetName(Index)+FNameValueSeparator+Value;\r\n end;\r\nend;\r\n\r\nprocedure TStrings.SetDelimitedText(const AValue: string);\r\nvar i,j:integer;\r\n aNotFirst:boolean;\r\nbegin\r\n CheckSpecialChars;\r\n BeginUpdate;\r\n\r\n i:=1;\r\n j:=1;\r\n aNotFirst:=false;\r\n\r\n { Paraphrased from Delphi XE2 help:\r\n Strings must be separated by Delimiter characters or spaces.\r\n They may be enclosed in QuoteChars.\r\n QuoteChars in the string must be repeated to distinguish them from the QuoteChars enclosing the string.\r\n }\r\n try\r\n Clear;\r\n If StrictDelimiter then\r\n begin\r\n while i<=length(AValue) do begin\r\n // skip delimiter\r\n if aNotFirst and (i<=length(AValue)) and (AValue[i]=FDelimiter) then inc(i);\r\n\r\n // read next string\r\n if i<=length(AValue) then begin\r\n if AValue[i]=FQuoteChar then begin\r\n // next string is quoted\r\n j:=i+1;\r\n while (j<=length(AValue)) and\r\n ( (AValue[j]<>FQuoteChar) or\r\n ( (j+1<=length(AValue)) and (AValue[j+1]=FQuoteChar) ) ) do begin\r\n if (j<=length(AValue)) and (AValue[j]=FQuoteChar) then inc(j,2)\r\n else inc(j);\r\n end;\r\n // j is position of closing quote\r\n Add( StringReplace (Copy(AValue,i+1,j-i-1),\r\n FQuoteChar+FQuoteChar,FQuoteChar, [rfReplaceAll]));\r\n i:=j+1;\r\n end else begin\r\n // next string is not quoted; read until delimiter\r\n j:=i;\r\n while (j<=length(AValue)) and\r\n (AValue[j]<>FDelimiter) do inc(j);\r\n Add( Copy(AValue,i,j-i));\r\n i:=j;\r\n end;\r\n end else begin\r\n if aNotFirst then Add('');\r\n end;\r\n\r\n aNotFirst:=true;\r\n end;\r\n end\r\n else\r\n begin\r\n while i<=length(AValue) do begin\r\n // skip delimiter\r\n if aNotFirst and (i<=length(AValue)) and (AValue[i]=FDelimiter) then inc(i);\r\n\r\n // skip spaces\r\n while (i<=length(AValue)) and (Ord(AValue[i])<=Ord(' ')) do inc(i);\r\n\r\n // read next string\r\n if i<=length(AValue) then begin\r\n if AValue[i]=FQuoteChar then begin\r\n // next string is quoted\r\n j:=i+1;\r\n while (j<=length(AValue)) and\r\n ( (AValue[j]<>FQuoteChar) or\r\n ( (j+1<=length(AValue)) and (AValue[j+1]=FQuoteChar) ) ) do begin\r\n if (j<=length(AValue)) and (AValue[j]=FQuoteChar) then inc(j,2)\r\n else inc(j);\r\n end;\r\n // j is position of closing quote\r\n Add( StringReplace (Copy(AValue,i+1,j-i-1),\r\n FQuoteChar+FQuoteChar,FQuoteChar, [rfReplaceAll]));\r\n i:=j+1;\r\n end else begin\r\n // next string is not quoted; read until control character/space/delimiter\r\n j:=i;\r\n while (j<=length(AValue)) and\r\n (Ord(AValue[j])>Ord(' ')) and\r\n (AValue[j]<>FDelimiter) do inc(j);\r\n Add( Copy(AValue,i,j-i));\r\n i:=j;\r\n end;\r\n end else begin\r\n if aNotFirst then Add('');\r\n end;\r\n\r\n // skip spaces\r\n while (i<=length(AValue)) and (Ord(AValue[i])<=Ord(' ')) do inc(i);\r\n\r\n aNotFirst:=true;\r\n end;\r\n end;\r\n finally\r\n EndUpdate;\r\n end;\r\nend;\r\n\r\nprocedure TStrings.SetCommaText(const Value: string);\r\n\r\nVar\r\n C1,C2 : Char;\r\n\r\nbegin\r\n CheckSpecialChars;\r\n C1:=Delimiter;\r\n C2:=QuoteChar;\r\n Delimiter:=',';\r\n QuoteChar:='\"';\r\n Try\r\n SetDelimitedText(Value);\r\n Finally\r\n Delimiter:=C1;\r\n QuoteChar:=C2;\r\n end;\r\nend;\r\n\r\nprocedure TStrings.SetValue(const Name: String; const Value: string);\r\n\r\nVar L : longint;\r\n\r\nbegin\r\n CheckSpecialChars;\r\n L:=IndexOfName(Name);\r\n if L=-1 then\r\n Add (Name+FNameValueSeparator+Value)\r\n else\r\n Strings[L]:=Name+FNameValueSeparator+value;\r\nend;\r\n\r\n\r\nprocedure TStrings.Error(const Msg: string; Data: Integer);\r\nbegin\r\n Raise EStringListError.CreateFmt(Msg,[IntToStr(Data)]);\r\nend;\r\n\r\nfunction TStrings.GetCapacity: Integer;\r\n\r\nbegin\r\n Result:=Count;\r\nend;\r\n\r\n\r\n\r\nfunction TStrings.GetObject(Index: Integer): TObject;\r\n\r\nbegin\r\n if Index=0 then ;\r\n Result:=Nil;\r\nend;\r\n\r\nfunction TStrings.GetTextStr: string;\r\n\r\nVar\r\n I : Longint;\r\n S,NL : String;\r\n\r\nbegin\r\n CheckSpecialChars;\r\n // Determine needed place\r\n if FLineBreak<>sLineBreak then\r\n NL:=FLineBreak\r\n else\r\n Case FLBS of\r\n tlbsLF : NL:=#10;\r\n tlbsCRLF : NL:=#13#10;\r\n tlbsCR : NL:=#13;\r\n end;\r\n Result:='';\r\n For i:=0 To count-1 do\r\n begin\r\n S:=Strings[I];\r\n Result:=Result+S;\r\n if (I 1) and (PPCR > 0) and (PPLF > 0) then\r\n begin\r\n if (PPLF > PPCR) then\r\n PPLF := 0\r\n else\r\n PPCR := 0;\r\n end;\r\n\r\n PL := 1;\r\n if (PPLF > 0) and (PPCR > 0) then\r\n begin\r\n PL := 2;\r\n if PPLF < PPCR then\r\n PP := PPLF\r\n else\r\n PP := PPCR;\r\n end\r\n else\r\n if (PPLF > 0) and (PPCR < 1) then\r\n PP := PPLF\r\n else\r\n if (PPCR > 0) and (PPLF < 1) then\r\n PP := PPCR\r\n else\r\n if (PPLF < 1) and (PPCR < 1) then\r\n PP := Length(Value) + 1;\r\n\r\n S := Copy(Value,P,PP - P);\r\n P := PP + PL;\r\n Result := True;\r\nend;\r\n\r\nprocedure TStrings.DoSetTextStr(const Value: string; DoClear: Boolean);\r\n\r\nVar\r\n S : String;\r\n P : Integer;\r\n\r\nbegin\r\n Try\r\n BeginUpdate;\r\n if DoClear then\r\n Clear;\r\n P:=1;\r\n While GetNextLineBreak (Value,S,P) do\r\n begin\r\n Add(S);\r\n end;\r\n finally\r\n EndUpdate;\r\n end;\r\nend;\r\n\r\nprocedure TStrings.SetTextStr(const Value: string);\r\n\r\nbegin\r\n CheckSpecialChars;\r\n DoSetTextStr(Value,True);\r\nend;\r\n\r\nprocedure TStrings.AddText(const S: String);\r\n\r\nbegin\r\n CheckSpecialChars;\r\n DoSetTextStr(S,False);\r\nend;\r\n\r\nprocedure TStrings.SetUpdateState(Updating: Boolean);\r\n\r\nbegin\r\n // FPONotifyObservers(Self,ooChange,Nil);\r\n if Updating then ;\r\nend;\r\n\r\ndestructor TStrings.Destroy;\r\n\r\nbegin\r\n inherited destroy;\r\nend;\r\n\r\nconstructor TStrings.Create;\r\nbegin\r\n inherited Create;\r\n FAlwaysQuote:=False;\r\nend;\r\n\r\nfunction TStrings.ToObjectArray: TObjectDynArray;\r\n\r\nbegin\r\n Result:=ToObjectArray(0,Count-1);\r\nend;\r\n\r\nfunction TStrings.ToObjectArray(aStart,aEnd : Integer): TObjectDynArray;\r\nVar\r\n I : Integer;\r\n\r\nbegin\r\n Result:=Nil;\r\n if aStart>aEnd then exit;\r\n SetLength(Result,aEnd-aStart+1);\r\n For I:=aStart to aEnd do\r\n Result[i-aStart]:=Objects[i];\r\nend;\r\n\r\nfunction TStrings.ToStringArray: TStringDynArray;\r\n\r\nbegin\r\n Result:=ToStringArray(0,Count-1);\r\nend;\r\n\r\nfunction TStrings.ToStringArray(aStart,aEnd : Integer): TStringDynArray;\r\n\r\nVar\r\n I : Integer;\r\n\r\nbegin\r\n Result:=Nil;\r\n if aStart>aEnd then exit;\r\n SetLength(Result,aEnd-aStart+1);\r\n For I:=aStart to aEnd do\r\n Result[i-aStart]:=Strings[i];\r\nend;\r\n\r\nfunction TStrings.Add(const S: string): Integer;\r\n\r\nbegin\r\n Result:=Count;\r\n Insert (Count,S);\r\nend;\r\n\r\n\r\nfunction TStrings.Add(const Fmt: string; const Args: array of JSValue): Integer;\r\n\r\nbegin\r\n Result:=Add(Format(Fmt,Args));\r\nend;\r\n\r\nfunction TStrings.AddFmt(const Fmt: string; const Args: array of JSValue): Integer;\r\n\r\nbegin\r\n Result:=Add(Format(Fmt,Args));\r\nend;\r\n\r\n\r\nfunction TStrings.AddObject(const S: string; AObject: TObject): Integer;\r\n\r\nbegin\r\n Result:=Add(S);\r\n Objects[result]:=AObject;\r\nend;\r\n\r\nfunction TStrings.AddObject(const Fmt: string; Args: array of JSValue; AObject: TObject): Integer;\r\n\r\nbegin\r\n Result:=AddObject(Format(Fmt,Args),AObject);\r\nend;\r\n\r\nprocedure TStrings.Append(const S: string);\r\n\r\nbegin\r\n Add (S);\r\nend;\r\n\r\n\r\n\r\nprocedure TStrings.AddStrings(TheStrings: TStrings; ClearFirst: Boolean);\r\n\r\n\r\nbegin\r\n beginupdate;\r\n try\r\n if ClearFirst then\r\n Clear;\r\n AddStrings(TheStrings);\r\n finally\r\n EndUpdate;\r\n end;\r\nend;\r\n\r\nprocedure TStrings.AddStrings(TheStrings: TStrings);\r\n\r\nVar Runner : longint;\r\nbegin\r\n For Runner:=0 to TheStrings.Count-1 do\r\n self.AddObject (Thestrings[Runner],TheStrings.Objects[Runner]);\r\nend;\r\n\r\nprocedure TStrings.AddStrings(const TheStrings: array of string);\r\n\r\nVar Runner : longint;\r\nbegin\r\n if Count + High(TheStrings)+1 > Capacity then\r\n Capacity := Count + High(TheStrings)+1;\r\n For Runner:=Low(TheStrings) to High(TheStrings) do\r\n self.Add(Thestrings[Runner]);\r\nend;\r\n\r\n\r\nprocedure TStrings.AddStrings(const TheStrings: array of string; ClearFirst: Boolean);\r\n\r\nbegin\r\n beginupdate;\r\n try\r\n if ClearFirst then\r\n Clear;\r\n AddStrings(TheStrings);\r\n finally\r\n EndUpdate;\r\n end;\r\nend;\r\n\r\n\r\nfunction TStrings.AddPair(const AName, AValue: string): TStrings;\r\n\r\nbegin\r\n Result:=AddPair(AName,AValue,Nil);\r\nend;\r\n\r\nfunction TStrings.AddPair(const AName, AValue: string; AObject: TObject): TStrings;\r\n\r\nbegin\r\n Result := Self;\r\n AddObject(AName+NameValueSeparator+AValue, AObject);\r\nend;\r\n\r\n\r\nprocedure TStrings.Assign(Source: TPersistent);\r\n\r\nVar\r\n S : TStrings;\r\n\r\nbegin\r\n If Source is TStrings then\r\n begin\r\n S:=TStrings(Source);\r\n BeginUpdate;\r\n Try\r\n clear;\r\n FSpecialCharsInited:=S.FSpecialCharsInited;\r\n FQuoteChar:=S.FQuoteChar;\r\n FDelimiter:=S.FDelimiter;\r\n FNameValueSeparator:=S.FNameValueSeparator;\r\n FLBS:=S.FLBS;\r\n FLineBreak:=S.FLineBreak;\r\n AddStrings(S);\r\n finally\r\n EndUpdate;\r\n end;\r\n end\r\n else\r\n Inherited Assign(Source);\r\nend;\r\n\r\n\r\n\r\nprocedure TStrings.BeginUpdate;\r\n\r\nbegin\r\n if FUpdateCount = 0 then SetUpdateState(true);\r\n inc(FUpdateCount);\r\nend;\r\n\r\n\r\n\r\nprocedure TStrings.EndUpdate;\r\n\r\nbegin\r\n If FUpdateCount>0 then\r\n Dec(FUpdateCount);\r\n if FUpdateCount=0 then\r\n SetUpdateState(False);\r\nend;\r\n\r\n\r\n\r\nfunction TStrings.Equals(Obj: TObject): Boolean;\r\n\r\nbegin\r\n if Obj is TStrings then\r\n Result := Equals(TStrings(Obj))\r\n else\r\n Result := inherited Equals(Obj);\r\nend;\r\n\r\n\r\n\r\nfunction TStrings.Equals(TheStrings: TStrings): Boolean;\r\n\r\nVar Runner,Nr : Longint;\r\n\r\nbegin\r\n Result:=False;\r\n Nr:=Self.Count;\r\n if Nr<>TheStrings.Count then exit;\r\n For Runner:=0 to Nr-1 do\r\n If Strings[Runner]<>TheStrings[Runner] then exit;\r\n Result:=True;\r\nend;\r\n\r\n\r\n\r\nprocedure TStrings.Exchange(Index1, Index2: Integer);\r\n\r\nVar\r\n Obj : TObject;\r\n Str : String;\r\n\r\nbegin\r\n beginUpdate;\r\n Try\r\n Obj:=Objects[Index1];\r\n Str:=Strings[Index1];\r\n Objects[Index1]:=Objects[Index2];\r\n Strings[Index1]:=Strings[Index2];\r\n Objects[Index2]:=Obj;\r\n Strings[Index2]:=Str;\r\n finally\r\n EndUpdate;\r\n end;\r\nend;\r\n\r\n\r\nfunction TStrings.GetEnumerator: TStringsEnumerator;\r\nbegin\r\n Result:=TStringsEnumerator.Create(Self);\r\nend;\r\n\r\n\r\nfunction TStrings.DoCompareText(const s1, s2: string): PtrInt;\r\nbegin\r\n result:=CompareText(s1,s2);\r\nend;\r\n\r\n\r\nfunction TStrings.IndexOf(const S: string): Integer;\r\nbegin\r\n Result:=0;\r\n While (Result0) do Result:=Result+1;\r\n if Result=Count then Result:=-1;\r\nend;\r\n\r\n\r\nfunction TStrings.IndexOfName(const Name: string): Integer;\r\nVar\r\n len : longint;\r\n S : String;\r\nbegin\r\n CheckSpecialChars;\r\n Result:=0;\r\n while (Result=0) and (DoCompareText(Name,Copy(S,1,Len))=0) then\r\n exit;\r\n inc(result);\r\n end;\r\n result:=-1;\r\nend;\r\n\r\n\r\nfunction TStrings.IndexOfObject(AObject: TObject): Integer;\r\nbegin\r\n Result:=0;\r\n While (ResultAObject) do Result:=Result+1;\r\n If Result=Count then Result:=-1;\r\nend;\r\n\r\n\r\nprocedure TStrings.InsertObject(Index: Integer; const S: string; AObject: TObject);\r\n\r\nbegin\r\n Insert (Index,S);\r\n Objects[Index]:=AObject;\r\nend;\r\n\r\nprocedure TStrings.Move(CurIndex, NewIndex: Integer);\r\nVar\r\n Obj : TObject;\r\n Str : String;\r\nbegin\r\n BeginUpdate;\r\n Try\r\n Obj:=Objects[CurIndex];\r\n Str:=Strings[CurIndex];\r\n Objects[CurIndex]:=Nil; // Prevent Delete from freeing.\r\n Delete(Curindex);\r\n InsertObject(NewIndex,Str,Obj);\r\n finally\r\n EndUpdate;\r\n end;\r\nend;\r\n\r\n{$HINTS OFF}\r\nprocedure TStrings.SaveToFile(const FileName: string);\r\nvar\r\n AText: string;\r\nbegin\r\n AText := self.Text;\r\n asm\r\n var element = document.createElement('a');\r\n element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(AText));\r\n if (FileName != ''){\r\n element.setAttribute('download', FileName);\r\n }\r\n element.style.display = 'none';\r\n document.body.appendChild(element);\r\n element.click();\r\n document.body.removeChild(element);\r\n end;\r\nend;\r\n{$HINTS ON}\r\n\r\n\r\n{****************************************************************************}\r\n{* TStringList *}\r\n{****************************************************************************}\r\n\r\n\r\nprocedure TStringList.ExchangeItemsInt(Index1, Index2: Integer);\r\n\r\nVar\r\n S : String;\r\n O : TObject;\r\n\r\nbegin\r\n S:=Flist[Index1].FString;\r\n O:=Flist[Index1].FObject;\r\n Flist[Index1].Fstring:=Flist[Index2].Fstring;\r\n Flist[Index1].FObject:=Flist[Index2].FObject;\r\n Flist[Index2].Fstring:=S;\r\n Flist[Index2].FObject:=O;\r\nend;\r\n\r\nfunction TStringList.GetSorted: Boolean;\r\nbegin\r\n Result:=FSortStyle in [sslUser,sslAuto];\r\nend;\r\n\r\n\r\nprocedure TStringList.ExchangeItems(Index1, Index2: Integer);\r\nbegin\r\n ExchangeItemsInt(Index1, Index2);\r\nend;\r\n\r\n\r\nprocedure TStringList.Grow;\r\n\r\nVar\r\n NC : Integer;\r\n\r\nbegin\r\n NC:=Capacity;\r\n If NC>=256 then\r\n NC:=NC+(NC Div 4)\r\n else if NC=0 then\r\n NC:=4\r\n else\r\n NC:=NC*4;\r\n SetCapacity(NC);\r\nend;\r\n\r\nprocedure TStringList.InternalClear(FromIndex: Integer; ClearOnly: Boolean);\r\n\r\nVar\r\n I: Integer;\r\n\r\nbegin\r\n if FromIndex < FCount then\r\n begin\r\n if FOwnsObjects then\r\n begin\r\n For I:=FromIndex to FCount-1 do\r\n begin\r\n Flist[I].FString:='';\r\n freeandnil(Flist[i].FObject);\r\n end;\r\n end\r\n else\r\n begin\r\n For I:=FromIndex to FCount-1 do\r\n Flist[I].FString:='';\r\n end;\r\n FCount:=FromIndex;\r\n end;\r\n if Not ClearOnly then\r\n SetCapacity(0);\r\nend;\r\n\r\n\r\nprocedure TStringList.QuickSort(L, R: Integer; CompareFn: TStringListSortCompare\r\n );\r\n\r\n\r\nvar\r\n Pivot, vL, vR: Integer;\r\n\r\nbegin\r\n //if ExchangeItems is override call that, else call (faster) ExchangeItemsInt\r\n\r\n if R - L <= 1 then begin // a little bit of time saver\r\n if L < R then\r\n if CompareFn(Self, L, R) > 0 then\r\n ExchangeItems(L, R);\r\n\r\n Exit;\r\n end;\r\n\r\n vL := L;\r\n vR := R;\r\n\r\n Pivot := L + Random(R - L); // they say random is best\r\n\r\n while vL < vR do begin\r\n while (vL < Pivot) and (CompareFn(Self, vL, Pivot) <= 0) do\r\n Inc(vL);\r\n\r\n while (vR > Pivot) and (CompareFn(Self, vR, Pivot) > 0) do\r\n Dec(vR);\r\n\r\n ExchangeItems(vL, vR);\r\n\r\n if Pivot = vL then // swap pivot if we just hit it from one side\r\n Pivot := vR\r\n else if Pivot = vR then\r\n Pivot := vL;\r\n end;\r\n\r\n if Pivot - 1 >= L then\r\n QuickSort(L, Pivot - 1, CompareFn);\r\n if Pivot + 1 <= R then\r\n QuickSort(Pivot + 1, R, CompareFn);\r\nend;\r\n\r\n\r\nprocedure TStringList.InsertItem(Index: Integer; const S: string);\r\nbegin\r\n InsertItem(Index, S, nil);\r\nend;\r\n\r\n\r\nprocedure TStringList.InsertItem(Index: Integer; const S: string; O: TObject);\r\n\r\nVar\r\n It : TStringItem;\r\n \r\nbegin\r\n Changing;\r\n If FCount=Capacity then Grow;\r\n it.FString:=S;\r\n it.FObject:=O;\r\n TJSArray(FList).Splice(Index,0,It);\r\n Inc(FCount);\r\n Changed;\r\nend;\r\n\r\n\r\nprocedure TStringList.SetSorted(Value: Boolean);\r\n\r\nbegin\r\n If Value then\r\n SortStyle:=sslAuto\r\n else\r\n SortStyle:=sslNone\r\nend;\r\n\r\n\r\n\r\nprocedure TStringList.Changed;\r\n\r\nbegin\r\n If (FUpdateCount=0) Then\r\n begin\r\n If Assigned(FOnChange) then\r\n FOnchange(Self);\r\n end;\r\nend;\r\n\r\n\r\n\r\nprocedure TStringList.Changing;\r\n\r\nbegin\r\n If FUpdateCount=0 then\r\n if Assigned(FOnChanging) then\r\n FOnchanging(Self);\r\nend;\r\n\r\n\r\n\r\nfunction TStringList.Get(Index: Integer): string;\r\n\r\nbegin\r\n CheckIndex(Index);\r\n Result:=Flist[Index].FString;\r\nend;\r\n\r\n\r\n\r\nfunction TStringList.GetCapacity: Integer;\r\n\r\nbegin\r\n Result:=Length(FList);\r\nend;\r\n\r\n\r\n\r\nfunction TStringList.GetCount: Integer;\r\n\r\nbegin\r\n Result:=FCount;\r\nend;\r\n\r\n\r\n\r\nfunction TStringList.GetObject(Index: Integer): TObject;\r\n\r\nbegin\r\n CheckIndex(Index);\r\n Result:=Flist[Index].FObject;\r\nend;\r\n\r\n\r\n\r\nprocedure TStringList.Put(Index: Integer; const S: string);\r\n\r\nbegin\r\n If Sorted then\r\n Error(SSortedListError,0);\r\n CheckIndex(Index);\r\n Changing;\r\n Flist[Index].FString:=S;\r\n Changed;\r\nend;\r\n\r\n\r\n\r\nprocedure TStringList.PutObject(Index: Integer; AObject: TObject);\r\n\r\nbegin\r\n CheckIndex(Index);\r\n Changing;\r\n Flist[Index].FObject:=AObject;\r\n Changed;\r\nend;\r\n\r\n\r\n\r\nprocedure TStringList.SetCapacity(NewCapacity: Integer);\r\n\r\nbegin\r\n If (NewCapacity<0) then\r\n Error (SListCapacityError,NewCapacity);\r\n If NewCapacity<>Capacity then\r\n SetLength(FList,NewCapacity)\r\nend;\r\n\r\n\r\n\r\nprocedure TStringList.SetUpdateState(Updating: Boolean);\r\n\r\nbegin\r\n If Updating then\r\n Changing\r\n else\r\n Changed\r\nend;\r\n\r\n\r\n\r\ndestructor TStringList.Destroy;\r\n\r\nbegin\r\n InternalClear;\r\n Inherited destroy;\r\nend;\r\n\r\n\r\n\r\nfunction TStringList.Add(const S: string): Integer;\r\n\r\nbegin\r\n If Not (SortStyle=sslAuto) then\r\n Result:=FCount\r\n else\r\n If Find (S,Result) then\r\n Case DUplicates of\r\n DupIgnore : Exit;\r\n DupError : Error(SDuplicateString,0)\r\n end;\r\n InsertItem (Result,S);\r\nend;\r\n\r\nprocedure TStringList.Clear;\r\n\r\nbegin\r\n if FCount = 0 then Exit;\r\n Changing;\r\n InternalClear;\r\n Changed;\r\nend;\r\n\r\nprocedure TStringList.Delete(Index: Integer);\r\n\r\nbegin\r\n CheckIndex(Index);\r\n Changing;\r\n if FOwnsObjects then\r\n FreeAndNil(Flist[Index].FObject);\r\n TJSArray(FList).splice(Index,1); \r\n FList[Count-1].FString:='';\r\n Flist[Count-1].FObject:=Nil;\r\n Dec(FCount);\r\n Changed;\r\nend;\r\n\r\nprocedure TStringList.Exchange(Index1, Index2: Integer);\r\n\r\nbegin\r\n CheckIndex(Index1);\r\n CheckIndex(Index2);\r\n Changing;\r\n ExchangeItemsInt(Index1,Index2);\r\n changed;\r\nend;\r\n\r\nprocedure TStringList.SetCaseSensitive(b : boolean);\r\nbegin\r\n if b=FCaseSensitive then\r\n Exit;\r\n FCaseSensitive:=b;\r\n if FSortStyle=sslAuto then\r\n begin\r\n FForceSort:=True;\r\n try\r\n Sort;\r\n finally\r\n FForceSort:=False;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TStringList.SetSortStyle(AValue: TStringsSortStyle);\r\nbegin\r\n if FSortStyle=AValue then Exit;\r\n if (AValue=sslAuto) then\r\n Sort;\r\n FSortStyle:=AValue;\r\nend;\r\n\r\nprocedure TStringList.CheckIndex(AIndex: Integer);\r\nbegin\r\n If (AIndex<0) or (AIndex>=FCount) then\r\n Error(SListIndexError,AIndex);\r\nend;\r\n\r\n\r\nfunction TStringList.DoCompareText(const s1, s2: string): PtrInt;\r\nbegin\r\n if FCaseSensitive then\r\n result:=CompareStr(s1,s2)\r\n else\r\n result:=CompareText(s1,s2);\r\nend;\r\n\r\n\r\nfunction TStringList.CompareStrings(const s1,s2 : string) : Integer;\r\nbegin\r\n Result := DoCompareText(s1, s2);\r\nend;\r\n\r\n\r\nfunction TStringList.Find(const S: string; out Index: Integer): Boolean;\r\n\r\nvar\r\n L, R, I: Integer;\r\n CompareRes: PtrInt;\r\nbegin\r\n Result := false;\r\n Index:=-1;\r\n if Not Sorted then\r\n Raise EListError.Create(SErrFindNeedsSortedList);\r\n // Use binary search.\r\n L := 0;\r\n R := Count - 1;\r\n while (L<=R) do\r\n begin\r\n I := L + (R - L) div 2;\r\n CompareRes := DoCompareText(S, Flist[I].FString);\r\n if (CompareRes>0) then\r\n L := I+1\r\n else begin\r\n R := I-1;\r\n if (CompareRes=0) then begin\r\n Result := true;\r\n if (Duplicates<>dupAccept) then\r\n L := I; // forces end of while loop\r\n end;\r\n end;\r\n end;\r\n Index := L;\r\nend;\r\n\r\n\r\n\r\nfunction TStringList.IndexOf(const S: string): Integer;\r\n\r\nbegin\r\n If Not Sorted then\r\n Result:=Inherited indexOf(S)\r\n else\r\n // faster using binary search...\r\n If Not Find (S,Result) then\r\n Result:=-1;\r\nend;\r\n\r\n\r\n\r\nprocedure TStringList.Insert(Index: Integer; const S: string);\r\n\r\nbegin\r\n If SortStyle=sslAuto then\r\n Error (SSortedListError,0)\r\n else\r\n begin\r\n If (Index<0) or (Index>FCount) then\r\n Error(SListIndexError,Index); // Cannot use CheckIndex, because there >= FCount...\r\n InsertItem (Index,S);\r\n end;\r\nend;\r\n\r\n\r\nprocedure TStringList.CustomSort(CompareFn: TStringListSortCompare);\r\n\r\nbegin\r\n If (FForceSort or (Not (FSortStyle=sslAuto))) and (FCount>1) then\r\n begin\r\n Changing;\r\n QuickSort(0,FCount-1, CompareFn);\r\n Changed;\r\n end;\r\nend;\r\n\r\nfunction StringListAnsiCompare(List: TStringList; Index1, Index: Integer): Integer;\r\n\r\nbegin\r\n Result := List.DoCompareText(List.FList[Index1].FString,\r\n List.FList[Index].FString);\r\nend;\r\n\r\nprocedure TStringList.Sort;\r\n\r\nbegin\r\n CustomSort(@StringListAnsiCompare);\r\nend;\r\n\r\n{****************************************************************************}\r\n{* TCollectionItem *}\r\n{****************************************************************************}\r\n\r\n\r\nfunction TCollectionItem.GetIndex: Integer;\r\n\r\nbegin\r\n if Assigned(FCollection) then\r\n Result:=FCollection.FItems.IndexOf(Self)\r\n else\r\n Result:=-1;\r\nend;\r\n\r\n\r\n\r\nprocedure TCollectionItem.SetCollection(Value: TCollection);\r\n\r\nbegin\r\n IF Value<>FCollection then\r\n begin\r\n If FCollection<>Nil then FCollection.RemoveItem(Self);\r\n if Value<>Nil then Value.InsertItem(Self);\r\n end;\r\nend;\r\n\r\n\r\n\r\nprocedure TCollectionItem.Changed(AllItems: Boolean);\r\n\r\nbegin\r\n If (FCollection<>Nil) and (FCollection.UpdateCount=0) then\r\n begin\r\n If AllItems then\r\n FCollection.Update(Nil)\r\n else\r\n FCollection.Update(Self);\r\n end;\r\nend;\r\n\r\n\r\n\r\nfunction TCollectionItem.GetNamePath: string;\r\n\r\nbegin\r\n If FCollection<>Nil then\r\n Result:=FCollection.GetNamePath+'['+IntToStr(Index)+']'\r\n else\r\n Result:=ClassName;\r\nend;\r\n\r\n\r\nfunction TCollectionItem.GetOwner: TPersistent;\r\n\r\nbegin\r\n Result:=FCollection;\r\nend;\r\n\r\n\r\n\r\nfunction TCollectionItem.GetDisplayName: string;\r\n\r\nbegin\r\n Result:=ClassName;\r\nend;\r\n\r\n\r\n\r\nprocedure TCollectionItem.SetIndex(Value: Integer);\r\n\r\nVar Temp : Longint;\r\n\r\nbegin\r\n Temp:=GetIndex;\r\n If (Temp>-1) and (Temp<>Value) then\r\n begin\r\n FCollection.FItems.Move(Temp,Value);\r\n Changed(True);\r\n end;\r\nend;\r\n\r\n\r\nprocedure TCollectionItem.SetDisplayName(const Value: string);\r\n\r\nbegin\r\n Changed(False);\r\n if Value='' then ;\r\nend;\r\n\r\n\r\n\r\nconstructor TCollectionItem.Create(ACollection: TCollection);\r\n\r\nbegin\r\n Inherited Create;\r\n SetCollection(ACollection);\r\nend;\r\n\r\n\r\n\r\ndestructor TCollectionItem.Destroy;\r\n\r\nbegin\r\n SetCollection(Nil);\r\n Inherited Destroy;\r\nend;\r\n\r\n{****************************************************************************}\r\n{* TCollectionEnumerator *}\r\n{****************************************************************************}\r\n\r\nconstructor TCollectionEnumerator.Create(ACollection: TCollection);\r\nbegin\r\n inherited Create;\r\n FCollection := ACollection;\r\n FPosition := -1;\r\nend;\r\n\r\nfunction TCollectionEnumerator.GetCurrent: TCollectionItem;\r\nbegin\r\n Result := FCollection.Items[FPosition];\r\nend;\r\n\r\nfunction TCollectionEnumerator.MoveNext: Boolean;\r\nbegin\r\n Inc(FPosition);\r\n Result := FPosition < FCollection.Count;\r\nend;\r\n\r\n\r\n{****************************************************************************}\r\n{* TCollection *}\r\n{****************************************************************************}\r\n\r\nfunction TCollection.Owner: TPersistent;\r\nbegin\r\n result:=getowner;\r\nend;\r\n\r\n\r\nfunction TCollection.GetCount: Integer;\r\n\r\nbegin\r\n Result:=FItems.Count;\r\nend;\r\n\r\n\r\nProcedure TCollection.SetPropName;\r\n\r\n{\r\nVar\r\n TheOwner : TPersistent;\r\n PropList : PPropList;\r\n I, PropCount : Integer;\r\n}\r\nbegin\r\n FPropName:='';\r\n{\r\n TheOwner:=GetOwner;\r\n // TODO: This needs to wait till Mattias finishes typeinfo.\r\n // It's normally only used in the designer so should not be a problem currently.\r\n if (TheOwner=Nil) Or (TheOwner.Classinfo=Nil) Then Exit;\r\n // get information from the owner RTTI\r\n PropCount:=GetPropList(TheOwner, PropList);\r\n Try\r\n For I:=0 To PropCount-1 Do\r\n If (PropList^[i]^.PropType^.Kind=tkClass) And\r\n (GetObjectProp(TheOwner, PropList^[i], ClassType)=Self) Then\r\n Begin\r\n FPropName:=PropList^[i]^.Name;\r\n Exit;\r\n End;\r\n Finally\r\n FreeMem(PropList);\r\n End;\r\n}\r\nend;\r\n\r\n\r\nfunction TCollection.GetPropName: string;\r\n\r\n{Var\r\n TheOwner : TPersistent;}\r\n\r\nbegin\r\n Result:=FPropNAme;\r\n// TheOwner:=GetOwner;\r\n// If (Result<>'') or (TheOwner=Nil) Or (TheOwner.Classinfo=Nil) then exit;\r\n SetPropName;\r\n Result:=FPropName;\r\nend;\r\n\r\n\r\nprocedure TCollection.InsertItem(Item: TCollectionItem);\r\nbegin\r\n If Not(Item Is FitemClass) then\r\n exit;\r\n FItems.add(Item);\r\n Item.FCollection:=Self;\r\n Item.FID:=FNextID;\r\n inc(FNextID);\r\n SetItemName(Item);\r\n Notify(Item,cnAdded);\r\n Changed;\r\nend;\r\n\r\n\r\nprocedure TCollection.RemoveItem(Item: TCollectionItem);\r\n\r\nVar\r\n I : Integer;\r\n\r\nbegin\r\n Notify(Item,cnExtracting);\r\n I:=FItems.IndexOfItem(Item,fromEnd);\r\n If (I<>-1) then\r\n FItems.Delete(I);\r\n Item.FCollection:=Nil;\r\n Changed;\r\nend;\r\n\r\n\r\nfunction TCollection.GetAttrCount: Integer;\r\nbegin\r\n Result:=0;\r\nend;\r\n\r\n\r\nfunction TCollection.GetAttr(Index: Integer): string;\r\nbegin\r\n Result:='';\r\n if Index=0 then ;\r\nend;\r\n\r\n\r\nfunction TCollection.GetItemAttr(Index, ItemIndex: Integer): string;\r\nbegin\r\n Result:=TCollectionItem(FItems.Items[ItemIndex]).DisplayName;\r\n if Index=0 then ;\r\nend;\r\n\r\n\r\nfunction TCollection.GetEnumerator: TCollectionEnumerator;\r\nbegin\r\n Result := TCollectionEnumerator.Create(Self);\r\nend;\r\n\r\n\r\nfunction TCollection.GetNamePath: string;\r\nvar o : TPersistent;\r\nbegin\r\n o:=getowner;\r\n if assigned(o) and (propname<>'') then\r\n result:=o.getnamepath+'.'+propname\r\n else\r\n result:=classname;\r\nend;\r\n\r\n\r\nprocedure TCollection.Changed;\r\nbegin\r\n if FUpdateCount=0 then\r\n Update(Nil);\r\nend;\r\n\r\n\r\nfunction TCollection.GetItem(Index: Integer): TCollectionItem;\r\nbegin\r\n Result:=TCollectionItem(FItems.Items[Index]);\r\nend;\r\n\r\n\r\nprocedure TCollection.SetItem(Index: Integer; Value: TCollectionItem);\r\nbegin\r\n TCollectionItem(FItems.items[Index]).Assign(Value);\r\nend;\r\n\r\n\r\nprocedure TCollection.SetItemName(Item: TCollectionItem);\r\nbegin\r\n if Item=nil then ;\r\nend;\r\n\r\nprocedure TCollection.Update(Item: TCollectionItem);\r\nbegin\r\n if Item=nil then ;\r\nend;\r\n\r\n\r\nconstructor TCollection.Create(AItemClass: TCollectionItemClass);\r\nbegin\r\n inherited create;\r\n FItemClass:=AItemClass;\r\n FItems:=TFpList.Create;\r\nend;\r\n\r\n\r\ndestructor TCollection.Destroy;\r\nbegin\r\n FUpdateCount:=1; // Prevent OnChange\r\n try\r\n DoClear;\r\n Finally\r\n FUpdateCount:=0;\r\n end;\r\n if assigned(FItems) then\r\n FItems.Destroy;\r\n Inherited Destroy;\r\nend;\r\n\r\n\r\nfunction TCollection.Add: TCollectionItem;\r\nbegin\r\n Result:=FItemClass.Create(Self);\r\nend;\r\n\r\n\r\nprocedure TCollection.Assign(Source: TPersistent);\r\nVar I : Longint;\r\nbegin\r\n If Source is TCollection then\r\n begin\r\n Clear;\r\n For I:=0 To TCollection(Source).Count-1 do\r\n Add.Assign(TCollection(Source).Items[I]);\r\n exit;\r\n end\r\n else\r\n Inherited Assign(Source);\r\nend;\r\n\r\n\r\nprocedure TCollection.BeginUpdate;\r\nbegin\r\n inc(FUpdateCount);\r\nend;\r\n\r\n\r\nprocedure TCollection.Clear;\r\nbegin\r\n if FItems.Count=0 then\r\n exit; // Prevent Changed\r\n BeginUpdate;\r\n try\r\n DoClear;\r\n finally\r\n EndUpdate;\r\n end;\r\nend;\r\n\r\n\r\nprocedure TCollection.DoClear;\r\nvar\r\n Item: TCollectionItem;\r\nbegin\r\n While FItems.Count>0 do\r\n begin\r\n Item:=TCollectionItem(FItems.Last);\r\n if Assigned(Item) then\r\n Item.Destroy;\r\n end;\r\nend;\r\n\r\n\r\nprocedure TCollection.EndUpdate;\r\nbegin\r\n if FUpdateCount>0 then\r\n dec(FUpdateCount);\r\n if FUpdateCount=0 then\r\n Changed;\r\nend;\r\n\r\n\r\nfunction TCollection.FindItemID(ID: Integer): TCollectionItem;\r\nVar\r\n I : Longint;\r\nbegin\r\n For I:=0 to Fitems.Count-1 do\r\n begin\r\n Result:=TCollectionItem(FItems.items[I]);\r\n If Result.Id=Id then\r\n exit;\r\n end;\r\n Result:=Nil;\r\nend;\r\n\r\n\r\nprocedure TCollection.Delete(Index: Integer);\r\nVar\r\n Item : TCollectionItem;\r\nbegin\r\n Item:=TCollectionItem(FItems[Index]);\r\n Notify(Item,cnDeleting);\r\n If assigned(Item) then\r\n Item.Destroy;\r\nend;\r\n\r\n\r\nfunction TCollection.Insert(Index: Integer): TCollectionItem;\r\nbegin\r\n Result:=Add;\r\n Result.Index:=Index;\r\nend;\r\n\r\n\r\nprocedure TCollection.Notify(Item: TCollectionItem;Action: TCollectionNotification);\r\nbegin\r\n if Item=nil then ;\r\n if Action=cnAdded then ;\r\nend;\r\n\r\nprocedure TCollection.Sort(Const Compare : TCollectionSortCompare);\r\n\r\nbegin\r\n BeginUpdate;\r\n try\r\n FItems.Sort(TListSortCompare(Compare));\r\n Finally\r\n EndUpdate;\r\n end;\r\nend;\r\n\r\nprocedure TCollection.SortList(const Compare: TCollectionSortCompareFunc);\r\n\r\nbegin\r\n BeginUpdate;\r\n try\r\n FItems.SortList(TListSortCompareFunc(Compare));\r\n Finally\r\n EndUpdate;\r\n end;\r\nend;\r\n\r\nprocedure TCollection.Exchange(Const Index1, index2: integer);\r\n\r\nbegin\r\n FItems.Exchange(Index1,Index2);\r\nend;\r\n\r\n\r\n{****************************************************************************}\r\n{* TOwnedCollection *}\r\n{****************************************************************************}\r\n\r\n\r\n\r\nConstructor TOwnedCollection.Create(AOwner: TPersistent; AItemClass: TCollectionItemClass);\r\n\r\nBegin\r\n FOwner := AOwner;\r\n inherited Create(AItemClass);\r\nend;\r\n\r\nFunction TOwnedCollection.GetOwner: TPersistent;\r\n\r\nbegin\r\n Result:=FOwner;\r\nend;\r\n\r\n{****************************************************************************}\r\n{* TComponent *}\r\n{****************************************************************************}\r\n\r\n\r\nfunction TComponent.GetComponent(AIndex: Integer): TComponent;\r\n\r\nbegin\r\n If not assigned(FComponents) then\r\n Result:=Nil\r\n else\r\n Result:=TComponent(FComponents.Items[Aindex]);\r\nend;\r\n\r\nfunction TComponent.GetComponentCount: Integer;\r\n\r\nbegin\r\n If not assigned(FComponents) then\r\n result:=0\r\n else\r\n Result:=FComponents.Count;\r\nend;\r\n\r\n\r\nfunction TComponent.GetComponentIndex: Integer;\r\n\r\nbegin\r\n If Assigned(FOwner) and Assigned(FOwner.FComponents) then\r\n Result:=FOWner.FComponents.IndexOf(Self)\r\n else\r\n Result:=-1;\r\nend;\r\n\r\n\r\nprocedure TComponent.Insert(AComponent: TComponent);\r\n\r\nbegin\r\n If not assigned(FComponents) then\r\n FComponents:=TFpList.Create;\r\n FComponents.Add(AComponent);\r\n AComponent.FOwner:=Self;\r\nend;\r\n\r\n\r\nprocedure TComponent.ReadLeft(AReader: TReader);\r\n\r\nbegin\r\n FDesignInfo := (FDesignInfo and $ffff0000) or (AReader.ReadInteger and $ffff);\r\nend;\r\n\r\n\r\nprocedure TComponent.ReadTop(AReader: TReader);\r\n\r\nbegin\r\n FDesignInfo := ((AReader.ReadInteger and $ffff) shl 16) or (FDesignInfo and $ffff);\r\nend;\r\n\r\n\r\nprocedure TComponent.Remove(AComponent: TComponent);\r\n\r\nbegin\r\n AComponent.FOwner:=Nil;\r\n If assigned(FCOmponents) then\r\n begin\r\n FComponents.Remove(AComponent);\r\n IF FComponents.Count=0 then\r\n begin\r\n FComponents.Destroy;\r\n FComponents:=Nil;\r\n end;\r\n end;\r\nend;\r\n\r\n\r\nprocedure TComponent.RemoveNotification(AComponent: TComponent);\r\n\r\nbegin\r\n if FFreeNotifies<>nil then\r\n begin\r\n FFreeNotifies.Remove(AComponent);\r\n if FFreeNotifies.Count=0 then\r\n begin\r\n FFreeNotifies.Destroy;\r\n FFreeNotifies:=nil;\r\n Exclude(FComponentState,csFreeNotification);\r\n end;\r\n end;\r\nend;\r\n\r\n\r\nprocedure TComponent.SetComponentIndex(Value: Integer);\r\n\r\nVar Temp,Count : longint;\r\n\r\nbegin\r\n If Not assigned(Fowner) then exit;\r\n Temp:=getcomponentindex;\r\n If temp<0 then exit;\r\n If value<0 then value:=0;\r\n Count:=Fowner.FComponents.Count;\r\n If Value>=Count then value:=count-1;\r\n If Value<>Temp then\r\n begin\r\n FOWner.FComponents.Delete(Temp);\r\n FOwner.FComponents.Insert(Value,Self);\r\n end;\r\nend;\r\n\r\n\r\nprocedure TComponent.ChangeName(const NewName: TComponentName);\r\n\r\nbegin\r\n FName:=NewName;\r\nend;\r\n\r\n\r\nprocedure TComponent.DefineProperties(Filer: TFiler);\r\n\r\nvar\r\n Temp: LongInt;\r\n Ancestor: TComponent;\r\nbegin\r\n Ancestor := TComponent(Filer.Ancestor);\r\n if Assigned(Ancestor) then\r\n Temp := Ancestor.FDesignInfo\r\n else\r\n Temp := 0;\r\n Filer.DefineProperty('Left', @ReadLeft, @WriteLeft, (FDesignInfo and $ffff) <> (Temp and $ffff));\r\n Filer.DefineProperty('Top', @ReadTop, @WriteTop, (FDesignInfo and $ffff0000) <> (Temp and $ffff0000));\r\nend;\r\n\r\n\r\nprocedure TComponent.GetChildren(Proc: TGetChildProc; Root: TComponent);\r\n\r\nbegin\r\n // Does nothing.\r\n if Proc=nil then ;\r\n if Root=nil then ;\r\nend;\r\n\r\n\r\nfunction TComponent.GetChildOwner: TComponent;\r\n\r\nbegin\r\n Result:=Nil;\r\nend;\r\n\r\n\r\nfunction TComponent.GetChildParent: TComponent;\r\n\r\nbegin\r\n Result:=Self;\r\nend;\r\n\r\n\r\nfunction TComponent.GetNamePath: string;\r\n\r\nbegin\r\n Result:=FName;\r\nend;\r\n\r\n\r\nfunction TComponent.GetOwner: TPersistent;\r\n\r\nbegin\r\n Result:=FOwner;\r\nend;\r\n\r\n\r\nprocedure TComponent.Loaded;\r\n\r\nbegin\r\n Exclude(FComponentState,csLoading);\r\nend;\r\n\r\nprocedure TComponent.Loading;\r\nbegin\r\n Include(FComponentState,csLoading);\r\nend;\r\n\r\nprocedure TComponent.SetWriting(Value: Boolean);\r\nbegin\r\n If Value then\r\n Include(FComponentState,csWriting)\r\n else\r\n Exclude(FComponentState,csWriting);\r\nend;\r\n\r\nprocedure TComponent.SetReading(Value: Boolean);\r\nbegin\r\n If Value then\r\n Include(FComponentState,csReading)\r\n else\r\n Exclude(FComponentState,csReading);\r\nend;\r\n\r\n\r\nprocedure TComponent.Notification(AComponent: TComponent; Operation: TOperation);\r\n\r\nVar\r\n C : Longint;\r\n\r\nbegin\r\n If (Operation=opRemove) then\r\n RemoveFreeNotification(AComponent);\r\n If Not assigned(FComponents) then\r\n exit;\r\n C:=FComponents.Count-1;\r\n While (C>=0) do\r\n begin\r\n TComponent(FComponents.Items[C]).Notification(AComponent,Operation);\r\n Dec(C);\r\n if C>=FComponents.Count then\r\n C:=FComponents.Count-1;\r\n end;\r\nend;\r\n\r\n\r\nprocedure TComponent.PaletteCreated;\r\nbegin\r\nend;\r\n\r\nprocedure TComponent.ReadState(Reader: TReader);\r\n\r\nbegin\r\n Reader.ReadData(Self);\r\nend;\r\n\r\n\r\nprocedure TComponent.SetAncestor(Value: Boolean);\r\n\r\nVar Runner : Longint;\r\n\r\nbegin\r\n If Value then\r\n Include(FComponentState,csAncestor)\r\n else\r\n Exclude(FCOmponentState,csAncestor);\r\n if Assigned(FComponents) then\r\n For Runner:=0 To FComponents.Count-1 do\r\n TComponent(FComponents.Items[Runner]).SetAncestor(Value);\r\nend;\r\n\r\n\r\nprocedure TComponent.SetDesigning(Value: Boolean; SetChildren: Boolean);\r\n\r\nVar Runner : Longint;\r\n\r\nbegin\r\n If Value then\r\n Include(FComponentState,csDesigning)\r\n else\r\n Exclude(FComponentState,csDesigning);\r\n if Assigned(FComponents) and SetChildren then\r\n For Runner:=0 To FComponents.Count - 1 do\r\n TComponent(FComponents.items[Runner]).SetDesigning(Value);\r\nend;\r\n\r\nprocedure TComponent.SetDesignInstance(Value: Boolean);\r\n\r\nbegin\r\n If Value then\r\n Include(FComponentState,csDesignInstance)\r\n else\r\n Exclude(FComponentState,csDesignInstance);\r\nend;\r\n\r\nprocedure TComponent.SetInline(Value: Boolean);\r\n\r\nbegin\r\n If Value then\r\n Include(FComponentState,csInline)\r\n else\r\n Exclude(FComponentState,csInline);\r\nend;\r\n\r\n\r\nprocedure TComponent.SetName(const NewName: TComponentName);\r\n\r\nbegin\r\n If FName=NewName then exit;\r\n If (NewName<>'') and not IsValidIdent(NewName) then\r\n Raise EComponentError.CreateFmt(SInvalidName,[NewName]);\r\n If Assigned(FOwner) Then\r\n FOwner.ValidateRename(Self,FName,NewName)\r\n else\r\n ValidateRename(Nil,FName,NewName);\r\n SetReference(False);\r\n ChangeName(NewName);\r\n SetReference(True);\r\nend;\r\n\r\n\r\nprocedure TComponent.SetChildOrder(Child: TComponent; Order: Integer);\r\n\r\nbegin\r\n // does nothing\r\n if Child=nil then ;\r\n if Order=0 then ;\r\nend;\r\n\r\n\r\nprocedure TComponent.SetParentComponent(Value: TComponent);\r\n\r\nbegin\r\n // Does nothing\r\n if Value=nil then ;\r\nend;\r\n\r\n\r\nprocedure TComponent.Updating;\r\n\r\nbegin\r\n Include (FComponentState,csUpdating);\r\nend;\r\n\r\n\r\nprocedure TComponent.Updated;\r\n\r\nbegin\r\n Exclude(FComponentState,csUpdating);\r\nend;\r\n\r\n\r\nprocedure TComponent.ValidateRename(AComponent: TComponent; const CurName, NewName: string);\r\n\r\nbegin\r\n//!! This contradicts the Delphi manual.\r\n If (AComponent<>Nil) and (CompareText(CurName,NewName)<>0) and (AComponent.Owner = Self) and\r\n (FindComponent(NewName)<>Nil) then\r\n raise EComponentError.Createfmt(SDuplicateName,[newname]);\r\n If (csDesigning in FComponentState) and (FOwner<>Nil) then\r\n FOwner.ValidateRename(AComponent,Curname,Newname);\r\nend;\r\n\r\nProcedure TComponent.SetReference(Enable: Boolean);\r\n\r\nvar\r\n aField, aValue, aOwner : Pointer;\r\n\r\nbegin\r\n if Name='' then\r\n exit;\r\n if Assigned(Owner) then\r\n begin\r\n aOwner:=Owner; // so as not to depend on low-level names\r\n aField := Owner.FieldAddress(Name);\r\n if Assigned(aField) then\r\n begin\r\n if Enable then\r\n aValue:= Self\r\n else\r\n aValue := nil;\r\n TJSObject(aOwner)[String(TJSObject(aField)['name'])]:=aValue;\r\n end;\r\n end;\r\nend;\r\n\r\n\r\nprocedure TComponent.WriteLeft(AWriter: TWriter);\r\n\r\nbegin\r\n AWriter.WriteInteger(FDesignInfo and $ffff);\r\nend;\r\n\r\n\r\nprocedure TComponent.WriteTop(AWriter: TWriter);\r\n\r\nbegin\r\n AWriter.WriteInteger((FDesignInfo shr 16) and $ffff);\r\nend;\r\n\r\n\r\nprocedure TComponent.ValidateContainer(AComponent: TComponent);\r\n\r\nbegin\r\n AComponent.ValidateInsert(Self);\r\nend;\r\n\r\n\r\nprocedure TComponent.ValidateInsert(AComponent: TComponent);\r\n\r\nbegin\r\n // Does nothing.\r\n if AComponent=nil then ;\r\nend;\r\n\r\nfunction TComponent._AddRef: Integer;\r\nbegin\r\n Result:=-1;\r\nend;\r\n\r\nfunction TComponent._Release: Integer;\r\nbegin\r\n Result:=-1;\r\nend;\r\n\r\n\r\nconstructor TComponent.Create(AOwner: TComponent);\r\n\r\nbegin\r\n FComponentStyle:=[csInheritable];\r\n If Assigned(AOwner) then AOwner.InsertComponent(Self);\r\nend;\r\n\r\n\r\ndestructor TComponent.Destroy;\r\n\r\nVar\r\n I : Integer;\r\n C : TComponent;\r\n\r\nbegin\r\n Destroying;\r\n If Assigned(FFreeNotifies) then\r\n begin\r\n I:=FFreeNotifies.Count-1;\r\n While (I>=0) do\r\n begin\r\n C:=TComponent(FFreeNotifies.Items[I]);\r\n // Delete, so one component is not notified twice, if it is owned.\r\n FFreeNotifies.Delete(I);\r\n C.Notification (self,opRemove);\r\n If (FFreeNotifies=Nil) then\r\n I:=0\r\n else if (I>FFreeNotifies.Count) then\r\n I:=FFreeNotifies.Count;\r\n dec(i);\r\n end;\r\n FreeAndNil(FFreeNotifies);\r\n end;\r\n DestroyComponents;\r\n If FOwner<>Nil Then FOwner.RemoveComponent(Self);\r\n inherited destroy;\r\nend;\r\n\r\nprocedure TComponent.AfterLoadDFMValues;\r\nbegin\r\n EndUpdate;\r\n Loaded;\r\nend;\r\n\r\n\r\nprocedure TComponent.BeforeDestruction;\r\nbegin\r\n if not(csDestroying in FComponentstate) then\r\n Destroying;\r\nend;\r\n\r\nprocedure TComponent.BeforeLoadDFMValues;\r\nbegin\r\n if not(csDesigning in ComponentState) then\r\n Loading;\r\n BeginUpdate;\r\nend;\r\n\r\nprocedure TComponent.BeginUpdate;\r\nbegin\r\nend;\r\n\r\nprocedure TComponent.DestroyComponents;\r\n\r\nVar acomponent: TComponent;\r\n\r\nbegin\r\n While assigned(FComponents) do\r\n begin\r\n aComponent:=TComponent(FComponents.Last);\r\n Remove(aComponent);\r\n Acomponent.Destroy;\r\n end;\r\nend;\r\n\r\n\r\nprocedure TComponent.Destroying;\r\n\r\nVar Runner : longint;\r\n\r\nbegin\r\n If csDestroying in FComponentstate Then Exit;\r\n include (FComponentState,csDestroying);\r\n If Assigned(FComponents) then\r\n for Runner:=0 to FComponents.Count-1 do\r\n TComponent(FComponents.Items[Runner]).Destroying;\r\nend;\r\n\r\nprocedure TComponent.EndUpdate;\r\nbegin\r\nend;\r\n\r\nfunction TComponent.QueryInterface(const IID: TGUID; out Obj): HRESULT;\r\nbegin\r\n if GetInterface(IID, Obj) then\r\n Result := S_OK\r\n else\r\n Result := E_NOINTERFACE;\r\n\r\nend;\r\n\r\nprocedure TComponent.WriteState(Writer: TWriter);\r\nbegin\r\n Writer.WriteComponentData(Self);\r\nend;\r\n\r\n\r\nfunction TComponent.FindComponent(const AName: string): TComponent;\r\n\r\nVar I : longint;\r\n\r\nbegin\r\n Result:=Nil;\r\n If (AName='') or Not assigned(FComponents) then exit;\r\n For i:=0 to FComponents.Count-1 do\r\n if (CompareText(TComponent(FComponents[I]).Name,AName)=0) then\r\n begin\r\n Result:=TComponent(FComponents.Items[I]);\r\n exit;\r\n end;\r\nend;\r\n\r\n\r\nprocedure TComponent.FreeNotification(AComponent: TComponent);\r\n\r\nbegin\r\n If (Owner<>Nil) and (AComponent=Owner) then exit;\r\n If not (Assigned(FFreeNotifies)) then\r\n FFreeNotifies:=TFpList.Create;\r\n If FFreeNotifies.IndexOf(AComponent)=-1 then\r\n begin\r\n FFreeNotifies.Add(AComponent);\r\n AComponent.FreeNotification (self);\r\n end;\r\nend;\r\n\r\n\r\nprocedure TComponent.RemoveFreeNotification(AComponent: TComponent);\r\nbegin\r\n RemoveNotification(AComponent);\r\n AComponent.RemoveNotification (self);\r\nend;\r\n\r\n\r\nfunction TComponent.GetParentComponent: TComponent;\r\n\r\nbegin\r\n Result:=Nil;\r\nend;\r\n\r\n\r\nfunction TComponent.HasParent: Boolean;\r\n\r\nbegin\r\n Result:=False;\r\nend;\r\n\r\n\r\nprocedure TComponent.InsertComponent(AComponent: TComponent);\r\n\r\nbegin\r\n AComponent.ValidateContainer(Self);\r\n ValidateRename(AComponent,'',AComponent.FName);\r\n Insert(AComponent);\r\n If csDesigning in FComponentState then\r\n AComponent.SetDesigning(true);\r\n Notification(AComponent,opInsert);\r\nend;\r\n\r\n\r\nprocedure TComponent.RemoveComponent(AComponent: TComponent);\r\n\r\nbegin\r\n Notification(AComponent,opRemove);\r\n Remove(AComponent);\r\n Acomponent.Setdesigning(False);\r\n ValidateRename(AComponent,AComponent.FName,'');\r\nend;\r\n\r\nprocedure TComponent.SetSubComponent(ASubComponent: Boolean);\r\nbegin\r\n if ASubComponent then\r\n Include(FComponentStyle, csSubComponent)\r\n else\r\n Exclude(FComponentStyle, csSubComponent);\r\nend;\r\n\r\nfunction TComponent.GetEnumerator: TComponentEnumerator;\r\nbegin\r\n Result:=TComponentEnumerator.Create(Self);\r\nend;\r\n\r\nfunction TComponent.GetLeft: Integer;\r\nbegin\r\n Result := FLeft;\r\nend;\r\n\r\nfunction TComponent.GetTop: Integer;\r\nbegin\r\n Result := FTop;\r\nend;\r\n\r\nprocedure TComponent.SetLeft(AValue: Integer);\r\nbegin\r\n FLeft := AValue;\r\nend;\r\n\r\nprocedure TComponent.SetTop(AValue: Integer);\r\nbegin\r\n FTop := AValue;\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n TStream\r\n ---------------------------------------------------------------------}\r\n\r\nResourcestring\r\n SStreamInvalidSeek = 'Seek is not implemented for class %s';\r\n SStreamNoReading = 'Stream reading is not implemented for class %s';\r\n SStreamNoWriting = 'Stream writing is not implemented for class %s';\r\n SReadError = 'Could not read data from stream';\r\n SWriteError = 'Could not write data to stream';\r\n SMemoryStreamError = 'Could not allocate memory';\r\n SerrInvalidStreamSize = 'Invalid Stream size';\r\n\r\nprocedure TStream.ReadNotImplemented;\r\nbegin\r\n raise EStreamError.CreateFmt(SStreamNoReading, [ClassName]);\r\nend;\r\n\r\nprocedure TStream.WriteNotImplemented;\r\nbegin\r\n raise EStreamError.CreateFmt(SStreamNoWriting, [ClassName]);\r\nend;\r\n\r\nfunction TStream.Read(var Buffer: TBytes; Count: Longint): Longint;\r\nbegin\r\n Result:=Read(Buffer,0,Count);\r\nend;\r\n\r\n\r\n\r\nfunction TStream.Write(const Buffer: TBytes; Count: Longint): Longint;\r\nbegin\r\n Result:=Self.Write(Buffer,0,Count);\r\nend;\r\n\r\n\r\n\r\nfunction TStream.GetPosition: NativeInt;\r\n\r\nbegin\r\n Result:=Seek(0,soCurrent);\r\nend;\r\n\r\nprocedure TStream.SetPosition(const Pos: NativeInt);\r\n\r\nbegin\r\n Seek(pos,soBeginning);\r\nend;\r\n\r\nprocedure TStream.SetSize64(const NewSize: NativeInt);\r\n\r\nbegin\r\n // Required because can't use overloaded functions in properties\r\n SetSize(NewSize);\r\nend;\r\n\r\nfunction TStream.GetSize: NativeInt;\r\n\r\nvar\r\n p : NativeInt;\r\n\r\nbegin\r\n p:=Seek(0,soCurrent);\r\n GetSize:=Seek(0,soEnd);\r\n Seek(p,soBeginning);\r\nend;\r\n\r\nprocedure TStream.SetSize(const NewSize: NativeInt);\r\n\r\nbegin\r\n if NewSize<0 then\r\n Raise EStreamError.Create(SerrInvalidStreamSize);\r\nend;\r\n\r\nprocedure TStream.Discard(const Count: NativeInt);\r\n\r\nconst\r\n CSmallSize =255;\r\n CLargeMaxBuffer =32*1024; // 32 KiB\r\n\r\nvar\r\n Buffer: TBytes;\r\n\r\nbegin\r\n if Count=0 then\r\n Exit;\r\n if (Count<=CSmallSize) then\r\n begin\r\n SetLength(Buffer,CSmallSize);\r\n ReadBuffer(Buffer,Count)\r\n end\r\n else\r\n DiscardLarge(Count,CLargeMaxBuffer);\r\nend;\r\n\r\nprocedure TStream.DiscardLarge(Count: NativeInt; const MaxBufferSize: Longint);\r\n\r\nvar\r\n Buffer: TBytes;\r\n\r\nbegin\r\n if Count=0 then\r\n Exit;\r\n if Count>MaxBufferSize then\r\n SetLength(Buffer,MaxBufferSize)\r\n else\r\n SetLength(Buffer,Count);\r\n while (Count>=Length(Buffer)) do\r\n begin\r\n ReadBuffer(Buffer,Length(Buffer));\r\n Dec(Count,Length(Buffer));\r\n end;\r\n if Count>0 then\r\n ReadBuffer(Buffer,Count);\r\nend;\r\n\r\nprocedure TStream.InvalidSeek;\r\n\r\nbegin\r\n raise EStreamError.CreateFmt(SStreamInvalidSeek, [ClassName]);\r\nend;\r\n\r\nprocedure TStream.FakeSeekForward(Offset: NativeInt; const Origin: TSeekOrigin; const Pos: NativeInt);\r\n\r\nbegin\r\n if Origin=soBeginning then\r\n Dec(Offset,Pos);\r\n if (Offset<0) or (Origin=soEnd) then\r\n InvalidSeek;\r\n if Offset>0 then\r\n Discard(Offset);\r\n end;\r\n\r\nfunction TStream.ReadData({var} Buffer: TBytes; Count: NativeInt): NativeInt;\r\nbegin\r\n Result:=Read(Buffer,0,Count);\r\nend;\r\n\r\n\r\nfunction TStream.ReadMaxSizeData(Buffer : TBytes; aSize,aCount : NativeInt) : NativeInt;\r\n\r\nVar\r\n CP : NativeInt;\r\n\r\nbegin\r\n if aCount<=aSize then\r\n Result:=read(Buffer,aCount)\r\n else\r\n begin\r\n Result:=Read(Buffer,aSize);\r\n CP:=Position;\r\n Result:=Result+Seek(aCount-aSize,soCurrent)-CP;\r\n end\r\nend;\r\n\r\nfunction TStream.WriteMaxSizeData(const Buffer : TBytes; aSize,aCount : NativeInt) : NativeInt;\r\nVar\r\n CP : NativeInt;\r\n\r\nbegin\r\n if aCount<=aSize then\r\n Result:=Self.Write(Buffer,aCount)\r\n else\r\n begin\r\n Result:=Self.Write(Buffer,aSize);\r\n CP:=Position;\r\n Result:=Result+Seek(aCount-aSize,soCurrent)-CP;\r\n end\r\nend;\r\n\r\nprocedure TStream.WriteExactSizeData(const Buffer : TBytes; aSize, aCount: NativeInt);\r\nbegin\r\n // Embarcadero docs mentions no exception. Does not seem very logical\r\n WriteMaxSizeData(Buffer,aSize,ACount);\r\nend;\r\n\r\nprocedure TStream.ReadExactSizeData(Buffer : TBytes; aSize, aCount: NativeInt);\r\nbegin\r\n if ReadMaxSizeData(Buffer,aSize,ACount)<>aCount then\r\n Raise EReadError.Create(SReadError);\r\nend;\r\n\r\n\r\nfunction TStream.ReadData(var Buffer: Boolean): NativeInt;\r\n\r\nVar\r\n B : Byte;\r\n\r\nbegin\r\n Result:=ReadData(B,1);\r\n if Result=1 then\r\n Buffer:=B<>0;\r\nend;\r\n\r\nfunction TStream.ReadData(var Buffer: Boolean; Count: NativeInt): NativeInt;\r\n\r\nVar\r\n B : TBytes;\r\n\r\nbegin\r\n SetLength(B,Count);\r\n Result:=ReadMaxSizeData(B,1,Count);\r\n if Result>0 then\r\n Buffer:=B[0]<>0\r\nend;\r\n\r\n\r\nfunction TStream.ReadData(var Buffer: WideChar): NativeInt;\r\nbegin\r\n Result:=ReadData(Buffer,2);\r\nend;\r\n\r\nfunction TStream.ReadData(var Buffer: WideChar; Count: NativeInt): NativeInt;\r\n\r\nVar\r\n W : Word;\r\n\r\nbegin\r\n Result:=ReadData(W,Count);\r\n if Result=2 then\r\n Buffer:=WideChar(W);\r\nend;\r\n\r\nfunction TStream.ReadData(var Buffer: Int8): NativeInt;\r\nbegin\r\n Result:=ReadData(Buffer,1);\r\nend;\r\n\r\nFunction TStream.MakeInt(B : TBytes; aSize : Integer; Signed : Boolean) : NativeInt;\r\n\r\nVar\r\n Mem : TJSArrayBuffer;\r\n A : TJSUInt8Array;\r\n D : TJSDataView;\r\n isLittle : Boolean;\r\n\r\nbegin\r\n IsLittle:=(Endian=TEndian.Little);\r\n Mem:=TJSArrayBuffer.New(Length(B));\r\n A:=TJSUInt8Array.new(Mem);\r\n A._set(B);\r\n D:=TJSDataView.New(Mem);\r\n if Signed then\r\n case aSize of\r\n 1 : Result:=D.getInt8(0);\r\n 2 : Result:=D.getInt16(0,IsLittle);\r\n 4 : Result:=D.getInt32(0,IsLittle);\r\n // Todo : fix sign\r\n 8 : Result:=Round(D.getFloat64(0,IsLittle));\r\n end\r\n else\r\n case aSize of\r\n 1 : Result:=D.getUInt8(0);\r\n 2 : Result:=D.getUInt16(0,IsLittle);\r\n 4 : Result:=D.getUInt32(0,IsLittle);\r\n 8 : Result:=Round(D.getFloat64(0,IsLittle));\r\n end\r\nend;\r\n\r\nfunction TStream.MakeBytes(B: NativeInt; aSize: Integer; Signed: Boolean): TBytes;\r\n\r\n\r\nVar\r\n Mem : TJSArrayBuffer;\r\n A : TJSUInt8Array;\r\n D : TJSDataView;\r\n isLittle : Boolean;\r\n\r\nbegin\r\n IsLittle:=(Endian=TEndian.Little);\r\n Mem:=TJSArrayBuffer.New(aSize);\r\n D:=TJSDataView.New(Mem);\r\n if Signed then\r\n case aSize of\r\n 1 : D.setInt8(0,B);\r\n 2 : D.setInt16(0,B,IsLittle);\r\n 4 : D.setInt32(0,B,IsLittle);\r\n 8 : D.setFloat64(0,B,IsLittle);\r\n end\r\n else\r\n case aSize of\r\n 1 : D.SetUInt8(0,B);\r\n 2 : D.SetUInt16(0,B,IsLittle);\r\n 4 : D.SetUInt32(0,B,IsLittle);\r\n 8 : D.setFloat64(0,B,IsLittle);\r\n end;\r\n SetLength(Result,aSize);\r\n A:=TJSUInt8Array.new(Mem);\r\n Result:=TMemoryStream.MemoryToBytes(A);\r\nend;\r\n\r\n\r\nfunction TStream.ReadData(var Buffer: Int8; Count: NativeInt): NativeInt;\r\n\r\nVar\r\n B : TBytes;\r\nbegin\r\n SetLength(B,Count);\r\n Result:=ReadMaxSizeData(B,1,Count);\r\n if Result>=1 then\r\n Buffer:=MakeInt(B,1,True);\r\nend;\r\n\r\nfunction TStream.ReadData(var Buffer: UInt8): NativeInt;\r\nbegin\r\n Result:=ReadData(Buffer,1);\r\nend;\r\n\r\nfunction TStream.ReadData(var Buffer: UInt8; Count: NativeInt): NativeInt;\r\nVar\r\n B : TBytes;\r\nbegin\r\n SetLength(B,Count);\r\n Result:=ReadMaxSizeData(B,1,Count);\r\n if Result>=1 then\r\n Buffer:=MakeInt(B,1,False);\r\nend;\r\n\r\nfunction TStream.ReadData(var Buffer: Int16): NativeInt;\r\nbegin\r\n Result:=ReadData(Buffer,2);\r\nend;\r\n\r\nfunction TStream.ReadData(var Buffer: Int16; Count: NativeInt): NativeInt;\r\nVar\r\n B : TBytes;\r\nbegin\r\n SetLength(B,Count);\r\n Result:=ReadMaxSizeData(B,2,Count);\r\n if Result>=2 then\r\n Buffer:=MakeInt(B,2,True);\r\nend;\r\n\r\nfunction TStream.ReadData(var Buffer: UInt16): NativeInt;\r\nbegin\r\n Result:=ReadData(Buffer,2);\r\nend;\r\n\r\nfunction TStream.ReadData(var Buffer: UInt16; Count: NativeInt): NativeInt;\r\nVar\r\n B : TBytes;\r\nbegin\r\n SetLength(B,Count);\r\n Result:=ReadMaxSizeData(B,2,Count);\r\n if Result>=2 then\r\n Buffer:=MakeInt(B,2,False);\r\nend;\r\n\r\nfunction TStream.ReadData(var Buffer: Int32): NativeInt;\r\nbegin\r\n Result:=ReadData(Buffer,4);\r\nend;\r\n\r\nfunction TStream.ReadData(var Buffer: Int32; Count: NativeInt): NativeInt;\r\nVar\r\n B : TBytes;\r\nbegin\r\n SetLength(B,Count);\r\n Result:=ReadMaxSizeData(B,4,Count);\r\n if Result>=4 then\r\n Buffer:=MakeInt(B,4,True);\r\nend;\r\n\r\nfunction TStream.ReadData(var Buffer: UInt32): NativeInt;\r\nbegin\r\n Result:=ReadData(Buffer,4);\r\nend;\r\n\r\nfunction TStream.ReadData(var Buffer: UInt32; Count: NativeInt): NativeInt;\r\n\r\nVar\r\n B : TBytes;\r\nbegin\r\n SetLength(B,Count);\r\n Result:=ReadMaxSizeData(B,4,Count);\r\n if Result>=4 then\r\n Buffer:=MakeInt(B,4,False);\r\nend;\r\n\r\n\r\nfunction TStream.ReadData(var Buffer: NativeInt): NativeInt;\r\n\r\nbegin\r\n Result:=ReadData(Buffer,8);\r\nend;\r\n\r\nfunction TStream.ReadData(var Buffer: NativeInt; Count: NativeInt): NativeInt;\r\n\r\nVar\r\n B : TBytes;\r\n\r\nbegin\r\n SetLength(B,Count);\r\n Result:=ReadMaxSizeData(B,8,8);\r\n if Result>=8 then\r\n Buffer:=MakeInt(B,8,True);\r\nend;\r\n\r\nfunction TStream.ReadData(var Buffer: NativeLargeUInt): NativeInt;\r\nbegin\r\n Result:=ReadData(Buffer,8);\r\nend;\r\n\r\nfunction TStream.ReadData(var Buffer: NativeLargeUInt; Count: NativeInt): NativeInt;\r\n\r\nVar\r\n B : TBytes;\r\n B1 : Integer;\r\nbegin\r\n SetLength(B,Count);\r\n Result:=ReadMaxSizeData(B,4,4);\r\n if Result>=4 then\r\n begin\r\n B1:=MakeInt(B,4,False);\r\n Result:=Result+ReadMaxSizeData(B,4,4);\r\n Buffer:=MakeInt(B,4,False);\r\n Buffer:=(Buffer shl 32) or B1;\r\n end;\r\nend;\r\n\r\nfunction TStream.ReadData(var Buffer: Double): NativeInt;\r\nbegin\r\n Result:=ReadData(Buffer,8);\r\nend;\r\n\r\nfunction TStream.ReadData(var Buffer: Double; Count: NativeInt): NativeInt;\r\n\r\nVar\r\n B : TBytes;\r\n Mem : TJSArrayBuffer;\r\n A : TJSUInt8Array;\r\n D : TJSDataView;\r\n\r\nbegin\r\n SetLength(B,Count);\r\n Result:=ReadMaxSizeData(B,8,Count);\r\n if Result>=8 then\r\n begin\r\n Mem:=TJSArrayBuffer.New(8);\r\n A:=TJSUInt8Array.new(Mem);\r\n A._set(B);\r\n D:=TJSDataView.New(Mem);\r\n Buffer:=D.getFloat64(0);\r\n end;\r\nend;\r\n\r\nprocedure TStream.ReadBuffer(var Buffer: TBytes; Count: NativeInt);\r\nbegin\r\n ReadBuffer(Buffer,0,Count);\r\nend;\r\n\r\nprocedure TStream.ReadBuffer(var Buffer: TBytes; Offset, Count: NativeInt);\r\nbegin\r\n if Read(Buffer,OffSet,Count)<>Count then\r\n Raise EStreamError.Create(SReadError);\r\nend;\r\n\r\nprocedure TStream.ReadBufferData(var Buffer: Boolean);\r\nbegin\r\n ReadBufferData(Buffer,1);\r\nend;\r\n\r\nprocedure TStream.ReadBufferData(var Buffer: Boolean; Count: NativeInt);\r\nbegin\r\n if (ReadData(Buffer,Count)<>Count) then\r\n Raise EStreamError.Create(SReadError);\r\nend;\r\n\r\nprocedure TStream.ReadBufferData(var Buffer: WideChar);\r\nbegin\r\n ReadBufferData(Buffer,2);\r\nend;\r\n\r\nprocedure TStream.ReadBufferData(var Buffer: WideChar; Count: NativeInt);\r\nbegin\r\n if (ReadData(Buffer,Count)<>Count) then\r\n Raise EStreamError.Create(SReadError);\r\nend;\r\n\r\nprocedure TStream.ReadBufferData(var Buffer: Int8);\r\nbegin\r\n ReadBufferData(Buffer,1);\r\nend;\r\n\r\nprocedure TStream.ReadBufferData(var Buffer: Int8; Count: NativeInt);\r\nbegin\r\n if (ReadData(Buffer,Count)<>Count) then\r\n Raise EStreamError.Create(SReadError);\r\nend;\r\n\r\nprocedure TStream.ReadBufferData(var Buffer: UInt8);\r\nbegin\r\n ReadBufferData(Buffer,1);\r\nend;\r\n\r\nprocedure TStream.ReadBufferData(var Buffer: UInt8; Count: NativeInt);\r\nbegin\r\n if (ReadData(Buffer,Count)<>Count) then\r\n Raise EStreamError.Create(SReadError);\r\nend;\r\n\r\nprocedure TStream.ReadBufferData(var Buffer: Int16);\r\nbegin\r\n ReadBufferData(Buffer,2);\r\nend;\r\n\r\nprocedure TStream.ReadBufferData(var Buffer: Int16; Count: NativeInt);\r\nbegin\r\n if (ReadData(Buffer,Count)<>Count) then\r\n Raise EStreamError.Create(SReadError);\r\nend;\r\n\r\nprocedure TStream.ReadBufferData(var Buffer: UInt16);\r\nbegin\r\n ReadBufferData(Buffer,2);\r\nend;\r\n\r\nprocedure TStream.ReadBufferData(var Buffer: UInt16; Count: NativeInt);\r\nbegin\r\n if (ReadData(Buffer,Count)<>Count) then\r\n Raise EStreamError.Create(SReadError);\r\nend;\r\n\r\nprocedure TStream.ReadBufferData(var Buffer: Int32);\r\nbegin\r\n ReadBufferData(Buffer,4);\r\nend;\r\n\r\nprocedure TStream.ReadBufferData(var Buffer: Int32; Count: NativeInt);\r\nbegin\r\n if (ReadData(Buffer,Count)<>Count) then\r\n Raise EStreamError.Create(SReadError);\r\nend;\r\n\r\nprocedure TStream.ReadBufferData(var Buffer: UInt32);\r\nbegin\r\n ReadBufferData(Buffer,4);\r\nend;\r\n\r\nprocedure TStream.ReadBufferData(var Buffer: UInt32; Count: NativeInt);\r\nbegin\r\n if (ReadData(Buffer,Count)<>Count) then\r\n Raise EStreamError.Create(SReadError);\r\nend;\r\n\r\nprocedure TStream.ReadBufferData(var Buffer: NativeLargeInt);\r\nbegin\r\n ReadBufferData(Buffer,8)\r\nend;\r\n\r\nprocedure TStream.ReadBufferData(var Buffer: NativeLargeInt; Count: NativeInt);\r\nbegin\r\n if (ReadData(Buffer,Count)<>Count) then\r\n Raise EStreamError.Create(SReadError);\r\nend;\r\n\r\nprocedure TStream.ReadBufferData(var Buffer: NativeLargeUInt);\r\nbegin\r\n ReadBufferData(Buffer,8);\r\nend;\r\n\r\nprocedure TStream.ReadBufferData(var Buffer: NativeLargeUInt; Count: NativeInt);\r\nbegin\r\n if (ReadData(Buffer,Count)<>Count) then\r\n Raise EStreamError.Create(SReadError);\r\nend;\r\n\r\n\r\nprocedure TStream.ReadBufferData(var Buffer: Double);\r\nbegin\r\n ReadBufferData(Buffer,8);\r\nend;\r\n\r\nprocedure TStream.ReadBufferData(var Buffer: Double; Count: NativeInt);\r\nbegin\r\n if (ReadData(Buffer,Count)<>Count) then\r\n Raise EStreamError.Create(SReadError);\r\nend;\r\n\r\nprocedure TStream.WriteBuffer(const Buffer: TBytes; Count: NativeInt);\r\nbegin\r\n WriteBuffer(Buffer,0,Count);\r\nend;\r\n\r\nprocedure TStream.WriteBuffer(const Buffer: TBytes; Offset, Count: NativeInt);\r\nbegin\r\n if Self.Write(Buffer,Offset,Count)<>Count then\r\n Raise EStreamError.Create(SWriteError);\r\nend;\r\n\r\nfunction TStream.WriteData(const Buffer: TBytes; Count: NativeInt): NativeInt;\r\nbegin\r\n Result:=Self.Write(Buffer, 0, Count);\r\nend;\r\n\r\nfunction TStream.WriteData(const Buffer: Boolean): NativeInt;\r\nbegin\r\n Result:=WriteData(Buffer,1);\r\nend;\r\n\r\nfunction TStream.WriteData(const Buffer: Boolean; Count: NativeInt): NativeInt;\r\n\r\nVar\r\n B : Int8;\r\n\r\nbegin\r\n B:=Ord(Buffer);\r\n Result:=WriteData(B,Count);\r\nend;\r\n\r\nfunction TStream.WriteData(const Buffer: WideChar): NativeInt;\r\n\r\nbegin\r\n Result:=WriteData(Buffer,2);\r\nend;\r\n\r\nfunction TStream.WriteData(const Buffer: WideChar; Count: NativeInt): NativeInt;\r\nVar\r\n U : UInt16;\r\nbegin\r\n U:=Ord(Buffer);\r\n Result:=WriteData(U,Count);\r\nend;\r\n\r\nfunction TStream.WriteData(const Buffer: Int8): NativeInt;\r\n\r\nbegin\r\n Result:=WriteData(Buffer,1);\r\nend;\r\n\r\nfunction TStream.WriteData(const Buffer: Int8; Count: NativeInt): NativeInt;\r\nbegin\r\n Result:=WriteMaxSizeData(MakeBytes(Buffer,1,True),1,Count);\r\nend;\r\n\r\nfunction TStream.WriteData(const Buffer: UInt8): NativeInt;\r\nbegin\r\n Result:=WriteData(Buffer,1);\r\nend;\r\n\r\nfunction TStream.WriteData(const Buffer: UInt8; Count: NativeInt): NativeInt;\r\nbegin\r\n Result:=WriteMaxSizeData(MakeBytes(Buffer,1,False),1,Count);\r\nend;\r\n\r\nfunction TStream.WriteData(const Buffer: Int16): NativeInt;\r\nbegin\r\n Result:=WriteData(Buffer,2);\r\nend;\r\n\r\nfunction TStream.WriteData(const Buffer: Int16; Count: NativeInt): NativeInt;\r\nbegin\r\n Result:=WriteMaxSizeData(MakeBytes(Buffer,2,True),2,Count);\r\nend;\r\n\r\nfunction TStream.WriteData(const Buffer: UInt16): NativeInt;\r\nbegin\r\n Result:=WriteData(Buffer,2);\r\nend;\r\n\r\nfunction TStream.WriteData(const Buffer: UInt16; Count: NativeInt): NativeInt;\r\nbegin\r\n Result:=WriteMaxSizeData(MakeBytes(Buffer,2,True),2,Count);\r\nend;\r\n\r\nfunction TStream.WriteData(const Buffer: Int32): NativeInt;\r\nbegin\r\n Result:=WriteData(Buffer,4);\r\nend;\r\n\r\nfunction TStream.WriteData(const Buffer: Int32; Count: NativeInt): NativeInt;\r\nbegin\r\n Result:=WriteMaxSizeData(MakeBytes(Buffer,4,True),4,Count);\r\nend;\r\n\r\nfunction TStream.WriteData(const Buffer: UInt32): NativeInt;\r\nbegin\r\n Result:=WriteData(Buffer,4);\r\nend;\r\n\r\nfunction TStream.WriteData(const Buffer: UInt32; Count: NativeInt): NativeInt;\r\nbegin\r\n Result:=WriteMaxSizeData(MakeBytes(Buffer,4,False),4,Count);\r\nend;\r\n\r\nfunction TStream.WriteData(const Buffer: NativeLargeInt): NativeInt;\r\nbegin\r\n Result:=WriteData(Buffer,8);\r\nend;\r\n\r\nfunction TStream.WriteData(const Buffer: NativeLargeInt; Count: NativeInt): NativeInt;\r\nbegin\r\n Result:=WriteMaxSizeData(MakeBytes(Buffer,8,True),8,Count);\r\nend;\r\n\r\nfunction TStream.WriteData(const Buffer: NativeLargeUInt): NativeInt;\r\nbegin\r\n Result:=WriteData(Buffer,8);\r\nend;\r\n\r\nfunction TStream.WriteData(const Buffer: NativeLargeUInt; Count: NativeInt): NativeInt;\r\nbegin\r\n Result:=WriteMaxSizeData(MakeBytes(Buffer,8,False),8,Count);\r\nend;\r\n\r\nfunction TStream.WriteData(const Buffer: Double): NativeInt;\r\nbegin\r\n Result:=WriteData(Buffer,8);\r\nend;\r\n\r\nfunction TStream.WriteData(const Buffer: Double; Count: NativeInt): NativeInt;\r\n\r\nVar\r\n Mem : TJSArrayBuffer;\r\n A : TJSUint8array;\r\n D : TJSDataview;\r\n B : TBytes;\r\n I : Integer;\r\n\r\nbegin\r\n Mem:=TJSArrayBuffer.New(8);\r\n D:=TJSDataView.new(Mem);\r\n D.setFloat64(0,Buffer);\r\n SetLength(B,8);\r\n A:=TJSUint8array.New(Mem);\r\n For I:=0 to 7 do\r\n B[i]:=A[i];\r\n Result:=WriteMaxSizeData(B,8,Count);\r\nend;\r\n\r\n\r\nprocedure TStream.WriteBufferData(Buffer: Int32);\r\nbegin\r\n WriteBufferData(Buffer,4);\r\nend;\r\n\r\nprocedure TStream.WriteBufferData(Buffer: Int32; Count: NativeInt);\r\nbegin\r\n if (WriteData(Buffer,Count)<>Count) then\r\n Raise EStreamError.Create(SWriteError);\r\nend;\r\n\r\nprocedure TStream.WriteBufferData(Buffer: Boolean);\r\nbegin\r\n WriteBufferData(Buffer,1);\r\nend;\r\n\r\nprocedure TStream.WriteBufferData(Buffer: Boolean; Count: NativeInt);\r\nbegin\r\n if (WriteData(Buffer,Count)<>Count) then\r\n Raise EStreamError.Create(SWriteError);\r\nend;\r\n\r\nprocedure TStream.WriteBufferData(Buffer: WideChar);\r\nbegin\r\n WriteBufferData(Buffer,2);\r\nend;\r\n\r\nprocedure TStream.WriteBufferData(Buffer: WideChar; Count: NativeInt);\r\nbegin\r\n if (WriteData(Buffer,Count)<>Count) then\r\n Raise EStreamError.Create(SWriteError);\r\nend;\r\n\r\nprocedure TStream.WriteBufferData(Buffer: Int8);\r\nbegin\r\n WriteBufferData(Buffer,1);\r\nend;\r\n\r\nprocedure TStream.WriteBufferData(Buffer: Int8; Count: NativeInt);\r\nbegin\r\n if (WriteData(Buffer,Count)<>Count) then\r\n Raise EStreamError.Create(SWriteError);\r\nend;\r\n\r\nprocedure TStream.WriteBufferData(Buffer: UInt8);\r\nbegin\r\n WriteBufferData(Buffer,1);\r\nend;\r\n\r\nprocedure TStream.WriteBufferData(Buffer: UInt8; Count: NativeInt);\r\nbegin\r\n if (WriteData(Buffer,Count)<>Count) then\r\n Raise EStreamError.Create(SWriteError);\r\nend;\r\n\r\nprocedure TStream.WriteBufferData(Buffer: Int16);\r\nbegin\r\n WriteBufferData(Buffer,2);\r\nend;\r\n\r\nprocedure TStream.WriteBufferData(Buffer: Int16; Count: NativeInt);\r\nbegin\r\n if (WriteData(Buffer,Count)<>Count) then\r\n Raise EStreamError.Create(SWriteError);\r\nend;\r\n\r\nprocedure TStream.WriteBufferData(Buffer: UInt16);\r\nbegin\r\n WriteBufferData(Buffer,2);\r\nend;\r\n\r\nprocedure TStream.WriteBufferData(Buffer: UInt16; Count: NativeInt);\r\nbegin\r\n if (WriteData(Buffer,Count)<>Count) then\r\n Raise EStreamError.Create(SWriteError);\r\nend;\r\n\r\nprocedure TStream.WriteBufferData(Buffer: UInt32);\r\nbegin\r\n WriteBufferData(Buffer,4);\r\nend;\r\n\r\nprocedure TStream.WriteBufferData(Buffer: UInt32; Count: NativeInt);\r\nbegin\r\n if (WriteData(Buffer,Count)<>Count) then\r\n Raise EStreamError.Create(SWriteError);\r\nend;\r\n\r\nprocedure TStream.WriteBufferData(Buffer: NativeInt);\r\nbegin\r\n WriteBufferData(Buffer,8);\r\nend;\r\n\r\nprocedure TStream.WriteBufferData(Buffer: NativeInt; Count: NativeInt);\r\nbegin\r\n if (WriteData(Buffer,Count)<>Count) then\r\n Raise EStreamError.Create(SWriteError);\r\nend;\r\n\r\nprocedure TStream.WriteBufferData(Buffer: NativeLargeUInt);\r\nbegin\r\n WriteBufferData(Buffer,8);\r\nend;\r\n\r\nprocedure TStream.WriteBufferData(Buffer: NativeLargeUInt; Count: NativeInt);\r\nbegin\r\n if (WriteData(Buffer,Count)<>Count) then\r\n Raise EStreamError.Create(SWriteError);\r\nend;\r\n\r\nprocedure TStream.WriteBufferData(Buffer: Double);\r\nbegin\r\n WriteBufferData(Buffer,8);\r\nend;\r\n\r\nprocedure TStream.WriteBufferData(Buffer: Double; Count: NativeInt);\r\nbegin\r\n if (WriteData(Buffer,Count)<>Count) then\r\n Raise EStreamError.Create(SWriteError);\r\nend;\r\n\r\n\r\n\r\nfunction TStream.CopyFrom(Source: TStream; Count: NativeInt): NativeInt;\r\n\r\nvar\r\n Buffer: TBytes;\r\n BufferSize, i: LongInt;\r\n\r\nconst\r\n MaxSize = $20000;\r\nbegin\r\n Result:=0;\r\n if Count=0 then\r\n Source.Position:=0; // This WILL fail for non-seekable streams...\r\n BufferSize:=MaxSize;\r\n if (Count>0) and (Count0 then\r\n WriteBuffer(Buffer,i);\r\n Inc(Result,i);\r\n until i0 do\r\n begin\r\n if Count>BufferSize then\r\n i:=BufferSize\r\n else\r\n i:=Count;\r\n Source.ReadBuffer(Buffer,i);\r\n WriteBuffer(Buffer,i);\r\n Dec(count,i);\r\n Inc(Result,i);\r\n end;\r\nend;\r\n\r\nfunction TStream.ReadComponent(Instance: TComponent): TComponent;\r\n\r\nvar\r\n Reader: TReader;\r\n\r\nbegin\r\n Reader := TReader.Create(Self);\r\n try\r\n Result := Reader.ReadRootComponent(Instance);\r\n finally\r\n Reader.Free;\r\n end;\r\nend;\r\n\r\nfunction TStream.ReadComponentRes(Instance: TComponent): TComponent;\r\n\r\nbegin\r\n ReadResHeader;\r\n Result := ReadComponent(Instance);\r\nend;\r\n\r\nprocedure TStream.WriteComponent(Instance: TComponent);\r\n\r\nbegin\r\n WriteDescendent(Instance, nil);\r\nend;\r\n\r\nprocedure TStream.WriteComponentRes(const ResName: string; Instance: TComponent);\r\n\r\nbegin\r\n WriteDescendentRes(ResName, Instance, nil);\r\nend;\r\n\r\nprocedure TStream.WriteDescendent(Instance, Ancestor: TComponent);\r\n\r\nvar\r\n Driver : TAbstractObjectWriter;\r\n Writer : TWriter;\r\n\r\nbegin\r\n Driver := TBinaryObjectWriter.Create(Self);\r\n Try\r\n Writer := TWriter.Create(Driver);\r\n Try\r\n Writer.WriteDescendent(Instance, Ancestor);\r\n Finally\r\n Writer.Destroy;\r\n end;\r\n Finally\r\n Driver.Free;\r\n end;\r\nend;\r\n\r\nprocedure TStream.WriteDescendentRes(const ResName: string; Instance, Ancestor: TComponent);\r\n\r\nvar\r\n FixupInfo: Longint;\r\n\r\nbegin\r\n { Write a resource header }\r\n WriteResourceHeader(ResName, FixupInfo);\r\n { Write the instance itself }\r\n WriteDescendent(Instance, Ancestor);\r\n { Insert the correct resource size into the resource header }\r\n FixupResourceHeader(FixupInfo);\r\nend;\r\n\r\n\r\nprocedure TStream.WriteResourceHeader(const ResName: string; {!!!: out} var FixupInfo: Longint);\r\n var\r\n ResType, Flags : word;\r\n B : Byte;\r\n I : Integer;\r\n\r\n begin\r\n ResType:=Word($000A);\r\n Flags:=Word($1030);\r\n { Note: This is a Windows 16 bit resource }\r\n { Numeric resource type }\r\n WriteByte($ff);\r\n { Application defined data }\r\n WriteWord(ResType);\r\n { write the name as asciiz }\r\n For I:=1 to Length(ResName) do\r\n begin\r\n B:=Ord(ResName[i]);\r\n WriteByte(B);\r\n end;\r\n WriteByte(0);\r\n { Movable, Pure and Discardable }\r\n WriteWord(Flags);\r\n { Placeholder for the resource size }\r\n WriteDWord(0);\r\n { Return current stream position so that the resource size can be\r\n inserted later }\r\n FixupInfo := Position;\r\n end;\r\n\r\nprocedure TStream.FixupResourceHeader(FixupInfo: Longint);\r\n\r\nvar\r\n ResSize,TmpResSize : Longint;\r\n\r\nbegin\r\n\r\n ResSize := Position - FixupInfo;\r\n TmpResSize := longword(ResSize);\r\n\r\n { Insert the correct resource size into the placeholder written by\r\n WriteResourceHeader }\r\n Position := FixupInfo - 4;\r\n WriteDWord(TmpResSize);\r\n { Seek back to the end of the resource }\r\n Position := FixupInfo + ResSize;\r\n\r\nend;\r\n\r\nprocedure TStream.ReadResHeader;\r\n var\r\n ResType, Flags : word;\r\n begin\r\n try\r\n { Note: This is a Windows 16 bit resource }\r\n { application specific resource ? }\r\n if ReadByte<>$ff then\r\n raise EInvalidImage.Create(SInvalidImage);\r\n ResType:=ReadWord;\r\n if ResType<>$000a then\r\n raise EInvalidImage.Create(SInvalidImage);\r\n { read name }\r\n while ReadByte<>0 do\r\n ;\r\n { check the access specifier }\r\n Flags:=ReadWord;\r\n if Flags<>$1030 then\r\n raise EInvalidImage.Create(SInvalidImage);\r\n { ignore the size }\r\n ReadDWord;\r\n except\r\n on EInvalidImage do\r\n raise;\r\n else\r\n raise EInvalidImage.create(SInvalidImage);\r\n end;\r\n end;\r\n\r\n\r\nfunction TStream.ReadByte : Byte;\r\n\r\nbegin\r\n ReadBufferData(Result,1);\r\nend;\r\n\r\nfunction TStream.ReadWord : Word;\r\n\r\nbegin\r\n ReadBufferData(Result,2);\r\nend;\r\n\r\nfunction TStream.ReadDWord : Cardinal;\r\n\r\nbegin\r\n ReadBufferData(Result,4);\r\nend;\r\n\r\nfunction TStream.ReadQWord: NativeLargeUInt;\r\n\r\nbegin\r\n ReadBufferData(Result,8);\r\nend;\r\n\r\n\r\nprocedure TStream.WriteByte(b : Byte);\r\n\r\nbegin\r\n WriteBufferData(b,1);\r\nend;\r\n\r\nprocedure TStream.WriteWord(w : Word);\r\n\r\nbegin\r\n WriteBufferData(W,2);\r\nend;\r\n\r\nprocedure TStream.WriteDWord(d : Cardinal);\r\n\r\nbegin\r\n WriteBufferData(d,4);\r\nend;\r\n\r\nprocedure TStream.WriteQWord(q: NativeLargeUInt);\r\nbegin\r\n WriteBufferData(q,8);\r\nend;\r\n\r\n{****************************************************************************}\r\n{* TCustomMemoryStream *}\r\n{****************************************************************************}\r\n\r\nprocedure TCustomMemoryStream.SetPointer(Ptr: TJSArrayBuffer; ASize: PtrInt);\r\n\r\nbegin\r\n FMemory:=Ptr;\r\n FSize:=ASize;\r\n FDataView:=Nil;\r\n FDataArray:=Nil;\r\nend;\r\n\r\n\r\nclass function TCustomMemoryStream.MemoryToBytes(Mem: TJSArrayBuffer): TBytes;\r\n\r\nbegin\r\n Result:=MemoryToBytes(TJSUint8Array.New(Mem));\r\nend;\r\n\r\nclass function TCustomMemoryStream.MemoryToBytes(Mem: TJSUint8Array): TBytes;\r\n\r\nVar\r\n I : Integer;\r\n\r\nbegin\r\n // This must be improved, but needs some asm or TJSFunction.call() to implement answers in\r\n // https://stackoverflow.com/questions/29676635/convert-uint8array-to-array-in-javascript\r\n for i:=0 to mem.length-1 do\r\n Result[i]:=Mem[i];\r\nend;\r\n\r\nclass function TCustomMemoryStream.BytesToMemory(aBytes: TBytes): TJSArrayBuffer;\r\n\r\nVar\r\n a : TJSUint8Array;\r\n\r\nbegin\r\n Result:=TJSArrayBuffer.new(Length(aBytes));\r\n A:=TJSUint8Array.New(Result);\r\n A._set(aBytes);\r\nend;\r\n\r\nfunction TCustomMemoryStream.GetDataArray: TJSUint8Array;\r\nbegin\r\n if FDataArray=Nil then\r\n FDataArray:=TJSUint8Array.new(Memory);\r\n Result:=FDataArray;\r\nend;\r\n\r\nfunction TCustomMemoryStream.GetDataView: TJSDataview;\r\nbegin\r\n if FDataView=Nil then\r\n FDataView:=TJSDataView.New(Memory);\r\n Result:=FDataView;\r\nend;\r\n\r\nfunction TCustomMemoryStream.GetSize: NativeInt;\r\n\r\nbegin\r\n Result:=FSize;\r\nend;\r\n\r\nfunction TCustomMemoryStream.GetPosition: NativeInt;\r\nbegin\r\n Result:=FPosition;\r\nend;\r\n\r\n\r\nfunction TCustomMemoryStream.Read(Buffer: TBytes; Count: LongInt): LongInt;\r\nbegin\r\n Result := Read(Buffer, 0, Count);\r\nend;\r\n\r\nfunction TCustomMemoryStream.Read(Buffer: TBytes; Offset, Count: LongInt): LongInt;\r\n\r\nVar\r\n I,Src,Dest : Integer;\r\n\r\nbegin\r\n Result:=0;\r\n If (FSize>0) and (FPosition=0) then\r\n begin\r\n Result:=Count;\r\n If (Result>(FSize-FPosition)) then\r\n Result:=(FSize-FPosition);\r\n Src:=FPosition;\r\n Dest:=Offset;\r\n I:=0;\r\n While IFSize) then\r\n FPosition:=FSize;\r\n Result:=FPosition;\r\n {$IFDEF DEBUG}\r\n if Result < 0 then\r\n raise Exception.Create('TCustomMemoryStream');\r\n {$ENDIF}\r\nend;\r\n\r\n\r\nprocedure TCustomMemoryStream.SaveToStream(Stream: TStream);\r\n\r\nbegin\r\n if FSize>0 then\r\n Stream.WriteBuffer(TMemoryStream.MemoryToBytes(Memory),FSize);\r\nend;\r\n\r\nprocedure TCustomMemoryStream.LoadFromURL(const aURL: String; Async: Boolean; OnLoaded: TNotifyEventRef; OnError: TStringNotifyEventRef = Nil);\r\n\r\n procedure DoLoaded(const abytes : TJSArrayBuffer);\r\n begin\r\n SetPointer(aBytes,aBytes.byteLength);\r\n if Assigned(OnLoaded) then\r\n OnLoaded(Self);\r\n end;\r\n\r\n procedure DoError(const AError : String);\r\n begin\r\n if Assigned(OnError) then\r\n OnError(Self,aError)\r\n else\r\n Raise EInOutError.Create('Failed to load from URL:'+aError);\r\n end;\r\n\r\nbegin\r\n CheckLoadHelper;\r\n GlobalLoadHelper.LoadBytes(aURL,aSync,@DoLoaded,@DoError);\r\nend;\r\n\r\nprocedure TCustomMemoryStream.LoadFromFile(const aFileName: String; const OnLoaded: TProc; const AError: TProcString);\r\n\r\nbegin\r\n LoadFromURL(aFileName,False,\r\n Procedure (Sender : TObject)\r\n begin\r\n If Assigned(OnLoaded) then\r\n OnLoaded\r\n end,\r\n Procedure (Sender : TObject; Const ErrorMsg : String)\r\n begin\r\n if Assigned(aError) then\r\n aError(ErrorMsg)\r\n end);\r\nend;\r\n\r\n\r\n\r\n{****************************************************************************}\r\n{* TMemoryStream *}\r\n{****************************************************************************}\r\n\r\n\r\nConst TMSGrow = 4096; { Use 4k blocks. }\r\n\r\nprocedure TMemoryStream.SetCapacity(NewCapacity: PtrInt);\r\n\r\nbegin\r\n SetPointer (Realloc(NewCapacity),Fsize);\r\n FCapacity:=NewCapacity;\r\nend;\r\n\r\n\r\nfunction TMemoryStream.Realloc(var NewCapacity: PtrInt): TJSArrayBuffer;\r\n\r\nVar\r\n GC : PtrInt;\r\n DestView : TJSUInt8array;\r\n\r\nbegin\r\n If NewCapacity<0 Then\r\n NewCapacity:=0\r\n else\r\n begin\r\n GC:=FCapacity + (FCapacity div 4);\r\n // if growing, grow at least a quarter\r\n if (NewCapacity>FCapacity) and (NewCapacity < GC) then\r\n NewCapacity := GC;\r\n // round off to block size.\r\n NewCapacity := (NewCapacity + (TMSGrow-1)) and not (TMSGROW-1);\r\n end;\r\n // Only now check !\r\n If NewCapacity=FCapacity then\r\n Result:=FMemory\r\n else if NewCapacity=0 then\r\n Result:=Nil\r\n else\r\n begin\r\n // New buffer\r\n Result:=TJSArrayBuffer.New(NewCapacity);\r\n If (Result=Nil) then\r\n Raise EStreamError.Create(SMemoryStreamError);\r\n // Transfer\r\n DestView:=TJSUInt8array.New(Result);\r\n Destview._Set(Self.DataArray);\r\n end;\r\nend;\r\n\r\n\r\ndestructor TMemoryStream.Destroy;\r\n\r\nbegin\r\n Clear;\r\n Inherited Destroy;\r\nend;\r\n\r\n\r\nprocedure TMemoryStream.Clear;\r\n\r\nbegin\r\n FSize:=0;\r\n FPosition:=0;\r\n SetCapacity (0);\r\nend;\r\n\r\n\r\nprocedure TMemoryStream.LoadFromStream(Stream: TStream);\r\n\r\nbegin\r\n Position:=0;\r\n Stream.Position:=0;\r\n CopyFrom(Stream, Stream.Size);\r\n// SetSize(Stream.Size);\r\n// If FSize>0 then Stream.ReadBuffer(MemoryToBytes(FMemory),FSize);\r\nend;\r\n\r\nprocedure TMemoryStream.SetSize(const NewSize: NativeInt);\r\n\r\nbegin\r\n SetCapacity (NewSize);\r\n FSize:=NewSize;\r\n IF FPosition>FSize then\r\n FPosition:=FSize;\r\nend;\r\n\r\nfunction TMemoryStream.Write(Const Buffer : TBytes; Count: LongInt): LongInt;\r\nbegin\r\n Result := Write(Buffer, 0, Count);\r\nend;\r\n\r\nfunction TMemoryStream.Write(Const Buffer : TBytes; OffSet, Count: LongInt): LongInt;\r\n\r\nVar NewPos : PtrInt;\r\n\r\nbegin\r\n If (Count=0) or (FPosition<0) then\r\n exit(0);\r\n NewPos:=FPosition+Count;\r\n If NewPos>Fsize then\r\n begin\r\n IF NewPos>FCapacity then\r\n SetCapacity (NewPos);\r\n FSize:=Newpos;\r\n end;\r\n DataArray._set(Copy(Buffer,Offset,Count),FPosition);\r\n FPosition:=NewPos;\r\n Result:=Count;\r\nend;\r\n\r\n{****************************************************************************}\r\n{* TBytesStream *}\r\n{****************************************************************************}\r\n\r\nconstructor TBytesStream.Create(const ABytes: TBytes);\r\nbegin\r\n inherited Create;\r\n SetPointer(TMemoryStream.BytesToMemory(aBytes),Length(ABytes));\r\n FCapacity:=Length(ABytes);\r\nend;\r\n\r\nfunction TBytesStream.GetBytes: TBytes;\r\nbegin\r\n Result:=TMemoryStream.MemoryToBytes(Memory);\r\nend;\r\n\r\n{ *********************************************************************\r\n * TFiler *\r\n *********************************************************************}\r\n\r\nprocedure TFiler.SetRoot(ARoot: TComponent);\r\nbegin\r\n FRoot := ARoot;\r\nend;\r\n\r\n\r\n{\r\n This file is part of the Free Component Library (FCL)\r\n Copyright (c) 1999-2000 by the Free Pascal development team\r\n\r\n See the file COPYING.FPC, included in this distribution,\r\n for details about the copyright.\r\n\r\n This program is distributed in the hope that it will be useful,\r\n but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r\n\r\n **********************************************************************}\r\n\r\n{****************************************************************************}\r\n{* TBinaryObjectReader *}\r\n{****************************************************************************}\r\n\r\n\r\nfunction TBinaryObjectReader.ReadWord : word;\r\nbegin\r\n FStream.ReadBufferData(Result);\r\nend;\r\n\r\nfunction TBinaryObjectReader.ReadDWord : longword;\r\nbegin\r\n FStream.ReadBufferData(Result);\r\nend;\r\n\r\n\r\nconstructor TBinaryObjectReader.Create(Stream: TStream);\r\nbegin\r\n inherited Create;\r\n If (Stream=Nil) then\r\n Raise EReadError.Create(SEmptyStreamIllegalReader);\r\n FStream := Stream;\r\nend;\r\n\r\nfunction TBinaryObjectReader.ReadValue: TValueType;\r\nvar\r\n b: byte;\r\nbegin\r\n FStream.ReadBufferData(b);\r\n Result := TValueType(b);\r\nend;\r\n\r\nfunction TBinaryObjectReader.NextValue: TValueType;\r\nbegin\r\n Result := ReadValue;\r\n { We only 'peek' at the next value, so seek back to unget the read value: }\r\n FStream.Seek(-1,soCurrent);\r\nend;\r\n\r\nprocedure TBinaryObjectReader.BeginRootComponent;\r\nbegin\r\n { Read filer signature }\r\n ReadSignature;\r\nend;\r\n\r\nprocedure TBinaryObjectReader.BeginComponent(var Flags: TFilerFlags;\r\n var AChildPos: Integer; var CompClassName, CompName: String);\r\nvar\r\n Prefix: Byte;\r\n ValueType: TValueType;\r\nbegin\r\n { Every component can start with a special prefix: }\r\n Flags := [];\r\n if (Byte(NextValue) and $f0) = $f0 then\r\n begin\r\n Prefix := Byte(ReadValue);\r\n Flags:=[];\r\n if (Prefix and $01)<>0 then\r\n Include(Flags,ffInherited);\r\n if (Prefix and $02)<>0 then\r\n Include(Flags,ffChildPos);\r\n if (Prefix and $04)<>0 then\r\n Include(Flags,ffInline);\r\n if ffChildPos in Flags then\r\n begin\r\n ValueType := ReadValue;\r\n case ValueType of\r\n vaInt8:\r\n AChildPos := ReadInt8;\r\n vaInt16:\r\n AChildPos := ReadInt16;\r\n vaInt32:\r\n AChildPos := ReadInt32;\r\n vaNativeInt:\r\n AChildPos := ReadNativeInt;\r\n else\r\n raise EReadError.Create(SInvalidPropertyValue);\r\n end;\r\n end;\r\n end;\r\n\r\n CompClassName := ReadStr;\r\n CompName := ReadStr;\r\nend;\r\n\r\nfunction TBinaryObjectReader.BeginProperty: String;\r\nbegin\r\n Result := ReadStr;\r\nend;\r\n\r\nprocedure TBinaryObjectReader.Read(var Buffer: TBytes; Count: Longint);\r\nbegin\r\n FStream.Read(Buffer,Count);\r\nend;\r\n\r\nprocedure TBinaryObjectReader.ReadBinary(const DestData: TMemoryStream);\r\nvar\r\n BinSize: LongInt;\r\nbegin\r\n BinSize:=LongInt(ReadDWord);\r\n DestData.Size := BinSize;\r\n DestData.CopyFrom(FStream,BinSize);\r\nend;\r\n\r\nfunction TBinaryObjectReader.ReadFloat: Extended;\r\nbegin\r\n FStream.ReadBufferData(Result);\r\nend;\r\n\r\nfunction TBinaryObjectReader.ReadCurrency: Currency;\r\n\r\nbegin\r\n Result:=ReadFloat;\r\nend;\r\n\r\nfunction TBinaryObjectReader.ReadIdent(ValueType: TValueType): String;\r\nvar\r\n i: Byte;\r\n c : Char;\r\nbegin\r\n case ValueType of\r\n vaIdent:\r\n begin\r\n FStream.ReadBufferData(i);\r\n SetLength(Result,i);\r\n For I:=1 to Length(Result) do\r\n begin\r\n FStream.ReadBufferData(C);\r\n Result[I]:=C;\r\n end;\r\n end;\r\n vaNil:\r\n Result := 'nil';\r\n vaFalse:\r\n Result := 'False';\r\n vaTrue:\r\n Result := 'True';\r\n vaNull:\r\n Result := 'Null';\r\n end;\r\nend;\r\n\r\nfunction TBinaryObjectReader.ReadInt8: ShortInt;\r\nbegin\r\n FStream.ReadBufferData(Result);\r\nend;\r\n\r\nfunction TBinaryObjectReader.ReadInt16: SmallInt;\r\nbegin\r\n FStream.ReadBufferData(Result);\r\nend;\r\n\r\nfunction TBinaryObjectReader.ReadInt32: LongInt;\r\nbegin\r\n FStream.ReadBufferData(Result);\r\nend;\r\n\r\nfunction TBinaryObjectReader.ReadNativeInt : NativeInt;\r\nbegin\r\n FStream.ReadBufferData(Result);\r\nend;\r\n\r\n\r\nfunction TBinaryObjectReader.ReadSet(EnumType: TTypeInfoEnum): Integer;\r\n\r\nvar\r\n Name: String;\r\n Value: Integer;\r\n\r\nbegin\r\n try\r\n Result := 0;\r\n while True do\r\n begin\r\n Name := ReadStr;\r\n if Length(Name) = 0 then\r\n break;\r\n Value:=EnumType.EnumType.NameToInt[Name];\r\n if Value=-1 then\r\n raise EReadError.Create(SInvalidPropertyValue);\r\n Result:=Result or (1 shl Value);\r\n end;\r\n except\r\n SkipSetBody;\r\n raise;\r\n end;\r\nend;\r\n\r\n\r\nConst\r\n // Integer version of 4 chars 'TPF0'\r\n FilerSignatureInt = 809914452;\r\n\r\nprocedure TBinaryObjectReader.ReadSignature;\r\n\r\nvar\r\n Signature: LongInt;\r\n\r\nbegin\r\n FStream.ReadBufferData(Signature);\r\n if Signature <> FilerSignatureInt then\r\n raise EReadError.Create(SInvalidImage);\r\nend;\r\n\r\nfunction TBinaryObjectReader.ReadStr: String;\r\nvar\r\n l,i: Byte;\r\n c : Char;\r\nbegin\r\n FStream.ReadBufferData(L);\r\n SetLength(Result,L);\r\n For I:=1 to L do\r\n begin\r\n FStream.ReadBufferData(C);\r\n Result[i]:=C;\r\n end;\r\nend;\r\n\r\nfunction TBinaryObjectReader.ReadString(StringType: TValueType): String;\r\nvar\r\n i: Integer;\r\n C : Char;\r\n\r\nbegin\r\n Result:='';\r\n if StringType<>vaString then\r\n Raise EFilerError.Create('Invalid string type passed to ReadString');\r\n i:=ReadDWord;\r\n SetLength(Result, i);\r\n for I:=1 to Length(Result) do\r\n begin\r\n FStream.ReadbufferData(C);\r\n Result[i]:=C;\r\n end;\r\nend;\r\n\r\n\r\nfunction TBinaryObjectReader.ReadWideString: WideString;\r\nbegin\r\n Result:=ReadString(vaWString);\r\nend;\r\n\r\nfunction TBinaryObjectReader.ReadUnicodeString: UnicodeString;\r\n\r\nbegin\r\n Result:=ReadString(vaWString);\r\nend;\r\n\r\nprocedure TBinaryObjectReader.SkipComponent(SkipComponentInfos: Boolean);\r\nvar\r\n Flags: TFilerFlags;\r\n Dummy: Integer;\r\n CompClassName, CompName: String;\r\nbegin\r\n if SkipComponentInfos then\r\n { Skip prefix, component class name and component object name }\r\n BeginComponent(Flags, Dummy, CompClassName, CompName);\r\n\r\n { Skip properties }\r\n while NextValue <> vaNull do\r\n SkipProperty;\r\n ReadValue;\r\n\r\n { Skip children }\r\n while NextValue <> vaNull do\r\n SkipComponent(True);\r\n ReadValue;\r\nend;\r\n\r\nprocedure TBinaryObjectReader.SkipValue;\r\n\r\n procedure SkipBytes(Count: LongInt);\r\n var\r\n Dummy: TBytes;\r\n SkipNow: Integer;\r\n begin\r\n while Count > 0 do\r\n begin\r\n if Count > 1024 then\r\n SkipNow := 1024\r\n else\r\n SkipNow := Count;\r\n SetLength(Dummy,SkipNow);\r\n Read(Dummy, SkipNow);\r\n Dec(Count, SkipNow);\r\n end;\r\n end;\r\n\r\nvar\r\n Count: LongInt;\r\nbegin\r\n case ReadValue of\r\n vaNull, vaFalse, vaTrue, vaNil: ;\r\n vaList:\r\n begin\r\n while NextValue <> vaNull do\r\n SkipValue;\r\n ReadValue;\r\n end;\r\n vaInt8:\r\n SkipBytes(1);\r\n vaInt16:\r\n SkipBytes(2);\r\n vaInt32:\r\n SkipBytes(4);\r\n vaInt64,\r\n vaDouble:\r\n SkipBytes(8);\r\n vaIdent:\r\n ReadStr;\r\n vaString:\r\n ReadString(vaString);\r\n vaBinary:\r\n begin\r\n Count:=LongInt(ReadDWord);\r\n SkipBytes(Count);\r\n end;\r\n vaSet:\r\n SkipSetBody;\r\n vaCollection:\r\n begin\r\n while NextValue <> vaNull do\r\n begin\r\n { Skip the order value if present }\r\n if NextValue in [vaInt8, vaInt16, vaInt32] then\r\n SkipValue;\r\n SkipBytes(1);\r\n while NextValue <> vaNull do\r\n SkipProperty;\r\n ReadValue;\r\n end;\r\n ReadValue;\r\n end;\r\n end;\r\nend;\r\n\r\n{ private methods }\r\n\r\n\r\nprocedure TBinaryObjectReader.SkipProperty;\r\nbegin\r\n { Skip property name, then the property value }\r\n ReadStr;\r\n SkipValue;\r\nend;\r\n\r\nprocedure TBinaryObjectReader.SkipSetBody;\r\nbegin\r\n while Length(ReadStr) > 0 do;\r\nend;\r\n\r\n\r\n // Quadruple representing an unresolved component property.\r\nType\r\n { TUnresolvedReference }\r\n\r\n TUnresolvedReference = class(TlinkedListItem)\r\n Private\r\n FRoot: TComponent; // Root component when streaming\r\n FPropInfo: TTypeMemberProperty; // Property to set.\r\n FGlobal, // Global component.\r\n FRelative : string; // Path relative to global component.\r\n Function Resolve(Instance : TPersistent) : Boolean; // Resolve this reference\r\n Function RootMatches(ARoot : TComponent) : Boolean; {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE} // True if Froot matches or ARoot is nil.\r\n Function NextRef : TUnresolvedReference; {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}\r\n end;\r\n\r\n TLocalUnResolvedReference = class(TUnresolvedReference)\r\n Finstance : TPersistent;\r\n end;\r\n\r\n // Linked list of TPersistent items that have unresolved properties.\r\n\r\n { TUnResolvedInstance }\r\n\r\n TUnResolvedInstance = Class(TLinkedListItem)\r\n Public\r\n Instance : TPersistent; // Instance we're handling unresolveds for\r\n FUnresolved : TLinkedList; // The list\r\n Destructor Destroy; override;\r\n Function AddReference(ARoot : TComponent; APropInfo : TTypeMemberProperty; AGlobal,ARelative : String) : TUnresolvedReference;\r\n Function RootUnresolved : TUnresolvedReference; {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE} // Return root element in list.\r\n Function ResolveReferences : Boolean; // Return true if all unresolveds were resolved.\r\n end;\r\n\r\n // Builds a list of TUnResolvedInstances, removes them from global list on free.\r\n TBuildListVisitor = Class(TLinkedListVisitor)\r\n Private\r\n List : TFPList;\r\n Public\r\n Procedure Add(Item : TlinkedListItem); // Add TUnResolvedInstance item to list. Create list if needed\r\n Destructor Destroy; override; // All elements in list (if any) are removed from the global list.\r\n end;\r\n\r\n // Visitor used to try and resolve instances in the global list\r\n TResolveReferenceVisitor = Class(TBuildListVisitor)\r\n Function Visit(Item : TLinkedListItem) : Boolean; override;\r\n end;\r\n\r\n // Visitor used to remove all references to a certain component.\r\n TRemoveReferenceVisitor = Class(TBuildListVisitor)\r\n Private\r\n FRef : String;\r\n FRoot : TComponent;\r\n Public\r\n Constructor Create(ARoot : TComponent;Const ARef : String);\r\n Function Visit(Item : TLinkedListItem) : Boolean; override;\r\n end;\r\n\r\n // Visitor used to collect reference names.\r\n TReferenceNamesVisitor = Class(TLinkedListVisitor)\r\n Private\r\n FList : TStrings;\r\n FRoot : TComponent;\r\n Public\r\n Function Visit(Item : TLinkedListItem) : Boolean; override;\r\n Constructor Create(ARoot : TComponent;AList : TStrings);\r\n end;\r\n\r\n // Visitor used to collect instance names.\r\n TReferenceInstancesVisitor = Class(TLinkedListVisitor)\r\n Private\r\n FList : TStrings;\r\n FRef : String;\r\n FRoot : TComponent;\r\n Public\r\n Function Visit(Item : TLinkedListItem) : Boolean; override;\r\n Constructor Create(ARoot : TComponent;Const ARef : String; AList : TStrings);\r\n end;\r\n\r\n // Visitor used to redirect links to another root component.\r\n TRedirectReferenceVisitor = Class(TLinkedListVisitor)\r\n Private\r\n FOld,\r\n FNew : String;\r\n FRoot : TComponent;\r\n Public\r\n Function Visit(Item : TLinkedListItem) : Boolean; override;\r\n Constructor Create(ARoot : TComponent;Const AOld,ANew : String);\r\n end;\r\n\r\nvar\r\n NeedResolving : TLinkedList;\r\n\r\n// Add an instance to the global list of instances which need resolving.\r\nFunction FindUnresolvedInstance(AInstance: TPersistent) : TUnResolvedInstance;\r\n\r\nbegin\r\n Result:=Nil;\r\n{$ifdef FPC_HAS_FEATURE_THREADING}\r\n EnterCriticalSection(ResolveSection);\r\n Try\r\n{$endif}\r\n If Assigned(NeedResolving) then\r\n begin\r\n Result:=TUnResolvedInstance(NeedResolving.Root);\r\n While (Result<>Nil) and (Result.Instance<>AInstance) do\r\n Result:=TUnResolvedInstance(Result.Next);\r\n end;\r\n{$ifdef FPC_HAS_FEATURE_THREADING}\r\n finally\r\n LeaveCriticalSection(ResolveSection);\r\n end;\r\n{$endif}\r\nend;\r\n\r\nFunction AddtoResolveList(AInstance: TPersistent) : TUnResolvedInstance;\r\n\r\nbegin\r\n Result:=FindUnresolvedInstance(AInstance);\r\n If (Result=Nil) then\r\n begin\r\n{$ifdef FPC_HAS_FEATURE_THREADING}\r\n EnterCriticalSection(ResolveSection);\r\n Try\r\n{$endif}\r\n If not Assigned(NeedResolving) then\r\n NeedResolving:=TLinkedList.Create(TUnResolvedInstance);\r\n Result:=NeedResolving.Add as TUnResolvedInstance;\r\n Result.Instance:=AInstance;\r\n{$ifdef FPC_HAS_FEATURE_THREADING}\r\n finally\r\n LeaveCriticalSection(ResolveSection);\r\n end;\r\n{$endif}\r\n end;\r\nend;\r\n\r\n// Walk through the global list of instances to be resolved.\r\n\r\nProcedure VisitResolveList(V : TLinkedListVisitor);\r\n\r\nbegin\r\n{$ifdef FPC_HAS_FEATURE_THREADING}\r\n EnterCriticalSection(ResolveSection);\r\n Try\r\n{$endif}\r\n try\r\n NeedResolving.Foreach(V);\r\n Finally\r\n FreeAndNil(V);\r\n end;\r\n{$ifdef FPC_HAS_FEATURE_THREADING}\r\n Finally\r\n LeaveCriticalSection(ResolveSection);\r\n end;\r\n{$endif}\r\nend;\r\n\r\nprocedure GlobalFixupReferences;\r\n\r\nbegin\r\n If (NeedResolving=Nil) then\r\n Exit;\r\n{$ifdef FPC_HAS_FEATURE_THREADING}\r\n GlobalNameSpace.BeginWrite;\r\n try\r\n{$endif}\r\n VisitResolveList(TResolveReferenceVisitor.Create);\r\n{$ifdef FPC_HAS_FEATURE_THREADING}\r\n finally\r\n GlobalNameSpace.EndWrite;\r\n end;\r\n{$endif}\r\nend;\r\n\r\n\r\nprocedure GetFixupReferenceNames(Root: TComponent; Names: TStrings);\r\n\r\nbegin\r\n If (NeedResolving=Nil) then\r\n Exit;\r\n VisitResolveList(TReferenceNamesVisitor.Create(Root,Names));\r\nend;\r\n\r\nprocedure GetFixupInstanceNames(Root: TComponent; const ReferenceRootName: string; Names: TStrings);\r\n\r\nbegin\r\n If (NeedResolving=Nil) then\r\n Exit;\r\n VisitResolveList(TReferenceInstancesVisitor.Create(Root,ReferenceRootName,Names));\r\nend;\r\n\r\nprocedure ObjectBinaryToText(aInput, aOutput: TStream);\r\nbegin\r\n ObjectBinaryToText(aInput,aOutput,oteLFM);\r\nend;\r\n\r\nprocedure ObjectBinaryToText(aInput, aOutput: TStream; aEncoding: TObjectTextEncoding);\r\n\r\nvar\r\n Conv : TObjectStreamConverter;\r\n\r\nbegin\r\n Conv:=TObjectStreamConverter.Create;\r\n try\r\n Conv.ObjectBinaryToText(aInput,aOutput,aEncoding);\r\n finally\r\n Conv.Free;\r\n end;\r\nend;\r\n\r\nprocedure RedirectFixupReferences(Root: TComponent; const OldRootName, NewRootName: string);\r\n\r\nbegin\r\n If (NeedResolving=Nil) then\r\n Exit;\r\n VisitResolveList(TRedirectReferenceVisitor.Create(Root,OldRootName,NewRootName));\r\nend;\r\n\r\nprocedure RemoveFixupReferences(Root: TComponent; const RootName: string);\r\n\r\nbegin\r\n If (NeedResolving=Nil) then\r\n Exit;\r\n VisitResolveList(TRemoveReferenceVisitor.Create(Root,RootName));\r\nend;\r\n\r\n\r\n{ TUnresolvedReference }\r\n\r\nFunction TUnresolvedReference.Resolve(Instance : TPersistent) : Boolean;\r\n\r\nVar\r\n C : TComponent;\r\n\r\nbegin\r\n C:=FindGlobalComponent(FGlobal);\r\n Result:=(C<>Nil);\r\n If Result then\r\n begin\r\n C:=FindNestedComponent(C,FRelative);\r\n Result:=C<>Nil;\r\n If Result then\r\n SetObjectProp(Instance, FPropInfo,C);\r\n end;\r\nend;\r\n\r\nFunction TUnresolvedReference.RootMatches(ARoot : TComponent) : Boolean; {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}\r\n\r\nbegin\r\n Result:=(ARoot=Nil) or (ARoot=FRoot);\r\nend;\r\n\r\nFunction TUnResolvedReference.NextRef : TUnresolvedReference;\r\n\r\nbegin\r\n Result:=TUnresolvedReference(Next);\r\nend;\r\n\r\n{ TUnResolvedInstance }\r\n\r\ndestructor TUnResolvedInstance.Destroy;\r\nbegin\r\n FUnresolved.Free;\r\n inherited Destroy;\r\nend;\r\n\r\nfunction TUnResolvedInstance.AddReference(ARoot: TComponent; APropInfo : TTypeMemberProperty; AGlobal, ARelative: String): TUnresolvedReference;\r\nbegin\r\n If (FUnResolved=Nil) then\r\n FUnResolved:=TLinkedList.Create(TUnresolvedReference);\r\n Result:=FUnResolved.Add as TUnresolvedReference;\r\n Result.FGlobal:=AGLobal;\r\n Result.FRelative:=ARelative;\r\n Result.FPropInfo:=APropInfo;\r\n Result.FRoot:=ARoot;\r\nend;\r\n\r\nFunction TUnResolvedInstance.RootUnresolved : TUnresolvedReference;\r\n\r\nbegin\r\n Result:=Nil;\r\n If Assigned(FUnResolved) then\r\n Result:=TUnresolvedReference(FUnResolved.Root);\r\nend;\r\n\r\nFunction TUnResolvedInstance.ResolveReferences:Boolean;\r\n\r\nVar\r\n R,RN : TUnresolvedReference;\r\n\r\nbegin\r\n R:=RootUnResolved;\r\n While (R<>Nil) do\r\n begin\r\n RN:=R.NextRef;\r\n If R.Resolve(Self.Instance) then\r\n FUnresolved.RemoveItem(R,True);\r\n R:=RN;\r\n end;\r\n Result:=RootUnResolved=Nil;\r\nend;\r\n\r\n{ TReferenceNamesVisitor }\r\n\r\nConstructor TReferenceNamesVisitor.Create(ARoot : TComponent;AList : TStrings);\r\n\r\nbegin\r\n FRoot:=ARoot;\r\n FList:=AList;\r\nend;\r\n\r\nFunction TReferenceNamesVisitor.Visit(Item : TLinkedListItem) : Boolean;\r\n\r\nVar\r\n R : TUnresolvedReference;\r\n\r\nbegin\r\n R:=TUnResolvedInstance(Item).RootUnresolved;\r\n While (R<>Nil) do\r\n begin\r\n If R.RootMatches(FRoot) then\r\n If (FList.IndexOf(R.FGlobal)=-1) then\r\n FList.Add(R.FGlobal);\r\n R:=R.NextRef;\r\n end;\r\n Result:=True;\r\nend;\r\n\r\n{ TReferenceInstancesVisitor }\r\n\r\nConstructor TReferenceInstancesVisitor.Create(ARoot : TComponent; Const ARef : String;AList : TStrings);\r\n\r\nbegin\r\n FRoot:=ARoot;\r\n FRef:=UpperCase(ARef);\r\n FList:=AList;\r\nend;\r\n\r\nFunction TReferenceInstancesVisitor.Visit(Item : TLinkedListItem) : Boolean;\r\n\r\nVar\r\n R : TUnresolvedReference;\r\n\r\nbegin\r\n R:=TUnResolvedInstance(Item).RootUnresolved;\r\n While (R<>Nil) do\r\n begin\r\n If (FRoot=R.FRoot) and (FRef=UpperCase(R.FGLobal)) Then\r\n If Flist.IndexOf(R.FRelative)=-1 then\r\n Flist.Add(R.FRelative);\r\n R:=R.NextRef;\r\n end;\r\n Result:=True;\r\nend;\r\n\r\n{ TRedirectReferenceVisitor }\r\n\r\nConstructor TRedirectReferenceVisitor.Create(ARoot : TComponent; Const AOld,ANew : String);\r\n\r\nbegin\r\n FRoot:=ARoot;\r\n FOld:=UpperCase(AOld);\r\n FNew:=ANew;\r\nend;\r\n\r\nFunction TRedirectReferenceVisitor.Visit(Item : TLinkedListItem) : Boolean;\r\n\r\nVar\r\n R : TUnresolvedReference;\r\n\r\nbegin\r\n R:=TUnResolvedInstance(Item).RootUnresolved;\r\n While (R<>Nil) do\r\n begin\r\n If R.RootMatches(FRoot) and (FOld=UpperCase(R.FGLobal)) Then\r\n R.FGlobal:=FNew;\r\n R:=R.NextRef;\r\n end;\r\n Result:=True;\r\nend;\r\n\r\n{ TRemoveReferenceVisitor }\r\n\r\nConstructor TRemoveReferenceVisitor.Create(ARoot : TComponent; Const ARef : String);\r\n\r\nbegin\r\n FRoot:=ARoot;\r\n FRef:=UpperCase(ARef);\r\nend;\r\n\r\nFunction TRemoveReferenceVisitor.Visit(Item : TLinkedListItem) : Boolean;\r\n\r\nVar\r\n I : Integer;\r\n UI : TUnResolvedInstance;\r\n R : TUnresolvedReference;\r\n L : TFPList;\r\n\r\nbegin\r\n UI:=TUnResolvedInstance(Item);\r\n R:=UI.RootUnresolved;\r\n L:=Nil;\r\n Try\r\n // Collect all matches.\r\n While (R<>Nil) do\r\n begin\r\n If R.RootMatches(FRoot) and ((FRef = '') or (FRef=UpperCase(R.FGLobal))) Then\r\n begin\r\n If Not Assigned(L) then\r\n L:=TFPList.Create;\r\n L.Add(R);\r\n end;\r\n R:=R.NextRef;\r\n end;\r\n // Remove all matches.\r\n IF Assigned(L) then\r\n begin\r\n For I:=0 to L.Count-1 do\r\n UI.FUnresolved.RemoveItem(TLinkedListitem(L[i]),True);\r\n end;\r\n // If any references are left, leave them.\r\n If UI.FUnResolved.Root=Nil then\r\n begin\r\n If List=Nil then\r\n List:=TFPList.Create;\r\n List.Add(UI);\r\n end;\r\n Finally\r\n L.Free;\r\n end;\r\n Result:=True;\r\nend;\r\n\r\n{ TBuildListVisitor }\r\n\r\nProcedure TBuildListVisitor.Add(Item : TlinkedListItem);\r\n\r\nbegin\r\n If (List=Nil) then\r\n List:=TFPList.Create;\r\n List.Add(Item);\r\nend;\r\n\r\nDestructor TBuildListVisitor.Destroy;\r\n\r\nVar\r\n I : Integer;\r\n\r\nbegin\r\n If Assigned(List) then\r\n For I:=0 to List.Count-1 do\r\n NeedResolving.RemoveItem(TLinkedListItem(List[I]),True);\r\n FreeAndNil(List);\r\n Inherited;\r\nend;\r\n\r\n{ TResolveReferenceVisitor }\r\n\r\nFunction TResolveReferenceVisitor.Visit(Item : TLinkedListItem) : Boolean;\r\n\r\nbegin\r\n If TUnResolvedInstance(Item).ResolveReferences then\r\n Add(Item);\r\n Result:=True;\r\nend;\r\n\r\n\r\n\r\n{****************************************************************************}\r\n{* TREADER *}\r\n{****************************************************************************}\r\n\r\n\r\nconstructor TReader.Create(Stream: TStream);\r\nbegin\r\n inherited Create;\r\n If (Stream=Nil) then\r\n Raise EReadError.Create(SEmptyStreamIllegalReader);\r\n FDriver := CreateDriver(Stream);\r\nend;\r\n\r\ndestructor TReader.Destroy;\r\nbegin\r\n FDriver.Free;\r\n inherited Destroy;\r\nend;\r\n\r\n\r\nprocedure TReader.FlushBuffer;\r\nbegin\r\n Driver.FlushBuffer;\r\nend;\r\n\r\nfunction TReader.CreateDriver(Stream: TStream): TAbstractObjectReader;\r\nbegin\r\n Result := TBinaryObjectReader.Create(Stream);\r\nend;\r\n\r\nprocedure TReader.BeginReferences;\r\nbegin\r\n FLoaded := TFpList.Create;\r\nend;\r\n\r\nprocedure TReader.CheckValue(Value: TValueType);\r\nbegin\r\n if FDriver.NextValue <> Value then\r\n raise EReadError.Create(SInvalidPropertyValue)\r\n else\r\n FDriver.ReadValue;\r\nend;\r\n\r\nprocedure TReader.DefineProperty(const Name: String; AReadData: TReaderProc;\r\n WriteData: TWriterProc; HasData: Boolean);\r\nbegin\r\n if Assigned(AReadData) and SameText(Name,FPropName) then\r\n begin\r\n AReadData(Self);\r\n SetLength(FPropName, 0);\r\n end else if assigned(WriteData) and HasData then\r\n ;\r\nend;\r\n\r\nprocedure TReader.DefineBinaryProperty(const Name: String;\r\n AReadData, WriteData: TStreamProc; HasData: Boolean);\r\nvar\r\n MemBuffer: TMemoryStream;\r\nbegin\r\n if Assigned(AReadData) and SameText(Name,FPropName) then\r\n begin\r\n { Check if the next property really is a binary property}\r\n if FDriver.NextValue <> vaBinary then\r\n begin\r\n FDriver.SkipValue;\r\n FCanHandleExcepts := True;\r\n raise EReadError.Create(SInvalidPropertyValue);\r\n end else\r\n FDriver.ReadValue;\r\n\r\n MemBuffer := TMemoryStream.Create;\r\n try\r\n FDriver.ReadBinary(MemBuffer);\r\n FCanHandleExcepts := True;\r\n AReadData(MemBuffer);\r\n finally\r\n MemBuffer.Free;\r\n end;\r\n SetLength(FPropName, 0);\r\n end else if assigned(WriteData) and HasData then ;\r\nend;\r\n\r\nfunction TReader.EndOfList: Boolean;\r\nbegin\r\n Result := FDriver.NextValue = vaNull;\r\nend;\r\n\r\nprocedure TReader.EndReferences;\r\nbegin\r\n FLoaded.Free;\r\n FLoaded := nil;\r\nend;\r\n\r\nfunction TReader.Error(const Message: String): Boolean;\r\nbegin\r\n Result := False;\r\n if Assigned(FOnError) then\r\n FOnError(Self, Message, Result);\r\nend;\r\n\r\nfunction TReader.FindMethod(ARoot: TComponent; const AMethodName: String): CodePointer;\r\nvar\r\n ErrorResult: Boolean;\r\nbegin\r\n Result:=nil;\r\n if (ARoot=Nil) or (aMethodName='') then\r\n exit;\r\n Result := ARoot.MethodAddress(AMethodName);\r\n ErrorResult := Result = nil;\r\n\r\n { always give the OnFindMethod callback a chance to locate the method }\r\n if Assigned(FOnFindMethod) then\r\n FOnFindMethod(Self, AMethodName, Result, ErrorResult);\r\n\r\n if ErrorResult then\r\n raise EReadError.Create(SInvalidPropertyValue);\r\nend;\r\n\r\nprocedure TReader.DoFixupReferences;\r\n\r\nVar\r\n R,RN : TLocalUnresolvedReference;\r\n G : TUnresolvedInstance;\r\n Ref : String;\r\n C : TComponent;\r\n P : integer;\r\n L : TLinkedList;\r\n\r\nbegin\r\n If Assigned(FFixups) then\r\n begin\r\n L:=TLinkedList(FFixups);\r\n R:=TLocalUnresolvedReference(L.Root);\r\n While (R<>Nil) do\r\n begin\r\n RN:=TLocalUnresolvedReference(R.Next);\r\n Ref:=R.FRelative;\r\n If Assigned(FOnReferenceName) then\r\n FOnReferenceName(Self,Ref);\r\n C:=FindNestedComponent(R.FRoot,Ref);\r\n If Assigned(C) then\r\n if R.FPropInfo.TypeInfo.Kind = tkInterface then\r\n SetInterfaceProp(R.FInstance,R.FPropInfo,C)\r\n else\r\n SetObjectProp(R.FInstance,R.FPropInfo,C)\r\n else\r\n begin\r\n P:=Pos('.',R.FRelative);\r\n If (P<>0) then\r\n begin\r\n G:=AddToResolveList(R.FInstance);\r\n G.Addreference(R.FRoot,R.FPropInfo,Copy(R.FRelative,1,P-1),Copy(R.FRelative,P+1,Length(R.FRelative)-P));\r\n end;\r\n end;\r\n L.RemoveItem(R,True);\r\n R:=RN;\r\n end;\r\n FreeAndNil(FFixups);\r\n end;\r\nend;\r\n\r\nprocedure TReader.FixupReferences;\r\nvar\r\n i: Integer;\r\nbegin\r\n DoFixupReferences;\r\n GlobalFixupReferences;\r\n for i := 0 to FLoaded.Count - 1 do\r\n TComponent(FLoaded[I]).Loaded;\r\nend;\r\n\r\n\r\nfunction TReader.NextValue: TValueType;\r\nbegin\r\n Result := FDriver.NextValue;\r\nend;\r\n\r\nprocedure TReader.Read(var Buffer : TBytes; Count: LongInt);\r\nbegin\r\n //This should give an exception if read is not implemented (i.e. TTextObjectReader)\r\n //but should work with TBinaryObjectReader.\r\n Driver.Read(Buffer, Count);\r\nend;\r\n\r\nprocedure TReader.PropertyError;\r\nbegin\r\n FDriver.SkipValue;\r\n raise EReadError.CreateFmt(SUnknownProperty,[FPropName]);\r\nend;\r\n\r\nfunction TReader.ReadBoolean: Boolean;\r\nvar\r\n ValueType: TValueType;\r\nbegin\r\n ValueType := FDriver.ReadValue;\r\n if ValueType = vaTrue then\r\n Result := True\r\n else if ValueType = vaFalse then\r\n Result := False\r\n else\r\n raise EReadError.Create(SInvalidPropertyValue);\r\nend;\r\n\r\nfunction TReader.ReadChar: Char;\r\nvar\r\n s: String;\r\nbegin\r\n s := ReadString;\r\n if Length(s) = 1 then\r\n Result := s[1]\r\n else\r\n raise EReadError.Create(SInvalidPropertyValue);\r\nend;\r\n\r\nfunction TReader.ReadWideChar: WideChar;\r\n\r\nvar\r\n W: WideString;\r\n\r\nbegin\r\n W := ReadWideString;\r\n if Length(W) = 1 then\r\n Result := W[1]\r\n else\r\n raise EReadError.Create(SInvalidPropertyValue);\r\nend;\r\n\r\nfunction TReader.ReadUnicodeChar: UnicodeChar;\r\n\r\nvar\r\n U: UnicodeString;\r\n\r\nbegin\r\n U := ReadUnicodeString;\r\n if Length(U) = 1 then\r\n Result := U[1]\r\n else\r\n raise EReadError.Create(SInvalidPropertyValue);\r\nend;\r\n\r\nprocedure TReader.ReadCollection(Collection: TCollection);\r\nvar\r\n Item: TCollectionItem;\r\nbegin\r\n Collection.BeginUpdate;\r\n if not EndOfList then\r\n Collection.Clear;\r\n while not EndOfList do begin\r\n ReadListBegin;\r\n Item := Collection.Add;\r\n while NextValue<>vaNull do\r\n ReadProperty(Item);\r\n ReadListEnd;\r\n end;\r\n Collection.EndUpdate;\r\n ReadListEnd;\r\nend;\r\n\r\nfunction TReader.ReadComponent(Component: TComponent): TComponent;\r\nvar\r\n Flags: TFilerFlags;\r\n\r\n function Recover(E : Exception; var aComponent: TComponent): Boolean;\r\n begin\r\n Result := False;\r\n if not ((ffInherited in Flags) or Assigned(Component)) then\r\n aComponent.Free;\r\n aComponent := nil;\r\n FDriver.SkipComponent(False);\r\n Result := Error(E.Message);\r\n end;\r\n\r\nvar\r\n CompClassName, Name: String;\r\n n, ChildPos: Integer;\r\n SavedParent, SavedLookupRoot: TComponent;\r\n ComponentClass: TComponentClass;\r\n C, NewComponent: TComponent;\r\n SubComponents: TList;\r\nbegin\r\n FDriver.BeginComponent(Flags, ChildPos, CompClassName, Name);\r\n SavedParent := Parent;\r\n SavedLookupRoot := FLookupRoot;\r\n SubComponents := nil;\r\n try\r\n Result := Component;\r\n if not Assigned(Result) then\r\n try\r\n if ffInherited in Flags then\r\n begin\r\n { Try to locate the existing ancestor component }\r\n\r\n if Assigned(FLookupRoot) then\r\n Result := FLookupRoot.FindComponent(Name)\r\n else\r\n Result := nil;\r\n\r\n if not Assigned(Result) then\r\n begin\r\n if Assigned(FOnAncestorNotFound) then\r\n FOnAncestorNotFound(Self, Name,\r\n FindComponentClass(CompClassName), Result);\r\n if not Assigned(Result) then\r\n raise EReadError.CreateFmt(SAncestorNotFound, [Name]);\r\n end;\r\n\r\n Parent := Result.GetParentComponent;\r\n if not Assigned(Parent) then\r\n Parent := Root;\r\n end else\r\n begin\r\n Result := nil;\r\n ComponentClass := FindComponentClass(CompClassName);\r\n if Assigned(FOnCreateComponent) then\r\n FOnCreateComponent(Self, ComponentClass, Result);\r\n if not Assigned(Result) then\r\n begin\r\n asm\r\n NewComponent = Object.create(ComponentClass);\r\n NewComponent.$init();\r\n end;\r\n if ffInline in Flags then\r\n NewComponent.FComponentState :=\r\n NewComponent.FComponentState + [csLoading, csInline];\r\n NewComponent.Create(Owner);\r\n NewComponent.AfterConstruction;\r\n\r\n { Don't set Result earlier because else we would come in trouble\r\n with the exception recover mechanism! (Result should be NIL if\r\n an error occurred) }\r\n Result := NewComponent;\r\n end;\r\n Include(Result.FComponentState, csLoading);\r\n end;\r\n except\r\n On E: Exception do\r\n if not Recover(E,Result) then\r\n raise;\r\n end;\r\n\r\n if Assigned(Result) then\r\n try\r\n Include(Result.FComponentState, csLoading);\r\n\r\n { create list of subcomponents and set loading}\r\n SubComponents := TList.Create;\r\n for n := 0 to Result.ComponentCount - 1 do\r\n begin\r\n C := Result.Components[n];\r\n if csSubcomponent in C.ComponentStyle\r\n then begin\r\n SubComponents.Add(C);\r\n Include(C.FComponentState, csLoading);\r\n end;\r\n end;\r\n\r\n if not (ffInherited in Flags) then\r\n try\r\n Result.SetParentComponent(Parent);\r\n if Assigned(FOnSetName) then\r\n FOnSetName(Self, Result, Name);\r\n Result.Name := Name;\r\n if FindGlobalComponent(Name) = Result then\r\n Include(Result.FComponentState, csInline);\r\n except\r\n On E : Exception do\r\n if not Recover(E,Result) then\r\n raise;\r\n end;\r\n if not Assigned(Result) then\r\n exit;\r\n if csInline in Result.ComponentState then\r\n FLookupRoot := Result;\r\n\r\n { Read the component state }\r\n Include(Result.FComponentState, csReading);\r\n for n := 0 to Subcomponents.Count - 1 do\r\n Include(TComponent(Subcomponents[n]).FComponentState, csReading);\r\n\r\n Result.ReadState(Self);\r\n\r\n Exclude(Result.FComponentState, csReading);\r\n for n := 0 to Subcomponents.Count - 1 do\r\n Exclude(TComponent(Subcomponents[n]).FComponentState, csReading);\r\n\r\n if ffChildPos in Flags then\r\n Parent.SetChildOrder(Result, ChildPos);\r\n\r\n { Add component to list of loaded components, if necessary }\r\n if (not ((ffInherited in Flags) or (csInline in Result.ComponentState))) or\r\n (FLoaded.IndexOf(Result) < 0)\r\n then begin\r\n for n := 0 to Subcomponents.Count - 1 do\r\n FLoaded.Add(Subcomponents[n]);\r\n FLoaded.Add(Result);\r\n end;\r\n except\r\n if ((ffInherited in Flags) or Assigned(Component)) then\r\n Result.Free;\r\n raise;\r\n end;\r\n finally\r\n Parent := SavedParent;\r\n FLookupRoot := SavedLookupRoot;\r\n Subcomponents.Free;\r\n end;\r\nend;\r\n\r\nprocedure TReader.ReadData(Instance: TComponent);\r\nvar\r\n SavedOwner, SavedParent: TComponent;\r\n\r\nbegin\r\n { Read properties }\r\n while not EndOfList do\r\n ReadProperty(Instance);\r\n ReadListEnd;\r\n\r\n { Read children }\r\n SavedOwner := Owner;\r\n SavedParent := Parent;\r\n try\r\n Owner := Instance.GetChildOwner;\r\n if not Assigned(Owner) then\r\n Owner := Root;\r\n Parent := Instance.GetChildParent;\r\n\r\n while not EndOfList do\r\n ReadComponent(nil);\r\n ReadListEnd;\r\n finally\r\n Owner := SavedOwner;\r\n Parent := SavedParent;\r\n end;\r\n\r\n { Fixup references if necessary (normally only if this is the root) }\r\n If (Instance=FRoot) then\r\n DoFixupReferences;\r\nend;\r\n\r\nfunction TReader.ReadFloat: Extended;\r\nbegin\r\n if FDriver.NextValue = vaExtended then\r\n begin\r\n ReadValue;\r\n Result := FDriver.ReadFloat\r\n end else\r\n Result := ReadNativeInt;\r\nend;\r\n\r\nprocedure TReader.ReadSignature;\r\nbegin\r\n FDriver.ReadSignature;\r\nend;\r\n\r\n\r\nfunction TReader.ReadCurrency: Currency;\r\nbegin\r\n if FDriver.NextValue = vaCurrency then\r\n begin\r\n FDriver.ReadValue;\r\n Result := FDriver.ReadCurrency;\r\n end else\r\n Result := ReadInteger;\r\nend;\r\n\r\n\r\nfunction TReader.ReadIdent: String;\r\nvar\r\n ValueType: TValueType;\r\nbegin\r\n ValueType := FDriver.ReadValue;\r\n if ValueType in [vaIdent, vaNil, vaFalse, vaTrue, vaNull] then\r\n Result := FDriver.ReadIdent(ValueType)\r\n else\r\n raise EReadError.Create(SInvalidPropertyValue);\r\nend;\r\n\r\n\r\nfunction TReader.ReadInteger: LongInt;\r\nbegin\r\n case FDriver.ReadValue of\r\n vaInt8:\r\n Result := FDriver.ReadInt8;\r\n vaInt16:\r\n Result := FDriver.ReadInt16;\r\n vaInt32:\r\n Result := FDriver.ReadInt32;\r\n else\r\n raise EReadError.Create(SInvalidPropertyValue);\r\n end;\r\nend;\r\n\r\nfunction TReader.ReadNativeInt: NativeInt;\r\nbegin\r\n if FDriver.NextValue = vaInt64 then\r\n begin\r\n FDriver.ReadValue;\r\n Result := FDriver.ReadNativeInt;\r\n end else\r\n Result := ReadInteger;\r\nend;\r\n\r\nfunction TReader.ReadSet(EnumType: Pointer): Integer;\r\nbegin\r\n if FDriver.NextValue = vaSet then\r\n begin\r\n FDriver.ReadValue;\r\n Result := FDriver.ReadSet(enumtype);\r\n end\r\n else\r\n Result := ReadInteger;\r\nend;\r\n\r\nprocedure TReader.ReadListBegin;\r\nbegin\r\n CheckValue(vaList);\r\nend;\r\n\r\nprocedure TReader.ReadListEnd;\r\nbegin\r\n CheckValue(vaNull);\r\nend;\r\n\r\nfunction TReader.ReadVariant: JSValue;\r\nvar\r\n nv: TValueType;\r\nbegin\r\n nv:=NextValue;\r\n case nv of\r\n vaNil:\r\n begin\r\n Result:=Undefined;\r\n readvalue;\r\n end;\r\n vaNull:\r\n begin\r\n Result:=Nil;\r\n readvalue;\r\n end;\r\n { all integer sizes must be split for big endian systems }\r\n vaInt8,vaInt16,vaInt32:\r\n begin\r\n Result:=ReadInteger;\r\n end;\r\n vaInt64:\r\n begin\r\n Result:=ReadNativeInt;\r\n end;\r\n{\r\n vaQWord:\r\n begin\r\n Result:=QWord(ReadInt64);\r\n end;\r\n} vaFalse,vaTrue:\r\n begin\r\n Result:=(nv<>vaFalse);\r\n readValue;\r\n end;\r\n vaCurrency:\r\n begin\r\n Result:=ReadCurrency;\r\n end;\r\n vaDouble:\r\n begin\r\n Result:=ReadFloat;\r\n end;\r\n vaString:\r\n begin\r\n Result:=ReadString;\r\n end;\r\n else\r\n raise EReadError.CreateFmt(SUnsupportedPropertyVariantType, [Ord(nv)]);\r\n end;\r\nend;\r\n\r\nprocedure TReader.ReadProperty(AInstance: TPersistent);\r\nvar\r\n Path: String;\r\n Instance: TPersistent;\r\n PropInfo: TTypeMemberProperty;\r\n Obj: TObject;\r\n Name: String;\r\n Skip: Boolean;\r\n Handled: Boolean;\r\n OldPropName: String;\r\n DotPos : String;\r\n NextPos: Integer;\r\n\r\n function HandleMissingProperty(IsPath: Boolean): boolean;\r\n begin\r\n Result:=true;\r\n if Assigned(OnPropertyNotFound) then begin\r\n // user defined property error handling\r\n OldPropName:=FPropName;\r\n Handled:=false;\r\n Skip:=false;\r\n OnPropertyNotFound(Self,Instance,FPropName,IsPath,Handled,Skip);\r\n if Handled and (not Skip) and (OldPropName<>FPropName) then\r\n // try alias property\r\n PropInfo := GetPropInfo(Instance.ClassType, FPropName);\r\n if Skip then begin\r\n FDriver.SkipValue;\r\n Result:=false;\r\n exit;\r\n end;\r\n end;\r\n end;\r\n\r\nbegin\r\n try\r\n Path := FDriver.BeginProperty;\r\n try\r\n Instance := AInstance;\r\n FCanHandleExcepts := True;\r\n DotPos := Path;\r\n while True do\r\n begin\r\n NextPos := Pos('.',DotPos);\r\n if NextPos>0 then\r\n FPropName := Copy(DotPos, 1, NextPos-1)\r\n else\r\n begin\r\n FPropName := DotPos;\r\n break;\r\n end;\r\n Delete(DotPos,1,NextPos);\r\n\r\n PropInfo := GetPropInfo(Instance.ClassType, FPropName);\r\n if not Assigned(PropInfo) then begin\r\n if not HandleMissingProperty(true) then exit;\r\n if not Assigned(PropInfo) then\r\n PropertyError;\r\n end;\r\n\r\n if PropInfo.TypeInfo.Kind = tkClass then\r\n Obj := TObject(GetObjectProp(Instance, PropInfo))\r\n //else if PropInfo^.PropType^.Kind = tkInterface then\r\n // Obj := TObject(GetInterfaceProp(Instance, PropInfo))\r\n else\r\n Obj := nil;\r\n\r\n if not (Obj is TPersistent) then\r\n begin\r\n { All path elements must be persistent objects! }\r\n FDriver.SkipValue;\r\n raise EReadError.Create(SInvalidPropertyPath);\r\n end;\r\n Instance := TPersistent(Obj);\r\n end;\r\n\r\n PropInfo := GetPropInfo(Instance.ClassType, FPropName);\r\n if Assigned(PropInfo) then\r\n ReadPropValue(Instance, PropInfo)\r\n else\r\n begin\r\n FCanHandleExcepts := False;\r\n Instance.DefineProperties(Self);\r\n FCanHandleExcepts := True;\r\n if Length(FPropName) > 0 then begin\r\n if not HandleMissingProperty(false) then exit;\r\n if not Assigned(PropInfo) then\r\n PropertyError;\r\n end;\r\n end;\r\n except\r\n on e: Exception do\r\n begin\r\n SetLength(Name, 0);\r\n if AInstance.InheritsFrom(TComponent) then\r\n Name := TComponent(AInstance).Name;\r\n if Length(Name) = 0 then\r\n Name := AInstance.ClassName;\r\n raise EReadError.CreateFmt(SPropertyException, [Name, '.', Path, e.Message]);\r\n end;\r\n end;\r\n except\r\n on e: Exception do\r\n if not FCanHandleExcepts or not Error(E.Message) then\r\n raise;\r\n end;\r\nend;\r\n\r\nprocedure TReader.ReadPropValue(Instance: TPersistent; PropInfo: TTypeMemberProperty);\r\nconst\r\n NullMethod: TMethod = (Code: nil; Data: nil);\r\nvar\r\n PropType: TTypeInfo;\r\n Value: LongInt;\r\n{ IdentToIntFn: TIdentToInt; }\r\n Ident: String;\r\n Method: TMethod;\r\n Handled: Boolean;\r\n TmpStr: String;\r\nbegin\r\n if (PropInfo.Setter='') then\r\n raise EReadError.Create(SReadOnlyProperty);\r\n\r\n PropType := PropInfo.TypeInfo;\r\n case PropType.Kind of\r\n tkInteger:\r\n case FDriver.NextValue of\r\n vaIdent :\r\n begin\r\n Ident := ReadIdent;\r\n if GlobalIdentToInt(Ident,Value) then\r\n SetOrdProp(Instance, PropInfo, Value)\r\n else\r\n raise EReadError.Create(SInvalidPropertyValue);\r\n end;\r\n vaNativeInt :\r\n SetOrdProp(Instance, PropInfo, ReadNativeInt);\r\n vaCurrency:\r\n SetFloatProp(Instance, PropInfo, ReadCurrency);\r\n else\r\n SetOrdProp(Instance, PropInfo, ReadInteger);\r\n end;\r\n tkBool:\r\n SetOrdProp(Instance, PropInfo, Ord(ReadBoolean));\r\n tkChar:\r\n SetOrdProp(Instance, PropInfo, Ord(ReadChar));\r\n tkEnumeration:\r\n begin\r\n Value := GetEnumValue(TTypeInfoEnum(PropType), ReadIdent);\r\n if Value = -1 then\r\n raise EReadError.Create(SInvalidPropertyValue);\r\n SetOrdProp(Instance, PropInfo, Value);\r\n end;\r\n{$ifndef FPUNONE}\r\n tkFloat:\r\n SetFloatProp(Instance, PropInfo, ReadFloat);\r\n{$endif}\r\n tkSet:\r\n begin\r\n CheckValue(vaSet);\r\n if TTypeInfoSet(PropType).CompType.Kind=tkEnumeration then\r\n SetOrdProp(Instance, PropInfo, FDriver.ReadSet(TTypeInfoEnum(TTypeInfoSet(PropType).CompType)));\r\n end;\r\n tkMethod, tkRefToProcVar:\r\n if FDriver.NextValue = vaNil then\r\n begin\r\n FDriver.ReadValue;\r\n SetMethodProp(Instance, PropInfo, NullMethod);\r\n end else\r\n begin\r\n Handled:=false;\r\n Ident:=ReadIdent;\r\n if Assigned(OnSetMethodProperty) then\r\n OnSetMethodProperty(Self,Instance,PropInfo,Ident,Handled);\r\n if not Handled then begin\r\n Method.Code := FindMethod(Root, Ident);\r\n Method.Data := Root;\r\n if Assigned(Method.Code) then\r\n SetMethodProp(Instance, PropInfo, Method);\r\n end;\r\n end;\r\n tkString:\r\n begin\r\n TmpStr:=ReadString;\r\n if Assigned(FOnReadStringProperty) then\r\n FOnReadStringProperty(Self,Instance,PropInfo,TmpStr);\r\n SetStrProp(Instance, PropInfo, TmpStr);\r\n end;\r\n tkJSValue:\r\n begin\r\n SetJSValueProp(Instance,PropInfo,ReadVariant);\r\n end;\r\n tkClass, tkInterface:\r\n case FDriver.NextValue of\r\n vaNil:\r\n begin\r\n FDriver.ReadValue;\r\n SetOrdProp(Instance, PropInfo, 0)\r\n end;\r\n vaCollection:\r\n begin\r\n FDriver.ReadValue;\r\n ReadCollection(TCollection(GetObjectProp(Instance, PropInfo)));\r\n end\r\n else\r\n begin\r\n If Not Assigned(FFixups) then\r\n FFixups:=TLinkedList.Create(TLocalUnresolvedReference);\r\n With TLocalUnresolvedReference(TLinkedList(FFixups).Add) do\r\n begin\r\n FInstance:=Instance;\r\n FRoot:=Root;\r\n FPropInfo:=PropInfo;\r\n FRelative:=ReadIdent;\r\n end;\r\n end;\r\n end;\r\n {tkint64:\r\n SetInt64Prop(Instance, PropInfo, ReadInt64);}\r\n else\r\n raise EReadError.CreateFmt(SUnknownPropertyType, [Str(PropType.Kind)]);\r\n end;\r\nend;\r\n\r\nfunction TReader.ReadRootComponent(ARoot: TComponent): TComponent;\r\nvar\r\n Dummy, i: Integer;\r\n Flags: TFilerFlags;\r\n CompClassName, CompName, ResultName: String;\r\nbegin\r\n FDriver.BeginRootComponent;\r\n Result := nil;\r\n {!!!: GlobalNameSpace.BeginWrite; // Loading from stream adds to name space\r\n try}\r\n try\r\n FDriver.BeginComponent(Flags, Dummy, CompClassName, CompName);\r\n if not Assigned(ARoot) then\r\n begin\r\n { Read the class name and the object name and create a new object: }\r\n Result := TComponentClass(FindClass(CompClassName)).Create(nil);\r\n Result.Name := CompName;\r\n end else\r\n begin\r\n Result := ARoot;\r\n\r\n if not (csDesigning in Result.ComponentState) then\r\n begin\r\n Result.FComponentState :=\r\n Result.FComponentState + [csLoading, csReading];\r\n\r\n { We need an unique name }\r\n i := 0;\r\n { Don't use Result.Name directly, as this would influence\r\n FindGlobalComponent in successive loop runs }\r\n ResultName := CompName;\r\n while Assigned(FindGlobalComponent(ResultName)) do\r\n begin\r\n Inc(i);\r\n ResultName := CompName + '_' + IntToStr(i);\r\n end;\r\n Result.Name := ResultName;\r\n end;\r\n end;\r\n\r\n FRoot := Result;\r\n FLookupRoot := Result;\r\n if Assigned(GlobalLoaded) then\r\n FLoaded := GlobalLoaded\r\n else\r\n FLoaded := TFpList.Create;\r\n\r\n try\r\n if FLoaded.IndexOf(FRoot) < 0 then\r\n FLoaded.Add(FRoot);\r\n FOwner := FRoot;\r\n FRoot.FComponentState := FRoot.FComponentState + [csLoading, csReading];\r\n FRoot.ReadState(Self);\r\n Exclude(FRoot.FComponentState, csReading);\r\n\r\n if not Assigned(GlobalLoaded) then\r\n for i := 0 to FLoaded.Count - 1 do\r\n TComponent(FLoaded[i]).Loaded;\r\n\r\n finally\r\n if not Assigned(GlobalLoaded) then\r\n FLoaded.Free;\r\n FLoaded := nil;\r\n end;\r\n GlobalFixupReferences;\r\n except\r\n RemoveFixupReferences(ARoot, '');\r\n if not Assigned(ARoot) then\r\n Result.Free;\r\n raise;\r\n end;\r\n {finally\r\n GlobalNameSpace.EndWrite;\r\n end;}\r\nend;\r\n\r\nprocedure TReader.ReadComponents(AOwner, AParent: TComponent;\r\n Proc: TReadComponentsProc);\r\nvar\r\n Component: TComponent;\r\nbegin\r\n Root := AOwner;\r\n Owner := AOwner;\r\n Parent := AParent;\r\n BeginReferences;\r\n try\r\n while not EndOfList do\r\n begin\r\n FDriver.BeginRootComponent;\r\n Component := ReadComponent(nil);\r\n if Assigned(Proc) then\r\n Proc(Component);\r\n end;\r\n ReadListEnd;\r\n FixupReferences;\r\n finally\r\n EndReferences;\r\n end;\r\nend;\r\n\r\n\r\nfunction TReader.ReadString: String;\r\nvar\r\n StringType: TValueType;\r\nbegin\r\n StringType := FDriver.ReadValue;\r\n if StringType=vaString then\r\n Result := FDriver.ReadString(StringType)\r\n else\r\n raise EReadError.Create(SInvalidPropertyValue);\r\nend;\r\n\r\n\r\nfunction TReader.ReadWideString: WideString;\r\n\r\nbegin\r\n Result:=ReadString;\r\nend;\r\n\r\nfunction TReader.ReadUnicodeString: UnicodeString;\r\n\r\nbegin\r\n Result:=ReadString;\r\nend;\r\n\r\nfunction TReader.ReadValue: TValueType;\r\nbegin\r\n Result := FDriver.ReadValue;\r\nend;\r\n\r\nprocedure TReader.CopyValue(Writer: TWriter);\r\n\r\n(*\r\nprocedure CopyBytes(Count: Integer);\r\n{ var\r\n Buffer: array[0..1023] of Byte; }\r\n begin\r\n{!!!: while Count > 1024 do\r\n begin\r\n FDriver.Read(Buffer, 1024);\r\n Writer.Driver.Write(Buffer, 1024);\r\n Dec(Count, 1024);\r\n end;\r\n if Count > 0 then\r\n begin\r\n FDriver.Read(Buffer, Count);\r\n Writer.Driver.Write(Buffer, Count);\r\n end;}\r\n end;\r\n*)\r\n\r\n{var\r\n s: String;\r\n Count: LongInt; }\r\nbegin\r\n case FDriver.NextValue of\r\n vaNull:\r\n Writer.WriteIdent('NULL');\r\n vaFalse:\r\n Writer.WriteIdent('FALSE');\r\n vaTrue:\r\n Writer.WriteIdent('TRUE');\r\n vaNil:\r\n Writer.WriteIdent('NIL');\r\n {!!!: vaList, vaCollection:\r\n begin\r\n Writer.WriteValue(FDriver.ReadValue);\r\n while not EndOfList do\r\n CopyValue(Writer);\r\n ReadListEnd;\r\n Writer.WriteListEnd;\r\n end;}\r\n vaInt8, vaInt16, vaInt32:\r\n Writer.WriteInteger(ReadInteger);\r\n{$ifndef FPUNONE}\r\n vaExtended:\r\n Writer.WriteFloat(ReadFloat);\r\n{$endif}\r\n vaString:\r\n Writer.WriteString(ReadString);\r\n vaIdent:\r\n Writer.WriteIdent(ReadIdent);\r\n {!!!: vaBinary, vaLString, vaWString:\r\n begin\r\n Writer.WriteValue(FDriver.ReadValue);\r\n FDriver.Read(Count, SizeOf(Count));\r\n Writer.Driver.Write(Count, SizeOf(Count));\r\n CopyBytes(Count);\r\n end;}\r\n {!!!: vaSet:\r\n Writer.WriteSet(ReadSet);}\r\n {!!!: vaCurrency:\r\n Writer.WriteCurrency(ReadCurrency);}\r\n vaInt64:\r\n Writer.WriteInteger(ReadNativeInt);\r\n end;\r\nend;\r\n\r\nfunction TReader.FindComponentClass(const AClassName: String): TComponentClass;\r\n\r\nvar\r\n PersistentClass: TPersistentClass;\r\n\r\n function FindClassInFieldTable(Instance: TComponent): TComponentClass;\r\n var\r\n aClass: TClass;\r\n i: longint;\r\n ClassTI, MemberClassTI: TTypeInfoClass;\r\n MemberTI: TTypeInfo;\r\n begin\r\n aClass:=Instance.ClassType;\r\n while aClass<>nil do\r\n begin\r\n ClassTI:=typeinfo(aClass);\r\n for i:=0 to ClassTI.FieldCount-1 do\r\n begin\r\n MemberTI:=ClassTI.GetField(i).TypeInfo;\r\n if MemberTI.Kind=tkClass then\r\n begin\r\n MemberClassTI:=TTypeInfoClass(MemberTI);\r\n if SameText(MemberClassTI.Name,aClassName)\r\n and (MemberClassTI.ClassType is TComponent) then\r\n exit(TComponentClass(MemberClassTI.ClassType));\r\n end;\r\n end;\r\n aClass:=aClass.ClassParent;\r\n end;\r\n end;\r\n\r\nbegin\r\n Result := nil;\r\n Result:=FindClassInFieldTable(Root);\r\n\r\n if (Result=nil) and assigned(LookupRoot) and (LookupRoot<>Root) then\r\n Result:=FindClassInFieldTable(LookupRoot);\r\n\r\n if (Result=nil) then begin\r\n PersistentClass := GetClass(AClassName);\r\n if PersistentClass.InheritsFrom(TComponent) then\r\n Result := TComponentClass(PersistentClass);\r\n end;\r\n\r\n if (Result=nil) and assigned(OnFindComponentClass) then\r\n OnFindComponentClass(Self, AClassName, Result);\r\n\r\n if (Result=nil) or (not Result.InheritsFrom(TComponent)) then\r\n raise EClassNotFound.CreateFmt(SClassNotFound, [AClassName]);\r\nend;\r\n\r\n\r\n{ TAbstractObjectReader }\r\n\r\nprocedure TAbstractObjectReader.FlushBuffer;\r\nbegin\r\n // Do nothing\r\nend;\r\n\r\n\r\n{\r\n This file is part of the Free Component Library (FCL)\r\n Copyright (c) 1999-2000 by the Free Pascal development team\r\n\r\n See the file COPYING.FPC, included in this distribution,\r\n for details about the copyright.\r\n\r\n This program is distributed in the hope that it will be useful,\r\n but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r\n\r\n **********************************************************************}\r\n\r\n\r\n{****************************************************************************}\r\n{* TBinaryObjectWriter *}\r\n{****************************************************************************}\r\n\r\n\r\nprocedure TBinaryObjectWriter.WriteWord(w : word);\r\nbegin\r\n FStream.WriteBufferData(w);\r\nend;\r\n\r\nprocedure TBinaryObjectWriter.WriteDWord(lw : longword);\r\nbegin\r\n FStream.WriteBufferData(lw);\r\nend;\r\n\r\nconstructor TBinaryObjectWriter.Create(Stream: TStream);\r\nbegin\r\n inherited Create;\r\n If (Stream=Nil) then\r\n Raise EWriteError.Create(SEmptyStreamIllegalWriter);\r\n FStream := Stream;\r\nend;\r\n\r\nprocedure TBinaryObjectWriter.BeginCollection;\r\nbegin\r\n WriteValue(vaCollection);\r\nend;\r\n\r\nprocedure TBinaryObjectWriter.WriteSignature;\r\n\r\nbegin\r\n FStream.WriteBufferData(FilerSignatureInt);\r\nend;\r\n\r\nprocedure TBinaryObjectWriter.BeginComponent(Component: TComponent;\r\n Flags: TFilerFlags; ChildPos: Integer);\r\nvar\r\n Prefix: Byte;\r\nbegin\r\n\r\n { Only write the flags if they are needed! }\r\n if Flags <> [] then\r\n begin\r\n Prefix:=0;\r\n if ffInherited in Flags then\r\n Prefix:=Prefix or $01;\r\n if ffChildPos in Flags then\r\n Prefix:=Prefix or $02;\r\n if ffInline in Flags then\r\n Prefix:=Prefix or $04;\r\n Prefix := Prefix or $f0;\r\n FStream.WriteBufferData(Prefix);\r\n if ffChildPos in Flags then\r\n WriteInteger(ChildPos);\r\n end;\r\n\r\n WriteStr(Component.ClassName);\r\n WriteStr(Component.Name);\r\nend;\r\n\r\nprocedure TBinaryObjectWriter.BeginList;\r\nbegin\r\n WriteValue(vaList);\r\nend;\r\n\r\nprocedure TBinaryObjectWriter.EndList;\r\nbegin\r\n WriteValue(vaNull);\r\nend;\r\n\r\nprocedure TBinaryObjectWriter.BeginProperty(const PropName: String);\r\nbegin\r\n WriteStr(PropName);\r\nend;\r\n\r\nprocedure TBinaryObjectWriter.EndProperty;\r\nbegin\r\nend;\r\n\r\nprocedure TBinaryObjectWriter.FlushBuffer;\r\nbegin\r\n // Do nothing;\r\nend;\r\n\r\nprocedure TBinaryObjectWriter.WriteBinary(const Buffer : TBytes; Count: LongInt);\r\nbegin\r\n WriteValue(vaBinary);\r\n WriteDWord(longword(Count));\r\n FStream.Write(Buffer, Count);\r\nend;\r\n\r\nprocedure TBinaryObjectWriter.WriteBoolean(Value: Boolean);\r\nbegin\r\n if Value then\r\n WriteValue(vaTrue)\r\n else\r\n WriteValue(vaFalse);\r\nend;\r\n\r\nprocedure TBinaryObjectWriter.WriteFloat(const Value: Extended);\r\nbegin\r\n WriteValue(vaDouble);\r\n FStream.WriteBufferData(Value);\r\nend;\r\n\r\n\r\nprocedure TBinaryObjectWriter.WriteCurrency(const Value: Currency);\r\n\r\nVar\r\n F : Double;\r\nbegin\r\n WriteValue(vaCurrency);\r\n F:=Value;\r\n FStream.WriteBufferData(F);\r\nend;\r\n\r\nprocedure TBinaryObjectWriter.WriteIdent(const Ident: string);\r\nbegin\r\n { Check if Ident is a special identifier before trying to just write\r\n Ident directly }\r\n if UpperCase(Ident) = 'NIL' then\r\n WriteValue(vaNil)\r\n else if UpperCase(Ident) = 'FALSE' then\r\n WriteValue(vaFalse)\r\n else if UpperCase(Ident) = 'TRUE' then\r\n WriteValue(vaTrue)\r\n else if UpperCase(Ident) = 'NULL' then\r\n WriteValue(vaNull) else\r\n begin\r\n WriteValue(vaIdent);\r\n WriteStr(Ident);\r\n end;\r\nend;\r\n\r\nprocedure TBinaryObjectWriter.WriteInteger(Value: NativeInt);\r\nvar\r\n s: ShortInt;\r\n i: SmallInt;\r\n l: Longint;\r\nbegin\r\n { Use the smallest possible integer type for the given value: }\r\n if (Value >= -128) and (Value <= 127) then\r\n begin\r\n WriteValue(vaInt8);\r\n s := Value;\r\n FStream.WriteBufferData(s);\r\n end else if (Value >= -32768) and (Value <= 32767) then\r\n begin\r\n WriteValue(vaInt16);\r\n i := Value;\r\n WriteWord(word(i));\r\n end else if (Value >= -$80000000) and (Value <= $7fffffff) then\r\n begin\r\n WriteValue(vaInt32);\r\n l := Value;\r\n WriteDWord(longword(l));\r\n end else\r\n begin\r\n WriteValue(vaInt64);\r\n FStream.WriteBufferData(Value);\r\n end;\r\nend;\r\n\r\nprocedure TBinaryObjectWriter.WriteNativeInt(Value: NativeInt);\r\nvar\r\n s: Int8;\r\n i: Int16;\r\n l: Int32;\r\nbegin\r\n { Use the smallest possible integer type for the given value: }\r\n if (Value <= 127) then\r\n begin\r\n WriteValue(vaInt8);\r\n s := Value;\r\n FStream.WriteBufferData(s);\r\n end else if (Value <= 32767) then\r\n begin\r\n WriteValue(vaInt16);\r\n i := Value;\r\n WriteWord(word(i));\r\n end else if (Value <= $7fffffff) then\r\n begin\r\n WriteValue(vaInt32);\r\n l := Value;\r\n WriteDWord(longword(l));\r\n end else\r\n begin\r\n WriteValue(vaQWord);\r\n FStream.WriteBufferData(Value);\r\n end;\r\nend;\r\n\r\n\r\nprocedure TBinaryObjectWriter.WriteMethodName(const Name: String);\r\nbegin\r\n if Length(Name) > 0 then\r\n begin\r\n WriteValue(vaIdent);\r\n WriteStr(Name);\r\n end else\r\n WriteValue(vaNil);\r\nend;\r\n\r\nprocedure TBinaryObjectWriter.WriteSet(Value: LongInt; SetType: Pointer);\r\nvar\r\n i: Integer;\r\n b : Integer;\r\nbegin\r\n WriteValue(vaSet);\r\n B:=1;\r\n for i:=0 to 31 do\r\n begin\r\n if (Value and b) <>0 then\r\n begin\r\n WriteStr(GetEnumName(PTypeInfo(SetType), i));\r\n end;\r\n b:=b shl 1;\r\n end;\r\n WriteStr('');\r\nend;\r\n\r\nprocedure TBinaryObjectWriter.WriteString(const Value: String);\r\n\r\nvar\r\n i, len: Integer;\r\nbegin\r\n len := Length(Value);\r\n WriteValue(vaString);\r\n WriteDWord(len);\r\n For I:=1 to len do\r\n FStream.WriteBufferData(Value[i]);\r\nend;\r\n\r\nprocedure TBinaryObjectWriter.WriteWideString(const Value: WideString);\r\n\r\nbegin\r\n WriteString(Value);\r\nend;\r\n\r\nprocedure TBinaryObjectWriter.WriteUnicodeString(const Value: UnicodeString);\r\n\r\nbegin\r\n WriteString(Value);\r\nend;\r\n\r\nprocedure TBinaryObjectWriter.WriteVariant(const VarValue: JSValue);\r\nbegin\r\n if isUndefined(varValue) then\r\n WriteValue(vaNil)\r\n else if IsNull(VarValue) then\r\n WriteValue(vaNull)\r\n else if IsNumber(VarValue) then\r\n begin\r\n if Frac(Double(varValue))=0 then\r\n WriteInteger(NativeInt(VarValue))\r\n else\r\n WriteFloat(Double(varValue))\r\n end\r\n else if isBoolean(varValue) then\r\n WriteBoolean(Boolean(VarValue))\r\n else if isString(varValue) then\r\n WriteString(String(VarValue))\r\n else\r\n raise EWriteError.Create(SUnsupportedPropertyVariantType);\r\nend;\r\n\r\n\r\nprocedure TBinaryObjectWriter.Write(const Buffer : TBytes; Count: LongInt);\r\n\r\nbegin\r\n FStream.Write(Buffer,Count);\r\nend;\r\n\r\nprocedure TBinaryObjectWriter.WriteValue(Value: TValueType);\r\nvar\r\n b: uint8;\r\nbegin\r\n b := uint8(Value);\r\n FStream.WriteBufferData(b);\r\nend;\r\n\r\nprocedure TBinaryObjectWriter.WriteStr(const Value: String);\r\nvar\r\n len,i: integer;\r\n b: uint8;\r\nbegin\r\n len:= Length(Value);\r\n if len > 255 then\r\n len := 255;\r\n b := len;\r\n FStream.WriteBufferData(b);\r\n For I:=1 to len do\r\n FStream.WriteBufferData(Value[i]);\r\nend;\r\n\r\n\r\n\r\n{****************************************************************************}\r\n{* TWriter *}\r\n{****************************************************************************}\r\n\r\n\r\nconstructor TWriter.Create(ADriver: TAbstractObjectWriter);\r\nbegin\r\n inherited Create;\r\n FDriver := ADriver;\r\nend;\r\n\r\nconstructor TWriter.Create(Stream: TStream);\r\nbegin\r\n inherited Create;\r\n If (Stream=Nil) then\r\n Raise EWriteError.Create(SEmptyStreamIllegalWriter);\r\n FDriver := CreateDriver(Stream);\r\n FDestroyDriver := True;\r\nend;\r\n\r\ndestructor TWriter.Destroy;\r\nbegin\r\n if FDestroyDriver then\r\n FDriver.Free;\r\n inherited Destroy;\r\nend;\r\n\r\nfunction TWriter.CreateDriver(Stream: TStream): TAbstractObjectWriter;\r\nbegin\r\n Result := TBinaryObjectWriter.Create(Stream);\r\nend;\r\n\r\nType\r\n TPosComponent = Class(TObject)\r\n Private\r\n FPos : Integer;\r\n FComponent : TComponent;\r\n Public\r\n Constructor Create(APos : Integer; AComponent : TComponent);\r\n end;\r\n\r\nConstructor TPosComponent.Create(APos : Integer; AComponent : TComponent);\r\n\r\nbegin\r\n FPos:=APos;\r\n FComponent:=AComponent;\r\nend;\r\n\r\n// Used as argument for calls to TComponent.GetChildren:\r\nprocedure TWriter.AddToAncestorList(Component: TComponent);\r\nbegin\r\n FAncestors.AddObject(Component.Name,TPosComponent.Create(FAncestors.Count,Component));\r\nend;\r\n\r\nprocedure TWriter.DefineProperty(const Name: String;\r\n ReadData: TReaderProc; AWriteData: TWriterProc; HasData: Boolean);\r\nbegin\r\n if HasData and Assigned(AWriteData) then\r\n begin\r\n // Write the property name and then the data itself\r\n Driver.BeginProperty(FPropPath + Name);\r\n AWriteData(Self);\r\n Driver.EndProperty;\r\n end else if assigned(ReadData) then ;\r\nend;\r\n\r\nprocedure TWriter.DefineBinaryProperty(const Name: String;\r\n ReadData, AWriteData: TStreamProc; HasData: Boolean);\r\nbegin\r\n if HasData and Assigned(AWriteData) then\r\n begin\r\n // Write the property name and then the data itself\r\n Driver.BeginProperty(FPropPath + Name);\r\n WriteBinary(AWriteData);\r\n Driver.EndProperty;\r\n end else if assigned(ReadData) then ;\r\nend;\r\n\r\nprocedure TWriter.FlushBuffer;\r\nbegin\r\n Driver.FlushBuffer;\r\nend;\r\n\r\nprocedure TWriter.Write(const Buffer : TBytes; Count: Longint);\r\nbegin\r\n //This should give an exception if write is not implemented (i.e. TTextObjectWriter)\r\n //but should work with TBinaryObjectWriter.\r\n Driver.Write(Buffer, Count);\r\nend;\r\n\r\nprocedure TWriter.SetRoot(ARoot: TComponent);\r\nbegin\r\n inherited SetRoot(ARoot);\r\n // Use the new root as lookup root too\r\n FLookupRoot := ARoot;\r\nend;\r\n\r\nprocedure TWriter.WriteSignature;\r\n\r\nbegin\r\n FDriver.WriteSignature;\r\nend;\r\n\r\nprocedure TWriter.WriteBinary(AWriteData: TStreamProc);\r\nvar\r\n MemBuffer: TBytesStream;\r\nbegin\r\n { First write the binary data into a memory stream, then copy this buffered\r\n stream into the writing destination. This is necessary as we have to know\r\n the size of the binary data in advance (we're assuming that seeking within\r\n the writer stream is not possible) }\r\n MemBuffer := TBytesStream.Create;\r\n try\r\n AWriteData(MemBuffer);\r\n Driver.WriteBinary(MemBuffer.Bytes, MemBuffer.Size);\r\n finally\r\n MemBuffer.Free;\r\n end;\r\nend;\r\n\r\nprocedure TWriter.WriteBoolean(Value: Boolean);\r\nbegin\r\n Driver.WriteBoolean(Value);\r\nend;\r\n\r\nprocedure TWriter.WriteChar(Value: Char);\r\nbegin\r\n WriteString(Value);\r\nend;\r\n\r\nprocedure TWriter.WriteWideChar(Value: WideChar);\r\nbegin\r\n WriteWideString(Value);\r\nend;\r\n\r\nprocedure TWriter.WriteCollection(Value: TCollection);\r\nvar\r\n i: Integer;\r\nbegin\r\n Driver.BeginCollection;\r\n if Assigned(Value) then\r\n for i := 0 to Value.Count - 1 do\r\n begin\r\n { Each collection item needs its own ListBegin/ListEnd tag, or else the\r\n reader wouldn't be able to know where an item ends and where the next\r\n one starts }\r\n WriteListBegin;\r\n WriteProperties(Value.Items[i]);\r\n WriteListEnd;\r\n end;\r\n WriteListEnd;\r\nend;\r\n\r\nprocedure TWriter.DetermineAncestor(Component : TComponent);\r\n\r\nVar\r\n I : Integer;\r\n\r\nbegin\r\n // Should be set only when we write an inherited with children.\r\n if Not Assigned(FAncestors) then\r\n exit;\r\n I:=FAncestors.IndexOf(Component.Name);\r\n If (I=-1) then\r\n begin\r\n FAncestor:=Nil;\r\n FAncestorPos:=-1;\r\n end\r\n else\r\n With TPosComponent(FAncestors.Objects[i]) do\r\n begin\r\n FAncestor:=FComponent;\r\n FAncestorPos:=FPos;\r\n end;\r\nend;\r\n\r\nprocedure TWriter.DoFindAncestor(Component : TComponent);\r\n\r\nVar\r\n C : TComponent;\r\n\r\nbegin\r\n if Assigned(FOnFindAncestor) then\r\n if (Ancestor=Nil) or (Ancestor is TComponent) then\r\n begin\r\n C:=TComponent(Ancestor);\r\n FOnFindAncestor(Self,Component,Component.Name,C,FRootAncestor);\r\n Ancestor:=C;\r\n end;\r\nend;\r\n\r\nprocedure TWriter.WriteComponent(Component: TComponent);\r\n\r\nvar\r\n SA : TPersistent;\r\n SR, SRA : TComponent;\r\nbegin\r\n SR:=FRoot;\r\n SA:=FAncestor;\r\n SRA:=FRootAncestor;\r\n Try\r\n Component.FComponentState:=Component.FComponentState+[csWriting];\r\n Try\r\n // Possibly set ancestor.\r\n DetermineAncestor(Component);\r\n DoFindAncestor(Component); // Mainly for IDE when a parent form had an ancestor renamed...\r\n // Will call WriteComponentData.\r\n Component.WriteState(Self);\r\n FDriver.EndList;\r\n Finally\r\n Component.FComponentState:=Component.FComponentState-[csWriting];\r\n end;\r\n Finally\r\n FAncestor:=SA;\r\n FRoot:=SR;\r\n FRootAncestor:=SRA;\r\n end;\r\nend;\r\n\r\nprocedure TWriter.WriteChildren(Component : TComponent);\r\n\r\nVar\r\n SRoot, SRootA : TComponent;\r\n SList : TStringList;\r\n SPos, I , SAncestorPos: Integer;\r\n O : TObject;\r\n\r\nbegin\r\n // Write children list.\r\n // While writing children, the ancestor environment must be saved\r\n // This is recursive...\r\n SRoot:=FRoot;\r\n SRootA:=FRootAncestor;\r\n SList:=FAncestors;\r\n SPos:=FCurrentPos;\r\n SAncestorPos:=FAncestorPos;\r\n try\r\n FAncestors:=Nil;\r\n FCurrentPos:=0;\r\n FAncestorPos:=-1;\r\n if csInline in Component.ComponentState then\r\n FRoot:=Component;\r\n if (FAncestor is TComponent) then\r\n begin\r\n FAncestors:=TStringList.Create;\r\n if csInline in TComponent(FAncestor).ComponentState then\r\n FRootAncestor := TComponent(FAncestor);\r\n TComponent(FAncestor).GetChildren(@AddToAncestorList,FRootAncestor);\r\n FAncestors.Sorted:=True;\r\n end;\r\n try\r\n Component.GetChildren(@WriteComponent, FRoot);\r\n Finally\r\n If Assigned(Fancestors) then\r\n For I:=0 to FAncestors.Count-1 do\r\n begin\r\n O:=FAncestors.Objects[i];\r\n FAncestors.Objects[i]:=Nil;\r\n O.Free;\r\n end;\r\n FreeAndNil(FAncestors);\r\n end;\r\n finally\r\n FAncestors:=Slist;\r\n FRoot:=SRoot;\r\n FRootAncestor:=SRootA;\r\n FCurrentPos:=SPos;\r\n FAncestorPos:=SAncestorPos;\r\n end;\r\nend;\r\n\r\nprocedure TWriter.WriteComponentData(Instance: TComponent);\r\nvar\r\n Flags: TFilerFlags;\r\nbegin\r\n Flags := [];\r\n If (Assigned(FAncestor)) and //has ancestor\r\n (not (csInline in Instance.ComponentState) or // no inline component\r\n // .. or the inline component is inherited\r\n (csAncestor in Instance.Componentstate) and (FAncestors <> nil)) then\r\n Flags:=[ffInherited]\r\n else If csInline in Instance.ComponentState then\r\n Flags:=[ffInline];\r\n If (FAncestors<>Nil) and ((FCurrentPos<>FAncestorPos) or (FAncestor=Nil)) then\r\n Include(Flags,ffChildPos);\r\n FDriver.BeginComponent(Instance,Flags,FCurrentPos);\r\n If (FAncestors<>Nil) then\r\n Inc(FCurrentPos);\r\n WriteProperties(Instance);\r\n WriteListEnd;\r\n // Needs special handling of ancestor.\r\n If not IgnoreChildren then\r\n WriteChildren(Instance);\r\nend;\r\n\r\nprocedure TWriter.WriteDescendent(ARoot: TComponent; AAncestor: TComponent);\r\nbegin\r\n FRoot := ARoot;\r\n FAncestor := AAncestor;\r\n FRootAncestor := AAncestor;\r\n FLookupRoot := ARoot;\r\n WriteSignature;\r\n WriteComponent(ARoot);\r\nend;\r\n\r\nprocedure TWriter.WriteFloat(const Value: Extended);\r\nbegin\r\n Driver.WriteFloat(Value);\r\nend;\r\n\r\n\r\nprocedure TWriter.WriteCurrency(const Value: Currency);\r\nbegin\r\n Driver.WriteCurrency(Value);\r\nend;\r\n\r\n\r\nprocedure TWriter.WriteIdent(const Ident: string);\r\nbegin\r\n Driver.WriteIdent(Ident);\r\nend;\r\n\r\nprocedure TWriter.WriteInteger(Value: LongInt);\r\nbegin\r\n Driver.WriteInteger(Value);\r\nend;\r\n\r\nprocedure TWriter.WriteInteger(Value: NativeInt);\r\nbegin\r\n Driver.WriteInteger(Value);\r\nend;\r\n\r\nprocedure TWriter.WriteSet(Value: LongInt; SetType: Pointer);\r\n\r\nbegin\r\n Driver.WriteSet(Value,SetType);\r\nend;\r\n\r\nprocedure TWriter.WriteVariant(const VarValue: JSValue);\r\nbegin\r\n Driver.WriteVariant(VarValue);\r\nend;\r\n\r\nprocedure TWriter.WriteListBegin;\r\nbegin\r\n Driver.BeginList;\r\nend;\r\n\r\nprocedure TWriter.WriteListEnd;\r\nbegin\r\n Driver.EndList;\r\nend;\r\n\r\nprocedure TWriter.WriteProperties(Instance: TPersistent);\r\n\r\nvar\r\n PropCount,i : integer;\r\n PropList : TTypeMemberPropertyDynArray;\r\n\r\nbegin\r\n PropList:=GetPropList(Instance);\r\n PropCount:=Length(PropList);\r\n if PropCount>0 then\r\n for i := 0 to PropCount-1 do\r\n if IsStoredProp(Instance,PropList[i]) then\r\n WriteProperty(Instance,PropList[i]);\r\n Instance.DefineProperties(Self);\r\nend;\r\n\r\n\r\nprocedure TWriter.WriteProperty(Instance: TPersistent; PropInfo: TTypeMemberProperty);\r\nvar\r\n HasAncestor: Boolean;\r\n PropType: TTypeInfo;\r\n N,Value, DefValue: LongInt;\r\n Ident: String;\r\n IntToIdentFn: TIntToIdent;\r\n{$ifndef FPUNONE}\r\n FloatValue, DefFloatValue: Extended;\r\n{$endif}\r\n MethodValue: TMethod;\r\n DefMethodValue: TMethod;\r\n StrValue, DefStrValue: String;\r\n AncestorObj: TObject;\r\n C,Component: TComponent;\r\n ObjValue: TObject;\r\n SavedAncestor: TPersistent;\r\n Key, SavedPropPath, Name, lMethodName: String;\r\n VarValue, DefVarValue : JSValue;\r\n BoolValue, DefBoolValue: boolean;\r\n Handled: Boolean;\r\n O : TJSObject;\r\nbegin\r\n // do not stream properties without getter\r\n if PropInfo.Getter='' then\r\n exit;\r\n // properties without setter are only allowed, if they are subcomponents\r\n PropType := PropInfo.TypeInfo;\r\n if (PropInfo.Setter='') then\r\n begin\r\n if PropType.Kind<>tkClass then\r\n exit;\r\n ObjValue := TObject(GetObjectProp(Instance, PropInfo));\r\n if not ObjValue.InheritsFrom(TComponent) or\r\n not (csSubComponent in TComponent(ObjValue).ComponentStyle) then\r\n exit;\r\n end;\r\n\r\n { Check if the ancestor can be used }\r\n HasAncestor := Assigned(Ancestor) and ((Instance = Root) or\r\n (Instance.ClassType = Ancestor.ClassType));\r\n //writeln('TWriter.WriteProperty Name=',PropType^.Name,' Kind=',GetEnumName(TypeInfo(TTypeKind),ord(PropType^.Kind)),' HasAncestor=',HasAncestor);\r\n\r\n case PropType.Kind of\r\n tkInteger, tkChar, tkEnumeration, tkSet:\r\n begin\r\n Value := GetOrdProp(Instance, PropInfo);\r\n if HasAncestor then\r\n DefValue := GetOrdProp(Ancestor, PropInfo)\r\n else\r\n begin\r\n if PropType.Kind<>tkSet then\r\n DefValue := Longint(PropInfo.Default)\r\n else\r\n begin\r\n o:=TJSObject(PropInfo.Default);\r\n DefValue:=0;\r\n for Key in o do\r\n begin\r\n n:=parseInt(Key,10);\r\n if n<32 then\r\n DefValue:=DefValue+(1 shl n);\r\n end;\r\n end;\r\n end;\r\n // writeln(PPropInfo(PropInfo)^.Name, ', HasAncestor=', ord(HasAncestor), ', Value=', Value, ', Default=', DefValue);\r\n if (Value <> DefValue) or (DefValue=longint($80000000)) then\r\n begin\r\n Driver.BeginProperty(FPropPath + PropInfo.Name);\r\n case PropType.Kind of\r\n tkInteger:\r\n begin\r\n // Check if this integer has a string identifier\r\n IntToIdentFn := FindIntToIdent(PropInfo.TypeInfo);\r\n if Assigned(IntToIdentFn) and IntToIdentFn(Value, Ident) then\r\n // Integer can be written a human-readable identifier\r\n WriteIdent(Ident)\r\n else\r\n // Integer has to be written just as number\r\n WriteInteger(Value);\r\n end;\r\n tkChar:\r\n WriteChar(Chr(Value));\r\n tkSet:\r\n begin\r\n Driver.WriteSet(Value, TTypeInfoSet(PropType).CompType);\r\n end;\r\n tkEnumeration:\r\n WriteIdent(GetEnumName(TTypeInfoEnum(PropType), Value));\r\n end;\r\n Driver.EndProperty;\r\n end;\r\n end;\r\n{$ifndef FPUNONE}\r\n tkFloat:\r\n begin\r\n FloatValue := GetFloatProp(Instance, PropInfo);\r\n if HasAncestor then\r\n DefFloatValue := GetFloatProp(Ancestor, PropInfo)\r\n else\r\n begin\r\n // This is really ugly..\r\n DefFloatValue:=Double(PropInfo.Default);\r\n end;\r\n if (FloatValue<>DefFloatValue) or (not HasAncestor and (int(DefFloatValue)=longint($80000000))) then\r\n begin\r\n Driver.BeginProperty(FPropPath + PropInfo.Name);\r\n WriteFloat(FloatValue);\r\n Driver.EndProperty;\r\n end;\r\n end;\r\n{$endif}\r\n tkMethod:\r\n begin\r\n MethodValue := GetMethodProp(Instance, PropInfo);\r\n if HasAncestor then\r\n DefMethodValue := GetMethodProp(Ancestor, PropInfo)\r\n else begin\r\n DefMethodValue.Data := nil;\r\n DefMethodValue.Code := nil;\r\n end;\r\n\r\n Handled:=false;\r\n if Assigned(OnWriteMethodProperty) then\r\n OnWriteMethodProperty(Self,Instance,PropInfo,MethodValue,\r\n DefMethodValue,Handled);\r\n if isString(MethodValue.Code) then\r\n lMethodName:=String(MethodValue.Code)\r\n else\r\n lMethodName:=FLookupRoot.MethodName(MethodValue.Code);\r\n //Writeln('Writeln A: ',lMethodName);\r\n if (not Handled) and\r\n (MethodValue.Code <> DefMethodValue.Code) and\r\n ((not Assigned(MethodValue.Code)) or\r\n ((Length(lMethodName) > 0))) then\r\n begin\r\n //Writeln('Writeln B',FPropPath + PropInfo.Name);\r\n Driver.BeginProperty(FPropPath + PropInfo.Name);\r\n if Assigned(MethodValue.Code) then\r\n Driver.WriteMethodName(lMethodName)\r\n else\r\n Driver.WriteMethodName('');\r\n Driver.EndProperty;\r\n end;\r\n end;\r\n tkString: // tkSString, tkLString, tkAString are not supported\r\n begin\r\n StrValue := GetStrProp(Instance, PropInfo);\r\n if HasAncestor then\r\n DefStrValue := GetStrProp(Ancestor, PropInfo)\r\n else\r\n begin\r\n DefValue :=Longint(PropInfo.Default);\r\n SetLength(DefStrValue, 0);\r\n end;\r\n\r\n if (StrValue<>DefStrValue) or (not HasAncestor and (DefValue=longint($80000000))) then\r\n begin\r\n Driver.BeginProperty(FPropPath + PropInfo.Name);\r\n if Assigned(FOnWriteStringProperty) then\r\n FOnWriteStringProperty(Self,Instance,PropInfo,StrValue);\r\n WriteString(StrValue);\r\n Driver.EndProperty;\r\n end;\r\n end;\r\n tkJSValue:\r\n begin\r\n { Ensure that a Variant manager is installed }\r\n VarValue := GetJSValueProp(Instance, PropInfo);\r\n if HasAncestor then\r\n DefVarValue := GetJSValueProp(Ancestor, PropInfo)\r\n else\r\n DefVarValue:=null;\r\n\r\n if (VarValue<>DefVarValue) then\r\n begin\r\n Driver.BeginProperty(FPropPath + PropInfo.Name);\r\n { can't use variant() typecast, pulls in variants unit }\r\n WriteVariant(VarValue);\r\n Driver.EndProperty;\r\n end;\r\n end;\r\n tkClass:\r\n begin\r\n ObjValue := TObject(GetObjectProp(Instance, PropInfo));\r\n if HasAncestor then\r\n begin\r\n AncestorObj := TObject(GetObjectProp(Ancestor, PropInfo));\r\n if (AncestorObj is TComponent) and\r\n (ObjValue is TComponent) then\r\n begin\r\n //writeln('TWriter.WriteProperty AncestorObj=',TComponent(AncestorObj).Name,' OwnerFit=',TComponent(AncestorObj).Owner = FRootAncestor,' ',TComponent(ObjValue).Name,' OwnerFit=',TComponent(ObjValue).Owner = Root);\r\n if (AncestorObj<> ObjValue) and\r\n (TComponent(AncestorObj).Owner = FRootAncestor) and\r\n (TComponent(ObjValue).Owner = Root) and\r\n (UpperCase(TComponent(AncestorObj).Name) = UpperCase(TComponent(ObjValue).Name)) then\r\n begin\r\n // different components, but with the same name\r\n // treat it like an override\r\n AncestorObj := ObjValue;\r\n end;\r\n end;\r\n end else\r\n AncestorObj := nil;\r\n\r\n if not Assigned(ObjValue) then\r\n begin\r\n if ObjValue <> AncestorObj then\r\n begin\r\n Driver.BeginProperty(FPropPath + PropInfo.Name);\r\n Driver.WriteIdent('NIL');\r\n Driver.EndProperty;\r\n end\r\n end\r\n else if ObjValue.InheritsFrom(TPersistent) then\r\n begin\r\n { Subcomponents are streamed the same way as persistents }\r\n if ObjValue.InheritsFrom(TComponent)\r\n and ((not (csSubComponent in TComponent(ObjValue).ComponentStyle))\r\n or ((TComponent(ObjValue).Owner<>Instance) and (TComponent(ObjValue).Owner<>Nil))) then\r\n begin\r\n Component := TComponent(ObjValue);\r\n if (ObjValue <> AncestorObj)\r\n and not (csTransient in Component.ComponentStyle) then\r\n begin\r\n Name:= '';\r\n C:= Component;\r\n While (C<>Nil) and (C.Name<>'') do\r\n begin\r\n If (Name<>'') Then\r\n Name:='.'+Name;\r\n if C.Owner = LookupRoot then\r\n begin\r\n Name := C.Name+Name;\r\n break;\r\n end\r\n else if C = LookupRoot then\r\n begin\r\n Name := 'Owner' + Name;\r\n break;\r\n end;\r\n Name:=C.Name + Name;\r\n C:= C.Owner;\r\n end;\r\n if (C=nil) and (Component.Owner=nil) then\r\n if (Name<>'') then //foreign root\r\n Name:=Name+'.Owner';\r\n if Length(Name) > 0 then\r\n begin\r\n Driver.BeginProperty(FPropPath + PropInfo.Name);\r\n WriteIdent(Name);\r\n Driver.EndProperty;\r\n end; // length Name>0\r\n end; //(ObjValue <> AncestorObj)\r\n end // ObjValue.InheritsFrom(TComponent)\r\n else\r\n begin\r\n SavedAncestor := Ancestor;\r\n SavedPropPath := FPropPath;\r\n try\r\n FPropPath := FPropPath + PropInfo.Name + '.';\r\n if HasAncestor then\r\n Ancestor := TPersistent(GetObjectProp(Ancestor, PropInfo));\r\n WriteProperties(TPersistent(ObjValue));\r\n finally\r\n Ancestor := SavedAncestor;\r\n FPropPath := SavedPropPath;\r\n end;\r\n if ObjValue.InheritsFrom(TCollection) then\r\n begin\r\n if (not HasAncestor) or (not CollectionsEqual(TCollection(ObjValue),\r\n TCollection(GetObjectProp(Ancestor, PropInfo)),root,rootancestor)) then\r\n begin\r\n Driver.BeginProperty(FPropPath + PropInfo.Name);\r\n SavedPropPath := FPropPath;\r\n try\r\n SetLength(FPropPath, 0);\r\n WriteCollection(TCollection(ObjValue));\r\n finally\r\n FPropPath := SavedPropPath;\r\n Driver.EndProperty;\r\n end;\r\n end;\r\n end // Tcollection\r\n end;\r\n end; // Inheritsfrom(TPersistent)\r\n end;\r\n{ tkInt64, tkQWord:\r\n begin\r\n Int64Value := GetInt64Prop(Instance, PropInfo);\r\n if HasAncestor then\r\n DefInt64Value := GetInt64Prop(Ancestor, PropInfo)\r\n else\r\n DefInt64Value := 0;\r\n if Int64Value <> DefInt64Value then\r\n begin\r\n Driver.BeginProperty(FPropPath + PPropInfo(PropInfo)^.Name);\r\n WriteInteger(Int64Value);\r\n Driver.EndProperty;\r\n end;\r\n end;}\r\n tkBool:\r\n begin\r\n BoolValue := GetOrdProp(Instance, PropInfo)<>0;\r\n if HasAncestor then\r\n DefBoolValue := GetOrdProp(Ancestor, PropInfo)<>0\r\n else\r\n begin\r\n DefBoolValue := PropInfo.Default<>0;\r\n DefValue:=Longint(PropInfo.Default);\r\n end;\r\n // writeln(PropInfo.Name, ', HasAncestor=', ord(HasAncestor), ', Value=', Value, ', Default=', DefBoolValue);\r\n if (BoolValue<>DefBoolValue) or (DefValue=longint($80000000)) then\r\n begin\r\n Driver.BeginProperty(FPropPath + PropInfo.Name);\r\n WriteBoolean(BoolValue);\r\n Driver.EndProperty;\r\n end;\r\n end;\r\n tkInterface:\r\n begin\r\n{ IntfValue := GetInterfaceProp(Instance, PropInfo);\r\n if Assigned(IntfValue) and Supports(IntfValue, IInterfaceComponentReference, CompRef) then\r\n begin\r\n Component := CompRef.GetComponent;\r\n if HasAncestor then\r\n begin\r\n AncestorObj := TObject(GetObjectProp(Ancestor, PropInfo));\r\n if (AncestorObj is TComponent) then\r\n begin\r\n //writeln('TWriter.WriteProperty AncestorObj=',TComponent(AncestorObj).Name,' OwnerFit=',TComponent(AncestorObj).Owner = FRootAncestor,' ',TComponent(ObjValue).Name,' OwnerFit=',TComponent(ObjValue).Owner = Root);\r\n if (AncestorObj<> Component) and\r\n (TComponent(AncestorObj).Owner = FRootAncestor) and\r\n (Component.Owner = Root) and\r\n (UpperCase(TComponent(AncestorObj).Name) = UpperCase(Component.Name)) then\r\n begin\r\n // different components, but with the same name\r\n // treat it like an override\r\n AncestorObj := Component;\r\n end;\r\n end;\r\n end else\r\n AncestorObj := nil;\r\n\r\n if not Assigned(Component) then\r\n begin\r\n if Component <> AncestorObj then\r\n begin\r\n Driver.BeginProperty(FPropPath + PropInfo.Name);\r\n Driver.WriteIdent('NIL');\r\n Driver.EndProperty;\r\n end\r\n end\r\n else if ((not (csSubComponent in Component.ComponentStyle))\r\n or ((Component.Owner<>Instance) and (Component.Owner<>Nil))) then\r\n begin\r\n if (Component <> AncestorObj)\r\n and not (csTransient in Component.ComponentStyle) then\r\n begin\r\n Name:= '';\r\n C:= Component;\r\n While (C<>Nil) and (C.Name<>'') do\r\n begin\r\n If (Name<>'') Then\r\n Name:='.'+Name;\r\n if C.Owner = LookupRoot then\r\n begin\r\n Name := C.Name+Name;\r\n break;\r\n end\r\n else if C = LookupRoot then\r\n begin\r\n Name := 'Owner' + Name;\r\n break;\r\n end;\r\n Name:=C.Name + Name;\r\n C:= C.Owner;\r\n end;\r\n if (C=nil) and (Component.Owner=nil) then\r\n if (Name<>'') then //foreign root\r\n Name:=Name+'.Owner';\r\n if Length(Name) > 0 then\r\n begin\r\n Driver.BeginProperty(FPropPath + PropInfo.Name);\r\n WriteIdent(Name);\r\n Driver.EndProperty;\r\n end; // length Name>0\r\n end; //(Component <> AncestorObj)\r\n end;\r\n end; //Assigned(IntfValue) and Supports(IntfValue,..\r\n //else write NIL ?\r\n} end;\r\n end;\r\nend;\r\n\r\nprocedure TWriter.WriteRootComponent(ARoot: TComponent);\r\nbegin\r\n WriteDescendent(ARoot, nil);\r\nend;\r\n\r\nprocedure TWriter.WriteString(const Value: String);\r\nbegin\r\n Driver.WriteString(Value);\r\nend;\r\n\r\nprocedure TWriter.WriteWideString(const Value: WideString);\r\nbegin\r\n Driver.WriteWideString(Value);\r\nend;\r\n\r\nprocedure TWriter.WriteUnicodeString(const Value: UnicodeString);\r\nbegin\r\n Driver.WriteUnicodeString(Value);\r\nend;\r\n\r\n{ TAbstractObjectWriter }\r\n\r\n\r\n{ ---------------------------------------------------------------------\r\n Global routines\r\n ---------------------------------------------------------------------}\r\n\r\nvar\r\n ClassList : TJSObject;\r\n InitHandlerList : TList;\r\n FindGlobalComponentList : TFPList;\r\n\r\nProcedure RegisterClass(AClass : TPersistentClass);\r\n\r\nbegin\r\n ClassList[AClass.ClassName]:=AClass;\r\nend;\r\n\r\nProcedure RegisterClasses(AClasses : specialize TArray);\r\nvar\r\n AClass : TPersistentClass;\r\n\r\nbegin\r\n for AClass in AClasses do\r\n RegisterClass(AClass);\r\nend;\r\n\r\nFunction GetClass(AClassName : string) : TPersistentClass;\r\n\r\nbegin\r\n Result:=nil;\r\n if AClassName='' then exit;\r\n if not ClassList.hasOwnProperty(AClassName) then exit;\r\n Result:=TPersistentClass(ClassList[AClassName]);\r\nend;\r\n\r\n\r\nprocedure RegisterFindGlobalComponentProc(AFindGlobalComponent: TFindGlobalComponent);\r\n begin\r\n if not(assigned(FindGlobalComponentList)) then\r\n FindGlobalComponentList:=TFPList.Create;\r\n if FindGlobalComponentList.IndexOf(CodePointer(AFindGlobalComponent))<0 then\r\n FindGlobalComponentList.Add(CodePointer(AFindGlobalComponent));\r\n end;\r\n\r\n\r\nprocedure UnregisterFindGlobalComponentProc(AFindGlobalComponent: TFindGlobalComponent);\r\n begin\r\n if assigned(FindGlobalComponentList) then\r\n FindGlobalComponentList.Remove(CodePointer(AFindGlobalComponent));\r\n end;\r\n\r\n\r\nfunction FindGlobalComponent(const Name: string): TComponent;\r\n\r\nvar\r\n i : sizeint;\r\nbegin\r\n Result:=nil;\r\n if assigned(FindGlobalComponentList) then\r\n begin\r\n for i:=FindGlobalComponentList.Count-1 downto 0 do\r\n \tbegin\r\n \t FindGlobalComponent:=TFindGlobalComponent(FindGlobalComponentList[i])(name);\r\n \t if assigned(Result) then\r\n \t break;\r\n \tend;\r\n end;\r\nend;\r\n\r\nFunction FindNestedComponent(Root : TComponent; APath : String; CStyle : Boolean = True) : TComponent;\r\n\r\n Function GetNextName : String; {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}\r\n\r\n Var\r\n P : Integer;\r\n CM : Boolean;\r\n\r\n begin\r\n P:=Pos('.',APath);\r\n CM:=False;\r\n If (P=0) then\r\n begin\r\n If CStyle then\r\n begin\r\n P:=Pos('->',APath);\r\n CM:=P<>0;\r\n end;\r\n If (P=0) Then\r\n P:=Length(APath)+1;\r\n end;\r\n Result:=Copy(APath,1,P-1);\r\n Delete(APath,1,P+Ord(CM));\r\n end;\r\n\r\nVar\r\n C : TComponent;\r\n S : String;\r\nbegin\r\n If (APath='') then\r\n Result:=Nil\r\n else\r\n begin\r\n Result:=Root;\r\n While (APath<>'') And (Result<>Nil) do\r\n begin\r\n C:=Result;\r\n S:=Uppercase(GetNextName);\r\n Result:=C.FindComponent(S);\r\n If (Result=Nil) And (S='OWNER') then\r\n Result:=C;\r\n end;\r\n end;\r\nend;\r\n\r\nType\r\n TInitHandler = Class(TObject)\r\n AHandler : TInitComponentHandler;\r\n AClass : TComponentClass;\r\n end;\r\n\r\n\r\nprocedure RegisterInitComponentHandler(ComponentClass: TComponentClass; Handler: TInitComponentHandler);\r\n\r\nVar\r\n I : Integer;\r\n H: TInitHandler;\r\nbegin\r\n If (InitHandlerList=Nil) then\r\n InitHandlerList:=TList.Create;\r\n H:=TInitHandler.Create;\r\n H.Aclass:=ComponentClass;\r\n H.AHandler:=Handler;\r\n try\r\n With InitHandlerList do\r\n begin\r\n I:=0;\r\n While (I= 32) and ((Ord(w) < 127) or (UseBytes and (Ord(w)<256))) then\r\n begin //printable ascii or bytes\r\n if not InString then\r\n NewInString := True;\r\n NewStr := char(w);\r\n end\r\n else\r\n begin //ascii control chars, non ascii\r\n if InString then\r\n NewInString := False;\r\n NewStr := '#' + IntToStr(w);\r\n end;\r\n if NewInString <> InString then\r\n begin\r\n NewStr := '''' + NewStr;\r\n InString := NewInString;\r\n end;\r\n res := res + NewStr;\r\n end;\r\n if InString then\r\n res := res + '''';\r\n end;\r\n OutStr(res);\r\nend;\r\n*)\r\n\r\nprocedure TObjectStreamConverter.OutString(s: String);\r\nbegin\r\n OutStr(S);\r\nend;\r\n\r\n(*\r\nprocedure TObjectStreamConverter.OutUtf8Str(s: String);\r\nbegin\r\n if Encoding=oteLFM then\r\n OutChars(Pointer(S),PChar(S)+Length(S),@CharToOrd)\r\n else\r\n OutChars(Pointer(S),PChar(S)+Length(S),@Utf8ToOrd);\r\nend;\r\n*)\r\n\r\nfunction TObjectStreamConverter.ReadWord : word; {$ifdef CLASSESINLINE}inline;{$endif CLASSESINLINE}\r\nbegin\r\n Input.ReadBufferData(Result);\r\nend;\r\n\r\nfunction TObjectStreamConverter.ReadDWord : longword; {$ifdef CLASSESINLINE}inline;{$endif CLASSESINLINE}\r\nbegin\r\n Input.ReadBufferData(Result);\r\nend;\r\n\r\nfunction TObjectStreamConverter.ReadNativeInt : NativeInt; {$ifdef CLASSESINLINE}inline;{$endif CLASSESINLINE}\r\nbegin\r\n Input.ReadBufferData(Result);\r\nend;\r\n\r\nfunction TObjectStreamConverter.ReadInt(ValueType: TValueType): NativeInt;\r\nbegin\r\n case ValueType of\r\n vaInt8: Result := ShortInt(Input.ReadByte);\r\n vaInt16: Result := SmallInt(ReadWord);\r\n vaInt32: Result := LongInt(ReadDWord);\r\n vaNativeInt: Result := ReadNativeInt;\r\n end;\r\nend;\r\n\r\nfunction TObjectStreamConverter.ReadInt: NativeInt;\r\nbegin\r\n Result := ReadInt(TValueType(Input.ReadByte));\r\nend;\r\n\r\n\r\nfunction TObjectStreamConverter.ReadDouble : Double;\r\n\r\nbegin\r\n Input.ReadBufferData(Result);\r\nend;\r\n\r\nfunction TObjectStreamConverter.ReadStr: String;\r\n\r\nvar\r\n l,i: Byte;\r\n c : Char;\r\n\r\nbegin\r\n Input.ReadBufferData(L);\r\n SetLength(Result,L);\r\n For I:=1 to L do\r\n begin\r\n Input.ReadBufferData(C);\r\n Result[i]:=C;\r\n end;\r\nend;\r\n\r\nfunction TObjectStreamConverter.ReadString(StringType: TValueType): String;\r\n\r\nvar\r\n i: Integer;\r\n C : Char;\r\n\r\nbegin\r\n Result:='';\r\n if StringType<>vaString then\r\n Raise EFilerError.Create('Invalid string type passed to ReadString');\r\n i:=ReadDWord;\r\n SetLength(Result, i);\r\n for I:=1 to Length(Result) do\r\n begin\r\n Input.ReadbufferData(C);\r\n Result[i]:=C;\r\n end;\r\nend;\r\n\r\nprocedure TObjectStreamConverter.ProcessBinary;\r\n\r\nvar\r\n ToDo, DoNow, i: LongInt;\r\n lbuf: TBytes;\r\n s: String;\r\n\r\nbegin\r\n ToDo := ReadDWord;\r\n SetLength(lBuf,32);\r\n OutLn('{');\r\n while ToDo > 0 do\r\n begin\r\n DoNow := ToDo;\r\n if DoNow > 32 then\r\n DoNow := 32;\r\n Dec(ToDo, DoNow);\r\n s := Indent + ' ';\r\n Input.ReadBuffer(lbuf, DoNow);\r\n for i := 0 to DoNow - 1 do\r\n s := s + IntToHex(lbuf[i], 2);\r\n OutLn(s);\r\n end;\r\n OutLn(indent + '}');\r\nend;\r\n\r\nprocedure TObjectStreamConverter.ProcessValue(ValueType: TValueType; Indent: String);\r\n\r\n\r\nvar\r\n s: String;\r\n{ len: LongInt; }\r\n IsFirst: Boolean;\r\n{$ifndef FPUNONE}\r\n ext: Extended;\r\n{$endif}\r\n\r\nbegin\r\n case ValueType of\r\n vaList: begin\r\n OutStr('(');\r\n IsFirst := True;\r\n while True do begin\r\n ValueType := TValueType(Input.ReadByte);\r\n if ValueType = vaNull then break;\r\n if IsFirst then begin\r\n OutLn('');\r\n IsFirst := False;\r\n end;\r\n OutStr(Indent + ' ');\r\n ProcessValue(ValueType, Indent + ' ');\r\n end;\r\n OutLn(Indent + ')');\r\n end;\r\n vaInt8: OutLn(IntToStr(ShortInt(Input.ReadByte)));\r\n vaInt16: OutLn( IntToStr(SmallInt(ReadWord)));\r\n vaInt32: OutLn(IntToStr(LongInt(ReadDWord)));\r\n vaNativeInt: OutLn(IntToStr(ReadNativeInt));\r\n vaDouble: begin\r\n ext:=ReadDouble;\r\n Str(ext,S);// Do not use localized strings.\r\n OutLn(S);\r\n end;\r\n vaString: begin\r\n OutString(''''+StringReplace(ReadString(vaString),'''','''''',[rfReplaceAll])+'''');\r\n OutLn('');\r\n end;\r\n vaIdent: OutLn(ReadStr);\r\n vaFalse: OutLn('False');\r\n vaTrue: OutLn('True');\r\n vaBinary: ProcessBinary;\r\n vaSet: begin\r\n OutStr('[');\r\n IsFirst := True;\r\n while True do begin\r\n s := ReadStr;\r\n if Length(s) = 0 then break;\r\n if not IsFirst then OutStr(', ');\r\n IsFirst := False;\r\n OutStr(s);\r\n end;\r\n OutLn(']');\r\n end;\r\n vaNil:\r\n OutLn('nil');\r\n vaCollection: begin\r\n OutStr('<');\r\n while Input.ReadByte <> 0 do begin\r\n OutLn(Indent);\r\n Input.Seek(-1, soCurrent);\r\n OutStr(indent + ' item');\r\n ValueType := TValueType(Input.ReadByte);\r\n if ValueType <> vaList then\r\n OutStr('[' + IntToStr(ReadInt(ValueType)) + ']');\r\n OutLn('');\r\n ReadPropList(indent + ' ');\r\n OutStr(indent + ' end');\r\n end;\r\n OutLn('>');\r\n end;\r\n {vaSingle: begin OutLn('!!Single!!'); exit end;\r\n vaCurrency: begin OutLn('!!Currency!!'); exit end;\r\n vaDate: begin OutLn('!!Date!!'); exit end;}\r\n else\r\n Raise EReadError.CreateFmt(SErrInvalidPropertyType,[Ord(ValueType)]);\r\n end;\r\nend;\r\n\r\n\r\nprocedure TObjectStreamConverter.ReadPropList(indent: String);\r\n\r\n\r\nbegin\r\n while Input.ReadByte <> 0 do begin\r\n Input.Seek(-1, soCurrent);\r\n OutStr(indent + ReadStr + ' = ');\r\n ProcessValue(TValueType(Input.ReadByte), Indent);\r\n end;\r\nend;\r\n\r\nprocedure TObjectStreamConverter.ReadObject(indent: String);\r\n\r\nvar\r\n b: Byte;\r\n ObjClassName, ObjName: String;\r\n ChildPos: LongInt;\r\n\r\nbegin\r\n // Check for FilerFlags\r\n b := Input.ReadByte;\r\n if (b and $f0) = $f0 then begin\r\n if (b and 2) <> 0 then ChildPos := ReadInt;\r\n end else begin\r\n b := 0;\r\n Input.Seek(-1, soCurrent);\r\n end;\r\n\r\n ObjClassName := ReadStr;\r\n ObjName := ReadStr;\r\n\r\n OutStr(Indent);\r\n if (b and 1) <> 0 then OutStr('inherited')\r\n else\r\n if (b and 4) <> 0 then OutStr('inline')\r\n else OutStr('object');\r\n OutStr(' ');\r\n if ObjName <> '' then\r\n OutStr(ObjName + ': ');\r\n OutStr(ObjClassName);\r\n if (b and 2) <> 0 then OutStr('[' + IntToStr(ChildPos) + ']');\r\n OutLn('');\r\n\r\n ReadPropList(indent + ' ');\r\n\r\n while Input.ReadByte <> 0 do begin\r\n Input.Seek(-1, soCurrent);\r\n ReadObject(indent + ' ');\r\n end;\r\n OutLn(indent + 'end');\r\nend;\r\n\r\nprocedure TObjectStreamConverter.ObjectBinaryToText(aInput, aOutput: TStream; aEncoding: TObjectTextEncoding);\r\n\r\nbegin\r\n FInput:=aInput;\r\n FOutput:=aOutput;\r\n FEncoding:=aEncoding;\r\n Execute;\r\nend;\r\n\r\nprocedure TObjectStreamConverter.Execute;\r\n\r\nvar\r\n Signature: LongInt;\r\n\r\nbegin\r\n if FIndent = '' then FInDent:=' ';\r\n If Not Assigned(Input) then\r\n raise EReadError.Create('Missing input stream');\r\n If Not Assigned(Output) then\r\n raise EReadError.Create('Missing output stream');\r\n FInput.ReadBufferData(Signature);\r\n if Signature <> FilerSignatureInt then\r\n raise EReadError.Create(SInvalidImage);\r\n ReadObject('');\r\nend;\r\n\r\nprocedure TObjectStreamConverter.ObjectBinaryToText(aInput, aOutput: TStream);\r\nbegin\r\n ObjectBinaryToText(aInput,aOutput,oteDFM);\r\nend;\r\n\r\n{\r\n This file is part of the Free Component Library (FCL)\r\n Copyright (c) 1999-2007 by the Free Pascal development team\r\n\r\n See the file COPYING.FPC, included in this distribution,\r\n for details about the copyright.\r\n\r\n This program is distributed in the hope that it will be useful,\r\n but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r\n\r\n **********************************************************************}\r\n\r\n{****************************************************************************}\r\n{* TParser *}\r\n{****************************************************************************}\r\n\r\nconst\r\n{$ifdef CPU16}\r\n { Avoid too big local stack use for\r\n MSDOS tiny memory model that uses less than 4096\r\n bytes for total stack by default. }\r\n ParseBufSize = 512;\r\n{$else not CPU16}\r\n ParseBufSize = 4096;\r\n{$endif not CPU16}\r\n\r\n TokNames : array[TParserToken] of string = (\r\n '?',\r\n 'EOF',\r\n 'Symbol',\r\n 'String',\r\n 'Integer',\r\n 'Float',\r\n '-',\r\n '[',\r\n '(',\r\n '<',\r\n '{',\r\n ']',\r\n ')',\r\n '>',\r\n '}',\r\n ',',\r\n '.',\r\n '=',\r\n ':',\r\n '+'\r\n );\r\n\r\nfunction TParser.GetTokenName(aTok: TParserToken): string;\r\nbegin\r\n Result:=TokNames[aTok]\r\nend;\r\n\r\nprocedure TParser.LoadBuffer;\r\n\r\nvar\r\n CharsRead,i: integer;\r\n\r\nbegin\r\n CharsRead:=0;\r\n for I:=0 to ParseBufSize-1 do\r\n begin\r\n if FStream.ReadData(FBuf[i])<>2 then\r\n Break;\r\n Inc(CharsRead);\r\n end;\r\n Inc(FDeltaPos, CharsRead);\r\n FPos := 0;\r\n FBufLen := CharsRead;\r\n FEofReached:=CharsRead = 0;\r\n FBuf[CharsRead] := #0;\r\nend;\r\n\r\nprocedure TParser.CheckLoadBuffer; {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}\r\nbegin\r\n if fPos>=FBufLen then\r\n LoadBuffer;\r\nend;\r\n\r\nprocedure TParser.ProcessChar; {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}\r\nbegin\r\n fLastTokenStr:=fLastTokenStr+fBuf[fPos];\r\n\r\n GotoToNextChar;\r\nend;\r\n\r\nfunction TParser.IsNumber: boolean; {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}\r\nbegin\r\n Result:=fBuf[fPos] in ['0'..'9'];\r\nend;\r\n\r\nfunction TParser.IsHexNum: boolean; {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}\r\nbegin\r\n Result:=fBuf[fPos] in ['0'..'9','A'..'F','a'..'f'];\r\nend;\r\n\r\nfunction TParser.IsAlpha: boolean; {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}\r\nbegin\r\n Result:=fBuf[fPos] in ['_','A'..'Z','a'..'z'];\r\nend;\r\n\r\nfunction TParser.IsAlphaNum: boolean; {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}\r\nbegin\r\n Result:=IsAlpha or IsNumber;\r\nend;\r\n\r\nfunction TParser.GetHexValue(c: char): byte; {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}\r\nbegin\r\n case c of\r\n '0'..'9' : Result:=ord(c)-$30;\r\n 'A'..'F' : Result:=ord(c)-$37; //-$41+$0A\r\n 'a'..'f' : Result:=ord(c)-$57; //-$61+$0A\r\n end;\r\nend;\r\n\r\nfunction TParser.GetAlphaNum: string;\r\nbegin\r\n if not IsAlpha then\r\n ErrorFmt(SParserExpected,[GetTokenName(toSymbol)]);\r\n Result:='';\r\n while IsAlphaNum do\r\n begin\r\n Result:=Result+fBuf[fPos];\r\n\r\n GotoToNextChar;\r\n end;\r\nend;\r\n\r\nprocedure TParser.HandleNewLine;\r\nbegin\r\n if fBuf[fPos]=#13 then //CR\r\n GotoToNextChar;\r\n\r\n if fBuf[fPos]=#10 then //LF\r\n GotoToNextChar;\r\n\r\n inc(fSourceLine);\r\n fDeltaPos:=-(fPos-1);\r\nend;\r\n\r\nprocedure TParser.SkipBOM;\r\n\r\nbegin\r\n // No BOM support\r\nend;\r\n\r\nprocedure TParser.SkipSpaces;\r\nbegin\r\n while not FEofReached and (fBuf[fPos] in [' ',#9]) do GotoToNextChar;\r\nend;\r\n\r\nprocedure TParser.SkipWhitespace;\r\nbegin\r\n while not FEofReached do\r\n begin\r\n case fBuf[fPos] of\r\n ' ',#9 : SkipSpaces;\r\n #10,#13 : HandleNewLine\r\n else break;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TParser.HandleEof;\r\nbegin\r\n fToken:=toEOF;\r\n fLastTokenStr:='';\r\nend;\r\n\r\nprocedure TParser.HandleAlphaNum;\r\nbegin\r\n fLastTokenStr:=GetAlphaNum;\r\n fToken:=toSymbol;\r\nend;\r\n\r\nprocedure TParser.HandleNumber;\r\ntype\r\n floatPunct = (fpDot,fpE);\r\n floatPuncts = set of floatPunct;\r\nvar\r\n allowed : floatPuncts;\r\nbegin\r\n fLastTokenStr:='';\r\n while IsNumber do\r\n ProcessChar;\r\n fToken:=toInteger;\r\n if (fBuf[fPos] in ['.','e','E']) then\r\n begin\r\n fToken:=toFloat;\r\n allowed:=[fpDot,fpE];\r\n while (fBuf[fPos] in ['.','e','E','0'..'9']) do\r\n begin\r\n case fBuf[fPos] of\r\n '.' : if fpDot in allowed then Exclude(allowed,fpDot) else break;\r\n 'E','e' : if fpE in allowed then\r\n begin\r\n allowed:=[];\r\n ProcessChar;\r\n if (fBuf[fPos] in ['+','-']) then ProcessChar;\r\n if not (fBuf[fPos] in ['0'..'9']) then\r\n ErrorFmt(SParserInvalidFloat,[fLastTokenStr+fBuf[fPos]]);\r\n end\r\n else break;\r\n end;\r\n ProcessChar;\r\n end;\r\n end;\r\n if (fBuf[fPos] in ['s','S','d','D','c','C']) then //single, date, currency\r\n begin\r\n fFloatType:=fBuf[fPos];\r\n\r\n GotoToNextChar;\r\n\r\n fToken:=toFloat;\r\n end\r\n else fFloatType:=#0;\r\nend;\r\n\r\nprocedure TParser.HandleHexNumber;\r\nvar valid : boolean;\r\nbegin\r\n fLastTokenStr:='$';\r\n GotoToNextChar;\r\n valid:=false;\r\n while IsHexNum do\r\n begin\r\n valid:=true;\r\n ProcessChar;\r\n end;\r\n if not valid then\r\n ErrorFmt(SParserInvalidInteger,[fLastTokenStr]);\r\n fToken:=toInteger;\r\nend;\r\n\r\nfunction TParser.HandleQuotedString: string;\r\nbegin\r\n Result:='';\r\n GotoToNextChar;\r\n\r\n while true do\r\n begin\r\n case fBuf[fPos] of\r\n #0 : ErrorStr(SParserUnterminatedString);\r\n #13,#10 : ErrorStr(SParserUnterminatedString);\r\n '''' : begin\r\n GotoToNextChar;\r\n if fBuf[fPos]<>'''' then exit;\r\n end;\r\n end;\r\n Result:=Result+fBuf[fPos];\r\n GotoToNextChar;\r\n end;\r\nend;\r\n\r\nFunction TParser.HandleDecimalCharacter : Char;\r\n\r\nvar\r\n i : integer;\r\n\r\nbegin\r\n GotoToNextChar;\r\n // read a word number\r\n i:=0;\r\n while IsNumber and (ihigh(word) then i:=0;\r\n Result:=Char(i);\r\nend;\r\n\r\nprocedure TParser.HandleString;\r\n\r\nvar\r\n s: string;\r\n\r\nbegin\r\n fLastTokenStr:='';\r\n while true do\r\n begin\r\n case fBuf[fPos] of\r\n '''' :\r\n begin\r\n s:=HandleQuotedString;\r\n fLastTokenStr:=fLastTokenStr+s;\r\n end;\r\n '#' :\r\n begin\r\n fLastTokenStr:=fLastTokenStr+HandleDecimalCharacter;\r\n end;\r\n else break;\r\n end;\r\n end;\r\n fToken:=Classes.toString\r\nend;\r\n\r\nprocedure TParser.HandleMinus;\r\nbegin\r\n GotoToNextChar;\r\n if IsNumber then\r\n begin\r\n HandleNumber;\r\n fLastTokenStr:='-'+fLastTokenStr;\r\n end\r\n else\r\n begin\r\n fToken:=toMinus;\r\n fLastTokenStr:='-';\r\n end;\r\nend;\r\n\r\nprocedure TParser.HandleUnknown;\r\nbegin\r\n fToken:=toUnknown;\r\n fLastTokenStr:=fBuf[fPos];\r\n GotoToNextChar;\r\nend;\r\n\r\nconstructor TParser.Create(Stream: TStream);\r\nbegin\r\n fStream:=Stream;\r\n SetLength(fBuf,ParseBufSize);\r\n fBufLen:=0;\r\n fPos:=0;\r\n fDeltaPos:=1;\r\n fSourceLine:=1;\r\n fEofReached:=false;\r\n fLastTokenStr:='';\r\n fFloatType:=#0;\r\n fToken:=toEOF;\r\n LoadBuffer;\r\n SkipBom;\r\n NextToken;\r\nend;\r\n\r\nprocedure TParser.GotoToNextChar;\r\nbegin\r\n Inc(FPos);\r\n\r\n CheckLoadBuffer;\r\nend;\r\n\r\ndestructor TParser.Destroy;\r\n\r\nVar\r\n aCount : Integer;\r\n\r\nbegin\r\n aCount:=Length(fLastTokenStr)*2;\r\n fStream.Position:=SourcePos-aCount;\r\nend;\r\n\r\nprocedure TParser.CheckToken(T: tParserToken);\r\nbegin\r\n if fToken<>T then\r\n ErrorFmt(SParserWrongTokenType,[GetTokenName(T),GetTokenName(fToken)]);\r\nend;\r\n\r\nprocedure TParser.CheckTokenSymbol(const S: string);\r\nbegin\r\n CheckToken(toSymbol);\r\n if CompareText(fLastTokenStr,S)<>0 then\r\n ErrorFmt(SParserWrongTokenSymbol,[s,fLastTokenStr]);\r\nend;\r\n\r\nprocedure TParser.Error(const Ident: string);\r\nbegin\r\n ErrorStr(Ident);\r\nend;\r\n\r\nprocedure TParser.ErrorFmt(const Ident: string; const Args: array of JSValue);\r\nbegin\r\n ErrorStr(Format(Ident,Args));\r\nend;\r\n\r\nprocedure TParser.ErrorStr(const Message: string);\r\nbegin\r\n raise EParserError.CreateFmt(Message+SParserLocInfo,[SourceLine,fPos+fDeltaPos,SourcePos]);\r\nend;\r\n\r\nprocedure TParser.HexToBinary(Stream: TStream);\r\n\r\nvar\r\n outbuf : TBytes;\r\n b : byte;\r\n i : integer;\r\n\r\nbegin\r\n SetLength(OutBuf,ParseBufSize);\r\n i:=0;\r\n SkipWhitespace;\r\n while IsHexNum do\r\n begin\r\n b:=(GetHexValue(fBuf[fPos]) shl 4);\r\n GotoToNextChar;\r\n if not IsHexNum then\r\n Error(SParserUnterminatedBinValue);\r\n b:=b or GetHexValue(fBuf[fPos]);\r\n GotoToNextChar;\r\n outbuf[i]:=b;\r\n inc(i);\r\n if i>=ParseBufSize then\r\n begin\r\n Stream.WriteBuffer(outbuf,i);\r\n i:=0;\r\n end;\r\n SkipWhitespace;\r\n end;\r\n if i>0 then\r\n Stream.WriteBuffer(outbuf,i);\r\n NextToken;\r\nend;\r\n\r\nfunction TParser.NextToken: TParserToken;\r\n\r\n Procedure SetToken(aToken : TParserToken);\r\n begin\r\n FToken:=aToken;\r\n GotoToNextChar;\r\n end;\r\n\r\nbegin\r\n SkipWhiteSpace;\r\n if fEofReached then\r\n HandleEof\r\n else\r\n case fBuf[fPos] of\r\n '_','A'..'Z','a'..'z' : HandleAlphaNum;\r\n '$' : HandleHexNumber;\r\n '-' : HandleMinus;\r\n '0'..'9' : HandleNumber;\r\n '''','#' : HandleString;\r\n '[' : SetToken(toSetStart);\r\n '(' : SetToken(toListStart);\r\n '<' : SetToken(toCollectionStart);\r\n '{' : SetToken(toBinaryStart);\r\n ']' : SetToken(toSetEnd);\r\n ')' : SetToken(toListEnd);\r\n '>' : SetToken(toCollectionEnd);\r\n '}' : SetToken(toBinaryEnd);\r\n ',' : SetToken(toComma);\r\n '.' : SetToken(toDot);\r\n '=' : SetToken(toEqual);\r\n ':' : SetToken(toColon);\r\n '+' : SetToken(toPlus);\r\n else\r\n HandleUnknown;\r\n end;\r\n Result:=fToken;\r\nend;\r\n\r\nfunction TParser.SourcePos: Longint;\r\nbegin\r\n Result:=fStream.Position-fBufLen+fPos;\r\nend;\r\n\r\nfunction TParser.TokenComponentIdent: string;\r\nbegin\r\n if fToken<>toSymbol then\r\n ErrorFmt(SParserExpected,[GetTokenName(toSymbol)]);\r\n CheckLoadBuffer;\r\n while fBuf[fPos]='.' do\r\n begin\r\n ProcessChar;\r\n fLastTokenStr:=fLastTokenStr+GetAlphaNum;\r\n end;\r\n Result:=fLastTokenStr;\r\nend;\r\n\r\nFunction TParser.TokenFloat: double;\r\n\r\nvar\r\n errcode : integer;\r\n\r\nbegin\r\n Val(fLastTokenStr,Result,errcode);\r\n if errcode<>0 then\r\n ErrorFmt(SParserInvalidFloat,[fLastTokenStr]);\r\nend;\r\n\r\nFunction TParser.TokenInt: NativeInt;\r\nbegin\r\n if not TryStrToInt64(fLastTokenStr,Result) then\r\n Result:=StrToQWord(fLastTokenStr); //second chance for malformed files\r\nend;\r\n\r\nfunction TParser.TokenString: string;\r\nbegin\r\n case fToken of\r\n toFloat : if fFloatType<>#0 then\r\n Result:=fLastTokenStr+fFloatType\r\n else Result:=fLastTokenStr;\r\n else\r\n Result:=fLastTokenStr;\r\n end;\r\nend;\r\n\r\n\r\nfunction TParser.TokenSymbolIs(const S: string): Boolean;\r\nbegin\r\n Result:=(fToken=toSymbol) and (CompareText(fLastTokenStr,S)=0);\r\nend;\r\n\r\n\r\nprocedure TObjectTextConverter.WriteWord(w : word); {$ifdef CLASSESINLINE}inline;{$endif CLASSESINLINE}\r\nbegin\r\n Output.WriteBufferData(w);\r\nend;\r\n\r\nprocedure TObjectTextConverter.WriteDWord(lw : longword); {$ifdef CLASSESINLINE}inline;{$endif CLASSESINLINE}\r\nbegin\r\n Output.WriteBufferData(lw);\r\nend;\r\n\r\nprocedure TObjectTextConverter.WriteQWord(q : NativeInt); {$ifdef CLASSESINLINE}inline;{$endif CLASSESINLINE}\r\nbegin\r\n Output.WriteBufferData(q);\r\nend;\r\n\r\nprocedure TObjectTextConverter.WriteDouble(e : double);\r\nbegin\r\n Output.WriteBufferData(e);\r\nend;\r\n\r\nprocedure TObjectTextConverter.WriteString(s: String);\r\n\r\nvar\r\n i,size : byte;\r\n\r\nbegin\r\n if length(s)>255 then\r\n size:=255\r\n else\r\n size:=length(s);\r\n Output.WriteByte(size);\r\n For I:=1 to Length(S) do\r\n Output.WriteBufferData(s[i]);\r\nend;\r\n\r\nprocedure TObjectTextConverter.WriteWString(Const s: WideString);\r\n\r\nvar\r\n i : Integer;\r\nbegin\r\n WriteDWord(Length(s));\r\n For I:=1 to Length(S) do\r\n Output.WriteBufferData(s[i]);\r\nend;\r\n\r\nprocedure TObjectTextConverter.WriteInteger(value: NativeInt);\r\n\r\nbegin\r\n if (value >= -128) and (value <= 127) then begin\r\n Output.WriteByte(Ord(vaInt8));\r\n Output.WriteByte(byte(value));\r\n end else if (value >= -32768) and (value <= 32767) then begin\r\n Output.WriteByte(Ord(vaInt16));\r\n WriteWord(word(value));\r\n end else if (value >= -2147483648) and (value <= 2147483647) then begin\r\n Output.WriteByte(Ord(vaInt32));\r\n WriteDWord(longword(value));\r\n end else begin\r\n Output.WriteByte(ord(vaInt64));\r\n WriteQWord(NativeUInt(value));\r\n end;\r\nend;\r\n\r\nprocedure TObjectTextConverter.ProcessWideString(const left : string);\r\n\r\nvar\r\n ws : string;\r\nbegin\r\n ws:=left+parser.TokenString;\r\n while parser.NextToken = toPlus do\r\n begin\r\n parser.NextToken; // Get next string fragment\r\n if not (parser.Token=Classes.toString) then\r\n parser.CheckToken(Classes.toString);\r\n ws:=ws+parser.TokenString;\r\n end;\r\n Output.WriteByte(Ord(vaWstring));\r\n WriteWString(ws);\r\nend;\r\n\r\n\r\nprocedure TObjectTextConverter.ProcessValue;\r\nvar\r\n flt: double;\r\n stream: TBytesStream;\r\nbegin\r\n case parser.Token of\r\n toInteger:\r\n begin\r\n WriteInteger(parser.TokenInt);\r\n parser.NextToken;\r\n end;\r\n toFloat:\r\n begin\r\n Output.WriteByte(Ord(vaExtended));\r\n flt := Parser.TokenFloat;\r\n WriteDouble(flt);\r\n parser.NextToken;\r\n end;\r\n classes.toString:\r\n ProcessWideString('');\r\n toSymbol:\r\n begin\r\n if CompareText(parser.TokenString, 'True') = 0 then\r\n Output.WriteByte(Ord(vaTrue))\r\n else if CompareText(parser.TokenString, 'False') = 0 then\r\n Output.WriteByte(Ord(vaFalse))\r\n else if CompareText(parser.TokenString, 'nil') = 0 then\r\n Output.WriteByte(Ord(vaNil))\r\n else\r\n begin\r\n Output.WriteByte(Ord(vaIdent));\r\n WriteString(parser.TokenComponentIdent);\r\n end;\r\n Parser.NextToken;\r\n end;\r\n // Set\r\n toSetStart:\r\n begin\r\n parser.NextToken;\r\n Output.WriteByte(Ord(vaSet));\r\n if parser.Token <> toSetEnd then\r\n while True do\r\n begin\r\n parser.CheckToken(toSymbol);\r\n WriteString(parser.TokenString);\r\n parser.NextToken;\r\n if parser.Token = toSetEnd then\r\n break;\r\n parser.CheckToken(toComma);\r\n parser.NextToken;\r\n end;\r\n Output.WriteByte(0);\r\n parser.NextToken;\r\n end;\r\n // List\r\n toListStart:\r\n begin\r\n parser.NextToken;\r\n Output.WriteByte(Ord(vaList));\r\n while parser.Token <> toListEnd do\r\n ProcessValue;\r\n Output.WriteByte(0);\r\n parser.NextToken;\r\n end;\r\n // Collection\r\n toCollectionStart:\r\n begin\r\n parser.NextToken;\r\n Output.WriteByte(Ord(vaCollection));\r\n while parser.Token <> toCollectionEnd do\r\n begin\r\n parser.CheckTokenSymbol('item');\r\n parser.NextToken;\r\n // ConvertOrder\r\n Output.WriteByte(Ord(vaList));\r\n while not parser.TokenSymbolIs('end') do\r\n ProcessProperty;\r\n parser.NextToken; // Skip 'end'\r\n Output.WriteByte(0);\r\n end;\r\n Output.WriteByte(0);\r\n parser.NextToken;\r\n end;\r\n // Binary data\r\n toBinaryStart:\r\n begin\r\n Output.WriteByte(Ord(vaBinary));\r\n stream := TBytesStream.Create;\r\n try\r\n parser.HexToBinary(stream);\r\n WriteDWord(stream.Size);\r\n Output.WriteBuffer(Stream.Bytes,Stream.Size);\r\n finally\r\n stream.Free;\r\n end;\r\n parser.NextToken;\r\n end;\r\n else\r\n parser.Error(SParserInvalidProperty);\r\n end;\r\nend;\r\n\r\nprocedure TObjectTextConverter.ProcessProperty;\r\nvar\r\n name: String;\r\nbegin\r\n // Get name of property\r\n parser.CheckToken(toSymbol);\r\n name := parser.TokenString;\r\n while True do begin\r\n parser.NextToken;\r\n if parser.Token <> toDot then break;\r\n parser.NextToken;\r\n parser.CheckToken(toSymbol);\r\n name := name + '.' + parser.TokenString;\r\n end;\r\n WriteString(name);\r\n parser.CheckToken(toEqual);\r\n parser.NextToken;\r\n ProcessValue;\r\nend;\r\n\r\nprocedure TObjectTextConverter.ProcessObject;\r\nvar\r\n Flags: Byte;\r\n ObjectName, ObjectType: String;\r\n ChildPos: Integer;\r\nbegin\r\n if parser.TokenSymbolIs('OBJECT') then\r\n Flags :=0 { IsInherited := False }\r\n else begin\r\n if parser.TokenSymbolIs('INHERITED') then\r\n Flags := 1 { IsInherited := True; }\r\n else begin\r\n parser.CheckTokenSymbol('INLINE');\r\n Flags := 4;\r\n end;\r\n end;\r\n parser.NextToken;\r\n parser.CheckToken(toSymbol);\r\n ObjectName := '';\r\n ObjectType := parser.TokenString;\r\n parser.NextToken;\r\n if parser.Token = toColon then begin\r\n parser.NextToken;\r\n parser.CheckToken(toSymbol);\r\n ObjectName := ObjectType;\r\n ObjectType := parser.TokenString;\r\n parser.NextToken;\r\n if parser.Token = toSetStart then begin\r\n parser.NextToken;\r\n ChildPos := parser.TokenInt;\r\n parser.NextToken;\r\n parser.CheckToken(toSetEnd);\r\n parser.NextToken;\r\n Flags := Flags or 2;\r\n end;\r\n end;\r\n if Flags <> 0 then begin\r\n Output.WriteByte($f0 or Flags);\r\n if (Flags and 2) <> 0 then\r\n WriteInteger(ChildPos);\r\n end;\r\n WriteString(ObjectType);\r\n WriteString(ObjectName);\r\n\r\n // Convert property list\r\n while not (parser.TokenSymbolIs('END') or\r\n parser.TokenSymbolIs('OBJECT') or\r\n parser.TokenSymbolIs('INHERITED') or\r\n parser.TokenSymbolIs('INLINE')) do\r\n ProcessProperty;\r\n Output.WriteByte(0); // Terminate property list\r\n\r\n // Convert child objects\r\n while not parser.TokenSymbolIs('END') do ProcessObject;\r\n parser.NextToken; // Skip end token\r\n Output.WriteByte(0); // Terminate property list\r\nend;\r\n\r\nprocedure TObjectTextConverter.ObjectTextToBinary(aInput, aOutput: TStream);\r\n\r\nbegin\r\n FinPut:=aInput;\r\n FOutput:=aOutput;\r\n Execute;\r\nend;\r\n\r\nprocedure TObjectTextConverter.Execute;\r\nbegin\r\n If Not Assigned(Input) then\r\n raise EReadError.Create('Missing input stream');\r\n If Not Assigned(Output) then\r\n raise EReadError.Create('Missing output stream');\r\n FParser := TParser.Create(Input);\r\n try\r\n Output.WriteBufferData(FilerSignatureInt);\r\n ProcessObject;\r\n finally\r\n FParser.Free;\r\n end;\r\nend;\r\n\r\nprocedure ObjectTextToBinary(aInput, aOutput: TStream);\r\n\r\nvar\r\n Conv : TObjectTextConverter;\r\n\r\nbegin\r\n Conv:=TObjectTextConverter.Create;\r\n try\r\n Conv.ObjectTextToBinary(aInput, aOutput);\r\n finally\r\n Conv.free;\r\n end;\r\nend;\r\n\r\n{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ Copyright (c) 2019 - 2021 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\n{ TStringsHelper }\r\n\r\nprocedure TStringsHelper.LoadFromStream(Stream: TStream);\r\nbegin\r\n LoadFromStream(Stream, TEncoding.UTF8);\r\nend;\r\n\r\n// possible encoding formats: https://encoding.spec.whatwg.org/\r\n{$HINTS OFF}\r\nprocedure TStringsHelper.LoadFromStream(Stream: TStream; Encoding: TEncoding);\r\nvar\r\n arr: TJSArrayBuffer;\r\n s: string;\r\n buf: TBytes;\r\nbegin\r\n Stream.Read(buf, Stream.Size);\r\n arr := TMemoryStream.BytesToMemory(buf);\r\n\r\n s := 'utf-8';\r\n if Assigned(Encoding) then\r\n begin\r\n s := Encoding.GetEncoding;\r\n end;\r\n\r\n asm\r\n var enc = new TextDecoder(s);\r\n s = enc.decode(arr);\r\n end;\r\n\r\n Text := s;\r\nend;\r\n\r\nprocedure TStringsHelper.SaveToStream(Stream: TStream);\r\nbegin\r\n SaveToStream(Stream, TEncoding.UTF8);\r\nend;\r\n\r\nprocedure TStringsHelper.SaveToStream(Stream: TStream; Encoding: TEncoding);\r\nvar\r\n s,txt: string;\r\n arr: TJSArrayBuffer;\r\n b: TBytes;\r\n l: longint;\r\nbegin\r\n s := 'utf-8';\r\n if Assigned(Encoding) then\r\n begin\r\n s := Encoding.GetEncoding;\r\n end;\r\n\r\n txt := Text;\r\n\r\n asm\r\n var enc = new TextEncoder(s);\r\n arr = enc.encode(txt);\r\n end;\r\n\r\n b := TMemoryStream.MemoryToBytes(arr);\r\n l := arr.bytelength;\r\n\r\n Stream.Write(b, l);\r\n Stream.Position := 0;\r\nend;\r\n{$HINTS ON}\r\n\r\n\r\n// default encoding format\r\nfunction TEncoding.GetEncoding: string;\r\nbegin\r\n Result := 'utf-8';\r\nend;\r\n\r\nclass function TEncoding.GetANSI: TEncoding;\r\nbegin\r\n if not Assigned(FANSI) then\r\n FANSI := TANSIEncoding.Create;\r\n\r\n Result := FANSI;\r\nend;\r\n\r\nclass function TEncoding.GetASCII: TEncoding;\r\nbegin\r\n if not Assigned(FASCII) then\r\n FASCII := TASCIIEncoding.Create;\r\n\r\n Result := FASCII;\r\nend;\r\n\r\nclass function TEncoding.GetUTF7: TEncoding;\r\nbegin\r\n if not Assigned(FUTF7) then\r\n FUTF7 := TUTF7Encoding.Create;\r\n\r\n Result := FUTF7;\r\nend;\r\n\r\nclass function TEncoding.GetUTF8: TEncoding;\r\nbegin\r\n if not Assigned(FUTF8) then\r\n FUTF8 := TUTF8Encoding.Create;\r\n\r\n Result := FUTF8;\r\nend;\r\n\r\nclass function TEncoding.GetUnicode: TEncoding;\r\nbegin\r\n if not Assigned(FUnicode) then\r\n FUnicode := TUnicodeEncoding.Create;\r\n\r\n Result := FUnicode;\r\nend;\r\n\r\nfunction TUnicodeEncoding.GetEncoding: string;\r\nbegin\r\n Result := 'unicode';\r\nend;\r\n\r\nfunction TUTF7Encoding.GetEncoding: string;\r\nbegin\r\n Result := 'utf-7';\r\nend;\r\n\r\nfunction TUTF8Encoding.GetEncoding: string;\r\nbegin\r\n Result := 'utf-8';\r\nend;\r\n\r\nfunction TANSIEncoding.GetEncoding: string;\r\nbegin\r\n Result := 'windows-1252';\r\nend;\r\n\r\nfunction TASCIIEncoding.GetEncoding: string;\r\nbegin\r\n Result := 'ISO-8859-2';\r\nend;\r\n\r\n{ ComponentPlatforms }\r\n\r\nconstructor ComponentPlatformsAttribute.Create(const Platforms: TPlatformIds);\r\nbegin\r\n FPlatforms := Platforms;\r\nend;\r\n\r\n\r\n\r\ninitialization\r\n ClassList:=TJSObject.New;\r\nend.\r\n\r\n","{\r\n This file is part of the Pas2JS run time library.\r\n Copyright (c) 2017 by Mattias Gaertner\r\n\r\n See the file COPYING.FPC, included in this distribution,\r\n for details about the copyright.\r\n\r\n This program is distributed in the hope that it will be useful,\r\n but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r\n\r\n **********************************************************************}\r\nunit Math;\r\n\r\n{$mode objfpc}\r\n\r\ninterface\r\n\r\nconst\r\n MinInteger = -$fffffffffffff-1;\r\n MaxInteger = $fffffffffffff;\r\n MinDouble = 5.0e-324;\r\n MaxDouble = 1.7e+308;\r\n\r\nconst\r\n NaN: Double; external name 'NaN';\r\n Infinity: Double; external name 'Infinity';\r\n NegInfinity: Double; external name '-Infinity';\r\n\r\ntype\r\n float = double;\r\n\r\n //EInvalidArgument = class(EMathError);\r\n\r\nfunction Min(const a, b: Double): Double; varargs; external name 'Math.min'; overload;\r\nfunction Max(const a, b: Double): Double; varargs; external name 'Math.max'; overload;\r\nfunction Min(const a, b: NativeLargeUInt): NativeLargeUInt; varargs; external name 'Math.min'; overload;\r\nfunction Max(const a, b: NativeLargeUInt): NativeLargeUInt; varargs; external name 'Math.max'; overload;\r\nfunction Min(const a, b: NativeLargeInt): NativeLargeInt; varargs; external name 'Math.min'; overload;\r\nfunction Max(const a, b: NativeLargeInt): NativeLargeInt; varargs; external name 'Math.max'; overload;\r\nfunction Min(const a, b: Integer): Integer; varargs; external name 'Math.min'; overload;\r\nfunction Max(const a, b: Integer): Integer; varargs; external name 'Math.max'; overload;\r\n\r\nfunction InRange(const AValue, AMin, AMax: Integer): Boolean; assembler; overload;\r\nfunction InRange(const AValue, AMin, AMax: Double): Boolean; assembler; overload;\r\n\r\nfunction EnsureRange(const AValue, AMin, AMax: Integer): Integer; assembler; overload;\r\nfunction EnsureRange(const AValue, AMin, AMax: Double): Double; assembler; overload;\r\n\r\ntype\r\n TRoundToRange = -37..37;\r\n\r\nfunction RoundTo(const AValue: Double; const Digits: TRoundToRange): Double;\r\nfunction SimpleRoundTo(const AValue: Double; const Digits: TRoundToRange = -2): Double;\r\n\r\nfunction randg(mean,stddev : float) : float;\r\nfunction RandomRange(const aFrom, aTo: Integer): Integer;\r\nfunction RandomRange(const aFrom, aTo: NativeLargeInt): NativeLargeInt;\r\n\r\nconst\r\n NegativeValue = -1;\r\n ZeroValue = 0;\r\n PositiveValue = 1;\r\n\r\nfunction Sign(const AValue: Integer): Integer; external name 'Math.sign'; overload;\r\nfunction Sign(const AValue: Double): Double; external name 'Math.sign'; overload;\r\n\r\nfunction IsZero(const d: Double; Epsilon: Double): Boolean; overload;\r\nfunction IsZero(const d: Double): Boolean; overload;\r\n\r\nfunction IsNaN(const v: JSValue): boolean; external name {$IFDEF ECMAScript5}'isNaN'{$ELSE}'Number.isNaN'{$ENDIF}; overload;\r\nfunction IsFinite(const d: JSValue): Boolean; external name 'isFinite'; overload;// false if NaN, positive or negative infinity\r\nfunction IsInfinite(const d: JSValue): Boolean; assembler; overload; // negative or positive infinity\r\n{$IFDEF ECMAScript6}\r\nfunction IsInteger(const d: JSValue): Boolean; external name 'Number.isInteger'; // any integer representable by a double\r\nfunction IsSafeInteger(const d: JSValue): Boolean; external name 'Number.isSafeInteger'; // an integer between MinInteger and MaxInteger, inclusive\r\n{$ENDIF}\r\n\r\nfunction SameValue(const A, B: Double; Epsilon: Double = 0.0): Boolean; overload;\r\n\r\n// function Abs is in System.pas\r\nfunction ArcCos(const A : Double): Double; external name 'Math.acos';\r\nfunction ArcCosH(const A: Double): Double; external name 'Math.acosh'; // not on IE\r\nfunction ArcSin(const A : Double): Double; external name 'Math.asin';\r\nfunction ArcSinH(const A : Double): Double; external name 'Math.asinh'; // not on IE\r\nfunction ArcTanH(const A: Double): Double; external name 'Math.atanh'; // not on IE\r\nfunction CosH(const A: Double): Double; external name 'Math.cosh'; // not on IE\r\nfunction ExpM1(const A: Double): Double; external name 'Math.expm1'; // not on IE\r\nfunction FRound(const A: Double): Double; overload; external name 'Math.fround'; // not on IE\r\nfunction FTrunc(const A: Double): double; overload; external name 'Math.trunc'; // not on IE\r\nfunction Hypot(const A : Double): Double; varargs; external name 'Math.hypot'; // not on IE\r\nfunction IMul(const A, B: Integer): Integer; external name 'Math.imul'; // not on IE\r\nfunction Log10(const A: Double): Double; external name 'Math.log10';\r\nfunction Log1p(const A: Double): Double; external name 'Math.log1p'; // not on IE\r\nfunction Log2(const A: Double): Double; external name 'Math.log2'; // not on IE\r\nfunction LogN(const A, Base: Double): Double; \r\nfunction Power(const Base, Exponent: Double): Double; external name 'Math.pow';\r\n// ln, round, sqrt, trunc, cos, sin, arctan, round, exp are in unit system\r\nfunction Ceil(const A: Double): Integer;\r\nfunction Floor(const A: Double): Integer;\r\nfunction Ceil64(const A: Double): NativeLargeInt;\r\nfunction Floor64(const A: Double): NativeLargeInt;\r\nfunction ldexp(x : double;const p : Integer) : double;\r\nprocedure Frexp(X: double; out Mantissa: double; out Exponent: integer);\r\nfunction lnxp1(x : double) : double;\r\n\r\nfunction IntPower(base : float;const exponent : Integer) : double;\r\n\r\nprocedure DivMod(Dividend: LongInt; Divisor: Word; out Result, Remainder: Word);\r\nprocedure DivMod(Dividend: LongInt; Divisor: Word; out Result, Remainder: SmallInt);\r\nprocedure DivMod(Dividend: DWord; Divisor: DWord; out Result, Remainder: DWord);\r\nprocedure DivMod(Dividend: LongInt; Divisor: LongInt; out Result, Remainder: LongInt);\r\n\r\n{ Angle conversion }\r\nfunction DegToRad(deg : double) : double;\r\nfunction RadToDeg(rad : double) : double;\r\nfunction GradToRad(grad : double) : double;\r\nfunction RadToGrad(rad : double) : double;\r\nfunction DegToGrad(deg : double) : double;\r\nfunction GradToDeg(grad : double) : double;\r\n{ one cycle are 2*Pi rad }\r\nfunction CycleToRad(cycle : double) : double;\r\nfunction RadToCycle(rad : double) : double;\r\nFunction DegNormalize(deg : double) : double;\r\n\r\nfunction Norm(const data : array of double) : double;\r\n\r\n// Statistical functions\r\nfunction Mean(const data : array of double) : double;\r\nfunction Sum(const data : array of double) : double;\r\nprocedure SumsAndSquares(const data : Array of Double; out Sum,SumOfSquares : double);\r\n\r\nfunction StdDev(const data : array of Double) : float;\r\nprocedure MeanAndStdDev(const data : array of Double; out Mean,StdDev : double);\r\nfunction Variance(const data : array of Double) : double;\r\nfunction TotalVariance(const data : array of Double) : double;\r\nfunction PopNStdDev(const data : array of Double) : double;\r\nfunction PopNVariance(const data : array of Double) : double;\r\nprocedure MomentSkewKurtosis(const data : array of Double; out m1,m2,m3,m4,skew,kurtosis : double);\r\n\r\n// Financial functions\r\n\r\nType\r\n TPaymentTime = (ptEndOfPeriod,ptStartOfPeriod);\r\n\r\nfunction FutureValue(ARate: double; NPeriods: Integer;\r\n APayment, APresentValue: double; APaymentTime: TPaymentTime): double;\r\n\r\nfunction InterestRate(NPeriods: Integer; APayment, APresentValue, AFutureValue: double;\r\n APaymentTime: TPaymentTime): double;\r\n\r\nfunction NumberOfPeriods(ARate, APayment, APresentValue, AFutureValue: double;\r\n APaymentTime: TPaymentTime): double;\r\n\r\nfunction Payment(ARate: double; NPeriods: Integer;\r\n APresentValue, AFutureValue: double; APaymentTime: TPaymentTime): double;\r\n\r\nfunction PresentValue(ARate: double; NPeriods: Integer;\r\n APayment, AFutureValue: double; APaymentTime: TPaymentTime): double;\r\n\r\n// Miscellaneous\r\n\r\nfunction IfThen(val:boolean;const ifTrue:integer; const ifFalse:integer= 0) :integer; overload;\r\nfunction IfThen(val:boolean;const ifTrue:double ; const ifFalse:double =0.0):double; overload;\r\n\r\nType\r\n TValueRelationship = -1..1;\r\n\r\nconst\r\n EqualsValue = 0;\r\n LessThanValue = Low(TValueRelationship);\r\n GreaterThanValue = High(TValueRelationship);\r\n\r\nfunction CompareValue ( const A, B : Integer) : TValueRelationship;\r\nfunction CompareValue ( const A, B : NativeLargeInt) : TValueRelationship;\r\nfunction CompareValue ( const A, B : NativeLargeUInt) : TValueRelationship;\r\nfunction CompareValue ( const A, B : Double; delta : Double = 0.0) : TValueRelationship;\r\n\r\nfunction MinValue(const Data: array of Double): Double;\r\nfunction MaxValue(const Data: array of Double): Double; overload;\r\n\r\nfunction FMod(const ANumerator, ADenominator: Double): Double;\r\n\r\nimplementation\r\n\r\nfunction FMod(const ANumerator, ADenominator: Double): Double;\r\nbegin\r\n Result := ANumerator - Trunc(ANumerator / ADenominator) * ADenominator;\r\nend;\r\n\r\nfunction MinValue(const Data: array of Double): Double;\r\nvar\r\n I: Integer;\r\nbegin\r\n Result := Data[Low(Data)];\r\n for I := Low(Data) + 1 to High(Data) do\r\n if Result > Data[I] then\r\n Result := Data[I];\r\nend;\r\n\r\nfunction MaxValue(const Data: array of Double): Double;\r\nvar\r\n I: Integer;\r\nbegin\r\n Result := Data[Low(Data)];\r\n for I := Low(Data) + 1 to High(Data) do\r\n if Result < Data[I] then\r\n Result := Data[I];\r\nend;\r\n\r\nfunction InRange(const AValue, AMin, AMax: Integer): Boolean; assembler;\r\nasm\r\n return (AValue >= AMin) && (AValue <= AMax);\r\nend;\r\n\r\nfunction InRange(const AValue, AMin, AMax: Double): Boolean; assembler;\r\nasm\r\n return (AValue >= AMin) && (AValue <= AMax);\r\nend;\r\n\r\nfunction EnsureRange(const AValue, AMin, AMax: Integer): Integer; assembler;\r\nasm\r\n if (AValueAMax){ return AMax;\r\n } else return AValue;\r\nend;\r\n\r\nfunction EnsureRange(const AValue, AMin, AMax: Double): Double; assembler;\r\nasm\r\n if (AValueAMax){ return AMax;\r\n } else return AValue;\r\nend;\r\n\r\nfunction RoundTo(const AValue: Double; const Digits: TRoundToRange): Double;\r\nvar\r\n RV : Double;\r\n\r\nbegin\r\n RV:=IntPower(10,Digits);\r\n Result:=Round(AValue/RV)*RV;\r\nend;\r\n\r\nfunction SimpleRoundTo(const AValue: Double; const Digits: TRoundToRange): Double;\r\nvar\r\n RV : Double;\r\n\r\nbegin\r\n RV := IntPower(10, -Digits);\r\n if AValue < 0 then\r\n Result := Int((AValue*RV) - 0.5)/RV\r\n else\r\n Result := Int((AValue*RV) + 0.5)/RV;\r\nend;\r\n\r\nfunction randg(mean,stddev : float) : float;\r\n\r\nVar\r\n U1,S2 : Float;\r\n\r\nbegin\r\n repeat\r\n u1:= 2*random-1;\r\n S2:=Sqr(U1)+sqr(2*random-1);\r\n until s2<1;\r\n Result:=Sqrt(-2*ln(S2)/S2)*u1*stddev+Mean;\r\nend;\r\n\r\n\r\nfunction RandomRange(const aFrom, aTo: Integer): Integer;\r\nbegin\r\n Result:=Random(Abs(aFrom-aTo))+Min(aTo,AFrom);\r\nend;\r\n\r\n\r\nfunction RandomRange(const aFrom, aTo: NativeLargeInt): NativeLargeInt;\r\n\r\nVar\r\n m : NativeLargeInt;\r\nbegin\r\n if aFromB) then\r\n Result:=((A-B)<=Epsilon)\r\n else\r\n Result:=((B-A)<=Epsilon);\r\nend;\r\n\r\nfunction JSFloor(const A: Double): Double; external name 'Math.floor';\r\nfunction JSCeil(const A: Double): Double; external name 'Math.ceil';\r\n\r\nfunction Ceil(const A: Double): Integer;\r\n\r\nbegin\r\n // TODO: add Range check ?\r\n Result:=trunc(JSCeil(a));\r\nend;\r\n\r\nfunction Floor(const A: Double): Integer;\r\n\r\nbegin\r\n // TODO: add Range check ?\r\n Result:=trunc(JSFloor(a));\r\nend;\r\n\r\nfunction Ceil64(const A: Double): NativeLargeInt;\r\n\r\nbegin\r\n Result:=trunc(JSCeil(a));\r\nend;\r\n\r\nfunction Floor64(const A: Double): NativeLargeInt;\r\n\r\nbegin\r\n Result:=trunc(JSCeil(a));\r\nend;\r\n\r\nprocedure Frexp(X: double; out Mantissa: double; out Exponent: integer);\r\n\r\nbegin\r\n Exponent:=0;\r\n if (X<>0) then\r\n if (abs(X)<0.5) then\r\n repeat\r\n X:=X*2;\r\n Dec(Exponent);\r\n until (abs(X)>=0.5)\r\n else\r\n while (abs(X)>=1) do\r\n begin\r\n X:=X/2;\r\n Inc(Exponent);\r\n end;\r\n Mantissa:=X;\r\nend;\r\n\r\nfunction LogN(const A, Base: Double): Double; \r\n\r\nbegin\r\n Result:=Ln(A)/Ln(Base);\r\nend;\r\n\r\nfunction lnxp1(x: double): double;\r\n\r\nvar\r\n y: float;\r\n\r\nbegin\r\n if (x>=4.0) then\r\n result:=ln(1.0+x)\r\n else\r\n begin\r\n y:=1.0+x;\r\n if (y=1.0) then\r\n result:=x\r\n else\r\n begin\r\n result:=ln(y); { lnxp1(-1) = ln(0) = -Inf }\r\n if y>0.0 then\r\n result:=result+(x-(y-1.0))/y;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction ldexp(x : double;const p : Integer) : double;\r\n\r\nbegin\r\n result:=x*intpower(2.0,p);\r\nend;\r\n\r\n\r\nfunction IntPower(base: float; const exponent: Integer): double;\r\n\r\nvar\r\n i : longint;\r\n\r\nbegin\r\n if (base = 0.0) and (exponent = 0) then\r\n result:=1\r\n else\r\n begin\r\n i:=abs(exponent);\r\n Result:=1.0;\r\n while i>0 do\r\n begin\r\n while (i and 1)=0 do\r\n begin\r\n i:=i shr 1;\r\n base:=sqr(base);\r\n end;\r\n i:=i-1;\r\n Result:=Result*base;\r\n end;\r\n if exponent<0 then\r\n Result:=1.0/Result;\r\n end;\r\nend;\r\n\r\nprocedure DivMod(Dividend: LongInt; Divisor: Word; out Result, Remainder: Word);\r\nbegin\r\n if Dividend < 0 then\r\n begin\r\n Dividend:=-Dividend;\r\n Result:=-(Dividend Div Divisor);\r\n Remainder:=-(Dividend+(Result*Divisor));\r\n end\r\n else\r\n begin\r\n Result:=Dividend Div Divisor;\r\n Remainder:=Dividend-(Result*Divisor);\r\n end;\r\nend;\r\n\r\n\r\nprocedure DivMod(Dividend: LongInt; Divisor: Word; out Result,\r\n Remainder: SmallInt);\r\nbegin\r\n if Dividend < 0 then\r\n begin\r\n Dividend:=-Dividend;\r\n Result:=-(Dividend Div Divisor);\r\n Remainder:=-(Dividend+(Result*Divisor));\r\n end\r\n else\r\n begin\r\n Result:=Dividend Div Divisor;\r\n Remainder:=Dividend-(Result*Divisor);\r\n end;\r\nend;\r\n\r\n\r\nprocedure DivMod(Dividend: DWord; Divisor: DWord; out Result, Remainder: DWord);\r\nbegin\r\n Result:=Dividend Div Divisor;\r\n Remainder:=Dividend-(Result*Divisor);\r\nend;\r\n\r\n\r\nprocedure DivMod(Dividend: LongInt; Divisor: LongInt; out Result,\r\n Remainder: LongInt);\r\n\r\nbegin\r\n if Dividend < 0 then\r\n begin\r\n Dividend:=-Dividend;\r\n Result:=-(Dividend Div Divisor);\r\n Remainder:=-(Dividend+(Result*Divisor));\r\n end\r\n else\r\n begin\r\n Result:=Dividend Div Divisor;\r\n Remainder:=Dividend-(Result*Divisor);\r\n end;\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n Angle conversion\r\n ---------------------------------------------------------------------}\r\nfunction DegToRad(deg: double): double;\r\n\r\nbegin\r\n Result:=deg*(pi/180.0);\r\nend;\r\n\r\n\r\nfunction RadToDeg(rad: double): double;\r\n\r\nbegin\r\n Result:=rad*(180.0/pi);\r\nend;\r\n\r\n\r\nfunction GradToRad(grad: double): double;\r\n\r\nbegin\r\n Result:=grad*(pi/200.0);\r\nend;\r\n\r\n\r\nfunction RadToGrad(rad: double): double;\r\n\r\nbegin\r\n Result:=rad*(200.0/pi);\r\nend;\r\n\r\n\r\nfunction DegToGrad(deg: double): double;\r\n\r\nbegin\r\n Result:=deg*(200.0/180.0);\r\nend;\r\n\r\n\r\nfunction GradToDeg(grad: double): double;\r\n\r\nbegin\r\n Result:=grad*(180.0/200.0);\r\nend;\r\n\r\n\r\nfunction CycleToRad(cycle: double): double;\r\n\r\nbegin\r\n Result:=(2*pi)*cycle;\r\nend;\r\n\r\n\r\nfunction RadToCycle(rad: double): double;\r\n\r\nbegin\r\n Result:=rad*(1/(2*pi));\r\nend;\r\n\r\n\r\nfunction DegNormalize(deg: double): double;\r\n\r\nbegin\r\n Result:=Deg-Int(Deg/360)*360;\r\n If (Result<0) then Result:=Result+360;\r\nend;\r\n\r\nfunction sumofsquares(const data : array of double) : double;\r\nvar\r\n i,N : longint;\r\n\r\nbegin\r\n N:=Length(Data);\r\n Result:=0.0;\r\n for i:=0 to N-1 do\r\n Result:=Result+sqr(data[i]);\r\nend;\r\n\r\nfunction Norm(const data: array of double): double;\r\nbegin\r\n Result:=sqrt(sumofsquares(data));\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n Statistical functions\r\n ---------------------------------------------------------------------}\r\n\r\nfunction Sum(const data: array of double): double;\r\n\r\nvar\r\n i,N : longint;\r\n\r\nbegin\r\n N:=Length(Data);\r\n Result:=0.0;\r\n for i:=0 to N-1 do\r\n Result:=Result+data[i];\r\nend;\r\n\r\nfunction Mean(const data: array of double): double;\r\n\r\nVar\r\n N : integer;\r\n\r\nbegin\r\n N:=Length(Data);\r\n if N=0 then\r\n Result:=0\r\n else\r\n Result:=Sum(Data)/N;\r\nend;\r\nprocedure SumsAndSquares(const data: array of Double; out Sum,\r\n SumOfSquares: double);\r\n\r\nvar\r\n i,n : Integer;\r\n t,s,ss: double;\r\n\r\nbegin\r\n n:=length(Data);\r\n ss:=0.0; // Use local vars, var is very inefficient in js\r\n s:=0.0;\r\n for i:=0 to N-1 do\r\n begin\r\n t:=data[i];\r\n ss:=ss+sqr(t);\r\n s:=s+t;\r\n end;\r\n Sum:=s;\r\n SumOfSquares:=ss;\r\nend;\r\n\r\nfunction StdDev(const data: array of Double): float;\r\n\r\nbegin\r\n Result:=Sqrt(Variance(Data));\r\nend;\r\n\r\nfunction Variance(const data: array of Double): double;\r\n\r\nvar\r\n n : integer;\r\n\r\nbegin\r\n N:=Length(Data);\r\n If N=1 then\r\n Result:=0\r\n else\r\n Result:=TotalVariance(Data)/(N-1);\r\nend;\r\n\r\nfunction TotalVariance(const data: array of Double): double;\r\n\r\nvar\r\n S,SS : Float;\r\n N : integer;\r\nbegin\r\n N:=Length(Data);\r\n If Length(Data)=1 then\r\n Result:=0\r\n else\r\n begin\r\n SumsAndSquares(Data,S,SS);\r\n Result := SS-Sqr(S)/N;\r\n end;\r\nend;\r\n\r\nprocedure MeanAndStdDev(const data: array of Double; out Mean, StdDev: double);\r\n\r\nVar\r\n I,N : longint;\r\n M,S : Double;\r\n\r\nbegin\r\n N:=Length(Data);\r\n M:=0;\r\n S:=0;\r\n For I:=0 to N-1 do\r\n begin\r\n M:=M+Data[i];\r\n S:=S+Sqr(Data[i]);\r\n end;\r\n M:=M/N;\r\n S:=(S-N*Sqr(M));\r\n If N>1 then\r\n S:=Sqrt(S/(N-1))\r\n else\r\n S:=0;\r\n Mean:=M;\r\n StdDev:=S;\r\nend;\r\n\r\nfunction PopNStdDev(const data : array of Double) : double;\r\n\r\nbegin\r\n Result:=Sqrt(PopnVariance(Data));\r\nend;\r\n\r\nfunction PopNVariance(const data : array of Double) : double;\r\n\r\nVar\r\n N : integer;\r\n\r\nbegin\r\n N:=Length(Data);\r\n if N=0 then\r\n Result:=0\r\n else\r\n Result:=TotalVariance(Data)/N;\r\nend;\r\n\r\nprocedure MomentSkewKurtosis(const data: array of Double; out m1, m2, m3, m4, skew, kurtosis: double);\r\n\r\nvar\r\n i,N: integer;\r\n deviation, deviation2: double;\r\n reciprocalN: float;\r\n // Use local vars for all calculations, var is very slow\r\n lm1, lm2, lm3, lm4, lskew, lkurtosis: double;\r\n\r\nbegin\r\n N:=length(Data);\r\n lm1 := 0;\r\n reciprocalN := 1/N;\r\n for i := 0 to N-1 do\r\n lm1 := lm1 + data[i];\r\n lm1 := reciprocalN * lm1;\r\n\r\n lm2 := 0;\r\n lm3 := 0;\r\n lm4 := 0;\r\n for i := 0 to N-1 do\r\n begin\r\n deviation := (data[i]-lm1);\r\n deviation2 := deviation * deviation;\r\n lm2 := lm2 + deviation2;\r\n lm3 := lm3 + deviation2 * deviation;\r\n lm4 := lm4 + deviation2 * deviation2;\r\n end;\r\n lm2 := reciprocalN * lm2;\r\n lm3 := reciprocalN * lm3;\r\n lm4 := reciprocalN * lm4;\r\n\r\n lskew := lm3 / (sqrt(lm2)*lm2);\r\n lkurtosis := lm4 / (lm2 * lm2);\r\n\r\n m1:=lm1;\r\n m2:=lm2;\r\n m3:=lm3;\r\n m4:=lm4;\r\n skew:=lskew;\r\n kurtosis:=lkurtosis;\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n Financial functions\r\n ---------------------------------------------------------------------}\r\n\r\nfunction FutureValue(ARate: double; NPeriods: Integer;\r\n APayment, APresentValue: double; APaymentTime: TPaymentTime): double;\r\nvar\r\n q, qn, factor: double;\r\nbegin\r\n if ARate = 0 then\r\n Result := -APresentValue - APayment * NPeriods\r\n else begin\r\n q := 1.0 + ARate;\r\n qn := power(q, NPeriods);\r\n factor := (qn - 1) / (q - 1);\r\n if APaymentTime = ptStartOfPeriod then\r\n factor := factor * q;\r\n Result := -(APresentValue * qn + APayment*factor);\r\n end;\r\nend;\r\n\r\nfunction InterestRate(NPeriods: Integer; APayment, APresentValue, AFutureValue: double;\r\n APaymentTime: TPaymentTime): double;\r\n{ The interest rate cannot be calculated analytically. We solve the equation\r\n numerically by means of the Newton method:\r\n - guess value for the interest reate\r\n - calculate at which interest rate the tangent of the curve fv(rate)\r\n (straight line!) has the requested future vale.\r\n - use this rate for the next iteration. }\r\nconst\r\n DELTA = 0.001;\r\n EPS = 1E-9; // required precision of interest rate (after typ. 6 iterations)\r\n MAXIT = 20; // max iteration count to protect agains non-convergence\r\nvar\r\n r1, r2, dr: double;\r\n fv1, fv2: double;\r\n iteration: Integer;\r\nbegin\r\n iteration := 0;\r\n r1 := 0.05; // inital guess\r\n repeat\r\n r2 := r1 + DELTA;\r\n fv1 := FutureValue(r1, NPeriods, APayment, APresentValue, APaymentTime);\r\n fv2 := FutureValue(r2, NPeriods, APayment, APresentValue, APaymentTime);\r\n dr := (AFutureValue - fv1) / (fv2 - fv1) * delta; // tangent at fv(r)\r\n r1 := r1 + dr; // next guess\r\n inc(iteration);\r\n until (abs(dr) < EPS) or (iteration >= MAXIT);\r\n Result := r1;\r\nend;\r\n\r\nfunction NumberOfPeriods(ARate, APayment, APresentValue, AFutureValue: double;\r\n APaymentTime: TPaymentTime): double;\r\n{ Solve the cash flow equation (1) for q^n and take the logarithm }\r\nvar\r\n q, x1, x2: double;\r\nbegin\r\n if ARate = 0 then\r\n Result := -(APresentValue + AFutureValue) / APayment\r\n else begin\r\n q := 1.0 + ARate;\r\n if APaymentTime = ptStartOfPeriod then\r\n APayment := APayment * q;\r\n x1 := APayment - AFutureValue * ARate;\r\n x2 := APayment + APresentValue * ARate;\r\n if (x2 = 0) // we have to divide by x2\r\n or (sign(x1) * sign(x2) < 0) // the argument of the log is negative\r\n then\r\n Result := Infinity\r\n else begin\r\n Result := ln(x1/x2) / ln(q);\r\n end;\r\n end;\r\nend;\r\n\r\nfunction Payment(ARate: double; NPeriods: Integer;\r\n APresentValue, AFutureValue: double; APaymentTime: TPaymentTime): double;\r\nvar\r\n q, qn, factor: double;\r\nbegin\r\n if ARate = 0 then\r\n Result := -(AFutureValue + APresentValue) / NPeriods\r\n else begin\r\n q := 1.0 + ARate;\r\n qn := power(q, NPeriods);\r\n factor := (qn - 1) / (q - 1);\r\n if APaymentTime = ptStartOfPeriod then\r\n factor := factor * q;\r\n Result := -(AFutureValue + APresentValue * qn) / factor;\r\n end;\r\nend;\r\n\r\nfunction PresentValue(ARate: double; NPeriods: Integer;\r\n APayment, AFutureValue: double; APaymentTime: TPaymentTime): double;\r\nvar\r\n q, qn, factor: double;\r\nbegin\r\n if ARate = 0.0 then\r\n Result := -AFutureValue - APayment * NPeriods\r\n else begin\r\n q := 1.0 + ARate;\r\n qn := power(q, NPeriods);\r\n factor := (qn - 1) / (q - 1);\r\n if APaymentTime = ptStartOfPeriod then\r\n factor := factor * q;\r\n Result := -(AFutureValue + APayment*factor) / qn;\r\n end;\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n Miscellaneous\r\n ---------------------------------------------------------------------}\r\n\r\nfunction IfThen(val: boolean; const ifTrue: integer; const ifFalse: integer): integer;\r\n\r\nbegin\r\n if val then result:=iftrue else result:=iffalse;\r\nend;\r\n\r\nfunction IfThen(val: boolean; const ifTrue: double; const ifFalse: double): double;\r\n\r\nbegin\r\n if val then result:=iftrue else result:=iffalse;\r\nend;\r\n\r\nfunction CompareValue(const A, B : Integer): TValueRelationship;\r\n\r\nbegin\r\n result:=GreaterThanValue;\r\n if a=b then\r\n result:=EqualsValue\r\n else\r\n if a 0) and (Pos(AString[lLen], cWhiteSpace) > 0) do\r\n Dec(lLen);\r\n\r\n if lLen = 0 then\r\n begin\r\n FixErrorMsg(AString);\r\n Exit;\r\n end;\r\n\r\n lYearMoreThenTwoDigits := False;\r\n lSeparator := AFormatSettings.DateSeparator;\r\n if lSeparator = #0 then\r\n lSeparator := '-';\r\n // Writeln('Separator: ', lSeparator);\r\n\r\n lDateFormat := UpperCase(AUseFormat);\r\n { Determine order of lDayValues,lMonthValues,lYearValues }\r\n lYearPos := 0;\r\n lMonthPos := 0;\r\n lDayPos := 0;\r\n lWhich := 0;\r\n lCount := 0;\r\n while (lCount < Length(lDateFormat)) and (lWhich < 3) do\r\n begin\r\n Inc(lCount);\r\n case lDateFormat[lCount] of\r\n 'Y':\r\n if lYearPos = 0 then\r\n begin\r\n Inc(lWhich);\r\n lYearPos := lWhich;\r\n end;\r\n 'M':\r\n if lMonthPos = 0 then\r\n begin\r\n Inc(lWhich);\r\n lMonthPos := lWhich;\r\n end;\r\n 'D':\r\n if lDayPos = 0 then\r\n begin\r\n Inc(lWhich);\r\n lDayPos := lWhich;\r\n end;\r\n end;\r\n end;\r\n // Writeln('YP: ',lYearPos,', MP: ',lMonthPos,', DP: ',lDayPos);\r\n\r\n for lCount := 1 to 3 do\r\n lValues[lCount] := 0;\r\n lS1 := '';\r\n lNumSep := 0;\r\n for lCount := 1 to lLen do\r\n begin\r\n if Pos(AString[lCount], cDigits) > 0 then\r\n lS1 := lS1 + AString[lCount];\r\n { space can be part of the shortdateformat, and is defaultly in slovak\r\n windows, therefor it shouldn't be taken as separator (unless so specified)\r\n and ignored }\r\n\r\n if (lSeparator <> ' ') and (AString[lCount] = ' ') then\r\n Continue;\r\n if (AString[lCount] = lSeparator) or ((lCount = lLen) and (Pos(AString[lCount], cDigits) > 0)) then\r\n begin\r\n Inc(lNumSep);\r\n if lNumSep > 3 then\r\n begin\r\n// Writeln('More than 3 separators');\r\n FixErrorMsg(AString);\r\n Exit;\r\n end;\r\n\r\n // Check if the year has more then two Digits (if lNumSep = lYearPos, then we are evaluating the year.)\r\n if (lNumSep = lYearPos) and (Length(lS1) > 2) then\r\n lYearMoreThenTwoDigits := True;\r\n Val(lS1, lValues[lNumSep], lCode);\r\n if lCode <> 0 then\r\n begin\r\n// Writeln('S1 not a number ',lS1);\r\n FixErrorMsg(AString);\r\n Exit;\r\n end;\r\n lS1 := '';\r\n end\r\n else if Pos(AString[lCount], cDigits) = 0 then\r\n begin\r\n// Writeln('Not a number at pos ',lCount,' ',AString[lCount]);\r\n FixErrorMsg(AString);\r\n Exit;\r\n end;\r\n end;\r\n// Writeln('Which : ',lWhich,' N : ',lNumSep);\r\n if (lWhich < 3) and (lNumSep > lWhich) then\r\n begin\r\n FixErrorMsg(AString);\r\n Exit;\r\n end;\r\n\r\n // Fill in lValues.\r\n DecodeDate(Date, lYear, lMonth, lDay);\r\n if lNumSep = 3 then\r\n begin\r\n lYearValues := lValues[lYearPos];\r\n lMonthValues := lValues[lMonthPos];\r\n lDayValues := lValues[lDayPos];\r\n end\r\n else\r\n begin\r\n lYearValues := lYear;\r\n if lNumSep < 2 then\r\n begin\r\n lDayValues := lValues[1];\r\n lMonthValues := lMonth;\r\n end\r\n else if lDayPos < lMonthPos then\r\n begin\r\n lDayValues := lValues[1];\r\n lMonthValues := lValues[2];\r\n end\r\n else\r\n begin\r\n lDayValues := lValues[2];\r\n lMonthValues := lValues[1];\r\n end;\r\n end;\r\n if (lYearValues >= 0) and (lYearValues < 100) and not lYearMoreThenTwoDigits then\r\n begin\r\n lYear := lYear - AFormatSettings.TwoDigitYearCenturyWindow;\r\n Inc(lYearValues, lYear div 100 * 100);\r\n if (AFormatSettings.TwoDigitYearCenturyWindow > 0) and (lYearValues < lYear) then\r\n Inc(lYearValues, 100);\r\n end;\r\n\r\n if not TryEncodeDate(lYearValues, lMonthValues, lDayValues, Result) then\r\n AErrorMsg := SErrInvalidDate;\r\nend;\r\n\r\nfunction TryStrToDate(const AString: string; out AValue: TDateTime): Boolean;\r\nbegin\r\n Result := TryStrToDate(AString, AValue, FormatSettings);\r\nend;\r\n\r\nfunction TryStrToDate(const AString: string; out AValue: TDateTime; const AFormatSettings: TFormatSettings): Boolean;\r\nvar\r\n lMsg: string;\r\nbegin\r\n Result := AString.NotIsEmpty;\r\n if Result then\r\n begin\r\n AValue := IntStrToDate(lMsg, AString, AFormatSettings.ShortDateFormat, AFormatSettings);\r\n Result := lMsg.IsEmpty;\r\n end\r\n else\r\n AValue := 0;\r\nend;\r\n\r\nfunction StrToDateDef(const AValue: string; const ADefault: TDateTime): TDateTime;\r\nbegin\r\n Result := StrToDateDef(AValue, ADefault, FormatSettings);\r\nend;\r\n\r\nfunction StrToDateDef(const AValue: string; const ADefault: TDateTime; const AFormatSettings: TFormatSettings): TDateTime;\r\nbegin\r\n if not TryStrToDate(AValue, Result, AFormatSettings) Then\r\n Result := ADefault;\r\nend;\r\n\r\nfunction StrToDate(const AValue: string): TDateTime;\r\nbegin\r\n Result := StrToDate(AValue, FormatSettings);\r\nend;\r\n\r\nfunction StrToDate(const AValue: string; const AFormatSettings: TFormatSettings): TDateTime;\r\nvar\r\n lMsg : string;\r\nbegin\r\n Result := IntStrToDate(lMsg, AValue, AFormatSettings.ShortDateFormat, AFormatSettings);\r\n if lMsg <> '' then\r\n raise EConvertError.Create(lMsg);\r\nend;\r\n\r\nfunction StrToDateTimeDef(const AValue: string; const ADefault: TDateTime): TDateTime;\r\nbegin\r\n Result := StrToDateTimeDef(AValue, ADefault, FormatSettings);\r\nend;\r\n\r\nfunction StrToDateTimeDef(const AValue: string; const ADefault: TDateTime; const AFormatSettings: TFormatSettings): TDateTime;\r\nbegin\r\n if not TryStrToDateTime(AValue, Result, AFormatSettings) then\r\n Result := ADefault;\r\nend;\r\n\r\nfunction SplitDateTimeStr(ADateTimeStr: string; out ADateStr, ATimeStr: string; const AFormatSettings: TFormatSettings): Integer;\r\n\r\n{ Helper function for StrToDateTime\r\n Pre-condition\r\n Date is before Time\r\n If either Date or Time is omitted then see what fits best, a time or a date (issue #0020522)\r\n Date and Time are separated by whitespace (space Tab, Linefeed or carriage return)\r\n FS.DateSeparator can be the same as FS.TimeSeparator (issue #0020522)\r\n If they are both #32 and TrimWhite(DateTimeStr) contains a #32 a date is assumed.\r\n Post-condition\r\n DateStr holds date as string or is empty\r\n TimeStr holds time as string or is empty\r\n Result = number of strings returned, 0 = error\r\n}\r\nconst\r\n cWhiteSpace = #9#10#13#32;\r\n\r\nvar\r\n lPos: Integer;\r\n lDummyDT: TDateTime;\r\nbegin\r\n Result := 0;\r\n ADateStr := '';\r\n ATimeStr := '';\r\n ADateTimeStr := Trim(ADateTimeStr);\r\n if Length(ADateTimeStr) = 0 then\r\n Exit;\r\n if (AFormatSettings.DateSeparator = #32) and (AFormatSettings.TimeSeparator = #32) and\r\n (Pos(#32, ADateTimeStr) > 0) then\r\n begin\r\n ADateStr := ADateTimeStr;\r\n {\r\n Assume a date: dd [mm [yy]].\r\n Really fancy would be counting the number of cWhiteSpace occurrences and decide\r\n and split accordingly\r\n }\r\n Exit(1);\r\n end;\r\n lPos := 1;\r\n // find separator\r\n if (AFormatSettings.DateSeparator <> #32) then\r\n begin\r\n while (lPos < Length(ADateTimeStr)) and (not(Pos(ADateTimeStr[lPos + 1], cWhiteSpace) > 0)) do\r\n Inc(lPos);\r\n end\r\n else\r\n begin\r\n lPos := Pos(AFormatSettings.TimeSeparator, ADateTimeStr);\r\n if (lPos <> 0) then\r\n repeat\r\n Dec(lPos);\r\n until (lPos = 0) or (Pos(ADateTimeStr[lPos], cWhiteSpace) > 0);\r\n end;\r\n // Always fill ADateStr, it eases the algorithm later\r\n if (lPos = 0) then\r\n lPos := Length(ADateTimeStr);\r\n ADateStr := Copy(ADateTimeStr, 1, lPos);\r\n ATimeStr := Trim(Copy(ADateTimeStr, lPos + 1, 100));\r\n if (Length(ATimeStr) <> 0) then\r\n Result := 2\r\n else\r\n begin\r\n Result := 1; // found 1 string\r\n // 2 cases when ADateTimeStr only contains a time:\r\n // Date/time separator differ, and string contains a timeseparator\r\n // Date/time separators are equal, but transformation to date fails.\r\n if ((AFormatSettings.DateSeparator <> AFormatSettings.TimeSeparator) and (Pos(AFormatSettings.TimeSeparator, ADateStr) > 0))\r\n or ((AFormatSettings.DateSeparator = AFormatSettings.TimeSeparator) and (not TryStrToDate(ADateStr, lDummyDT, AFormatSettings))) then\r\n begin\r\n ATimeStr := ADateStr;\r\n ADateStr := '';\r\n end;\r\n end;\r\nend;\r\n\r\nfunction StrToDateTime(const AString: string): TDateTime;\r\nbegin\r\n Result := StrToDateTime(AString, FormatSettings);\r\nend;\r\n\r\nfunction StrToDateTime(const AString: string; const AFormatSettings: TFormatSettings): TDateTime;\r\nvar\r\n lTimeStr, lDateStr: string;\r\n lPartsFound: Integer;\r\nbegin\r\n lPartsFound := SplitDateTimeStr(AString, lDateStr, lTimeStr, AFormatSettings);\r\n case lPartsFound of\r\n 0: Result := StrToDate('', AFormatSettings);\r\n 1: if lDateStr <> '' then\r\n Result := StrToDate(lDateStr, AFormatSettings)\r\n else\r\n Result := StrToTime(lTimeStr, AFormatSettings);\r\n 2: Result := ComposeDateTime(StrToDate(lDateStr, AFormatSettings), StrToTime(lTimeStr, AFormatSettings));\r\n end;\r\nend;\r\n\r\nfunction TryStrToDateTime(const AString: string; out AValue: TDateTime): Boolean;\r\nbegin\r\n Result := TryStrToDateTime(AString, AValue, FormatSettings);\r\nend;\r\n\r\nfunction TryStrToDateTime(const AString: string; out AValue: TDateTime; const AFormatSettings: TFormatSettings): Boolean;\r\nvar\r\n lCount: Integer;\r\n lDate: TDateTime;\r\n lTime: TDateTime;\r\nbegin\r\n Result := False;\r\n lCount := Pos(AFormatSettings.TimeSeparator, AString);\r\n if lCount > 0 then\r\n begin\r\n while (lCount > 0) and (AString[lCount] <> ' ') do\r\n Dec(lCount);\r\n if lCount > 0 then\r\n begin\r\n if not TryStrToDate(Copy(AString, 1, lCount - 1), lDate, AFormatSettings) then\r\n Exit;\r\n if not TryStrToTime(Copy(AString, lCount + 1, Length(AString) - lCount), lTime, AFormatSettings) then\r\n Exit;\r\n AValue := ComposeDateTime(lDate, lTime);\r\n Result := True;\r\n end\r\n else\r\n Result := TryStrToTime(AString, AValue, AFormatSettings);\r\n end\r\n else\r\n Result := TryStrToDate(AString, AValue, AFormatSettings);\r\nend;\r\n\r\nfunction IntStrToTime(out AErrorMsg: string; const AValue: string; ALen: Integer; const AFormatSettings: TFormatSettings): TDateTime;\r\nconst\r\n AMPM_None = 0;\r\n AMPM_AM = 1;\r\n AMPM_PM = 2;\r\n tiHour = 0;\r\n tiMin = 1;\r\n tiSec = 2;\r\n tiMSec = 3;\r\n\r\ntype\r\n TTimeValues = array of Word;\r\n\r\nvar\r\n lAmPm: Integer;\r\n lTimeValues: TTimeValues;\r\n lSeparator: Char;\r\n\r\n function SplitElements(out ATimeValues: TTimeValues; out AAmPm: Integer): Boolean;\r\n // Strict version. It does not allow #32 as separator, it will treat it as whitespace always\r\n const\r\n Digits = '0123456789';\r\n var\r\n lCur, lOffset, lElemLen, lErr, lTimeIndex, lFirstSignificantDigit: Integer;\r\n lValue: Integer;\r\n lDigitPending, lMSecPending: Boolean;\r\n lAmPmStr: string;\r\n lCurChar: Char;\r\n lCount: Integer;\r\n lAllowedChars: string;\r\n\r\n begin\r\n Result := False;\r\n AAmPm := AMPM_None; // No Am or PM in string found yet\r\n lMSecPending := False;\r\n lTimeIndex := 0; // indicating which TTimeValue must be filled next\r\n for lCount := tiHour to tiMSec do\r\n ATimeValues[lCount] := 0;\r\n lCur := 1;\r\n // skip leading blanks\r\n while (lCur < ALen) and (AValue[lCur] = #32) do\r\n Inc(lCur);\r\n lOffset := lCur;\r\n // First non-blank cannot be lSeparator or DecimalSeparator\r\n if (lCur > ALen - 1) or (AValue[lCur] = lSeparator) or (AValue[lCur] = AFormatSettings.Decimalseparator) then\r\n begin\r\n // Writeln('Error in sep S[Cur]',AValue[lCur],' ',lSeparator,' ',GetDecimalSeparator);\r\n Exit;\r\n end;\r\n lDigitPending := (Pos(AValue[lCur], Digits) > 0);\r\n while (lCur <= ALen) do\r\n begin\r\n // writeln;\r\n // writeln('Main While loop: Cur = ',lCur,' S[Cur] = \"',AValue[lCur],'\" Len = ',ALen,' separator : ', lSeparator);\r\n lCurChar := AValue[lCur];\r\n if Pos(lCurChar, Digits) > 0 then\r\n begin // Digits\r\n // HH, MM, SS, or Msec?\r\n // writeln('Digit: ', lCurChar);\r\n // Digits are only allowed after starting Am/PM or at beginning of string or after ASeparator\r\n // and lTimeIndex must be <= tiMSec\r\n // Uncomment \"or (#32 = Separator)\" and it will allllow #32 as Separator\r\n if (not(lDigitPending { or (#32 = lSeparator) } )) or (lTimeIndex > tiMSec) then\r\n begin\r\n // Writeln('DigitPending',lElemLen);\r\n Exit;\r\n end;\r\n lOffset := lCur;\r\n if (lCurChar <> '0') then\r\n lFirstSignificantDigit := lOffset\r\n else\r\n lFirstSignificantDigit := -1;\r\n while (lCur < ALen) and (Pos(AValue[lCur + 1], Digits) > 0) do\r\n begin\r\n // Mark first Digit that is not '0'\r\n if (lFirstSignificantDigit = -1) and (AValue[lCur] <> '0') then\r\n lFirstSignificantDigit := lCur;\r\n Inc(lCur);\r\n end;\r\n if (lFirstSignificantDigit = -1) then\r\n lFirstSignificantDigit := lCur;\r\n lElemLen := 1 + lCur - lFirstSignificantDigit;\r\n // writeln(' S[FirstSignificantDigit] = ',AValue[lFirstSignificantDigit], ' S[Cur] = ',AValue[lCur],' ElemLen = ',lElemLen,' -> ', AValue[lOffset], lElemLen);\r\n // writeln(' Cur = ',lCur);\r\n // this way we know that Val() will never overflow lValue !\r\n if (lElemLen <= 2) or ((lElemLen <= 3) and (lTimeIndex = tiMSec)) then\r\n begin\r\n Val(Copy(AValue, lFirstSignificantDigit, lElemLen), lValue, lErr);\r\n // writeln(' Value = ',lValue,' HH = ',ATimeValues[0],' MM = ',ATimeValues[1],' SS = ',ATimeValues[2],' MSec = ',ATimeValues[3]);\r\n // This is safe now, because we know lValue < High(Word)\r\n ATimeValues[lTimeIndex] := lValue;\r\n Inc(lTimeIndex);\r\n lDigitPending := False;\r\n end\r\n else\r\n begin\r\n // Writeln('Wrong elemlen: ',lElemLen, ' timeIndex: ',lTimeIndex);\r\n Exit; // lValue to big, so it must be a wrong timestring\r\n end;\r\n end // Digits\r\n else if (lCurChar = #32) then\r\n begin\r\n // writeln('#32');\r\n // just skip, but we must adress this, or it will be parsed by either AM/PM or lSeparator\r\n end\r\n else if (lCurChar = lSeparator) then\r\n begin\r\n // writeln('Separator ',lSeparator);\r\n if lDigitPending or (lTimeIndex > tiSec) then\r\n begin\r\n // Writeln ('DigitPending ',lDigitPending,' or (TimeIndex',lTimeIndex,' > tiSec,', tiSec,')');\r\n Exit;\r\n end;\r\n lDigitPending := True;\r\n lMSecPending := False;\r\n end\r\n else if (lCurChar = AFormatSettings.DecimalSeparator) then\r\n begin\r\n // writeln('AFormatSettings.DecimalSeparator');\r\n if lDigitPending or lMSecPending or (lTimeIndex <> tiMSec) then\r\n begin\r\n // Writeln('DigitPending ',lDigitPending,' or MSecPending ',lMSecPending,' (',lTimeIndex,',Timeindex, >', tiMSec,' tiSec)');\r\n Exit;\r\n end;\r\n lDigitPending := True;\r\n lMSecPending := True;\r\n end\r\n else\r\n begin // AM/PM?\r\n // None of the above, so this Char _must_ be the start of AM/PM string\r\n // If we already have found AM/PM or we expect a digit then then timestring must be wrong at this point\r\n // writeln('AM/PM?');\r\n if (AAmPm <> AMPM_None) or lDigitPending then\r\n begin\r\n // Writeln('AmPm <> AMPM_None) or DigitPending');\r\n Exit;\r\n end;\r\n lOffset := lCur;\r\n lAllowedChars := AFormatSettings.DecimalSeparator + ' ';\r\n if lSeparator <> #0 then\r\n lAllowedChars := lAllowedChars + lSeparator;\r\n while (lCur < ALen) and (Pos(AValue[lCur + 1], lAllowedChars) = 0) and\r\n (Pos(AValue[lCur + 1], Digits) = 0) do\r\n Inc(lCur);\r\n lElemLen := 1 + lCur - lOffset;\r\n // writeln(' S[Offset] = ',AValue[1+lOffset], ' S[Cur] = ',AValue[lCur],' ElemLen = ',lElemLen,' -> ', AValue[1+lOffset], lElemLen);\r\n // writeln(' Cur = ',lCur, 'S =',AValue);\r\n lAmPmStr := Copy(AValue, lOffset, lElemLen);\r\n\r\n // writeln('AmPmStr = ',lAmPmStr,' (',length(lAmPmStr),')');\r\n // We must compare to TimeAMString before hardcoded 'AM' for delphi compatibility\r\n // Also it is perfectly legal, though insane to have TimeAMString = 'PM' and vice versa\r\n if (CompareText(lAmPmStr, AFormatSettings.TimeAMString) = 0) then\r\n AAmPm := AMPM_AM\r\n else if (CompareText(lAmPmStr, AFormatSettings.TimePMString) = 0) then\r\n AAmPm := AMPM_PM\r\n else if (CompareText(lAmPmStr, 'AM') = 0) then\r\n AAmPm := AMPM_AM\r\n else if (CompareText(lAmPmStr, 'PM') = 0) then\r\n AAmPm := AMPM_PM\r\n else\r\n begin\r\n // Writeln('No timestring ',lAmPmStr);\r\n Exit; // If text does not match any of these, timestring must be wrong;\r\n end;\r\n // if AM/PM is at beginning of string, then a digit is mandatory after it\r\n if (lTimeIndex = tiHour) then\r\n lDigitPending := True\r\n // otherwise, no more ATimeValues allowed after this\r\n else\r\n begin\r\n lTimeIndex := tiMSec + 1;\r\n lDigitPending := False;\r\n end;\r\n end; // AM/PM\r\n Inc(lCur)\r\n end; // while\r\n\r\n // If we arrive here, parsing the elements has been successfull\r\n // if not at least Hours specified then input is not valid\r\n // when am/pm is specified Hour must be <= 12 and not 0\r\n if (lTimeIndex = tiHour) or\r\n ((AAmPm <> AMPM_None) and ((ATimeValues[tiHour] > 12) or\r\n (ATimeValues[tiHour] = 0))) or lDigitPending then\r\n Exit;\r\n Result := True;\r\n end;\r\n\r\nbegin\r\n SetLength(lTimeValues, 4);\r\n lSeparator := AFormatSettings.TimeSeparator;\r\n if lSeparator = #0 then\r\n lSeparator := ':';\r\n lAmPm := AMPM_None;\r\n if not SplitElements(lTimeValues, lAmPm) then\r\n begin\r\n AErrorMsg := Format(SErrInvalidTimeFormat, [AValue]);\r\n Exit;\r\n end;\r\n if (lAmPm = AMPM_PM) and (lTimeValues[tiHour] <> 12) then\r\n Inc(lTimeValues[tiHour], 12)\r\n else if (lAmPm = AMPM_AM) and (lTimeValues[tiHour] = 12) then\r\n lTimeValues[tiHour] := 0;\r\n // Writeln( lTimeValues[tiHour], lTimeValues[tiMin], lTimeValues[tiSec], lTimeValues[tiMSec]);\r\n if not TryEncodeTime(lTimeValues[tiHour], lTimeValues[tiMin], lTimeValues[tiSec],\r\n lTimeValues[tiMSec], Result) then\r\n\r\n AErrorMsg := Format(SErrInvalidTimeFormat, [AValue]);\r\nend;\r\n\r\nfunction TryStrToFloat(const AString: string; out AValue: Extended): Boolean;\r\nbegin\r\n Result := TryStrToFloat(AString, Double(AValue), FormatSettings);\r\nend;\r\n\r\nfunction TryStrToFloat(const AString: string; out AValue: Extended; const AFormatSettings: TFormatSettings): Boolean;\r\nbegin\r\n Result := TryStrToFloat(AString, Double(AValue), AFormatSettings);\r\nend;\r\n\r\nfunction TryStrToFloat(const AString: string; out AValue: Double): Boolean;\r\nbegin\r\n Result := TryStrToFloat(AString, AValue, FormatSettings);\r\nend;\r\n\r\nfunction TryStrToFloat(const AString: string; out AValue: Double; const AFormatSettings: TFormatSettings): Boolean;\r\nconst\r\n cDecSepEN = '.';\r\nvar\r\n lString: string;\r\n lValue: JSValue;\r\nbegin\r\n lString := AString;\r\n if AFormatSettings.ThousandSeparator <> '' then\r\n lString := StringReplace(lString, AFormatSettings.ThousandSeparator, '', [rfReplaceAll]);\r\n if (AFormatSettings.DecimalSeparator <> cDecSepEN) then\r\n lString := StringReplace(lString, AFormatSettings.DecimalSeparator, cDecSepEN, []);\r\n lValue := parseFloat(lString);\r\n Result := not jsIsNaN(lValue);\r\n if Result then\r\n AValue := Double(lValue)\r\n else\r\n AValue := 0;\r\nend;\r\n\r\nfunction TryStrToTime(const AString: string; out AValue: TDateTime): Boolean;\r\nbegin\r\n Result := TryStrToTime(AString, AValue, FormatSettings);\r\nend;\r\n\r\nfunction TryStrToTime(const AString: string; out AValue: TDateTime; const AFormatSettings: TFormatSettings): Boolean;\r\nvar\r\n lMsg: string;\r\nbegin\r\n Result := AString <> '';\r\n if Result then\r\n begin\r\n AValue := IntStrToTime(lMsg, AString, Length(AString), AFormatSettings);\r\n Result := lMsg = '';\r\n end;\r\nend;\r\n\r\nfunction StrToFloat(const AString: string): Double;\r\nbegin\r\n Result := StrToFloat(AString, FormatSettings);\r\nend;\r\n\r\nfunction StrToFloat(const AString: string; const AFormatSettings: TFormatSettings): Double;\r\nbegin\r\n if not TryStrToFloat(AString, Result, AFormatSettings) then\r\n raise EConvertError.CreateFmt(SErrInvalidFloat, [AString]);\r\nend;\r\n\r\nfunction StrToTime(const AString: string): TDateTime;\r\nbegin\r\n Result := StrToTime(AString, FormatSettings);\r\nend;\r\n\r\nfunction StrToTime(const AString: string; const AFormatSettings: TFormatSettings): TDateTime;\r\nvar\r\n lMsg: string;\r\nbegin\r\n Result := IntStrToTime(lMsg, AString, Length(AString), AFormatSettings);\r\n if lMsg <> '' then\r\n raise EConvertError.Create(lMsg);\r\nend;\r\n\r\nfunction StrToTimeDef(const AString: string; const ADefault: TDateTime): TDateTime;\r\nbegin\r\n Result := StrToTimeDef(AString, ADefault, FormatSettings);\r\nend;\r\n\r\nfunction StrToTimeDef(const AString: string; const ADefault: TDateTime; const AFormatSettings: TFormatSettings): TDateTime;\r\nbegin\r\n if not TryStrToTime(AString, Result, FormatSettings) Then\r\n Result := ADefault;\r\nend;\r\n\r\nprocedure UseVariable(const AValue: IInterface);\r\nbegin\r\nend;\r\n\r\nprocedure UseVariable(const AValue: Integer);\r\nbegin\r\nend;\r\n\r\nprocedure UseVariable(const AValue: string);\r\nbegin\r\nend;\r\n\r\n{ TBytesHelper }\r\n\r\nfunction TBytesHelper.Compare(const ARight: TBytes): Integer;\r\nvar\r\n lCount: Integer;\r\nbegin\r\n if Length > ARight.Length then\r\n Exit(GreaterThanValue);\r\n\r\n if Length < ARight.Length then\r\n Exit(LessThanValue);\r\n\r\n Result := EqualsValue;\r\n for lCount := Low to High do\r\n begin\r\n if Self[lCount] > ARight[lCount] then\r\n Exit(GreaterThanValue);\r\n if Self[lCount] < ARight[lCount] then\r\n Exit(LessThanValue);\r\n end;\r\nend;\r\n\r\nfunction TBytesHelper.get_Length: Integer;\r\nbegin\r\n Result := System.Length(Self);\r\nend;\r\n\r\nfunction TBytesHelper.High: Integer;\r\nbegin\r\n Result := System.High(Self);\r\nend;\r\n\r\nfunction TBytesHelper.Low: Integer;\r\nbegin\r\n Result := System.Low(Self);\r\nend;\r\n\r\nprocedure TBytesHelper.set_Length(const AValue: Integer);\r\nbegin\r\n System.SetLength(Self, AValue);\r\nend;\r\n\r\nfunction TBytesHelper.SubBytes(const AStartIndex: Integer): TBytes;\r\nbegin\r\n Result := System.Copy(Self, AStartIndex, Length);\r\nend;\r\n\r\nfunction TBytesHelper.SubBytes(const AStartIndex, ALength: Integer): TBytes;\r\nbegin\r\n Result := System.Copy(Self, AStartIndex, ALength);\r\nend;\r\n\r\n{ TWordsHelper }\r\n\r\nclass function TWordsHelper.FromBytes(const ABytes: TBytes): TWords;\r\nconst\r\n cBytesPerWord = 2;\r\nvar\r\n lCount: Integer;\r\n lLow: Byte;\r\n lHigh: Byte;\r\nbegin\r\n lCount := ABytes.Length;\r\n if Odd(lCount) then\r\n Inc(lCount);\r\n Result.Length := lCount div cBytesPerWord;\r\n\r\n lCount := ABytes.Low;\r\n while lCount <= ABytes.High do\r\n begin\r\n lLow := ABytes[lCount];\r\n if lCount + 1 <= ABytes.High then\r\n lHigh := ABytes[lCount + 1]\r\n else\r\n lHigh := 0;\r\n\r\n Result[lCount div cBytesPerWord] := Word.FromBytes(lLow, lHigh);\r\n Inc(lCount, cBytesPerWord);\r\n end;\r\n\r\nend;\r\n\r\nfunction TWordsHelper.get_Length: Integer;\r\nbegin\r\n Result := System.Length(Self);\r\nend;\r\n\r\nfunction TWordsHelper.High: Integer;\r\nbegin\r\n Result := System.High(Self);\r\nend;\r\n\r\nfunction TWordsHelper.Low: Integer;\r\nbegin\r\n Result := System.Low(Self);\r\nend;\r\n\r\nprocedure TWordsHelper.set_Length(const AValue: Integer);\r\nbegin\r\n System.SetLength(Self, AValue);\r\nend;\r\n\r\nfunction TWordsHelper.ToBytes: TBytes;\r\nconst\r\n cBytesPerWord = 2;\r\nvar\r\n lLow: Byte;\r\n lHigh: Byte;\r\n lCount: Integer;\r\n lNewIndex: Integer;\r\nbegin\r\n Result.Length := Length * cBytesPerWord;\r\n for lCount := Low to High do\r\n begin\r\n Self[lCount].ToBytes(lLow, lHigh);\r\n lNewIndex := lCount * cBytesPerWord;\r\n Result[lNewIndex] := lLow;\r\n Result[lNewIndex + 1] := lHigh;\r\n end;\r\nend;\r\n\r\n{ TCharHelper }\r\n\r\nfunction TCharHelper.IsDigit: Boolean;\r\nconst\r\n cNumChars = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];\r\nbegin\r\n Result := Self in cNumChars;\r\nend;\r\n\r\nfunction TCharHelper.ToOrd: Integer;\r\nbegin\r\n Result := Ord(Self);\r\nend;\r\n\r\nfunction TCharHelper.ToUpper: Char;\r\nbegin\r\n Result := ToUpper(Self);\r\nend;\r\n\r\nclass function TCharHelper.ToUpper(const AValue: Char): Char; assembler;\r\nasm\r\n return AValue.toUpperCase();\r\nend;\r\n\r\n{ TIntegerHelper }\r\n\r\nfunction TIntegerHelper.Equals(const AValue: Integer): Boolean;\r\nbegin\r\n Result := Self = AValue;\r\nend;\r\n\r\nfunction TIntegerHelper.NotEquals(const AValue: Integer): Boolean;\r\nbegin\r\n Result := not Equals(AValue);\r\nend;\r\n\r\nclass function TIntegerHelper.Parse(const AValue: string): Integer;\r\nbegin\r\n Result := StrToInt(AValue);\r\nend;\r\n\r\nfunction TIntegerHelper.ToString: string;\r\nbegin\r\n Result := ToString(Self);\r\nend;\r\n\r\nclass function TIntegerHelper.ToString(const AValue: Integer): string; assembler;\r\nasm\r\n return AValue.toString();\r\nend;\r\n\r\nclass function TIntegerHelper.TryParse(const AString: string; out AValue: Integer): Boolean;\r\nbegin\r\n Result := TryStrToInt(AString, AValue);\r\nend;\r\n\r\n{ TLongIntHelper }\r\n\r\nfunction TLongIntHelper.Equals(const AValue: LongInt): Boolean;\r\nbegin\r\n Result := Self = AValue;\r\nend;\r\n\r\nfunction TLongIntHelper.NotEquals(const AValue: LongInt): Boolean;\r\nbegin\r\n Result := not Equals(AValue);\r\nend;\r\n\r\nclass function TLongIntHelper.Parse(const AValue: string): Integer;\r\nbegin\r\n Result := StrToInt(AValue);\r\nend;\r\n\r\nfunction TLongIntHelper.ToString: string;\r\nbegin\r\n Result := ToString(Self);\r\nend;\r\n\r\nclass function TLongIntHelper.ToString(const AValue: LongInt): string;\r\nasm\r\n return AValue.toString();\r\nend;\r\n\r\nclass function TLongIntHelper.TryParse(const AString: string; out AValue: Integer): Boolean;\r\nbegin\r\n Result := TryStrToInt(AString, AValue);\r\nend;\r\n\r\n{ TWordHelper }\r\n\r\nclass function TWordHelper.FromBytes(const ALow, AHigh: Byte): Word;\r\nconst\r\n cBitPerByte = 8;\r\nbegin\r\n Result := ALow + (AHigh shl cBitPerByte);\r\nend;\r\n\r\nprocedure TWordHelper.ToBytes(out ALow, AHigh: Byte);\r\nconst\r\n cMask: Byte = $FF;\r\n cBitPerByte = 8;\r\nbegin\r\n ALow := Self and cMask;\r\n AHigh := (Self and (cMask shl cBitPerByte)) shr cBitPerByte;\r\nend;\r\n\r\n{ TStringHelper }\r\n\r\nfunction TStringHelper.CompareTo(const AValue: string): Integer;\r\nbegin\r\n Result := CompareTo(Self, AValue);\r\nend;\r\n\r\nclass function TStringHelper.CompareTo(const ALeft, ARight: string): Integer; assembler;\r\nasm\r\n return ALeft.localeCompare(ARight);\r\nend;\r\n\r\nfunction TStringHelper.Contains(const AValue: string): Boolean;\r\nbegin\r\n Result := IndexOf(AValue) >= 0;\r\nend;\r\n\r\nfunction TStringHelper.Equals(const AValue: string): Boolean;\r\nbegin\r\n Result := Self = AValue;\r\nend;\r\n\r\nfunction TStringHelper.FirstChar: Char;\r\nbegin\r\n if NotIsEmpty then\r\n Result := Chars[0]\r\n else\r\n Result := #0;\r\nend;\r\n\r\nfunction TStringHelper.Format(const AArgs: array of JSValue): string;\r\nbegin\r\n Result := SysUtils.Format(Self, AArgs);\r\nend;\r\n\r\nclass function TStringHelper.Format(const AValue: string; const AArgs: array of JSValue): string;\r\nbegin\r\n Result := SysUtils.Format(AValue, AArgs);\r\nend;\r\n\r\nfunction TStringHelper.get_Chars(const AIndex: Integer): Char;\r\nbegin\r\n Result := Self[AIndex + 1];\r\nend;\r\n\r\nfunction TStringHelper.get_Length: Integer;\r\nbegin\r\n Result := System.Length(Self);\r\nend;\r\n\r\nfunction TStringHelper.High: Integer;\r\nbegin\r\n Result := Length - 1;\r\nend;\r\n\r\nfunction TStringHelper.IndexOf(const AValue: Char): Integer;\r\nbegin\r\n Result := Pos(AValue, Self, 1) - 1;\r\nend;\r\n\r\nfunction TStringHelper.IndexOf(const AValue: string; const AStartIndex, ACount: Integer): Integer;\r\nbegin\r\n Result := Pos(AValue, Self, AStartIndex + 1) - 1;\r\n if (Result + AValue.Length) > (AStartIndex + ACount) then\r\n Result := -1;\r\nend;\r\n\r\nfunction TStringHelper.IndexOf(const AValue: string): Integer;\r\nbegin\r\n Result := System.Pos(AValue, Self) - 1;\r\nend;\r\n\r\nfunction TStringHelper.Insert(const AStartIndex: Integer; const AValue: string): string;\r\nbegin\r\n System.Insert(AValue, Self, AStartIndex + 1);\r\n Result := Self;\r\nend;\r\n\r\nfunction TStringHelper.IsEmpty: Boolean;\r\nbegin\r\n Result := Self = Empty;\r\nend;\r\n\r\nfunction TStringHelper.IsNumber: Boolean;\r\nconst\r\n cNumbers = ['0'..'9'];\r\nvar\r\n lCount: Integer;\r\nbegin\r\n if IsEmpty then\r\n Exit(False);\r\n\r\n for lCount := 0 to Length - 1 do\r\n begin\r\n if not (Chars[lCount] in cNumbers) then\r\n Exit(False);\r\n end;\r\n Result := True;\r\nend;\r\n\r\nfunction TStringHelper.LastIndexOf(const AValue: Char): Integer;\r\nbegin\r\n Result := Reverse.IndexOf(AValue);\r\n if Result >= 0 then\r\n Result := Length - Result - 1;\r\nend;\r\n\r\nclass function TStringHelper.Low: Integer;\r\nbegin\r\n Result := 0;\r\nend;\r\n\r\nfunction TStringHelper.NotEquals(const AValue: string): Boolean;\r\nbegin\r\n Result := not Equals(AValue);\r\nend;\r\n\r\nfunction TStringHelper.NotIsEmpty: Boolean;\r\nbegin\r\n Result := Self <> Empty;\r\nend;\r\n\r\nfunction TStringHelper.PadLeft(const ATotalWidth: Integer): string;\r\nconst\r\n cDefPadChar = ' ';\r\nbegin\r\n Result := PadLeft(ATotalWidth, cDefPadChar);\r\nend;\r\n\r\nfunction TStringHelper.PadLeft(ATotalWidth: Integer; const APaddingChar: Char): string;\r\nbegin\r\n ATotalWidth := ATotalWidth - Length;\r\n if ATotalWidth > 0 then\r\n Result := System.StringOfChar(APaddingChar, ATotalWidth) + Self\r\n else\r\n Result := Self;\r\nend;\r\n\r\nfunction TStringHelper.Pos(const ASubStr, AStr: string; const AOffset: Integer): Integer;\r\nasm\r\n return AStr.indexOf(ASubStr, AOffset - 1) + 1;\r\nend;\r\n\r\nfunction TStringHelper.Remove(const AStartIndex: Integer): string;\r\nbegin\r\n Result := Remove(AStartIndex, 1);\r\nend;\r\n\r\nfunction TStringHelper.Remove(const AStartIndex, ACount: Integer): string;\r\nbegin\r\n Result := SubString(0, AStartIndex - 1) + SubString(AStartIndex + ACount);\r\nend;\r\n\r\nfunction TStringHelper.Replace(const AOldValue, ANewValue: string): string;\r\nbegin\r\n Result := SysUtils.StringReplace(Self, AOldValue, ANewValue, [rfReplaceAll]);\r\nend;\r\n\r\nfunction TStringHelper.Reverse: string;\r\nvar\r\n lCount: Integer;\r\nbegin\r\n Result := Empty;\r\n Result.Length := Length;\r\n for lCount := 0 to Length - 1 do\r\n Result.Chars[Length - lCount - 1] := Self.Chars[lCount];\r\nend;\r\n\r\nfunction TStringHelper.Same(const AValue: string): Boolean;\r\nbegin\r\n Result := SysUtils.SameText(Self, AValue);\r\nend;\r\n\r\nprocedure TStringHelper.set_Chars(const AIndex: Integer; const AValue: Char);\r\nbegin\r\n Self[AIndex + 1] := AValue;\r\nend;\r\n\r\nprocedure TStringHelper.set_Length(const AValue: Integer);\r\nbegin\r\n System.SetLength(Self, AValue);\r\nend;\r\n\r\nclass function TStringHelper.StartsText(const ASubText, AText: string): Boolean;\r\nbegin\r\n if ASubText.IsEmpty then\r\n Result := True\r\n else\r\n begin\r\n if AText.Length >= ASubText.Length then\r\n Result := SysUtils.SameText(AText.Substring(0, ASubText.Length), ASubText)\r\n else\r\n Result := False;\r\n end;\r\nend;\r\n\r\nfunction TStringHelper.StartsWith(const AValue: string): Boolean;\r\nbegin\r\n Result := StartsWith(AValue, False);\r\nend;\r\n\r\nfunction TStringHelper.StartsWith(const AValue: string; AIgnoreCase: Boolean): Boolean;\r\nbegin\r\n if AIgnoreCase then\r\n Result := StartsText(AValue, Self)\r\n else\r\n if AValue = Empty then\r\n Result := True\r\n else\r\n begin\r\n if (Self.Length >= AValue.Length) then\r\n Result := Substring(0, AValue.Length).Equals(AValue)\r\n else\r\n Result := False;\r\n end;\r\nend;\r\n\r\nfunction TStringHelper.Substring(const AStartIndex: Integer): string;\r\nbegin\r\n Result := System.Copy(Self, AStartIndex + 1, Self.Length);\r\nend;\r\n\r\nfunction TStringHelper.Substring(const AStartIndex, ALength: Integer): string;\r\nbegin\r\n Result := System.Copy(Self, AStartIndex + 1, ALength);\r\nend;\r\n\r\nfunction TStringHelper.ToLower: string;\r\nvar\r\n lValue: string;\r\nbegin\r\n lValue := Self;\r\n asm\r\n lValue = lValue.toLowerCase();\r\n end;\r\n Result := lValue;\r\nend;\r\n\r\nfunction TStringHelper.ToUpper: string;\r\nvar\r\n lValue: string;\r\nbegin\r\n lValue := Self;\r\n asm\r\n lValue = lValue.toUpperCase();\r\n end;\r\n Result := lValue;\r\nend;\r\n\r\nfunction TStringHelper.Trim: string;\r\nbegin\r\n Result := SysUtils.Trim(Self);\r\nend;\r\n\r\n{ TDateTimeHelper }\r\n\r\nfunction TDateTimeHelper.Equals(const AValue: TDateTime): Boolean;\r\nbegin\r\n Result := SameValue(Self, AValue);\r\nend;\r\n\r\nfunction TDateTimeHelper.NotEquals(const AValue: TDateTime): Boolean;\r\nbegin\r\n Result := not SameValue(Self, AValue);\r\nend;\r\n\r\nfunction TDateTimeHelper.ToString: string;\r\nbegin\r\n Result := DateTimeToStr(Self, FormatSettings);\r\nend;\r\n\r\n{ TFormatSettings }\r\n\r\nclass function TFormatSettings.Create: TFormatSettings;\r\nbegin\r\n Result := Create(GetBrowserLocale);\r\nend;\r\n\r\nclass function TFormatSettings.Create(const ALocale: string): TFormatSettings;\r\nconst\r\n cDateSeps: array of Char = ['/', '.', '-'];\r\n cTimeSeps: array of Char = [':', '.', '-'];\r\n cDecSeps: array of Char = [',', '.'];\r\n cThousandSeps: array of Char = ['.', ','];\r\nvar\r\n lTimeStr: string;\r\n lCount: Integer;\r\n lLoc: string;\r\nbegin\r\n lLoc := Uppercase(ALocale);\r\n if pos('DE-', lLoc) = 1 then\r\n begin\r\n Result.LongDayNames[1] := 'Sonntag';\r\n Result.LongDayNames[2] := 'Montag';\r\n Result.LongDayNames[3] := 'Dienstag';\r\n Result.LongDayNames[4] := 'Mittwoch';\r\n Result.LongDayNames[5] := 'Donnerstag';\r\n Result.LongDayNames[6] := 'Freitag';\r\n Result.LongDayNames[7] := 'Samstag';\r\n Result.ShortDayNames[1] := 'Son';\r\n Result.ShortDayNames[2] := 'Mon';\r\n Result.ShortDayNames[3] := 'Die';\r\n Result.ShortDayNames[4] := 'Mit';\r\n Result.ShortDayNames[5] := 'Don';\r\n Result.ShortDayNames[6] := 'Fre';\r\n Result.ShortDayNames[7] := 'Sam';\r\n Result.ShortMonthNames[1] := 'Jan';\r\n Result.ShortMonthNames[2] := 'Feb';\r\n Result.ShortMonthNames[3] := 'Mär';\r\n Result.ShortMonthNames[4] := 'Apr';\r\n Result.ShortMonthNames[5] := 'Mai';\r\n Result.ShortMonthNames[6] := 'Jun';\r\n Result.ShortMonthNames[7] := 'Jul';\r\n Result.ShortMonthNames[8] := 'Aug';\r\n Result.ShortMonthNames[9] := 'Sep';\r\n Result.ShortMonthNames[10] := 'Okt';\r\n Result.ShortMonthNames[11] := 'Nov';\r\n Result.ShortMonthNames[12] := 'Dez';\r\n Result.LongMonthNames[1] := 'Januar';\r\n Result.LongMonthNames[2] := 'Februar';\r\n Result.LongMonthNames[3] := 'März';\r\n Result.LongMonthNames[4] := 'April';\r\n Result.LongMonthNames[5] := 'Mai';\r\n Result.LongMonthNames[6] := 'Juni';\r\n Result.LongMonthNames[7] := 'Juli';\r\n Result.LongMonthNames[8] := 'August';\r\n Result.LongMonthNames[9] := 'September';\r\n Result.LongMonthNames[10] := 'Oktober';\r\n Result.LongMonthNames[11] := 'November';\r\n Result.LongMonthNames[12] := 'Dezember';\r\n end\r\n else\r\n if pos('FR-', Uppercase(ALocale)) = 1 then\r\n begin\r\n Result.LongDayNames[1] := 'Dimanche';\r\n Result.LongDayNames[2] := 'Lundi';\r\n Result.LongDayNames[3] := 'Mardi';\r\n Result.LongDayNames[4] := 'Mecredi';\r\n Result.LongDayNames[5] := 'Jeudi';\r\n Result.LongDayNames[6] := 'Vendredi';\r\n Result.LongDayNames[7] := 'Samedi';\r\n Result.ShortDayNames[1] := 'Dim';\r\n Result.ShortDayNames[2] := 'Lun';\r\n Result.ShortDayNames[3] := 'Mar';\r\n Result.ShortDayNames[4] := 'Mer';\r\n Result.ShortDayNames[5] := 'Jeu';\r\n Result.ShortDayNames[6] := 'Ven';\r\n Result.ShortDayNames[7] := 'Sam';\r\n\r\n Result.ShortMonthNames[1] := 'Jan';\r\n Result.ShortMonthNames[2] := 'Fév';\r\n Result.ShortMonthNames[3] := 'Mar';\r\n Result.ShortMonthNames[4] := 'Avr';\r\n Result.ShortMonthNames[5] := 'Mai';\r\n Result.ShortMonthNames[6] := 'Jun';\r\n Result.ShortMonthNames[7] := 'Jul';\r\n Result.ShortMonthNames[8] := 'Aoû';\r\n Result.ShortMonthNames[9] := 'Sep';\r\n Result.ShortMonthNames[10] := 'Oct';\r\n Result.ShortMonthNames[11] := 'Nov';\r\n Result.ShortMonthNames[12] := 'Dec';\r\n Result.LongMonthNames[1] := 'Janvier';\r\n Result.LongMonthNames[2] := 'Février';\r\n Result.LongMonthNames[3] := 'Mars';\r\n Result.LongMonthNames[4] := 'Avril';\r\n Result.LongMonthNames[5] := 'Mai';\r\n Result.LongMonthNames[6] := 'Juin';\r\n Result.LongMonthNames[7] := 'Juillet';\r\n Result.LongMonthNames[8] := 'Août';\r\n Result.LongMonthNames[9] := 'Septembre';\r\n Result.LongMonthNames[10] := 'Octobre';\r\n Result.LongMonthNames[11] := 'Novembre';\r\n Result.LongMonthNames[12] := 'Décembre';\r\n end\r\n else\r\n if pos('ES-', Uppercase(ALocale)) = 1 then\r\n begin\r\n Result.LongDayNames[1] := 'Domingo';\r\n Result.LongDayNames[2] := 'Lunes';\r\n Result.LongDayNames[3] := 'Martes';\r\n Result.LongDayNames[4] := 'Miércoles';\r\n Result.LongDayNames[5] := 'Jueves';\r\n Result.LongDayNames[6] := 'Viernes';\r\n Result.LongDayNames[7] := 'Sábado';\r\n Result.ShortDayNames[1] := 'Dom';\r\n Result.ShortDayNames[2] := 'Lun';\r\n Result.ShortDayNames[3] := 'Mar';\r\n Result.ShortDayNames[4] := 'Mié';\r\n Result.ShortDayNames[5] := 'Jue';\r\n Result.ShortDayNames[6] := 'Vie';\r\n Result.ShortDayNames[7] := 'Sab';\r\n\r\n Result.ShortMonthNames[1] := 'Ene';\r\n Result.ShortMonthNames[2] := 'Feb';\r\n Result.ShortMonthNames[3] := 'Mar';\r\n Result.ShortMonthNames[4] := 'Abr';\r\n Result.ShortMonthNames[5] := 'May';\r\n Result.ShortMonthNames[6] := 'Jun';\r\n Result.ShortMonthNames[7] := 'Jul';\r\n Result.ShortMonthNames[8] := 'Ago';\r\n Result.ShortMonthNames[9] := 'Sep';\r\n Result.ShortMonthNames[10] := 'Oct';\r\n Result.ShortMonthNames[11] := 'Nov';\r\n Result.ShortMonthNames[12] := 'Dic';\r\n Result.LongMonthNames[1] := 'January';\r\n Result.LongMonthNames[2] := 'Febrero';\r\n Result.LongMonthNames[3] := 'Marzi';\r\n Result.LongMonthNames[4] := 'Abril';\r\n Result.LongMonthNames[5] := 'Mayo';\r\n Result.LongMonthNames[6] := 'Junio';\r\n Result.LongMonthNames[7] := 'Julio';\r\n Result.LongMonthNames[8] := 'Agusto';\r\n Result.LongMonthNames[9] := 'Septiembre';\r\n Result.LongMonthNames[10] := 'Octubre';\r\n Result.LongMonthNames[11] := 'Noviembre';\r\n Result.LongMonthNames[12] := 'Diciembre';\r\n end\r\n else\r\n begin\r\n Result.LongDayNames[1] := 'Sunday';\r\n Result.LongDayNames[2] := 'Monday';\r\n Result.LongDayNames[3] := 'Tuesday';\r\n Result.LongDayNames[4] := 'Wednesday';\r\n Result.LongDayNames[5] := 'Thursday';\r\n Result.LongDayNames[6] := 'Friday';\r\n Result.LongDayNames[7] := 'Saturday';\r\n Result.ShortDayNames[1] := 'Sun';\r\n Result.ShortDayNames[2] := 'Mon';\r\n Result.ShortDayNames[3] := 'Tue';\r\n Result.ShortDayNames[4] := 'Wed';\r\n Result.ShortDayNames[5] := 'Thu';\r\n Result.ShortDayNames[6] := 'Fri';\r\n Result.ShortDayNames[7] := 'Sat';\r\n Result.ShortMonthNames[1] := 'Jan';\r\n Result.ShortMonthNames[2] := 'Feb';\r\n Result.ShortMonthNames[3] := 'Mar';\r\n Result.ShortMonthNames[4] := 'Apr';\r\n Result.ShortMonthNames[5] := 'May';\r\n Result.ShortMonthNames[6] := 'Jun';\r\n Result.ShortMonthNames[7] := 'Jul';\r\n Result.ShortMonthNames[8] := 'Aug';\r\n Result.ShortMonthNames[9] := 'Sep';\r\n Result.ShortMonthNames[10] := 'Oct';\r\n Result.ShortMonthNames[11] := 'Nov';\r\n Result.ShortMonthNames[12] := 'Dec';\r\n Result.LongMonthNames[1] := 'January';\r\n Result.LongMonthNames[2] := 'February';\r\n Result.LongMonthNames[3] := 'March';\r\n Result.LongMonthNames[4] := 'April';\r\n Result.LongMonthNames[5] := 'May';\r\n Result.LongMonthNames[6] := 'June';\r\n Result.LongMonthNames[7] := 'July';\r\n Result.LongMonthNames[8] := 'August';\r\n Result.LongMonthNames[9] := 'September';\r\n Result.LongMonthNames[10] := 'October';\r\n Result.LongMonthNames[11] := 'November';\r\n Result.LongMonthNames[12] := 'December';\r\n end;\r\n\r\n Result.DateTimeToStrFormat[False] := 'c';\r\n Result.DateTimeToStrFormat[True] := 'f';\r\n Result.DateSeparator := '-';\r\n Result.TimeSeparator := ':';\r\n Result.ShortDateFormat := 'yyyy-mm-dd';\r\n Result.LongDateFormat := 'ddd, yyyy-mm-dd';\r\n Result.DecimalSeparator := '.';\r\n Result.ThousandSeparator := ',';\r\n Result.TimeAMString := 'AM';\r\n Result.TimePMString := 'PM';\r\n Result.TwoDigitYearCenturyWindow := 50;\r\n\r\n Result.ShortTimeFormat := GetLocaleShortTimeFormat(ALocale); // 'hh:nn';\r\n Result.LongTimeFormat := GetLocaleLongTimeFormat(ALocale); // 'hh:nn:ss';\r\n Result.ShortDateFormat := GetLocaleShortDateFormat(ALocale);\r\n\r\n for lCount := Low(cDateSeps) to High(cDateSeps) do\r\n begin\r\n if Result.ShortDateFormat.IndexOf(cDateSeps[lCount]) >= 0 then\r\n Result.DateSeparator := cDateSeps[lCount];\r\n end;\r\n\r\n asm\r\n var lEvent = new Date('Jan 1, 1980 06:07:08 GMT+00:00');\r\n var lLoc = \"\";\r\n if (ALocale == \"\")\r\n lLoc = navigator.language;\r\n else\r\n lLoc = ALocale;\r\n lTimeStr = lEvent.toLocaleTimeString(lLoc);\r\n end;\r\n\r\n for lCount := Low(cTimeSeps) to High(cTimeSeps) do\r\n begin\r\n if lTimeStr.IndexOf(cTimeSeps[lCount]) >= 0 then\r\n Result.TimeSeparator := cTimeSeps[lCount];\r\n end;\r\n\r\n for lCount := Low(Result.ShortDayNames) to High(Result.ShortDayNames) do\r\n Result.ShortDayNames[lCount] := GetLocaleShortDayName(lCount, ALocale);\r\n for lCount := Low(Result.LongDayNames) to High(Result.LongDayNames) do\r\n Result.LongDayNames[lCount] := GetLocaleLongDayName(lCount, ALocale);\r\n\r\n for lCount := Low(Result.ShortMonthNames) to High(Result.ShortMonthNames) do\r\n Result.ShortMonthNames[lCount] := GetLocaleShortMonthName(lCount, ALocale);\r\n for lCount := Low(Result.LongMonthNames) to High(Result.LongMonthNames) do\r\n Result.LongMonthNames[lCount] := GetLocaleLongMonthName(lCount, ALocale);\r\n\r\n Result.DecimalSeparator := GetLocaleDecimalSeparator(ALocale);\r\n\r\n for lCount := Low(cDecSeps) to High(cDecSeps) do\r\n begin\r\n if Result.DecimalSeparator = cDecSeps[lCount] then\r\n begin\r\n Result.ThousandSeparator := cThousandSeps[lCount];\r\n Break;\r\n end;\r\n end;\r\nend;\r\n\r\nclass function TFormatSettings.GetBrowserLocale: string;\r\nasm\r\n return navigator.language;\r\nend;\r\n\r\nclass function TFormatSettings.GetLocaleDecimalSeparator(const ALocale: string): string; assembler;\r\nasm\r\n var lNumber = 1.1;\r\n lNumber = lNumber.toLocaleString(ALocale).substring(1, 2);\r\n return lNumber;\r\nend;\r\n\r\nclass function TFormatSettings.GetLocaleLongDayName(const ADayOfWeek: Integer; const ALocale: string): string; assembler;\r\nasm\r\n var lBaseDate = new Date(2017, 0, 1); // Sunday\r\n lBaseDate.setDate(lBaseDate.getDate() + ADayOfWeek - 1);\r\n return lBaseDate.toLocaleDateString(ALocale, { weekday: 'long' });\r\nend;\r\n\r\nclass function TFormatSettings.GetLocaleLongMonthName(const AMonth: Integer; const ALocale: string): string; assembler;\r\nasm\r\n var lBaseDate = new Date(2017, AMonth - 1, 1);\r\n return lBaseDate.toLocaleDateString(ALocale, { month: 'long' });\r\nend;\r\n\r\nclass function TFormatSettings.GetLocaleLongTimeFormat(ALocale: string): string;\r\nbegin\r\n Result := 'hh:nn:ss';\r\n\r\n if Uppercase(ALocale) = 'EN-US' then\r\n Result := 'hh:nn:ss AMPM';\r\nend;\r\n\r\nclass function TFormatSettings.GetLocaleShortDateFormat(ALocale: string): string;\r\nconst\r\n cDeli = '-';\r\n cShortLength = 2;\r\nvar\r\n lIndex: Integer;\r\n res: string;\r\nbegin\r\n res := string.Empty;\r\n\r\n ALocale := ALocale.ToLower;\r\n\r\n lIndex := ALocale.IndexOf(cDeli);\r\n\r\n if lIndex >= 0 then\r\n // ensure the first part is lowercase, second part is uppercase\r\n ALocale := ALocale.SubString(0, lIndex) + ALocale.SubString(lIndex).ToUpper\r\n else\r\n begin\r\n // when the locale is the main locale specifier only without country\r\n if ALocale.Length = cShortLength then\r\n ALocale := ALocale + cDeli + ALocale.ToUpper;\r\n end;\r\n\r\n asm\r\n var lFormats = {\r\n \"ar-SA\" : \"dd/MM/yy\",\r\n \"bg-BG\" : \"dd.M.yyyy\",\r\n \"ca-ES\" : \"dd/MM/yyyy\",\r\n \"zh-TW\" : \"yyyy/M/d\",\r\n \"cs-CZ\" : \"d.M.yyyy\",\r\n \"da-DK\" : \"dd-MM-yyyy\",\r\n \"de-DE\" : \"dd.MM.yyyy\",\r\n \"el-GR\" : \"d/M/yyyy\",\r\n \"en-US\" : \"M/d/yyyy\",\r\n \"fi-FI\" : \"d.M.yyyy\",\r\n \"fr-FR\" : \"dd/MM/yyyy\",\r\n \"he-IL\" : \"dd/MM/yyyy\",\r\n \"hu-HU\" : \"yyyy. MM. dd.\",\r\n \"is-IS\" : \"d.M.yyyy\",\r\n \"it-IT\" : \"dd/MM/yyyy\",\r\n \"ja-JP\" : \"yyyy/MM/dd\",\r\n \"ko-KR\" : \"yyyy-MM-dd\",\r\n \"nl-NL\" : \"d-M-yyyy\",\r\n \"nb-NO\" : \"dd.MM.yyyy\",\r\n \"pl-PL\" : \"yyyy-MM-dd\",\r\n \"pt-BR\" : \"d/M/yyyy\",\r\n \"ro-RO\" : \"dd.MM.yyyy\",\r\n \"ru-RU\" : \"dd.MM.yyyy\",\r\n \"hr-HR\" : \"d.M.yyyy\",\r\n \"sk-SK\" : \"d. M. yyyy\",\r\n \"sq-AL\" : \"yyyy-MM-dd\",\r\n \"sv-SE\" : \"yyyy-MM-dd\",\r\n \"th-TH\" : \"d/M/yyyy\",\r\n \"tr-TR\" : \"dd.MM.yyyy\",\r\n \"ur-PK\" : \"dd/MM/yyyy\",\r\n \"id-ID\" : \"dd/MM/yyyy\",\r\n \"uk-UA\" : \"dd.MM.yyyy\",\r\n \"be-BY\" : \"dd.MM.yyyy\",\r\n \"sl-SI\" : \"d.M.yyyy\",\r\n \"et-EE\" : \"d.MM.yyyy\",\r\n \"lv-LV\" : \"yyyy.MM.dd.\",\r\n \"lt-LT\" : \"yyyy.MM.dd\",\r\n \"fa-IR\" : \"MM/dd/yyyy\",\r\n \"vi-VN\" : \"dd/MM/yyyy\",\r\n \"hy-AM\" : \"dd.MM.yyyy\",\r\n \"az-Latn-AZ\" : \"dd.MM.yyyy\",\r\n \"eu-ES\" : \"yyyy/MM/dd\",\r\n \"mk-MK\" : \"dd.MM.yyyy\",\r\n \"af-ZA\" : \"yyyy/MM/dd\",\r\n \"ka-GE\" : \"dd.MM.yyyy\",\r\n \"fo-FO\" : \"dd-MM-yyyy\",\r\n \"hi-IN\" : \"dd-MM-yyyy\",\r\n \"ms-MY\" : \"dd/MM/yyyy\",\r\n \"kk-KZ\" : \"dd.MM.yyyy\",\r\n \"ky-KG\" : \"dd.MM.yy\",\r\n \"sw-KE\" : \"M/d/yyyy\",\r\n \"uz-Latn-UZ\" : \"dd/MM yyyy\",\r\n \"tt-RU\" : \"dd.MM.yyyy\",\r\n \"pa-IN\" : \"dd-MM-yy\",\r\n \"gu-IN\" : \"dd-MM-yy\",\r\n \"ta-IN\" : \"dd-MM-yyyy\",\r\n \"te-IN\" : \"dd-MM-yy\",\r\n \"kn-IN\" : \"dd-MM-yy\",\r\n \"mr-IN\" : \"dd-MM-yyyy\",\r\n \"sa-IN\" : \"dd-MM-yyyy\",\r\n \"mn-MN\" : \"yy.MM.dd\",\r\n \"gl-ES\" : \"dd/MM/yy\",\r\n \"kok-IN\" : \"dd-MM-yyyy\",\r\n \"syr-SY\" : \"dd/MM/yyyy\",\r\n \"dv-MV\" : \"dd/MM/yy\",\r\n \"ar-IQ\" : \"dd/MM/yyyy\",\r\n \"zh-CN\" : \"yyyy/M/d\",\r\n \"de-CH\" : \"dd.MM.yyyy\",\r\n \"en-GB\" : \"dd/MM/yyyy\",\r\n \"es-MX\" : \"dd/MM/yyyy\",\r\n \"fr-BE\" : \"d/MM/yyyy\",\r\n \"it-CH\" : \"dd.MM.yyyy\",\r\n \"nl-BE\" : \"d/MM/yyyy\",\r\n \"nn-NO\" : \"dd.MM.yyyy\",\r\n \"pt-PT\" : \"dd-MM-yyyy\",\r\n \"sr-Latn-CS\" : \"d.M.yyyy\",\r\n \"sv-FI\" : \"d.M.yyyy\",\r\n \"az-Cyrl-AZ\" : \"dd.MM.yyyy\",\r\n \"ms-BN\" : \"dd/MM/yyyy\",\r\n \"uz-Cyrl-UZ\" : \"dd.MM.yyyy\",\r\n \"ar-EG\" : \"dd/MM/yyyy\",\r\n \"zh-HK\" : \"d/M/yyyy\",\r\n \"de-AT\" : \"dd.MM.yyyy\",\r\n \"en-AU\" : \"d/MM/yyyy\",\r\n \"es-ES\" : \"dd/MM/yyyy\",\r\n \"fr-CA\" : \"yyyy-MM-dd\",\r\n \"sr-Cyrl-CS\" : \"d.M.yyyy\",\r\n \"ar-LY\" : \"dd/MM/yyyy\",\r\n \"zh-SG\" : \"d/M/yyyy\",\r\n \"de-LU\" : \"dd.MM.yyyy\",\r\n \"en-CA\" : \"dd/MM/yyyy\",\r\n \"es-GT\" : \"dd/MM/yyyy\",\r\n \"fr-CH\" : \"dd.MM.yyyy\",\r\n \"ar-DZ\" : \"dd-MM-yyyy\",\r\n \"zh-MO\" : \"d/M/yyyy\",\r\n \"de-LI\" : \"dd.MM.yyyy\",\r\n \"en-NZ\" : \"d/MM/yyyy\",\r\n \"es-CR\" : \"dd/MM/yyyy\",\r\n \"fr-LU\" : \"dd/MM/yyyy\",\r\n \"ar-MA\" : \"dd-MM-yyyy\",\r\n \"en-IE\" : \"dd/MM/yyyy\",\r\n \"es-PA\" : \"MM/dd/yyyy\",\r\n \"fr-MC\" : \"dd/MM/yyyy\",\r\n \"ar-TN\" : \"dd-MM-yyyy\",\r\n \"en-ZA\" : \"yyyy/MM/dd\",\r\n \"es-DO\" : \"dd/MM/yyyy\",\r\n \"ar-OM\" : \"dd/MM/yyyy\",\r\n \"en-JM\" : \"dd/MM/yyyy\",\r\n \"es-VE\" : \"dd/MM/yyyy\",\r\n \"ar-YE\" : \"dd/MM/yyyy\",\r\n \"en-029\" : \"MM/dd/yyyy\",\r\n \"es-CO\" : \"dd/MM/yyyy\",\r\n \"ar-SY\" : \"dd/MM/yyyy\",\r\n \"en-BZ\" : \"dd/MM/yyyy\",\r\n \"es-PE\" : \"dd/MM/yyyy\",\r\n \"ar-JO\" : \"dd/MM/yyyy\",\r\n \"en-TT\" : \"dd/MM/yyyy\",\r\n \"es-AR\" : \"dd/MM/yyyy\",\r\n \"ar-LB\" : \"dd/MM/yyyy\",\r\n \"en-ZW\" : \"M/d/yyyy\",\r\n \"es-EC\" : \"dd/MM/yyyy\",\r\n \"ar-KW\" : \"dd/MM/yyyy\",\r\n \"en-PH\" : \"M/d/yyyy\",\r\n \"es-CL\" : \"dd-MM-yyyy\",\r\n \"ar-AE\" : \"dd/MM/yyyy\",\r\n \"es-UY\" : \"dd/MM/yyyy\",\r\n \"ar-BH\" : \"dd/MM/yyyy\",\r\n \"es-PY\" : \"dd/MM/yyyy\",\r\n \"ar-QA\" : \"dd/MM/yyyy\",\r\n \"es-BO\" : \"dd/MM/yyyy\",\r\n \"es-SV\" : \"dd/MM/yyyy\",\r\n \"es-HN\" : \"dd/MM/yyyy\",\r\n \"es-NI\" : \"dd/MM/yyyy\",\r\n \"es-PR\" : \"dd/MM/yyyy\",\r\n \"am-ET\" : \"d/M/yyyy\",\r\n \"tzm-Latn-DZ\" : \"dd-MM-yyyy\",\r\n \"iu-Latn-CA\" : \"d/MM/yyyy\",\r\n \"sma-NO\" : \"dd.MM.yyyy\",\r\n \"mn-Mong-CN\" : \"yyyy/M/d\",\r\n \"gd-GB\" : \"dd/MM/yyyy\",\r\n \"en-MY\" : \"d/M/yyyy\",\r\n \"prs-AF\" : \"dd/MM/yy\",\r\n \"bn-BD\" : \"dd-MM-yy\",\r\n \"wo-SN\" : \"dd/MM/yyyy\",\r\n \"rw-RW\" : \"M/d/yyyy\",\r\n \"qut-GT\" : \"dd/MM/yyyy\",\r\n \"sah-RU\" : \"MM.dd.yyyy\",\r\n \"gsw-FR\" : \"dd/MM/yyyy\",\r\n \"co-FR\" : \"dd/MM/yyyy\",\r\n \"oc-FR\" : \"dd/MM/yyyy\",\r\n \"mi-NZ\" : \"dd/MM/yyyy\",\r\n \"ga-IE\" : \"dd/MM/yyyy\",\r\n \"se-SE\" : \"yyyy-MM-dd\",\r\n \"br-FR\" : \"dd/MM/yyyy\",\r\n \"smn-FI\" : \"d.M.yyyy\",\r\n \"moh-CA\" : \"M/d/yyyy\",\r\n \"arn-CL\" : \"dd-MM-yyyy\",\r\n \"ii-CN\" : \"yyyy/M/d\",\r\n \"dsb-DE\" : \"d. M. yyyy\",\r\n \"ig-NG\" : \"d/M/yyyy\",\r\n \"kl-GL\" : \"dd-MM-yyyy\",\r\n \"lb-LU\" : \"dd/MM/yyyy\",\r\n \"ba-RU\" : \"dd.MM.yy\",\r\n \"nso-ZA\" : \"yyyy/MM/dd\",\r\n \"quz-BO\" : \"dd/MM/yyyy\",\r\n \"yo-NG\" : \"d/M/yyyy\",\r\n \"ha-Latn-NG\" : \"d/M/yyyy\",\r\n \"fil-PH\" : \"M/d/yyyy\",\r\n \"ps-AF\" : \"dd/MM/yy\",\r\n \"fy-NL\" : \"d-M-yyyy\",\r\n \"ne-NP\" : \"M/d/yyyy\",\r\n \"se-NO\" : \"dd.MM.yyyy\",\r\n \"iu-Cans-CA\" : \"d/M/yyyy\",\r\n \"sr-Latn-RS\" : \"d.M.yyyy\",\r\n \"si-LK\" : \"yyyy-MM-dd\",\r\n \"sr-Cyrl-RS\" : \"d.M.yyyy\",\r\n \"lo-LA\" : \"dd/MM/yyyy\",\r\n \"km-KH\" : \"yyyy-MM-dd\",\r\n \"cy-GB\" : \"dd/MM/yyyy\",\r\n \"bo-CN\" : \"yyyy/M/d\",\r\n \"sms-FI\" : \"d.M.yyyy\",\r\n \"as-IN\" : \"dd-MM-yyyy\",\r\n \"ml-IN\" : \"dd-MM-yy\",\r\n \"en-IN\" : \"dd-MM-yyyy\",\r\n \"or-IN\" : \"dd-MM-yy\",\r\n \"bn-IN\" : \"dd-MM-yy\",\r\n \"tk-TM\" : \"dd.MM.yy\",\r\n \"bs-Latn-BA\" : \"d.M.yyyy\",\r\n \"mt-MT\" : \"dd/MM/yyyy\",\r\n \"sr-Cyrl-ME\" : \"d.M.yyyy\",\r\n \"se-FI\" : \"d.M.yyyy\",\r\n \"zu-ZA\" : \"yyyy/MM/dd\",\r\n \"xh-ZA\" : \"yyyy/MM/dd\",\r\n \"tn-ZA\" : \"yyyy/MM/dd\",\r\n \"hsb-DE\" : \"d. M. yyyy\",\r\n \"bs-Cyrl-BA\" : \"d.M.yyyy\",\r\n \"tg-Cyrl-TJ\" : \"dd.MM.yy\",\r\n \"sr-Latn-BA\" : \"d.M.yyyy\",\r\n \"smj-NO\" : \"dd.MM.yyyy\",\r\n \"rm-CH\" : \"dd/MM/yyyy\",\r\n \"smj-SE\" : \"yyyy-MM-dd\",\r\n \"quz-EC\" : \"dd/MM/yyyy\",\r\n \"quz-PE\" : \"dd/MM/yyyy\",\r\n \"hr-BA\" : \"d.M.yyyy.\",\r\n \"sr-Latn-ME\" : \"d.M.yyyy\",\r\n \"sma-SE\" : \"yyyy-MM-dd\",\r\n \"en-SG\" : \"d/M/yyyy\",\r\n \"ug-CN\" : \"yyyy-M-d\",\r\n \"sr-Cyrl-BA\" : \"d.M.yyyy\",\r\n \"es-US\" : \"M/d/yyyy\"};\r\n res = lFormats[ALocale] || 'dd/MM/yyyy';\r\n end;\r\n\r\n Result := res;\r\nend;\r\n\r\nclass function TFormatSettings.GetLocaleShortDayName(const ADayOfWeek: Integer; const ALocale: string): string; assembler;\r\nasm\r\n var lBaseDate = new Date(2017, 0, 1); // Sunday\r\n lBaseDate.setDate(lBaseDate.getDate() + ADayOfWeek - 1);\r\n\r\n var lLoc = \"\";\r\n if (ALocale == '')\r\n lLoc = navigator.language\r\n else\r\n lLoc = ALocale;\r\n\r\n return lBaseDate.toLocaleDateString(lLoc, { weekday: 'short' });\r\nend;\r\n\r\nclass function TFormatSettings.GetLocaleShortMonthName(const AMonth: Integer; const ALocale: string): string; assembler;\r\nasm\r\n var lBaseDate = new Date(2017, AMonth - 1, 1);\r\n var lLoc = \"\";\r\n if (ALocale == '')\r\n lLoc = navigator.language\r\n else\r\n lLoc = ALocale;\r\n return lBaseDate.toLocaleDateString(lLoc, { month: 'short' });\r\nend;\r\n\r\nclass function TFormatSettings.GetLocaleShortTimeFormat(\r\n ALocale: string): string;\r\nbegin\r\n Result := 'hh:nn';\r\n\r\n if Uppercase(ALocale) = 'EN-US' then\r\n Result := 'h:nn AMPM';\r\nend;\r\n\r\n{ TFormatDateTimeHelper }\r\n\r\nclass function TFormatDateTimeHelper.FormatDateTime(const AFormatStr: string; const AFormatSettings: TFormatSettings; const ADateTime: TDateTime): string;\r\nvar\r\n lYear: Word;\r\n lMonth: Word;\r\n lDay: Word;\r\n lDayOfWeek: Word;\r\n lHour: Word;\r\n lMinute: Word;\r\n lSecond: Word;\r\n lMilliSecond: Word;\r\nbegin\r\n Result := '';\r\n DecodeDateFully(ADateTime, lYear, lMonth, lDay, lDayOfWeek);\r\n DecodeTime(ADateTime, lHour, lMinute, lSecond, lMilliSecond);\r\n // Writeln(DateTime,'->',lYear,',', lMonth, ',',lDay, ',',lDayOfWeek,',',lHour, ',',lMinute, ',',lSecond, ',',lMilliSecond);\r\n if AFormatStr <> '' then\r\n StoreFormat(Result, lYear, lMonth, lDay, lHour, lMinute, lSecond, lMilliSecond, lDayOfWeek, AFormatStr, AFormatSettings, ADateTime, 0, False)\r\n else\r\n StoreFormat(Result, lYear, lMonth, lDay, lHour, lMinute, lSecond, lMilliSecond, lDayOfWeek, 'C', AFormatSettings, ADateTime, 0, False);\r\nend;\r\n\r\nclass procedure TFormatDateTimeHelper.StoreFormat(var AResult: string; var AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond, ADayOfWeek: Word; const AFormatStr: string; const AFormatSettings: TFormatSettings; const ADateTime: TDateTime; ANesting: Integer; ATimeFlag: Boolean);\r\nconst\r\n cAMPMFormat1 = 'A/P';\r\n cAMPMFormat2 = 'AMPM';\r\n cAMPMFormat3 = 'AM/PM';\r\nvar\r\n lToken: Char;\r\n lLastFormatToken: Char;\r\n lPrevLastToken: Char;\r\n lCount: Integer;\r\n lClock12: Boolean;\r\n lBuffer: Integer;\r\n lIsInterval: Boolean;\r\n lTemp: Integer;\r\n lFormatCurrent: Integer;\r\n lFormatEnd: Integer;\r\nbegin\r\n if ANesting > 1 then // 0 is original string, 1 is included FormatString\r\n Exit;\r\n lFormatCurrent := 1;\r\n lFormatEnd := AFormatStr.Length;\r\n lClock12 := False;\r\n lIsInterval := False;\r\n // look for unquoted 12-hour clock lToken\r\n lTemp := 1;\r\n while lTemp <= lFormatEnd do\r\n begin\r\n lToken := AFormatStr[lTemp];\r\n case lToken of\r\n '''', '\"':\r\n begin\r\n Inc(lTemp);\r\n while (lTemp < lFormatEnd) and (AFormatStr[lTemp] <> lToken) do\r\n Inc(lTemp);\r\n end;\r\n 'A', 'a':\r\n begin\r\n if cAMPMFormat1.Equals(AFormatStr.Substring(lTemp - 1, cAMPMFormat1.Length))\r\n or cAMPMFormat2.Equals(AFormatStr.Substring(lTemp - 1, cAMPMFormat2.Length))\r\n or cAMPMFormat3.Equals(AFormatStr.Substring(lTemp - 1, cAMPMFormat3.Length))then\r\n begin\r\n lClock12 := True;\r\n Break;\r\n end;\r\n end;\r\n end; // case\r\n Inc(lTemp);\r\n end ;\r\n lToken := #255;\r\n lLastFormatToken := ' ';\r\n lPrevLastToken := 'H';\r\n while lFormatCurrent <= lFormatEnd do\r\n begin\r\n lToken := AFormatStr[lFormatCurrent];\r\n lToken := lToken.ToUpper;\r\n // Writeln('Treating token at pos ',lFormatCurrent,', : ',lToken,' (',AFormatStr,')');\r\n lCount := 1;\r\n lTemp := lFormatCurrent + 1;\r\n case lToken of\r\n '''', '\"':\r\n begin\r\n while (lTemp < lFormatEnd) and (AFormatStr[lTemp] <> lToken) do\r\n Inc(lTemp);\r\n Inc(lTemp);\r\n lCount := lTemp - lFormatCurrent;\r\n StoreStr(AResult, AFormatStr, lFormatCurrent + 1, lCount - 2);\r\n end ;\r\n 'A':\r\n begin\r\n if cAMPMFormat2.Equals(AFormatStr.Substring(lFormatCurrent - 1, cAMPMFormat2.Length)) then\r\n begin\r\n lCount := 4;\r\n if AHour < 12 then\r\n StoreString(AResult, AFormatSettings.TimeAMString)\r\n else\r\n StoreString(AResult, AFormatSettings.TimePMString);\r\n end\r\n else if cAMPMFormat3.Equals(AFormatStr.Substring(lFormatCurrent - 1, cAMPMFormat3.Length)) then\r\n begin\r\n lCount := 5;\r\n if AHour < 12 then\r\n StoreStr(AResult, AFormatStr, lFormatCurrent, 2)\r\n else\r\n StoreStr(AResult, AFormatStr, lFormatCurrent + 3, 2);\r\n end\r\n else if cAMPMFormat1.Equals(AFormatStr.Substring(lFormatCurrent - 1, cAMPMFormat1.Length)) then\r\n begin\r\n lCount := 3;\r\n if AHour < 12 then\r\n StoreStr(AResult, AFormatStr, lFormatCurrent, 1)\r\n else\r\n StoreStr(AResult, AFormatStr, lFormatCurrent + 2, 1);\r\n end\r\n else\r\n raise EConvertError.Create('Illegal character in format string');\r\n end ;\r\n '/':\r\n begin\r\n // Writeln('Detected date separator');\r\n StoreString(AResult, AFormatSettings.DateSeparator);\r\n end;\r\n ':': StoreString(AResult, AFormatSettings.TimeSeparator);\r\n ' ', 'C', 'D', 'H', 'M', 'N', 'S', 'T', 'Y', 'Z', 'F' :\r\n begin\r\n // Writeln(lFormatCurrent,' Special Token: ',lToken,', Count: ',lCount,', P: ',lTemp);\r\n while (lTemp <= lFormatEnd) and (AFormatStr.Chars[lTemp - 1].ToUpper = lToken) do\r\n Inc(lTemp);\r\n lCount := lTemp - lFormatCurrent;\r\n // Writeln(lFormatCurrent,' Special Token: ',lToken,', Count: ',lCount,', P: ',lTemp);\r\n case lToken of\r\n ' ': StoreStr(AResult, AFormatStr, lFormatCurrent, lCount);\r\n 'Y': begin\r\n if lCount > 2 then\r\n StoreInt(AResult, AYear, 4)\r\n else\r\n StoreInt(AResult, AYear mod 100, 2);\r\n end;\r\n 'M': begin\r\n if lIsInterval and ((lPrevLastToken = 'H') or ATimeFlag) then\r\n StoreInt(AResult, AMinute + (AHour + Trunc(Abs(ADateTime))*24)*60, 0)\r\n else\r\n if (lLastFormatToken = 'H') or ATimeFlag then\r\n begin\r\n if lCount = 1 then\r\n StoreInt(AResult, AMinute, 0)\r\n else\r\n StoreInt(AResult, AMinute, 2);\r\n end\r\n else\r\n begin\r\n case lCount of\r\n 1: StoreInt(AResult, AMonth, 0);\r\n 2: StoreInt(AResult, AMonth, 2);\r\n 3: StoreString(AResult, AFormatSettings.ShortMonthNames[AMonth]);\r\n else\r\n StoreString(AResult, AFormatSettings.LongMonthNames[AMonth]);\r\n end;\r\n end;\r\n end;\r\n 'D': begin\r\n case lCount of\r\n 1: StoreInt(AResult, ADay, 0);\r\n 2: StoreInt(AResult, ADay, 2);\r\n 3: StoreString(AResult, AFormatSettings.ShortDayNames[ADayOfWeek]);\r\n 4: StoreString(AResult, AFormatSettings.LongDayNames[ADayOfWeek]);\r\n 5: StoreFormat(AResult, AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond, ADayOfWeek, AFormatSettings.ShortDateFormat, AFormatSettings, ADateTime, ANesting + 1, False);\r\n else\r\n StoreFormat(AResult, AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond, ADayOfWeek, AFormatSettings.LongDateFormat, AFormatSettings, ADateTime, ANesting + 1, False);\r\n end ;\r\n end ;\r\n 'H':\r\n if lIsInterval then\r\n StoreInt(AResult, AHour + Trunc(Abs(ADateTime))*24, 0)\r\n else\r\n if lClock12 then\r\n begin\r\n lBuffer := AHour mod 12;\r\n if lBuffer=0 then lBuffer:=12;\r\n if lCount = 1 then\r\n StoreInt(AResult, lBuffer, 0)\r\n else\r\n StoreInt(AResult, lBuffer, 2);\r\n end\r\n else begin\r\n if lCount = 1 then\r\n StoreInt(AResult, AHour, 0)\r\n else\r\n StoreInt(AResult, AHour, 2);\r\n end;\r\n 'N': if lIsInterval then\r\n StoreInt(AResult, AMinute + (AHour + Trunc(Abs(ADateTime))*24)*60, 0)\r\n else\r\n if lCount = 1 then\r\n StoreInt(AResult, AMinute, 0)\r\n else\r\n StoreInt(AResult, AMinute, 2);\r\n 'S': if lIsInterval then\r\n StoreInt(AResult, ASecond + (AMinute + (AHour + Trunc(Abs(ADateTime))*24)*60)*60, 0)\r\n else\r\n if lCount = 1 then\r\n StoreInt(AResult, ASecond, 0)\r\n else\r\n StoreInt(AResult, ASecond, 2);\r\n 'Z': if lCount = 1 then\r\n StoreInt(AResult, AMilliSecond, 0)\r\n else\r\n StoreInt(AResult, AMilliSecond, 3);\r\n 'T': if lCount = 1 then\r\n StoreFormat(AResult, AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond, ADayOfWeek, AFormatSettings.ShortTimeFormat, AFormatSettings, ADateTime, ANesting + 1, True)\r\n else\r\n StoreFormat(AResult, AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond, ADayOfWeek, AFormatSettings.LongTimeFormat, AFormatSettings, ADateTime, ANesting + 1, True);\r\n 'C': begin\r\n StoreFormat(AResult, AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond, ADayOfWeek, AFormatSettings.ShortDateFormat, AFormatSettings, ADateTime, ANesting + 1, False);\r\n if (AHour <> 0) or (AMinute <> 0) or (ASecond <> 0) then\r\n begin\r\n StoreString(AResult, ' ');\r\n StoreFormat(AResult, AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond, ADayOfWeek, AFormatSettings.LongTimeFormat, AFormatSettings, ADateTime, ANesting + 1, True);\r\n end;\r\n end;\r\n 'F': begin\r\n StoreFormat(AResult, AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond, ADayOfWeek, AFormatSettings.ShortDateFormat, AFormatSettings, ADateTime, ANesting + 1, False);\r\n StoreString(AResult, ' ');\r\n StoreFormat(AResult, AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond, ADayOfWeek, AFormatSettings.LongTimeFormat, AFormatSettings, ADateTime, ANesting + 1, True);\r\n end;\r\n end;\r\n lPrevLastToken := lLastFormatToken;\r\n lLastFormatToken := lToken;\r\n end;\r\n else\r\n StoreString(AResult, lToken);\r\n end;\r\n Inc(lFormatCurrent, lCount);\r\n end;\r\nend;\r\n\r\nclass procedure TFormatDateTimeHelper.StoreInt(var AResult: string; const AValue, ADigits: Integer);\r\nconst\r\n cFillChar = '0';\r\nvar\r\n lBuffer: string;\r\nbegin\r\n lBuffer := AValue.ToString;\r\n while (lBuffer.Length < ADigits) do\r\n lBuffer := cFillChar + lBuffer;\r\n StoreString(AResult, lBuffer);\r\nend;\r\n\r\nclass procedure TFormatDateTimeHelper.StoreStr(var AResult: string; const AFormatStr: string; const APos, ALength: Integer);\r\nbegin\r\n AResult := AResult + Copy(AFormatStr, APos, ALength);\r\nend;\r\n\r\nclass procedure TFormatDateTimeHelper.StoreString(var AResult: string; const AString: string);\r\nbegin\r\n AResult := AResult + AString;\r\nend;\r\n\r\n\r\n{ TTMSEncoding }\r\n\r\nfunction TTMSEncoding.GetByteCount(const AChars: string; const ACharCount: Integer): Integer;\r\nbegin\r\n Result := GetByteCount(AChars.Substring(0, ACharCount));\r\nend;\r\n\r\nfunction TTMSEncoding.GetByteCount(const AChars: string; const ACharIndex, ACharCount: Integer): Integer;\r\nbegin\r\n Result := GetByteCount(AChars.Substring(ACharIndex, ACharCount));\r\nend;\r\n\r\nfunction TTMSEncoding.GetBytes(const AChars: string; const ACharCount: Integer): TBytes;\r\nbegin\r\n Result := GetBytes(AChars.Substring(0, ACharCount));\r\nend;\r\n\r\nfunction TTMSEncoding.GetBytes(const AChars: string; const ACharIndex, ACharCount: Integer): TBytes;\r\nbegin\r\n Result := GetBytes(AChars.Substring(ACharIndex, ACharCount));\r\nend;\r\n\r\nfunction TTMSEncoding.GetString(const ABytes: TBytes; const ACharCount: Integer): string;\r\nbegin\r\n Result := GetString(ABytes.SubBytes(0, ACharCount));\r\nend;\r\n\r\nfunction TTMSEncoding.GetString(const ABytes: TBytes; const ACharIndex, ACharCount: Integer): string;\r\nbegin\r\n Result := GetString(ABytes.SubBytes(ACharIndex, ACharCount));\r\nend;\r\n\r\nclass function TTMSEncoding.get_ANSI: TTMSEncoding;\r\nbegin\r\n if FANSI = nil then\r\n FANSI := TANSIEncoding.Create;\r\n Result := FANSI;\r\nend;\r\n\r\nclass function TTMSEncoding.get_Default: TTMSEncoding;\r\nbegin\r\n Result := ANSI;\r\nend;\r\n\r\nclass function TTMSEncoding.get_Unicode: TTMSEncoding;\r\nbegin\r\n if FUnicode = nil then\r\n FUnicode := TUnicodeEncoding.Create;\r\n Result := FUnicode;\r\nend;\r\n\r\nclass function TTMSEncoding.IsStandardEncoding(AEncoding: TTMSEncoding): Boolean;\r\nbegin\r\n Result := (AEncoding <> nil) and ((AEncoding = FANSI) or (AEncoding = FUnicode));\r\nend;\r\n\r\n{ TANSIEncoding }\r\n\r\nfunction TANSIEncoding.GetByteCount(const AChars: string): Integer;\r\nbegin\r\n Result := AChars.Length;\r\nend;\r\n\r\nfunction TANSIEncoding.GetBytes(const AChars: string): TBytes;\r\nbegin\r\n Result := BytesOf(AChars);\r\nend;\r\n\r\nfunction TANSIEncoding.GetString(const ABytes: TBytes): string;\r\nbegin\r\n Result := StringOf(ABytes);\r\nend;\r\n\r\n{ TUnicodeEncoding }\r\n\r\nfunction TUnicodeEncoding.GetByteCount(const AChars: string): Integer;\r\nbegin\r\n Result := Char.Size * AChars.Length;\r\nend;\r\n\r\nfunction TUnicodeEncoding.GetBytes(const AChars: string): TBytes;\r\nbegin\r\n InternalGetBytes(AChars, Result);\r\nend;\r\n\r\nfunction TUnicodeEncoding.GetString(const ABytes: TBytes): string;\r\nvar\r\n lWords: TWords;\r\n lBuffer: string;\r\nbegin\r\n lBuffer := string.Empty;\r\n lWords := TWords.FromBytes(ABytes);\r\n if lWords <> nil then\r\n begin\r\n asm\r\n for (var lCount = 0; lCount < lWords.length; lCount++)\r\n lBuffer += string.fromCharCode(lWords[lCount]);\r\n end;\r\n end;\r\n Result := lBuffer;\r\nend;\r\n\r\nprocedure TUnicodeEncoding.InternalGetBytes(const AChars: string; out ABytes: TBytes);\r\nvar\r\n lWords: TWords;\r\nbegin\r\n lWords := nil;\r\n asm\r\n for (var lCount = 0; lCount < AChars.length; lCount++)\r\n lWords.push(AChars.charCodeAt(lCount));\r\n end;\r\n ABytes := lWords.ToBytes;\r\nend;\r\n\r\n{ TStreamHelper }\r\n\r\nfunction TStreamHelper.CopyFrom(const ASource: TStream; ACount: Int64): Int64;\r\nconst\r\n MaxBufSize = $F000;\r\nvar\r\n lBufSize: Integer;\r\n lCount: Integer;\r\n lBuffer: TBytes;\r\nbegin\r\n if ACount <= 0 then\r\n begin\r\n ASource.Position := 0;\r\n ACount := ASource.Size;\r\n end;\r\n Result := ACount;\r\n if ACount > MaxBufSize then\r\n lBufSize := MaxBufSize\r\n else\r\n lBufSize := ACount;\r\n lBuffer.Length := lBufSize;\r\n try\r\n while ACount <> 0 do\r\n begin\r\n if ACount > lBufSize then\r\n lCount := lBufSize\r\n else\r\n lCount := ACount;\r\n ASource.ReadBuffer(lBuffer, lCount);\r\n WriteBuffer(lBuffer, lCount);\r\n Dec(ACount, lCount);\r\n end;\r\n finally\r\n lBuffer.Length := 0;\r\n end;\r\nend;\r\n\r\n{ TTMSStringStream }\r\n\r\nconstructor TTMSStringStream.Create;\r\nbegin\r\n Create(string.Empty, TTMSEncoding.Default, False);\r\nend;\r\n\r\nconstructor TTMSStringStream.Create(const AString: string);\r\nbegin\r\n Create(AString, TTMSEncoding.Default, False);\r\nend;\r\n\r\nconstructor TTMSStringStream.Create(const AString: string; AEncoding: TTMSEncoding; AOwnsEncoding: Boolean);\r\nvar\r\n lBytes: TBytes;\r\nbegin\r\n inherited Create;\r\n FEncoding := AEncoding;\r\n FOwnsEncoding := AOwnsEncoding and not TTMSEncoding.IsStandardEncoding(AEncoding);\r\n lBytes := FEncoding.GetBytes(AString);\r\n SetPointer(BytesToMemory(lBytes), lBytes.Length);\r\nend;\r\n\r\ndestructor TTMSStringStream.Destroy;\r\nbegin\r\n if FOwnsEncoding then\r\n FEncoding.Free;\r\n inherited Destroy;\r\nend;\r\n\r\nfunction TTMSStringStream.GetDataString: string;\r\nbegin\r\n Result := FEncoding.GetString(Copy(Bytes, 0, Size));\r\nend;\r\n\r\nprocedure TTMSStringStream.LoadFromFile(const AFileName: string);\r\nconst\r\n cStatusOK = 200;\r\nvar\r\n lStatus: Integer;\r\n lResponse: string;\r\nbegin\r\n lResponse := string.Empty;\r\n lStatus := cStatusOK;\r\n asm\r\n var lRequest = new XMLHttpRequest();\r\n lRequest.open(\"GET\", AFileName, false);\r\n lRequest.send();\r\n\r\n if (lRequest.status == cStatusOK)\r\n lResponse = lRequest.responseText\r\n else\r\n lStatus = lRequest.status;\r\n end;\r\n\r\n if lStatus <> cStatusOK then\r\n raise EStringStreamError.CreateFmt(SCannotGetFile, [AFileName, lStatus]);\r\n WriteString(lResponse);\r\nend;\r\n\r\nprocedure TTMSStringStream.LoadFromFile(const AFileName: string; const ALoaded: TProc);\r\nbegin\r\n LoadFromFile(AFileName, ALoaded, nil);\r\nend;\r\n\r\nprocedure TTMSStringStream.LoadFromFile(const AFileName: string; const ALoaded: TProc; const AError: TProcString);\r\nconst\r\n cAbortMethod = 'abort';\r\n cErrorMethod = 'error';\r\n cGetMethod = 'GET';\r\n cLoadMethod = 'load';\r\nbegin\r\n FLoaded := ALoaded;\r\n FError := AError;\r\n FFileName := AFileName;\r\n FRequest := TJSXMLHttpRequest.New;\r\n FRequest.AddEventListener(cAbortMethod, @OnAbort);\r\n FRequest.AddEventListener(cErrorMethod, @OnError);\r\n FRequest.AddEventListener(cLoadMethod, @OnLoad);\r\n try\r\n FRequest.Open(cGetMethod, AFileName, True);\r\n FRequest.Send;\r\n except\r\n on E: Exception do\r\n begin\r\n if Assigned(AError) then\r\n AError(E.Message)\r\n else\r\n raise;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSStringStream.InternalLoadFromFileP(const AFileName: string): TJSPromise;\r\nbegin\r\n Result := TJSPromise.New(\r\n procedure(AResolve, AReject : TJSPromiseResolver)\r\n begin\r\n LoadFromFile(AFileName,\r\n procedure()\r\n begin\r\n AResolve(True);\r\n end,\r\n procedure(const AError: string)\r\n begin\r\n AReject(AError);\r\n end);\r\n end);\r\nend;\r\n\r\nfunction TTMSStringStream.LoadFromFileP(const AFileName: string): Boolean; async;\r\nbegin\r\n Result := await(Boolean, InternalLoadFromFileP(AFileName));\r\nend;\r\n\r\nfunction TTMSStringStream.OnAbort(AEvent: TEventListenerEvent): Boolean;\r\nbegin\r\n Result := True;\r\n if Assigned(FError) then\r\n FError(Format(SLoadFromFileAborted, [FFileName]));\r\nend;\r\n\r\nfunction TTMSStringStream.OnError(AEvent: TEventListenerEvent): Boolean;\r\nbegin\r\n Result := True;\r\n if Assigned(FError) then\r\n FError(Format(SErrorLoadFromFile, [FFileName]));\r\nend;\r\n\r\nfunction TTMSStringStream.OnLoad(AEvent: TEventListenerEvent): Boolean;\r\nconst\r\n cStatusOK = 200;\r\n cStatusLastOK = 208;\r\nvar\r\n lReq: TJSXMLHttpRequest;\r\nbegin\r\n lReq := TJSXMLHttpRequest(AEvent.target);\r\n\r\n if (lReq.Status < cStatusOK) or (lReq.Status > cStatusLastOK) then\r\n begin\r\n if Assigned(FError) then\r\n begin\r\n FError(Format(SCannotGetFile, [FFileName, FRequest.Status]));\r\n Exit;\r\n end\r\n else\r\n raise EStringStreamError.CreateFmt(SCannotGetFile, [FFileName, lReq.Status]);\r\n end;\r\n WriteString(lReq.ResponseText);\r\n Result := True;\r\n if Assigned(FLoaded) then\r\n FLoaded();\r\nend;\r\n\r\nfunction TTMSStringStream.ReadString(ACount: Integer): string;\r\nvar\r\n lBytes: TBytes;\r\n lDest: TBytes;\r\n lCount: Integer;\r\nbegin\r\n if ACount > Size - Position then\r\n ACount := Size - Position;\r\n\r\n lDest.Length := ACount;\r\n lBytes := Bytes;\r\n for lCount := Position to ACount + Position - 1 do\r\n lDest[lCount - Position] := lBytes[lCount];\r\n\r\n Result := FEncoding.GetString(lDest);\r\n Position := Position + ACount;\r\nend;\r\n\r\nprocedure TTMSStringStream.WriteString(const AString: string);\r\nvar\r\n lBytes: TBytes;\r\n lData: string;\r\nbegin\r\n lBytes := FEncoding.GetBytes(AString);\r\n Write(lBytes, 0, lBytes.Length);\r\n\r\n lData := DataString;\r\n if lData <> AString then\r\n WriteString(''); \r\nend;\r\n\r\n{ TInterfaceList }\r\n\r\nconstructor TInterfaceList.Create;\r\nbegin\r\n inherited Create;\r\n FList := TFPList.Create;\r\nend;\r\n\r\ndestructor TInterfaceList.Destroy;\r\nbegin\r\n Clear;\r\n FList.Free;\r\n inherited Destroy;\r\nend;\r\n\r\nfunction TInterfaceList.Add(const AItem: IInterface): Integer;\r\nbegin\r\n Result := FList.Add(nil);\r\n Items[Result] := AItem;\r\nend;\r\n\r\nprocedure TInterfaceList.Clear;\r\nvar\r\n lCount: Integer;\r\nbegin\r\n for lCount := 0 to FList.Count - 1 do\r\n Items[lCount] := nil;\r\n FList.Clear;\r\nend;\r\n\r\nprocedure TInterfaceList.Delete(const AIndex: Integer);\r\nbegin\r\n Items[AIndex] := nil;\r\n FList.Delete(AIndex);\r\nend;\r\n\r\nprocedure TInterfaceList.Exchange(const AIndex1, AIndex2: Integer);\r\nbegin\r\n FList.Exchange(AIndex1, AIndex2);\r\nend;\r\n\r\nfunction TInterfaceList.Expand: TInterfaceList;\r\nbegin\r\n FList.Expand;\r\n Result := Self;\r\nend;\r\n\r\nfunction TInterfaceList.First: IInterface;\r\nbegin\r\n Result := Items[0];\r\nend;\r\n\r\nfunction TInterfaceList.GetEnumerator: TInterfaceListEnumerator;\r\nbegin\r\n Result := TInterfaceListEnumerator.Create(Self);\r\nend;\r\n\r\nfunction TInterfaceList.get_Capacity: Integer;\r\nbegin\r\n Result := FList.Capacity;\r\nend;\r\n\r\nfunction TInterfaceList.get_Count: Integer;\r\nbegin\r\n Result := FList.Count;\r\nend;\r\n\r\nfunction TInterfaceList.get_Items(const AIndex: Integer): IInterface;\r\nbegin\r\n Result := IInterface(FList[AIndex]);\r\nend;\r\n\r\nfunction TInterfaceList.IndexOf(const AItem: IInterface): Integer;\r\nbegin\r\n Result := IndexOfItem(AItem, TDirection.FromBeginning);\r\nend;\r\n\r\nfunction TInterfaceList.IndexOfItem(const AItem: IInterface; const ADirection: TDirection): Integer;\r\nbegin\r\n Result := FList.IndexOfItem(AItem, ADirection);\r\nend;\r\n\r\nprocedure TInterfaceList.Insert(const AIndex: Integer; const AItem: IInterface);\r\nbegin\r\n FList.Insert(AIndex, nil);\r\n Items[AIndex] := AItem;\r\nend;\r\n\r\nfunction TInterfaceList.Last: IInterface;\r\nbegin\r\n Result := Items[Count - 1];\r\nend;\r\n\r\nprocedure TInterfaceList.Lock;\r\nbegin\r\nend;\r\n\r\nfunction TInterfaceList.Remove(const AItem: IInterface): Integer;\r\nbegin\r\n Result := RemoveItem(AItem, TDirection.FromBeginning);\r\nend;\r\n\r\nfunction TInterfaceList.RemoveItem(const AItem: IInterface; const ADirection: TDirection): Integer;\r\nbegin\r\n Result := FList.IndexOfItem(AItem, ADirection);\r\n if Result > -1 then\r\n Delete(Result);\r\nend;\r\n\r\nprocedure TInterfaceList.set_Capacity(const AValue: Integer);\r\nbegin\r\n FList.Capacity := AValue;\r\nend;\r\n\r\nprocedure TInterfaceList.set_Count(const AValue: Integer);\r\nbegin\r\n FList.Count := AValue;\r\nend;\r\n\r\nprocedure TInterfaceList.set_Items(const AIndex: Integer; const AItem: IInterface);\r\nbegin\r\n if FList[AIndex] <> nil then\r\n IInterface(FList[AIndex])._Release;\r\n FList[AIndex] := AItem;\r\n if AItem <> nil then\r\n AItem._AddRef;\r\nend;\r\n\r\nfunction InternalCompare(AItem1, AItem2: JSValue): Integer;\r\nbegin\r\n Result := FCompare(IInterface(AItem1), IInterface(AItem2));\r\nend;\r\n\r\nprocedure TInterfaceList.Sort(const ACompare: TCompareItems);\r\nbegin\r\n FCompare := ACompare;\r\n try\r\n FList.Sort(@InternalCompare);\r\n finally\r\n FCompare := nil;\r\n end;\r\nend;\r\n\r\nprocedure TInterfaceList.Unlock;\r\nbegin\r\nend;\r\n\r\n{ TInterfaceListEnumerator }\r\n\r\nconstructor TInterfaceListEnumerator.Create(const AInterfaceList: TInterfaceList);\r\nbegin\r\n inherited Create;\r\n FIndex := -1;\r\n FInterfaceList := AInterfaceList;\r\nend;\r\n\r\nfunction TInterfaceListEnumerator.get_Current: IInterface;\r\nbegin\r\n Result := FInterfaceList[FIndex];\r\nend;\r\n\r\nfunction TInterfaceListEnumerator.MoveNext: Boolean;\r\nbegin\r\n Result := FIndex < FInterfaceList.Count - 1;\r\n if Result then\r\n Inc(FIndex);\r\nend;\r\n\r\n{ TPath }\r\n\r\nclass function TPath.Combine(const APath1, APath2: string): string;\r\nbegin\r\n if APath1.NotIsEmpty and (APath1.Chars[APath1.Length - 1] <> PathDelim) then\r\n Result := APath1 + PathDelim + APath2\r\n else\r\n Result := APath1 + APath2;\r\nend;\r\n\r\nclass function TPath.GetDirectoryName(const AFileName: string): string;\r\nvar\r\n lIndex: Integer;\r\nbegin\r\n lIndex := AFileName.LastIndexOf(PathDelim);\r\n if lIndex >= 0 then\r\n Result := AFileName.SubString(0, lIndex)\r\n else\r\n Result := AFileName;\r\nend;\r\n\r\nclass function TPath.GetExtension(const AFileName: string): string;\r\nconst\r\n cSeparator = '.';\r\nvar\r\n lIndex: Integer;\r\nbegin\r\n Result := string.Empty;\r\n if AFileName.NotIsEmpty then\r\n begin\r\n lIndex := AFileName.LastIndexOf(cSeparator);\r\n if lIndex >= 0 then\r\n Result := AFileName.SubString(lIndex);\r\n end;\r\nend;\r\n\r\n{ TDirectory }\r\n\r\nclass function TDirectory.GetCurrentDirectory: string;\r\nbegin\r\n Result := TPath.GetDirectoryName(window.document.location.href);\r\nend;\r\n\r\n{ TStringBuilder }\r\n\r\nconstructor TStringBuilder.Create(const AValue: string);\r\nbegin\r\n inherited Create;\r\n FData := AValue;\r\nend;\r\n\r\nfunction TStringBuilder.Append(const AValue: Integer): TStringBuilder;\r\nbegin\r\n Result := Append(AValue.ToString);\r\nend;\r\n\r\nfunction TStringBuilder.Append(const AValue: string): TStringBuilder;\r\nbegin\r\n FData := FData + AValue;\r\n Result := Self;\r\nend;\r\n\r\nfunction TStringBuilder.get_Length: Integer;\r\nbegin\r\n Result := FData.Length;\r\nend;\r\n\r\nfunction TStringBuilder.Insert(const AIndex, AValue: Integer): TStringBuilder;\r\nbegin\r\n Result := Insert(AIndex, AValue.ToString);\r\nend;\r\n\r\nfunction TStringBuilder.Insert(const AIndex: Integer; const AValue: string): TStringBuilder;\r\nbegin\r\n FData.Insert(AIndex, AValue);\r\n Result := Self;\r\nend;\r\n\r\nprocedure TStringBuilder.set_Length(const AValue: Integer);\r\nbegin\r\n FData.Length := AValue;\r\nend;\r\n\r\nfunction TStringBuilder.ToString: string;\r\nbegin\r\n Result := FData;\r\nend;\r\n\r\n\r\nfunction ReplaceDecimalSep(AValue: string; const ADS: string): string;\r\nvar\r\n lPos: Integer;\r\nbegin\r\n lPos := Pos('.', AValue);\r\n if lPos > 0 then\r\n Result := Copy(AValue, 1, lPos - 1) + ADS + Copy(AValue, lPos + 1, Length(AValue) - lPos)\r\n else\r\n Result := AValue;\r\nend;\r\n\r\nfunction FormatGeneralFloat(const AValue: Double; APrecision: Integer; const ADS: string): string;\r\nvar\r\n lP: Integer;\r\n lPE: Integer;\r\n lQ: Integer;\r\n lExponent: Integer;\r\nbegin\r\n if (APrecision = -1) or (APrecision > MaxDigits) then\r\n APrecision := MaxDigits;\r\n { First convert to scientific format, with correct APrecision }\r\n Str(AValue: APrecision + 7, Result);\r\n { Delete leading spaces }\r\n Result := TrimLeft(Result);\r\n lP := Pos('.', Result);\r\n if lP = 0 then\r\n Exit;\r\n { Consider removing lExponent }\r\n lPE := Pos('E', Result);\r\n if lPE = 0 then\r\n Exit(ReplaceDecimalSep(Result, ADS));\r\n { Read lExponent }\r\n lQ := lPE + 2;\r\n lExponent := 0;\r\n while (lQ <= Length(Result)) do\r\n begin\r\n lExponent := lExponent * 10 + Ord(Result[lQ]) - Ord('0');\r\n Inc(lQ);\r\n end;\r\n if Result[lPE + 1] = '-' then\r\n lExponent := -lExponent;\r\n if (lP + lExponent < lPE) and (lExponent > -6) then\r\n begin\r\n { OK to remove lExponent }\r\n SetLength(Result, lPE - 1); { Trim lExponent }\r\n if lExponent >= 0 then\r\n begin\r\n { Shift point to right }\r\n for lQ := 0 to lExponent - 1 do\r\n begin\r\n Result[lP] := Result[lP + 1];\r\n Inc(lP);\r\n end;\r\n Result[lP] := '.';\r\n lP := 1;\r\n if Result[lP] = '-' then\r\n Inc(lP);\r\n while (Result[lP] = '0') and (lP < Length(Result)) and\r\n (Copy(Result, lP + 1, Length(ADS)) <> ADS) do\r\n { Trim leading zeros; conversion above should not give any, but occasionally does\r\n because of rounding }\r\n System.Delete(Result, lP, 1);\r\n end\r\n else\r\n begin\r\n { Add zeros at start }\r\n Insert(Copy('00000', 1, -lExponent), Result, lP - 1);\r\n Result[lP - lExponent] := Result[lP - lExponent - 1];\r\n { Copy leading digit }\r\n Result[lP] := '.';\r\n if lExponent <> -1 then\r\n Result[lP - lExponent - 1] := '0';\r\n end;\r\n { Remove trailing zeros }\r\n lQ := Length(Result);\r\n while (lQ > 0) and (Result[lQ] = '0') do\r\n Dec(lQ);\r\n if Result[lQ] = '.' then\r\n Dec(lQ); { Remove trailing decimal point }\r\n if (lQ = 0) or ((lQ = 1) and (Result[1] = '-')) then\r\n Result := '0'\r\n else\r\n SetLength(Result, lQ);\r\n end\r\n else\r\n begin\r\n { Need lExponent, but remove superfluous characters }\r\n { Delete trailing zeros }\r\n while Result[lPE - 1] = '0' do\r\n begin\r\n System.Delete(Result, lPE - 1, 1);\r\n Dec(lPE);\r\n end;\r\n { If number ends in decimal point, remove it }\r\n if Result[lPE - 1] = ADS then\r\n begin\r\n System.Delete(Result, lPE - 1, 1);\r\n Dec(lPE);\r\n end;\r\n { delete superfluous + in lExponent }\r\n if Result[lPE + 1] = '+' then\r\n System.Delete(Result, lPE + 1, 1)\r\n else\r\n Inc(lPE);\r\n while Result[lPE + 1] = '0' do\r\n { Delete leading zeros in lExponent }\r\n System.Delete(Result, lPE + 1, 1)\r\n end;\r\n Result := ReplaceDecimalSep(Result, ADS)\r\nend;\r\n\r\nfunction FormatExponentFloat(AValue: Double; APrecision, ADigits: Integer; ADS: string; const AFormatSettings: TFormatSettings): string;\r\nvar\r\n lPos: Integer;\r\nbegin\r\n ADS := AFormatSettings.DecimalSeparator;\r\n if (APrecision = -1) or (APrecision > MaxDigits) then\r\n APrecision := MaxDigits;\r\n Str(AValue: APrecision + 7, Result);\r\n { Delete leading spaces }\r\n while Result[1] = ' ' do\r\n System.Delete(Result, 1, 1);\r\n lPos := Pos('E', Result);\r\n if lPos = 0 then\r\n Exit(ReplaceDecimalSep(Result, ADS));\r\n Inc(lPos, 2);\r\n if ADigits > 4 then\r\n ADigits := 4;\r\n ADigits := Length(Result) - lPos - ADigits + 1;\r\n if ADigits < 0 then\r\n Insert(copy('0000', 1, -ADigits), Result, lPos)\r\n else\r\n while (ADigits > 0) and (Result[lPos] = '0') do\r\n begin\r\n System.Delete(Result, lPos, 1);\r\n if lPos > Length(Result) then\r\n begin\r\n System.Delete(Result, lPos - 2, 2);\r\n Break;\r\n end;\r\n Dec(ADigits);\r\n end;\r\n Result := ReplaceDecimalSep(Result, ADS);\r\nend;\r\n\r\nfunction FormatFixedFloat(const AValue: Double; ADigits: Integer; ADS: string): string;\r\n\r\nbegin\r\n if ADigits = -1 Then\r\n ADigits := 2\r\n else if ADigits > 18 then\r\n ADigits := 18;\r\n Str(AValue:0:ADigits, Result);\r\n if (Result <> '') and (Result[1] = ' ') then\r\n Delete(Result,1,1);\r\n Result := ReplaceDecimalSep(Result,ADS);\r\nend;\r\n\r\nfunction FormatNumberFloat(const AValue: Double; ADigits: Integer; const ADS, ATS: string): string;\r\nvar\r\n lPos: Integer;\r\nbegin\r\n if ADigits = -1 then\r\n ADigits := 2\r\n else if ADigits > MaxDigits then\r\n ADigits := MaxDigits;\r\n Str(AValue: 0: ADigits, Result);\r\n if (Result <> '') and (Result[1] = ' ') then\r\n Delete(Result, 1, 1);\r\n lPos := Pos('.', Result);\r\n if lPos <= 0 then\r\n lPos := Length(Result) + 1;\r\n\r\n Result := ReplaceDecimalSep(Result, ADS);\r\n Dec(lPos, 3);\r\n if (ATS <> '') and (ATS <> #0) then\r\n begin\r\n while (lPos > 1) do\r\n begin\r\n if (Result[lPos - 1] <> '-') then\r\n Insert(ATS, Result, lPos);\r\n Dec(lPos, 3);\r\n end;\r\n end;\r\nend;\r\n\r\nfunction RemoveLeadingNegativeSign(var AValue: string; const ADS: string; const AFormatSettings: TFormatSettings): Boolean;\r\nvar\r\n lCount: PtrInt;\r\n lTS: string;\r\n lStartPos: PtrInt;\r\nbegin\r\n Result := False;\r\n lStartPos := 2;\r\n lTS := AFormatSettings.ThousandSeparator;\r\n for lCount := lStartPos to Length(AValue) do\r\n begin\r\n Result := (AValue[lCount] in ['0', ADS, 'E', '+']) or (AValue[lCount] = lTS);\r\n if not Result then\r\n Break;\r\n end;\r\n if Result and (AValue[1] = '-') then\r\n Delete(AValue, 1, 1);\r\nend;\r\n\r\n\r\nfunction FormatNumberCurrency(const AValue: Currency; ADigits: Integer; const ADS, ATS: string; const AFormatSettings: TFormatSettings): string;\r\nvar\r\n lNegative: Boolean;\r\n lPos: Integer;\r\nbegin\r\n if ADigits = -1 then\r\n ADigits := AFormatSettings.CurrencyDecimals\r\n else if ADigits > 18 then\r\n ADigits := 18;\r\n Str(AValue: 0: ADigits, Result);\r\n lNegative := Result[1] = '-';\r\n if lNegative then\r\n System.Delete(Result, 1, 1);\r\n lPos := Pos('.', Result);\r\n if ATS <> '' then\r\n begin\r\n if lPos <> 0 then\r\n Result := ReplaceDecimalSep(Result, ADS)\r\n else\r\n lPos := Length(Result) + 1;\r\n Dec(lPos, 3);\r\n while (lPos > 1) do\r\n begin\r\n Insert(ATS, Result, lPos);\r\n Dec(lPos, 3);\r\n end;\r\n end;\r\n if lNegative then\r\n RemoveLeadingNegativeSign(Result, ADS, AFormatSettings);\r\n if not lNegative then\r\n case AFormatSettings.CurrencyFormat of\r\n 0:\r\n Result := AFormatSettings.CurrencyString + Result;\r\n 1:\r\n Result := Result + AFormatSettings.CurrencyString;\r\n 2:\r\n Result := AFormatSettings.CurrencyString + ' ' + Result;\r\n 3:\r\n Result := Result + ' ' + AFormatSettings.CurrencyString;\r\n end\r\n else\r\n case AFormatSettings.NegCurrFormat of\r\n 0:\r\n Result := '(' + AFormatSettings.CurrencyString + Result + ')';\r\n 1:\r\n Result := '-' + AFormatSettings.CurrencyString + Result;\r\n 2:\r\n Result := AFormatSettings.CurrencyString + '-' + Result;\r\n 3:\r\n Result := AFormatSettings.CurrencyString + Result + '-';\r\n 4:\r\n Result := '(' + Result + AFormatSettings.CurrencyString + ')';\r\n 5:\r\n Result := '-' + Result + AFormatSettings.CurrencyString;\r\n 6:\r\n Result := Result + '-' + AFormatSettings.CurrencyString;\r\n 7:\r\n Result := Result + AFormatSettings.CurrencyString + '-';\r\n 8:\r\n Result := '-' + Result + ' ' + AFormatSettings.CurrencyString;\r\n 9:\r\n Result := '-' + AFormatSettings.CurrencyString + ' ' + Result;\r\n 10:\r\n Result := Result + ' ' + AFormatSettings.CurrencyString + '-';\r\n 11:\r\n Result := AFormatSettings.CurrencyString + ' ' + Result + '-';\r\n 12:\r\n Result := AFormatSettings.CurrencyString + ' ' + '-' + Result;\r\n 13:\r\n Result := Result + '-' + ' ' + AFormatSettings.CurrencyString;\r\n 14:\r\n Result := '(' + AFormatSettings.CurrencyString + ' ' + Result + ')';\r\n 15:\r\n Result := '(' + Result + ' ' + AFormatSettings.CurrencyString + ')';\r\n end;\r\nend;\r\n\r\nfunction FloatToStrF(const AValue: Double; const AFormat: TFloatFormat; const APrecision, ADigits: Integer): string;\r\nbegin\r\n Result := FloatToStrF(AValue, AFormat, APrecision, ADigits, FormatSettings);\r\nend;\r\n\r\nfunction FloatToStrF(const AValue: Double; const AFormat: TFloatFormat; const APrecision, ADigits: Integer; const AFormatSettings: TFormatSettings): string;\r\nconst\r\n cMinLength = 1;\r\n cMinus = '-';\r\nvar\r\n lDecimalSeperator: string;\r\nbegin\r\n lDecimalSeperator := AFormatSettings.DecimalSeparator;\r\n case AFormat of\r\n ffGeneral: Result := FormatGeneralFloat(AValue, APrecision, lDecimalSeperator);\r\n ffExponent: Result := FormatExponentFloat(AValue, APrecision, ADigits, lDecimalSeperator, AFormatSettings);\r\n ffFixed: Result := FormatFixedFloat(AValue, ADigits, lDecimalSeperator);\r\n ffNumber: Result := FormatNumberFloat(AValue, ADigits, lDecimalSeperator, AFormatSettings.ThousandSeparator);\r\n ffCurrency: Result := FormatNumberCurrency(AValue, ADigits, lDecimalSeperator, AFormatSettings.ThousandSeparator, AFormatSettings);\r\n end;\r\n if (AFormat <> ffCurrency) and (Result.Length > cMinLength) and (Result.FirstChar = cMinus) then\r\n RemoveLeadingNegativeSign(Result, lDecimalSeperator, AFormatSettings);\r\nend;\r\n\r\nfunction FloatToStr(const AValue: Double): string;\r\nbegin\r\n Result := FloatToStr(AValue, FormatSettings);\r\nend;\r\n\r\nfunction FloatToStr(const AValue: Double; const AFormatSettings: TFormatSettings): string;\r\nbegin\r\n Result := FloatToStrF(AValue, ffGeneral, 15, 0, AFormatSettings);\r\nend;\r\n\r\nprocedure DoFormatError(const AErrCode : Longint;const AFmt: string);\r\nbegin\r\n //!! must be changed to contain format string...\r\n case AErrCode of\r\n feInvalidFormat : raise EConvertError.Createfmt(SInvalidFormat,[AFmt]);\r\n feMissingArgument : raise EConvertError.Createfmt(SArgumentMissing,[AFmt]);\r\n feInvalidArgIndex : raise EConvertError.Createfmt(SInvalidArgIndex,[AFmt]);\r\n end;\r\nend;\r\n\r\nfunction Format(const AFmt: string; const AArgs: array of JSValue): string;\r\nbegin\r\n Result := Format(AFmt, AArgs, FormatSettings);\r\nend;\r\n\r\nfunction Format(const AFmt: string; const AArgs: array of JSValue; const AFormatSettings: TFormatSettings): string;\r\nvar\r\n lChPos, lOldPos, lArgPos, lDoArg, lLen: SizeInt;\r\n lHs, lToAdd: string;\r\n lIndex: SizeInt;\r\n lWidth, lPrec: Longint;\r\n lLeft: Boolean;\r\n lFChar: Char;\r\n lvq: NativeInt;\r\n\r\n {\r\n ReadFormat reads the format string. It returns the type character in\r\n uppercase, and sets lIndex, lWidth, lPrec to their correct values,\r\n or -1 if not set. It sets lLeft to true if lLeft alignment was requested.\r\n In case of an error, DoFormatError is called.\r\n }\r\n\r\n function ReadFormat: Char;\r\n\r\n var\r\n lValue: NativeInt;\r\n\r\n procedure ReadInteger;\r\n\r\n var\r\n lCode: Integer;\r\n lArgN: SizeInt;\r\n begin\r\n if lValue <> -1 then\r\n exit; // Was already read.\r\n lOldPos := lChPos;\r\n while (lChPos <= lLen) and (AFmt[lChPos] <= '9') and (AFmt[lChPos] >= '0') do\r\n Inc(lChPos);\r\n if lChPos > lLen then\r\n DoFormatError(feInvalidFormat, AFmt);\r\n if AFmt[lChPos] = '*' then\r\n begin\r\n\r\n if lIndex = -1 then\r\n lArgN := lArgPos\r\n else\r\n begin\r\n lArgN := lIndex;\r\n Inc(lIndex);\r\n end;\r\n\r\n if (lChPos > lOldPos) or (lArgN > high(AArgs)) then\r\n DoFormatError(feInvalidFormat, AFmt);\r\n\r\n lArgPos := lArgN + 1;\r\n\r\n if IsNumber(AArgs[lArgN]) and IsInteger(AArgs[lArgN]) then\r\n lValue := Integer(AArgs[lArgN])\r\n else\r\n DoFormatError(feInvalidFormat, AFmt);\r\n Inc(lChPos);\r\n end\r\n else\r\n begin\r\n if (lOldPos < lChPos) then\r\n begin\r\n Val(Copy(AFmt, lOldPos, lChPos - lOldPos), lValue, lCode);\r\n // This should never happen !!\r\n if lCode > 0 then\r\n DoFormatError(feInvalidFormat, AFmt);\r\n end\r\n else\r\n lValue := -1;\r\n end;\r\n end;\r\n\r\n procedure ReadIndex;\r\n\r\n begin\r\n if AFmt[lChPos] <> ':' then\r\n ReadInteger\r\n else\r\n lValue := 0; // Delphi undocumented behaviour, assume 0, #11099\r\n if AFmt[lChPos] = ':' then\r\n begin\r\n if lValue = -1 then\r\n DoFormatError(feMissingArgument, AFmt);\r\n lIndex := lValue;\r\n lValue := -1;\r\n Inc(lChPos);\r\n end;\r\n end;\r\n\r\n procedure ReadLeft;\r\n\r\n begin\r\n if AFmt[lChPos] = '-' then\r\n begin\r\n lLeft := True;\r\n Inc(lChPos);\r\n end\r\n else\r\n lLeft := False;\r\n end;\r\n\r\n procedure ReadWidth;\r\n\r\n begin\r\n ReadInteger;\r\n if lValue <> -1 then\r\n begin\r\n lWidth := lValue;\r\n lValue := -1;\r\n end;\r\n end;\r\n\r\n procedure ReadPrec;\r\n\r\n begin\r\n if AFmt[lChPos] = '.' then\r\n begin\r\n Inc(lChPos);\r\n ReadInteger;\r\n if lValue = -1 then\r\n lValue := 0;\r\n lPrec := lValue;\r\n end;\r\n end;\r\n\r\n begin\r\n lIndex := -1;\r\n lWidth := -1;\r\n lPrec := -1;\r\n lValue := -1;\r\n Inc(lChPos);\r\n if AFmt[lChPos] = '%' then\r\n begin\r\n Result := '%';\r\n exit; // VP fix\r\n end;\r\n ReadIndex;\r\n ReadLeft;\r\n ReadWidth;\r\n ReadPrec;\r\n Result := Upcase(AFmt[lChPos]);\r\n end;\r\n\r\n function Checkarg(AT: TJSValueType; err: Boolean): Boolean;\r\n {\r\n Check if argument lIndex is of correct type (AT)\r\n If lIndex=-1, lArgPos is used, and lArgPos is augmented with 1\r\n lDoArg is set to the argument that must be used.\r\n }\r\n begin\r\n Result := False;\r\n if lIndex = -1 then\r\n lDoArg := lArgPos\r\n else\r\n lDoArg := lIndex;\r\n lArgPos := lDoArg + 1;\r\n if (lDoArg > high(AArgs)) or (GetValueTYpe(AArgs[lDoArg]) <> AT) then\r\n begin\r\n if err then\r\n DoFormatError(feInvalidArgindex, AFmt);\r\n dec(lArgPos);\r\n exit;\r\n end;\r\n Result := True;\r\n end;\r\n\r\nbegin\r\n Result := '';\r\n lLen := Length(AFmt);\r\n lChPos := 1;\r\n lOldPos := 1;\r\n lArgPos := 0;\r\n while lChPos <= lLen do\r\n begin\r\n while (lChPos <= lLen) and (AFmt[lChPos] <> '%') do\r\n Inc(lChPos);\r\n if lChPos > lOldPos then\r\n Result := Result + Copy(AFmt, lOldPos, lChPos - lOldPos);\r\n if lChPos < lLen then\r\n begin\r\n lFChar := ReadFormat;\r\n{$IFDEF fmtdebug}\r\n DumpFormat(lFChar);\r\n{$ENDIF}\r\n case lFChar of\r\n 'D':\r\n begin\r\n Checkarg(jvtinteger, True);\r\n lToAdd := IntToStr(NativeInt(AArgs[lDoArg]));\r\n lWidth := Abs(lWidth);\r\n lIndex := lPrec - Length(lToAdd);\r\n if lToAdd[1] <> '-' then\r\n lToAdd := StringOfChar('0', lIndex) + lToAdd\r\n else\r\n // + 1 to accomodate for - sign in length !!\r\n Insert(StringOfChar('0', lIndex + 1), lToAdd, 2);\r\n end;\r\n 'U':\r\n begin\r\n Checkarg(jvtinteger, True);\r\n if NativeInt(AArgs[lDoArg]) < 0 then\r\n DoFormatError(feInvalidArgindex, AFmt);\r\n lToAdd := IntToStr(NativeInt(AArgs[lDoArg]));\r\n lWidth := Abs(lWidth);\r\n lIndex := lPrec - Length(lToAdd);\r\n lToAdd := StringOfChar('0', lIndex) + lToAdd\r\n end;\r\n 'E':\r\n begin\r\n if Checkarg(jvtFloat, False) or Checkarg(jvtinteger, True) then\r\n lToAdd := FloatToStrF(Double(AArgs[lDoArg]), ffFixed, 9999, lPrec, AFormatSettings);\r\n end;\r\n 'F':\r\n begin\r\n if Checkarg(jvtFloat, False) or Checkarg(jvtinteger, True) then\r\n lToAdd := FloatToStrF(Double(AArgs[lDoArg]), ffFixed, 9999, lPrec, AFormatSettings);\r\n end;\r\n 'G':\r\n begin\r\n if Checkarg(jvtFloat, False) or Checkarg(jvtinteger, True) then\r\n lToAdd := FloatToStrF(Double(AArgs[lDoArg]), ffGeneral, lPrec, 3, AFormatSettings);\r\n end;\r\n 'N':\r\n begin\r\n if Checkarg(jvtFloat, False) or Checkarg(jvtinteger, True) then\r\n lToAdd := FloatToStrF(Double(AArgs[lDoArg]), ffNumber, 9999, lPrec, AFormatSettings);\r\n end;\r\n 'M':\r\n begin\r\n if Checkarg(jvtFloat, False) or Checkarg(jvtinteger, True) then\r\n lToAdd := FloatToStrF(Double(AArgs[lDoArg]), ffCurrency, 9999, lPrec, AFormatSettings);\r\n end;\r\n 'S':\r\n begin\r\n Checkarg(jvtString, True);\r\n lHs := string(AArgs[lDoArg]);\r\n lIndex := Length(lHs);\r\n if (lPrec <> -1) and (lIndex > lPrec) then\r\n lIndex := lPrec;\r\n lToAdd := Copy(lHs, 1, lIndex);\r\n end;\r\n 'P':\r\n begin\r\n Checkarg(jvtinteger, True);\r\n lToAdd := IntToHex(NativeInt(AArgs[lDoArg]), 31);\r\n end;\r\n 'X':\r\n begin\r\n Checkarg(jvtinteger, True);\r\n lvq := NativeInt(AArgs[lDoArg]);\r\n lIndex := 31; // May need to adjust to NativeInt\r\n if lPrec > lIndex then\r\n lToAdd := IntToHex(lvq, lIndex)\r\n else\r\n begin\r\n // determine minimum needed number of hex digits.\r\n lIndex := 1;\r\n while (NativeInt(1) shl (lIndex * 4) <= lvq) and (lIndex < 16) do\r\n Inc(lIndex);\r\n if lIndex > lPrec then\r\n lPrec := lIndex;\r\n lToAdd := IntToHex(lvq, lPrec);\r\n end;\r\n end;\r\n '%':\r\n lToAdd := '%';\r\n end;\r\n if lWidth <> -1 then\r\n if Length(lToAdd) < lWidth then\r\n if not lLeft then\r\n lToAdd := StringOfChar(' ', lWidth - Length(lToAdd)) + lToAdd\r\n else\r\n lToAdd := lToAdd + StringOfChar(' ', lWidth - Length(lToAdd));\r\n Result := Result + lToAdd;\r\n end;\r\n Inc(lChPos);\r\n lOldPos := lChPos;\r\n end;\r\nend;\r\n\r\nfunction FormatFloat(const AFormat: string; const AValue: Double): string;\r\nbegin\r\n Result := FormatFloat(AFormat, AValue, FormatSettings);\r\nend;\r\n\r\nfunction FormatFloat(const AFormat: string; const AValue: Double; const AFormatSettings: TFormatSettings): string;\r\ntype\r\n TPosArray = array of Integer;\r\nconst\r\n cMaxPrecision = 18; // Extended precision\r\nvar\r\n // Input in usable format\r\n lExtended: Extended; // Value as extended.\r\n lFloatRec: TFloatRec; // Value as floatrec.\r\n lSection: string; // Format can contain 3 sections, semicolon separated: Pos;Neg;Zero. This is the one to use.\r\n lSectionLength: Integer; // Length of lSection.\r\n // Calculated based on lSection. Static during output\r\n lThousandSep: Boolean; // Thousands separator detected in format ?\r\n lIsScientific: Boolean; // Use Scientific notation ? (lExtended detected in format)\r\n lDecimalPos: Integer; // Position of decimal point in pattern.\r\n lFirstDigit: Integer; // First actual digit in input (# or 0), relative to decimal point\r\n lLastDigit: Integer; // Last required (0) digit, relative to decimal point\r\n lRequestedDigits: Integer; // Number of requested digits, # and 0 alike\r\n lExpSize: Integer; // Number of digits in exponent\r\n lAvailable: Integer; // lAvailable digits in lFloatRec.\r\n // These change during output loop\r\n lCurrent: Integer; // lCurrent digit in lAvailable digits\r\n lPadZeroes: Integer; // Difference in requested digits before comma and exponent, needs to be padded with zeroes.\r\n lDistToDecimal: Integer; // Place of lCurrent digit, relative to decimal point taking in account lPadZeroes!\r\n\r\n procedure InitVars;\r\n begin\r\n lExtended := AValue;\r\n lSection := '';\r\n lSectionLength := 0;\r\n lThousandSep := False;\r\n lIsScientific := False;\r\n lDecimalPos := 0;\r\n lFirstDigit := MaxInt;\r\n lLastDigit := 0;\r\n lRequestedDigits := 0;\r\n lExpSize := 0;\r\n lAvailable := -1;\r\n end;\r\n\r\n procedure ToResult(const AChar: Char);\r\n begin\r\n Result := Result + AChar;\r\n end;\r\n\r\n procedure AddToResult(const AStr: string);\r\n begin\r\n Result := Result + AStr;\r\n end;\r\n\r\n procedure WriteDigit(ADigit: Char);\r\n // Write a digit to result, prepend with decimalseparator or append with 1000 separator\r\n begin\r\n if ADigit = #0 then\r\n Exit;\r\n // Writeln('WriteDigit: ',ADigit,', DistToDecimal: ',lDistToDecimal);\r\n Dec(lDistToDecimal);\r\n // -1 -> we've arrived behind the decimal\r\n if (lDistToDecimal = -1) then\r\n begin\r\n AddToResult(AFormatSettings.DecimalSeparator);\r\n ToResult(ADigit);\r\n end\r\n else\r\n begin\r\n // We're still before the decimal.\r\n ToResult(ADigit);\r\n if lThousandSep and ((lDistToDecimal mod 3) = 0) and (lDistToDecimal > 1) then\r\n AddToResult(AFormatSettings.ThousandSeparator);\r\n end;\r\n end;\r\n\r\n function GetDigit: Char;\r\n // Return next digit from available digits.\r\n // May return #0 if none available.\r\n // Will return '0' if applicable.\r\n begin\r\n // Writeln(' DistToDecimal <= LastDigit : ',lDistToDecimal,' <= ',lLastDigit,' have digit: ',lCurrent<=lAvailable, ' (',lCurrent,')');\r\n Result := #0;\r\n if (lCurrent <= lAvailable) then\r\n begin\r\n Result := lFloatRec.Digits[lCurrent];\r\n Inc(lCurrent);\r\n end\r\n else if (lDistToDecimal <= lLastDigit) then\r\n Dec(lDistToDecimal)\r\n else\r\n Result := '0';\r\n // Writeln('GetDigit ->: ',Result);\r\n end;\r\n\r\n procedure CopyDigit;\r\n // Copy a digit (#, 0) to the output with the correct value\r\n begin\r\n // Writeln('CopyDigit: Padzeroes: ',lPadZeroes,', DistToDecimal: ',lDistToDecimal);\r\n if (lPadZeroes = 0) then\r\n WriteDigit(GetDigit) // No shift needed, just copy what is lAvailable.\r\n else if (lPadZeroes<0) then\r\n begin\r\n // We must prepend zeroes\r\n Inc(lPadZeroes);\r\n if (lDistToDecimal<=lFirstDigit) then\r\n WriteDigit('0')\r\n else\r\n Dec(lDistToDecimal);\r\n end\r\n else\r\n begin\r\n // We must append zeroes\r\n while lPadZeroes > 0 do\r\n begin\r\n WriteDigit(GetDigit);\r\n Dec(lPadZeroes);\r\n end;\r\n WriteDigit(GetDigit);\r\n end;\r\n end;\r\n\r\n function GetSections(var APosArray: TPosArray): Integer;\r\n var\r\n lFloat: Integer;\r\n lCount: Integer;\r\n lChar, lQuote: Char;\r\n lInQuote: Boolean;\r\n begin\r\n Result := 1;\r\n APosArray[1] := -1;\r\n APosArray[2] := -1;\r\n APosArray[3] := -1;\r\n lInQuote := False;\r\n lQuote := #0;\r\n lCount := 1;\r\n lFloat := Length(AFormat);\r\n while (lCount <= lFloat) do\r\n begin\r\n lChar := AFormat[lCount];\r\n case lChar of\r\n ';':\r\n begin\r\n if not lInQuote then\r\n begin\r\n if Result > 3 then\r\n raise Exception.Create('Invalid float format');\r\n APosArray[Result]:=lCount+1;\r\n Inc(Result);\r\n end;\r\n end;\r\n '\"','''':\r\n begin\r\n if lInQuote then\r\n lInQuote := lChar <> lQuote\r\n else\r\n begin\r\n lInQuote := True;\r\n lQuote := lChar;\r\n end;\r\n end;\r\n end;\r\n Inc(lCount);\r\n end;\r\n if APosArray[Result] = -1 then\r\n APosArray[Result] := lFloat + 1;\r\n end;\r\n\r\n procedure AnalyzeFormat;\r\n var\r\n lCount: Integer;\r\n lLength: Integer;\r\n lQuote: Char;\r\n lChar: Char;\r\n lInQuote : Boolean;\r\n begin\r\n lLength := lSection.Length;\r\n lCount := 1;\r\n lInQuote := False;\r\n lQuote := #0;\r\n while (lCount <= lLength) do\r\n begin\r\n lChar := lSection[lCount];\r\n if lChar in ['\"',''''] then\r\n begin\r\n if lInQuote then\r\n lInQuote := lChar <> lQuote\r\n else\r\n begin\r\n lInQuote := True;\r\n lQuote := lChar;\r\n end;\r\n end\r\n else if not lInQuote then\r\n begin\r\n case lChar of\r\n '.':\r\n begin\r\n if (lDecimalPos = 0) then\r\n lDecimalPos := lRequestedDigits + 1;\r\n end;\r\n ',':\r\n begin\r\n lThousandSep := AFormatSettings.ThousandSeparator <> #0;\r\n end;\r\n 'e', 'E':\r\n begin\r\n Inc(lCount);\r\n if (lCount < lLength) then\r\n begin\r\n lChar:=lSection[lCount];\r\n lIsScientific:=lChar in ['-','+'];\r\n if lIsScientific then\r\n begin\r\n while (lCount < lLength) and (lSection[lCount + 1] = '0') do\r\n begin\r\n Inc(lExpSize);\r\n Inc(lCount);\r\n end;\r\n end;\r\n if lExpSize>4 then\r\n lExpSize:=4;\r\n end;\r\n end;\r\n '#':\r\n begin\r\n Inc(lRequestedDigits);\r\n end;\r\n '0':\r\n begin\r\n if lRequestedDigits < lFirstDigit then\r\n lFirstDigit := lRequestedDigits + 1;\r\n Inc(lRequestedDigits);\r\n lLastDigit := lRequestedDigits + 1;\r\n end;\r\n end;\r\n end;\r\n Inc(lCount);\r\n end;\r\n if lDecimalPos = 0 then\r\n lDecimalPos := lRequestedDigits + 1;\r\n // Writeln('LastDigit: ',lDecimalPos,'-',lLastDigit);\r\n lLastDigit := lDecimalPos - lLastDigit;\r\n if lLastDigit > 0 then\r\n lLastDigit := 0;\r\n // Writeln('FirstDigit: ',lDecimalPos,'-',lFirstDigit);\r\n lFirstDigit := lDecimalPos - lFirstDigit;\r\n if lFirstDigit < 0 then\r\n lFirstDigit := 0;\r\n end;\r\n\r\n function ValueOutSideScope: Boolean;\r\n begin\r\n Result := ((lFloatRec.Exponent >= 18) and (not lIsScientific)) or (lFloatRec.Exponent = $7FF) or (lFloatRec.Exponent = $800);\r\n end;\r\n\r\n procedure CalcRunVars;\r\n var\r\n lDigit: Integer;\r\n lPrecision: Integer;\r\n begin\r\n if lIsScientific then\r\n begin\r\n lPrecision := lRequestedDigits;\r\n lDigit := 9999;\r\n end\r\n else\r\n begin\r\n lPrecision := cMaxPrecision;\r\n lDigit := lRequestedDigits - lDecimalPos + 1;\r\n end;\r\n lFloatRec := FloatToDecimal(AValue, lPrecision, lDigit);\r\n // Writeln('Number of digits available : ',Length(lFloatRec.Digits));\r\n // For lPrecision:=0 to Length(lFloatRec.Digits)-1 do\r\n // Writeln(lPrecision,': ',lFloatRec.Digits[lPrecision]);\r\n lDistToDecimal := lDecimalPos - 1;\r\n // Writeln('DistToDecimal : ',lDistToDecimal);\r\n if lIsScientific then\r\n lPadZeroes := 0 // No padding.\r\n else\r\n begin\r\n lPadZeroes := lFloatRec.Exponent - (lDecimalPos - 1);\r\n if (lPadZeroes >= 0) then\r\n lDistToDecimal := lFloatRec.Exponent;\r\n end;\r\n // Writeln('PadZeroes : ',lPadZeroes, ', DistToDecimal : ',lDistToDecimal);\r\n lAvailable := -1;\r\n while (lAvailable < High(lFloatRec.Digits)) and (lFloatRec.Digits[lAvailable + 1] <> #0) do\r\n Inc(lAvailable);\r\n // Writeln('Available: ',lAvailable);\r\n end;\r\n\r\n function FormatExponent(const ASign: Char; const AExponent: Integer): string;\r\n begin\r\n Result := AExponent.ToString;\r\n Result := StringOfChar('0', lExpSize - Result.Length) + Result;\r\n if (AExponent < 0) then\r\n Result := '-' + Result\r\n else if (AExponent > 0) and (ASign = '+') then\r\n Result := ASign + Result;\r\n end;\r\nvar\r\n lCount: Integer;\r\n lString: Integer;\r\n lChar: Char;\r\n lQuote: Char;\r\n lPosArray: TPosArray;\r\n lInLiteral: Boolean;\r\nbegin\r\n SetLength(lPosArray, 4);\r\n Result := '';\r\n InitVars;\r\n // What lSection to use ?\r\n if (lExtended > 0) then\r\n lString := 1\r\n else if (lExtended < 0) then\r\n lString := 2\r\n else\r\n lString := 3;\r\n lPosArray[0] := 0;\r\n lCount := GetSections(lPosArray);\r\n if (lCount < lString) or (lPosArray[lString] - lPosArray[lString - 1] = 0) then\r\n lString := 1;\r\n // Extract correct lSection\r\n lSectionLength := lPosArray[lString] - lPosArray[lString - 1] - 1;\r\n lSection := Copy(AFormat, lPosArray[lString - 1] + 1, lSectionLength);\r\n SetLength(lSection, lSectionLength);\r\n // Writeln('Section ',lCount,' : \"',lSection,'\" ',lSectionLength);\r\n AnalyzeFormat;\r\n // Writeln('RequestedDigits: ',lRequestedDigits,', DecimalPos : ',lDecimalPos,', LastDigit: ',lLastDigit,', FirstDigit: ',lFirstDigit);\r\n CalcRunVars;\r\n // If we cannot process value using lCurrent settings, fallback\r\n if (lSectionLength = 0) or ValueOutSideScope then\r\n begin\r\n asm\r\n lSection = lExtended.toPrecision(15);\r\n end;\r\n Result := lSection;\r\n end;\r\n // Get Started\r\n lCount := 1;\r\n lCurrent := 0;\r\n lQuote := ' ';\r\n lInLiteral := False;\r\n if (lFloatRec.Negative) and (lString = 1) then\r\n ToResult('-');\r\n while (lCount <= lSectionLength) do\r\n begin\r\n lChar := lSection[lCount];\r\n // Writeln('Analyzing pos ',lCount,': \"',lChar,'\"');\r\n if (lChar in ['\"', '''']) then\r\n begin\r\n if lInLiteral then\r\n lInLiteral := lChar <> lQuote\r\n else\r\n begin\r\n lInLiteral := True;\r\n lQuote := lChar;\r\n end;\r\n end\r\n else if lInLiteral then\r\n ToResult(lChar)\r\n else\r\n begin\r\n case lChar of\r\n '0', '#':\r\n begin\r\n CopyDigit;\r\n end;\r\n '.', ',':\r\n begin\r\n end; // Do nothing, handled by CopyDigit\r\n 'e', 'E':\r\n begin\r\n ToResult(lChar); // Always needed\r\n Inc(lCount);\r\n if lCount <= Length(lSection) then\r\n begin\r\n lChar := lSection[lCount];\r\n if (lChar in ['+','-']) then\r\n begin\r\n AddToResult(FormatExponent(lChar, lFloatRec.Exponent - lDecimalPos + 1));\r\n // Skip rest\r\n while (lCount < lSectionLength) and (lSection[lCount + 1] = '0') do\r\n Inc(lCount);\r\n end;\r\n end;\r\n end;\r\n else\r\n ToResult(lChar);\r\n end;\r\n end;\r\n Inc(lCount);\r\n end;\r\nend;\r\n\r\n\r\n{$HINTS OFF}\r\n\r\nfunction StringToBase64(AValue: string): string;\r\nvar\r\n res: string;\r\nbegin\r\n asm\r\n res = window.btoa(AValue);\r\n end;\r\n Result := res;\r\nend;\r\n\r\nfunction Base64ToString(AValue: string): string;\r\nvar\r\n res: string;\r\nbegin\r\n asm\r\n res = window.atob(AValue);\r\n end;\r\n Result := res;\r\nend;\r\n\r\nfunction ArrayBufferToBase64(Buffer: TJSArrayBuffer): string;\r\nbegin\r\n asm\r\n function _arrayBufferToBase64(buf) {\r\n var binary = '';\r\n var bytes = new Uint8Array(buf);\r\n var len = bytes.byteLength;\r\n for (var i = 0; i < len; i++) {\r\n binary += String.fromCharCode( bytes[i] );\r\n }\r\n return window.btoa(binary);\r\n }\r\n Result = _arrayBufferToBase64(Buffer);\r\n end;\r\nend;\r\n\r\nfunction Base64ToArrayBuffer(Base64: string): TJSArrayBuffer;\r\nbegin\r\n asm\r\n function _base64ToArrayBuffer(data) {\r\n var binary_string = window.atob(data);\r\n var len = binary_string.length;\r\n var bytes = new Uint8Array(len);\r\n for (var i = 0; i < len; i++) {\r\n bytes[i] = binary_string.charCodeAt(i);\r\n }\r\n return bytes.buffer;\r\n }\r\n\r\n Result = _base64ToArrayBuffer(Base64);\r\n end;\r\nend;\r\n\r\nfunction SizeOf(const AValue: Double): Integer; overload;\r\nconst\r\n cSizeOfDouble = 8;\r\nbegin\r\n Result := cSizeOfDouble;\r\nend;\r\n\r\nfunction SizeOf(const AValue: Integer): Integer; overload;\r\nconst\r\n cSizeOfInteger = 4;\r\nbegin\r\n Result := cSizeOfInteger;\r\nend;\r\n\r\nprocedure InsertAfter(newNode, referenceNode: TJSElement);\r\nbegin\r\n referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);\r\nend;\r\n\r\n\r\ninitialization\r\n FormatSettings := TFormatSettings.Create;\r\n\r\nend.\r\n","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright (c) 2018 - 2021 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.WebTools;\r\n\r\ninterface\r\n\r\nuses\r\n Classes, Web, JS;\r\n\r\nfunction DoubleToHTML(d: double): string;\r\n\r\nprocedure MessageBeep(AType: integer);\r\nprocedure OutputDebugString(const s: string);\r\nfunction GetTickCount: longint;\r\nfunction GetQueryParam(AName: string): string;\r\nfunction HasQueryParam(AName: string; var AValue: string): boolean;\r\nfunction EscapeHTML(AValue: string): string;\r\n\r\nfunction GetLocaleShortDateFormat(ALocale: string = ''): string;\r\nfunction GetLocaleLongDayName(DayOfWeek: integer; ALocale: string = ''): string;\r\nfunction GetLocaleShortDayName(DayOfWeek: integer; ALocale: string = ''): string;\r\nfunction GetLocaleLongMonthName(Month: integer; ALocale: string = ''): string;\r\nfunction GetLocaleShortMonthName(Month: integer; ALocale: string = ''): string;\r\nfunction GetLocaleDecimalSeparator(ALocale: string = ''): string;\r\nfunction GetLocaleThousandSeparator(ALocale: string = ''): string;\r\nfunction LocaleFormatCurrency(Value: double; ACurrency: string; ALocale: string = ''): string;\r\nfunction GetLocaleCurrency(ALocale: string = ''): string;\r\nfunction GetBrowserLocale: string;\r\nfunction ProcessAccelerator(AValue: string; var Accelerator: string): string;\r\nfunction GetBase64Image(AImage: TJSHTMLElement; AWidth: integer = 0; AHeight: integer = 0): string;\r\nprocedure DebugBreak;\r\nfunction HexImageDecode(s: string): TJSUint8Array;\r\nfunction HexImageEncodeFromBase64(s: string): string;\r\nfunction HexImageEncode(a: TJSUint8Array): string;\r\nfunction HexImageDecodeAsBase64(s: string): string;\r\nfunction EmptyImage: string;\r\nfunction NumAttribute(s: single): string;\r\nfunction DataURLToFile(AURL: string; FileName: string): TJSHTMLFile;\r\nprocedure DownloadFile(AFile: TJSHTMLFile);\r\nfunction URLString(s: string): string;\r\nfunction EmojiString(s: string): string;\r\nfunction HTMLToString(s: string): string;\r\n\r\nimplementation\r\n\r\nuses\r\n SysUtils, WEBLib.Utils;\r\n\r\nfunction EmptyImage: string;\r\nbegin\r\n Result := 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==';\r\nend;\r\n\r\n\r\nfunction DataURLToFile(AURL: string; FileName: string): TJSHTMLFile;\r\nvar\r\n afile: TJSHTMLFile;\r\nbegin\r\n asm\r\n var arr = AURL.split(','),\r\n mime = arr[0].match(/:(.*?);/)[1],\r\n bstr = atob(arr[1]),\r\n n = bstr.length,\r\n u8arr = new Uint8Array(n);\r\n while(n--){\r\n u8arr[n] = bstr.charCodeAt(n);\r\n }\r\n afile = new File([u8arr], FileName, {type:mime});\r\n end;\r\n Result := afile;\r\nend;\r\n\r\nprocedure DownloadFile(AFile: TJSHTMLFile);\r\nvar\r\n a: TJSHTMLLinkElement;\r\nbegin\r\n a := TJSHTMLLinkElement(document.createElement('a'));\r\n asm\r\n a.href = window.URL.createObjectURL(AFile);\r\n a.download = AFile.name;\r\n end;\r\n a.click;\r\nend;\r\n\r\nfunction HexImageDecode(s: string): TJSUint8Array;\r\nvar\r\n i,j,l: integer;\r\n res: TJSUint8Array;\r\n c1,c2: byte;\r\n hdr: byte;\r\nbegin\r\n l := Length(s) div 2;\r\n j := 0;\r\n\r\n c1 := ord(s[1]) - 48;\r\n if c1 >= 10 then\r\n c1 := c1 - 7;\r\n\r\n c2 := ord(s[2]) -48;\r\n if c2 >= 10 then\r\n c2 := c2 - 7;\r\n\r\n hdr := 1 + (c2 + (c1 shl 4));\r\n\r\n i := pos('4A5045474',s);\r\n // possible extra 4 bytes when TJPEGImage?\r\n if (i > 1) and (i < 10) then\r\n inc(hdr,4);\r\n\r\n i := pos('4269746D6',s);\r\n // possible extra 4 bytes when TBitmap?\r\n if (i > 1) and (i < 10) then\r\n inc(hdr,4);\r\n\r\n res := TJSUint8Array.new(l - hdr);\r\n\r\n for i := hdr + 1 to l do\r\n begin\r\n c1 := ord(s[i*2 - 1]) - 48;\r\n if c1 >= 10 then\r\n c1 := c1 - 7;\r\n\r\n c2 := ord(s[i*2]) -48;\r\n if c2 >= 10 then\r\n c2 := c2 - 7;\r\n\r\n c2 := c2 + (c1 shl 4);\r\n\r\n res[j] := c2;\r\n inc(j);\r\n end;\r\n\r\n Result := res;\r\nend;\r\n\r\n\r\nfunction HexImageEncode(a: TJSUint8Array): string;\r\nvar\r\n i,l: integer;\r\n b: byte;\r\n s,ls: string;\r\nbegin\r\n Result := '';\r\n\r\n l := a.length;\r\n\r\n if l = 0 then\r\n Exit;\r\n\r\n l := (l and $FF) shl 24 + (l and $FF00) shl 8 + (l and $FF0000) shr 8 + (l and $FF000000) shr 24;\r\n\r\n ls := '';\r\n\r\n if (a[0] = 137) and (a[1] = 80) then\r\n begin\r\n s := 'TPngImage';\r\n b := Length(s);\r\n end;\r\n\r\n if (a[0] = $FF) and (a[1] = $D8) then\r\n begin\r\n s := 'TJPEGImage';\r\n b := Length(s);\r\n ls := inttohex(l,8);\r\n end;\r\n\r\n if (a[0] = 66) and (a[1] = 77) then\r\n begin\r\n s := 'TBitmap';\r\n b := Length(s);\r\n ls := inttohex(l,8);\r\n end;\r\n\r\n if (a[0] = 71) and (a[1] = 73) then\r\n begin\r\n s := 'TGIFImage';\r\n b := Length(s);\r\n end;\r\n\r\n Result := inttohex(b,2);\r\n\r\n for i := 1 to length(s) do\r\n begin\r\n b := ord(s[i]);\r\n Result := Result + inttohex(b,2);\r\n end;\r\n\r\n Result := Result + ls;\r\n\r\n for i := 0 to a.length - 1 do\r\n begin\r\n b := a[i];\r\n Result := Result + inttohex(b,2);\r\n end;\r\nend;\r\n\r\nfunction URLString(s: string): string;\r\nvar\r\n res: string;\r\nbegin\r\n asm\r\n function linkify(inputText) {\r\n var replacedText, replacePattern1, replacePattern2, replacePattern3;\r\n\r\n //URLs starting with http://, https://, or ftp://\r\n replacePattern1 = /(\\b(https?|ftp):\\/\\/[-A-Z0-9+&@#\\/%?=~_|!:,.;]*[-A-Z0-9+&@#\\/%=~_|])/gim;\r\n replacedText = inputText.replace(replacePattern1, '$1');\r\n\r\n //URLs starting with \"www.\" (without // before it, or it'd re-link the ones done above).\r\n replacePattern2 = /(^|[^\\/])(www\\.[\\S]+(\\b|$))/gim;\r\n replacedText = replacedText.replace(replacePattern2, '$1$2');\r\n\r\n //Change email addresses to mailto:: links.\r\n replacePattern3 = /(([a-zA-Z0-9\\-\\_\\.])+@[a-zA-Z\\_]+?(\\.[a-zA-Z]{2,6})+)/gim;\r\n replacedText = replacedText.replace(replacePattern3, '$1');\r\n\r\n return replacedText;\r\n }\r\n res = linkify(s);\r\n end;\r\n Result := res;\r\nend;\r\n\r\nfunction HTMLToString(s: string): string;\r\nbegin\r\n s := StringReplace(s,'<','<',[rfReplaceAll]);\r\n Result := StringReplace(s,'>','>',[rfReplaceAll]);\r\nend;\r\n\r\n// info\r\n// https://unicode.org/emoji/charts/full-emoji-list.html\r\n// https://en.wikipedia.org/wiki/List_of_emoticons\r\n\r\nfunction Emojistring(s: string): string;\r\nvar\r\n ls: TStringList;\r\n i: integer;\r\n v,k: string;\r\nbegin\r\n for i := 1 to Length(s) do\r\n if s[i] = '|' then\r\n s[i] := '¦';\r\n\r\n ls := TStringList.Create;\r\n ls.AddPair(':)','😀');\r\n ls.AddPair(':D','😁');\r\n ls.AddPair(';)','😉');\r\n ls.AddPair(':O','😮');\r\n ls.AddPair(':*','😗');\r\n ls.AddPair(':P','😜');\r\n ls.AddPair(':(','🙁');\r\n ls.AddPair(':¦','😐');\r\n ls.AddPair(':X','🤐');\r\n ls.AddPair('¦;)','😎');\r\n ls.AddPair(':<','😡');\r\n\r\n for i := 0 to ls.Count - 1 do\r\n begin\r\n v := ls.Names[i];\r\n k := ls.Values[v];\r\n s := StringReplace(s,v,k,[rfReplaceAll]);\r\n end;\r\n\r\n ls.Free;\r\n\r\n Result := s;\r\nend;\r\n\r\n{$HINTS OFF}\r\n\r\nfunction HexImageEncodeFromBase64(s: string): string;\r\nvar\r\n ja: TJSUint8Array;\r\nbegin\r\n asm\r\n s = s.replace(/^data:image\\/\\S+;base64,/, \"\");\r\n //ja = Uint8Array.from(atob(s), c => c.charCodeAt(0))\r\n ja = Uint8Array.from(atob(s), function(c) { return c.charCodeAt(0);} )\r\n end;\r\n\r\n Result := HexImageEncode(ja);\r\nend;\r\n\r\nfunction HexImageDecodeAsBase64(s: string): string;\r\nvar\r\n ja: TJSUint8Array;\r\nbegin\r\n ja := HexImageDecode(s);\r\n asm\r\n s = btoa(new Uint8Array(ja).reduce(function (data, byte) {\r\n return data + String.fromCharCode(byte);\r\n }, ''));\r\n end;\r\n Result := s;\r\nend;\r\n\r\nfunction GetBase64Image(AImage: TJSHTMLElement; AWidth: integer = 0; AHeight: integer = 0): string;\r\nvar\r\n s: string;\r\n m: TJSHTMLElement;\r\nbegin\r\n s := '';\r\n m := AImage;\r\n asm\r\n function getBase64Image(img) {\r\n var canvas = document.createElement(\"canvas\");\r\n if (AWidth == 0) {\r\n canvas.width = img.width; }\r\n else {\r\n canvas.width = AWidth; }\r\n if (AHeight == 0) {\r\n canvas.height = img.height; }\r\n else {\r\n canvas.height = AHeight; }\r\n var ctx = canvas.getContext(\"2d\");\r\n if ((AWidth == 0) || (AHeight == 0)) {\r\n ctx.drawImage(img, 0, 0); }\r\n else {\r\n ctx.drawImage(img, 0, 0, AWidth, AHeight); }\r\n var dataURL = canvas.toDataURL(\"image/png\");\r\n return dataURL.replace(/^data:image\\/(png|jpg);base64,/, \"\");\r\n }\r\n s = getBase64Image(m);\r\n end;\r\n Result := s;\r\nend;\r\n{$HINTS ON}\r\n\r\nprocedure DebugBreak;\r\n asm\r\n debugger;\r\n end;\r\n\r\nfunction DoubleToHTML(d: double): string;\r\nbegin\r\n Result := Format('%g',[d]);\r\n Result := StringReplace(Result, ',','.',[rfReplaceAll]);\r\nend;\r\n\r\nprocedure OutputDebugString(const s: string);\r\nbegin\r\n asm\r\n console.log(s);\r\n end;\r\nend;\r\n\r\nfunction GetTickCount: longint;\r\nvar\r\n n: longint;\r\nbegin\r\n asm\r\n var d = new Date();\r\n n = d.getTime();\r\n end;\r\n\r\n Result := n;\r\nend;\r\n\r\nfunction HasQueryParam(AName: string; var AValue: string): boolean;\r\nvar\r\n found: boolean;\r\n s: string;\r\nbegin\r\n s := '';\r\n asm\r\n var query = window.location.search.substring(1);\r\n var res = \"\";\r\n found = false;\r\n var vars = query.split('&');\r\n for (var i = 0; i < vars.length; i++) {\r\n var pair = vars[i].split('=');\r\n if (decodeURIComponent(pair[0]) == AName) {\r\n res = decodeURIComponent(pair[1]);\r\n found = true;\r\n }\r\n }\r\n s = res;\r\n end;\r\n\r\n AValue := s;\r\n Result := found;\r\nend;\r\n\r\nfunction GetQueryParam(AName: string): string;\r\nvar\r\n res: string;\r\nbegin\r\n HasQueryParam(AName,res);\r\n Result := res;\r\nend;\r\n\r\n\r\nfunction GetLocaleShortDateFormat(ALocale: string = ''): string;\r\nbegin\r\n Result := TFormatSettings.Create(ALocale).ShortDateFormat;\r\nend;\r\n\r\nfunction GetLocaleLongDayName(DayOfWeek: integer; ALocale: string = ''): string;\r\nvar\r\n res: string;\r\nbegin\r\n asm\r\n var baseDate = new Date(2017, 0, 1); // Sunday\r\n baseDate.setDate(baseDate.getDate() + DayOfWeek - 1);\r\n\r\n var loc = \"\";\r\n if (ALocale == '') { loc = navigator.language; }\r\n else { loc = ALocale; }\r\n\r\n res = baseDate.toLocaleDateString(loc, { weekday: 'long' });\r\n end;\r\n Result := res;\r\nend;\r\n\r\nfunction GetLocaleShortDayName(DayOfWeek: integer; ALocale: string = ''): string;\r\nvar\r\n res: string;\r\nbegin\r\n asm\r\n var baseDate = new Date(2017, 0, 1); // Sunday\r\n baseDate.setDate(baseDate.getDate() + DayOfWeek - 1);\r\n\r\n var loc = \"\";\r\n if (ALocale == '') { loc = navigator.language; }\r\n else { loc = ALocale; }\r\n\r\n res = baseDate.toLocaleDateString(loc, { weekday: 'short' });\r\n end;\r\n Result := res;\r\nend;\r\n\r\nfunction GetLocaleLongMonthName(Month: integer; ALocale: string = ''): string;\r\nvar\r\n res: string;\r\nbegin\r\n asm\r\n var baseDate = new Date(2017, Month - 1, 1);\r\n\r\n var loc = \"\";\r\n if (ALocale == '') { loc = navigator.language; }\r\n else { loc = ALocale; }\r\n\r\n res = baseDate.toLocaleDateString(loc, { month: 'long' });\r\n end;\r\n\r\n Result := res;\r\nend;\r\n\r\nfunction GetLocaleShortMonthName(Month: integer; ALocale: string = ''): string;\r\nvar\r\n res: string;\r\nbegin\r\n asm\r\n var baseDate = new Date(2017, Month - 1, 1);\r\n\r\n var loc = \"\";\r\n if (ALocale == '') { loc = navigator.language; }\r\n else { loc = ALocale; }\r\n\r\n res = baseDate.toLocaleDateString(loc, { month: 'short' });\r\n end;\r\n\r\n Result := res;\r\nend;\r\n\r\nfunction GetLocaleDecimalSeparator(ALocale: string = ''): string;\r\nvar\r\n res: string;\r\nbegin\r\n asm\r\n var n = 1.1;\r\n var loc = \"\";\r\n if (ALocale == '') { loc = navigator.language; }\r\n else { loc = ALocale; }\r\n\r\n n = n.toLocaleString(loc).substring(1, 2);\r\n res = n;\r\n end;\r\n Result := res;\r\nend;\r\n\r\nfunction GetLocaleThousandSeparator(ALocale: string = ''): string;\r\nvar\r\n res: string;\r\nbegin\r\n asm\r\n var n = 1000.1;\r\n var loc = \"\";\r\n if (ALocale == '') { loc = navigator.language; }\r\n else { loc = ALocale; }\r\n n = n.toLocaleString(loc).substring(1, 2);\r\n res = n;\r\n end;\r\n Result := res;\r\nend;\r\n\r\nfunction LocaleFormatCurrency(Value: double; ACurrency: string; ALocale: string = ''): string;\r\nvar\r\n res: string;\r\nbegin\r\n\r\n asm\r\n var loc = \"\";\r\n if (ALocale == '') { loc = navigator.language; }\r\n else { loc = ALocale; }\r\n var number = Value;\r\n res = number.toLocaleString(loc, { style: 'currency', currency: ACurrency });\r\n end;\r\n Result := res;\r\nend;\r\n\r\nfunction GetLocaleCurrency(ALocale: string = ''): string;\r\nvar\r\n res: string;\r\nbegin\r\n asm\r\n var curr =\r\n {\"BD\": \"BDT\", \"BE\": \"EUR\", \"BF\": \"XOF\", \"BG\": \"BGN\", \"BA\": \"BAM\", \"BB\": \"BBD\", \"WF\": \"XPF\",\r\n \"BL\": \"EUR\", \"BM\": \"BMD\", \"BN\": \"BND\", \"BO\": \"BOB\", \"BH\": \"BHD\", \"BI\": \"BIF\", \"BJ\": \"XOF\",\r\n \"BT\": \"BTN\", \"JM\": \"JMD\", \"BV\": \"NOK\", \"BW\": \"BWP\", \"WS\": \"WST\", \"BQ\": \"USD\", \"BR\": \"BRL\",\r\n \"BS\": \"BSD\", \"JE\": \"GBP\", \"BY\": \"BYR\", \"BZ\": \"BZD\", \"RU\": \"RUB\", \"RW\": \"RWF\", \"RS\": \"RSD\",\r\n \"TL\": \"USD\", \"RE\": \"EUR\", \"TM\": \"TMT\", \"TJ\": \"TJS\", \"RO\": \"RON\", \"TK\": \"NZD\", \"GW\": \"XOF\",\r\n \"GU\": \"USD\", \"GT\": \"GTQ\", \"GS\": \"GBP\", \"GR\": \"EUR\", \"GQ\": \"XAF\", \"GP\": \"EUR\", \"JP\": \"JPY\",\r\n \"GY\": \"GYD\", \"GG\": \"GBP\", \"GF\": \"EUR\", \"GE\": \"GEL\", \"GD\": \"XCD\", \"GB\": \"GBP\", \"GA\": \"XAF\",\r\n \"SV\": \"USD\", \"GN\": \"GNF\", \"GM\": \"GMD\", \"GL\": \"DKK\", \"GI\": \"GIP\", \"GH\": \"GHS\", \"OM\": \"OMR\",\r\n \"TN\": \"TND\", \"JO\": \"JOD\", \"HR\": \"HRK\", \"HT\": \"HTG\", \"HU\": \"HUF\", \"HK\": \"HKD\", \"HN\": \"HNL\",\r\n \"HM\": \"AUD\", \"VE\": \"VEF\", \"PR\": \"USD\", \"PS\": \"ILS\", \"PW\": \"USD\", \"PT\": \"EUR\", \"SJ\": \"NOK\",\r\n \"PY\": \"PYG\", \"IQ\": \"IQD\", \"PA\": \"PAB\", \"PF\": \"XPF\", \"PG\": \"PGK\", \"PE\": \"PEN\", \"PK\": \"PKR\",\r\n \"PH\": \"PHP\", \"PN\": \"NZD\", \"PL\": \"PLN\", \"PM\": \"EUR\", \"ZM\": \"ZMK\", \"EH\": \"MAD\", \"EE\": \"EUR\",\r\n \"EG\": \"EGP\", \"ZA\": \"ZAR\", \"EC\": \"USD\", \"IT\": \"EUR\", \"VN\": \"VND\", \"SB\": \"SBD\", \"ET\": \"ETB\",\r\n \"SO\": \"SOS\", \"ZW\": \"ZWL\", \"SA\": \"SAR\", \"ES\": \"EUR\", \"ER\": \"ERN\", \"ME\": \"EUR\", \"MD\": \"MDL\",\r\n \"MG\": \"MGA\", \"MF\": \"EUR\", \"MA\": \"MAD\", \"MC\": \"EUR\", \"UZ\": \"UZS\", \"MM\": \"MMK\", \"ML\": \"XOF\",\r\n \"MO\": \"MOP\", \"MN\": \"MNT\", \"MH\": \"USD\", \"MK\": \"MKD\", \"MU\": \"MUR\", \"MT\": \"EUR\", \"MW\": \"MWK\",\r\n \"MV\": \"MVR\", \"MQ\": \"EUR\", \"MP\": \"USD\", \"MS\": \"XCD\", \"MR\": \"MRO\", \"IM\": \"GBP\", \"UG\": \"UGX\",\r\n \"TZ\": \"TZS\", \"MY\": \"MYR\", \"MX\": \"MXN\", \"IL\": \"ILS\", \"FR\": \"EUR\", \"IO\": \"USD\", \"SH\": \"SHP\",\r\n \"FI\": \"EUR\", \"FJ\": \"FJD\", \"FK\": \"FKP\", \"FM\": \"USD\", \"FO\": \"DKK\", \"NI\": \"NIO\", \"NL\": \"EUR\",\r\n \"NO\": \"NOK\", \"NA\": \"NAD\", \"VU\": \"VUV\", \"NC\": \"XPF\", \"NE\": \"XOF\", \"NF\": \"AUD\", \"NG\": \"NGN\",\r\n \"NZ\": \"NZD\", \"NP\": \"NPR\", \"NR\": \"AUD\", \"NU\": \"NZD\", \"CK\": \"NZD\", \"XK\": \"EUR\", \"CI\": \"XOF\",\r\n \"CH\": \"CHF\", \"CO\": \"COP\", \"CN\": \"CNY\", \"CM\": \"XAF\", \"CL\": \"CLP\", \"CC\": \"AUD\", \"CA\": \"CAD\",\r\n \"CG\": \"XAF\", \"CF\": \"XAF\", \"CD\": \"CDF\", \"CZ\": \"CZK\", \"CY\": \"EUR\", \"CX\": \"AUD\", \"CR\": \"CRC\",\r\n \"CW\": \"ANG\", \"CV\": \"CVE\", \"CU\": \"CUP\", \"SZ\": \"SZL\", \"SY\": \"SYP\", \"SX\": \"ANG\", \"KG\": \"KGS\",\r\n \"KE\": \"KES\", \"SS\": \"SSP\", \"SR\": \"SRD\", \"KI\": \"AUD\", \"KH\": \"KHR\", \"KN\": \"XCD\", \"KM\": \"KMF\",\r\n \"ST\": \"STD\", \"SK\": \"EUR\", \"KR\": \"KRW\", \"SI\": \"EUR\", \"KP\": \"KPW\", \"KW\": \"KWD\", \"SN\": \"XOF\",\r\n \"SM\": \"EUR\", \"SL\": \"SLL\", \"SC\": \"SCR\", \"KZ\": \"KZT\", \"KY\": \"KYD\", \"SG\": \"SGD\", \"SE\": \"SEK\",\r\n \"SD\": \"SDG\", \"DO\": \"DOP\", \"DM\": \"XCD\", \"DJ\": \"DJF\", \"DK\": \"DKK\", \"VG\": \"USD\", \"DE\": \"EUR\",\r\n \"YE\": \"YER\", \"DZ\": \"DZD\", \"US\": \"USD\", \"UY\": \"UYU\", \"YT\": \"EUR\", \"UM\": \"USD\", \"LB\": \"LBP\",\r\n \"LC\": \"XCD\", \"LA\": \"LAK\", \"TV\": \"AUD\", \"TW\": \"TWD\", \"TT\": \"TTD\", \"TR\": \"TRY\", \"LK\": \"LKR\",\r\n \"LI\": \"CHF\", \"LV\": \"EUR\", \"TO\": \"TOP\", \"LT\": \"LTL\", \"LU\": \"EUR\", \"LR\": \"LRD\", \"LS\": \"LSL\",\r\n \"TH\": \"THB\", \"TF\": \"EUR\", \"TG\": \"XOF\", \"TD\": \"XAF\", \"TC\": \"USD\", \"LY\": \"LYD\", \"VA\": \"EUR\",\r\n \"VC\": \"XCD\", \"AE\": \"AED\", \"AD\": \"EUR\", \"AG\": \"XCD\", \"AF\": \"AFN\", \"AI\": \"XCD\", \"VI\": \"USD\",\r\n \"IS\": \"ISK\", \"IR\": \"IRR\", \"AM\": \"AMD\", \"AL\": \"ALL\", \"AO\": \"AOA\", \"AQ\": \"\", \"AS\": \"USD\",\r\n \"AR\": \"ARS\", \"AU\": \"AUD\", \"AT\": \"EUR\", \"AW\": \"AWG\", \"IN\": \"INR\", \"AX\": \"EUR\", \"AZ\": \"AZN\",\r\n \"IE\": \"EUR\", \"ID\": \"IDR\", \"UA\": \"UAH\", \"QA\": \"QAR\", \"MZ\": \"MZN\"}\r\n\r\n var loc = \"\";\r\n if (ALocale == '') { loc = navigator.language; }\r\n else { loc = ALocale; }\r\n loc = loc.substring(3,5);\r\n loc = loc.toUpperCase();\r\n res = curr[loc] || '';\r\n end;\r\n Result := res;\r\nend;\r\n\r\n\r\n\r\nfunction GetBrowserLocale: string;\r\nvar\r\n res: string;\r\nbegin\r\n asm\r\n res = navigator.language\r\n end;\r\n Result := res;\r\nend;\r\n\r\n\r\nfunction ProcessAccelerator(AValue: string; var Accelerator: string): string;\r\nvar\r\n i,l: integer;\r\n res: string;\r\nbegin\r\n l := Length(AValue);\r\n\r\n Accelerator := '';\r\n\r\n res := '';\r\n\r\n i := 1;\r\n while (i <= l) do\r\n begin\r\n if (AValue[i] = '&') then\r\n begin\r\n if (i + 1 <= l) and (AValue[i + 1] <> '&') then\r\n begin\r\n res := res + '' + AValue[i + 1] + '';\r\n Accelerator := AValue[i + 1];\r\n end\r\n else\r\n if (i + 1 <= l) and (AValue[i + 1] = '&') then\r\n res := res + '&';\r\n inc(i, 2);\r\n end\r\n else\r\n begin\r\n res := res + AValue[i];\r\n inc(i);\r\n end;\r\n\r\n end;\r\n\r\n Result := res;\r\n\r\nend;\r\n\r\nfunction EscapeHTML(AValue: string): string;\r\nvar\r\n s: string;\r\nbegin\r\n s := AValue;\r\n asm\r\n function escapeHTML(AString) {\r\n return AString.replace(/&/g,'&').replace(//g,'>');\r\n }\r\n s = escapeHTML(s);\r\n end;\r\n Result := s;\r\nend;\r\n\r\nfunction NumAttribute(s: single): string;\r\nvar\r\n res: string;\r\nbegin\r\n res := s.ToString;\r\n Result := StringReplace(res, ',','.',[rfReplaceAll]);\r\nend;\r\n\r\n{$HINTS OFF}\r\n\r\nprocedure MessageBeep(AType: integer);\r\nbegin\r\n asm\r\n var snd = new Audio(\"data:audio/wav;base64,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\"+\r\n\t\"/8elePK/Lf//IInrOF/FvDoADYAGBMGb7FtErm5MXMlmPAJQVgWta7Zx2go+8xJ0UiCb8LHHdftWyLJE0QIAIsI+UbXu67dZMjmgDGCGl1H+vpF4NSDckSIkk7Vd+sxEhBQMRU8j/12UIRhzSaUdQ+rQU5kG\"+\r\n\t\"eFxm+hb1oh6pWWmv3uvmReDl0UnvtapVaIzo1jZbf/pD6ElLqSX+rUmOQNpJFa/r+sa4e/pBlAABoAAAAA3CUgShLdGIxsY7AUABPRrgCABdDuQ5GC7DqPQCgbbJUAoRSUj+NIEig0YfyWUho1VBBBA//uQZ\"+\r\n\t\"B4ABZx5zfMakeAAAAmwAAAAF5F3P0w9GtAAACfAAAAAwLhMDmAYWMgVEG1U0FIGCBgXBXAtfMH10000EEEEEECUBYln03TTTdNBDZopopYvrTTdNa325mImNg3TTPV9q3pmY0xoO6bv3r00y+IDGid/9aaaZ\"+\r\n\t\"TGMuj9mpu9Mpio1dXrr5HERTZSmqU36A3CumzN/9Robv/Xx4v9ijkSRSNLQhAWumap82WRSBUqXStV/YcS+XVLnSS+WLDroqArFkMEsAS+eWmrUzrO0oEmE40RlMZ5+ODIkAyKAGUwZ3mVKmcamcJnMW26MRP\"+\r\n\t\"gUw6j+LkhyHGVGYjSUUKNpuJUQoOIAyDvEyG8S5yfK6dhZc0Tx1KI/gviKL6qvvFs1+bWtaz58uUNnryq6kt5RzOCkPWlVqVX2a/EEBUdU1KrXLf40GoiiFXK///qpoiDXrOgqDR38JB0bw7SoL+ZB9o1RCk\"+\r\n\t\"QjQ2CBYZKd/+VJxZRRZlqSkKiws0WFxUyCwsKiMy7hUVFhIaCrNQsKkTIsLivwKKigsj8XYlwt/WKi2N4d//uQRCSAAjURNIHpMZBGYiaQPSYyAAABLAAAAAAAACWAAAAApUF/Mg+0aohSIRobBAsMlO//Kk\"+\r\n\t\"4soosy1JSFRYWaLC4qZBYWFRGZdwqKiwkNBVmoWFSJkWFxX4FFRQWR+LsS4W/rFRb////////////////////////////////////////////////////////////////////////////////////////////\"+\r\n\t\"////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\"+\r\n\t\"////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\"+\r\n\t\"/////////////VEFHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU291bmRib3kuZGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMjAwNGh0dHA6Ly93d3cuc291bmRib3kuZGUAAAAAAAAAACU=\");\r\n snd.play();\r\n end;\r\nend;\r\n\r\n{$HINTS ON}\r\n\r\nend.\r\n\r\n","{\r\n This file is part of the Free Component Library (FCL)\r\n Copyright (c) 2002 by Florian Klaempfl\r\n\r\n See the file COPYING.FPC, included in this distribution,\r\n for details about the copyright.\r\n\r\n This program is distributed in the hope that it will be useful,\r\n but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r\n\r\n **********************************************************************}\r\n{$mode objfpc}\r\n\r\nunit contnrs;\r\n\r\ninterface\r\n\r\nuses\r\n SysUtils, Classes;\r\n\r\n\r\nType\r\n TObjectListCallback = Reference to Procedure(data:TObject;arg:JSValue);\r\n\r\n TFPObjectList = class(TObject)\r\n private\r\n FFreeObjects : Boolean;\r\n FList: TFPList;\r\n Function GetCount: integer;\r\n Procedure SetCount(const AValue: integer);\r\n protected\r\n Function GetItem(Index: Integer): TObject;\r\n Procedure SetItem(Index: Integer; AObject: TObject);\r\n Procedure SetCapacity(NewCapacity: Integer);\r\n Function GetCapacity: integer;\r\n public\r\n constructor Create; reintroduce;\r\n constructor Create(FreeObjects : Boolean);\r\n destructor Destroy; override;\r\n Procedure Clear;\r\n Function Add(AObject: TObject): Integer;\r\n Procedure Delete(Index: Integer);\r\n Procedure Exchange(Index1, Index2: Integer);\r\n Function Expand: TFPObjectList;\r\n Function Extract(Item: TObject): TObject;\r\n Function Remove(AObject: TObject): Integer;\r\n Function IndexOf(AObject: TObject): Integer;\r\n Function FindInstanceOf(AClass: TClass; AExact: Boolean; AStartAt: Integer): Integer;\r\n Procedure Insert(Index: Integer; AObject: TObject);\r\n Function First: TObject;\r\n Function Last: TObject;\r\n Procedure Move(CurIndex, NewIndex: Integer);\r\n Procedure Assign(Obj:TFPObjectList);\r\n Procedure Pack;\r\n Procedure Sort(Compare: TListSortCompare);\r\n Procedure ForEachCall(proc2call:TObjectListCallback;arg:JSValue);\r\n property Capacity: Integer read GetCapacity write SetCapacity;\r\n property Count: Integer read GetCount write SetCount;\r\n property OwnsObjects: Boolean read FFreeObjects write FFreeObjects;\r\n property Items[Index: Integer]: TObject read GetItem write SetItem; default;\r\n property List: TFPList read FList;\r\n end;\r\n\r\n\r\n { TObjectList }\r\n\r\n TObjectList = class(TList)\r\n private\r\n FFreeObjects : Boolean;\r\n Protected\r\n Procedure Notify(Ptr: JSValue; Action: TListNotification); override;\r\n Function GetItem(Index: Integer): TObject;\r\n Procedure SetItem(Index: Integer; AObject: TObject);\r\n public\r\n constructor Create; reintroduce;\r\n constructor Create(FreeObjects : boolean);\r\n Function Add(AObject: TObject): Integer; reintroduce;\r\n Function Extract(Item: TObject): TObject; reintroduce;\r\n Function Remove(AObject: TObject): Integer; reintroduce;\r\n Function IndexOf(AObject: TObject): Integer; reintroduce;\r\n Function FindInstanceOf(AClass: TClass; AExact: Boolean; AStartAt: Integer): Integer;\r\n Procedure Insert(Index: Integer; AObject: TObject); reintroduce;\r\n Function First: TObject; reintroduce;\r\n Function Last: TObject; reintroduce;\r\n property OwnsObjects: Boolean read FFreeObjects write FFreeObjects;\r\n property Items[Index: Integer]: TObject read GetItem write SetItem; default;\r\n end;\r\n\r\n TComponentList = class(TObjectList)\r\n Private\r\n FNotifier : TComponent;\r\n Protected\r\n Procedure Notify(Ptr: JSValue; Action: TListNotification); override;\r\n Function GetItems(Index: Integer): TComponent;\r\n Procedure SetItems(Index: Integer; AComponent: TComponent);\r\n Procedure HandleFreeNotify(Sender: TObject; AComponent: TComponent);\r\n public\r\n destructor Destroy; override;\r\n Function Add(AComponent: TComponent): Integer; reintroduce;\r\n Function Extract(Item: TComponent): TComponent; reintroduce;\r\n Function Remove(AComponent: TComponent): Integer; reintroduce;\r\n Function IndexOf(AComponent: TComponent): Integer; reintroduce;\r\n Function First: TComponent; reintroduce;\r\n Function Last: TComponent; reintroduce;\r\n Procedure Insert(Index: Integer; AComponent: TComponent); reintroduce;\r\n property Items[Index: Integer]: TComponent read GetItems write SetItems; default;\r\n end;\r\n\r\n TClassList = class(TList)\r\n protected\r\n Function GetItems(Index: Integer): TClass;\r\n Procedure SetItems(Index: Integer; AClass: TClass);\r\n public\r\n Function Add(AClass: TClass): Integer; reintroduce;\r\n Function Extract(Item: TClass): TClass; reintroduce;\r\n Function Remove(AClass: TClass): Integer; reintroduce;\r\n Function IndexOf(AClass: TClass): Integer; reintroduce;\r\n Function First: TClass; reintroduce;\r\n Function Last: TClass; reintroduce;\r\n Procedure Insert(Index: Integer; AClass: TClass); reintroduce;\r\n property Items[Index: Integer]: TClass read GetItems write SetItems; default;\r\n end;\r\n\r\n TOrderedList = class(TObject)\r\n private\r\n FList: TList;\r\n protected\r\n Procedure PushItem(AItem: JSValue); virtual; abstract;\r\n Function PopItem: JSValue; virtual;\r\n Function PeekItem: JSValue; virtual;\r\n property List: TList read FList;\r\n public\r\n constructor Create; reintroduce;\r\n destructor Destroy; override;\r\n Function Count: Integer;\r\n Function AtLeast(ACount: Integer): Boolean;\r\n Function Push(AItem: JSValue): JSValue;\r\n Function Pop: JSValue;\r\n Function Peek: JSValue;\r\n end;\r\n\r\n{ TStack class }\r\n\r\n TStack = class(TOrderedList)\r\n protected\r\n Procedure PushItem(AItem: JSValue); override;\r\n end;\r\n\r\n{ TObjectStack class }\r\n\r\n TObjectStack = class(TStack)\r\n public\r\n Function Push(AObject: TObject): TObject; reintroduce;\r\n Function Pop: TObject; reintroduce;\r\n Function Peek: TObject; reintroduce;\r\n end;\r\n\r\n{ TQueue class }\r\n\r\n TQueue = class(TOrderedList)\r\n protected\r\n Procedure PushItem(AItem: JSValue); override;\r\n end;\r\n\r\n{ TObjectQueue class }\r\n\r\n TObjectQueue = class(TQueue)\r\n public\r\n Function Push(AObject: TObject): TObject; reintroduce;\r\n Function Pop: TObject; reintroduce;\r\n Function Peek: TObject; reintroduce;\r\n end;\r\n\r\n{ ---------------------------------------------------------------------\r\n Hash support, implemented by Dean Zobec\r\n ---------------------------------------------------------------------}\r\n\r\n\r\n { Must return a Longword value in the range 0..TableSize,\r\n usually via a mod operator; }\r\n THashFunction = Function(const S: string; const TableSize: Longword): Longword;\r\n\r\n\r\n { THTNode }\r\n\r\n THTCustomNode = class(TObject)\r\n private\r\n FKey: string;\r\n public\r\n constructor CreateWith(const AString: String);\r\n Function HasKey(const AKey: string): boolean;\r\n property Key: string read FKey;\r\n end;\r\n THTCustomNodeClass = Class of THTCustomNode;\r\n\r\n\r\n { TFPCustomHashTable }\r\n\r\n TFPCustomHashTable = class(TObject)\r\n private\r\n FHashTable: TFPObjectList;\r\n FHashFunction: THashFunction;\r\n FCount: Longword;\r\n Function GetDensity: Longword;\r\n Function GetNumberOfCollisions: Longword;\r\n Procedure SetHashTableSize(const Value: Longword);\r\n Procedure InitializeHashTable;\r\n Function GetVoidSlots: Longword;\r\n Function GetLoadFactor: double;\r\n Function GetAVGChainLen: double;\r\n Function GetMaxChainLength: Longword;\r\n protected\r\n FHashTableSize: Longword;\r\n Function Chain(const index: Longword):TFPObjectList;\r\n Function CreateNewNode(const aKey : string) : THTCustomNode; virtual; abstract;\r\n Procedure AddNode(ANode : THTCustomNode); virtual; abstract;\r\n Function ChainLength(const ChainIndex: Longword): Longword; virtual;\r\n Function FindOrCreateNew(const aKey: string): THTCustomNode; virtual;\r\n Procedure SetHashFunction(AHashFunction: THashFunction); virtual;\r\n Function FindChainForAdd(Const aKey : String) : TFPObjectList;\r\n public\r\n constructor Create; reintroduce;\r\n constructor CreateWith(AHashTableSize: Longword; aHashFunc: THashFunction);\r\n destructor Destroy; override;\r\n Procedure ChangeTableSize(const ANewSize: Longword); virtual;\r\n Procedure Clear; virtual;\r\n Procedure Delete(const aKey: string); virtual;\r\n Function Find(const aKey: string): THTCustomNode;\r\n Function IsEmpty: boolean;\r\n property HashFunction: THashFunction read FHashFunction write SetHashFunction;\r\n property Count: Longword read FCount;\r\n property HashTableSize: Longword read FHashTableSize write SetHashTableSize;\r\n property HashTable: TFPObjectList read FHashTable;\r\n property VoidSlots: Longword read GetVoidSlots;\r\n property LoadFactor: double read GetLoadFactor;\r\n property AVGChainLen: double read GetAVGChainLen;\r\n property MaxChainLength: Longword read GetMaxChainLength;\r\n property NumberOfCollisions: Longword read GetNumberOfCollisions;\r\n property Density: Longword read GetDensity;\r\n end;\r\n\r\n { TFPDataHashTable : Hash table with simple data JSValues }\r\n\r\n THTDataNode = Class(THTCustomNode)\r\n Private\r\n FData: JSValue;\r\n public\r\n property Data: JSValue read FData write FData;\r\n end;\r\n // For compatibility\r\n THTNode = THTDataNode;\r\n\r\n TDataIteratorMethod = Procedure(Item: JSValue; const Key: string; var Continue: Boolean) of object;\r\n TDataIteratorCallBack = Procedure(Item: JSValue; const Key: string; var Continue: Boolean);\r\n\r\n // For compatibility\r\n TIteratorMethod = TDataIteratorMethod;\r\n\r\n TFPDataHashTable = Class(TFPCustomHashTable)\r\n Private\r\n FIteratorCallBack: TDataIteratorCallBack;\r\n Procedure CallbackIterator(Item: JSValue; const Key: string; var Continue: Boolean);\r\n Protected\r\n Function CreateNewNode(const aKey : String) : THTCustomNode; override;\r\n Procedure AddNode(ANode : THTCustomNode); override;\r\n Procedure SetData(const index: string; const AValue: JSValue); virtual;\r\n Function GetData(const index: string):JSValue; virtual;\r\n Function ForEachCall(aMethod: TDataIteratorMethod): THTDataNode; virtual;\r\n Public\r\n Function Iterate(aMethod: TDataIteratorMethod): JSValue; virtual;\r\n Function Iterate(aMethod: TDataIteratorCallBack): JSValue; virtual;\r\n Procedure Add(const aKey: string; AItem: JSValue); virtual;\r\n property Items[const index: string]: JSValue read GetData write SetData; default;\r\n end;\r\n\r\n { TFPStringHashTable : Hash table with simple strings as data }\r\n THTStringNode = Class(THTCustomNode)\r\n Private\r\n FData : String;\r\n public\r\n property Data: String read FData write FData;\r\n end;\r\n \r\n TStringIteratorMethod = Procedure(Item: String; const Key: string; var Continue: Boolean) of object;\r\n TStringIteratorCallback = Procedure(Item: String; const Key: string; var Continue: Boolean);\r\n\r\n TFPStringHashTable = Class(TFPCustomHashTable)\r\n Private\r\n FIteratorCallBack: TStringIteratorCallback;\r\n Procedure CallbackIterator(Item: String; const Key: string; var Continue: Boolean);\r\n Protected\r\n Function CreateNewNode(const aKey : String) : THTCustomNode; override;\r\n Procedure AddNode(ANode : THTCustomNode); override;\r\n Procedure SetData(const Index, AValue: string); virtual;\r\n Function GetData(const index: string): String; virtual;\r\n Function ForEachCall(aMethod: TStringIteratorMethod): THTStringNode; virtual;\r\n Public\r\n Function Iterate(aMethod: TStringIteratorMethod): String; virtual;\r\n Function Iterate(aMethod: TStringIteratorCallback): String; virtual;\r\n Procedure Add(const aKey,aItem: string); virtual;\r\n property Items[const index: string]: String read GetData write SetData; default;\r\n end;\r\n\r\n { TFPStringHashTable : Hash table with simple strings as data }\r\n\r\n\r\n THTObjectNode = Class(THTCustomNode)\r\n Private\r\n FData : TObject;\r\n public\r\n property Data: TObject read FData write FData;\r\n end;\r\n\r\n THTOwnedObjectNode = Class(THTObjectNode)\r\n public\r\n destructor Destroy; override;\r\n end;\r\n\r\n TObjectIteratorMethod = Procedure(Item: TObject; const Key: string; var Continue: Boolean) of object;\r\n TObjectIteratorCallback = Procedure(Item: TObject; const Key: string; var Continue: Boolean);\r\n\r\n TFPObjectHashTable = Class(TFPCustomHashTable)\r\n Private\r\n FOwnsObjects : Boolean;\r\n FIteratorCallBack: TObjectIteratorCallback;\r\n procedure CallbackIterator(Item: TObject; const Key: string; var Continue: Boolean);\r\n Protected\r\n Function CreateNewNode(const aKey : String) : THTCustomNode; override;\r\n Procedure AddNode(ANode : THTCustomNode); override;\r\n Procedure SetData(const Index: string; AObject : TObject); virtual;\r\n Function GetData(const index: string): TObject; virtual;\r\n Function ForEachCall(aMethod: TObjectIteratorMethod): THTObjectNode; virtual;\r\n Public\r\n constructor Create(AOwnsObjects : Boolean = True); reintroduce;\r\n constructor CreateWith(AHashTableSize: Longword; aHashFunc: THashFunction; AOwnsObjects : Boolean = True); reintroduce;\r\n Function Iterate(aMethod: TObjectIteratorMethod): TObject; virtual;\r\n Function Iterate(aMethod: TObjectIteratorCallback): TObject; virtual;\r\n Procedure Add(const aKey: string; AItem : TObject); virtual;\r\n property Items[const index: string]: TObject read GetData write SetData; default;\r\n Property OwnsObjects : Boolean Read FOwnsObjects;\r\n end;\r\n\r\n EDuplicate = class(Exception);\r\n EKeyNotFound = class(Exception);\r\n\r\n Function RSHash(const S: string; const TableSize: Longword): Longword;\r\n\r\n{ ---------------------------------------------------------------------\r\n Bucket lists as in Delphi\r\n ---------------------------------------------------------------------}\r\n\r\n\r\nType\r\n TBucketItem = record\r\n Item, Data: JSValue;\r\n end;\r\n TBucketItemArray = array of TBucketItem;\r\n\r\n TBucket = record\r\n Count : Integer;\r\n Items : TBucketItemArray;\r\n end;\r\n TBucketArray = array of TBucket;\r\n\r\n TBucketProc = Reference to Procedure(AInfo, AItem, AData: JSValue; out AContinue: Boolean);\r\n\r\n{ ---------------------------------------------------------------------\r\n TCustomBucketList\r\n ---------------------------------------------------------------------}\r\n\r\n { TCustomBucketList }\r\n\r\n TCustomBucketList = class(TObject)\r\n private\r\n FBuckets: TBucketArray;\r\n Function GetBucketCount: Integer;\r\n Function GetData(AItem: JSValue): JSValue;\r\n Procedure SetData(AItem: JSValue; const AData: JSValue);\r\n Procedure SetBucketCount(const Value: Integer);\r\n protected\r\n Procedure GetBucketItem(AItem: JSValue; out ABucket, AIndex: Integer);\r\n Function AddItem(ABucket: Integer; AItem, AData: JSValue): JSValue; virtual;\r\n Function BucketFor(AItem: JSValue): Integer; virtual; abstract;\r\n Function DeleteItem(ABucket: Integer; AIndex: Integer): JSValue; virtual;\r\n Procedure Error(Msg : String; Args : Array of JSValue);\r\n Function FindItem(AItem: JSValue; out ABucket, AIndex: Integer): Boolean; virtual;\r\n property Buckets: TBucketArray read FBuckets;\r\n property BucketCount: Integer read GetBucketCount write SetBucketCount;\r\n public\r\n destructor Destroy; override;\r\n Procedure Clear;\r\n Function Add(AItem, AData: JSValue): JSValue;\r\n Procedure Assign(AList: TCustomBucketList);\r\n Function Exists(AItem: JSValue): Boolean;\r\n Function Find(AItem: JSValue; out AData: JSValue): Boolean;\r\n Function ForEach(AProc: TBucketProc; AInfo: JSValue): Boolean;\r\n Function ForEach(AProc: TBucketProc): Boolean;\r\n Function Remove(AItem: JSValue): JSValue;\r\n property Data[AItem: JSValue]: JSValue read GetData write SetData; default;\r\n end;\r\n\r\n{ ---------------------------------------------------------------------\r\n TBucketList\r\n ---------------------------------------------------------------------}\r\n\r\n\r\n TBucketListSizes = (bl2, bl4, bl8, bl16, bl32, bl64, bl128, bl256);\r\n\r\n { TBucketList }\r\n\r\n TBucketList = class(TCustomBucketList)\r\n private\r\n FBucketMask: Byte;\r\n protected\r\n Function BucketFor(AItem: JSValue): Integer; override;\r\n public\r\n constructor Create(ABuckets: TBucketListSizes = bl16); reintroduce;\r\n end;\r\n\r\n{ ---------------------------------------------------------------------\r\n TObjectBucketList\r\n ---------------------------------------------------------------------}\r\n\r\n { TObjectBucketList }\r\n\r\n TObjectBucketList = class(TBucketList)\r\n protected\r\n Function GetData(AItem: TObject): TObject; reintroduce;\r\n Procedure SetData(AItem: TObject; const AData: TObject); reintroduce;\r\n public\r\n Function Add(AItem, AData: TObject): TObject; reintroduce;\r\n Function Remove(AItem: TObject): TObject; reintroduce;\r\n property Data[AItem: TObject]: TObject read GetData write SetData; default;\r\n end;\r\n\r\n\r\nimplementation\r\n\r\nuses\r\n js;\r\n\r\nResourceString\r\n DuplicateMsg = 'An item with key %0:s already exists';\r\n //KeyNotFoundMsg = 'Method: %0:s key [''%1:s''] not found in container';\r\n NotEmptyMsg = 'Hash table not empty.';\r\n SErrNoSuchItem = 'No item in list for %p';\r\n SDuplicateItem = 'Item already exists in list: %p';\r\n\r\nconst\r\n NPRIMES = 28;\r\n\r\n PRIMELIST: array[0 .. NPRIMES-1] of Longword =\r\n ( 53, 97, 193, 389, 769,\r\n 1543, 3079, 6151, 12289, 24593,\r\n 49157, 98317, 196613, 393241, 786433,\r\n 1572869, 3145739, 6291469, 12582917, 25165843,\r\n 50331653, 100663319, 201326611, 402653189, 805306457,\r\n 1610612741, 3221225473, 4294967291 );\r\n\r\nconstructor TFPObjectList.Create(FreeObjects : boolean);\r\nbegin\r\n Create;\r\n FFreeObjects:=Freeobjects;\r\nend;\r\n\r\ndestructor TFPObjectList.Destroy;\r\nbegin\r\n if (FList <> nil) then\r\n begin\r\n Clear;\r\n FList.Destroy;\r\n end;\r\n inherited Destroy;\r\nend;\r\n\r\nProcedure TFPObjectList.Clear;\r\nvar\r\n i: integer;\r\n O : TObject;\r\nbegin\r\n if FFreeObjects then\r\n for i:=FList.Count-1 downto 0 do\r\n begin\r\n O:=TObject(FList[i]);\r\n FList[i]:=Nil;\r\n O.Free;\r\n end;\r\n FList.Clear;\r\nend;\r\n\r\nconstructor TFPObjectList.Create;\r\nbegin\r\n inherited Create;\r\n FList:=TFPList.Create;\r\n FFreeObjects:=True;\r\nend;\r\n\r\nFunction TFPObjectList.GetCount: integer;\r\nbegin\r\n Result:=FList.Count;\r\nend;\r\n\r\nProcedure TFPObjectList.SetCount(const AValue: integer);\r\nbegin\r\n if FList.Count <> AValue then\r\n FList.Count:=AValue;\r\nend;\r\n\r\nFunction TFPObjectList.GetItem(Index: Integer): TObject;\r\nbegin\r\n Result:=TObject(FList[Index]);\r\nend;\r\n\r\nProcedure TFPObjectList.SetItem(Index: Integer; AObject: TObject);\r\n\r\nVar\r\n O : TObject;\r\n\r\nbegin\r\n if OwnsObjects then\r\n begin\r\n O:=TObject(FList[Index]);\r\n FList[Index]:=AObject;\r\n O.Free;\r\n end\r\n else\r\n FList[index]:=AObject;\r\nend;\r\n\r\nProcedure TFPObjectList.SetCapacity(NewCapacity: Integer);\r\nbegin\r\n FList.Capacity:=NewCapacity;\r\nend;\r\n\r\nFunction TFPObjectList.GetCapacity: integer;\r\nbegin\r\n Result:=FList.Capacity;\r\nend;\r\n\r\nFunction TFPObjectList.Add(AObject: TObject): Integer;\r\nbegin\r\n Result:=FList.Add(AObject);\r\nend;\r\n\r\nProcedure TFPObjectList.Delete(Index: Integer);\r\n\r\nVar\r\n O : TObject;\r\n\r\nbegin\r\n if OwnsObjects then\r\n begin\r\n O:=TObject(FList[Index]);\r\n FList[Index]:=Nil;\r\n O.Free;\r\n end;\r\n FList.Delete(Index);\r\nend;\r\n\r\nProcedure TFPObjectList.Exchange(Index1, Index2: Integer);\r\nbegin\r\n FList.Exchange(Index1, Index2);\r\nend;\r\n\r\nFunction TFPObjectList.Expand: TFPObjectList;\r\nbegin\r\n FList.Expand;\r\n Result:=Self;\r\nend;\r\n\r\nFunction TFPObjectList.Extract(Item: TObject): TObject;\r\nbegin\r\n Result:=TObject(FList.Extract(Item));\r\nend;\r\n\r\nFunction TFPObjectList.Remove(AObject: TObject): Integer;\r\n\r\nVar\r\n O : TObject;\r\n\r\nbegin\r\n Result:=IndexOf(AObject);\r\n if (Result <> -1) then\r\n begin\r\n if OwnsObjects then\r\n begin\r\n O:=TObject(FList[Result]);\r\n FList[Result]:=Nil;\r\n O.Free;\r\n end;\r\n FList.Delete(Result);\r\n end;\r\nend;\r\n\r\nFunction TFPObjectList.IndexOf(AObject: TObject): Integer;\r\nbegin\r\n Result:=FList.IndexOf(JSValue(AObject));\r\nend;\r\n\r\nFunction TFPObjectList.FindInstanceOf(AClass: TClass; AExact: Boolean; AStartAt : Integer): Integer;\r\nvar\r\n I : Integer;\r\nbegin\r\n I:=AStartAt;\r\n Result:=-1;\r\n if AExact then\r\n while (I=Acount)\r\nend;\r\n\r\nFunction TOrderedList.Count: Integer;\r\nbegin\r\n Result:=FList.Count;\r\nend;\r\n\r\nconstructor TOrderedList.Create;\r\nbegin\r\n FList:=Tlist.Create;\r\nend;\r\n\r\ndestructor TOrderedList.Destroy;\r\nbegin\r\n FList.Free;\r\nend;\r\n\r\nFunction TOrderedList.Peek: JSValue;\r\nbegin\r\n if AtLeast(1) then\r\n Result:=PeekItem\r\n else\r\n Result:=nil;\r\nend;\r\n\r\nFunction TOrderedList.PeekItem: JSValue;\r\n\r\nbegin\r\n with Flist do\r\n Result:=Items[Count-1]\r\nend;\r\n\r\nFunction TOrderedList.Pop: JSValue;\r\nbegin\r\n If Atleast(1) then\r\n Result:=PopItem\r\n else\r\n Result:=nil;\r\nend;\r\n\r\nFunction TOrderedList.PopItem: JSValue;\r\nbegin\r\n with FList do\r\n if Count>0 then\r\n begin\r\n Result:=Items[Count-1];\r\n Delete(Count-1);\r\n end\r\n else\r\n Result:=nil;\r\nend;\r\n\r\nFunction TOrderedList.Push(AItem: JSValue): JSValue;\r\nbegin\r\n PushItem(AItem);\r\n Result:=AItem;\r\nend;\r\n\r\n{ TStack }\r\n\r\nProcedure TStack.PushItem(AItem: JSValue);\r\nbegin\r\n FList.Add(AItem);\r\nend;\r\n\r\n{ TObjectStack }\r\n\r\nFunction TObjectStack.Peek: TObject;\r\nbegin\r\n Result:=TObject(inherited Peek);\r\nend;\r\n\r\nFunction TObjectStack.Pop: TObject;\r\nbegin\r\n Result:=TObject(Inherited Pop);\r\nend;\r\n\r\nFunction TObjectStack.Push(AObject: TObject): TObject;\r\nbegin\r\n Result:=TObject(inherited Push(JSValue(AObject)));\r\nend;\r\n\r\n{ TQueue }\r\n\r\nProcedure TQueue.PushItem(AItem: JSValue);\r\nbegin\r\n with FList Do\r\n Insert(0,AItem);\r\nend;\r\n\r\n{ TObjectQueue }\r\n\r\nFunction TObjectQueue.Peek: TObject;\r\nbegin\r\n Result:=TObject(inherited Peek);\r\nend;\r\n\r\nFunction TObjectQueue.Pop: TObject;\r\nbegin\r\n Result:=TObject(inherited Pop);\r\nend;\r\n\r\nFunction TObjectQueue.Push(AObject: TObject): TObject;\r\nbegin\r\n Result:=TObject(inherited Push(JSValue(AObject)));\r\nend;\r\n\r\n\r\n{*****************************************************************************\r\n TFPHashList\r\n*****************************************************************************}\r\n(*\r\n Function FPHash(const s:shortstring):LongWord;\r\n var\r\n p,pmax : PChar;\r\n begin\r\n{$push}\r\n{$Q-}\r\n Result:=0;\r\n p:=@s[1];\r\n pmax:=@s[length(s)+1];\r\n while (p0 then\r\n for i:=1 to Length(S) do\r\n begin\r\n Result:=Result * a + Ord(S[i]);\r\n a:=a * b;\r\n end;\r\n Result:=(Result and $7FFFFFFF) mod TableSize;\r\nend;\r\n\r\n{ THTNode }\r\n\r\nconstructor THTCustomNode.CreateWith(const AString: string);\r\nbegin\r\n inherited Create;\r\n FKey:=AString;\r\nend;\r\n\r\nFunction THTCustomNode.HasKey(const AKey: string): boolean;\r\nbegin\r\n Result:=(AKey=FKey);\r\nend;\r\n\r\n{ TFPCustomHashTable }\r\n\r\nconstructor TFPCustomHashTable.Create;\r\nbegin\r\n CreateWith(196613,@RSHash);\r\nend;\r\n\r\nconstructor TFPCustomHashTable.CreateWith(AHashTableSize: Longword;\r\n aHashFunc: THashFunction);\r\nbegin\r\n inherited Create;\r\n FHashTable:=TFPObjectList.Create(True);\r\n HashTableSize:=AHashTableSize;\r\n FHashFunction:=aHashFunc;\r\nend;\r\n\r\ndestructor TFPCustomHashTable.Destroy;\r\nbegin\r\n FHashTable.Free;\r\n inherited Destroy;\r\nend;\r\n\r\nFunction TFPCustomHashTable.GetDensity: Longword;\r\nbegin\r\n Result:=FHashTableSize - VoidSlots\r\nend;\r\n\r\nFunction TFPCustomHashTable.GetNumberOfCollisions: Longword;\r\nbegin\r\n Result:=FCount -(FHashTableSize - VoidSlots)\r\nend;\r\n\r\nProcedure TFPCustomHashTable.SetHashTableSize(const Value: Longword);\r\nvar\r\n i: Longword;\r\n newSize: Longword;\r\nbegin\r\n if Value <> FHashTableSize then\r\n begin\r\n i:=0;\r\n while (PRIMELIST[i] < Value) and (i < 27) do\r\n Inc(i);\r\n newSize:=PRIMELIST[i];\r\n if Count = 0 then\r\n begin\r\n FHashTableSize:=newSize;\r\n InitializeHashTable;\r\n end\r\n else\r\n ChangeTableSize(newSize);\r\n end;\r\nend;\r\n\r\nProcedure TFPCustomHashTable.InitializeHashTable;\r\nvar\r\n i: LongWord;\r\nbegin\r\n if FHashTableSize>0 Then\r\n for i:=0 to FHashTableSize-1 do\r\n FHashTable.Add(nil);\r\n FCount:=0;\r\nend;\r\n\r\nProcedure TFPCustomHashTable.ChangeTableSize(const ANewSize: Longword);\r\nvar\r\n SavedTable, List: TFPObjectList;\r\n SavedTableSize: Longword;\r\n i, j: Longword;\r\n temp: THTCustomNode;\r\nbegin\r\n SavedTable:=FHashTable;\r\n SavedTableSize:=FHashTableSize;\r\n FHashTableSize:=ANewSize;\r\n FHashTable:=TFPObjectList.Create(True);\r\n InitializeHashTable;\r\n if SavedTableSize>0 Then\r\n for i:=0 to SavedTableSize-1 do\r\n begin\r\n List:=TFPObjectList(SavedTable[i]);\r\n if Assigned(List) then\r\n for j:=0 to List.Count -1 do\r\n begin\r\n temp:=THTCustomNode(List[j]);\r\n AddNode(temp);\r\n end;\r\n end;\r\n SavedTable.Free;\r\nend;\r\n\r\nProcedure TFPCustomHashTable.SetHashFunction(AHashFunction: THashFunction);\r\nbegin\r\n if IsEmpty then\r\n FHashFunction:=AHashFunction\r\n else\r\n raise Exception.Create(NotEmptyMsg);\r\nend;\r\n\r\nFunction TFPCustomHashTable.Find(const aKey: string): THTCustomNode;\r\nvar\r\n hashCode: Longword;\r\n chn: TFPObjectList;\r\n i: Longword;\r\nbegin\r\n hashCode:=FHashFunction(aKey, FHashTableSize);\r\n chn:=Chain(hashCode);\r\n if Assigned(chn) then\r\n if chn.count>0 then\r\n for i:=0 to chn.Count - 1 do\r\n if THTCustomNode(chn[i]).Key=aKey then\r\n Exit(THTCustomNode(chn[i]));\r\n Result:=nil;\r\nend;\r\n\r\nFunction TFPCustomHashTable.FindChainForAdd(Const aKey : String) : TFPObjectList;\r\nvar\r\n hashCode: Longword;\r\n i: Longword;\r\nbegin\r\n hashCode:=FHashFunction(aKey, FHashTableSize);\r\n Result:=Chain(hashCode);\r\n if Assigned(Result) then\r\n begin\r\n if Result.count>0 then\r\n for i:=0 to Result.Count - 1 do\r\n if (THTCustomNode(Result[i]).Key=aKey) then\r\n raise EDuplicate.CreateFmt(DuplicateMsg, [aKey]);\r\n end\r\n else\r\n begin\r\n FHashTable[hashcode]:=TFPObjectList.Create(True);\r\n Result:=Chain(hashCode);\r\n end;\r\n Inc(FCount);\r\nend;\r\n\r\n\r\nProcedure TFPCustomHashTable.Delete(const aKey: string);\r\nvar\r\n hashCode: Longword;\r\n chn: TFPObjectList;\r\n i: Longword;\r\nbegin\r\n hashCode:=FHashFunction(aKey, FHashTableSize);\r\n chn:=Chain(hashCode);\r\n if Assigned(chn) then\r\n if chn.count>0 then\r\n for i:=0 to chn.Count - 1 do\r\n if THTCustomNode(chn[i]).Key=aKey then\r\n begin\r\n chn.Delete(i);\r\n dec(FCount);\r\n Exit;\r\n end;\r\nend;\r\n\r\nFunction TFPCustomHashTable.IsEmpty: boolean;\r\nbegin\r\n Result:=(FCount = 0);\r\nend;\r\n\r\nFunction TFPCustomHashTable.Chain(const index: Longword): TFPObjectList;\r\nbegin\r\n Result:=TFPObjectList(FHashTable[index]);\r\nend;\r\n\r\nFunction TFPCustomHashTable.GetVoidSlots: Longword;\r\nvar\r\n i: Longword;\r\n num: Longword;\r\nbegin\r\n num:=0;\r\n if FHashTableSize>0 then\r\n for i:= 0 to FHashTableSize-1 do\r\n if not Assigned(Chain(i)) then\r\n Inc(num);\r\n Result:=num;\r\nend;\r\n\r\nFunction TFPCustomHashTable.GetLoadFactor: double;\r\nbegin\r\n Result:=Count / FHashTableSize;\r\nend;\r\n\r\nFunction TFPCustomHashTable.GetAVGChainLen: double;\r\nbegin\r\n Result:=Count / (FHashTableSize - VoidSlots);\r\nend;\r\n\r\nFunction TFPCustomHashTable.GetMaxChainLength: Longword;\r\nvar\r\n i: Longword;\r\nbegin\r\n Result:=0;\r\n if FHashTableSize>0 Then\r\n for i:=0 to FHashTableSize-1 do\r\n if ChainLength(i) > Result then\r\n Result:=ChainLength(i);\r\nend;\r\n\r\nFunction TFPCustomHashTable.FindOrCreateNew(const aKey: string): THTCustomNode;\r\nvar\r\n hashCode: Longword;\r\n chn: TFPObjectList;\r\n i: Longword;\r\nbegin\r\n hashCode:=FHashFunction(aKey, FHashTableSize);\r\n chn:=Chain(hashCode);\r\n if Assigned(chn) then\r\n begin\r\n if chn.count>0 then\r\n for i:=0 to chn.Count - 1 do\r\n if (THTCustomNode(chn[i]).Key=aKey) then\r\n Exit(THTNode(chn[i]));\r\n end\r\n else\r\n begin\r\n FHashTable[hashcode]:=TFPObjectList.Create(true);\r\n chn:=Chain(hashcode);\r\n end;\r\n Inc(FCount);\r\n Result:=CreateNewNode(aKey);\r\n chn.Add(Result);\r\nend;\r\n\r\nFunction TFPCustomHashTable.ChainLength(const ChainIndex: Longword): Longword;\r\nbegin\r\n if Assigned(Chain(ChainIndex)) then\r\n Result:=Chain(ChainIndex).Count\r\n else\r\n Result:=0;\r\nend;\r\n\r\nProcedure TFPCustomHashTable.Clear;\r\nvar\r\n i: Longword;\r\nbegin\r\n if FHashTableSize>0 then\r\n for i:=0 to FHashTableSize - 1 do\r\n if Assigned(Chain(i)) then\r\n Chain(i).Clear;\r\n FCount:=0;\r\nend;\r\n\r\n\r\n\r\n{ TFPDataHashTable }\r\n\r\nProcedure TFPDataHashTable.Add(const aKey: string; aItem: JSValue);\r\nvar\r\n chn: TFPObjectList;\r\n NewNode: THtDataNode;\r\nbegin\r\n chn:=FindChainForAdd(akey);\r\n NewNode:=THtDataNode(CreateNewNode(aKey));\r\n NewNode.Data:=aItem;\r\n chn.Add(NewNode);\r\nend;\r\n\r\nFunction TFPDataHashTable.GetData(const Index: string): JSValue;\r\nvar\r\n node: THTDataNode;\r\nbegin\r\n node:=THTDataNode(Find(Index));\r\n if Assigned(node) then\r\n Result:=node.Data\r\n else\r\n Result:=nil;\r\nend;\r\n\r\nProcedure TFPDataHashTable.SetData(const index: string; const AValue: JSValue);\r\nbegin\r\n THTDataNode(FindOrCreateNew(index)).Data:=AValue;\r\nend;\r\n\r\nFunction TFPDataHashTable.CreateNewNode(const aKey : string) : THTCustomNode;\r\n\r\nbegin\r\n Result:=THTDataNode.CreateWith(aKey);\r\nend;\r\n\r\nFunction TFPDataHashTable.Iterate(aMethod: TDataIteratorMethod): JSValue;\r\nvar\r\n N : THTDataNode;\r\nbegin\r\n N:=ForEachCall(AMethod);\r\n if Assigned(N) then\r\n Result:=N.Data\r\n else\r\n Result:=nil;\r\nend;\r\n\r\nProcedure TFPDataHashTable.CallbackIterator(Item: JSValue; const Key: string; var Continue: Boolean);\r\nbegin\r\n FIteratorCallBack(Item, Key, Continue);\r\nend;\r\n\r\nFunction TFPDataHashTable.Iterate(aMethod: TDataIteratorCallBack): JSValue;\r\nbegin\r\n FIteratorCallBack := aMethod;\r\n Result := Iterate(@CallbackIterator);\r\nend;\r\n\r\nFunction TFPDataHashTable.ForEachCall(aMethod: TDataIteratorMethod): THTDataNode;\r\nvar\r\n i, j: Longword;\r\n continue: Boolean;\r\nbegin\r\n Result:=nil;\r\n continue:=true;\r\n if FHashTableSize>0 then\r\n for i:=0 to FHashTableSize-1 do\r\n if Assigned(Chain(i)) then\r\n if chain(i).count>0 then\r\n for j:=0 to Chain(i).Count-1 do\r\n begin\r\n aMethod(THTDataNode(Chain(i)[j]).Data, THTDataNode(Chain(i)[j]).Key, continue);\r\n if not continue then\r\n begin\r\n Result:=THTDataNode(Chain(i)[j]);\r\n Exit;\r\n end;\r\n end;\r\nend;\r\n\r\nProcedure TFPDataHashTable.AddNode(ANode : THTCustomNode);\r\nbegin\r\n with THTDataNode(ANode) do\r\n Add(Key,Data);\r\nend;\r\n\r\n{ TFPStringHashTable }\r\n\r\nProcedure TFPStringHashTable.AddNode(ANode : THTCustomNode);\r\nbegin\r\n with THTStringNode(ANode) do\r\n Add(Key,Data);\r\nend;\r\n\r\nFunction TFPStringHashTable.GetData(const Index: string): String;\r\nvar\r\n node: THTStringNode;\r\nbegin\r\n node:=THTStringNode(Find(Index));\r\n if Assigned(node) then\r\n Result:=node.Data\r\n else\r\n Result:='';\r\nend;\r\n\r\nProcedure TFPStringHashTable.SetData(const index, AValue: string);\r\nbegin\r\n THTStringNode(FindOrCreateNew(index)).Data:=AValue;\r\nend;\r\n\r\nProcedure TFPStringHashTable.Add(const aKey, aItem: string);\r\nvar\r\n chn: TFPObjectList;\r\n NewNode: THtStringNode;\r\nbegin\r\n chn:=FindChainForAdd(akey);\r\n NewNode:=THtStringNode(CreateNewNode(aKey));\r\n NewNode.Data:=aItem;\r\n chn.Add(NewNode);\r\nend;\r\n\r\nFunction TFPStringHashTable.CreateNewNode(const aKey : string) : THTCustomNode;\r\nbegin\r\n Result:=THTStringNode.CreateWith(aKey);\r\nend;\r\n\r\nFunction TFPStringHashTable.Iterate(aMethod: TStringIteratorMethod): String;\r\nvar\r\n N : THTStringNode;\r\nbegin\r\n N:=ForEachCall(AMethod);\r\n if Assigned(N) then\r\n Result:=N.Data\r\n else\r\n Result:='';\r\nend;\r\n\r\nProcedure TFPStringHashTable.CallbackIterator(Item: String; const Key: string; var Continue: Boolean);\r\nbegin\r\n FIteratorCallBack(Item, Key, Continue);\r\nend;\r\n\r\nFunction TFPStringHashTable.Iterate(aMethod: TStringIteratorCallback): String;\r\nbegin\r\n FIteratorCallBack := aMethod;\r\n Result := Iterate(@CallbackIterator);\r\nend;\r\n\r\nFunction TFPStringHashTable.ForEachCall(aMethod: TStringIteratorMethod): THTStringNode;\r\nvar\r\n i, j: Longword;\r\n continue: boolean;\r\nbegin\r\n Result:=nil;\r\n continue:=True;\r\n if FHashTableSize>0 then\r\n for i:=0 to FHashTableSize-1 do\r\n if Assigned(Chain(i)) then\r\n if chain(i).Count>0 then\r\n for j:=0 to Chain(i).Count-1 do\r\n begin\r\n aMethod(THTStringNode(Chain(i)[j]).Data, THTStringNode(Chain(i)[j]).Key, continue);\r\n if not continue then\r\n begin\r\n Result:=THTStringNode(Chain(i)[j]);\r\n Exit;\r\n end;\r\n end;\r\nend;\r\n\r\n{ TFPObjectHashTable }\r\n\r\nProcedure TFPObjectHashTable.AddNode(ANode : THTCustomNode);\r\nbegin\r\n With THTObjectNode(ANode) do\r\n Add(Key,Data);\r\nend;\r\n\r\nFunction TFPObjectHashTable.GetData(const Index: string): TObject;\r\nvar\r\n node: THTObjectNode;\r\nbegin\r\n node:=THTObjectNode(Find(Index));\r\n if Assigned(node) then\r\n Result:=node.Data\r\n else\r\n Result:=nil;\r\nend;\r\n\r\nProcedure TFPObjectHashTable.SetData(const index : string; AObject : TObject);\r\nbegin\r\n THTObjectNode(FindOrCreateNew(index)).Data:=AObject;\r\nend;\r\n\r\nProcedure TFPObjectHashTable.Add(const aKey: string; AItem : TObject);\r\nvar\r\n chn: TFPObjectList;\r\n NewNode: THTObjectNode;\r\nbegin\r\n chn:=FindChainForAdd(akey);\r\n NewNode:=THTObjectNode(CreateNewNode(aKey));\r\n NewNode.Data:=aItem;\r\n chn.Add(NewNode);\r\nend;\r\n\r\nFunction TFPObjectHashTable.CreateNewNode(const aKey : string) : THTCustomNode;\r\nbegin\r\n if OwnsObjects then\r\n Result:=THTOwnedObjectNode.CreateWith(aKey)\r\n else\r\n Result:=THTObjectNode.CreateWith(aKey);\r\nend;\r\n\r\n\r\nFunction TFPObjectHashTable.Iterate(aMethod: TObjectIteratorMethod): TObject;\r\nvar\r\n N : THTObjectNode;\r\nbegin\r\n N:=ForEachCall(AMethod);\r\n if Assigned(N) then\r\n Result:=N.Data\r\n else\r\n Result:=nil;\r\nend;\r\n\r\nProcedure TFPObjectHashTable.CallbackIterator(Item: TObject; const Key: string; var Continue: Boolean);\r\nbegin\r\n FIteratorCallBack(Item, Key, Continue);\r\nend;\r\n\r\nFunction TFPObjectHashTable.Iterate(aMethod: TObjectIteratorCallback): TObject;\r\nbegin\r\n FIteratorCallBack := aMethod;\r\n Result := Iterate(@CallbackIterator);\r\nend;\r\n\r\nFunction TFPObjectHashTable.ForEachCall(aMethod: TObjectIteratorMethod): THTObjectNode;\r\nvar\r\n i, j: Longword;\r\n continue: boolean;\r\nbegin\r\n Result:=nil;\r\n continue:=true;\r\n if FHashTableSize>0 then\r\n for i:=0 to FHashTableSize-1 do\r\n if Assigned(Chain(i)) then\r\n if Chain(i).Count>0 then\r\n for j:=0 to Chain(i).Count-1 do\r\n begin\r\n aMethod(THTObjectNode(Chain(i)[j]).Data, THTObjectNode(Chain(i)[j]).Key, continue);\r\n if not continue then\r\n begin\r\n Result:=THTObjectNode(Chain(i)[j]);\r\n Exit;\r\n end;\r\n end;\r\nend;\r\n\r\nconstructor TFPObjectHashTable.Create(AOwnsObjects : Boolean = True);\r\nbegin\r\n inherited Create;\r\n FOwnsObjects:=AOwnsObjects;\r\nend;\r\n\r\nconstructor TFPObjectHashTable.CreateWith(AHashTableSize: Longword; aHashFunc: THashFunction; AOwnsObjects : Boolean = True);\r\nbegin\r\n inherited CreateWith(AHashTableSize,AHashFunc);\r\n FOwnsObjects:=AOwnsObjects;\r\nend;\r\n\r\ndestructor THTOwnedObjectNode.Destroy;\r\nbegin\r\n FreeAndNil(FData);\r\n inherited;\r\nend;\r\n\r\n{ TCustomBucketList }\r\n\r\nFunction TCustomBucketList.GetData(AItem: JSValue): JSValue;\r\nvar\r\n B,I : Integer;\r\nbegin\r\n GetBucketItem(AItem,B,I);\r\n Result:=FBuckets[B].Items[I].Data;\r\nend;\r\n\r\nFunction TCustomBucketList.GetBucketCount: Integer;\r\nbegin\r\n Result:=Length(FBuckets);\r\nend;\r\n\r\nProcedure TCustomBucketList.SetData(AItem: JSValue; const AData: JSValue);\r\nvar\r\n B,I : Integer;\r\nbegin\r\n GetBucketItem(AItem,B,I);\r\n FBuckets[B].Items[I].Data:=AData;\r\nend;\r\n\r\nProcedure TCustomBucketList.SetBucketCount(const Value: Integer);\r\nbegin\r\n if (Value<>GetBucketCount) then\r\n SetLength(FBuckets,Value);\r\nend;\r\n\r\nProcedure TCustomBucketList.GetBucketItem(AItem: JSValue; out ABucket,\r\n AIndex: Integer);\r\nbegin\r\n if not FindItem(AItem,ABucket,AIndex) then\r\n Error(SErrNoSuchItem,[AItem]);\r\nend;\r\n\r\nFunction TCustomBucketList.AddItem(ABucket: Integer; AItem, AData: JSValue\r\n ): JSValue;\r\nvar\r\n L : Integer;\r\nbegin\r\n L:=Length(FBuckets[ABucket].Items);\r\n if (FBuckets[ABucket].Count=L) then\r\n begin\r\n if L<8 then\r\n L:=8\r\n else\r\n L:=L+L div 2;\r\n SetLength(FBuckets[ABucket].Items,L);\r\n end;\r\n with FBuckets[ABucket] do\r\n begin\r\n Items[Count].Item:=AItem;\r\n Items[Count].Data:=AData;\r\n Result:=AData;\r\n Inc(Count);\r\n end;\r\nend;\r\n\r\nFunction TCustomBucketList.DeleteItem(ABucket: Integer; AIndex: Integer): JSValue;\r\nvar\r\n I,L : Integer;\r\nbegin\r\n Result:=FBuckets[ABucket].Items[AIndex].Data;\r\n if FBuckets[ABucket].Count=1 then\r\n SetLength(FBuckets[ABucket].Items,0)\r\n else\r\n begin\r\n L:=(FBuckets[ABucket].Count-AIndex-1);// No point in moving if last one...\r\n For I:=0 to L-1 do\r\n FBuckets[ABucket].Items[AIndex+I]:=FBuckets[ABucket].Items[AIndex+I+1];\r\n end;\r\n Dec(FBuckets[ABucket].Count);\r\nend;\r\n\r\nProcedure TCustomBucketList.Error(Msg: String; Args: array of JSValue);\r\nbegin\r\n raise ElistError.CreateFmt(Msg,Args);\r\nend;\r\n\r\nFunction TCustomBucketList.FindItem(AItem: JSValue; out ABucket, AIndex: Integer\r\n ): Boolean;\r\nvar\r\n I : Integer;\r\n B : TBucket;\r\nbegin\r\n ABucket:=BucketFor(AItem);\r\n B:=FBuckets[ABucket];\r\n I:=B.Count-1;\r\n while (I>=0) and (B.Items[I].Item<>AItem) do\r\n Dec(I);\r\n Result:=I>=0;\r\n if Result then\r\n AIndex:=I;\r\nend;\r\n\r\ndestructor TCustomBucketList.Destroy;\r\nbegin\r\n Clear;\r\n inherited Destroy;\r\nend;\r\n\r\nProcedure TCustomBucketList.Clear;\r\nvar\r\n B : TBucket;\r\n I,J : Integer;\r\nbegin\r\n for I:=0 to Length(FBuckets)-1 do\r\n begin\r\n B:=FBuckets[I];\r\n for J:=B.Count-1 downto 0 do\r\n DeleteItem(I,J);\r\n end;\r\n SetLength(FBuckets,0);\r\nend;\r\n\r\nFunction TCustomBucketList.Add(AItem, AData: JSValue): JSValue;\r\nvar\r\n B,I : Integer;\r\nbegin\r\n if FindItem(AItem,B,I) then\r\n Error(SDuplicateItem,[AItem]);\r\n Result:=AddItem(B,AItem,AData);\r\nend;\r\n\r\nProcedure TCustomBucketList.Assign(AList: TCustomBucketList);\r\nvar\r\n I,J : Integer;\r\nbegin\r\n Clear;\r\n SetLength(FBuckets,Length(Alist.FBuckets));\r\n for I:=0 to BucketCount-1 do\r\n begin\r\n SetLength(FBuckets[i].Items,Length(AList.Fbuckets[I].Items));\r\n for J:=0 to AList.Fbuckets[I].Count-1 do\r\n with AList.Fbuckets[I].Items[J] do\r\n AddItem(I,Item,Data);\r\n end;\r\nend;\r\n\r\nFunction TCustomBucketList.Exists(AItem: JSValue): Boolean;\r\nvar\r\n B,I : Integer;\r\nbegin\r\n Result:=FindItem(AItem,B,I);\r\nend;\r\n\r\nFunction TCustomBucketList.Find(AItem: JSValue; out AData: JSValue): Boolean;\r\nvar\r\n B,I : integer;\r\nbegin\r\n Result:=FindItem(AItem,B,I);\r\n if Result then\r\n AData:=FBuckets[B].Items[I].Data;\r\nend;\r\n\r\nFunction TCustomBucketList.ForEach(AProc: TBucketProc): Boolean;\r\nbegin\r\n Result:=Foreach(aProc,Null);\r\nend;\r\n\r\nFunction TCustomBucketList.ForEach(AProc: TBucketProc; AInfo: JSValue): Boolean;\r\nvar\r\n I,J,S : Integer;\r\n Bu : TBucket;\r\nbegin\r\n I:=0;\r\n Result:=True;\r\n S:=GetBucketCount;\r\n while Result and (I (h/newh))\r\n {\r\n newh = h / (w/neww);\r\n }\r\n else\r\n {\r\n neww = w / (h/newh);\r\n }\r\n }\r\n var LCanvas = document.createElement('CANVAS');\r\n var ctx = LCanvas.getContext(\"2d\");\r\n ctx.drawImage(LImg, 0, 0, neww, newh);\r\n var res = LCanvas.toDataURL(\"image/png\");\r\n ThumbnailReady(res);\r\n }\r\n end;\r\n\r\n LImg['src'] := ADataURL;\r\nend;\r\n\r\nfunction CSSFont(Font: TFont): string;\r\nvar\r\n res,fs: string;\r\nbegin\r\n res := 'font-family:'+ Font.Name+';';\r\n res := res + 'font-style: normal;';\r\n\r\n if fsBold in Font.Style then\r\n res := res + 'font-weight: bold;';\r\n\r\n if fsItalic in Font.Style then\r\n res := res + 'font-style: italic;';\r\n\r\n fs := '';\r\n\r\n if fsUnderline in Font.Style then\r\n fs := fs + ' underline';\r\n\r\n if fsStrikeOut in Font.Style then\r\n fs:= fs + ' line-through';\r\n\r\n if (fs <> '') then\r\n res := res + 'text-decoration:' + fs+';';\r\n\r\n res := res + 'font-size:'+ IntToStr(Font.Size) + 'pt;';\r\n\r\n Result := res;\r\nend;\r\n\r\n\r\nfunction CreateCanvasRectF(Left, Top, Right, Bottom: Double): TCanvasRectF;\r\nbegin\r\n Result.Left := Left;\r\n Result.Top := Top;\r\n Result.Right := Right;\r\n Result.Bottom := Bottom;\r\nend;\r\n\r\nfunction CreateCanvasPointF(X, Y: Double): TCanvasPointF;\r\nbegin\r\n Result.X := X;\r\n Result.Y := Y;\r\nend;\r\n\r\nfunction CreateCanvasSizeF(cx, cy: Double): TCanvasSizeF;\r\nbegin\r\n Result.cx := cx;\r\n Result.cy := cy;\r\nend;\r\n\r\nfunction GetRValue(rgb: NativeInt): Byte;\r\nbegin\r\n Result := Byte(rgb and $FF);\r\nend;\r\n\r\nfunction GetGValue(rgb: NativeInt): Byte;\r\nbegin\r\n Result := Byte((rgb shr 8) and $FF);\r\nend;\r\n\r\nfunction GetBValue(rgb: NativeInt): Byte;\r\nbegin\r\n Result := Byte((rgb shr 16) and $FF);\r\nend;\r\n\r\nfunction ColorToRGB(Color: TColor): Longint;\r\nbegin\r\n Result := Color;\r\nend;\r\n\r\nfunction ColorToHex(c: TColor): string;\r\nvar\r\n s: string;\r\nbegin\r\n asm\r\n s = c.toString(16);\r\n\r\n while (s.length < 6)\r\n {\r\n s = \"0\" + s;\r\n }\r\n end;\r\n\r\n Result := Copy(s,5,2) + Copy(s,3,2) + Copy(s,1,2);\r\nend;\r\n\r\nfunction ColorToHTML(c: TColor): string;\r\nbegin\r\n Result := '#' + ColorToHex(c);\r\nend;\r\n\r\nfunction HTMLToColor(s: string): TColor;\r\nbegin\r\n if pos('#',s) = 1 then\r\n Delete(s,1,1);\r\n\r\n Result := HexToColor(s);\r\nend;\r\n\r\nfunction ColorToString(Color: TColor): string;\r\nbegin\r\n case Color of\r\n clNone: Result := 'clNone';\r\n clBlack: Result := 'clBlack';\r\n clMaroon: Result := 'clMaroon';\r\n clGreen: Result := 'clGreen';\r\n clOlive: Result := 'clOlive';\r\n clNavy: Result := 'clNavy';\r\n clPurple: Result := 'clPurple';\r\n clTeal: Result := 'clTeal';\r\n clGray: Result := 'clGray';\r\n clSilver: Result := 'clSilver';\r\n clRed: Result := 'clRed';\r\n clLime: Result := 'clLime';\r\n clYellow: Result := 'clYellow';\r\n clBlue: Result := 'clBlue';\r\n clFuchsia: Result := 'clFuchsia';\r\n clAqua: Result := 'clAqua';\r\n clWhite: Result := 'clWhite';\r\n clLtGray: Result := 'clLtGray';\r\n clDkGray: Result := 'clDkGray';\r\n clDefault: Result := 'clDefault';\r\n clBtnFace: Result := 'clBtnFace';\r\n clWindowText: Result := 'clWindowText';\r\n clWindow: Result := 'clWindow';\r\n clHighlight: Result := 'clHighlight';\r\n clHighlightText: Result :='clHighlightText';\r\n clInfoText: Result :='clInfoText';\r\n clInfoBk: Result := 'clInfoBk';\r\n clActiveCaption: Result := 'clActiveCaption';\r\n clInactiveCaption: Result := 'clInactiveCaption';\r\n clHotLight: Result := 'clHotLight'\r\n else\r\n Result := '$' + ColorToHex(Color);\r\n end;\r\nend;\r\n\r\nfunction StringToColor(const S: string): TColor;\r\nvar\r\n us: string;\r\nbegin\r\n us := Uppercase(s);\r\n if (us = 'CLNONE') then Result := clNone else\r\n if (us = 'CLBLACK') then Result := clBlack else\r\n if (us = 'CLMAROON') then Result := clMaroon else\r\n if (us = 'CLGREEN') then Result := clGreen else\r\n if (us = 'CLOLIVE') then Result := clOlive else\r\n if (us = 'CLNAVY') then Result := clNavy else\r\n if (us = 'CLPURPLE') then Result := clPurple else\r\n if (us = 'CLTEAL') then Result := clTeal else\r\n if (us = 'CLGRAY') then Result := clGray else\r\n if (us = 'CLSILVER') then Result := clSilver else\r\n if (us = 'CLRED') then Result := clRed else\r\n if (us = 'CLLIME') then Result := clLime else\r\n if (us = 'CLYELLOW') then Result := clYellow else\r\n if (us = 'CLBLUE') then Result := clBlue else\r\n if (us = 'CLFUCHSIA') then Result := clFuchsia else\r\n if (us = 'CLAQUA') then Result := clAqua else\r\n if (us = 'CLWHITE') then Result := clWhite else\r\n if (us = 'CLLTGRAY') then Result := clLtGray else\r\n if (us = 'CLDKGRAY') then Result := clDkGray else\r\n if (us = 'CLDEFAULT') then Result := clDefault else\r\n if (us = 'CLBTNFACE') then Result := clBtnFace else\r\n if (us = 'CLWINDOWTEXT') then Result := clWindowText else\r\n if (us = 'CLWINDOW') then Result := clWindow else\r\n if (us = 'CLHIGHLIGHT') then Result := clHighlight else\r\n if (us = 'CLHIGHLIGHTTEXT') then Result := clWhite else\r\n if (us = 'CLINFOTEXT') then Result := clInfoText else\r\n if (us = 'CLINFOBK') then Result := clInfoBk else\r\n if (us = 'CLACTIVECAPTION') then Result := clActiveCaption else\r\n if (us = 'CLINACTIVECAPTION') then Result := clInactiveCaption else\r\n if (us = 'CLHOTLIGHT') then Result := clHotLight else\r\n Result := HexToColor(us);\r\nend;\r\n\r\n\r\nfunction RGBToColor(argb: string): TColor;\r\nvar\r\n r,g,b: string;\r\n ri,gi,bi: byte;\r\n e: integer;\r\nbegin\r\n Result := clNone;\r\n\r\n argb := Trim(argb);\r\n\r\n if pos('RGB', uppercase(argb)) > 0 then\r\n begin\r\n delete(argb,1,4);\r\n\r\n r := copy(argb,1, pos(',', argb) -1);\r\n delete(argb, 1, pos(',', argb) + 1);\r\n\r\n g := copy(argb,1, pos(',', argb) -1);\r\n delete(argb, 1, pos(',', argb) + 1);\r\n\r\n b := copy(argb,1, pos(')', argb) -1);\r\n\r\n val(r, ri, e);\r\n val(g, gi, e);\r\n val(b, bi, e);\r\n\r\n Result := RGB(ri,gi,bi);\r\n end;\r\nend;\r\n\r\nfunction HexToColor(h: string): TColor;\r\nvar\r\n s: string;\r\n i: integer;\r\nbegin\r\n s := '';\r\n for i := 1 to Length(h) do\r\n begin\r\n // accept hex chars\r\n if ((h[i] >='0') and (h[i] <= '9')) or ((h[i] >='A') and (h[i] <= 'F') or ((h[i] >='a') and (h[i] <= 'f'))) then\r\n s := s + h[i];\r\n end;\r\n\r\n s := '$' + Copy(s,5,2) + Copy(s,3,2) + Copy(s,1,2);\r\n Result := StrToInt64(s);\r\nend;\r\n\r\nfunction HTMLChar(h: string): integer;\r\nbegin\r\n // fmt ꯍ\r\n Delete(h,1,3);\r\n Delete(h,Length(h) - 1, 1);\r\n Result := StrToInt('0x' + h);\r\nend;\r\n\r\nfunction FontSizeToHTML(sz: Double): string;\r\nbegin\r\n Result := FloatToStr(sz)+'px';\r\n Result := StringReplace(Result, ',', '.', [rfReplaceAll]);\r\nend;\r\n\r\n\r\nfunction CharSetToIdent(ACharSet: TFontCharSet): string;\r\nbegin\r\n case ACharSet of\r\n ANSI_CHARSET: Result := 'ANSI_CHARSET';\r\n DEFAULT_CHARSET: Result := 'DEFAULT_CHARSET';\r\n SYMBOL_CHARSET: Result := 'SYMBOL_CHARSET';\r\n MAC_CHARSET: Result := 'MAC_CHARSET';\r\n SHIFTJIS_CHARSET: Result := 'SHIFTJIS_CHARSET';\r\n HANGEUL_CHARSET: Result := 'HANGEUL_CHARSET';\r\n JOHAB_CHARSET: Result := 'JOHAB_CHARSET';\r\n GB2312_CHARSET: Result := 'GB2312_CHARSET';\r\n CHINESEBIG5_CHARSET: Result := 'CHINESEBIG5_CHARSET';\r\n GREEK_CHARSET: Result := 'GREEK_CHARSET';\r\n TURKISH_CHARSET: Result := 'TURKISH_CHARSET';\r\n HEBREW_CHARSET: Result := 'HEBREW_CHARSET';\r\n ARABIC_CHARSET: Result := 'ARABIC_CHARSET';\r\n BALTIC_CHARSET: Result := 'BALTIC_CHARSET';\r\n RUSSIAN_CHARSET: Result := 'RUSSIAN_CHARSET';\r\n THAI_CHARSET: Result := 'THAI_CHARSET';\r\n EASTEUROPE_CHARSET: Result := 'EASTEUROPE_CHARSET';\r\n OEM_CHARSET: Result := 'OEM_CHARSET';\r\n end;\r\nend;\r\n\r\nfunction IdentToCharSet(const S: string): TFontCharSet;\r\nbegin\r\n if S = 'ANSI_CHARSET' then Result := ANSI_CHARSET;\r\n if S = 'DEFAULT_CHARSET' then Result := DEFAULT_CHARSET;\r\n if S = 'SYMBOL_CHARSET' then Result := SYMBOL_CHARSET;\r\n if S = 'MAC_CHARSET' then Result := MAC_CHARSET;\r\n if S = 'SHIFTJIS_CHARSET' then Result := SHIFTJIS_CHARSET;\r\n if S = 'HANGEUL_CHARSET' then Result := HANGEUL_CHARSET;\r\n if S = 'JOHAB_CHARSET' then Result := JOHAB_CHARSET;\r\n if S = 'GB2312_CHARSET' then Result := GB2312_CHARSET;\r\n if S = 'CHINESEBIG5_CHARSET' then Result := CHINESEBIG5_CHARSET;\r\n if S = 'GREEK_CHARSET' then Result := GREEK_CHARSET;\r\n if S = 'TURKISH_CHARSET' then Result := TURKISH_CHARSET;\r\n if S = 'HEBREW_CHARSET' then Result := HEBREW_CHARSET;\r\n if S = 'ARABIC_CHARSET' then Result := ARABIC_CHARSET;\r\n if S = 'BALTIC_CHARSET' then Result := BALTIC_CHARSET;\r\n if S = 'RUSSIAN_CHARSET' then Result := RUSSIAN_CHARSET;\r\n if S = 'THAI_CHARSET' then Result := THAI_CHARSET;\r\n if S = 'EASTEUROPE_CHARSET' then Result := EASTEUROPE_CHARSET;\r\n if S = 'OEM_CHARSET' then Result := OEM_CHARSET;\r\nend;\r\n\r\n{ TPen }\r\n\r\nprocedure TPen.Assign(Source: TPersistent);\r\nbegin\r\n if (Source is TPen) then\r\n begin\r\n FColor := (Source as TPen).Color;\r\n FStyle := (Source as TPen).Style;\r\n FWidth := (Source as TPen).Width;\r\n end\r\n else\r\n inherited;\r\nend;\r\n\r\nconstructor TPen.Create;\r\nbegin\r\n FColor := clBlack;\r\n FWidth := 1;\r\n FStyle := psSolid;\r\n FMode := pmCopy;\r\nend;\r\n\r\nprocedure TPen.SetColor(const Value: TColor);\r\nbegin\r\n FColor := Value;\r\nend;\r\n\r\n{ TBrush }\r\n\r\nprocedure TBrush.Assign(Source: TPersistent);\r\nbegin\r\n if (Source is TBrush) then\r\n begin\r\n FColor := (Source as TBrush).Color;\r\n FStyle := (Source as TBrush).Style;\r\n end\r\n else\r\n inherited;\r\nend;\r\n\r\nfunction FontSizeToPx(sz: Double): Double;\r\nbegin\r\n Result := sz * 96 / 72;\r\nend;\r\n\r\nconstructor TBrush.Create;\r\nbegin\r\n FColor := clWhite;\r\n FStyle := bsSolid;\r\nend;\r\n\r\n{ TFont }\r\n\r\nprocedure TFont.Assign(Source: TPersistent);\r\nbegin\r\n if (Source is TFont) then\r\n begin\r\n FName := (Source as TFont).Name;\r\n FColor := (Source as TFont).Color;\r\n FSize := (Source as TFont).Size;\r\n FStyle := (Source as TFont).Style;\r\n DoChange;\r\n end\r\n else\r\n inherited;\r\nend;\r\n\r\nfunction TFont.ToString: string;\r\nvar\r\n s: string;\r\nbegin\r\n s := '';\r\n if (TFontStyle.fsBold in Style) and (TFontStyle.fsItalic in Style) then\r\n s := s + 'bold italic'\r\n else if TFontStyle.fsBold in Style then\r\n s := s + 'bold'\r\n else if TFontStyle.fsItalic in Style then\r\n s := s + 'italic';\r\n\r\n Result := s + ' ' + FontSizeToHTML(FontSizeToPx(Size)) + ' ' + Name;\r\nend;\r\n\r\nprocedure TFont.SetName(const AName: string);\r\nbegin\r\n if (FName <> AName) then\r\n begin\r\n FName := AName;\r\n DoChange;\r\n end;\r\nend;\r\n\r\nprocedure TFont.SetSize(const ASize: Integer);\r\nbegin\r\n if (FSize <> ASize) then\r\n begin\r\n FSize := ASize;\r\n DoChange;\r\n end;\r\nend;\r\n\r\nprocedure TFont.SetColor(const AColor: TColor);\r\nbegin\r\n if (FColor <> AColor) then\r\n begin\r\n FColor := AColor;\r\n DoChange;\r\n end;\r\nend;\r\n\r\nprocedure TFont.SetHeight(const Value: Integer);\r\nvar\r\n d: double;\r\nbegin\r\n FHeight := Value;\r\n d := -FHeight * 72/96;\r\n FSize := Round(d);\r\n DoChange;\r\nend;\r\n\r\nprocedure TFont.SetStyle(const AStyle: TFontStyles);\r\nbegin\r\n FStyle := AStyle;\r\n DoChange;\r\nend;\r\n\r\nconstructor TFont.Create;\r\nbegin\r\n inherited;\r\n FName := WEBDEFAULTFONT;\r\n FSize := 8;\r\n FStyle := [];\r\n FColor := clBlack;\r\nend;\r\n\r\nprocedure TFont.DoChange;\r\nbegin\r\n if Assigned(OnChange) then\r\n OnChange(Self);\r\nend;\r\n\r\n{ TCanvas }\r\n\r\nprocedure TCanvas.AngleArc(X, Y, Radius: Double; StartAngle,\r\n SweepAngle: Double);\r\nbegin\r\n if Assigned(FContext) then\r\n begin\r\n FContext.beginPath();\r\n ApplyStroke;\r\n FContext.arc(X, Y, Radius, StartAngle, StartAngle + SweepAngle);\r\n FContext.stroke();\r\n end;\r\nend;\r\n\r\nprocedure TCanvas.ApplyFill;\r\nbegin\r\n if Assigned(FContext) then\r\n FContext.fillStyle := ColorToHtml(Brush.Color);\r\nend;\r\n\r\nprocedure TCanvas.ApplyStroke;\r\nbegin\r\n if Assigned(FContext) then\r\n begin\r\n FContext.lineWidth := Pen.Width;\r\n FContext.strokeStyleAsColor := ColorToHtml(Pen.Color);\r\n case Pen.Style of\r\n psSolid: FContext.setlinedash([]);\r\n psDot: FContext.setlinedash([1,2]);\r\n psDash: FContext.setlinedash([8,2]);\r\n psDashDot: FContext.setlinedash([6,2,2,2]);\r\n psDashDotDot: FContext.setlinedash([6,2,2,2,2,2]);\r\n psClear: FContext.setlinedash([0, $FFFF]);\r\n end;\r\n end;\r\nend;\r\n\r\nfunction AngleOfPoints(x1,y1,x2,y2:double):double;\r\nvar\r\n part1, part2:double;\r\n angle:double;\r\nbegin\r\n if (x1=x2) and (y1=y2) then\r\n begin\r\n Result:=0.0;\r\n Exit;\r\n end;\r\n\r\n part1 := abs(y2 - y1);\r\n if (part1=0) then\r\n begin\r\n part1:=0.0000001;\r\n y1 := y1+0.0000001;\r\n end;\r\n\r\n part2 := abs(x2- x1);\r\n if (part2=0) then\r\n begin\r\n part2:=0.0000001;\r\n x1 := x1 + 0.0000001;\r\n end;\r\n\r\n angle := arctan(part1/part2);\r\n\r\n if ((x1>x2) and (y1x2) and (y1>y2)) then angle:=angle +PI;\r\n if ((x1y2)) then angle:=2*PI-angle;\r\n\r\n while angle>= 2*PI do\r\n angle := angle - 2*PI;\r\n while angle < 0 do\r\n angle := angle + 2*PI;\r\n Result := angle;\r\nend;\r\n\r\nprocedure TCanvas.Arc(X1, Y1, X2, Y2, X3, Y3, X4, Y4: Integer);\r\nvar\r\n rx,ry: integer;\r\n angleStart,angleEnd: double;\r\nbegin\r\n if Assigned(FContext) then\r\n begin\r\n rx := (X2-X1) div 2;\r\n ry := (Y2-Y1) div 2;\r\n\r\n angleStart := AngleOfPoints(X1+rx,Y1+ry,X4,Y4);\r\n angleEnd := AngleOfPoints(X1+rx,Y1+ry,X3,Y3);\r\n\r\n FContext.beginPath();\r\n ApplyStroke;\r\n FContext.ellipse(X1+rx,Y1+ry,rx,ry,0,angleStart,angleEnd);\r\n FContext.stroke();\r\n end;\r\nend;\r\n\r\nprocedure TCanvas.PathBegin;\r\nbegin\r\n if Assigned(FContext) then\r\n FContext.beginPath();\r\nend;\r\n\r\nprocedure TCanvas.BeginScene;\r\nbegin\r\n if Assigned(OnBeginScene) then\r\n OnBeginScene(Self);\r\nend;\r\n\r\nprocedure TCanvas.Clear;\r\nbegin\r\n if Assigned(FContext) and Assigned(FElementCanvas) then\r\n FContext.clearRect(0, 0, FElementCanvas.width, FElementCanvas.height);\r\nend;\r\n\r\nprocedure TCanvas.Clear(AColor: TColor);\r\nvar\r\n c: TColor;\r\n s: TBrushStyle;\r\nbegin\r\n Clear;\r\n if Assigned(FElementCanvas) then\r\n begin\r\n c := Brush.Color;\r\n s := Brush.Style;\r\n Brush.Color := AColor;\r\n Brush.Style := bsSolid;\r\n FillRect(Rect(0, 0, FElementCanvas.width, FElementCanvas.height));\r\n Brush.Color := c;\r\n Brush.Style := s;\r\n end;\r\nend;\r\n\r\nprocedure TCanvas.Clip;\r\nbegin\r\n if Assigned(FContext) then\r\n FContext.clip;\r\nend;\r\n\r\nprocedure TCanvas.CopyRect(const DestRect: TRect; Canvas: TCanvas;\r\n SourceRect: TRect);\r\nvar\r\n sw,sh: integer;\r\n dw,dh: integer;\r\n imgData: TJSImageData;\r\n ACanvas: TCanvas;\r\nbegin\r\n if Assigned(FContext) then\r\n begin\r\n sw := SourceRect.Right - SourceRect.Left;\r\n sh := SourceRect.Bottom - SourceRect.Top;\r\n\r\n dw := DestRect.Right - DestRect.Left;\r\n dh := DestRect.Bottom - DestRect.Top;\r\n\r\n imgData := FContext.getImageData(SourceRect.Left, SourceRect.Top, sw, sh);\r\n\r\n ACanvas := TCanvas.Create;\r\n try\r\n ACanvas.FElementCanvas.width := sw;\r\n ACanvas.FElementCanvas.height := sh;\r\n\r\n ACanvas.FContext.putImageData(imgData, 0,0);\r\n Canvas.FContext.drawImage(ACanvas.FElementCanvas, DestRect.Left, DestRect.Top, dw, dh);\r\n finally\r\n ACanvas.Free;\r\n end;\r\n end;\r\nend;\r\n\r\nconstructor TCanvas.Create;\r\nbegin\r\n FElementCanvas := TJSHTMLCanvasElement(document.createElement('CANVAS'));\r\n Create(FElementCanvas);\r\nend;\r\n\r\nconstructor TCanvas.Create(AControl: TJSHTMLCanvasElement);\r\nbegin\r\n FElementCanvas := AControl;\r\n FContext := AControl.getContextAs2DContext('2d');\r\n FPen := TPen.Create;\r\n FBrush := TBrush.Create;\r\n FPathOpen := false;\r\n FFont := TFont.Create;\r\n FApplyPixelRatio := False;\r\nend;\r\n\r\nprocedure TCanvas.AngleArc(X, Y: Integer; Radius: Cardinal; StartAngle, SweepAngle: Double);\r\nbegin\r\n AngleArc(Double(X), Double(Y), Double(Radius), Double(StartAngle), Double(SweepAngle));\r\nend;\r\n\r\nprocedure TCanvas.MoveTo(X,Y: Integer);\r\nbegin\r\n MoveTo(Double(X), Double(Y));\r\nend;\r\n\r\nprocedure TCanvas.LineTo(X,Y: Integer);\r\nbegin\r\n LineTo(Double(X), Double(Y));\r\nend;\r\n\r\nprocedure TCanvas.Rectangle(const Rect: TRect);\r\nbegin\r\n Rectangle(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);\r\nend;\r\n\r\nprocedure TCanvas.Rectangle(X1, Y1, X2, Y2: Double);\r\nvar\r\n dx,dy: single;\r\nbegin\r\n if Assigned(FContext) then\r\n begin\r\n FContext.beginPath();\r\n ApplyStroke;\r\n ApplyFill;\r\n\r\n GetAccuOffset(X1,Y1,dx,dy);\r\n\r\n FContext.rect(X1+dx, Y1+dy, X2 - X1, Y2 - Y1);\r\n if Brush.Style <> bsClear then\r\n FContext.fill();\r\n if Pen.Style <> psClear then\r\n FContext.stroke();\r\n end;\r\nend;\r\n\r\nprocedure TCanvas.Rectangle(const Rect: TCanvasRectF);\r\nbegin\r\n Rectangle(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);\r\nend;\r\n\r\nprocedure TCanvas.Refresh;\r\nbegin\r\nend;\r\n\r\nprocedure TCanvas.Restore;\r\nbegin\r\n if Assigned(FContext) then\r\n FContext.restore();\r\nend;\r\n\r\nprocedure TCanvas.Rectangle(X1, Y1, X2, Y2: Integer);\r\nbegin\r\n Rectangle(Double(X1), Double(Y1), Double(X2), Double(Y2));\r\nend;\r\n\r\nprocedure TCanvas.FillRect(const Rect: TRect);\r\nbegin\r\n Rectangle(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);\r\nend;\r\n\r\nprocedure TCanvas.RoundRect(X1,Y1,X2,Y2,X3,Y3: Integer);\r\nbegin\r\n RoundRect(Double(X1), Double(Y1), Double(X2), Double(Y2), Double(X3), Double(Y3));\r\nend;\r\n\r\nprocedure TCanvas.RoundRect(const Rect: TRect; CX, CY: Integer);\r\nbegin\r\n RoundRect(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom, CX, CY);\r\nend;\r\n\r\nprocedure TCanvas.RoundRect(X1, Y1, X2, Y2, X3, Y3: Double);\r\nvar\r\n dx,dy: single;\r\nbegin\r\n if Assigned(FContext) then\r\n begin\r\n FContext.beginPath();\r\n ApplyStroke;\r\n ApplyFill;\r\n\r\n GetAccuOffset(X1, Y1, dx, dy);\r\n\r\n FContext.moveTo(X1 + X3/2, Y1 + dy);\r\n FContext.lineTo(X2 - X3/2, Y1 + dy);\r\n FContext.quadraticCurveTo(X2 + dx,Y1 + dy, X2 + dx, Y1 + dy + Y3/2);\r\n\r\n FContext.lineTo(X2 + dx, Y2 - Y3/2 );\r\n FContext.quadraticCurveTo(X2 + dx, Y2 + dy, X2 - X3/2 - dx, Y2 + dy);\r\n FContext.lineTo(X1 + X3/2, Y2 + dy);\r\n FContext.quadraticCurveTo(X1 + dx, Y2 + dy, X1 + dx, Y2 - Y3/2);\r\n FContext.lineTo(X1 + dx, Y1 + Y3/2 + dy);\r\n FContext.quadraticCurveTo(X1 + dx, Y1 + dy, X1 + X3/2 + dx, Y1 + dy);\r\n\r\n if Brush.Style <> bsClear then\r\n FContext.fill();\r\n\r\n if Pen.Style <> psClear then\r\n FContext.stroke();\r\n end;\r\nend;\r\n\r\nprocedure TCanvas.Ellipse(X1, Y1, X2, Y2: Integer);\r\nbegin\r\n Ellipse(Double(X1), Double(Y1), Double(X2), Double(Y2));\r\nend;\r\n\r\nprocedure TCanvas.Ellipse(const Rect: TRect);\r\nbegin\r\n Ellipse(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);\r\nend;\r\n\r\nprocedure TCanvas.Polyline(const Points: array of TPoint);\r\nvar\r\n l, i: Integer;\r\nbegin\r\n if Assigned(FContext) then\r\n begin\r\n l := Length(Points);\r\n\r\n if l = 0 then\r\n Exit;\r\n\r\n FContext.beginPath();\r\n ApplyStroke;\r\n i := 0;\r\n FContext.moveTo(Points[i].X, Points[i].Y);\r\n\r\n while (i < l - 1) do\r\n begin\r\n inc(i);\r\n FContext.lineTo(Points[i].X, Points[i].Y);\r\n end;\r\n\r\n if Pen.Style <> psClear then\r\n FContext.stroke();\r\n end;\r\nend;\r\n\r\nprocedure TCanvas.Polygon(const Points: array of TPoint);\r\nvar\r\n l, i: Integer;\r\nbegin\r\n if Assigned(FContext) then\r\n begin\r\n l := Length(Points);\r\n\r\n if l = 0 then\r\n Exit;\r\n\r\n FContext.beginPath();\r\n ApplyStroke;\r\n ApplyFill;\r\n i := 0;\r\n FContext.moveTo(Points[i].X, Points[i].Y);\r\n\r\n while (i < l - 1) do\r\n begin\r\n inc(i);\r\n FContext.lineTo(Points[i].X, Points[i].Y);\r\n end;\r\n\r\n FContext.closePath();\r\n\r\n if Brush.Style <> bsClear then\r\n FContext.fill();\r\n\r\n if Pen.Style <> psClear then\r\n FContext.stroke();\r\n end;\r\nend;\r\n\r\nfunction TCanvas.TextExtent(const Text: string): TCanvasSizeF;\r\nbegin\r\n Result.cx := TextWidth(Text);\r\n Result.cy := TextHeight(Text);\r\nend;\r\n\r\nfunction TCanvas.TextHeight(const Text: string): Double;\r\nbegin\r\n Result := FontSizeToPx(Font.Size);\r\nend;\r\n\r\nprocedure TCanvas.MoveTo(X, Y: Double);\r\nvar\r\n dx,dy: single;\r\nbegin\r\n if Assigned(FContext) then\r\n begin\r\n FPathOpen := true;\r\n FContext.beginPath();\r\n ApplyStroke;\r\n dx := 0;\r\n dy := 0;\r\n GetAccuOffset(X, Y, dx, dy);\r\n FContext.moveTo(X + dx,Y + dy);\r\n end;\r\nend;\r\n\r\nprocedure TCanvas.TextOut(X, Y: Double; const Text: string);\r\nvar\r\n tm: TJSTextMetrics;\r\nbegin\r\n if Assigned(FContext) then\r\n begin\r\n FContext.fillStyle := ColorToHtml(Font.Color);\r\n FContext.font := Font.ToString;\r\n FContext.textBaseline := 'hanging';\r\n FContext.fillText(Text, X, Y + 0.5);\r\n\r\n if fsUnderline in Font.Style then\r\n begin\r\n tm := FContext.measureText(Text);\r\n FContext.fillRect(X, Y + Font.Size *1.4, tm.width, 1);\r\n end;\r\n\r\n if fsStrikeOut in Font.Style then\r\n begin\r\n tm := FContext.measureText(Text);\r\n FContext.fillRect(X, Y + Font.Size *0.7, tm.width, 1);\r\n end;\r\n\r\n end;\r\nend;\r\n\r\nfunction TCanvas.TextRect(ARect: TCanvasRectF; const Text: String; const WordWrap: Boolean = False; const Calculate: Boolean = False; const AHorizontalAlignment: TAlignment = taLeftJustify; const AVerticalAlignment: TVerticalAlignment = taAlignTop): TCanvasRectF;\r\nvar\r\n i: Integer;\r\n s, sn, st: string;\r\n l: Integer;\r\n w, mw: Double;\r\n f: Boolean;\r\n p: Integer;\r\n tw: Double;\r\n th: Double;\r\n lcnt: Integer;\r\n rs: TCanvasRectF;\r\n fws: Double;\r\n ths: Double;\r\n ww, wwx, fx: Boolean;\r\n\r\n procedure DrawText(AText: string; AWidth, AHeight: Single);\r\n begin\r\n if ww then\r\n begin\r\n case AHorizontalAlignment of\r\n taCenter: TextOut(ARect.Left + (ARect.Right - ARect.Left - AWidth) / 2, ARect.Top, AText);\r\n taLeftJustify: TextOut(ARect.Left, ARect.Top, AText);\r\n taRightJustify: TextOut(ARect.Right - AWidth, ARect.Top, AText);\r\n end;\r\n end\r\n else\r\n begin\r\n case AHorizontalAlignment of\r\n taCenter:\r\n begin\r\n case AVerticalAlignment of\r\n taAlignTop: TextOut(ARect.Left + (ARect.Right - ARect.Left - AWidth) / 2, ARect.Top, AText);\r\n taVerticalCenter: TextOut(ARect.Left + (ARect.Right - ARect.Left - AWidth) / 2, ARect.Top + (ARect.Bottom - ARect.Top - AHeight) / 2, AText);\r\n taAlignBottom: TextOut(ARect.Left + (ARect.Right - ARect.Left - AWidth) / 2, ARect.Bottom - AHeight, AText);\r\n end;\r\n end;\r\n taLeftJustify:\r\n begin\r\n case AVerticalAlignment of\r\n taAlignTop: TextOut(ARect.Left, ARect.Top, AText);\r\n taVerticalCenter: TextOut(ARect.Left, ARect.Top + (ARect.Bottom - ARect.Top - AHeight) / 2, AText);\r\n taAlignBottom: TextOut(ARect.Left, ARect.Bottom - AHeight, AText);\r\n end;\r\n end;\r\n taRightJustify:\r\n begin\r\n case AVerticalAlignment of\r\n taAlignTop: TextOut(ARect.Right - AWidth, ARect.Top, AText);\r\n taVerticalCenter: TextOut(ARect.Right - AWidth, ARect.Top + (ARect.Bottom - ARect.Top - AHeight) / 2, AText);\r\n taAlignBottom: TextOut(ARect.Right - AWidth, ARect.Bottom - AHeight, AText);\r\n end;\r\n end;\r\n end;\r\n end;\r\n end;\r\n\r\n function FindNextWord(Text: String; var APos: Integer): String;\r\n var\r\n l: Integer;\r\n i: Integer;\r\n begin\r\n Result := '';\r\n\r\n l := Length(Text);\r\n if APos > l then\r\n Exit;\r\n\r\n i := APos;\r\n while True do\r\n begin\r\n if ((Text[i] = #10) and (Text[i - 1] = #13)) or ((Text[i] = #13) and (Text[i - 1] = #10)) or (Text[i] = ' ') then\r\n begin\r\n if Text[i] = ' ' then\r\n Result := Copy(Text, APos, i - (APos - 1))\r\n else\r\n Result := Copy(Text, APos, i - APos);\r\n\r\n Break;\r\n end\r\n else if (Text[i] = #10) or (Text[i] = #13) or (Text[i] = ' ') then\r\n begin\r\n result := Copy(Text, APos, i - (APos - 1));\r\n Break;\r\n end\r\n else if i >= l then\r\n begin\r\n result := Copy(Text, APos, i - (APos - 1));\r\n Break;\r\n end\r\n else\r\n inc(i);\r\n end;\r\n\r\n APos := i + 1;\r\n end;\r\nbegin\r\n ww := WordWrap or (Pos(#13, Text) > 0) or (Pos(#10, Text) > 0);\r\n wwx := not WordWrap and ((Pos(#13, Text) > 0) or (Pos(#10, Text) > 0));\r\n\r\n if not ww then\r\n begin\r\n w := TextWidth(Text);\r\n th := TextHeight(Text);\r\n if not Calculate then\r\n DrawText(Text, w, th);\r\n\r\n Result := CreateCanvasRectF(ARect.Left, ARect.Top, ARect.Left + w, ARect.Top + th);\r\n end\r\n else\r\n begin\r\n rs := ARect;\r\n\r\n mw := 0;\r\n i := 1;\r\n ths := FFont.Size * 0.5;\r\n lcnt := 0;\r\n fws := 0;\r\n tw := 0;\r\n s := FindNextWord(Text, i);\r\n w := TextWidth(s);\r\n th := TextHeight(s) + ths;\r\n\r\n mw := mw + w;\r\n if (Length(s) > 0) and (s[Length(s)] = ' ') then\r\n mw := mw + fws;\r\n\r\n fx := False;\r\n while i <= Length(Text) do\r\n begin\r\n l := Length(s);\r\n if (l >= 2) and (((s[l] = #10) and (s[l - 1] = #13)) or ((s[l] = #13) and (s[l - 1] = #10))) then\r\n begin\r\n s := Copy(s, 1, l - 2);\r\n f := True;\r\n end\r\n else if (l >= 1) and ((s[l] = #10) or (s[l] = #13)) then\r\n begin\r\n s := Copy(s, 1, l - 1);\r\n f := True;\r\n end\r\n else\r\n f := False;\r\n\r\n sn := FindNextWord(Text, i);\r\n w := TextWidth(sn);\r\n th := Max(th, TextHeight(sn) + ths);\r\n\r\n if (ARect.Left + mw + w > ARect.Right) or f then\r\n begin\r\n if (s <> '') and not fx then\r\n begin\r\n p := Length(s);\r\n\r\n st := Copy(s, 1, p);\r\n\r\n Inc(lcnt);\r\n if mw > tw then\r\n tw := mw;\r\n\r\n if not Calculate then\r\n DrawText(st, mw, th);\r\n\r\n mw := 0;\r\n end;\r\n\r\n s := '';\r\n\r\n fx := False;\r\n if (wwx and f) or not wwx then\r\n ARect.Top := ARect.Top + th\r\n else if (wwx and not f) then\r\n fx := True;\r\n\r\n if (Trunc(ARect.Top) > Trunc(ARect.Bottom - th + ths)) and not Calculate then\r\n Break;\r\n end;\r\n\r\n mw := mw + w;\r\n if (Length(sn) > 0) and (sn[Length(sn)] = ' ') then\r\n mw := mw + fws;\r\n s := s + sn;\r\n end;\r\n\r\n if s <> '' then\r\n begin\r\n p := Length(s);\r\n st := Copy(s, 1, p);\r\n Inc(lcnt);\r\n if mw > tw then\r\n tw := mw;\r\n\r\n if not Calculate then\r\n DrawText(st, mw, th);\r\n end;\r\n\r\n Result := CreateCanvasRectF(rs.Left, rs.Top, rs.Left + tw, rs.Top + lcnt * th);\r\n end;\r\nend;\r\n\r\nprocedure TCanvas.TextOut(X,Y: Integer; const Text: string);\r\nbegin\r\n TextOut(Double(X), Double(Y), Text);\r\nend;\r\n\r\nfunction TCanvas.TextRect(ARect: TRect; const Text: String; const WordWrap: Boolean = False; const Calculate: Boolean = False; const AHorizontalAlignment: TAlignment = taLeftJustify; const AVerticalAlignment: TVerticalAlignment = taAlignTop): TRect;\r\nvar\r\n r: TCanvasRectF;\r\nbegin\r\n r := TextRect(CreateCanvasRectF(ARect.Left, ARect.Top, ARect.Right, ARect.Bottom), Text, WordWrap, Calculate, AHorizontalAlignment, AVerticalAlignment);\r\n Result := Rect(Round(r.Left), Round(r.Top), Round(r.Right), Round(r.Bottom));\r\nend;\r\n\r\nfunction TCanvas.TextWidth(const Text: string): Double;\r\nvar\r\n f: string;\r\n tm: TJSTextMetrics;\r\nbegin\r\n if Assigned(FContext) then\r\n begin\r\n f := Font.ToString;\r\n FContext.font := f;\r\n tm := FContext.measureText(Text);\r\n Result := tm.width;\r\n end;\r\nend;\r\n\r\nprocedure TCanvas.Transform(m11, m12, m21, m22, dx, dy: Double);\r\nbegin\r\n if Assigned(FContext) then\r\n FContext.transform(m11, m12, m21, m22, dx, dy);\r\nend;\r\n\r\nprocedure TCanvas.Translate(X, Y: Double);\r\nbegin\r\n if Assigned(FContext) then\r\n FContext.translate(X, Y);\r\nend;\r\n\r\nprocedure TCanvas.Draw(X, Y: Integer; Graphic: TGraphic);\r\nbegin\r\n Draw(Double(X), Double(Y), Graphic);\r\nend;\r\n\r\ndestructor TCanvas.Destroy;\r\nbegin\r\n inherited;\r\nend;\r\n\r\nprocedure TCanvas.Draw(X, Y: Double; Graphic: TGraphic);\r\nvar\r\n img: TJSObject;\r\nbegin\r\n if Assigned(FContext) then\r\n begin\r\n img := Graphic.Image;\r\n\r\n if Assigned(img) then\r\n begin\r\n if Graphic.FUsedCanvas then\r\n FContext.drawImage(TJSObject(Graphic.FCanvasElement), X, Y)\r\n else\r\n FContext.drawImage(img, X, Y);\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TCanvas.DrawFocusRect(const Rect: TCanvasRectF);\r\nvar\r\n ps: TPenStyle;\r\nbegin\r\n ps := Pen.Style;\r\n Pen.Style := psDot;\r\n Pen.Width := 1;\r\n Pen.Color := clBlack;\r\n\r\n MoveTo(Rect.Left, Rect.Top);\r\n LineTo(Rect.Right, Rect.Top);\r\n LineTo(Rect.Right, Rect.Bottom);\r\n LineTo(Rect.Left, Rect.Bottom);\r\n LineTo(Rect.Left, Rect.Top);\r\n\r\n Pen.Style := ps;\r\nend;\r\n\r\nprocedure TCanvas.DrawFocusRect(const Rect: TRect);\r\nbegin\r\n DrawFocusRect(CreateCanvasRectF(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom));\r\nend;\r\n\r\nprocedure TCanvas.Ellipse(X1, Y1, X2, Y2: Double);\r\nvar\r\n w, h: Double;\r\n kappa: Double;\r\n ox, oy, xe, ye, xm, ym: Double;\r\nbegin\r\n if Assigned(FContext) then\r\n begin\r\n w := x2 - x1;\r\n h := y2 - y1;\r\n\r\n kappa := 0.5522848;\r\n\r\n ox := (w / 2) * kappa;\r\n oy := (h / 2) * kappa;\r\n xe := x1 + w;\r\n ye := y1 + h;\r\n xm := x1 + w / 2;\r\n ym := y1 + h / 2;\r\n\r\n FContext.beginPath();\r\n ApplyStroke;\r\n ApplyFill;\r\n FContext.moveTo(x1, ym);\r\n FContext.bezierCurveTo(x1, ym - oy, xm - ox, y1, xm, y1);\r\n FContext.bezierCurveTo(xm + ox, y1, xe, ym - oy, xe, ym);\r\n FContext.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye);\r\n FContext.bezierCurveTo(xm - ox, ye, x1, ym + oy, x1, ym);\r\n FContext.closePath();\r\n\r\n if Brush.Style <> bsClear then\r\n FContext.fill();\r\n\r\n if Pen.Style <> psClear then\r\n FContext.stroke();\r\n end;\r\nend;\r\n\r\nprocedure TCanvas.GetAccuOffset(X,Y: double; var dx, dy: single);\r\nbegin\r\n dx := 0;\r\n dy := 0;\r\n\r\n if (Pen.Width = 1) and (Pen.Style <> psClear) and (Frac(X) = 0) then\r\n dx := 0.5;\r\n\r\n if (Pen.Width = 1) and (Pen.Style <> psClear) and (Frac(Y) = 0) then\r\n dy := 0.5;\r\nend;\r\n\r\nfunction TCanvas.GetBase64Image: string;\r\nbegin\r\n Result := '';\r\n if Assigned(Element) then\r\n Result := Element.toDataURL();\r\nend;\r\n\r\nfunction TCanvas.GetPixel(X,Y: Single): TColor;\r\nvar\r\n imgd: TJSImageData;\r\nbegin\r\n Result := clNone;\r\n if Assigned(FContext) then\r\n begin\r\n imgd := FContext.getImageData(x, y, 1, 1);\r\n Result := RGBA(imgd.data[0], imgd.data[1], imgd.data[2], imgd.data[3]);\r\n end;\r\nend;\r\n\r\nfunction TCanvas.GetAsImage(AType: TImageType): string;\r\nbegin\r\n Result := '';\r\n if Assigned(Element) then\r\n begin\r\n case AType of\r\n itBase64: Result := Element.toDataURL();\r\n itPNG: Result := Element.toDataURL('image/png');\r\n itJPEG: Result := Element.toDataURL('image/jpeg',1.0);\r\n itBMP: Result := Element.toDataURL('image/bmp');\r\n itGIF: Result := Element.toDataURL('image/gif');\r\n itSVG: Result := Element.toDataURL('image/svg+xml');\r\n end;\r\n end;\r\nend;\r\n\r\n{$HINTS OFF}\r\nprocedure TCanvas.DownloadImage( AFileName: string; AType: TImageType = itPNG);\r\nvar\r\n s: string;\r\n el: TJSHTMLElement;\r\nbegin\r\n if Assigned(Element) then\r\n begin\r\n s := GetAsImage(AType);\r\n\r\n el := TJSHTMLElement(document.createElement('a'));\r\n el['href'] := s;\r\n if (AFileName <> '') then\r\n el['download'] := AFileName;\r\n el.style.setProperty('display','none');\r\n document.body.appendChild(el);\r\n el.click();\r\n document.body.removeChild(el);\r\n end;\r\nend;\r\n{$HINTS ON}\r\n\r\nprocedure TCanvas.LineTo(X, Y: Double);\r\nvar\r\n dx,dy: single;\r\n clr: TColor;\r\nbegin\r\n if Assigned(FContext) then\r\n begin\r\n dx := 0;\r\n dy := 0;\r\n GetAccuOffset(X,Y,dx,dy);\r\n\r\n case Pen.Mode of\r\n pmBlack: FContext.strokeStyleAsColor := ColorToHtml(clBlack);\r\n pmWhite: FContext.strokeStyleAsColor := ColorToHtml(clWhite);\r\n pmXor: FContext.globalCompositeOperation := 'xor';\r\n pmMask: FContext.globalCompositeOperation := 'source-atop';\r\n pmNotCopy:\r\n begin\r\n clr := ColorToRGB(Pen.Color) xor $FFFFFFFF;\r\n FContext.strokeStyleAsColor := ColorToHtml(clr);\r\n end;\r\n pmNotXor:\r\n begin\r\n clr := ColorToRGB(Pen.Color) xor $FFFFFFFF;\r\n FContext.strokeStyleAsColor := ColorToHtml(clr);\r\n FContext.globalCompositeOperation := 'xor';\r\n end;\r\n end;\r\n\r\n\r\n if not FPathOpen then\r\n begin\r\n FContext.beginPath();\r\n ApplyStroke;\r\n FContext.moveTo(FPathX + dx, FPathY + dy);\r\n end;\r\n\r\n FContext.lineTo(X + dx, Y + dy);\r\n FContext.stroke();\r\n FPathX := X;\r\n FPathY := Y;\r\n\r\n FPathOpen := false;\r\n\r\n FContext.globalCompositeOperation := 'source-over';\r\n end;\r\nend;\r\n\r\nprocedure TCanvas.Save;\r\nbegin\r\n if Assigned(FContext) then\r\n FContext.save();\r\nend;\r\n\r\nprocedure TCanvas.SetClipRect(const Value: TCanvasRectF);\r\nbegin\r\n FClipRect := Value;\r\n if Assigned(FContext) then\r\n begin\r\n FContext.beginPath;\r\n FContext.rect(FClipRect.Left, FClipRect.Top, FClipRect.Right - FClipRect.Left, FClipRect.Bottom - FClipRect.Top);\r\n FContext.clip;\r\n end;\r\nend;\r\n\r\nprocedure TCanvas.SetPixel(X,Y: Single; Clr: TColor);\r\nbegin\r\n if Assigned(FContext) then\r\n begin\r\n FContext.fillStyle := ColorToHtml(Clr);\r\n FContext.fillRect(x,y, 1, 1);\r\n end;\r\nend;\r\n\r\nprocedure TCanvas.SetTransform(m11, m12, m21, m22, dx, dy: Double);\r\nvar\r\n m: TMatrix;\r\n px: Single;\r\nbegin\r\n if Assigned(FContext) then\r\n begin\r\n m := MatrixIdentity;\r\n m.m11 := m11;\r\n m.m12 := m12;\r\n m.m21 := m21;\r\n m.m22 := m22;\r\n m.m31 := dx;\r\n m.m32 := dy;\r\n\r\n if ApplyPixelRatio then\r\n begin\r\n px := GetPixelRatio(Self);\r\n m := MatrixMultiply(m, MatrixCreateScaling(px, px));\r\n end;\r\n\r\n FContext.setTransform(m.m11, m.m12, m.m21, m.m22, m.m31, m.m32);\r\n end;\r\nend;\r\n\r\nprocedure TCanvas.StretchDraw(Rect: TCanvasRectF; Graphic: TGraphic);\r\nvar\r\n img: TJSObject;\r\nbegin\r\n if Assigned(FContext) then\r\n begin\r\n img := Graphic.Image;\r\n FContext.drawImage(img, 0, 0, Graphic.width, Graphic.height, Rect.Left, Rect.Top, Rect.Right - Rect.Left, Rect.Bottom - Rect.Top);\r\n end;\r\nend;\r\n\r\nprocedure TCanvas.StretchDraw(Rect: TRect; Graphic: TGraphic);\r\nbegin\r\n StretchDraw(CreateCanvasRectF(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom), Graphic);\r\nend;\r\n\r\nprocedure TCanvas.PathLineTo(X, Y: Integer);\r\nbegin\r\n PathLineTo(Double(X), Double(Y));\r\nend;\r\n\r\nprocedure TCanvas.PathLineTo(X, Y: Double);\r\nvar\r\n dx, dy: Double;\r\nbegin\r\n if Assigned(FContext) then\r\n begin\r\n dx := 0;\r\n dy := 0;\r\n GetAccuOffset(X, Y, dx, dy);\r\n FContext.lineTo(X + dx, Y + dy);\r\n end;\r\nend;\r\n\r\nprocedure TCanvas.PathFill;\r\nbegin\r\n if Assigned(FContext) then\r\n begin\r\n ApplyFill;\r\n FContext.fill();\r\n end;\r\nend;\r\n\r\nprocedure TCanvas.PathStroke;\r\nbegin\r\n if Assigned(FContext) then\r\n begin\r\n ApplyStroke;\r\n FContext.stroke();\r\n end;\r\nend;\r\n\r\nprocedure TCanvas.PathMoveTo(X, Y: Integer);\r\nbegin\r\n PathMoveTo(Double(X), Double(Y));\r\nend;\r\n\r\nprocedure TCanvas.PathMoveTo(X, Y: Double);\r\nvar\r\n dx, dy: Double;\r\nbegin\r\n if Assigned(FContext) then\r\n begin\r\n dx := 0;\r\n dy := 0;\r\n GetAccuOffset(X, Y, dx, dy);\r\n FContext.moveTo(X + dx, Y + dy);\r\n end;\r\nend;\r\n\r\nprocedure TCanvas.Polygon(const Points: array of TCanvasPointF);\r\nvar\r\n l, i: Integer;\r\nbegin\r\n if Assigned(FContext) then\r\n begin\r\n l := Length(Points);\r\n\r\n if l = 0 then\r\n Exit;\r\n\r\n FContext.beginPath();\r\n ApplyStroke;\r\n ApplyFill;\r\n i := 0;\r\n FContext.moveTo(Points[i].X, Points[i].Y);\r\n\r\n while (i < l - 1) do\r\n begin\r\n inc(i);\r\n FContext.lineTo(Points[i].X, Points[i].Y);\r\n end;\r\n\r\n FContext.closePath();\r\n\r\n if Brush.Style <> bsClear then\r\n FContext.fill();\r\n\r\n if Pen.Style <> psClear then\r\n FContext.stroke();\r\n end;\r\nend;\r\n\r\nprocedure TCanvas.Polyline(const Points: array of TCanvasPointF);\r\nvar\r\n l, i: Integer;\r\nbegin\r\n if Assigned(FContext) then\r\n begin\r\n l := Length(Points);\r\n\r\n if l = 0 then\r\n Exit;\r\n\r\n FContext.beginPath();\r\n ApplyStroke;\r\n i := 0;\r\n FContext.moveTo(Points[i].X, Points[i].Y);\r\n\r\n while (i < l - 1) do\r\n begin\r\n inc(i);\r\n FContext.lineTo(Points[i].X, Points[i].Y);\r\n end;\r\n\r\n if Pen.Style <> psClear then\r\n FContext.stroke();\r\n end;\r\nend;\r\n\r\nprocedure TCanvas.Ellipse(const Rect: TCanvasRectF);\r\nbegin\r\n Ellipse(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);\r\nend;\r\n\r\nprocedure TCanvas.PathClose;\r\nbegin\r\n if Assigned(FContext) then\r\n FContext.closePath();\r\nend;\r\n\r\nprocedure TCanvas.EndScene;\r\nbegin\r\n if Assigned(OnEndScene) then\r\n OnEndScene(Self);\r\nend;\r\n\r\nprocedure TCanvas.FillRect(const Rect: TCanvasRectF);\r\nbegin\r\n Rectangle(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);\r\nend;\r\n\r\nprocedure TCanvas.Rotate(Angle: Double);\r\nbegin\r\n if Assigned(FContext) then\r\n FContext.rotate(Angle);\r\nend;\r\n\r\nprocedure TCanvas.RoundRect(const Rect: TCanvasRectF; CX, CY: Double);\r\nbegin\r\n RoundRect(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom, CX, CY);\r\nend;\r\n\r\n{ TGraphic }\r\n\r\nconstructor TGraphic.Create(Img: TJSObject);\r\nbegin\r\n FAddToQueue := True;\r\n FEmpty := True;\r\n FData := '';\r\n FDataBin := '';\r\n FURL := '';\r\n FImage := Img;\r\n FLoaded := nil;\r\nend;\r\n\r\nprocedure TGraphic.AssignEvents;\r\nbegin\r\n asm\r\n var me = this;\r\n this.FImage.onload = function() {\r\n me.DoChange();\r\n };\r\n end;\r\nend;\r\n\r\nprocedure TGraphic.CaptureCanvas;\r\nbegin\r\n if Assigned(FCanvas) and Assigned(FCanvas.Element) then\r\n LoadFromResource(FCanvas.Element.toDataURL());\r\nend;\r\n\r\nconstructor TGraphic.Create;\r\nbegin\r\n FAddToQueue := True;\r\n FEmpty := True;\r\n FData := '';\r\n FDataBin := '';\r\n FUsedCanvas := False;\r\n CreateImage;\r\n AssignEvents;\r\nend;\r\n\r\nconstructor TGraphic.Create(URL: string);\r\nbegin\r\n FAddToQueue := True;\r\n FEmpty := True;\r\n FData := '';\r\n FDataBin := '';\r\n Create;\r\n LoadFromURL(URL);\r\nend;\r\n\r\nprocedure TGraphic.Assign(Source: TPersistent);\r\nvar\r\n s: string;\r\nbegin\r\n if Assigned(Source) and (Source is TGraphic) and Assigned((Source as TGraphic).FCanvas) then\r\n LoadFromCanvas((Source as TGraphic).FCanvas)\r\n else if Assigned(Source) and (Source is TGraphic) and Assigned((Source as TGraphic).FImage) and not (Source as TGraphic).Empty then\r\n begin\r\n asm\r\n s = Source.FImage.src;\r\n end;\r\n\r\n LoadFromURL(s);\r\n end\r\n else if not Assigned(Source) then\r\n begin\r\n asm\r\n this.FImage.src = \"\";\r\n end;\r\n DoChange;\r\n end;\r\nend;\r\n\r\nfunction TGraphic.Image: TJSObject;\r\nbegin\r\n Result := FImage;\r\nend;\r\n\r\nprocedure TGraphic.LoadFromCache(AData: String; ALoaded: TBitmapLoadedProc = nil);\r\nvar\r\n dt: string;\r\n o: TJSObject;\r\n b: Boolean;\r\n s: string;\r\n l: Boolean;\r\nbegin\r\n FData := AData;\r\n if Pos('DATA:', UpperCase(AData)) > 0 then\r\n begin\r\n FDataBin := HexImageEncodeFromBase64(AData);\r\n end;\r\n\r\n dt := AData;\r\n if dt = '' then\r\n Exit;\r\n\r\n FLoaded := ALoaded;\r\n FUsedCanvas := false;\r\n\r\n if not FCache.Find(dt, o) then\r\n begin\r\n b := False;\r\n s := '';\r\n asm\r\n s = this.FImage.src;\r\n b = (s != '');\r\n end;\r\n\r\n l := b and (dt <> s);\r\n if l then\r\n begin\r\n CreateImage;\r\n AssignEvents;\r\n end;\r\n\r\n if (not l and (FQueue.IndexOf(dt) = -1)) or l then\r\n begin\r\n asm\r\n this.FImage.src = dt;\r\n dt = this.FImage.src;\r\n end;\r\n\r\n FData := dt;\r\n if Pos('DATA:', UpperCase(dt)) > 0 then\r\n FDataBin := HexImageEncodeFromBase64(dt);\r\n\r\n Inc(FCacheCount);\r\n if FAddToQueue then\r\n FQueue.Add(dt);\r\n end\r\n else if (not l and (FQueue.IndexOf(dt) <> -1)) then\r\n begin\r\n asm\r\n this.FImage.src = dt;\r\n end;\r\n end;\r\n end\r\n else\r\n begin\r\n FImage := o;\r\n DoChange;\r\n end;\r\n\r\n asm\r\n if (this.FImage) {\r\n this.FEmpty = (this.FImage.src == '');\r\n }\r\n end;\r\nend;\r\n\r\nprocedure TGraphic.LoadFromCanvas(ACanvas: TCanvas);\r\nbegin\r\n if Assigned(ACanvas) and Assigned(ACanvas.Element) then\r\n LoadFromResource(ACanvas.Element.toDataURL());\r\nend;\r\n\r\nprocedure TGraphic.LoadFromFile(AFileName: string; ALoaded: TBitmapLoadedProc);\r\nbegin\r\n LoadFromURL(AFileName, 0, ALoaded);\r\nend;\r\n\r\nfunction TGraphic.GetAsImage(AType: TImageType): string;\r\nbegin\r\n Result := '';\r\n if Assigned(FCanvas) then\r\n Result := FCanvas.GetAsImage(AType);\r\nend;\r\n\r\nfunction TGraphic.GetBase64Image: string;\r\nbegin\r\n Result := '';\r\n if Assigned(FCanvas) then\r\n Result := FCanvas.GetBase64Image;\r\nend;\r\n\r\nprocedure TGraphic.LoadFromResource(AResource: string; AHInstance: Integer);\r\nbegin\r\n FEmpty := True;\r\n LoadFromCache(AResource);\r\nend;\r\n\r\nprocedure TGraphic.LoadFromResource(AResource: string);\r\nbegin\r\n LoadFromResource(AResource, 0);\r\nend;\r\n\r\nprocedure TGraphic.LoadFromStream(AStream: TStream);\r\nbegin\r\n DoChange;\r\nend;\r\n\r\nprocedure TGraphic.LoadFromURL(AURL: string; AHInstance: Integer; ALoaded: TBitmapLoadedProc);\r\nbegin\r\n FEmpty := True;\r\n LoadFromCache(AURL, ALoaded);\r\nend;\r\n\r\nprocedure TGraphic.LoadFromURL(AURL: string; ALoaded: TBitmapLoadedProc);\r\nbegin\r\n LoadFromURL(AURL, 0, ALoaded);\r\nend;\r\n\r\nprocedure TGraphic.RecreateCanvas;\r\nbegin\r\n if not Assigned(FCanvasElement) then\r\n FCanvasElement := TJSHTMLCanvasElement(document.createElement('CANVAS'));\r\n\r\n if Assigned(FCanvasElement) then\r\n begin\r\n FCanvasElement.height := Height;\r\n FCanvasElement.width := Width;\r\n if not Assigned(FCanvas) then\r\n begin\r\n FCanvas := TCanvas.Create(FCanvasElement);\r\n FCanvas.OnBeginScene := DoBeginScene;\r\n FCanvas.OnEndScene := DoEndScene;\r\n end;\r\n end;\r\nend;\r\n\r\nclass function TGraphic.CreateFromResource(AResource: String;\r\n AInstance: NativeUInt): TGraphic;\r\nbegin\r\n Result := TGraphic.Create;\r\n Result.LoadFromResource(AResource);\r\nend;\r\n\r\nclass function TGraphic.CreateFromURL(AURL: String): TGraphic;\r\nbegin\r\n Result := CreateFromURL(AURL, 0);\r\nend;\r\n\r\nclass function TGraphic.CreateFromURL(AURL: String;\r\n AInstance: NativeUInt): TGraphic;\r\nbegin\r\n Result := TGraphic.Create;\r\n Result.LoadFromURL(AURL);\r\nend;\r\n\r\nclass function TGraphic.CreateFromResource(AResource: string): TGraphic;\r\nbegin\r\n Result := CreateFromResource(AResource, 0);\r\nend;\r\n\r\nprocedure TGraphic.CreateImage;\r\nbegin\r\n asm\r\n this.FImage = new Image();\r\n end;\r\nend;\r\n\r\nprocedure TGraphic.DoBeginScene(Sender: TObject);\r\nbegin\r\n FCanvas.Clear;\r\nend;\r\n\r\nprocedure TGraphic.DoChange;\r\nvar\r\n i: Integer;\r\nbegin\r\n FEmpty := (Width = 0) and (Height = 0);\r\n if not FEmpty and (FData <> '') and not FCache.Exists(FData) then\r\n begin\r\n FCache.Add(TGraphicCache.Create(FImage, FData));\r\n i := FQueue.IndexOf(FData);\r\n if (i >= 0) and (i <= FQueue.Count - 1) then\r\n FQueue.Delete(i);\r\n\r\n Dec(FCacheCount);\r\n if FCacheCount = 0 then\r\n begin\r\n if Assigned(Application.OnImageCacheReady) then\r\n Application.OnImageCacheReady(Application);\r\n end;\r\n end;\r\n\r\n if Assigned(FOnChange) then\r\n begin\r\n FOnChange(Self);\r\n end;\r\n\r\n if Assigned(FLoaded) then\r\n begin\r\n FLoaded;\r\n FLoaded := nil;\r\n end;\r\nend;\r\n\r\nprocedure TGraphic.DoEndScene(Sender: TObject);\r\nbegin\r\n FAddToQueue := False;\r\n CaptureCanvas;\r\n FAddToQueue := True;\r\nend;\r\n\r\nfunction TGraphic.Empty: Boolean;\r\nbegin\r\n Result := FEmpty;\r\nend;\r\n\r\nprocedure TGraphic.SetData(const Value: TBinaryString);\r\nbegin\r\n if (FDataBin <> Value) then\r\n begin\r\n FDataBin := Value;\r\n LoadFromResource('data:image/png;base64,' + HexImageDecodeAsBase64(FDataBin));\r\n end;\r\nend;\r\n\r\nprocedure TGraphic.SetHeight(const Value: Integer);\r\nbegin\r\n asm\r\n this.FImage.height = Value;\r\n end;\r\n RecreateCanvas;\r\n DoChange;\r\nend;\r\n\r\nprocedure TGraphic.SetSize(AWidth, AHeight: Integer);\r\nbegin\r\n Width := AWidth;\r\n Height := AHeight;\r\nend;\r\n\r\nprocedure TGraphic.SetURL(const URL: string);\r\nbegin\r\n LoadFromURL(URL);\r\nend;\r\n\r\nprocedure TGraphic.SetWidth(const Value: Integer);\r\nbegin\r\n asm\r\n this.FImage.width = Value;\r\n end;\r\n RecreateCanvas;\r\n DoChange;\r\nend;\r\n\r\nfunction TGraphic.GetWidth: Integer;\r\nvar\r\n w: integer;\r\nbegin\r\n w := 0;\r\n if Assigned(FImage) then\r\n begin\r\n asm\r\n w = this.FImage.width;\r\n end;\r\n end;\r\n Result := w;\r\nend;\r\n\r\nfunction TGraphic.GetCanvas: TCanvas;\r\nbegin\r\n if not Assigned(FCanvas) then\r\n RecreateCanvas;\r\n\r\n Result := FCanvas;\r\n FUsedCanvas := True;\r\nend;\r\n\r\nfunction TGraphic.GetData: TBinaryString;\r\nbegin\r\n Result := FDataBin;\r\nend;\r\n\r\nfunction TGraphic.GetHeight: Integer;\r\nvar\r\n h: integer;\r\nbegin\r\n h := 0;\r\n if Assigned(FImage) then\r\n begin\r\n asm\r\n h = this.FImage.height;\r\n end;\r\n end;\r\n Result := h;\r\nend;\r\n\r\n{ TGraphicCache }\r\n\r\nconstructor TGraphicCache.Create(AImage: TJSObject; AID: string);\r\nbegin\r\n FImage := AImage;\r\n FID := AID;\r\nend;\r\n\r\n{ TGraphicCacheList }\r\n\r\nfunction TGraphicCacheList.Exists(AID: string): Boolean;\r\nvar\r\n I: Integer;\r\n it: TGraphicCache;\r\nbegin\r\n Result := False;\r\n for I := 0 to Count - 1 do\r\n begin\r\n it := Items[I] as TGraphicCache;\r\n if (it.ID = AID) and Assigned(it.Image) then\r\n begin\r\n Result := True;\r\n Break;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TGraphicCacheList.Find(AID: string; var FImage: TJSObject): Boolean;\r\nvar\r\n I: Integer;\r\n it: TGraphicCache;\r\nbegin\r\n Result := False;\r\n for I := 0 to Count - 1 do\r\n begin\r\n it := Items[I] as TGraphicCache;\r\n if (it.ID = AID) and Assigned(it.Image) then\r\n begin\r\n FImage := it.Image;\r\n Result := True;\r\n Break;\r\n end;\r\n end;\r\nend;\r\n\r\n{ TURLPicture }\r\n\r\nprocedure TURLPicture.Assign(Source: TPersistent);\r\nbegin\r\n if (Source is TURLPicture) then\r\n begin\r\n FFileName := (Source as TURLPicture).FileName;\r\n Changed;\r\n end\r\n else\r\n inherited;\r\nend;\r\n\r\nprocedure TURLPicture.Changed;\r\nbegin\r\n if Assigned(OnChange) then\r\n OnChange(Self);\r\nend;\r\n\r\nprocedure TURLPicture.DataChanged;\r\nbegin\r\n if Assigned(OnDataChange) then\r\n OnDataChange(Self);\r\nend;\r\n\r\nfunction TURLPicture.GetData: TBinaryString;\r\nbegin\r\n Result := FData;\r\nend;\r\n\r\n\r\nprocedure TURLPicture.LoadFromFile(AFileName: string);\r\nbegin\r\n FFilename := AFileName;\r\n Changed;\r\nend;\r\n\r\nprocedure TURLPicture.SetData(const Value: TBinaryString);\r\nbegin\r\n if (FData <> Value) then\r\n begin\r\n FData := Value;\r\n DataChanged;\r\n end;\r\nend;\r\n\r\ninitialization\r\nbegin\r\n FCache := TGraphicCacheList.Create;\r\n FQueue := TStringList.Create;\r\nend;\r\n\r\nend.\r\n","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright (c) 2018 - 2021 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.WebCtrls;\r\n\r\n{$DEFINE NOPP}\r\n\r\ninterface\r\n\r\nuses\r\n Classes, WEBLib.Controls, WEBLib.Graphics, SysUtils, Web, JS;\r\n\r\ntype\r\n TBrowserSandboxType = (stAllowForms, stAllowModals, stAllowOrientationLock, stAllowPointerLock, stAllowPopups, stAllowPopupsToEscapeSandbox,\r\n stAllowPresentation, stAllowSameOrigin, stAllowScripts, stAllowTopNavigation, stAllowTopNavigationByUserActivation);\r\n\r\n TBrowserSandboxTypes = set of TBrowserSandboxType;\r\n\r\n TBrowserReferrerPolicy = (rfNone, rfNoReferrer, rfNoReferrerWhenDowngrade, rfOrigin, rfOriginWhenCrossOrigin, rfUnsafeUrl);\r\n\r\n TBrowserControl = class(TCustomControl)\r\n private\r\n FURL: string;\r\n FSandbox: TBrowserSandboxTypes;\r\n FReferrerPolicy: TBrowserReferrerPolicy;\r\n procedure SetURL(const Value: string);\r\n procedure SetSandbox(const Value: TBrowserSandboxTypes);\r\n procedure SetReferrerPolicy(const Value: TBrowserReferrerPolicy);\r\n protected\r\n function CreateElement: TJSElement; override;\r\n procedure UpdateElementVisual; override;\r\n procedure BindEvents; override;\r\n public\r\n procedure CreateInitialize; override;\r\n procedure Navigate(const AURL: string);\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property BorderStyle;\r\n property ReferrerPolicy: TBrowserReferrerPolicy read FReferrerPolicy write SetReferrerPolicy;\r\n property Sandbox: TBrowserSandboxTypes read FSandbox write SetSandbox;\r\n property URL: string read FURL write SetURL;\r\n property Visible;\r\n property OnClick;\r\n property OnDblClick;\r\n property OnMouseDown;\r\n property OnMouseMove;\r\n property OnMouseUp;\r\n end;\r\n\r\n TWebBrowserControl = class(TBrowserControl);\r\n\r\n TYoutube = class(TCustomControl)\r\n private \r\n FVideoID: string;\r\n FAllowFullScreen: boolean;\r\n FAutoPlay: boolean;\r\n procedure SetAllowFullScreen(const Value: boolean);\r\n protected\r\n procedure SetVideoID(const Value: string);\r\n function CreateElement: TJSElement; override;\r\n procedure UpdateElement; override;\r\n procedure UpdateElementVisual; override;\r\n public\r\n procedure CreateInitialize; override;\r\n published\r\n property Align;\r\n property AllowFullScreen: boolean read FAllowFullScreen write SetAllowFullScreen;\r\n property AutoPlay: boolean read FAutoPlay write FAutoPlay;\r\n property VideoID: string read FVideoID write SetVideoID;\r\n end;\r\n\r\n TWebYoutube = class(TYoutube);\r\n\r\n TMapClickEvent = procedure(Sender: TObject; Lon, Lat: double) of object;\r\n TMapZoomEvent = procedure(Sender: TObject; ZoomLevel: integer) of object;\r\n TMapMarkerClickEvent = procedure(Sender: TObject; AIndex: integer; AMarker: TJSObjectRecord) of object;\r\n TMapPolygonClickEvent = procedure(Sender: TObject; AIndex: integer; APolygon: TJSObjectRecord) of object;\r\n TMapPolylineClickEvent = procedure(Sender: TObject; AIndex: integer; APolyline: TJSObjectRecord) of object;\r\n TMapCircleClickEvent = procedure(Sender: TObject; AIndex: integer; ACircle: TJSObjectRecord) of object;\r\n TMapRectangleClickEvent = procedure(Sender: TObject; AIndex: integer; ARectangle: TJSObjectRecord) of object;\r\n TMapKMLClickEvent = procedure(Sender: TObject; AIndex: integer; AKML: TJSObjectRecord) of object;\r\n\r\n TGoogleMarkerColor = (mcDefault, mcRed, mcBlue, mcGreen, mcPurple, mcYellow);\r\n TGoogleMarkerShape = (msPin, msPinDot, msFlag, msBookmark, msFlagSmall, msHome, msFavorite, msStar, msCustom);\r\n TGoogleTravelMode = (tmDriving, tmWalking, tmBicycling, tmTransit);\r\n TGoogleMapType = (mtDefault, mtSatellite, mtHybrid, mtTerrain);\r\n TGoogleMapStyle = (mstDefault, mstNightMode, mstCustom);\r\n\r\n TGoogleMaps = class;\r\n\r\n TGoogleMapsOptions = class(TPersistent)\r\n private\r\n FOwner: TGoogleMaps;\r\n FCustomStyle: TStringList;\r\n FMapStyle: TGoogleMapStyle;\r\n FDefaultLongitude: Double;\r\n FDefaultLatitude: Double;\r\n FDefaultZoomLevel: Integer;\r\n procedure SetCustomStyle(const Value: TStringList);\r\n procedure SetMapStyle(const Value: TGoogleMapStyle);\r\n procedure SetDefaultLatitude(const Value: Double);\r\n procedure SetDefaultLongitude(const Value: Double);\r\n procedure SetDefaultZoomLevel(const Value: Integer);\r\n public\r\n constructor Create(AGoogleMaps: TGoogleMaps);\r\n destructor Destroy; override;\r\n procedure Assign(Source: TPersistent); override;\r\n published\r\n property CustomStyle: TStringList read FCustomStyle write SetCustomStyle;\r\n property MapStyle: TGoogleMapStyle read FMapStyle write SetMapStyle default mstDefault;\r\n property DefaultLatitude: Double read FDefaultLatitude write SetDefaultLatitude default -34.397;\r\n property DefaultLongitude: Double read FDefaultLongitude write SetDefaultLongitude default 150.644;\r\n property DefaultZoomLevel: Integer read FDefaultZoomLevel write SetDefaultZoomLevel default 8;\r\n end;\r\n\r\n TGoogleMaps = class(TCustomControl)\r\n private\r\n FUpdateCount: integer;\r\n FReq: TJSXMLHttpRequest;\r\n FAPIKey: string;\r\n FOldAPIKey: string;\r\n FMap: TJSHTMLElement;\r\n FDirectionsService: TJSElement;\r\n FDirectionsDisplay: TJSElement;\r\n FCode: boolean;\r\n FBound: boolean;\r\n FOnMapClick: TMapClickEvent;\r\n FOnMapDblClick: TMapClickEvent;\r\n FOnMapZoom: TMapZoomEvent;\r\n FOnMapPan: TMapClickEvent;\r\n FOnGeoCoded: TMapClickEvent;\r\n FOnMapIdle: TNotifyEvent;\r\n FOnMapLoaded: TNotifyEvent;\r\n FOnMarkerClick: TMapMarkerClickEvent;\r\n FOnPolygonClick: TMapPolygonClickEvent;\r\n FOnPolylineClick: TMapPolylineClickEvent;\r\n FOnCircleClick: TMapCircleClickEvent;\r\n FOnRectangleClick: TMapRectangleClickEvent;\r\n FOnKMLClick: TMapKMLClickEvent;\r\n FOptions: TGoogleMapsOptions;\r\n procedure SetAPIKey(const Value: string);\r\n function GetMarker(AIndex: integer): TJSObject;\r\n function GetCircle(AIndex: integer): TJSObject;\r\n function GetRectangle(AIndex: integer): TJSObject;\r\n function GetPolygon(AIndex: integer): TJSObject;\r\n function GetPolyline(AIndex: integer): TJSObject;\r\n protected\r\n function GetMap: TJSHTMLElement;\r\n function CreateElement: TJSElement; override;\r\n procedure UpdateElement; override;\r\n procedure SetControlCursor(const Value: TCursor); override;\r\n procedure BindEvents; override;\r\n\r\n procedure HandleMapClick(e: TJSEvent);\r\n procedure HandleMapDblClick(e: TJSEvent);\r\n procedure HandleMapPan(e: TJSEvent);\r\n procedure HandleMapZoom(e: TJSEvent);\r\n procedure HandleMapIdle(e: TJSEvent);\r\n procedure HandleMarkerClick(e: TJSEvent);\r\n procedure HandlePolygonClick(e: TJSEvent);\r\n procedure HandlePolylineClick(e: TJSEvent);\r\n procedure HandleCircleClick(e: TJSEvent);\r\n procedure HandleRectangleClick(e: TJSEvent);\r\n procedure HandleKMLClick(e: TJSEvent);\r\n function HandleResponse(Event: TEventListenerEvent): boolean;\r\n function HandleAbort(Event: TEventListenerEvent): boolean;\r\n function TravelModeStr(ATravelMode: TGoogleTravelMode): string;\r\n function DoLoaded(Event: TEventListenerEvent): boolean; virtual;\r\n function GetID: string; override;\r\n procedure Loaded; override;\r\n function GoogleLoaded: boolean;\r\n public\r\n procedure CreateInitialize; override;\r\n procedure SetCenter(Lat, Lon: Double);\r\n function GetCenter(var Lat, Lon: Double): Boolean;\r\n function GetBounds(var NorthEastLat, NorthEastLon, SouthWestLat, SouthWestLon: Double): Boolean;\r\n procedure SetDoubleClickZoom(AValue: Boolean);\r\n procedure SetDraggable(AValue: Boolean);\r\n procedure SetScrollWheel(AValue: Boolean);\r\n procedure SetMapType(AMapType: TGoogleMapType = mtDefault);\r\n procedure SetZoom(Zoom: integer);\r\n procedure PanTo(Lat, Lon: double);\r\n procedure AddGPX(AGPX: string; AColor: TColor = clRed; AWidth: integer = 2; AOpacity: Double = 1);\r\n procedure AddKML(Url: string; ZoomToBounds: Boolean = true);\r\n procedure AddPolyLine(Points: TJSArray; AColor: TColor = clRed;AWidth: integer = 2; AOpacity: Double = 1);\r\n procedure AddPolygon(Points: TJSArray; AFillColor: TColor = clRed; AStrokeColor: TColor = clBlack; AWidth: Integer = 2; AOpacity: Double = 1);\r\n procedure AddCircle(Lat, Lon: double; Radius: Integer; AFillColor: TColor = clRed; AStrokeColor: TColor = clBlack; AWidth: Integer = 2; AOpacity: double = 1);\r\n procedure AddRectangle(NorthEastLat, NorthEastLon, SouthWestLat, SouthWestLon: double; AFillColor: TColor = clRed; AStrokeColor: TColor = clBlack; AWidth: integer = 2; AOpacity: double = 1);\r\n procedure AddMarker(Lat,Lon: Double; Title: string = ''); overload;\r\n procedure AddMarker(Lat,Lon: Double; Color: TGoogleMarkerColor; Title: string = ''); overload;\r\n procedure AddMarker(Lat,Lon: Double; Color: TColor; PinLetter: string; Title: string = ''); overload;\r\n procedure AddMarker(Lat,Lon: Double; PinIcon: string; Title: string; XOffset: integer = 0; YOffset: integer = 0); overload;\r\n procedure AddMarker(Lat,Lon: Double; Shape: TGoogleMarkerShape; Color: TColor; Title: string = ''); overload;\r\n procedure AddMarker(Lat,Lon: Double; Shape: TGoogleMarkerShape; Color: TColor = clRed; BorderColor: TColor = clBlack; Scale: Double = 1; CustomShape: string = ''; Title: string = ''); overload;\r\n procedure SetMarkerTitle(AIndex: Integer; ATitle: string);\r\n procedure SetMarkerLocation(AIndex: Integer; Lat, Lon: Double);\r\n procedure SetMarkerIcon(AIndex: Integer; Url: string);\r\n procedure SetCircleCenter(AIndex: Integer; Lat, Lon: Double);\r\n procedure SetCircleRadius(AIndex, Radius: Integer);\r\n procedure SetCircleColors(AIndex: Integer; AFillColor, AStrokeColor: TColor);\r\n procedure SetRectangleLocation(AIndex: Integer; NorthEastLat, NorthEastLon, SouthWestLat, SouthWestLon: Double);\r\n procedure SetRectangleColors(AIndex: Integer; AFillColor, AStrokeColor: TColor);\r\n procedure SetPolylineColor(AIndex: Integer; AColor: TColor);\r\n procedure SetPolylinePoints(AIndex: Integer; Points: TJSArray);\r\n procedure SetPolygonColors(AIndex: Integer; AFillColor, AStrokeColor: TColor);\r\n procedure SetPolygonPoints(AIndex: Integer; Points: TJSArray);\r\n procedure FitBounds(LatMin, LonMin, LatMax, LonMax: Double);\r\n procedure ClearMarkers;\r\n procedure ClearKMLs;\r\n procedure ClearPolylines;\r\n procedure ClearPolygons;\r\n procedure ClearCircles;\r\n procedure ClearRectangles;\r\n procedure ShowDirections(Source, Destination: string; ATravelMode: TGoogleTravelMode = tmDriving; WayPoints: TStringList = nil; OptimizeWayPoints: Boolean = False; AvoidHighways: Boolean = False; AvoidTolls: Boolean = False); overload;\r\n procedure ShowDirections(SourceLon, SourceLat, DestLon, DestLat: Double; ATravelMode: TGoogleTravelMode = tmDriving; WayPoints: TStringList = nil; OptimizeWayPoints: Boolean = False; AvoidHighways: Boolean = False; AvoidTolls: Boolean = False); overload;\r\n procedure ShowStreetView(Lat, Lon: Double; Heading: Integer = 0; Zoom: Integer = 0; Pitch: Integer = 0);\r\n procedure HideStreetView;\r\n procedure RemoveDirections;\r\n procedure RemoveMarker(AIndex: Integer);\r\n procedure RemovePolygon(AIndex: Integer);\r\n procedure RemovePolyline(AIndex: Integer);\r\n procedure RemoveCircle(AIndex: Integer);\r\n procedure RemoveRectangle(AIndex: Integer);\r\n procedure GeoCode(const Address: string);\r\n property Markers[AIndex: Integer]: TJSObject read GetMarker;\r\n property Polygons[AIndex: Integer]: TJSObject read GetPolygon;\r\n property Polylines[AIndex: Integer]: TJSObject read GetPolyline;\r\n property Circles[AIndex: Integer]: TJSObject read GetCircle;\r\n property Rectangles[AIndex: Integer]: TJSObject read GetRectangle;\r\n published\r\n property Align;\r\n property Options: TGoogleMapsOptions read FOptions write FOptions;\r\n property APIKey: string read FAPIKey write SetAPIKey;\r\n property OnGeoCoded: TMapClickEvent read FOnGeoCoded write FOnGeoCoded;\r\n property OnKeyDown;\r\n property OnKeyUp;\r\n property OnKeyPress;\r\n property OnMapClick: TMapClickEvent read FOnMapClick write FOnMapClick;\r\n property OnMapDblClick: TMapClickEvent read FOnMapDblClick write FOnMapDblClick;\r\n property OnMapIdle: TNotifyEvent read FOnMapIdle write FOnMapIdle;\r\n property OnMapPan: TMapClickEvent read FOnMapPan write FOnMapPan;\r\n property OnMapLoaded: TNotifyEvent read FOnMapLoaded write FOnMapLoaded;\r\n property OnMapZoom: TMapZoomEvent read FOnMapZoom write FOnMapZoom;\r\n property OnMarkerClick: TMapMarkerClickEvent read FOnMarkerClick write FOnMarkerClick;\r\n property OnPolygonClick: TMapPolygonClickEvent read FOnPolygonClick write FOnPolygonClick;\r\n property OnPolylineClick: TMapPolylineClickEvent read FOnPolylineClick write FOnPolylineClick;\r\n property OnCircleClick: TMapCircleClickEvent read FOnCircleClick write FOnCircleClick;\r\n property OnRectangleClick: TMapRectangleClickEvent read FOnRectangleClick write FOnRectangleClick;\r\n property OnKMLClick: TMapKMLClickEvent read FOnKMLClick write FOnKMLClick;\r\n end;\r\n\r\n TWebGoogleMaps = class(TGoogleMaps);\r\n\r\n TDriveView = (dvList, dvGrid);\r\n\r\n TGoogleDrive = class(TCustomControl)\r\n private\r\n FView: TDriveView;\r\n FFolderID: string;\r\n FFrameHandle: TJSElement;\r\n procedure SetFolderID(const Value: string);\r\n procedure SetView(const Value: TDriveView);\r\n protected\r\n function CreateElement: TJSElement; override;\r\n procedure UpdateElement; override;\r\n public\r\n procedure CreateInitialize; override;\r\n published\r\n property FolderID: string read FFolderID write SetFolderID;\r\n property View: TDriveView read FView write SetView;\r\n end;\r\n\r\n TWebGoogleDrive = class(TGoogleDrive);\r\n\r\n TTwitterFeed = class(TCustomControl)\r\n private\r\n FUpdatedFeed: boolean;\r\n FFeed: string;\r\n FFeedLinkText: string;\r\n procedure SetFeed(const Value: string);\r\n procedure SetFeedLinkText(const Value: string);\r\n protected\r\n function CreateElement: TJSElement; override;\r\n procedure UpdateElement; override;\r\n public\r\n procedure CreateInitialize; override;\r\n published\r\n property Feed: string read FFeed write SetFeed;\r\n property FeedLinkText: string read FFeedLinkText write SetFeedLinkText;\r\n property Visible;\r\n end;\r\n\r\n TWebTwitterFeed = class(TTwitterFeed);\r\n\r\n TFilesDroppedEvent = procedure(Sender: TObject; AFileList: TStringList) of object;\r\n\r\n TFileAsTextEvent = procedure(Sender: TObject; AFileIndex: integer; AText: string) of object;\r\n\r\n TFileAsBase64Event = procedure(Sender: TObject; AFileIndex: integer; ABase64: string) of object;\r\n\r\n TFileAsDataURLEvent = procedure(Sender: TObject; AFileIndex: integer; AURL: string) of object;\r\n\r\n TFileAsArrayBufferEvent = procedure(Sender: TObject; AFileIndex: integer; ABuffer: TJSArrayBufferRecord) of object;\r\n\r\n TFileAsStreamEvent = procedure(Sender: TObject; AFileIndex: integer; AStream: TStream) of object;\r\n\r\n TFileUploadEvent = procedure(Sender: TObject; AFileIndex: integer) of object;\r\n\r\n TFileUploadResponseEvent = procedure(Sender: TObject; AFileIndex: integer; ARequest:TJSXMLHttpRequestRecord; AResponse: string) of object;\r\n\r\n TFileUploadErrorEvent = procedure(Sender: TObject; AFileIndex: integer; AError: string) of object;\r\n\r\n TFileUploadProgressEvent = procedure(Sender: TObject; AFileIndex: integer; APosition, ATotalSize: longint) of object;\r\n\r\n TFileGetAsBase64 = procedure(Sender: TObject; ABase64: string) of object;\r\n\r\n TFileGetAsText = procedure(Sender: TObject; AText: string) of object;\r\n\r\n TFileGetAsURL = procedure(Sender: TObject; AURL: string) of object;\r\n\r\n TFileGetAsArrayBuffer = procedure(Sender: TObject; ABuffer: TJSArrayBufferRecord) of object;\r\n\r\n TFileGetAsStream = procedure(Sender: TObject; AStream: TStream) of object;\r\n\r\n TGetAsStringProc = reference to procedure(AValue: string);\r\n\r\n TGetAsArrayBufferProc = reference to procedure(AValue: TJSArrayBuffer);\r\n\r\n TGetAsStreamProc = reference to procedure(AStream: TStream);\r\n\r\n TFile = class(TCollectionItem)\r\n private\r\n FReq: TJSXMLHttpRequest;\r\n FModified: TDateTime;\r\n FName: string;\r\n FMimeType: string;\r\n FSize: integer;\r\n FFileObject: TJSHTMLFile;\r\n FTag: integer;\r\n FObject: TObject;\r\n FOnGetFileAsBase64: TFileGetAsBase64;\r\n FOnGetFileAsArrayBuffer: TFileGetAsArrayBuffer;\r\n FOnGetFileAsText: TFileGetAsText;\r\n FOnGetFileAsURL: TFileGetAsURL;\r\n FOnGetFileAsStream: TFileGetAsStream;\r\n FGetAsString: TGetAsStringProc;\r\n FGetAsStream: TGetAsStreamProc;\r\n FGetAsArrayBuffer: TGetAsArrayBufferProc;\r\n protected\r\n function HandleFileLoadAsText(Event: TJSEvent): boolean;\r\n function HandleFileLoadAsBase64(Event: TJSEvent): boolean;\r\n function HandleFileLoadAsArrayBuffer(Event: TJSEvent): boolean;\r\n function HandleFileLoadAsDataURL(Event: TJSEvent): boolean;\r\n function HandleFileLoadAsStream(Event: TJSEvent): boolean;\r\n function HandleFileUploadProgress(Event: TJSEvent): boolean;\r\n function HandleFileUploadComplete(Event: TJSEvent): boolean;\r\n function HandleFileUploadError(Event: TJSEvent): boolean;\r\n function HandleFileUploadAbort(Event: TJSEvent): boolean;\r\n function GetControl: TComponent;\r\n public\r\n property FileObject: TJSHTMLFile read FFileObject write FFileObject;\r\n property Name: string read FName write FName;\r\n property MimeType: string read FMimeType write FMimeType;\r\n property Modified: TDateTime read FModified write FModified;\r\n property &Object: TObject read FObject write FObject;\r\n property Size: integer read FSize write FSize;\r\n property Tag: integer read FTag write FTag;\r\n\r\n [async]\r\n function FileAsText: TJSPromise; overload;\r\n [async]\r\n function FileAsText(AEncoding: string): TJSPromise; overload;\r\n [async]\r\n function FileAsBase64: TJSPromise;\r\n [async]\r\n function FileAsStream: TJSPromise;\r\n [async]\r\n function FileAsDataURL: TJSPromise;\r\n [async]\r\n function FileAsArrayBuffer: TJSPromise;\r\n\r\n procedure GetFileAsText; overload;\r\n procedure GetFileAsText(GetAsString: TGetAsStringProc); overload;\r\n procedure GetFileAsText(AEncoding: string); overload;\r\n procedure GetFileAsBase64; overload;\r\n procedure GetFileAsBase64(GetAsString: TGetAsStringProc); overload;\r\n procedure GetFileAsArrayBuffer; overload;\r\n procedure GetFileAsArrayBuffer(GetAsArrayBuffer: TGetAsArrayBufferProc); overload;\r\n procedure GetFileAsStream; overload;\r\n procedure GetFileAsStream(GetAsStream: TGetAsStreamProc); overload;\r\n procedure GetFileAsDataURL; overload;\r\n procedure GetFileAsDataURL(GetAsString: TGetAsStringProc); overload;\r\n procedure Upload(AAction: string);\r\n function AbortUpload: boolean;\r\n property OnGetFileAsText: TFileGetAsText read FOnGetFileAsText write FOnGetFileAsText;\r\n property OnGetFileAsBase64: TFileGetAsBase64 read FOnGetFileAsBase64 write FOnGetFileAsBase64;\r\n property OnGetFileAsURL: TFileGetAsURL read FOnGetFileAsURL write FOnGetFileAsURL;\r\n property OnGetFileAsArrayBuffer: TFileGetAsArrayBuffer read FOnGetFileAsArrayBuffer write FOnGetFileAsArrayBuffer;\r\n property OnGetFileAsStream: TFileGetAsStream read FOnGetFileAsStream write FOnGetFileAsStream;\r\n end;\r\n\r\n TFilePicker = class;\r\n\r\n TFiles = class(TCollection)\r\n private\r\n FOwner: TCustomControl;\r\n function GetItem(Index: integer): TFile; reintroduce;\r\n procedure SetItem(Index: integer; const Value: TFile);\r\n public\r\n constructor Create(AOwner: TComponent); reintroduce;\r\n function Owner: TPersistent; reintroduce;\r\n property Items[Index: integer]: TFile read GetItem write SetItem; default;\r\n function Add: TFile; reintroduce;\r\n function Insert(Index: integer): TFile; reintroduce;\r\n procedure Clear; reintroduce;\r\n end;\r\n\r\n TFileUpload = class(TCustomControl)\r\n private\r\n FAccept: string;\r\n FCreateRef: string;\r\n FEventInit: boolean;\r\n FFiles: TFiles;\r\n FFileList: TStringList;\r\n FOnDroppedFiles: TFilesDroppedEvent;\r\n FMultiFile: boolean;\r\n FShowFiles: boolean;\r\n FDragCaption: string;\r\n FOnGetFileAsArrayBuffer: TFileAsArrayBufferEvent;\r\n FOnFileAsText: TFileAsTextEvent;\r\n FOnFileAsBase64: TFileAsBase64Event;\r\n FOnFileAsDataURL: TFileAsDataURLEvent;\r\n FOnUploadFileAbort: TFileUploadEvent;\r\n FOnUploadFileComplete: TFileUploadEvent;\r\n FOnUploadFileProgress: TFileUploadProgressEvent;\r\n FOnUploadFileError: TFileUploadErrorEvent;\r\n FOnUploadFileResponseComplete: TFileUploadResponseEvent;\r\n FOnGetFileAsStream: TFileAsStreamEvent;\r\n procedure SetDragCaption(const Value: string);\r\n procedure SetAccept(const Value: string);\r\n protected\r\n procedure SetCaption(const AValue: string); override;\r\n function HandleFiles(files: TJSHTMLFileList): string;\r\n function DoHandleChange(e: TJSEvent): boolean;\r\n function HandleDroppedFiles(Event: TJSDragEvent): boolean;\r\n function HandleDragOver(Event: TJSDragEvent): boolean;\r\n function HandleDragEnd(Event: TJSDragEvent): boolean;\r\n function CreateElement: TJSElement; override;\r\n procedure UpdateElement; override;\r\n public\r\n constructor Create(AOwner: TComponent); overload; override;\r\n destructor Destroy; override;\r\n procedure CreateInitialize; override;\r\n property Files: TFiles read FFiles;\r\n procedure Clear;\r\n published\r\n property Accept: string read FAccept write SetAccept;\r\n property Caption;\r\n property ChildOrder;\r\n property DragCaption: string read FDragCaption write SetDragCaption;\r\n property Multifile: boolean read FMultiFile write FMultiFile default false;\r\n property ShowFiles: boolean read FShowFiles write FShowFiles default false;\r\n property OnDroppedFiles: TFilesDroppedEvent read FOnDroppedFiles write FOnDroppedFiles;\r\n property OnGetFileAsText: TFileAsTextEvent read FOnFileAsText write FOnFileAsText;\r\n property OnGetFileAsArrayBuffer: TFileAsArrayBufferEvent read FOnGetFileAsArrayBuffer write FOnGetFileAsArrayBuffer;\r\n property OnGetFileAsStream: TFileAsStreamEvent read FOnGetFileAsStream write FOnGetFileAsStream;\r\n property OnGetFileAsBase64: TFileAsBase64Event read FOnFileAsBase64 write FOnFileAsBase64;\r\n property OnGetFileAsDataURL: TFileAsDataURLEvent read FOnFileAsDataURL write FOnFileAsDataURL;\r\n property OnUploadFileComplete: TFileUploadEvent read FOnUploadFileComplete write FOnUploadFileComplete;\r\n property OnUploadFileResponseComplete: TFileUploadResponseEvent read FOnUploadFileResponseComplete write FOnUploadFileResponseComplete;\r\n property OnUploadFileAbort: TFileUploadEvent read FOnUploadFileAbort write FOnUploadFileAbort;\r\n property OnUploadFileError: TFileUploadErrorEvent read FOnUploadFileError write FOnUploadFileError;\r\n property OnUploadFileProgress: TFileUploadProgressEvent read FOnUploadFileProgress write FOnUploadFileProgress;\r\n end;\r\n\r\n TWebFileUpload = class(TFileUpload);\r\n\r\n TFilePicker = class(TCustomControl)\r\n private\r\n FOnChange: TNotifyEvent;\r\n FMultiFile: boolean;\r\n FFiles: TFiles;\r\n FOnFileAsText: TFileAsTextEvent;\r\n FOnGetFileAsArrayBuffer: TFileAsArrayBufferEvent;\r\n FAccept: string;\r\n FOnFileAsBase64: TFileAsBase64Event;\r\n FChangePtr: pointer;\r\n FOnFileAsDataURL: TFileAsDataURLEvent;\r\n FOnUploadFileAbort: TFileUploadEvent;\r\n FOnUploadFileComplete: TFileUploadEvent;\r\n FOnUploadFileProgress: TFileUploadProgressEvent;\r\n FOnUploadFileError: TFileUploadErrorEvent;\r\n FOnUploadFileResponseComplete: TFileUploadResponseEvent;\r\n FOnGetFileAsStream: TFileAsStreamEvent;\r\n procedure SetMultiFile(const Value: boolean);\r\n function DoHandleChange(e: TJSEvent): boolean;\r\n procedure SetAccept(const Value: string);\r\n protected\r\n procedure UpdateElement; override;\r\n function CreateElement: TJSElement; override;\r\n procedure GetMethodPointers; override;\r\n procedure BindEvents; override;\r\n public\r\n procedure CreateInitialize; override;\r\n destructor Destroy; override;\r\n property Files: TFiles read FFiles;\r\n procedure Clear;\r\n published\r\n property Accept: string read FAccept write SetAccept;\r\n property ChildOrder;\r\n property ElementClassName;\r\n property ElementFont;\r\n property ElementID;\r\n property ElementPosition;\r\n property Multifile: boolean read FMultiFile write SetMultiFile;\r\n property OnChange: TNotifyEvent read FOnChange write FOnChange;\r\n property OnGetFileAsText: TFileAsTextEvent read FOnFileAsText write FOnFileAsText;\r\n property OnGetFileAsArrayBuffer: TFileAsArrayBufferEvent read FOnGetFileAsArrayBuffer write FOnGetFileAsArrayBuffer;\r\n property OnGetFileAsBase64: TFileAsBase64Event read FOnFileAsBase64 write FOnFileAsBase64;\r\n property OnGetFileAsDataURL: TFileAsDataURLEvent read FOnFileAsDataURL write FOnFileAsDataURL;\r\n property OnGetFileAsStream: TFileAsStreamEvent read FOnGetFileAsStream write FOnGetFileAsStream;\r\n property OnUploadFileComplete: TFileUploadEvent read FOnUploadFileComplete write FOnUploadFileComplete;\r\n property OnUploadFileResponseComplete: TFileUploadResponseEvent read FOnUploadFileResponseComplete write FOnUploadFileResponseComplete;\r\n property OnUploadFileAbort: TFileUploadEvent read FOnUploadFileAbort write FOnUploadFileAbort;\r\n property OnUploadFileError: TFileUploadErrorEvent read FOnUploadFileError write FOnUploadFileError;\r\n property OnUploadFileProgress: TFileUploadProgressEvent read FOnUploadFileProgress write FOnUploadFileProgress;\r\n end;\r\n\r\n TWebFilePicker = class(TFilePicker);\r\n\r\n THTMLDiv = class(TCustomControl)\r\n private\r\n FHTML: TStrings;\r\n FOldText: string;\r\n procedure SetHTML(const Value: TStrings);\r\n protected\r\n procedure UpdateElementData; override;\r\n procedure HTMLChanged(Sender: TObject);\r\n function CreateElement: TJSElement; override;\r\n public\r\n procedure CreateInitialize; override;\r\n destructor Destroy; override;\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property ChildOrder;\r\n property DragMode;\r\n property ElementClassName;\r\n property ElementFont;\r\n property ElementID;\r\n property ElementPosition;\r\n property HeightPercent;\r\n property HeightStyle;\r\n property HTML: TStrings read FHTML write SetHTML;\r\n property Role;\r\n property Visible;\r\n property WidthPercent;\r\n property WidthStyle;\r\n property OnClick;\r\n property OnDblClick;\r\n property OnMouseDown;\r\n property OnMouseUp;\r\n property OnMouseMove;\r\n property OnMouseLeave;\r\n property OnMouseEnter;\r\n property OnTouchStart;\r\n property OnTouchEnd;\r\n property OnTouchMove;\r\n property OnTouchCancel;\r\n property OnDragDrop;\r\n property OnDragOver;\r\n property OnEndDrag;\r\n property OnStartDrag;\r\n end;\r\n\r\n TWebHTMLDiv = class(THTMLDiv);\r\n\r\n THTMLSpan = class(TCustomControl)\r\n private\r\n FHTML: TStrings;\r\n FOldText: string;\r\n procedure SetHTML(const Value: TStrings);\r\n protected\r\n procedure UpdateElementData; override;\r\n procedure HTMLChanged(Sender: TObject);\r\n function CreateElement: TJSElement; override;\r\n public\r\n procedure CreateInitialize; override;\r\n destructor Destroy; override;\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property ChildOrder;\r\n property DragMode;\r\n property ElementClassName;\r\n property ElementFont;\r\n property ElementID;\r\n property ElementPosition;\r\n property HeightPercent;\r\n property HeightStyle;\r\n property HTML: TStrings read FHTML write SetHTML;\r\n property Role;\r\n property Visible;\r\n property WidthPercent;\r\n property WidthStyle;\r\n property OnClick;\r\n property OnDblClick;\r\n property OnMouseDown;\r\n property OnMouseUp;\r\n property OnMouseMove;\r\n property OnMouseLeave;\r\n property OnMouseEnter;\r\n property OnTouchStart;\r\n property OnTouchEnd;\r\n property OnTouchMove;\r\n property OnTouchCancel;\r\n property OnDragDrop;\r\n property OnDragOver;\r\n property OnEndDrag;\r\n property OnStartDrag;\r\n end;\r\n\r\n TWebHTMLSpan = class(THTMLSpan);\r\n\r\n THTMLAnchor = class(TCustomControl)\r\n private\r\n FHref: string;\r\n FTarget: string;\r\n procedure SetHref(const Value: string);\r\n procedure SetTarget(const Value: string);\r\n protected\r\n procedure SetCaption(const Value: string); override;\r\n function HandleDoClick(Event: TJSMouseEvent): Boolean; override;\r\n function CreateElement: TJSElement; override;\r\n procedure UpdateElementData; override;\r\n public\r\n procedure CreateInitialize; override;\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property Caption;\r\n property ChildOrder;\r\n property ElementClassName;\r\n property ElementFont;\r\n property ElementID;\r\n property ElementPosition;\r\n property HeightPercent;\r\n property HeightStyle;\r\n property HRef: string read FHref write SetHref;\r\n property Target: string read FTarget write SetTarget;\r\n property Role;\r\n property Visible;\r\n property WidthPercent;\r\n property WidthStyle;\r\n property OnClick;\r\n property OnDblClick;\r\n property OnMouseDown;\r\n property OnMouseUp;\r\n property OnMouseMove;\r\n property OnMouseLeave;\r\n property OnMouseEnter;\r\n end;\r\n\r\n TWebHTMLAnchor = class(THTMLAnchor);\r\n\r\n TURLValidatorEvent = procedure(Sender: TObject; IsValid: boolean) of object;\r\n\r\n TURLValidator = class(TComponent)\r\n private\r\n FURL: string;\r\n FOnValidated: TURLValidatorEvent;\r\n protected\r\n procedure HandleResult(IsValid: boolean);\r\n public\r\n procedure Validate;\r\n published\r\n property URL: string read FURL write FURL;\r\n property OnValidated: TURLValidatorEvent read FOnValidated write FOnValidated;\r\n end;\r\n\r\n TWebURLValidator = class(TURLValidator);\r\n\r\n\r\n TJSHTMLFileArray = array of TJSHTMLFile;\r\n\r\n TShare = class(TComponent)\r\n public\r\n function Share(ATitle,AText,AURL: string): boolean; virtual overload;\r\n function Share(ATitle,AText,AURL: string; AFiles: TJSHTMLFileArray): boolean; virtual overload;\r\n function CanShareFiles: boolean;\r\n end;\r\n\r\n TWebShare = class(TShare);\r\n\r\n\r\nimplementation\r\n\r\nuses\r\n WEBLib.Dialogs;\r\n\r\nconst\r\n TWITTERSCRIPTID = 'twitterscriptid';\r\n\r\n{$HINTS OFF}\r\nfunction EventResult(Event: TEventListenerEvent): string;\r\nbegin\r\n asm\r\n Result = Event.target.result;\r\n end;\r\nend;\r\n{$HINTS ON}\r\n\r\n{ TYouTube }\r\n\r\nfunction TYoutube.CreateElement: TJSElement;\r\nvar\r\n// LLabel: TJSHTMLElement;\r\n LDiv: TJSHTMLElement;\r\nbegin\r\n if (csDesigning in ComponentState) then\r\n begin\r\n LDiv := TJSHTMLElement(document.createElement('DIV'));\r\n {\r\n LLabel := TJSHTMLElement(document.createElement('DIV'));\r\n LLabel.innerHTML := 'TWebYouTube';\r\n BorderStyle := bsSingle;\r\n LLabel['align'] := 'center';\r\n LLabel.style.setProperty('border','1px solid gray');\r\n LLabel.style.setProperty('vertical-align','middle');\r\n LLabel.style.setProperty('display','table-cell');\r\n Result.appendChild(LLabel);\r\n }\r\n\r\n LDiv.style.setProperty('background-color','slategray');\r\n LDiv.style.setProperty('background-repeat','no-repeat');\r\n LDiv.style.setProperty('background-position-y','center');\r\n LDiv.style.setProperty('background-image',\r\n 'url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/PjxzdmcgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAuNDc5OTk5OTU5NDY4ODQyIDE2OS43MDk4Njkz'+\r\n 'ODQ3NjYgMTE5LjA4NTYyODA5MjI4OSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+PG'+\r\n 'RlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJkZWYwIiB4MT0iMC41IiB4Mj0iMC41IiB5MT0iMSIgeTI9IjMuMTAwNzJFLTA2Ij48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNG'+\r\n 'RjAwMDAiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNGRjZCMDAiLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48Zz48cGF0aCBkPSJNMzEuMDI5MywxLjc3NzM0QzEzLj'+\r\n 'E0MjcsMi45OTQ2Nyw0LjE1NDY3LDYuMTIsMS40ODgsMjguNzkzM0wxLjQ4OCwyOC43OTMzQzAuNTA2NjY3LDM3LjEzNiwwLjAwOTMzMzMzLDQ4LjQwMTMsMCw1OS42OTg3TDAsNjAu'+\r\n 'MzQ1M0MwLjAwOTMzMzMzLDcxLjYyOTMsMC41MDQsODIuODg5MywxLjQ4OCw5MS4yNTA3TDEuNDg4LDkxLjI1MDdDNC4xNTQ2NywxMTMuOTI3LDEzLjE0MjcsMTE3LjA1MiwzMS4wMj'+\r\n 'kzLDExOC4yNjdMMzEuMDI5MywxMTguMjY3QzU2LjQ3NzMsMTIwLDExMy4yNTEsMTE5Ljk5NywxMzguNjgsMTE4LjI2N0wxMzguNjgsMTE4LjI2N0MxNTYuNTY4LDExNy4wNTIsMTY1'+\r\n 'LjU1NSwxMTMuOTI3LDE2OC4yMjMsOTEuMjUwN0wxNjguMjIzLDkxLjI1MDdDMTcwLjIwMyw3NC40MTczLDE3MC4yMDgsNDUuNjg2NywxNjguMjIzLDI4Ljc5MzNMMTY4LjIyMywyOC'+\r\n '43OTMzQzE2NS41NTUsNi4xMTg2OCwxNTYuNTY4LDIuOTk0NjcsMTM4LjY4LDEuNzc3MzRMMTM4LjY4LDEuNzc3MzRDMTI1Ljk2MywwLjkxMjAxLDEwNS4zOTcsMC40ODAwMDMsODQu'+\r\n 'ODQsMC40ODAwMDNMODQuODQsMC40ODAwMDNDNjQuMjkyLDAuNDc4Njc2LDQzLjc1MDcsMC45MTIwMSwzMS4wMjkzLDEuNzc3MzR6IiBmaWxsPSJ1cmwoI2RlZjApIi8+PHBhdGggZD'+\r\n '0iTTEwOC40MjUsNjAuMDIyN0w2Mi4yNDE5LDkxLjk0NjcgNjIuMjQxOSwyOC4wOTg3IDEwOC40MjUsNjAuMDIyN3oiIGZpbGw9IiNGRkZGRkYiLz48L2c+PC9zdmc+)');\r\n LDiv.style.setProperty('background-position-x','center');\r\n LDiv.style.setProperty('background-size','128px');\r\n Result := LDiv;\r\n end\r\n else\r\n begin\r\n Result := document.createElement('IFRAME');\r\n Result.setAttribute('id', GetID);\r\n Result.setAttribute('frameborder','0');\r\n end;\r\nend;\r\n\r\nprocedure TYoutube.UpdateElement;\r\nvar\r\n FURL: string;\r\nbegin\r\n inherited;\r\n\r\n if IsUpdating then\r\n Exit;\r\n\r\n if (csDesigning in ComponentState) then\r\n begin\r\n if Assigned(ElementHandle) then\r\n begin\r\n TJSHTMLElement(ElementHandle).style.setProperty('background-color','slategray');\r\n end;\r\n end;\r\n\r\n if Assigned(Container) then\r\n begin\r\n if FVideoID <> '' then\r\n begin\r\n FURL := 'https://www.youtube.com/embed/' + FVideoID;\r\n if AutoPlay then\r\n FURL := FURL + '?autoplay=1';\r\n Container.setAttribute('src', FURL);\r\n end;\r\n if FAllowFullScreen then\r\n Container.setAttribute('allowfullscreen','allowfullscreen')\r\n else\r\n Container.removeAttribute('allowfullscreen');\r\n end;\r\nend;\r\n\r\nprocedure TYoutube.UpdateElementVisual;\r\nbegin\r\n inherited;\r\n\r\n if IsUpdating then\r\n Exit;\r\n\r\n if (csDesigning in ComponentState) then\r\n begin\r\n if Assigned(ElementHandle) then\r\n begin\r\n TJSHTMLElement(ElementHandle).style.setProperty('background-color','slategray');\r\n end;\r\n end;\r\n\r\nend;\r\n\r\nprocedure TYoutube.CreateInitialize;\r\nbegin\r\n inherited;\r\n Width := 400;\r\n Height := 300;\r\nend;\r\n\r\nprocedure TYoutube.SetAllowFullScreen(const Value: boolean);\r\nbegin\r\n FAllowFullScreen := Value;\r\n UpdateElement;\r\nend;\r\n\r\nprocedure TYoutube.SetVideoID(const Value: string);\r\nbegin\r\n FVideoID := Value;\r\n UpdateElement;\r\nend;\r\n\r\n{ TGoogleMaps }\r\n\r\n{$HINTS OFF}\r\nprocedure TGoogleMaps.AddPolyLine(Points: TJSArray; AColor: TColor = clRed; AWidth: integer = 2; AOpacity: double = 1);\r\nvar\r\n map: TJSHTMLElement;\r\n clr: string;\r\n ptr: Pointer;\r\nbegin\r\n ptr := @HandlePolylineClick;\r\n map := GetMap;\r\n clr := ColorToHTML(AColor);\r\n\r\n asm\r\n var poly = new google.maps.Polyline({\r\n map: map,\r\n \t path: Points,\r\n\t strokeColor: clr,\r\n \t strokeOpacity: AOpacity,\r\n \t strokeWeight: AWidth\r\n \t});\r\n\r\n poly.idx = this.FPolylines.length;\r\n poly.addListener('click', function() { ptr(poly); } );\r\n this.FPolylines.push(poly);\r\n end;\r\nend;\r\n\r\nprocedure TGoogleMaps.AddRectangle(NorthEastLat, NorthEastLon, SouthWestLat,\r\n SouthWestLon: double; AFillColor, AStrokeColor: TColor; AWidth: integer;\r\n AOpacity: double);\r\nvar\r\n map: TJSHTMLElement;\r\n clrF,clrS: string;\r\n ptr: Pointer;\r\nbegin\r\n ptr := @HandleRectangleClick;\r\n map := GetMap;\r\n clrF := ColorToHTML(AFillColor);\r\n clrS := ColorToHTML(AStrokeColor);\r\n\r\n asm\r\n var NELatLng = {lat: NorthEastLat, lng: NorthEastLon};\r\n var SWLatLng = {lat: SouthWestLat, lng: SouthWestLon};\r\n var rect = new google.maps.Rectangle({\r\n map: map,\r\n \t bounds: new google.maps.LatLngBounds(NELatLng, SWLatLng),\r\n fillColor: clrF,\r\n fillOpacity: AOpacity,\r\n\t strokeColor: clrS,\r\n \t strokeOpacity: AOpacity,\r\n \t strokeWeight: AWidth\r\n \t});\r\n\r\n rect.idx = this.FRectangles.length;\r\n rect.addListener('click', function() { ptr(rect); } );\r\n this.FRectangles.push(rect);\r\n end;\r\nend;\r\n\r\nprocedure TGoogleMaps.AddPolygon(Points: TJSArray; AFillColor: TColor = clRed; AStrokeColor: TColor = clBlack; AWidth: integer = 2; AOpacity: double = 1);\r\nvar\r\n map: TJSHTMLElement;\r\n clrF,clrS: string;\r\n ptr: Pointer;\r\nbegin\r\n ptr := @HandlePolygonClick;\r\n map := GetMap;\r\n clrF := ColorToHTML(AFillColor);\r\n clrS := ColorToHTML(AStrokeColor);\r\n\r\n asm\r\n var poly = new google.maps.Polygon({\r\n map: map,\r\n \t paths: Points,\r\n fillColor: clrF,\r\n fillOpacity: AOpacity,\r\n\t strokeColor: clrS,\r\n \t strokeOpacity: AOpacity,\r\n \t strokeWeight: AWidth\r\n \t});\r\n\r\n poly.idx = this.FPolygons.length;\r\n poly.addListener('click', function() { ptr(poly); } );\r\n this.FPolygons.push(poly);\r\n end;\r\nend;\r\n\r\nprocedure TGoogleMaps.AddCircle(Lat, Lon: double; Radius: Integer;\r\n AFillColor, AStrokeColor: TColor; AWidth: integer; AOpacity: double);\r\nvar\r\n map: TJSHTMLElement;\r\n clrF,clrS: string;\r\n ptr: Pointer;\r\nbegin\r\n ptr := @HandleCircleClick;\r\n map := GetMap;\r\n clrF := ColorToHTML(AFillColor);\r\n clrS := ColorToHTML(AStrokeColor);\r\n\r\n asm\r\n var myLatLng = {lat: Lat, lng: Lon};\r\n var circle = new google.maps.Circle({\r\n map: map,\r\n \t center: myLatLng,\r\n radius: Radius,\r\n fillColor: clrF,\r\n fillOpacity: AOpacity,\r\n\t strokeColor: clrS,\r\n \t strokeOpacity: AOpacity,\r\n \t strokeWeight: AWidth\r\n \t});\r\n\r\n circle.idx = this.FCircles.length;\r\n circle.addListener('click', function() { ptr(circle); } );\r\n this.FCircles.push(circle);\r\n end;\r\nend;\r\n\r\nprocedure TGoogleMaps.AddMarker(Lat, Lon: double; Title: string = '');\r\nvar\r\n map: TJSHTMLElement;\r\n ptr: Pointer;\r\nbegin\r\n ptr := @HandleMarkerClick;\r\n map := GetMap;\r\n asm\r\n var myLatLng = {lat: Lat, lng: Lon};\r\n var marker = new google.maps.Marker({\r\n position: myLatLng,\r\n map: map,\r\n title: Title\r\n });\r\n marker.idx = this.FMarkers.length;\r\n marker.addListener('click', function() { ptr(marker); } );\r\n this.FMarkers.push(marker);\r\n end;\r\nend;\r\n\r\nprocedure TGoogleMaps.AddMarker(Lat, Lon: double; Color: TGoogleMarkerColor; Title: string);\r\nvar\r\n map: TJSHTMLElement;\r\n clr: string;\r\n ptr: Pointer;\r\nbegin\r\n ptr := @HandleMarkerClick;\r\n\r\n case Color of\r\n mcDefault: clr := '';\r\n mcRed: clr := 'red-dot.png';\r\n mcGreen: clr := 'green-dot.png';\r\n mcYellow: clr := 'yellow-dot.png';\r\n mcPurple: clr := 'purple-dot.png';\r\n mcBlue: clr := 'blue-dot.png';\r\n end;\r\n\r\n map := GetMap;\r\n asm\r\n var myLatLng = {lat: Lat, lng: Lon};\r\n\r\n var marker = new google.maps.Marker({\r\n position: myLatLng,\r\n map: map,\r\n title: Title\r\n });\r\n\r\n if (clr != \"\") {\r\n marker.setIcon('http://maps.google.com/mapfiles/ms/icons/' + clr);\r\n }\r\n marker.idx = this.FMarkers.length;\r\n marker.addListener('click', function() { ptr(marker); } );\r\n\r\n this.FMarkers.push(marker);\r\n end;\r\nend;\r\n\r\nprocedure TGoogleMaps.AddMarker(Lat, Lon: double; Color: TColor; PinLetter: string; Title: string);\r\nvar\r\n map: TJSHTMLElement;\r\n clr,url: string;\r\n ch: string;\r\n ptr: Pointer;\r\nbegin\r\n ptr := @HandleMarkerClick;\r\n\r\n clr := ColorToHTML(Color);\r\n delete(clr,1,1);\r\n map := GetMap;\r\n asm\r\n var myLatLng = {lat: Lat, lng: Lon};\r\n\r\n url = \"http://chart.apis.google.com/chart?chst=d_map_pin_letter&chld=\"+ PinLetter + \"|\" + clr;\r\n\r\n var pinImage = new google.maps.MarkerImage(url);\r\n\r\n var marker = new google.maps.Marker({\r\n position: myLatLng,\r\n map: map,\r\n title: Title,\r\n icon: pinImage\r\n });\r\n marker.idx = this.FMarkers.length;\r\n marker.addListener('click', function() { ptr(marker); } );\r\n\r\n this.FMarkers.push(marker);\r\n end;\r\nend;\r\n\r\nprocedure TGoogleMaps.AddMarker(Lat, Lon: double; PinIcon, Title: string; XOffset: integer = 0; YOffset: integer = 0);\r\nvar\r\n map: TJSHTMLElement;\r\n ptr: Pointer;\r\nbegin\r\n ptr := @HandleMarkerClick;\r\n\r\n map := GetMap;\r\n asm\r\n var pinImage = new google.maps.MarkerImage(PinIcon, null, null,new google.maps.Point(XOffset, YOffset));\r\n var myLatLng = {lat: Lat, lng: Lon};\r\n var marker = new google.maps.Marker({\r\n position: myLatLng,\r\n map: map,\r\n title: Title,\r\n icon: pinImage\r\n });\r\n marker.idx = this.FMarkers.length;\r\n marker.addListener('click', function() { ptr(marker); } );\r\n\r\n this.FMarkers.push(marker);\r\n end;\r\nend;\r\n\r\nprocedure TGoogleMaps.AddMarker(Lat, Lon: double; Shape: TGoogleMarkerShape;\r\n Color: TColor; Title: string);\r\n begin\r\n AddMarker(Lat, Lon, Shape, Color, clBlack, 1, Title);\r\n end;\r\n\r\nprocedure TGoogleMaps.AddGPX(AGPX: string; AColor: TColor; AWidth: integer;\r\n AOpacity: double);\r\nvar\r\n Points: TJSArray;\r\n LatMax,LonMax,LatMin,LonMin: double;\r\nbegin\r\n Points := TJSArray.new;\r\n asm\r\n var parser = new DOMParser();\r\n var doc = parser.parseFromString(AGPX, 'text/xml');\r\n var trk = doc.getElementsByTagName(\"trk\")[0];\r\n var name = trk.getElementsByTagName(\"name\")[0];\r\n var trkseg = doc.getElementsByTagName(\"trkseg\")[0];\r\n var i = trkseg.getElementsByTagName(\"trkpt\").length;\r\n var trkpt;\r\n var j;\r\n var lat;\r\n var lon;\r\n var bounds = new google.maps.LatLngBounds ();\r\n\r\n for (j= 0; j < i; j++)\r\n {\r\n trkpt = trkseg.getElementsByTagName(\"trkpt\")[j];\r\n lat = trkpt.getAttribute('lat');\r\n lon = trkpt.getAttribute('lon');\r\n\r\n var p = new google.maps.LatLng(lat, lon);\r\n \t Points.push(p);\r\n bounds.extend(p);\r\n }\r\n LatMax = bounds.getNorthEast().lat();\r\n LonMax = bounds.getNorthEast().lng();\r\n\r\n LatMin = bounds.getSouthWest().lat();\r\n LonMin = bounds.getSouthWest().lng();\r\n end;\r\n\r\n AddPolyLine(Points, AColor, AWidth, AOpacity);\r\n FitBounds(LatMin, LonMin, LatMax, LonMax);\r\nend;\r\n\r\nprocedure TGoogleMaps.AddKML(Url: string; ZoomToBounds: Boolean);\r\nvar\r\n map: TJSHTMLElement;\r\n clr: string;\r\n ptr: Pointer;\r\nbegin\r\n ptr := @HandleKMLClick;\r\n map := GetMap;\r\n\r\n asm\r\n var kml = new google.maps.KmlLayer(Url, {\r\n map: map,\r\n clickable: true,\r\n preserveViewport: !ZoomToBounds\r\n \t});\r\n\r\n kml.idx = this.FKMLs.length;\r\n kml.addListener('click', function() { ptr(kml); } );\r\n this.FKMLs.push(kml);\r\n end;\r\nend;\r\n\r\nprocedure TGoogleMaps.AddMarker(Lat, Lon: double; Shape: TGoogleMarkerShape;\r\n Color: TColor; BorderColor: TColor; Scale: Double; CustomShape: string; Title: string);\r\nvar\r\n map: TJSHTMLElement;\r\n clr: string;\r\n bclr: string;\r\n pth: string;\r\n scl: string;\r\n ptr: pointer;\r\nbegin\r\n ptr := @HandleMarkerClick;\r\n map := GetMap;\r\n clr := ColorToHTML(Color);\r\n bclr := ColorToHTML(BorderColor);\r\n scl := StringReplace(FloatToStr(Scale), ',', '.', []);\r\n\r\n case Shape of\r\n msPin: pth:= 'M 0,0 C -2,-20 -10,-22 -10,-30 A 10,10 0 1,1 10,-30 C 10,-22 2,-20 0,0 z';\r\n msPinDot: pth := 'M 0,0 C -2,-20 -10,-22 -10,-30 A 10,10 0 1,1 10,-30 C 10,-22 2,-20 0,0 z M -2,-30 a 2,2 0 1,1 4,0 2,2 0 1,1 -4,0';\r\n msFlag: pth := 'M 0,0 -1,-2 V -43 H 1 V -2 z M 1,-40 H 30 V -20 H 1 z';\r\n msBookmark: pth := 'M17 3h-10c-1.1 0-1.99.9-1.99 2l-.01 16 7-3 7 3v-16c0-1.1-.9-2-2-2z';\r\n msFlagSmall: pth := 'M14.4 6l-.4-2h-9v17h2v-7h5.6l.4 2h7v-10z';\r\n msHome: pth := 'M10 20v-6h4v6h5v-8h3l-10-9-10 9h3v8z';\r\n msFavorite: pth := 'M12 21.35l-1.45-1.32c-5.15-4.67-8.55-7.75-8.55-11.53 0-3.08 2.42-5.5 5.5-5.5 1.74 0 3.41.81 4.5 2.09 1.09-1.28 2.76-2.09 4.5-2.09 3.08 0 5.5 2.42 5.5 5.5 0 3.78-3.4 6.86-8.55 11.54l-1.45 1.31z';\r\n msStar: pth := 'M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z';\r\n msCustom: pth := CustomShape;\r\n end;\r\n\r\n asm\r\n function pinSymbol(color, bcolor, scale) {\r\n return {\r\n path: pth,\r\n fillColor: color,\r\n fillOpacity: 1,\r\n strokeColor: bcolor,\r\n strokeWeight: 1,\r\n scale: parseFloat(scale),\r\n };\r\n }\r\n var myLatLng = {lat: Lat, lng: Lon};\r\n var marker = new google.maps.Marker({\r\n position: myLatLng,\r\n map: map,\r\n title: Title,\r\n icon: pinSymbol(clr, bclr, scl)\r\n });\r\n marker.idx = this.FMarkers.length;\r\n marker.addListener('click', function() { ptr(marker); } );\r\n\r\n this.FMarkers.push(marker);\r\n end;\r\nend;\r\n\r\nprocedure TGoogleMaps.BindEvents;\r\nvar\r\n map: TJSHTMLElement;\r\n ptr1,ptr2,ptr3,ptr4,ptr5: pointer;\r\n dirsvc, dirdispl: TJSElement;\r\nbegin\r\n inherited;\r\n\r\n if IsUpdating then\r\n Exit;\r\n\r\n map := GetMap;\r\n\r\n if Assigned(map) and not FBound and not (csDesigning in ComponentState) then\r\n begin\r\n ptr1 := @HandleMapClick;\r\n ptr2 := @HandleMapDblClick;\r\n ptr3 := @HandleMapPan;\r\n ptr4 := @HandleMapZoom;\r\n ptr5 := @HandleMapIdle;\r\n\r\n asm\r\n this.FMarkers = [];\r\n this.FPolygons = [];\r\n this.FPolylines = [];\r\n this.FCircles = [];\r\n this.FRectangles = [];\r\n this.FKMLs = [];\r\n end;\r\n\r\n\r\n asm\r\n dirsvc = new google.maps.DirectionsService;\r\n dirdispl = new google.maps.DirectionsRenderer;\r\n dirdispl.setMap(map);\r\n map.addListener('click', ptr1);\r\n map.addListener('dblclick', ptr2);\r\n map.addListener('center_changed',ptr3);\r\n map.addListener('zoom_changed',ptr4);\r\n map.addListener('tilesloaded',ptr5);\r\n end;\r\n\r\n FDirectionsService := dirsvc;\r\n FDirectionsDisplay := dirdispl;\r\n\r\n FBound := true;\r\n end;\r\nend;\r\n{$HINTS ON}\r\n\r\n\r\nprocedure TGoogleMaps.ClearCircles;\r\nbegin\r\n asm\r\n for (var i = 0; i < this.FCircles.length; i++) {\r\n this.FCircles[i].setMap(null);\r\n }\r\n this.FMarkers = [];\r\n end;\r\nend;\r\n\r\nprocedure TGoogleMaps.ClearKMLs;\r\nbegin\r\n asm\r\n for (var i = 0; i < this.FKMLs.length; i++) {\r\n this.FKMLs[i].setMap(null);\r\n }\r\n this.FKMLs = [];\r\n end;\r\nend;\r\n\r\nprocedure TGoogleMaps.ClearMarkers;\r\nbegin\r\n asm\r\n for (var i = 0; i < this.FMarkers.length; i++) {\r\n this.FMarkers[i].setMap(null);\r\n }\r\n this.FMarkers = [];\r\n end;\r\nend;\r\n\r\nprocedure TGoogleMaps.ClearPolygons;\r\nbegin\r\n asm\r\n for (var i = 0; i < this.FPolygons.length; i++) {\r\n this.FPolygons[i].setMap(null);\r\n }\r\n this.FPolyLines = [];\r\n end;\r\nend;\r\n\r\nprocedure TGoogleMaps.ClearPolyLines;\r\nbegin\r\n asm\r\n for (var i = 0; i < this.FPolylines.length; i++) {\r\n this.FPolylines[i].setMap(null);\r\n }\r\n this.FPolyLines = [];\r\n end;\r\nend;\r\n\r\nprocedure TGoogleMaps.ClearRectangles;\r\nbegin\r\n asm\r\n for (var i = 0; i < this.FRectangles.length; i++) {\r\n this.FRectangles[i].setMap(null);\r\n }\r\n this.FRectangles = [];\r\n end;\r\nend;\r\n\r\nfunction TGoogleMaps.CreateElement: TJSElement;\r\nbegin\r\n FDirectionsService := nil;\r\n FDirectionsDisplay := nil;\r\n\r\n Result := document.createElement('DIV');\r\n Result.setAttribute('id', GetID);\r\n FMap := nil;\r\nend;\r\n\r\nprocedure TGoogleMaps.CreateInitialize;\r\nbegin\r\n inherited;\r\n FOptions := TGoogleMapsOptions.Create(Self);\r\n Width := 400;\r\n Height := 300;\r\nend;\r\n\r\nfunction TGoogleMaps.DoLoaded(Event: TEventListenerEvent): boolean;\r\nbegin\r\n BindEvents;\r\n Result := true;\r\n\r\n Options.SetMapStyle(Options.MapStyle);\r\n\r\n if Cursor <> crDefault then\r\n SetControlCursor(Cursor);\r\n\r\n if Assigned(OnMapLoaded) then\r\n OnMapLoaded(Self);\r\nend;\r\n\r\n{$HINTS OFF}\r\nprocedure TGoogleMaps.FitBounds(LatMin, LonMin, LatMax, LonMax: double);\r\nvar\r\n map: TJSHTMLElement;\r\nbegin\r\n map := GetMap;\r\n\r\n if Assigned(map) and GoogleLoaded then\r\n begin\r\n asm\r\n var ne = new google.maps.LatLng(LatMax, LonMax);\r\n var sw = new google.maps.LatLng(LatMin, LonMin);\r\n var bounds = new google.maps.LatLngBounds(sw,ne);\r\n map.fitBounds(bounds);\r\n end;\r\n end;\r\nend;\r\n{$HINTS ON}\r\n\r\nprocedure TGoogleMaps.Loaded;\r\nbegin\r\n inherited;\r\nend;\r\n\r\nprocedure TGoogleMaps.GeoCode(const Address: string);\r\nvar\r\n FURL: string;\r\nbegin\r\n FReq := TJSXMLHttpRequest.new;\r\n FReq.addEventListener('load', @HandleResponse);\r\n FReq.addEventListener('abort',@HandleAbort);\r\n\r\n FURL := 'https://maps.googleapis.com/maps/api/geocode/json?address=' + encodeURIComponent(Address) +'&key=' + APIKey;\r\n FReq.open('GET', FURL);\r\n FReq.send;\r\nend;\r\n\r\n{$HINTS OFF}\r\nprocedure TGoogleMaps.PanTo(Lat, Lon: double);\r\nvar\r\n map: TJSHTMLElement;\r\nbegin\r\n map := GetMap;\r\n if Assigned(map) and GoogleLoaded then\r\n begin\r\n asm\r\n map.panTo(new google.maps.LatLng(Lat, Lon));\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TGoogleMaps.GetMap: TJSHTMLElement;\r\nvar\r\n map: TJSHTMLElement;\r\n id: string;\r\nbegin\r\n if Assigned(FMap) then\r\n Result := FMap\r\n else\r\n begin\r\n map := nil;\r\n\r\n id := GetID;\r\n asm\r\n var el = document.getElementById(id);\r\n if (el != null) {\r\n map = el.gMap;\r\n }\r\n end;\r\n\r\n Result := map;\r\n if Assigned(map) then\r\n FMap := Result;\r\n end;\r\nend;\r\n\r\nfunction TGoogleMaps.GetBounds(var NorthEastLat, NorthEastLon, SouthWestLat,\r\n SouthWestLon: Double): Boolean;\r\nvar\r\n neLon, neLat, swLon, swLat: String;\r\nbegin\r\n Result := false;\r\n NorthEastLon := -1;\r\n NorthEastLat := -1;\r\n SouthWestLon := -1;\r\n SouthWestLat := -1;\r\n\r\n asm\r\n neLon = map.getBounds().getNorthEast().lng().toString();\r\n neLat = map.getBounds().getNorthEast().lat().toString();\r\n swLon = map.getBounds().getSouthWest().lng().toString();\r\n swLat = map.getBounds().getSouthWest().lat().toString();\r\n end;\r\n\r\n if (neLon <> '') and (neLat <> '') and (swLon <> '') and (swLat <> '') then\r\n begin\r\n NorthEastLon := StrToFloat(swLon);\r\n NorthEastLat := StrToFloat(swLat);\r\n SouthWestLon := StrToFloat(swLon);\r\n SouthWestLat := StrToFloat(swLat);\r\n Result := true;\r\n end;\r\nend;\r\n\r\nfunction TGoogleMaps.GetCenter(var Lat, Lon: Double): Boolean;\r\nvar\r\n sLon, sLat: String;\r\nbegin\r\n Result := false;\r\n Lon := -1;\r\n Lat := -1;\r\n\r\n asm\r\n sLon = map.getCenter().lng().toString();\r\n sLat = map.getCenter().lat().toString();\r\n end;\r\n\r\n if (sLon <> '') and (sLat <> '') then\r\n begin\r\n Lon := StrToFloat(sLon);\r\n Lat := StrToFloat(sLat);\r\n Result := true;\r\n end;\r\nend;\r\n\r\nfunction TGoogleMaps.GetCircle(AIndex: integer): TJSObject;\r\nvar\r\n res: TJSObject;\r\nbegin\r\n asm\r\n res = this.FCircles[AIndex];\r\n end;\r\n\r\n Result := res;\r\nend;\r\n\r\n\r\nfunction TGoogleMaps.GetID: string;\r\nbegin\r\n Result := inherited GetID;\r\n\r\n if Result = '' then\r\n begin\r\n ElementID := GetNewName;\r\n Result := ElementID;\r\n end;\r\nend;\r\n\r\nfunction TGoogleMaps.GetMarker(AIndex: integer): TJSObject;\r\nvar\r\n res: TJSObject;\r\nbegin\r\n asm\r\n res = this.FMarkers[AIndex];\r\n end;\r\n\r\n Result := res;\r\nend;\r\n\r\nfunction TGoogleMaps.GetPolygon(AIndex: integer): TJSObject;\r\nvar\r\n res: TJSObject;\r\nbegin\r\n asm\r\n res = this.FPolygon[AIndex];\r\n end;\r\n\r\n Result := res;\r\nend;\r\n\r\nfunction TGoogleMaps.GetPolyline(AIndex: integer): TJSObject;\r\nvar\r\n res: TJSObject;\r\nbegin\r\n asm\r\n res = this.FPolyline[AIndex];\r\n end;\r\n\r\n Result := res;\r\nend;\r\n\r\nfunction TGoogleMaps.GetRectangle(AIndex: integer): TJSObject;\r\nvar\r\n res: TJSObject;\r\nbegin\r\n asm\r\n res = this.FGetRectangle[AIndex];\r\n end;\r\n\r\n Result := res;\r\nend;\r\n\r\nfunction TGoogleMaps.GoogleLoaded: boolean;\r\nvar\r\n res: boolean;\r\nbegin\r\n res := false;\r\n\r\n asm\r\n if (typeof google === 'object' && typeof google.maps === 'object')\r\n {\r\n res = true;\r\n }\r\n end;\r\n\r\n Result := res;\r\nend;\r\n\r\nfunction TGoogleMaps.HandleAbort(Event: TEventListenerEvent): boolean;\r\nbegin\r\n //\r\n Result := true;\r\nend;\r\n\r\nprocedure TGoogleMaps.HandleCircleClick(e: TJSEvent);\r\nvar\r\n idx: integer;\r\n LObjRec: TJSObjectRecord;\r\nbegin\r\n asm\r\n idx = e.idx;\r\n end;\r\n\r\n if Assigned(OnCircleClick) then\r\n begin\r\n LObjRec.jsobject := TJSObject(e);\r\n OnCircleClick(Self, idx, LObjRec);\r\n end;\r\nend;\r\n\r\nprocedure TGoogleMaps.HandleKMLClick(e: TJSEvent);\r\nvar\r\n idx: integer;\r\n LObjRec: TJSObjectRecord;\r\nbegin\r\n asm\r\n idx = e.idx;\r\n end;\r\n\r\n if Assigned(OnKMLClick) then\r\n begin\r\n LObjRec.jsobject := TJSObject(e);\r\n OnKMLClick(Self, idx, LObjRec);\r\n end;\r\nend;\r\n\r\nprocedure TGoogleMaps.HandleRectangleClick(e: TJSEvent);\r\nvar\r\n idx: integer;\r\n LObjRec: TJSObjectRecord;\r\nbegin\r\n asm\r\n idx = e.idx;\r\n end;\r\n\r\n if Assigned(OnRectangleClick) then\r\n begin\r\n LObjRec.jsobject := TJSObject(e);\r\n OnRectangleClick(Self, idx, LObjRec);\r\n end;\r\nend;\r\n\r\nprocedure TGoogleMaps.HandleMapClick(e: TJSEvent);\r\nvar\r\n lon,lat: double;\r\nbegin\r\n asm\r\n lon = e.latLng.lng();\r\n lat = e.latLng.lat();\r\n end;\r\n\r\n if Assigned(OnMapClick) then\r\n OnMapClick(Self, lon, lat);\r\nend;\r\n\r\nprocedure TGoogleMaps.HandleMapDblClick(e: TJSEvent);\r\nvar\r\n lon,lat: double;\r\nbegin\r\n asm\r\n lon = e.latLng.lng();\r\n lat = e.latLng.lat();\r\n end;\r\n\r\n if Assigned(OnMapDblClick) then\r\n OnMapDblClick(Self, lon, lat);\r\nend;\r\n\r\nprocedure TGoogleMaps.HandleMapIdle(e: TJSEvent);\r\nbegin\r\n if Assigned(OnMapIdle) then\r\n OnMapIdle(Self);\r\nend;\r\n\r\nprocedure TGoogleMaps.HandleMapPan(e: TJSEvent);\r\nvar\r\n lon,lat: double;\r\nbegin\r\n asm\r\n var c = map.getCenter();\r\n lon = c.lng();\r\n lat = c.lat();\r\n end;\r\n\r\n if Assigned(OnMapPan) then\r\n OnMapPan(Self, lon, lat);\r\nend;\r\n\r\nprocedure TGoogleMaps.HandleMapZoom(e: TJSEvent);\r\nvar\r\n map: TJSHTMLElement;\r\n zoom: integer;\r\nbegin\r\n map := GetMap;\r\n asm\r\n zoom = map.getZoom();\r\n end;\r\n if Assigned(OnMapZoom) then\r\n OnMapZoom(Self, zoom);\r\nend;\r\n\r\nprocedure TGoogleMaps.HandleMarkerClick(e: TJSEvent);\r\nvar\r\n idx: integer;\r\n LObjRec: TJSObjectRecord;\r\nbegin\r\n asm\r\n idx = e.idx;\r\n end;\r\n\r\n if Assigned(OnMarkerClick) then\r\n begin\r\n LObjRec.jsobject := TJSObject(e);\r\n OnMarkerClick(Self, idx, LObjRec);\r\n end;\r\nend;\r\n\r\n\r\nprocedure TGoogleMaps.HandlePolygonClick(e: TJSEvent);\r\nvar\r\n idx: integer;\r\n LObjRec: TJSObjectRecord;\r\nbegin\r\n asm\r\n idx = e.idx;\r\n end;\r\n\r\n if Assigned(OnPolygonClick) then\r\n begin\r\n LObjRec.jsobject := TJSObject(e);\r\n OnPolygonClick(Self, idx, LObjRec);\r\n end;\r\nend;\r\n\r\nprocedure TGoogleMaps.HandlePolylineClick(e: TJSEvent);\r\nvar\r\n idx: integer;\r\n LObjRec: TJSObjectRecord;\r\nbegin\r\n asm\r\n idx = e.idx;\r\n end;\r\n\r\n if Assigned(OnPolylineClick) then\r\n begin\r\n LObjRec.jsobject := TJSObject(e);\r\n OnPolylineClick(Self, idx, LObjRec);\r\n end;\r\nend;\r\n\r\nfunction TGoogleMaps.HandleResponse(Event: TEventListenerEvent): boolean;\r\nvar\r\n fnd: boolean;\r\n reslat, reslon: double;\r\nbegin\r\n Result := true;\r\n fnd := false;\r\n\r\n asm\r\n var s = Event.target.responseText;\r\n var js = JSON.parse(s);\r\n if (js.status == \"OK\") {\r\n fnd = true;\r\n var lat = js.results[0].geometry.location.lat;\r\n var lng = js.results[0].geometry.location.lng;\r\n reslon = lng;\r\n reslat = lat;\r\n }\r\n end;\r\n\r\n if fnd and Assigned(OnGeoCoded) then\r\n begin\r\n OnGeoCoded(Self, reslon, reslat);\r\n end;\r\nend;\r\n\r\nprocedure TGoogleMaps.RemoveDirections;\r\nvar\r\n dirdispl: TJSElement;\r\nbegin\r\n if not Assigned(FDirectionsDisplay) then\r\n BindEvents;\r\n\r\n dirdispl := FDirectionsDisplay;\r\n\r\n asm\r\n dirdispl.setMap(null);\r\n end;\r\nend;\r\n{$HINTS ON}\r\n\r\n\r\nprocedure TGoogleMaps.SetAPIKey(const Value: string);\r\nbegin\r\n if FAPIKey <> Value then\r\n begin\r\n FAPIKey := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\n{$HINTS OFF}\r\nprocedure TGoogleMaps.SetCenter(Lat, Lon: double);\r\nvar\r\n map: TJSHTMLElement;\r\nbegin\r\n map := GetMap;\r\n asm\r\n map.setCenter(new google.maps.LatLng(Lat, Lon));\r\n end;\r\nend;\r\n\r\nprocedure TGoogleMaps.SetDoubleClickZoom(AValue: Boolean);\r\nvar\r\n map: TJSHTMLElement;\r\nbegin\r\n map := GetMap;\r\n asm\r\n map.setOptions( {disableDoubleClickZoom:!AValue} );\r\n end;\r\nend;\r\n\r\nprocedure TGoogleMaps.SetDraggable(AValue: Boolean);\r\nvar\r\n map: TJSHTMLElement;\r\nbegin\r\n map := GetMap;\r\n asm\r\n map.setOptions( {draggable:AValue} );\r\n end;\r\nend;\r\n\r\nprocedure TGoogleMaps.SetMapType(AMapType: TGoogleMapType);\r\nvar\r\n map: TJSHTMLElement;\r\n smt: string;\r\nbegin\r\n map := GetMap;\r\n\r\n case AMapType of\r\n mtDefault: smt := 'roadmap';\r\n mtSatellite: smt := 'satellite';\r\n mtHybrid: smt := 'hybrid';\r\n mtTerrain: smt := 'terrain';\r\n end;\r\n\r\n asm\r\n map.setMapTypeId(smt);\r\n end;\r\nend;\r\n\r\nprocedure TGoogleMaps.RemoveCircle(AIndex: Integer);\r\nbegin\r\n asm\r\n if (AIndex < this.FPolygons.length)\r\n {\r\n this.FCircles[AIndex].setMap(null);\r\n this.FCircles.splice(AIndex, 1);\r\n }\r\n end;\r\nend;\r\n\r\n\r\nprocedure TGoogleMaps.RemoveMarker(AIndex: Integer);\r\nbegin\r\n asm\r\n if (AIndex < this.FMarkers.length)\r\n {\r\n this.FMarkers[AIndex].setMap(null);\r\n this.FMarkers.splice(AIndex, 1);\r\n }\r\n end;\r\nend;\r\n\r\nprocedure TGoogleMaps.RemovePolygon(AIndex: Integer);\r\nbegin\r\n asm\r\n if (AIndex < this.FPolygons.length)\r\n {\r\n this.FPolygons[AIndex].setMap(null);\r\n this.FPolygons.splice(AIndex, 1);\r\n }\r\n end;\r\nend;\r\n\r\nprocedure TGoogleMaps.RemovePolyline(AIndex: Integer);\r\nbegin\r\n asm\r\n if (AIndex < this.FPolylines.length)\r\n {\r\n this.FPolylines[AIndex].setMap(null);\r\n this.FPolylines.splice(AIndex, 1);\r\n }\r\n end;\r\nend;\r\n\r\nprocedure TGoogleMaps.RemoveRectangle(AIndex: Integer);\r\nbegin\r\n asm\r\n if (AIndex < this.FPolygons.length)\r\n {\r\n this.FRectangles[AIndex].setMap(null);\r\n this.FRectangles.splice(AIndex, 1);\r\n }\r\n end;\r\nend;\r\n\r\nprocedure TGoogleMaps.SetMarkerIcon(AIndex: Integer; Url: string);\r\nbegin\r\n asm\r\n if (AIndex < this.FMarkers.length)\r\n {\r\n this.FMarkers[AIndex].setIcon(Url);\r\n }\r\n end;\r\nend;\r\n\r\nprocedure TGoogleMaps.SetMarkerLocation(AIndex: Integer; Lat, Lon: Double);\r\nbegin\r\n asm\r\n if (AIndex < this.FMarkers.length)\r\n {\r\n this.FMarkers[AIndex].setPosition(new google.maps.LatLng(Lat, Lon));\r\n }\r\n end;\r\nend;\r\n\r\nprocedure TGoogleMaps.SetMarkerTitle(AIndex: Integer; ATitle: string);\r\nbegin\r\n asm\r\n if (AIndex < this.FMarkers.length)\r\n {\r\n this.FMarkers[AIndex].setTitle(ATitle);\r\n }\r\n end;\r\nend;\r\n\r\nprocedure TGoogleMaps.SetPolygonColors(AIndex: Integer; AFillColor,\r\n AStrokeColor: TColor);\r\nvar\r\n clrF, clrS: string;\r\nbegin\r\n clrF := ColorToHTML(AFillColor);\r\n clrS := ColorToHTML(AStrokeColor);\r\n asm\r\n if (AIndex < this.FPolygons.length)\r\n {\r\n this.FPolygons[AIndex].setOptions({ fillColor: clrF, strokeColor: clrS });\r\n }\r\n end;\r\nend;\r\n\r\nprocedure TGoogleMaps.SetPolygonPoints(AIndex: Integer; Points: TJSArray);\r\nbegin\r\n asm\r\n if (AIndex < this.FPolygons.length)\r\n {\r\n this.FPolygons[AIndex].setOptions({ path: Points });\r\n }\r\n end;\r\nend;\r\n\r\nprocedure TGoogleMaps.SetPolylineColor(AIndex: Integer; AColor: TColor);\r\nvar\r\n clr: string;\r\nbegin\r\n clr := ColorToHTML(AColor);\r\n asm\r\n if (AIndex < this.FPolylines.length)\r\n {\r\n this.FPolylines[AIndex].setOptions({ strokeColor: clr });\r\n }\r\n end;\r\nend;\r\n\r\nprocedure TGoogleMaps.SetPolylinePoints(AIndex: Integer; Points: TJSArray);\r\nbegin\r\n asm\r\n if (AIndex < this.FPolylines.length)\r\n {\r\n this.FPolylines[AIndex].setOptions({ path: Points });\r\n }\r\n end;\r\nend;\r\n\r\nprocedure TGoogleMaps.SetRectangleColors(AIndex: Integer; AFillColor,\r\n AStrokeColor: TColor);\r\nvar\r\n clrF, clrS: string;\r\nbegin\r\n clrF := ColorToHTML(AFillColor);\r\n clrS := ColorToHTML(AStrokeColor);\r\n asm\r\n if (AIndex < this.FRectangles.length)\r\n {\r\n this.FRectangles[AIndex].setOptions({ fillColor: clrF, strokeColor: clrS });\r\n }\r\n end;\r\nend;\r\n\r\nprocedure TGoogleMaps.SetRectangleLocation(AIndex: Integer; NorthEastLat,\r\n NorthEastLon, SouthWestLat, SouthWestLon: double);\r\nbegin\r\n asm\r\n if (AIndex < this.FRectangles.length)\r\n {\r\n var NELatLng = {lat: NorthEastLat, lng: NorthEastLon};\r\n var SWLatLng = {lat: SouthWestLat, lng: SouthWestLon};\r\n this.FRectangles[AIndex].setOptions({ bounds: new google.maps.LatLngBounds(NELatLng, SWLatLng) });\r\n }\r\n end;\r\nend;\r\n\r\nprocedure TGoogleMaps.SetCircleCenter(AIndex: Integer; Lat, Lon: Double);\r\nbegin\r\n asm\r\n if (AIndex < this.FCircles.length)\r\n {\r\n this.FCircles[AIndex].setCenter(new google.maps.LatLng(Lat, Lon));\r\n }\r\n end;\r\nend;\r\n\r\nprocedure TGoogleMaps.SetCircleColors(AIndex: Integer; AFillColor,\r\n AStrokeColor: TColor);\r\nvar\r\n clrF, clrS: string;\r\nbegin\r\n clrF := ColorToHTML(AFillColor);\r\n clrS := ColorToHTML(AStrokeColor);\r\n asm\r\n if (AIndex < this.FCircles.length)\r\n {\r\n this.FCircles[AIndex].setOptions({ fillColor: clrF, strokeColor: clrS });\r\n }\r\n end;\r\nend;\r\n\r\nprocedure TGoogleMaps.SetCircleRadius(AIndex, Radius: Integer);\r\nbegin\r\n asm\r\n if (AIndex < this.FCircles.length)\r\n {\r\n this.FCircles[AIndex].setRadius(Radius);\r\n }\r\n end;\r\nend;\r\n\r\nprocedure TGoogleMaps.SetControlCursor(const Value: TCursor);\r\nvar\r\n map: TJSHTMLElement;\r\n s: string;\r\nbegin\r\n inherited;\r\n\r\n map := GetMap;\r\n if Value = crDefault then\r\n s := ''''''\r\n else\r\n s := GetHTMLCursorName(Value);\r\n\r\n if Assigned(map) then\r\n begin\r\n asm\r\n map.setOptions({draggableCursor: s});\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TGoogleMaps.SetScrollWheel(AValue: Boolean);\r\nvar\r\n map: TJSHTMLElement;\r\nbegin\r\n map := GetMap;\r\n asm\r\n map.setOptions( {scrollWheel:AValue} );\r\n end;\r\nend;\r\n\r\nprocedure TGoogleMaps.SetZoom(Zoom: Integer);\r\nvar\r\n map: TJSHTMLElement;\r\nbegin\r\n map := GetMap;\r\n if Assigned(map) then\r\n begin\r\n asm\r\n map.setZoom(Zoom);\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TGoogleMaps.ShowDirections(SourceLon, SourceLat, DestLon,\r\n DestLat: double; ATravelMode: TGoogleTravelMode = tmDriving;\r\n WayPoints: TStringList = nil; OptimizeWayPoints: Boolean = False;\r\n AvoidHighways: Boolean = False; AvoidTolls: Boolean = False);\r\nvar\r\n dirsvc,dirdispl,map: TJSElement;\r\n tm: string;\r\n wp: TJSArray;\r\n I: Integer;\r\nbegin\r\n if not Assigned(FDirectionsDisplay) then\r\n BindEvents;\r\n\r\n dirsvc := FDirectionsService;\r\n dirdispl := FDirectionsDisplay;\r\n map := GetMap;\r\n tm := TravelModeStr(ATravelMode);\r\n wp := TJSArray.New;\r\n if WayPoints <> nil then\r\n begin\r\n for I := 0 to WayPoints.Count - 1 do\r\n wp.Push(New(['location', WayPoints[I]]));\r\n end;\r\n\r\n asm\r\n var sourcelatlon = new google.maps.LatLng(SourceLat, SourceLon);\r\n var destlatlon = new google.maps.LatLng(DestLat, DestLon);\r\n\r\n dirdispl.setMap(map);\r\n dirsvc.route({\r\n origin: sourcelatlon,\r\n destination: destlatlon,\r\n waypoints: wp,\r\n optimizeWaypoints: OptimizeWayPoints,\r\n avoidHighways: AvoidHighways,\r\n avoidTolls: AvoidTolls,\r\n travelMode: tm\r\n }, function(response, status) {\r\n if (status === 'OK') {\r\n dirdispl.setDirections(response);\r\n } else {\r\n window.alert('Directions request failed due to ' + status);\r\n }\r\n });\r\n end;\r\nend;\r\n\r\nprocedure TGoogleMaps.HideStreetView;\r\nvar\r\n map: TJSElement;\r\nbegin\r\n map := GetMap;\r\n asm\r\n map.streetView.setVisible(false);\r\n end;\r\nend;\r\n\r\nprocedure TGoogleMaps.ShowStreetView(Lat, Lon: Double; Heading, Zoom,\r\n Pitch: Integer);\r\nvar\r\n map: TJSElement;\r\n mapid: string;\r\nbegin\r\n map := GetMap;\r\n mapid := GetID;\r\n asm\r\n var LatLng = {lat: Lat, lng: Lon};\r\n var panorama = new google.maps.StreetViewPanorama(\r\n document.getElementById(mapid), {\r\n position: LatLng,\r\n pov: {\r\n heading: Heading,\r\n zoom: Zoom,\r\n pitch: Pitch\r\n }\r\n });\r\n map.setStreetView(panorama);\r\n end;\r\nend;\r\n\r\nprocedure TGoogleMaps.ShowDirections(Source, Destination: string;\r\n ATravelMode: TGoogleTravelMode; WayPoints: TStringList; OptimizeWayPoints,\r\n AvoidHighways, AvoidTolls: Boolean);\r\nvar\r\n dirsvc,dirdispl,map: TJSElement;\r\n tm: string;\r\n wp: TJSArray;\r\n I: Integer;\r\nbegin\r\n if not Assigned(FDirectionsDisplay) then\r\n BindEvents;\r\n\r\n dirsvc := FDirectionsService;\r\n dirdispl := FDirectionsDisplay;\r\n map := GetMap;\r\n tm := TravelModeStr(ATravelMode);\r\n wp := TJSArray.New;\r\n if WayPoints <> nil then\r\n begin\r\n for I := 0 to WayPoints.Count - 1 do\r\n wp.Push(New(['location', WayPoints[I]]));\r\n end;\r\n\r\n asm\r\n dirdispl.setMap(map);\r\n\r\n dirsvc.route({\r\n origin: Source,\r\n destination: Destination,\r\n waypoints: wp,\r\n optimizeWaypoints: OptimizeWayPoints,\r\n avoidHighways: AvoidHighways,\r\n avoidTolls: AvoidTolls,\r\n travelMode: tm\r\n }, function(response, status) {\r\n if (status === 'OK') {\r\n dirdispl.setDirections(response);\r\n } else {\r\n window.alert('Directions request failed due to ' + status);\r\n }\r\n });\r\n end;\r\nend;\r\n\r\nfunction TGoogleMaps.TravelModeStr(ATravelMode: TGoogleTravelMode): string;\r\nbegin\r\n Result := 'DRIVING';\r\n case ATravelMode of\r\n tmDriving: Result := 'DRIVING';\r\n tmWalking: Result := 'WALKING';\r\n tmBicycling: Result := 'BICYCLING';\r\n tmTransit: Result := 'TRANSIT';\r\n end;\r\nend;\r\n\r\nprocedure TGoogleMaps.UpdateElement;\r\nvar\r\n map: TJSHTMLElement;\r\n id: string;\r\n srcurl: string;\r\n scriptsrc: string;\r\n scr: TJSElement;\r\n sp: TJSHTMLElement;\r\n\r\nbegin\r\n inherited;\r\n\r\n if IsUpdating then\r\n Exit;\r\n\r\n if FUpdateCount > 0 then\r\n Exit;\r\n\r\n if ((not FCode) and (FAPIKey <> '')) or (FAPIKey <> FOldAPIKey) then\r\n begin\r\n FCode := true;\r\n id := GetID;\r\n FOldAPIKey := FAPIKey;\r\n\r\n scr := document.getElementById('scrgooglemaps');\r\n if Assigned(scr) then\r\n begin\r\n document.head.removeChild(scr);\r\n end;\r\n\r\n srcurl := 'https://maps.googleapis.com/maps/api/js?key=' + FAPIKey + '&callback=initMap'+id;\r\n\r\n scriptsrc := 'var gmapserror = false;'+#13#10+\r\n 'function initMap'+id+'() { '+#13#10+\r\n 'var el = document.getElementById(\"'+id+'\");'+#13#10+\r\n 'if (el == null) { alert(\"Google Maps DIV element not found!\"); }'+#13#10+\r\n 'map = new google.maps.Map(el, {'+#13#10+\r\n 'center: {lat: ' + StringReplace(FloatToStr(Options.DefaultLatitude), ',', '.', [rfReplaceAll]) + ', lng: ' + StringReplace(FloatToStr(Options.DefaultLongitude), ',', '.', [rfReplaceAll]) + '},'+#13#10+\r\n 'zoom: ' + IntToStr(Options.DefaultZoomLevel) + '});'+#13#10+\r\n 'el.gMap = map;'+#13#10+\r\n '}';\r\n\r\n scr := document.createElement('script');\r\n scr.addEventListener('load',@DoLoaded);\r\n asm\r\n scr.defer = true;\r\n scr.async = true;\r\n scr.src = srcurl;\r\n scr.type = 'text/javascript';\r\n end;\r\n\r\n document.head.appendChild(scr);\r\n scr['id'] := 'scrgooglemaps';\r\n\r\n asm\r\n var script = document.createElement('script');\r\n script.innerHTML = scriptsrc;\r\n document.head.appendChild(script);\r\n end;\r\n end\r\n else if Assigned(ElementHandle) then\r\n begin\r\n ElementHandle.style.setProperty('border', '1px solid gray');\r\n ElementHandle.style.setProperty('background-color', '#eee');\r\n if (ElementHandle.childElementCount = 0) then\r\n begin\r\n sp := TJSHTMLElement(document.createElement('SPAN'));\r\n\r\n srcurl := '
Set the Google Maps JavaScript API key via WebGoogleMaps.APIKey in order to see the map.
'+\r\n 'Request the key via this page';\r\n sp.innerHTML := srcurl;\r\n ElementHandle.appendChild(sp);\r\n end;\r\n end;\r\nend;\r\n{$HINTS ON}\r\n\r\n\r\n{ TFileUpload }\r\n\r\n// https://css-tricks.com/drag-and-drop-file-uploading/\r\n// https://html5demos.com/dnd-upload/\r\n\r\nfunction isAdvancedUpload: boolean; assembler;\r\nasm\r\n var div = document.createElement('div');\r\n return (('draggable' in div) || ('ondragstart' in div && 'ondrop' in div)) && 'FormData' in window && 'FileReader' in window;\r\nend;\r\n\r\n\r\nprocedure TFileUpload.Clear;\r\nvar\r\n el: TJSElement;\r\nbegin\r\n el := document.getElementByID('FP'+ElementId);\r\n if Assigned(el) then\r\n begin\r\n el['type'] := '';\r\n el['type'] := 'file';\r\n end;\r\n\r\n el := document.getElementById(ElementID+'fileslist');\r\n if Assigned(el) then\r\n begin\r\n el.innerHTML := '';\r\n end;\r\n\r\n while Files.Count > 0 do\r\n Files.Delete(0);\r\nend;\r\n\r\nconstructor TFileUpload.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n\r\n Caption := 'Choose a file';\r\n FDragCaption := 'or drag it here';\r\n\r\n FFiles := TFiles.Create(Self);\r\n\r\n FFileList := TStringList.Create;\r\n FFileList.SkipLastLineBreak := true;\r\n\r\n AddControlStyle(\r\n ' \t.box'+\r\n\t'\t\t\t{'+\r\n\t'\t\t\t\tfont-size: 1.25rem; /* 20 */'+\r\n\t'\t\t\t\tbackground-color: #c8dadf;'+\r\n\t' \t\t\tposition: relative;'+\r\n\t'\t \tpadding: 2px 2px;'+\r\n\t'\t\t}'+\r\n\t'\t\t.box.has-advanced-upload'+\r\n\t'\t\t{'+\r\n\t'\t\t\toutline: 2px dashed #92b0b3;'+\r\n\t'\t\t\toutline-offset: -10px;'+\r\n\t'\t\t\t-webkit-transition: outline-offset .15s ease-in-out, background-color .15s linear;'+\r\n\t'\t\t\ttransition: outline-offset .15s ease-in-out, background-color .15s linear;'+\r\n\t'\t\t}'+\r\n\t'\t\t.box.is-dragover'+\r\n\t'\t\t{'+\r\n\t'\t\t\toutline-offset: -20px;'+\r\n\t'\t\t\toutline-color: #c8dadf;'+\r\n\t'\t\t\tbackground-color: #fff;'+\r\n\t'\t\t}'+\r\n\t'\t\t\t.box__dragndrop,'+\r\n\t'\t\t\t.box__icon'+\r\n\t'\t\t\t{'+\r\n\t'\t\t\t\tdisplay: none;'+\r\n\t'\t\t\t}'+\r\n\t'\t\t\t.box.has-advanced-upload .box__dragndrop'+\r\n\t'\t\t\t{'+\r\n\t'\t\t\t\tdisplay: inline;'+\r\n\t'\t\t\t}'+\r\n\t'\t\t\t.box.has-advanced-upload .box__icon'+\r\n\t'\t\t\t{'+\r\n\t'\t\t\t\twidth: 100%;'+\r\n\t'\t\t\t\theight: 80px;'+\r\n\t'\t\t\t\tfill: #92b0b3;'+\r\n '\t\t\t\tdisplay: block;'+\r\n\t'\t\t\t\tmargin-bottom: 40px;'+\r\n\t'\t\t\t}'+\r\n\t'\t\t\t.box.is-uploading .box__input,'+\r\n\t'\t\t\t.box.is-success .box__input,'+\r\n\t'\t\t\t.box.is-error .box__input'+\r\n\t'\t\t\t{'+\r\n\t'\t\t\t\tvisibility: hidden;'+\r\n\t'\t\t\t}'+\r\n\t'\t\t\t.box__uploading,'+\r\n\t'\t\t\t.box__success,'+\r\n\t'\t\t\t.box__error'+\r\n\t'\t\t\t{'+\r\n\t'\t\t\tdisplay: none;'+\r\n\t'\t\t\t}'+\r\n\t'\t\t\t.box.is-uploading .box__uploading,'+\r\n\t'\t\t\t.box.is-success .box__success,'+\r\n\t'\t\t\t.box.is-error .box__error'+\r\n\t'\t\t\t{'+\r\n\t'\t\t\t\tdisplay: block;'+\r\n\t'\t\t\t\tposition: absolute;'+\r\n\t'\t\t\t\ttop: 50%;'+\r\n\t' right: 0;'+\r\n '\t\t\t\tleft: 0;'+\r\n\t'\t \t\t-webkit-transform: translateY( -50% );'+\r\n\t'\t\t\t\t\ttransform: translateY( -50% );'+\r\n\t'\t\t\t\t}'+\r\n\t'\t\t\t\t.box__uploading'+\r\n\t'\t\t\t\t{'+\r\n\t'\t\t\t\t\tfont-style: italic;'+\r\n\t'\t\t\t\t}'+\r\n\t'\t\t\t\t.box__success'+\r\n\t'\t\t\t\t{'+\r\n\t'\t\t\t\t\t-webkit-animation: appear-from-inside .25s ease-in-out;'+\r\n\t'\t\t\t\t\tanimation: appear-from-inside .25s ease-in-out;'+\r\n\t'\t\t\t\t}'+\r\n\t'\t\t\t\t\t@-webkit-keyframes appear-from-inside'+\r\n\t'\t\t\t\t\t{'+\r\n\t'\t\t\t\t\t\tfrom\t{ -webkit-transform: translateY( -50% ) scale( 0 ); }'+\r\n\t'\t\t\t\t\t\t75%\t\t{ -webkit-transform: translateY( -50% ) scale( 1.1 ); }'+\r\n\t'\t\t\t\t\t\tto\t\t{ -webkit-transform: translateY( -50% ) scale( 1 ); }'+\r\n\t'\t\t\t\t\t}'+\r\n\t'\t\t\t\t\t@keyframes appear-from-inside'+\r\n\t'\t\t\t\t\t{'+\r\n\t'\t\t\t\t\t\tfrom\t{ transform: translateY( -50% ) scale( 0 ); }'+\r\n\t'\t\t\t\t\t\t75%\t\t{ transform: translateY( -50% ) scale( 1.1 ); }'+\r\n\t'\t\t\t\t\t\tto\t\t{ transform: translateY( -50% ) scale( 1 ); }'+\r\n\t'\t\t\t\t\t}'+\r\n\t'\t\t\t\t.box__restart'+\r\n\t'\t\t\t\t{'+\r\n\t'\t\t\t\t\tfont-weight: 700;'+\r\n\t'\t\t\t\t}'+\r\n\t'\t\t\t\t.box__restart:focus,'+\r\n\t'\t\t\t\t.box__restart:hover'+\r\n\t'\t\t\t\t{'+\r\n\t'\t\t\t\t\tcolor: #39bfd3;'+\r\n\t'\t\t\t\t}'+\r\n\t'\t\t\t\t.box__file'+\r\n\t'\t\t\t\t{'+\r\n\t'\t\t\t\t\twidth: 0.1px;'+\r\n\t'\t\t\t\t\theight: 0.1px;'+\r\n\t'\t\t\t\t\topacity: 0;'+\r\n\t'\t\t\t\t\toverflow: hidden;'+\r\n\t'\t\t\t\t\tposition: absolute;'+\r\n\t'\t\t\t\t\tz-index: -1;'+\r\n\t'\t\t\t\t}'+\r\n\t'\t\t\t\t.box__file + label'+\r\n\t'\t\t\t\t{'+\r\n\t'\t\t\t\t\tmax-width: 80%;'+\r\n\t'\t\t\t\t\ttext-overflow: ellipsis;'+\r\n\t'\t\t\t\t\twhite-space: nowrap;'+\r\n\t'\t\t\t\t\tcursor: pointer;'+\r\n\t'\t\t\t\t\tdisplay: inline-block;'+\r\n\t'\t\t\t\t\toverflow: hidden;'+\r\n\t'\t\t\t\t}'+\r\n\t'\t\t\t\t.box__file + label:hover strong,'+\r\n\t'\t\t\t\t.box__file:focus + label strong,'+\r\n\t'\t\t\t\t.box__file.has-focus + label strong'+\r\n\t'\t\t\t\t{'+\r\n\t'\t\t\t\t\tcolor: #39bfd3;'+\r\n\t'\t\t\t\t}'+\r\n\t'\t\t\t\t.box__file:focus + label,'+\r\n\t'\t\t\t\t.box__file.has-focus + label'+\r\n\t'\t\t\t\t{'+\r\n\t' \t\t\t\t\toutline: 1px dotted #000;'+\r\n\t'\t\t\t\t\toutline: -webkit-focus-ring-color auto 5px;'+\r\n\t'\t\t\t\t}'+\r\n\t'\t\t\t\t\t.box__file + label *'+\r\n\t'\t\t\t\t\t{'+\r\n\t'\t\t\t\t\t\t/* pointer-events: none; */ /* in case of FastClick lib use */'+\r\n\t'\t\t\t\t\t}'+\r\n\t'\t\t\t\t.box__button'+\r\n\t'\t\t\t\t{'+\r\n\t'\t\t\t\t\tfont-weight: 700;'+\r\n\t'\t\t\t\t\tcolor: #e5edf1;'+\r\n\t'\t\t\t\t\tbackground-color: #39bfd3;'+\r\n\t'\t\t\t\t\tdisplay: none;'+\r\n\t'\t\t\t\t\tpadding: 8px 16px;'+\r\n\t'\t\t\t\t\tmargin: 10px auto 0;'+\r\n\t'\t\t\t\t}'+\r\n\t'\t\t\t\t\t.box__button:hover,'+\r\n\t'\t\t\t\t\t.box__button:focus'+\r\n\t'\t\t\t\t\t{'+\r\n\t'\t\t\t\t\t\tbackground-color: #0f3c4b;'+\r\n\t'\t\t\t\t\t}'\r\n );\r\n\r\nend;\r\n\r\nfunction TFileUpload.CreateElement: TJSElement;\r\nbegin\r\n FCreateRef := Name;\r\n Result := document.createElement('FORM');\r\n Result.setAttribute('method','post');\r\n Result.setAttribute('class','box');\r\n Result.setAttribute('enctype','multipart/form-data');\r\n// \r\n Result.innerHTML :=\r\n '
' +\r\n ''+\r\n ''+\r\n '' +\r\n '' +\r\n '' +\r\n '
' +\r\n '
Uploading…
';\r\n\r\n Result.addEventListener('drop', @HandleDroppedFiles);\r\n\r\n Result.addEventListener('dragenter', @HandleDragOver);\r\n Result.addEventListener('dragover', @HandleDragOver);\r\n\r\n Result.addEventListener('dragend', @HandleDragEnd);\r\n Result.addEventListener('dragleave', @HandleDragEnd);\r\n\r\n if isAdvancedUpload then\r\n Result.classList.add( 'has-advanced-upload' );\r\nend;\r\n\r\nprocedure TFileUpload.CreateInitialize;\r\nbegin\r\n inherited;\r\n FMultifile := false;\r\n FShowFiles := false;\r\n FEventInit := false;\r\n Width := 170;\r\n Height := 190;\r\nend;\r\n\r\ndestructor TFileUpload.Destroy;\r\nbegin\r\n FFiles.Free;\r\n FFilelist.Free;\r\n inherited;\r\nend;\r\n\r\nfunction TFileUpload.DoHandleChange(e: TJSEvent): boolean;\r\nvar\r\n el: TJSHTMLElement;\r\n curfiles: TJSHTMLFileList;\r\nbegin\r\n Result := true;\r\n if Assigned(ElementHandle) then\r\n begin\r\n el := TJSHTMLElement(e.target);\r\n if Assigned(el) then\r\n begin\r\n asm\r\n curfiles = el.files;\r\n end;\r\n HandleFiles(curfiles);\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TFileUpload.HandleDragEnd(Event: TJSDragEvent): boolean;\r\nbegin\r\n Result := true;\r\n Event.preventDefault();\r\n Event.stopPropagation();\r\n\r\n Container.setAttribute('class','box has-advanced-upload');\r\nend;\r\n\r\nfunction TFileUpload.HandleDragOver(Event: TJSDragEvent): boolean;\r\nbegin\r\n Result := true;\r\n Event.preventDefault();\r\n Event.stopPropagation();\r\n\r\n Container.setAttribute('class','box has-advanced-upload is-dragover');\r\nend;\r\n\r\nfunction TFileUpload.HandleDroppedFiles(Event: TJSDragEvent): boolean;\r\nvar\r\n droppedfiles: TJSHTMLFileList;\r\n span: TJSHTMLElement;\r\n szFiles: string;\r\n\r\nbegin\r\n Result := true;\r\n Event.preventDefault();\r\n Event.stopPropagation();\r\n\r\n droppedFiles := Event.dataTransfer.files;\r\n szFiles := HandleFiles(droppedfiles);\r\n\r\n if ShowFiles then\r\n begin\r\n span := TJSHTMLElement(document.getElementById(ElementID+'fileslist'));\r\n span.innerHTML := szFiles;\r\n end;\r\n\r\n Container.setAttribute('class','box has-advanced-upload');\r\nend;\r\n\r\nfunction TFileUpload.HandleFiles(files: TJSHTMLFileList): string;\r\nvar\r\n i,sz: integer;\r\n afile: TJSHTMLFile;\r\n szFiles, m: string;\r\n d: TJSDate;\r\nbegin\r\n szFiles := '';\r\n\r\n while FFiles.Count > 0 do\r\n FFiles.Delete(0);\r\n while FFileList.Count > 0 do\r\n FFileList.Delete(0);\r\n\r\n for i := 0 to files.length - 1 do\r\n begin\r\n afile := files.item(i);\r\n\r\n asm\r\n d = new Date(afile.lastModified);\r\n m = afile.type;\r\n sz = afile.size;\r\n end;\r\n\r\n with FFiles.Add do\r\n begin\r\n FileObject := afile;\r\n Name := afile.Name;\r\n MimeType := m;\r\n Size := sz;\r\n Modified := EncodeDate(d.Year + 1900, d.Month + 1, d.Date)+EncodeTime(d.Hours, d.Minutes, d.Seconds, d.Milliseconds);\r\n end;\r\n\r\n if Assigned(FFileList) then\r\n FFileList.Add(afile.name);\r\n\r\n if ShowFiles then\r\n begin\r\n if i > 0 then\r\n szFiles := szFiles + '
';\r\n\r\n szFiles := szFiles + afile.name;\r\n end;\r\n\r\n if not MultiFile then\r\n break;\r\n end;\r\n\r\n Result := szFiles;\r\n\r\n if Assigned(OnDroppedFiles) then\r\n OnDroppedFiles(Self, FFileList);\r\nend;\r\n\r\nprocedure TFileUpload.SetAccept(const Value: string);\r\nbegin\r\n if FAccept <> Value then\r\n begin\r\n FAccept := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TFileUpload.SetCaption(const AValue: string);\r\nbegin\r\n if (Caption <> AValue) then\r\n begin\r\n inherited SetCaption(AValue);\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TFileUpload.SetDragCaption(const Value: string);\r\nbegin\r\n FDragCaption := Value;\r\n UpdateElement;\r\nend;\r\n\r\nprocedure TFileUpload.UpdateElement;\r\nvar\r\n el:TJSHTMLElement;\r\nbegin\r\n inherited;\r\n\r\n if Assigned(ElementHandle) then\r\n begin\r\n el := TJSHTMLElement(document.getElementById('FP'+FCreateRef));\r\n\r\n if Assigned(el) then\r\n begin\r\n if not FEventInit then\r\n begin\r\n FEventInit := true;\r\n el.addEventListener('change', @DoHandleChange);\r\n end;\r\n\r\n if MultiFile then\r\n el.SetAttribute('multiple','')\r\n else\r\n el.RemoveAttribute('multiple');\r\n\r\n if FAccept <> '' then\r\n el.SetAttribute('accept',FAccept)\r\n else\r\n el.RemoveAttribute('accept');\r\n end;\r\n\r\n el := TJSHTMLElement(document.getElementById(FCreateRef+'lbl'));\r\n if Assigned(el) then\r\n begin\r\n el.innerHTML := Caption;\r\n end;\r\n\r\n el := TJSHTMLElement(document.getElementById(FCreateRef+'drag'));\r\n if Assigned(el) then\r\n begin\r\n el.innerHTML := FDragCaption;\r\n end;\r\n end;\r\nend;\r\n\r\n{ TTwitterFeed }\r\n\r\nfunction TTwitterFeed.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('SPAN');\r\nend;\r\n\r\nprocedure TTwitterFeed.CreateInitialize;\r\nbegin\r\n inherited;\r\n Width := 400;\r\n Height := 300;\r\nend;\r\n\r\nprocedure TTwitterFeed.SetFeed(const Value: string);\r\nbegin\r\n FFeed := Value;\r\n FUpdatedFeed := false;\r\n UpdateElement;\r\nend;\r\n\r\nprocedure TTwitterFeed.SetFeedLinkText(const Value: string);\r\nbegin\r\n FFeedLinkText := Value;\r\n UpdateElement;\r\nend;\r\n\r\n{$HINTS OFF}\r\nprocedure TTwitterFeed.UpdateElement;\r\nvar\r\n srcurl,img: string;\r\n script: TJSElement;\r\nbegin\r\n inherited;\r\n\r\n if Assigned(ElementHandle) and not IsUpdating then\r\n begin\r\n srcurl := 'https://platform.twitter.com/widgets.js';\r\n\r\n script := document.getElementById(TWITTERSCRIPTID);\r\n\r\n if not Assigned(script) then\r\n begin\r\n script := document.createElement('script');\r\n script['id'] := TWITTERSCRIPTID;\r\n asm\r\n script.async = true;\r\n end;\r\n script['type'] := 'text/javascript';\r\n script['charset'] := 'utf-8';\r\n script['src'] := srcurl;\r\n document.head.appendChild(script);\r\n end;\r\n end;\r\n\r\n if Assigned(ElementHandle) and not IsUpdating and not FUpdatedFeed then\r\n begin\r\n if (Feed <> '') and not (csDesigning in ComponentState) then\r\n begin\r\n srcurl := ''+ FeedLinkText + '';\r\n\r\n BorderStyle := bsNone;\r\n ElementHandle.innerHTML := srcurl;\r\n asm\r\n if (typeof twttr !== 'undefined') {\r\n twttr.widgets.load() }\r\n end;\r\n FUpdatedFeed := true;\r\n end\r\n else\r\n begin\r\n img := 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIg0KICAgd2lkdGg9IjMwMCINCiAgIGhlaWdodD0iMzAwIj4NCjxwYX'+\r\n 'RoIGQ9Im0gMjUwLDg3Ljk3NCBjIC03LjM1OCwzLjI2NCAtMTUuMjY3LDUuNDY5IC0yMy41NjYsNi40NjEgOC40NzEsLTUuMDc4IDE0Ljk3OCwtMTMuMTE5IDE4LjA0MSwtMjIuNzAxIC03LjkyOSw0LjcwMyAtMTYuNzEsOC4xMTcgLTI2LjA1Ny'+\r\n 'w5Ljk1NyAtNy40ODQsLTcuOTc1IC0xOC4xNDgsLTEyLjk1NyAtMjkuOTUsLTEyLjk1NyAtMjIuNjYsMCAtNDEuMDMzLDE4LjM3MSAtNDEuMDMzLDQxLjAzMSAwLDMuMjE2IDAuMzYzLDYuMzQ4IDEuMDYyLDkuMzUxIC0zNC4xMDIsLTEuNzExIC'+\r\n '02NC4zMzYsLTE4LjA0NyAtODQuNTc0LC00Mi44NzIgLTMuNTMyLDYuMDYgLTUuNTU2LDEzLjEwOCAtNS41NTYsMjAuNjI4IDAsMTQuMjM2IDcuMjQ0LDI2Ljc5NSAxOC4yNTQsMzQuMTUzIC02LjcyNiwtMC4yMTMgLTEzLjA1MywtMi4wNTkgLT'+\r\n 'E4LjU4NSwtNS4xMzIgLTAuMDA0LDAuMTcxIC0wLjAwNCwwLjM0MyAtMC4wMDQsMC41MTYgMCwxOS44OCAxNC4xNDQsMzYuNDY0IDMyLjkxNSw0MC4yMzQgLTMuNDQzLDAuOTM4IC03LjA2OCwxLjQzOSAtMTAuODEsMS40MzkgLTIuNjQ0LDAgLT'+\r\n 'UuMjE0LC0wLjI1OCAtNy43MiwtMC43MzYgNS4yMjIsMTYuMzAxIDIwLjM3NSwyOC4xNjUgMzguMzMxLDI4LjQ5NSAtMTQuMDQzLDExLjAwNiAtMzEuNzM1LDE3LjU2NSAtNTAuOTYsMTcuNTY1IC0zLjMxMiwwIC02LjU3OCwtMC4xOTQgLTkuNz'+\r\n 'g4LC0wLjU3NCAxOC4xNTksMTEuNjQzIDM5LjcyNywxOC40MzcgNjIuODk5LDE4LjQzNyA3NS40NzMsMCAxMTYuNzQ2LC02Mi41MjQgMTE2Ljc0NiwtMTE2Ljc0NyAwLC0xLjc3OSAtMC4wNCwtMy41NDggLTAuMTE5LC01LjMwOSA4LjAxNywtNS'+\r\n '43ODQgMTQuOTczLC0xMy4wMTEgMjAuNDc0LC0yMS4yMzkgeiIgc3R5bGU9ImZpbGw6IzNhYWFlMSIgLz4NCjwvc3ZnPg==';\r\n\r\n RenderDesigning(ClassName, Container, Self, True, img);\r\n end;\r\n end;\r\n\r\n if Assigned(ElementHandle) then\r\n ElementHandle.style.setProperty('overflow-y','auto');\r\nend;\r\n{$HINTS ON}\r\n\r\n{ TBrowserControl }\r\n\r\nprocedure TBrowserControl.BindEvents;\r\nbegin\r\n inherited;\r\nend;\r\n\r\nfunction TBrowserControl.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('IFRAME');\r\nend;\r\n\r\nprocedure TBrowserControl.CreateInitialize;\r\nbegin\r\n inherited;\r\n Width := 400;\r\n Height := 300;\r\nend;\r\n\r\nprocedure TBrowserControl.Navigate(const AURL: string);\r\nbegin\r\n URL := AURL;\r\nend;\r\n\r\nprocedure TBrowserControl.SetReferrerPolicy(\r\n const Value: TBrowserReferrerPolicy);\r\nbegin\r\n FReferrerPolicy := Value;\r\n UpdateElementVisual;\r\nend;\r\n\r\nprocedure TBrowserControl.SetSandbox(const Value: TBrowserSandboxTypes);\r\nbegin\r\n FSandbox := Value;\r\n UpdateElementVisual;\r\nend;\r\n\r\nprocedure TBrowserControl.SetURL(const Value: string);\r\nvar\r\n el: TJSHTMLElement;\r\nbegin\r\n FURL := Value;\r\n el := ElementHandle;\r\n el.setAttribute('src',Value);\r\nend;\r\n\r\nprocedure TBrowserControl.UpdateElementVisual;\r\nvar\r\n SandboxStr: string;\r\n\r\n procedure AppendStr(var s: string; appstr: string);\r\n begin\r\n if s = '' then\r\n s := appstr\r\n else\r\n s := s + ' ' + appstr;\r\n end;\r\n\r\nbegin\r\n inherited;\r\n\r\n\r\n if BorderStyle = bsSingle then\r\n ElementHandle.style.setProperty('border','1px solid silver')\r\n else\r\n ElementHandle.style.setProperty('border','0px');\r\n\r\n SandboxStr := '';\r\n\r\n if stAllowForms in Sandbox then\r\n AppendStr(SandboxStr, 'allow-forms');\r\n if stAllowModals in Sandbox then\r\n AppendStr(SandboxStr, 'allow-modals');\r\n if stAllowOrientationLock in Sandbox then\r\n AppendStr(SandboxStr, 'allow-orientation-lock');\r\n if stAllowPointerLock in Sandbox then\r\n AppendStr(SandboxStr, 'allow-pointer-lock');\r\n if stAllowPopups in Sandbox then\r\n AppendStr(SandboxStr, 'allow-popups');\r\n if stAllowPopupsToEscapeSandbox in Sandbox then\r\n AppendStr(SandboxStr, 'allow-popups-to-escape-sandbox');\r\n if stAllowPresentation in Sandbox then\r\n AppendStr(SandboxStr, 'allow-presentation');\r\n if stAllowSameOrigin in Sandbox then\r\n AppendStr(SandboxStr, 'allow-same-origin');\r\n if stAllowScripts in Sandbox then\r\n AppendStr(SandboxStr, 'allow-scripts');\r\n if stAllowTopNavigation in Sandbox then\r\n AppendStr(SandboxStr, 'allow-top-navigation');\r\n if stAllowTopNavigationByUserActivation in Sandbox then\r\n AppendStr(SandboxStr, 'allow-top-navigation-by-user-activation');\r\n\r\n if SandboxStr <> '' then\r\n begin\r\n ElementHandle.setAttribute('sandbox',SandboxStr);\r\n end;\r\n\r\n case ReferrerPolicy of\r\n rfNoReferrer: ElementHandle.setAttribute('referrerpolicy','no-referrer');\r\n rfNoReferrerWhenDowngrade: ElementHandle.setAttribute('referrerpolicy','no-referrer-when-downgrade');\r\n rfOrigin: ElementHandle.setAttribute('referrerpolicy','origin');\r\n rfOriginWhenCrossOrigin: ElementHandle.setAttribute('referrerpolicy','origin-when-cross-origin');\r\n rfUnsafeUrl: ElementHandle.setAttribute('referrerpolicy','unsafe-url');\r\n end;\r\nend;\r\n\r\n{ TGoogleDrive }\r\n\r\nfunction TGoogleDrive.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('DIV');\r\n FFrameHandle := document.createElement('IFRAME');\r\n Result.appendChild(FFrameHandle);\r\n FFrameHandle.setAttribute('frameborder','0');\r\nend;\r\n\r\nprocedure TGoogleDrive.CreateInitialize;\r\nbegin\r\n inherited;\r\n Width := 400;\r\n Height := 300;\r\nend;\r\n\r\nprocedure TGoogleDrive.SetFolderID(const Value: string);\r\nbegin\r\n if (FFolderID <> Value) then\r\n begin\r\n FFolderID := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TGoogleDrive.SetView(const Value: TDriveView);\r\nbegin\r\n if (FView <> Value) then\r\n begin\r\n FView := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TGoogleDrive.UpdateElement;\r\nvar\r\n vs,img: string;\r\nbegin\r\n inherited;\r\n\r\n case View of\r\n dvList: vs := 'list';\r\n dvGrid: vs := 'grid';\r\n end;\r\n\r\n if Assigned(ElementHandle) then\r\n begin\r\n if FolderID <> '' then\r\n begin\r\n FFrameHandle.setAttribute('src','https://drive.google.com/embeddedfolderview?id='+ FolderID + '&embedded=true#' + vs);\r\n TJSHTMLElement(FFrameHandle).style.setProperty('border','0');\r\n end\r\n else\r\n// if (csDesigning in ComponentState) then\r\n begin\r\n img := 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/PjwhRE9DVFlQRSBzdmcgIFBVQkxJQyAnLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4nICAnaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkJz48c3ZnIGV'+\r\n 'uYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDEyOCAxMjgiIGlkPSJTb2NpYWxfSWNvbnMiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDEyOCAxMjgiIHhtbDpzcGFjZT0icHJlc2VydmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1s'+\r\n 'bnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPjxnIGlkPSJfeDMzX19zdHJva2UiPjxnIGlkPSJHb29nbGVfRHJpdmUiPjxyZWN0IGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBoZWlnaHQ9I'+\r\n 'jEyOCIgd2lkdGg9IjEyOCIvPjxnIGlkPSJHb29nbGVfRHJpdmVfMV8iPjxwb2x5Z29uIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iIzM3NzdFMyIgZmlsbC1ydWxlPSJldmVub2RkIiBwb2ludHM9IjIxLjMzNSwxMjAgNDIuNjY2LDgyLjY2NyAxMjgsODIuNj'+\r\n 'Y3IDEwNi42NjYsMTIwICAgICAgICAgIi8+PHBvbHlnb24gY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZDRjYzIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHBvaW50cz0iODUuMzM1LDgyLjY2NyAxMjgsODIuNjY3IDg1LjMzNSw4IDQyLjY2Niw4ICAgICIvPjx'+\r\n 'wb2x5Z29uIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iIzExQTg2MSIgZmlsbC1ydWxlPSJldmVub2RkIiBwb2ludHM9IjAsODIuNjY3IDIxLjMzNSwxMjAgNjQsNDUuMzMzIDQyLjY2Niw4ICAgICIvPjwvZz48L2c+PC9nPjwvc3ZnPg==';\r\n\r\n RenderDesigning(ClassName, Container, Self, True, Img);\r\n end;\r\n end;\r\nend;\r\n\r\n{ TFilePicker }\r\n\r\nprocedure TFilePicker.BindEvents;\r\nvar\r\n eh: TJSEventTarget;\r\nbegin\r\n inherited;\r\n if Assigned(ElementBindHandle) then\r\n begin\r\n eh := ElementBindHandle;\r\n eh.addEventListener('change',@DoHandleChange);\r\n end;\r\nend;\r\n\r\nprocedure TFilePicker.Clear;\r\nbegin\r\n ElementHandle['type'] := '';\r\n ElementHandle['type'] := 'file';\r\n\r\n while Files.Count > 0 do\r\n Files.Delete(0);\r\nend;\r\n\r\nfunction TFilePicker.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('INPUT');\r\n Result.setAttribute('type','file');\r\nend;\r\n\r\nprocedure TFilePicker.CreateInitialize;\r\nbegin\r\n inherited;\r\n FFiles := TFiles.Create(Self);\r\n begin\r\n Width := 160;\r\n Height := 40;\r\n end;\r\nend;\r\n\r\ndestructor TFilePicker.Destroy;\r\nbegin\r\n FFiles.Free;\r\n inherited;\r\nend;\r\n\r\n{$HINTS OFF}\r\nfunction TFilePicker.DoHandleChange(e: TJSEvent): boolean;\r\nvar\r\n i,l,sz: integer;\r\n eh: TJSElement;\r\n s,m: string;\r\n f: TFile;\r\n d: TJSDate;\r\n jsfile: TJSHTMLFile;\r\nbegin\r\n Result := true;\r\n\r\n // clear existing collection\r\n while FFiles.Count > 0 do\r\n FFiles.Delete(0);\r\n\r\n eh := ElementHandle; \r\n\r\n asm\r\n var curFiles = eh.files;\r\n l = curFiles.length;\r\n end;\r\n\r\n for i := 0 to l - 1 do\r\n begin\r\n f := FFiles.Add;\r\n\r\n asm\r\n jsfile = curFiles[i];\r\n s = curFiles[i].name;\r\n m = curFiles[i].type;\r\n sz = curFiles[i].size;\r\n d = new Date(curFiles[i].lastModified);\r\n end;\r\n\r\n f.FileObject := jsfile;\r\n f.Name := s;\r\n f.MimeType := m;\r\n f.Size := sz;\r\n f.Modified := EncodeDate(d.Year + 1900, d.Month + 1, d.Date)+EncodeTime(d.Hours, d.Minutes, d.Seconds, d.Milliseconds);\r\n end;\r\n\r\n if Assigned(OnChange) then\r\n OnChange(Self);\r\nend;\r\n\r\nprocedure TFilePicker.GetMethodPointers;\r\nbegin\r\n if FChangePtr = nil then\r\n begin\r\n FChangePtr := @DoHandleChange;\r\n inherited;\r\n end;\r\nend;\r\n\r\n{$HINTS ON}\r\n\r\nprocedure TFilePicker.SetAccept(const Value: string);\r\nbegin\r\n if (FAccept <> Value) then\r\n begin\r\n FAccept := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TFilePicker.SetMultiFile(const Value: boolean);\r\nbegin\r\n if (FMultiFile <> Value) then\r\n begin\r\n FMultiFile := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TFilePicker.UpdateElement;\r\nbegin\r\n inherited;\r\n\r\n if Assigned(ElementHandle) then\r\n begin\r\n if MultiFile then\r\n ElementHandle.SetAttribute('multiple','')\r\n else\r\n ElementHandle.RemoveAttribute('multiple');\r\n\r\n if FAccept <> '' then\r\n ElementHandle.SetAttribute('accept',FAccept)\r\n else\r\n ElementHandle.RemoveAttribute('accept');\r\n end;\r\nend;\r\n\r\n{ TFiles }\r\n\r\nfunction TFiles.Add: TFile;\r\nbegin\r\n Result := TFile(inherited Add);\r\nend;\r\n\r\nprocedure TFiles.Clear;\r\nvar\r\n fc: integer;\r\nbegin\r\n fc := Count;\r\n inherited Clear;\r\n\r\n if fc > 0 then\r\n begin\r\n if (FOwner is TFilePicker) then\r\n (FOwner as TFilePicker).Clear;\r\n if (FOwner is TFileUpload) then\r\n (FOwner as TFileUpload).Clear;\r\n end;\r\nend;\r\n\r\nconstructor TFiles.Create(AOwner: TComponent);\r\nbegin\r\n inherited Create(TFile);\r\n FOwner := TFilePicker(AOwner);\r\nend;\r\n\r\nfunction TFiles.GetItem(Index: integer): TFile;\r\nbegin\r\n Result := TFile(inherited Items[Index]);\r\nend;\r\n\r\nfunction TFiles.Insert(Index: integer): TFile;\r\nbegin\r\n Result := TFile(inherited Insert(Index));\r\nend;\r\n\r\nfunction TFiles.Owner: TPersistent;\r\nbegin\r\n Result := FOwner;\r\nend;\r\n\r\nprocedure TFiles.SetItem(Index: integer; const Value: TFile);\r\nbegin\r\n inherited Items[Index] := Value;\r\nend;\r\n\r\n{ TFile }\r\n\r\n{$HINTS OFF}\r\nfunction TFile.GetControl: TComponent;\r\nbegin\r\n Result := nil;\r\n\r\n if Assigned(Collection) and Assigned((Collection as TFiles).Owner) then\r\n begin\r\n if (Collection as TFiles).Owner is TComponent then\r\n Result := (Collection as TFiles).Owner as TComponent;\r\n end;\r\nend;\r\n\r\nprocedure TFile.GetFileAsArrayBuffer;\r\nvar\r\n ptr: pointer;\r\n f: TJSHTMLFile;\r\nbegin\r\n ptr := @HandleFileLoadAsArrayBuffer;\r\n f := FileObject;\r\n\r\n asm\r\n var reader = new FileReader();\r\n reader.addEventListener('load',ptr);\r\n reader.readAsArrayBuffer(f);\r\n end;\r\nend;\r\n\r\nprocedure TFile.GetFileAsArrayBuffer(GetAsArrayBuffer: TGetAsArrayBufferProc);\r\nbegin\r\n FGetAsArrayBuffer := GetAsArrayBuffer;\r\n GetFileAsArrayBuffer;\r\nend;\r\n\r\nprocedure TFile.GetFileAsBase64(GetAsString: TGetAsStringProc);\r\nbegin\r\n FGetAsString := GetAsString;\r\n GetFileAsBase64;\r\nend;\r\n\r\nprocedure TFile.GetFileAsDataURL(GetAsString: TGetAsStringProc);\r\nbegin\r\n FGetAsString := GetAsString;\r\n GetFileAsDataURL;\r\nend;\r\n\r\nprocedure TFile.GetFileAsStream;\r\nvar\r\n ptr: pointer;\r\n f: TJSHTMLFile;\r\nbegin\r\n ptr := @HandleFileLoadAsStream;\r\n f := FileObject;\r\n\r\n asm\r\n var reader = new FileReader();\r\n reader.addEventListener('load',ptr);\r\n reader.readAsArrayBuffer(f);\r\n end;\r\nend;\r\n\r\nprocedure TFile.GetFileAsStream(GetAsStream: TGetAsStreamProc);\r\nbegin\r\n FGetAsStream := GetAsStream;\r\n GetFileAsStream;\r\nend;\r\n\r\nfunction TFile.FileAsText: TJSPromise;\r\nbegin\r\n Result := FileAsText('utf-8');\r\nend;\r\n\r\nfunction TFile.FileAsText(AEncoding: string): TJSPromise;\r\nvar\r\n reader: TJSFileReader;\r\n\r\nbegin\r\n Result := TJSPromise.new(\r\n procedure(ASuccess, AFailed: TJSPromiseResolver)\r\n\r\n function Loader(Event: TEventListenerEvent): boolean;\r\n begin\r\n ASuccess(EventResult(Event));\r\n end;\r\n\r\n begin\r\n reader := TJSFileReader.new;\r\n reader.onload := @Loader;\r\n reader.readAsText(FileObject, AEncoding);\r\n end);\r\nend;\r\n\r\nfunction TFile.FileAsBase64: TJSPromise;\r\nvar\r\n reader: TJSFileReader;\r\n\r\nbegin\r\n Result := TJSPromise.new(\r\n procedure(ASuccess, AFailed: TJSPromiseResolver)\r\n\r\n function Loader(Event: TEventListenerEvent): boolean;\r\n var\r\n s: string;\r\n begin\r\n asm\r\n function _arrayBufferToBase64( buffer ) {\r\n var binary = '';\r\n var bytes = new Uint8Array( buffer );\r\n var len = bytes.byteLength;\r\n for (var i = 0; i < len; i++) {\r\n binary += String.fromCharCode( bytes[ i ] );\r\n }\r\n return window.btoa( binary );\r\n }\r\n s = _arrayBufferToBase64(Event.target.result);\r\n end;\r\n\r\n ASuccess(s);\r\n end;\r\n\r\n begin\r\n reader := TJSFileReader.new;\r\n reader.onload := @Loader;\r\n reader.readAsArrayBuffer(FileObject);\r\n end);\r\nend;\r\n\r\nfunction TFile.FileAsStream: TJSPromise;\r\nvar\r\n reader: TJSFileReader;\r\n\r\nbegin\r\n Result := TJSPromise.new(\r\n procedure(ASuccess, AFailed: TJSPromiseResolver)\r\n\r\n function Loader(Event: TEventListenerEvent): boolean;\r\n var\r\n ms: TMemoryStream;\r\n ja: TJSArrayBuffer;\r\n b: TBytes;\r\n l: longint;\r\n begin\r\n asm\r\n ja = event.target.result;\r\n end;\r\n\r\n b := TMemoryStream.MemoryToBytes(ja);\r\n l := ja.byteLength;\r\n\r\n ms := TMemoryStream.Create;\r\n ms.Write(b,0, l);\r\n ms.Position := 0;\r\n\r\n ASuccess(ms);\r\n end;\r\n\r\n begin\r\n reader := TJSFileReader.new;\r\n reader.onload := @Loader;\r\n reader.readAsArrayBuffer(FileObject);\r\n end);\r\nend;\r\n\r\nfunction TFile.FileAsArrayBuffer: TJSPromise;\r\nvar\r\n reader: TJSFileReader;\r\n\r\nbegin\r\n Result := TJSPromise.new(\r\n procedure(ASuccess, AFailed: TJSPromiseResolver)\r\n\r\n function Loader(Event: TEventListenerEvent): boolean;\r\n var\r\n arr: TJSArrayBuffer;\r\n begin\r\n asm\r\n arr = Event.target.result;\r\n end;\r\n\r\n ASuccess(arr);\r\n end;\r\n\r\n begin\r\n reader := TJSFileReader.new;\r\n reader.onload := @Loader;\r\n reader.readAsArrayBuffer(FileObject);\r\n end);\r\nend;\r\n\r\nfunction TFile.FileAsDataURL: TJSPromise;\r\nvar\r\n reader: TJSFileReader;\r\n\r\nbegin\r\n Result := TJSPromise.new(\r\n procedure(ASuccess, AFailed: TJSPromiseResolver)\r\n\r\n function Loader(Event: TEventListenerEvent): boolean;\r\n var\r\n s: string;\r\n begin\r\n asm\r\n arr = Event.target.result;\r\n end;\r\n\r\n ASuccess(s);\r\n end;\r\n\r\n begin\r\n reader := TJSFileReader.new;\r\n reader.onload := @Loader;\r\n reader.readAsDataURL(FileObject);\r\n end);\r\nend;\r\n\r\n\r\nprocedure TFile.GetFileAsText;\r\nvar\r\n ptr: pointer;\r\n f: TJSHTMLFile;\r\nbegin\r\n ptr := @HandleFileLoadAsText;\r\n f := FileObject;\r\n\r\n asm\r\n var reader = new FileReader();\r\n reader.addEventListener('load',ptr);\r\n reader.readAsText(f);\r\n end;\r\nend;\r\n\r\nprocedure TFile.GetFileAsText(AEncoding: string);\r\nvar\r\n ptr: pointer;\r\n f: TJSHTMLFile;\r\nbegin\r\n ptr := @HandleFileLoadAsText;\r\n f := FileObject;\r\n\r\n asm\r\n var reader = new FileReader();\r\n reader.addEventListener('load',ptr);\r\n reader.readAsText(f, AEncoding);\r\n end;\r\n\r\nend;\r\n\r\n\r\nprocedure TFile.GetFileAsBase64;\r\nvar\r\n ptr: pointer;\r\n f: TJSHTMLFile;\r\nbegin\r\n ptr := @HandleFileLoadAsBase64;\r\n f := FileObject;\r\n\r\n asm\r\n var reader = new FileReader();\r\n reader.addEventListener('load',ptr);\r\n reader.readAsArrayBuffer(f);\r\n end;\r\nend;\r\n\r\nprocedure TFile.GetFileAsDataURL;\r\nvar\r\n ptr: pointer;\r\n f: TJSHTMLFile;\r\nbegin\r\n ptr := @HandleFileLoadAsDataURL;\r\n f := FileObject;\r\n\r\n asm\r\n var reader = new FileReader();\r\n reader.addEventListener('load',ptr);\r\n reader.readAsDataURL(f);\r\n end;\r\nend;\r\n\r\nprocedure TFile.GetFileAsText(GetAsString: TGetAsStringProc);\r\nbegin\r\n FGetAsString := GetAsString;\r\n GetFileAsText;\r\nend;\r\n\r\nprocedure TFile.Upload(AAction: string);\r\nvar\r\n f: TJSHTMLFile;\r\n fd: TJSFormData;\r\n ptrProgress, ptrComplete, ptrError, ptrAbort: pointer;\r\nbegin\r\n f := FileObject;\r\n\r\n fd := TJSFormData.new;\r\n fd.Append('file1',f);\r\n\r\n FReq := TJSXMLHttpRequest.new;\r\n\r\n ptrProgress := @HandleFileUploadProgress;\r\n ptrComplete := @HandleFileUploadComplete;\r\n ptrError := @HandleFileUploadError;\r\n ptrAbort := @HandleFileUploadAbort;\r\n\r\n FReq.addEventListener('load', ptrComplete);\r\n FReq.addEventListener('error', ptrError);\r\n FReq.addEventListener('abort', ptrAbort);\r\n FReq.upload.addEventListener('progress', ptrProgress);\r\n\r\n FReq.Open('POST',AAction, true);\r\n FReq.Send(fd);\r\nend;\r\n\r\nfunction TFile.AbortUpload: boolean;\r\nbegin\r\n Result := false;\r\n if Assigned(FReq) then\r\n begin\r\n FReq.Abort();\r\n Result := true;\r\n end;\r\nend;\r\n\r\n{$HINTS ON}\r\n\r\nfunction TFile.HandleFileLoadAsArrayBuffer(Event: TJSEvent): boolean;\r\nvar\r\n ja: TJSArrayBuffer;\r\n LJARec: TJSArrayBufferRecord;\r\n ctrl: TComponent;\r\nbegin\r\n\r\n Result := true;\r\n asm\r\n ja = event.target.result;\r\n end;\r\n\r\n if Assigned(FGetAsArrayBuffer) then\r\n begin\r\n FGetAsArrayBuffer(ja);\r\n end;\r\n\r\n FGetAsArrayBuffer := nil;\r\n\r\n if Assigned(OnGetFileAsArrayBuffer) then\r\n begin\r\n LJARec.jsarraybuffer := ja;\r\n OnGetFileAsArrayBuffer(Self, LJARec);\r\n end;\r\n\r\n ctrl := GetControl;\r\n\r\n if Assigned(ctrl) then\r\n begin\r\n LJARec.jsarraybuffer := ja;\r\n\r\n if (ctrl is TFilePicker) and Assigned( (ctrl as TFilePicker).OnGetFileAsArrayBuffer) then\r\n (ctrl as TFilePicker).OnGetFileAsArrayBuffer(ctrl, Index, LJARec);\r\n\r\n if (ctrl is TFileUpload) and Assigned( (ctrl as TFileUpload).OnGetFileAsArrayBuffer) then\r\n (ctrl as TFileUpload).OnGetFileAsArrayBuffer(ctrl, Index, LJARec);\r\n\r\n if (ctrl is TOpenDialog) and Assigned( (ctrl as TOpenDialog).OnGetFileAsArrayBuffer) then\r\n (ctrl as TOpenDialog).OnGetFileAsArrayBuffer(ctrl, Index, LJARec);\r\n end;\r\nend;\r\n\r\n\r\nfunction TFile.HandleFileLoadAsBase64(Event: TJSEvent): boolean;\r\nvar\r\n s: string;\r\n ctrl: TComponent;\r\nbegin\r\n Result := true;\r\n\r\n asm\r\n function _arrayBufferToBase64( buffer ) {\r\n var binary = '';\r\n var bytes = new Uint8Array( buffer );\r\n var len = bytes.byteLength;\r\n for (var i = 0; i < len; i++) {\r\n binary += String.fromCharCode( bytes[ i ] );\r\n }\r\n return window.btoa( binary );\r\n }\r\n s = _arrayBufferToBase64(event.target.result);\r\n end;\r\n\r\n if Assigned(FGetAsString) then\r\n FGetAsString(s);\r\n\r\n FGetAsString := nil;\r\n\r\n if Assigned(OnGetFileAsBase64) then\r\n OnGetFileAsBase64(Self, s);\r\n\r\n ctrl := GetControl;\r\n\r\n if Assigned(ctrl) then\r\n begin\r\n if (ctrl is TFilePicker) and Assigned( (ctrl as TFilePicker).OnGetFileAsBase64) then\r\n (ctrl as TFilePicker).OnGetFileAsBase64(ctrl, Index, s);\r\n\r\n if (ctrl is TFileUpload) and Assigned( (ctrl as TFileUpload).OnGetFileAsBase64) then\r\n (ctrl as TFileUpload).OnGetFileAsBase64(ctrl, Index, s);\r\n\r\n if (ctrl is TWebOpenDialog) and Assigned( (ctrl as TWebOpenDialog).OnGetFileAsBase64) then\r\n (ctrl as TWebOpenDialog).OnGetFileAsBase64(ctrl, Index, s);\r\n end;\r\nend;\r\n\r\n\r\nfunction TFile.HandleFileLoadAsDataURL(Event: TJSEvent): boolean;\r\nvar\r\n s: string;\r\n ctrl: TComponent;\r\nbegin\r\n Result := true;\r\n asm\r\n s = event.target.result;\r\n end;\r\n\r\n if Assigned(FGetAsString) then\r\n FGetAsString(s);\r\n\r\n FGetAsString := nil;\r\n\r\n if Assigned(OnGetFileAsURL) then\r\n OnGetFileAsURL(Self, s);\r\n\r\n ctrl := GetControl;\r\n\r\n if Assigned(ctrl) then\r\n begin\r\n if (ctrl is TFilePicker) and Assigned( (ctrl as TFilePicker).OnGetFileAsDataURL) then\r\n (ctrl as TFilePicker).OnGetFileAsDataURL(ctrl, Index, s);\r\n\r\n if (ctrl is TFileUpload) and Assigned( (ctrl as TFileUpload).OnGetFileAsDataURL) then\r\n (ctrl as TFileUpload).OnGetFileAsDataURL(ctrl, Index, s);\r\n\r\n if (ctrl is TWebOpenDialog) and Assigned( (ctrl as TWebOpenDialog).OnGetFileAsDataURL) then\r\n (ctrl as TWebOpenDialog).OnGetFileAsDataURL(ctrl, Index, s);\r\n end;\r\nend;\r\n\r\nfunction TFile.HandleFileLoadAsStream(Event: TJSEvent): boolean;\r\nvar\r\n ctrl: TComponent;\r\n b: TBytes;\r\n l: longint;\r\n ms: TMemoryStream;\r\n ja: TJSArrayBuffer;\r\nbegin\r\n\r\n Result := true;\r\n asm\r\n ja = event.target.result;\r\n end;\r\n\r\n b := TMemoryStream.MemoryToBytes(ja);\r\n l := ja.byteLength;\r\n\r\n ms := TMemoryStream.Create;\r\n ms.Write(b,0, l);\r\n ms.Position := 0;\r\n\r\n if Assigned(FGetAsStream) then\r\n begin\r\n FGetAsStream(ms);\r\n end;\r\n\r\n FGetAsStream := nil;\r\n\r\n if Assigned(OnGetFileAsStream) then\r\n begin\r\n OnGetFileAsStream(Self, ms);\r\n end;\r\n\r\n ctrl := GetControl;\r\n\r\n if Assigned(ctrl) then\r\n begin\r\n if (ctrl is TFilePicker) and Assigned( (ctrl as TFilePicker).OnGetFileAsStream) then\r\n (ctrl as TFilePicker).OnGetFileAsStream(ctrl, Index, ms);\r\n\r\n if (ctrl is TFileUpload) and Assigned( (ctrl as TFileUpload).OnGetFileAsStream) then\r\n (ctrl as TFileUpload).OnGetFileAsStream(ctrl, Index, ms);\r\n\r\n if (ctrl is TOpenDialog) and Assigned( (ctrl as TOpenDialog).OnGetFileAsStream) then\r\n (ctrl as TOpenDialog).OnGetFileAsStream(ctrl, Index, ms);\r\n end;\r\n\r\n ms.Free;\r\nend;\r\n\r\nfunction TFile.HandleFileLoadAsText(Event: TJSEvent): boolean;\r\nvar\r\n s: string;\r\n ctrl: TComponent;\r\n\r\nbegin\r\n Result := true;\r\n asm\r\n s = event.target.result;\r\n end;\r\n\r\n if Assigned(FGetAsString) then\r\n FGetAsString(s);\r\n\r\n FGetAsString := nil;\r\n\r\n if Assigned(OnGetFileAsText) then\r\n OnGetFileAsText(Self, s);\r\n\r\n ctrl := GetControl;\r\n\r\n if Assigned(ctrl) then\r\n begin\r\n if (ctrl is TFilePicker) and Assigned( (ctrl as TFilePicker).OnGetFileAsText) then\r\n (ctrl as TFilePicker).OnGetFileAsText(ctrl, Index, s);\r\n\r\n if (ctrl is TFileUpload) and Assigned( (ctrl as TFileUpload).OnGetFileAsText) then\r\n (ctrl as TFileUpload).OnGetFileAsText(ctrl, Index, s);\r\n\r\n if (ctrl is TOpenDialog) and Assigned( (ctrl as TOpenDialog).OnGetFileAsText) then\r\n (ctrl as TOpenDialog).OnGetFileAsText(ctrl, Index, s);\r\n end;\r\nend;\r\n\r\nfunction TFile.HandleFileUploadAbort(Event: TJSEvent): boolean;\r\nvar\r\n ctrl: TComponent;\r\nbegin\r\n Result := true;\r\n\r\n ctrl := GetControl;\r\n\r\n if Assigned(ctrl) then\r\n begin\r\n if (ctrl is TFilePicker) and Assigned( (ctrl as TFilePicker).OnUploadFileAbort) then\r\n (ctrl as TFilePicker).OnUploadFileAbort(ctrl, Index);\r\n\r\n if (ctrl is TFileUpload) and Assigned( (ctrl as TFileUpload).OnUploadFileAbort) then\r\n (ctrl as TFileUpload).OnUploadFileAbort(ctrl, Index);\r\n end;\r\nend;\r\n\r\nfunction TFile.HandleFileUploadComplete(Event: TJSEvent): boolean;\r\nvar\r\n ctrl: TComponent;\r\n LRequestRec: TJSXMLHttpRequestRecord;\r\n AResponse: string;\r\nbegin\r\n Result := true;\r\n\r\n ctrl := GetControl;\r\n\r\n if Assigned(ctrl) then\r\n begin\r\n if (ctrl is TFilePicker) and Assigned( (ctrl as TFilePicker).OnUploadFileComplete) then\r\n (ctrl as TFilePicker).OnUploadFileComplete(ctrl, Index);\r\n\r\n if (ctrl is TFilePicker) and Assigned( (ctrl as TFilePicker).OnUploadFileResponseComplete) then\r\n begin\r\n LRequestRec.req := TJSXMLHttpRequest(Event.Target);\r\n asm\r\n AResponse = Event.target.responseText;\r\n end;\r\n\r\n (ctrl as TFilePicker).OnUploadFileResponseComplete(ctrl, Index, LRequestRec, AResponse);\r\n end;\r\n\r\n if (ctrl is TFileUpload) and Assigned( (ctrl as TFileUpload).OnUploadFileComplete) then\r\n (ctrl as TFileUpload).OnUploadFileComplete(ctrl, Index);\r\n\r\n if (ctrl is TFileUpload) and Assigned( (ctrl as TFileUpload).OnUploadFileResponseComplete) then\r\n begin\r\n LRequestRec.req := TJSXMLHttpRequest(Event.Target);\r\n asm\r\n AResponse = Event.target.responseText;\r\n end;\r\n\r\n (ctrl as TFileUpload).OnUploadFileResponseComplete(ctrl, Index, LRequestRec, AResponse);\r\n end;\r\n end;\r\n FReq := nil;\r\nend;\r\n\r\nfunction TFile.HandleFileUploadError(Event: TJSEvent): boolean;\r\nvar\r\n err: string;\r\n ctrl: TComponent;\r\nbegin\r\n asm\r\n err = Event.target.status;\r\n end;\r\n Result := true;\r\n\r\n ctrl := GetControl;\r\n\r\n if Assigned(ctrl) then\r\n begin\r\n if (ctrl is TFilePicker) and Assigned( (ctrl as TFilePicker).OnUploadFileError) then\r\n (ctrl as TFilePicker).OnUploadFileError(ctrl, Index, err);\r\n\r\n if (ctrl is TFileUpload) and Assigned( (ctrl as TFileUpload).OnUploadFileError) then\r\n (ctrl as TFileUpload).OnUploadFileError(ctrl, Index, err);\r\n end;\r\nend;\r\n\r\nfunction TFile.HandleFileUploadProgress(Event: TJSEvent): boolean;\r\nvar\r\n Lloaded, Ltotal: longint;\r\n ctrl: TComponent;\r\nbegin\r\n Lloaded := 0;\r\n LTotal := 0;\r\n\r\n asm\r\n if (Event.lengthComputable) {\r\n Lloaded = Event.loaded;\r\n Ltotal = Event.total;\r\n //console.log(Event.loaded + \" bytes of \" + Event.total); } else { console.log('no calc');\r\n }\r\n end;\r\n\r\n ctrl := GetControl;\r\n\r\n if Assigned(ctrl) then\r\n begin\r\n if (ctrl is TFilePicker) and Assigned( (GetControl as TFilePicker).OnUploadFileProgress) then\r\n (ctrl as TFilePicker).OnUploadFileProgress(ctrl, Index, Lloaded, Ltotal);\r\n\r\n if (ctrl is TFileUpload) and Assigned( (GetControl as TFileUpload).OnUploadFileProgress) then\r\n (ctrl as TFileUpload).OnUploadFileProgress(ctrl, Index, Lloaded, Ltotal);\r\n end;\r\n\r\n Result := true;\r\nend;\r\n\r\n{ THTMLDiv }\r\n\r\nfunction THTMLDiv.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('DIV');\r\nend;\r\n\r\nprocedure THTMLDiv.CreateInitialize;\r\nbegin\r\n FHTML := TStringList.Create;\r\n FHTML.SkipLastLineBreak := true;\r\n (FHTML as TStringList).OnChange := HTMLChanged;\r\n\r\n inherited;\r\n\r\n ControlStyle := ControlStyle + [csAcceptsControls];\r\n ClipChildren := false;\r\n TabStop := false;\r\nend;\r\n\r\ndestructor THTMLDiv.Destroy;\r\nbegin\r\n FHTML.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure THTMLDiv.HTMLChanged(Sender: TObject);\r\nbegin\r\n UpdateElementData;\r\nend;\r\n\r\nprocedure THTMLDiv.SetHTML(const Value: TStrings);\r\nbegin\r\n FHTML.Assign(Value);\r\nend;\r\n\r\nprocedure THTMLDiv.UpdateElementData;\r\nbegin\r\n inherited;\r\n if Assigned(ElementHandle) then\r\n begin\r\n if (FOldText <> '') or (FHTML.Text <> '') then\r\n ElementHandle.innerHTML := FHTML.Text;\r\n FOldText := FHTML.Text;\r\n end\r\n else\r\n begin\r\n if not IsLinked and (csDesigning in ComponentState) then\r\n RenderDesigning(ClassName, Container, Self, True);\r\n end;\r\nend;\r\n\r\n{ THTMLSpan }\r\n\r\nfunction THTMLSpan.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('SPAN');\r\nend;\r\n\r\nprocedure THTMLSpan.CreateInitialize;\r\nbegin\r\n FHTML := TStringList.Create;\r\n (FHTML as TStringList).OnChange := HTMLChanged;\r\n\r\n inherited;\r\n\r\n ControlStyle := ControlStyle + [csAcceptsControls];\r\n TabStop := false;\r\n ClipChildren := false;\r\nend;\r\n\r\ndestructor THTMLSpan.Destroy;\r\nbegin\r\n FHTML.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure THTMLSpan.HTMLChanged(Sender: TObject);\r\nbegin\r\n UpdateElementData;\r\nend;\r\n\r\nprocedure THTMLSpan.SetHTML(const Value: TStrings);\r\nbegin\r\n FHTML.Assign(Value);\r\nend;\r\n\r\nprocedure THTMLSpan.UpdateElementData;\r\nbegin\r\n inherited;\r\n\r\n if Assigned(ElementHandle) then\r\n begin\r\n if (FOldText <> '') or (FHTML.Text <> '') then\r\n ElementHandle.innerHTML := FHTML.Text;\r\n FOldText := FHTML.Text;\r\n end\r\n else\r\n begin\r\n if not IsLinked and (csDesigning in ComponentState) then\r\n RenderDesigning(ClassName, Container, Self, True);\r\n end;\r\nend;\r\n\r\n{ THTMLAnchor }\r\n\r\nfunction THTMLAnchor.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('A');\r\nend;\r\n\r\nprocedure THTMLAnchor.CreateInitialize;\r\nbegin\r\n inherited;\r\n Caption := 'WebHTMLAnchor';\r\nend;\r\n\r\nfunction THTMLAnchor.HandleDoClick(Event: TJSMouseEvent): Boolean;\r\nbegin\r\n if Assigned(OnClick) then\r\n begin\r\n Event.preventDefault();\r\n StopPropagation;\r\n Result := false;\r\n OnClick(Self);\r\n end\r\n else\r\n Result := inherited;\r\nend;\r\n\r\nprocedure THTMLAnchor.SetCaption(const Value: string);\r\nbegin\r\n inherited SetCaption(Value);\r\n UpdateElementData;\r\nend;\r\n\r\nprocedure THTMLAnchor.SetHref(const Value: string);\r\nbegin\r\n FHref := Value;\r\n UpdateElementData;\r\nend;\r\n\r\nprocedure THTMLAnchor.SetTarget(const Value: string);\r\nbegin\r\n FTarget := Value;\r\n UpdateElementData;\r\nend;\r\n\r\nprocedure THTMLAnchor.UpdateElementData;\r\nbegin\r\n inherited;\r\n\r\n if Assigned(ElementHandle) then\r\n begin\r\n if Caption <> '' then\r\n ElementHandle.innerHTML := Caption;\r\n ElementHandle.setAttribute('href', FHref);\r\n ElementHandle.setAttribute('target', FTarget);\r\n end;\r\nend;\r\n\r\n{ TURLValidator }\r\n\r\nprocedure TURLValidator.HandleResult(IsValid: boolean);\r\nbegin\r\n if Assigned(OnValidated) then\r\n OnValidated(Self, IsValid);\r\nend;\r\n\r\n{$HINTS OFF}\r\nprocedure TURLValidator.Validate;\r\nvar\r\n s: string;\r\n ptr: pointer;\r\nbegin\r\n s := URL;\r\n ptr := @HandleResult;\r\n asm\r\n var request = new XMLHttpRequest();\r\n request.open('GET', s, true);\r\n request.onreadystatechange = function(){\r\n if (request.readyState === 4){\r\n ptr(request.status === 200);\r\n }\r\n };\r\n request.send();\r\n end;\r\nend;\r\n{$HINTS ON}\r\n\r\n{ TGoogleMapsOptions }\r\n\r\nprocedure TGoogleMapsOptions.Assign(Source: TPersistent);\r\nbegin\r\n inherited;\r\n FCustomStyle := (Source as TGoogleMapsOptions).CustomStyle;\r\n FMapStyle := (Source as TGoogleMapsOptions).MapStyle;\r\n FDefaultLatitude := (Source as TGoogleMapsOptions).DefaultLatitude;\r\n FDefaultLongitude := (Source as TGoogleMapsOptions).DefaultLongitude;\r\n FDefaultZoomLevel := (Source as TGoogleMapsOptions).DefaultZoomLevel;\r\nend;\r\n\r\nconstructor TGoogleMapsOptions.Create(AGoogleMaps: TGoogleMaps);\r\nbegin\r\n inherited Create;\r\n FCustomStyle := TStringList.Create;\r\n FMapStyle := mstDefault;\r\n FDefaultLatitude := -34.397;\r\n FDefaultLongitude := 150.644;\r\n FDefaultZoomLevel := 8;\r\n FOwner := AGoogleMaps;\r\nend;\r\n\r\ndestructor TGoogleMapsOptions.Destroy;\r\nbegin\r\n FCustomStyle.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TGoogleMapsOptions.SetCustomStyle(const Value: TStringList);\r\nbegin\r\n FCustomStyle.Assign(Value);\r\nend;\r\n\r\nprocedure TGoogleMapsOptions.SetDefaultLatitude(const Value: Double);\r\nbegin\r\n if FDefaultLatitude <> Value then\r\n begin\r\n FDefaultLatitude := Value;\r\n FOwner.UpdateElement;\r\n FOwner.PanTo(DefaultLatitude, DefaultLongitude);\r\n end;\r\nend;\r\n\r\nprocedure TGoogleMapsOptions.SetDefaultLongitude(const Value: Double);\r\nbegin\r\n if FDefaultLongitude <> Value then\r\n begin\r\n FDefaultLongitude := Value;\r\n FOwner.UpdateElement;\r\n FOwner.PanTo(DefaultLatitude, DefaultLongitude);\r\n end;\r\nend;\r\n\r\nprocedure TGoogleMapsOptions.SetDefaultZoomLevel(const Value: Integer);\r\nbegin\r\n if (FDefaultZoomLevel <> Value) and (Value >= 0) and (Value <= 21) then\r\n begin\r\n FDefaultZoomLevel := Value;\r\n FOwner.UpdateElement;\r\n FOwner.SetZoom(Value);\r\n end;\r\nend;\r\n\r\n\r\n{$HINTS OFF}\r\nprocedure TGoogleMapsOptions.SetMapStyle(const Value: TGoogleMapStyle);\r\nvar\r\n map: TJSHTMLElement;\r\n cstyle: string;\r\n ostyle: TJSObject;\r\nbegin\r\n FMapStyle := Value;\r\n map := FOwner.GetMap;\r\n\r\n if not Assigned(map) then\r\n Exit;\r\n\r\n if FMapStyle = mstNightMode then\r\n begin\r\n asm\r\n var myStyle =\r\n [\r\n {\r\n \"elementType\": \"geometry\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#242f3e\"\r\n }\r\n ]\r\n },\r\n {\r\n \"elementType\": \"labels.text.fill\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#746855\"\r\n }\r\n ]\r\n },\r\n {\r\n \"elementType\": \"labels.text.stroke\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#242f3e\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"administrative.locality\",\r\n \"elementType\": \"labels.text.fill\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#d59563\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"poi\",\r\n \"elementType\": \"labels.text.fill\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#d59563\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"poi.park\",\r\n \"elementType\": \"geometry\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#263c3f\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"poi.park\",\r\n \"elementType\": \"labels.text.fill\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#6b9a76\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"road\",\r\n \"elementType\": \"geometry\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#38414e\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"road\",\r\n \"elementType\": \"geometry.stroke\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#212a37\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"road\",\r\n \"elementType\": \"labels.text.fill\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#9ca5b3\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"road.highway\",\r\n \"elementType\": \"geometry\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#746855\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"road.highway\",\r\n \"elementType\": \"geometry.stroke\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#1f2835\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"road.highway\",\r\n \"elementType\": \"labels.text.fill\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#f3d19c\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"transit\",\r\n \"elementType\": \"geometry\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#2f3948\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"transit.station\",\r\n \"elementType\": \"labels.text.fill\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#d59563\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"water\",\r\n \"elementType\": \"geometry\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#17263c\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"water\",\r\n \"elementType\": \"labels.text.fill\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#515c6d\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"water\",\r\n \"elementType\": \"labels.text.stroke\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#17263c\"\r\n }\r\n ]\r\n }\r\n ];\r\n\r\n map.setOptions({styles: myStyle});\r\n end;\r\n end\r\n else if (FMapStyle = mstCustom) and (CustomStyle.Text <> '') then\r\n begin\r\n cstyle := CustomStyle.Text;\r\n try\r\n ostyle := TJSObject(TJSJSON.Parse(cstyle));\r\n asm\r\n map.setOptions({styles: ostyle});\r\n end;\r\n except\r\n\r\n end;\r\n end\r\n else\r\n begin\r\n asm\r\n map.setOptions({styles: []});\r\n end;\r\n end;\r\nend;\r\n{$HINTS ON}\r\n\r\n\r\n\r\n{ TShare }\r\n\r\nfunction TShare.CanShareFiles: boolean;\r\nvar\r\n res: boolean;\r\nbegin\r\n res := false;\r\n asm\r\n if (navigator.share) {\r\n try\r\n {\r\n res = navigator.canShare;\r\n }\r\n catch(err)\r\n {\r\n }\r\n }\r\n end;\r\n Result := res;\r\nend;\r\n\r\nfunction TShare.Share(ATitle, AText, AURL: string): boolean;\r\nvar\r\n res: boolean;\r\nbegin\r\n res := false;\r\n asm\r\n if (navigator.share) {\r\n res = true;\r\n navigator.share({\r\n title: ATitle,\r\n text: AText,\r\n url: AURL });\r\n }\r\n end;\r\n Result := res;\r\nend;\r\n\r\nfunction TShare.Share(ATitle, AText, AURL: string; AFiles: TJSHTMLFileArray): boolean;\r\nvar\r\n res: boolean;\r\nbegin\r\n res := false;\r\n\r\n asm\r\n if (navigator.canShare && navigator.canShare({ files: AFiles })) {\r\n res = true;\r\n navigator.share({\r\n files: AFiles,\r\n title: ATitle,\r\n text: AText });\r\n }\r\n end;\r\n Result := res;\r\nend;\r\n\r\n\r\nend.\r\n","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright (c) 2018 - 2021 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.Controls;\r\n\r\ninterface\r\n\r\nuses\r\n Classes, WEBLib.Graphics, Types, SysUtils, Web, JS;\r\n\r\nconst\r\n VK_CANCEL = 3;\r\n VK_BACK = 8;\r\n VK_TAB = 9;\r\n VK_RETURN = 13;\r\n VK_SHIFT = 16;\r\n VK_CONTROL = 17;\r\n VK_MENU = 18;\r\n VK_PAUSE = 19;\r\n VK_CAPITAL = 20;\r\n VK_ESCAPE = 27;\r\n VK_SPACE = 32;\r\n VK_PRIOR = 33;\r\n VK_NEXT = 34;\r\n VK_END = 35;\r\n VK_HOME = 36;\r\n VK_LEFT = 37;\r\n VK_UP = 38;\r\n VK_RIGHT = 39;\r\n VK_DOWN = 40;\r\n VK_PRINT = 42;\r\n VK_SNAPSHOT = 44;\r\n VK_INSERT = 45;\r\n VK_DELETE = 46;\r\n VK_HELP = 47;\r\n VK_LWIN = 91;\r\n VK_RWIN = 92;\r\n VK_NUMPAD0 = 96;\r\n VK_NUMPAD1 = 97;\r\n VK_NUMPAD2 = 98;\r\n VK_NUMPAD3 = 99;\r\n VK_NUMPAD4 = 100;\r\n VK_NUMPAD5 = 101;\r\n VK_NUMPAD6 = 102;\r\n VK_NUMPAD7 = 103;\r\n VK_NUMPAD8 = 104;\r\n VK_NUMPAD9 = 105;\r\n VK_MULTIPLY = 106;\r\n VK_ADD = 107;\r\n VK_SEPARATOR = 108;\r\n VK_SUBTRACT = 109;\r\n VK_DECIMAL = 110;\r\n VK_DIVIDE = 111;\r\n VK_F1 = 112;\r\n VK_F2 = 113;\r\n VK_F3 = 114;\r\n VK_F4 = 115;\r\n VK_F5 = 116;\r\n VK_F6 = 117;\r\n VK_F7 = 118;\r\n VK_F8 = 119;\r\n VK_F9 = 120;\r\n VK_F10 = 121;\r\n VK_F11 = 122;\r\n VK_F12 = 123;\r\n VK_F13 = 124;\r\n VK_F14 = 125;\r\n VK_F15 = 126;\r\n VK_F16 = 127;\r\n VK_F17 = 128;\r\n VK_F18 = 129;\r\n VK_F19 = 130;\r\n VK_F20 = 131;\r\n VK_F21 = 132;\r\n VK_F22 = 133;\r\n VK_F23 = 134;\r\n VK_F24 = 135;\r\n VK_NUMLOCK = 144;\r\n\r\n WHEEL_DELTA = 120;\r\n\r\ntype\r\n TCursor = type Integer;\r\n\r\nconst\r\n crDefault = 0;\r\n crNone = 1;\r\n crArrow = 2;\r\n crCross = 3;\r\n crIBeam = 4;\r\n crSize = 5;\r\n crSizeNESW = 6;\r\n crSizeNS = 7;\r\n crSizeNWSE = 8;\r\n crSizeWE = 9;\r\n crUpArrow = 10;\r\n crHourGlass = 11;\r\n crDrag = 12;\r\n crNoDrop = 13;\r\n crHSplit = 14;\r\n crVSplit = 15;\r\n crMultIDrag = 16;\r\n crSQLWait = 17;\r\n crNo = 18;\r\n crAppStart = 19;\r\n crHelp = 20;\r\n crHandPoint = 21;\r\n crSizeAll = 22;\r\n\r\n CSSBackground = 'background-color';\r\n CSSZIndex = 'z-index';\r\n\r\ntype\r\n TCSSCodeManager = class;\r\n Single = Double;\r\n TDragState = (dsDragEnter, dsDragLeave, dsDragMove);\r\n TDragMode = (dmManual, dmAutomatic);\r\n TDragKind = (dkDrag, dkDock);\r\n TDragObject = class(TObject);\r\n\r\n TAlign = (alNone, alTop, alBottom, alLeft, alRight, alClient, alCustom);\r\n TMouseButton = (mbLeft, mbRight, mbMiddle);\r\n TBorderStyle = (bsNone, bsSingle);\r\n TSizeStyle = (ssPercent, ssAbsolute, ssAuto);\r\n TScrollStyle = (ssNone, ssHorizontal, ssVertical, ssBoth);\r\n TStyleElements = set of (seFont, seClient, seBorder);\r\n\r\n TAnchorKind = (akLeft, akTop, akRight, akBottom);\r\n TAnchors = set of TAnchorKind;\r\n\r\n TMaterialGlyph = string;\r\n\r\n TElementClassName = type string;\r\n TElementID = type string;\r\n TElementFont = (efProperty, efCSS);\r\n TElementPosition = (epAbsolute, epRelative, epIgnore);\r\n\r\n TElementEvent = (eeClick, eeMouseDown, eeMouseUp, eeMouseMove, eeDblClick, eeKeyPress, eeKeyDown, eeKeyUp);\r\n TEventPropagation = set of TElementEvent;\r\n\r\n // Classes\r\n TShiftState = set of (ssShift, ssAlt, ssCtrl,\r\n ssLeft, ssRight, ssMIDdle, ssDouble, ssTouch, ssPen, ssCommand);\r\n\r\n TTextDirection = (tdDefault, tdLeftToRight, tdRightToLeft, tdInherit);\r\n\r\n TBevelCut = (bvNone, bvLowered, bvRaised, bvSpace);\r\n TBevelEdge = (beLeft, beTop, beRight, beBottom);\r\n TBevelEdges = set of TBevelEdge;\r\n TBevelKind = (bkNone, bkTile, bkSoft, bkFlat);\r\n\r\n TJSXMLHttpRequestRecord = record\r\n req: TJSXMLHttpRequest;\r\n end;\r\n TJSEventRecord = record\r\n event: TEventListenerEvent;\r\n end;\r\n\r\n THTTPResponseEvent = procedure(Sender: TObject; AResponse: string) of object;\r\n THTTPRequestResponseEvent = procedure(Sender: TObject; ARequest: TJSXMLHttpRequestRecord; AResponse: string) of object;\r\n THTTPAbortEvent = procedure(Sender: TObject) of object;\r\n THTTPErrorEvent = procedure(Sender: TObject; ARequest: TJSXMLHttpRequestRecord; Event: TJSEventRecord; var Handled: boolean) of object;\r\n\r\n TJSHTMLElementRecord = record\r\n element: TJSHTMLElement;\r\n end;\r\n\r\n TJSObjectRecord = record\r\n jsobject: TJSObject;\r\n end;\r\n\r\n TJSArrayRecord = record\r\n jsarray: TJSArray;\r\n end;\r\n\r\n TJSArrayBufferRecord = record\r\n jsarraybuffer: TJSArrayBuffer;\r\n end;\r\n\r\n TDragSourceObject = class(TObject)\r\n private\r\n FJSEvent: TJSEvent;\r\n FObject: TObject;\r\n public\r\n property Event: TJSEvent read FJSEvent write FJSEvent;\r\n property &Object: TObject read FObject write FObject;\r\n end;\r\n\r\n TNotifyEvent = procedure(Sender: TObject) of object;\r\n TMouseEvent = procedure(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X,Y: Integer) of object;\r\n TMouseWheelEvent = procedure(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean) of object;\r\n TMouseWheelUpDownEvent = procedure(Sender: TObject; Shift: TShiftState;\r\n MousePos: TPoint; var Handled: Boolean) of object;\r\n TMouseMoveEvent = procedure(Sender: TObject; Shift: TShiftState; X,Y: Integer) of object;\r\n TKeyEvent = procedure(Sender: TObject; var AKey: Word; Shift: TShiftState) of object;\r\n TKeyPressEvent = procedure(Sender: TObject; var AChar: Char) of object;\r\n TTouchEvent = procedure(Sender: TObject; X,Y: integer) of object;\r\n TBiDiMode = (bdLeftToRight, bdRightToLeft, bdRightToLeftNoAlign, bdRightToLeftReadingOnly);\r\n\r\n TDragOverEvent = procedure(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean) of object;\r\n TDragDropEvent = procedure(Sender, Source: TObject; X, Y: Integer) of object;\r\n TStartDragEvent = procedure(Sender: TObject; var DragObject: TDragObject) of object;\r\n TEndDragEvent = procedure(Sender, Target: TObject; X, Y: Integer) of object;\r\n TScreenshotEvent = procedure(Sender: TObject; ABitmap: TBitmap) of object;\r\n\r\n TControlStyleValue = (csAcceptsControls, csSetCaption);\r\n TControlStyle = set of TControlStyleValue;\r\n\r\n TMargins = class(TPersistent)\r\n private \r\n FOnChange: TNotifyEvent;\r\n FLeft, FTop, FRight, FBottom: Integer;\r\n protected\r\n procedure SetLeft(const Value: integer);\r\n procedure SetTop(const Value: integer);\r\n procedure SetRight(const Value: integer);\r\n procedure SetBottom(const Value: integer);\r\n procedure DoChange; virtual;\r\n public\r\n constructor Create; reintroduce;\r\n property OnChange: TNotifyEvent read FOnChange write FOnChange;\r\n procedure Assign(Source: TPersistent); override;\r\n published\r\n property Left: Integer read FLeft write SetLeft default 3;\r\n property Top: Integer read FTop write SetTop default 3;\r\n property Right: Integer read FRight write SetRight default 3;\r\n property Bottom: Integer read FBottom write SetBottom default 3;\r\n end;\r\n\r\n TPadding = class(TPersistent)\r\n private\r\n FOnChange: TNotifyEvent;\r\n FLeft, FTop, FRight, FBottom: Integer;\r\n protected\r\n procedure SetLeft(const Value: integer);\r\n procedure SetTop(const Value: integer);\r\n procedure SetRight(const Value: integer);\r\n procedure SetBottom(const Value: integer);\r\n procedure DoChange; virtual;\r\n public\r\n constructor Create; reintroduce;\r\n property OnChange: TNotifyEvent read FOnChange write FOnChange;\r\n procedure Assign(Source: TPersistent); override;\r\n published\r\n property Left: Integer read FLeft write SetLeft default 0;\r\n property Top: Integer read FTop write SetTop default 0;\r\n property Right: Integer read FRight write SetRight default 0;\r\n property Bottom: Integer read FBottom write SetBottom default 0;\r\n end;\r\n\r\n\r\n TPercentSize = single;\r\n\r\n TControl = class(TComponent)\r\n private\r\n FGotFocus: Boolean;\r\n FAcceptDrag: Boolean;\r\n FCaptureDown: Boolean;\r\n FMouseInsideLayer: Boolean;\r\n FLayer: TJSElement;\r\n FCaptured: Boolean;\r\n FControlCreated: Boolean;\r\n FUpdateCount: integer;\r\n FBlockUpdateElement: Boolean;\r\n FElement: TJSElement;\r\n FID: string;\r\n FNew: Boolean;\r\n FContainer: TJSElement;\r\n FElementEvent, FLastElementEvent: TJSEvent;\r\n FElementClassName: string;\r\n FColor: TColor;\r\n FFont: TFont;\r\n FParent, FPrevParent: TControl;\r\n FControls: array of TControl;\r\n FOnDragOver: TDragOverEvent;\r\n FOnDragDrop: TDragDropEvent;\r\n FOnStartDrag: TStartDragEvent;\r\n FonEndDrag: TEndDragEvent;\r\n FOnClick: TNotifyEvent;\r\n FOnDblClick: TNotifyEvent;\r\n FOnMouseDown: TMouseEvent;\r\n FOnMouseUp: TMouseEvent;\r\n FOnMouseMove: TMouseMoveEvent;\r\n FOnKeyDown: TKeyEvent;\r\n FOnKeyUp: TKeyEvent;\r\n FOnKeyPress: TKeyPressEvent;\r\n FOnEnter: TNotifyEvent;\r\n FOnExit: TNotifyEvent;\r\n FEnabled: Boolean;\r\n FHint: string;\r\n FRole: string;\r\n FShowHint: Boolean;\r\n FTabOrder: Integer;\r\n FTabStop: Boolean;\r\n FVisible: Boolean;\r\n FWidth: Integer;\r\n FHeight: Integer;\r\n FTag: Integer;\r\n FAlign: TAlign;\r\n FAnchors: TAnchors;\r\n FAlignWithMargins: boolean;\r\n FIsAligning: boolean;\r\n FOnMouseEnter: TNotifyEvent;\r\n FOnMouseLeave: TNotifyEvent;\r\n FCursor: TCursor;\r\n FDoubleBuffered: Boolean;\r\n FControlStyle: TControlStyle;\r\n FMargins: TMargins;\r\n FOnMouseWheel: TMouseWheelEvent;\r\n FParentDoubleBuffered: Boolean;\r\n FParentColor: Boolean;\r\n FParentFont: Boolean;\r\n FParentBiDiMode: Boolean;\r\n FOnTouchMove: TTouchEvent;\r\n FOnTouchStart: TTouchEvent;\r\n FOnTouchEnd: TTouchEvent;\r\n FOnTouchCancel: TTouchEvent;\r\n FLinkTouchEvents: Boolean;\r\n FWidthStyle: TSizeStyle;\r\n FHeightStyle: TSizeStyle;\r\n FWidthPercent: TPercentSize;\r\n FHeightPercent: TPercentSize;\r\n FOrigRect: TRect;\r\n FOrigParentRect: TRect;\r\n FIsResizing: boolean;\r\n FShowFocus: boolean;\r\n FBorderWidth: integer;\r\n FOrigTop: integer;\r\n FOrigLeft: integer;\r\n FUpdateTopLeft: boolean;\r\n FEnablePropagation: Boolean;\r\n FParentShowHint: Boolean;\r\n FScriptLoaded: Boolean;\r\n FControlScriptCount: Integer;\r\n FControlScriptCountLoaded: Integer;\r\n FRequiredScripts: TStringList;\r\n FElementFont: TElementFont;\r\n FElementPosition: TElementPosition;\r\n FParentElement: TJSHTMLElement;\r\n FTagObject: TObject;\r\n FClipChildren: Boolean;\r\n FTextDirection: TTextDirection;\r\n FEventStopPropagation: TEventPropagation;\r\n FParentElementID: string;\r\n FOnResize: TNotifyEvent;\r\n FMouseMovePtr: pointer;\r\n FMouseDownPtr: pointer;\r\n FMouseUpPtr: pointer;\r\n FMouseEnterPtr: pointer;\r\n FMouseLeavePtr: pointer;\r\n FClickPtr: pointer;\r\n FDblClickPtr: pointer;\r\n FKeyDownPtr: pointer;\r\n FKeyUpPtr: pointer;\r\n FKeyPressPtr: pointer;\r\n FInputPtr: pointer;\r\n FTouchStartPtr: pointer;\r\n FTouchEndPtr: pointer;\r\n FTouchMovePtr: pointer;\r\n FTouchCancelPtr: pointer;\r\n FContextMenuPtr: pointer;\r\n FExitPtr: pointer;\r\n FEnterPtr: pointer;\r\n FWheelPtr: pointer;\r\n FLayerMouseEnterPtr: pointer;\r\n FLayerMouseLeavePtr: pointer;\r\n FScriptLoadedPtr: pointer;\r\n FDragStartPtr: pointer;\r\n FDragOverPtr: pointer;\r\n FDragEnterPtr: pointer;\r\n FDragLeavePtr: pointer;\r\n FDragEndPtr: pointer;\r\n FDragDropPtr: pointer;\r\n FChildOrder: integer;\r\n FAllowTouch: boolean;\r\n FCtl3D: boolean;\r\n FParentCtl3D: boolean;\r\n FWheelAccumulator: integer;\r\n FWheelMousePos: TPoint;\r\n FBiDiMode: TBiDiMode;\r\n FOnMouseWheelDown: TMouseWheelUpDownEvent;\r\n FOnMouseWheelUp: TMouseWheelUpDownEvent;\r\n FNoUserSelect: boolean;\r\n FDragMode: TDragMode;\r\n function GetControlsCount: Integer;\r\n function GetControls(Index: Integer): TControl;\r\n procedure SetVisible(AValue: Boolean);\r\n procedure SetHint(AValue: string);\r\n procedure SetShowHint(AValue: Boolean);\r\n procedure SetTabOrder(AValue: Integer);\r\n procedure SetTabStop(AValue: Boolean);\r\n procedure SetAlign(const Value: TAlign);\r\n procedure SetAlignWithMargins(const Value: boolean);\r\n function GetBoundsRect: TRect;\r\n procedure SetBoundsRect(const Value: TRect);\r\n procedure SetID(const Value: string);\r\n procedure SetMargins(const Value: TMargins);\r\n procedure SetAnchors(const Value: TAnchors);\r\n function GetElementEvent: TJSEvent;\r\n function GetClientOrigin: TPoint;\r\n procedure SetHeightStyle(const Value: TSizeStyle);\r\n procedure SetWidthStyle(const Value: TSizeStyle);\r\n procedure SetHeightPercent(const Value: TPercentSize);\r\n procedure SetWidthPercent(const Value: TPercentSize);\r\n procedure SetShowFocus(const Value: boolean);\r\n procedure SetBorderWidth(const Value: integer); virtual;\r\n function GetIsLinked: boolean;\r\n procedure SetScriptLoaded(const Value: boolean);\r\n procedure SetRequiredScripts(const Value: TStringList);\r\n procedure SetElementFont(const Value: TElementFont);\r\n procedure SetElementPosition(const Value: TElementPosition);\r\n procedure SetParentElement(const Value: TJSHTMLElement);\r\n procedure SetClipChildren(const Value: Boolean);\r\n function GetClientHeight: Integer;\r\n function GetClientWidth: Integer;\r\n procedure SetClientHeight(const Value: Integer);\r\n procedure SetClientWidth(const Value: Integer);\r\n procedure SetParentElementID(const Value: string);\r\n procedure SetChildOrderEx(const Value: integer);\r\n function GetRole: string;\r\n procedure SetRole(const Value: string);\r\n function GetContainer: TJSElement; virtual;\r\n function GetChildContainer: TJSElement; virtual;\r\n procedure SetParentFont(const Value: boolean);\r\n procedure SetParentColor(const Value: boolean);\r\n procedure SetDragMode(const Value: TDragMode);\r\n protected\r\n procedure SetWidth(AValue: Integer); virtual;\r\n procedure SetHeight(AValue: Integer); virtual;\r\n procedure SetEnabled(Value: Boolean); virtual;\r\n procedure RecreateCanvas; virtual;\r\n procedure VisibleChanging; virtual;\r\n procedure VisibleChanged; virtual;\r\n procedure ColorChanging; virtual;\r\n function GetWidth: Integer; virtual;\r\n function GetHeight: Integer; virtual;\r\n function GetOuterWidth: integer; virtual;\r\n function GetOuterHeight: integer; virtual;\r\n function GetDesignWidth: integer; virtual;\r\n function GetDesignHeight: integer; virtual;\r\n function GetDesignLeft: integer; virtual;\r\n function GetDesignTop: integer; virtual;\r\n function GetLeft: Integer; override;\r\n function GetTop: Integer; override;\r\n function HandleAllocated: Boolean; virtual;\r\n function CreateElement: TJSElement; virtual;\r\n function ContainerElement: TJSElement; virtual;\r\n function IsStructuralElement: boolean; virtual;\r\n function IsEnabled: boolean; virtual;\r\n function GetNewName: string; virtual;\r\n function IsInputControl: Boolean; virtual;\r\n procedure RecreateElement; virtual;\r\n procedure BindElement; virtual;\r\n procedure CreateInitialize; virtual;\r\n procedure DestroyControls; virtual;\r\n procedure ClearControls; virtual;\r\n function GetElementStyle: TJSCSSStyleDeclaration; virtual;\r\n procedure SetControlCursor(const Value: TCursor); virtual;\r\n procedure SetBiDiMode(const Value: TBiDiMode); virtual;\r\n function GetMouseEventButton(Event: TJSMouseEvent): TMouseButton; virtual;\r\n function GetMouseEventShiftState(Event: TJSMouseEvent): TShiftState; virtual;\r\n function GetKeyBoardEventShiftState(Event: TJSKeyBoardEvent): TShiftState; virtual;\r\n function GetMouseWheelEventShiftState(Event: TJSWheelEvent): TShiftState; virtual;\r\n function GetTouchEventShiftState(Event: TJSTouchEvent): TShiftState; virtual;\r\n function HandleDoClick(Event: TJSMouseEvent): Boolean; virtual;\r\n function HandleDoWheel(Event: TJSWheelEvent): Boolean; virtual;\r\n function HandleDoDblClick(Event: TJSMouseEvent): Boolean; virtual;\r\n function HandleDoMouseDown(Event: TJSMouseEvent): Boolean; virtual;\r\n function HandleDoMouseUp(Event: TJSMouseEvent): Boolean; virtual;\r\n function HandleDoMouseMove(Event: TJSMouseEvent): Boolean; virtual;\r\n function HandleDoMouseLeave(Event: TJSMouseEvent): Boolean; virtual;\r\n function HandleDoContextMenu(Event: TJSMouseEvent): Boolean; virtual;\r\n function LayerHandleDoMouseEnter(Event: TJSMouseEvent): Boolean; virtual;\r\n function LayerHandleDoMouseLeave(Event: TJSMouseEvent): Boolean; virtual;\r\n function HandleDoMouseEnter(Event: TJSMouseEvent): Boolean; virtual;\r\n function HandleDoKeyDown(Event: TJSKeyBoardEvent): Boolean; virtual;\r\n function HandleDoKeyUp(Event: TJSKeyBoardEvent): Boolean; virtual;\r\n function HandleDoKeyPress(Event: TJSKeyBoardEvent): Boolean; virtual;\r\n function HandleDoInput(Event: TJSInputEvent): Boolean; virtual;\r\n function HandleDoExit(Event: TEventListenerEvent): Boolean; virtual;\r\n function HandleDoEnter(Event: TJSFocusEvent): Boolean; virtual;\r\n function HandleDoTouchStart(Event: TJSTouchEvent): Boolean; virtual;\r\n function HandleDoTouchMove(Event: TJSTouchEvent): Boolean; virtual;\r\n function HandleDoTouchEnd(Event: TJSTouchEvent): Boolean; virtual;\r\n function HandleDoTouchCancel(Event: TJSTouchEvent): Boolean; virtual;\r\n function HandleDoDragStart(Event: TJSDragEvent): Boolean; virtual;\r\n function HandleDoDragOver(Event: TJSDragEvent): Boolean; virtual;\r\n function HandleDoDragEnter(Event: TJSDragEvent): Boolean; virtual;\r\n function HandledoDragLeave(Event: TJSDragEvent): Boolean; virtual;\r\n function HandleDoDragEnd(Event: TJSDragEvent): Boolean; virtual;\r\n function HandleDoDragDrop(Event: TJSDragEvent): Boolean; virtual;\r\n procedure HandleFontChanged(Sender: TObject); virtual;\r\n procedure ParentFontChanged;\r\n procedure DoExit; virtual;\r\n procedure DoEnter; virtual;\r\n procedure Click; virtual;\r\n procedure UpdateElement; virtual;\r\n procedure UpdateElementSize; virtual;\r\n procedure UpdateElementVisual; virtual;\r\n procedure UpdateElementData; virtual;\r\n procedure UpdateParent; virtual;\r\n procedure UpdateControlSize(AWidth, AHeight: integer); virtual;\r\n procedure InternalUpdateParent; virtual;\r\n procedure UpdateChildren(AControl: TControl); virtual;\r\n procedure PersistinHTML; virtual;\r\n procedure LoadFromHTML(const HTML: string); virtual;\r\n procedure InitFromHTML; virtual;\r\n function SaveState: string; virtual;\r\n procedure LoadState(AState: string); virtual;\r\n procedure DisableTab; virtual;\r\n procedure EnableTab; virtual;\r\n\r\n procedure SetElementClassName(AValue: string); virtual;\r\n procedure SetColor(AValue: TColor); virtual;\r\n procedure SetFont(AValue: TFont); virtual;\r\n procedure SetParent(AValue: TControl); virtual;\r\n procedure RegisterParent(AValue: TControl); virtual;\r\n procedure UnRegisterParent(AValue: TControl); virtual;\r\n function CanAcceptChild(AValue: TControl): TControl; virtual;\r\n\r\n procedure SetLeft(AValue: Integer); override;\r\n procedure SetTop(AValue: Integer); override;\r\n\r\n procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X,Y: Integer); virtual;\r\n procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X,Y: Integer); virtual;\r\n procedure MouseMove(Shift: TShiftState; X,Y: Integer); virtual;\r\n\r\n procedure TouchStart(X,Y: Integer); virtual;\r\n procedure TouchMove(X,Y: Integer); virtual;\r\n procedure TouchEnd(X,Y: Integer); virtual;\r\n procedure TouchCancel(X,Y: Integer); virtual;\r\n\r\n procedure DoMouseEnter; virtual;\r\n procedure DoMouseLeave; virtual;\r\n procedure MouseWheel(Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean); virtual;\r\n function DoMouseWheelDown(Shift: TShiftState; MousePos: TPoint): Boolean; virtual;\r\n function DoMouseWheelUp(Shift: TShiftState; MousePos: TPoint): Boolean; virtual;\r\n procedure DblClick; virtual;\r\n procedure KeyDown(var Key: Word; Shift: TShiftState); virtual;\r\n procedure KeyPress(var Key: Char); virtual;\r\n procedure KeyUp(var Key: Word; Shift: TShiftState); virtual;\r\n procedure SetFocus; virtual;\r\n procedure DoMarginsChanged(Sender: TObject); virtual;\r\n procedure DoRealign; virtual;\r\n procedure DoBoundsChange; virtual;\r\n procedure DoEndDrag(Target: TObject; X, Y: Integer); virtual;\r\n procedure DoStartDrag(var DragObject: TDragObject); virtual;\r\n procedure DragOver(Source: TObject; X, Y: Integer; State: TDragState;\r\n var Accept: Boolean); virtual;\r\n function IsFocused: Boolean; virtual;\r\n function Focused: Boolean; virtual;\r\n function GetID: string; virtual;\r\n function GetElementHandle: TJSHTMLElement; virtual;\r\n function GetElementBindHandle: TJSEventTarget; virtual;\r\n function GetElement: TJSElement;\r\n function GetKeyCode(AValue: string; IgnoreCase: boolean = true): Integer;\r\n function IsKeyCharacter(AValue: string): Boolean;\r\n function GetClientRect: TRect; virtual;\r\n property Container: TJSElement read GetContainer write FContainer;\r\n property ChildContainer: TJSElement read GetChildContainer;\r\n property ElementBindHandle: TJSEventTarget read GetElementBindHandle;\r\n property Element: TJSElement read GetElement;\r\n\r\n procedure CreateControl; virtual;\r\n procedure ClearMethodPointers; virtual;\r\n procedure GetMethodPointers; virtual;\r\n function EventsBound: boolean;\r\n procedure BindEvents; virtual;\r\n procedure UnbindEvents; virtual;\r\n procedure AlignControls(AControl: TControl; var ARect: TRect); virtual;\r\n procedure AlignControl(AControl: TControl); virtual;\r\n procedure InitAnchoring; virtual;\r\n function AnchoringInitialized: boolean;\r\n procedure InitScript; virtual;\r\n procedure Realign; virtual;\r\n procedure Loaded; override;\r\n procedure InternalResize; virtual;\r\n procedure FontChanged; virtual;\r\n procedure DisposeOf;\r\n procedure ClearChildElements; virtual;\r\n\r\n property Color: TColor read FColor write SetColor;\r\n property ControlCreated: boolean read FControlCreated;\r\n property Font: TFont read FFont write SetFont;\r\n property ClientOrigin: TPoint read GetClientOrigin;\r\n property OrigRect: TRect read FOrigRect;\r\n property DragMode: TDragMode read FDragMode write SetDragMode;\r\n\r\n property OnClick: TNotifyEvent read FOnClick write FOnClick;\r\n property OnResize: TNotifyEvent read FOnResize write FOnResize;\r\n property OnDblClick: TNotifyEvent read FOnDblClick write FOnDblClick;\r\n property ControlStyle: TControlStyle read FControlStyle write FControlStyle;\r\n procedure HookElement;\r\n procedure SetElementColor(AElement: TJSHTMLElement; AColor: TColor);\r\n procedure CreateWithID(AID: string); virtual;\r\n procedure AddInstanceStyle(const css: string); virtual; overload;\r\n procedure AddInstanceStyle(const id: string; const css: string); virtual; overload;\r\n procedure AddControlStyle(const css: string); virtual;\r\n procedure AddControlLink(const linkid, link: string); virtual;\r\n procedure AddControlScriptLink(const link: string); virtual;\r\n procedure AddControlScriptSource(const source: string); virtual;\r\n function AddRequiredScripts: boolean;\r\n procedure AddRequiredScript(const link: string); virtual;\r\n procedure ResetAnchoring; virtual;\r\n procedure UpdateSize; virtual;\r\n procedure UpdateAnchoring; virtual;\r\n procedure UpdateChildAnchoring; virtual;\r\n procedure SetElementPointer(AElement: TJSHTMLElement; ACursor: TCursor);\r\n function GetWebClassName: string; virtual;\r\n function GetCSSManager: TCSSCodeManager; virtual;\r\n function IsUpdating: boolean;\r\n function CanShowFocus: boolean; virtual;\r\n procedure RequiredScriptLoaded(Event: TJSEvent); virtual;\r\n procedure InjectCSS; virtual;\r\n procedure StartCapture; virtual;\r\n property LinkTouchEvents: Boolean read FLinkTouchEvents write FLinkTouchEvents;\r\n property OnTouchStart: TTouchEvent read FOnTouchStart write FOnTouchStart;\r\n property OnTouchMove: TTouchEvent read FOnTouchMove write FOnTouchMove;\r\n property OnTouchEnd: TTouchEvent read FOnTouchEnd write FOnTouchEnd;\r\n property OnTouchCancel: TTouchEvent read FOnTouchCancel write FOnTouchCancel;\r\n property ShowFocus: boolean read FShowFocus write SetShowFocus;\r\n property BorderWidth: integer read FBorderWidth write SetBorderWidth;\r\n property ControlScriptCount: integer read FControlScriptCount write FControlScriptCount;\r\n property ControlScriptCountLoaded: integer read FControlScriptCountLoaded write FControlScriptCountLoaded;\r\n property RequiredScripts: TStringList read FRequiredScripts write SetRequiredScripts;\r\n property Role: string read GetRole write SetRole;\r\n property TextDirection: TTextDirection read FTextDirection write FTextDirection;\r\n function RequiredBaseURL: string; virtual;\r\n function GetStyle(css: string): string;\r\n procedure SetBoundsInt(X, Y, AWidth, AHeight: Integer); virtual;\r\n procedure MoveFirst(AControl: TControl); virtual;\r\n procedure MoveLast(AControl: TControl); virtual;\r\n property ParentElementHandle: TJSHTMLElement read FParentElement write FParentElement;\r\n property NoUserSelect: boolean read FNoUserSelect write FNoUserSelect;\r\n procedure EnableDrag; virtual;\r\n procedure DisableDrag; virtual;\r\n property OnDragOver: TDragOverEvent read FOnDragOver write FOnDragOver;\r\n property OnDragDrop: TDragDropEvent read FOnDragDrop write FOnDragDrop;\r\n property OnStartDrag: TStartDragEvent read FOnStartDrag write FOnStartDrag;\r\n property OnEndDrag: TEndDragEvent read FOnEndDrag write FOnEndDrag;\r\n public\r\n constructor Create(ID: string); virtual; overload;\r\n constructor Create(AOwner: TComponent); overload; override;\r\n destructor Destroy; override;\r\n procedure Assign(Source: TPersistent); override;\r\n procedure DragDrop(Source: TObject; X, Y: Integer); virtual;\r\n procedure Resize; virtual;\r\n procedure Capture;\r\n procedure ApplyName;\r\n procedure ReleaseCapture;\r\n procedure BringToFront;\r\n procedure SendToBack;\r\n procedure Show;\r\n procedure Hide;\r\n procedure PreventDefault;\r\n procedure StopPropagation;\r\n procedure BeginDrag;\r\n procedure BeginUpdate; override;\r\n procedure EndUpdate; override;\r\n procedure Invalidate; virtual;\r\n procedure SetParentComponent(Value: TComponent); override;\r\n procedure SetBounds(X, Y, AWidth, AHeight: Integer); virtual;\r\n procedure XYToClient(X,Y: single; var AClientX, AClientY: single); virtual;\r\n procedure ClientToXY(AClientX, AClientY: single; var X,Y: single); virtual;\r\n procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;\r\n function Captured: Boolean; virtual;\r\n function MakeScreenshot: TBitmap; virtual;\r\n function ClientToScreen(const Point: TPoint): TPoint; virtual;\r\n function ScreenToClient(const Point: TPoint): TPoint; virtual;\r\n function CanFocus: Boolean; virtual;\r\n function HasHorzScrollBar: Boolean; virtual;\r\n function HasVertScrollBar: Boolean; virtual;\r\n property BiDiMode: TBiDiMode read FBiDiMode write SetBiDiMode default bdLeftToRight;\r\n property Ctl3D: boolean read FCtl3D write FCtl3D;\r\n property ParentCtl3D: boolean read FParentCtl3D write FParentCtl3D;\r\n property AllowTouch: boolean read FAllowTouch write FAllowTouch;\r\n property EventStopPropagation: TEventPropagation read FEventStopPropagation write FEventStopPropagation;\r\n property ChildOrder: integer read FChildOrder write SetChildOrderEx;\r\n property Controls[Index: Integer]: TControl read GetControls;\r\n property ControlCount: Integer read GetControlsCount;\r\n property Parent: TControl read FParent write SetParent;\r\n property ParentElement: TJSHTMLElement read FParentElement write SetParentElement;\r\n property ParentElementID: string read FParentElementID write SetParentElementID;\r\n property BoundsRect: TRect read GetBoundsRect write SetBoundsRect;\r\n property DoubleBuffered: Boolean read FDoubleBuffered write FDoubleBuffered default false;\r\n property ParentDoubleBuffered: Boolean read FParentDoubleBuffered write FParentDoubleBuffered default true;\r\n property ParentColor: boolean read FParentColor write SetParentColor default false;\r\n property ParentFont: boolean read FParentFont write SetParentFont default true;\r\n property ParentBiDiMode: boolean read FParentBiDiMode write FParentBiDiMode default true;\r\n property Align: TAlign read FAlign write SetAlign default alNone;\r\n property AlignWithMargins: boolean read FAlignWithMargins write SetAlignWithMargins default false;\r\n property ElementEvent: TJSEvent read GetElementEvent write FElementEvent;\r\n property ElementHandle: TJSHTMLElement read GetElementHandle;\r\n property ElementClassName: TElementClassName read FElementClassName write SetElementClassName;\r\n property ElementFont: TElementFont read FElementFont write SetElementFont default efProperty;\r\n property ElementPosition: TElementPosition read FElementPosition write SetElementPosition default epAbsolute;\r\n property ElementID: TElementID read GetID write SetID;\r\n property Margins: TMargins read FMargins write SetMargins;\r\n property ClientRect: TRect read GetClientRect;\r\n property EnablePropagation: Boolean read FEnablePropagation write FEnablePropagation default False;\r\n property ScriptLoaded: boolean read FScriptLoaded write SetScriptLoaded;\r\n property ClipChildren: Boolean read FClipChildren write SetClipChildren default True;\r\n\r\n property Anchors: TAnchors read FAnchors write SetAnchors default [akLeft, akTop];\r\n property Cursor: TCursor read FCursor write SetControlCursor default crDefault;\r\n property Enabled: Boolean read FEnabled write SetEnabled default true;\r\n property HeightStyle: TSizeStyle read FHeightStyle write SetHeightStyle default ssAbsolute;\r\n property Height: Integer read GetHeight write SetHeight;\r\n property HeightPercent: TPercentSize read FHeightPercent write SetHeightPercent default 100;\r\n property Hint: string read FHint write SetHint;\r\n property IsLinked: boolean read GetIsLinked;\r\n property ShowHint: Boolean read FShowHint write SetShowHint default false;\r\n property ParentShowHint: Boolean read FParentShowHint write FParentShowHint;\r\n property TabOrder: Integer read FTabOrder write SetTabOrder;\r\n property TabStop: Boolean read FTabStop write SetTabStop default true;\r\n property Tag: Integer read FTag write FTag default 0;\r\n property TagObject: TObject read FTagObject write FTagObject;\r\n property Visible: Boolean read FVisible write SetVisible default true;\r\n property WidthStyle: TSizeStyle read FWidthStyle write SetWidthStyle default ssAbsolute;\r\n property ClientHeight: Integer read GetClientHeight write SetClientHeight;\r\n property ClientWidth: Integer read GetClientWidth write SetClientWidth;\r\n property Width: Integer read GetWidth write SetWidth;\r\n property WidthPercent: TPercentSize read FWidthPercent write SetWidthPercent default 100;\r\n\r\n property OnMouseWheel: TMouseWheelEvent read FOnMouseWheel write FOnMouseWheel;\r\n property OnMouseWheelDown: TMouseWheelUpDownEvent read FOnMouseWheelDown write FOnMouseWheelDown;\r\n property OnMouseWheelUp: TMouseWheelUpDownEvent read FOnMouseWheelUp write FOnMouseWheelUp;\r\n\r\n property OnMouseDown: TMouseEvent read FOnMouseDown write FOnMouseDown;\r\n property OnMouseUp: TMouseEvent read FOnMouseUp write FOnMouseUp;\r\n property OnMouseMove: TMouseMoveEvent read FOnMouseMove write FOnMouseMove;\r\n property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;\r\n property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;\r\n //Note: On Android the OnKeyUp and OnKeyDown events do not return the correct KeyCode.\r\n //This is a known issue:\r\n //https://bugs.chromium.org/p/chromium/issues/detail?id=118639\r\n //https://stackoverflow.com/questions/36753548/keycode-on-android-is-always-229\r\n //Workaround: Use the Char parameter of the OnKeyPress event instead\r\n property OnKeyUp: TKeyEvent read FOnKeyUp write FOnKeyUp;\r\n property OnKeyDown: TKeyEvent read FOnKeyDown write FOnKeyDown;\r\n //\r\n //Note: On Android the OnKeyPress event is not triggered.\r\n //The OnInput event is used instead to trigger the OnKeyPress event.\r\n property OnKeyPress: TKeyPressEvent read FOnKeyPress write FOnKeyPress;\r\n //\r\n property OnEnter: TNotifyEvent read FOnEnter write FOnEnter;\r\n property OnExit: TNotifyEvent read FOnExit write FOnExit;\r\n published\r\n// property DesignSize: TPoint read FDesignSize write FDesignSize stored false;\r\n// property ExplicitLeft: integer read FExplicitLeft write FExplicitLeft stored false;\r\n// property ExplicitTop: integer read FExplicitTop write FExplicitTop stored false;\r\n// property ExplicitWidth: integer read FExplicitWidth write FExplicitWidth stored false;\r\n// property ExplicitHeight: integer read FExplicitHeight write FExplicitHeight stored false;\r\n end;\r\n\r\n\r\n TScrollBarKind = (sbHorizontal, sbVertical);\r\n\r\n TControlScrollBar = class(TPersistent)\r\n private\r\n FKind: TScrollBarKind;\r\n FControl: TControl;\r\n public\r\n constructor Create(AControl: TControl; AKind: TScrollBarKind);\r\n property Kind: TScrollBarKind read FKind;\r\n function IsScrollBarVisible: boolean;\r\n function ScrollPos: integer;\r\n function Range: integer;\r\n end;\r\n\r\n\r\n TWinControl = class(TControl)\r\n published\r\n property Cursor;\r\n property ElementClassName;\r\n property Enabled;\r\n property Height;\r\n property Hint;\r\n property Left;\r\n property ShowHint;\r\n property Tag;\r\n property Top;\r\n property Visible;\r\n property Width;\r\n\r\n property OnMouseDown;\r\n property OnMouseUp;\r\n property OnMouseMove;\r\n property OnMouseEnter;\r\n property OnMouseLeave;\r\n property OnKeyUp;\r\n property OnKeyDown;\r\n property OnKeyPress;\r\n property OnEnter;\r\n property OnExit;\r\n end;\r\n\r\n TCustomControl = class(TWinControl)\r\n private\r\n FCaption: string;\r\n FPixelRatio: Single;\r\n FPainting: boolean;\r\n FCanvas: TCanvas;\r\n FElementCanvas: TJSHTMLCanvasElement;\r\n FBorderStyle: TBorderStyle;\r\n FBorderColor: TColor;\r\n FCustomBorder: boolean;\r\n FOnScreenShot: TScreenshotEvent;\r\n FBevelOuter: TBevelCut;\r\n FBevelWidth: Integer;\r\n FBevelCut: TBevelCut;\r\n FBevelEdges: TBevelEdges;\r\n FBevelKind: TBevelKind;\r\n function GetCanvas: TCanvas;\r\n protected\r\n procedure RenderDesigning(ACaption: string; AElement: TJSElement; AControl: TCustomControl; ADisplay: Boolean; AImage: string = '');\r\n function GetPixelRatio: Single;\r\n function GetContext: TJSCanvasRenderingContext2D; virtual;\r\n procedure RecreateCanvas; override;\r\n procedure SetBorderStyle(const AValue: TBorderStyle); virtual;\r\n procedure SetBorderColor(const AValue: TColor); virtual;\r\n procedure SetName(const NewName: TComponentName); override;\r\n procedure SetCaption(const AValue: string); virtual;\r\n procedure CreateControl; override;\r\n procedure Loaded; override;\r\n procedure UpdateElementVisual; override;\r\n function CreateElement: TJSElement; override;\r\n function GetCanvasHeightOffset: Integer; virtual;\r\n function GetCanvasWidthOffset: Integer; virtual;\r\n property BorderStyle: TBorderStyle read FBorderStyle write SetBorderStyle default bsSingle;\r\n property BorderColor: TColor read FBorderColor write SetBorderColor default clSilver;\r\n procedure BindElement; override;\r\n procedure BindEvents; override;\r\n procedure HandleScreenShot(Sender: TObject); virtual;\r\n procedure Paint; virtual;\r\n property CustomBorder: boolean read FCustomBorder write FCustomBorder;\r\n property Caption: string read FCaption write SetCaption;\r\n public\r\n procedure CreateInitialize; override;\r\n destructor Destroy; override;\r\n function MakeScreenShot: TBitmap; override;\r\n procedure Resize; override;\r\n procedure Invalidate; override;\r\n procedure SetFocus; override;\r\n function Focused: boolean; override;\r\n procedure EndUpdate; override;\r\n property Canvas: TCanvas read GetCanvas;\r\n property GraphicsContext: TJSCanvasRenderingContext2D read GetContext;\r\n property ElementCanvas: TJSHTMLCanvasElement read FElementCanvas;\r\n property OnScreenshot: TScreenshotEvent read FOnScreenshot write FOnScreenshot;\r\n //dummy properties for FNC\r\n property BevelEdges: TBevelEdges read FBevelEdges write FBevelEdges;\r\n property BevelInner: TBevelCut read FBevelCut write FBevelCut;\r\n property BevelKind: TBevelKind read FBevelKind write FBevelKind;\r\n property BevelOuter: TBevelCut read FBevelOuter write FBevelOuter;\r\n property BevelWidth: Integer read FBevelWidth write FBevelWidth;\r\n end;\r\n\r\n TjQueryCustomControl = class(TWinControl)\r\n private\r\n FIsInitialized: boolean;\r\n procedure InitJQueryOnce;\r\n protected\r\n function CreateElement: TJSElement; override;\r\n procedure Loaded; override;\r\n procedure SetParent(AValue: TControl); override;\r\n function GetJQID: string;\r\n procedure InitJQuery; virtual;\r\n public\r\n procedure CreateInitialize; override;\r\n published\r\n property ElementPosition;\r\n end;\r\n\r\n TGraphicControl = class(TCustomControl);\r\n\r\n TScrollingGraphicControl = class(TCustomControl)\r\n protected\r\n function CreateElement: TJSElement; override;\r\n public\r\n procedure UpdateElement; override;\r\n end;\r\n\r\n TCustomHTMLDiv = class(TCustomControl)\r\n protected\r\n function CreateElement: TJSElement; override;\r\n end;\r\n\r\n TControlManager = class(TComponent)\r\n private\r\n FInstanceCount: integer;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n function GetInstanceNumber: integer;\r\n procedure Reset;\r\n end;\r\n\r\n TCSSCodeFragment = class(TCollectionItem)\r\n private\r\n FControlClassname: string;\r\n FCSS: TStringList;\r\n procedure SetCSS(const Value: TStringList);\r\n public\r\n constructor Create(Collection: TCollection); override;\r\n destructor Destroy; override;\r\n published\r\n property ControlClassname: string read FControlClassname write FControlClassname;\r\n property CSS: TStringList read FCSS write SetCSS;\r\n end;\r\n\r\n TCSSCodeFragments = class(TOwnedCollection)\r\n private\r\n function GetItemEx(Index: integer): TCSSCodeFragment;\r\n procedure SetItemEx(Index: integer; const Value: TCSSCodeFragment);\r\n public\r\n constructor Create(AOwner: TComponent); reintroduce;\r\n function Add: TCSSCodeFragment; reintroduce;\r\n function Insert(Index: integer): TCSSCodeFragment; reintroduce;\r\n property Items[Index: integer]: TCSSCodeFragment read GetItemEx write SetItemEx;\r\n end;\r\n\r\n TCSSCodeManager = class(TComponent)\r\n private\r\n FCSSFragments: TCSSCodeFragments;\r\n procedure SetCSSFragments(const Value: TCSSCodeFragments);\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n destructor Destroy; override;\r\n function GetClassFragment(AClassname: string): TCSSCodeFragment;\r\n function GetClassCSS(AClassname: string): string;\r\n published\r\n property CSSFragments: TCSSCodeFragments read FCSSFragments write SetCSSFragments;\r\n end;\r\n\r\n ITMSFNCDataBinderBase = interface\r\n ['{778B63C9-34E3-4B65-A6B8-85E3EB1D17C3}']\r\n procedure DataBeginUpdate;\r\n procedure DataEndUpdate;\r\n end;\r\n\r\n ITMSFNCDataBinderGrid = interface(ITMSFNCDataBinderBase)\r\n ['{D23BDEAA-49B1-451A-9401-0D0D11A9957A}']\r\n procedure SetDataColumnCount(AValue: Integer);\r\n procedure SetDataRowCount(AValue: Integer);\r\n procedure ClearData;\r\n function GetDataRowCount: Integer;\r\n procedure SetDataValue(AColumn, ARow: Integer; AValue: string);\r\n procedure SetDataHeader(AColumn: Integer; AValue: string);\r\n procedure DataInsertRow(AInsertPosition: Integer);\r\n end;\r\n\r\nfunction FindGlobalComponent(const Name: string): TComponent;\r\nfunction GetMousePos: TPoint;\r\nfunction FindUniqueName(const Name: string): string;\r\nfunction GetScrollBarHeight: integer;\r\nfunction GetScrollBarWidth: integer;\r\nprocedure SetHTMLElementFont(AElement: TJSHTMLElement; AFont: TFont; UseCSS: boolean);\r\nprocedure SetHTMLElementColor(AElement: TJSHTMLElement; AColor: TColor; UseCSS: boolean);\r\nfunction GetHTMLCursorName(ACursor: TCursor): string;\r\nfunction GetHTMLElementAbsoluteRect(AElement: TJSHTMLElement): TRect;\r\n\r\nfunction CursorToString(ACursor: TCursor): string;\r\nfunction StringToCursor(const S: string): TCursor;\r\nfunction IsAndroid: Boolean;\r\n\r\nimplementation\r\n\r\nuses\r\n WEBLib.Dialogs, WEBLib.Forms, Math, TypInfo;\r\n\r\nvar\r\n ControlManager: TControlManager;\r\n FMouseX, FMouseY: Integer;\r\n ScrollBW, ScrollBH: Integer;\r\n DragObject: TObject;\r\n\r\n\r\nconst\r\n cStyleBkgColor = 'background-color';\r\n\r\nprocedure SetHTMLElementFont(AElement: TJSHTMLElement; AFont: TFont; UseCSS: boolean);\r\nvar\r\n s: string;\r\nbegin\r\n if UseCSS then\r\n begin\r\n AElement.style.removeProperty('font-family');\r\n AElement.style.removeProperty('font-style');\r\n AElement.style.removeProperty('font-weight');\r\n AElement.style.removeProperty('font-size');\r\n AElement.style.removeProperty('text-decoration');\r\n end\r\n else\r\n begin\r\n AElement.style.setProperty('font-family', AFont.Name);\r\n\r\n AElement.style.setProperty('font-style', 'normal');\r\n\r\n if fsBold in AFont.Style then\r\n AElement.style.setProperty('font-weight', 'bold')\r\n else\r\n AElement.style.setProperty('font-weight', '');\r\n\r\n if fsItalic in AFont.Style then\r\n AElement.style.setProperty('font-style', 'italic');\r\n\r\n s := '';\r\n\r\n if fsUnderline in AFont.Style then\r\n s := 'underline';\r\n\r\n if fsStrikeOut in AFont.Style then\r\n begin\r\n if s <> '' then\r\n s := s + ' ';\r\n s:= s + 'line-through';\r\n end;\r\n\r\n if (s <> '') then\r\n AElement.style.setProperty('text-decoration', s)\r\n else\r\n AElement.style.removeProperty('text-decoration');\r\n\r\n AElement.style.setProperty('font-size', IntToStr(AFont.Size) + 'pt');\r\n end;\r\nend;\r\n\r\nprocedure SetHTMLElementColor(AElement: TJSHTMLElement; AColor: TColor; UseCSS: boolean);\r\nbegin\r\n if UseCSS or (AColor = clNone) or (AColor = clWindow) then\r\n AElement.style.removeProperty(cStyleBkgColor)\r\n else\r\n AElement.style.setProperty(cStyleBkgColor, ColorToHTML(AColor));\r\nend;\r\n\r\nfunction GetHTMLCursorName(ACursor: TCursor): string;\r\nbegin\r\n Result := 'default';\r\n case ACursor of\r\n crDefault: Result :='default';\r\n crArrow: Result :='auto';\r\n crNone: Result :='none';\r\n crCross: Result :='crosshair';\r\n crIBeam: Result :='text';\r\n crSizeNESW: Result :='nesw-resize';\r\n crSizeNS: Result :='ns-resize';\r\n crSizeNWSE: Result :='nwse-resize';\r\n crSizeWE: Result :='ew-resize';\r\n crUpArrow: Result :='n-resize';\r\n crHourGlass: Result :='wait';\r\n crDrag: Result :='copy';\r\n crNoDrop: Result :='no-drop';\r\n crHSplit: Result :='col-resize';\r\n crVSplit: Result :='row-resize';\r\n crMultiDrag: Result :='copy';\r\n crSQLWait: Result :='progress';\r\n crNo: Result :='not-allowed';\r\n crAppStart: Result :='progress';\r\n crHelp: Result :='help';\r\n crHandPoint: Result :='pointer';\r\n crSizeAll,crSize: Result :='move';\r\n end;\r\nend;\r\n\r\nfunction CursorToString(ACursor: TCursor): string;\r\nbegin\r\n Result := 'crDefault';\r\n case ACursor of\r\n crDefault: Result :='crDefault';\r\n crArrow: Result :='crArrow';\r\n crNone: Result :='crNone';\r\n crCross: Result :='crCross';\r\n crSize: Result := 'ctSize';\r\n crIBeam: Result :='crIBeam';\r\n crSizeNESW: Result :='crSizeNESW';\r\n crSizeNS: Result :='crSizeNS';\r\n crSizeNWSE: Result :='crSizeNWSE';\r\n crSizeWE: Result :='crSizeWE';\r\n crUpArrow: Result :='crUpArrow';\r\n crHourGlass: Result :='crHourGlass';\r\n crDrag: Result :='crDrag';\r\n crNoDrop: Result :='crNoDrop';\r\n crHSplit: Result :='crHSplit';\r\n crVSplit: Result :='crVSplit';\r\n crMultiDrag: Result :='crMultiDrag';\r\n crSQLWait: Result :='crSQLWait';\r\n crNo: Result :='crNo';\r\n crAppStart: Result :='crAppStart';\r\n crHelp: Result :='crHelp';\r\n crHandPoint: Result :='crHandpoint';\r\n crSizeAll: Result :='crSizeAll';\r\n end;\r\nend;\r\n\r\n\r\nfunction StringToCursor(const S: string): TCursor;\r\nvar\r\n us: string;\r\nbegin\r\n Result := crDefault;\r\n us := Uppercase(s);\r\n if (us = 'CRDEFAULT') then Result := crDefault else\r\n if (us = 'CRARROW') then Result := crArrow else\r\n if (us = 'CRNONE') then Result := crNone else\r\n if (us = 'CRCROSS') then Result := crCross else\r\n if (us = 'CRSIZE') then Result := crSize else\r\n if (us = 'CRIBEAM') then Result := crIBeam else\r\n if (us = 'CRSIZENESW') then Result := crSizeNESW else\r\n if (us = 'CRSIZENS') then Result := crSizeNS else\r\n if (us = 'CRSIZENWSE') then Result := crSizeNWSE else\r\n if (us = 'CRSIZEWE') then Result := crSizeWE else\r\n if (us = 'CRUPARROW') then Result := crUpArrow else\r\n if (us = 'CRHOURGLASS') then Result := crHourGlass else\r\n if (us = 'CRDRAG') then Result := crDrag else\r\n if (us = 'CRNODROP') then Result := crNoDrop else\r\n if (us = 'CRHSPLIT') then Result := crHSplit else\r\n if (us = 'CRVSPLIT') then Result := crVSplit else\r\n if (us = 'CRMULTIDRAG') then Result := crMultiDrag else\r\n if (us = 'CRSQLWAIT') then Result := crSQLWait else\r\n if (us = 'CRNO') then Result := crNo else\r\n if (us = 'CRAPPSTART') then Result := crAppStart else\r\n if (us = 'CRHELP') then Result := crHelp else\r\n if (us = 'CRHANDPOINT') then Result := crHandpoint else\r\n if (us = 'CRSIZEALL') then Result := crSizeAll;\r\nend;\r\n\r\n\r\nfunction IsAndroid: Boolean;\r\nvar\r\n sagent: string;\r\nbegin\r\n asm\r\n sagent = navigator.userAgent;\r\n end;\r\n Result := (pos('Android', sagent) > 0);\r\nend;\r\n\r\nfunction GetMousePos: TPoint;\r\nbegin\r\n Result := Point(FMouseX, FMouseY);\r\nend;\r\n\r\nfunction GetHTMLElementAbsoluteRect(AElement: TJSHTMLElement): TRect;\r\nvar\r\n s: string;\r\n\r\n function GetInt(AValue: string): integer;\r\n var\r\n e: integer;\r\n begin\r\n AValue := StringReplace(AValue, 'px','', [rfReplaceAll]);\r\n val(AValue, Result, e);\r\n end;\r\n\r\nbegin\r\n s := AElement.style.getPropertyValue('left');\r\n Result.left := GetInt(s);\r\n s := AElement.style.getPropertyValue('top');\r\n Result.top := GetInt(s);\r\n s := AElement.style.getPropertyValue('width');\r\n Result.right := Result.Left + GetInt(s);\r\n s := AElement.style.getPropertyValue('height');\r\n Result.bottom := Result.top + GetInt(s);\r\nend;\r\n\r\nfunction GetScrollBarWidth: integer;\r\nvar\r\n res: integer;\r\nbegin\r\n res := ScrollBW;\r\n\r\n if res = 0 then\r\n begin\r\n\r\n asm\r\n var outer = document.createElement(\"div\");\r\n outer.style.visibility = \"hidden\";\r\n outer.style.width = \"100px\";\r\n outer.style.msOverflowStyle = \"scrollbar\"; // needed for WinJS apps\r\n\r\n document.body.appendChild(outer);\r\n\r\n var widthNoScroll = outer.offsetWidth;\r\n // force scrollbars\r\n outer.style.overflow = \"scroll\";\r\n\r\n // add innerdiv\r\n var inner = document.createElement(\"div\");\r\n inner.style.width = \"100%\";\r\n outer.appendChild(inner);\r\n\r\n var widthWithScroll = inner.offsetWidth;\r\n\r\n // remove divs\r\n outer.parentNode.removeChild(outer);\r\n\r\n res = widthNoScroll - widthWithScroll;\r\n end;\r\n ScrollBW := res;\r\n end;\r\n\r\n Result := res;\r\nend;\r\n\r\nfunction GetScrollBarHeight: integer;\r\nvar\r\n res: integer;\r\nbegin\r\n res := ScrollBH;\r\n\r\n if res = 0 then\r\n begin\r\n asm\r\n var outer = document.createElement(\"div\");\r\n outer.style.visibility = \"hidden\";\r\n outer.style.height = \"100px\";\r\n outer.style.msOverflowStyle = \"scrollbar\"; // needed for WinJS apps\r\n\r\n document.body.appendChild(outer);\r\n\r\n var HeightNoScroll = outer.offsetHeight;\r\n // force scrollbars\r\n outer.style.overflow = \"scroll\";\r\n\r\n // add innerdiv\r\n var inner = document.createElement(\"div\");\r\n inner.style.height = \"100%\";\r\n outer.appendChild(inner);\r\n\r\n var HeightWithScroll = inner.offsetHeight;\r\n\r\n // remove divs\r\n outer.parentNode.removeChild(outer);\r\n\r\n res = HeightNoScroll - HeightWithScroll;\r\n\r\n res = 0;\r\n end;\r\n ScrollBH := res;\r\n end;\r\n\r\n Result := res;\r\nend;\r\n\r\n\r\nfunction FindGlobalComponent(const Name: string): TComponent;\r\nbegin\r\n Result := nil;\r\nend;\r\n\r\nfunction FindUniqueName(const Name: string): string;\r\nbegin\r\n Result := Name + IntToStr(ControlManager.GetInstanceNumber);\r\nend;\r\n\r\n{ TMargins }\r\n\r\nprocedure TMargins.SetLeft(const Value: integer);\r\nbegin\r\n if (Value <> FLeft) then\r\n begin\r\n FLeft := Value;\r\n DoChange;\r\n end;\r\nend;\r\n\r\nprocedure TMargins.SetTop(const Value: integer);\r\nbegin\r\n if (Value <> FTop) then\r\n begin\r\n FTop := Value;\r\n DoChange;\r\n end;\r\nend;\r\n\r\nprocedure TMargins.SetRight(const Value: integer);\r\nbegin\r\n if (Value <> FRight) then\r\n begin\r\n FRight := Value;\r\n DoChange;\r\n end;\r\nend;\r\n\r\nprocedure TMargins.SetBottom(const Value: integer);\r\nbegin\r\n if (Value <> FBottom) then\r\n begin\r\n FBottom := Value;\r\n DoChange;\r\n end;\r\nend;\r\n\r\nprocedure TMargins.DoChange; \r\nbegin\r\n if Assigned(OnChange) then\r\n OnChange(Self);\r\nend;\r\n\r\n{ TControl }\r\n\r\nfunction TControl.MakeScreenshot: TBitmap;\r\nbegin\r\n Result := nil;\r\nend;\r\n\r\nprocedure TControl.MouseDown(Button: TMouseButton; Shift: TShiftState; X,\r\n Y: Integer);\r\nbegin\r\n if not Enabled then\r\n Exit;\r\n\r\n if Assigned(OnMouseDown) then\r\n OnMouseDown(Self, Button, Shift, X, Y);\r\nend;\r\n\r\nprocedure TControl.MouseMove(Shift: TShiftState; X, Y: Integer);\r\nbegin\r\n if not Enabled then\r\n Exit;\r\n\r\n if Assigned(OnMouseMove) then\r\n OnMouseMove(Self, Shift, X, Y);\r\nend;\r\n\r\nprocedure TControl.MouseUp(Button: TMouseButton; Shift: TShiftState; X,\r\n Y: Integer);\r\nbegin\r\n if not Enabled then\r\n Exit;\r\n\r\n if Assigned(OnMouseUp) then\r\n OnMouseUp(Self, Button, Shift, X, Y);\r\nend;\r\n\r\nprocedure TControl.MouseWheel(Shift: TShiftState; WheelDelta: Integer;\r\n var Handled: Boolean);\r\nvar\r\n IsNeg: Boolean;\r\nbegin\r\n if Assigned(OnMouseWheel) then\r\n OnMouseWheel(Self, Shift, WheelDelta, Point(0, 0), Handled);\r\n\r\n Inc(FWheelAccumulator, WheelDelta);\r\n while Abs(FWheelAccumulator) >= WHEEL_DELTA do\r\n begin\r\n IsNeg := FWheelAccumulator < 0;\r\n FWheelAccumulator := Abs(FWheelAccumulator) - WHEEL_DELTA;\r\n if IsNeg then\r\n begin\r\n if FWheelAccumulator <> 0 then FWheelAccumulator := -FWheelAccumulator;\r\n DoMouseWheelDown(Shift, FWheelMousePos);\r\n end\r\n else\r\n DoMouseWheelUp(Shift, FWheelMousePos);\r\n end;\r\nend;\r\n\r\nprocedure TControl.MoveFirst(AControl: TControl);\r\nvar\r\n i: integer;\r\n fnd: boolean;\r\nbegin\r\n fnd := false;\r\n for i := ControlCount - 1 downto 0 do\r\n begin\r\n if FControls[i] = AControl then\r\n fnd := true;\r\n\r\n if fnd then\r\n begin\r\n if (i > 0) then\r\n FControls[i] := FControls[i - 1]\r\n else\r\n FControls[i] := AControl;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TControl.MoveLast(AControl: TControl);\r\nvar\r\n i: integer;\r\n fnd: boolean;\r\nbegin\r\n fnd := false;\r\n for i := 0 to ControlCount - 1 do\r\n begin\r\n if FControls[i] = AControl then\r\n fnd := true;\r\n\r\n if fnd then\r\n begin\r\n if (i < ControlCount - 1) then\r\n FControls[i] := FControls[i + 1]\r\n else\r\n FControls[i] := AControl;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TControl.DoMouseLeave;\r\nbegin\r\n if Assigned(OnMouseLeave) then\r\n OnMouseLeave(Self);\r\nend;\r\n\r\nfunction TControl.DoMouseWheelDown(Shift: TShiftState;\r\n MousePos: TPoint): Boolean;\r\nbegin\r\n Result := False;\r\n if Assigned(FOnMouseWheelDown) then\r\n FOnMouseWheelDown(Self, Shift, MousePos, Result);\r\nend;\r\n\r\nfunction TControl.DoMouseWheelUp(Shift: TShiftState; MousePos: TPoint): Boolean;\r\nbegin\r\n Result := False;\r\n if Assigned(FOnMouseWheelUp) then\r\n FOnMouseWheelUp(Self, Shift, MousePos, Result);\r\nend;\r\n\r\nprocedure TControl.DoMouseEnter;\r\nbegin\r\n if Assigned(OnMouseEnter) then\r\n OnMouseEnter(Self);\r\nend;\r\n\r\nprocedure TControl.AlignControls(AControl: TControl; var ARect: TRect);\r\nvar\r\n j: Integer;\r\n\r\n procedure DoPosition(Control: TControl; AAlign: TAlign);\r\n var\r\n dl, dt, dr, db: integer;\r\n begin\r\n if not Control.AnchoringInitialized then\r\n InitAnchoring;\r\n\r\n Control.FUpdateTopLeft := true;\r\n\r\n if Control.AlignWithMargins then\r\n begin\r\n dl := Control.Margins.Left;\r\n dt := Control.Margins.Top;\r\n db := Control.Margins.Bottom;\r\n dr := Control.Margins.Right;\r\n end\r\n else\r\n begin\r\n dl := 0;\r\n dt := 0;\r\n db := 0;\r\n dr := 0;\r\n end;\r\n\r\n case AAlign of\r\n alTop:\r\n begin\r\n Control.SetBoundsInt(ARect.Left + dl, ARect.Top + dt, ARect.Right - ARect.Left - dl - dr, Control.Height);\r\n ARect.Top := ARect.Top + Control.Height + dt + db;\r\n end;\r\n alBottom:\r\n begin\r\n Control.SetBoundsInt(ARect.Left + dl, ARect.Bottom - Control.Height - db - 1, ARect.Right - ARect.Left - dl - dr - 1, Control.Height);\r\n ARect.Bottom := ARect.Bottom - Control.Height - dt - db;\r\n end;\r\n alLeft:\r\n begin\r\n Control.SetBoundsInt(ARect.Left + dl, ARect.Top + dt, Control.Width, ARect.Bottom - ARect.Top - dt - db);\r\n ARect.Left := ARect.Left + Control.Width + dl + dr;\r\n end;\r\n alRight:\r\n begin\r\n Control.SetBoundsInt(ARect.Right - Control.Width - dr, ARect.Top + dt, Control.Width, ARect.Bottom - ARect.Top - db - dt);\r\n ARect.Right := ARect.Right - Control.Width - dr - dl;\r\n end;\r\n alClient:\r\n begin\r\n Control.SetBoundsInt(ARect.Left + dl, ARect.Top + dt, ARect.Right - ARect.Left - dl - dr, ARect.Bottom - ARect.Top - db - dt);\r\n ARect.Left := 0;\r\n ARect.Top := 0;\r\n ARect.Right := 0;\r\n ARect.Bottom := 0;\r\n end;\r\n end;\r\n\r\n Control.FUpdateTopLeft := false;\r\n end;\r\n\r\n procedure DoAlign(AAlign: TAlign);\r\n var\r\n i,j,ins: Integer;\r\n il: TList;\r\n begin\r\n il := TList.Create;\r\n\r\n for i := 0 to ControlCount - 1 do\r\n begin\r\n if (Controls[i].Align = AAlign) and ((Controls[i].Visible) or (csDesigning in ComponentState)) then\r\n begin\r\n ins := il.Count;\r\n\r\n for j := il.Count - 1 downto 0 do\r\n begin\r\n case AAlign of\r\n alTop:\r\n if Controls[i].FOrigTop < TControl(il.Items[j]).FOrigTop then\r\n ins := j;\r\n alLeft:\r\n if Controls[i].FOrigLeft < TControl(il.Items[j]).FOrigLeft then\r\n ins := j;\r\n alRight:\r\n if Controls[i].FOrigLeft + Controls[i].Width > TControl(il.Items[j]).FOrigLeft + TControl(il.Items[j]).Width then\r\n ins := j;\r\n alBottom:\r\n if Controls[i].FOrigTop + Controls[i].Height > TControl(il.Items[j]).FOrigTop + TControl(il.Items[j]).Height then\r\n ins := j;\r\n end;\r\n end;\r\n il.Insert(ins, Controls[i]);\r\n end;\r\n end;\r\n\r\n for i := 0 to il.Count - 1 do\r\n begin\r\n DoPosition(TControl(il.Items[i]), AAlign);\r\n end;\r\n\r\n il.Free;\r\n end;\r\n\r\nbegin\r\n DoAlign(alTop);\r\n DoAlign(alBottom);\r\n DoAlign(alLeft);\r\n DoAlign(alRight);\r\n DoAlign(alClient);\r\n DoAlign(alCustom);\r\n\r\n for j := 0 to ControlCount - 1 do\r\n begin\r\n Controls[j].AlignControl(Controls[j]);\r\n end;\r\nend;\r\n\r\nprocedure TControl.ApplyName;\r\nvar\r\n s, prefix: String;\r\n frm: TCustomForm;\r\nbegin\r\n s := ClassName;\r\n Delete(s, 1, 1);\r\n\r\n prefix := '';\r\n frm := GetParentForm(Self);\r\n if Assigned(frm) then\r\n prefix := frm.ClassName;\r\n\r\n SetID(prefix+'_'+FindUniqueName(s));\r\nend;\r\n\r\nconstructor TControl.Create(ID: string);\r\nbegin\r\n FGotFocus := false;\r\n FTabStop := true;\r\n FAllowTouch := true;\r\n\r\n CreateWithID(ID);\r\nend;\r\n\r\nprocedure TControl.HookElement;\r\nvar\r\n el: TJSElement;\r\n i: integer;\r\nbegin\r\n el := document.getElementByID(FID);\r\n Container := el;\r\n BindElement;\r\n BindEvents;\r\n\r\n for i := 0 to ControlCount - 1 do\r\n Controls[i].HookElement;\r\nend;\r\n\r\nfunction TControl.CanAcceptChild(AValue: TControl): TControl;\r\nbegin\r\n Result := Self;\r\nend;\r\n\r\nfunction TControl.CanFocus: Boolean;\r\nbegin\r\n Result := True;\r\nend;\r\n\r\nfunction TControl.CanShowFocus: boolean;\r\nbegin\r\n Result := FShowFocus;\r\nend;\r\n\r\nprocedure TControl.Capture;\r\nbegin\r\n FCaptureDown := True;\r\n window.setTimeout(@StartCapture, 100);\r\nend;\r\n\r\nprocedure TControl.StartCapture;\r\nvar\r\n eh: TJSHTMLElement;\r\nbegin\r\n if not FCaptureDown then\r\n Exit;\r\n\r\n if Captured then\r\n ReleaseCapture;\r\n\r\n FMouseInsideLayer := true;\r\n\r\n FLayer := document.createElement('SPAN');\r\n document.body.appendChild(FLayer);\r\n\r\n eh := TJSHTMLElement(FLayer);\r\n eh.addEventListener('mouseenter', FLayerMouseEnterPtr);\r\n eh.addEventListener('mouseleave', FLayerMouseLeavePtr);\r\n eh.addEventListener('mousedown', FMouseDownPtr);\r\n eh.addEventListener('mouseup', FMouseUpPtr);\r\n eh.addEventListener('mousemove', FMouseMovePtr);\r\n eh.addEventListener('touchstart', FTouchStartPtr);\r\n eh.addEventListener('touchmove', FTouchMovePtr);\r\n eh.addEventListener('touchend', FTouchEndPtr);\r\n eh.addEventListener('touchcancel', FTouchCancelPtr);\r\n\r\n eh.style.setProperty('top', '0');\r\n eh.style.setProperty('left', '0');\r\n eh.style.setProperty('right', '0');\r\n eh.style.setProperty('bottom', '0');\r\n\r\n eh.style.setProperty('webkit-user-select', 'none');\r\n eh.style.setProperty('moz-user-select', 'none');\r\n eh.style.setProperty('khtml-user-select', 'none');\r\n eh.style.setProperty('ms-user-select', 'none');\r\n eh.style.setProperty('user-select', 'none');\r\n eh.style.setProperty('position', 'absolute');\r\n\r\n eh.style.setProperty(CSSZIndex, '999999');\r\n\r\n FCaptured := True;\r\n UpdateElement;\r\nend;\r\n\r\nfunction TControl.Captured: Boolean;\r\nbegin\r\n Result := FCaptured and Assigned(FLayer);\r\nend;\r\n\r\nprocedure TControl.ClearChildElements;\r\nvar\r\n el: TJSElement;\r\nbegin\r\n if not Assigned(ElementHandle) then\r\n Exit;\r\n\r\n while ElementHandle.childElementCount > 0 do\r\n begin\r\n el := TJSElement(ElementHandle.firstChild);\r\n ElementHandle.removeChild(el);\r\n end;\r\nend;\r\n\r\nprocedure TControl.ClearControls;\r\nbegin\r\n SetLength(FControls, 0);\r\nend;\r\n\r\nprocedure TControl.Click;\r\nbegin\r\n if Assigned(OnClick) and IsEnabled then\r\n OnClick(Self);\r\nend;\r\n\r\nfunction TControl.ClientToScreen(const Point: TPoint): TPoint;\r\nvar\r\n Origin: TPoint;\r\nbegin\r\n Origin := ClientOrigin;\r\n Result.X := Point.X + Origin.X;\r\n Result.Y := Point.Y + Origin.Y;\r\nend;\r\n\r\nprocedure TControl.ColorChanging;\r\nbegin\r\n\r\nend;\r\n\r\nfunction TControl.ContainerElement: TJSElement;\r\nbegin\r\n Result := document.body;\r\nend;\r\n\r\nfunction TControl.RequiredBaseURL: string;\r\nbegin\r\n Result := '';\r\nend;\r\n\r\nprocedure TControl.RequiredScriptLoaded(Event: TJSEvent);\r\nbegin\r\n (Event.Target as TJSHTMLScriptElement).Title := 'tmswebloaded';\r\n inc(FControlScriptCountLoaded);\r\nend;\r\n\r\nconstructor TControl.Create(AOwner: TComponent);\r\nvar\r\n lName: string;\r\n frm: TCustomForm;\r\n lDesign: boolean;\r\n\r\nbegin\r\n FGotFocus := false;\r\n FTabStop := true;\r\n FAllowTouch := true;\r\n FNoUserSelect := true;\r\n ClearMethodPointers;\r\n\r\n inherited Create(AOwner);\r\n\r\n EventStopPropagation := [eeClick, eeDblClick, eeMouseUp, eeMouseMove, eeMouseDown, eeKeypress, eeKeyDown, eeKeyUp];\r\n\r\n FScriptLoaded := false;\r\n FElementFont := efProperty;\r\n FElementPosition := epAbsolute;\r\n FParentElement := nil;\r\n FTextDirection := tdDefault;\r\n\r\n lDesign := false;\r\n\r\n frm := GetParentForm(Self);\r\n if Assigned(frm) then\r\n begin\r\n lDesign := (csDesigning in frm.ComponentState);\r\n end;\r\n\r\n lName := GetNewName;\r\n\r\n // for VSC, when creating control, initialize without ID\r\n if lDesign then\r\n CreateWithID('')\r\n else\r\n CreateWithID(lName);\r\n\r\n if Assigned(AOwner) and not (csDesigning in AOwner.ComponentState) then\r\n Name := lName;\r\nend;\r\n\r\n\r\nprocedure TControl.CreateControl;\r\nbegin\r\n if not Assigned(FElement) then\r\n begin\r\n FElement := CreateElement;\r\n\r\n if Assigned(FElement) then\r\n begin\r\n FControlCreated := True;\r\n Container := FElement;\r\n if not (ElementID = 'body') then\r\n Container['id'] := ElementID;\r\n Container['zindex'] := '0';\r\n if FElementClassName <> '' then\r\n Container['class'] := FElementClassName;\r\n\r\n BindEvents;\r\n UpdateElement;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TControl.CreateElement: TJSElement;\r\nbegin\r\n Result := nil;\r\nend;\r\n\r\nprocedure TControl.CreateInitialize;\r\nbegin\r\n FRequiredScripts := TStringList.Create;\r\n FOrigRect := Rect(-1,-1,-1,-1);\r\n FClipChildren := True;\r\nend;\r\n\r\nprocedure TControl.CreateWithID(AID: string);\r\nvar\r\n el: TJSElement;\r\nbegin\r\n ClearMethodPointers;\r\n\r\n FUpdateCount := 0;\r\n\r\n FControlCreated := False;\r\n FLinkTouchEvents := True;\r\n FIsResizing := false;\r\n\r\n if (Assigned(Owner) and (csLoading in Owner.ComponentState)) or not Assigned(Owner) then\r\n begin\r\n if not (Assigned(Owner) and (csDesigning in Owner.ComponentState)) then\r\n Loading;\r\n end;\r\n\r\n FElementPosition := epAbsolute;\r\n FWidthStyle := ssAbsolute;\r\n FHeightStyle := ssAbsolute;\r\n\r\n el := document.getElementByID(AID);\r\n\r\n FNew := not Assigned(el);\r\n\r\n // the HTML element is not found\r\n if FNew then\r\n begin\r\n Container := nil;\r\n end\r\n else\r\n begin\r\n Container := el;\r\n FControlCreated := true;\r\n FElementPosition := epRelative;\r\n BindElement;\r\n BindEvents;\r\n end;\r\n\r\n FID := AID;\r\n FFont := TFont.Create;\r\n FFont.OnChange := HandleFontChanged;\r\n FEnabled := True;\r\n FVisible := True;\r\n FLeft := 0;\r\n FTop := 0;\r\n FAlign := alNone;\r\n FAlignWithMargins := false;\r\n FIsAligning := false;\r\n FParentFont := true;\r\n FParentBiDiMode := true;\r\n FParentColor := false;\r\n FAnchors := [akLeft, akTop];\r\n FShowFocus := false;\r\n FBorderWidth := 0;\r\n FEnablePropagation := False;\r\n\r\n FColor := clWindow;\r\n\r\n FMargins := TMargins.Create;\r\n FMargins.OnChange := DoMarginsChanged;\r\n\r\n FParent := nil;\r\n FPrevParent := nil;\r\n\r\n ClearControls;\r\n CreateInitialize;\r\nend;\r\n\r\nprocedure TControl.BindElement;\r\nbegin\r\nend;\r\n\r\nprocedure TControl.AddControlLink(const linkid, link: string);\r\nbegin\r\n asm\r\n function writeLinkOnce(linkName, linkText) {\r\n var linkElement = document.getElementById(linkName);\r\n if (linkElement)\r\n return;\r\n linkElement = document.createElement('link');\r\n linkElement.id = linkName;\r\n linkElement.setAttribute('rel', 'stylesheet');\r\n linkElement.setAttribute('type', 'text/css');\r\n linkElement.setAttribute('href', linkText);\r\n document.getElementsByTagName('head')[0].appendChild(linkElement);\r\n }\r\n writeLinkOnce(linkid,link);\r\n end;\r\nend;\r\n\r\n\r\n{$HINTS OFF}\r\nprocedure TControl.AddControlScriptLink(const link: string);\r\nvar\r\n id: string;\r\n script: TJSHTMLScriptElement;\r\n\r\nbegin\r\n id := ClassName;\r\n\r\n if not Assigned(document.getElementById(id)) then\r\n begin\r\n script := TJSHTMLScriptElement(document.createElement('script'));\r\n script.id := id;\r\n script.src := link;\r\n script.type_ := 'text/javascript';\r\n document.head.appendChild(script);\r\n end;\r\nend;\r\n\r\nprocedure TControl.AddControlScriptSource(const source: string);\r\nvar\r\n id: string;\r\n script: TJSHTMLScriptElement;\r\n\r\nbegin\r\n id := ClassName;\r\n\r\n if not Assigned(document.getElementById(id)) then\r\n begin\r\n script := TJSHTMLScriptElement(document.createElement('script'));\r\n script.id := id;\r\n script.innerHTML := source;\r\n script.type_ := 'text/javascript';\r\n document.head.appendChild(script);\r\n end;\r\nend;\r\n\r\n\r\nprocedure TControl.AddControlStyle(const css: string);\r\nvar\r\n cssname: string;\r\nbegin\r\n cssname := ClassName;\r\n\r\n asm\r\n function writeStylesOnce(styleName, cssText) {\r\n var styleElement = document.getElementById(styleName);\r\n if (styleElement) {\r\n styleElement.innerHTML = cssText;\r\n return;\r\n }\r\n styleElement = document.createElement('style');\r\n styleElement.type = 'text/css';\r\n styleElement.id = styleName;\r\n styleElement.innerHTML = cssText;\r\n document.getElementsByTagName('head')[0].appendChild(styleElement);\r\n }\r\n writeStylesOnce(cssname,css);\r\n end;\r\nend;\r\n\r\nprocedure TControl.AddInstanceStyle(const id: string; const css: string);\r\nbegin\r\n asm\r\n function writeStylesOnce(styleName, cssText) {\r\n var styleElement = document.getElementById(styleName);\r\n if (styleElement) {\r\n styleElement.innerHTML = cssText;\r\n return;\r\n }\r\n styleElement = document.createElement('style');\r\n styleElement.type = 'text/css';\r\n styleElement.id = styleName;\r\n styleElement.innerHTML = cssText;\r\n document.getElementsByTagName('head')[0].appendChild(styleElement);\r\n }\r\n writeStylesOnce(id,css);\r\n end;\r\n\r\nend;\r\n\r\nprocedure TControl.AddInstanceStyle(const css: string);\r\nvar\r\n cssname: string;\r\nbegin\r\n cssname := Name + '_style';\r\n AddInstanceStyle(cssname, css);\r\nend;\r\n\r\nprocedure TControl.AddRequiredScript(const link: string);\r\nvar\r\n id: string;\r\n script: TJSHTMLScriptElement;\r\n\r\nbegin\r\n script := TJSHTMLScriptElement(document.createElement('script'));\r\n script.src := link;\r\n script.type_ := 'text/javascript';\r\n script.title := 'tmswebloading';\r\n\r\n if not Assigned(FScriptLoadedPtr) then\r\n FScriptLoadedPtr := @RequiredScriptLoaded;\r\n\r\n script.addEventListener('load', FScriptLoadedPtr);\r\n document.head.appendChild(script);\r\nend;\r\n\r\nfunction TControl.AddRequiredScripts: boolean;\r\nvar\r\n i,j: integer;\r\n el: TJSElement;\r\n scr: TJSHTMLScriptElement;\r\n found, loading: boolean;\r\nbegin\r\n FControlScriptCount := 0;\r\n\r\n for j := 0 to RequiredScripts.Count - 1 do\r\n begin\r\n found := false;\r\n loading := false;\r\n\r\n for i := 0 to document.head.children.length - 1 do\r\n begin\r\n el := TJSElement(document.head.children[i]);\r\n if (el.tagName = 'SCRIPT') then\r\n begin\r\n scr := TJSHTMLScriptElement(el);\r\n if (pos(RequiredScripts[j], scr.src) > 0) then\r\n begin\r\n found := true;\r\n\r\n if scr.title = 'tmswebloading' then\r\n begin\r\n loading := true;\r\n if not Assigned(FScriptLoadedPtr) then\r\n FScriptLoadedPtr := @RequiredScriptLoaded;\r\n scr.addEventListener('load', FScriptLoadedPtr);\r\n end;\r\n\r\n break;\r\n end;\r\n end;\r\n end;\r\n\r\n if not found then\r\n begin\r\n inc(FControlScriptCount);\r\n AddRequiredScript( RequiredBaseURL + RequiredScripts[j]);\r\n end;\r\n\r\n if found and loading then\r\n inc(FControlScriptCount);\r\n end;\r\n\r\n Result := (FControlScriptCount > 0);\r\nend;\r\n\r\n{$HINTS ON}\r\n\r\nprocedure TControl.AlignControl(AControl: TControl);\r\nvar\r\n r: TRect;\r\n cr: TJSDOMRect;\r\n ovf, ovfx, ovfy: string;\r\n eh: TJSHTMLElement;\r\n el: TJSElement;\r\n frm: TCustomForm;\r\n ctop: integer;\r\n vscrl: integer;\r\n\r\nbegin\r\n if FIsAligning then\r\n Exit;\r\n\r\n if IsUpdating then\r\n Exit;\r\n\r\n if csLoading in ComponentState then\r\n Exit;\r\n\r\n// if not Visible then\r\n// Exit;\r\n\r\n if Assigned(Parent) and not Parent.Visible then\r\n Exit;\r\n\r\n frm := GetParentForm(Self);\r\n\r\n if Assigned(frm) and frm.IsUpdating then\r\n Exit;\r\n\r\n ctop := 0;\r\n\r\n if Assigned(frm) and (frm.FormContainer <> '') and (AControl is TCustomForm) then\r\n begin\r\n el := document.getElementById(frm.FormContainer);\r\n if Assigned(el) then\r\n begin\r\n cr := el.getBoundingClientRect;\r\n ctop := Round(cr.Top + 1);\r\n end;\r\n end;\r\n\r\n FIsAligning := true;\r\n\r\n if not Assigned(AControl) then\r\n Exit;\r\n\r\n eh := AControl.ElementHandle;\r\n\r\n if Assigned(eh) then\r\n begin\r\n ovf := AControl.GetElementStyle.getPropertyValue('overflow');\r\n ovfx := AControl.GetElementStyle.getPropertyValue('overflow-x');\r\n ovfy := AControl.GetElementStyle.getPropertyValue('overflow-y');\r\n if ClipChildren then\r\n AControl.GetElementStyle.setProperty('overflow', 'hidden')\r\n else\r\n AControl.GetElementStyle.setProperty('overflow', '');\r\n end;\r\n\r\n r := GetClientRect;\r\n\r\n if (r.Bottom + ctop > WinHeight) then\r\n begin\r\n if (Assigned(Parent) and (Parent is TCustomForm)) or (Self is TCustomForm) then\r\n begin\r\n r.Bottom := WinHeight - ctop;\r\n end;\r\n end;\r\n\r\n if Assigned(eh) and (eh.tagName = 'BODY') then\r\n begin\r\n vscrl := 0;\r\n\r\n if (document.body.scrollHeight > document.body.clientHeight) and not (csDesigning in ComponentState) then\r\n vscrl := 16;\r\n\r\n if frm.FormContainer <> '' then\r\n begin\r\n r.Bottom := Round(Min(r.Bottom , WinHeight));\r\n r.Right := Round(Min(r.Right - vscrl, WinWidth));\r\n end\r\n else\r\n begin\r\n r.Bottom := frm.Height;\r\n r.Right := frm.Width;\r\n end;\r\n end;\r\n\r\n // limit size to browser window size anyway\r\n if AControl is TCustomForm then\r\n begin\r\n if r.Bottom > WinHeight then\r\n r.Bottom := WinHeight;\r\n\r\n if r.Right > WinWidth then\r\n r.Right := WinWidth;\r\n end;\r\n\r\n if AControl.IsStructuralElement then\r\n begin\r\n r := Parent.GetClientRect;\r\n end;\r\n\r\n AlignControls(AControl, r);\r\n\r\n if Assigned(eh) then\r\n begin\r\n AControl.GetElementStyle.setProperty('overflow', ovf);\r\n AControl.GetElementStyle.setProperty('overflow-x', ovfx);\r\n AControl.GetElementStyle.setProperty('overflow-y', ovfy);\r\n end;\r\n\r\n FIsAligning := false;\r\nend;\r\n\r\nprocedure TControl.DblClick;\r\nbegin\r\n if Assigned(OnDblClick) then\r\n OnDblClick(Self);\r\nend;\r\n\r\ndestructor TControl.Destroy;\r\nbegin\r\n UnbindEvents;\r\n DestroyControls;\r\n\r\n if Assigned(Container) and Assigned(Parent) and Assigned(Parent.GetChildContainer) then\r\n begin\r\n if Parent.GetChildContainer = Container.parentNode then\r\n begin\r\n Parent.GetChildContainer.removeChild(Container);\r\n end;\r\n\r\n Container := nil;\r\n Parent := nil;\r\n FControlCreated := False;\r\n end;\r\n\r\n FRequiredScripts.Free;\r\n FMargins.Free;\r\n FFont.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TControl.DestroyControls;\r\nvar\r\n i: integer;\r\n ctrl: TControl;\r\nbegin\r\n for i := ControlCount - 1 downto 0 do\r\n begin\r\n ctrl := Controls[i];\r\n ctrl.Free;\r\n end;\r\nend;\r\n\r\nprocedure TControl.DisableDrag;\r\nbegin\r\n if Assigned(Container) and (Container['draggable'] = 'true') then\r\n Container['draggable'] := 'false';\r\nend;\r\n\r\nprocedure TControl.DisableTab;\r\nvar\r\n i: integer;\r\nbegin\r\n if not (TabStop and CanFocus) then\r\n begin\r\n if Assigned(Container) then\r\n Container.setAttribute('tabindex','-1');\r\n end;\r\n\r\n for i := 0 to ControlCount - 1 do\r\n begin\r\n Controls[i].DisableTab;\r\n end;\r\nend;\r\n\r\nprocedure TControl.DisposeOf;\r\nvar\r\n t: TControl;\r\nbegin\r\n t := Self;\r\n t.Free;\r\nend;\r\n\r\nprocedure TControl.Assign(Source: TPersistent);\r\nbegin\r\n\r\nend;\r\n\r\nfunction TControl.GetElement: TJSElement;\r\nbegin\r\n Result := document.getElementByID(GetID);\r\nend;\r\n\r\nfunction TControl.GetElementBindHandle: TJSEventTarget;\r\nbegin\r\n Result := TJSEventTarget(GetElementHandle);\r\nend;\r\n\r\nfunction TControl.GetElementEvent: TJSEvent;\r\nbegin\r\n Result := FElementEvent;\r\nend;\r\n\r\nprocedure TControl.SetEnabled(Value: Boolean);\r\nbegin\r\n if (FEnabled <> Value) then\r\n begin\r\n FEnabled := Value;\r\n UpdateElementData;\r\n end;\r\nend;\r\n\r\nprocedure TControl.SetVisible(AValue: Boolean);\r\nbegin\r\n if (FVisible <> AValue) then\r\n begin\r\n VisibleChanging;\r\n FVisible := AValue;\r\n UpdateElement;\r\n DoRealign;\r\n AlignControl(Self);\r\n VisibleChanged;\r\n end;\r\nend;\r\n\r\nprocedure TControl.SetWidth(AValue: Integer);\r\nbegin\r\n if (FWidth <> AValue) then\r\n begin\r\n FWidth := AValue;\r\n\r\n ResetAnchoring;\r\n DoBoundsChange;\r\n\r\n // still do element height updating at runtime\r\n if IsLinked and not IsUpdating and Assigned(ElementHandle) then\r\n begin\r\n if AValue >= 0 then\r\n GetElementStyle.setProperty('width',IntTostr(AValue))\r\n else\r\n GetElementStyle.removeProperty('width');\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TControl.SetWidthPercent(const Value: TPercentSize);\r\nbegin\r\n if (FWidthPercent <> Value) then\r\n begin\r\n FWidthPercent := Value;\r\n UpdateElementSize;\r\n ResetAnchoring;\r\n DoBoundsChange;\r\n end;\r\nend;\r\n\r\nprocedure TControl.SetWidthStyle(const Value: TSizeStyle);\r\nbegin\r\n if (FWidthStyle <> Value) then\r\n begin\r\n FWidthStyle := Value;\r\n\r\n if (FWidthStyle = ssAuto) and Assigned(ElementHandle) then\r\n GetElementStyle.removeProperty('width');\r\n\r\n UpdateElementSize;\r\n ResetAnchoring;\r\n DoBoundsChange;\r\n end;\r\nend;\r\n\r\nprocedure TControl.Show;\r\nbegin\r\n Visible := true;\r\nend;\r\n\r\nprocedure TControl.StopPropagation;\r\nbegin\r\n if Assigned(ElementEvent) and not EnablePropagation then\r\n ElementEvent.stopPropagation;\r\nend;\r\n\r\nprocedure TControl.TouchCancel(X, Y: Integer);\r\nbegin\r\n if Assigned(OnTouchCancel) then\r\n OnTouchCancel(Self, X, Y);\r\nend;\r\n\r\nprocedure TControl.TouchEnd(X, Y: Integer);\r\nbegin\r\n if Assigned(OnTouchEnd) then\r\n OnTouchEnd(Self, X, Y);\r\nend;\r\n\r\nprocedure TControl.TouchMove(X, Y: Integer);\r\nbegin\r\n if Assigned(OnTouchMove) then\r\n OnTouchMove(Self, X, Y);\r\nend;\r\n\r\nprocedure TControl.TouchStart(X, Y: Integer);\r\nbegin\r\n if Assigned(OnTouchStart) then\r\n OnTouchStart(Self, X, Y);\r\nend;\r\n\r\nprocedure TControl.SetHeight(AValue: Integer);\r\nvar\r\n dr: TJSDOMRect;\r\nbegin\r\n if FHeight <> AValue then\r\n begin\r\n if (Align in [alLeft, alRight, alClient]) and Assigned(ElementHandle) then\r\n begin\r\n dr := ElementHandle.getBoundingClientRect;\r\n if dr.top + AValue >= WinHeight then\r\n begin\r\n AValue := Round(WinHeight - dr.top);\r\n end;\r\n end;\r\n\r\n FHeight := AValue;\r\n\r\n ResetAnchoring;\r\n DoBoundsChange;\r\n\r\n // still do element height updating at runtime\r\n if IsLinked and not IsUpdating and Assigned(ElementHandle) then\r\n begin\r\n if AValue >= 0 then\r\n GetElementStyle.setProperty('height',IntTostr(AValue))\r\n else\r\n GetElementStyle.removeProperty('height');\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TControl.SetHeightPercent(const Value: TPercentSize);\r\nbegin\r\n if (FHeightPercent <> Value) then\r\n begin\r\n FHeightPercent := Value;\r\n UpdateElementSize;\r\n ResetAnchoring;\r\n DoBoundsChange;\r\n end;\r\nend;\r\n\r\nprocedure TControl.SetHeightStyle(const Value: TSizeStyle);\r\nbegin\r\n if (FHeightStyle <> Value) then\r\n begin\r\n FHeightStyle := Value;\r\n\r\n if (FHeightStyle = ssAuto) and Assigned(ElementHandle) then\r\n GetElementStyle.removeProperty('height');\r\n\r\n UpdateElementSize;\r\n ResetAnchoring;\r\n DoBoundsChange;\r\n end;\r\nend;\r\n\r\nprocedure TControl.SetLeft(AValue: Integer);\r\nbegin\r\n if FLeft <> AValue then\r\n begin\r\n FLeft := AValue;\r\n\r\n ResetAnchoring;\r\n\r\n if not FUpdateTopLeft then\r\n FOrigLeft := AValue;\r\n\r\n UpdateElementSize;\r\n RecreateCanvas;\r\n InternalResize;\r\n\r\n if not (csLoading in ComponentState) and (Align <> alNone) and Assigned(Parent) then\r\n begin\r\n DoRealign;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TControl.SetMargins(const Value: TMargins);\r\nbegin\r\n FMargins.Assign(Value);\r\nend;\r\n\r\nprocedure TControl.SetTop(AValue: Integer);\r\nbegin\r\n if FTop <> AValue then\r\n begin\r\n FTop := AValue;\r\n\r\n ResetAnchoring;\r\n\r\n if not FUpdateTopLeft then\r\n FOrigTop := AValue;\r\n\r\n UpdateElementSize;\r\n RecreateCanvas;\r\n InternalResize;\r\n\r\n if not (csLoading in ComponentState) and (Align <> alNone) and Assigned(Parent) then\r\n begin\r\n DoRealign;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TControl.SetScriptLoaded(const Value: boolean);\r\nbegin\r\n FScriptLoaded := Value;\r\nend;\r\n\r\nprocedure TControl.SetShowFocus(const Value: boolean);\r\nbegin\r\n if (FShowFocus <> Value) then\r\n begin\r\n FShowFocus := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TControl.SetShowHint(AValue: Boolean);\r\nbegin\r\n if FShowHint <> AValue then\r\n begin\r\n FShowHint := AValue;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TControl.SetHint(AValue: string);\r\nbegin\r\n if FHint <> AValue then\r\n begin\r\n FHint := AValue;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TControl.SetID(const Value: string);\r\nvar\r\n eh: TJSElement;\r\n frm: TCustomForm;\r\n p: TComponent;\r\n l,t: integer;\r\nbegin\r\n // it was a new created control and now going to be a HTML element wrapper\r\n\r\n if FNew and (FID <> Value) then\r\n begin\r\n // switch to template element - so find it\r\n eh := document.getElementById(Value);\r\n if Assigned(eh) then\r\n begin\r\n l := FLeft;\r\n t := FTop;\r\n\r\n // unbind event handlers from created control\r\n UnbindEvents;\r\n\r\n if Assigned(FContainer) then\r\n begin\r\n // remember previous HTML parent element\r\n FParentElement := TJSHTMLElement(FContainer.parentElement);\r\n end;\r\n\r\n p := Parent;\r\n\r\n // remove created control\r\n Parent := nil;\r\n\r\n // create wrapper for HTML element\r\n CreateWithID(Value);\r\n\r\n // add it back as child\r\n SetParentComponent(p);\r\n\r\n FID := Value;\r\n\r\n // perform update to set wrapper properties to HTML element\r\n UpdateElement;\r\n\r\n // keep Left,Top at design-time for Delphi compatibility\r\n if (csDesigning in ComponentState) then\r\n begin\r\n FLeft := l;\r\n FTop := t;\r\n end;\r\n Exit;\r\n end;\r\n end;\r\n\r\n // it is a wrapped control and now going to be a new created control\r\n\r\n if not FNew and (FID <> Value) then\r\n begin\r\n // unbind event handlers from wrapped HTML element\r\n eh := document.getElementById(FID);\r\n if Assigned(eh) then\r\n begin\r\n UnbindEvents;\r\n DestroyControls;\r\n end;\r\n\r\n if (Value <> '') then\r\n begin\r\n eh := document.getElementById(Value);\r\n // wrap another HTML element\r\n if Assigned(eh) then\r\n begin\r\n CreateWithID(Value);\r\n FID := Value;\r\n UpdateElement;\r\n Exit;\r\n end;\r\n end;\r\n\r\n // create new control\r\n FNew := true;\r\n FElement := nil;\r\n\r\n CreateControl;\r\n if Value = '' then\r\n CreateInitialize;\r\n\r\n if Assigned(FParentElement) then\r\n begin\r\n FParentElement.appendChild(Container);\r\n end\r\n else\r\n document.body.appendChild(Container);\r\n\r\n frm := GetParentForm(Self); //Application.ActiveForm;\r\n if Assigned(frm) then\r\n begin\r\n Parent := frm;\r\n ElementPosition := epAbsolute;\r\n Left := 0;\r\n Top := 0;\r\n end;\r\n\r\n // perform update to set instance properties to control\r\n UpdateElement;\r\n end;\r\n\r\n FID := Value;\r\n if Assigned(FContainer) then\r\n FContainer['id'] := Value;\r\nend;\r\n\r\nprocedure TControl.SetTabOrder(AValue: Integer);\r\nbegin\r\n if FTabOrder <> AValue then\r\n begin\r\n FTabOrder := AValue;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TControl.SetTabStop(AValue: Boolean);\r\nbegin\r\n if FTabStop <> AValue then\r\n begin\r\n FTabStop := AValue;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nfunction TControl.SaveState: string;\r\nbegin\r\n Result := '';\r\nend;\r\n\r\nfunction TControl.ScreenToClient(const Point: TPoint): TPoint;\r\nvar\r\n Origin: TPoint;\r\nbegin\r\n Origin := ClientOrigin;\r\n Result.X := Point.X - Origin.X;\r\n Result.Y := Point.Y - Origin.Y;\r\nend;\r\n\r\nprocedure TControl.SendToBack;\r\nbegin\r\n if Assigned(ElementHandle) and Assigned(ElementHandle.parentElement) then\r\n begin\r\n ElementHandle.parentElement.insertBefore(ElementHandle, ElementHandle.parentElement.firstElementChild);\r\n //if not ((ElementPosition <> epAbsolute) or IsLinked) then\r\n // ElementHandle.style.setProperty(CSSZIndex, '0');\r\n\r\n if Assigned(Parent) then\r\n Parent.MoveFirst(Self);\r\n end\r\nend;\r\n\r\n\r\nprocedure TControl.BeginDrag;\r\nbegin\r\n EnableDrag;\r\nend;\r\n\r\nprocedure TControl.BeginUpdate;\r\nbegin\r\n inc(FUpdateCount);\r\nend;\r\n\r\nprocedure TControl.Invalidate;\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TControl.EnableDrag;\r\nbegin\r\n if Assigned(Container) then\r\n Container['draggable'] := 'true';\r\nend;\r\n\r\nprocedure TControl.EnableTab;\r\nvar\r\n i: integer;\r\nbegin\r\n if Assigned(FContainer) then\r\n begin\r\n if TabStop and CanFocus then\r\n begin\r\n FContainer['tabindex'] := IntToStr(TabOrder + 1)\r\n end\r\n else\r\n begin\r\n FContainer['tabindex'] := '-1';\r\n end;\r\n end;\r\n\r\n for i := 0 to ControlCount - 1 do\r\n begin\r\n Controls[i].EnableTab;\r\n end;\r\nend;\r\n\r\nprocedure TControl.EndUpdate;\r\nbegin\r\n if (FUpdateCount > 0) then\r\n begin\r\n dec(FUpdateCount);\r\n\r\n if FUpdateCount = 0 then\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nfunction TControl.EventsBound: boolean;\r\nbegin\r\n Result := Assigned(FWheelPtr);\r\nend;\r\n\r\nfunction TControl.IsUpdating: boolean;\r\nbegin\r\n Result := FUpdateCount > 0;\r\nend;\r\n\r\nprocedure TControl.SetAlign(const Value: TAlign);\r\nbegin\r\n if FAlign <> Value then\r\n begin\r\n FAlign := Value;\r\n DoRealign;\r\n end;\r\nend;\r\n\r\nprocedure TControl.SetAlignWithMargins(const Value: boolean);\r\nbegin\r\n if FAlignWithMargins <> Value then\r\n begin\r\n FAlignWithMargins := Value;\r\n DoRealign;\r\n end;\r\nend;\r\n\r\nprocedure TControl.SetBiDiMode(const Value: TBiDiMode);\r\nbegin\r\n if Assigned(ElementHandle) then\r\n begin\r\n if (Value = bdLeftToRight) then\r\n ElementHandle.removeAttribute('dir')\r\n else\r\n ElementHandle.setAttribute('dir','rtl');\r\n end;\r\nend;\r\n\r\nprocedure TControl.DoMarginsChanged(Sender: TObject);\r\nbegin\r\n DoRealign;\r\nend;\r\n\r\nprocedure TControl.DoRealign;\r\nbegin\r\n if Assigned(Parent) and not Parent.IsUpdating then\r\n begin\r\n Parent.AlignControl(Parent);\r\n end;\r\nend;\r\n\r\nprocedure TControl.SetAnchors(const Value: TAnchors);\r\nbegin\r\n if (FAnchors <> Value) then\r\n begin\r\n FAnchors := Value;\r\n if not (csLoading in ComponentState) then\r\n UpdateAnchoring;\r\n end;\r\nend;\r\n\r\nprocedure TControl.SetBorderWidth(const Value: integer);\r\nbegin\r\n if (FBorderWidth <> Value) then\r\n begin\r\n FBorderWidth := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TControl.SetBoundsInt(X, Y, AWidth, AHeight: Integer);\r\nbegin\r\n if (X <> Left) or (Y <> Top) or (AWidth <> Width) or (AHeight <> Height) then\r\n begin\r\n FBlockUpdateElement := True;\r\n FLeft := X;\r\n FTop := Y;\r\n\r\n FWidth := AWidth;\r\n FHeight := AHeight;\r\n\r\n FBlockUpdateElement := False;\r\n\r\n UpdateElementSize;\r\n\r\n if Align <> alNone then\r\n DoRealign\r\n else\r\n Realign;\r\n\r\n RecreateCanvas;\r\n DoBoundsChange;\r\n Invalidate;\r\n UpdateChildAnchoring;\r\n end;\r\nend;\r\n\r\nprocedure TControl.SetBounds(X, Y, AWidth, AHeight: Integer);\r\nbegin\r\n SetBoundsInt(X, Y, AWidth, AHeight);\r\n FWidth := AWidth;\r\n FHeight := AHeight;\r\n\r\n if not FUpdateTopLeft then\r\n begin\r\n FOrigTop := Y;\r\n FOrigLeft := X;\r\n end;\r\n\r\n ResetAnchoring;\r\n\r\n if not (csLoading in ComponentState) and (Align <> alNone) and Assigned(Parent) then\r\n begin\r\n DoRealign;\r\n end;\r\nend;\r\n\r\nprocedure TControl.SetBoundsRect(const Value: TRect);\r\nbegin\r\n SetBoundsInt(Value.Left, Value.Top, Value.Right - Value.Left, Value.Bottom - Value.Top);\r\nend;\r\n\r\nprocedure TControl.SetElementClassName(AValue: string);\r\nbegin\r\n if (FElementClassName <> AValue) then\r\n begin\r\n FElementClassName := AValue;\r\n if Assigned(FContainer) then\r\n FContainer['class'] := AValue;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TControl.SetElementColor(AElement: TJSHTMLElement; AColor: TColor);\r\nvar\r\n noCSS: boolean;\r\nbegin\r\n noCSS := (not Application.Themed and not (ElementClassName <> ''));\r\n\r\n if not IsLinked then\r\n SetHTMLElementColor(AElement, AColor, not noCSS);\r\nend;\r\n\r\nprocedure TControl.SetElementFont(const Value: TElementFont);\r\nbegin\r\n if (FElementFont <> Value) then\r\n begin\r\n FElementFont := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TControl.SetElementPointer(AElement: TJSHTMLElement;\r\n ACursor: TCursor);\r\nbegin\r\n if ACursor <> crDefault then\r\n AElement.style.setProperty('cursor', GetHTMLCursorName(ACursor))\r\n else\r\n AElement.style.removeProperty('cursor');\r\nend;\r\n\r\nprocedure TControl.SetElementPosition(const Value: TElementPosition);\r\nbegin\r\n if (FElementPosition <> Value) then\r\n begin\r\n FElementPosition := Value;\r\n if Assigned(ElementHandle) then\r\n begin\r\n UpdateElementSize;\r\n RecreateCanvas;\r\n InternalResize;\r\n end;\r\n end;\r\nend;\r\n\r\n\r\n{$HINTS OFF}\r\nprocedure TControl.SetFocus;\r\nvar\r\n e: TJSHTMLElement;\r\nbegin\r\n if not CanFocus then\r\n Exit;\r\n\r\n if Assigned(ElementHandle) then\r\n begin\r\n e := ElementHandle;\r\n if FGotFocus then\r\n begin\r\n asm\r\n e.focus();\r\n end;\r\n end\r\n else\r\n begin\r\n asm\r\n setTimeout(function() {e.focus();}, 1);\r\n end;\r\n end;\r\n end;\r\nend;\r\n{$HINTS ON}\r\n\r\nprocedure TControl.SetFont(AValue: TFont);\r\nbegin\r\n FFont.Name := AValue.Name;\r\n FFont.Size := AValue.Size;\r\n FFont.Style := AValue.Style;\r\n FFont.Color := AValue.Color;\r\nend;\r\n\r\nprocedure TControl.SetChildOrderEx(const Value: integer);\r\nbegin\r\n FChildOrder := Value;\r\nend;\r\n\r\nprocedure TControl.SetClientHeight(const Value: Integer);\r\nbegin\r\n Height := Value;\r\nend;\r\n\r\nprocedure TControl.SetClientWidth(const Value: Integer);\r\nbegin\r\n Width := Value;\r\nend;\r\n\r\nprocedure TControl.SetClipChildren(const Value: Boolean);\r\nbegin\r\n FClipChildren := Value;\r\n UpdateElement;\r\nend;\r\n\r\nprocedure TControl.SetColor(AValue: TColor);\r\nbegin\r\n FColor := AValue;\r\n UpdateElement;\r\n ColorChanging;\r\nend;\r\n\r\nprocedure TControl.SetControlCursor(const Value: TCursor);\r\nbegin\r\n FCursor := Value;\r\n\r\n if (ElementClassName = '') and Assigned(ElementHandle) then\r\n begin\r\n SetElementPointer(ElementHandle, Value);\r\n end;\r\nend;\r\n\r\nprocedure TControl.SetDragMode(const Value: TDragMode);\r\nbegin\r\n FDragMode := Value;\r\n if Value = dmAutomatic then\r\n BeginDrag\r\n else\r\n DisableDrag;\r\nend;\r\n\r\nfunction TControl.GetID: string;\r\nbegin\r\n Result := FID;\r\nend;\r\n\r\nfunction TControl.GetIsLinked: boolean;\r\nbegin\r\n Result := not FNew;\r\nend;\r\n\r\nfunction TControl.GetElementHandle: TJSHTMLElement;\r\nbegin\r\n Result := nil;\r\n if Assigned(FContainer) and FControlCreated then\r\n Result := TJSHTMLElement(FContainer);\r\nend;\r\n\r\nfunction TControl.GetMouseEventButton(Event: TJSMouseEvent): TMouseButton;\r\nbegin\r\n Result := mbLeft;\r\n case Event.button of\r\n 0: Result := mbLeft;\r\n 1: Result := mbMiddle;\r\n 2: Result := mbRight;\r\n end;\r\nend;\r\n\r\nfunction TControl.GetMouseEventShiftState(Event: TJSMouseEvent): TShiftState;\r\nbegin\r\n Result := [];\r\n if Event.shiftKey then\r\n Result := Result + [ssShift];\r\n\r\n if Event.ctrlKey then\r\n Result := Result + [ssCtrl];\r\n\r\n if Event.altKey then\r\n Result := Result + [ssAlt];\r\n\r\n if Event.buttons and 1 = 1 then\r\n Result := Result + [ssLeft];\r\n\r\n if Event.buttons and 2 = 2 then\r\n Result := Result + [ssRight];\r\n\r\n if Event.buttons and 4 = 4 then\r\n Result := Result + [ssMiddle];\r\nend;\r\n\r\nfunction TControl.GetMouseWheelEventShiftState(\r\n Event: TJSWheelEvent): TShiftState;\r\nbegin\r\n Result := [];\r\n if Event.shiftKey then\r\n Result := Result + [ssShift];\r\n if Event.ctrlKey then\r\n Result := Result + [ssCtrl];\r\n if Event.altKey then\r\n Result := Result + [ssAlt];\r\nend;\r\n\r\nfunction TControl.GetNewName: string;\r\nvar\r\n s: string;\r\n lPrefix: string;\r\n frm: TCustomForm;\r\nbegin\r\n s := ClassName;\r\n Delete(s, 1, 1);\r\n\r\n lPrefix := '';\r\n\r\n frm := GetParentForm(Self);\r\n if Assigned(frm) then\r\n lPrefix := frm.ClassName;\r\n\r\n Result := lPrefix+'_'+FindUniqueName(s);\r\nend;\r\n\r\nfunction TControl.GetOuterHeight: integer;\r\nbegin\r\n Result := FHeight - FBorderWidth;\r\nend;\r\n\r\nfunction TControl.GetOuterWidth: integer;\r\nbegin\r\n Result := FWidth - FBorderWidth;\r\nend;\r\n\r\nfunction TControl.GetRole: string;\r\nbegin\r\n Result := FRole;\r\n if Assigned(ElementHandle) then\r\n Result := ElementHandle.getAttribute('role');\r\nend;\r\n\r\nfunction TControl.GetElementStyle: TJSCSSStyleDeclaration;\r\nbegin\r\n Result := ElementHandle.style;\r\nend;\r\n\r\nfunction TControl.GetStyle(css: string): string;\r\nvar\r\n res: string;\r\n el: TJSElement;\r\nbegin\r\n el := ElementHandle;\r\n res := '';\r\n\r\n if not Assigned(el) then\r\n Exit;\r\n\r\n asm\r\n if (window.getComputedStyle) res = getComputedStyle(el, '')[css];\r\n if(el.currentStyle) res = el.currentStyle[css];\r\n\r\n end;\r\n Result := res;\r\nend;\r\n\r\nfunction TControl.GetKeyboardEventShiftState(Event: TJSKeyboardEvent): TShiftState;\r\nbegin\r\n Result := [];\r\n if Event.shiftKey then\r\n Result := Result + [ssShift];\r\n if Event.ctrlKey then\r\n Result := Result + [ssCtrl];\r\n if Event.altKey then\r\n Result := Result + [ssAlt];\r\nend;\r\n\r\nprocedure TControl.ClearMethodPointers;\r\nbegin\r\n FWheelPtr := nil;\r\n FClickPtr := nil;\r\n FDblClickPtr := nil;\r\n FMouseDownPtr := nil;\r\n FMouseUpPtr := nil;\r\n FMouseMovePtr := nil;\r\n FMouseLeavePtr := nil;\r\n FMouseEnterPtr := nil;\r\n FKeyDownPtr := nil;\r\n FKeyUpPtr := nil;\r\n FKeypressPtr := nil;\r\n FInputPtr := nil;\r\n FEnterPtr := nil;\r\n FExitPtr := nil;\r\n FTouchStartPtr := nil;\r\n FTouchEndPtr := nil;\r\n FTouchMovePtr := nil;\r\n FTouchCancelPtr := nil;\r\n FLayerMouseLeavePtr := nil;\r\n FLayerMouseEnterPtr := nil;\r\n FScriptLoadedPtr := nil;\r\n FContextMenuPtr := nil;\r\nend;\r\n\r\nprocedure TControl.GetMethodPointers;\r\nbegin\r\n if FWheelPtr = nil then\r\n begin\r\n FWheelPtr := @HandleDoWheel;\r\n FClickPtr := @HandleDoClick;\r\n FDblClickPtr := @HandleDoDblClick;\r\n FMouseDownPtr := @HandleDoMouseDown;\r\n FMouseUpPtr := @HandleDoMouseUp;\r\n FMouseMovePtr := @HandleDoMouseMove;\r\n FMouseLeavePtr := @HandleDoMouseLeave;\r\n FMouseEnterPtr := @HandleDoMouseEnter;\r\n FKeyDownPtr := @HandleDoKeyDown;\r\n FKeyUpPtr := @HandleDoKeyUp;\r\n FKeypressPtr := @HandleDoKeyPress;\r\n FInputPtr := @HandleDoInput;\r\n FEnterPtr := @HandleDoEnter;\r\n FExitPtr := @HandleDoExit;\r\n FTouchStartPtr := @HandleDoTouchStart;\r\n FTouchEndPtr := @HandleDoTouchEnd;\r\n FTouchMovePtr := @HandleDoTouchMove;\r\n FTouchCancelPtr := @HandleDoTouchCancel;\r\n FLayerMouseLeavePtr := @LayerHandleDoMouseLeave;\r\n FLayerMouseEnterPtr := @LayerHandleDoMouseEnter;\r\n FScriptLoadedPtr := @RequiredScriptLoaded;\r\n FDragStartPtr := @HandleDoDragStart;\r\n FDragOverPtr := @HandleDoDragOver;\r\n FDragEnterPtr := @HandleDoDragEnter;\r\n FDragLeavePtr := @HandledoDragLeave;\r\n FDragEndPtr := @HandleDoDragEnd;\r\n FDragDropPtr := @HandleDoDragDrop;\r\n FContextMenuPtr := @HandleDoContextMenu;\r\n end;\r\nend;\r\n\r\nprocedure TControl.BindEvents;\r\nvar\r\n eh: TJSEventTarget;\r\nbegin\r\n if Assigned(ElementBindHandle) then\r\n begin\r\n GetMethodPointers;\r\n eh := ElementBindHandle;\r\n eh.addEventListener('wheel', FWheelPtr);\r\n eh.addEventListener('click', FClickPtr);\r\n eh.addEventListener('dblclick', FDblClickPtr);\r\n eh.addEventListener('mousedown', FMouseDownPtr);\r\n eh.addEventListener('mouseup', FMouseUpPtr);\r\n eh.addEventListener('mousemove', FMouseMovePtr);\r\n eh.addEventListener('mouseleave', FMouseLeavePtr);\r\n eh.addEventListener('mouseenter', FMouseEnterPtr);\r\n eh.addEventListener('keydown', FKeyDownPtr);\r\n eh.addEventListener('keyup', FKeyUpPtr);\r\n eh.addEventListener('keypress', FKeyPressPtr);\r\n eh.addEventListener('input', FInputPtr);\r\n eh.addEventListener('focus', FEnterPtr);\r\n eh.addEventListener('blur', FExitPtr);\r\n\r\n eh.addEventListener('touchstart', FTouchStartPtr);\r\n eh.addEventListener('touchmove', FTouchMovePtr);\r\n eh.addEventListener('touchend', FTouchEndPtr);\r\n eh.addEventListener('touchcancel', FTouchCancelPtr);\r\n\r\n eh.addEventListener('contextmenu', FContextMenuPtr);\r\n\r\n eh.addEventListener('dragstart', FDragStartPtr);\r\n eh.addEventListener('dragover', FDragOverPtr);\r\n eh.addEventListener('dragenter', FDragEnterPtr);\r\n eh.addEventListener('dragleave', FDragLeavePtr);\r\n eh.addEventListener('dragend', FDragEndPtr);\r\n eh.addEventListener('drop', FDragDropPtr);\r\n end;\r\nend;\r\n\r\nprocedure TControl.BringToFront;\r\nbegin\r\n if Assigned(ElementHandle) and Assigned(ElementHandle.parentElement) then\r\n begin\r\n try\r\n ElementHandle.parentElement.appendChild(ElementHandle);\r\n if Assigned(Parent) then\r\n Parent.MoveLast(Self);\r\n except\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TControl.GetChildContainer: TJSElement;\r\nbegin\r\n Result := FContainer;\r\nend;\r\n\r\nprocedure TControl.GetChildren(Proc: TGetChildProc; Root: TComponent);\r\nvar\r\n I: Integer;\r\n Control: TControl;\r\nbegin\r\n for I := 0 to ControlCount - 1 do\r\n begin\r\n Control := Controls[I];\r\n if (Control.Owner = Root) or (Root = nil) then\r\n Proc(Control);\r\n end;\r\nend;\r\n\r\nfunction TControl.GetClientHeight: Integer;\r\nbegin\r\n Result := Height;\r\nend;\r\n\r\nfunction TControl.GetClientOrigin: TPoint;\r\nvar\r\n r: TJSDomRect;\r\nbegin\r\n Result := Point(0, 0);\r\n if Assigned(ElementHandle) then\r\n begin\r\n r := ElementHandle.getBoundingClientRect;\r\n Result := Point(Round(r.Left), Round(r.Top));\r\n end;\r\nend;\r\n\r\nfunction TControl.GetClientRect: TRect;\r\nvar\r\n css: string;\r\n p,brdr: integer;\r\nbegin\r\n css := Uppercase(GetStyle('border-width'));\r\n brdr := 0;\r\n\r\n p := pos('PX',css);\r\n if p > 0 then\r\n begin\r\n delete(css,p,2);\r\n val(css, brdr, p);\r\n end;\r\n\r\n Result := Rect(0, 0, GetWidth - 2* brdr, GetHeight - 2*brdr);\r\nend;\r\n\r\nfunction TControl.GetClientWidth: Integer;\r\nbegin\r\n Result := Width;\r\nend;\r\n\r\nfunction TControl.GetKeyCode(AValue: string; IgnoreCase: boolean = true): Integer;\r\nvar\r\n i: Integer;\r\nbegin\r\n i := -1;\r\n\r\n case AValue of\r\n 'Up': i := 38;\r\n 'Down': i := 40;\r\n 'Left': i := 37;\r\n 'Right': i := 39;\r\n TJSKeyNames.BackSpace: i := 8;\r\n TJSKeyNames.Tab: i := 9;\r\n TJSKeyNames.Enter: i := 13;\r\n TJSKeyNames.Shift: i := 16;\r\n TJSKeyNames.Control: i := 17;\r\n TJSKeyNames.Alt: i := 18;\r\n TJSKeyNames.Pause: i := 19;\r\n TJSKeyNames.CapsLock: i := 20;\r\n TJSKeyNames.Escape: i := 27;\r\n TJSKeyNames.PageUp: i := 33;\r\n TJSKeyNames.PageDown: i := 34;\r\n TJSKeyNames._End: i := 35;\r\n TJSKeyNames.Home: i := 36;\r\n TJSKeyNames.ArrowLeft: i := 37;\r\n TJSKeyNames.ArrowUp: i := 38;\r\n TJSKeyNames.ArrowRight: i := 39;\r\n TJSKeyNames.ArrowDown: i := 40;\r\n TJSKeyNames.Insert: i := 45;\r\n TJSKeyNames.Delete: i := 46;\r\n\r\n TJSKeyNames.F1: i := 112;\r\n TJSKeyNames.F2: i := 113;\r\n TJSKeyNames.F3: i := 114;\r\n TJSKeyNames.F4: i := 115;\r\n TJSKeyNames.F5: i := 116;\r\n TJSKeyNames.F6: i := 117;\r\n TJSKeyNames.F7: i := 118;\r\n TJSKeyNames.F8: i := 119;\r\n TJSKeyNames.F9: i := 120;\r\n TJSKeyNames.F10: i := 121;\r\n TJSKeyNames.F11: i := 122;\r\n TJSKeyNames.F12: i := 123;\r\n TJSKeyNames.F13: i := 124;\r\n TJSKeyNames.F14: i := 125;\r\n TJSKeyNames.F15: i := 126;\r\n TJSKeyNames.F16: i := 127;\r\n TJSKeyNames.F17: i := 128;\r\n TJSKeyNames.F18: i := 129;\r\n TJSKeyNames.F19: i := 130;\r\n TJSKeyNames.F20: i := 131;\r\n else\r\n begin\r\n if Assigned(AValue) and (Length(AValue) > 0) then\r\n begin\r\n i := Ord(AValue[1]);\r\n if IgnoreCase and (i >= 97) and (i <= 122) then\r\n i := i and $DF;\r\n end;\r\n end;\r\n end;\r\n\r\n Result := i;\r\nend;\r\n\r\nfunction TControl.GetLeft: Integer;\r\nbegin\r\n Result := FLeft;\r\n if (Result = -1) and Assigned(ElementHandle) and not (csLoading in ComponentState) then\r\n Result := Round(ElementHandle.offsetLeft);\r\nend;\r\n\r\nfunction TControl.GetTop: Integer;\r\nbegin\r\n Result := FTop;\r\n if (Result = -1) and Assigned(ElementHandle) and not (csLoading in ComponentState) then\r\n Result := Round(ElementHandle.offsetTop);\r\nend;\r\n\r\nfunction TControl.GetTouchEventShiftState(Event: TJSTouchEvent): TShiftState;\r\nbegin\r\n Result := [];\r\n if Event.shiftKey then\r\n Result := Result + [ssShift];\r\n if Event.ctrlKey then\r\n Result := Result + [ssCtrl];\r\n if Event.altKey then\r\n Result := Result + [ssAlt];\r\nend;\r\n\r\nfunction TControl.GetWebClassName: string;\r\nbegin\r\n Result := ClassName;\r\n Delete(Result, 1, 1);\r\n Result := 'TWeb' + Result;\r\nend;\r\n\r\nfunction TControl.GetWidth: Integer;\r\nvar\r\n cr: TJSDOMRect;\r\nbegin\r\n Result := FWidth;\r\n\r\n if Assigned(ElementHandle) and not (csLoading in ComponentState) then\r\n begin\r\n if (Result = -1) then\r\n begin\r\n Result := Round(Int(ElementHandle.offsetWidth));\r\n end;\r\n\r\n if (WidthStyle <> ssAbsolute) then\r\n begin\r\n cr := ElementHandle.getBoundingClientRect;\r\n Result := Round(Int(cr.Right - cr.Left));\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TControl.GetHeight: Integer;\r\nvar\r\n cr: TJSDOMRect;\r\nbegin\r\n Result := FHeight;\r\n\r\n if Assigned(ElementHandle) and not (csLoading in ComponentState) then\r\n begin\r\n if (Result = -1) then\r\n begin\r\n Result := Round(Int(ElementHandle.offsetHeight));\r\n end;\r\n\r\n if (HeightStyle <> ssAbsolute) then\r\n begin\r\n cr := ElementHandle.getBoundingClientRect;\r\n Result := Round(Int(cr.Bottom - cr.Top));\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TControl.KeyDown(var Key: Word; Shift: TShiftState);\r\nbegin\r\n if Assigned(OnKeyDown) then\r\n OnKeyDown(Self, Key, Shift);\r\nend;\r\n\r\nprocedure TControl.KeyPress(var Key: Char);\r\nbegin\r\n if Assigned(OnKeyPress) then\r\n OnKeyPress(Self, Key);\r\nend;\r\n\r\nprocedure TControl.KeyUp(var Key: Word; Shift: TShiftState);\r\nbegin\r\n if Assigned(OnKeyUp) then\r\n OnKeyUp(Self, Key, Shift);\r\nend;\r\n\r\nfunction TControl.LayerHandleDoMouseEnter(Event: TJSMouseEvent): Boolean;\r\nbegin\r\n if (Event.buttons = 0) and Captured and not FMouseInsideLayer then\r\n begin\r\n ReleaseCapture;\r\n HandleDoMouseUp(Event);\r\n HandleDoMouseLeave(Event);\r\n end;\r\n FMouseInsideLayer := True;\r\n Result := true;\r\nend;\r\n\r\nfunction TControl.LayerHandleDoMouseLeave(Event: TJSMouseEvent): Boolean;\r\nbegin\r\n FMouseInsideLayer := False;\r\n Result := true;\r\nend;\r\n\r\nprocedure TControl.Loaded;\r\nvar\r\n i: integer;\r\nbegin\r\n if not (csLoading in ComponentState) then\r\n Exit;\r\n\r\n inherited;\r\n\r\n for i := 0 to ControlCount - 1 do\r\n begin\r\n // handle relative child positions\r\n if (Controls[i].ElementPosition in [epRelative, epIgnore]) and not (Controls[i].IsLinked) and (Controls[i].ChildOrder >= 0) then\r\n begin\r\n if (Controls[i].ChildOrder < ChildContainer.childNodes.Length) then\r\n begin\r\n ChildContainer.insertBefore(Controls[i].Container, ChildContainer.childNodes[Controls[i].ChildOrder]);\r\n end;\r\n end;\r\n Controls[i].Loaded;\r\n end;\r\n\r\n // all remaining child controls set to Loaded\r\n for i := 0 to ComponentCount - 1 do\r\n begin\r\n if (csLoading in Components[i].ComponentState) then\r\n Components[i].Loaded;\r\n end;\r\n\r\n case Align of\r\n alClient:\r\n begin\r\n if Assigned(Parent) then\r\n SetBoundsInt(0, 0, Parent.FWidth, Parent.FHeight);\r\n end;\r\n end;\r\n\r\n Resize;\r\n UpdateElement;\r\nend;\r\n\r\nprocedure TControl.LoadFromHTML(const HTML: string);\r\nbegin\r\n if Assigned(ElementHandle) then\r\n ElementHandle.outerHTML := HTML;\r\nend;\r\n\r\nprocedure TControl.LoadState(AState: string);\r\nbegin\r\n\r\nend;\r\n\r\nfunction TControl.HandleAllocated: Boolean;\r\nbegin\r\n Result := True;\r\nend;\r\n\r\nfunction TControl.HandleDoClick(Event: TJSMouseEvent): Boolean;\r\nbegin\r\n FElementEvent := Event;\r\n if (eeClick in EventStopPropagation) then\r\n StopPropagation;\r\n if Enabled then\r\n Click;\r\n Result := True;\r\n FElementEvent := nil;\r\nend;\r\n\r\nfunction TControl.HandleDoContextMenu(Event: TJSMouseEvent): Boolean;\r\nbegin\r\n Result := true;\r\nend;\r\n\r\nfunction TControl.HandleDoDblClick(Event: TJSMouseEvent): Boolean;\r\nbegin\r\n FElementEvent := Event;\r\n if (eeDblClick in EventStopPropagation) then\r\n StopPropagation;\r\n if Enabled then\r\n DblClick;\r\n Result := True;\r\n FElementEvent := nil;\r\nend;\r\n\r\nfunction TControl.HandleDoDragDrop(Event: TJSDragEvent): Boolean;\r\nbegin\r\n FElementEvent := Event;\r\n Event.stopPropagation;\r\n if not FAcceptDrag then\r\n Event.preventDefault\r\n else\r\n begin\r\n if not IsInputControl then\r\n Event.preventDefault;\r\n DragDrop(DragObject, Event.clientX, Event.clientY);\r\n end;\r\n Result := FAcceptDrag;\r\n FElementEvent := nil;\r\nend;\r\n\r\nfunction TControl.HandleDoDragEnd(Event: TJSDragEvent): Boolean;\r\nbegin\r\n FElementEvent := Event;\r\n Event.stopPropagation;\r\n DoEndDrag(DragObject, Event.clientX, Event.clientY);\r\n Result := True;\r\n if (DragMode = dmManual) then\r\n DisableDrag;\r\n FElementEvent := nil;\r\nend;\r\n\r\nfunction TControl.HandleDoDragEnter(Event: TJSDragEvent): Boolean;\r\nbegin\r\n FElementEvent := Event;\r\n Event.stopPropagation;\r\n FAcceptDrag := IsInputControl;\r\n DragOver(DragObject, Event.clientX, Event.clientY, dsDragEnter, FAcceptDrag);\r\n if FAcceptDrag then\r\n Event.preventDefault;\r\n Result := not FAcceptDrag;\r\n FElementEvent := nil;\r\nend;\r\n\r\nfunction TControl.HandledoDragLeave(Event: TJSDragEvent): Boolean;\r\nbegin\r\n FElementEvent := Event;\r\n Event.stopPropagation;\r\n DragOver(DragObject, Event.clientX, Event.clientY, dsDragLeave, FAcceptDrag);\r\n Result := True;\r\n FElementEvent := nil;\r\nend;\r\n\r\nfunction TControl.HandleDoDragOver(Event: TJSDragEvent): Boolean;\r\nbegin\r\n FElementEvent := Event;\r\n Event.stopPropagation;\r\n DragOver(DragObject, Event.clientX, Event.clientY, dsDragMove, FAcceptDrag);\r\n if FAcceptDrag and (not IsInputControl or (Event.dataTransfer.items.length = 0)) then\r\n Event.preventDefault;\r\n Result := not FAcceptDrag;\r\n FElementEvent := nil;\r\nend;\r\n\r\nfunction TControl.HandleDoDragStart(Event: TJSDragEvent): Boolean;\r\nvar\r\n obj: TDragObject;\r\nbegin\r\n FElementEvent := Event;\r\n Event.stopPropagation;\r\n obj := nil;\r\n DoStartDrag(obj);\r\n if Assigned(obj) then\r\n DragObject := obj\r\n else\r\n DragObject := Self;\r\n Result := True;\r\nend;\r\n\r\n{$HINTS OFF}\r\n\r\nprocedure TControl.XYToClient(X,Y: single; var AClientX, AClientY: single);\r\nvar\r\n p: TControl;\r\n cr: TJSDOMRect;\r\n el: TJSHTMLElement;\r\n OrigX,OrigY: single;\r\n norel: boolean;\r\n r: TRect;\r\n cs: TJSCSSStyleDeclaration;\r\n csx, csy: integer;\r\n scrollx, scrolly: integer;\r\nbegin\r\n norel := True;\r\n\r\n scrollx := 0;\r\n scrolly := 0;\r\n\r\n if (ElementPosition = epAbsolute) then\r\n begin\r\n scrollx := document.body.scrollLeft + document.documentElement.scrollLeft;\r\n scrolly := document.body.scrollTop + document.documentElement.scrollTop;\r\n OrigX := X - Left;\r\n OrigY := Y - Top;\r\n end\r\n else\r\n begin\r\n norel := false;\r\n cr := ElementHandle.getBoundingClientRect;\r\n OrigX := X - cr.Left;\r\n OrigY := Y - cr.Top;\r\n AClientX := OrigX;\r\n AClientY := OrigY;\r\n Exit;\r\n end;\r\n\r\n AClientX := OrigX;\r\n AClientY := OrigY;\r\n\r\n p := Parent;\r\n\r\n if (Self is TCustomForm) and not Assigned(p) and Assigned(Container) then\r\n begin\r\n cr := Container.getBoundingClientRect;\r\n AClientX := AClientX - cr.Left;\r\n AClientY := AClientY - cr.Top;\r\n end;\r\n\r\n while Assigned(p) do\r\n begin\r\n if (p.IsLinked) then\r\n begin\r\n if (p is TCustomForm) then\r\n // is a form hosted in another HTML element\r\n cr := p.Container.getBoundingClientRect\r\n else\r\n // is control linked to HTML element\r\n cr := p.ElementHandle.getBoundingClientRect;\r\n\r\n // subtract the calculated position\r\n AClientX := AClientX - cr.Left;\r\n AClientY := AClientY - cr.Top;\r\n\r\n scrollx := 0;\r\n scrolly := 0;\r\n end\r\n else\r\n if (p is TCustomForm) then\r\n begin\r\n if ((p as TCustomForm).FormContainer <> '') then\r\n begin\r\n el := TJSHTMLElement(document.getElementById((p as TCustomForm).FormContainer));\r\n\r\n if Assigned(el) then\r\n begin\r\n cr := el.getBoundingClientRect;\r\n AClientX := AClientX - cr.Left;\r\n AClientY := AClientY - cr.Top;\r\n end;\r\n end;\r\n\r\n if Assigned((p as TCustomForm).Container) and ((p as TCustomForm).FormContainer = '') and {((p as TCustomForm).FormFileName <> '') and} ((p as TCustomForm).Popup) then\r\n begin\r\n cr := (p as TCustomForm).Container.getBoundingClientRect;\r\n AClientX := AClientX - cr.Left;\r\n AClientY := AClientY - cr.Top;\r\n r := (p as TCustomForm).ClientRect;\r\n AClientY := AClientY + r.Top;\r\n end;\r\n end\r\n else\r\n // restart calculation from bounding rectangle in case it is relative positioned\r\n if (p.ElementPosition in [epRelative,epIgnore]) then\r\n begin\r\n if Assigned(p.ElementHandle) then\r\n begin\r\n cr := p.ElementHandle.getBoundingClientRect;\r\n AClientX := OrigX - cr.Left;\r\n AClientY := OrigY - cr.Top;\r\n scrollx := 0;\r\n scrolly := 0;\r\n\r\n // as first relative element, take the BODY margins in account\r\n if norel then\r\n begin\r\n cs := window.getComputedStyle(document.documentElement);\r\n asm\r\n csx = parseInt(cs.marginLeft,10);\r\n csy = parseInt(cs.marginTop,10)\r\n end;\r\n\r\n AClientX := AClientX + csx;\r\n AClientY := AClientY + csy;\r\n end;\r\n\r\n norel := false;\r\n end;\r\n end\r\n else\r\n // only subtract for absolute positioned elements\r\n if (p.ElementPosition = epAbsolute) and norel then\r\n begin\r\n AClientX := AClientX - p.Left;\r\n AClientY := AClientY - p.Top;\r\n OrigX := AClientX;\r\n OrigY := AClientY;\r\n end;\r\n p := p.Parent;\r\n end;\r\n\r\n // take scroll in account when there was no relative element involved\r\n if ElementPosition = epAbsolute then\r\n begin\r\n AClientX := AClientX + scrollx;\r\n AClientY := AClientY + scrolly;\r\n end;\r\nend;\r\n\r\n{$HINTS ON}\r\n\r\nprocedure TControl.ClientToXY(AClientX, AClientY: single; var X,Y: single);\r\nvar\r\n p: TControl;\r\n cr: TJSDOMRect;\r\nbegin\r\n X := AClientX + Left - document.body.scrollLeft - document.documentElement.scrollLeft;\r\n Y := AClientY + Top - document.body.scrollTop - document.documentElement.scrollTop;\r\n\r\n p := Parent;\r\n while Assigned(p) do\r\n begin\r\n if (p.IsLinked) then\r\n begin\r\n\r\n if (p is TCustomForm) then\r\n // is a form hosted in another HTML element\r\n cr := p.Container.getBoundingClientRect\r\n else\r\n // is control linked to HTML element\r\n cr := p.ElementHandle.getBoundingClientRect;\r\n\r\n // subtract the calculated position\r\n X := X + cr.Left;\r\n Y := Y + cr.Top;\r\n end;\r\n\r\n if (p is TCustomForm) then\r\n begin\r\n\r\n if Assigned((p as TCustomForm).Container) and ((p as TCustomForm).FormContainer = '') and ((p as TCustomForm).FormFileName <> '') and ((p as TCustomForm).Popup) then\r\n begin\r\n cr := (p as TCustomForm).Container.getBoundingClientRect;\r\n X := X + cr.Left;\r\n Y := Y + cr.Top;\r\n end;\r\n end;\r\n\r\n // only add for absolute positioned elements\r\n if (p.ElementPosition = epAbsolute) then\r\n begin\r\n X := X + p.Left;\r\n Y := Y + p.Top;\r\n end;\r\n\r\n p := p.Parent;\r\n end;\r\nend;\r\n\r\nfunction TControl.HandleDoMouseDown(Event: TJSMouseEvent): Boolean;\r\nvar\r\n l, t: Single;\r\n ss: TShiftState;\r\n mb: TMouseButton;\r\nbegin\r\n FElementEvent := Event;\r\n if (eeMouseDown in EventStopPropagation) then\r\n StopPropagation;\r\n\r\n if not CanFocus then\r\n PreventDefault;\r\n\r\n XYToClient(Event.clientX, Event.clientY, l, t);\r\n\r\n // click outside scroll area should not trigger mousedown\r\n if HasVertScrollBar and (l > Width - GetScrollBarWidth) then\r\n Exit;\r\n\r\n if HasHorzScrollBar and (t > Height - GetScrollBarHeight) then\r\n Exit;\r\n\r\n ss := GetMouseEventShiftState(Event);\r\n mb := GetMouseEventButton(Event);\r\n\r\n MouseDown(mb, ss, Trunc(l), Trunc(t));\r\n Result := True;\r\n FElementEvent := nil;\r\nend;\r\n\r\nfunction TControl.HandleDoMouseUp(Event: TJSMouseEvent): Boolean;\r\nvar\r\n l, t: Single;\r\n ss: TShiftState;\r\n mb: TMouseButton;\r\nbegin\r\n FElementEvent := Event;\r\n if (eeMouseUp in EventStopPropagation) then\r\n StopPropagation;\r\n\r\n XYToClient(Event.clientX, Event.clientY, l, t);\r\n\r\n // click outside scroll area should not trigger mousedown\r\n if HasVertScrollBar and (l > Width - GetScrollBarWidth) then\r\n begin\r\n FElementEvent := nil;\r\n Exit;\r\n end;\r\n\r\n if HasHorzScrollBar and (l > Height - GetScrollBarHeight) then\r\n begin\r\n FElementEvent := nil;\r\n Exit;\r\n end;\r\n\r\n ss := GetMouseEventShiftState(Event);\r\n mb := GetMouseEventButton(Event);\r\n\r\n if (DragMode = dmManual) then\r\n DisableDrag;\r\n\r\n MouseUp(mb, ss, Trunc(l), Trunc(t));\r\n Result := True;\r\n FElementEvent := nil;\r\nend;\r\n\r\nfunction TControl.HandleDoWheel(Event: TJSWheelEvent): Boolean;\r\nvar\r\n ss: TShiftState;\r\n h: Boolean;\r\n l,t: single;\r\nbegin\r\n FElementEvent := Event;\r\n StopPropagation;\r\n\r\n XYToClient(Event.clientX, Event.clientY, l, t);\r\n\r\n FWheelMousePos.X := round(l);\r\n FWheelMousePos.Y := round(t);\r\n\r\n ss := GetMouseWheelEventShiftState(Event);\r\n\r\n h := True;\r\n MouseWheel(ss, Trunc(-Event.deltay), h);\r\n Result := h;\r\n FElementEvent := nil;\r\nend;\r\n\r\nprocedure TControl.ParentFontChanged;\r\nvar\r\n i: integer;\r\nbegin\r\n for i := 0 to ControlCount - 1 do\r\n begin\r\n if Controls[i].ParentFont then\r\n begin\r\n Controls[i].Font.Assign(Font);\r\n Controls[i].FontChanged;\r\n Controls[i].FParentFont := true;\r\n Controls[i].ParentFontChanged;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TControl.HandleFontChanged(Sender: TObject);\r\nbegin\r\n if (FUpdateCount = 0) then\r\n begin\r\n ParentFont := false;\r\n ParentFontChanged;\r\n end;\r\n\r\n FontChanged;\r\nend;\r\n\r\nfunction TControl.HasHorzScrollBar: Boolean;\r\nbegin\r\n Result := False;\r\n\r\n if Assigned(ElementHandle) then\r\n Result := ElementHandle.clientWidth < ElementHandle.scrollWidth;\r\nend;\r\n\r\nfunction TControl.HasVertScrollBar: Boolean;\r\nbegin\r\n Result := False;\r\n\r\n if Assigned(ElementHandle) then\r\n Result := ElementHandle.clientHeight < ElementHandle.scrollHeight;\r\nend;\r\n\r\nprocedure TControl.Hide;\r\nbegin\r\n Visible := false;\r\nend;\r\n\r\nfunction TControl.HandleDoTouchStart(Event: TJSTouchEvent): Boolean;\r\nvar\r\n l,t: single;\r\n touch: TJSTouch;\r\n ss: TShiftState;\r\nbegin\r\n FElementEvent := Event;\r\n FLastElementEvent := Event;\r\n\r\n StopPropagation;\r\n\r\n if not FAllowTouch then\r\n PreventDefault;\r\n\r\n if Event.Touches.length > 0 then\r\n begin\r\n touch := Event.touches.Touches[0];\r\n\r\n XYToClient(touch.clientX, touch.clientY, l, t);\r\n\r\n ss := GetTouchEventShiftState(Event);\r\n\r\n if LinkTouchEvents then\r\n begin\r\n MouseDown(mbLeft, ss, Trunc(l), Trunc(t));\r\n end;\r\n\r\n TouchStart(Trunc(l), Trunc(t));\r\n end;\r\n Result := True;\r\n FElementEvent := nil;\r\nend;\r\n\r\nfunction TControl.HandleDoTouchMove(Event: TJSTouchEvent): Boolean;\r\nvar\r\n l,t: single;\r\n touch: TJSTouch;\r\n ss: TShiftState;\r\nbegin\r\n FElementEvent := Event;\r\n FLastElementEvent := Event;\r\n\r\n StopPropagation;\r\n\r\n if not FAllowTouch then\r\n PreventDefault;\r\n\r\n if Captured then\r\n PreventDefault;\r\n\r\n if Event.Touches.length > 0 then\r\n begin\r\n touch := Event.touches.Touches[0];\r\n\r\n XYToClient(touch.clientX, touch.clientY, l, t);\r\n\r\n ss := GetTouchEventShiftState(Event);\r\n\r\n if LinkTouchEvents then\r\n MouseMove(ss, Trunc(l), Trunc(t));\r\n\r\n TouchMove(Trunc(l), Trunc(t));\r\n end;\r\n FElementEvent := nil;\r\n Result := True;\r\nend;\r\n\r\nfunction TControl.HandleDoTouchEnd(Event: TJSTouchEvent): Boolean;\r\nvar\r\n l,t: single;\r\n touch: TJSTouch;\r\n ss: TShiftState;\r\nbegin\r\n FElementEvent := Event;\r\n\r\n if not FAllowTouch then\r\n PreventDefault;\r\n\r\n ReleaseCapture;\r\n StopPropagation;\r\n\r\n if Assigned(FLastElementEvent) and (TJSTouchEvent(FLastElementEvent).Touches.length > 0) then\r\n begin\r\n touch := TJSTouchEvent(FLastElementEvent).touches.Touches[0];\r\n\r\n XYToClient(touch.clientX, touch.clientY, l, t);\r\n\r\n ss := GetTouchEventShiftState(Event);\r\n\r\n if LinkTouchEvents then\r\n begin\r\n MouseUp(mbLeft, ss, Trunc(l), Trunc(t));\r\n end;\r\n\r\n TouchEnd(Trunc(l), Trunc(t));\r\n end;\r\n FElementEvent := nil;\r\n Result := True;\r\nend;\r\n\r\nfunction TControl.HandleDoTouchCancel(Event: TJSTouchEvent): Boolean;\r\nvar\r\n l,t: single;\r\n touch: TJSTouch;\r\n ss: TShiftState;\r\nbegin\r\n FElementEvent := Event;\r\n ReleaseCapture;\r\n StopPropagation;\r\n\r\n if Event.Touches.length > 0 then\r\n begin\r\n touch := Event.touches.Touches[0];\r\n\r\n XYToClient(touch.clientX, touch.clientY, l, t);\r\n\r\n ss := GetTouchEventShiftState(Event);\r\n\r\n if LinkTouchEvents then\r\n begin\r\n MouseUp(mbLeft, ss, Trunc(l), Trunc(t));\r\n end;\r\n\r\n TouchCancel(Trunc(l), Trunc(t));\r\n end;\r\n FElementEvent := nil;\r\n Result := True;\r\nend;\r\n\r\nprocedure TControl.DragDrop(Source: TObject; X, Y: Integer);\r\nbegin\r\n if Assigned(OnDragDrop) then\r\n OnDragDrop(Self, Source, X, Y);\r\nend;\r\n\r\nprocedure TControl.DragOver(Source: TObject; X, Y: Integer;\r\n State: TDragState; var Accept: Boolean);\r\nbegin\r\n if Assigned(OnDragOver) then\r\n OnDragOver(Self, Source, X, Y, State, Accept);\r\nend;\r\n\r\nprocedure TControl.DoBoundsChange;\r\nvar\r\n b: boolean;\r\n frm: TCustomForm;\r\nbegin\r\n UpdateElementSize;\r\n RecreateCanvas;\r\n\r\n if FIsResizing then\r\n Exit;\r\n\r\n FIsResizing := true;\r\n\r\n InternalResize;\r\n\r\n DoRealign;\r\n\r\n b := false;\r\n\r\n frm := GetParentForm(Self);\r\n if Assigned(frm) then\r\n begin\r\n b := frm.IsResizing;\r\n b := b or (TControl(frm).FUpdateCount > 0);\r\n end;\r\n\r\n b := b or (FUpdateCount > 0);\r\n b := b or FIsAligning;\r\n\r\n if not b then\r\n UpdateChildAnchoring;\r\n\r\n FIsResizing := false;\r\nend;\r\n\r\nprocedure TControl.DoEndDrag(Target: TObject; X, Y: Integer);\r\nbegin\r\n if Assigned(OnEndDrag) then\r\n OnEndDrag(Self, Target, X, Y);\r\nend;\r\n\r\nprocedure TControl.DoStartDrag(var DragObject: TDragObject);\r\nbegin\r\n if Assigned(OnStartDrag) then\r\n OnStartDrag(Self, DragObject);\r\nend;\r\n\r\nfunction TControl.Focused: Boolean;\r\nbegin\r\n Result := FContainer = document.activeElement;\r\nend;\r\n\r\n\r\nprocedure TControl.FontChanged;\r\nbegin\r\n UpdateElement;\r\nend;\r\n\r\nfunction TControl.HandleDoMouseLeave(Event: TJSMouseEvent): Boolean;\r\nbegin\r\n if Captured then\r\n Exit;\r\n\r\n Event.stopPropagation;\r\n DoMouseLeave;\r\n Result := true;\r\nend;\r\n\r\nfunction TControl.HandleDoMouseEnter(Event: TJSMouseEvent): Boolean;\r\nbegin\r\n if Captured then\r\n Exit;\r\n\r\n Event.stopPropagation;\r\n DoMouseEnter;\r\n Result := true;\r\nend;\r\n\r\nfunction TControl.HandleDoMouseMove(Event: TJSMouseEvent): Boolean;\r\nvar\r\n l, t: Single;\r\n ss: TShiftState;\r\nbegin\r\n FElementEvent := Event;\r\n if (eeMouseMove in EventStopPropagation) then\r\n StopPropagation;\r\n\r\n XYToClient(Event.clientX, Event.clientY, l, t);\r\n\r\n ss := GetMouseEventShiftState(Event);\r\n\r\n MouseMove(ss, Trunc(l), Trunc(t));\r\n Result := True;\r\n FElementEvent := nil;\r\nend;\r\n\r\nfunction TControl.HandleDoKeyDown(Event: TJSKeyBoardEvent): Boolean;\r\nvar\r\n k: Word;\r\n ss: TShiftState;\r\n undef: boolean;\r\nbegin\r\n FElementEvent := Event;\r\n if (eeKeyDown in EventStopPropagation) then\r\n StopPropagation;\r\n\r\n asm\r\n undef = (Event.key == undefined);\r\n end;\r\n\r\n if not undef then\r\n begin\r\n k := GetKeyCode(Event.Key, true);\r\n\r\n ss := GetKeyboardEventShiftState(Event);\r\n\r\n KeyDown(k, ss);\r\n end;\r\n\r\n Result := True;\r\n if k = 0 then\r\n PreventDefault;\r\n\r\n FElementEvent := nil;\r\nend;\r\n\r\nfunction TControl.HandleDoKeyUp(Event: TJSKeyBoardEvent): Boolean;\r\nvar\r\n k: Word;\r\n ss: TShiftState;\r\n c: Char;\r\n undef: boolean;\r\nbegin\r\n FElementEvent := Event;\r\n if (eeKeyUp in EventStopPropagation) then\r\n StopPropagation;\r\n\r\n asm\r\n undef = (Event.key == undefined);\r\n end;\r\n\r\n if not undef then\r\n begin\r\n k := GetKeyCode(Event.Key, true);\r\n\r\n ss := GetKeyboardEventShiftState(Event);\r\n\r\n // #27 is not send as char in the browser\r\n if (k = 27) then\r\n begin\r\n c := #27;\r\n KeyPress(c);\r\n end;\r\n\r\n KeyUp(k, ss);\r\n end;\r\n\r\n Result := True;\r\n if k = 0 then\r\n PreventDefault;\r\n FelementEvent := nil;\r\nend;\r\n\r\nfunction TControl.HandleDoKeyPress(Event: TJSKeyBoardEvent): Boolean;\r\nvar\r\n c: Char;\r\nbegin\r\n FElementEvent := Event;\r\n if (eeKeyPress in EventStopPropagation) then\r\n StopPropagation;\r\n\r\n if IsKeyCharacter(Event.Key) then\r\n begin\r\n c := Chr(GetKeyCode(Event.Key, false));\r\n KeyPress(c);\r\n end;\r\n\r\n Result := True;\r\n if c = #0 then\r\n PreventDefault;\r\n FElementEvent := nil;\r\nend;\r\n\r\nfunction TControl.HandleDoInput(Event: TJSInputEvent): Boolean;\r\nvar\r\n c: Char;\r\n stemp: string;\r\nbegin\r\n //Note: On Android the OnKeyPress event is not triggered.\r\n //The OnInput event is used instead to trigger the OnKeyPress event.\r\n if IsAndroid then\r\n begin\r\n FElementEvent := Event;\r\n if (eeKeyPress in EventStopPropagation) then\r\n StopPropagation;\r\n\r\n c := #0;\r\n if Event.Data <> '' then\r\n begin\r\n stemp := Event.Data;\r\n\r\n if Assigned(stemp) then\r\n c := stemp[Length(stemp)]\r\n else\r\n c := #8;\r\n\r\n KeyPress(c);\r\n end;\r\n\r\n Result := True;\r\n if c = #0 then\r\n PreventDefault;\r\n FElementEvent := nil;\r\n end;\r\nend;\r\n\r\nfunction TControl.HandleDoEnter(Event: TJSFocusEvent): Boolean;\r\nbegin\r\n FElementEvent := Event;\r\n StopPropagation;\r\n\r\n DoEnter;\r\n Result := True;\r\n FElementEvent := nil;\r\n FGotFocus := True;\r\nend;\r\n\r\nfunction TControl.HandleDoExit(Event: TEventListenerEvent): Boolean;\r\nbegin\r\n DoExit;\r\n Result := True;\r\nend;\r\n\r\nprocedure TControl.SetParent(AValue: TControl);\r\nvar\r\n isNew: boolean;\r\nbegin\r\n if Assigned(AValue) then\r\n AValue := AValue.CanAcceptChild(Self);\r\n\r\n isNew := FNew;\r\n\r\n if (FParent <> AValue) then\r\n begin\r\n if Assigned(FParent) then\r\n FParent.UnRegisterParent(Self);\r\n\r\n FPrevParent := FParent;\r\n FParent := AValue;\r\n FGotFocus := False;\r\n\r\n UpdateParent;\r\n\r\n if not (csDestroying in ComponentState) then\r\n begin\r\n if not isNew then\r\n UpdateElement;\r\n InitScript;\r\n end;\r\n\r\n if Assigned(FParent) then\r\n begin\r\n FParent.RegisterParent(Self);\r\n end;\r\n\r\n if (csLoading in ComponentState) and Assigned(Parent) and not (csLoading in Parent.ComponentState) then\r\n Loaded;\r\n\r\n\r\n if Assigned(AValue) and Assigned(Parent) and not Parent.IsUpdating then\r\n Realign;\r\n\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TControl.SetParentColor(const Value: boolean);\r\nbegin\r\n if (FParentColor <> Value) and Value and Assigned(Parent) then\r\n begin\r\n Color := Parent.Color;\r\n end;\r\n\r\n FParentColor := Value;\r\nend;\r\n\r\nprocedure TControl.SetParentComponent(Value: TComponent);\r\nbegin\r\n if (Parent <> Value) and (Value is TControl) then\r\n SetParent(TControl(Value));\r\nend;\r\n\r\nprocedure TControl.SetParentElement(const Value: TJSHTMLElement);\r\nbegin\r\n if FNew then\r\n begin\r\n FElementPosition := epRelative;\r\n CreateControl;\r\n FParentElement := Value;\r\n\r\n if Assigned(FParentElement) then\r\n begin\r\n FParentElement.appendChild(Container);\r\n end;\r\n end\r\n else\r\n begin\r\n if Assigned(FParentElement) then\r\n FParentElement.removeChild(Container);\r\n\r\n FParentElement := Value;\r\n\r\n if Assigned(FParentElement) then\r\n FParentElement.appendChild(Container);\r\n\r\n UpdateElement;\r\n end;\r\n\r\n InitScript;\r\n Invalidate;\r\nend;\r\n\r\nprocedure TControl.SetParentElementID(const Value: string);\r\nvar\r\n el: TJSHTMLElement;\r\nbegin\r\n FParentElementID := Value;\r\n\r\n el := TJSHTMLElement(document.getElementById(FParentElementID));\r\n\r\n if Assigned(el) then\r\n SetParentElement(el);\r\nend;\r\n\r\nprocedure TControl.SetParentFont(const Value: boolean);\r\nbegin\r\n if (Value <> FParentFont) and (Value) and Assigned(Parent) then\r\n begin\r\n BeginUpdate;\r\n Font.Assign(Parent.Font);\r\n EndUpdate;\r\n UpdateElement;\r\n end;\r\n\r\n FParentFont := Value;\r\nend;\r\n\r\nprocedure TControl.SetRequiredScripts(const Value: TStringList);\r\nbegin\r\n FRequiredScripts.Assign(Value);\r\nend;\r\n\r\nprocedure TControl.SetRole(const Value: string);\r\nbegin\r\n FRole := Value;\r\n if Assigned(ElementHandle) then\r\n begin\r\n if Value = '' then\r\n ElementHandle.removeAttribute('role')\r\n else\r\n ElementHandle.setAttribute('role', Value);\r\n end;\r\nend;\r\n\r\nprocedure TControl.Realign;\r\nbegin\r\n AlignControl(Self);\r\nend;\r\n\r\nprocedure TControl.RecreateCanvas;\r\nbegin\r\nend;\r\n\r\nprocedure TControl.RecreateElement;\r\nbegin\r\n if Assigned(Container) then\r\n begin\r\n UnbindEvents;\r\n Container.parentNode.removeChild(Container);\r\n FElement := nil;\r\n CreateControl;\r\n\r\n if Assigned(Parent) and Assigned(Parent.Container) then\r\n Parent.ChildContainer.appendChild(Container);\r\n end;\r\nend;\r\n\r\nprocedure TControl.RegisterParent(AValue: TControl);\r\nbegin\r\n SetLength(FControls, Length(FControls) + 1);\r\n FControls[Length(FControls) - 1] := AValue;\r\nend;\r\n\r\nprocedure TControl.ReleaseCapture;\r\nvar\r\n eh: TJSHTMLElement;\r\nbegin\r\n FCaptureDown := False;\r\n\r\n if FCaptured and Assigned(FLayer) then\r\n begin\r\n eh := TJSHTMLElement(FLayer);\r\n eh.removeEventListener('mouseenter', FLayerMouseEnterPtr);\r\n eh.removeEventListener('mouseleave', FLayerMouseLeavePtr);\r\n eh.removeEventListener('mousedown', FMouseDownPtr);\r\n eh.removeEventListener('mouseup', FMouseUpPtr);\r\n eh.removeEventListener('mousemove', FMouseMovePtr);\r\n eh.removeEventListener('touchstart', FTouchStartPtr);\r\n eh.removeEventListener('touchmove', FTouchMovePtr);\r\n eh.removeEventListener('touchend', FTouchEndPtr);\r\n eh.removeEventListener('touchcancel', FTouchEndPtr);\r\n\r\n document.body.removeChild(eh);\r\n FCaptured := False;\r\n FLayer := nil;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TControl.ResetAnchoring;\r\nbegin\r\n FOrigRect := Rect(-1,-1,-1,-1);\r\n InitAnchoring;\r\nend;\r\n\r\nprocedure TControl.Resize;\r\nbegin\r\n if Assigned(FOnResize) then\r\n FOnResize(Self);\r\nend;\r\n\r\nfunction TControl.AnchoringInitialized: boolean;\r\nbegin\r\n Result := (OrigRect.Left <> -1) or (OrigRect.Top <> -1);\r\nend;\r\n\r\nprocedure TControl.InitAnchoring;\r\nvar\r\n i,dx,dy: integer;\r\n\r\n procedure SizeBorderOffset(AObject: TObject; var ax,ay: integer);\r\n var\r\n prop: TTypeMemberProperty;\r\n begin\r\n ax := 0;\r\n ay := 0;\r\n prop := GetPropInfo(AObject.ClassInfo, 'BorderStyle');\r\n if Assigned(prop) then\r\n begin\r\n i := GetOrdProp(AObject, prop);\r\n if i in [1,4,5] then\r\n begin\r\n ax := 4;\r\n ay := 4;\r\n end;\r\n if i in [2,3] then\r\n begin\r\n ax := 16;\r\n ay := 16;\r\n end;\r\n end;\r\n end;\r\n\r\nbegin\r\n if AnchoringInitialized then\r\n Exit;\r\n\r\n if (Self is TForm) then\r\n begin\r\n if (self as TForm).IsMiletus then\r\n SizeBorderOffset(Self, dx,dy);\r\n\r\n FOrigRect := Rect(0, 0, GetDesignWidth - dx, GetDesignHeight - dy);\r\n end\r\n else\r\n begin\r\n FOrigRect := Rect(GetDesignLeft, GetDesignTop, GetDesignLeft + GetDesignWidth, GetDesignTop + GetDesignHeight);\r\n end;\r\n\r\n if Assigned(Parent) then\r\n begin\r\n if (Parent is TForm) then\r\n begin\r\n if (Parent as TForm).IsMiletus then\r\n begin\r\n SizeBorderOffset(Parent, dx,dy);\r\n end;\r\n FOrigParentRect := Rect(0, 0, Parent.GetDesignWidth -dx, Parent.GetDesignHeight-dy)\r\n end\r\n else\r\n begin\r\n //InitAnchoring;\r\n if not Parent.AnchoringInitialized then\r\n Parent.InitAnchoring;\r\n\r\n FOrigParentRect := Rect(Parent.GetDesignLeft, Parent.GetDesignTop, Parent.GetDesignLeft + Parent.GetDesignWidth, Parent.GetDesignTop + Parent.GetDesignHeight);\r\n end;\r\n end;\r\n\r\n for i := 0 to ControlCount - 1 do\r\n Controls[i].InitAnchoring;\r\nend;\r\n\r\nprocedure TControl.InjectCSS;\r\nvar\r\n cssname,css: string;\r\n cssmgr: TCSSCodeManager;\r\nbegin\r\n cssname := GetWebClassname;\r\n\r\n css := '';\r\n\r\n cssmgr := GetCSSManager;\r\n\r\n if Assigned(cssmgr) then\r\n css := cssmgr.GetClassCSS(cssname);\r\n\r\n if (css <> '') then\r\n AddControlStyle(css);\r\nend;\r\n\r\nprocedure TControl.InternalResize;\r\nbegin\r\n if (csLoading in ComponentState) then\r\n Exit;\r\n\r\n Resize;\r\nend;\r\n\r\nprocedure TControl.InternalUpdateParent;\r\nvar\r\n p: TControl;\r\nbegin\r\n p := FPrevParent;\r\n if FNew then\r\n begin\r\n CreateControl;\r\n\r\n if Assigned(Container) then\r\n begin\r\n if Assigned(Parent) and not Assigned(Parent.Container) then\r\n Parent.CreateControl;\r\n\r\n if (Parent <> p) and Assigned(p) and Assigned(p.Container) then\r\n begin\r\n if Container.parentNode = p.ChildContainer then\r\n p.ChildContainer.removeChild(Container);\r\n end;\r\n\r\n if Assigned(Parent) and Assigned(Parent.Container) then\r\n begin\r\n Parent.ChildContainer.appendChild(Container);\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TControl.IsEnabled: boolean;\r\nbegin\r\n Result := FEnabled;\r\nend;\r\n\r\nfunction TControl.IsFocused: Boolean;\r\nbegin\r\n Result := FContainer = document.activeElement;\r\nend;\r\n\r\nfunction TControl.IsInputControl: Boolean;\r\nbegin\r\n Result := False;\r\nend;\r\n\r\nfunction TControl.IsKeyCharacter(AValue: string): Boolean;\r\nbegin\r\n case AValue of\r\n 'Up',\r\n 'Down',\r\n 'Left',\r\n 'Right',\r\n TJSKeyNames.Shift,\r\n TJSKeyNames.Control,\r\n TJSKeyNames.Alt,\r\n TJSKeyNames.Pause,\r\n TJSKeyNames.CapsLock,\r\n TJSKeyNames.PageUp,\r\n TJSKeyNames.PageDown,\r\n TJSKeyNames._End,\r\n TJSKeyNames.Home,\r\n TJSKeyNames.ArrowLeft,\r\n TJSKeyNames.ArrowUp,\r\n TJSKeyNames.ArrowRight,\r\n TJSKeyNames.ArrowDown,\r\n TJSKeyNames.Insert,\r\n TJSKeyNames.Delete,\r\n TJSKeyNames.F1,\r\n TJSKeyNames.F2,\r\n TJSKeyNames.F3,\r\n TJSKeyNames.F4,\r\n TJSKeyNames.F5,\r\n TJSKeyNames.F6,\r\n TJSKeyNames.F7,\r\n TJSKeyNames.F8,\r\n TJSKeyNames.F9,\r\n TJSKeyNames.F10,\r\n TJSKeyNames.F11,\r\n TJSKeyNames.F12,\r\n TJSKeyNames.F13,\r\n TJSKeyNames.F14,\r\n TJSKeyNames.F15,\r\n TJSKeyNames.F16,\r\n TJSKeyNames.F17,\r\n TJSKeyNames.F18,\r\n TJSKeyNames.F19,\r\n TJSKeyNames.F20: Result := False;\r\n else\r\n Result := True;\r\n end;\r\nend;\r\n\r\nfunction TControl.IsStructuralElement: boolean;\r\nbegin\r\n Result := false;\r\nend;\r\n\r\nprocedure TControl.UnbindEvents;\r\nvar\r\n eh: TJSEventTarget;\r\nbegin\r\n if Assigned(ElementBindHandle) then\r\n begin\r\n eh := ElementBindHandle;\r\n\r\n eh.removeEventListener('wheel', FWheelPtr);\r\n eh.removeEventListener('click', FClickPtr);\r\n eh.removeEventListener('dblclick', FDblClickPtr);\r\n eh.removeEventListener('mousedown', FMouseDownPtr);\r\n eh.removeEventListener('mouseup', FMouseUpPtr);\r\n eh.removeEventListener('mousemove', FMouseMovePtr);\r\n eh.removeEventListener('mouseleave', FMouseLeavePtr);\r\n eh.removeEventListener('mouseenter', FMouseEnterPtr);\r\n eh.removeEventListener('keydown', FKeyDownPtr);\r\n eh.removeEventListener('keyup', FKeyUpPtr);\r\n eh.removeEventListener('keypress', FKeyPressPtr);\r\n eh.removeEventListener('focus', FEnterPtr);\r\n eh.removeEventListener('blur', FExitPtr);\r\n\r\n eh.removeEventListener('touchstart', FTouchStartPtr);\r\n eh.removeEventListener('touchmove', FTouchMovePtr);\r\n eh.removeEventListener('touchend', FTouchEndPtr);\r\n eh.removeEventListener('touchcancel', FTouchEndPtr);\r\n\r\n eh.removeEventListener('contextmenu', FContextMenuPtr);\r\n end;\r\nend;\r\n\r\nprocedure TControl.UnRegisterParent(AValue: TControl);\r\nvar\r\n i: Integer;\r\n flg: Boolean;\r\nbegin\r\n flg := false;\r\n\r\n for i := 0 to Length(FControls) - 1 do\r\n begin\r\n if (FControls[i] = AValue) then\r\n begin\r\n flg := True;\r\n end;\r\n\r\n if (flg) and (i < Length(FControls) - 1) then\r\n FControls[i] := FControls[i + 1];\r\n end;\r\n\r\n if flg then\r\n SetLength(FControls, Length(FControls) - 1);\r\nend;\r\n\r\nprocedure TControl.UpdateAnchoring;\r\nvar\r\n dxr,dyr: integer;\r\n dxo,dyo: integer;\r\n dxw,dyw: integer;\r\n br,r: TRect;\r\nbegin\r\n if (csLoading in ComponentState) then\r\n Exit;\r\n\r\n if not FControlCreated then\r\n Exit;\r\n\r\n if (OrigRect.Left = -1) and (OrigRect.Top = -1) then\r\n InitAnchoring;\r\n\r\n if Assigned(Parent) and not Parent.AnchoringInitialized then\r\n Exit;\r\n\r\n if (Align <> alClient) then\r\n begin\r\n if Assigned(Parent) and not (Self is TForm) then\r\n begin\r\n r := Parent.BoundsRect;\r\n\r\n dxr := (r.Right - r.Left) - (FOrigParentRect.Right - FOrigParentRect.Left);\r\n dyr := (r.Bottom - r.Top) - (FOrigParentRect.Bottom - FOrigParentRect.Top);\r\n\r\n br := FOrigRect;\r\n\r\n dxo := 0;\r\n dyo := 0;\r\n dxw := 0;\r\n dyw := 0;\r\n\r\n if (akRight in Anchors) then\r\n begin\r\n if (akLeft in Anchors) then\r\n dxw := dxr\r\n else\r\n dxo := dxr;\r\n end;\r\n\r\n if (akBottom in Anchors) then\r\n begin\r\n if (akTop in Anchors) then\r\n dyw := dyr\r\n else\r\n dyo := dyr;\r\n end;\r\n\r\n if (akBottom in Anchors) or (akRight in Anchors) then\r\n begin\r\n SetBoundsInt(br.Left + dxo, br.Top + dyo, br.Right - br.Left + dxw, br.Bottom - br.Top + dyw);\r\n end;\r\n end;\r\n end;\r\n\r\n UpdateChildAnchoring;\r\nend;\r\n\r\nprocedure TControl.UpdateChildAnchoring;\r\nvar\r\n i: integer;\r\nbegin\r\n for i := 0 to ControlCount - 1 do\r\n begin\r\n Controls[i].UpdateAnchoring;\r\n end;\r\nend;\r\n\r\nprocedure TControl.UpdateChildren(AControl: TControl);\r\nvar\r\n I: Integer;\r\n c: TControl;\r\nbegin\r\n if Assigned(AControl) and not (csDestroying in ComponentState) then\r\n begin\r\n if (AControl.Align <> alNone) then\r\n AControl.DoRealign;\r\n\r\n if (AControl is TCustomControl) then\r\n begin\r\n (AControl as TCustomControl).RecreateCanvas;\r\n (AControl as TCustomControl).Invalidate;\r\n end;\r\n\r\n for I := 0 to AControl.ControlCount - 1 do\r\n begin\r\n c := AControl.Controls[I];\r\n UpdateChildren(c);\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TControl.PersistinHTML;\r\nvar\r\n i: integer;\r\nbegin\r\n for i := 0 to ControlCount - 1 do\r\n Controls[i].PersistinHTML;\r\nend;\r\n\r\nprocedure TControl.InitFromHTML;\r\nvar\r\n i: integer;\r\nbegin\r\n for i := 0 to ControlCount - 1 do\r\n Controls[i].InitFromHTML;\r\nend;\r\n\r\nprocedure TControl.InitScript;\r\nbegin\r\n // script to initialize any javascript control\r\nend;\r\n\r\nprocedure TControl.PreventDefault;\r\nbegin\r\n if Assigned(ElementEvent) then\r\n ElementEvent.preventDefault;\r\nend;\r\n\r\nprocedure TControl.UpdateElement;\r\nbegin\r\n if FBlockUpdateElement or (FUpdateCount > 0) then\r\n Exit;\r\n\r\n if Assigned(ElementHandle) and (ElementHandle <> ContainerElement) and not IsUpdating then\r\n begin\r\n UpdateElementData;\r\n\r\n if not IsLinked then\r\n begin\r\n UpdateElementVisual;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TControl.UpdateElementData;\r\nbegin\r\n if Assigned(ElementHandle) then\r\n begin\r\n if not (csDesigning in ComponentState) then\r\n begin\r\n if Visible then\r\n GetElementStyle.setProperty('display', '')\r\n else\r\n GetElementStyle.setProperty('display', 'none');\r\n end;\r\n\r\n EnableTab;\r\n\r\n if IsEnabled then\r\n FContainer.removeAttribute('disabled')\r\n else\r\n FContainer.setAttribute('disabled','');\r\n\r\n if IsLinked and (Hint = '') then\r\n Exit;\r\n\r\n if (Role <> '') then\r\n FContainer['role'] := FRole;\r\n\r\n if ShowHint and (Hint <> '') then\r\n FContainer['title'] := Hint\r\n else\r\n FContainer.removeAttribute('title');\r\n\r\n if not IsEnabled then\r\n GetElementStyle.removeProperty('color');\r\n end;\r\nend;\r\n\r\nprocedure TControl.UpdateElementSize;\r\nvar\r\n es: TJSCSSStyleDeclaration;\r\n offsLeft,offsTop,ow: integer;\r\n ctrl: TControl;\r\n cr: TJSDOMRect;\r\n\r\nbegin\r\n if FBlockUpdateElement or (FUpdateCount > 0) then\r\n Exit;\r\n\r\n if IsLinked then\r\n Exit;\r\n\r\n if Assigned(ElementHandle) and (ElementHandle <> ContainerElement) then\r\n begin\r\n es := GetElementStyle;\r\n\r\n offsLeft := 0;\r\n offsTop := 0;\r\n\r\n ctrl := Parent;\r\n while Assigned(ctrl) and (ElementPosition = epAbsolute) and (ctrl.ElementPosition <> epAbsolute) and not (ctrl is TCustomForm) do\r\n begin\r\n // found in the hierarchy a free floating control, so take its position in account\r\n if ctrl.IsLinked and Assigned(ctrl.ElementHandle) and (ctrl.ElementHandle['position'] <> 'absolute') then\r\n begin\r\n cr := ctrl.ElementHandle.getBoundingClientRect;\r\n offsLeft := Round(cr.Left);\r\n offsTop := Round(cr.Top);\r\n break;\r\n end;\r\n ctrl := ctrl.Parent;\r\n end;\r\n\r\n if Assigned(Parent) and (Parent.IsStructuralElement) then\r\n begin\r\n offsLeft := Parent.Left;\r\n offsTop := Parent.Top;\r\n end;\r\n\r\n if (ElementPosition = epAbsolute) then\r\n begin\r\n if FTop <> -1 then\r\n es.setProperty('top', IntToStr(FTop + offsTop) + 'px')\r\n else\r\n es.setProperty('top', '');\r\n\r\n if FLeft <> -1 then\r\n es.setProperty('left', IntToStr(FLeft + offsLeft) + 'px')\r\n else\r\n es.setProperty('left', '');\r\n end\r\n else\r\n begin\r\n es.removeProperty('top');\r\n es.removeProperty('left');\r\n end;\r\n\r\n if (FWidthStyle = ssAbsolute) then\r\n begin\r\n ow := GetOuterWidth;\r\n if FWidth <> -1 then\r\n es.setProperty('width', IntToStr(ow) + 'px')\r\n else\r\n es.removeProperty('width');\r\n end;\r\n\r\n if (FWidthStyle = ssAuto) then\r\n begin\r\n es.removeProperty('width');\r\n end;\r\n\r\n if (FHeightStyle = ssAbsolute) then\r\n begin\r\n if FHeight <> -1 then\r\n es.setProperty('height', IntToStr(GetOuterHeight) + 'px')\r\n else\r\n es.removeProperty('height');\r\n end;\r\n\r\n if (FHeightStyle = ssAuto) then\r\n begin\r\n es.removeProperty('height');\r\n end;\r\n\r\n if (FWidthStyle = ssPercent) then\r\n begin\r\n if FWidth <> -1 then\r\n es.setProperty('width', Format('%.2f%%',[FWidthPercent]))\r\n else\r\n es.removeProperty('width');\r\n end;\r\n\r\n if (FHeightStyle = ssPercent) then\r\n begin\r\n if FHeight <> -1 then\r\n es.setProperty('height', Format('%.2f%%',[FHeightPercent]))\r\n else\r\n es.removeProperty('height');\r\n end;\r\n\r\n if FElementPosition = epAbsolute then\r\n es.setProperty('position', 'absolute')\r\n else if FElementPosition = epRelative then\r\n es.setProperty('position', 'relative')\r\n else\r\n es.removeProperty('position');\r\n\r\n es.setProperty('box-sizing','border-box');\r\n end;\r\nend;\r\n\r\nprocedure TControl.UpdateElementVisual;\r\nvar\r\n eh: TJSHTMLElement;\r\n es: TJSCSSStyleDeclaration;\r\n useCSS: boolean;\r\nbegin\r\n eh := ElementHandle;\r\n\r\n if not Assigned(eh) then\r\n Exit;\r\n\r\n if IsUpdating then\r\n Exit;\r\n\r\n es := GetElementStyle;\r\n\r\n// if (csLoading in ComponentState) then\r\n// Exit;\r\n\r\n if ParentFont and Assigned(Parent) then\r\n begin\r\n Font.OnChange := nil;\r\n Font.Assign(Parent.Font);\r\n Font.OnChange := HandleFontChanged;\r\n end;\r\n\r\n if ElementClassName = '' then\r\n begin\r\n if ClipChildren then\r\n es.setProperty('overflow', 'hidden')\r\n else\r\n es.setProperty('overflow', '');\r\n\r\n SetElementPointer(eh, Cursor);\r\n end;\r\n\r\n if Captured then\r\n TJSHTMLElement(FLayer).style.setProperty('cursor', es.getPropertyValue('cursor'));\r\n\r\n if (ElementClassName <> '') or CanShowFocus then\r\n es.setProperty('outline', '')\r\n else\r\n es.setProperty('outline', 'none');\r\n\r\n UpdateElementSize;\r\n\r\n case FTextDirection of\r\n tdDefault: es.removeProperty('direction');\r\n tdRightToLeft: es.setProperty('direction','rtl');\r\n tdLeftToRight: es.setProperty('direction','ltr');\r\n tdInherit: es.setProperty('direction','inherit');\r\n end;\r\n\r\n if (ElementClassName = '') and FNoUserSelect then\r\n begin\r\n es.setProperty('webkit-user-select', 'none');\r\n es.setProperty('moz-user-select', 'none');\r\n es.setProperty('khtml-user-select', 'none');\r\n es.setProperty('ms-user-select', 'none');\r\n es.setProperty('user-select', 'none');\r\n es.setProperty('-webkit-tap-highlight-color', 'transparent');\r\n end;\r\n\r\n SetElementColor(eh, Color);\r\n\r\n useCSS := not ((ElementClassName = '') and (ElementFont = efProperty) and not IsLinked);\r\n\r\n SetHTMLElementFont(eh, Font, useCSS);\r\n\r\n if not useCSS then\r\n begin\r\n if IsEnabled then\r\n es.setProperty('color', ColorToHtml(Font.Color));\r\n end\r\n else\r\n begin\r\n es.removeProperty('color');\r\n end;\r\nend;\r\n\r\nprocedure TControl.UpdateParent;\r\nbegin\r\n InternalUpdateParent;\r\n\r\n// if (csLoading in ComponentState) and Assigned(Parent) and not (csLoading in Parent.ComponentState) then\r\n// Loaded;\r\n\r\n UpdateChildren(FPrevParent);\r\n UpdateChildren(Parent);\r\nend;\r\n\r\nprocedure TControl.UpdateSize;\r\nvar\r\n i: integer;\r\nbegin\r\n UpdateElementSize;\r\n for i := 0 to ControlCount - 1 do\r\n Controls[i].UpdateSize;\r\nend;\r\n\r\nprocedure TControl.UpdateControlSize(AWidth, AHeight: integer);\r\nbegin\r\n FWidth := AWidth;\r\n FHeight := AHeight;\r\nend;\r\n\r\nprocedure TControl.VisibleChanged;\r\nvar\r\n i: integer;\r\nbegin\r\n for i := 0 to ControlCount - 1 do\r\n begin\r\n Controls[i].VisibleChanged;\r\n end;\r\nend;\r\n\r\nprocedure TControl.VisibleChanging;\r\nbegin\r\n\r\nend;\r\n\r\nfunction TControl.GetBoundsRect: TRect;\r\nbegin\r\n Result.Left := Left;\r\n Result.Top := Top;\r\n Result.Right := Left + Width;\r\n Result.Bottom := Top + Height;\r\nend;\r\n\r\nfunction TControl.GetControlsCount: Integer;\r\nbegin\r\n Result := Length(FControls);\r\nend;\r\n\r\nfunction TControl.GetCSSManager: TCSSCodeManager;\r\nvar\r\n frm: TCustomForm;\r\n i: integer;\r\nbegin\r\n Result := nil;\r\n\r\n frm := GetParentForm(Self);\r\n\r\n if Assigned(frm) then\r\n begin\r\n for i := 0 to frm.ComponentCount - 1 do\r\n begin\r\n if frm.Components[i] is TCSSCodeManager then\r\n begin\r\n Result := frm.Components[i] as TCSSCodeManager;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TControl.GetDesignHeight: integer;\r\nbegin\r\n Result := FHeight;\r\nend;\r\n\r\nfunction TControl.GetDesignLeft: integer;\r\nbegin\r\n Result := FLeft;\r\nend;\r\n\r\nfunction TControl.GetDesignTop: integer;\r\nbegin\r\n Result := FTop;\r\nend;\r\n\r\nfunction TControl.GetDesignWidth: integer;\r\nbegin\r\n Result := FWidth;\r\nend;\r\n\r\nfunction TControl.GetContainer: TJSElement;\r\nbegin\r\n Result := FContainer;\r\nend;\r\n\r\nfunction TControl.GetControls(Index: Integer): TControl;\r\nbegin\r\n Result := FControls[Index];\r\nend;\r\n\r\nprocedure TControl.DoEnter;\r\nbegin\r\n if Assigned(OnEnter) then\r\n OnEnter(Self);\r\nend;\r\n\r\nprocedure TControl.DoExit;\r\nbegin\r\n if Assigned(OnExit) then\r\n OnExit(Self);\r\nend;\r\n\r\n{ TCustomControl }\r\n\r\nprocedure TCustomControl.CreateInitialize;\r\nbegin\r\n inherited;\r\n ControlStyle := ControlStyle + [csSetCaption];\r\n FBorderStyle := bsSingle;\r\n FBorderColor := clSilver;\r\n FPainting := false;\r\n FWidth := 100;\r\n FHeight := 25;\r\n FWidthPercent := 100;\r\n FHeightPercent := 100;\r\n FCustomBorder := false;\r\nend;\r\n\r\nprocedure TCustomControl.BindElement;\r\nbegin\r\n if (Container.TagName <> 'CANVAS') and not FControlCreated then\r\n begin\r\n FElementCanvas := TJSHTMLCanvasElement(document.createElement('CANVAS'));\r\n Container.appendChild(FElementCanvas);\r\n end;\r\nend;\r\n\r\nprocedure TCustomControl.BindEvents;\r\nbegin\r\n inherited;\r\nend;\r\n\r\nprocedure TCustomControl.CreateControl;\r\nbegin\r\n inherited;\r\n RecreateCanvas;\r\nend;\r\n\r\nfunction TCustomControl.CreateElement: TJSElement;\r\nbegin\r\n FElementCanvas := TJSHTMLCanvasElement(document.createElement('CANVAS'));\r\n if csAcceptsControls in ControlStyle then\r\n begin\r\n Result := document.createElement('SPAN');\r\n Result.appendChild(FElementCanvas);\r\n if ElementID <> '' then\r\n FElementCanvas['id'] := ElementID + '_Canvas';\r\n FElementCanvas['zindex'] := '-1';\r\n end\r\n else\r\n Result := FElementCanvas;\r\nend;\r\n\r\ndestructor TCustomControl.Destroy;\r\nbegin\r\n if Assigned(FCanvas) then\r\n FCanvas.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TCustomControl.EndUpdate;\r\nbegin\r\n inherited;\r\n if FUpdateCount = 0 then\r\n Invalidate;\r\nend;\r\n\r\nfunction TCustomControl.Focused: boolean;\r\nbegin\r\n Result := inherited Focused;\r\nend;\r\n\r\nfunction TCustomControl.GetCanvas: TCanvas;\r\nbegin\r\n if not Assigned(FCanvas) then\r\n begin\r\n CreateControl;\r\n end;\r\n Result := FCanvas;\r\nend;\r\n\r\nfunction TCustomControl.GetCanvasHeightOffset: Integer;\r\nbegin\r\n Result := 0;\r\nend;\r\n\r\nfunction TCustomControl.GetCanvasWidthOffset: Integer;\r\nbegin\r\n Result := 0;\r\nend;\r\n\r\nfunction TCustomControl.GetContext: TJSCanvasRenderingContext2D;\r\nvar\r\n ctx: TJSCanvasRenderingContext2D;\r\nbegin\r\n asm\r\n ctx = this.FElementCanvas.getContext(\"2d\");\r\n end;\r\n\r\n Result := ctx;\r\nend;\r\n\r\nfunction TCustomControl.GetPixelRatio: Single;\r\nvar\r\n res: single;\r\nbegin\r\n asm\r\n var ctx = document.createElement(\"canvas\").getContext(\"2d\"),\r\n dpr = window.devicePixelRatio || 1,\r\n bsr = ctx.webkitBackingStorePixelRatio ||\r\n ctx.mozBackingStorePixelRatio ||\r\n ctx.msBackingStorePixelRatio ||\r\n ctx.oBackingStorePixelRatio ||\r\n ctx.backingStorePixelRatio || 1;\r\n res = dpr / bsr\r\n end;\r\n Result := res;\r\nend;\r\n\r\nprocedure TCustomControl.Invalidate;\r\nvar\r\n px: Single;\r\n frm: TCustomForm;\r\nbegin\r\n inherited;\r\n\r\n if (Parent = nil) or (csDestroying in ComponentState) then\r\n Exit;\r\n\r\n if not Visible then\r\n Exit;\r\n\r\n if FUpdateCount > 0 then\r\n Exit;\r\n\r\n frm := GetParentForm(Self);\r\n if Assigned(frm) then\r\n if frm.IsUpdating then\r\n Exit;\r\n\r\n px := GetPixelRatio;\r\n if (px <> FPixelRatio) then\r\n RecreateCanvas;\r\n\r\n FPixelRatio := GetPixelRatio;\r\n\r\n FPainting := true;\r\n\r\n if Assigned(FCanvas) then\r\n FCanvas.Clear;\r\n\r\n Paint;\r\n FPainting := false;\r\nend;\r\n\r\nprocedure TCustomControl.Loaded;\r\nbegin\r\n inherited;\r\n Invalidate;\r\nend;\r\n\r\nfunction TCustomControl.MakeScreenShot: TBitmap;\r\nbegin\r\n Result := TBitmap.Create;\r\n Result.OnChange := HandleScreenshot;\r\n Result.LoadFromCanvas(Canvas);\r\nend;\r\n\r\nprocedure TCustomControl.HandleScreenShot(Sender: TObject);\r\nbegin\r\n if Assigned(OnScreenshot) then\r\n OnScreenshot(Self, TBitmap(Sender));\r\nend;\r\n\r\nprocedure TCustomControl.Paint;\r\nbegin\r\n \r\nend;\r\n\r\nprocedure TCustomControl.RecreateCanvas;\r\nvar\r\n px: Single;\r\n el: TJSHTMLCanvasElement;\r\n h, w: Integer;\r\nbegin\r\n if Assigned(FElementCanvas) then\r\n begin\r\n if not FPainting then\r\n begin\r\n el := TJSHTMLCanvasElement(document.getElementByID(GetID+'_Canvas'));\r\n\r\n // it is already found\r\n if Assigned(el) then\r\n begin\r\n FElementCanvas := el;\r\n FCanvas.Free;\r\n FCanvas := nil;\r\n end;\r\n\r\n px := GetPixelRatio;\r\n h := Height - GetCanvasHeightOffset;\r\n w := Width - GetCanvasWidthOffset;\r\n\r\n if ElementPosition = epRelative then\r\n FElementCanvas.style.setProperty('position', 'relative')\r\n else\r\n FElementCanvas.style.setProperty('position', 'absolute');\r\n\r\n FElementCanvas.style.setProperty('height', IntToStr(h) + 'px');\r\n FElementCanvas.style.setProperty('width', IntToStr(w) + 'px');\r\n FElementCanvas.height := Round(h * px);\r\n FElementCanvas.width := Round(w * px);\r\n end;\r\n\r\n if not Assigned(FCanvas) then\r\n FCanvas := TCanvas.Create(FElementCanvas);\r\n\r\n FCanvas.ApplyPixelRatio := True;\r\n FCanvas.SetTransform(1, 0, 0, 1, 0, 0);\r\n end;\r\nend;\r\n\r\nprocedure TCustomControl.RenderDesigning(ACaption: string; AElement: TJSElement;\r\n AControl: TCustomControl; ADisplay: Boolean; AImage: string);\r\nvar\r\n LContainer, LLabel, LDiv: TJSHTMLElement;\r\n LHasLabel: boolean;\r\nbegin\r\n LContainer := TJSHTMLElement(AElement);\r\n LLabel := TJSHTMLElement(LContainer.firstChild);\r\n LHasLabel := Assigned(LLabel) and (LLabel.tagName = 'DIV') and (LLabel.getAttribute('data-design') = '1');\r\n\r\n if (csDesigning in AControl.ComponentState) and (ADisplay) and (ElementClassName = '') then\r\n begin\r\n LContainer.style.setProperty('border','1px solid gray');\r\n\r\n if AImage = '' then\r\n LContainer.style.setProperty('background-color','#F0F0F0')\r\n else\r\n LContainer.style.setProperty('background-color','white');\r\n\r\n if LHasLabel then\r\n Exit;\r\n\r\n LContainer.innerHTML := '';\r\n\r\n if AImage <> '' then\r\n begin\r\n LDiv := TJSHTMLElement(document.createElement('DIV'));\r\n LDiv.style.setProperty('background-color','white');\r\n LDiv.style.setProperty('background-repeat','no-repeat');\r\n LDiv.style.setProperty('background-position-y','center');\r\n LDiv.style.setProperty('background-image', 'url('+AImage+')');\r\n LDiv.style.setProperty('background-position-x','center');\r\n LDiv.style.setProperty('background-size','128px');\r\n LDiv.style.setProperty('top','50%');\r\n LDiv.style.setProperty('left','50%');\r\n LDiv.style.setProperty('height','70%');\r\n LContainer.appendChild(LDiv);\r\n end;\r\n\r\n LLabel := TJSHTMLElement(document.createElement('DIV'));\r\n LLabel.setAttribute('data-design','1');\r\n LLabel.innerHTML := ACaption;\r\n LLabel.style.setProperty('position','relative');\r\n LLabel.style.setProperty('top','50%');\r\n LLabel.style.setProperty('left','50%');\r\n LLabel.style.setProperty('display','inline-block');\r\n LLabel.style.setProperty('transform','translateX(-50%)');\r\n\r\n CustomBorder := True;\r\n LContainer.appendChild(LLabel);\r\n end\r\n else\r\n begin\r\n if LHasLabel then\r\n begin\r\n while Assigned(LContainer.firstChild) do\r\n LContainer.removeChild(LContainer.firstChild);\r\n\r\n LContainer.style.removeProperty('border');\r\n LContainer.style.removeProperty('background-color');\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TCustomControl.Resize;\r\nbegin\r\n inherited;\r\n Invalidate;\r\nend;\r\n\r\nprocedure TCustomControl.SetBorderColor(const AValue: TColor);\r\nbegin\r\n if (FBorderColor <> AValue) then\r\n begin\r\n FBorderColor := AValue;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomControl.SetBorderStyle(const AValue: TBorderStyle);\r\nbegin\r\n if FBorderStyle <> AValue then\r\n begin\r\n FBorderStyle := AValue;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomControl.SetCaption(const AValue: string);\r\nbegin\r\n FCaption := AValue;\r\n ControlStyle := ControlStyle - [csSetCaption];\r\nend;\r\n\r\nprocedure TCustomControl.SetFocus;\r\nbegin\r\n inherited;\r\nend;\r\n\r\nprocedure TCustomControl.SetName(const NewName: TComponentName);\r\nvar\r\n cs: TControlStyle;\r\n ownername: string;\r\nbegin\r\n ownername := '';\r\n if (Self is TFrame) then\r\n begin\r\n ownername := 'F' + FindUniqueName(Name) + '_';\r\n end;\r\n\r\n inherited SetName(ownername + NewName);\r\n\r\n if (csSetCaption in ControlStyle) and (csDesigning in ComponentState) and not (csLoading in ComponentState) then\r\n begin\r\n if Assigned(Owner) and (csLoading in Owner.ComponentState) then\r\n Exit;\r\n\r\n cs := ControlStyle;\r\n SetCaption(NewName);\r\n ControlStyle := cs;\r\n end;\r\nend;\r\n\r\nprocedure TCustomControl.UpdateElementVisual;\r\nbegin\r\n inherited;\r\n if Assigned(ElementHandle) then\r\n begin\r\n if not IsLinked and (ElementClassName = '') then\r\n begin\r\n if BorderStyle = bsSingle then // default border style\r\n begin\r\n if CustomBorder then\r\n begin\r\n GetElementStyle.setProperty('border-style', 'solid');\r\n GetElementStyle.setProperty('border-width', '1px');\r\n GetElementStyle.setProperty('border-color', ColorToHTML(BorderColor));\r\n end\r\n else\r\n GetElementStyle.setProperty('border-style', '')\r\n end\r\n else\r\n GetElementStyle.setProperty('border-style', 'none');\r\n end;\r\n\r\n if (ElementClassName <> '') then\r\n begin\r\n GetElementStyle.removeProperty('border-style');\r\n GetElementStyle.removeProperty('border-width');\r\n GetElementStyle.removeProperty('border-color');\r\n end;\r\n end;\r\nend;\r\n\r\n{ TScrollingGraphicControl }\r\n\r\nprocedure TScrollingGraphicControl.UpdateElement;\r\nbegin\r\n inherited;\r\n if Assigned(ElementHandle) then\r\n ElementHandle.style.setProperty('overflow', 'auto');\r\nend;\r\n\r\n\r\nfunction TScrollingGraphicControl.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('DIV');\r\nend;\r\n\r\n{ TMargins }\r\n\r\nprocedure TMargins.Assign(Source: TPersistent);\r\nbegin\r\n if Source is TMargins then\r\n begin\r\n FLeft := (Source as TMargins).Left;\r\n FTop := (Source as TMargins).Top;\r\n FBottom := (Source as TMargins).Bottom;\r\n FRight := (Source as TMargins).Right;\r\n end\r\n else\r\n inherited;\r\nend;\r\n\r\nconstructor TMargins.Create;\r\nbegin\r\n FLeft := 3;\r\n FTop := 3;\r\n FBottom := 3;\r\n FRight := 3;\r\nend;\r\n\r\n{ TControlManager }\r\n\r\nconstructor TControlManager.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n FInstanceCount := 0;\r\nend;\r\n\r\nfunction TControlManager.GetInstanceNumber: integer;\r\nbegin\r\n Inc(FInstanceCount);\r\n Result := FInstanceCount;\r\nend;\r\n\r\nprocedure TControlManager.Reset;\r\nbegin\r\n FInstanceCount := 0;\r\nend;\r\n\r\n{ TCSSCodeFragment }\r\n\r\nconstructor TCSSCodeFragment.Create(Collection: TCollection);\r\nbegin\r\n inherited;\r\n FCSS := TStringList.Create;\r\nend;\r\n\r\ndestructor TCSSCodeFragment.Destroy;\r\nbegin\r\n FCSS.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TCSSCodeFragment.SetCSS(const Value: TStringList);\r\nbegin\r\n FCSS.Assign(Value);\r\nend;\r\n\r\n{ TCSSCodeFragments }\r\n\r\nfunction TCSSCodeFragments.Add: TCSSCodeFragment;\r\nbegin\r\n Result := TCSSCodeFragment(inherited Add);\r\nend;\r\n\r\nconstructor TCSSCodeFragments.Create(AOwner: TComponent);\r\nbegin\r\n inherited Create(AOwner, TCSSCodeFragment);\r\nend;\r\n\r\nfunction TCSSCodeFragments.GetItemEx(Index: integer): TCSSCodeFragment;\r\nbegin\r\n Result := TCSSCodeFragment(inherited Items[Index]);\r\nend;\r\n\r\nfunction TCSSCodeFragments.Insert(Index: integer): TCSSCodeFragment;\r\nbegin\r\n Result := TCSSCodeFragment(inherited Insert(Index));\r\nend;\r\n\r\nprocedure TCSSCodeFragments.SetItemEx(Index: integer;\r\n const Value: TCSSCodeFragment);\r\nbegin\r\n inherited Items[Index] := Value;\r\nend;\r\n\r\n{ TCSSCodeManager }\r\n\r\nconstructor TCSSCodeManager.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n FCSSFragments := TCSSCodeFragments.Create(Self);\r\n FCSSFragments.PropName := 'CSSFragments';\r\nend;\r\n\r\ndestructor TCSSCodeManager.Destroy;\r\nbegin\r\n FCSSFragments.Free;\r\n inherited;\r\nend;\r\n\r\nfunction TCSSCodeManager.GetClassCSS(AClassname: string): string;\r\nvar\r\n CSSCodeFragment: TCSSCodeFragment;\r\nbegin\r\n Result := '';\r\n\r\n CSSCodeFragment := GetClassFragment(AClassName);\r\n\r\n if Assigned(CSSCodeFragment) then\r\n Result := CSSCodeFragment.CSS.Text;\r\nend;\r\n\r\nfunction TCSSCodeManager.GetClassFragment(AClassname: string): TCSSCodeFragment;\r\nvar\r\n i: integer;\r\nbegin\r\n Result := nil;\r\n for i := 0 to CSSFragments.Count - 1 do\r\n begin\r\n if CSSFragments.Items[i].ControlClassName = AClassname then\r\n Result := CSSFragments.Items[i];\r\n end;\r\nend;\r\n\r\nprocedure TCSSCodeManager.SetCSSFragments(const Value: TCSSCodeFragments);\r\nbegin\r\n FCSSFragments.Assign(Value);\r\nend;\r\n\r\n{ TjQueryCustomContol }\r\n\r\nfunction TjQueryCustomControl.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('DIV');\r\nend;\r\n\r\nprocedure TjQueryCustomControl.CreateInitialize;\r\nbegin\r\n inherited;\r\n FIsInitialized := false;\r\nend;\r\n\r\nfunction TjQueryCustomControl.GetJQID: string;\r\nbegin\r\n Result := '#' + GetID;\r\nend;\r\n\r\nprocedure TjQueryCustomControl.InitJQuery;\r\nbegin\r\n //\r\nend;\r\n\r\nprocedure TjQueryCustomControl.InitJQueryOnce;\r\nbegin\r\n if IsUpdating then\r\n Exit;\r\n\r\n if FIsInitialized then\r\n Exit;\r\n\r\n FIsInitialized := true;\r\n InitJQuery;\r\nend;\r\n\r\nprocedure TjQueryCustomControl.Loaded;\r\nbegin\r\n inherited;\r\n InitJQueryOnce;\r\nend;\r\n\r\nprocedure TjQueryCustomControl.SetParent(AValue: TControl);\r\nbegin\r\n inherited;\r\n InitJQueryOnce;\r\nend;\r\n\r\n{ TPadding }\r\n\r\nprocedure TPadding.Assign(Source: TPersistent);\r\nbegin\r\n if (Source is TPadding) then\r\n begin\r\n FLeft := (Source as TPadding).Left;\r\n FRight := (Source as TPadding).Right;\r\n FTop := (Source as TPadding).Top;\r\n FBottom := (Source as TPadding).Bottom;\r\n end;\r\nend;\r\n\r\nconstructor TPadding.Create;\r\nbegin\r\n inherited;\r\n FLeft := 0;\r\n FTop := 0;\r\n FRight := 0;\r\n FBottom := 0;\r\nend;\r\n\r\nprocedure TPadding.DoChange;\r\nbegin\r\n if Assigned(OnChange) then\r\n OnChange(Self);\r\nend;\r\n\r\nprocedure TPadding.SetBottom(const Value: integer);\r\nbegin\r\n if (FBottom <> Value) then\r\n begin\r\n FBottom := Value;\r\n DoChange;\r\n end;\r\nend;\r\n\r\nprocedure TPadding.SetLeft(const Value: integer);\r\nbegin\r\n if (FLeft <> Value) then\r\n begin\r\n FLeft := Value;\r\n DoChange;\r\n end;\r\nend;\r\n\r\nprocedure TPadding.SetRight(const Value: integer);\r\nbegin\r\n if (FRight <> Value) then\r\n begin\r\n FRight := Value;\r\n DoChange;\r\n end;\r\nend;\r\n\r\nprocedure TPadding.SetTop(const Value: integer);\r\nbegin\r\n if (FTop <> Value) then\r\n begin\r\n FTop := Value;\r\n DoChange;\r\n end;\r\nend;\r\n\r\n{ TCustomHTMLDiv }\r\n\r\nfunction TCustomHTMLDiv.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('DIV');\r\nend;\r\n\r\n{ TControlScrollBar }\r\n\r\nconstructor TControlScrollBar.Create(AControl: TControl; AKind: TScrollBarKind);\r\nbegin\r\n inherited;\r\n FControl := AControl;\r\n FKind := AKind;\r\nend;\r\n\r\nfunction TControlScrollBar.IsScrollBarVisible: boolean;\r\nbegin\r\n Result := false;\r\n\r\n if Assigned(FControl.ELementHandle) then\r\n begin\r\n if Kind = sbVertical then\r\n Result := TJSHTMLElement(FControl.ElementHandle).ScrollHeight > TJSHTMLElement(FControl.ElementHandle).ClientHeight\r\n else\r\n Result := TJSHTMLElement(FControl.ElementHandle).ScrollWidth > TJSHTMLElement(FControl.ElementHandle).ClientWidth;\r\n end;\r\nend;\r\n\r\nfunction TControlScrollBar.Range: integer;\r\nbegin\r\n Result := 0;\r\n if Assigned(FControl.ELementHandle) then\r\n begin\r\n if Kind = sbVertical then\r\n Result := TJSHTMLElement(FControl.ElementHandle).ScrollHeight\r\n else\r\n Result := TJSHTMLElement(FControl.ElementHandle).ScrollWidth;\r\n end;\r\nend;\r\n\r\nfunction TControlScrollBar.ScrollPos: integer;\r\nbegin\r\n Result := 0;\r\n if Assigned(FControl.ELementHandle) then\r\n begin\r\n if Kind = sbVertical then\r\n Result := FControl.ElementHandle.scrollTop\r\n else\r\n Result := FControl.ElementHandle.scrollLeft;\r\n end;\r\nend;\r\n\r\ninitialization\r\n ScrollBW := 0;\r\n ScrollBH := 0;\r\n DragObject := nil;\r\n ControlManager := TControlManager.Create(nil);\r\n\r\nend.\r\n","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright (c) 2018 - 2021 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.Dialogs;\r\n\r\n{$DEFINE NOPP}\r\n\r\ninterface\r\n\r\nuses\r\n Classes, WEBLib.Controls, Web, JS, SysUtils, WebLib.WebTools,\r\n WEBLib.WebCtrls, WEBLib.Graphics;\r\n\r\ntype\r\n TMsgDlgType = (mtWarning, mtError, mtInformation, mtConfirmation, mtCustom);\r\n TMsgDlgBtn = (mbYes, mbNo, mbOK, mbCancel, mbAbort, mbRetry, mbIgnore,\r\n mbAll, mbNoToAll, mbYesToAll, mbHelp, mbClose);\r\n TMsgDlgButtons = set of TMsgDlgBtn;\r\n\r\n TDialogResult = Integer;\r\n TDialogResultProc = reference to procedure(AValue: TDialogResult);\r\n\r\n TCustomDialogButton = class(TCollectionItem)\r\n private\r\n FCaption: string;\r\n FTag: integer;\r\n FElementClassName: TElementClassName;\r\n published\r\n property Caption: string read FCaption write FCaption;\r\n property ElementClassName: TElementClassName read FElementClassName write FElementClassName;\r\n property Tag: integer read FTag write FTag default 0;\r\n end;\r\n\r\n TCustomDialogButtons = class(TOwnedCollection)\r\n private\r\n function GetItem(AIndex: integer): TCustomDialogButton; reintroduce;\r\n procedure SetItem(AIndex: integer; const Value: TCustomDialogButton); reintroduce;\r\n public\r\n function Add: TCustomDialogButton; reintroduce;\r\n function Insert(AIndex: integer): TCustomDialogButton; reintroduce;\r\n property Items[AIndex: integer]: TCustomDialogButton read GetItem write SetItem; default;\r\n end;\r\n\r\n TMessageDlg = class(TCustomControl)\r\n private\r\n FOpacity: double;\r\n FLayer: TJSElement;\r\n FDlg: TJSElement;\r\n FCancel: TJSElement;\r\n FMessage: string;\r\n FTitle: string;\r\n FMsgDlgType: TMSgDlgType;\r\n FOnButtonClick: TNotifyEvent;\r\n FOnClose: TNotifyEvent;\r\n FButtons: TMsgDlgButtons;\r\n FDialogProc: TDialogResultProc;\r\n FDialogResult: TDialogResult;\r\n FMdx, FMdy: integer;\r\n FDlgX, FDlgY: integer;\r\n FCaptured: boolean;\r\n FDown: boolean;\r\n FElementTitleClassName: TElementClassName;\r\n FElementButtonClassName: TElementClassName;\r\n FElementContentClassName: TElementClassName;\r\n FDialogText: TStringList;\r\n FCustomButtons: TCustomDialogButtons;\r\n FElementDialogClassName: TElementClassName;\r\n procedure SetDialogText(const Value: TStringList);\r\n procedure SetCustomButtons(const Value: TCustomDialogButtons);\r\n protected\r\n function CreateElement: TJSElement; override;\r\n function GetDialogText(Index: integer): string; virtual;\r\n procedure BindEvents; override;\r\n procedure SetDialogResult(const Value: TDialogResult);\r\n function CreateButton(Caption: string; var DoFocus: boolean; AClass: string = ''): TJSHTMLElement;\r\n function HandleDocMouseMove(Event: TJSMouseEvent): Boolean; virtual;\r\n function HandleDocMouseUp(Event: TJSMouseEvent): Boolean; virtual;\r\n function HandleMouseDown(Event: TJSMouseEvent): Boolean; virtual;\r\n function HandleButtonClick(Event: TJSMouseEvent): Boolean; virtual;\r\n function HandleKeyDown(Event: TJSKeyBoardEvent): Boolean; virtual;\r\n procedure InitBootstrapStyle;\r\n public\r\n procedure CreateInitialize; override;\r\n destructor Destroy; override;\r\n procedure Close;\r\n property DialogResult: TDialogResult read FDialogResult write SetDialogResult;\r\n procedure Show; reintroduce;\r\n function ShowDialog: Integer; overload; virtual;\r\n function ShowDialog(Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; AProc: TDialogResultProc): TDialogResult; overload; virtual;\r\n [async]\r\n function ShowDialog(Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons): TJSPromise; overload;\r\n published\r\n property Buttons: TMsgDlgButtons read FButtons write FButtons default [];\r\n property CustomButtons: TCustomDialogButtons read FCustomButtons write SetCustomButtons;\r\n property DialogText: TStringList read FDialogText write SetDialogText;\r\n property DialogType: TMSgDlgType read FMsgDlgType write FMsgDlgType default mtCustom;\r\n property &Message: string read FMessage write FMessage;\r\n property Opacity: double read FOpacity write FOpacity;\r\n property ElementButtonClassName: TElementClassName read FElementButtonClassName write FElementButtonClassName;\r\n property ElementDialogClassName: TElementClassName read FElementDialogClassName write FElementDialogClassName;\r\n property ElementTitleClassName: TElementClassName read FElementTitleClassName write FElementTitleClassName;\r\n property ElementContentClassName: TElementClassName read FElementContentClassName write FElementContentClassName;\r\n property Title: string read FTitle write FTitle;\r\n property OnButtonClick: TNotifyEvent read FOnButtonClick write FOnButtonClick;\r\n property OnClose: TNotifyEvent read FOnClose write FOnClose;\r\n end;\r\n\r\n TWebMessageDlg = class(TMessageDlg);\r\n\r\n TWaitMessage = class(TCustomControl)\r\n private\r\n FLayer: TJSElement;\r\n FPicture: TURLPicture;\r\n FOpacity: double;\r\n FOnShow: TNotifyEvent;\r\n FIsWaiting: boolean;\r\n procedure SetPicture(const Value: TURLPicture);\r\n protected\r\n procedure WaitDisplayed;\r\n function CreateElement: TJSElement; override;\r\n public\r\n procedure CreateInitialize; override;\r\n destructor Destroy; override;\r\n procedure Show; reintroduce;\r\n procedure Hide; reintroduce;\r\n property IsWaiting: boolean read FIsWaiting write FIsWaiting;\r\n property Showing: boolean read FIsWaiting;\r\n published\r\n property Opacity: double read FOpacity write FOpacity;\r\n property Picture: TURLPicture read FPicture write SetPicture;\r\n property OnShow: TNotifyEvent read FOnShow write FOnShow;\r\n end;\r\n\r\n TWebWaitMessage = class(TWaitMessage);\r\n\r\n TOpenDialogProc = reference to procedure(AFileName: string);\r\n\r\n TOpenOption = (ofReadOnly, ofOverwritePrompt, ofHideReadOnly,\r\n ofNoChangeDir, ofShowHelp, ofNoValidate, ofAllowMultiSelect,\r\n ofExtensionDifferent, ofPathMustExist, ofFileMustExist, ofCreatePrompt,\r\n ofShareAware, ofNoReadOnlyReturn, ofNoTestFileCreate, ofNoNetworkButton,\r\n ofNoLongNames, ofOldStyleDialog, ofNoDereferenceLinks, ofEnableIncludeNotify,\r\n ofEnableSizing, ofDontAddToRecent, ofForceShowHidden);\r\n TOpenOptions = set of TOpenOption;\r\n\r\n TOpenDialog = class(TComponent)\r\n private\r\n FFiles: TFiles;\r\n FOnChange: TNotifyEvent;\r\n FFileName: string;\r\n FMultiFile: boolean;\r\n FFilter: string;\r\n FAccept: string;\r\n FOpenDialogProc: TOpenDialogProc;\r\n FOptions: TOpenOptions;\r\n FFilterIndex: Integer;\r\n FOnFileAsBase64: TFileAsBase64Event;\r\n FOnGetFileAsArrayBuffer: TFileAsArrayBufferEvent;\r\n FOnFileAsDataURL: TFileAsDataURLEvent;\r\n FOnFileAsText: TFileAsTextEvent;\r\n FOnGetFileAsStream: TFileAsStreamEvent;\r\n protected\r\n procedure HandleInputChange(Event: TJSEvent); virtual;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n destructor Destroy; override;\r\n procedure Execute; overload;\r\n procedure Execute(AProc: TOpenDialogProc); overload;\r\n [async]\r\n function Perform: TJSPromise;\r\n property FileName: string read FFileName;\r\n property Files: TFiles read FFiles;\r\n property Filter: string read FFilter write FFilter;\r\n property Options: TOpenOptions read FOptions write FOptions;\r\n property FilterIndex: Integer read FFilterIndex write FFilterIndex;\r\n published\r\n property Accept: string read FAccept write FAccept;\r\n property MultiFile: boolean read FMultiFile write FMultiFile default false;\r\n property OnChange: TNotifyEvent read FOnChange write FOnChange;\r\n property OnGetFileAsText: TFileAsTextEvent read FOnFileAsText write FOnFileAsText;\r\n property OnGetFileAsArrayBuffer: TFileAsArrayBufferEvent read FOnGetFileAsArrayBuffer write FOnGetFileAsArrayBuffer;\r\n property OnGetFileAsStream: TFileAsStreamEvent read FOnGetFileAsStream write FOnGetFileAsStream;\r\n property OnGetFileAsBase64: TFileAsBase64Event read FOnFileAsBase64 write FOnFileAsBase64;\r\n property OnGetFileAsDataURL: TFileAsDataURLEvent read FOnFileAsDataURL write FOnFileAsDataURL;\r\n end;\r\n\r\n TWebOpenDialog = class(TOpenDialog);\r\n\r\n\r\nprocedure MessageDlg(const Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; AResultProc: TDialogResultProc = nil);\r\nprocedure ShowMessage(AMsg: string);\r\nfunction InputBox(const ACaption, APrompt, ADefault: string): string;\r\nfunction InputQuery(const ACaption, APrompt: string; var Value: string): Boolean; overload;\r\nfunction Confirm(const Value: string): boolean;\r\n\r\nimplementation\r\n\r\nuses\r\n WEBLib.Forms, WebLib.Consts;\r\n\r\nconst\r\n lMaterial = 'https://fonts.googleapis.com/icon?family=Material+Icons';\r\n\r\n lWaitCursor =\r\n '0954474946496D61676547494638396190012C01A20000FFFFFFDDDDDDBBBBBB999999FFFFFFFFFFFFFFFFFFFFFFFF21FF0B4E45545343415045322E30030100000021F90405050004002C0000000090012C0182FFFFFFDDDDD'+\r\n 'DBBBBBB999999FFFFFFFFFFFFFFFFFFFFFFFF03FF48BADCFE30CA49ABBD38EBCDBBFF60288E64699E68AAAE6CEBBE702CCF746DDF78AEEF7CEFFFC0A070482C1A8FC8A472C96C3A9FD0A8744AAD5AAFD8AC76CBED7ABFE0B078'+\r\n '4C2E9BCFE8B47ACD6EBBDFF0B87C4EAFDBEFF8BC7ECFEFFBFF808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC'+\r\n '0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF00030A1C48B0A0C18308132A5CC8B0A1C3871023861A407180C4'+\r\n '44152B5E349431FFE346421D357E141492E24892254F062A6951E51F962EC978F400D383809B02621E09493365079C387512A9B981A806A040850A319A812906A441950261D95283530B50A34AF541B52A86AB14B26ADDDA836'+\r\n 'A519F19C4E6243B15AC04B711D4B20D62B629DA0B72E7B6BD5B01EE83BC7A7F74FDCA7782DAB58105FB6DB09801E0C45CEBF62D1CF731E4B28D15642660F93266CA0F3277F6CC43F204D162492F6DDC78B4EA1D834F8376ECFA'+\r\n 'B50ED31016D7B69D237604BF8779AF9EBD80A7E1D4C24BCCFC803BB44809BB2F04981E20B9F19EC48F22F7409D3AEFE676AF87D8CEA1BB79DB5DBD86EF48827C06F3F0D1A7577F41BC08A8E5E1C77F3DDFE459FFFF2624B5817'+\r\n 'EFA7DD71F7D4E1058A0700702D884820B26474083081601E17E1216D7A012179E97A103141AD161771FBEB56110237A57A26C070291E2742B5A70220F2FC6B81E78378C682307E9F970E18ED865370384408220240D111669E4'+\r\n '733F90A8E493504629E594545669E5955866A9A54014FA960400608629E698648EB955973D7E59E69A6C86A9149AF321D1E69C6C0A05679A46D0A9A7993ADDE925117B060A809D7E6E9683A07BBE59287B6A225AA7548B3229A'+\r\n '7A3656E69E9A59866AAE9A69C76EAE9A7A086AAC5728A39E8E99133A06AE59FBDE198259EB0B18A657F91C1BA6A8B9FC5596588A5D22A25AF7BF9AA24B04310BBA2B145206BDD8CFF4928CB1FB34C387B19B44F503BADB0EBA1'+\r\n '402A61BAAA862DB79286605F7DDD92662BB8DB32A72A88B226E6AA8CEB5260A873F1129AAE55F3B2382EBEF77AD6EF8DFF6A682ABDFBF25BE1AC8B15CCC0BBA2FEC6B05FED36ECB09009E71B6AC402336AA2C59F32ACD9911E4'+\r\n 'B3C61662473CC69C8232BCC98C99AA29CB2C6F2B27C29C62BAB5C73BD2D1BAAB3CC5AD27C73C0ECF28C70BCF3BA9C73BDF91A8DA9D22F034D30CC0D33DD74B893E13C34CE16FBBC34C75C0B1DA5C9605B7DABCD1B438D2ED5A7'+\r\n '9A7DF6C0678BFC31DB6B1F0C2FDC6E77E075DDCA898D770A77EF2D42DF7E2F4976E02F004E7890741F9E2ADA8A37EEF8E390472EF9E494576EF9E5649867AEF9E69C77EEF9E7A0872EFAE8A4976EFAE9A8A7AEFAEAACB7EEFAE'+\r\n 'BB0C72EFBECB4D76EFBEDB8E7AEFBEEBCF7EEFBEFC0072FFCF0C4176FFCF1C827AFFCF2CC37EFFCF3D0472FFDF4D4576FFDF5D867AFFDF6DC77EFFDF7E0872FFEF8E497DF7D020021F90405050007002CD60060003000570082'+\r\n 'FFFFFFDDDDDDBBBBBB999999FFFFFFFFFFFFFFFFFFFFFFFF03EC78BABCF3A3C9492B85D0EA7D71E6E0E67D61298DA4A9A2A95AB291BBB2B20BD7E68D8770BC73BA9F2828B4108B1D1472A85C568E4E462F9A1C5127D36B037AE'+\r\n '5AA04608191B60B879FCD9A795DC5A8D7ECB6CF04AF8F1FB2BA9DAADF3BFB7E4880707C83665186877F8960858C8E865A895A0A83940B80970C819A95679DA0A1A2A3A4A5A6A7A8A9AA2A01ADAEAFB0B1B035B2B5B6AF2EB7BA'+\r\n 'B6ACBBBEB826BFC201BDC3BBB9C6B7B4C9B2ABCECFD0D1D2D3D4D53200D800A5D9DCA2DCDFDA9DE0DFE2E3E494E6E3E8E9E05AECEDEEEFDDF1F2D8F4F5EBF5E157FAFBFCF8F9D8954B178AA0B773A3E65148000021F90405050'+\r\n '007002CD60075003000570082FFFFFFDDDDDDBBBBBB999999FFFFFFFFFFFFFFFFFFFFFFFF03E978BADCFE6EC801ABBD6D4ECCFBD1A0274660388E657A8AA9BA62ADFB56B13C93B576D3B9BEE33DCA2F13940C81BD2331A844B6'+\r\n '9A8F1C14529BF24CD6AB30CBED7ABFE0B0784C2E9BCF5C817ACD6EBBDBB3B77CCE5ED1EFF3137E0F1FF1FF027A807B76837471866F688B8C8D8E8F909192930A01960166979A639A9D98609E9DA0A1A25DA4A1A6A79E5CAAABA'+\r\n 'CAD9BAFB096B2B3A9B39F59B8B91000BE002FB815BFBFC1B0BDC4C5C6A7C8C9C037CC0FCECAD0A5D2D3CF3BB1C3D862D8BEDEDD61DFD95FDF63E7E3E2EAD3E1EBE6EF5EE4EECEE8F15DE9ECF5FAFB60F9FEEDE81123D3CF1EB8'+\r\n '2909000021F90405050007002CC40092004200420082FFFFFFDDDDDDBBBBBB999999FFFFFFFFFFFFFFFFFFFFFFFF03F978BADCFE508D49ABBD36EA1DB1FF15277260F98DE863AE59EA4A6CFCBEB13CBBB579CFF9B9FFC0A0704'+\r\n '82C1A8FC8A472C96C3A9FD0A8747A105805D4D7759B1D6DBFD8AE06FC1547C860B3034D5633D86D77155E96CFE957FB1D1F76F3F3767F567A8246018701377F4488888A78438D8D3B74919287406C96978999751100A1001C9C'+\r\n '98415C1AA2A2A4A54FAAAA1BA5A64CAFABB1AD4DB5A1ACB84BBAA3BC97B9BA23B2B4C422C6BEC8C9BD48BF28B29DCFCCCD9C4AD0D1CA47D9DAD7D4B52FDB45DDDEC2DCD5E692E8E1E2E342E529EF41F1F2DF44F5EA8EE4E92EE'+\r\n '7FCED764C62F74A8F837C7610CA51E886A11A870F0B1A7C006B6283040021F90405050007002CA700A4005700300082FFFFFFDDDDDDBBBBBB999999FFFFFFFFFFFFFFFFFFFFFFFF03FF78BADCFE30CA37EA9838EBCD8FFD5D28'+\r\n '8ECD675E64AA4AA7B9BEB0D7BA711DCEADAD6B78BEFF90DE0948740869C5E411942C2E2D4DE51315054E35802CE027E80A464F8C56ABF37AC1C7C9785C339B4942F53ADB76775538C99C1CB39FF148107B7413018601187E772'+\r\n 'B4C11835B858786898A518F90119292138A8B458F189A87947E4997A1A2889C9D9F8319A9AAABA540A0AFA91AAC3FB5A8A2B8953BBBBC9A1BB935A71AB0C4C530C1C29BCAB3CCCD91BDD0D12BD3D4C31CCB29D9DACFDCBF2ADF'+\r\n '12C91DDD22E5E6B721E91CC71DE7E8EF58AE22F3F4D71DF7F8ED22E342F40B914F9F1B6F6B521434E889041B85FF46BCA9E26C14C5280B2FFEC8A8511307C78E353E82842172E48B6A2689844BA920010021F90405050007002'+\r\n 'C9200A4005700300082FFFFFFDDDDDDBBBBBB999999FFFFFFFFFFFFFFFFFFFFFFFF03FF78BADC0E10B849ABBD38B7C8B5FFE0C78D52689E2139A26C4BA9A42BB7B03ADF606DE33CA6C7BDE0E4B7121A17C4CE71998C2C8F4DC8'+\r\n '13DA9C5289A78036201C7807996476ABED7DBF3E1D8A4CC69DCF975A8BBD75BFBD69258B5EBFDDD1714E2E7C6517028702187F785607845C8688878A8B568F90159292178B8C4B8F189A88947F4F97A1A2899C9D9F8419A9AAA'+\r\n 'BA546A0AFA91AAC42B5A8A2B89541BBBC9A1EB938A71AB0C4C533C1C29BCAB3CCCD91BDD0D183AE1FC91FCB7BD9DAB720DD637C21DBDCBFDEE5E6E1E2E926C720E7E8EF20D3C8EDEED7F6EB26F3FA6FD6F46357CD443D7E6D50'+\r\n 'FC03E849602185F90C026A446D18452B0B2F0AC9A8B11207C78E383E829C2172A48C82268D3CE391000021F90405050007002C8A0092004200420082FFFFFFDDDDDDBBBBBB999999FFFFFFFFFFFFFFFFFFFFFFFF03F57807DCF'+\r\n 'EF0A949ABBD98C6CD5DFEE0D58D5C6882642A9DACA5BE402B4FB03ADFF578EFF9B6FFC0A070482C1A8FC8A472C96C3A9FD0A8744A3D05AE81AA0CCBD59AB8E0AC3713068F2FE5F099922EAF0F6DF73AAE3ED3CDF63BF6ADDFE7'+\r\n 'FB7C8081773B028602467A85878645743F8C8C446D4191878E784096979857439B8D2003A30352A088A2A4A350A7A819AAAA4FA721B0A44EADB4B5A54DB3B9B5BCA027BABB4BBDBEB04CC6C7B14AB8C2BAC5C12CC3CDCACBB64'+\r\n '9D6D7AB48DADBC446DEA9BF47E2E3C8E1E61FD4E99B3BEC45D237F044F233F4F59140F8F9A13FFC6F26000C78606040836F10AE5178866143740431304B000021F90405050007002C8A0075003000570082FFFFFFDDDDDDBBBB'+\r\n 'BB999999FFFFFFFFFFFFFFFFFFFFFFFF03E778BA0C0E2CCA496B7BCEEA4DB1E7E0E68D61298DA8A9A2A95AB2ADCBC1B1ACD1A47DE3982EF20FDF0E0811768845E304A9AC009B161C340A9B0E7BD65F26CBED7ABFE0B0784C2E9'+\r\n 'BCFA1807ACD6EBBDBB6B77CCE76D1EF73157E0F37F1FF017A807B76837471866F688B8C8D8E8F909192936802960266979A639A9D98609E9D5FA19E5DA4A159A7A856AAA553ADA2AFB097A9B396ACB69FB2B35CB63203C00316'+\r\n 'BC2EC1C115AD36C6C614A73ECBC7CDB13AD0D1D2B742D5C062DAC261DDDE60DDDCE3DFDAE4D563E5E2E7E6EDECE9EEF1F0D0E8F5F6CBF8CCF2F7F4F9FADBD4CDD377669F86040021F90405050007002C8A0060003000570082F'+\r\n 'FFFFFDDDDDDBBBBBB999999FFFFFFFFFFFFFFFFFFFFFFFF03EB78BADCFE0B4800ABBD6D4ECCBBD29A2756E0369E4C69A2A7BAB2A24BC1AD4B8FF28DDB7A27CF3D4C2E281C122DC62389A784249B8E2734229D1EAAD39F35CA84'+\r\n '04BE811EF60006EBB0E5F4ADCB48BB61EC857BCE2A55E67454C882CF4FFB7E50806F7F83655B8687568966858C888F90835B7280949578976D849A9B5F9DA0A1A2A3A4A5A6A7A8A93A02ACADAEAFB0AF30B1B4B5AE28B6B9B52'+\r\n '7BABDB223BEC102BCC2BDB8C5B6B3C8B1AACDCECFD0D1D2D3D4CF03D703A3D8DBA0DBDED997DFDE94E2DF56E5E250E8E94DEBE64AEEE3F0F1D8EAF4D7EDF7E0F3F453F75BFD00AED3842ED43B51DCAC24000021F90405050007'+\r\n '002C8A0058004200420082FFFFFFDDDDDDBBBBBB999999FFFFFFFFFFFFFFFFFFFFFFFF03FD78BADCFE30CA062A9838EB69EDFE20D77961698EA4A96E68B5BE597BC13424D738D5E64BE007AF1BEFF75B097144A2EA584B164FB'+\r\n 'B9CF31962D2A6D48FF58A2D6DB9D36A74D8057DC14EF3985CD69CD149ED9A1D76CFE9713B8AE7C0026377784A807B7C0D7E842386878822858B3D6D116F528D93818696971D13029E027083129C129F9F309A2BA6AB2F92AAAB'+\r\n 'AC26AE2AB0B5B27934B5B625A235BABB9020BFC0C11BC3B0C51FC7B1C91ACBA6CDC6CF9ED119D3D4D518D7D9D6CBDCCEC3DFE0BAE2D2CCE5E3A0E8EBECEDEEEFF0F1F2F3F4F5F68603F9FAFBFCFDFCD5FE020ADCD76CA04181C'+\r\n '90E2AFC576CA1C301091F2A2C287120C08AFEA225000021F90405050007002C920058005700300082FFFFFFDDDDDDBBBBBB999999FFFFFFFFFFFFFFFFFFFFFFFF03FF78BADCFE30BE4083BC38EB3D2BE560284A9E379E285756'+\r\n '69EB76EB2BBFEB37DF676DE13CA8F723815090FAA10048406B38441947C9248AC9CCD54ED1E889DA1C3D435969902BF45E4561B188DCF59D4169F59A2DFA6EE2CA149BE88EC1E32E7B217619782F822A6F1A8687881A8412787'+\r\n '98D64897E8B80337B7C19901092388E189E0F8CA1749D8A91993CA224AA11A6ADA817A40CB2B3B411B60AA0400AAE302518B83D9BB5B00DBEBFC0BA1097B1AC1003D40381CEC2C4D20FD5D54BD847DB0DDDE47A9532E2E3E4E5'+\r\n '635C33E90CEBF2ED6DE85918F2F373653C5A19F9FA9809041850E02F82EB0C3243C84E211086DD1C1E84484D620F8A152DF2C0A8F11322C38E0F09820C996FE4C48626495A4BA921010021F90401050007002CA700580057003'+\r\n '00082FFFFFFDDDDDDBBBBBB999999FFFFFFFFFFFFFFFFFFFFFFFF03FF78BADCFE4B4801ABBD38EB36E7FE60A8759D689E22E9A16C5BA9922BCF074CD1F869E77CB8F7A28170C0FA9D02C8406B38441945C9248AC9D4C18E51A9'+\r\n '89DA343D41596D902BF45EA161E489DC057D3569F1989C3A83E34BB6CFBE892BF3746E7C70782E6C441F6F177E33878823838B8C8D7A1B8A1593949519970F7E7F34879691988539A29CA49EA6A79B179D0D993CA8AFAAB1ACB'+\r\n '3B42FB60B9F400BBA10B00AB2408EB52A92B8C6AEC22418C5BF07C10F25CA612E00DA0018D428D121DBDBDD8132CB20E2E917CD2CE71AE9F0E45538D822F0F719F3395126F7F8D2D2FCFD03D843E04082380CC643C843A13A86'+\r\n '091D8E834843E2448A332C6AC358D11422C7880A3FE6082972A4C0920517A24CB9D14402003B1';\r\n\r\nvar\r\n WebLibDlg: TMessageDlg;\r\n\r\nfunction StringToHTML(AValue: string): string;\r\nbegin\r\n Result := StringReplace(AValue,#13,'
',[rfReplaceAll]);\r\n Result := StringReplace(Result,#10,'',[rfReplaceAll]);\r\nend;\r\n\r\nprocedure ShowMessage(AMsg: string);\r\nbegin\r\n if (Application <> nil) and (Application.MainForm <> nil) and (Application.MainForm.CSSLibrary = cssBootstrap) then\r\n begin\r\n MessageDlg(AMsg, mtInformation, [mbOK]);\r\n end\r\n else\r\n begin\r\n asm\r\n alert(AMsg);\r\n end;\r\n end;\r\nend;\r\n\r\nfunction InputBox(const ACaption, APrompt, ADefault: string): string;\r\nvar\r\n retvalue: string;\r\nbegin\r\n//\r\n asm\r\n retvalue = prompt(APrompt, ADefault);\r\n if (retvalue == null) {\r\n retvalue = \"\";\r\n }\r\n end;\r\n\r\n Result := retvalue;\r\nend;\r\n\r\nfunction InputQuery(const ACaption, APrompt: string; var Value: string): Boolean; overload;\r\nvar\r\n retvalue: boolean;\r\n s: string;\r\nbegin\r\n retvalue := true;\r\n s := Value;\r\n\r\n asm\r\n var text = s;\r\n s = prompt(APrompt, text);\r\n if (s == null) {\r\n retvalue = false;\r\n }\r\n end;\r\n\r\n if retvalue then\r\n Value := s;\r\n\r\n Result := retvalue;\r\nend;\r\n\r\nfunction Confirm(const Value: string): boolean;\r\nvar\r\n res: boolean;\r\nbegin\r\n asm\r\n res = confirm(Value);\r\n end;\r\n Result := res;\r\nend;\r\n\r\nprocedure MessageDlg(const Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; AResultProc: TDialogResultProc = nil);\r\nbegin\r\n if not Assigned(WebLibDlg) then\r\n begin\r\n WebLibDlg := TMessageDlg.Create(nil);\r\n if Application.MainForm.CSSLibrary = cssBootstrap then\r\n begin\r\n TMessageDlg(WebLibDlg).InitBootstrapStyle;\r\n end;\r\n end;\r\n\r\n WebLibDlg.ShowDialog(Msg, DlgType, Buttons, AResultProc);\r\nend;\r\n\r\n{ TMessageDlg }\r\n\r\nprocedure TMessageDlg.CreateInitialize;\r\nbegin\r\n inherited;\r\n FOpacity := 0.2;\r\n FMessage := '';\r\n FMsgDlgType := mtInformation;\r\n FDialogText := TStringList.Create;\r\n FDialogText.SkipLastLinebreak := true;\r\n FDialogText.Add(SWarning); // 0\r\n FDialogText.Add(SError); // 1\r\n FDialogText.Add(SInformation); // 2\r\n FDialogText.Add(SConfirm); // 3\r\n FDialogText.Add('Custom'); // 4\r\n FDialogText.Add(SOK); // 5\r\n FDialogText.Add(SCancel); // 6\r\n FDialogText.Add(SYes); // 7\r\n FDialogText.Add(SNo); // 8\r\n FDialogText.Add(SAbort); // 9\r\n FDialogText.Add(SRetry); // 10\r\n FDialogText.Add(SIgnore); // 11\r\n FDialogText.Add(SAll); // 12\r\n FDialogText.Add(SYestoAll); // 13\r\n FDialogText.Add(SNotoAll); // 14\r\n FDialogText.Add(SHelp); // 15\r\n FDialogText.Add(SClose); // 16\r\n\r\n FMsgDlgType := mtCustom;\r\n\r\n FCustomButtons := TCustomDialogButtons.Create(Self, TCustomDialogButton);\r\n FCustomButtons.PropName := 'CustomButtons';\r\nend;\r\n\r\ndestructor TMessageDlg.Destroy;\r\nbegin\r\n FDialogText.Free;\r\n FCustomButtons.Free;\r\n inherited;\r\nend;\r\n\r\nfunction TMessageDlg.GetDialogText(Index: integer): string;\r\nbegin\r\n Result := 'Undefined';\r\n\r\n if Index < FDialogText.Count then\r\n Result := FDialogText.Strings[Index];\r\nend;\r\n\r\nprocedure TMessageDlg.BindEvents;\r\nbegin\r\n//\r\nend;\r\n\r\nfunction TMessageDlg.ShowDialog: integer;\r\nbegin\r\n Result := mrNone;\r\n Show;\r\nend;\r\n\r\nfunction TMessageDlg.ShowDialog(Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; AProc: TDialogResultProc = nil): TDialogResult;\r\nbegin\r\n Result := mrNone;\r\n FButtons := Buttons;\r\n FMessage := Msg;\r\n FMsgDlgType := DlgType;\r\n FDialogProc := AProc;\r\n DialogResult := mrNone;\r\n Show;\r\nend;\r\n\r\nfunction TMessageDlg.CreateButton(Caption: string; var DoFocus: boolean; AClass: string = ''): TJSHTMLElement;\r\nbegin\r\n Result := TJSHTMLElement(document.createElement('BUTTON'));\r\n Result.innerHTML := Caption;\r\n\r\n if Application.MainForm.CSSLibrary = cssBootstrap then\r\n begin\r\n Result['type'] := 'BUTTON';\r\n Result['class'] := 'btn ' + AClass;\r\n Result['data-dismiss'] := 'modal-dialog';\r\n end\r\n else\r\n begin\r\n Result.style.setProperty('width', '100px');\r\n Result.style.setProperty('margin-left', '5px');\r\n if ElementButtonClassName <> '' then\r\n Result['class'] := ElementButtonClassName + ' ' + AClass\r\n else\r\n if Application.ThemeButtonClassName <> '' then\r\n Result['class'] := Application.ThemeButtonClassName + ' ' + AClass;\r\n end;\r\n\r\n Result.id := Caption;\r\n Result.addEventListener('click', @HandleButtonClick);\r\n Result.addEventListener('keydown', @HandleKeyDown);\r\n\r\n if DoFocus then\r\n begin\r\n asm\r\n setTimeout(function() {Result.focus();}, 1);\r\n end;\r\n DoFocus := false;\r\n end;\r\nend;\r\n\r\nfunction TMessageDlg.CreateElement: TJSElement;\r\nbegin\r\n if (csDesigning in ComponentState) then\r\n Result := nil\r\n else\r\n inherited;\r\nend;\r\n\r\nprocedure TMessageDlg.Show;\r\nvar\r\n title, msg, icon, content, contentdiv, bar, edlg, eh, cancel: TJSHTMLElement;\r\n adiv,ldiv,cdiv: TJSElement;\r\n MsgSymbol, MsgColor, MsgTitle, BorderColor, BarBGColor, BarHeight, Padding: string;\r\n btnFocus: boolean;\r\n i: Integer;\r\n\r\n\r\nbegin\r\n if (Application = nil) or (Application.MainForm = nil) then\r\n Exit;\r\n\r\n // verify material icons\r\n if not Application.HasCSS(lMaterial) then\r\n AddControlLink('material',lMaterial);\r\n\r\n Application.LockForm(Application.MainForm);\r\n\r\n FLayer := document.createElement('SPAN');\r\n document.body.appendChild(FLayer);\r\n FLayer['tabindex'] := '0';\r\n FLayer.addEventListener('keydown', @HandleKeyDown);\r\n\r\n btnFocus := true;\r\n MsgTitle := FTitle;\r\n FMessage := StringToHTML(FMessage);\r\n\r\n case FMsgDlgType of\r\n mtWarning: begin MsgSymbol := 'warning'; MsgColor := 'orange'; MsgTitle := GetDialogText(0); end;\r\n mtError: begin MsgSymbol := 'cancel'; MsgColor := 'red'; MsgTitle := GetDialogText(1); end;\r\n mtInformation: begin MsgSymbol := 'info'; MsgColor := 'blue'; MsgTitle := GetDialogText(2); end;\r\n mtConfirmation: begin MsgSymbol := 'help'; MsgColor := 'blue'; MsgTitle := GetDialogText(3); end;\r\n mtCustom: begin MsgSymbol := ''; MsgColor := ''; MsgTitle := GetDialogText(4); end;\r\n end;\r\n\r\n if Application.MainForm.CSSLibrary = cssBootstrap then\r\n begin\r\n FDlg := document.createElement('DIV');\r\n FDlg['class'] := 'modal-dialog'; // modal-dialog-centered';\r\n FDlg['role'] := 'document';\r\n\r\n // app wide highest z-index\r\n TJSHTMLElement(FDlg).style.setProperty('z-index', '1999998');\r\n\r\n // insert opaque background on entire window\r\n eh := TJSHTMLElement(document.createElement('SPAN'));\r\n eh.style.setProperty('position', 'absolute');\r\n eh.style.setProperty('top', '0');\r\n eh.style.setProperty('left', '0');\r\n eh.style.setProperty('right', '0');\r\n eh.style.setProperty('bottom', '0');\r\n eh.style.setProperty('z-index', '1999997');\r\n document.body.appendChild(eh);\r\n eh.appendChild(FDlg);\r\n\r\n ldiv := FDlg;\r\n\r\n adiv := document.createElement('DIV');\r\n adiv['class'] := 'modal-content ' + ElementDialogClassName;\r\n ldiv.appendChild(adiv);\r\n\r\n cdiv := adiv;\r\n ldiv := adiv;\r\n\r\n adiv := document.createElement('DIV');\r\n adiv['class'] := 'modal-header';\r\n cdiv.appendChild(adiv);\r\n\r\n ldiv := adiv;\r\n\r\n adiv := document.createElement('H5');\r\n adiv['class'] := 'modal-title';\r\n adiv.innerHTML := MsgTitle;\r\n\r\n ldiv.appendChild(adiv);\r\n\r\n if (mbCancel in Buttons) then\r\n begin\r\n adiv := document.createElement('BUTTON');\r\n adiv['type'] := 'button';\r\n adiv['class'] := 'close';\r\n adiv['data-dismiss'] := 'modal-dialog';\r\n adiv['aria-label'] := 'Close';\r\n adiv['id'] := GetDialogText(6);\r\n adiv.addEventListener('click', @HandleButtonClick);\r\n\r\n ldiv.appendChild(adiv);\r\n ldiv := adiv;\r\n\r\n adiv := document.createElement('SPAN');\r\n adiv['aria-hidden'] := 'true';\r\n adiv.innerHTML := '×';\r\n\r\n ldiv.appendChild(adiv);\r\n end;\r\n\r\n adiv := document.createElement('DIV');\r\n adiv['class'] := 'modal-body';\r\n cdiv.appendChild(adiv);\r\n\r\n ldiv := adiv;\r\n\r\n if FMsgDlgType <> mtCustom then\r\n begin\r\n icon := TJSHTMLElement(document.createElement('SPAN'));\r\n icon.innerHTML := '' + MsgSymbol + '';\r\n icon.style.setProperty('display', 'inline-block');\r\n icon.style.setProperty('float', 'left');\r\n icon.style.setProperty('padding-right', '15px');\r\n ldiv.appendChild(icon);\r\n end;\r\n\r\n adiv := document.createElement('H6');\r\n adiv.innerHTML := FMessage;\r\n\r\n ldiv.appendChild(adiv);\r\n\r\n adiv := document.createElement('DIV');\r\n adiv['class'] := 'modal-footer';\r\n cdiv.appendChild(adiv);\r\n\r\n ldiv := adiv;\r\n\r\n bar := TJSHTMLElement(ldiv);\r\n\r\n FDlg := eh;\r\n end\r\n else\r\n begin\r\n Padding := '5';\r\n BarHeight := '26';\r\n BarBGColor := '#f1f1f1';\r\n BorderColor := '#ababab';\r\n\r\n FDlg := document.createElement('DIV');\r\n document.body.appendChild(FDlg);\r\n\r\n edlg := TJSHTMLElement(FDlg);\r\n\r\n if ElementDialogClassName <> '' then\r\n edlg['class'] := ElementDialogClassName\r\n else\r\n begin\r\n edlg.style.setProperty('background-color', 'white');\r\n edlg.style.setProperty('border', '1px solid ' + BorderColor);\r\n edlg.style.setProperty('font-family', 'Arial');\r\n edlg.style.setProperty('font-size', '10pt');\r\n end;\r\n\r\n edlg.style.setProperty('cursor', 'default');\r\n edlg.style.setProperty('position', 'fixed');\r\n edlg.style.setProperty('min-width', '300px');\r\n edlg.style.setProperty('min-height', '125px');\r\n edlg.style.setProperty('max-width', '100%');\r\n edlg.style.setProperty('max-height', '100%');\r\n edlg.style.setProperty('top', '50%');\r\n edlg.style.setProperty('left', '50%');\r\n edlg.style.setProperty('transform', 'translate(-50%, -50%)');\r\n edlg.style.setProperty('z-index', '1999998');\r\n edlg.style.setProperty('box-shadow','5px 5px 5px gray');\r\n\r\n cancel := TJSHTMLElement(document.createElement('DIV'));\r\n FCancel := cancel;\r\n cancel.innerHTML := 'clear';\r\n cancel.id := 'Cancel';\r\n cancel.style.setProperty('color', ColorToHTML(Application.ThemeTextColor));\r\n cancel.style.setProperty('position', 'fixed');\r\n cancel.style.setProperty('top', '0');\r\n cancel.style.setProperty('right', '0');\r\n cancel.style.setProperty('padding', Padding + 'px');\r\n cancel.style.setProperty('height', BarHeight + 'px');\r\n cancel.style.setProperty('line-height', BarHeight + 'px');\r\n cancel.addEventListener('click', @HandleButtonClick);\r\n edlg.appendChild(cancel);\r\n\r\n title := TJSHTMLElement(document.createElement('DIV'));\r\n title.innerHTML := MsgTitle;\r\n\r\n if FElementTitleClassName <> '' then\r\n begin\r\n title['class'] := FElementTitleClassName;\r\n end\r\n else\r\n begin\r\n title.style.setProperty('background-color', ColorToHTML(Application.ThemeColor));\r\n title.style.setProperty('color', ColorToHTML(Application.ThemeTextColor));\r\n end;\r\n\r\n title.style.setProperty('cursor', 'move');\r\n title.style.setProperty('padding-left', Padding + 'px');\r\n title.style.setProperty('height', BarHeight + 'px');\r\n title.style.setProperty('vertical-align','middle');\r\n title.style.setProperty('line-height', BarHeight + 'px');\r\n title.style.setProperty('border-bottom', '1px solid ' + BorderColor);\r\n\r\n title.style.setProperty('-moz-user-select','none');\r\n title.style.setProperty('-webkit-user-select','none');\r\n title.style.setProperty('-ms-user-select','none');\r\n title.style.setProperty('user-select','none');\r\n title.style.setProperty('-o-user-select','none');\r\n\r\n title.addEventListener('mousedown',@HandleMouseDown);\r\n\r\n edlg.appendChild(title);\r\n\r\n msg := TJSHTMLElement(document.createElement('DIV'));\r\n\r\n msg.style.setProperty('padding', Padding + 'px');\r\n msg.style.setProperty('height', 'auto');\r\n msg.style.setProperty('min-height', '50px');\r\n msg.style.setProperty('border-bottom', '1px solid ' + BorderColor);\r\n\r\n if FMsgDlgType <> mtCustom then\r\n begin\r\n icon := TJSHTMLElement(document.createElement('DIV'));\r\n icon.innerHTML := '' + MsgSymbol + '';\r\n icon.style.setProperty('display', 'inline-block');\r\n icon.style.setProperty('float', 'left');\r\n icon.style.setProperty('padding-right', '15px');\r\n msg.appendChild(icon);\r\n end;\r\n\r\n FMessage := StringReplace(FMessage, sLineBreak, '
', [rfReplaceAll]);\r\n\r\n contentdiv := TJSHTMLElement(document.createElement('DIV'));\r\n contentdiv.innerHTML := FMessage;\r\n contentdiv.style.setProperty('height','auto');\r\n contentdiv.style.setProperty('min-height','50px');\r\n contentdiv.style.setProperty('white-space','pre-wrap');\r\n\r\n content := TJSHTMLElement(document.createElement('LABEL'));\r\n content.innerHTML := FMessage;\r\n\r\n if FElementTitleClassName <> '' then\r\n begin\r\n content['class'] := FElementContentClassName;\r\n end;\r\n\r\n contentdiv.appendChild(content);\r\n\r\n msg.appendChild(content);\r\n\r\n edlg.appendChild(msg);\r\n\r\n bar := TJSHTMLElement(document.createElement('DIV'));\r\n bar.style.setProperty('background-color', BarBGColor);\r\n bar.style.setProperty('padding', Padding + 'px');\r\n bar.style.setProperty('min-height', BarHeight + 'px');\r\n bar.style.setProperty('height', 'auto');\r\n bar.style.setProperty('line-height', BarHeight + 'px');\r\n bar.style.setProperty('text-align', 'right');\r\n edlg.appendChild(bar);\r\n end;\r\n\r\n if (FButtons = []) and (CustomButtons.Count = 0) then\r\n bar.appendChild(CreateButton(GetDialogText(5), btnFocus))\r\n else\r\n begin\r\n if mbYes in FButtons then\r\n bar.appendChild(CreateButton(GetDialogText(7), btnFocus));\r\n\r\n if mbNo in FButtons then\r\n bar.appendChild(CreateButton(GetDialogText(8), btnFocus));\r\n\r\n if mbOK in FButtons then\r\n bar.appendChild(CreateButton(GetDialogText(5), btnFocus));\r\n\r\n if mbCancel in FButtons then\r\n bar.appendChild(CreateButton(GetDialogText(6), btnFocus));\r\n\r\n if mbAbort in FButtons then\r\n bar.appendChild(CreateButton(GetDialogText(9), btnFocus));\r\n\r\n if mbRetry in FButtons then\r\n bar.appendChild(CreateButton(GetDialogText(10), btnFocus));\r\n\r\n if mbIgnore in FButtons then\r\n bar.appendChild(CreateButton(GetDialogText(11), btnFocus));\r\n\r\n if mbAll in FButtons then\r\n bar.appendChild(CreateButton(GetDialogText(12), btnFocus));\r\n\r\n if mbYesToAll in FButtons then\r\n bar.appendChild(CreateButton(GetDialogText(13), btnFocus));\r\n\r\n if mbNoToAll in FButtons then\r\n bar.appendChild(CreateButton(GetDialogText(14), btnFocus));\r\n\r\n if mbHelp in FButtons then\r\n bar.appendChild(CreateButton(GetDialogText(15), btnFocus));\r\n\r\n if mbClose in FButtons then\r\n bar.appendChild(CreateButton(GetDialogText(16), btnFocus));\r\n end;\r\n\r\n for i := 0 to FCustomButtons.Count - 1 do\r\n begin\r\n bar.appendChild(CreateButton(FCustomButtons[i].Caption, btnFocus, FCustomButtons[i].ElementClassName));\r\n end;\r\n\r\n eh := TJSHTMLElement(FLayer);\r\n eh.style.setProperty('background-color', 'black');\r\n eh.style.setProperty('opacity', DoubleToHTML(Opacity));\r\n\r\n eh.style.setProperty('top', '0');\r\n eh.style.setProperty('left', '0');\r\n eh.style.setProperty('right', '0');\r\n eh.style.setProperty('bottom', '0');\r\n eh.style.setProperty('z-index', '19990');\r\n\r\n eh.style.setProperty('webkit-user-select', 'none');\r\n eh.style.setProperty('moz-user-select', 'none');\r\n eh.style.setProperty('khtml-user-select', 'none');\r\n eh.style.setProperty('ms-user-select', 'none');\r\n eh.style.setProperty('user-select', 'none');\r\n eh.style.SetProperty('position','fixed');\r\nend;\r\n\r\nfunction TMessageDlg.ShowDialog(Msg: string; DlgType: TMsgDlgType;\r\n Buttons: TMsgDlgButtons): TJSPromise;\r\nbegin\r\n Result := TJSPromise.new(\r\n\r\n procedure(ASuccess, AFailed: TJSPromiseResolver)\r\n begin\r\n ShowDialog(Msg, DlgType, Buttons, procedure(AResult: TModalResult)\r\n begin\r\n ASuccess(AResult);\r\n end);\r\n end\r\n\r\n );\r\nend;\r\n\r\nprocedure TMessageDlg.SetCustomButtons(const Value: TCustomDialogButtons);\r\nbegin\r\n FCustomButtons.Assign(Value);\r\nend;\r\n\r\nprocedure TMessageDlg.SetDialogResult(const Value: TDialogResult);\r\nbegin\r\n FDialogResult := Value;\r\n if (FDialogResult <> mrNone) then\r\n Close;\r\nend;\r\n\r\nprocedure TMessageDlg.SetDialogText(const Value: TStringList);\r\nbegin\r\n FDialogText.Assign(Value);\r\nend;\r\n\r\nprocedure TMessageDlg.Close;\r\nbegin\r\n Application.UnlockForm(Application.MainForm);\r\n\r\n document.body.removeChild(FLayer);\r\n document.body.removeChild(FDlg);\r\n\r\n FDown := false;\r\n FCaptured := false;\r\n\r\n if Assigned(OnClose) then\r\n OnClose(Self);\r\n\r\n if Assigned(FDialogProc) then\r\n FDialogProc(FDialogResult);\r\nend;\r\n\r\nfunction TMessageDlg.HandleButtonClick(Event: TJSMouseEvent): Boolean;\r\nvar\r\n id: string;\r\n i: integer;\r\nbegin\r\n DialogResult := mrNone;\r\n\r\n id := event.targetElement['id'];\r\n\r\n if id = GetDialogText(7) then\r\n DialogResult := mrYes\r\n else if id = GetDialogText(8) then\r\n DialogResult := mrNo\r\n else if id = GetDialogText(5) then\r\n DialogResult := mrOK\r\n else if id = GetDialogText(6) then\r\n DialogResult := mrCancel\r\n else if id = GetDialogText(9) then\r\n DialogResult := mrAbort\r\n else if id = GetDialogText(10) then\r\n DialogResult := mrRetry\r\n else if id = GetDialogText(11) then\r\n DialogResult := mrIgnore\r\n else if id = GetDialogText(12) then\r\n DialogResult := mrAll\r\n else if id = GetDialogText(13) then\r\n DialogResult := mrNoToAll\r\n else if id = GetDialogText(14) then\r\n DialogResult := mrYesToAll\r\n else if id = GetDialogText(15) then\r\n DialogResult := mrHelp\r\n else if id = GetDialogText(16) then\r\n DialogResult := mrClose;\r\n\r\n if (DialogResult = mrNone) and (CustomButtons.Count > 0) then\r\n begin\r\n for i := 0 to CustomButtons.Count - 1 do\r\n begin\r\n if id = CustomButtons[i].Caption then\r\n begin\r\n DialogResult := 100 + i;\r\n break;\r\n end;\r\n\r\n end;\r\n end;\r\n\r\n if Assigned(OnButtonClick) then\r\n OnButtonClick(Self);\r\n\r\n Result := true;\r\nend;\r\n\r\nfunction TMessageDlg.HandleDocMouseMove(Event: TJSMouseEvent): Boolean;\r\nvar\r\n deltax,deltay: double;\r\n el: TJSHTMLElement;\r\nbegin\r\n if FDown then\r\n begin\r\n deltax := Event.screenX - FMdx;\r\n deltay := Event.screenY - FMdy;\r\n\r\n el := TJSHTMLElement(FDlg);\r\n\r\n el.style.setProperty('transform','');\r\n el.style.setProperty('position','absolute');\r\n el.style.setProperty('left', inttostr(round(FDlgX + deltax))+'px');\r\n el.style.setProperty('top', inttostr(round(FDlgY + deltay))+'px');\r\n\r\n el := TJSHTMLElement(FCancel);\r\n el.style.setProperty('position', 'absolute');\r\n el.style.setProperty('top', '0');\r\n el.style.setProperty('right', '0');\r\n end;\r\n\r\n Result := true;\r\nend;\r\n\r\nfunction TMessageDlg.HandleDocMouseUp(Event: TJSMouseEvent): Boolean;\r\nbegin\r\n FDown := false;\r\n document.body.removeEventListener('mousemove', @HandleDocMouseMove);\r\n document.body.removeEventListener('mouseup', @HandleDocMouseUp);\r\n\r\n Result := true;\r\nend;\r\n\r\nfunction TMessageDlg.HandleMouseDown(Event: TJSMouseEvent): Boolean;\r\nvar\r\n r: TJSDOMRect;\r\nbegin\r\n FMdx := Round(Event.screenX);\r\n FMdy := Round(Event.screenY);\r\n\r\n r := FDlg.getBoundingClientRect();\r\n\r\n FDlgX := Round(int(r.left));\r\n FDlgY := Round(int(r.top));\r\n\r\n FDown := true;\r\n\r\n if not FCaptured then\r\n begin\r\n FCaptured := true;\r\n document.body.addEventListener('mousemove', @HandleDocMouseMove);\r\n document.body.addEventListener('mouseup', @HandleDocMouseUp);\r\n end;\r\n\r\n Result := true;\r\nend;\r\n\r\nprocedure TMessageDlg.InitBootstrapStyle;\r\nbegin\r\n FElementButtonClassName := 'btn';\r\n FElementContentClassName := 'text-body';\r\n FElementTitleClassName := 'text-body';\r\n FElementDialogClassName := 'shadow-lg p-3 mb-5 bg-white rounded';\r\nend;\r\n\r\nfunction TMessageDlg.HandleKeyDown(Event: TJSKeyBoardEvent): Boolean;\r\nvar\r\n k: Word;\r\nbegin\r\n k := GetKeyCode(Event.Key);\r\n if not Assigned(k) then\r\n Exit;\r\n if k = VK_ESCAPE then\r\n DialogResult := mrCancel;\r\n Result := true;\r\nend;\r\n\r\n{ TWaitMessage }\r\n\r\nfunction TWaitMessage.CreateElement: TJSElement;\r\nbegin\r\n if (csDesigning in ComponentState) then\r\n Result := nil\r\n else\r\n inherited;\r\nend;\r\n\r\nprocedure TWaitMessage.CreateInitialize;\r\nbegin\r\n inherited;\r\n FOpacity := 0.2;\r\n FPicture := TURLPicture.Create;\r\n FIsWaiting := false;\r\n FPicture.Data := lWaitCursor;\r\nend;\r\n\r\ndestructor TWaitMessage.Destroy;\r\nbegin\r\n FPicture.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TWaitMessage.Hide;\r\nbegin\r\n if FIsWaiting then\r\n document.body.removeChild(FLayer);\r\n FIsWaiting := false;\r\nend;\r\n\r\nprocedure TWaitMessage.SetPicture(const Value: TURLPicture);\r\nbegin\r\n FPicture.Assign(Value);\r\nend;\r\n\r\nprocedure TWaitMessage.Show;\r\nvar\r\n eh,img,dv: TJSHTMLElement;\r\n el: TJSElement;\r\nbegin\r\n FLayer := document.createElement('SPAN');\r\n\r\n eh := TJSHTMLElement(FLayer);\r\n eh.style.setProperty('background-color', 'black');\r\n eh.style.setProperty('opacity', DoubleToHTML(Opacity));\r\n eh.style.setProperty('top', '0');\r\n eh.style.setProperty('left', '0');\r\n eh.style.setProperty('right', '0');\r\n eh.style.setProperty('bottom', '0');\r\n eh.style.setProperty('z-index', '19999');\r\n\r\n eh.style.setProperty('webkit-user-select', 'none');\r\n eh.style.setProperty('moz-user-select', 'none');\r\n eh.style.setProperty('khtml-user-select', 'none');\r\n eh.style.setProperty('ms-user-select', 'none');\r\n eh.style.setProperty('user-select', 'none');\r\n eh.style.SetProperty('position','fixed');\r\n\r\n document.body.appendChild(FLayer);\r\n FLayer['tabindex'] := '0';\r\n\r\n el := document.createElement('DIV');\r\n dv := TJSHTMLElement(el);\r\n FLayer.appendChild(el);\r\n dv.style.SetProperty('position','relative');\r\n dv.style.SetProperty('width','100%');\r\n dv.style.SetProperty('height','100%');\r\n\r\n el := document.createElement('IMG');\r\n img := TJSHTMLElement(el);\r\n dv.appendChild(img);\r\n img['src'] := FPicture.FileName;\r\n img.style.setProperty('position','absolute');\r\n img.style.setProperty('top', '0');\r\n img.style.setProperty('left', '0');\r\n img.style.setProperty('right', '0');\r\n img.style.setProperty('bottom', '0');\r\n img.style.setProperty('margin', 'auto');\r\n\r\n FIsWaiting := true;\r\n\r\n if Assigned(OnShow) then\r\n begin\r\n window.setTimeout(@WaitDisplayed, 100);\r\n end;\r\nend;\r\n\r\nprocedure TWaitMessage.WaitDisplayed;\r\nbegin\r\n if Assigned(OnShow) then\r\n OnShow(Self);\r\nend;\r\n\r\n{ TCustomDialogButtons }\r\n\r\nfunction TCustomDialogButtons.Add: TCustomDialogButton;\r\nbegin\r\n Result := TCustomDialogButton(inherited Add);\r\nend;\r\n\r\nfunction TCustomDialogButtons.GetItem(AIndex: integer): TCustomDialogButton;\r\nbegin\r\n Result := TCustomDialogButton(inherited Items[AIndex]);\r\nend;\r\n\r\nfunction TCustomDialogButtons.Insert(AIndex: integer): TCustomDialogButton;\r\nbegin\r\n Result := TCustomDialogButton(inherited Insert(AIndex));\r\nend;\r\n\r\nprocedure TCustomDialogButtons.SetItem(AIndex: integer;\r\n const Value: TCustomDialogButton);\r\nbegin\r\n inherited Items[AIndex] := Value;\r\nend;\r\n\r\n{ TOpenDialog }\r\n\r\nconstructor TOpenDialog.Create(AOwner: TComponent);\r\nbegin\r\n inherited Create(AOwner);\r\n FFiles := TFiles.Create(Self);\r\nend;\r\n\r\ndestructor TOpenDialog.Destroy;\r\nbegin\r\n FFiles.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TOpenDialog.Execute(AProc: TOpenDialogProc);\r\nbegin\r\n FOpenDialogProc := AProc;\r\n Execute;\r\nend;\r\n\r\n{$HINTS OFF}\r\nprocedure TOpenDialog.Execute;\r\nvar\r\n ic: pointer;\r\n fp: TJSHTMLElement;\r\nbegin\r\n ic := @HandleInputChange;\r\n fp := TJSHTMLElement(document.createElement('input'));\r\n fp.setAttribute('type','file');\r\n if FMultiFile then\r\n fp.setAttribute('multiple','');\r\n\r\n if FAccept <> '' then\r\n fp.SetAttribute('accept',FAccept);\r\n\r\n fp.addEventListener('change', ic);\r\n\r\n asm\r\n fp.click();\r\n end;\r\nend;\r\n{$HINTS ON}\r\n\r\nprocedure TOpenDialog.HandleInputChange(Event: TJSEvent);\r\nvar\r\n i,l,sz: integer;\r\n s,m: string;\r\n f: TFile;\r\n d: TJSDate;\r\n jsfile: TJSHTMLFile;\r\n\r\nbegin\r\n // clear existing collection\r\n while FFiles.Count > 0 do\r\n FFiles.Delete(0);\r\n\r\n asm\r\n var curFiles = Event.target.files;\r\n l = curFiles.length;\r\n end;\r\n\r\n for i := 0 to l - 1 do\r\n begin\r\n f := FFiles.Add;\r\n\r\n asm\r\n jsfile = curFiles[i];\r\n s = curFiles[i].name;\r\n m = curFiles[i].type;\r\n sz = curFiles[i].size;\r\n d = new Date(curFiles[i].lastModified);\r\n end;\r\n\r\n // get the first file\r\n if (i = 0) then\r\n FFileName := s;\r\n\r\n f.FileObject := jsfile;\r\n f.Name := s;\r\n f.MimeType := m;\r\n f.Size := sz;\r\n f.Modified := EncodeDate(d.Year + 1900, d.Month + 1, d.Date)+EncodeTime(d.Hours, d.Minutes, d.Seconds, d.Milliseconds);\r\n end;\r\n\r\n if Assigned(FOpenDialogProc) then\r\n FOpenDialogProc(FFileName);\r\n\r\n FOpenDialogProc := nil;\r\n\r\n if Assigned(OnChange) then\r\n OnChange(Self);\r\nend;\r\n\r\nfunction TOpenDialog.Perform: TJSPromise;\r\nbegin\r\n Result := TJSPromise.new(\r\n procedure(ASuccess, AFailed: TJSPromiseResolver)\r\n begin\r\n Execute(procedure(AFileName: string)\r\n begin\r\n ASuccess(AFileName);\r\n end);\r\n end\r\n\r\n );\r\nend;\r\n\r\ninitialization\r\n WebLibDlg := nil;\r\n\r\nend.","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright (c) 2018 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.Modules;\r\n\r\n{$DEFINE NOPP}\r\n\r\ninterface\r\n\r\nuses\r\n Classes;\r\n\r\ntype\r\n TDataModuleClass = class of TDataModule;\r\n TDataModule = class(TComponent)\r\n strict private\r\n FHeight: Integer;\r\n FOldCreateOrder: Boolean;\r\n FOnCreate: TNotifyEvent;\r\n FOnDestroy: TNotifyEvent;\r\n FWidth: Integer;\r\n strict protected\r\n procedure DoCreate; virtual;\r\n procedure DoDestroy; virtual;\r\n procedure LoadDFMValues; virtual;\r\n public\r\n constructor CreateNew(AOwner: TComponent; Dummy: Integer = 0); virtual;\r\n procedure AfterConstruction; override;\r\n procedure BeforeDestruction; override;\r\n property Height: Integer read FHeight write FHeight;\r\n property OldCreateOrder: Boolean read FOldCreateOrder write FOldCreateOrder;\r\n property Width: Integer read FWidth write FWidth;\r\n published\r\n property OnCreate: TNotifyEvent read FOnCreate write FOnCreate;\r\n property OnDestroy: TNotifyEvent read FOnDestroy write FOnDestroy;\r\n end;\r\n TWebDataModule = TDataModule;\r\n\r\nimplementation\r\n\r\nconstructor TDataModule.CreateNew(AOwner: TComponent; Dummy: Integer);\r\nbegin\r\n inherited Create(AOwner);\r\nend;\r\n\r\n{ TDataModule }\r\n\r\nprocedure TDataModule.AfterConstruction;\r\nbegin\r\n inherited AfterConstruction;\r\n if not OldCreateOrder then\r\n DoCreate;\r\nend;\r\n\r\nprocedure TDataModule.BeforeDestruction;\r\nbegin\r\n inherited BeforeDestruction;\r\n if not OldCreateOrder then\r\n DoDestroy;\r\nend;\r\n\r\nprocedure TDataModule.DoCreate;\r\nbegin\r\n LoadDFMValues;\r\n if Assigned(FOnCreate) then\r\n FOnCreate(Self);\r\nend;\r\n\r\nprocedure TDataModule.DoDestroy;\r\nbegin\r\n if Assigned(FOnDestroy) then\r\n FOnDestroy(Self);\r\nend;\r\n\r\nprocedure TDataModule.LoadDFMValues;\r\nbegin\r\nend;\r\n\r\nend.\r\n","unit WEBLib.Lang;\r\n\r\ninterface\r\n\r\ntype\r\n\r\n TUILanguage = (\r\n lNone,\r\n lAfar,\r\n lAbkhazian,\r\n lAvestan,\r\n lAfrikaans,\r\n lAkan,\r\n lAmharic,\r\n lAragonese,\r\n lArabic,\r\n lAssamese,\r\n lAvaric,\r\n lAymara,\r\n lAzerbaijani,\r\n lBashkir,\r\n lBelarusian,\r\n lBulgarian,\r\n lBihari,\r\n lBislama,\r\n lBambara,\r\n lBengali,\r\n lTibetan,\r\n lBreton,\r\n lBosnian,\r\n lCatalan,\r\n lChechen,\r\n lChamorro,\r\n lCorsican,\r\n lCree,\r\n lCzech,\r\n lOldSlavic,\r\n lChuvash,\r\n lWelsh,\r\n lDanish,\r\n lGerman,\r\n lDivehi,\r\n lDzongkha,\r\n lEwe,\r\n lEnglish,\r\n lEsperanto,\r\n lSpanish,\r\n lEstonian,\r\n lBasque,\r\n lPersian,\r\n lFulah,\r\n lFinnish,\r\n lFijian,\r\n lFaroese,\r\n lFrench,\r\n lWesternFrisian,\r\n lIrish,\r\n lGaelic,\r\n lGalician,\r\n lGuarani,\r\n lGujarati,\r\n lManx,\r\n lHausa,\r\n lHebrew,\r\n lHindi,\r\n lHiriMotu,\r\n lCroatian,\r\n lHaitian,\r\n lHungarian,\r\n lArmenian,\r\n lHerero,\r\n lInterlingua,\r\n lIndonesian,\r\n lInterlingue,\r\n lIgbo,\r\n lSichuanYi,\r\n lInupiaq,\r\n lIdo,\r\n lIcelandic,\r\n lItalian,\r\n lInuktitut,\r\n lJapanese,\r\n lJavanese,\r\n lGeorgian,\r\n lKongo,\r\n lKikuyu,\r\n lKuanyama,\r\n lKazakh,\r\n lKalaallisut,\r\n lCentralKhmer,\r\n lKannada,\r\n lKorean,\r\n lKanuri,\r\n lKashmiri,\r\n lKurdish,\r\n lKomi,\r\n lCornish,\r\n lKirghiz,\r\n lLatin,\r\n lLuxembourgish,\r\n lGanda,\r\n lLimburgan,\r\n lLingala,\r\n lLao,\r\n lLithuanian,\r\n lLubaKatanga,\r\n lLatvian,\r\n lMalagasy,\r\n lMarshallese,\r\n lMaori,\r\n lMacedonian,\r\n lMalayalam,\r\n lMongolian,\r\n lMarathi,\r\n lMalay,\r\n lMaltese,\r\n lBurmese,\r\n lNauru,\r\n lNdebele,\r\n lNepali,\r\n lNdonga,\r\n lDutch,\r\n lNorwegian,\r\n lNavajo,\r\n lChichewa,\r\n lOccitan,\r\n lOjibwa,\r\n lOromo,\r\n lOriya,\r\n lOssetian,\r\n lPanjabi,\r\n lPali,\r\n lPolish,\r\n lPushto,\r\n lPortuguese,\r\n lQuechua,\r\n lRomansh,\r\n lRundi,\r\n lRomanian,\r\n lRussian,\r\n lKinyarwanda,\r\n lSanskrit,\r\n lSardinian,\r\n lSindhi,\r\n lNorthernSami,\r\n lSango,\r\n lSinhala,\r\n lSlovak,\r\n lSlovenian,\r\n lSamoan,\r\n lShona,\r\n lSomali,\r\n lAlbanian,\r\n lSerbian,\r\n lSwati,\r\n lSotho,\r\n lSundanese,\r\n lSwedish,\r\n lSwahili,\r\n lTamil,\r\n lTelugu,\r\n lTajik,\r\n lThai,\r\n lTigrinya,\r\n lTurkmen,\r\n lTagalog,\r\n lTswana,\r\n lTonga,\r\n lTurkish,\r\n lTsonga,\r\n lTatar,\r\n lTwi,\r\n lTahitian,\r\n lUighur,\r\n lUkrainian,\r\n lUrdu,\r\n lUzbek,\r\n lVenda,\r\n lVietnamese,\r\n lWalloon,\r\n lWolof,\r\n lXhosa,\r\n lYiddish,\r\n lYoruba,\r\n lZhuang,\r\n lChinese,\r\n lZulu);\r\n\r\nfunction GetLanguageISO639_1Code(ALang: TUILanguage): string;\r\n\r\nimplementation\r\n\r\nfunction GetLanguageISO639_1Code(ALang: TUILanguage): string;\r\nbegin\r\n case ALang of\r\n lNone: Result := '';\r\n lAfar: Result := 'aa';\r\n lAbkhazian: Result := 'ab';\r\n lAvestan: Result := 'ae';\r\n lAfrikaans: Result := 'af';\r\n lAkan: Result := 'ak';\r\n lAmharic: Result := 'am';\r\n lAragonese: Result := 'an';\r\n lArabic: Result := 'ar';\r\n lAssamese: Result := 'as';\r\n lAvaric: Result := 'av';\r\n lAymara: Result := 'ay';\r\n lAzerbaijani: Result := 'az';\r\n lBashkir: Result := 'ba';\r\n lBelarusian: Result := 'be';\r\n lBulgarian: Result := 'bg';\r\n lBihari: Result := 'bh';\r\n lBislama: Result := 'bi';\r\n lBambara: Result := 'bm';\r\n lBengali: Result := 'bn';\r\n lTibetan: Result := 'bo';\r\n lBreton: Result := 'br';\r\n lBosnian: Result := 'bd';\r\n lCatalan: Result := 'ca';\r\n lChechen: Result := 'ce';\r\n lChamorro: Result := 'ch';\r\n lCorsican: Result := 'co';\r\n lCree: Result := 'cr';\r\n lCzech: Result := 'cs';\r\n lOldSlavic: Result := 'cu';\r\n lChuvash: Result := 'cv';\r\n lWelsh: Result := 'cy';\r\n lDanish: Result := 'da';\r\n lGerman: Result := 'de';\r\n lDivehi: Result := 'dv';\r\n lDzongkha: Result := 'dz';\r\n lEwe: Result := 'ee';\r\n lEnglish: Result := 'en';\r\n lEsperanto: Result := 'eo';\r\n lSpanish: Result := 'es';\r\n lEstonian: Result := 'et';\r\n lBasque: Result := 'eu';\r\n lPersian: Result := 'fa';\r\n lFulah: Result := 'ff';\r\n lFinnish: Result := 'fi';\r\n lFijian: Result := 'fj';\r\n lFaroese: Result := 'fo';\r\n lFrench: Result := 'fr';\r\n lWesternFrisian: Result := 'fy';\r\n lIrish: Result := 'ga';\r\n lGaelic: Result := 'gd';\r\n lGalician: Result := 'gl';\r\n lGuarani: Result := 'gn';\r\n lGujarati: Result := 'gu';\r\n lManx: Result := 'gv';\r\n lHausa: Result := 'ha';\r\n lHebrew: Result := 'he';\r\n lHindi: Result := 'hi';\r\n lHiriMotu: Result := 'ho';\r\n lCroatian: Result := 'hr';\r\n lHaitian: Result := 'ht';\r\n lHungarian: Result := 'hu';\r\n lArmenian: Result := 'hy';\r\n lHerero: Result := 'hz';\r\n lInterlingua: Result := 'ia';\r\n lIndonesian: Result := 'id';\r\n lInterlingue: Result := 'ie';\r\n lIgbo: Result := 'ig';\r\n lSichuanYi: Result := 'ii';\r\n lInupiaq: Result := 'ik';\r\n lIdo: Result := 'id';\r\n lIcelandic: Result := 'is';\r\n lItalian: Result := 'it';\r\n lInuktitut: Result := 'iu';\r\n lJapanese: Result := 'ja';\r\n lJavanese: Result := 'jv';\r\n lGeorgian: Result := 'ka';\r\n lKongo: Result := 'kg';\r\n lKikuyu: Result := 'ki';\r\n lKuanyama: Result := 'kj';\r\n lKazakh: Result := 'kk';\r\n lKalaallisut: Result := 'kl';\r\n lCentralKhmer: Result := 'km';\r\n lKannada: Result := 'kn';\r\n lKorean: Result := 'ko';\r\n lKanuri: Result := 'kr';\r\n lKashmiri: Result := 'ks';\r\n lKurdish: Result := 'ku';\r\n lKomi: Result := 'kv';\r\n lCornish: Result := 'kw';\r\n lKirghiz: Result := 'ky';\r\n lLatin: Result := 'la';\r\n lLuxembourgish: Result := 'lb';\r\n lGanda: Result := 'lg';\r\n lLimburgan: Result := 'li';\r\n lLingala: Result := 'ln';\r\n lLao: Result := 'lo';\r\n lLithuanian: Result := 'lt';\r\n lLubaKatanga: Result := 'lu';\r\n lLatvian: Result := 'lv';\r\n lMalagasy: Result := 'mg';\r\n lMarshallese: Result := 'mh';\r\n lMaori: Result := 'mi';\r\n lMacedonian: Result := 'mk';\r\n lMalayalam: Result := 'ml';\r\n lMongolian: Result := 'mn';\r\n lMarathi: Result := 'mr';\r\n lMalay: Result := 'ms';\r\n lMaltese: Result := 'mt';\r\n lBurmese: Result := 'my';\r\n lNauru: Result := 'na';\r\n lNdebele: Result := 'nb';\r\n lNepali: Result := 'nd';\r\n lNdonga: Result := 'ng';\r\n lDutch: Result := 'nl';\r\n lNorwegian: Result := 'no';\r\n lNavajo: Result := 'nv';\r\n lChichewa: Result := 'ny';\r\n lOccitan: Result := 'oc';\r\n lOjibwa: Result := 'oj';\r\n lOromo: Result := 'om';\r\n lOriya: Result := 'or';\r\n lOssetian: Result := 'os';\r\n lPanjabi: Result := 'pa';\r\n lPali: Result := 'pi';\r\n lPolish: Result := 'pl';\r\n lPushto: Result := 'ps';\r\n lPortuguese: Result := 'pt';\r\n lQuechua: Result := 'qu';\r\n lRomansh: Result := 'rm';\r\n lRundi: Result := 'rn';\r\n lRomanian: Result := 'ro';\r\n lRussian: Result := 'ru';\r\n lKinyarwanda: Result := 'rw';\r\n lSanskrit: Result := 'sa';\r\n lSardinian: Result := 'sc';\r\n lSindhi: Result := 'sd';\r\n lNorthernSami: Result := 'se';\r\n lSango: Result := 'sg';\r\n lSinhala: Result := 'si';\r\n lSlovak: Result := 'sk';\r\n lSlovenian: Result := 'sl';\r\n lSamoan: Result := 'sm';\r\n lShona: Result := 'sn';\r\n lSomali: Result := 'so';\r\n lAlbanian: Result := 'sq';\r\n lSerbian: Result := 'sr';\r\n lSwati: Result := 'ss';\r\n lSotho: Result := 'st';\r\n lSundanese: Result := 'su';\r\n lSwedish: Result := 'sv';\r\n lSwahili: Result := 'sw';\r\n lTamil: Result := 'ta';\r\n lTelugu: Result := 'te';\r\n lTajik: Result := 'tg';\r\n lThai: Result := 'th';\r\n lTigrinya: Result := 'ti';\r\n lTurkmen: Result := 'tk';\r\n lTagalog: Result := 'tl';\r\n lTswana: Result := 'tn';\r\n lTonga: Result := 'to';\r\n lTurkish: Result := 'tr';\r\n lTsonga: Result := 'ts';\r\n lTatar: Result := 'tt';\r\n lTwi: Result := 'tw';\r\n lTahitian: Result := 'ty';\r\n lUighur: Result := 'ug';\r\n lUkrainian: Result := 'uk';\r\n lUrdu: Result := 'ur';\r\n lUzbek: Result := 'uz';\r\n lVenda: Result := 've';\r\n lVietnamese: Result := 'vi';\r\n lWalloon: Result := 'wa';\r\n lWolof: Result := 'wo';\r\n lXhosa: Result := 'xh';\r\n lYiddish: Result := 'yi';\r\n lYoruba: Result := 'yo';\r\n lZhuang: Result := 'za';\r\n lChinese: Result := 'zh';\r\n lZulu: Result := 'zu';\r\n end;\r\nend;\r\n\r\nend.\r\n","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright (c) 2019 - 2021 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.Menus;\r\n\r\n{$DEFINE NOPP}\r\n\r\ninterface\r\n\r\nuses\r\n Classes, SysUtils, WEBLib.Controls, WEBLib.Graphics, Web;\r\n\r\ntype\r\n TMainMenu = class;\r\n TMenuItem = class;\r\n TCustomMainMenu = class;\r\n\r\n TMenuItemAutoFlag = (maAutomatic, maManual, maParent);\r\n TMenuBreak = (mbNone, mbBreak, mbBarBreak);\r\n THelpContext = -MaxLongint..MaxLongint;\r\n //TShortCut = Low(Word)..High(Word);\r\n TShortCut = type Word;\r\n TMainMenuHamburgerMenuVisible = (hmAlways, hmNever, hmResponsive);\r\n\r\n TMainMenuChangeEvent = procedure(Sender: TObject; Source: TMenuItem; Rebuild: boolean) of object;\r\n\r\n TMenuItemList = class(TList)\r\n private\r\n function GetItem(Index: Integer): TMenuItem;\r\n procedure PutItem(Index: Integer; const Value: TMenuItem);\r\n public\r\n property Items[Index: Integer]: TMenuItem read GetItem write PutItem; default;\r\n end;\r\n\r\n TMenuItem = class(TComponent)\r\n private\r\n FOwner: TMenuItem;\r\n FCaption: string;\r\n FItems: TMenuItemList;\r\n FParentItem: TMenuItem;\r\n FUpdateCount: integer;\r\n FOnClick: TNotifyEvent;\r\n FChecked: Boolean;\r\n FEnabled: Boolean;\r\n FDefault: Boolean;\r\n FAutoCheck: Boolean;\r\n FHint: string;\r\n FAutoHotkeys: TMenuItemAutoFlag;\r\n FRadioItem: Boolean;\r\n FGroupIndex: Byte;\r\n FVisible: Boolean;\r\n FShortCut: TShortCut;\r\n FBreak: TMenuBreak;\r\n FImageIndex: Integer;\r\n FAutoLineReduction: TMenuItemAutoFlag;\r\n FHelpContext: THelpContext;\r\n FElementClassName: TElementClassName;\r\n FParentMenu: TComponent;\r\n procedure SetChecked(const Value: Boolean);\r\n procedure SetCaption(const Value: string);\r\n procedure SetImageIndex(const Value: Integer);\r\n procedure SetEnabled(const Value: Boolean);\r\n //function HandleClick(Event: TJSEvent): Boolean; virtual;\r\n protected\r\n function GetCount: integer;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n destructor Destroy; override;\r\n procedure Assign(Source: TPersistent); override;\r\n procedure BeginUpdate; virtual; reintroduce;\r\n procedure EndUpdate; virtual; reintroduce;\r\n procedure SetParentComponent(Value: TComponent); override;\r\n procedure Add(Item: TMenuItem);\r\n procedure Insert(Index: Integer; Item: TMenuItem); reintroduce;\r\n function IsChild(Item: TMenuItem): boolean;\r\n function GetOwner: TPersistent; override;\r\n function GetParentMenu: TCustomMainMenu;\r\n procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;\r\n procedure SetChildOrder(Child: TComponent; Order: Integer); override;\r\n procedure RemoveItem(AOwner, AItem: TComponent);\r\n property Items: TMenuItemList read FItems write FItems;\r\n property Count: Integer read GetCount;\r\n property Parent: TMenuItem read FParentItem;\r\n procedure Clear;\r\n procedure Click;\r\n published\r\n property AutoCheck: Boolean read FAutoCheck write FAutoCheck default False;\r\n property AutoHotkeys: TMenuItemAutoFlag read FAutoHotkeys write FAutoHotkeys default maParent;\r\n property AutoLineReduction: TMenuItemAutoFlag read FAutoLineReduction write FAutoLineReduction default maParent;\r\n property Break: TMenuBreak read FBreak write FBreak default mbNone;\r\n property Caption: string read FCaption write SetCaption;\r\n property Checked: Boolean read FChecked write SetChecked default False;\r\n property Default: Boolean read FDefault write FDefault default False;\r\n property Enabled: Boolean read FEnabled write SetEnabled default True;\r\n property GroupIndex: Byte read FGroupIndex write FGroupIndex default 0;\r\n property HelpContext: THelpContext read FHelpContext write FHelpContext default 0;\r\n property Hint: string read FHint write FHint;\r\n property ImageIndex: Integer read FImageIndex write SetImageIndex default -1;\r\n property RadioItem: Boolean read FRadioItem write FRadioItem default False;\r\n property ShortCut: TShortCut read FShortCut write FShortCut default 0;\r\n property Visible: Boolean read FVisible write FVisible default True;\r\n property ElementClassName: TElementClassName read FElementClassName write FElementClassName;\r\n property OnClick: TNotifyEvent read FOnClick write FOnClick;\r\n end;\r\n\r\n TMainMenuAppearance = class;\r\n\r\n THamburgerMenu = class(TPersistent)\r\n private\r\n FOwner: TMainMenuAppearance;\r\n FVisible: TMainMenuHamburgerMenuVisible;\r\n FCaption: string;\r\n FBackgroundColor: TColor;\r\n FCaptionColor: TColor;\r\n FResponsiveMaxWidth: Integer;\r\n procedure SetVisible(const Value: TMainMenuHamburgerMenuVisible);\r\n procedure SetBackgroundColor(const Value: TColor);\r\n procedure SetCaption(const Value: string);\r\n procedure SetCaptionColor(const Value: TColor);\r\n procedure SetResponsiveMaxWidth(const Value: Integer);\r\n public\r\n constructor Create(AOwner: TMainMenuAppearance); overload;\r\n destructor Destroy; override;\r\n procedure Assign(Source: TPersistent); override;\r\n function GetOwner: TPersistent; override;\r\n published\r\n property Caption: string read FCaption write SetCaption;\r\n property CaptionColor: TColor read FCaptionColor write SetCaptionColor default clWhite;\r\n property BackgroundColor: TColor read FBackgroundColor write SetBackgroundColor default clSilver;\r\n property Visible: TMainMenuHamburgerMenuVisible read FVisible write SetVisible default hmResponsive;\r\n property ResponsiveMaxWidth: Integer read FResponsiveMaxWidth write SetResponsiveMaxWidth default 768;\r\n end;\r\n\r\n TMainMenuAppearance = class(TPersistent)\r\n private\r\n FOwner: TMainMenu;\r\n FBackgroundColor: TColor;\r\n FHoverFontColor: TColor;\r\n FHoverColor: TColor;\r\n FImageURLs: TStringList;\r\n FHamburgerMenu: THamburgerMenu;\r\n FImageSize: Integer;\r\n FSubmenuIndicator: string;\r\n procedure SetBackgroundColor(const Value: TColor);\r\n procedure SetHoverColor(const Value: TColor);\r\n procedure SetHoverFontColor(const Value: TColor);\r\n procedure SetImageURLs(const Value: TStringList);\r\n procedure SetImageSize(const Value: Integer);\r\n procedure SetSubmenuIndicator(const Value: string);\r\n protected\r\n procedure HandleImageURLsChanged(Sender: TObject);\r\n public\r\n constructor Create(AOwner: TMainMenu); overload;\r\n destructor Destroy; override;\r\n procedure Assign(Source: TPersistent); override;\r\n function GetOwner: TPersistent; override;\r\n published\r\n property BackgroundColor: TColor read FBackgroundColor write SetBackgroundColor default $F0F0F0;\r\n property HamburgerMenu: THamburgerMenu read FHamburgerMenu write FHamburgerMenu;\r\n property HoverColor: TColor read FHoverColor write SetHoverColor default clHighlight;\r\n property HoverFontColor: TColor read FHoverFontColor write SetHoverFontColor default clHighlightText;\r\n property ImageURLs: TStringList read FImageURLs write SetImageURLs;\r\n property ImageSize: Integer read FImageSize write SetImageSize default 16;\r\n property SubmenuIndicator: string read FSubmenuIndicator write SetSubmenuIndicator;\r\n end;\r\n\r\n TCustomMainMenu = class(TCustomControl)\r\n private\r\n FItems: TMenuItem;\r\n FOnChange: TMainMenuChangeEvent;\r\n protected\r\n procedure Loaded; override;\r\n procedure UpdateElement; override;\r\n function GetUniqueName(AName: string): string;\r\n procedure SetName(const NewName: TComponentName); override;\r\n public\r\n procedure CreateInitialize; override;\r\n destructor Destroy; override;\r\n procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;\r\n procedure SetChildOrder(Child: TComponent; Order: Integer); override;\r\n published\r\n property Items: TMenuItem read FItems;\r\n property OnChange: TMainMenuChangeEvent read FOnChange write FOnChange;\r\n end;\r\n\r\n TMainMenu = class(TCustomMainMenu)\r\n private\r\n FMenu: TJSHTMLElement;\r\n FMainMenu: Boolean;\r\n FMenuIndex: Integer;\r\n FAppearance: TMainMenuAppearance;\r\n FContainer: TControl;\r\n FIsPopupMenu: Boolean;\r\n FShowPopup: Boolean;\r\n function HandleChange(Event: TJSEvent): Boolean; virtual;\r\n protected\r\n procedure Loaded; override;\r\n procedure UpdateElement; override;\r\n function GetMenuSource(Item: TMenuItem): TJSHTMLElement;\r\n function GetItemByName(AMenu: TMenuItem; Name: string): TMenuItem;\r\n public\r\n procedure CreateInitialize; override;\r\n function CreateElement: TJSElement; override;\r\n destructor Destroy; override;\r\n published\r\n property Appearance: TMainMenuAppearance read FAppearance write FAppearance;\r\n property Container: TControl read FContainer write FContainer;\r\n end;\r\n\r\n TWebMainMenu = class(TMainMenu);\r\n\r\n TPopupMenu = class(TMainMenu)\r\n public\r\n procedure CreateInitialize; override;\r\n procedure Popup(X, Y: Integer);\r\n end;\r\n\r\n TWebPopupMenu = class(TPopupMenu);\r\n\r\n TWebCustomControl = class(TCustomControl)\r\n private\r\n FPopupMenu: TPopupMenu;\r\n protected\r\n function HandleDoContextMenu(Event: TJSMouseEvent): Boolean; override;\r\n procedure Notification(AComponent: TComponent; Operation: TOperation); override;\r\n property PopupMenu: TPopupMenu read FPopupMenu write FPopupMenu;\r\n end;\r\n\r\nimplementation\r\n\r\nuses\r\n Types, WEBLib.Forms;\r\n\r\n{ TCustomMainMenu }\r\n\r\nprocedure TCustomMainMenu.CreateInitialize;\r\nbegin\r\n inherited;\r\n FItems := TMenuItem.Create(Self);\r\n FItems.FParentMenu := Self;\r\n WidthStyle := ssAuto;\r\n Height := 30;\r\nend;\r\n\r\ndestructor TCustomMainMenu.Destroy;\r\nbegin\r\n FItems.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TCustomMainMenu.GetChildren(Proc: TGetChildProc; Root: TComponent);\r\nvar\r\n I: Integer;\r\nbegin\r\n if Assigned(FItems) and Assigned(FItems.Items) then\r\n begin\r\n for I := 0 to FItems.Items.Count - 1 do\r\n begin\r\n Proc(TMenuItem(FItems.Items[I]));\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TCustomMainMenu.GetUniqueName(AName: string): string;\r\nvar\r\n i,j,id: integer;\r\n found: boolean;\r\nbegin\r\n id := 1;\r\n\r\n if AName = '' then\r\n AName := Name + 'item';\r\n\r\n repeat\r\n j := pos(' ',AName);\r\n if j > 0 then\r\n Delete(AName, j, 1);\r\n until j = 0;\r\n\r\n repeat\r\n Result := AName + inttostr(id);\r\n\r\n found := true;\r\n\r\n for i := 0 to Owner.ComponentCount - 1 do\r\n begin\r\n if Owner.Components[i].Name = Result then\r\n begin\r\n found := false;\r\n inc(id);\r\n break;\r\n end;\r\n end;\r\n\r\n until found;\r\nend;\r\n\r\nprocedure TCustomMainMenu.Loaded;\r\nbegin\r\n inherited;\r\n\r\n if IsUpdating then\r\n Exit;\r\n\r\n if Assigned(ElementHandle) then\r\n UpdateElement;\r\nend;\r\n\r\nprocedure TCustomMainMenu.SetChildOrder(Child: TComponent; Order: Integer);\r\nvar\r\n idx: integer;\r\nbegin\r\n idx := FItems.Items.IndexOf(Child);\r\n if (idx >= 0) and (Order < FItems.Items.Count) then\r\n begin\r\n FItems.Items.Move(idx, Order);\r\n end;\r\nend;\r\n\r\nprocedure TCustomMainMenu.SetName(const NewName: TComponentName);\r\nbegin\r\n inherited;\r\n\r\n if IsUpdating then\r\n Exit;\r\n if (csLoading in ComponentState) then\r\n Exit;\r\n\r\n UpdateElement;\r\nend;\r\n\r\nprocedure TCustomMainMenu.UpdateElement;\r\nbegin\r\n inherited;\r\n if IsUpdating then\r\n Exit;\r\nend;\r\n\r\n{ TMainMenu }\r\n\r\nfunction TMainMenu.GetMenuSource(Item: TMenuItem): TJSHTMLElement;\r\nvar\r\n I: Integer;\r\n it: TMenuItem;\r\n MenuClass: string;\r\n ElListItem, ElLabel, ElCheckBox, ElSymbol: TJSHTMLElement;\r\n id: Integer;\r\n caption: string;\r\nbegin\r\n Result := nil;\r\n\r\n if Assigned(Item.Items) and (Item.Items.Count > 0) then\r\n begin\r\n Result := TJSHTMLElement(document.createElement('UL'));\r\n if FMainMenu then\r\n begin\r\n FMainMenu := False;\r\n if FIsPopupMenu then\r\n MenuClass := 'popup-menu'\r\n else\r\n MenuClass := 'main-menu';\r\n end\r\n else\r\n MenuClass := 'sub-menu';\r\n\r\n FMenuIndex := FMenuIndex + 1;\r\n\r\n Result.setAttribute('class', MenuClass);\r\n\r\n for I := 0 to Item.Items.Count - 1 do\r\n begin\r\n it := TMenuItem(Item.Items[I]);\r\n\r\n id := id + 1;\r\n\r\n if it.Name = '' then\r\n begin\r\n caption := StringReplace(it.Caption, ' ', '', [rfReplaceAll]);\r\n if caption = '' then\r\n caption := 'MenuItem' + IntToStr(id);\r\n it.Name := caption + IntToStr(id);\r\n end;\r\n\r\n if it.Visible then\r\n begin\r\n ElListItem := TJSHTMLElement(document.createElement('LI'));\r\n\r\n if it.Caption <> '-' then\r\n begin\r\n ElLabel := TJSHTMLElement(document.createElement('LABEL'));\r\n ElLabel.setAttribute('class', 'drop-label');\r\n if (it.ImageIndex >= 0) and (Appearance.ImageURLs.Count > it.ImageIndex) then\r\n ElLabel.innerHTML := ''\r\n else if it.Checked then\r\n begin\r\n if it.RadioItem then\r\n ElLabel.innerHTML := ''\r\n else\r\n ElLabel.innerHTML := '';\r\n end;\r\n ElLabel.innerHTML := ElLabel.innerHTML + it.Caption;\r\n end\r\n else\r\n begin\r\n ElLabel := TJSHTMLElement(document.createElement('SPAN'));\r\n ElLabel.setAttribute('class', 'menu-separator');\r\n ElLabel.innerHTML := '';\r\n end;\r\n\r\n if Assigned(it.Items) and (it.Items.Count > 0) then\r\n begin\r\n ElSymbol := TJSHTMLElement(document.createElement('SPAN'));\r\n ElSymbol.setAttribute('class', 'drop-icon');\r\n// ElSymbol.innerHTML := '>';\r\n// ElSymbol.innerHTML := '►';\r\n// ElSymbol.innerHTML := '▼';\r\n ElSymbol.innerHTML := Appearance.SubmenuIndicator;\r\n\r\n ElLabel.setAttribute('for', 'sm' + IntToStr(FMenuIndex));\r\n ElLabel.appendChild(ElSymbol);\r\n\r\n ElCheckBox := TJSHTMLElement(document.createElement('INPUT'));\r\n ElCheckBox.setAttribute('type', 'checkbox');\r\n ElCheckBox.setAttribute('id', 'sm' + IntToStr(FMenuIndex));\r\n\r\n ElListItem.appendChild(ElLabel);\r\n ElListItem.appendChild(ElCheckBox);\r\n ElListItem.appendChild(GetMenuSource(it));\r\n end\r\n else\r\n begin\r\n ElLabel.setAttribute('for', 'tm');\r\n ElLabel.setAttribute('id', it.Name);\r\n if it.Enabled then\r\n begin\r\n if (MenuClass = 'sub-menu') then\r\n begin\r\n //Hide the sub-menu onclick and then revert to the initial state to\r\n //make it re-appear when hovering\r\n if it.Enabled then\r\n ElLabel.setAttribute('onMouseUp', GetID + 'MenuClick(this);');\r\n end;\r\n ElLabel.addEventListener('click', @HandleChange);\r\n end\r\n else\r\n ElLabel.style.setProperty('color', 'gray');\r\n\r\n ElListItem.appendChild(ElLabel);\r\n end;\r\n\r\n Result.appendChild(ElListItem);\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TMainMenu.GetItemByName(AMenu: TMenuItem; Name: string): TMenuItem;\r\nvar\r\n I: Integer;\r\n it: TMenuItem;\r\nbegin\r\n Result := nil;\r\n\r\n if Assigned(AMenu.Items) then\r\n begin\r\n for I := 0 to AMenu.Items.Count - 1 do\r\n begin\r\n it := TMenuItem(AMenu.Items.Items[I]);\r\n\r\n if it.Name = Name then\r\n begin\r\n Result := it;\r\n if Assigned(it.OnClick) then\r\n Result.OnClick := it.OnClick;\r\n Exit;\r\n end;\r\n\r\n if not Assigned(Result) then\r\n Result := GetItemByName(it, Name);\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TMainMenu.HandleChange(Event: TJSEvent): Boolean;\r\nvar\r\n h: TJSHTMLElement;\r\n it: TMenuItem;\r\nbegin\r\n Result := True;\r\n\r\n if FIsPopupMenu then\r\n begin\r\n FShowPopup := False;\r\n UpdateElement;\r\n end;\r\n\r\n h := TJSHTMLElement(Event.target);\r\n it := GetItemByName(Items, h.id);\r\n\r\n if Assigned(it) then\r\n begin\r\n if it.AutoCheck then\r\n it.Checked := not it.Checked;\r\n\r\n if Assigned(OnChange) then\r\n OnChange(Self, it, False);\r\n\r\n it.Click;\r\n end;\r\nend;\r\n\r\nfunction TMainMenu.CreateElement: TJSElement;\r\nvar\r\n LLabel: TJSHTMLElement;\r\nbegin\r\n if (csDesigning in ComponentState) then\r\n begin\r\n Result := document.createElement('DIV');\r\n LLabel := TJSHTMLElement(document.createElement('DIV'));\r\n LLabel.innerHTML := 'TWebMainMenu';\r\n BorderStyle := bsSingle;\r\n LLabel['align'] := 'center';\r\n LLabel.style.setProperty('border','1px solid gray');\r\n LLabel.style.setProperty('vertical-align','middle');\r\n LLabel.style.setProperty('display','table-cell');\r\n Result.appendChild(LLabel);\r\n end\r\n else\r\n begin\r\n Result := document.createElement('DIV');\r\n if FIsPopupMenu then\r\n Result.setAttribute('onMouseLeave', GetID + 'MenuOut(this);');\r\n end;\r\nend;\r\n\r\nprocedure TMainMenu.CreateInitialize;\r\nbegin\r\n inherited;\r\n FAppearance := TMainMenuAppearance.Create(Self);\r\n FContainer := nil;\r\n FMainMenu := True;\r\n FMenuIndex := 0;\r\n FIsPopupMenu := False;\r\n FShowPopup := False;\r\n\r\n Top := 0;\r\n Left := 0;\r\n Width := 100;\r\n if (csDesigning in ComponentState) then\r\n begin\r\n ElementPosition := epRelative;\r\n WidthPercent := 100;\r\n WidthStyle := ssPercent;\r\n end;\r\nend;\r\n\r\ndestructor TMainMenu.Destroy;\r\nbegin\r\n FAppearance.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TMainMenu.Loaded;\r\nbegin\r\n inherited;\r\n\r\n if IsUpdating then\r\n Exit;\r\n\r\n if Assigned(ElementHandle) then\r\n UpdateElement;\r\nend;\r\n\r\nprocedure TMainMenu.UpdateElement;\r\nvar\r\n MenuStyle, MenuColorStyle, MenuResponsiveStyle, MenuImageSize, ShowPopup: string;\r\n ElHandle, ElLabel, ElSpan, ElIcon, ElCheckBox, ElStyle, ElScript, ElItems: TJSHTMLElement;\r\nbegin\r\n inherited;\r\n\r\n if IsUpdating then\r\n Exit;\r\n\r\n if not Assigned(ElementHandle) and not Assigned(Container) then\r\n Exit;\r\n\r\n if Assigned(Container) then\r\n begin\r\n ElHandle := Container.ElementHandle;\r\n Visible := False;\r\n end\r\n else\r\n begin\r\n ElHandle := ElementHandle;\r\n ElHandle.style.setProperty('top', IntToStr(Top)+'px');\r\n ElHandle.style.setProperty('left', IntToStr(Left)+'px');\r\n if (csDesigning in ComponentState) and not Assigned(Container) then\r\n TJSHTMLElement(ElementHandle).style.setProperty('background-color','silver');\r\n end;\r\n\r\n FMenu := TJSHTMLElement(ElHandle.firstChild);\r\n if Assigned(FMenu) then\r\n FMenu.parentElement.removeChild(FMenu);\r\n\r\n if (csDestroying in ComponentState) then\r\n Exit;\r\n\r\n FMenu := TJSHTMLElement(document.createElement('NAV'));\r\n FMenu.setAttribute('id', GetID + 'menu');\r\n FMenu.innerHTML := '';\r\n\r\n if Assigned(Container) then\r\n begin\r\n FMenu.style.setProperty('top', '0');\r\n FMenu.style.setProperty('left', '0');\r\n FMenu.style.setProperty('position', 'absolute');\r\n FMenu.style.setProperty('width', '100%');\r\n FMenu.style.setProperty('z-index', '999997');\r\n end;\r\n\r\n ElHandle.innerHTML := '';\r\n ElHandle.style.setProperty('overflow', 'visible');\r\n\r\n if Appearance.HamburgerMenu.Visible <> hmAlways then\r\n begin\r\n if FShowPopup then\r\n ShowPopup := 'block'\r\n else\r\n ShowPopup := 'none';\r\n\r\n MenuResponsiveStyle :=\r\n ' #' + GetID + 'menu .main-menu {'#13\r\n + ' display: block;'#13\r\n + ' }'#13\r\n\r\n + ' #' + GetID + 'menu #toggle-menu {'#13\r\n + ' display: none;'#13\r\n + ' }'#13\r\n\r\n + ' #' + GetID + 'menu ul span.drop-label {'#13\r\n + ' display: inline-block;'#13\r\n + ' }'#13\r\n\r\n + ' #' + GetID + 'menu li {'#13\r\n + ' float: left;'#13\r\n + ' border-width: 0 1px 0 0;'#13\r\n + ' }'#13\r\n\r\n + ' #' + GetID + 'menu .popup-menu li, '#13\r\n + ' #' + GetID + 'menu .sub-menu li {'#13\r\n + ' float: none;'#13\r\n + ' }'#13\r\n\r\n + ' #' + GetID + 'menu .sub-menu {'#13\r\n + ' top: 100%;'#13\r\n + ' }'#13\r\n\r\n + ' #' + GetID + 'menu .popup-menu { '#13\r\n + ' top: 0;'#13\r\n + ' }'#13\r\n\r\n + ' #' + GetID + 'menu .popup-menu, '#13\r\n + ' #' + GetID + 'menu .sub-menu {'#13\r\n + ' border-width: 0;'#13\r\n + ' margin: 0;'#13\r\n + ' position: absolute;'#13\r\n + ' left: 0;'#13\r\n + ' min-width: 12em;'#13\r\n + ' z-index: 9999999;'#13\r\n + '\t white-space: nowrap;'#13\r\n + ' }'#13\r\n\r\n + ' #' + GetID + 'menu .sub-menu {'#13\r\n + ' top: 100%;'#13\r\n + ' }'#13\r\n\r\n + ' #' + GetID + 'menu .popup-menu { '#13\r\n + ' display: ' + ShowPopup + ';'#13\r\n + ' }'#13\r\n\r\n + ' #' + GetID + 'menu .sub-menu,'#13\r\n + ' #' + GetID + 'menu input[type=\"checkbox\"]:checked + .popup-menu,'#13\r\n + ' #' + GetID + 'menu input[type=\"checkbox\"]:checked + .sub-menu {'#13\r\n + ' display: none;'#13\r\n + ' }'#13\r\n\r\n + ' #' + GetID + 'menu .popup-menu li, '#13\r\n + ' #' + GetID + 'menu .sub-menu li {'#13\r\n + ' border-width: 1px;'#13\r\n + ' }'#13\r\n\r\n + ' #' + GetID + 'menu .popup-menu .sub-menu, '#13\r\n + ' #' + GetID + 'menu .sub-menu .sub-menu {'#13\r\n + ' top: 0;'#13\r\n + ' left: 100%;'#13\r\n + ' }'#13\r\n\r\n + ' #' + GetID + 'menu li:hover > input[type=\"checkbox\"] + .popup-menu, '#13\r\n + ' #' + GetID + 'menu li:hover > input[type=\"checkbox\"] + .sub-menu {'#13\r\n + ' display: block;'#13\r\n + ' }'#13;\r\n\r\n if Appearance.HamburgerMenu.Visible = hmResponsive then\r\n begin\r\n MenuResponsiveStyle :=\r\n '@media only screen and (min-width: ' + IntToStr(Appearance.HamburgerMenu.ResponsiveMaxWidth) + 'px) {'#13\r\n + MenuResponsiveStyle\r\n + '}';\r\n end;\r\n end;\r\n\r\n if Appearance.ImageSize > 0 then\r\n begin\r\n MenuImageSize := ' width: ' + IntToStr(Appearance.ImageSize) + 'px;'#13\r\n + ' height: ' + IntToStr(Appearance.ImageSize) + 'px;'#13\r\n ;\r\n end;\r\n\r\n MenuStyle :=\r\n '#' + GetID + 'menu ul {'#13\r\n + ' margin: 0;'#13\r\n + ' padding: 0;'#13\r\n + '}'#13\r\n\r\n + '#' + GetID + 'menu .main-menu {'#13\r\n + ' display: none;'#13\r\n + '}'#13\r\n\r\n + '#' + GetID + 'menu .popup-menu {'#13\r\n + ' display: block;'#13\r\n + '}'#13\r\n\r\n + '#' + GetID + 'menu label img.icon,' +\r\n '#' + GetID + 'menu label span.checked {'#13\r\n + MenuImageSize\r\n + ' margin-right: 10px;'#13\r\n + ' pointer-events: none;'#13\r\n + ' float: left;'#13\r\n + '}'#13\r\n\r\n + '#tm:checked + .main-menu {'#13\r\n + ' display: block;'#13\r\n + '}'#13\r\n\r\n + '#' + GetID + 'menu input[type=\"checkbox\"],'#13\r\n + '#' + GetID + 'menu ul span.drop-label {'#13\r\n + ' display: none;'#13\r\n + '}'#13\r\n\r\n + '#' + GetID + 'menu li,'#13\r\n + '#' + GetID + 'menu #toggle-menu,'#13\r\n + '#' + GetID + 'menu .popup-menu,'#13\r\n + '#' + GetID + 'menu .sub-menu {'#13\r\n + ' border-width: 1px;'#13\r\n + ' border-style: solid;'#13\r\n + ' border-color: rgba(0, 0, 0, .05);'#13\r\n + ' border-bottom: 0px;'#13\r\n + ' border-top: 0px;'#13\r\n + '}'#13\r\n\r\n + '#' + GetID + 'menu li,'#13\r\n + '#' + GetID + 'menu #toggle-menu {'#13\r\n + ' border-width: 0 0 3px;'#13\r\n + '}'#13\r\n\r\n + '#' + GetID + 'menu .popup-menu,'#13\r\n + '#' + GetID + 'menu .sub-menu {'#13\r\n + ' border-width: 1px 1px 0;'#13\r\n + ' margin: 0 1em;'#13\r\n + '}'#13\r\n\r\n + '#' + GetID + 'menu .popup-menu li:first-child,'#13\r\n + '#' + GetID + 'menu .sub-menu li:first-child {'#13\r\n + ' border-top: 1px solid;'#13\r\n + ' border-color: rgba(0, 0, 0, .05);'#13\r\n + '}'#13\r\n\r\n + '#' + GetID + 'menu .popup-menu li:last-child,'#13\r\n + '#' + GetID + 'menu .sub-menu li:last-child {'#13\r\n + ' border-bottom: 1px solid;'#13\r\n + ' border-color: rgba(0, 0, 0, .05);'#13\r\n + '}'#13\r\n\r\n + '#' + GetID + 'menu li,'#13\r\n + '#' + GetID + 'menu #toggle-menu,'#13\r\n + '#' + GetID + 'menu li label {'#13\r\n + ' position: relative;'#13\r\n + ' display: block;'#13\r\n + '}'#13\r\n\r\n + '#' + GetID + 'menu #toggle-menu,'#13\r\n + '#' + GetID + 'menu li label { '#13\r\n + ' padding: 0.75em 1.5em;'#13\r\n + ' text-decoration: none;'#13\r\n + '}'#13\r\n\r\n + '#' + GetID + 'menu li span.menu-separator { '#13\r\n + ' display: block;'#13\r\n + ' width: 100%;'#13\r\n + ' height: 1px;'#13\r\n + ' background-color: rgba(0, 0, 0, .05);'#13\r\n + '}'#13\r\n\r\n + '#' + GetID + 'menu .popup-menu, '#13\r\n + '#' + GetID + 'menu .sub-menu {'#13\r\n + ' display: none;'#13\r\n + '}'#13\r\n\r\n + '#' + GetID + 'menu input[type=\"checkbox\"]:checked + .popup-menu,'#13\r\n + '#' + GetID + 'menu input[type=\"checkbox\"]:checked + .sub-menu {'#13\r\n + ' display: block;'#13\r\n + ' z-index: 3000;'#13\r\n + '}'#13\r\n\r\n + '#' + GetID + 'menu span.drop-icon {'#13\r\n + ' float: right;'#13\r\n + ' margin-left: 10px;'#13\r\n + '}'#13\r\n\r\n + '#' + GetID + 'menu span.hamburger-icon {'#13\r\n + ' float: right;'#13\r\n + ' padding: 0;'#13\r\n + ' margin: 0;'#13\r\n + ' font-weight: 900;'#13\r\n + '}'#13\r\n\r\n + '@media only screen and (max-width: 64em) and (min-width: 52.01em) {'#13\r\n + ' #' + GetID + 'menu li {'#13\r\n + ' width: auto;'#13\r\n + ' }'#13\r\n\r\n + ' #' + GetID + 'menu .sub-menu li {'#13\r\n + ' width: auto;'#13\r\n + ' }'#13\r\n + '}'#13;\r\n\r\n if ElementClassName = '' then\r\n begin\r\n MenuColorStyle := ''\r\n\r\n + '#' + GetID + 'menu .popup-menu, '#13\r\n + '#' + GetID + 'menu .sub-menu {'#13\r\n + ' background-color: ' + ColorToHtml(Appearance.BackgroundColor) + ';'#13\r\n + '}'#13\r\n\r\n + '@media only screen and (max-width: 64em) and (min-width: 52.01em) {'#13\r\n + '#' + GetID + 'menu .sub-menu {'#13\r\n + ' background-color: ' + ColorToHtml(Appearance.HamburgerMenu.BackgroundColor) + ';'#13\r\n + '}'#13\r\n + '}'#13\r\n\r\n + '#' + GetID + 'menu li,'#13\r\n + '#' + GetID + 'menu #toggle-menu,'#13\r\n + '#' + GetID + 'menu li label {'#13\r\n + '}'#13\r\n\r\n + '#' + GetID + 'menu #toggle-menu {'#13\r\n + ' background-color: ' + ColorToHtml(Appearance.HamburgerMenu.BackgroundColor) + ';'#13\r\n + ' color: ' + ColorToHtml(Appearance.HamburgerMenu.CaptionColor) + ';'#13\r\n + '}'#13\r\n\r\n + '#' + GetID + 'menu .main-menu li label {'#13\r\n + ' background-color: ' + ColorToHtml(Appearance.BackgroundColor) + ';'#13\r\n + '}'#13\r\n\r\n + '#' + GetID + 'menu li label:hover {'#13\r\n + ' background-color: ' + ColorToHtml(Appearance.HoverColor) + ';'#13\r\n + ' color: ' + ColorToHtml(Appearance.HoverFontColor) + ';'#13\r\n + '}'#13\r\n\r\n + '#' + GetID + 'menu .popup-menu label:hover, '#13\r\n + '#' + GetID + 'menu .sub-menu label:hover {'#13\r\n + ' background-color: ' + ColorToHtml(Appearance.HoverColor) + ';'#13\r\n + ' color: ' + ColorToHtml(Appearance.HoverFontColor) + ';'#13\r\n + '}'#13;\r\n end;\r\n\r\n MenuStyle := MenuStyle\r\n + MenuColorStyle\r\n + MenuResponsiveStyle\r\n ;\r\n\r\n FMainMenu := True;\r\n FMenuIndex := 0;\r\n\r\n ElStyle := TJSHTMLElement(document.createElement('STYLE'));\r\n ElStyle.innerHTML := MenuStyle;\r\n\r\n ElScript := TJSHTMLElement(document.createElement('SCRIPT'));\r\n ElScript.innerHTML := 'function ' + GetID + 'MenuClick(ctrl){'\r\n + ' el = ctrl.parentElement.parentElement;'\r\n + ' el.style.display = \"none\";'\r\n + ' setTimeout(function(){el.style.removeProperty(\"display\")}, 25);'\r\n + '}'\r\n + 'function ' + GetID + 'MenuOut(ctrl){'\r\n + ' menuel = document.getElementById(\"' + GetID + '\");'\r\n + ' if(menuel) { '\r\n + ' popupel = menuel.getElementsByClassName(\"popup-menu\");'\r\n + ' if(popupel) '\r\n + ' setTimeout(function(){popupel[0].style.display = \"none\"}, 25);'\r\n + ' }'\r\n + '}';\r\n\r\n ElLabel := TJSHTMLElement(document.createElement('LABEL'));\r\n ElLabel.setAttribute('for', 'tm');\r\n ElLabel.setAttribute('id', 'toggle-menu');\r\n ElLabel.innerHTML := Appearance.HamburgerMenu.Caption;\r\n\r\n ElSpan := TJSHTMLElement(document.createElement('SPAN'));\r\n ElSpan.setAttribute('class', 'drop-label');\r\n ElLabel.appendChild(ElSpan);\r\n\r\n ElIcon := TJSHTMLElement(document.createElement('SPAN'));\r\n ElIcon.setAttribute('class', 'hamburger-icon');\r\n// ElIcon.innerHTML := '>';\r\n ElIcon.innerHTML := '☰';\r\n// ElIcon.innerHTML := '';\r\n ElSpan.appendChild(ElIcon);\r\n\r\n ElCheckBox := TJSHTMLElement(document.createElement('INPUT'));\r\n ElCheckBox.setAttribute('type', 'checkbox');\r\n ElCheckBox.setAttribute('id', 'tm');\r\n\r\n FMenu.appendChild(ElStyle);\r\n FMenu.appendChild(ElScript);\r\n FMenu.appendChild(ElLabel);\r\n FMenu.appendChild(ElCheckBox);\r\n\r\n ElItems := GetMenuSource(Items);\r\n if ElItems <> nil then\r\n FMenu.appendChild(ElItems);\r\n ElHandle.appendChild(FMenu);\r\nend;\r\n\r\n{ TMenuItem }\r\n\r\nprocedure TMenuItem.Assign(Source: TPersistent);\r\nvar\r\n i: integer;\r\n srcmenu,mnu: TMenuItem;\r\n pm: TCustomMainMenu;\r\n\r\nbegin\r\n if (Source is TMenuItem) then\r\n begin\r\n srcmenu := (Source as TMenuItem);\r\n\r\n FAutoCheck := srcmenu.AutoCheck;\r\n FAutoHotkeys := srcmenu.AutoHotkeys;\r\n FAutoLineReduction:= srcmenu.AutoLineReduction;\r\n FBreak := srcmenu.Break;\r\n FCaption := srcmenu.Caption;\r\n FChecked := srcmenu.Checked;\r\n FDefault := srcmenu.Default;\r\n FEnabled := srcmenu.Enabled;\r\n FGroupIndex := srcmenu.GroupIndex;\r\n FHelpContext := srcmenu.HelpContext;\r\n FHint := srcmenu.Hint;\r\n FImageIndex := srcmenu.ImageIndex;\r\n FRadioItem := srcmenu.RadioItem;\r\n FShortCut := srcmenu.ShortCut;\r\n FVisible := srcmenu.Visible;\r\n FElementClassName := srcmenu.ElementClassName;\r\n\r\n pm := GetParentMenu;\r\n\r\n if Assigned(Parent) then\r\n Name := pm.GetUniqueName(srcmenu.Caption);\r\n\r\n if Assigned(srcmenu.Items) then\r\n begin\r\n if Assigned(FItems) then\r\n begin\r\n for I := FItems.Count - 1 downto 0 do\r\n begin\r\n RemoveItem(GetParentMenu.Parent, TComponent(FItems[I]));\r\n end;\r\n FItems.Clear;\r\n end\r\n else\r\n FItems := TMenuItemList.Create;\r\n\r\n for i := 0 to srcmenu.Items.Count - 1 do\r\n begin\r\n // create with form owner\r\n mnu := TMenuItem.Create(pm.Owner);\r\n mnu.FParentMenu := pm;\r\n mnu.FParentItem := Self;\r\n mnu.Assign(TMenuItem(srcmenu.Items[i]));\r\n FItems.Add(mnu);\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TMenuItem.BeginUpdate;\r\nbegin\r\n inc(FUpdateCount);\r\nend;\r\n\r\nprocedure TMenuItem.Clear;\r\nvar\r\n i: integer;\r\n mnu: TMenuItem;\r\nbegin\r\n for i := Count - 1 downto 0 do\r\n begin\r\n mnu := TMenuItem(FItems[i]);\r\n if Assigned(mnu.Items) then\r\n mnu.Items.Clear;\r\n mnu.Free;\r\n end;\r\nend;\r\n\r\nprocedure TMenuItem.Click;\r\nbegin\r\n if Assigned(OnClick) then\r\n OnClick(Self);\r\nend;\r\n\r\nconstructor TMenuItem.Create(AOwner: TComponent);\r\nbegin\r\n FParentMenu := nil;\r\n\r\n if AOwner is TMainMenu then\r\n FParentMenu := AOwner;\r\n\r\n inherited Create(AOwner);\r\n\r\n FAutoHotkeys := maParent;\r\n FAutoLineReduction := maParent;\r\n FImageIndex := -1;\r\n FHint := '';\r\n FCaption := 'MenuItem';\r\n FChecked := False;\r\n FEnabled := True;\r\n FDefault := False;\r\n FRadioItem := False;\r\n FVisible := True;\r\n FOwner := TMenuItem(AOwner);\r\nend;\r\n\r\ndestructor TMenuItem.Destroy;\r\nvar\r\n i: integer;\r\n pm: TCustomMainMenu;\r\n mnu: TMenuItem;\r\nbegin\r\n pm := GetParentMenu;\r\n\r\n // delete item from the parent item list\r\n if Assigned(Parent) and Assigned(pm) then\r\n begin\r\n pm.BeginUpdate;\r\n\r\n for i := TMenuItem(Parent).Items.Count - 1 downto 0 do\r\n begin\r\n if (TMenuItem(Parent).Items[i] = Self) then\r\n begin\r\n TMenuItem(Parent).Items.Delete(i);\r\n end;\r\n end;\r\n\r\n pm.EndUpdate;\r\n end;\r\n\r\n // delete its childs\r\n if Assigned(Items) then\r\n begin\r\n for i := Items.Count - 1 downto 0 do\r\n begin\r\n mnu := TMenuItem(Items[i]);\r\n mnu.FParentItem := nil;\r\n mnu.Free;\r\n Items.Delete(i);\r\n end;\r\n end;\r\n\r\n inherited;\r\nend;\r\n\r\nprocedure TMenuItem.EndUpdate;\r\nbegin\r\n if (FUpdateCount > 0) then\r\n begin\r\n dec(FUpdateCount);\r\n\r\n if FUpdateCount = 0 then\r\n GetParentMenu.UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TMenuItem.GetChildren(Proc: TGetChildProc; Root: TComponent);\r\nvar\r\n I: Integer;\r\nbegin\r\n if Assigned(Items) then\r\n for I := 0 to Items.Count - 1 do Proc(TMenuItem(Items[I]));\r\nend;\r\n\r\nfunction TMenuItem.GetCount: integer;\r\nbegin\r\n if FItems = nil then\r\n Result := 0\r\n else\r\n Result := FItems.Count;\r\nend;\r\n\r\nfunction TMenuItem.GetOwner: TPersistent;\r\nbegin\r\n Result := FOwner;\r\nend;\r\n\r\nfunction TMenuItem.GetParentMenu: TCustomMainMenu;\r\nvar\r\n AOwner: TComponent;\r\nbegin\r\n Result := nil;\r\n\r\n AOwner := FParentMenu;\r\n\r\n while Assigned(AOwner) and (AOwner is TMenuItem) do\r\n begin\r\n AOwner := TMenuItem(AOwner).FParentMenu;\r\n end;\r\n\r\n if Assigned(AOwner) then\r\n Result := TCustomMainMenu(AOwner);\r\nend;\r\n\r\nprocedure TMenuItem.Insert(Index: Integer; Item: TMenuItem);\r\nbegin\r\n if FItems = nil then\r\n FItems := TMenuItemList.Create;\r\n FItems.Insert(Index, Item);\r\n Item.FParentItem := Self;\r\n\r\n if Assigned(Item.GetParentMenu) then\r\n Item.GetParentMenu.UpdateElement;\r\nend;\r\n\r\nfunction TMenuItem.IsChild(Item: TMenuItem): boolean;\r\nvar\r\n i: integer;\r\nbegin\r\n Result := false;\r\n if not Assigned(Items) then\r\n Exit;\r\n\r\n for i := 0 to Items.Count - 1 do\r\n begin\r\n if (Items[i] = Item) then\r\n begin\r\n Result := true;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TMenuItem.RemoveItem(AOwner, AItem: TComponent);\r\nvar\r\n I: Integer;\r\nbegin\r\n if Assigned(TMenuItem(AItem).Items) then\r\n begin\r\n for I := TMenuItem(AItem).Items.Count - 1 downto 0 do\r\n RemoveItem(AOwner, TComponent(TMenuItem(AItem).Items[I]));\r\n end;\r\n AOwner.RemoveComponent(AItem);\r\nend;\r\n\r\nprocedure TMenuItem.Add(Item: TMenuItem);\r\nbegin\r\n Insert(GetCount, Item);\r\nend;\r\n\r\nprocedure TMenuItem.SetCaption(const Value: string);\r\nvar\r\n pm: TCustomMainMenu;\r\nbegin\r\n FCaption := Value;\r\n pm := GetParentMenu;\r\n if Assigned(pm) then\r\n pm.UpdateElement;\r\nend;\r\n\r\nprocedure TMenuItem.SetChecked(const Value: Boolean);\r\nvar\r\n pm: TCustomMainMenu;\r\n Item, OtherItem: TMenuItem;\r\n MenuOwner: TComponent;\r\n I: Integer;\r\nbegin\r\n if FChecked <> Value then\r\n begin\r\n FChecked := Value;\r\n MenuOwner := FParentMenu;\r\n if Assigned(MenuOwner) then\r\n begin\r\n if (MenuOwner is TMenuItem) and Value then\r\n begin\r\n Item := TMenuItem(MenuOwner);\r\n for I := 0 to Item.Items.Count - 1 do\r\n begin\r\n OtherItem := TMenuItem(Item.Items[I]);\r\n if (OtherItem.RadioItem) and (OtherItem <> Self) then\r\n OtherItem.Checked := False;\r\n end;\r\n end;\r\n\r\n while not (MenuOwner is TCustomMainMenu) and Assigned(MenuOwner) do\r\n begin\r\n MenuOwner := MenuOwner.Owner;\r\n end;\r\n end;\r\n\r\n pm := GetParentMenu;\r\n if Assigned(pm) then\r\n pm.UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TMenuItem.SetChildOrder(Child: TComponent; Order: Integer);\r\nvar\r\n idx: integer;\r\nbegin\r\n idx := FItems.IndexOf(Child);\r\n if (idx >= 0) and (Order < FItems.Count) then\r\n begin\r\n FItems.Move(idx, Order);\r\n end;\r\nend;\r\n\r\nprocedure TMenuItem.SetEnabled(const Value: Boolean);\r\nbegin\r\n if FEnabled <> Value then\r\n begin\r\n FEnabled := Value;\r\n\r\n GetParentMenu.UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TMenuItem.SetImageIndex(const Value: Integer);\r\nvar\r\n pm: TCustomMainMenu;\r\nbegin\r\n FImageIndex := Value;\r\n pm := GetParentMenu;\r\n if Assigned(pm) then\r\n pm.UpdateElement;\r\nend;\r\n\r\nprocedure TMenuItem.SetParentComponent(Value: TComponent);\r\nbegin\r\n inherited;\r\n\r\n FParentMenu := Value;\r\n\r\n if (Value <> nil) then\r\n begin\r\n if Value is TCustomMainMenu then\r\n begin\r\n if not TCustomMainMenu(Value).Items.IsChild(Self) then\r\n TCustomMainMenu(Value).Items.Add(Self)\r\n end\r\n else if Value is TMenuItem then\r\n begin\r\n if not TMenuItem(Value).IsChild(Self) then\r\n TMenuItem(Value).Add(Self);\r\n end;\r\n end;\r\nend;\r\n\r\n{ TMainMenuAppearance }\r\n\r\nprocedure TMainMenuAppearance.Assign(Source: TPersistent);\r\nbegin\r\n inherited;\r\n if (Source is TMainMenu) then\r\n begin\r\n FBackgroundColor := (Source as TMainMenuAppearance).BackgroundColor;\r\n FHoverColor := (Source as TMainMenuAppearance).HoverColor;\r\n FHoverFontColor := (Source as TMainMenuAppearance).HoverFontColor;\r\n FHamburgerMenu.Assign((Source as TMainMenuAppearance).HamburgerMenu);\r\n FImageURLs.Assign((Source as TMainMenuAppearance).ImageURLs);\r\n FImageSize := (Source as TMainMenuAppearance).ImageSize;\r\n FSubmenuIndicator := (Source as TMainMenuAppearance).SubmenuIndicator;\r\n end;\r\nend;\r\n\r\nconstructor TMainMenuAppearance.Create(AOwner: TMainMenu);\r\nbegin\r\n FBackgroundColor := $F0F0F0;\r\n FHoverColor := clHighlight;\r\n FHoverFontColor := clHighlightText;\r\n FHamburgerMenu := THamburgerMenu.Create(Self);\r\n FImageURLs := TStringList.Create;\r\n FImageURLs.SkipLastLinebreak := true;\r\n FImageURLs.OnChange := HandleImageURLsChanged;\r\n FImageSize := 16;\r\n FSubmenuIndicator := '►';\r\n FOwner := AOwner;\r\nend;\r\n\r\ndestructor TMainMenuAppearance.Destroy;\r\nbegin\r\n FHamburgerMenu.Free;\r\n FImageURLs.Free;\r\n inherited;\r\nend;\r\n\r\nfunction TMainMenuAppearance.GetOwner: TPersistent;\r\nbegin\r\n Result := FOwner;\r\nend;\r\n\r\nprocedure TMainMenuAppearance.HandleImageURLsChanged(Sender: TObject);\r\nbegin\r\n FOwner.UpdateElement;\r\nend;\r\n\r\nprocedure TMainMenuAppearance.SetBackgroundColor(const Value: TColor);\r\nbegin\r\n if FBackgroundColor <> Value then\r\n begin\r\n FBackgroundColor := Value;\r\n FOwner.UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TMainMenuAppearance.SetHoverColor(const Value: TColor);\r\nbegin\r\n if FHoverColor <> Value then\r\n begin\r\n FHoverColor := Value;\r\n FOwner.UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TMainMenuAppearance.SetHoverFontColor(const Value: TColor);\r\nbegin\r\n if FHoverFontColor <> Value then\r\n begin\r\n FHoverFontColor := Value;\r\n FOwner.UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TMainMenuAppearance.SetImageSize(const Value: Integer);\r\nbegin\r\n if FImageSize <> Value then\r\n begin\r\n FImageSize := Value;\r\n FOwner.UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TMainMenuAppearance.SetImageURLs(const Value: TStringList);\r\nbegin\r\n FImageURLs.Assign(Value);\r\nend;\r\n\r\nprocedure TMainMenuAppearance.SetSubmenuIndicator(const Value: string);\r\nbegin\r\n if FSubmenuIndicator <> Value then\r\n begin\r\n FSubmenuIndicator := Value;\r\n FOwner.UpdateElement;\r\n end;\r\nend;\r\n\r\n{ THamburgerMenu }\r\n\r\nprocedure THamburgerMenu.Assign(Source: TPersistent);\r\nbegin\r\n inherited;\r\n if (Source is THamburgerMenu) then\r\n begin\r\n FBackgroundColor := (Source as THamburgerMenu).BackgroundColor;\r\n FCaption := (Source as THamburgerMenu).Caption;\r\n FCaptionColor := (Source as THamburgerMenu).CaptionColor;\r\n FVisible := (Source as THamburgerMenu).Visible;\r\n FResponsiveMaxWidth := (Source as THamburgerMenu).ResponsiveMaxWidth;\r\n end;\r\nend;\r\n\r\nconstructor THamburgerMenu.Create(AOwner: TMainMenuAppearance);\r\nbegin\r\n FBackgroundColor := clSilver;\r\n FCaption := 'Menu';\r\n FCaptionColor := clWhite;\r\n FVisible := hmResponsive;\r\n FResponsiveMaxWidth := 768;\r\n FOwner := AOwner;\r\nend;\r\n\r\ndestructor THamburgerMenu.Destroy;\r\nbegin\r\n inherited;\r\nend;\r\n\r\nfunction THamburgerMenu.GetOwner: TPersistent;\r\nbegin\r\n Result := FOwner;\r\nend;\r\n\r\nprocedure THamburgerMenu.SetBackgroundColor(const Value: TColor);\r\nbegin\r\n if FBackgroundColor <> Value then\r\n begin\r\n FBackgroundColor := Value;\r\n FOwner.FOwner.UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure THamburgerMenu.SetCaption(const Value: string);\r\nbegin\r\n if FCaption <> Value then\r\n begin\r\n FCaption := Value;\r\n FOwner.FOwner.UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure THamburgerMenu.SetCaptionColor(const Value: TColor);\r\nbegin\r\n if FCaptionColor <> Value then\r\n begin\r\n FCaptionColor := Value;\r\n FOwner.FOwner.UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure THamburgerMenu.SetResponsiveMaxWidth(const Value: Integer);\r\nbegin\r\n if FResponsiveMaxWidth <> Value then\r\n begin\r\n FResponsiveMaxWidth := Value;\r\n FOwner.FOwner.UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure THamburgerMenu.SetVisible(const Value: TMainMenuHamburgerMenuVisible);\r\nbegin\r\n if FVisible <> Value then\r\n begin\r\n FVisible := Value;\r\n FOwner.FOwner.UpdateElement;\r\n end;\r\nend;\r\n\r\n{ TMenuItemList }\r\n\r\nfunction TMenuItemList.GetItem(Index: Integer): TMenuItem;\r\nbegin\r\n Result := TMenuItem(inherited Items[Index]);\r\nend;\r\n\r\nprocedure TMenuItemList.PutItem(Index: Integer; const Value: TMenuItem);\r\nbegin\r\n inherited Items[Index] := Value;\r\nend;\r\n\r\n{ TPopupMenu }\r\n\r\nprocedure TPopupMenu.CreateInitialize;\r\nbegin\r\n inherited;\r\n Appearance.HamburgerMenu.Visible := hmNever;\r\n FIsPopupMenu := True;\r\nend;\r\n\r\nprocedure TPopupMenu.Popup(X, Y: Integer);\r\nbegin\r\n Top := Y;\r\n Left := X;\r\n FShowPopup := True;\r\n UpdateElement;\r\nend;\r\n\r\n{ TWebCustomControl }\r\n\r\nfunction TWebCustomControl.HandleDoContextMenu(Event: TJSMouseEvent): Boolean;\r\nvar\r\n pt: TPoint;\r\n frm: TCustomForm;\r\n r: TJSDOMRect;\r\nbegin\r\n inherited;\r\n if Assigned(FPopupMenu) then\r\n begin\r\n Event.stopPropagation;\r\n Event.preventDefault;\r\n pt := Point(Round(Event.clientX), Round(Event.clientY));\r\n\r\n frm := GetParentForm(Self);\r\n\r\n if Assigned(frm) and (frm.Popup) and Assigned(frm.Container) then\r\n begin\r\n r := frm.Container.getBoundingClientRect;\r\n pt.X := pt.X - Round(r.Left);\r\n pt.Y := pt.Y - Round(r.Top);\r\n end;\r\n\r\n FPopupMenu.Popup(pt.X,pt.Y);\r\n Result := true;\r\n end;\r\nend;\r\n\r\nprocedure TWebCustomControl.Notification(AComponent: TComponent;\r\n Operation: TOperation);\r\nbegin\r\n inherited;\r\n if (Operation = opRemove) and (AComponent = FPopupMenu) then\r\n FPopupMenu := nil;\r\nend;\r\n\r\nend.\r\n","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright (c) 2018 - 2021 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.JSON;\r\n\r\ninterface\r\n\r\nuses\r\n Classes, Web, JS, SysUtils;\r\n\r\ntype\r\n TJSONObject = class;\r\n TJSONString = class;\r\n\r\n TJSONAncestor = class(TObject)\r\n private\r\n protected\r\n function GetStrValue: string; virtual;\r\n procedure SetStrValue(const Value: string); virtual;\r\n public\r\n property Value: string read GetStrValue write SetStrValue;\r\n end;\r\n\r\n TJSONValue = class(TJSONAncestor)\r\n private\r\n fjv: JSValue;\r\n fjo: JSValue;\r\n protected\r\n property jv: JSValue read fjv write fjv;\r\n public\r\n constructor Create(AJSValue: JSValue); overload;\r\n function ToString: string; override;\r\n function GetValue(const APath: string = ''): T;\r\n end;\r\n\r\n TJSONPair = class(TObject)\r\n private\r\n fjo: JSValue;\r\n fjv: TJSONValue;\r\n fjs: TJSONString;\r\n public\r\n constructor Create; overload;\r\n constructor Create(const Str: string; const Value: TJSONValue); overload;\r\n constructor Create(const Str: string; const Value: string); overload;\r\n destructor Destroy; override;\r\n property JsonValue: TJSONValue read fjv write fjv;\r\n property JsonString: TJSONString read fjs write fjs;\r\n function ToString: string; override;\r\n end;\r\n\r\n TJSONPairList = class(TList);\r\n\r\n TJSONObject = class(TJSONValue)\r\n private\r\n fjo: TJSObject;\r\n FMembers: TJSONPairList;\r\n function GetPair(const I: Integer): TJSONPair;\r\n function GetCount: Integer;\r\n function GetItem(const Index: Integer): TJSONValue;\r\n procedure SetValues(const Name: string; const Value: TJSONValue);\r\n protected\r\n property jo: TJSObject read fjo write fjo;\r\n procedure AddDescendant(const Descendent: TJSONPair); virtual;\r\n class function JSONValueFromJS(const AJSValue: JSValue): TJSONValue;\r\n public\r\n constructor Create; overload;\r\n constructor Create(AObject: TJSObject); overload;\r\n destructor Destroy; override;\r\n property JSObject: TJSObject read fjo;\r\n class function ParseJSONValue(const data: string): TJSONValue;\r\n function GetJSONValue(Name: string): string;\r\n function Get(Name: string): TJSONPair; overload;\r\n function Get(Index: Integer): TJSONPair; overload;\r\n function GetValue(const Name: string): TJSONValue;\r\n procedure SetValue(const Name: string; AValue: string); overload;\r\n procedure SetValue(const Name: string; AValue: integer); overload;\r\n procedure SetValue(const Name: string; AValue: double); overload;\r\n property Items[const Index: Integer]: TJSONValue read GetItem;\r\n property Values[const Name: string]: TJSONValue read GetValue write SetValues;\r\n property Pairs[const Index: Integer]: TJSONPair read GetPair;\r\n property Count: Integer read GetCount;\r\n function AddPair(const Pair: TJSONPair): TJSONObject; overload;\r\n function AddPair(const Str: string; const Val: TJSONValue): TJSONObject; overload;\r\n function AddPair(const Str: string; const Val: string): TJSONObject; overload;\r\n function AddPair(const Str: string; const Val: Integer): TJSONObject; overload;\r\n\r\n function ToJSON: string;\r\n function ToString: string; override;\r\n end;\r\n\r\n TJSONString = class(TJSONValue)\r\n private\r\n FValue: string;\r\n protected\r\n function GetStrValue: string; override;\r\n procedure SetStrValue(const Value: string); override;\r\n public\r\n constructor Create(AString: string); overload;\r\n end;\r\n\r\n TJSONNumber = class(TJSONString)\r\n private\r\n FInt: integer;\r\n FDouble: Double;\r\n protected\r\n function GetStrValue: string; override;\r\n procedure SetStrValue(const Value: string); override;\r\n public\r\n constructor Create(ANumber: integer); overload;\r\n constructor Create(ANumber: double); overload;\r\n\r\n property AsInt: integer read FInt write FInt;\r\n property AsDouble: Double read FDouble write FDouble;\r\n property AsFloat: Double read FDouble write FDouble;\r\n end;\r\n\r\n TJSONTrue = class(TJSONValue)\r\n protected\r\n function GetStrValue: string; override;\r\n public\r\n function ToString: string; override;\r\n end;\r\n\r\n TJSONFalse = class(TJSONValue)\r\n protected\r\n function GetStrValue: string; override;\r\n public\r\n function ToString: string; override;\r\n end;\r\n\r\n TJSONNull = class(TJSONValue)\r\n protected\r\n function GetStrValue: string; override;\r\n public\r\n function ToString: string; override;\r\n end;\r\n\r\n TJSONArray = class(TJSONObject)\r\n private\r\n fja: TJSArray;\r\n function GetItem(index: integer): TJSONValue;\r\n procedure SetItem(index: integer; const Value: TJSONValue);\r\n function GetCount: integer; reintroduce;\r\n function GetJA: TJSArray;\r\n protected\r\n property ja: TJSArray read GetJA write fja;\r\n public\r\n constructor Create(AArray: TJSArray); overload;\r\n property Count: integer read GetCount;\r\n property Items[index: integer]: TJSONValue read GetItem write SetItem; default;\r\n procedure Add(const Element: string); overload;\r\n procedure Add(const Element: boolean); overload;\r\n procedure Add(const Element: integer); overload;\r\n procedure Add(const Element: double); overload;\r\n procedure Add(const Element: TJSONObject); overload;\r\n procedure Add(const Element: TJSONPair); overload;\r\n\r\n function ToString: string; override;\r\n end;\r\n\r\n TJSON = class(TObject)\r\n function Parse(s: string): TJSONObject;\r\n end;\r\n\r\n\r\nimplementation\r\n\r\n\r\nfunction JSONObjectToString(const v: JSValue): string; assembler;\r\nasm\r\n return v+\"\";\r\nend;\r\n\r\n{ TJSON }\r\n\r\nfunction TJSON.Parse(s: string): TJSONObject;\r\nvar\r\n O: TJSObject;\r\nbegin\r\n O := TJSJSON.parseObject(s);\r\n\r\n if isArray(O) then\r\n begin\r\n Result := TJSONArray.Create(TJSArray(O));\r\n end\r\n else\r\n begin\r\n Result := TJSONObject.Create(O);\r\n end;\r\nend;\r\n\r\n{ TJSONArray }\r\n\r\nprocedure TJSONArray.Add(const Element: string);\r\nbegin\r\n ja.push(Element);\r\nend;\r\n\r\nprocedure TJSONArray.Add(const Element: integer);\r\nbegin\r\n ja.push(Element);\r\nend;\r\n\r\nprocedure TJSONArray.Add(const Element: boolean);\r\nbegin\r\n ja.push(Element);\r\nend;\r\n\r\nprocedure TJSONArray.Add(const Element: TJSONObject);\r\nbegin\r\n ja.push(Element);\r\nend;\r\n\r\nprocedure TJSONArray.Add(const Element: double);\r\nbegin\r\n ja.push(Element);\r\nend;\r\n\r\nprocedure TJSONArray.Add(const Element: TJSONPair);\r\nbegin\r\n ja.push(Element);\r\nend;\r\n\r\nconstructor TJSONArray.Create(AArray: TJSArray);\r\nbegin\r\n inherited Create;\r\n ja := AArray;\r\nend;\r\n\r\nfunction TJSONArray.GetCount: integer;\r\nbegin\r\n Result := ja.Length;\r\nend;\r\n\r\nfunction TJSONArray.GetItem(index: integer): TJSONValue;\r\nvar\r\n jv: JSValue;\r\nbegin\r\n jv := ja[Index];\r\n if (jv is TJSONObject) or (jv is TJSONArray) then\r\n Result := TJSONValue(jv)\r\n else\r\n Result := JSONValueFromJS(jv);\r\nend;\r\n\r\nfunction TJSONArray.GetJA: TJSArray;\r\nbegin\r\n if not Assigned(fja) then\r\n fja := TJSArray.new;\r\n\r\n Result := fja;\r\nend;\r\n\r\nprocedure TJSONArray.SetItem(index: integer; const Value: TJSONValue);\r\nbegin\r\n if Value is TJSONObject then\r\n ja[index] := TJSONObject(Value).jo;\r\nend;\r\n\r\nfunction TJSONArray.ToString: string;\r\nvar\r\n i: integer;\r\n jv: TJSONValue;\r\n comma: string;\r\nbegin\r\n Result := '[';\r\n comma := '';\r\n\r\n for i := 0 to Count - 1 do\r\n begin\r\n jv := Items[i];\r\n\r\n if Assigned(jv) then\r\n begin\r\n if (jv is TJSONObject) then\r\n begin\r\n Result := Result + comma + (jv as TJSONObject).ToString;\r\n end\r\n else\r\n Result := Result + comma + jv.ToString;\r\n\r\n comma := ',';\r\n end;\r\n end;\r\n\r\n Result := Result + ']';\r\nend;\r\n\r\n{ TJSONObject }\r\n\r\nconstructor TJSONObject.Create;\r\nbegin\r\n inherited Create;\r\n FMembers := TJSONPairList.Create;\r\n fjo := nil;\r\nend;\r\n\r\n{$HINTS OFF}\r\nfunction TJSONObject.AddPair(const Pair: TJSONPair): TJSONObject;\r\nvar\r\n LObj: TJSONObject;\r\n o: TJSObject;\r\nbegin\r\n if Assigned(Pair) then\r\n begin\r\n AddDescendant(Pair);\r\n if Assigned(fjo) then\r\n begin\r\n o := fjo;\r\n asm\r\n o[Pair.fjs.FValue] = Pair.fjv.fjv;\r\n end;\r\n end;\r\n\r\n LObj := TJSONObject(ParseJSONValue(ToJSON));\r\n end;\r\n Result := LObj;\r\nend;\r\n{$HINTS ON}\r\n\r\nfunction TJSONObject.AddPair(const Str: string;\r\n const Val: TJSONValue): TJSONObject;\r\nbegin\r\n AddPair(TJSONPair.Create(Str, Val));\r\n Result := Self;\r\nend;\r\n\r\nprocedure TJSONObject.AddDescendant(const Descendent: TJSONPair);\r\nbegin\r\n FMembers.Add(Descendent);\r\nend;\r\n\r\nfunction TJSONObject.AddPair(const Str, Val: string): TJSONObject;\r\nbegin\r\n AddPair(TJSONPair.Create(Str, Val));\r\n Result := Self;\r\nend;\r\n\r\nfunction TJSONObject.AddPair(const Str: string; const Val: Integer): TJSONObject;\r\nbegin\r\n AddPair(TJSONPair.Create(Str, TJSONNumber.Create(Val)));\r\n Result := Self;\r\nend;\r\n\r\nconstructor TJSONObject.Create(AObject: TJSObject);\r\nbegin\r\n inherited Create;\r\n FMembers := TJSONPairList.Create;\r\n jo := AObject;\r\nend;\r\n\r\ndestructor TJSONObject.Destroy;\r\nbegin\r\n FMembers.Free;\r\n inherited Destroy;\r\nend;\r\n\r\nfunction TJSONObject.Get(Index: Integer): TJSONPair;\r\nbegin\r\n Result := Get(TJSObject.keys(jo)[Index]);\r\nend;\r\n\r\nfunction TJSONObject.Get(Name: string): TJSONPair;\r\nvar\r\n jv: JSValue;\r\n jsv: TJSONValue;\r\n i: integer;\r\n p: TJSONPair;\r\nbegin\r\n Result := nil;\r\n\r\n if Assigned(jo) then\r\n begin\r\n jv := jo.Properties[Name];\r\n\r\n if jv <> Null then\r\n begin\r\n Result := TJSONPair.Create;\r\n jsv := JSONValueFromJS(jv);\r\n Result.fjo := jo;\r\n Result.JsonString.Value := Name;\r\n Result.JsonValue := jsv;\r\n end;\r\n end\r\n else\r\n begin\r\n for i := 0 to FMembers.Count - 1 do\r\n begin\r\n p := TJSONPair(FMembers.Items[i]);\r\n if (p.fjs.ToString = '\"'+Name+'\"') then\r\n Result := p;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TJSONObject.GetCount: Integer;\r\nbegin\r\n Result := Length(TJSObject.keys(jo));\r\nend;\r\n\r\nfunction TJSONObject.GetItem(const Index: Integer): TJSONValue;\r\nvar\r\n jv: JSValue;\r\nbegin\r\n jv := jo[TJSObject.keys(jo)[Index]];\r\n Result := JSONValueFromJS(jv);\r\nend;\r\n\r\nfunction TJSONObject.GetJSONValue(Name: string): string;\r\nvar\r\n jv: JSValue;\r\nbegin\r\n jv := jo.Properties[Name];\r\n Result := JSONObjectToString(jv);\r\nend;\r\n\r\nfunction TJSONObject.GetPair(const I: Integer): TJSONPair;\r\nvar\r\n v: TJSONValue;\r\n l: integer;\r\n s: string;\r\nbegin\r\n if (FMembers.Count = 0) and Assigned(jo) and (length(TJSObject.keys(jo)) > 0) then\r\n begin\r\n l := length(TJSObject.keys(jo));\r\n if I < l then\r\n begin\r\n s := TJSObject.keys(jo)[I];\r\n v := TJSONValue.Create(jo[s]);\r\n Result := TJSONPair.Create(s,v);\r\n Exit;\r\n end;\r\n end;\r\n\r\n if (I >= 0) and (I < FMembers.Count) then\r\n Result := TJSONPair(FMembers[I])\r\n else\r\n Result := nil;\r\nend;\r\n\r\nfunction TJSONObject.GetValue(const Name: string): TJSONValue;\r\nvar\r\n jp: TJSONPair;\r\nbegin\r\n Result := nil;\r\n\r\n jp := Get(Name);\r\n\r\n if Assigned(jp) then\r\n begin\r\n Result := jp.JsonValue;\r\n Result.fjo := jp.fjo;\r\n end;\r\nend;\r\n\r\nclass function TJSONObject.JSONValueFromJS(const AJSValue: JSValue): TJSONValue;\r\nvar\r\n d: double;\r\nbegin\r\n Result := nil;\r\n\r\n if isArray(AJSValue) then\r\n begin\r\n Result := TJSONArray.Create;\r\n (Result as TJSONArray).ja := TJSArray(AJSValue);\r\n end\r\n else\r\n if isObject(AJSValue) then\r\n begin\r\n Result := TJSONObject.Create;\r\n (Result as TJSONObject).jo := TJSObject(AJSValue);\r\n end\r\n else\r\n if isString(AJSValue) then\r\n begin\r\n Result := TJSONString.Create;\r\n (Result as TJSONString).Value := string(AJSValue);\r\n end\r\n else\r\n if isNumber(AJSValue) then\r\n begin\r\n Result := TJSONNumber.Create;\r\n (Result as TJSONNumber).Value := string(AJSValue);\r\n d := double(AJSValue);\r\n (Result as TJSONNumber).AsDouble := d;\r\n if Frac(d) = 0 then\r\n (Result as TJSONNumber).AsInt := integer(AJSValue);\r\n end\r\n else\r\n if isNull(AJSValue) then\r\n Result := TJSONNull.Create\r\n else\r\n if isBoolean(AJSValue) then\r\n begin\r\n if toBoolean(AJSValue) then\r\n Result := TJSONTrue.Create\r\n else\r\n Result := TJSONFalse.Create;\r\n end;\r\n\r\n if not Assigned(Result) then\r\n Result := TJSONNull.Create;\r\n\r\n Result.jv := AJSValue;\r\nend;\r\n\r\nclass function TJSONObject.ParseJSONValue(const data: string): TJSONValue;\r\nvar\r\n O: TJSObject;\r\nbegin\r\n O := TJSJSON.parseObject(data);\r\n Result := JSONValueFromJS(O);\r\nend;\r\n\r\n{$HINTS OFF}\r\nprocedure TJSONObject.SetValue(const Name: string; AValue: string);\r\nvar\r\n O: TJSObject;\r\nbegin\r\n O := JSObject;\r\n asm\r\n O[Name] = AValue;\r\n end;\r\nend;\r\n\r\nprocedure TJSONObject.SetValue(const Name: string; AValue: integer);\r\nvar\r\n O: TJSObject;\r\nbegin\r\n O := JSObject;\r\n asm\r\n O[Name] = AValue;\r\n end;\r\nend;\r\n\r\nprocedure TJSONObject.SetValue(const Name: string; AValue: double);\r\nvar\r\n O: TJSObject;\r\nbegin\r\n O := JSObject;\r\n asm\r\n O[Name] = AValue;\r\n end;\r\nend;\r\n\r\nprocedure TJSONObject.SetValues(const Name: string; const Value: TJSONValue);\r\nvar\r\n O: TJSObject;\r\nbegin\r\n O := JSObject;\r\n asm\r\n O[Name] = Value;\r\n end;\r\nend;\r\n{$HINTS ON}\r\n\r\nfunction TJSONObject.ToJSON: string;\r\nvar\r\n s: string;\r\n Size: Integer;\r\n I: Integer;\r\n jp: TJSONPair;\r\nbegin\r\n if Assigned(jo) then\r\n Size := Count\r\n else\r\n Size := FMembers.Count;\r\n\r\n if (Self is TJSONArray) then\r\n begin\r\n Result := (Self as TJSONArray).ToString;\r\n end\r\n else\r\n begin\r\n s := '{';\r\n if Size > 0 then\r\n begin\r\n if Assigned(jo) then\r\n begin\r\n jp := TJSONPair(Get(0));\r\n if Assigned(jp) then\r\n s := s + jp.ToString\r\n end\r\n else\r\n s := s + TJSONPair(FMembers[0]).ToString;\r\n end;\r\n\r\n for I := 1 to Size - 1 do\r\n begin\r\n if Assigned(jo) then\r\n begin\r\n jp := TJSONPair(Get(I));\r\n if Assigned(jp) then\r\n s := s + ',' + jp.ToString\r\n else\r\n s := s + ',' + '\"' + TJSObject.keys(jo)[I] +'\":null';\r\n end\r\n else\r\n s := s + ',' + TJSONPair(FMembers[I]).ToString;\r\n end;\r\n s := s + '}';\r\n Result := s;\r\n end;\r\nend;\r\n\r\nfunction TJSONObject.ToString: string;\r\nbegin\r\n Result := ToJSON;\r\nend;\r\n\r\n{ TJSONPair }\r\n\r\nconstructor TJSONPair.Create;\r\nbegin\r\n inherited;\r\n fjs := TJSONString.Create;\r\nend;\r\n\r\nconstructor TJSONPair.Create(const Str: string; const Value: TJSONValue);\r\nbegin\r\n inherited Create;\r\n JsonString := TJSONString.Create(Str);\r\n JsonValue := Value;\r\nend;\r\n\r\nconstructor TJSONPair.Create(const Str, Value: string);\r\nbegin\r\n inherited Create;\r\n JsonString := TJSONString.Create(Str);\r\n JsonValue := TJSONString.Create(Value);\r\nend;\r\n\r\ndestructor TJSONPair.Destroy;\r\nbegin\r\n fjs.Free;\r\n inherited;\r\nend;\r\n\r\nfunction TJSONPair.ToString: string;\r\nbegin\r\n if (JsonValue is TJSONObject) then\r\n Result := '\"' + JsonString.GetStrValue + '\":' + (JsonValue as TJSONObject).ToJSON\r\n else\r\n begin\r\n if (JsonString <> nil) and (JsonValue <> nil) then\r\n Result := '\"' + JsonString.GetStrValue + '\":' + JsonValue.ToString\r\n else\r\n Result := '';\r\n end;\r\nend;\r\n\r\n{ TJSONAncestor }\r\n\r\nfunction TJSONAncestor.GetStrValue: string;\r\nbegin\r\n Result := '';\r\nend;\r\n\r\nprocedure TJSONAncestor.SetStrValue(const Value: string);\r\nbegin\r\n //\r\nend;\r\n\r\n{ TJSONString }\r\n\r\nconstructor TJSONString.Create(AString: string);\r\nbegin\r\n inherited Create;\r\n jv := AString;\r\n FValue := AString;\r\nend;\r\n\r\nfunction TJSONString.GetStrValue: string;\r\nbegin\r\n Result := FValue;\r\nend;\r\n\r\nprocedure TJSONString.SetStrValue(const Value: string);\r\nbegin\r\n FValue := Value;\r\n jv := Value;\r\n\r\n if Assigned(fjo) then\r\n begin\r\n asm\r\n var s = Object.keys(this.fjo)[0];\r\n this.fjo[s] = Value;\r\n end;\r\n end;\r\nend;\r\n\r\n{ TJSONNumber }\r\n\r\nconstructor TJSONNumber.Create(ANumber: integer);\r\nbegin\r\n inherited Create;\r\n jv := ANumber;\r\nend;\r\n\r\nconstructor TJSONNumber.Create(ANumber: double);\r\nbegin\r\n inherited Create;\r\n jv := ANumber;\r\nend;\r\n\r\nfunction TJSONNumber.GetStrValue: string;\r\nbegin\r\n Result := FloatToStr(FDouble);\r\nend;\r\n\r\nprocedure TJSONNumber.SetStrValue(const Value: string);\r\nbegin\r\n FDouble := StrToFloat(Value);\r\n if Frac(FDouble) = 0 then\r\n begin\r\n if not TryStrToInt(Value, FInt) then\r\n FInt := 0;\r\n jv := FInt;\r\n end\r\n else\r\n jv := FDouble;\r\nend;\r\n\r\n{ TJSONTrue }\r\n\r\nfunction TJSONTrue.GetStrValue: string;\r\nbegin\r\n Result := 'true';\r\nend;\r\n\r\nfunction TJSONTrue.ToString: string;\r\nbegin\r\n Result := GetStrValue;\r\nend;\r\n\r\n{ TJSONFalse }\r\n\r\nfunction TJSONFalse.GetStrValue: string;\r\nbegin\r\n Result := 'false';\r\nend;\r\n\r\n\r\nfunction TJSONFalse.ToString: string;\r\nbegin\r\n Result := GetStrValue;\r\nend;\r\n\r\n{ TJSONNull }\r\n\r\nfunction TJSONNull.GetStrValue: string;\r\nbegin\r\n Result := 'null';\r\nend;\r\n\r\n\r\nfunction TJSONNull.ToString: string;\r\nbegin\r\n Result := GetStrValue;\r\nend;\r\n\r\n{ TJSONValue }\r\n\r\nconstructor TJSONValue.Create(AJSValue: JSValue);\r\nbegin\r\n inherited Create;\r\n jv := AJSValue;\r\nend;\r\n\r\nfunction TJSONValue.ToString: string;\r\nbegin\r\n Result := TJSJSON.stringify(jv);\r\nend;\r\n\r\nfunction TJSONValue.GetValue(const APath: string = ''): T;\r\nbegin\r\n Result := nil;\r\nend;\r\n\r\nend.\r\n","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright (c) 2018 - 2020 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.ClientConnector;\r\n\r\n{$DEFINE NOPP}\r\n\r\ninterface\r\n\r\nuses\r\n Classes, WEBLib.JSON;\r\n\r\ntype\r\n TClientConnectorIdentifier = (ciUnknown, ciAndroid, ciiOS, ciWindows, ciMac);\r\n\r\n TClientConnectorReceivedMessageEvent = procedure(Sender: TObject; AJSON: TJSONObject) of object;\r\n\r\n TClientConnector = class(TComponent)\r\n private\r\n FOnReceivedMessage: TClientConnectorReceivedMessageEvent;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n destructor Destroy; override;\r\n procedure Receive(AJSON: string);\r\n procedure Send(AJSON: TJSONObject);\r\n procedure SendMessage(AMessage: string);\r\n published\r\n property OnReceivedMessage: TClientConnectorReceivedMessageEvent read FOnReceivedMessage write FOnReceivedMessage;\r\n end;\r\n\r\n TWebClientConnector = class(TClientConnector);\r\n\r\nimplementation\r\n\r\nuses\r\n Math, JS, WEBLib.Forms, SysUtils, WEBLib.Dialogs;\r\n\r\nconst\r\n Prefix: string = 'webclientevent://';\r\n\r\nconstructor TClientConnector.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n Application.ClientConnector := Self;\r\nend;\r\n\r\ndestructor TClientConnector.Destroy;\r\nbegin\r\n Application.ClientConnector := nil;\r\n inherited;\r\nend;\r\n\r\nprocedure TClientConnector.Receive(AJSON: string);\r\nvar\r\n js: TJSON;\r\n o: TJSONObject;\r\n s: string;\r\nbegin\r\n js := TJSON.Create;\r\n s := decodeURIComponent(AJSON);\r\n o := js.parse(s);\r\n if Assigned(OnReceivedMessage) then\r\n OnReceivedMessage(Self, o);\r\n o.Free;\r\nend;\r\n\r\nprocedure TClientConnector.Send(AJSON: TJSONObject);\r\nvar\r\n s: string;\r\nbegin\r\n s := TJSJSON.stringify(AJSON.JSObject);\r\n SendMessage(s);\r\nend;\r\n\r\nprocedure TClientConnector.SendMessage(AMessage: string);\r\nconst\r\n MAXBUFFERCOUNT = 500;\r\nvar\r\n s: string;\r\n cid: TClientConnectorIdentifier;\r\n scid: string;\r\n sSub: string;\r\n sc: Integer;\r\n\r\n procedure InternalSend(m: string);\r\n begin\r\n case cid of\r\n ciAndroid:\r\n begin\r\n asm\r\n injectedObject.Setjsvalue(m);\r\n injectedObject.performClick();\r\n end;\r\n end;\r\n ciiOS, ciMac:\r\n begin\r\n asm\r\n window.webkit.messageHandlers.bridge.postMessage(m);\r\n end;\r\n end;\r\n ciWindows:\r\n begin\r\n asm\r\n window.location = m;\r\n end;\r\n end;\r\n ciUnknown: ShowMessage('Please perform handshake from client first.');\r\n end;\r\n end;\r\nbegin\r\n s := AMessage;\r\n asm\r\n scid = window.TMSWEBCoreClientIdentifier;\r\n end;\r\n\r\n cid := ciUnknown;\r\n case LowerCase(scid) of\r\n 'android': cid := ciAndroid;\r\n 'ios': cid := ciiOS;\r\n 'windows': cid := ciWindows;\r\n 'mac', 'macos': cid := ciMac;\r\n end;\r\n\r\n\r\n case LowerCase(scid) of\r\n 'mac', 'macos', 'ios': InternalSend(Prefix + encodeURIcomponent(s));\r\n 'android', 'windows':\r\n begin\r\n InternalSend(Prefix + 'BUFFERSTART');\r\n while Length(s) > 0 do\r\n begin\r\n sc := Min(Integer(Length(s)), MAXBUFFERCOUNT);\r\n sSub := Copy(s, 1, sc);\r\n Delete(s, 1, sc);\r\n InternalSend(Prefix + encodeURIcomponent(sSub));\r\n end;\r\n InternalSend(Prefix + 'BUFFEREND');\r\n end;\r\n end;\r\nend;\r\n\r\nend.\r\n","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright (c) 2018 - 2021 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.Forms;\r\n\r\n{$DEFINE NOPP}\r\n\r\ninterface\r\n\r\nuses\r\n Classes, Types, SysUtils, WEBLib.Graphics, WEBLib.Controls, WEBLib.Modules,\r\n WEBLib.Lang, WEBLib.Menus, Web, JS, WEBLib.ClientConnector\r\n {$IFDEF SINGLEINSTANCE}\r\n , WEBLib.WebSocketClient\r\n {$ENDIF}\r\n ;\r\n\r\nconst\r\n WEBCOREVERSION = '1.8.0.1 Sirolo';\r\n\r\n idOK = 1;\r\n idCancel = 2;\r\n idAbort = 3;\r\n idRetry = 4;\r\n idIgnore = 5;\r\n idYes = 6;\r\n idNo = 7;\r\n idClose = 8;\r\n idHelp = 9;\r\n idTryAgain = 10;\r\n idContinue = 11;\r\n mrNone = 0;\r\n mrOk = idOk;\r\n mrCancel = idCancel;\r\n mrAbort = idAbort;\r\n mrRetry = idRetry;\r\n mrIgnore = idIgnore;\r\n mrYes = idYes;\r\n mrNo = idNo;\r\n mrClose = idClose;\r\n mrHelp = idHelp;\r\n mrTryAgain = idTryAgain;\r\n mrContinue = idContinue;\r\n mrAll = mrContinue + 1;\r\n mrNoToAll = mrAll + 1;\r\n mrYesToAll = mrNoToAll + 1;\r\n\r\n FORMCAPTIONHEIGHT = 22;\r\n\r\n rgiFirst = -1024;\r\n rgiLast = -513;\r\n igiFirst = 256;\r\n igiLast = 511;\r\n\r\n clTMSBlue = $E39E00;\r\n clTMSWEB = $8F8300;\r\n\r\ntype\r\n TDragDockObject = class;\r\n TCustomForm = class;\r\n\r\n TConstraintSize = 0..MaxInt;\r\n TCloseAction = (caNone, caHide, caFree, caMinimize);\r\n TModalResult = Integer;\r\n TFormStyle = (fsNormal, fsStayOnTop);\r\n TNavigationTarget = (ntBlank, ntPage);\r\n TGestureID = rgiFirst..igiLast;\r\n TInteractiveGestureFlag = (gfBegin, gfInertia, gfEnd);\r\n TInteractiveGestureFlags = set of TInteractiveGestureFlag;\r\n TMouseActivate = (maDefault, maActivate, maActivateAndEat, maNoActivate, maNoActivateAndEat);\r\n TScreenOrientation = (soPortrait, soLandscape);\r\n TApplicationColorScheme = (csNoScheme, csLight, csDark);\r\n\r\n TSmallPoint = record\r\n x, y: SmallInt;\r\n end;\r\n\r\n TAlignInfo = record\r\n AlignList: TList;\r\n ControlIndex: Integer;\r\n Align: TAlign;\r\n Scratch: Integer;\r\n end;\r\n\r\n TGestureEventInfo = record\r\n GestureID: TGestureID;\r\n Location: TPoint;\r\n Flags: TInteractiveGestureFlags;\r\n Angle: Double;\r\n InertiaVector: TSmallPoint;\r\n Distance: Integer;\r\n TapLocation: TSmallPoint;\r\n end;\r\n\r\n TOnPaintEvent = TNotifyEvent;\r\n TCloseEvent = procedure(Sender: TObject; var Action: TCloseAction) of object;\r\n TCloseQueryEvent = procedure(Sender: TObject; var CanClose: Boolean) of object;\r\n TOrientationChangeEvent = procedure(Sender: TObject; AOrientation: TScreenOrientation) of object;\r\n TBeforeUnloadEvent = procedure(Sender: TObject; var AMessage: string) of object;\r\n TAlignInsertBeforeEvent = function(Sender: TWinControl; C1, C2: TControl): Boolean of object;\r\n TAlignPositionEvent = procedure(Sender: TWinControl; Control: TControl;\r\n var NewLeft, NewTop, NewWidth, NewHeight: Integer;\r\n var AlignRect: TRect; AlignInfo: TAlignInfo) of object;\r\n TCanResizeEvent = procedure(Sender: TObject; var NewWidth, NewHeight: Integer;\r\n var Resize: Boolean) of object;\r\n TConstrainedResizeEvent = procedure(Sender: TObject; var MinWidth, MinHeight,\r\n MaxWidth, MaxHeight: Integer) of object;\r\n TContextPopupEvent = procedure(Sender: TObject; MousePos: TPoint; var Handled: Boolean) of object;\r\n TDockDropEvent = procedure(Sender: TObject; Source: TDragDockObject;\r\n X, Y: Integer) of object;\r\n TDockOverEvent = procedure(Sender: TObject; Source: TDragDockObject;\r\n X, Y: Integer; State: TDragState; var Accept: Boolean) of object;\r\n TGestureEvent = procedure(Sender: TObject; const EventInfo: TGestureEventInfo;\r\n var Handled: Boolean) of object;\r\n TGetSiteInfoEvent = procedure(Sender: TObject; DockClient: TControl;\r\n var InfluenceRect: TRect; MousePos: TPoint; var CanDock: Boolean) of object;\r\n TMouseActivateEvent = procedure(Sender: TObject; Button: TMouseButton;\r\n Shift: TShiftState; X, Y: Integer; HitTest: Integer; var MouseActivate: TMouseActivate) of object;\r\n TMouseWheelUpDownEvent = procedure(Sender: TObject; Shift: TShiftState;\r\n MousePos: TPoint; var Handled: Boolean) of object;\r\n TStartDockEvent = procedure(Sender: TObject;\r\n var DragObject: TDragDockObject) of object;\r\n TUnDockEvent = procedure(Sender: TObject; Client: TControl;\r\n NewTarget: TWinControl; var Allow: Boolean) of object;\r\n\r\n THashChangeEvent = procedure(Sender: TObject; oldURL, newURL: string) of object;\r\n\r\n TModalResultProc = reference to procedure(AValue: TModalResult);\r\n TFormCreatedProc = reference to procedure(AForm: TObject);\r\n\r\n TWindowState = (wsNormal, wsMinimized, wsMaximized);\r\n\r\n TPopupMode = (pmNone, pmAuto, pmExplicit);\r\n TPopupClose = (pcOnDeactivate, pcNever);\r\n TPosition = (poDesigned, poDefault, poDefaultPosOnly, poDefaultSizeOnly, poScreenCenter, poDesktopCenter, poMainFormCenter, poOwnerFormCenter);\r\n\r\n TApplicationErrorType = (aeSilent, aeDialog, aeAlert, aeFooter);\r\n\r\n TFormBorderStyle = (fbNone, fbSingle, fbSizeable, fbDialog, fbDialogSizeable);\r\n TFormBorder = fbNone..fbSingle;\r\n\r\n TCSSLibrary = (cssNone, cssBootstrap);\r\n\r\n TCustomSizeConstraints = class(TPersistent)\r\n private\r\n FControl: TControl;\r\n FMaxHeight: TConstraintSize;\r\n FMaxWidth: TConstraintSize;\r\n FMinHeight: TConstraintSize;\r\n FMinWidth: TConstraintSize;\r\n FOnChange: TNotifyEvent;\r\n procedure SetConstraints(AIndex: Integer; AValue: TConstraintSize);\r\n protected\r\n procedure Change; virtual;\r\n procedure AssignTo(ADest: TPersistent); override;\r\n property Control: TControl read FControl;\r\n property MaxHeight: TConstraintSize index 0 read FMaxHeight write SetConstraints default 0;\r\n property MaxWidth: TConstraintSize index 1 read FMaxWidth write SetConstraints default 0;\r\n property MinHeight: TConstraintSize index 2 read FMinHeight write SetConstraints default 0;\r\n property MinWidth: TConstraintSize index 3 read FMinWidth write SetConstraints default 0;\r\n public\r\n constructor Create(AControl: TControl); virtual;\r\n property OnChange: TNotifyEvent read FOnChange write FOnChange;\r\n end;\r\n\r\n TSizeConstraints = class(TCustomSizeConstraints)\r\n published\r\n property MaxHeight;\r\n property MaxWidth;\r\n property MinHeight;\r\n property MinWidth;\r\n end;\r\n\r\n TDragDockObject = class(TObject)\r\n strict private\r\n FBrush: TBrush;\r\n FDockRect: TRect;\r\n FDropAlign: TAlign;\r\n FDropOnControl: TControl;\r\n FEraseDockRect: TRect;\r\n FEraseWhenMoving: Boolean;\r\n FFloating: Boolean;\r\n FFrameWidth: Integer;\r\n public\r\n constructor Create(AControl: TControl);\r\n destructor Destroy; override;\r\n procedure Assign(Source: TDragObject);\r\n property Brush: TBrush read FBrush write FBrush;\r\n property DockRect: TRect read FDockRect write FDockRect;\r\n property DropAlign: TAlign read FDropAlign;\r\n property DropOnControl: TControl read FDropOnControl;\r\n property EraseDockRect: TRect read FEraseDockRect write FEraseDockRect;\r\n property EraseWhenMoving: Boolean read FEraseWhenMoving;\r\n property Floating: Boolean read FFloating write FFloating;\r\n property FrameWidth: Integer read FFrameWidth;\r\n end;\r\n\r\n TCustomForm = class(TWinControl)\r\n private\r\n FDesignContainer: TJSElement;\r\n FLayer: TJSElement;\r\n FPopup: Boolean;\r\n FPopupElement: TJSHTMLElement;\r\n FFormFileName: string;\r\n FFormContent: string;\r\n FFormContainer: TElementID;\r\n FFormElement: string;\r\n FFormStyle: TFormStyle;\r\n FOnCreate: TNotifyEvent;\r\n FOnShow: TNotifyEvent;\r\n FModalResult: TModalResult;\r\n FOnPaint: TOnPaintEvent;\r\n FOnDeactivate: TNotifyEvent;\r\n FOnCloseQuery: TCloseQueryEvent;\r\n FOnClose: TCloseEvent;\r\n FModalProc: TModalResultProc;\r\n FCreatedProc: TFormCreatedProc;\r\n FWindowState: TWindowState;\r\n FCaption: string;\r\n FIsResizing: boolean;\r\n FOnScroll: TNotifyEvent;\r\n FOnUnload: TNotifyEvent;\r\n FOnBeforeUnload: TBeforeUnloadEvent;\r\n FPopupMode: TPopupMode;\r\n FPopupClose: TPopupClose;\r\n FPosition: TPosition;\r\n FActiveControl: TWinControl;\r\n FMdx, FMdy: integer;\r\n FDlgX, FDlgY: integer;\r\n FCaptured: boolean;\r\n FDown: boolean;\r\n FHasCaption: boolean;\r\n FMoveSpan: TJSHTMLElement;\r\n FCaptionElement: TJSHTMLElement;\r\n FCaptionCloseElement: TJSHTMLElement;\r\n FBorder: TFormBorderStyle;\r\n FShadow: boolean;\r\n FTimerID: integer;\r\n FOrigWidth, FOrigHeight: integer;\r\n FOldWidth, FOldHeight: integer;\r\n FOnDestroy: TNotifyEvent;\r\n FPopupOpacity: single;\r\n FCreating: boolean;\r\n FLoadedPtr: pointer;\r\n FDOMContentLoadedPtr: pointer;\r\n FUnloadPtr: pointer;\r\n FBeforeUnloadPtr: pointer;\r\n FResizePtr: pointer;\r\n FScrollPtr: pointer;\r\n FDocMouseUpPtr: pointer;\r\n FDocMouseMovePtr: pointer;\r\n FTitleDownPtr: pointer;\r\n FDoClickPtr: pointer;\r\n FKeyDownPtr: pointer;\r\n FOrientationChangePtr: pointer;\r\n FHashChangePtr: pointer;\r\n FCSSLibrary: TCSSLibrary;\r\n FNoHTML: boolean;\r\n FPrevActiveForm: TCustomForm;\r\n FElementCaptionClassName: TElementClassName;\r\n FMenu: TCustomControl;\r\n FResizeObserver: TJSObject;\r\n FOnOrientationChange: TOrientationChangeEvent;\r\n FOnDOMContentLoaded: TNotifyEvent;\r\n FShowClose: boolean;\r\n FOnHashChange: THashChangeEvent;\r\n procedure SetModalResult(const Value: TModalResult);\r\n function GetFormStyle: TFormStyle;\r\n procedure SetFormStyle(const Value: TFormStyle); virtual;\r\n function GetCanvas: TCanvas;\r\n procedure SetCaption(const AValue: string); virtual;\r\n procedure SetActiveControl(const Value: TWinControl);\r\n procedure SetShadow(const Value: boolean);\r\n procedure SetBorder(const Value: TFormBorderStyle);\r\n procedure SetFormContainer(const Value: TElementID);\r\n function GetActiveControl: TWinControl;\r\n procedure SetWidth(AValue: Integer); override;\r\n procedure SetHeight(AValue: Integer); override;\r\n procedure SetPosition(const Value: TPosition); virtual;\r\n protected\r\n function HandleHashChange(Event: TEventListenerEvent): boolean; virtual;\r\n function HandleLoaded(Event: TEventListenerEvent): boolean; virtual;\r\n function HandleDOMContentLoaded(Event: TEventListenerEvent): boolean; virtual;\r\n function HandleScroll(Event: TEventListenerEvent): boolean; virtual;\r\n function HandleUnload(Event: TEventListenerEvent): boolean; virtual;\r\n function HandleBeforeUnload(Event: TEventListenerEvent): boolean; virtual;\r\n function HandleObserver: boolean; virtual;\r\n function HandleResize(Event: TEventListenerEvent): boolean; virtual;\r\n function HandleDocMouseMove(Event: TJSMouseEvent): Boolean; virtual;\r\n function HandleDocMouseUp(Event: TJSMouseEvent): Boolean; virtual;\r\n function HandleTitleDown(Event: TJSMouseEvent): Boolean; virtual;\r\n function HandleCloseClick(Event: TEventListenerEvent): boolean; virtual;\r\n\r\n procedure SetLeft(AValue: Integer); override;\r\n procedure SetTop(AValue: Integer); override;\r\n\r\n procedure ClearMethodPointers; override;\r\n procedure GetMethodPointers; override;\r\n procedure VisibleChanged; override;\r\n procedure Resize; reintroduce; virtual;\r\n procedure CreateControl; override;\r\n procedure DoClose(var CloseAction: TCloseAction); virtual;\r\n procedure BindEvents; override;\r\n procedure UnbindEvents; override;\r\n procedure DoCreate; virtual;\r\n procedure Realign; override;\r\n procedure DoResize; virtual;\r\n procedure DoShow; virtual;\r\n procedure Paint; virtual;\r\n function HandleDoClick(Event: TJSMouseEvent): Boolean; reintroduce; virtual;\r\n function HandleKeyDown(Event: TJSKeyBoardEvent): Boolean; virtual;\r\n function HandleOrientationChange(Event: TJSEvent): Boolean; virtual;\r\n procedure HandleDoResize; virtual;\r\n function GetWidth: Integer; override;\r\n function GetHeight: Integer; override;\r\n function GetLeft: Integer; override;\r\n function GetTop: Integer; override;\r\n function GetClientRect: TRect; override;\r\n function CreateElement: TJSElement; override;\r\n procedure UpdateElement; override;\r\n function ContainerElement: TJSElement; override;\r\n function FormContainerElement: TJSElement; virtual;\r\n function GetElementBindHandle: TJSEventTarget; override;\r\n function GetElementHandle: TJSHTMLElement; override;\r\n procedure SetElementClassName(AValue: string); override;\r\n function CloseQuery: Boolean; virtual;\r\n procedure LoadDFMValues; virtual;\r\n procedure Init; virtual;\r\n property FormContent: string read FFormContent write FFormContent;\r\n property WindowState: TWindowState read FWindowState write FWindowState;\r\n function IsFocused: Boolean; override;\r\n property PopupMode: TPopupMode read FPopupMode write FPopupMode default pmNone;\r\n property PopupClose: TPopupClose read FPopupClose write FPopupClose default pcOnDeactivate;\r\n property Position: TPosition read FPosition write SetPosition default poDefaultPosOnly;\r\n function CreateLayer: TJSHTMLElement;\r\n function CreateCaption: TJSHTMLElement;\r\n function GetCaptionHeight: integer;\r\n procedure SetColorScheme(AScheme: TApplicationColorScheme); virtual;\r\n procedure SetFormPos; virtual;\r\n property Border: TFormBorderStyle read FBorder write SetBorder;\r\n class function GetHTMLFileName: string; virtual;\r\n public\r\n procedure CreateInitialize; override;\r\n constructor Create(id: string); overload; override;\r\n constructor Create(id: string; var AReference); overload; virtual;\r\n constructor Create(AOwner: TComponent); overload; override;\r\n constructor CreateNew(AOwner: TComponent; Dummy: Integer = 0); overload; virtual;\r\n constructor CreateNew(AFileName: string); overload; virtual;\r\n constructor CreateNew; overload; virtual;\r\n constructor CreateNew(AProc: TFormCreatedProc); overload; virtual;\r\n constructor CreateNew(AElementID: string; AProc: TFormCreatedProc); overload; virtual;\r\n constructor CreateNew(AElementID, AFileName: string; AProc: TFormCreatedProc); overload; virtual;\r\n constructor CreateDialog(ACaption: string); virtual;\r\n constructor CreateDialogNew(ACaption: string); virtual;\r\n\r\n [async]\r\n function Load: TJSPromise;\r\n [async]\r\n function Execute: TJSPromise;\r\n\r\n destructor Destroy; override;\r\n procedure Close; virtual;\r\n function GetUniqueComponentName(AComponent: TComponent): string;\r\n function IsMiletus: boolean;\r\n procedure PreventDefault; reintroduce;\r\n property ActiveControl: TWinControl read GetActiveControl write SetActiveControl;\r\n property ModalResult: TModalResult read FModalResult write SetModalResult;\r\n property Canvas: TCanvas read GetCanvas;\r\n property CaptionElement: TJSHTMLElement read FCaptionElement;\r\n property ElementCaptionClassName: TElementClassName read FElementCaptionClassName write FElementCaptionClassName;\r\n procedure SetBounds(X, Y, AWidth, AHeight: Integer); override;\r\n procedure SelectFirst;\r\n procedure SelectNext(CurControl: TControl; GoForward: boolean; CheckTabStop: boolean);\r\n procedure Show; reintroduce;\r\n function ShowModal: Integer; overload; virtual;\r\n function ShowModal(AProc: TModalResultProc): TModalResult; overload; virtual;\r\n procedure AddCSS(const id: string; const css: string);\r\n procedure RemoveCSS(const id: string);\r\n procedure UpdateCSS(const id: string; const css: string);\r\n property Caption: string read FCaption write SetCaption;\r\n property Color;\r\n property CSSLibrary: TCSSLibrary read FCSSLibrary write FCSSLibrary default cssNone;\r\n property FormContainer: TElementID read FFormContainer write SetFormContainer;\r\n property FormFileName: string read FFormFileName write FFormFileName;\r\n property FormStyle: TFormStyle read GetFormStyle write SetFormStyle;\r\n property IsResizing: boolean read FIsResizing;\r\n property Menu: TCustomControl read FMenu write FMenu;\r\n property Popup: boolean read FPopup write FPopup;\r\n property PopupOpacity: single read FPopupOpacity write FPopupOpacity;\r\n property ShowClose: boolean read FShowClose write FShowClose default true;\r\n property Shadow: boolean read FShadow write SetShadow default true;\r\n property OnBeforeUnload: TBeforeUnloadEvent read FOnBeforeUnload write FOnBeforeUnload;\r\n property OnClick;\r\n property OnDblClick;\r\n property OnDOMContentLoaded: TNotifyEvent read FOnDOMContentLoaded write FOnDOMContentLoaded;\r\n property OnClose: TCloseEvent read FOnClose write FOnClose;\r\n property OnCloseQuery: TCloseQueryEvent read FOnCloseQuery write FOnCloseQuery;\r\n property OnCreate: TNotifyEvent read FOnCreate write FOnCreate;\r\n property OnDestroy: TNotifyEvent read FOnDestroy write FOnDestroy;\r\n property OnDeactivate: TNotifyEvent read FOnDeactivate write FOnDeactivate;\r\n property OnOrientationChange: TOrientationChangeEvent read FOnOrientationChange write FOnOrientationChange;\r\n property OnPaint: TOnPaintEvent read FOnPaint write FOnPaint;\r\n property OnScroll: TNotifyEvent read FOnScroll write FOnScroll;\r\n property OnShow: TNotifyEvent read FOnShow write FOnShow;\r\n property OnUnload: TNotifyEvent read FOnUnload write FOnUnload;\r\n property OnHashChange: THashChangeEvent read FOnHashChange write FOnHashChange;\r\n end;\r\n\r\n TFormClass = class of TForm;\r\n TForm = class(TCustomForm)\r\n public\r\n property Border;\r\n property ClientHeight;\r\n property ClientWidth;\r\n property PopupMode;\r\n property Position;\r\n published\r\n property Align;\r\n property Caption;\r\n property Color;\r\n property CSSLibrary;\r\n property ElementClassName;\r\n property ElementFont;\r\n property ElementPosition;\r\n property Font;\r\n property FormContainer;\r\n property FormStyle;\r\n property Menu;\r\n property ParentFont;\r\n property Shadow;\r\n property ShowClose;\r\n property TabOrder;\r\n property TabStop;\r\n property OnBeforeUnload;\r\n property OnClick;\r\n property OnClose;\r\n property OnCloseQuery;\r\n property OnCreate;\r\n property OnDblClick;\r\n property OnDeactivate;\r\n property OnDestroy;\r\n property OnDOMContentLoaded;\r\n property OnHashChange;\r\n property OnResize;\r\n property OnShow;\r\n property OnScroll;\r\n property OnOrientationChange;\r\n property OnPaint;\r\n property OnTouchStart;\r\n property OnTouchMove;\r\n property OnTouchEnd;\r\n property OnUnload;\r\n end;\r\n\r\n TWebForm = TForm;\r\n\r\n\r\n TTouchManager = class(TComponent)\r\n end;\r\n\r\n TCustomFrame = class(TCustomHTMLDiv)\r\n private\r\n FAutoScroll: Boolean;\r\n FAutoSize: Boolean;\r\n FBiDiMode: TBiDiMode;\r\n FConstraints: TSizeConstraints;\r\n FCtl3D: Boolean;\r\n FDockSite: Boolean;\r\n FDragCursor: TCursor;\r\n FDragKind: TDragKind;\r\n FDragMode: TDragMode;\r\n FOnAlignInsertBefore: TAlignInsertBeforeEvent;\r\n FOnAlignPosition: TAlignPositionEvent;\r\n FOnCanResize: TCanResizeEvent;\r\n FOnConstrainedResize: TConstrainedResizeEvent;\r\n FOnContextPopup: TContextPopupEvent;\r\n FOnDockDrop: TDockDropEvent;\r\n FOnDockOver: TDockOverEvent;\r\n FOnEndDock: TEndDragEvent;\r\n FOnGesture: TGestureEvent;\r\n FOnGetSiteInfo: TGetSiteInfoEvent;\r\n FOnMouseActivate: TMouseActivateEvent;\r\n FOnMouseWheelDown: TMouseWheelUpDownEvent;\r\n FOnMouseWheelUp: TMouseWheelUpDownEvent;\r\n FOnStartDock: TStartDockEvent;\r\n FOnUnDock: TUnDockEvent;\r\n FPadding: TPadding;\r\n FParentBackground: Boolean;\r\n FParentCtl3D: Boolean;\r\n FPopupMenu: TPopupMenu;\r\n FTouch: TTouchManager;\r\n FTouchManager: TTouchManager;\r\n procedure SetConstraints(const AValue: TSizeConstraints);\r\n procedure SetPopupMenu(AValue: TPopupMenu);\r\n procedure SetTouchManager(AValue: TTouchManager);\r\n protected\r\n procedure LoadDFMValues; virtual;\r\n property AutoScroll: Boolean read FAutoScroll write FAutoScroll default False;\r\n property AutoSize: Boolean read FAutoSize write FAutoSize default False;\r\n property BiDiMode: TBiDiMode read FBiDiMode write FBiDiMode stored False;\r\n property Constraints: TSizeConstraints read FConstraints write SetConstraints;\r\n property Ctl3D: Boolean read FCtl3D write FCtl3D stored False;\r\n property DockSite: Boolean read FDockSite write FDockSite default False;\r\n property DragCursor: TCursor read FDragCursor write FDragCursor default crDrag;\r\n property DragKind: TDragKind read FDragKind write FDragKind default dkDrag;\r\n property DragMode: TDragMode read FDragMode write FDragMode default dmManual;\r\n property Padding: TPadding read FPadding write FPadding;\r\n property ParentBackground: Boolean read FParentBackground write FParentBackground;\r\n property ParentCtl3D: Boolean read FParentCtl3D write FParentCtl3D default True;\r\n property PopupMenu: TPopupMenu read FPopupMenu write SetPopupMenu;\r\n property Touch: TTouchManager read FTouch write SetTouchManager;\r\n property OnAlignInsertBefore: TAlignInsertBeforeEvent read FOnAlignInsertBefore write FOnAlignInsertBefore;\r\n property OnAlignPosition: TAlignPositionEvent read FOnAlignPosition write FOnAlignPosition;\r\n property OnCanResize: TCanResizeEvent read FOnCanResize write FOnCanResize;\r\n property OnConstrainedResize: TConstrainedResizeEvent read FOnConstrainedResize write FOnConstrainedResize;\r\n property OnContextPopup: TContextPopupEvent read FOnContextPopup write FOnContextPopup;\r\n property OnDockDrop: TDockDropEvent read FOnDockDrop write FOnDockDrop;\r\n property OnDockOver: TDockOverEvent read FOnDockOver write FOnDockOver;\r\n property OnEndDock: TEndDragEvent read FOnEndDock write FOnEndDock;\r\n property OnGesture: TGestureEvent read FOnGesture write FOnGesture;\r\n property OnGetSiteInfo: TGetSiteInfoEvent read FOnGetSiteInfo write FOnGetSiteInfo;\r\n property OnMouseActivate: TMouseActivateEvent read FOnMouseActivate write FOnMouseActivate;\r\n property OnMouseWheelDown: TMouseWheelUpDownEvent read FOnMouseWheelDown write FOnMouseWheelDown;\r\n property OnMouseWheelUp: TMouseWheelUpDownEvent read FOnMouseWheelUp write FOnMouseWheelUp;\r\n property OnStartDock: TStartDockEvent read FOnStartDock write FOnStartDock;\r\n property OnUnDock: TUnDockEvent read FOnUnDock write FOnUnDock;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n constructor CreateNew(AOwner: TComponent);\r\n destructor Destroy; override;\r\n procedure LoadFromForm;\r\n end;\r\n\r\n TFrameClass = class of TFrame;\r\n TFrame = class(TCustomFrame)\r\n published\r\n property Align;\r\n property Anchors;\r\n property AutoScroll;\r\n property AutoSize;\r\n property BiDiMode;\r\n property Constraints;\r\n property DockSite;\r\n property DoubleBuffered;\r\n property DragCursor;\r\n property DragKind;\r\n property DragMode;\r\n property Enabled;\r\n property Color nodefault;\r\n property Ctl3D;\r\n property Font;\r\n property Padding;\r\n property ParentBackground default True;\r\n property ParentBiDiMode;\r\n property ParentColor;\r\n property ParentCtl3D;\r\n property ParentDoubleBuffered;\r\n property ParentFont;\r\n property ParentShowHint;\r\n property PopupMenu;\r\n property ShowHint;\r\n property TabOrder;\r\n property TabStop;\r\n property Touch;\r\n property Visible;\r\n property OnAlignInsertBefore;\r\n property OnAlignPosition;\r\n property OnCanResize;\r\n property OnClick;\r\n property OnConstrainedResize;\r\n property OnContextPopup;\r\n property OnDblClick;\r\n property OnDockDrop;\r\n property OnDockOver;\r\n property OnDragDrop;\r\n property OnDragOver;\r\n property OnEndDock;\r\n property OnEndDrag;\r\n property OnEnter;\r\n property OnExit;\r\n property OnGesture;\r\n property OnGetSiteInfo;\r\n property OnMouseActivate;\r\n property OnMouseDown;\r\n property OnMouseEnter;\r\n property OnMouseLeave;\r\n property OnMouseMove;\r\n property OnMouseUp;\r\n property OnMouseWheel;\r\n property OnMouseWheelDown;\r\n property OnMouseWheelUp;\r\n property OnResize;\r\n property OnStartDock;\r\n property OnStartDrag;\r\n property OnUnDock;\r\n end;\r\n\r\n TApplicationError = record\r\n AMessage: string;\r\n AFile: string;\r\n ALineNumber: integer;\r\n AColNumber: integer;\r\n AStack: string;\r\n AError: TJSObject;\r\n end;\r\n\r\n TOnlineStatus = (osOnline, osOffline);\r\n\r\n TApplicationErrorEvent = procedure(Sender: TObject; AError: TApplicationError; var Handled: boolean) of object;\r\n\r\n TApplicationHashChangeEvent = procedure(Sender: TObject; AHash: string; var Handled: boolean) of object;\r\n\r\n TApplicationOnlineChangeEvent = procedure(Sender: TObject; AStatus: TOnlineStatus) of object;\r\n\r\n TApplicationCallBackEvent = procedure(Sender: TObject; AQuery: string) of object;\r\n\r\n TApplication = class(TControl)\r\n private\r\n FAppContainer: TElementID;\r\n FMainFormOnTaskBar: Boolean;\r\n FCanCreateForm: Boolean;\r\n FAppInitializing: Boolean;\r\n FLastReq: TJSXMLHttpRequest;\r\n {$IFDEF SINGLEINSTANCE}\r\n FWebSocket: TSocketClient;\r\n {$ENDIF}\r\n FActiveForm: TCustomForm;\r\n FMainForm: TCustomForm;\r\n FInitFormClassName: string;\r\n FFormStack: TList;\r\n FParameters: TStrings;\r\n FIsRedirect: boolean;\r\n FLanguage: TUILanguage;\r\n FOnImageCacheReady: TNotifyEvent;\r\n FOnError: TApplicationErrorEvent;\r\n FOnHashChange: TApplicationHashChangeEvent;\r\n FAutoFormRoute: boolean;\r\n FErrorType: TApplicationErrorType;\r\n FClientConnector: TClientConnector;\r\n FOnOnlineChange: TApplicationOnlineChangeEvent;\r\n FThemeTextColor: TColor;\r\n FThemeColor: TColor;\r\n FThemed: boolean;\r\n FThemeButtonClassName: string;\r\n FOnOAuthToken: TApplicationCallBackEvent;\r\n FOnOAuthCallBack: TApplicationCallBackEvent;\r\n FOnFontCacheReady: TNotifyEvent;\r\n FMaxZIndex: integer;\r\n FCreatedProc: TFormCreatedProc;\r\n {$IFDEF HOTRELOAD}\r\n FHotReloadPollInterval: Integer;\r\n FHotReloadReq: TJSXMLHttpRequest;\r\n FHotReloadTimer: NativeInt;\r\n FHotReloadVersion: Integer;\r\n FHotReloadFile: string;\r\n {$ENDIF}\r\n function DoFormLoad(Event: TEventListenerEvent): boolean;\r\n function DoFormAbort(Event: TEventListenerEvent): boolean;\r\n function DoHandleError(Event: TJSErrorEvent): boolean;\r\n function DoHashChange(Event: TEventListenerEvent): boolean;\r\n function DoErrorClose(Event: TJSMOuseEvent): boolean;\r\n function DoUpdateOnlineStatus(Event: TEventListenerEvent): boolean;\r\n procedure SetLanguage(const Value: TUILanguage);\r\n function GetIsOnline: boolean;\r\n function GetIsMobile: boolean;\r\n procedure InternalDownloadFile(const AData: TJSUint8Array; const AFileName, AType: string; const ANewTab: Boolean);\r\n {$IFDEF SINGLEINSTANCE}\r\n procedure DoGetDataReceived(Sender: TObject; Origin: string; Data: TJSObjectRecord);\r\n procedure DoGetConnected(Sender: TObject);\r\n {$ENDIF}\r\n {$IFDEF HOTRELOAD}\r\n procedure OnHotReloadTick;\r\n function OnHotReloadLoad(AEvent: TEventListenerEvent): Boolean;\r\n function OnHotReloadAbort(AEvent: TEventListenerEvent): Boolean;\r\n procedure HandleHotReload(const AData: TJSObject);\r\n procedure StartHotReload;\r\n procedure StopHotReload;\r\n {$ENDIF}\r\n protected\r\n procedure CreateNewForm(AForm: TCustomForm; HTML: string); overload; virtual;\r\n function GetFormExtension: string;\r\n function GetAuthorizationPageHTML(const AAuthorizationSuccess: Boolean): string;\r\n function GetColorScheme: TApplicationColorScheme; virtual;\r\n procedure ReloadForm;\r\n procedure ActivateChildScripts(AElement: TJSHTMLElement);\r\n property MaxZIndex: integer read FMaxZIndex write FMaxZIndex;\r\n function MaxZIndexStr: string;\r\n procedure ChangeMaxZIndex(Delta: integer);\r\n public\r\n procedure PushForm(AForm: TCustomForm);\r\n function PopForm: TCustomForm;\r\n procedure LockForm(AForm: TCustomForm);\r\n procedure UnLockForm(AForm: TCustomForm);\r\n constructor Create(AOwner: TComponent); override;\r\n destructor Destroy; override;\r\n\r\n function CreateNewForm(AInstanceClass: TFormClass): TCustomForm; overload;\r\n function CreateNewForm(AInstanceClass: TFormClass; AElementID: string): TCustomForm; overload;\r\n procedure CreateForm(AInstanceClass: TFormClass; var AReference); overload;\r\n procedure CreateForm(AInstanceClass: TFormClass; AElementID: string; var AReference); overload;\r\n procedure CreateForm(AInstanceClass: TFormClass; AElementID: string; var AReference; AProc: TFormCreatedProc); overload;\r\n procedure CreateForm(AInstanceClass: TDataModuleClass; var AReference); overload;\r\n procedure CreateForm(AInstanceClass: TFrameClass; var AReference); overload;\r\n procedure CreateForm(AInstanceClass: TFormClass; AElement: TJSHTMLElement; var AReference); overload;\r\n procedure LoadForm(AForm: TCustomForm; AFormFile: string); overload; virtual;\r\n procedure LoadForm(AForm: TCustomForm; AFormFile: string; FormLoaded: TFormCreatedProc); overload; virtual;\r\n procedure ChangeCSS(id: string; href:string);\r\n procedure InsertCSS(id, href: string);\r\n procedure RemoveCSS(id: string);\r\n function HasCSS(href:string): boolean;\r\n procedure ChangeLanguage(const Value: TUILanguage); virtual;\r\n procedure Initialize;\r\n procedure InitFormatSettings(const BrowserLocale: string);\r\n procedure ReceiveMessageFromClient(const AMessage: string);\r\n procedure RouteForm(AParameter: string);\r\n procedure Run;\r\n procedure RunScript(Source: string);\r\n procedure Navigate(const AURL: string; ATarget: TNavigationTarget = ntBlank);\r\n procedure Download(const AURL: string);\r\n procedure DownloadTextFile(const AText: string; AFileName: string = '');\r\n procedure DownloadBinaryFile(const AData: TBytes; const AFileName: string = ''; const ANewTab: Boolean = False); overload;\r\n procedure DownloadBinaryFile(const AData: TJSUint8Array; const AFileName: string = ''; const ANewTab: Boolean = False); overload;\r\n procedure DownloadPDFFile(const AData: TBytes; const AFileName: string = ''; const ANewTab: Boolean = False); overload;\r\n procedure DownloadPDFFile(const AData: TJSUint8Array; const AFileName: string = ''; const ANewTab: Boolean = False); overload;\r\n function EXEName: string;\r\n function IDETheme: string;\r\n function IDECSS: string;\r\n function Version: string;\r\n procedure IDEMessage(const Msg: string);\r\n procedure IDEOpenURL(const URL: string);\r\n function NeedsFormRouting: Boolean;\r\n function ObjectURL(AFile: TJSHTMLFile): string;\r\n property AppContainer: TElementID read FAppContainer write FAppContainer;\r\n property AutoFormRoute: boolean read FAutoFormRoute write FAutoFormRoute;\r\n property ErrorType: TApplicationErrorType read FErrorType write FErrorType;\r\n property IsOnline: boolean read GetIsOnline;\r\n property IsMobile: boolean read GetIsMobile;\r\n property ActiveForm: TCustomForm read FActiveForm;\r\n property ColorScheme: TApplicationColorScheme read GetColorScheme;\r\n property MainForm: TCustomForm read FMainForm;\r\n property MainFormOnTaskBar: boolean read FMainFormOnTaskBar write FMainFormOnTaskBar;\r\n property Parameters: TStrings read FParameters;\r\n property Language: TUILanguage read FLanguage write SetLanguage;\r\n property Themed: boolean read FThemed write FThemed;\r\n property ThemeColor: TColor read FThemeColor write FThemeColor;\r\n property ThemeTextColor: TColor read FThemeTextColor write FThemeTextColor;\r\n property ThemeButtonClassName: string read FThemeButtonClassName write FThemeButtonClassName;\r\n property OnError: TApplicationErrorEvent read FOnError write FOnError;\r\n property OnImageCacheReady: TNotifyEvent read FOnImageCacheReady write FOnImageCacheReady;\r\n property OnFontCacheReady: TNotifyEvent read FOnFontCacheReady write FOnFontCacheReady;\r\n property OnHashChange: TApplicationHashChangeEvent read FOnHashChange write FOnHashChange;\r\n property OnOnlineChange: TApplicationOnlineChangeEvent read FOnOnlineChange write FOnOnlineChange;\r\n property OnOAuthCallBack: TApplicationCallBackEvent read FOnOAuthCallBack write FOnOAuthCallBack;\r\n property OnOAuthToken: TApplicationCallBackEvent read FOnOAuthToken write FOnOAuthToken;\r\n property ClientConnector: TClientConnector read FClientConnector write FClientConnector;\r\n{$IFDEF HOTRELOAD}\r\n property HotReloadPollInterval: Integer read FHotReloadPollInterval write FHotReloadPollInterval;\r\n property HotReloadFile: string read FHotReloadFile write FHotReloadFile;\r\n{$ENDIF}\r\n end;\r\n\r\nfunction GetParentForm(AControl: TControl): TCustomForm;\r\nprocedure Log(v: JSValue); overload;\r\nprocedure Log(arr: array of JSValue); overload;\r\nfunction WinWidth: integer;\r\nfunction WinHeight: integer;\r\n\r\nvar\r\n Application: TApplication;\r\n HandShakeScript: TJSHTMLScriptElement;\r\n VSIDE: TJSObject;\r\n\r\nimplementation\r\n\r\nuses\r\n WEBLib.Dialogs, WEBLib.WebTools, WEBLib.JSON, WEBLib.Utils, Math;\r\n\r\nconst\r\n cBodyTag = 'body';\r\n cHTMLExt = '.html';\r\n\r\ntype\r\n TFramePreviewForm = class(TWebForm)\r\n private\r\n FFrame: TFrame;\r\n protected\r\n procedure LoadDFMValues; override;\r\n end;\r\n\r\nprocedure Log(v: JSValue);\r\nbegin\r\n asm\r\n console.log(v);\r\n end;\r\nend;\r\n\r\nfunction WinHeight: integer;\r\nvar\r\n h: integer;\r\nbegin\r\n if Assigned(VSIDE) then\r\n begin\r\n asm\r\n h = pas[\"WEBLib.Forms\"].VSIDE.clientHeight();\r\n end;\r\n end\r\n else\r\n h := window.innerHeight;\r\n\r\n Result := h;\r\nend;\r\n\r\nfunction WinWidth: integer;\r\nvar\r\n w: integer;\r\nbegin\r\n if Assigned(VSIDE) then\r\n begin\r\n asm\r\n w = pas[\"WEBLib.Forms\"].VSIDE.clientWidth();\r\n end;\r\n end\r\n else\r\n w := window.innerWidth;\r\n\r\n Result := w;\r\nend;\r\n\r\n\r\n{$HINTS OFF}\r\nprocedure Log(arr: array of JSValue);\r\nvar\r\n i: integer;\r\n s,su: string;\r\nbegin\r\n s := '[';\r\n for i := 0 to length(arr) - 1 do\r\n begin\r\n asm\r\n function isPrimitive(test) {\r\n return (test !== Object(test));\r\n };\r\n\r\n if (isPrimitive(arr[i])) {\r\n var su = arr[i].toString();\r\n if (s != \"[\") { s = s + \",\"; }\r\n s = s + su;\r\n }\r\n else\r\n {\r\n console.log(arr[i]);\r\n if (s != \"[\") { s = s + \",\"; }\r\n s = s + \"#object\";\r\n }\r\n end;\r\n end;\r\n\r\n s := s + ']';\r\n\r\n log(s);\r\nend;\r\n{$HINTS ON}\r\n\r\nfunction GetParentForm(AControl: TControl): TCustomForm;\r\nvar\r\n FOwner: TComponent;\r\nbegin\r\n Result := nil;\r\n\r\n FOwner := AControl;\r\n\r\n while Assigned(FOwner) and not (FOwner is TCustomForm) do\r\n begin\r\n FOwner := FOwner.Owner;\r\n end;\r\n\r\n if Assigned(FOwner) and (FOwner is TCustomForm) then\r\n Result := (FOwner as TCustomForm);\r\nend;\r\n\r\n\r\n{ TCustomForm }\r\n\r\nfunction TCustomForm.Load: TJSPromise;\r\nbegin\r\n FormFileName := GetHTMLFileName;\r\n\r\n Result := TJSPromise.new(\r\n procedure(ASuccess, AFailed: TJSPromiseResolver)\r\n begin\r\n Application.LoadForm(Self, FormFileName, procedure(AForm: TObject)\r\n begin\r\n ASuccess(AForm);\r\n end);\r\n end\r\n );\r\nend;\r\n\r\nfunction TCustomForm.Execute: TJSPromise;\r\nbegin\r\n Result := TJSPromise.new(\r\n procedure(ASuccess, AFailed: TJSPromiseResolver)\r\n begin\r\n ShowModal(procedure(AValue: TModalResult)\r\n begin\r\n ASuccess(AValue);\r\n end);\r\n end\r\n );\r\nend;\r\n\r\nprocedure TCustomForm.BindEvents;\r\nbegin\r\n inherited;\r\n\r\n if (document.readyState <> 'loading') then\r\n if Assigned(OnDOMContentLoaded) then\r\n OnDomContentLoaded(Self);\r\n\r\n window.addEventListener('resize', FResizePtr);\r\n window.addEventListener('load', FLoadedPtr);\r\n window.addEventListener('DOMContentLoaded', FDOMContentLoadedPtr);\r\n document.addEventListener('scroll', FScrollPtr);\r\n window.addEventListener('unload', FUnloadPtr);\r\n window.addEventListener('beforeunload', FBeforeUnloadPtr);\r\n window.addEventListener('keydown', FKeyDownPtr);\r\n window.addEventListener('orientationchange',FOrientationChangePtr);\r\n window.addEventListener('hashchange',FHashChangePtr);\r\nend;\r\n\r\nprocedure ReleaseForm(AForm: TCustomForm);\r\nbegin\r\n AForm.Free;\r\n AForm := nil;\r\nend;\r\n\r\nprocedure TCustomForm.ClearMethodPointers;\r\nbegin\r\n inherited;\r\n FLoadedPtr := nil;\r\n FDOMContentLoadedPtr := nil;\r\n FUnloadPtr := nil;\r\n FBeforeUnloadPtr := nil;\r\n FResizePtr := nil;\r\n FScrollPtr := nil;\r\n FDocMouseUpPtr := nil;\r\n FDocMouseMovePtr := nil;\r\n FTitleDownPtr := nil;\r\n FDoClickPtr := nil;\r\n FKeyDownPtr := nil;\r\n FOrientationChangePtr := nil;\r\n FHashChangePtr := nil;\r\nend;\r\n\r\nprocedure TCustomForm.AddCSS(const id: string; const css: string);\r\nbegin\r\n asm\r\n function writeStylesOnce(styleName, cssText) {\r\n var styleElement = document.getElementById(styleName);\r\n if (styleElement) {\r\n styleElement.innerHTML = cssText;\r\n return;\r\n }\r\n styleElement = document.createElement('style');\r\n styleElement.type = 'text/css';\r\n styleElement.id = styleName;\r\n styleElement.innerHTML = cssText;\r\n document.getElementsByTagName('head')[0].appendChild(styleElement);\r\n }\r\n writeStylesOnce(id,css);\r\n end;\r\nend;\r\n\r\nprocedure TCustomForm.RemoveCSS(const id: string);\r\nvar\r\n el: TJSElement;\r\nbegin\r\n el := document.getElementById(id);\r\n if Assigned(el) then\r\n document.head.removeChild(el);\r\nend;\r\n\r\nprocedure TCustomForm.Close;\r\nvar\r\n lAction: TCloseAction;\r\n el: TJSElement;\r\nbegin\r\n if CloseQuery then\r\n begin\r\n UnbindEvents;\r\n\r\n lAction := caHide;\r\n\r\n if FTimerID <> -1 then\r\n begin\r\n window.clearInterval(FTimerID);\r\n FTimerID := -1;\r\n end;\r\n\r\n if Assigned(OnClose) then\r\n OnClose(Self, lAction);\r\n\r\n //if lAction = caFree then\r\n // DestroyControls;\r\n\r\n if lAction <> caNone then\r\n begin\r\n if Assigned(FLayer) then\r\n begin\r\n if Container.parentNode = FLayer then\r\n begin\r\n FLayer.removeChild(Container);\r\n end\r\n else\r\n begin\r\n if Container.parentNode.parentNode = FLayer then\r\n FLayer.removeChild(Container.parentNode);\r\n end;\r\n\r\n Container := nil;\r\n if FormContainerElement = FLayer.parentNode then\r\n begin\r\n FormContainerElement.removeChild(FLayer);\r\n Application.ChangeMaxZIndex(-1);\r\n end;\r\n FLayer := nil;\r\n end;\r\n\r\n if (FormFileName = '') then\r\n begin\r\n if (FFormElement <> '') and Assigned(Container) then\r\n begin\r\n Container.innerHTML := '';\r\n Container := nil;\r\n end\r\n else\r\n if Assigned(Container) then\r\n begin\r\n if FormContainerElement = Container.parentNode then\r\n FormContainerElement.removeChild(Container);\r\n Container := nil;\r\n end;\r\n end\r\n else\r\n begin\r\n if FFormElement <> '' then\r\n begin\r\n Container.innerHTML := '';\r\n Container := nil;\r\n end\r\n end;\r\n\r\n if (FFormElement <> FormContainer) and (FFormElement <> '') then\r\n begin\r\n el := document.getElementById(FFormElement);\r\n if Assigned(el) then\r\n el.innerHTML := '';\r\n end;\r\n\r\n DoClose(lAction);\r\n\r\n if (lAction = caFree) and not (csDestroying in ComponentState) then\r\n begin\r\n ReleaseForm(Self);\r\n if Application.FMainForm = Self then\r\n Application.FMainForm := nil;\r\n end;\r\n\r\n Application.FActiveForm := FPrevActiveForm;\r\n\r\n Visible := False;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TCustomForm.CloseQuery: Boolean;\r\nbegin\r\n Result := True;\r\n if Assigned(FOnCloseQuery) then\r\n FOnCloseQuery(Self, Result);\r\nend;\r\n\r\nfunction TCustomForm.ContainerElement: TJSElement;\r\nbegin\r\n Result := FormContainerElement;\r\nend;\r\n\r\nconstructor TCustomForm.Create(AOwner: TComponent);\r\nbegin\r\n FNoHTML := false;\r\n FCreating := true;\r\n FResizeObserver := nil;\r\n inherited;\r\n FBorder := fbSingle;\r\n FFormFileName := '';\r\n FPopupMode := pmNone;\r\n FPopupClose := pcOnDeactivate;\r\n FPopup := True;\r\n FPosition := poScreenCenter;\r\n FPopupOpacity := 1.0;\r\nend;\r\n\r\nfunction TCustomForm.CreateCaption: TJSHTMLElement;\r\nvar\r\n BarHeight: string;\r\nbegin\r\n BarHeight := '22';\r\n FCaptionElement := TJSHTMLElement(document.createElement('DIV'));\r\n FCaptionElement.innerHTML := Caption;\r\n FCaptionElement.style.setProperty(CSSBackground, ColorToHTML(Application.ThemeColor));\r\n FCaptionElement.style.setProperty('color', ColorToHTML(Application.ThemeTextColor));\r\n FCaptionElement.style.setProperty('cursor', 'move');\r\n //title.style.setProperty('padding', Padding + 'px');\r\n FCaptionElement.style.setProperty('height', BarHeight + 'px');\r\n FCaptionElement.style.setProperty('line-height', BarHeight + 'px');\r\n FCaptionElement.style.setProperty('border-bottom', '1px solid black');\r\n FCaptionElement.style.setProperty('padding-left','4px');\r\n\r\n FCaptionElement.style.setProperty('-moz-user-select','none');\r\n FCaptionElement.style.setProperty('-webkit-user-select','none');\r\n FCaptionElement.style.setProperty('-ms-user-select','none');\r\n FCaptionElement.style.setProperty('user-select','none');\r\n FCaptionElement.style.setProperty('-o-user-select','none');\r\n\r\n if ElementCaptionClassName <> '' then\r\n FCaptionElement.setAttribute('class',ElementCaptionClassName);\r\n\r\n SetHTMLElementFont(FCaptionElement, Font, not ((ElementCaptionClassName = '') and (ElementFont = efProperty)));\r\n\r\n if not Assigned(FTitleDownPtr) then\r\n GetMethodPointers;\r\n\r\n FCaptionElement.innerHTML := FCaption;\r\n FCaptionElement.addEventListener('mousedown', FTitleDownPtr);\r\n FHasCaption := true;\r\n\r\n Result := FCaptionElement;\r\nend;\r\n\r\nprocedure TCustomForm.CreateControl;\r\nbegin\r\n if not Visible and not FPopup then\r\n Exit;\r\n inherited;\r\n UpdateSize;\r\nend;\r\n\r\nfunction TCustomForm.CreateLayer: TJSHTMLElement;\r\nbegin\r\n Result := TJSHTMLElement(document.createElement('SPAN'));\r\n Result.style.setProperty('top', '0');\r\n Result.style.setProperty('left', '0');\r\n Result.style.setProperty('right', '0');\r\n Result.style.setProperty('bottom', '0');\r\n\r\n Result.style.setProperty('webkit-user-select', 'none');\r\n Result.style.setProperty('moz-user-select', 'none');\r\n Result.style.setProperty('khtml-user-select', 'none');\r\n Result.style.setProperty('ms-user-select', 'none');\r\n Result.style.setProperty('user-select', 'none');\r\n Result.style.setProperty('position', 'absolute');\r\n Result.style.setProperty('z-index', Application.MaxZIndexStr);\r\nend;\r\n\r\nfunction TCustomForm.CreateElement: TJSElement;\r\nvar\r\n eh,caph: TJSHTMLElement;\r\n\r\nbegin\r\n if not FPopup and Assigned(FormContainerElement) then\r\n begin\r\n Result := FormContainerElement;\r\n Exit;\r\n end;\r\n\r\n //if FPopup then\r\n begin\r\n Result := document.createElement('DIV');\r\n\r\n FLayer := CreateLayer;\r\n document.body.appendChild(FLayer);\r\n\r\n eh := TJSHTMLElement(FLayer);\r\n\r\n if FPopupClose = pcOnDeactivate then\r\n begin\r\n // ensure method pointers exist\r\n GetMethodPointers;\r\n eh.addEventListener('click', FDoClickPtr);\r\n end;\r\n\r\n eh.style.setProperty(CSSZINDEX, Application.MaxZIndexStr);\r\n\r\n if (Border = fbSizeable) then\r\n begin\r\n TJSHTMLElement(Result).style.setProperty('resize','both');\r\n TJSHTMLElement(Result).style.setProperty('overflow','auto');\r\n end;\r\n\r\n FHasCaption := false;\r\n\r\n if (Border in [fbSizeable, fbDialog, fbDialogSizeable]) then\r\n begin\r\n caph := CreateCaption;\r\n Result.appendChild(caph);\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TCustomForm.LoadDFMValues;\r\nbegin\r\nend;\r\n\r\nprocedure TCustomForm.Init;\r\nbegin\r\nend;\r\n\r\nfunction TCustomForm.IsFocused: Boolean;\r\nbegin\r\n // form is not focused only controls\r\n Result := false;\r\nend;\r\n\r\nfunction TCustomForm.IsMiletus: boolean;\r\nvar\r\n cl: TClass;\r\nbegin\r\n cl := ClassType;\r\n Result := false;\r\n\r\n repeat\r\n cl := cl.ClassParent;\r\n if (cl.ClassName = 'TMiletusForm') then\r\n begin\r\n Result := true;\r\n break;\r\n end;\r\n until not Assigned(cl) or (cl.ClassName = 'TForm');\r\nend;\r\n\r\nprocedure TCustomForm.Resize;\r\nvar\r\n i,ch: integer;\r\n neww, newh: integer;\r\n eh: TJSHTMLElement;\r\n dr: TJSDOMRect;\r\nbegin\r\n if (csDestroying in ComponentState) then\r\n Exit;\r\n\r\n FIsResizing := true;\r\n\r\n if FPopup and Assigned(FPopupElement) then\r\n begin\r\n eh := FPopupElement;\r\n dr := eh.getBoundingClientRect;\r\n\r\n neww := Round(dr.Right - dr.Left - 2);\r\n if (Border in [fbDialog, fbDialogSizeable]) then\r\n begin\r\n ch := GetCaptionHeight;\r\n newh := Round(dr.Bottom - dr.Top - ch - 2)\r\n end\r\n else\r\n newh := Round(dr.Bottom - dr.Top - 2)\r\n end\r\n else\r\n begin\r\n neww := window.innerWidth;\r\n newh := window.innerHeight;\r\n end;\r\n\r\n UpdateControlSize(neww, newh);\r\n\r\n if not (IsAndroid and (document.activeElement.tagName = 'INPUT')) then\r\n AlignControl(Self);\r\n\r\n DoResize;\r\n\r\n FIsResizing := false;\r\n\r\n if not IsUpdating then\r\n begin\r\n if (OrigRect.Left = -1) and (OrigRect.Top = -1) then\r\n InitAnchoring;\r\n\r\n for i := 0 to ControlCount - 1 do\r\n Controls[i].UpdateAnchoring;\r\n end;\r\nend;\r\n\r\nprocedure TCustomForm.SetActiveControl(const Value: TWinControl);\r\nbegin\r\n FActiveControl := Value;\r\n if Assigned(FActiveControl) then\r\n FActiveControl.SetFocus;\r\nend;\r\n\r\nprocedure TCustomForm.SetBorder(const Value: TFormBorderStyle);\r\nbegin\r\n if (FBorder <> Value) then\r\n begin\r\n FBorder := Value;\r\n if Assigned(Container) then\r\n AlignControl(Self);\r\n end;\r\nend;\r\n\r\nprocedure TCustomForm.SetBounds(X, Y, AWidth, AHeight: Integer);\r\nbegin\r\n if (csDesigning in ComponentState) then\r\n begin\r\n Resize;\r\n SetBoundsInt(X, Y, AWidth, AHeight);\r\n end\r\n else\r\n inherited SetBounds(X, Y, AWidth, AHeight);\r\nend;\r\n\r\nprocedure TCustomForm.SetCaption(const AValue: string);\r\nbegin\r\n if FCaption <> AValue then\r\n begin\r\n FCaption := AValue;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomForm.SetColorScheme(AScheme: TApplicationColorScheme);\r\nvar\r\n s: string;\r\nbegin\r\n if not Application.Themed then\r\n Exit;\r\n\r\n case AScheme of\r\n csDark:\r\n begin\r\n s :=\r\n 'label,option,td,table,ul,li {background-color: #202124; color: #BEC1C6;}'+#13#10 +\r\n 'body,input,textarea,select,fieldset {background-color: #202124; color: #BEC1C6; border: 1px solid gray;}'+#13#10 +\r\n 'input:focus, textarea:focus, select:focus, span:focus { border: 1px solid silver; outline: none !important;}';\r\n AddCSS('appscheme',s);\r\n end;\r\n csLight: RemoveCSS('appscheme');\r\n end;\r\nend;\r\n\r\nprocedure TCustomForm.SetElementClassName(AValue: string);\r\nbegin\r\n inherited;\r\n if FPopup and Assigned(FPopupElement) then\r\n begin\r\n FPopupElement['class'] := AValue;\r\n end;\r\nend;\r\n\r\nprocedure TCustomForm.SetFormContainer(const Value: TElementID);\r\nvar\r\n el,old: TJSElement;\r\n i: integer;\r\n\r\nbegin\r\n old := Container;\r\n\r\n if (csDesigning in ComponentState) then\r\n FFormContainer := Value\r\n else\r\n begin\r\n if Uppercase(Value) = 'BODY' then\r\n FFormContainer := ''\r\n else\r\n FFormContainer := Value;\r\n end;\r\n\r\n if (csLoading in ComponentState) and not (csDesigning in ComponentState) then\r\n Exit;\r\n\r\n // displayed on top of other in layer\r\n if Assigned(FLayer) then\r\n el := FLayer\r\n else\r\n // update container element\r\n if Value = '' then\r\n begin\r\n el := document.body;\r\n end\r\n else\r\n begin\r\n el := document.getElementById(Value);\r\n if not Assigned(el) then\r\n el := document.body;\r\n end;\r\n\r\n if Assigned(el) then\r\n begin\r\n Container := el;\r\n\r\n if Assigned(old) then\r\n begin\r\n for i := 0 to ControlCount - 1 do\r\n begin\r\n if (Controls[i].ParentElement = old) then\r\n Controls[i].ParentElementHandle := TJSHTMLElement(el);\r\n\r\n if Assigned(Controls[i].ElementHandle) and (Controls[i].ElementHandle.parentElement = old) then\r\n begin\r\n el.appendChild(Controls[i].ElementHandle);\r\n end;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TCustomForm.SetFormPos;\r\nbegin\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n if Position = poScreenCenter then\r\n begin\r\n FLeft := Round((WinWidth - Width)/2);\r\n FTop := Round((WinHeight - Height)/2);\r\n end;\r\n TJSHTMLElement(Container).style.setProperty('position','absolute');\r\n TJSHTMLElement(Container).style.setProperty('width',inttostr(Width)+'px');\r\n TJSHTMLElement(Container).style.setProperty('height',inttostr(Height)+'px');\r\n TJSHTMLElement(Container).style.setProperty('left',inttostr(Left)+'px');\r\n TJSHTMLElement(Container).style.setProperty('top',inttostr(Top)+'px');\r\nend;\r\n\r\nprocedure TCustomForm.SetFormStyle(const Value: TFormStyle);\r\nbegin\r\n FFormStyle := Value;\r\nend;\r\n\r\nprocedure TCustomForm.SetHeight(AValue: Integer);\r\nvar\r\n eh: TJSHTMLElement;\r\nbegin\r\n inherited;\r\n if Popup then\r\n begin\r\n eh := FPopupElement;\r\n if Assigned(eh) then\r\n eh.style.setProperty('height',inttostr(avalue)+'px');\r\n end;\r\nend;\r\n\r\nprocedure TCustomForm.SetLeft(AValue: Integer);\r\nvar\r\n eh: TJSHTMLElement;\r\nbegin\r\n inherited;\r\n if Popup then\r\n begin\r\n eh := FPopupElement;\r\n if Assigned(eh) then\r\n eh.style.setProperty('left',inttostr(avalue)+'px');\r\n end;\r\nend;\r\n\r\nprocedure TCustomForm.SetModalResult(const Value: TModalResult);\r\nbegin\r\n FModalResult := Value;\r\n if (FModalResult <> mrNone) then\r\n Close;\r\nend;\r\n\r\nprocedure TCustomForm.SetPosition(const Value: TPosition);\r\nbegin\r\n FPosition := Value;\r\nend;\r\n\r\nprocedure TCustomForm.SetShadow(const Value: boolean);\r\nbegin\r\n if (FShadow <> Value) then\r\n begin\r\n FShadow := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomForm.SetTop(AValue: Integer);\r\nvar\r\n eh: TJSHTMLElement;\r\nbegin\r\n inherited;\r\n if Popup then\r\n begin\r\n eh := FPopupElement;\r\n if Assigned(eh) then\r\n eh.style.setProperty('top',inttostr(avalue)+'px');\r\n end;\r\nend;\r\n\r\nprocedure TCustomForm.SetWidth(AValue: Integer);\r\nvar\r\n eh: TJSHTMLElement;\r\nbegin\r\n inherited;\r\n if Popup then\r\n begin\r\n eh := FPopupElement;\r\n if Assigned(eh) then\r\n eh.style.setProperty('width',inttostr(avalue)+'px');\r\n end;\r\nend;\r\n\r\nprocedure TCustomForm.SelectFirst;\r\nbegin\r\n if ControlCount > 0 then\r\n Controls[0].SetFocus;\r\nend;\r\n\r\nprocedure TCustomForm.SelectNext(CurControl: TControl; GoForward: boolean; CheckTabStop: boolean);\r\nvar\r\n i: integer;\r\nbegin\r\n if ControlCount > 0 then\r\n begin\r\n for i := 0 to ControlCount - 1 do\r\n begin\r\n if Controls[i] = CurControl then\r\n begin\r\n if GoForward then\r\n begin\r\n if i + 1 <= ControlCount - 1 then\r\n Controls[i + 1].SetFocus\r\n else\r\n Controls[0].SetFocus;\r\n end\r\n else\r\n begin\r\n if i - 1 >= 0 then\r\n Controls[i - 1].SetFocus\r\n else\r\n Controls[ControlCount - 1].SetFocus;\r\n end;\r\n break;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TCustomForm.Show;\r\nvar\r\n i: integer;\r\n dr: TJSDOMRect;\r\nbegin\r\n if FCreating and FPopup then\r\n begin\r\n Application.ChangeMaxZIndex(+1);\r\n FCreating := false;\r\n UpdateElement;\r\n end;\r\n\r\n if (FormFileName = '') then\r\n begin\r\n if not Assigned(Container) then\r\n begin\r\n if FPopup then\r\n begin\r\n Container := CreateElement;\r\n// TJSHTMLElement(FLayer).style.setProperty(CSSBackground,'silver');\r\n FPopupElement := TJSHTMLElement(Container);\r\n SetFormPos;\r\n UpdateElement;\r\n FLayer.appendChild(Container);\r\n end\r\n else\r\n begin\r\n Container := CreateLayer;\r\n document.body.appendChild(Container);\r\n end;\r\n end\r\n else\r\n begin\r\n if FPopup then\r\n begin\r\n SetFormPos;\r\n FLayer.appendChild(Container)\r\n end\r\n else\r\n begin\r\n if Assigned(FLayer) then\r\n begin\r\n FLayer.appendChild(Container)\r\n end\r\n else\r\n begin\r\n document.body.appendChild(Container);\r\n end;\r\n end;\r\n end;\r\n\r\n if FPopup then\r\n begin\r\n if (Border = fbSizeable) then\r\n begin\r\n dr := Container.getBoundingClientRect;\r\n FOrigWidth := Round(dr.Right - dr.Left);\r\n FOrigHeight := Round(dr.Bottom - dr.Top);\r\n FTimerID := window.setInterval(@HandleDoResize, 100);\r\n end\r\n else\r\n begin\r\n TJSHTMLElement(Container).style.setProperty('resize','');\r\n TJSHTMLElement(Container).style.setProperty('overflow','');\r\n end;\r\n end;\r\n end;\r\n\r\n Visible := True;\r\n\r\n //DoShow;\r\n\r\n // Auto focus control on form\r\n for i := 0 to ControlCount - 1 do\r\n begin\r\n if (Controls[i].TabOrder = 0) and (Controls[i].TabStop) then\r\n Controls[i].SetFocus;\r\n end;\r\nend;\r\n\r\nfunction TCustomForm.ShowModal: Integer;\r\nbegin\r\n Result := ShowModal(nil);\r\nend;\r\n\r\nfunction TCustomForm.ShowModal(AProc: TModalResultProc): TModalResult;\r\nbegin\r\n // create runtime form without HTML\r\n if FNoHTML then\r\n begin\r\n FPrevActiveForm := Application.ActiveForm;\r\n Application.FActiveForm := Self;\r\n Application.CreateNewForm(Self, '');\r\n end;\r\n\r\n Result := mrNone;\r\n FNoHTML := false;\r\n FModalProc := AProc;\r\n ModalResult := mrNone;\r\n Show;\r\nend;\r\n\r\nprocedure TCustomForm.UnbindEvents;\r\nbegin\r\n inherited;\r\n\r\n if Assigned(FLayer) and (FPopupClose = pcOnDeactivate) then\r\n FLayer.removeEventListener('click', FDoClickPtr);\r\n\r\n if Assigned(FResizeObserver) then\r\n begin\r\n asm\r\n this.FResizeObserver.disconnect();\r\n end;\r\n end;\r\n\r\n window.removeEventListener('resize', FResizePtr);\r\n window.removeEventListener('load', FLoadedPtr);\r\n window.removeEventListener('DOMContentLoaded',FDOMContentLoadedPtr);\r\n document.removeEventListener('scroll', FScrollPtr);\r\n window.removeEventListener('unload', FUnloadPtr);\r\n window.removeEventListener('beforeunload', FBeforeUnloadPtr);\r\n window.removeEventListener('keywown', FKeyDownPtr);\r\n window.removeEventListener('orientationchange',FOrientationChangePtr);\r\n window.removeEventListener('hashchange',FHashChangePtr);\r\nend;\r\n\r\nprocedure TCustomForm.UpdateCSS(const id, css: string);\r\nbegin\r\n RemoveCSS(id);\r\n AddCSS(id,css);\r\nend;\r\n\r\nprocedure TCustomForm.UpdateElement;\r\nvar\r\n clr: string;\r\n\r\nbegin\r\n if FCreating then\r\n Exit;\r\n\r\n inherited;\r\n\r\n if IsUpdating then\r\n Exit;\r\n\r\n if Assigned(ElementHandle) or Assigned(Container) then\r\n begin\r\n if (FCaption <> '') then\r\n begin\r\n if not FPopup then\r\n window.document.title := FCaption\r\n else\r\n begin\r\n if Assigned(FCaptionElement) then\r\n begin\r\n if ShowClose and not Assigned(FCaptionCloseElement) then\r\n begin\r\n FCaptionCloseElement := TJSHTMLElement(document.createElement('SPAN'));\r\n FCaptionCloseElement.style.setProperty('float','right');\r\n FCaptionCloseElement.style.setProperty('cursor','default');\r\n FCaptionCloseElement.innerHTML := '✖';\r\n FCaptionElement.appendChild(FCaptionCloseElement);\r\n FCaptionCloseElement.addEventListener('click', @HandleCloseClick);\r\n end;\r\n\r\n SetHTMLElementFont(FCaptionElement, Font, not ((ElementCaptionClassName = '') and (ElementFont = efProperty)));\r\n end;\r\n end;\r\n end;\r\n end;\r\n\r\n\r\n if Assigned(Container) then\r\n begin\r\n clr := ColorToHtml(Color);\r\n\r\n if Assigned(Container) then\r\n begin\r\n if (Color <> clNone) and ((Color <> clWhite) and not Popup) and (ElementClassName = '') then\r\n TJSHTMLElement(Container).style.setProperty(CSSBackground,clr);\r\n\r\n if (ElementClassName <> '') or (Color = clNone) or ((Color = clWhite) and not Popup) then\r\n TJSHTMLElement(Container).style.removeProperty(CSSBackground);\r\n\r\n if (ElementClassName = '') and not Popup then\r\n begin\r\n // make sure body stretches over the entire page\r\n //TJSHTMLElement(Container).style.setProperty('height','100%');\r\n asm\r\n document.documentElement.style.setProperty('height','100%');\r\n end;\r\n end;\r\n\r\n SetHTMLElementFont(TJSHTMLElement(Container), Font, not ((ElementClassName = '') and (ElementFont = efProperty)));\r\n end;\r\n\r\n if FPopup then\r\n begin\r\n if not Assigned(FPopupElement) then\r\n FPopupElement := TJSHTMLElement(Container);\r\n\r\n if FShadow then\r\n begin\r\n TJSHTMLElement(FPopupElement).style.setProperty('box-shadow','3px 3px 3px silver')\r\n end\r\n else\r\n begin\r\n TJSHTMLElement(FPopupElement).style.removeProperty('box-shadow');\r\n end;\r\n\r\n TJSHTMLElement(FPopupElement).style.setProperty('border','1px solid gray');\r\n end\r\n else\r\n begin\r\n TJSHTMLElement(Container).style.removeProperty('box-shadow');\r\n end;\r\n end;\r\n\r\n\r\nend;\r\n\r\nprocedure TCustomForm.VisibleChanged;\r\nbegin\r\n inherited;\r\n\r\n if Assigned(FLayer) then\r\n begin\r\n if Visible then\r\n TJSHTMLElement(FLayer).style.setProperty('display','')\r\n else\r\n TJSHTMLElement(FLayer).style.setProperty('display','none');\r\n end\r\n else\r\n begin\r\n if Assigned(Container) then\r\n begin\r\n if Visible then\r\n TJSHTMLElement(Container).style.setProperty('display','')\r\n else\r\n TJSHTMLElement(Container).style.setProperty('display','none');\r\n end;\r\n end;\r\nend;\r\n\r\n\r\nprocedure TCustomForm.Paint;\r\nbegin\r\n //\r\nend;\r\n\r\nprocedure TCustomForm.PreventDefault;\r\nbegin\r\n ElementEvent.preventDefault();\r\nend;\r\n\r\nfunction TCustomForm.HandleObserver: boolean;\r\nbegin\r\n Resize;\r\n Result := true;\r\nend;\r\n\r\nfunction TCustomForm.HandleOrientationChange(Event: TJSEvent): Boolean;\r\nvar\r\n so: TScreenOrientation;\r\n isPortrait: boolean;\r\nbegin\r\n Resize;\r\n Realign;\r\n Result := true;\r\n\r\n if Assigned(OnOrientationChange) then\r\n begin\r\n asm\r\n var mql = window.matchMedia(\"(orientation: portrait)\");\r\n isPortrait = (mql.matches);\r\n end;\r\n\r\n if isPortrait then\r\n so := soLandscape\r\n else\r\n so := soPortrait;\r\n\r\n OnOrientationChange(Self, so);\r\n end;\r\n\r\n if Assigned(OnResize) then\r\n OnResize(Self);\r\nend;\r\n\r\nfunction TCustomForm.HandleResize(Event: TEventListenerEvent): boolean;\r\nbegin\r\n if Visible then\r\n begin\r\n if not Assigned(Container) then\r\n CreateControl;\r\n\r\n Resize;\r\n end;\r\n\r\n // make sure HandleObserver is not optimized away\r\n if (1<0) then\r\n begin\r\n HandleObserver;\r\n end;\r\n\r\n Result := true;\r\nend;\r\n\r\nfunction TCustomForm.GetActiveControl: TWinControl;\r\nvar\r\n i: integer;\r\nbegin\r\n Result := FActiveControl;\r\n\r\n\r\n for i := 0 to ControlCount - 1 do\r\n begin\r\n if Controls[i].ElementHandle = document.activeElement then\r\n begin\r\n Result := TWinControl(Controls[i]);\r\n break;\r\n end;\r\n\r\n end;\r\nend;\r\n\r\nfunction TCustomForm.GetCanvas: TCanvas;\r\nbegin\r\n Result := nil;\r\nend;\r\n\r\nfunction TCustomForm.GetCaptionHeight: integer;\r\nvar\r\n r: TJSDOMRect;\r\nbegin\r\n Result := 0;\r\n if Assigned(FCaptionElement) and (Border in [fbDialog, fbDialogSizeable]) then\r\n begin\r\n r := FCaptionElement.getBoundingClientRect;\r\n Result := Round(r.Bottom - r.Top);\r\n end;\r\nend;\r\n\r\nfunction TCustomForm.GetClientRect: TRect;\r\n//var\r\n// ch: integer;\r\nbegin\r\n Result := inherited GetClientRect;\r\n\r\n// if FHasCaption then\r\n// begin\r\n// ch := GetCaptionHeight - 2;\r\n// Result.Top := Result.Top + ch;\r\n// Result.Bottom := Result.Bottom + ch;\r\n// end;\r\nend;\r\n\r\nfunction TCustomForm.GetElementBindHandle: TJSEventTarget;\r\nbegin\r\n if (csDesigning in ComponentState) then\r\n begin\r\n Result := TJSEventTarget(window);\r\n Exit;\r\n end;\r\n\r\n if (FormContainer <> '') then\r\n begin\r\n Result := TJSEventTarget(window);\r\n end\r\n else\r\n begin\r\n if not FPopup then\r\n begin\r\n Result := TJSEventTarget(window);\r\n end\r\n else\r\n Result := inherited GetElementBindHandle;\r\n end;\r\nend;\r\n\r\nfunction TCustomForm.GetElementHandle: TJSHTMLElement;\r\nbegin\r\n if FPopup then\r\n Result := inherited GetElementHandle\r\n else\r\n Result := TJSHTMLElement(FormContainerElement);\r\nend;\r\n\r\nfunction TCustomForm.GetFormStyle: TFormStyle;\r\nbegin\r\n Result := FFormStyle;\r\nend;\r\n\r\nfunction TCustomForm.GetHeight: Integer;\r\nvar\r\n d: integer;\r\n s: string;\r\n css: TJSCSSStyleDeclaration;\r\n el: TJSHTMLElement;\r\n dr: TJSDOMRect;\r\nbegin\r\n if (FFormElement <> '') then\r\n begin\r\n el := TJSHTMLElement(document.getElementById(FFormElement));\r\n if Assigned(el) then\r\n begin\r\n dr := el.getBoundingClientRect;\r\n Result := Round(dr.bottom - dr.top);\r\n Exit;\r\n end\r\n end;\r\n\r\n if (ElementHandle = document.body) then\r\n begin\r\n css := window.getComputedStyle(ElementHandle);\r\n s := css.getPropertyValue('margin-top');\r\n s := Copy(s,1,Length(s)- 2);\r\n d := StrToInt(s) - 2; // div 2;\r\n\r\n dr := document.documentElement.getBoundingClientRect;\r\n Result := Round(dr.Height);\r\n\r\n if Result > window.innerHeight then\r\n Result := window.innerHeight - Max(0,d);\r\n end\r\n else\r\n begin\r\n if FPopup then\r\n begin // take caption border in account\r\n Result := inherited GetHeight // GetCaptionHeight - 2;\r\n end\r\n else\r\n begin\r\n Result := Round(ElementHandle.offsetHeight);\r\n if Result = 0 then\r\n begin\r\n if FFormContainer <> '' then\r\n Result := inherited GetHeight\r\n else\r\n Result:= window.innerHeight;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nclass function TCustomForm.GetHTMLFileName: string;\r\nbegin\r\n Result := Self.UnitName + Application.GetFormExtension;\r\nend;\r\n\r\nfunction TCustomForm.GetLeft: Integer;\r\nvar\r\n el: TJSHTMLElement;\r\n dr: TJSDOMRect;\r\nbegin\r\n if FPopup then\r\n begin\r\n Result := inherited GetLeft\r\n end\r\n else\r\n begin\r\n if (FFormElement <> '') then\r\n begin\r\n el := TJSHTMLElement(document.getElementById(FFormElement));\r\n if Assigned(el) then\r\n begin\r\n dr := el.getBoundingClientRect;\r\n Result := Round(dr.left);\r\n end;\r\n end\r\n else\r\n begin\r\n el := nil;\r\n if (FormContainer <> '') then\r\n el := TJSHTMLElement(document.getElementById(FormContainer));\r\n\r\n if not Assigned(el) then\r\n el := ElementHandle; \r\n\r\n Result := Round(el.offsetLeft);\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TCustomForm.GetMethodPointers;\r\nbegin\r\n inherited;\r\n\r\n if FLoadedPtr = nil then\r\n begin\r\n FLoadedPtr := @HandleLoaded;\r\n FDOMContentLoadedPtr := @HandleDOMContentLoaded;\r\n FUnloadPtr := @HandleUnLoad;\r\n FBeforeUnloadPtr := @HandleBeforeUnload;\r\n FResizePtr := @HandleResize;\r\n FScrollPtr := @HandleScroll;\r\n FDocMouseUpPtr := @HandleDocMouseUp;\r\n FDocMouseMovePtr := @HandleDocMouseMove;\r\n FTitleDownPtr := @HandleTitleDown;\r\n FDoClickPtr := @HandleDoClick;\r\n FKeyDownPtr := @HandleKeyDown;\r\n FOrientationChangePtr := @HandleOrientationChange;\r\n FHashChangePtr := @HandleHashChange;\r\n end;\r\nend;\r\n\r\nfunction TCustomForm.GetTop: Integer;\r\nvar\r\n el: TJSHTMLElement;\r\n dr: TJSDOMRect;\r\nbegin\r\n if FPopup then\r\n Result := inherited GetTop\r\n else\r\n begin\r\n if (FFormElement <> '') then\r\n begin\r\n el := TJSHTMLElement(document.getElementById(FFormElement));\r\n if Assigned(el) then\r\n begin\r\n dr := el.getBoundingClientRect;\r\n Result := Round(dr.top);\r\n end;\r\n end\r\n else\r\n begin\r\n el := nil;\r\n if (FormContainer <> '') then\r\n el := TJSHTMLElement(document.getElementById(FormContainer));\r\n\r\n if not Assigned(el) then\r\n el := ElementHandle; \r\n Result := Round(el.offsetTop);\r\n end; \r\n end;\r\nend;\r\n\r\nfunction TCustomForm.GetUniqueComponentName(AComponent: TComponent): string;\r\nvar\r\n s: string;\r\n i,j: integer;\r\n found: boolean;\r\nbegin\r\n i := 1;\r\n repeat\r\n found := false;\r\n\r\n s := Copy(ClassName,2, Length(ClassName)) + '_' + Copy(AComponent.ClassName, 2, Length(AComponent.ClassName)) + IntToStr(i);\r\n inc(i);\r\n\r\n for j := 0 to ComponentCount - 1 do\r\n begin\r\n if Components[j].Name = s then\r\n begin\r\n found := true;\r\n break;\r\n end;\r\n end;\r\n\r\n until found = false;\r\n\r\n Result := s;\r\nend;\r\n\r\nfunction TCustomForm.GetWidth: Integer;\r\nvar\r\n dr: TJSDOMRect;\r\n el: TJSHTMLElement;\r\n// s: string;\r\n// d: integer;\r\n// css: TJSCSSStyleDeclaration;\r\nbegin\r\n if (FFormElement <> '') then\r\n begin\r\n el := TJSHTMLElement(document.getElementById(FFormElement));\r\n if Assigned(el) then\r\n begin\r\n dr := el.getBoundingClientRect;\r\n Result := Round(dr.right - dr.left);\r\n Exit;\r\n end\r\n end;\r\n\r\n if (ElementHandle = document.body) then\r\n begin\r\n {\r\n css := window.getComputedStyle(ElementHandle);\r\n s := css.getPropertyValue('margin-left');\r\n s := Copy(s,1,Length(s) - 2);\r\n d := StrToInt(s) - 2;\r\n Result := window.innerWidth - d + 4;\r\n }\r\n Result := window.innerWidth;\r\n\r\n dr := document.documentElement.getBoundingClientRect;\r\n Result := Round(dr.Width);\r\n\r\n if Result > window.innerWidth then\r\n Result := window.innerWidth;\r\n end\r\n else\r\n begin\r\n if FPopup then\r\n Result := inherited GetWidth\r\n else\r\n begin\r\n\r\n Result := Round(ElementHandle.offsetWidth);\r\n if Result = 0 then\r\n begin\r\n if FFormContainer <> '' then\r\n Result := inherited GetWidth\r\n else\r\n Result := window.innerWidth;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TCustomForm.HandleBeforeUnload(Event: TEventListenerEvent): boolean;\r\nvar\r\n msg: string;\r\nbegin\r\n msg := '';\r\n if Assigned(OnBeforeUnload) then\r\n OnBeforeUnload(Self,msg);\r\n\r\n if msg <> '' then\r\n begin\r\n asm\r\n Event.returnValue = msg;\r\n return msg;\r\n end;\r\n end;\r\n\r\n Result := true;\r\nend;\r\n\r\nfunction TCustomForm.HandleCloseClick(Event: TEventListenerEvent): boolean;\r\nvar\r\n CanClose: boolean;\r\n\r\nbegin\r\n CanClose := true;\r\n\r\n if Assigned(OnCloseQuery) then\r\n OnCloseQuery(self, CanClose);\r\n\r\n if CanClose then\r\n Close;\r\n\r\n Result := true;\r\nend;\r\n\r\nfunction TCustomForm.HandleDoClick(Event: TJSMouseEvent): Boolean;\r\nbegin\r\n Event.stopPropagation;\r\n\r\n if FPopupClose = pcOnDeactivate then\r\n Close;\r\n\r\n Result := True;\r\nend;\r\n\r\nfunction TCustomForm.HandleDocMouseMove(Event: TJSMouseEvent): Boolean;\r\nvar\r\n deltax,deltay: double;\r\n el: TJSHTMLElement;\r\n l,t: integer;\r\nbegin\r\n if FDown then\r\n begin\r\n deltax := Event.screenX - FMdx;\r\n deltay := Event.screenY - FMdy;\r\n\r\n if FHasCaption and (FormFileName <> '') then\r\n el := TJSHTMLElement(Container.parentNode)\r\n else\r\n el := TJSHTMLElement(Container);\r\n\r\n el.style.setProperty('transform','');\r\n el.style.setProperty('position','absolute');\r\n\r\n l := round(FDlgX + deltax);\r\n t := round(FDlgY + deltay);\r\n\r\n el.style.setProperty('left', inttostr(l)+'px');\r\n el.style.setProperty('top', inttostr(t)+'px');\r\n\r\n FLeft := l;\r\n FTop := t;\r\n\r\n// el := TJSHTMLElement(FCancel);\r\n// el.style.setProperty('position', 'absolute');\r\n// el.style.setProperty('top', '0');\r\n// el.style.setProperty('right', '0');\r\n end;\r\n\r\n Result := true;\r\nend;\r\n\r\nfunction TCustomForm.HandleDocMouseUp(Event: TJSMouseEvent): Boolean;\r\nbegin\r\n if FDown then\r\n begin\r\n FCaptured := false;\r\n FDown := false;\r\n document.body.removeEventListener('mousemove', FDocMouseMovePtr);\r\n document.body.removeEventListener('mouseup', FDocMouseUpPtr);\r\n if Assigned(FMoveSpan) then\r\n document.body.removeChild(FMoveSpan);\r\n\r\n EventStopPropagation := EventStopPropagation + [eeMouseMove, eeMouseUp];\r\n\r\n FMoveSpan := nil;\r\n end;\r\n Result := true;\r\nend;\r\n\r\nfunction TCustomForm.HandleDOMContentLoaded(\r\n Event: TEventListenerEvent): boolean;\r\nbegin\r\n if Assigned(OnDOMContentLoaded) then\r\n OnDOMContentLoaded(Self);\r\n Result := true;\r\nend;\r\n\r\nprocedure TCustomForm.HandleDoResize;\r\nvar\r\n dr: TJSDOMRect;\r\n neww,newh: integer;\r\nbegin\r\n dr := Container.getBoundingClientRect;\r\n\r\n neww := Round(dr.Right - dr.Left);\r\n newh := Round(dr.Bottom - dr.Top);\r\n\r\n if (neww <> FOrigWidth) or (newh <> FOrigHeight) then\r\n begin\r\n Width := neww;\r\n Height := newh;\r\n\r\n dr := Container.getBoundingClientRect;\r\n FOrigWidth := Round(dr.Right - dr.Left);\r\n FOrigHeight := Round(dr.Bottom - dr.Top);\r\n\r\n AlignControl(Self);\r\n end;\r\nend;\r\n\r\n\r\nfunction TCustomForm.HandleHashChange(Event: TEventListenerEvent): boolean;\r\nvar\r\n oldURL,newURL: string;\r\nbegin\r\n asm\r\n oldURL = Event.oldURL;\r\n newURL = Event.newURL;\r\n end;\r\n\r\n if Assigned(OnHashChange) then\r\n begin\r\n OnHashChange(Self, oldURL, newURL);\r\n end;\r\n\r\n Result := true;\r\nend;\r\n\r\nfunction TCustomForm.HandleKeyDown(Event: TJSKeyBoardEvent): Boolean;\r\nvar\r\n k: Word;\r\nbegin\r\n k := GetKeyCode(Event.Key);\r\n if not Assigned(k) then\r\n Exit;\r\n if (k = VK_ESCAPE) and not (csDesigning in ComponentState) and Popup then\r\n begin\r\n Close;\r\n end;\r\n Result := true;\r\nend;\r\n\r\nfunction TCustomForm.HandleTitleDown(Event: TJSMouseEvent): Boolean;\r\nvar\r\n r: TJSDOMRect;\r\nbegin\r\n Event.StopPropagation;\r\n Event.PreventDefault;\r\n\r\n FPopupClose := pcNever;\r\n\r\n FMdx := Round(Event.screenX);\r\n FMdy := Round(Event.screenY);\r\n\r\n if FHasCaption and (FormFileName <> '') then\r\n r := TJSHTMLElement(Container.parentNode).getBoundingClientRect()\r\n else\r\n r := TJSHTMLElement(Container).getBoundingClientRect();\r\n\r\n FDlgX := Round(int(r.left));\r\n FDlgY := Round(int(r.top));\r\n\r\n FDown := true;\r\n\r\n if not FCaptured then\r\n begin\r\n FCaptured := true;\r\n FMoveSpan := TJSHTMLElement(document.createElement('SPAN'));\r\n FMoveSpan.style.setProperty('top', '0');\r\n FMoveSpan.style.setProperty('left', '0');\r\n FMoveSpan.style.setProperty('right', '0');\r\n FMoveSpan.style.setProperty('bottom', '0');\r\n FMoveSpan.style.setProperty('position', 'absolute');\r\n\r\n document.body.appendChild(FMoveSpan);\r\n\r\n EventStopPropagation := EventStopPropagation - [eeMouseMove, eeMouseUp];\r\n\r\n document.body.addEventListener('mousemove', FDocMouseMovePtr);\r\n document.body.addEventListener('mouseup', FDocMouseUpPtr);\r\n end;\r\n\r\n Result := true;\r\nend;\r\n\r\nprocedure TCustomForm.DoClose(var CloseAction: TCloseAction);\r\nbegin\r\n if Assigned(FModalProc) and (CloseAction <> caNone) then\r\n begin\r\n FModalProc(FModalResult);\r\n FModalProc := nil;\r\n end;\r\nend;\r\n\r\nprocedure TCustomForm.DoCreate;\r\nbegin\r\n BeginUpdate;\r\n LoadDFMValues;\r\n Loaded;\r\n\r\n if Assigned(OnCreate) then\r\n OnCreate(Self);\r\n\r\n FCreating := false;\r\n\r\n EndUpdate;\r\n\r\n UpdateChildren(Self);\r\n\r\n Realign;\r\n\r\n DoResize;\r\nend;\r\n\r\nfunction TCustomForm.HandleScroll(Event: TEventListenerEvent): boolean;\r\nbegin\r\n if Assigned(OnScroll) then\r\n OnScroll(Self);\r\n\r\n Result := true;\r\nend;\r\n\r\nprocedure TCustomForm.DoShow;\r\nbegin\r\n if Assigned(OnShow) then\r\n OnShow(Self);\r\nend;\r\n\r\nfunction TCustomForm.HandleUnload(Event: TEventListenerEvent): boolean;\r\nbegin\r\n if Assigned(OnUnload) then\r\n OnUnload(Self);\r\n Result := true;\r\nend;\r\n\r\nfunction TCustomForm.FormContainerElement: TJSElement;\r\nbegin\r\n if (csDesigning in ComponentState) then\r\n begin\r\n if Assigned(FDesignContainer) then\r\n Result := FDesignContainer\r\n end;\r\n\r\n if (FormContainer <> '') then\r\n begin\r\n Result := document.getElementById(FormContainer);\r\n if not Assigned(Result) then\r\n Result := document.body;\r\n end\r\n else\r\n begin\r\n Result := document.body;\r\n end;\r\nend;\r\n\r\nfunction TCustomForm.HandleLoaded(Event: TEventListenerEvent): boolean;\r\nbegin\r\n Resize;\r\n InitAnchoring;\r\n Result := true;\r\nend;\r\n\r\nprocedure TCustomForm.Realign;\r\nvar\r\n el: TJSHTMLElement;\r\n dr: TJSDOMRect;\r\n r: TRect;\r\nbegin\r\n if (FFormContainer <> '') and (Align <> alNone) then\r\n begin\r\n el := TJSHTMLElement( document.getElementById(FFormContainer) );\r\n if Assigned(el) then\r\n begin\r\n dr := el.getBoundingClientRect;\r\n\r\n if (dr.width = 0) and (dr.height = 0) and (el.style.getPropertyValue('position') = 'absolute') then\r\n r := GetHTMLElementAbsoluteRect(el)\r\n else\r\n r := Rect(Round(dr.left), Round(dr.Top), Round(dr.Right), Round(dr.Bottom));\r\n\r\n SetBoundsInt(r.Left, r.Top, r.Right - r.Left, r.Bottom - r.Top);\r\n end;\r\n end;\r\n\r\n inherited;\r\nend;\r\n\r\nprocedure TCustomForm.DoResize;\r\nvar\r\n w,h: integer;\r\nbegin\r\n w := Width;\r\n h := Height;\r\n\r\n if (w = FOldWidth) and (h = FOldHeight) then\r\n Exit;\r\n\r\n FOldWidth := w;\r\n FOldHeight := h;\r\n\r\n if Assigned(OnResize) then\r\n OnResize(Self);\r\nend;\r\n\r\ndestructor TCustomForm.Destroy;\r\nbegin\r\n if Visible then\r\n Close;\r\n\r\n if Assigned(OnDestroy) then\r\n OnDestroy(Self);\r\n\r\n inherited;\r\n\r\n if Assigned(FLayer) then\r\n begin\r\n if FormContainerElement = FLayer.parentNode then\r\n FormContainerElement.removeChild(FLayer);\r\n FLayer := nil;\r\n end;\r\nend;\r\n\r\nconstructor TCustomForm.Create(id: string);\r\nbegin\r\n FNoHTML := false;\r\n FCreating := true;\r\n FFormContainer := id;\r\n inherited Create(id);\r\n FFormElement := '';\r\n FModalResult := mrNone;\r\n FFormStyle := fsNormal;\r\n DoCreate;\r\nend;\r\n\r\nconstructor TCustomForm.Create(id: string; var AReference);\r\nbegin\r\n FCreating := true;\r\n FFormContainer := id;\r\n inherited Create(id);\r\n AReference := Self;\r\n FFormElement := '';\r\n FModalResult := mrNone;\r\n FFormStyle := fsNormal;\r\n DoCreate;\r\nend;\r\n\r\nprocedure TCustomForm.CreateInitialize;\r\nbegin\r\n inherited;\r\n AllowTouch := True;\r\n FModalResult := mrNone;\r\n FFormStyle := fsNormal;\r\n FBorder := fbSizeable;\r\n FShadow := true;\r\n FShowClose := true;\r\n FTimerID := -1;\r\n FCaptionElement := nil;\r\n Color := clWhite;\r\n TJSEventTarget(window).addEventListener('load', FLoadedPtr);\r\nend;\r\n\r\nconstructor TCustomForm.CreateNew(AOwner: TComponent; Dummy: Integer = 0);\r\nbegin\r\n Create(AOwner);\r\nend;\r\n\r\nconstructor TCustomForm.CreateDialog(ACaption: string);\r\nvar\r\n AFileName: string;\r\nbegin\r\n FCreating := true;\r\n AFileName := GetHTMLFileName;\r\n inherited Create(cBodyTag);\r\n Caption := ACaption;\r\n Popup := true;\r\n Border := fbDialog;\r\n FormFileName := AFileName;\r\n Application.LoadForm(Self, AFileName);\r\nend;\r\n\r\nconstructor TCustomForm.CreateDialogNew(ACaption: string);\r\nvar\r\n AFileName: string;\r\nbegin\r\n FNoHTML := true;\r\n FCreating := true;\r\n AFileName := GetHTMLFileName;\r\n inherited Create(cBodyTag);\r\n Caption := ACaption;\r\n Popup := true;\r\n Border := fbDialog;\r\n FormFileName := AFileName;\r\nend;\r\n\r\nconstructor TCustomForm.CreateNew;\r\nvar\r\n AFileName: string;\r\nbegin\r\n FCreating := true;\r\n AFileName := GetHTMLFileName;\r\n inherited Create(cBodyTag);\r\n FormFileName := AFileName;\r\n Application.LoadForm(Self, AFileName);\r\nend;\r\n\r\nconstructor TCustomForm.CreateNew(AFileName: string);\r\nbegin\r\n FCreating := true;\r\n inherited Create(cBodyTag);\r\n FormFileName := AFileName;\r\n Application.LoadForm(Self, AFileName);\r\nend;\r\n\r\nconstructor TCustomForm.CreateNew(AProc: TFormCreatedProc);\r\nbegin\r\n FCreatedProc := AProc;\r\n CreateNew;\r\nend;\r\n\r\nconstructor TCustomForm.CreateNew(AElementID: string; AProc: TFormCreatedProc);\r\nbegin\r\n CreateNew(AElementID, '', AProc);\r\nend;\r\n\r\nconstructor TCustomForm.CreateNew(AElementID, AFileName: string; AProc: TFormCreatedProc);\r\nbegin\r\n FCreating := true;\r\n FFormContainer := AElementID;\r\n inherited Create(AElementID);\r\n FCreatedProc := AProc;\r\n FFormElement := AElementID;\r\n if AFileName = '' then\r\n AFileName := GetHTMLFileName;\r\n Application.LoadForm(Self, AFileName);\r\nend;\r\n\r\n{ TApplication }\r\n\r\nfunction TApplication.CreateNewForm(AInstanceClass: TFormClass): TCustomForm;\r\nbegin\r\n Result := AInstanceClass.Create(cBodyTag);\r\nend;\r\n\r\nfunction TApplication.CreateNewForm(AInstanceClass: TFormClass; AElementID: string): TCustomForm;\r\nvar\r\n el: TJSHTMLElement;\r\n AForm: TForm;\r\nbegin\r\n el := TJSHTMLElement(document.getElementById(AElementID));\r\n\r\n AForm := AInstanceClass.Create(AElementID);\r\n AForm.FDesignContainer := el;\r\n AForm.FormContainer := AElementID;\r\n AForm.FFormElement := AElementID;\r\n AForm.CreateControl;\r\n AForm.Container := el;\r\n AForm.Init;\r\n\r\n Result := AForm;\r\nend;\r\n\r\nprocedure TApplication.LoadForm(AForm: TCustomForm; AFormFile: string; FormLoaded: TFormCreatedProc);\r\nbegin\r\n FCreatedProc := FormLoaded;\r\n LoadForm(AForm, AFormFile);\r\nend;\r\n\r\nprocedure TApplication.LoadForm(AForm: TCustomForm; AFormFile: string);\r\nbegin\r\n AForm.FPrevActiveForm := FActiveForm;\r\n\r\n FActiveForm := AForm;\r\n\r\n if FMainForm = nil then\r\n FMainForm := AForm;\r\n\r\n FLastReq := TJSXMLHttpRequest.new;\r\n FLastReq.addEventListener('load', @DoFormLoad);\r\n FLastReq.addEventListener('abort', @DoFormAbort);\r\n FLastReq.open('GET', AFormFile);\r\n FLastReq.send;\r\nend;\r\n\r\nprocedure TApplication.Navigate(const AURL: string; ATarget: TNavigationTarget );\r\nbegin\r\n if ATarget = ntBlank then\r\n window.open(AURL, '_blank')\r\n else\r\n window.location.href := AURL;\r\nend;\r\n\r\nfunction TApplication.NeedsFormRouting: Boolean;\r\nvar\r\n s: string;\r\nbegin\r\n Result := HasQueryParam('form', s);\r\n if Result then\r\n RouteForm(s);\r\nend;\r\n\r\nfunction TApplication.ObjectURL(AFile: TJSHTMLFile): string;\r\nvar\r\n res: string;\r\nbegin\r\n asm\r\n res = URL.createObjectURL(AFile);\r\n end;\r\n Result := res;\r\nend;\r\n\r\nprocedure TApplication.CreateForm(AInstanceClass: TFormClass; AElementID: string; var AReference);\r\nbegin\r\n CreateForm(AInstanceClass, AElementID, AReference, nil);\r\nend;\r\n\r\nprocedure TApplication.CreateForm(AInstanceClass: TFormClass; AElement: TJSHTMLElement; var AReference); overload;\r\nbegin\r\n CreateForm(AInstanceClass, AElement.ID, AReference, nil);\r\nend;\r\n\r\nprocedure TApplication.CreateForm(AInstanceClass: TFormClass; AElementID: string; var AReference; AProc: TFormCreatedProc);\r\nvar\r\n LFileName: string;\r\n\r\n function DoStatusCreate(Event: TEventListenerEvent): boolean;\r\n var\r\n LElem: TJSHTMLElement;\r\n LForm: TForm;\r\n LResponse: string;\r\n LIsBody: boolean;\r\n begin\r\n // HTML of the form being loaded\r\n asm\r\n LResponse = Event.target.responseText;\r\n end;\r\n\r\n LIsBody := LowerCase(AElementID) = cBodyTag;\r\n\r\n if LIsBody then\r\n LElem := TJSHTMLElement(document.body)\r\n else\r\n LElem := TJSHTMLElement(document.getElementById(AElementID));\r\n\r\n LElem.innerHTML := LResponse;\r\n\r\n LForm := AInstanceClass.Create(AElementID, AReference);\r\n LForm.FormFileName := LFileName;\r\n\r\n if LForm.FormContainer = '' then\r\n LForm.FormContainer := AElementID;\r\n\r\n if not LIsBody then\r\n begin\r\n LForm.FFormElement := AElementID;\r\n LForm.Container := LElem;\r\n end;\r\n\r\n LForm.CreateControl;\r\n LForm.Init;\r\n\r\n LForm.SetColorScheme(Application.ColorScheme);\r\n\r\n // set previous active form\r\n LForm.FPrevActiveForm := FActiveForm;\r\n\r\n FActiveForm := LForm;\r\n\r\n if FMainForm = nil then\r\n FMainForm := LForm;\r\n\r\n if Assigned(AProc) then\r\n AProc(LForm);\r\n\r\n Result := true;\r\n\r\n ActivateChildScripts(LElem);\r\n\r\n FActiveForm.DoShow;\r\n // force resize\r\n FActiveForm.Resize;\r\n end;\r\n\r\nbegin\r\n if FIsRedirect then\r\n Exit;\r\n\r\n if FAppInitializing then\r\n begin\r\n if FCanCreateForm then\r\n FCanCreateForm := False\r\n else\r\n Exit;\r\n end;\r\n\r\n LFileName := AInstanceClass.GetHTMLFileName;\r\n FLastReq := TJSXMLHttpRequest.new;\r\n FLastReq.addEventListener('load', @DoStatusCreate);\r\n FLastReq.open('GET', lFileName);\r\n {$IFDEF DEBUG}\r\n FLastReq.setRequestHeader('Cache-Control', 'no-cache');\r\n {$ENDIF}\r\n FLastReq.send;\r\nend;\r\n\r\nprocedure TApplication.ActivateChildScripts(AElement: TJSHTMLElement);\r\nbegin\r\n // activate possible child scripts\r\n asm\r\n function nodeScriptReplace(node) {\r\n if ( nodeScriptIs(node) === true ) {\r\n node.parentNode.replaceChild( nodeScriptClone(node) , node );\r\n }\r\n else {\r\n var i = 0;\r\n var children = node.childNodes;\r\n while ( i < children.length ) {\r\n nodeScriptReplace( children[i++] );\r\n }\r\n }\r\n\r\n return node;\r\n }\r\n function nodeScriptIs(node) {\r\n return node.tagName === 'SCRIPT';\r\n }\r\n function nodeScriptClone(node){\r\n var script = document.createElement(\"script\");\r\n script.async = false;\r\n script.text = node.innerHTML;\r\n for( var i = node.attributes.length-1; i >= 0; i-- ) {\r\n script.setAttribute( node.attributes[i].name, node.attributes[i].value );\r\n }\r\n return script;\r\n }\r\n nodeScriptReplace(AElement);\r\n end;\r\nend;\r\n\r\nprocedure TApplication.ReloadForm;\r\nvar\r\n lFileName: string;\r\n\r\n function DoStatusCreate(Event: TEventListenerEvent): boolean;\r\n var\r\n i: integer;\r\n ctl: TControl;\r\n s: string;\r\n sl: TStringList;\r\n response: string;\r\n\r\n begin\r\n asm\r\n response = Event.target.responseText;\r\n end;\r\n\r\n sl := TStringList.Create;\r\n\r\n // persist control state\r\n for i := FActiveForm.ControlCount - 1 downto 0 do\r\n begin\r\n ctl := FActiveForm.Controls[i];\r\n s := ctl.SaveState;\r\n ctl.ElementHandle.Id := ctl.Name;\r\n //s := ctl.Name +'='+ctl.ElementHandle.outerHTML;\r\n s := ctl.Name +'='+ s;\r\n sl.Add(s);\r\n end;\r\n\r\n for i := FActiveForm.ControlCount - 1 downto 0 do\r\n begin\r\n ctl := FActiveForm.Controls[i];\r\n FActiveForm.RemoveComponent(ctl);\r\n ctl.Free;\r\n end;\r\n\r\n FActiveForm.ClearControls;\r\n FActiveForm.UnbindEvents;\r\n\r\n // HTML of the form being loaded\r\n document.body.innerHTML := response;\r\n\r\n FActiveForm.CreateControl;\r\n FActiveForm.DoCreate;\r\n FActiveForm.Init;\r\n\r\n // persist control state\r\n for i := FActiveForm.ControlCount - 1 downto 0 do\r\n begin\r\n ctl := FActiveForm.Controls[i]; // get controls back after form init\r\n // get HTML saved for control\r\n s := sl.Values[ctl.Name];\r\n\r\n if s <> '' then\r\n ctl.LoadState(s);\r\n\r\n //ctl.ElementHandle.outerHTML := s;\r\n //ctl.Container := document.getElementById(ctl.Name);\r\n //ctl.BindEvents;\r\n end;\r\n\r\n sl.Free;\r\n\r\n FActiveForm.DoShow;\r\n\r\n Result := true;\r\n end;\r\n\r\nbegin\r\n lFileName := FActiveForm.GetHTMLFileName;\r\n\r\n FLastReq := TJSXMLHttpRequest.new;\r\n FLastReq.addEventListener('load', @DoStatusCreate);\r\n FLastReq.open('GET', lFileName);\r\n {$IFDEF DEBUG}\r\n FLastReq.setRequestHeader('Cache-Control', 'no-cache');\r\n {$ENDIF}\r\n FLastReq.send;\r\nend;\r\n\r\nfunction TApplication.HasCSS(href:string): boolean;\r\nvar\r\n els: TJSNodeList;\r\n i: integer;\r\n s: string;\r\nbegin\r\n Result := false;\r\n els := document.querySelectorAll('head > link');\r\n for i := 0 to els.length - 1 do\r\n begin\r\n s := TJSHTMLLinkElement(els[i]).href;\r\n\r\n if CompareText(s, href) = 0 then\r\n begin\r\n Result := true;\r\n break;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TApplication.RemoveCSS(id: string);\r\nvar\r\n styleElement: TJSElement;\r\nbegin\r\n styleElement := document.getElementById(id);\r\n if Assigned(styleElement) then\r\n begin\r\n styleElement.parentNode.removeChild(styleElement);\r\n end;\r\nend;\r\n\r\nprocedure TApplication.RouteForm(AParameter: string);\r\nvar\r\n frm: TCustomForm;\r\n fc: TFormClass;\r\nbegin\r\n fc := TFormClass(GetClass(AParameter));\r\n Application.CreateForm(fc, frm);\r\nend;\r\n\r\nprocedure TApplication.CreateForm(AInstanceClass: TFormClass; var AReference);\r\nbegin\r\n CreateForm(AInstanceClass, FAppContainer, AReference, nil);\r\nend;\r\n\r\nprocedure TApplication.CreateForm(AInstanceClass: TDataModuleClass; var AReference);\r\nvar\r\n lModule: TDataModule;\r\nbegin\r\n lModule := AInstanceClass.Create(Self);\r\n AReference := lModule;\r\nend;\r\n\r\nprocedure TApplication.CreateForm(AInstanceClass: TFrameClass; var AReference);\r\nconst\r\n cHTMLCode = 'TMS Web Project' +\r\n '';\r\nvar\r\n lFrame: TFrame;\r\n lForm: TFramePreviewForm;\r\nbegin\r\n lForm := TFramePreviewForm.Create(Application);\r\n lFrame := AInstanceClass.Create(lForm);\r\n lForm.FFrame := lFrame;\r\n lForm.Popup := False;\r\n AReference := lFrame;\r\n\r\n Application.FActiveForm := lForm;\r\n Application.CreateNewForm(lForm, cHTMLCode);\r\nend;\r\n\r\nprocedure TApplication.CreateNewForm(AForm: TCustomForm; HTML: string);\r\nvar\r\n eh,op,span,childspan,formspan: TJSHTMLElement;\r\n l,t,w,h: integer;\r\n LCreatedProc: TFormCreatedProc;\r\n LCaptionDiv: TJSHTMLElement;\r\n LCaptionHeight: integer;\r\n ro: TJSOBject;\r\nbegin\r\n if FMainForm = nil then\r\n FMainForm := AForm;\r\n\r\n span := nil;\r\n formspan := nil;\r\n LCaptionHeight := 0;\r\n\r\n // form hosted in designated container\r\n if not AForm.Popup and (AForm.FFormElement <> '') then\r\n begin\r\n AForm.FLayer := nil;\r\n eh := TJSHTMLElement(document.getElementById(AForm.FFormElement));\r\n if Assigned(eh) then\r\n begin\r\n eh.innerHTML := HTML;\r\n if (AForm.ElementClassname = '') then\r\n eh.style.setProperty(CSSBackground,ColorToHTML(AForm.Color));\r\n end;\r\n end\r\n else\r\n begin\r\n AForm.ClearControls;\r\n // transparent mouse blocking layer\r\n AForm.FLayer := AForm.CreateLayer;\r\n\r\n document.body.appendChild(AForm.FLayer);\r\n eh := TJSHTMLElement(AForm.FLayer);\r\n\r\n // insert opacity layer\r\n if AForm.Popup and (AForm.PopupOpacity < 1) then\r\n begin\r\n op := AForm.CreateLayer;\r\n op.style.setProperty(CSSBackground, 'black');\r\n op.style.setProperty('opacity', DoubleToHTML(AForm.PopupOpacity));\r\n op.style.setProperty(CSSZIndex, Application.MaxZIndexStr);\r\n eh.appendChild(op);\r\n end;\r\n\r\n Application.ChangeMaxZIndex(+1);\r\n\r\n span := TJSHTMLElement(document.createElement('DIV'));\r\n // highest z-index but below modal dialog z-index\r\n span.style.setProperty(CSSZIndex, Application.MaxZIndexStr);\r\n AForm.FPopupElement := span;\r\n\r\n if (AForm.Border = fbDialogSizeable) then\r\n begin\r\n span.style.setProperty('resize','both');\r\n span.style.setProperty('overflow','auto');\r\n\r\n ro := nil;\r\n asm\r\n try\r\n {\r\n var frm = AForm;\r\n ro = new ResizeObserver( function(entries) {\r\n window.requestAnimationFrame(() => {\r\n if (!Array.isArray(entries) || !entries.length) {\r\n return;\r\n }\r\n entries.forEach( function(entry) {\r\n frm.HandleObserver();\r\n });\r\n } );\r\n });\r\n // Observe the scrollingElement for when the window gets resized\r\n ro.observe(span);\r\n }\r\n catch(err)\r\n {\r\n span.style.removeProperty('resize');\r\n span.style.removeProperty('overflow');\r\n }\r\n end;\r\n\r\n AForm.FResizeObserver := ro;\r\n end;\r\n\r\n if AForm.ElementClassName <> '' then\r\n span.setAttribute('class', AForm.ElementClassName);\r\n\r\n if AForm.Shadow and AForm.Popup then\r\n span.style.setProperty('box-shadow','3px 3px 3px silver');\r\n\r\n eh.appendChild(span);\r\n\r\n if (AForm.Border in [fbDialog, fbDialogSizeable]) then\r\n begin\r\n AForm.GetMethodPointers;\r\n LCaptionDiv := AForm.CreateCaption;\r\n span.appendChild(LCaptionDiv);\r\n childspan := TJSHTMLElement(document.createElement('DIV'));\r\n childspan.style.setProperty('position','absolute');\r\n childspan.style.setProperty('width','100%');\r\n// childspan.style.setProperty('height','100%');\r\n childspan['id']:= 'childspan';\r\n span.appendChild(childspan);\r\n formspan := childspan;\r\n LCaptionHeight := 22;\r\n end\r\n else\r\n begin\r\n formspan := span;\r\n end;\r\n\r\n formspan.innerHTML := HTML;\r\n AForm.Container := formspan;\r\n end;\r\n\r\n AForm.Init;\r\n AForm.LoadDFMValues;\r\n\r\n if (AForm.Border in [fbDialog, fbDialogSizeable]) and (AForm.ElementCaptionClassName <> '') then\r\n begin\r\n LCaptionDiv.ClassList.Add(AForm.ElementCaptionClassName);\r\n LCaptionDiv.style.removeProperty('background-color');\r\n LCaptionDiv.style.removeProperty('color');\r\n end;\r\n\r\n if Assigned(AForm.FLayer) then\r\n begin\r\n // ensure full screen background is white or adopts the form elementclassname when it is not popup\r\n if not AForm.Popup then\r\n begin\r\n if (AForm.ElementClassName = '') then\r\n begin\r\n if AForm.Color <> clNone then\r\n eh.style.setProperty(CSSBackground, ColorToHTML(AForm.Color))\r\n else\r\n eh.style.setProperty(CSSBackground, 'white')\r\n end\r\n else\r\n eh.setAttribute('class',AForm.ElementClassName);\r\n end;\r\n end;\r\n\r\n // position popup form centered\r\n if Assigned(span) and (AForm.FormContainer = '') and AForm.Popup then\r\n begin\r\n span.style.setProperty('position', 'absolute');\r\n\r\n l := max(0,Round((WinWidth - AForm.Width)/2));\r\n t := max(0,Round((WinHeight - AForm.Height)/2));\r\n\r\n w := AForm.Width;\r\n h := AForm.Height + LCaptionHeight;\r\n\r\n if (AForm.ElementClassName = '') then\r\n begin\r\n span.style.setProperty(CSSBackground,ColorToHTML(AForm.Color));\r\n span.style.setProperty('border','1px Black solid');\r\n end;\r\n\r\n span.style.setProperty('top',IntTostr(t)+'px');\r\n span.style.setProperty('left',IntToStr(l)+'px');\r\n span.style.setProperty('width',IntToStr(w)+'px');\r\n span.style.setProperty('height',IntToStr(h)+'px');\r\n end;\r\n\r\n if Assigned(formspan) then\r\n ActivateChildScripts(formspan);\r\n\r\n if Assigned(AForm.FCreatedProc) then\r\n begin\r\n LCreatedProc := AForm.FCreatedProc;\r\n AForm.FCreatedProc := nil;\r\n LCreatedProc(AForm);\r\n end;\r\n\r\n if Assigned(AForm.OnCreate) then\r\n AForm.OnCreate(AForm);\r\n\r\n AForm.Loaded;\r\n AForm.InitAnchoring;\r\n AForm.UpdateChildAnchoring;\r\n AForm.FCreating := false;\r\n AForm.UpdateElement;\r\n\r\n if not AForm.EventsBound then\r\n AForm.BindEvents;\r\n\r\n AForm.Resize;\r\n AForm.DoShow;\r\nend;\r\n\r\nfunction TApplication.DoFormLoad(Event: TEventListenerEvent): boolean;\r\nvar\r\n LResponse: string;\r\nbegin\r\n asm\r\n LResponse = Event.target.responseText;\r\n end;\r\n\r\n CreateNewForm(FActiveForm, LResponse);\r\n\r\n if Assigned(FCreatedProc) then\r\n begin\r\n FCreatedProc(Self);\r\n FCreatedProc := nil;\r\n end;\r\n\r\n\r\n\r\n Result := true;\r\nend;\r\n\r\nfunction TApplication.DoHandleError(Event: TJSErrorEvent): boolean;\r\nvar\r\n err: TApplicationError;\r\n el,sp,x: TJSHTMLElement;\r\n msg,s: string;\r\nbegin\r\n err.AMessage := Event.message;\r\n err.AFile := Event.filename;\r\n err.ALineNumber := Event.lineno;\r\n err.AColNumber := Event.colno;\r\n err.AError := Event.error;\r\n err.AStack := '';\r\n s := '';\r\n // try to get stack & RTL exception message\r\n if Assigned(Event.error) then\r\n begin\r\n\r\n asm\r\n if (Event.error.stack) {\r\n err.AStack = Event.error.stack;\r\n }\r\n if (Event.error.fMessage) {\r\n err.AMessage = Event.error.fMessage;\r\n }\r\n end;\r\n\r\n asm\r\n function objToString (obj) {\r\n var str = '';\r\n for (var p in obj) {\r\n if (obj.hasOwnProperty(p)) {\r\n str += p + '::' + obj[p] + '\\n';\r\n }\r\n }\r\n return str;\r\n }\r\n s = objToString(Event.error);\r\n end;\r\n end;\r\n\r\n\r\n Result := false;\r\n\r\n msg := 'ERROR
' + err.AMessage + ' | ' + s + err.AStack + '
at '+err.AFile + ' [' +inttostr(err.ALineNumber)+':'+inttostr(err.AColNumber)+']';\r\n\r\n case ErrorType of\r\n aeFooter:\r\n begin\r\n el := TJSHTMLElement(document.getElementById('tmserrormessage'));\r\n\r\n if Assigned(el) then\r\n begin\r\n (el.firstChild as TJSHTMLElement).innerHTML := msg;\r\n end\r\n else\r\n begin\r\n el := TJSHTMLElement(document.createElement('DIV'));\r\n el.setAttribute('id','tmserrormessage');\r\n el.style.setProperty('position','absolute');\r\n el.style.setProperty('font-family','Courier');\r\n el.style.setProperty('font-size','8pt');\r\n el.style.setProperty('bottom','0');\r\n el.style.setProperty('width','100%');\r\n el.style.setProperty('height','100px');\r\n el.style.setProperty('background','#ff0000');\r\n el.style.setProperty('color','#ffffff');\r\n TJSHTMLElement(document.body).style.setProperty('padding','0');\r\n TJSHTMLElement(document.body).style.setProperty('margin','0');\r\n sp := TJSHTMLElement(document.createElement('SPAN'));\r\n sp.style.setProperty('margin-left','4px');\r\n sp.style.setProperty('float','left');\r\n sp.style.setProperty('overflow','hidden');\r\n sp.style.setProperty('display','block');\r\n sp.innerHTML := msg;\r\n el.appendChild(sp);\r\n\r\n x := TJSHTMLElement(document.createElement('SPAN'));\r\n x.style.setProperty('font-family','Courier');\r\n x.style.setProperty('font-size','8pt');\r\n x.style.setProperty('font-weight','bold');\r\n x.style.setProperty('position','absolute');\r\n x.style.setProperty('width','20px');\r\n x.style.setProperty('vertical-align','top');\r\n x.style.setProperty('cursor','pointer');\r\n x.style.setProperty('text-align','right');\r\n x.style.setProperty('right','4px');\r\n x.style.setProperty('display','block');\r\n x.innerHTML := 'X';\r\n x.onClick := @DoErrorClose;\r\n el.appendChild(x);\r\n\r\n document.body.appendChild(el);\r\n end;\r\n end;\r\n aeAlert: window.alert(msg);\r\n aeDialog:\r\n begin\r\n AddControlLink('googlematerial', 'https://fonts.googleapis.com/icon?family=Material+Icons');\r\n MessageDlg(msg, mtError, [mbOK]);\r\n end;\r\n end;\r\n\r\n if Assigned(OnError) then\r\n OnError(Self, err, Result);\r\nend;\r\n\r\nfunction TApplication.DoHashChange(Event: TEventListenerEvent): boolean;\r\nvar\r\n s: string;\r\n fc: TFormClass;\r\n frm: TCustomForm;\r\n bdy: TJSHTMLElement;\r\n Handled: boolean;\r\n\r\nbegin\r\n Result := true;\r\n\r\n if not AutoFormRoute then\r\n Exit;\r\n\r\n asm\r\n s = location.hash;\r\n end;\r\n\r\n // remove hash sign to get class name\r\n Delete(s,1,1);\r\n\r\n Handled := false;\r\n\r\n if Assigned(OnHashChange) then\r\n OnHashChange(Self, s, Handled);\r\n\r\n if Handled then\r\n Exit;\r\n\r\n if s = '' then\r\n s := FInitFormClassName;\r\n\r\n if s <> '' then\r\n begin\r\n if FInitFormClassName = '' then\r\n FInitFormClassName := FActiveForm.ClassName;\r\n\r\n fc := TFormClass(GetClass(s));\r\n\r\n if Assigned(fc) then\r\n begin\r\n bdy := TJSHTMLElement(document.body);\r\n CreateForm(fc, bdy, frm);\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TApplication.DoUpdateOnlineStatus(Event: TEventListenerEvent): boolean;\r\nbegin\r\n Result := true;\r\n\r\n if Assigned(OnOnlineChange) then\r\n begin\r\n if window.navigator.onLine then\r\n OnOnlineChange(Self, osOnline)\r\n else\r\n OnOnlineChange(Self, osOffline);\r\n end;\r\nend;\r\n\r\nprocedure TApplication.Download(const AURL: string);\r\nbegin\r\n asm\r\n window.location.href = AURL;\r\n end;\r\nend;\r\n\r\nprocedure TApplication.DownloadTextFile(const AText: string; AFileName: string = '');\r\nbegin\r\n asm\r\n var element = document.createElement('a');\r\n element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(AText));\r\n if (AFileName != ''){\r\n element.setAttribute('download', AFileName);\r\n }\r\n element.style.display = 'none';\r\n document.body.appendChild(element);\r\n element.click();\r\n document.body.removeChild(element);\r\n end;\r\nend;\r\n\r\nfunction TApplication.EXEName: string;\r\nbegin\r\n Result := window.document.location.href;\r\nend;\r\n\r\nfunction TApplication.GetColorScheme: TApplicationColorScheme;\r\nbegin\r\n Result := csNoScheme;\r\n\r\n if (window.matchMedia('(prefers-color-scheme)').media <> 'not all') then\r\n begin\r\n\r\n if (window.matchMedia('(prefers-color-scheme: dark)').matches) then\r\n Result := csDark\r\n else\r\n Result := csLight;\r\n end;\r\nend;\r\n\r\nfunction TApplication.IDETheme: string;\r\nvar\r\n s: string;\r\nbegin\r\n Result := '';\r\n\r\n if not Assigned(VSIDE) then\r\n Exit;\r\n\r\n asm\r\n s = pas[\"WEBLib.Forms\"].VSIDE.theme;\r\n end;\r\n\r\n Result := s;\r\nend;\r\n\r\nprocedure TApplication.IDEOpenURL(const URL: string);\r\nbegin\r\n asm\r\n pas[\"WEBLib.Forms\"].VSIDE.Open(URL);\r\n end;\r\nend;\r\n\r\nprocedure TApplication.IDEMessage(const Msg: string);\r\nbegin\r\n asm\r\n pas[\"WEBLib.Forms\"].VSIDE.ShowMessage(Msg);\r\n end;\r\nend;\r\n\r\nfunction TApplication.IDECSS: string;\r\nbegin\r\n Result := '';\r\n if IDETheme = 'vscode-light' then\r\n begin\r\n Result := '.IDECaption { background-color: #F0F0F0 !important; color: #555555 !important; border: 1px solid #DDDDDD !important}'+#13#10+\r\n '.IDEBkg { background-color: white !important; color: #555555 !important; border: 1px solid #DDDDDD !important}'+#13#10+\r\n '.IDEButton { background-color: #FAFAFA !important; font-size:10pt; color: #555555 !important; border: 1px solid #DDDDDD !important}'+#13#10+\r\n '.IDEButton:hover {background-color:#F0F0F0 !important}'+#13#10+\r\n '.IDEFont {font-size:10pt !important}';\r\n end;\r\n\r\n if IDETheme = 'vscode' then\r\n begin\r\n Result := '.IDECaption,.IDEButton { background-color: #3F3E43 !important; color: #FFFFFF !important; border: 1px solid #35353A !important}'+#13#10+\r\n '.IDEBkg { background-color: #2A2A2C !important; color: #A9ACB4 !important; border: 1px solid #35353A !important}'+#13#10+\r\n '.IDEButton:hover {background-color:#434857 !important}'+#13#10+\r\n '.IDEFont {font-size:10pt !important}';\r\n end;\r\nend;\r\n\r\nprocedure TApplication.InternalDownloadFile(const AData: TJSUint8Array; const AFileName, AType: string; const ANewTab: Boolean);\r\nbegin\r\n asm\r\n var lElement = document.createElement('a');\r\n var lBlob = new Blob([AData], {type: AType})\r\n var lUrl = window.URL.createObjectURL(lBlob);\r\n lElement.href = lUrl;\r\n if (AFileName != ''){\r\n lElement.setAttribute('download', AFileName);\r\n }\r\n lElement.style.display = 'none';\r\n if (ANewTab == true) {\r\n lElement.target = '_blank';\r\n }\r\n document.body.appendChild(lElement);\r\n lElement.click();\r\n document.body.removeChild(lElement);\r\n end;\r\nend;\r\n\r\nprocedure TApplication.DownloadBinaryFile(const AData: TBytes; const AFileName: string; const ANewTab: Boolean);\r\nbegin\r\n DownloadBinaryFile(TJSUint8Array.from(AData), AFileName, ANewTab);\r\nend;\r\n\r\nprocedure TApplication.DownloadBinaryFile(const AData: TJSUint8Array; const AFileName: string; const ANewTab: Boolean);\r\nbegin\r\n InternalDownloadFile(AData, AFileName, 'octet/stream', ANewTab);\r\nend;\r\n\r\nprocedure TApplication.DownloadPDFFile(const AData: TBytes; const AFileName: string; const ANewTab: Boolean);\r\nbegin\r\n DownloadPDFFile(TJSUint8Array.from(AData), AFileName, ANewTab);\r\nend;\r\n\r\nprocedure TApplication.DownloadPDFFile(const AData: TJSUint8Array; const AFileName: string; const ANewTab: Boolean);\r\nbegin\r\n InternalDownloadFile(AData, AFileName, 'application/pdf', ANewTab);\r\nend;\r\n\r\nfunction TApplication.GetAuthorizationPageHTML(const AAuthorizationSuccess: Boolean): string;\r\nconst\r\n sExternalBrowserAuthorizationOK = '
Application succesfully authorized
You can close this browser window';\r\n sExternalBrowserAuthorizationFailed = '
Application authorization failed

Please try again.';\r\n LB = #13#10;\r\n\r\n ImageFail = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeA'+\r\n 'AAACXBIWXMAAA7DAAAOwwHHb6hkAAABtElEQVR4nO2bUY7CMAxEhz0NB+EgrDjXCg6yB+E4+9NKCAiN'+\r\n '7XHcjf1+ED+Z6ahNHScFiqIoBNwvp+v9crpG+3hG6+sgFQFwXv7ejj+/31JBDyy+ugN4ElkJD8Hqqyu'+\r\n 'AhohYjA3D12YAGyIiMSYsXx8D6BTpFmPB9NUMQCjSJcaA7ettAEqRTTErHr5eAjCKfBSz4OXryzhgiz'+\r\n 'OzWCJd/Fs8HoFHzHeCtxf2JNgt3MMID8zXoMpAtDarEDIbidJklMJUQ6MDty6GNDSNRdxtluWwhReDU'+\r\n 'fONKADAx2jkZCsOAOAaXn4pY2let6oAAN/qTIG61lAHAOwmBFO1aQoACA/BXGqbAwDCQqCsOCkBAMND'+\r\n 'oC23aQEAw0Kg9hqoAQDuIdAbLfQAALcQXFptLgEA9BDc+oxeLbF/Qz0C7AFTT4KpX4OpC6HUpXDqxVD'+\r\n 'q5fBOLn5lbEMkdUssdVM0dVs89cZI6q2x1JujqbfHUx+Q2MPFj/LidUqsKajB05NXS4y6Zl/GurHGe6'+\r\n 'QOSpLF5jgqqxSb67C0UGzO4/KdYnN/MLEhluOTmYZY+MWvDPU122dzRVHk5g+X6Lw5aVkK9AAAAABJRU5ErkJggg==';\r\n\r\n ImageSuccess = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaX'+\r\n 'HeAAAACXBIWXMAAA7DAAAOwwHHb6hkAAACC0lEQVR4nO2Zv3GDMBSHv+QyQEbICM4EOW+Q9BS4o2QTU'+\r\n '9LZBQNkg6zgETyCR0iRkOMIAv3Xk0+/zsiI931nI3iCkpKSkpKSkpKSkpJ7SDN0x2bo3nW//xCymNhp'+\r\n 'hu4E1MAN2PdVe9k6524ETODHXIHXvmpva+c9BqwpWhbgAV6Ar61zsxeggB+z+x1XJmsBG/Bj6mboWtV'+\r\n 'gtvcATfhpPvqq/ZwfzFKABTwoVobsBFjCj7kyWxmyugc4wsPCypCNAA/wY/L7C3iEP/dVe5geEC8gJD'+\r\n 'wIFxAaHgQLiAEPQgXEggeBAmLCgzABseFBkIAU8CBEQCp4ECAgJTwYChibCzYXWpmv9jCVFTwYCJgVa'+\r\n '31BxXwucapFS4CiWOsLS4EHDQEbxRoXIAkeNgRoFqtdiDR4WBFgWOxmQRLhQdEQsSi2bobuqBqUCg8L'+\r\n 'vwDHYg991Z49zjeNd3iYCfBU7J8E6fAAT7PPOw9znpqhA3hDODz8F7Dnp2vqKmJ1O8ogQeFh+R7wjB8'+\r\n 'JrgkOD4plUICEKPCw/hyQSkI0eNh+EowtISo86L0LxJIQHR703wZDS0gCD2b9gFASksGDeUfIt4Sk8G'+\r\n 'DRE/QoITk8WDZFPUgQAQ8OXWEHCWLgwbEtbiFBFDx42BcwkCAOHjxtjGhIEAkPHneGViSIhQfPW2MLE'+\r\n 'kTDQ4C9wYmEi3T4kpKSkm+5ax+YhPsUTQAAAABJRU5ErkJggg==';\r\n\r\n PlaceHolderImage = '#PLACEHOLDERIMAGE#';\r\n PlaceHolderText = '#PLACEHOLDERTEXT#';\r\n PlaceHolderColor = '#PLACEHOLDERCOLOR#';\r\n\r\n AuthHTMLTemplate =\r\n ''+LB+\r\n ''+LB+\r\n ''+LB+\r\n ' Authentication Result'+LB+\r\n ' '+LB+\r\n ''+LB+\r\n ''+LB+\r\n ''+LB+\r\n '
'+LB+\r\n '
'+LB+\r\n ' '+LB+\r\n '
'+LB+\r\n '
'+LB+\r\n ' #PLACEHOLDERTEXT#'+LB+\r\n '
'+LB+\r\n '
'+LB+\r\n ' '+LB+\r\n '';\r\n\r\n function ReplacePlaceHolders(APlaceHolders: array of string; APlaceHolderValues: array of string): string;\r\n var\r\n I: Integer;\r\n s: string;\r\n begin\r\n s := AuthHTMLTemplate;\r\n for I := 0 to Length(APlaceHolders) - 1 do\r\n s := StringReplace(s, APlaceHolders[I], APlaceHolderValues[I], [rfReplaceAll]);\r\n\r\n Result := s;\r\n end;\r\n\r\nbegin\r\n if AAuthorizationSuccess then\r\n Result := ReplacePlaceHolders([PlaceHolderImage, PlaceHolderText, PlaceHolderColor], [ImageSuccess, sExternalBrowserAuthorizationOK, 'rgb(104, 164, 144)'])\r\n else\r\n Result := ReplacePlaceHolders([PlaceHolderImage, PlaceHolderText, PlaceHolderColor], [ImageFail, sExternalBrowserAuthorizationFailed, 'rgb(216, 99, 68)']);\r\nend;\r\n\r\nfunction TApplication.GetFormExtension: string;\r\nbegin\r\n if Language <> lNone then\r\n Result := '_' + GetLanguageISO639_1Code(Language) + cHTMLExt\r\n else\r\n Result := cHTMLExt;\r\nend;\r\n\r\nfunction TApplication.GetIsOnline: boolean;\r\nbegin\r\n Result := window.navigator.onLine;\r\nend;\r\n\r\nfunction TApplication.GetIsMobile: boolean;\r\nvar\r\n mob: boolean;\r\nbegin\r\n asm\r\n function TestMobile() {\r\n var check = false;\r\n (function(a){if(/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(a.substr(0,4))) check = true;})(navigator.userAgent||navigator.vendor||window.opera);\r\n return check;\r\n };\r\n\r\n mob = TestMobile();\r\n end;\r\n\r\n Result := mob;\r\nend;\r\n\r\n{$IFDEF SINGLEINSTANCE}\r\nprocedure TApplication.DoGetDataReceived(Sender: TObject; Origin: string;\r\n Data: TJSObjectRecord);\r\nbegin\r\n if Data.jsobject.toString = '#reload' then\r\n begin\r\n asm\r\n location.reload();\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TApplication.DoGetConnected(Sender: TObject);\r\nvar\r\n url,agent:string;\r\nbegin\r\n url := window.location.href;\r\n agent := window.navigator.useragent;\r\n\r\n if Pos('Edg', agent) > 0 then\r\n agent := 'Edge'\r\n else if Pos('Opera', agent) > 0 then\r\n agent := 'Opera'\r\n else if Pos('OPR', agent) > 0 then\r\n agent := 'Opera'\r\n else if Pos('Chrome', agent) > 0 then\r\n agent := 'Chrome'\r\n else if Pos('Safari', agent) > 0 then\r\n agent := 'Safari'\r\n else if Pos('Firefox', agent) > 0 then\r\n agent := 'Firefox'\r\n else if Pos('Trident', agent) > 0 then\r\n agent := 'MSIE'\r\n else\r\n agent := '';\r\n\r\n FWebSocket.Send(url + ';' + agent);\r\nend;\r\n{$ENDIF}\r\n\r\nfunction TApplication.DoErrorClose(Event: TJSMouseEvent): boolean;\r\nbegin\r\n document.body.removeChild(Event.targetElement.parentElement);\r\n Result := true;\r\nend;\r\n\r\nfunction TApplication.DoFormAbort(Event: TEventListenerEvent): boolean;\r\nbegin\r\n ShowMessage('Failed to load form HTML template file');\r\n Result := true;\r\nend;\r\n\r\n\r\nprocedure TApplication.InitFormatSettings(const BrowserLocale: string);\r\nvar\r\n timestr: string;\r\n i: integer;\r\n locale: string;\r\nbegin\r\n locale := BrowserLocale;\r\n\r\n FormatSettings.ShortDateFormat := GetLocaleShortDateFormat(locale);\r\n\r\n if (Pos('/',FormatSettings.ShortDateFormat) > 0) then\r\n FormatSettings.DateSeparator := '/';\r\n\r\n if (Pos('.',FormatSettings.ShortDateFormat) > 0) then\r\n FormatSettings.DateSeparator := '.';\r\n\r\n if (Pos('-',FormatSettings.ShortDateFormat) > 0) then\r\n FormatSettings.DateSeparator := '-';\r\n\r\n asm\r\n var event = new Date('Jan 1, 1980 06:07:08 GMT+00:00');\r\n var loc = \"\";\r\n if (locale == \"\") { loc = navigator.language; } else\r\n { loc = locale; }\r\n timestr = event.toLocaleTimeString(loc);\r\n end;\r\n\r\n if pos(':',timestr) > 0 then\r\n FormatSettings.TimeSeparator := ':';\r\n\r\n if pos('.',timestr) > 0 then\r\n FormatSettings.TimeSeparator := '.';\r\n\r\n if pos('-',timestr) > 0 then\r\n FormatSettings.TimeSeparator := '-';\r\n\r\n for i := 1 to 7 do\r\n begin\r\n ShortDayNames[i] := GetLocaleShortDayName(i,locale);\r\n LongDayNames[i] := GetLocaleLongDayName(i,locale);\r\n end;\r\n\r\n for i := 1 to 12 do\r\n begin\r\n ShortMonthNames[i] := GetLocaleShortMonthName(i,locale);\r\n LongMonthNames[i] := GetLocaleLongMonthName(i,locale);\r\n end;\r\n\r\n FormatSettings.DecimalSeparator := GetLocaleDecimalSeparator;\r\n\r\n if FormatSettings.DecimalSeparator = '.' then\r\n FormatSettings.ThousandSeparator := ','\r\n else\r\n FormatSettings.ThousandSeparator := '.';\r\nend;\r\n\r\n{$HINTS OFF}\r\nprocedure TApplication.Initialize;\r\nvar\r\n query, token: string;\r\n p: Integer;\r\n b: Boolean;\r\nbegin\r\n FCanCreateForm := True;\r\n FAppInitializing := True;\r\n FParameters.Clear;\r\n query := window.location.href;\r\n\r\n InitFormatSettings(GetBrowserLocale);\r\n\r\n FParameters.Delimiter := '&';\r\n FParameters.StrictDelimiter := true;\r\n p := Pos('?', query);\r\n if p > 0 then\r\n query := Copy(query, p + 1, Length(query));\r\n FParameters.DelimitedText := query;\r\n\r\n asm\r\n b = (window.name == \"Authentication\");\r\n end;\r\n\r\n if (FParameters.IndexOfName('oauthcallback') <> -1) or b then\r\n begin\r\n if Assigned(OnOAuthCallBack) then\r\n OnOauthCallBack(Self, query);\r\n\r\n FIsRedirect := true;\r\n document.body.innerHTML := GetAuthorizationPageHTML(True);\r\n Exit;\r\n end;\r\n\r\n if FParameters.IndexOfName('code') <> -1 then\r\n begin\r\n if Assigned(OnOAuthToken) then\r\n OnOauthToken(Self, query);\r\n FIsRedirect := true;\r\n token := FParameters.Values['code'];\r\n asm\r\n if (window.opener && window.opener.processAuthData){\r\n window.opener.processAuthData(token);\r\n \twindow.close();\r\n }\r\n end;\r\n end;\r\n\r\n window.addEventListener('hashchange',@DoHashChange);\r\n window.addEventListener('online', @DoUpdateOnlineStatus);\r\n window.addEventListener('offline', @DoUpdateOnlineStatus);\r\n\r\n if FParameters.IndexOfName('access_token') <> -1 then\r\n begin\r\n FIsRedirect := true;\r\n token := FParameters.Values['access_token'];\r\n asm\r\n window.opener.processAuthData(token);\r\n end;\r\n \twindow.close();\r\n end;\r\nend;\r\n\r\nprocedure TApplication.InsertCSS(id, href: string);\r\nvar\r\n styleElement: TJSElement;\r\nbegin\r\n\r\n styleElement := document.getElementById(id);\r\n if Assigned(styleElement) then\r\n begin\r\n asm\r\n styleElement.href = href;\r\n end;\r\n Exit;\r\n end;\r\n\r\n styleElement := document.createElement('link');\r\n styleElement.id := id;\r\n\r\n asm\r\n styleElement.rel = 'stylesheet';\r\n styleElement.href = href;\r\n end;\r\n\r\n document.getElementsByTagName('head')[0].appendChild(styleElement);\r\nend;\r\n\r\n{$HINTS ON}\r\n\r\nprocedure TApplication.Run;\r\nbegin\r\n FCanCreateForm := True;\r\n FAppInitializing := False;\r\nend;\r\n\r\nprocedure TApplication.RunScript(Source: string);\r\nbegin\r\n asm\r\n eval(Source);\r\n end;\r\nend;\r\n\r\nprocedure TApplication.ReceiveMessageFromClient(const AMessage: string);\r\nbegin\r\n if Assigned(FClientConnector) then\r\n FClientConnector.Receive(AMessage);\r\nend;\r\n\r\nprocedure TApplication.ChangeLanguage(const Value: TUILanguage);\r\nbegin\r\n FLanguage := Value;\r\n if Assigned(FMainForm) then\r\n ReloadForm;\r\nend;\r\n\r\nprocedure TApplication.SetLanguage(const Value: TUILanguage);\r\nbegin\r\n FLanguage := Value;\r\nend;\r\n\r\nprocedure TApplication.ChangeCSS(id, href: string);\r\nbegin\r\n asm\r\n var styleElement = document.getElementById(id);\r\n if (styleElement) {\r\n styleElement.href = href;\r\n return;\r\n }\r\n end;\r\nend;\r\n\r\nfunction TApplication.MaxZIndexStr: string;\r\nbegin\r\n Result := IntToStr(FMaxZIndex);\r\nend;\r\n\r\nprocedure TApplication.ChangeMaxZIndex(Delta: integer);\r\nbegin\r\n FMaxZIndex := FMaxZIndex + Delta;\r\nend;\r\n\r\nconstructor TApplication.Create(AOwner: TComponent);\r\n{$IFDEF HOTRELOAD}\r\nconst\r\n cDefPollInterval = 1000;\r\n cDefFileName = 'TMSHotreloadVersion.json';\r\n {$ENDIF}\r\nbegin\r\n FFormStack := TList.Create;\r\n FParameters := TStringList.Create;\r\n FAppContainer := cBodyTag;\r\n FMainForm := nil;\r\n FActiveForm := nil;\r\n FInitFormClassName := '';\r\n FIsRedirect := false;\r\n FAutoFormRoute := false;\r\n FThemed := false;\r\n FThemeColor := clTMSBlue;\r\n FThemeTextColor := clWhite;\r\n FMaxZIndex := 999998;\r\n {$IFDEF HOTRELOAD}\r\n FHotReloadPollInterval := cDefPollInterval;\r\n FHotReloadFile := cDefFileName;\r\n StartHotReload;\r\n {$ENDIF}\r\n {$IFDEF SINGLEINSTANCE}\r\n FWebSocket := TSocketClient.Create(Self);\r\n FWebSocket.Port := DefaultPort;\r\n FWebSocket.OnDataReceived := @DoGetDataReceived;\r\n FWebSocket.OnConnect := @DoGetConnected;\r\n FWebSocket.Connect;\r\n {$ENDIF}\r\n\r\n window.addEventListener('error', @DoHandleError);\r\n\r\n FErrorType := aeSilent;\r\n {$IFDEF DEBUG}\r\n FErrorType := aeFooter;\r\n {$ENDIF}\r\n\r\n {$IFDEF FREEWARE}\r\n {$IFDEF TMS}\r\n asm\r\n alert('TMS WEB Core \\u00A9 2018 - 2021 tmssoftware.com - Trial Version');\r\n end;\r\n {$ENDIF}\r\n {$IFNDEF TMS}\r\n asm\r\n alert('Application created with an unlicensed trial version of software');\r\n end;\r\n {$ENDIF}\r\n {$ENDIF}\r\nend;\r\n\r\ndestructor TApplication.Destroy;\r\nbegin\r\n {$IFDEF HOTRELOAD}\r\n StopHotReload;\r\n {$ENDIF}\r\n {$IFDEF SINGLEINSTANCE}\r\n FWebSocket.Free;\r\n {$ENDIF}\r\n FFormStack.Free;\r\n FParameters.Free;\r\n inherited Destroy;\r\nend;\r\n\r\nprocedure TApplication.LockForm(AForm: TCustomForm);\r\nvar\r\n i: integer;\r\nbegin\r\n for i := 0 to AForm.ControlCount - 1 do\r\n begin\r\n AForm.Controls[i].DisableTab;\r\n end;\r\nend;\r\n\r\nprocedure TApplication.UnLockForm(AForm: TCustomForm);\r\nvar\r\n i: integer;\r\nbegin\r\n for i := 0 to AForm.ControlCount - 1 do\r\n begin\r\n AForm.Controls[i].EnableTab;\r\n end;\r\nend;\r\n\r\nprocedure TApplication.PushForm(AForm: TCustomForm);\r\nvar\r\n i: integer;\r\nbegin\r\n // persist all control settings in HTML to be saved\r\n for i := 0 to AForm.ControlCount - 1 do\r\n begin\r\n AForm.Controls[i].PersistInHTML;\r\n end;\r\n\r\n // save with form\r\n AForm.FormContent := document.body.innerHTML;\r\n\r\n for i := 0 to AForm.ControlCount - 1 do\r\n begin\r\n AForm.Controls[i].DisableTab;\r\n end;\r\n\r\n FFormStack.Add(AForm);\r\nend;\r\n\r\nfunction TApplication.PopForm: TCustomForm;\r\nvar\r\n i: integer;\r\n frm: string;\r\nbegin\r\n if (FFormStack.Count > 0) then\r\n begin\r\n Result := TCustomForm(FFormStack.Items[FFormStack.Count - 1]);\r\n frm := Result.FormContent;\r\n FFormStack.Delete(FFormStack.Count - 1);\r\n\r\n // restore document\r\n document.body.innerHTML := frm;\r\n\r\n Result.InitFromHTML;\r\n\r\n // rebind form events\r\n Result.BindEvents;\r\n\r\n // rehook controls\r\n for i := 0 to Result.ControlCount - 1 do\r\n Result.Controls[i].HookElement;\r\n\r\n for i := 0 to Result.ControlCount - 1 do\r\n begin\r\n Result.Controls[i].RecreateCanvas;\r\n Result.Controls[i].InternalResize;\r\n end;\r\n\r\n Application.FActiveForm := Result;\r\n end;\r\nend;\r\n\r\nfunction TApplication.Version: string;\r\nbegin\r\n Result := WEBCOREVERSION;\r\nend;\r\n\r\n{$IFDEF HOTRELOAD}\r\nprocedure TApplication.OnHotReloadTick;\r\nconst\r\n cMethodLoad = 'load';\r\n cMethodAbort = 'abort';\r\n cMethodGet = 'GET';\r\n cDeli = '/';\r\nvar\r\n lReq: TJSXMLHttpRequest;\r\n lBuffer: string;\r\nbegin\r\n if FHotReloadReq <> nil then\r\n Exit;\r\n\r\n lReq := TJSXMLHttpRequest.New;\r\n lReq.AddEventListener(cMethodLoad, @OnHotReloadLoad);\r\n lReq.AddEventListener(cMethodAbort, @OnHotReloadAbort);\r\n lBuffer := window.document.location.href;\r\n lBuffer := TPath.GetDirectoryName(lBuffer);\r\n lBuffer := lBuffer + cDeli + FHotReloadFile;\r\n lReq.Open(cMethodGet, lBuffer);\r\n lReq.setRequestHeader('Cache-Control', 'no-cache, no-store, must-revalidate');\r\n lReq.Send;\r\n FHotReloadReq := lReq;\r\nend;\r\n\r\nfunction TApplication.OnHotReloadAbort(AEvent: TEventListenerEvent): Boolean;\r\nbegin\r\n FHotReloadReq := nil;\r\n Result := False;\r\nend;\r\n\r\nfunction TApplication.OnHotReloadLoad(AEvent: TEventListenerEvent): Boolean;\r\nvar\r\n lData: TJSObject;\r\nbegin\r\n try\r\n lData := TJSJSON.parseObject(FHotReloadReq.responseText);\r\n HandleHotReload(lData);\r\n except\r\n console.error('Error parsing Hotreload JSON: '+ FHotReloadReq.responseText);\r\n end;\r\n FHotReloadReq := nil;\r\n Result := True;\r\nend;\r\n\r\nprocedure TApplication.HandleHotReload(const AData: TJSObject);\r\nconst\r\n cAttributeVersion = 'version';\r\nvar\r\n lVersion: JSValue;\r\nbegin\r\n lVersion := AData[cAttributeVersion];\r\n if FHotReloadVersion = 0 then\r\n begin\r\n FHotReloadVersion := Integer(lVersion);\r\n Exit;\r\n end;\r\n\r\n if Integer(lVersion) > FHotReloadVersion then\r\n begin\r\n FHotReloadVersion := Integer(lVersion);\r\n window.location.reload(false);\r\n end;\r\nend;\r\n\r\nprocedure TApplication.StartHotReload;\r\nbegin\r\n if FHotReloadTimer = 0 then\r\n FHotReloadTimer := Window.setInterval(@OnHotReloadTick, FHotReloadPollInterval);\r\nend;\r\n\r\nprocedure TApplication.StopHotReload;\r\nbegin\r\n if FHotReloadTimer <> 0 then\r\n begin\r\n Window.ClearInterval(FHotReloadTimer);\r\n FHotReloadTimer := 0;\r\n end;\r\nend;\r\n\r\n{$ENDIF}\r\n\r\n{ TCustomFrame }\r\n\r\nconstructor TCustomFrame.Create(AOwner: TComponent);\r\nbegin\r\n inherited Create(AOwner);\r\n FConstraints := TSizeConstraints.Create(Self);\r\n FPopupMenu := TPopupMenu.Create(Self);\r\n FTouchManager := TTouchManager.Create(Self);\r\nend;\r\n\r\nconstructor TCustomFrame.CreateNew(AOwner: TComponent);\r\nbegin\r\n Create(AOwner);\r\n BeforeLoadDFMValues;\r\n try\r\n LoadFromForm;\r\n finally\r\n AfterLoadDFMValues;\r\n end;\r\nend;\r\n\r\ndestructor TCustomFrame.Destroy;\r\nbegin\r\n FConstraints.Free;\r\n FPopupMenu.Free;\r\n FTouchManager.Free;\r\n inherited Destroy;\r\nend;\r\n\r\nprocedure TCustomFrame.LoadDFMValues;\r\nbegin\r\nend;\r\n\r\nprocedure TCustomFrame.LoadFromForm;\r\nbegin\r\n LoadDFMValues;\r\nend;\r\n\r\nprocedure TCustomFrame.SetConstraints(const AValue: TSizeConstraints);\r\nbegin\r\n FConstraints.Assign(AValue);\r\nend;\r\n\r\nprocedure TCustomFrame.SetPopupMenu(AValue: TPopupMenu);\r\nbegin\r\n FPopupMenu.Assign(AValue);\r\nend;\r\n\r\nprocedure TCustomFrame.SetTouchManager(AValue: TTouchManager);\r\nbegin\r\n FTouchManager.Assign(AValue);\r\nend;\r\n\r\n{ TCustomSizeConstraints }\r\n\r\nconstructor TCustomSizeConstraints.Create(AControl: TControl);\r\nbegin\r\n inherited Create;\r\n FControl := AControl;\r\nend;\r\n\r\nprocedure TCustomSizeConstraints.AssignTo(ADest: TPersistent);\r\nbegin\r\n if ADest is TCustomSizeConstraints then\r\n begin\r\n with TCustomSizeConstraints(ADest) do\r\n begin\r\n FMinHeight := Self.FMinHeight;\r\n FMaxHeight := Self.FMaxHeight;\r\n FMinWidth := Self.FMinWidth;\r\n FMaxWidth := Self.FMaxWidth;\r\n Change;\r\n end;\r\n end\r\n else\r\n inherited AssignTo(ADest);\r\nend;\r\n\r\nprocedure TCustomSizeConstraints.SetConstraints(AIndex: Integer; AValue: TConstraintSize);\r\nbegin\r\n case AIndex of\r\n 0:\r\n if AValue <> FMaxHeight then\r\n begin\r\n FMaxHeight := AValue;\r\n// if not FControl.FIScaling then\r\n begin\r\n if (AValue > 0) and (AValue < FMinHeight) then\r\n FMinHeight := AValue;\r\n Change;\r\n end;\r\n end;\r\n 1:\r\n if AValue <> FMaxWidth then\r\n begin\r\n FMaxWidth := AValue;\r\n// if not FControl.FIScaling then\r\n begin\r\n if (AValue > 0) and (AValue < FMinWidth) then\r\n FMinWidth := AValue;\r\n Change;\r\n end;\r\n end;\r\n 2:\r\n if AValue <> FMinHeight then\r\n begin\r\n FMinHeight := AValue;\r\n// if not FControl.FIScaling then\r\n begin\r\n if (FMaxHeight > 0) and (AValue > FMaxHeight) then\r\n FMaxHeight := AValue;\r\n Change;\r\n end;\r\n end;\r\n 3:\r\n if AValue <> FMinWidth then\r\n begin\r\n FMinWidth := AValue;\r\n // if not FControl.FIScaling then\r\n begin\r\n if (FMaxWidth > 0) and (AValue > FMaxWidth) then\r\n FMaxWidth := AValue;\r\n Change;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TCustomSizeConstraints.Change;\r\nbegin\r\n if Assigned(FOnChange) then\r\n FOnChange(Self);\r\nend;\r\n\r\n{ TDragDockObject }\r\n\r\nconstructor TDragDockObject.Create(AControl: TControl);\r\nbegin\r\n inherited Create;\r\n FBrush := TBrush.Create;\r\nend;\r\n\r\ndestructor TDragDockObject.Destroy;\r\nbegin\r\n FBrush.Free;\r\n inherited Destroy;\r\nend;\r\n\r\nprocedure TDragDockObject.Assign(Source: TDragObject);\r\nbegin\r\nend;\r\n\r\nprocedure TFramePreviewForm.LoadDFMValues;\r\nbegin\r\n inherited LoadDFMValues;\r\n\r\n FFrame.SetParentComponent(Self);\r\n FFrame.LoadFromForm;\r\n FFrame.BeforeLoadDFMValues;\r\n try\r\n FFrame.Name := 'Frame1';\r\n FFrame.Left := 0;\r\n FFrame.Top := 0;\r\n FFrame.Width := 640;\r\n FFrame.Height := 480;\r\n finally\r\n FFrame.AfterLoadDFMValues;\r\n end;\r\n\r\n Name := 'Form1';\r\n Left := 0;\r\n Top := 0;\r\n Width := 640;\r\n Height := 480;\r\nend;\r\n\r\n\r\ninitialization\r\nbegin\r\n HandShakeScript := TJSHTMLScriptElement(document.createElement('script'));\r\n HandShakeScript.id := 'HandShakeScript';\r\n HandShakeScript.type_ := 'text/javascript';\r\n HandShakeScript.innerHTML :=\r\n 'var IDE = null;'+#13#10+\r\n 'var TMSWEBCoreClientIdentifier = \"unknown\";'+#13#10+\r\n 'var TMSWEBCoreOAuthCallback = \"unknown\";'+#13#10+\r\n 'function HandShake(cid){'+#13#10+\r\n ' TMSWEBCoreClientIdentifier = cid;'+#13#10+\r\n '}';\r\n document.body.appendChild(HandShakeScript);\r\n\r\n Application := TApplication.Create(nil);\r\nend;\r\n\r\nend.\r\n\r\n\r\n","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright (c) 2018 - 2021 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.StdCtrls;\r\n\r\n{$DEFINE NOPP}\r\n\r\ninterface\r\n\r\nuses\r\n Classes, WEBLib.Controls, SysUtils, Web, WEBLib.Graphics, Types, WEBlib.WebTools,\r\n WEBLib.Forms, WEBLib.Menus;\r\n\r\ntype\r\n Single = Double;\r\n TEditCharCase = (wecLowerCase, wecNormal, wecMixedCase, wecUpperCase);\r\n TCheckBoxState = (cbChecked, cbGrayed, cbUnchecked);\r\n TDateTimeKind = (dtkDate, dtkTime);\r\n TEllipsisPosition = (epEndEllipsis, epNone, epPathEllipsis, epWordEllipsis);\r\n TTextLayout = (tlTop, tlCenter, tlBottom);\r\n TSysLinkType = (sltID, sltURL);\r\n\r\n TAutoCompletion = (acOff,acHonorificPrefix, aGivenName, acAdditionalName, acFamilyName, acHonorificSuffix,\r\n acNickName, acEmail, acUserName, acNewPassword, acCurrentPassword, acOrganizationTitle, acOrganization,\r\n acStreetAddress, acAddressLine1, acAddressLine2, acAddressLine3, acAddressLevel1, acAddressLevel2,\r\n acAddressLevel3, acAddressLevel4, acCountry, acCountryName, acPostalCode, acCCName, acCCGivenName,\r\n acCCAdditionalName, acCCFamilyName, acCCNumber, acExpiry, acExpiryMonth, acExpiryYear, acCSC,\r\n acType, acTransactionCurrency, acTransactionAmount, acLanguage, acBirthday, acBirthdayDay,\r\n acBirthDayMonth, acBirthDayYear, acSex, acTelephone, acTelephoneCountryCode, acTelephoneNational,\r\n acTelephoneAreaCode, acTelephoneLocal, acTelephoneExtension, acIMPP, acURL, acPhoto, acNone);\r\n\r\n TEditType = (weString, weFloat, weHex, weNumeric, weSignedFloat, weSignedNumeric, weSearch);\r\n\r\n THTMLType = (tLABELTAG, tSPAN, tDIV, tH1,tH2, tH3, tH4, tH5, tH6, tP);\r\n\r\n TLinkClickEvent = procedure(Sender: TObject; Link: string; LinkType: TSysLinkType) of object;\r\n\r\n TCustomLabel = class(TWebCustomControl)\r\n private\r\n FContent: TJSElement;\r\n FAutoSize: boolean;\r\n FEllipsisPosition: TEllipsisPosition;\r\n FWordWrap: Boolean;\r\n FAlignment: TAlignment;\r\n FLayout: TTextLayout;\r\n FTransparent: boolean;\r\n FHTMLType: THTMLType;\r\n FFocusControl: TWinControl;\r\n FShowAccelChar: boolean;\r\n FColor: TColor;\r\n FHasAccel: boolean;\r\n FHasHTML: boolean;\r\n FElementLabelClassName: TElementClassName;\r\n FOrigWidth: integer;\r\n FHTML: string;\r\n procedure SetLayout(const Value: TTextLayout);\r\n procedure SetAlignment(const Value: TAlignment);\r\n function GetContentHandle: TJSHTMLElement;\r\n procedure SetTransparent(const Value: boolean);\r\n procedure SetHTMLType(const Value: THTMLType);\r\n procedure SetColorEx(const Value: TColor);\r\n procedure SetElementLabelClassName(const Value: TElementClassName);\r\n procedure SetHTML(const Value: string);\r\n protected\r\n procedure SetWidth(AValue: Integer); override;\r\n function CreateElement: TJSElement; override;\r\n function CreateLabelElement: TJSElement; virtual;\r\n function GetDisplayText: string; virtual;\r\n function CanShowFocus: boolean; override;\r\n procedure SetParent(AValue: TControl); override;\r\n procedure BindElement; override;\r\n procedure Loaded; override;\r\n procedure UpdateAutoSize; virtual;\r\n procedure UpdateElementData; override;\r\n procedure UpdateElementVisual; override;\r\n procedure UpdateElementSize; override;\r\n procedure SetAutoSize(AValue: boolean);\r\n procedure SetCaption(const AValue: string); override;\r\n procedure SetEllipsisPosition(AValue: TEllipsisPosition);\r\n property ContentHandle: TJSHTMLElement read GetContentHandle;\r\n property Alignment: TAlignment read FAlignment write SetAlignment default taLeftJustify;\r\n property AutoSize: boolean read FAutoSize write SetAutoSize default true;\r\n property ElementLabelClassName: TElementClassName read FElementLabelClassName write SetElementLabelClassName;\r\n property EllipsisPosition: TEllipsisPosition read FEllipsisPosition write SetEllipsisPosition default epNone;\r\n property FocusControl: TWinControl read FFocusControl write FFocusControl;\r\n property Layout: TTextLayout read FLayout write SetLayout default tlTop;\r\n property ShowAccelChar: boolean read FShowAccelChar write FShowAccelChar default true;\r\n property Transparent: boolean read FTransparent write SetTransparent default true;\r\n property WordWrap: Boolean read FWordWrap write FWordWrap default false;\r\n property HTML: string read FHTML write SetHTML;\r\n property HTMLType: THTMLType read FHTMLType write SetHTMLType default tLABELTAG;\r\n property Color: TColor read FColor write SetColorEx default clWhite;\r\n\r\n function GetWidth: Integer; override;\r\n function GetHeight: Integer; override;\r\n public\r\n procedure CreateInitialize; override;\r\n end;\r\n\r\n TLabel = class(TCustomLabel)\r\n published\r\n property Align;\r\n property Alignment;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property AutoSize;\r\n property Caption;\r\n property ChildOrder;\r\n property Color;\r\n property DragMode;\r\n property EllipsisPosition;\r\n property Enabled;\r\n property ElementClassName;\r\n property ElementLabelClassName;\r\n property ElementID;\r\n property ElementFont;\r\n property ElementPosition;\r\n property FocusControl;\r\n property Font;\r\n property Height;\r\n property HeightPercent;\r\n property HeightStyle;\r\n property Hint;\r\n property HTML;\r\n property HTMLType;\r\n property Layout;\r\n property Left;\r\n property Margins;\r\n property ParentFont;\r\n property PopupMenu;\r\n property ShowAccelChar;\r\n property ShowHint;\r\n property TextDirection;\r\n property Top;\r\n property Transparent;\r\n property Visible;\r\n property Width;\r\n property WidthPercent;\r\n property WidthStyle;\r\n property WordWrap;\r\n property OnClick;\r\n property OnDblClick;\r\n property OnTouchStart;\r\n property OnTouchEnd;\r\n property OnTouchMove;\r\n property OnTouchCancel;\r\n property OnDragOver;\r\n property OnDragDrop;\r\n property OnStartDrag;\r\n property OnEndDrag;\r\n end;\r\n\r\n TWebLabel = class(TLabel);\r\n\r\n TCustomInput = class(TWebCustomControl)\r\n private\r\n protected\r\n function IsInputControl: Boolean; override;\r\n function GetInputType: string; virtual;\r\n function CreateElement: TJSElement; override;\r\n procedure UpdateElementVisual; override;\r\n procedure LoadState(AState: string); override;\r\n function SaveState: string; override;\r\n public\r\n procedure CreateInitialize; override;\r\n end;\r\n\r\n TCustomEdit = class(TCustomInput)\r\n private\r\n FCharCase: TEditCharCase;\r\n FMaxLength: integer;\r\n FReadOnly: Boolean;\r\n FText: string;\r\n FTextHint: string;\r\n FSelStart: Integer;\r\n FAlignment: TAlignment;\r\n FHideSelection: Boolean;\r\n FPasswordChar: Char;\r\n FOnChange: TNotifyEvent;\r\n FAutoSize: Boolean;\r\n FAutoSelect: Boolean;\r\n FSelLength: Integer;\r\n FNumeric: Boolean;\r\n FAutoCompletion: TAutoCompletion;\r\n FEditType: TEditType;\r\n FRequired: Boolean;\r\n FAutoFocus: boolean;\r\n FPattern: string;\r\n FHandlePastePtr: pointer;\r\n FHandleCutPtr: pointer;\r\n FHandleChangePtr: pointer;\r\n procedure SetAlignment(const Value: TAlignment);\r\n procedure SetHideSelection(const Value: Boolean);\r\n procedure SetAutoSelect(const Value: Boolean);\r\n procedure SetAutoSize(const Value: Boolean);\r\n function GetElementInputHandle: TJSHTMLInputElement;\r\n procedure SetSelLength(const Value: Integer);\r\n procedure SetSelStart(const Value: Integer);\r\n procedure SetPasswordChar(const Value: Char);\r\n procedure SetNumeric(const Value: Boolean);\r\n procedure SetAutoCompletion(const Value: TAutoCompletion);\r\n procedure SetAutoFocus(const Value: boolean);\r\n procedure SetRequired(const Value: Boolean);\r\n procedure SetPattern(const Value: string);\r\n function GetSelLength: Integer;\r\n function GetSelStart: Integer;\r\n procedure SetEditType(const Value: TEditType);\r\n function GetSelText: string;\r\n protected\r\n function DoHandlePaste(Event: TEventListenerEvent): Boolean; virtual;\r\n function DoHandleCut(Event: TEventListenerEvent): Boolean; virtual;\r\n function DoHandleChange(Event: TEventListenerEvent): Boolean;\r\n function IsCustomEditor: Boolean; virtual;\r\n procedure KeyPress(var Key: Char); override;\r\n function GetInputType: string; override;\r\n procedure PersistinHTML; override;\r\n function GetText: string;\r\n function GetDisplayText: string; virtual;\r\n function IsReadOnly: boolean; virtual;\r\n function Validate(AValue: string): boolean; virtual;\r\n procedure ClearMethodPointers; override;\r\n procedure GetMethodPointers; override;\r\n procedure BindEvents; override;\r\n procedure UnBindEvents; override;\r\n procedure UpdateElementData; override;\r\n procedure SetCharCase(AValue: TEditCharCase); virtual;\r\n procedure SetMaxLength(AValue: integer);\r\n procedure SetReadOnly(AValue: boolean);\r\n procedure SetText(AValue: string);\r\n procedure SetTextHint(AValue: string);\r\n function CanPaste(AValue: string): boolean; virtual;\r\n function CanCut: boolean; virtual;\r\n property Font;\r\n property AutoCompletion: TAutoCompletion read FAutoCompletion write SetAutoCompletion default acOff;\r\n property AutoFocus: boolean read FAutoFocus write SetAutoFocus;\r\n property Color;\r\n property BorderStyle;\r\n property HideSelection: Boolean read FHideSelection write SetHideSelection;\r\n property CharCase: TEditCharCase read FCharCase write SetCharCase default wecNormal;\r\n property MaxLength: integer read FMaxLength write SetMaxLength;\r\n property Numeric: Boolean read FNumeric write SetNumeric;\r\n property PasswordChar: Char read FPasswordChar write SetPasswordChar default #0;\r\n property Pattern: string read FPattern write SetPattern;\r\n property ReadOnly: Boolean read FReadOnly write SetReadOnly default false;\r\n property Required: Boolean read FRequired write SetRequired;\r\n property Text: string read GetText write SetText;\r\n property TextHint: string read FTextHint write SetTextHint;\r\n property AutoSize: Boolean read FAutoSize write SetAutoSize;\r\n property AutoSelect: Boolean read FAutoSelect write SetAutoSelect;\r\n property Alignment: TAlignment read FAlignment write SetAlignment;\r\n property OnChange: TNotifyEvent read FOnChange write FOnChange;\r\n property OnClick;\r\n property OnDblClick;\r\n public\r\n procedure CreateInitialize; override;\r\n property SelStart: Integer read GetSelStart write SetSelStart;\r\n property SelLength: Integer read GetSelLength write SetSelLength;\r\n procedure Clear;\r\n procedure ClearSelection;\r\n procedure Change; virtual;\r\n procedure SelectAll;\r\n procedure SetSelection(ASelStart, ASelLength: integer);\r\n property SelText: string read GetSelText;\r\n property EditType: TEditType read FEditType write SetEditType;\r\n property ElementInputHandle: TJSHTMLInputElement read GetElementInputHandle;\r\n end;\r\n\r\n TEdit = class(TCustomEdit)\r\n published\r\n property Alignment;\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property AutoCompletion;\r\n property AutoFocus;\r\n property AutoSize;\r\n property AutoSelect;\r\n property BiDiMode;\r\n property BorderStyle;\r\n property CharCase;\r\n property ChildOrder;\r\n property Color;\r\n property DragMode;\r\n property EditType;\r\n property ElementClassName;\r\n property ElementID;\r\n property ElementFont;\r\n property ElementPosition;\r\n property Enabled;\r\n property Font;\r\n property Height;\r\n property HeightPercent;\r\n property HeightStyle;\r\n property Hint;\r\n property HideSelection;\r\n property Left;\r\n property ParentFont;\r\n property PasswordChar;\r\n property Pattern;\r\n property Margins;\r\n property MaxLength;\r\n property PopupMenu;\r\n property ReadOnly;\r\n property Required;\r\n property ShowFocus;\r\n property ShowHint;\r\n property TabOrder;\r\n property TabStop;\r\n property Text;\r\n property TextDirection;\r\n property TextHint;\r\n property Top;\r\n property Visible;\r\n property Width;\r\n property WidthPercent;\r\n property WidthStyle;\r\n property OnChange;\r\n property OnClick;\r\n property OnDblClick;\r\n property OnKeyDown;\r\n property OnKeyPress;\r\n property OnKeyUp;\r\n property OnMouseDown;\r\n property OnMouseUp;\r\n property OnMouseMove;\r\n property OnMouseLeave;\r\n property OnMouseEnter;\r\n property OnEnter;\r\n property OnExit;\r\n property OnDragDrop;\r\n property OnDragOver;\r\n property OnEndDrag;\r\n property OnStartDrag;\r\n end;\r\n\r\n TWebEdit = class(TEdit);\r\n\r\n TSpinEdit = class(TCustomInput)\r\n private\r\n FIncrement: integer;\r\n FMaxValue: integer;\r\n FMinValue: integer;\r\n FValue: integer;\r\n FAutoSize: Boolean;\r\n FOnChange: TNotifyEvent;\r\n FReadOnly: boolean;\r\n FHandleChangePtr: pointer;\r\n function GetText: string;\r\n procedure SetText(const Value: string);\r\n function GetElementInputHandle: TJSHTMLInputElement;\r\n procedure SetReadOnly(const Value: boolean);\r\n protected\r\n procedure KeyPress(var Key: Char); override;\r\n procedure PersistinHTML; override;\r\n function GetInputType: string; override;\r\n procedure UpdateElementData; override;\r\n function GetValue: integer;\r\n procedure SetIncrement(AValue: integer);\r\n procedure SetMaxValue(AValue: integer);\r\n procedure SetMinValue(AValue: integer);\r\n procedure SetValue(AValue: integer);\r\n function DoHandleChange(Event: TEventListenerEvent): Boolean;\r\n function IsReadOnly: boolean; virtual;\r\n function GetDisplayText: string; virtual;\r\n procedure BindEvents; override;\r\n procedure UnBindEvents; override;\r\n procedure Change; virtual;\r\n procedure ClearMethodPointers; override;\r\n procedure GetMethodPointers; override;\r\n public\r\n procedure CreateInitialize; override;\r\n property ElementInputHandle: TJSHTMLInputElement read GetElementInputHandle;\r\n property Text: string read GetText write SetText;\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property AutoSize: Boolean read FAutoSize write FAutoSize;\r\n property BiDiMode;\r\n property BorderStyle;\r\n property ChildOrder;\r\n property Color;\r\n property DragMode;\r\n property ElementClassName;\r\n property ElementID;\r\n property ElementFont;\r\n property ElementPosition;\r\n property Enabled;\r\n property Font;\r\n property Height;\r\n property HeightPercent;\r\n property HeightStyle;\r\n property Hint;\r\n property Increment: integer read FIncrement write SetIncrement;\r\n property Left;\r\n property Margins;\r\n property MaxValue: integer read FMaxValue write SetMaxValue default 100;\r\n property MinValue: integer read FMinValue write SetMinValue default 0;\r\n property ParentFont;\r\n property ReadOnly: boolean read FReadOnly write SetReadOnly default false;\r\n property Role;\r\n property ShowFocus;\r\n property ShowHint;\r\n property TabStop;\r\n property TabOrder;\r\n property TextDirection;\r\n property Value: integer read GetValue write SetValue;\r\n property Visible;\r\n property Width;\r\n property WidthPercent;\r\n property WidthStyle;\r\n property OnChange: TNotifyEvent read FOnChange write FOnChange;\r\n property OnClick;\r\n property OnDblClick;\r\n property OnKeyDown;\r\n property OnKeyPress;\r\n property OnKeyUp;\r\n property OnMouseDown;\r\n property OnMouseUp;\r\n property OnMouseMove;\r\n property OnMouseLeave;\r\n property OnMouseEnter;\r\n property OnEnter;\r\n property OnExit;\r\n property OnDragDrop;\r\n property OnDragOver;\r\n property OnEndDrag;\r\n property OnStartDrag;\r\n end;\r\n\r\n TWebSpinEdit = class(TSpinEdit);\r\n\r\n TDateTimePicker = class(TCustomInput)\r\n private\r\n FDate: TDate;\r\n FTime: TTime;\r\n FKind: TDateTimeKind;\r\n FOnChange: TNotifyEvent;\r\n FReadOnly: Boolean;\r\n FElementCheck: TJSHTMLElement;\r\n FElementPicker: TJSHTMLElement;\r\n FShowCheckBox: boolean;\r\n FClickPtr: pointer;\r\n FHandleChangePtr: pointer;\r\n FFocusPtr: pointer;\r\n FBlurPtr: pointer;\r\n FChecked: boolean;\r\n FShowSeconds: boolean;\r\n procedure SetDate(AValue: TDate);\r\n function GetDate: TDate;\r\n procedure SetTime(AValue: TTime);\r\n function GetTime: TTime;\r\n procedure SetKind(AValue: TDateTimeKind);\r\n procedure SetText(const Value: String);\r\n function GetText: String;\r\n procedure SetReadOnly(const Value: boolean);\r\n procedure SetShowCheckBox(const Value: boolean);\r\n procedure SetChecked(const Value: boolean);\r\n function GetDateTime: TDateTime;\r\n procedure SetDateTime(const Value: TDateTime);\r\n procedure SetShowSeconds(const Value: boolean);\r\n protected\r\n function DoCheckClick(Event: TEventListenerEvent): Boolean;\r\n function DoPickerFocus(Event: TEventListenerEvent): Boolean;\r\n function DoPickerBlur(Event: TEventListenerEvent): Boolean;\r\n function DoHandleChange(Event: TEventListenerEvent): Boolean;\r\n procedure BindEvents; override;\r\n procedure UnBindEvents; override;\r\n procedure UpdateElementData; override;\r\n procedure UpdateElementVisual; override;\r\n function CreateElement: TJSElement; override;\r\n function GetInputType: string; override;\r\n procedure Change; virtual;\r\n function IsReadOnly: boolean; virtual;\r\n procedure ClearMethodPointers; override;\r\n procedure GetMethodPointers; override;\r\n function GetElementPicker: TJSHTMLElement;\r\n public\r\n procedure CreateInitialize; override;\r\n procedure Clear;\r\n property DateTime: TDateTime read GetDateTime write SetDateTime;\r\n procedure SetFocus; override;\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property BorderStyle;\r\n property Checked: boolean read FChecked write SetChecked default false;\r\n property ChildOrder;\r\n property Color;\r\n property Date: TDate read GetDate write SetDate;\r\n property DragMode;\r\n property ElementClassName;\r\n property ElementID;\r\n property ElementFont;\r\n property ElementPosition;\r\n property Font;\r\n property Height;\r\n property HeightPercent;\r\n property HeightStyle;\r\n property Hint;\r\n property Kind: TDateTimeKind read FKind write SetKind;\r\n property Left;\r\n property Margins;\r\n property ParentFont;\r\n property ReadOnly: boolean read FReadOnly write SetReadOnly default false;\r\n property Role;\r\n property ShowCheckBox: boolean read FShowCheckBox write SetShowCheckBox default false;\r\n property ShowFocus;\r\n property ShowHint;\r\n property ShowSeconds: boolean read FShowSeconds write SetShowSeconds default true;\r\n property TabStop;\r\n property TabOrder;\r\n property Text: String read GetText write SetText;\r\n property TextDirection;\r\n property Time: TTime read GetTime write SetTime;\r\n property Top;\r\n property Visible;\r\n property Width;\r\n property WidthPercent;\r\n property WidthStyle;\r\n property OnClick;\r\n property OnChange: TNotifyEvent read FOnChange write FOnChange;\r\n property OnDblClick;\r\n property OnKeyDown;\r\n property OnKeyPress;\r\n property OnKeyUp;\r\n property OnMouseDown;\r\n property OnMouseUp;\r\n property OnMouseMove;\r\n property OnMouseLeave;\r\n property OnMouseEnter;\r\n property OnEnter;\r\n property OnExit;\r\n property OnDragDrop;\r\n property OnDragOver;\r\n property OnEndDrag;\r\n property OnStartDrag;\r\n end;\r\n\r\n TWebDateTimePicker = class(TDateTimePicker);\r\n\r\n TButton = class(TWebCustomControl)\r\n private\r\n FModalResult: TModalResult;\r\n FDefault: Boolean;\r\n FCancel: Boolean;\r\n FButtonType: string;\r\n procedure SetButtonType(const Value: string);\r\n procedure SetDefault(const Value: Boolean);\r\n protected\r\n function CreateElement: TJSElement; override;\r\n procedure SetCaption(const AValue: string); override;\r\n procedure UpdateElementData; override;\r\n procedure UpdateElementVisual; override;\r\n public\r\n procedure CreateInitialize; override;\r\n property ModalResult: TModalResult read FModalResult write FModalResult;\r\n property Cancel: Boolean read FCancel write FCancel;\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property BiDiMode;\r\n property BorderStyle;\r\n property ButtonType: string read FButtonType write SetButtonType;\r\n property Caption;\r\n property ChildOrder;\r\n property Color;\r\n property Default: Boolean read FDefault write SetDefault;\r\n property DragMode;\r\n property ElementClassName;\r\n property ElementID;\r\n property ElementFont;\r\n property ElementPosition;\r\n property Enabled;\r\n property Font;\r\n property Height;\r\n property HeightPercent;\r\n property HeightStyle;\r\n property Hint;\r\n property Left;\r\n property Margins;\r\n property PopupMenu;\r\n property Role;\r\n property ParentFont;\r\n property ShowHint;\r\n property TabOrder;\r\n property TabStop;\r\n property TextDirection;\r\n property Top;\r\n property Visible;\r\n property Width;\r\n property WidthPercent;\r\n property WidthStyle;\r\n property OnClick;\r\n property OnKeyDown;\r\n property OnKeyPress;\r\n property OnKeyUp;\r\n property OnMouseDown;\r\n property OnMouseUp;\r\n property OnMouseMove;\r\n property OnMouseLeave;\r\n property OnMouseEnter;\r\n property OnEnter;\r\n property OnExit;\r\n property OnDragDrop;\r\n property OnDragOver;\r\n property OnEndDrag;\r\n property OnStartDrag;\r\n end;\r\n\r\n TWebButton = class(TButton);\r\n\r\n TCheckBox = class(TWebCustomControl)\r\n private\r\n FChecked: boolean;\r\n FState: TCheckBoxState;\r\n FElementButtonClassName: TElementClassName;\r\n FElementLabelClassName: TElementClassName;\r\n FOnCheckClick: TNotifyEvent;\r\n protected\r\n procedure Loaded; override;\r\n procedure UpdateElementData; override;\r\n procedure UpdateElementSize; override;\r\n procedure UpdateElementVisual; override;\r\n procedure PersistinHTML; override;\r\n function CreateElement: TJSElement; override;\r\n procedure SetChecked(AValue: boolean);\r\n function GetChecked: boolean;\r\n procedure SetState(AValue: TCheckBoxState);\r\n function GetState: TCheckBoxState;\r\n procedure SetCaption(const AValue: string); override;\r\n procedure SetEnabled(Value: boolean); override;\r\n function HandleLabelClick(Event: TJSMouseEvent): Boolean; virtual;\r\n function HandleCheckClick(Event: TJSMouseEvent): Boolean; virtual;\r\n procedure Click; override;\r\n procedure DoCheckClick; virtual;\r\n function GetCheckElement: TJSHTMLElement;\r\n procedure KeyPress(var ch: char); override;\r\n procedure LoadState(AState: string); override;\r\n function SaveState: string; override;\r\n property OnCheckClick: TNotifyEvent read FOnCheckClick write FOnCheckClick;\r\n public\r\n procedure CreateInitialize; override;\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property Caption;\r\n property Checked: boolean read GetChecked write SetChecked default False;\r\n property ChildOrder;\r\n property Color default clNone;\r\n property DragMode;\r\n property ElementClassName;\r\n property ElementButtonClassName: TElementClassName read FElementButtonClassName write FElementButtonClassName;\r\n property ElementLabelClassName: TElementClassName read FElementLabelClassName write FElementLabelClassName;\r\n property ElementID;\r\n property ElementFont;\r\n property ElementPosition;\r\n property Enabled;\r\n property Font;\r\n property Height;\r\n property HeightPercent;\r\n property HeightStyle;\r\n property Hint;\r\n property Left;\r\n property Margins;\r\n property ParentFont;\r\n property PopupMenu;\r\n property Role;\r\n property ShowFocus;\r\n property ShowHint;\r\n property State: TCheckBoxState read GetState write SetState;\r\n property TabOrder;\r\n property TabStop;\r\n property Top;\r\n property Visible;\r\n property Width;\r\n property WidthPercent;\r\n property WidthStyle;\r\n property OnClick;\r\n property OnKeyDown;\r\n property OnKeyPress;\r\n property OnKeyUp;\r\n property OnMouseDown;\r\n property OnMouseUp;\r\n property OnMouseMove;\r\n property OnMouseLeave;\r\n property OnMouseEnter;\r\n property OnEnter;\r\n property OnExit;\r\n property OnDragDrop;\r\n property OnDragOver;\r\n property OnEndDrag;\r\n property OnStartDrag;\r\n end;\r\n\r\n TWebCheckBox = class(TCheckBox);\r\n\r\n TRadioButton = class(TWebCustomControl)\r\n private\r\n FChecked: boolean;\r\n FGroupName: string;\r\n FElementButtonClassName: TElementClassName;\r\n FElementLabelClassName: TElementClassName;\r\n protected\r\n procedure PersistInHTML; override;\r\n function CreateElement: TJSElement; override;\r\n procedure SetChecked(AValue: boolean);\r\n function GetChecked: boolean;\r\n procedure SetEnabled(Value: boolean); override;\r\n procedure SetCaption(const AValue: string); override;\r\n procedure SetGroupName(AValue: string);\r\n function HandleLabelClick(Event: TJSMouseEvent): Boolean; virtual;\r\n function HandleRadioClick(Event: TJSMouseEvent): Boolean; virtual;\r\n procedure UpdateElementSize; override;\r\n procedure UpdateElementData; override;\r\n procedure UpdateElementVisual; override;\r\n function GetRadioElement: TJSHTMLElement;\r\n procedure Keypress(var ch: Char); override;\r\n procedure LoadState(AState: string); override;\r\n function SaveState: string; override;\r\n public\r\n procedure CreateInitialize; override;\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property Caption;\r\n property Checked: boolean read GetChecked write SetChecked default false;\r\n property ChildOrder;\r\n property Color default clNone;\r\n property DragMode;\r\n property ElementClassName;\r\n property ElementButtonClassName: TElementClassName read FElementButtonClassName write FElementButtonClassName;\r\n property ElementLabelClassName: TElementClassName read FElementLabelClassName write FElementLabelClassName;\r\n property ElementID;\r\n property ElementFont;\r\n property ElementPosition;\r\n property Enabled;\r\n property Font;\r\n property GroupName: string read FGroupName write SetGroupName;\r\n property Height;\r\n property HeightPercent;\r\n property HeightStyle;\r\n property Hint;\r\n property Left;\r\n property ParentFont;\r\n property PopupMenu;\r\n property Role;\r\n property ShowFocus;\r\n property ShowHint;\r\n property TabOrder;\r\n property TabStop;\r\n property Visible;\r\n property Width;\r\n property WidthPercent;\r\n property WidthStyle;\r\n property OnClick;\r\n property OnDblClick;\r\n property OnKeyDown;\r\n property OnKeyPress;\r\n property OnKeyUp;\r\n property OnMouseDown;\r\n property OnMouseUp;\r\n property OnMouseMove;\r\n property OnMouseLeave;\r\n property OnMouseEnter;\r\n property OnEnter;\r\n property OnExit;\r\n property OnDragDrop;\r\n property OnDragOver;\r\n property OnEndDrag;\r\n property OnStartDrag;\r\n end;\r\n\r\n TWebRadioButton = class(TRadioButton);\r\n\r\n TListBox = class(TWebCustomControl)\r\n private\r\n FItems: TStrings;\r\n FItemIndex: integer;\r\n FMultiSelect: boolean;\r\n FSelected: TList;\r\n FItemHeight: Integer;\r\n FSorted: Boolean;\r\n FOnChange: TNotifyEvent;\r\n FHandleChangePtr: pointer;\r\n procedure SetItemHeight(const Value: Integer);\r\n procedure SetSorted(const Value: Boolean);\r\n function GetCount: Integer;\r\n function GetElementSelectHandle: TJSHTMLSelectElement;\r\n function GetSelCount: integer;\r\n protected\r\n function DoHandleChange(Event: TEventListenerEvent): Boolean;\r\n procedure DoItemsChange(Sender: TObject);\r\n procedure DoUpdateList; virtual;\r\n procedure PersistinHTML; override;\r\n function GetItemIndex: integer;\r\n function CreateElement: TJSElement; override;\r\n function GetSelected(AIndex: integer): boolean;\r\n procedure SetSelected(AIndex: Integer; AValue: boolean);\r\n procedure SetItems(AItems: TStrings);\r\n procedure SetItemIndex(AIndex: integer);\r\n procedure SetMultiSelect(AValue: boolean);\r\n procedure Loaded; override;\r\n procedure UpdateElementData; override;\r\n procedure UpdateElementVisual; override;\r\n procedure UpdateParent; override;\r\n procedure BindEvents; override;\r\n procedure UnBindEvents; override;\r\n procedure Change; virtual;\r\n function SaveState: string; override;\r\n procedure LoadState(AState: string); override;\r\n procedure EnableDrag; override;\r\n procedure DisableDrag; override;\r\n procedure ClearMethodPointers; override;\r\n procedure GetMethodPointers; override;\r\n public\r\n procedure CreateInitialize; override;\r\n destructor Destroy; override;\r\n procedure EndUpdate; override;\r\n procedure ClearSelection;\r\n procedure SelectAll;\r\n property Sorted: Boolean read FSorted write SetSorted;\r\n property Count: Integer read GetCount;\r\n property SelCount: integer read GetSelCount;\r\n property ElementSelectHandle: TJSHTMLSelectElement read GetElementSelectHandle;\r\n procedure AddItem(Item: string; AObject: TObject);\r\n property Selected[i: Integer]: boolean read GetSelected write SetSelected;\r\n procedure Clear;\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property BiDiMode;\r\n property BorderStyle;\r\n property ChildOrder;\r\n property Color;\r\n property DragMode;\r\n property Font;\r\n property ElementClassName;\r\n property ElementID;\r\n property ElementFont;\r\n property ElementPosition;\r\n property Enabled;\r\n property Height;\r\n property HeightPercent;\r\n property HeightStyle;\r\n property Hint;\r\n property ItemHeight: Integer read FItemHeight write SetItemHeight;\r\n property ItemIndex: integer read GetItemIndex write SetItemIndex default -1;\r\n property Items: TStrings read FItems write SetItems;\r\n property Left;\r\n property MultiSelect: boolean read FMultiSelect write SetMultiSelect;\r\n property ParentColor;\r\n property ParentFont;\r\n property PopupMenu;\r\n property Role;\r\n property ShowFocus;\r\n property ShowHint;\r\n property TabOrder;\r\n property TabStop;\r\n property TextDirection;\r\n property Top;\r\n property Visible;\r\n property Width;\r\n property WidthPercent;\r\n property WidthStyle;\r\n property OnChange: TNotifyEvent read FOnChange write FOnChange;\r\n property OnClick;\r\n property OnDblClick;\r\n property OnKeyDown;\r\n property OnKeyPress;\r\n property OnKeyUp;\r\n property OnMouseDown;\r\n property OnMouseUp;\r\n property OnMouseMove;\r\n property OnMouseLeave;\r\n property OnMouseEnter;\r\n property OnMouseWheel;\r\n property OnEnter;\r\n property OnExit;\r\n property OnDragDrop;\r\n property OnDragOver;\r\n property OnEndDrag;\r\n property OnStartDrag;\r\n end;\r\n\r\n TWebListBox = class(TListBox);\r\n\r\n TComboBoxStyle = (csDropDownList, csDropDown);\r\n\r\n TCustomComboBox = class(TWebCustomControl)\r\n private\r\n FItems: TStrings;\r\n FItemIndex: integer;\r\n FStyle: TComboBoxStyle;\r\n FDroppedDown: Boolean;\r\n FOnChange: TNotifyEvent;\r\n FTextHint: string;\r\n FListName: string;\r\n FText: string;\r\n FHandleChangePtr: pointer;\r\n FHandleInputPtr: pointer;\r\n function GetText: string;\r\n procedure SetText(const Value: string);\r\n procedure SetStyle(const Value: TComboBoxStyle);\r\n procedure SetDroppedDown(const Value: Boolean);\r\n function GetElementSelectHandle: TJSHTMLSelectElement;\r\n procedure SetTextHint(const Value: string);\r\n protected\r\n function DoHandleChange(Event: TEventListenerEvent): Boolean; virtual;\r\n function DoHandleInput(Event: TEventListenerEvent): Boolean; virtual;\r\n procedure DoItemsChange(Sender: TObject);\r\n procedure ClearMethodPointers; override;\r\n procedure GetMethodPointers; override;\r\n procedure AddTextHint; virtual;\r\n procedure DoUpdateList; virtual;\r\n procedure LoadState(AState: string); override;\r\n function SaveState: string; override;\r\n function GetItemIndex: integer;\r\n function CreateElement: TJSElement; override;\r\n procedure BindEvents; override;\r\n procedure UnBindEvents; override;\r\n procedure UpdateElementData; override;\r\n procedure UpdateParent; override;\r\n procedure SetItems(AItems: TStrings);\r\n procedure SetItemIndex(AIndex: integer);\r\n procedure Loaded; override;\r\n procedure Change; virtual;\r\n procedure PersistinHTML; override;\r\n property Items: TStrings read FItems write SetItems;\r\n property Align;\r\n property AlignWithMargins;\r\n property BiDiMode;\r\n property Color;\r\n property ElementClassName;\r\n property ElementID;\r\n property ElementFont;\r\n property ElementPosition;\r\n property Enabled;\r\n property Font;\r\n property Height;\r\n property Hint;\r\n property ItemIndex: integer read GetItemIndex write SetItemIndex default -1;\r\n property Left;\r\n property PopupMenu;\r\n property ShowHint;\r\n property TabOrder;\r\n property TabStop;\r\n property Text: string read GetText write SetText;\r\n property TextHint: string read FTextHint write SetTextHint;\r\n property Top;\r\n property Visible;\r\n property Width;\r\n property OnChange: TNotifyEvent read FOnChange write FOnChange;\r\n property OnClick;\r\n property OnDblClick;\r\n property OnKeyDown;\r\n property OnKeyPress;\r\n property OnKeyUp;\r\n property OnMouseDown;\r\n property OnMouseUp;\r\n property OnMouseMove;\r\n property OnMouseLeave;\r\n property OnMouseEnter;\r\n property OnMouseWheel;\r\n property OnEnter;\r\n property OnExit;\r\n public\r\n procedure CreateInitialize; override;\r\n destructor Destroy; override;\r\n procedure Clear;\r\n procedure AddItem(Item: string; AObject: TObject);\r\n property ElementSelectHandle: TJSHTMLSelectElement read GetElementSelectHandle;\r\n property Style: TComboBoxStyle read FStyle write SetStyle;\r\n property DroppedDown: Boolean read FDroppedDown write SetDroppedDown;\r\n end;\r\n\r\n TComboBox = class(TCustomComboBox)\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property BiDiMode;\r\n property ChildOrder;\r\n property Color;\r\n property DragMode;\r\n property ElementClassName;\r\n property ElementID;\r\n property ElementFont;\r\n property ElementPosition;\r\n property Enabled;\r\n property Font;\r\n property Height;\r\n property HeightPercent;\r\n property HeightStyle;\r\n property Hint;\r\n property ItemIndex;\r\n property Items;\r\n property Left;\r\n property ParentFont;\r\n property Role;\r\n property ShowFocus;\r\n property ShowHint;\r\n property Style;\r\n property TabOrder;\r\n property TabStop;\r\n property Text;\r\n property TextDirection;\r\n property TextHint;\r\n property Top;\r\n property Visible;\r\n property Width;\r\n property WidthPercent;\r\n property WidthStyle;\r\n property OnChange;\r\n property OnClick;\r\n property OnDblClick;\r\n property OnKeyDown;\r\n property OnKeyPress;\r\n property OnKeyUp;\r\n property OnMouseDown;\r\n property OnMouseUp;\r\n property OnMouseMove;\r\n property OnMouseLeave;\r\n property OnMouseEnter;\r\n property OnEnter;\r\n property OnExit;\r\n property OnDragDrop;\r\n property OnDragOver;\r\n property OnEndDrag;\r\n property OnStartDrag;\r\n end;\r\n\r\n TWebComboBox = class(TComboBox);\r\n\r\n TFontPicker = class(TCustomComboBox)\r\n public\r\n procedure CreateInitialize; override;\r\n property Items;\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Color;\r\n property ElementClassName;\r\n property ElementID;\r\n property ElementFont;\r\n property ElementPosition;\r\n property Enabled;\r\n property Font;\r\n property Height;\r\n property Hint;\r\n property ItemIndex;\r\n property Left;\r\n property ShowHint;\r\n property TabOrder;\r\n property TabStop;\r\n property Text;\r\n property Top;\r\n property Visible;\r\n property Width;\r\n property WidthPercent;\r\n property OnChange;\r\n property OnClick;\r\n property OnDblClick;\r\n property OnKeyDown;\r\n property OnKeyPress;\r\n property OnKeyUp;\r\n property OnMouseDown;\r\n property OnMouseUp;\r\n property OnMouseMove;\r\n property OnMouseLeave;\r\n property OnMouseEnter;\r\n property OnEnter;\r\n property OnExit;\r\n end;\r\n\r\n TWebFontPicker = class(TFontPicker);\r\n\r\n TFontSizePickerMode = (fmPointSize, fmRelativeSize);\r\n\r\n TFontSizePicker = class(TCustomComboBox)\r\n private\r\n FPickerMode: TFontSizePickerMode;\r\n procedure SetPickerMode(const AValue: TFontSizePickerMode);\r\n protected\r\n procedure Init; virtual;\r\n public\r\n procedure CreateInitialize; override;\r\n property Items;\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Color;\r\n property ElementClassName;\r\n property ElementID;\r\n property ElementFont;\r\n property ElementPosition;\r\n property Enabled;\r\n property Font;\r\n property Height;\r\n property HeightPercent;\r\n property HeightStyle;\r\n property Hint;\r\n property ItemIndex;\r\n property Left;\r\n property PickerMode: TFontSizePickerMode read FPickerMode write SetPickerMode;\r\n property ShowHint;\r\n property TabOrder;\r\n property TabStop;\r\n property Text;\r\n property Top;\r\n property Visible;\r\n property Width;\r\n property WidthPercent;\r\n property WidthStyle;\r\n property OnChange;\r\n property OnClick;\r\n property OnDblClick;\r\n property OnKeyDown;\r\n property OnKeyPress;\r\n property OnKeyUp;\r\n property OnMouseDown;\r\n property OnMouseUp;\r\n property OnMouseMove;\r\n property OnMouseLeave;\r\n property OnMouseEnter;\r\n property OnEnter;\r\n property OnExit;\r\n end;\r\n\r\n TWebFontSizePicker = class(TFontSizePicker);\r\n\r\n TCaretPosition = TPoint;\r\n\r\n TCustomMemo = class(TWebCustomControl)\r\n private\r\n FWordWrap: Boolean;\r\n FBlockChange: Boolean;\r\n FLines: TStrings;\r\n FSelStart: Integer;\r\n FSelLength: Integer;\r\n FCaretPosition: TCaretPosition;\r\n FAutoSize: Boolean;\r\n FOnChange: TNotifyEvent;\r\n FReadOnly: boolean;\r\n FTextHint: string;\r\n FHandleChangePtr: pointer;\r\n FHandlePastePtr: pointer;\r\n FHandleCutPtr: pointer;\r\n FHandleInputPtr: pointer;\r\n FWantTabs: boolean;\r\n FAutoCompletion: TAutoCompletion;\r\n FSpellCheck: boolean;\r\n function GetText: String;\r\n procedure SetText(const Value: String);\r\n procedure SetSelLength(const Value: Integer);\r\n procedure SetSelStart(const Value: Integer);\r\n procedure SetAutoSize(const Value: Boolean);\r\n function GetElementInputHandle: TJSHTMLInputElement;\r\n procedure SetReadOnly(const Value: boolean);\r\n function GetSelLength: Integer;\r\n function GetSelStart: Integer;\r\n procedure SetTextHint(const Value: string);\r\n procedure SetAutoCompletion(const Value: TAutoCompletion);\r\n procedure SetSpellCheck(const Value: boolean);\r\n protected\r\n function IsInputControl: Boolean; override;\r\n function HandleDoKeyDown(Event: TJSKeyBoardEvent): Boolean; override;\r\n function CreateElement: TJSElement; override;\r\n function DoHandlePaste(Event: TEventListenerEvent): Boolean; virtual;\r\n function DoHandleCut(Event: TEventListenerEvent): Boolean; virtual;\r\n function DoHandleInput(Event: TEventListenerEvent): Boolean; virtual;\r\n function DoHandleChange(Event: TEventListenerEvent): Boolean; virtual;\r\n function IsReadOnly: boolean; virtual;\r\n procedure PersistinHTML; override;\r\n function GetDisplayText: string; virtual;\r\n procedure BindEvents; override;\r\n procedure UnBindEvents; override;\r\n procedure UpdateElementData; override;\r\n procedure UpdateElementVisual; override;\r\n procedure SetLines(ALines: TStrings);\r\n procedure ClearMethodPointers; override;\r\n procedure GetMethodPointers; override;\r\n procedure DoLinesChange(Sender: TObject);\r\n function CanPaste(AValue: string): boolean; virtual;\r\n function CanCut: boolean; virtual;\r\n function SaveState: string; override;\r\n procedure LoadState(AState: string); override;\r\n property Font;\r\n property Color;\r\n property BorderStyle;\r\n property AutoSize: Boolean read FAutoSize write SetAutoSize;\r\n property Lines: TStrings read FLines write SetLines;\r\n property ReadOnly: boolean read FReadOnly write SetReadOnly;\r\n property OnClick;\r\n property OnDblClick;\r\n property OnChange: TNotifyEvent read FOnChange write FOnChange;\r\n procedure Change; virtual;\r\n public\r\n procedure CreateInitialize; override;\r\n destructor Destroy; override;\r\n procedure Clear;\r\n property AutoCompletion: TAutoCompletion read FAutoCompletion write SetAutoCompletion default acOff;\r\n property Text: String read GetText write SetText;\r\n property CaretPosition: TCaretPosition read FCaretPosition write FCaretPosition;\r\n property ElementInputHandle: TJSHTMLInputElement read GetElementInputHandle;\r\n property SelStart: Integer read GetSelStart write SetSelStart;\r\n property SelLength: Integer read GetSelLength write SetSelLength;\r\n property Spellcheck: boolean read FSpellCheck write SetSpellCheck default true;\r\n property TextHint: string read FTextHint write SetTextHint;\r\n property WantTabs: boolean read FWantTabs write FWantTabs default false;\r\n property WordWrap: Boolean read FWordWrap write FWordWrap default true;\r\n end;\r\n\r\n TMemo = class(TCustomMemo)\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property AutoSize;\r\n property BiDiMode;\r\n property BorderStyle;\r\n property ChildOrder;\r\n property Color;\r\n property DragMode;\r\n property ElementClassName;\r\n property ElementID;\r\n property ElementFont;\r\n property ElementPosition;\r\n property Enabled;\r\n property Font;\r\n property Height;\r\n property HeightPercent;\r\n property HeightStyle;\r\n property Hint;\r\n property Left;\r\n property Lines;\r\n property Margins;\r\n property ParentColor;\r\n property ParentFont;\r\n property PopupMenu;\r\n property ReadOnly;\r\n property Role;\r\n property SelStart;\r\n property SelLength;\r\n property ShowFocus;\r\n property ShowHint;\r\n property SpellCheck;\r\n property TabOrder;\r\n property TabStop;\r\n property TextDirection;\r\n property Top;\r\n property Visible;\r\n property Width;\r\n property WidthPercent;\r\n property WidthStyle;\r\n property OnChange;\r\n property OnClick;\r\n property OnDblClick;\r\n property OnKeyDown;\r\n property OnKeyPress;\r\n property OnKeyUp;\r\n property OnMouseDown;\r\n property OnMouseUp;\r\n property OnMouseMove;\r\n property OnMouseLeave;\r\n property OnMouseEnter;\r\n property OnMouseWheel;\r\n property OnEnter;\r\n property OnExit;\r\n property OnDragDrop;\r\n property OnDragOver;\r\n property OnEndDrag;\r\n property OnStartDrag;\r\n end;\r\n\r\n TWebMemo = class(TMemo);\r\n\r\n TControlGroup = class(TWebCustomControl)\r\n private\r\n FControls: TList;\r\n FOldCount: integer;\r\n FColumns: integer;\r\n FItems: TStrings;\r\n FOnChange: TNotifyEvent;\r\n FElementButtonClassName: TElementClassName;\r\n FElementLabelClassName: TElementClassName;\r\n FElementGroupClassName: TElementClassName;\r\n FControlPosition: TElementPosition;\r\n procedure SetControlPosition(const Value: TElementPosition);\r\n protected\r\n function CreateElement: TJSElement; override;\r\n function DoHandleChange(Event: TEventListenerEvent): Boolean;\r\n procedure DoHandleClick(AControl: TCustomControl); virtual;\r\n procedure DoItemsChange(Sender: TObject);\r\n procedure DoControlClick(Sender: TObject);\r\n procedure SetCaption(const AValue: string); override;\r\n procedure SetColumns(AValue: integer);\r\n procedure SetItems(AItems: TStrings);\r\n procedure DoUpdateList; virtual;\r\n procedure Change; virtual;\r\n procedure Loaded; override;\r\n function CreateGroupControl(ALeft, ATop, AIndex: integer; ACaption: string; APosition: TElementPosition; AState, AEnabled: boolean): TCustomControl; virtual;\r\n function GetGroupControlState(AIndex: integer): boolean; virtual;\r\n function GetGroupControl(AIndex: integer): TCustomControl;\r\n public\r\n procedure CreateInitialize; override;\r\n destructor Destroy; override;\r\n procedure EndUpdate; override;\r\n procedure SetHeight(AValue: Integer); override;\r\n procedure SetWidth(AValue: Integer); override;\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property Caption;\r\n property ChildOrder;\r\n property Columns: integer read FColumns write SetColumns;\r\n property ControlPosition: TElementPosition read FControlPosition write SetControlPosition default epAbsolute;\r\n property DragMode;\r\n property ElementClassName;\r\n property ElementButtonClassName: TElementClassName read FElementButtonClassName write FElementButtonClassName;\r\n property ElementGroupClassName: TElementClassName read FElementGroupClassName write FElementGroupClassName;\r\n property ElementLabelClassName: TElementClassName read FElementLabelClassName write FElementLabelClassName;\r\n property ElementID;\r\n property ElementFont;\r\n property ElementPosition;\r\n property Font;\r\n property Height;\r\n property HeightPercent;\r\n property HeightStyle;\r\n property Items: TStrings read FItems write SetItems;\r\n property Margins;\r\n property ParentFont;\r\n property PopupMenu;\r\n property Role;\r\n property Visible;\r\n property Width;\r\n property WidthPercent;\r\n property WidthStyle;\r\n property OnChange: TNotifyEvent read FOnChange write FOnChange;\r\n property OnDragDrop;\r\n property OnDragOver;\r\n property OnEndDrag;\r\n property OnStartDrag;\r\n end;\r\n\r\n TRadioGroup = class(TControlGroup)\r\n private\r\n FItemIndex: integer;\r\n FOldItemIndex: integer;\r\n protected\r\n procedure DoHandleClick(AControl: TCustomControl); override;\r\n function GetItemIndex: integer;\r\n procedure SetItemIndex(AIndex: integer);\r\n function CreateGroupControl(ALeft, ATop, AIndex: integer; ACaption: string; APosition: TElementPosition; AState, AEnabled: boolean): TCustomControl; override;\r\n function GetGroupControlState(AIndex: integer): boolean; override;\r\n procedure LoadState(AState: string); override;\r\n function SaveState: string; override;\r\n public\r\n procedure CreateInitialize; override;\r\n procedure SetFocus; override;\r\n published\r\n property ItemIndex: integer read GetItemIndex write SetItemIndex;\r\n end;\r\n\r\n TWebRadioGroup = class(TRadioGroup);\r\n\r\n TCheckClickEvent = procedure(Sender: TObject; AIndex: integer) of object;\r\n\r\n TCheckGroup = class(TControlGroup)\r\n private\r\n FOnCheckClick: TCheckClickEvent;\r\n function GetChecked(AIndex: integer): boolean;\r\n procedure SetChecked(AIndex: integer; const Value: boolean);\r\n protected\r\n procedure DoHandleClick(AControl: TCustomControl); override;\r\n function CreateGroupControl(ALeft, ATop, AIndex: integer; ACaption: string; APosition: TElementPosition; AState, AEnabled: boolean): TCustomControl; override;\r\n function GetGroupControlState(AIndex: integer): boolean; override;\r\n function SaveState: string; override;\r\n procedure LoadState(AState: string); override;\r\n public\r\n procedure CreateInitialize; override;\r\n property Checked[AIndex: integer]: boolean read GetChecked write SetChecked;\r\n procedure SetFocus; override;\r\n published\r\n property OnCheckClick: TCheckClickEvent read FOnCheckClick write FOnCheckClick;\r\n end;\r\n\r\n TWebCheckGroup = class(TCheckGroup);\r\n\r\n TColorPicker = class(TCustomInput)\r\n private\r\n FColor: TColor;\r\n FOnSelect: TNotifyEvent;\r\n FHandleChangePtr: pointer;\r\n function GetElementInputHandle: TJSHTMLInputElement;\r\n protected\r\n procedure UpdateElementVisual; override;\r\n function DoHandleChange(Event: TEventListenerEvent): Boolean;\r\n function GetInputType: string; override;\r\n function GetColor: TColor;\r\n procedure SetColor(AValue: TColor); reintroduce;\r\n procedure BindEvents; override;\r\n procedure UnBindEvents; override;\r\n procedure Select; virtual;\r\n procedure ClearMethodPointers; override;\r\n procedure GetMethodPointers; override;\r\n public\r\n procedure CreateInitialize; override;\r\n property ElementInputHandle: TJSHTMLInputElement read GetElementInputHandle;\r\n property Selected: TColor read GetColor write SetColor;\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property ChildOrder;\r\n property Color: TColor read GetColor write SetColor;\r\n property DragMode;\r\n property ElementClassName;\r\n property ElementID;\r\n property ElementFont;\r\n property ElementPosition;\r\n property Enabled;\r\n property Height;\r\n property HeightPercent;\r\n property Left;\r\n property Margins;\r\n property Role;\r\n property Top;\r\n property Visible;\r\n property Width;\r\n property WidthPercent;\r\n property OnClick;\r\n property OnSelect: TNotifyEvent read FOnSelect write FOnSelect;\r\n property OnDragDrop;\r\n property OnDragOver;\r\n property OnEndDrag;\r\n property OnStartDrag;\r\n end;\r\n\r\n TWebColorPicker = class(TColorPicker);\r\n\r\n TScrollBarContent = class(TCustomControl)\r\n protected\r\n function CreateElement: TJSElement; override;\r\n end;\r\n\r\n TScrollBarInc = Integer;\r\n\r\n TScrollBar = class(TCustomControl)\r\n private\r\n FScrolling: Boolean;\r\n FContent: TScrollBarContent;\r\n FKind: TScrollBarKind;\r\n FPosition: Integer;\r\n FSmallChange: TScrollBarInc;\r\n FMax: Integer;\r\n FMin: Integer;\r\n FLargeChange: TScrollBarInc;\r\n FPageSize: Integer;\r\n FOnChange: TNotifyEvent;\r\n FScrollPtr: pointer;\r\n procedure SetKind(const Value: TScrollBarKind);\r\n procedure SetPosition(const Value: Integer);\r\n procedure SetMax(const Value: Integer);\r\n procedure SetMin(const Value: Integer);\r\n procedure SetPageSize(const Value: Integer);\r\n function GetPosition: Integer;\r\n function GetPageSize: Integer;\r\n protected\r\n function GetValue(XYPos: Double): Double;\r\n function CreateElement: TJSElement; override;\r\n function DoScroll(Event: TJSUIEvent): Boolean; virtual;\r\n procedure BindEvents; override;\r\n procedure UnBindEvents; override;\r\n procedure UpdateElementVisual; override;\r\n procedure UpdateContent; virtual;\r\n procedure Loaded; override;\r\n procedure ClearMethodPointers; override;\r\n procedure GetMethodPointers; override;\r\n public\r\n procedure CreateInitialize; override;\r\n destructor Destroy; override;\r\n procedure SetBounds(X, Y, AWidth, AHeight: Integer); override;\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property DragMode;\r\n property Height;\r\n property Kind: TScrollBarKind read FKind write SetKind;\r\n property Position: Integer read GetPosition write SetPosition;\r\n property Left;\r\n property SmallChange: TScrollBarInc read FSmallChange write FSmallChange;\r\n property LargeChange: TScrollBarInc read FLargeChange write FLargeChange;\r\n property Max: Integer read FMax write SetMax;\r\n property Min: Integer read FMin write SetMin;\r\n property PageSize: Integer read GetPageSize write SetPageSize;\r\n property Top;\r\n property Visible;\r\n property Width;\r\n property OnChange: TNotifyEvent read FOnChange write FOnChange;\r\n property OnDragDrop;\r\n property OnDragOver;\r\n property OnEndDrag;\r\n property OnStartDrag;\r\n end;\r\n\r\n TWebScrollBar = class(TScrollBar);\r\n\r\nfunction GetAutoCompletionName(aAutoCompletion: TAutoCompletion): string;\r\n\r\nimplementation\r\n\r\nfunction GetAutoCompletionName(aAutoCompletion: TAutoCompletion): string;\r\nbegin\r\n case aAutoCompletion of\r\n acOff: Result := '';\r\n acHonorificPrefix: Result := 'honorific-prefix';\r\n aGivenName: Result := 'given-name';\r\n acAdditionalName: Result := 'additional-name';\r\n acFamilyName: Result := 'family-name';\r\n acHonorificSuffix: Result := 'honorific-suffix';\r\n acNickName: Result := 'nickname';\r\n acEmail: Result := 'email';\r\n acUserName: Result := 'username';\r\n acNewPassword: Result := 'new-password';\r\n acCurrentPassword: Result := 'current-password';\r\n acOrganizationTitle: Result := 'organization-title';\r\n acOrganization: Result := 'organization';\r\n acStreetAddress: Result := 'street-address';\r\n acAddressLine1: Result := 'address-line1';\r\n acAddressLine2: Result := 'address-line2';\r\n acAddressLine3: Result := 'address-line3';\r\n acAddressLevel1: Result := 'address-level1';\r\n acAddressLevel2: Result := 'address-level2';\r\n acAddressLevel3: Result := 'address-level3';\r\n acAddressLevel4: Result := 'address-level4';\r\n acCountry: Result := 'country';\r\n acCountryName: Result := 'country-name';\r\n acPostalCode: Result := 'postal-code';\r\n acCCName: Result := 'cc-name';\r\n acCCGivenName: Result := 'cc-given-name';\r\n acCCAdditionalName: Result := 'cc-additional-name';\r\n acCCFamilyName: Result := 'cc-family-name';\r\n acCCNumber: Result := 'cc-number';\r\n acExpiry: Result := 'cc-exp';\r\n acExpiryMonth: Result := 'cc-exp-month';\r\n acExpiryYear: Result := 'cc-exp-year';\r\n acCSC: Result := 'cc-csc';\r\n acType: Result := 'cc-type';\r\n acTransactionCurrency: Result := 'transaction-currency';\r\n acTransactionAmount: Result := 'transaction-amount';\r\n acLanguage: Result := 'language';\r\n acBirthday: Result := 'bday';\r\n acBirthdayDay: Result := 'bday-day';\r\n acBirthDayMonth: Result := 'bday-month';\r\n acBirthDayYear: Result := 'bday-year';\r\n acSex: Result := 'sex';\r\n acTelephone: Result := 'tel';\r\n acTelephoneCountryCode: Result := 'tel-country-code';\r\n acTelephoneNational: Result := 'tel-national';\r\n acTelephoneAreaCode: Result := 'tel-area-code';\r\n acTelephoneLocal: Result := 'tel-local';\r\n acTelephoneExtension: Result := 'tel-extension';\r\n acIMPP: Result := 'impp';\r\n acURL: Result := 'url';\r\n acPhoto: Result := 'photo';\r\n end;\r\nend;\r\n\r\n{ TCustomLabel }\r\n\r\nprocedure TCustomLabel.CreateInitialize;\r\nbegin\r\n inherited;\r\n FAutoSize := true;\r\n FLayout := tlTop;\r\n FEllipsisPosition := epNone;\r\n FColor := clWhite;\r\n FTransparent := True;\r\n FAlignment := taLeftJustify;\r\n TabStop := false;\r\n FShowAccelChar := true;\r\nend;\r\n\r\nfunction TCustomLabel.CanShowFocus: boolean;\r\nbegin\r\n Result := false;\r\nend;\r\n\r\nfunction TCustomLabel.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('DIV');\r\n\r\n FContent := CreateLabelElement;\r\n Result.appendChild(FContent);\r\nend;\r\n\r\nfunction TCustomLabel.CreateLabelElement: TJSElement;\r\nbegin\r\n Result := nil;\r\n\r\n case HTMLType of\r\n tSPAN: Result := document.createElement('SPAN');\r\n tDIV: Result := document.createElement('DIV');\r\n tH1: Result := document.createElement('H1');\r\n tH2: Result := document.createElement('H2');\r\n tH3: Result := document.createElement('H3');\r\n tH4: Result := document.createElement('H4');\r\n tH5: Result := document.createElement('H5');\r\n tH6: Result := document.createElement('H6');\r\n tLABELTAG: Result := document.createElement('LABEL');\r\n tP: Result := document.createElement('P');\r\n end;\r\n\r\n Result.setAttribute('data-lbl','lbl');\r\nend;\r\n\r\nprocedure TCustomLabel.BindElement;\r\nbegin\r\n FContent := Container.firstElementChild;\r\nend;\r\n\r\nfunction TCustomLabel.GetContentHandle: TJSHTMLElement;\r\nbegin\r\n Result := TJSHTMLElement(FContent);\r\nend;\r\n\r\nfunction TCustomLabel.GetDisplayText: string;\r\nbegin\r\n Result := Caption;\r\nend;\r\n\r\nfunction TCustomLabel.GetHeight: Integer;\r\nbegin\r\n if AutoSize and Assigned(ElementHandle) and Assigned(Parent) and not (csDesigning in ComponentState) then\r\n begin\r\n Result := Round(TJSHTMLElement(ElementHandle).offsetHeight);\r\n if Result = 0 then\r\n Result := inherited GetHeight;\r\n end\r\n else\r\n Result := inherited GetHeight;\r\nend;\r\n\r\nfunction TCustomLabel.GetWidth: Integer;\r\nbegin\r\n if AutoSize and Assigned(ElementHandle) and Assigned(Parent) and not (csDesigning in ComponentState) then\r\n begin\r\n Result := Round(TJSHTMLElement(ElementHandle).offsetWidth);\r\n\r\n if Result = 0 then\r\n Result := inherited GetWidth;\r\n end\r\n else\r\n Result := inherited GetWidth;\r\nend;\r\n\r\nprocedure TCustomLabel.Loaded;\r\nbegin\r\n inherited;\r\n\r\n if ShowAccelChar and Assigned(FocusControl) then\r\n UpdateElementData;\r\nend;\r\n\r\nprocedure TCustomLabel.SetAutoSize(AValue: boolean);\r\nbegin\r\n if (FAutoSize <> AValue) then\r\n begin\r\n FAutoSize := AValue;\r\n UpdateAutoSize;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomLabel.SetCaption(const AValue: string);\r\nvar\r\n dw: integer;\r\nbegin\r\n if Caption <> AValue then\r\n begin\r\n dw := Width;\r\n inherited SetCaption(AValue);\r\n UpdateAutoSize;\r\n UpdateElement;\r\n dw := dw - Width;\r\n if AutoSize and (Alignment <> taLeftJustify) and (dw <> 0) and (akRight in Anchors) and not IsUpdating then\r\n Left := Left + dw;\r\n end;\r\nend;\r\n\r\nprocedure TCustomLabel.SetColorEx(const Value: TColor);\r\nbegin\r\n FColor := Value;\r\n\r\n if (csDesigning in ComponentState) and (Color <> clWhite) then\r\n Transparent := false;\r\n\r\n UpdateElement;\r\nend;\r\n\r\nprocedure TCustomLabel.SetElementLabelClassName(const Value: TElementClassName);\r\nbegin\r\n if (FElementLabelClassName <> Value) then\r\n begin\r\n FElementLabelClassName := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomLabel.SetEllipsisPosition(AValue: TEllipsisPosition);\r\nbegin\r\n if FEllipsisPosition <> AValue then\r\n begin\r\n FEllipsisPosition := AValue;\r\n if FEllipsisPosition <> epNone then\r\n FAutoSize := False;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomLabel.SetHTML(const Value: string);\r\nbegin\r\n if (FHTML <> Value) then\r\n begin\r\n FHTML := Value;\r\n UpdateElementData;\r\n end;\r\nend;\r\n\r\nprocedure TCustomLabel.SetHTMLType(const Value: THTMLType);\r\nvar\r\n el: TJSElement;\r\nbegin\r\n if (FHTMLType <> Value) then\r\n begin\r\n FHTMLType := Value;\r\n\r\n if FHTMLType in [tH1..tH6] then\r\n ElementFont := efCSS;\r\n\r\n if Assigned(ElementHandle) and Assigned(FContent) then\r\n begin\r\n el := TJSElement(ElementHandle.firstChild);\r\n\r\n if Assigned(el) and (el.getAttribute('data-lbl') = 'lbl') then\r\n begin\r\n ElementHandle.removeChild(FContent);\r\n FContent := CreateLabelElement;\r\n ElementHandle.appendChild(FContent);\r\n UpdateElement;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TCustomLabel.SetLayout(const Value: TTextLayout);\r\nbegin\r\n if FLayout <> Value then\r\n begin\r\n FLayout := Value;\r\n UpdateElementVisual;\r\n end;\r\nend;\r\n\r\nprocedure TCustomLabel.SetParent(AValue: TControl);\r\nbegin\r\n inherited;\r\n if AutoSize and (Alignment <> taLeftJustify) and (FOrigWidth <> -1) then\r\n begin\r\n Left := Left + FOrigWidth - Width;\r\n FOrigWidth := -1;\r\n end;\r\nend;\r\n\r\nprocedure TCustomLabel.SetTransparent(const Value: boolean);\r\nbegin\r\n if (FTransparent <> Value) then\r\n begin\r\n FTransparent := Value;\r\n UpdateElementVisual;\r\n end;\r\nend;\r\n\r\nprocedure TCustomLabel.SetWidth(AValue: Integer);\r\nbegin\r\n if (AValue <> -1) and (csLoading in ComponentState) then\r\n FOrigWidth := AValue;\r\n\r\n inherited;\r\nend;\r\n\r\nprocedure TCustomLabel.SetAlignment(const Value: TAlignment);\r\nbegin\r\n if FAlignment <> Value then\r\n begin\r\n FAlignment := Value;\r\n UpdateElementVisual;\r\n end;\r\nend;\r\n\r\nprocedure TCustomLabel.UpdateAutoSize;\r\nbegin\r\n if FAutoSize and (Align = alNone) then\r\n begin\r\n if Assigned(ElementHandle) {and not (csDesigning in ComponentState)} then\r\n begin\r\n Width := -1;\r\n Height := -1;\r\n end;\r\n FEllipsisPosition := epNone;\r\n end;\r\nend;\r\n\r\nprocedure TCustomLabel.UpdateElementData;\r\nvar\r\n lTxt: string;\r\n acc: string;\r\n contentelement: TJSElement;\r\nbegin\r\n inherited;\r\n\r\n acc := '';\r\n\r\n if ShowAccelChar then\r\n lTxt := ProcessAccelerator(GetDisplayText,acc)\r\n else\r\n lTxt := GetDisplayText;\r\n\r\n if HTML = '' then\r\n lTxt := HTMLToString(lTxt)\r\n else\r\n lTxt := HTML;\r\n\r\n if IsLinked and (lTxt = '') then\r\n Exit;\r\n\r\n if Assigned(ContentHandle) then\r\n begin\r\n if isLinked then\r\n begin\r\n contentelement := ContentHandle;\r\n\r\n if (ElementID <> '') then\r\n begin\r\n contentelement := document.getElementById(ElementID);\r\n end;\r\n\r\n if Assigned(contentelement) then\r\n begin\r\n if Assigned(ContentHandle.nodeValue) then\r\n contentelement.nodeValue := lTxt\r\n else\r\n if contentelement.childelementcount = 0 then\r\n contentelement.innerHTML := lTxt;\r\n end;\r\n end\r\n else\r\n begin\r\n if (ContentHandle.childElementCount > 0) and not FHasAccel and not FHasHTML then\r\n ContentHandle.nodeValue := lTxt\r\n else\r\n ContentHandle.innerHTML := lTxt\r\n end;\r\n end\r\n else\r\n ElementHandle.innerHTML := lTxt;\r\n\r\n FHasHTML := pos(' 0;\r\n FHasAccel := acc <> '';\r\n\r\n // https://www.htmlgoodies.com/tutorials/html_401/article.php/3479621\r\n if (acc <> '') and Assigned(FocusControl) then\r\n begin\r\n ContentHandle['accesskey'] := acc;\r\n ContentHandle['for'] := FocusControl.GetID;\r\n end;\r\nend;\r\n\r\nprocedure TCustomLabel.UpdateElementSize;\r\nbegin\r\n inherited;\r\n\r\n if AutoSize and (Align = alNone) and Assigned(ElementHandle) then\r\n begin\r\n if not (csDesigning in ComponentState) then\r\n begin\r\n ElementHandle.style.removeProperty('width');\r\n ElementHandle.style.removeProperty('height');\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TCustomLabel.UpdateElementVisual;\r\nbegin\r\n inherited;\r\n\r\n if IsUpdating then\r\n Exit;\r\n\r\n if Assigned(ElementHandle) then\r\n begin\r\n if Visible and (not AutoSize or (Align <> alNone)) then\r\n ElementHandle.style.setProperty('display', 'table');\r\n\r\n ElementHandle['zindex'] := '1';\r\n\r\n if AutoSize and (Align = alNone) and not (csDesigning in ComponentState) then\r\n ElementHandle.style.setProperty('overflow', '')\r\n else\r\n ElementHandle.style.setProperty('overflow', 'hidden');\r\n end;\r\n\r\n if Assigned(ContentHandle) then\r\n begin\r\n case Layout of\r\n tlTop: ContentHandle.style.setProperty('vertical-align', 'top');\r\n tlCenter: ContentHandle.style.setProperty('vertical-align', 'middle');\r\n tlBottom: ContentHandle.style.setProperty('vertical-align', 'bottom');\r\n end;\r\n\r\n case Alignment of\r\n taLeftJustify: ContentHandle.style.removeProperty('text-align');\r\n taCenter: ContentHandle.style.setProperty('text-align', 'center');\r\n taRightJustify: ContentHandle.style.setProperty('text-align', 'right');\r\n end;\r\n\r\n SetHTMLElementColor(ElementHandle, Color, Transparent or (Color = clNone) or (Color = clWindow));\r\n SetHTMLElementColor(ContentHandle, Color, Transparent or (Color = clNone) or (Color = clWindow));\r\n\r\n ContentHandle.style.setProperty('display', 'table-cell');\r\n\r\n if ElementClassName = '' then\r\n begin\r\n if Enabled and (ElementFont = efProperty) and not IsLinked then\r\n ContentHandle.style.setProperty('color', ColorToHtml(Font.Color))\r\n else\r\n ContentHandle.style.removeProperty('color');\r\n\r\n SetElementPointer(ContentHandle, Cursor);\r\n SetHTMLElementFont(ContentHandle, Font, not ((ElementFont = efProperty) and not IsLinked) );\r\n end\r\n else\r\n begin\r\n ContentHandle.style.removeProperty('color');\r\n SetHTMLElementFont(ContentHandle, Font, true);\r\n end;\r\n\r\n if ElementLabelClassName <> '' then\r\n ContentHandle['class'] := ElementLabelClassName\r\n else\r\n ContentHandle.removeAttribute('class');\r\n\r\n if (ElementPosition = epAbsolute) or (WidthStyle = ssAbsolute) then\r\n begin\r\n if FEllipsisPosition = epNone then\r\n ContentHandle.style.setProperty('text-overflow', 'clip')\r\n else\r\n ContentHandle.style.setProperty('text-overflow', 'ellipsis');\r\n end\r\n else\r\n ContentHandle.style.removeProperty('text-overflow');\r\n\r\n if WordWrap then\r\n ContentHandle.style.setProperty('white-space', 'normal')\r\n else\r\n ContentHandle.style.setProperty('white-space', 'nowrap');\r\n\r\n // allow selection in labels\r\n ElementHandle.style.setProperty('user-select', '');\r\n\r\n // allow default caret on text\r\n if Cursor = crDefault then\r\n ElementHandle.style.setProperty('cursor', '');\r\n\r\n if AutoSize and (Align = alNone) and not (csDesigning in ComponentState) then\r\n begin\r\n ElementHandle.style.removeProperty('width');\r\n ElementHandle.style.removeProperty('height');\r\n end;\r\n end;\r\nend;\r\n\r\n{ TCustomInput }\r\n\r\nfunction TCustomInput.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('INPUT');\r\n Result['type'] := GetInputType;\r\nend;\r\n\r\nprocedure TCustomInput.UpdateElementVisual;\r\nbegin\r\n inherited;\r\n\r\n if Assigned(Container) and not IsLinked then\r\n begin\r\n TJSHTMLInputElement(Container).style.setProperty('-moz-box-sizing', 'border-box');\r\n TJSHTMLInputElement(Container).style.setProperty('-webkit-box-sizing', 'border-box');\r\n TJSHTMLInputElement(Container).style.setProperty('box-sizing', 'border-box');\r\n end;\r\nend;\r\n\r\nprocedure TCustomInput.CreateInitialize;\r\nbegin\r\n inherited;\r\n ShowFocus := true;\r\n NoUserSelect := false;\r\nend;\r\n\r\nfunction TCustomInput.GetInputType: string;\r\nbegin\r\n Result := 'EDIT';\r\nend;\r\n\r\nfunction TCustomInput.IsInputControl: Boolean;\r\nbegin\r\n Result := True;\r\nend;\r\n\r\nprocedure TCustomInput.LoadState(AState: string);\r\nbegin\r\n TJSHTMLInputElement(ElementHandle).value := AState;\r\nend;\r\n\r\nfunction TCustomInput.SaveState: string;\r\nbegin\r\n Result := TJSHTMLInputElement(ElementHandle).value;\r\nend;\r\n\r\n{ TCustomEdit }\r\n\r\nprocedure TCustomEdit.BindEvents;\r\nbegin\r\n inherited;\r\n if Assigned(ElementInputHandle) then\r\n begin\r\n ElementInputHandle.addEventListener('input', FHandleChangePtr);\r\n ElementInputHandle.addEventListener('paste', FHandlePastePtr);\r\n ElementInputHandle.addEventListener('cut', FHandleCutPtr);\r\n end;\r\nend;\r\n\r\nprocedure TCustomEdit.UnBindEvents;\r\nbegin\r\n inherited;\r\n if Assigned(ElementInputHandle) then\r\n begin\r\n ElementInputHandle.removeEventListener('input', FHandleChangePtr);\r\n ElementInputHandle.removeEventListener('paste', FHandlePastePtr);\r\n ElementInputHandle.removeEventListener('cut', FHandleCutPtr);\r\n end;\r\nend;\r\n\r\n\r\nprocedure TCustomEdit.Change;\r\nbegin\r\n if Assigned(ElementHandle) then\r\n FText := ElementInputHandle.value;\r\n\r\n if Assigned(OnChange) then\r\n OnChange(Self);\r\nend;\r\n\r\nprocedure TCustomEdit.Clear;\r\nbegin\r\n Text := '';\r\nend;\r\n\r\nprocedure TCustomEdit.ClearMethodPointers;\r\nbegin\r\n inherited;\r\n FHandlePastePtr := nil;\r\n FHandleCutPtr := nil;\r\n FHandleChangePtr := nil;\r\nend;\r\n\r\nprocedure TCustomEdit.ClearSelection;\r\nvar\r\n s: string;\r\nbegin\r\n s := Text;\r\n Text := Copy(s, 1, SelStart) + Copy(s, SelStart + SelLength, Length(s));\r\nend;\r\n\r\nprocedure TCustomEdit.CreateInitialize;\r\nbegin\r\n inherited;\r\n FAutoCompletion := acOff;\r\n FEditType := weString;\r\n FText := '';\r\n FCharCase := wecNormal;\r\n FMaxLength := 0;\r\n FReadOnly := false;\r\n FTextHint := '';\r\n FPasswordChar := #0;\r\n Height := 25;\r\nend;\r\n\r\nfunction TCustomEdit.DoHandleChange(Event: TEventListenerEvent): Boolean;\r\nbegin\r\n Change;\r\n Result := True;\r\nend;\r\n\r\nfunction TCustomEdit.DoHandleCut(Event: TEventListenerEvent): Boolean;\r\nbegin\r\n if not CanCut then\r\n begin\r\n asm\r\n Event.preventDefault();\r\n Event.stopPropagation();\r\n end;\r\n end;\r\n\r\n Result := False;\r\nend;\r\n\r\nfunction TCustomEdit.DoHandlePaste(Event: TEventListenerEvent): Boolean;\r\nvar\r\n s: string;\r\n\r\nbegin\r\n asm\r\n var clipboardData = Event.clipboardData || window.clipboardData;\r\n s = clipboardData.getData('Text');\r\n end;\r\n\r\n if not CanPaste(s) or not Validate(s) then\r\n begin\r\n asm\r\n Event.preventDefault();\r\n Event.stopPropagation();\r\n end;\r\n end;\r\n\r\n Result := False;\r\nend;\r\n\r\nfunction TCustomEdit.CanCut: boolean;\r\nbegin\r\n Result := True\r\nend;\r\n\r\nfunction TCustomEdit.CanPaste(AValue: string): boolean;\r\nbegin\r\n Result := True;\r\nend;\r\n\r\nprocedure TCustomEdit.SetReadOnly(AValue: Boolean);\r\nbegin\r\n FReadOnly := AValue;\r\n UpdateElement;\r\nend;\r\n\r\nprocedure TCustomEdit.SetRequired(const Value: Boolean);\r\nbegin\r\n FRequired := Value;\r\n UpdateElement;\r\nend;\r\n\r\nprocedure TCustomEdit.SetSelection(ASelStart, ASelLength: integer);\r\nvar\r\n eh: TJSHTMLElement;\r\nbegin\r\n FSelStart := ASelStart;\r\n FSelLength := ASelLength;\r\n eh := ElementHandle;\r\n if Assigned(eh) then\r\n begin\r\n asm\r\n eh.setSelectionRange(ASelStart, ASelLength);\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TCustomEdit.SetSelLength(const Value: Integer);\r\nbegin\r\n FSelLength := Value;\r\n UpdateElement;\r\nend;\r\n\r\nprocedure TCustomEdit.SetSelStart(const Value: Integer);\r\nbegin\r\n FSelStart := Value;\r\n UpdateElement;\r\nend;\r\n\r\nprocedure TCustomEdit.SetPasswordChar(const Value: Char);\r\nbegin\r\n FPasswordChar := Value;\r\n UpdateElement;\r\nend;\r\n\r\nprocedure TCustomEdit.SetPattern(const Value: string);\r\nbegin\r\n if FPattern <> Value then\r\n begin\r\n FPattern := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomEdit.SetNumeric(const Value: Boolean);\r\nbegin\r\n FNumeric := Value;\r\n UpdateElement;\r\nend;\r\n\r\nprocedure TCustomEdit.SetText(AValue: string);\r\nbegin\r\n FText := AValue;\r\n\r\n if Assigned(ElementInputHandle) then\r\n begin\r\n ElementInputHandle.value := GetDisplayText;\r\n ElementInputHandle.readOnly := IsReadOnly;\r\n end;\r\nend;\r\n\r\nfunction TCustomEdit.GetText: string;\r\nbegin\r\n Result := FText;\r\n if Assigned(ElementInputHandle) then\r\n Result := ElementInputHandle.value;\r\n\r\n if CharCase = wecUpperCase then\r\n Result := Uppercase(Result);\r\n\r\n if CharCase = wecLowerCase then\r\n Result := Lowercase(Result);\r\nend;\r\n\r\nfunction TCustomEdit.IsCustomEditor: Boolean;\r\nbegin\r\n Result := False;\r\nend;\r\n\r\nfunction TCustomEdit.IsReadOnly: boolean;\r\nbegin\r\n Result := ReadOnly;\r\nend;\r\n\r\nprocedure TCustomEdit.KeyPress(var Key: Char);\r\nvar\r\n isValid: boolean;\r\n\r\nbegin\r\n inherited KeyPress(Key);\r\n\r\n isValid := true;\r\n\r\n case EditType of\r\n weNumeric: isValid := (Key in ['0'..'9']);\r\n weSignedNumeric: isValid := (Key in ['0'..'9','+','-']);\r\n weFloat: isValid := (Key in ['0'..'9',',','.']);\r\n weSignedFloat: isValid := (Key in ['0'..'9',',','.','+','-']);\r\n weHex: isValid := (Key in ['0'..'9','A'..'F']);\r\n end;\r\n\r\n if not isValid then\r\n Key := #0;\r\nend;\r\n\r\nprocedure TCustomEdit.SetTextHint(AValue: string);\r\nbegin\r\n FTextHint := AValue;\r\n UpdateElement;\r\nend;\r\n\r\n{$HINTS OFF}\r\nprocedure TCustomEdit.UpdateElementData;\r\nvar\r\n e: TJSHTMLElement;\r\n ss, sl: Integer;\r\n isNum: boolean;\r\nbegin\r\n inherited;\r\n\r\n if Assigned(ElementInputHandle) then\r\n begin\r\n if not IsLinked then\r\n begin\r\n case CharCase of\r\n wecUpperCase: ElementInputHandle.style.setProperty('text-transform', 'uppercase');\r\n wecLowerCase: ElementInputHandle.style.setProperty('text-transform', 'lowercase');\r\n wecMixedCase: ElementInputHandle.style.setProperty('text-transform', 'capitalize');\r\n wecNormal: ElementInputHandle.style.setProperty('text-transform', 'initial');\r\n end;\r\n end;\r\n\r\n ElementInputHandle.readOnly := IsReadOnly;\r\n\r\n if TextHint <> '' then\r\n ElementInputHandle.placeholder := TextHint;\r\n\r\n if not isLinked then\r\n begin\r\n ElementInputHandle['type'] := GetInputType;\r\n ElementInputHandle['role'] := 'textbox';\r\n\r\n if AutoCompletion = acNone then\r\n begin\r\n TJSHTMLElement(ElementInputHandle).setAttribute('autocomplete','off');\r\n TJSHTMLElement(ElementInputHandle).removeAttribute('name');\r\n end\r\n else\r\n if AutoCompletion <> acOff then\r\n begin\r\n TJSHTMLElement(ElementInputHandle).setAttribute('autocomplete','on');\r\n TJSHTMLElement(ElementInputHandle).setAttribute('name', GetAutoCompletionName(AutoCompletion));\r\n end\r\n else\r\n begin\r\n TJSHTMLElement(ElementInputHandle).removeAttribute('autocomplete');\r\n TJSHTMLElement(ElementInputHandle).removeAttribute('name');\r\n end;\r\n\r\n case Alignment of\r\n taLeftJustify: TJSHTMLElement(ElementInputHandle).style.removeProperty('text-align');\r\n taCenter: TJSHTMLElement(ElementInputHandle).style.setProperty('text-align', 'center');\r\n taRightJustify: TJSHTMLElement(ElementInputHandle).style.setProperty('text-align', 'right');\r\n end;\r\n end;\r\n\r\n if AutoFocus then\r\n ElementInputHandle.setAttribute('autofocus','')\r\n else\r\n ElementInputHandle.removeAttribute('autofocus');\r\n\r\n if Required then\r\n ElementInputHandle.setAttribute('required','')\r\n else\r\n ElementInputHandle.removeAttribute('required');\r\n\r\n if FPattern <> '' then\r\n ElementInputHandle.setAttribute('pattern',FPattern)\r\n else\r\n ElementInputHandle.removeAttribute('pattern');\r\n\r\n if MaxLength <= 0 then\r\n ElementInputHandle.removeAttribute('maxLength')\r\n else\r\n ElementInputHandle.maxLength := MaxLength;\r\n\r\n ElementInputHandle.value := GetDisplayText;\r\n\r\n isNum := Uppercase(GetInputType) = 'NUMBER';\r\n\r\n if (not isNum) and (not isLinked) and (not IsCustomEditor) then\r\n begin\r\n ss := FSelStart;\r\n sl := FSelStart + FSelLength;\r\n e := ElementInputHandle;\r\n asm\r\n setTimeout(function() {\r\n e.setSelectionRange(ss, sl);\r\n }, 1);\r\n end;\r\n end;\r\n\r\n end;\r\nend;\r\n{$HINTS ON}\r\n\r\nfunction TCustomEdit.Validate(AValue: string): boolean;\r\nvar\r\n i: integer;\r\n Key: char;\r\n isvalid: boolean;\r\nbegin\r\n Result := true;\r\n\r\n for i := 1 to Length(AValue) do\r\n begin\r\n Key := AValue[i];\r\n isValid := true;\r\n\r\n case EditType of\r\n weNumeric: isValid := (Key in ['0'..'9']);\r\n weSignedNumeric: isValid := (Key in ['0'..'9','+','-']);\r\n weFloat: isValid := (Key in ['0'..'9',',','.']);\r\n weSignedFloat: isValid := (Key in ['0'..'9',',','.','+','-']);\r\n weHex: isValid := (Key in ['0'..'9','A'..'F']);\r\n end;\r\n\r\n if not IsValid then\r\n begin\r\n Result := false;\r\n break;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TCustomEdit.SelectAll;\r\nbegin\r\n if Assigned(ElementInputHandle) then\r\n ElementInputHandle.select;\r\nend;\r\n\r\nprocedure TCustomEdit.SetAlignment(const Value: TAlignment);\r\nbegin\r\n FAlignment := Value;\r\n UpdateElement;\r\nend;\r\n\r\nprocedure TCustomEdit.SetAutoCompletion(const Value: TAutoCompletion);\r\nbegin\r\n if (FAutoCompletion <> Value) then\r\n begin\r\n FAutoCompletion := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomEdit.SetAutoFocus(const Value: boolean);\r\nbegin\r\n if (FAutoFocus <> Value) then\r\n begin\r\n FAutoFocus := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomEdit.SetAutoSelect(const Value: Boolean);\r\nbegin\r\n if FAutoSelect <> Value then\r\n begin\r\n FAutoSelect := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomEdit.SetAutoSize(const Value: Boolean);\r\nbegin\r\n if FAutoSize <> Value then\r\n begin\r\n FAutoSize := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomEdit.SetCharCase(AValue: TEditCharCase);\r\nbegin\r\n if (FCharcase <> AValue) then\r\n begin\r\n FCharcase := AValue;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomEdit.SetEditType(const Value: TEditType);\r\nbegin\r\n if (FEditType <> Value) then\r\n begin\r\n FEditType := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomEdit.SetHideSelection(const Value: Boolean);\r\nbegin\r\n if (FHideSelection <> Value) then\r\n begin\r\n FHideSelection := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomEdit.SetMaxLength(AValue: integer);\r\nbegin\r\n if (FMaxLength <> AValue) then\r\n begin\r\n FMaxLength := AValue;\r\n UpdateElementData;\r\n end;\r\nend;\r\n\r\nfunction TCustomEdit.GetDisplayText: string;\r\nbegin\r\n Result := FText;\r\nend;\r\n\r\nfunction TCustomEdit.GetElementInputHandle: TJSHTMLInputElement;\r\nbegin\r\n Result := TJSHTMLInputElement(Container);\r\nend;\r\n\r\nfunction TCustomEdit.GetInputType: string;\r\nbegin\r\n if (PasswordChar <> #0) then\r\n Result := 'PASSWORD'\r\n else if Numeric then\r\n Result := 'NUMBER'\r\n else\r\n if (EditType in [weFloat, weNumeric]) then\r\n Result := 'TEL'\r\n else\r\n if EditType = weSearch then\r\n Result := 'SEARCH'\r\n else\r\n Result := 'TEXT';\r\nend;\r\n\r\nprocedure TCustomEdit.GetMethodPointers;\r\nbegin\r\n inherited;\r\n FHandlePastePtr := @DoHandlePaste;\r\n FHandleCutPtr := @DoHandleCut;\r\n FHandleChangePtr := @DoHandleChange;\r\nend;\r\n\r\nfunction TCustomEdit.GetSelLength: Integer;\r\nbegin\r\n Result := -1;\r\n if Assigned(ElementInputHandle) then\r\n Result := ElementInputHandle.selectionEnd - ElementInputHandle.selectionStart;\r\nend;\r\n\r\nfunction TCustomEdit.GetSelStart: Integer;\r\nbegin\r\n Result := -1;\r\n if Assigned(ElementInputHandle) then\r\n Result := ElementInputHandle.selectionStart;\r\nend;\r\n\r\nfunction TCustomEdit.GetSelText: string;\r\nbegin\r\n Result := Copy(Text,SelStart + 1, SelLength);\r\nend;\r\n\r\nprocedure TCustomEdit.PersistinHTML;\r\nbegin\r\n ElementInputHandle.setAttribute('value', Text);\r\nend;\r\n\r\n{ TSpinEdit }\r\n\r\nprocedure TSpinEdit.CreateInitialize;\r\nbegin\r\n inherited;\r\n FIncrement := 1;\r\n FMaxValue := 100;\r\n FMinValue := 0;\r\n ShowFocus := true;\r\n Height := 25;\r\n\r\n // make the spin buttons always visible\r\n AddControlStyle('input[type=\"number\"]::-webkit-inner-spin-button { opacity: 1 !important; }');\r\nend;\r\n\r\nprocedure TSpinEdit.BindEvents;\r\nbegin\r\n inherited;\r\n if Assigned(ElementInputHandle) then\r\n begin\r\n ElementInputHandle.addEventListener('input', FHandleChangePtr);\r\n end;\r\nend;\r\n\r\nprocedure TSpinEdit.UnBindEvents;\r\nbegin\r\n inherited;\r\n if Assigned(ElementInputHandle) then\r\n begin\r\n ElementInputHandle.removeEventListener('input', FHandleChangePtr);\r\n end;\r\nend;\r\n\r\nfunction TSpinEdit.GetDisplayText: string;\r\nbegin\r\n Result := IntToStr(FValue);\r\nend;\r\n\r\nfunction TSpinEdit.GetElementInputHandle: TJSHTMLInputElement;\r\nbegin\r\n Result := TJSHTMLInputElement(Container);\r\nend;\r\n\r\nfunction TSpinEdit.DoHandleChange(Event: TEventListenerEvent): Boolean;\r\nbegin\r\n Change;\r\n Result := True;\r\nend;\r\n\r\nprocedure TSpinEdit.Change;\r\nbegin\r\n FValue := GetValue;\r\n\r\n if Assigned(OnChange) then\r\n OnChange(Self);\r\nend;\r\n\r\nprocedure TSpinEdit.ClearMethodPointers;\r\nbegin\r\n inherited;\r\n FHandleChangePtr := nil;\r\nend;\r\n\r\nfunction TSpinEdit.GetInputType: string;\r\nbegin\r\n Result := 'NUMBER';\r\nend;\r\n\r\nprocedure TSpinEdit.GetMethodPointers;\r\nbegin\r\n inherited;\r\n FHandleChangePtr := @DoHandleChange;\r\nend;\r\n\r\nfunction TSpinEdit.GetText: string;\r\nbegin\r\n Result := IntToStr(Value);\r\nend;\r\n\r\nfunction TSpinEdit.GetValue: integer;\r\nvar\r\n s: string;\r\nbegin\r\n Result := FValue;\r\n\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n s := TJSHTMLInputElement(Container).value;\r\n if (s <> '') then\r\n Result := StrToInt(s);\r\nend;\r\n\r\nfunction TSpinEdit.IsReadOnly: boolean;\r\nbegin\r\n Result := FReadOnly;\r\nend;\r\n\r\nprocedure TSpinEdit.KeyPress(var Key: Char);\r\nbegin\r\n if not (Key in ['0'..'9']) then\r\n begin\r\n Key := #0;\r\n PreventDefault;\r\n StopPropagation;\r\n end;\r\n inherited;\r\nend;\r\n\r\nprocedure TSpinEdit.SetIncrement(AValue: integer);\r\nbegin\r\n FIncrement := AValue;\r\n if Assigned(Container) then\r\n Container['step'] := IntToStr(AValue);\r\nend;\r\n\r\nprocedure TSpinEdit.SetMaxValue(AValue: integer);\r\nbegin\r\n FMaxValue := AValue;\r\n if Assigned(Container) then\r\n Container['max'] := IntToStr(AValue);\r\nend;\r\n\r\nprocedure TSpinEdit.SetMinValue(AValue: integer);\r\nbegin\r\n FMinValue := AValue;\r\n if Assigned(Container) then\r\n Container['min'] := IntToStr(AValue);\r\nend;\r\n\r\nprocedure TSpinEdit.SetReadOnly(const Value: boolean);\r\nbegin\r\n if (FReadOnly <> Value) then\r\n begin\r\n FReadOnly := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TSpinEdit.SetText(const Value: string);\r\nvar\r\n i: Integer;\r\nbegin\r\n i := 0;\r\n if TryStrToInt(Value, i) then\r\n Self.Value := i\r\n else\r\n Self.Value := 0;\r\nend;\r\n\r\nprocedure TSpinEdit.PersistinHTML;\r\nbegin\r\n ElementInputHandle.setAttribute('value',IntToStr(Value));\r\nend;\r\n\r\nprocedure TSpinEdit.SetValue(AValue: integer);\r\nbegin\r\n FValue := AValue;\r\n UpdateElement;\r\nend;\r\n\r\nprocedure TSpinEdit.UpdateElementData;\r\nbegin\r\n inherited;\r\n if Assigned(Container) then\r\n begin\r\n Container['inputmode'] := 'numeric';\r\n Container['pattern'] := '[0-9]*';\r\n TJSHTMLInputElement(Container).value := GetDisplayText;\r\n ElementInputHandle.readOnly := IsReadOnly;\r\n end;\r\nend;\r\n\r\n{ TDateTimePicker }\r\n\r\nfunction TDateTimePicker.GetInputType: string;\r\nbegin\r\n if FKind = dtkDate then\r\n Result := 'DATE'\r\n else\r\n Result := 'TIME';\r\nend;\r\n\r\nprocedure TDateTimePicker.GetMethodPointers;\r\nbegin\r\n inherited;\r\n FHandleChangePtr := @DoHandleChange;\r\n FClickPtr := @DoCheckClick;\r\n FFocusPtr := @DoPickerFocus;\r\n FBlurPtr := @DoPickerBlur;\r\nend;\r\n\r\nprocedure TDateTimePicker.SetChecked(const Value: boolean);\r\nbegin\r\n if (FChecked <> Value) then\r\n begin\r\n FChecked := Value;\r\n UpdateElementVisual;\r\n end;\r\nend;\r\n\r\nprocedure TDateTimePicker.SetDate(AValue: TDate);\r\nbegin\r\n if FDate <> AValue then\r\n begin\r\n FDate := Int(AValue);\r\n FTime := 0;\r\n UpdateElementData;\r\n end;\r\nend;\r\n\r\nprocedure TDateTimePicker.SetDateTime(const Value: TDateTime);\r\nbegin\r\n FDate := Int(Value);\r\n FTime := Frac(Value);\r\n UpdateElementData;\r\nend;\r\n\r\nprocedure TDateTimePicker.SetFocus;\r\nbegin\r\n if Assigned(GetElementPicker) then\r\n begin\r\n TJSHTMLElement(GetElementPicker).Focus();\r\n end;\r\nend;\r\n\r\nprocedure TDateTimePicker.BindEvents;\r\nbegin\r\n inherited;\r\n if Assigned(Container) then\r\n begin\r\n TJSHTMLInputElement(Container).addEventListener('input', FHandleChangePtr);\r\n end;\r\n\r\n if Assigned(FElementCheck) then\r\n FElementCheck.addEventListener('click',FClickPtr);\r\n\r\n if Assigned(GetElementPicker) then\r\n begin\r\n GetElementPicker.addEventListener('focus',FFocusPtr);\r\n GetElementPicker.addEventListener('blur',FBlurPtr);\r\n end;\r\nend;\r\n\r\nprocedure TDateTimePicker.UnBindEvents;\r\nbegin\r\n inherited;\r\n\r\n if Assigned(Container) then\r\n begin\r\n TJSHTMLInputElement(Container).removeEventListener('input', FHandleChangePtr);\r\n end;\r\n\r\n if Assigned(FElementCheck) then\r\n FElementCheck.removeEventListener('click',FClickPtr);\r\n\r\n if Assigned(GetElementPicker) then\r\n begin\r\n GetElementPicker.removeEventListener('focus',FFocusPtr);\r\n GetElementPicker.removeEventListener('blur',FBlurPtr);\r\n end;\r\nend;\r\n\r\n\r\nprocedure TDateTimePicker.Change;\r\nbegin\r\n FTime := GetTime;\r\n FDate := GetDate;\r\n if Assigned(OnChange) then\r\n OnChange(Self);\r\nend;\r\n\r\nprocedure TDateTimePicker.Clear;\r\nbegin\r\n TJSHTMLInputElement(GetElementPicker).value := '';\r\nend;\r\n\r\nprocedure TDateTimePicker.ClearMethodPointers;\r\nbegin\r\n inherited;\r\n FHandleChangePtr := nil;\r\n FBlurPtr := nil;\r\n FFocusPtr := nil;\r\n FClickPtr := nil;\r\nend;\r\n\r\nfunction TDateTimePicker.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('DIV');\r\n\r\n FElementCheck := TJSHTMLElement(document.createElement('INPUT'));\r\n FElementPicker := TJSHTMLElement(document.createElement('INPUT'));\r\n\r\n Result.appendChild(FElementCheck);\r\n Result.appendChild(FElementPicker);\r\nend;\r\n\r\nprocedure TDateTimePicker.CreateInitialize;\r\nbegin\r\n inherited;\r\n Date := now;\r\n ShowFocus := true;\r\n Width := 170;\r\n Height := 25;\r\n FDate := Int(Now);\r\n FTime := 0;\r\n FReadOnly := false;\r\n FShowSeconds := true;\r\nend;\r\n\r\nfunction TDateTimePicker.DoCheckClick(Event: TEventListenerEvent): Boolean;\r\nbegin\r\n FChecked := TJSHTMLInputElement(FElementCheck).checked;\r\n\r\n if FChecked then\r\n GetElementPicker.removeAttribute('disabled')\r\n else\r\n GetElementPicker.setAttribute('disabled','true');\r\n\r\n Result := true;\r\nend;\r\n\r\nfunction TDateTimePicker.DoHandleChange(Event: TEventListenerEvent): Boolean;\r\nbegin\r\n Change;\r\n Result := true;\r\nend;\r\n\r\nfunction TDateTimePicker.DoPickerBlur(Event: TEventListenerEvent): Boolean;\r\nbegin\r\n ElementHandle.style.setProperty('outline','none');\r\n Result := true;\r\nend;\r\n\r\nfunction TDateTimePicker.DoPickerFocus(Event: TEventListenerEvent): Boolean;\r\nbegin\r\n ElementHandle.style.setProperty('outline','auto');\r\n Result := true;\r\nend;\r\n\r\nfunction TDateTimePicker.GetDate: TDate;\r\nvar\r\n str: string;\r\n ye,mo,da: string;\r\n yei,moi,dai: word;\r\n e: integer;\r\n\r\nbegin\r\n Result := Int(FDate) + Frac(FTime);\r\n if not Assigned(GetElementPicker) then\r\n Exit;\r\n\r\n str := TJSHTMLInputElement(GetElementPicker).value;\r\n\r\n if Kind = dtkDate then\r\n begin\r\n ye := copy(str,1,4);\r\n mo := copy(str,6,2);\r\n da := copy(str,9,2);\r\n\r\n val(ye, yei, e);\r\n val(mo, moi, e);\r\n val(da, dai, e);\r\n\r\n if (yei <> 0) and (moi <> 0) and (dai <> 0) then\r\n Result := EncodeDate(yei, moi, dai) + Frac(FTime)\r\n else\r\n Result := FTime;\r\n end\r\n else\r\n Result := FTime;\r\nend;\r\n\r\nfunction TDateTimePicker.GetDateTime: TDateTime;\r\nbegin\r\n Result := Int(FDate) + Frac(FTime);\r\nend;\r\n\r\nfunction TDateTimePicker.GetElementPicker: TJSHTMLElement;\r\nbegin\r\n if IsLinked then\r\n Result := ElementHandle\r\n else\r\n Result := FElementPicker;\r\nend;\r\n\r\nprocedure TDateTimePicker.SetText(const Value: String);\r\nbegin\r\n if not Assigned(GetElementPicker) then\r\n Exit;\r\nend;\r\n\r\nprocedure TDateTimePicker.SetTime(AValue: TTime);\r\nbegin\r\n if FTime <> AValue then\r\n begin\r\n FDate := 0;\r\n FTime := AValue;\r\n UpdateElementData;\r\n end;\r\nend;\r\n\r\nprocedure TDateTimePicker.UpdateElementData;\r\nbegin\r\n inherited;\r\n\r\n if Assigned(GetElementPicker) then\r\n begin\r\n GetElementPicker['step'] := '1';\r\n\r\n case Kind of\r\n dtkTime:\r\n begin\r\n TJSHTMLInputElement(GetElementPicker).value := FormatDateTime(LongTimeFormat, FTime);\r\n if not ShowSeconds then\r\n GetElementPicker['step'] := '60';\r\n end;\r\n dtkDate:\r\n begin\r\n if FDate = 0 then\r\n TJSHTMLInputElement(GetElementPicker).value := ''\r\n else\r\n TJSHTMLInputElement(GetElementPicker).value := FormatDateTime('yyyy-MM-dd', FDate);\r\n end;\r\n end;\r\n\r\n TJSHTMLInputElement(GetElementPicker).readOnly := IsReadOnly;\r\n end;\r\nend;\r\n\r\nprocedure TDateTimePicker.UpdateElementVisual;\r\nbegin\r\n inherited;\r\n\r\n if Assigned(GetElementPicker) and Assigned(ElementHandle) and Assigned(FElementCheck) then\r\n begin\r\n FElementCheck['type'] := 'CHECKBOX';\r\n\r\n if FKind = dtkDate then\r\n GetElementPicker['type'] := 'DATE'\r\n else\r\n GetElementPicker['type'] := 'TIME';\r\n\r\n GetElementPicker.style.setProperty('border','none');\r\n GetElementPicker.style.setProperty('border-width','0px');\r\n GetElementPicker.style.setProperty('outline','none');\r\n GetElementPicker.style.setProperty('font-family','inherit');\r\n GetElementPicker.style.setProperty('font-size','inherit');\r\n GetElementPicker.style.setProperty('width','100%');\r\n GetElementPicker.style.setProperty('height','100%');\r\n\r\n ElementHandle.style.setProperty('padding','1px');\r\n ElementHandle.style.setProperty('outline','none');\r\n\r\n if BorderStyle = bsSingle then\r\n ElementHandle.style.setProperty('border','1px solid')\r\n else\r\n ElementHandle.style.removeProperty('border');\r\n\r\n if Assigned(FElementCheck) then\r\n begin\r\n if ShowCheckBox then\r\n FElementCheck.style.SetProperty('display','')\r\n else\r\n FElementCheck.style.SetProperty('display','none');\r\n end;\r\n\r\n if ShowCheckBox then\r\n begin\r\n if Checked then\r\n GetElementPicker.removeAttribute('disabled')\r\n else\r\n GetElementPicker.setAttribute('disabled','true');\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TDateTimePicker.GetText: String;\r\nbegin\r\n Result := '';\r\n if not Assigned(GetElementPicker) then\r\n Exit;\r\n\r\n Result := TJSHTMLInputElement(GetElementPicker).value;\r\nend;\r\n\r\nfunction TDateTimePicker.GetTime: TTime;\r\nvar\r\n str: string;\r\n d: TDateTime;\r\nbegin\r\n if FDate > 0 then\r\n Result := Frac(FTime) + Int(FDate)\r\n else\r\n Result := Frac(FTime);\r\n\r\n if not Assigned(GetElementPicker) then\r\n Exit;\r\n\r\n str := TJSHTMLInputElement(GetElementPicker).value;\r\n if TryStrToTime(str, d) then\r\n begin\r\n Result := d + Int(FDate);\r\n end;\r\nend;\r\n\r\nfunction TDateTimePicker.IsReadOnly: boolean;\r\nbegin\r\n Result := FReadOnly;\r\nend;\r\n\r\nprocedure TDateTimePicker.SetKind(AValue: TDateTimeKind);\r\nvar\r\n dt: TDateTime;\r\nbegin\r\n FKind := AValue;\r\n if Assigned(GetElementPicker) then\r\n begin\r\n dt := Int(FDate) + Frac(FTime);\r\n if AValue = dtkDate then\r\n GetElementPicker['type'] := 'DATE'\r\n else\r\n GetElementPicker['type'] := 'TIME';\r\n\r\n Date := dt;\r\n Time := dt;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TDateTimePicker.SetReadOnly(const Value: boolean);\r\nbegin\r\n FReadOnly := Value;\r\n UpdateElement;\r\nend;\r\n\r\nprocedure TDateTimePicker.SetShowCheckBox(const Value: boolean);\r\nbegin\r\n if (FShowCheckBox <> Value) then\r\n begin\r\n FShowCheckBox := Value;\r\n UpdateElementVisual;\r\n end;\r\nend;\r\n\r\nprocedure TDateTimePicker.SetShowSeconds(const Value: boolean);\r\nbegin\r\n if (FShowSeconds <> Value) then\r\n begin\r\n FShowSeconds := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\n{ TButton }\r\n\r\nprocedure TButton.CreateInitialize;\r\nbegin\r\n inherited;\r\n if (csDesigning in ComponentState) and (Caption = '') then\r\n Caption := Name;\r\n Color := clNone;\r\nend;\r\n\r\nfunction TButton.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('BUTTON');\r\n Result['type'] := 'BUTTON';\r\nend;\r\n\r\nprocedure TButton.SetCaption(const AValue: string);\r\nbegin\r\n if Caption <> AValue then\r\n begin\r\n inherited SetCaption(AValue);\r\n UpdateElementData;\r\n end;\r\nend;\r\n\r\nprocedure TButton.SetDefault(const Value: Boolean);\r\nbegin\r\n FDefault := Value;\r\n if FDefault then\r\n SetFocus;\r\nend;\r\n\r\nprocedure TButton.SetButtonType(const Value: string);\r\nbegin\r\n FButtonType := Value;\r\n UpdateElementData;\r\nend;\r\n\r\nprocedure TButton.UpdateElementData;\r\nvar\r\n acc: string;\r\nbegin\r\n inherited;\r\n\r\n if IsLinked and (Caption = '') then\r\n Exit;\r\n\r\n if Assigned(ElementHandle) then\r\n begin\r\n if (ElementHandle.childElementCount = 0) or not IsLinked then\r\n ElementHandle.innerHTML := ProcessAccelerator(Caption,acc);\r\n\r\n if acc <> '' then\r\n ElementHandle['accesskey'] := acc;\r\n\r\n ElementHandle['role'] := 'button';\r\n ElementHandle['aria-label'] := Caption;\r\n\r\n if FButtonType <> '' then\r\n ElementHandle['type'] := FButtonType\r\n else\r\n ElementHandle['type'] := 'BUTTON';\r\n end;\r\nend;\r\n\r\nprocedure TButton.UpdateElementVisual;\r\nvar\r\n ecn: string;\r\nbegin\r\n inherited;\r\n if Assigned(ElementHandle) then\r\n begin\r\n ElementHandle.style.removeProperty('outline');\r\n ElementHandle.style.removeProperty('user-select');\r\n\r\n ecn := Uppercase(ElementClassName);\r\n\r\n if (ecn = 'BTN') or (pos('BTN ', ecn) > 0) then\r\n begin\r\n// ElementHandle.style.setProperty('border','none');\r\n end;\r\n end;\r\nend;\r\n\r\n{ TCheckBox }\r\n\r\nprocedure TCheckBox.CreateInitialize;\r\nbegin\r\n inherited;\r\n Color := clNone;\r\n FChecked := False;\r\n FState := cbUnchecked;\r\n\r\n if (csDesigning in ComponentState) and (Caption = '') then\r\n Caption := Name;\r\n\r\n ShowFocus := true;\r\nend;\r\n\r\nprocedure TCheckBox.DoCheckClick;\r\nbegin\r\n if Assigned(OnCheckClick) then\r\n OnCheckClick(Self);\r\nend;\r\n\r\nprocedure TCheckBox.Click;\r\nbegin\r\n inherited;\r\n FChecked := GetChecked;\r\n if FChecked then\r\n FState := cbChecked\r\n else\r\n FState := cbUnChecked;\r\n\r\n SetFocus;\r\nend;\r\n\r\nfunction TCheckBox.CreateElement: TJSElement;\r\nvar\r\n btn, lbl: TJSElement;\r\nbegin\r\n Result := document.createElement('SPAN');\r\n btn := document.createElement('INPUT');\r\n lbl := document.createElement('SPAN');\r\n\r\n btn['TYPE'] := 'CHECKBOX';\r\n btn['id'] := GetID;\r\n btn['role'] := 'checkbox';\r\n lbl['id'] := GetID + 'lbl';\r\n lbl['value'] := GetID;\r\n\r\n Result.appendChild(btn);\r\n Result.appendChild(lbl);\r\n\r\n (btn as TJSHTMLInputElement).OnClick := @HandleCheckClick;\r\nend;\r\n\r\nfunction TCheckBox.HandleCheckClick(Event: TJSMouseEvent): Boolean;\r\nbegin\r\n DoCheckClick;\r\n Result := true;\r\nend;\r\n\r\nfunction TCheckBox.HandleLabelClick(Event: TJSMouseEvent): Boolean;\r\nvar\r\n chk: TJSHTMLInputElement;\r\nbegin\r\n if Assigned(Container) and Enabled then\r\n begin\r\n chk := TJSHTMLInputElement(GetCheckElement);\r\n chk.checked := not chk.checked;\r\n\r\n Checked := chk.checked;\r\n end;\r\n DoCheckClick;\r\n Result := true;\r\nend;\r\n\r\nprocedure TCheckBox.KeyPress(var ch: char);\r\nvar\r\n chk: TJSHTMLInputElement;\r\nbegin\r\n inherited;\r\n if ch = #32 then\r\n begin\r\n if Assigned(Container) then\r\n begin\r\n chk := TJSHTMLInputElement(GetCheckElement);\r\n chk.checked := not chk.checked;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TCheckBox.Loaded;\r\nvar\r\n lbl: TJSHTMLInputElement;\r\n\r\nbegin\r\n inherited;\r\n\r\n if Assigned(Container) then\r\n begin\r\n if not IsLinked then\r\n begin\r\n lbl := TJSHTMLInputElement(Container.children[1]);\r\n lbl.OnClick := @HandleLabelClick;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TCheckBox.UpdateElementData;\r\nvar\r\n chk: TJSHTMLInputElement;\r\n btn: TJSElement;\r\nbegin\r\n inherited;\r\n\r\n if Assigned(Container) then\r\n begin\r\n chk := TJSHTMLInputElement(GetCheckElement);\r\n chk.disabled := not IsEnabled;\r\n chk.checked := FChecked;\r\n chk.indeterminate := (State = cbGrayed);\r\n\r\n if not IsLinked then\r\n begin\r\n if (Caption <> '') then\r\n Container.lastElementChild.innerHTML := Caption;\r\n\r\n ElementHandle.setAttribute('tabindex','-1');\r\n\r\n btn := TJSElement(ElementHandle.firstChild);\r\n btn.setAttribute('tabindex','-1');\r\n end;\r\n\r\n if TabStop then\r\n Container.setAttribute('tabindex',inttostr(TabOrder));\r\n end;\r\nend;\r\n\r\nprocedure TCheckBox.UpdateElementSize;\r\nbegin\r\n inherited;\r\n\r\n if Assigned(Container) and not IsLinked and (ElementPosition = epAbsolute) then\r\n begin\r\n if HeightStyle <> ssAuto then\r\n TJSHTMLElement(Container.firstElementChild).style.setProperty('height','100%')\r\n else\r\n TJSHTMLElement(Container.firstElementChild).style.removeProperty('height');\r\n end;\r\nend;\r\n\r\nprocedure TCheckBox.UpdateElementVisual;\r\nvar\r\n btn,lbl: TJSElement;\r\nbegin\r\n inherited;\r\n\r\n if Assigned(ElementHandle) then\r\n begin\r\n btn := TJSElement(ElementHandle.firstChild);\r\n\r\n if Assigned(btn) then\r\n begin\r\n if FElementButtonClassName <> '' then\r\n btn.setAttribute('class',FElementButtonClassName)\r\n else\r\n btn.removeAttribute('class');\r\n end;\r\n\r\n lbl := TJSElement(ElementHandle.lastElementChild);\r\n\r\n if Assigned(lbl) then\r\n begin\r\n if FElementLabelClassName <> '' then\r\n lbl.setAttribute('class',FElementLabelClassName)\r\n else\r\n lbl.removeAttribute('class');\r\n end;\r\n\r\n if not TabStop or not ShowFocus or (ElementClassName <> '') then\r\n ElementHandle.style.setProperty('outline','none');\r\n\r\n if not IsLinked then\r\n begin\r\n ElementHandle.style.setProperty('user-select','none');\r\n\r\n if ElementPosition = epAbsolute then\r\n begin\r\n if ElementButtonClassName = '' then\r\n begin\r\n TJSHTMLElement(btn).style.setProperty('float','left');\r\n\r\n if HeightStyle = ssAuto then\r\n TJSHTMLElement(btn).style.removeProperty('height')\r\n else\r\n if (ElementPosition = epAbsolute) then\r\n TJSHTMLElement(btn).style.setProperty('height','100%');\r\n\r\n TJSHTMLElement(btn).style.setProperty('vertical-align','middle');\r\n TJSHTMLElement(btn).style.setProperty('margin-top','0px');\r\n TJSHTMLElement(btn).style.setProperty('margin-bottom','0px');\r\n end;\r\n\r\n if ElementLabelClassName = '' then\r\n begin\r\n lbl := TJSElement(Container.lastElementChild);\r\n TJSHTMLElement(lbl).style.setProperty('vertical-align','middle');\r\n TJSHTMLElement(lbl).style.setProperty('min-height','100%');\r\n TJSHTMLElement(lbl).style.setProperty('height','100%');\r\n TJSHTMLElement(lbl).style.setProperty('position','absolute');\r\n TJSHTMLElement(lbl).style.setProperty('overflow','hidden');\r\n TJSHTMLElement(lbl).style.setProperty('display','inline-flex');\r\n TJSHTMLElement(lbl).style.setProperty('align-items','center');\r\n end;\r\n end;\r\n end;\r\n\r\n end;\r\nend;\r\n\r\nprocedure TCheckBox.SetCaption(const AValue: string);\r\nbegin\r\n if Caption <> AValue then\r\n begin\r\n inherited SetCaption(AValue);\r\n if Assigned(Container) and not IsLinked then\r\n Container.lastElementChild.innerHTML := AValue;\r\n end;\r\nend;\r\n\r\nprocedure TCheckBox.SetEnabled(Value: boolean);\r\nbegin\r\n inherited;\r\n if Assigned(Container) then\r\n TJSHTMLInputElement(GetCheckElement).disabled := not Value;\r\nend;\r\n\r\nprocedure TCheckBox.SetChecked(AValue: boolean);\r\nbegin\r\n FChecked := AValue;\r\n if AValue then\r\n FState := cbChecked\r\n else\r\n FState := cbUnChecked;\r\n\r\n UpdateElement;\r\nend;\r\n\r\nfunction TCheckBox.GetChecked: boolean;\r\nbegin\r\n if Assigned(Container) then\r\n FChecked := TJSHTMLInputElement(GetCheckElement).checked;\r\n\r\n Result := FChecked;\r\nend;\r\n\r\nfunction TCheckBox.GetCheckElement: TJSHTMLElement;\r\nbegin\r\n if IsLinked then\r\n Result := TJSHTMLElement(ElementHandle)\r\n else\r\n Result := TJSHTMLElement(Container.firstElementChild);\r\nend;\r\n\r\nprocedure TCheckBox.SetState(AValue: TCheckBoxState);\r\nbegin\r\n FState := AValue;\r\n FChecked := FState = cbChecked;\r\n UpdateElement;\r\nend;\r\n\r\nfunction TCheckBox.GetState: TCheckBoxState;\r\nbegin\r\n Result := FState;\r\nend;\r\n\r\nprocedure TCheckBox.PersistinHTML;\r\nvar\r\n cb: TJSHTMLInputElement;\r\nbegin\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n cb := TJSHTMLInputElement(GetCheckElement);\r\n\r\n if (cb.checked) then\r\n cb.setAttribute('checked','checked')\r\n else\r\n cb.removeAttribute('checked');\r\nend;\r\n\r\nprocedure TCheckBox.LoadState(AState: string);\r\nvar\r\n cb: TJSHTMLInputElement;\r\nbegin\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n cb := TJSHTMLInputElement(GetCheckElement);\r\n cb.checked := AState = '1';\r\nend;\r\n\r\nfunction TCheckBox.SaveState: string;\r\nvar\r\n cb: TJSHTMLInputElement;\r\nbegin\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n cb := TJSHTMLInputElement(GetCheckElement);\r\n\r\n if (cb.checked) then\r\n Result := '1'\r\n else\r\n Result := '0';\r\nend;\r\n\r\n{ TRadioButton }\r\n\r\nprocedure TRadioButton.CreateInitialize;\r\nbegin\r\n inherited;\r\n Color := clNone;\r\n\r\n if (csDesigning in ComponentState) and (Caption = '') then\r\n Caption := Name;\r\n\r\n FGroupName := '';\r\n ShowFocus := true;\r\nend;\r\n\r\nfunction TRadioButton.CreateElement: TJSElement;\r\nvar\r\n btn, lbl: TJSElement;\r\nbegin\r\n Result := document.createElement('SPAN');\r\n btn := document.createElement('INPUT');\r\n lbl := document.createElement('SPAN');\r\n Result.addEventListener('click', @HandleLabelClick);\r\n\r\n btn['TYPE'] := 'RADIO';\r\n btn['id'] := GetID + 'rd';\r\n btn['name'] := GroupName;\r\n btn['role'] := 'radio';\r\n btn['tabindex'] := '-1';\r\n btn.AddEventListener('click',@HandleRadioClick);\r\n\r\n lbl['id'] := GetID + 'lbl';\r\n lbl['value'] := GetID;\r\n\r\n Result.appendChild(btn);\r\n Result.appendChild(lbl);\r\nend;\r\n\r\nfunction TRadioButton.HandleLabelClick(Event: TJSMouseEvent): Boolean;\r\nvar\r\n rb: TJSHTMLInputElement;\r\nbegin\r\n if Assigned(Container) and Enabled then\r\n begin\r\n rb := TJSHTMLInputElement(GetRadioElement);\r\n rb.checked := true;\r\n end;\r\n Result := true;\r\nend;\r\n\r\nfunction TRadioButton.HandleRadioClick(Event: TJSMouseEvent): Boolean;\r\nbegin\r\n SetFocus;\r\n Result := true;\r\nend;\r\n\r\nprocedure TRadioButton.Keypress(var ch: Char);\r\nvar\r\n rb: TJSHTMLInputElement;\r\nbegin\r\n inherited;\r\n if ch = #32 then\r\n begin\r\n rb := TJSHTMLInputElement(GetRadioElement);\r\n rb.checked := true;\r\n end;\r\nend;\r\n\r\nprocedure TRadioButton.LoadState(AState: string);\r\nvar\r\n rb: TJSHTMLInputElement;\r\nbegin\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n rb := TJSHTMLInputElement(GetRadioElement);\r\n rb.checked := AState = '1';\r\nend;\r\n\r\nprocedure TRadioButton.SetCaption(const AValue: string);\r\nbegin\r\n if (Caption <> AValue) then\r\n begin\r\n inherited SetCaption(AValue);\r\n if Assigned(Container) and not IsLinked then\r\n Container.lastElementChild.innerHTML := AValue;\r\n end;\r\nend;\r\n\r\nprocedure TRadioButton.SetEnabled(Value: boolean);\r\nbegin\r\n inherited;\r\n if Assigned(Container) then\r\n TJSHTMLInputElement(GetRadioElement).disabled := not Value;\r\nend;\r\n\r\nprocedure TRadioButton.SetGroupName(AValue: string);\r\nbegin\r\n FGroupName := AValue;\r\n UpdateElementData;\r\nend;\r\n\r\nfunction TRadioButton.SaveState: string;\r\nvar\r\n rb: TJSHTMLInputElement;\r\nbegin\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n rb := TJSHTMLInputElement(GetRadioElement);\r\n\r\n if rb.checked then\r\n Result := '1'\r\n else\r\n Result := '0';\r\nend;\r\n\r\nprocedure TRadioButton.UpdateElementData;\r\nvar\r\n btn: TJSElement;\r\n\r\nbegin\r\n inherited;\r\n if Assigned(Container) then\r\n begin\r\n if IsLinked then\r\n TJSHTMLElement(ElementHandle)['name'] := FGroupName\r\n else\r\n begin\r\n Container.firstElementChild['name'] := FGroupName;\r\n btn := TJSElement(ElementHandle.firstChild);\r\n TJSHTMLInputElement(btn).disabled := not Enabled;\r\n end;\r\n\r\n if not IsLinked then\r\n begin\r\n if (Caption <> '') then\r\n Container.lastElementChild.innerHTML := Caption;\r\n\r\n ElementHandle.setAttribute('tabindex','-1');\r\n\r\n if TabStop and Assigned(btn) then\r\n btn.setAttribute('tabindex','-1');\r\n end;\r\n\r\n if TabStop then\r\n Container.setAttribute('tabindex',inttostr(TabOrder));\r\n end;\r\nend;\r\n\r\nprocedure TRadioButton.UpdateElementSize;\r\nbegin\r\n inherited;\r\n\r\n if Assigned(Container) and not IsLinked then\r\n begin\r\n if (HeightStyle <> ssAuto) then\r\n TJSHTMLElement(Container.firstElementChild).style.setProperty('height','100%')\r\n else\r\n TJSHTMLElement(Container.firstElementChild).style.removeProperty('height')\r\n end;\r\nend;\r\n\r\nprocedure TRadioButton.UpdateElementVisual;\r\nvar\r\n btn,lbl: TJSElement;\r\nbegin\r\n inherited;\r\n\r\n if Assigned(ElementHandle) then\r\n begin\r\n\r\n if not IsLinked then\r\n begin\r\n btn := TJSElement(ElementHandle.firstChild);\r\n TJSHTMLElement(btn).style.setProperty('margin-right','4px');\r\n\r\n if Assigned(btn) then\r\n begin\r\n if FElementButtonClassName <> '' then\r\n btn.setAttribute('class',FElementButtonClassName)\r\n else\r\n btn.removeAttribute('class');\r\n end;\r\n\r\n lbl := TJSElement(ElementHandle.lastElementChild);\r\n\r\n if Assigned(lbl) then\r\n begin\r\n if FElementLabelClassName <> '' then\r\n lbl.setAttribute('class',FElementLabelClassName)\r\n else\r\n lbl.removeAttribute('class');\r\n end;\r\n end;\r\n\r\n if not TabStop or not ShowFocus or (ElementClassName <> '') then\r\n ElementHandle.style.setProperty('outline','none');\r\n\r\n if not IsLinked then\r\n begin\r\n ElementHandle.style.setProperty('user-select','none');\r\n ElementHandle.style.setProperty('white-space','normal');\r\n\r\n if ElementPosition = epAbsolute then\r\n begin\r\n if ElementButtonClassName = '' then\r\n begin\r\n TJSHTMLElement(btn).style.setProperty('float','left');\r\n\r\n if HeightStyle <> ssAuto then\r\n TJSHTMLElement(btn).style.setProperty('height','100%')\r\n else\r\n TJSHTMLElement(btn).style.removeProperty('height');\r\n TJSHTMLElement(btn).style.setProperty('vertical-align','middle');\r\n TJSHTMLElement(btn).style.setProperty('margin-top','0px');\r\n TJSHTMLElement(btn).style.setProperty('margin-bottom','0px');\r\n end;\r\n\r\n if ElementLabelClassName = '' then\r\n begin\r\n lbl := TJSElement(Container.lastElementChild);\r\n TJSHTMLElement(lbl).style.setProperty('vertical-align','middle');\r\n TJSHTMLElement(lbl).style.setProperty('min-height','100%');\r\n TJSHTMLElement(lbl).style.setProperty('height','100%');\r\n if not (Parent is TRadioGroup) then\r\n TJSHTMLElement(lbl).style.setProperty('position','absolute');\r\n TJSHTMLElement(lbl).style.setProperty('overflow','hidden');\r\n TJSHTMLElement(lbl).style.setProperty('display','inline-flex');\r\n TJSHTMLElement(lbl).style.setProperty('align-items','center');\r\n end;\r\n end;\r\n end;\r\n\r\n end;\r\nend;\r\n\r\nprocedure TRadioButton.SetChecked(AValue: boolean);\r\nbegin\r\n FChecked := AValue;\r\n\r\n if Assigned(Container) then\r\n TJSHTMLInputElement(GetRadioElement).checked := AValue;\r\nend;\r\n\r\nfunction TRadioButton.GetChecked: boolean;\r\nbegin\r\n Result := FChecked;\r\n if Assigned(Container) then\r\n Result := TJSHTMLInputElement(GetRadioElement).checked;\r\nend;\r\n\r\nfunction TRadioButton.GetRadioElement: TJSHTMLElement;\r\nbegin\r\n if IsLinked then\r\n Result := TJSHTMLElement(ElementHandle)\r\n else\r\n Result := TJSHTMLElement(Container.firstElementChild);\r\nend;\r\n\r\nprocedure TRadioButton.PersistInHTML;\r\nvar\r\n rb: TJSHTMLInputElement;\r\nbegin\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n rb := TJSHTMLInputElement(GetRadioElement);\r\n if (rb.checked) then\r\n rb.setAttribute('checked','checked')\r\n else\r\n rb.removeAttribute('checked');\r\nend;\r\n\r\n{ TListBox }\r\n\r\nprocedure TListBox.CreateInitialize;\r\nbegin\r\n inherited;\r\n FItems := TStringList.Create;\r\n FItems.SkipLastLinebreak := true;\r\n TStringList(FItems).OnChange := DoItemsChange;\r\n FMultiSelect := false;\r\n FSelected := TList.Create;\r\n FItemIndex := -1;\r\n ShowFocus := true;\r\n Width := 160;\r\n Height := 180;\r\nend;\r\n\r\nfunction TListBox.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('SELECT');\r\n Result['Size'] := '2';\r\nend;\r\n\r\ndestructor TListBox.Destroy;\r\nbegin\r\n FItems.Free;\r\n FSelected.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TListBox.DisableDrag;\r\nvar\r\n I: Integer;\r\nbegin\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n for I := 0 to TJSHTMLSelectElement(Container).options.length - 1 do\r\n TJSHTMLOptionElement(TJSHTMLSelectElement(Container).options[I]).Attrs['draggable'] := 'false';\r\nend;\r\n\r\nfunction TListBox.DoHandleChange(Event: TEventListenerEvent): Boolean;\r\nbegin\r\n Change;\r\n Result := True;\r\nend;\r\n\r\nprocedure TListBox.AddItem(Item: string; AObject: TObject);\r\nbegin\r\n FItems.AddObject(Item, AObject);\r\nend;\r\n\r\nprocedure TListBox.BindEvents;\r\nbegin\r\n inherited;\r\n if Assigned(ElementHandle) then\r\n begin\r\n ElementHandle.addEventListener('change', FHandleChangePtr);\r\n end;\r\nend;\r\n\r\nprocedure TListBox.UnBindEvents;\r\nbegin\r\n inherited;\r\n if Assigned(ElementHandle) then\r\n begin\r\n ElementHandle.removeEventListener('change', FHandleChangePtr);\r\n end;\r\nend;\r\n\r\n\r\nprocedure TListBox.Change;\r\nbegin\r\n if Assigned(OnChange) then\r\n OnChange(Self);\r\nend;\r\n\r\nprocedure TListBox.Clear;\r\nbegin\r\n BeginUpdate;\r\n FItems.Clear;\r\n EndUpdate;\r\nend;\r\n\r\nprocedure TListBox.ClearMethodPointers;\r\nbegin\r\n inherited;\r\n FHandleChangePtr := nil;\r\nend;\r\n\r\nprocedure TListBox.ClearSelection;\r\nvar\r\n i: integer;\r\nbegin\r\n ItemIndex := -1;\r\n\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n if ElementHandle.tagName <> 'SELECT' then\r\n Exit;\r\n\r\n for i := 0 to TJSHTMLSelectElement(Container).options.length - 1 do\r\n TJSHTMLOptionElement(TJSHTMLSelectElement(Container).options[i]).selected := false;\r\nend;\r\n\r\nfunction TListBox.SaveState: string;\r\nvar\r\n i: integer;\r\n s: string;\r\nbegin\r\n for i := 0 to Items.Count - 1 do\r\n begin\r\n if Selected[i] then\r\n s := s + ',1'\r\n else\r\n s := s + ',0';\r\n end;\r\n Delete(s,1,1);\r\n Result := s;\r\nend;\r\n\r\nprocedure TListBox.SelectAll;\r\nvar\r\n i: integer;\r\nbegin\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n if ElementHandle.tagName <> 'SELECT' then\r\n Exit;\r\n\r\n for i := 0 to TJSHTMLSelectElement(Container).options.length - 1 do\r\n begin\r\n Selected[i] := true;\r\n TJSHTMLOptionElement(TJSHTMLSelectElement(Container).options[i]).selected := true;\r\n end;\r\nend;\r\n\r\nprocedure TListBox.SetItems(AItems: TStrings);\r\nbegin\r\n FItems.Assign(AItems);\r\nend;\r\n\r\nfunction TListBox.GetCount: Integer;\r\nbegin\r\n Result := FItems.Count;\r\nend;\r\n\r\nfunction TListBox.GetElementSelectHandle: TJSHTMLSelectElement;\r\nbegin\r\n Result := TJSHTMLSelectElement(Container);\r\nend;\r\n\r\nfunction TListBox.GetItemIndex: integer;\r\nbegin\r\n Result := FItemIndex;\r\n if Assigned(Container) then\r\n Result := TJSHTMLSelectElement(Container).selectedIndex;\r\nend;\r\n\r\nprocedure TListBox.GetMethodPointers;\r\nbegin\r\n inherited;\r\n FHandleChangePtr := @DoHandleChange;\r\nend;\r\n\r\nprocedure TListBox.PersistinHTML;\r\nvar\r\n i: integer;\r\nbegin\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n if ElementHandle.tagName <> 'SELECT' then\r\n Exit;\r\n\r\n for i := 0 to TJSHTMLSelectElement(Container).options.length - 1 do\r\n begin\r\n if TJSHTMLOptionElement(TJSHTMLSelectElement(Container).options[i]).selected then\r\n TJSHTMLOptionElement(TJSHTMLSelectElement(Container).options[i]).setAttribute('selected','selected')\r\n else\r\n TJSHTMLOptionElement(TJSHTMLSelectElement(Container).options[i]).removeAttribute('selected');\r\n end;\r\nend;\r\n\r\nprocedure TListBox.SetItemHeight(const Value: Integer);\r\nbegin\r\n FItemHeight := Value;\r\nend;\r\n\r\nprocedure TListBox.SetItemIndex(AIndex: integer);\r\nbegin\r\n if FItemIndex <> AIndex then\r\n begin\r\n FItemIndex := AIndex;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TListBox.SetMultiSelect(AValue: boolean);\r\nbegin\r\n FMultiSelect := AValue;\r\n if Assigned(Container) then\r\n TJSHTMLSelectElement(Container).multiple := AValue;\r\nend;\r\n\r\nfunction TListBox.GetSelCount: integer;\r\nvar\r\n i: integer;\r\nbegin\r\n Result := 0;\r\n\r\n if Assigned(Container) then\r\n begin\r\n for i := 0 to FItems.Count - 1 do\r\n begin\r\n if TJSHTMLOptionElement(TJSHTMLSelectElement(Container).options[i]).selected then\r\n inc(Result);\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TListBox.GetSelected(AIndex: integer): boolean;\r\nbegin\r\n if (AIndex < FSelected.Count) then\r\n Result := boolean(FSelected.Items[AIndex])\r\n else\r\n Result := False;\r\n\r\n if ElementHandle.tagName <> 'SELECT' then\r\n Exit;\r\n\r\n if Assigned(Container) and (AIndex < TJSHTMLSelectElement(Container).options.length) then\r\n Result := TJSHTMLOptionElement(TJSHTMLSelectElement(Container).options[Aindex]).selected;\r\nend;\r\n\r\n\r\nprocedure TListBox.Loaded;\r\nbegin\r\n inherited;\r\n DoUpdateList;\r\n UpdateElement;\r\nend;\r\n\r\nprocedure TListBox.LoadState(AState: string);\r\nvar\r\n sl: TStringList;\r\n i: integer;\r\nbegin\r\n sl := TStringList.Create;\r\n sl.Delimiter := ',';\r\n sl.CommaText := AState;\r\n\r\n for i := 0 to sl.Count - 1 do\r\n begin\r\n Selected[i] := sl.Strings[i] = '1';\r\n end;\r\n\r\n sl.Free;\r\nend;\r\n\r\nprocedure TListBox.SetSelected(AIndex: integer; AValue: boolean);\r\nbegin \r\n while (AIndex >= FSelected.Count) do\r\n FSelected.Add(false);\r\n\r\n FSelected.Items[AIndex] := AValue;\r\n\r\n if Assigned(Container) then\r\n TJSHTMLOptionElement(TJSHTMLSelectElement(Container).options[Aindex]).selected := AValue;\r\nend;\r\n\r\nprocedure TListBox.SetSorted(const Value: Boolean);\r\nbegin\r\n FSorted := Value;\r\n TStringList(Items).Sort;\r\nend;\r\n\r\nprocedure TListBox.UpdateElementData;\r\nbegin\r\n inherited;\r\n\r\n if Assigned(ElementSelectHandle) then\r\n begin\r\n ElementSelectHandle.style.setProperty('overflow', 'auto');\r\n ElementSelectHandle.selectedIndex := FItemIndex;\r\n end;\r\nend;\r\n\r\nprocedure TListBox.UpdateElementVisual;\r\nbegin\r\n inherited;\r\n\r\n if Assigned(ElementSelectHandle) then\r\n begin\r\n ElementSelectHandle.style.setProperty('overflow', 'auto');\r\n ElementSelectHandle['role'] := 'listbox';\r\n ElementSelectHandle['aria-busy'] := 'true';\r\n end;\r\nend;\r\n\r\nprocedure TListBox.UpdateParent;\r\nbegin\r\n inherited;\r\n DoUpdateList;\r\nend;\r\n\r\nprocedure TListBox.DoItemsChange(Sender: TObject);\r\nbegin\r\n DoUpdateList;\r\nend;\r\n\r\nprocedure TListBox.DoUpdateList;\r\nvar\r\n i: integer;\r\n opt: TJSHTMLOptionElement;\r\nbegin\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n if IsUpdating then\r\n Exit;\r\n\r\n if ElementHandle.tagName <> 'SELECT' then\r\n Exit;\r\n\r\n for i := TJSHTMLSelectElement(Container).options.length - 1 downto 0 do\r\n TJSHTMLSelectElement(Container).remove(i);\r\n\r\n for i := 0 to FItems.Count - 1 do\r\n begin\r\n opt := TJSHTMLOptionElement.New(FItems[i]);\r\n opt['role'] := 'listitem';\r\n if DragMode = dmAutomatic then\r\n opt['draggable'] := 'true';\r\n TJSHTMLSelectElement(Container).add(opt);\r\n Selected[i] := false;\r\n end;\r\n\r\n UpdateElementData;\r\nend;\r\n\r\nprocedure TListBox.EnableDrag;\r\nvar\r\n I: Integer;\r\nbegin\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n for I := 0 to TJSHTMLSelectElement(Container).options.length - 1 do\r\n TJSHTMLOptionElement(TJSHTMLSelectElement(Container).options[I]).Attrs['draggable'] := 'true';\r\nend;\r\n\r\nprocedure TListBox.EndUpdate;\r\nbegin\r\n inherited;\r\n DoUpdateList;\r\nend;\r\n\r\n{ TCustomComboBox }\r\n\r\nprocedure TCustomComboBox.AddItem(Item: string; AObject: TObject);\r\nbegin\r\n FItems.AddObject(Item, AObject);\r\nend;\r\n\r\nprocedure TCustomComboBox.BindEvents;\r\nbegin\r\n inherited;\r\n if Assigned(ElementHandle) then\r\n begin\r\n ElementHandle.addEventListener('input', FHandleInputPtr);\r\n ElementHandle.addEventListener('change', FHandleChangePtr);\r\n end;\r\nend;\r\n\r\nprocedure TCustomComboBox.UnBindEvents;\r\nbegin\r\n inherited;\r\n if Assigned(ElementHandle) then\r\n begin\r\n ElementHandle.removeEventListener('input', FHandleInputPtr);\r\n ElementHandle.removeEventListener('change', FHandleChangePtr);\r\n end;\r\nend;\r\n\r\nprocedure TCustomComboBox.Clear;\r\nbegin\r\n Items.Clear;\r\nend;\r\n\r\nprocedure TCustomComboBox.ClearMethodPointers;\r\nbegin\r\n inherited;\r\n FHandleChangePtr := nil;\r\n FHandleInputPtr := nil;\r\nend;\r\n\r\nprocedure TCustomComboBox.CreateInitialize;\r\nbegin\r\n inherited;\r\n FItems := TStringList.Create;\r\n TStringList(FItems).OnChange := DoItemsChange;\r\n FItemIndex := -1;\r\n FStyle := csDropDownList;\r\n ShowFocus := true;\r\n Height := 25;\r\nend;\r\n\r\n\r\nfunction TCustomComboBox.CreateElement: TJSElement;\r\nbegin\r\n if FStyle = csDropDownList then\r\n Result := document.createElement('SELECT')\r\n else\r\n begin\r\n Result := document.createElement('INPUT');\r\n FListName := Name+'_LIST';\r\n Result['list'] := FListName;\r\n end;\r\nend;\r\n\r\ndestructor TCustomComboBox.Destroy;\r\nbegin\r\n FItems.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TCustomComboBox.SetItems(AItems: TStrings);\r\nbegin\r\n FItems.Assign(AItems);\r\nend;\r\n\r\nprocedure TCustomComboBox.SetStyle(const Value: TComboBoxStyle);\r\nbegin\r\n if FStyle <> Value then\r\n begin\r\n FStyle := Value;\r\n if not IsLinked then\r\n RecreateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomComboBox.SetText(const Value: string);\r\nvar\r\n I: Integer;\r\nbegin\r\n if Style = csDropDown then\r\n begin\r\n FText := Value;\r\n UpdateElement;\r\n end\r\n else\r\n begin\r\n for I := 0 to Items.Count - 1 do\r\n begin\r\n if Value = Items[I] then\r\n ItemIndex := I;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TCustomComboBox.SetTextHint(const Value: string);\r\nbegin\r\n if (FTextHint <> Value) then\r\n begin\r\n FTextHint := Value;\r\n DoUpdateList;\r\n end;\r\nend;\r\n\r\nprocedure TCustomComboBox.UpdateElementData;\r\nvar\r\n d: integer;\r\nbegin\r\n inherited;\r\n\r\n if Style = csDropDown then\r\n begin\r\n if Assigned(ElementHandle) then\r\n begin\r\n TJSHTMLInputELement(ElementHandle).Value := FText;\r\n\r\n FListName := Name+'_LIST';\r\n ElementHandle['list'] := FListName;\r\n end;\r\n end\r\n else\r\n if Assigned(ElementSelectHandle) then\r\n begin\r\n d := 0;\r\n if (TextHint <> '') then\r\n d := 1;\r\n\r\n ElementSelectHandle.selectedIndex := FItemIndex + d;\r\n ElementSelectHandle['role'] := 'combobox';\r\n end;\r\nend;\r\n\r\nprocedure TCustomComboBox.UpdateParent;\r\nbegin\r\n inherited;\r\n DoUpdateList;\r\nend;\r\n\r\nfunction TCustomComboBox.GetElementSelectHandle: TJSHTMLSelectElement;\r\nbegin\r\n Result := TJSHTMLSelectElement(Container);\r\nend;\r\n\r\nfunction TCustomComboBox.GetItemIndex: integer;\r\nbegin\r\n if Style = csDropDown then\r\n begin\r\n Result := Items.IndexOf(Text);\r\n end\r\n else\r\n begin\r\n Result := FItemIndex;\r\n\r\n if Assigned(Container) then\r\n begin\r\n Result := TJSHTMLSelectElement(Container).selectedIndex;\r\n if TextHint <> '' then\r\n Result := Result - 1;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TCustomComboBox.GetMethodPointers;\r\nbegin\r\n inherited;\r\n FHandleChangePtr := @DoHandleChange;\r\n FHandleInputPtr := @DoHandleInput;\r\nend;\r\n\r\nfunction TCustomComboBox.GetText: string;\r\nbegin\r\n Result := '';\r\n if Style = csDropDown then\r\n begin\r\n if Assigned(ElementHandle) then\r\n Result := TJSHTMLInputElement(ElementHandle).value;\r\n end\r\n else\r\n if ItemIndex >= 0 then\r\n Result := Items[ItemIndex]\r\nend;\r\n\r\nprocedure TCustomComboBox.Change;\r\nbegin\r\n FItemIndex := GetItemIndex;\r\n if Assigned(OnChange) then\r\n OnChange(Self);\r\nend;\r\n\r\nfunction TCustomComboBox.DoHandleChange(Event: TEventListenerEvent): Boolean;\r\nbegin\r\n Change;\r\n Result := True;\r\nend;\r\n\r\nfunction TCustomComboBox.DoHandleInput(Event: TEventListenerEvent): Boolean;\r\nbegin\r\n if Style = csDropDown then\r\n Change;\r\n Result := True;\r\nend;\r\n\r\nprocedure TCustomComboBox.Loaded;\r\nbegin\r\n inherited;\r\n DoUpdateList;\r\nend;\r\n\r\nprocedure TCustomComboBox.LoadState(AState: string);\r\nvar\r\n idx,e: integer;\r\nbegin\r\n val(AState, idx, e);\r\n if e = 0 then\r\n ItemIndex := idx;\r\nend;\r\n\r\nprocedure TCustomComboBox.PersistinHTML;\r\nvar\r\n sel: TJSHTMLElement;\r\nbegin\r\n inherited;\r\n\r\n sel := TJSHTMLElement(ElementHandle.children[ItemIndex]);\r\n if Assigned(sel) then\r\n sel.setAttribute('selected','selected');\r\nend;\r\n\r\nfunction TCustomComboBox.SaveState: string;\r\nbegin\r\n Result := IntToStr(ItemIndex);\r\nend;\r\n\r\nprocedure TCustomComboBox.SetDroppedDown(const Value: Boolean);\r\nbegin\r\n FDroppedDown := Value;\r\nend;\r\n\r\nprocedure TCustomComboBox.SetItemIndex(AIndex: integer);\r\nbegin\r\n if (FItemIndex <> AIndex) then\r\n begin\r\n FItemIndex := AIndex;\r\n\r\n if (AIndex >= 0) and (Style in [csDropDown, csDropDownList]) and (AIndex < Items.Count) then\r\n FText := Items[AIndex];\r\n\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomComboBox.DoItemsChange(Sender: TObject);\r\nbegin\r\n DoUpdateList;\r\nend;\r\n\r\nprocedure TCustomComboBox.AddTextHint;\r\nvar\r\n opt: TJSElement;\r\n\r\nbegin\r\n if (TextHint <> '') and (Style = csDropDownList) then\r\n begin\r\n opt := document.createElement('OPTION');\r\n opt['value'] := '';\r\n opt['disabled'] := 'true';\r\n opt['selected'] := 'true';\r\n opt['hidden'] := 'true';\r\n opt.innerHTML := TextHint;\r\n Container.appendChild(opt);\r\n end;\r\nend;\r\n\r\nprocedure TCustomComboBox.DoUpdateList;\r\nvar\r\n i,j: integer;\r\n s,k,v: string;\r\n opt: TJSElement;\r\n el: TJSElement;\r\nbegin\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n if ElementHandle.tagName = 'INPUT' then\r\n begin\r\n TJSHTMLInputElement(ElementHandle).value := Text;\r\n\r\n el := document.getElementById(Name+'_LIST');\r\n if Assigned(el) then\r\n el.parentNode.removeChild(el);\r\n\r\n if TextHint <> '' then\r\n TJSHTMLInputElement(ElementHandle).placeholder := TextHint;\r\n\r\n el := document.createElement('DATALIST');\r\n el['id'] := FListName;\r\n document.body.appendChild(el);\r\n\r\n for i := 0 to FItems.Count - 1 do\r\n begin\r\n s := FItems[i];\r\n opt := document.createElement('OPTION');\r\n\r\n k := s;\r\n v := s;\r\n j := pos(FItems.NameValueSeparator,s);\r\n\r\n if j > 0 then\r\n begin\r\n v := copy(s,1,j-1);\r\n k := copy(s,j+1,$FFFF);\r\n end;\r\n\r\n opt['value'] := v;\r\n opt.innerHTML := k;\r\n el.appendChild(opt);\r\n end;\r\n\r\n end\r\n else\r\n begin\r\n if ElementHandle.tagName <> 'SELECT' then\r\n Exit;\r\n\r\n for i := TJSHTMLSelectElement(Container).options.length - 1 downto 0 do\r\n TJSHTMLSelectElement(Container).remove(i);\r\n\r\n AddTextHint;\r\n\r\n for i := 0 to FItems.Count - 1 do\r\n begin\r\n s := FItems[i];\r\n opt := document.createElement('OPTION');\r\n\r\n k := s;\r\n v := s;\r\n j := pos(FItems.NameValueSeparator,s);\r\n\r\n if j > 0 then\r\n begin\r\n v := copy(s,1,j-1);\r\n k := copy(s,j+1,$FFFF);\r\n end;\r\n\r\n opt['value'] := v;\r\n opt.innerHTML := k;\r\n Container.appendChild(opt);\r\n end;\r\n end;\r\n\r\n UpdateElement;\r\nend;\r\n\r\n\r\n{ TFontPicker }\r\n\r\nprocedure TFontPicker.CreateInitialize;\r\nvar\r\n tst: boolean;\r\n \r\n procedure Add(s: string);\r\n begin\r\n asm\r\n tst = d.detect(s);\r\n end;\r\n if tst then\r\n Self.Items.Add(s);\r\n end;\r\n\r\nbegin\r\n inherited;\r\n\r\n asm\r\n var Detector = function() {\r\n // a font will be compared against all the three default fonts.\r\n // and if it doesn't match all 3 then that font is not available.\r\n var baseFonts = ['monospace', 'sans-serif', 'serif'];\r\n\r\n //we use m or w because these two characters take up the maximum width.\r\n // And we use a LLi so that the same matching fonts can get separated\r\n var testString = \"mmmmmmmmmmlli\";\r\n\r\n //we test using 72px font size, we may use any size. I guess larger the better.\r\n var testSize = '72px';\r\n\r\n var h = document.getElementsByTagName(\"body\")[0];\r\n\r\n // create a SPAN in the document to get the width of the text we use to test\r\n var s = document.createElement(\"span\");\r\n s.style.fontSize = testSize;\r\n s.innerHTML = testString;\r\n var defaultWidth = {};\r\n var defaultHeight = {};\r\n for (var index in baseFonts) {\r\n //get the default width for the three base fonts\r\n s.style.fontFamily = baseFonts[index];\r\n h.appendChild(s);\r\n defaultWidth[baseFonts[index]] = s.offsetWidth; //width for the default font\r\n defaultHeight[baseFonts[index]] = s.offsetHeight; //height for the defualt font\r\n h.removeChild(s);\r\n }\r\n\r\n function detect(font) {\r\n var detected = false;\r\n for (var index in baseFonts) {\r\n s.style.fontFamily = font + ',' + baseFonts[index]; // name of the font along with the base font for fallback.\r\n h.appendChild(s);\r\n var matched = (s.offsetWidth != defaultWidth[baseFonts[index]] || s.offsetHeight != defaultHeight[baseFonts[index]]);\r\n h.removeChild(s);\r\n detected = detected || matched;\r\n }\r\n return detected;\r\n }\r\n\r\n this.detect = detect;\r\n };\r\n\r\n var d = new Detector();\r\n //tst = d.detect(\"Arial\");\r\n end;\r\n\r\n Add('Arial');\r\n Add('Arial Black');\r\n Add('Arial Narrow');\r\n Add('Courier');\r\n Add('Courier New');\r\n Add('Georgia');\r\n Add('Lucida Console');\r\n Add('Modena');\r\n Add('Monotype Corsiva');\r\n Add('Papyrus');\r\n Add('Tahoma');\r\n Add('Times');\r\n Add('Times New Roman');\r\n Add('Trebuchet MS');\r\n Add('Verdana');\r\n Add('Verona');\r\nend;\r\n\r\n{ TFontSizePicker }\r\n\r\nprocedure TFontSizePicker.CreateInitialize;\r\nbegin\r\n inherited;\r\n PickerMode := fmPointSize;\r\nend;\r\n\r\nprocedure TFontSizePicker.Init;\r\nbegin\r\n Items.Clear;\r\n\r\n case PickerMode of\r\n fmPointSize:\r\n begin\r\n Items.Add('8');\r\n Items.Add('9');\r\n Items.Add('10');\r\n Items.Add('11');\r\n Items.Add('12');\r\n Items.Add('14');\r\n Items.Add('16');\r\n Items.Add('18');\r\n Items.Add('20');\r\n Items.Add('22');\r\n Items.Add('24');\r\n Items.Add('26');\r\n Items.Add('28');\r\n Items.Add('36');\r\n Items.Add('48');\r\n Items.Add('72');\r\n end;\r\n fmRelativeSize:\r\n begin\r\n Items.Add('8');\r\n Items.Add('9');\r\n Items.Add('10');\r\n Items.Add('14');\r\n Items.Add('18');\r\n Items.Add('24');\r\n Items.Add('36');\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TFontSizePicker.SetPickerMode(const AValue: TFontSizePickerMode);\r\nbegin\r\n FPickerMode := AValue;\r\n Init;\r\nend;\r\n\r\n\r\n{ TCustomMemo }\r\n\r\nfunction TCustomMemo.DoHandleChange(Event: TEventListenerEvent): Boolean;\r\nbegin\r\n Change;\r\n Result := true;\r\nend;\r\n\r\nfunction TCustomMemo.DoHandleCut(Event: TEventListenerEvent): Boolean;\r\nbegin\r\n if not CanCut then\r\n begin\r\n asm\r\n Event.preventDefault();\r\n Event.stopPropagation();\r\n end;\r\n end;\r\n\r\n Result := False;\r\nend;\r\n\r\nprocedure TCustomMemo.BindEvents;\r\nbegin\r\n inherited;\r\n\r\n if Assigned(ElementInputHandle) then\r\n begin\r\n ElementInputHandle.addEventListener('input', FHandleInputPtr);\r\n ElementInputHandle.addEventListener('change', FHandleChangePtr);\r\n ElementInputHandle.addEventListener('paste', FHandlePastePtr);\r\n ElementInputHandle.addEventListener('cut', FHandleCutPtr);\r\n end;\r\nend;\r\n\r\nprocedure TCustomMemo.UnBindEvents;\r\nbegin\r\n inherited;\r\n\r\n if Assigned(ElementInputHandle) then\r\n begin\r\n ElementInputHandle.removeEventListener('input', FHandleInputPtr);\r\n ElementInputHandle.removeEventListener('change', FHandleChangePtr);\r\n ElementInputHandle.removeEventListener('paste', FHandlePastePtr);\r\n ElementInputHandle.removeEventListener('cut', FHandleCutPtr);\r\n end;\r\nend;\r\n\r\n\r\nprocedure TCustomMemo.Change;\r\nbegin\r\n if Assigned(OnChange) then\r\n OnChange(Self);\r\nend;\r\n\r\nprocedure TCustomMemo.Clear;\r\nbegin\r\n Lines.Clear;\r\nend;\r\n\r\nprocedure TCustomMemo.ClearMethodPointers;\r\nbegin\r\n inherited;\r\n FHandleChangePtr := nil;\r\n FHandleInputPtr := nil;\r\n FHandlePastePtr := nil;\r\n FHandleCutPtr := nil;\r\nend;\r\n\r\nprocedure TCustomMemo.CreateInitialize;\r\nbegin\r\n inherited;\r\n FSpellCheck := true;\r\n FLines := TStringList.Create;\r\n FLines.SkipLastLineBreak := true;\r\n TStringList(FLines).OnChange := DoLinesChange;\r\n Width := 400;\r\n Height := 300;\r\n ShowFocus := true;\r\n ClipChildren := false;\r\n FWantTabs := false;\r\n FAutoCompletion := acOff;\r\n FWordWrap := true;\r\n NoUserSelect := false;\r\nend;\r\n\r\nfunction TCustomMemo.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('TEXTAREA');\r\nend;\r\n\r\ndestructor TCustomMemo.Destroy;\r\nbegin\r\n FLines.Free;\r\n inherited;\r\nend;\r\n\r\nfunction TCustomMemo.DoHandleInput(Event: TEventListenerEvent): Boolean;\r\nbegin\r\n GetText;\r\n Change;\r\n Result := True;\r\nend;\r\n\r\nfunction TCustomMemo.DoHandlePaste(Event: TEventListenerEvent): Boolean;\r\nvar\r\n s: string;\r\nbegin\r\n asm\r\n var clipboardData = Event.clipboardData || window.clipboardData;\r\n s = clipboardData.getData('Text');\r\n end;\r\n\r\n if not CanPaste(s) then\r\n begin\r\n asm\r\n Event.preventDefault();\r\n Event.stopPropagation();\r\n end;\r\n end;\r\n\r\n Result:= false;\r\nend;\r\n\r\nprocedure TCustomMemo.DoLinesChange(Sender: TObject);\r\nbegin\r\n if Assigned(ElementInputHandle) and not FBlockChange then\r\n begin\r\n ElementInputHandle.value := GetDisplayText;\r\n ElementInputHandle.readOnly := IsReadOnly;\r\n end;\r\nend;\r\n\r\nfunction TCustomMemo.CanCut: boolean;\r\nbegin\r\n Result := True;\r\nend;\r\n\r\nfunction TCustomMemo.CanPaste(AValue: string): boolean;\r\nbegin\r\n Result := True;\r\nend;\r\n\r\nfunction TCustomMemo.SaveState: string;\r\nbegin\r\n Result := Lines.Text;\r\nend;\r\n\r\nprocedure TCustomMemo.SetAutoCompletion(const Value: TAutoCompletion);\r\nbegin\r\n if (FAutoCompletion <> Value) then\r\n begin\r\n FAutoCompletion := Value;\r\n UpdateElementData;\r\n end;\r\nend;\r\n\r\nprocedure TCustomMemo.SetAutoSize(const Value: Boolean);\r\nbegin\r\n if FAutoSize <> Value then\r\n begin\r\n FAutoSize := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomMemo.SetLines(ALines: TStrings);\r\nbegin\r\n FLines.Assign(ALines);\r\nend;\r\n\r\nprocedure TCustomMemo.SetReadOnly(const Value: boolean);\r\nbegin\r\n if (FReadOnly <> Value) then\r\n begin\r\n FReadOnly := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomMemo.SetSelLength(const Value: Integer);\r\nbegin\r\n if FSelLength <> Value then\r\n begin\r\n FSelLength := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomMemo.SetSelStart(const Value: Integer);\r\nbegin\r\n if FSelStart <> Value then\r\n begin\r\n FSelStart := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomMemo.SetSpellCheck(const Value: boolean);\r\nbegin\r\n if FSpellCheck <> Value then\r\n begin\r\n FSpellCheck := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomMemo.SetText(const Value: String);\r\nbegin\r\n FLines.Text := Value;\r\nend;\r\n\r\nprocedure TCustomMemo.SetTextHint(const Value: string);\r\nbegin\r\n if FTextHint <> Value then\r\n begin\r\n FTextHint := Value;\r\n UpdateElement;\r\n end;\r\n\r\nend;\r\n\r\n{$HINTS OFF}\r\nprocedure TCustomMemo.UpdateElementData;\r\nvar\r\n ss,sl: integer;\r\n e: TJSHTMLElement;\r\nbegin\r\n inherited;\r\n if Assigned(ElementInputHandle) and not FBlockChange then\r\n begin\r\n ElementInputHandle.value := GetDisplayText;\r\n\r\n if (ElementInputHandle.TagName = 'TEXTAREA') then\r\n begin\r\n ElementInputHandle.setSelectionRange(SelStart, SelStart + SelLength);\r\n end;\r\n\r\n if not IsLinked then\r\n begin\r\n ElementInputHandle.style.setProperty('resize', 'none');\r\n end;\r\n\r\n ElementInputHandle.readOnly := IsReadOnly;\r\n\r\n if TextHint <> '' then\r\n ElementInputHandle.placeholder := TextHint;\r\n\r\n if not isLinked then\r\n begin\r\n if AutoCompletion = acNone then\r\n begin\r\n TJSHTMLElement(ElementInputHandle).setAttribute('autocomplete','none');\r\n TJSHTMLElement(ElementInputHandle).removeAttribute('name');\r\n end\r\n else\r\n if AutoCompletion <> acOff then\r\n begin\r\n TJSHTMLElement(ElementInputHandle).setAttribute('autocomplete','on');\r\n TJSHTMLElement(ElementInputHandle).setAttribute('name', GetAutoCompletionName(AutoCompletion));\r\n end\r\n else\r\n begin\r\n TJSHTMLElement(ElementInputHandle).removeAttribute('autocomplete');\r\n TJSHTMLElement(ElementInputHandle).removeAttribute('name');\r\n end;\r\n\r\n ss := FSelStart;\r\n sl := FSelStart + FSelLength;\r\n e := ElementInputHandle;\r\n asm\r\n setTimeout(function() {\r\n e.setSelectionRange(ss, sl);\r\n }, 1);\r\n end;\r\n end;\r\n end;\r\nend;\r\n{$HINTS ON}\r\n\r\nprocedure TCustomMemo.UpdateElementVisual;\r\nbegin\r\n inherited;\r\n if Assigned(ElementInputHandle) and not FBlockChange and not IsLinked then\r\n begin\r\n ElementInputHandle.style.setProperty('overflow', 'auto');\r\n ElementInputHandle.style.setProperty('margin', '0');\r\n\r\n if (Color <> clNone) and (Color <> clWindow) then\r\n ElementInputHandle.style.setProperty('background-color', ColorToHtml(Color))\r\n else\r\n ElementInputHandle.style.removeProperty('background-color');\r\n\r\n if not SpellCheck then\r\n ElementInputHandle['spellcheck'] := 'false'\r\n else\r\n ElementInputHandle.removeAttribute('spellcheck');\r\n end;\r\nend;\r\n\r\nfunction TCustomMemo.GetText: String;\r\nbegin\r\n if Assigned(ElementInputHandle) then\r\n begin\r\n FBlockChange := True;\r\n FLines.Text := ElementInputHandle.value;\r\n FBlockChange := False;\r\n end;\r\n\r\n Result := FLines.Text;\r\nend;\r\n\r\n{$HINTS OFF}\r\nfunction TCustomMemo.HandleDoKeyDown(Event: TJSKeyBoardEvent): Boolean;\r\nvar\r\n eh: TJSHTMLElement;\r\nbegin\r\n if (GetKeyCode(Event.Key) = 9) and WantTabs then\r\n begin\r\n eh := ElementInputHandle;\r\n\r\n asm\r\n var sstart = eh.selectionStart;\r\n var send = eh.selectionEnd;\r\n\r\n eh.value = eh.value.substring(0, sstart) + \"\\t\" +eh.value.substring(send);\r\n // put caret at right position again\r\n eh.selectionStart = eh.selectionEnd = sstart + 1;\r\n\r\n Event.stopPropagation();\r\n Event.preventDefault();\r\n end;\r\n end\r\n else\r\n inherited;\r\nend;\r\n{$HINTS ON}\r\n\r\nfunction TCustomMemo.IsInputControl: Boolean;\r\nbegin\r\n Result := True;\r\nend;\r\n\r\nfunction TCustomMemo.IsReadOnly: boolean;\r\nbegin\r\n Result := FReadOnly;\r\nend;\r\n\r\nprocedure TCustomMemo.LoadState(AState: string);\r\nbegin\r\n Lines.Text := AState;\r\nend;\r\n\r\nprocedure TCustomMemo.PersistinHTML;\r\nbegin\r\n ElementInputHandle.innerHTML := Lines.Text;\r\nend;\r\n\r\nfunction TCustomMemo.GetDisplayText: string;\r\nbegin\r\n Result := FLines.Text;\r\nend;\r\n\r\nfunction TCustomMemo.GetElementInputHandle: TJSHTMLInputElement;\r\nbegin\r\n Result := TJSHTMLInputElement(Container);\r\nend;\r\n\r\nprocedure TCustomMemo.GetMethodPointers;\r\nbegin\r\n inherited;\r\n FHandleChangePtr := @DoHandleChange;\r\n FHandleInputPtr := @DoHandleInput;\r\n FHandlePastePtr := @DoHandlePaste;\r\n FHandleCutPtr := @DoHandleCut;\r\nend;\r\n\r\nfunction TCustomMemo.GetSelLength: Integer;\r\nbegin\r\n Result := -1;\r\n if Assigned(ElementInputHandle) then\r\n Result := ElementInputHandle.selectionEnd - ElementInputHandle.selectionStart;\r\nend;\r\n\r\nfunction TCustomMemo.GetSelStart: Integer;\r\nbegin\r\n Result := -1;\r\n if Assigned(ElementInputHandle) then\r\n Result := ElementInputHandle.selectionStart;\r\nend;\r\n\r\n{ TControlGroup }\r\n\r\nprocedure TControlGroup.CreateInitialize;\r\nbegin\r\n inherited;\r\n FColumns := 1;\r\n FControls := TList.Create;\r\n FItems := TStringList.Create;\r\n TStringList(FItems).OnChange := DoItemsChange;\r\n //BorderWidth := 1;\r\n FOldCount := -1;\r\n FControlPosition := epAbsolute;\r\n Width := 200;\r\n Height := 200;\r\nend;\r\n\r\nprocedure TControlGroup.Change;\r\nbegin\r\n if Assigned(OnChange) then\r\n OnChange(Self);\r\nend;\r\n\r\nfunction TControlGroup.CreateGroupControl(ALeft, ATop, AIndex: integer;\r\n ACaption: string; APosition: TElementPosition; AState, AEnabled: boolean): TCustomControl;\r\nbegin\r\n //\r\n Result := nil;\r\nend;\r\n\r\nfunction TControlGroup.CreateElement: TJSElement;\r\nvar\r\n legend: TJSElement;\r\nbegin\r\n Result := document.createElement('FIELDSET');\r\n legend := document.createElement('LEGEND');\r\n Result.appendChild(legend);\r\n legend.innerHTML := Caption;\r\n legend['class'] := 'w-auto';\r\n\r\n if Caption = '' then\r\n TJSHTMLElement(legend).style.setProperty('display', 'none')\r\n else\r\n TJSHTMLElement(legend).style.setProperty('display', '');\r\n\r\n TJSHTMLElement(Result).style.setProperty('display', 'inline-block');\r\n\r\n TJSHTMLElement(Result).style.setProperty('-webkit-padding-before','0px');\r\n TJSHTMLElement(Result).style.setProperty('-webkit-padding-after','0px');\r\n TJSHTMLElement(Result).style.setProperty('-webkit-padding-end','0px');\r\n TJSHTMLElement(Result).style.setProperty('-webkit-padding-start','0px');\r\n TJSHTMLElement(Result).style.setProperty('border','1px');\r\nend;\r\n\r\ndestructor TControlGroup.Destroy;\r\nbegin\r\n FControls.Free;\r\n FItems.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TControlGroup.Loaded;\r\nbegin\r\n inherited;\r\n DoUpdateList;\r\nend;\r\n\r\nprocedure TControlGroup.SetCaption(const AValue: string);\r\nvar\r\n el: TJSHTMLElement;\r\nbegin\r\n inherited SetCaption(AValue);\r\n\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n el := TJSHTMLElement(Container.firstElementChild);\r\n\r\n if Assigned(el) then\r\n begin\r\n el.innerHTML := AValue;\r\n\r\n if AValue = '' then\r\n el.style.setProperty('display', 'none')\r\n else\r\n el.style.setProperty('display', '');\r\n end;\r\nend;\r\n\r\nprocedure TControlGroup.SetColumns(AValue: integer);\r\nbegin\r\n if (FColumns > 0) and (FColumns <> AValue) then\r\n begin\r\n FColumns := AValue;\r\n DoUpdateList;\r\n end;\r\nend;\r\n\r\nprocedure TControlGroup.SetControlPosition(const Value: TElementPosition);\r\nbegin\r\n if (FControlPosition <> Value) then\r\n begin\r\n FControlPosition := Value;\r\n DoUpdateList;\r\n end;\r\nend;\r\n\r\nprocedure TControlGroup.SetHeight(AValue: Integer);\r\nbegin\r\n inherited;\r\n DoUpdateList;\r\nend;\r\n\r\nprocedure TControlGroup.SetItems(AItems: TStrings);\r\nbegin\r\n FItems.Assign(AItems);\r\n DoUpdateList;\r\nend;\r\n\r\nprocedure TControlGroup.SetWidth(AValue: Integer);\r\nbegin\r\n inherited;\r\n DoUpdateList;\r\nend;\r\n\r\nfunction TControlGroup.DoHandleChange(Event: TEventListenerEvent): Boolean;\r\nbegin\r\n Change;\r\n Result := true;\r\nend;\r\n\r\nprocedure TControlGroup.DoHandleClick(AControl: TCustomControl);\r\nbegin\r\n Change;\r\nend;\r\n\r\nprocedure TControlGroup.DoItemsChange(Sender: TObject);\r\nbegin\r\n DoUpdateList;\r\nend;\r\n\r\nprocedure TControlGroup.DoControlClick(Sender: TObject);\r\nbegin\r\n DoHandleClick((Sender as TCustomControl));\r\nend;\r\n\r\nprocedure TControlGroup.DoUpdateList;\r\nvar\r\n i: integer;\r\n s: string;\r\n rd: TCustomControl;\r\n dx, dy, dc, col, row, ypos: integer;\r\n legend: TJSElement;\r\nbegin\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n if FItems.Count = 0 then\r\n Exit;\r\n\r\n dy := Round(Font.Size * 2.5);\r\n dx := Width div FColumns;\r\n if Caption <> '' then\r\n dc := Font.Size\r\n else\r\n dc := 4;\r\n\r\n col := 0;\r\n row := 0;\r\n\r\n for i := 0 to FOldCount - 1 do\r\n begin\r\n rd := TCustomControl(FControls[i]);\r\n rd.Free;\r\n end;\r\n FControls.Clear;\r\n\r\n while Container.childElementCount > 0 do\r\n Container.removeChild(Container.firstChild);\r\n\r\n if Caption <> '' then\r\n begin\r\n legend := document.createElement('LEGEND');\r\n ElementHandle.appendChild(legend);\r\n legend.innerHTML := Caption;\r\n legend['class'] := 'w-auto';\r\n\r\n SetHTMLElementFont(TJSHTMLElement(legend), Font, not((ElementFont = efProperty) and (ElementClassName = '')));\r\n end;\r\n\r\n if ElementGroupClassName <> '' then\r\n ElementHandle.setAttribute('class', ElementGroupClassName)\r\n else\r\n ElementHandle.setAttribute('class','border p-2');\r\n\r\n TJSHTMLElement(Container).style.setProperty('margin','0px');\r\n\r\n for i := 0 to FItems.Count - 1 do\r\n begin\r\n ypos := dc + row * dy;\r\n s := FItems[i];\r\n rd := CreateGroupControl(4 + col * dx, ypos, i, s, ControlPosition, GetGroupControlState(i), true);\r\n FControls.Add(rd);\r\n\r\n if not IsLinked then\r\n begin\r\n TJSHTMLElement(rd.Container).style.setProperty('float', 'left');\r\n TJSHTMLElement(rd.Container).style.setProperty('width', IntToStr(Trunc(100 / FColumns) - 5) + '%');\r\n end;\r\n\r\n if i mod FColumns = 0 then\r\n TJSHTMLElement(rd.Container).style.setProperty('clear', 'left');\r\n\r\n ElementHandle.appendChild(rd.Container);\r\n\r\n if col < FColumns - 1 then\r\n inc(col)\r\n else\r\n begin\r\n col := 0;\r\n inc(row);\r\n end;\r\n end;\r\n\r\n FOldCount := Items.Count;\r\nend;\r\n\r\nprocedure TControlGroup.EndUpdate;\r\nbegin\r\n inherited;\r\n DoUpdateList;\r\nend;\r\n\r\n\r\nfunction TControlGroup.GetGroupControl(AIndex: integer): TCustomControl;\r\nbegin\r\n Result := TCustomControl(FControls[AIndex]);\r\nend;\r\n\r\nfunction TControlGroup.GetGroupControlState(AIndex: integer): boolean;\r\nbegin\r\n Result := false;\r\nend;\r\n\r\nfunction TRadioGroup.CreateGroupControl(ALeft, ATop, AIndex: integer;\r\n ACaption: string; APosition: TElementPosition; AState, AEnabled: boolean): TCustomControl;\r\nvar\r\n rd: TRadioButton;\r\nbegin\r\n rd := TRadioButton.Create(GetID + IntToStr(AIndex));\r\n rd.ElementPosition := APosition;\r\n rd.ElementFont := ElementFont;\r\n rd.ElementClassName := ElementClassName;\r\n rd.ElementButtonClassName := ElementButtonClassName;\r\n rd.ElementLabelClassName := ElementLabelClassName;\r\n rd.HeightStyle := ssAuto;\r\n rd.ParentFont := false;\r\n rd.Font.Assign(Font);\r\n rd.Parent := Self;\r\n rd.Caption := ACaption;\r\n rd.GroupName := GetID;\r\n rd.Top := ATop; //dc + row * dy;\r\n rd.Left := ALeft; //4 + col * dx;\r\n rd.WidthStyle := ssAuto;\r\n rd.WidthPercent := 100;\r\n rd.OnClick := DoControlClick;\r\n rd.Checked := AState;\r\n rd.Enabled := AEnabled;\r\n rd.Tag := AIndex;\r\n rd.TabStop := true;\r\n Result := rd;\r\nend;\r\n\r\nprocedure TRadioGroup.CreateInitialize;\r\nbegin\r\n inherited;\r\n FItemIndex := -1;\r\n FOldItemIndex := -2;\r\nend;\r\n\r\nprocedure TRadioGroup.DoHandleClick(AControl: TCustomControl);\r\nbegin\r\n if ItemIndex = FOldItemIndex then\r\n Exit;\r\n\r\n Change;\r\n\r\n FOldItemIndex := ItemIndex;\r\nend;\r\n\r\nfunction TRadioGroup.GetGroupControlState(AIndex: integer): boolean;\r\nbegin\r\n Result := AIndex = FItemIndex;\r\nend;\r\n\r\nfunction TRadioGroup.GetItemIndex: integer;\r\nvar\r\n el: TJSElement;\r\n i: integer;\r\nbegin\r\n Result := FItemIndex;\r\n\r\n for i := 0 to FItems.Count -1 do\r\n begin\r\n el := document.getElementByID(GetID + IntToStr(i) + 'rd');\r\n if Assigned(el) then\r\n begin\r\n if TJSHTMLInputElement(el).checked then\r\n Result := i;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TRadioGroup.LoadState(AState: string);\r\nvar\r\n idx,e: integer;\r\nbegin\r\n val(AState, idx, e);\r\n\r\n if (e = 0) then\r\n ItemIndex := idx;\r\nend;\r\n\r\nfunction TRadioGroup.SaveState: string;\r\nbegin\r\n Result := IntToStr(ItemIndex);\r\nend;\r\n\r\nprocedure TRadioGroup.SetFocus;\r\nvar\r\n idx: integer;\r\n rd: TRadioButton;\r\nbegin\r\n if Items.Count = 0 then\r\n Exit;\r\n\r\n idx := ItemIndex;\r\n if idx < 0 then\r\n idx := 0;\r\n\r\n rd := TRadioButton(GetGroupControl(idx));\r\n if Assigned(rd) then\r\n rd.SetFocus;\r\nend;\r\n\r\nprocedure TRadioGroup.SetItemIndex(AIndex: integer);\r\nvar\r\n el: TJSElement;\r\nbegin\r\n // clear selection\r\n if (AIndex = -1) and (FItemIndex >= 0) then\r\n begin\r\n el := document.getElementByID(GetID + IntToStr(FItemIndex) + 'rd');\r\n if Assigned(el) then\r\n TJSHTMLInputElement(el).checked := False;\r\n end\r\n else\r\n begin\r\n // new selection\r\n FItemIndex := AIndex;\r\n if (AIndex >= 0) and (AIndex < Items.Count) then\r\n begin\r\n el := document.getElementByID(GetID + IntToStr(AIndex) + 'rd');\r\n if Assigned(el) then\r\n TJSHTMLInputElement(el).checked := True;\r\n end;\r\n end;\r\nend;\r\n\r\n\r\n\r\n{ TColorPicker }\r\n\r\nprocedure TColorPicker.ClearMethodPointers;\r\nbegin\r\n inherited;\r\n FHandleChangePtr := nil;\r\nend;\r\n\r\nprocedure TColorPicker.CreateInitialize;\r\nbegin\r\n inherited;\r\n FColor := clBlack;\r\nend;\r\n\r\nprocedure TColorPicker.BindEvents;\r\nbegin\r\n inherited;\r\n if Assigned(ElementInputHandle) then\r\n begin\r\n ElementInputHandle.addEventListener('input', FHandleChangePtr);\r\n end;\r\nend;\r\n\r\nfunction TColorPicker.GetElementInputHandle: TJSHTMLInputElement;\r\nbegin\r\n Result := TJSHTMLInputElement(Container);\r\nend;\r\n\r\nprocedure TColorPicker.UnBindEvents;\r\nbegin\r\n inherited;\r\n if Assigned(ElementInputHandle) then\r\n begin\r\n ElementInputHandle.removeEventListener('input', FHandleChangePtr);\r\n end;\r\n\r\nend;\r\n\r\nprocedure TColorPicker.UpdateElementVisual;\r\nbegin\r\n inherited;\r\n\r\n if Assigned(ElementHandle) then\r\n begin\r\n ElementHandle.style.setProperty('padding','0px'); \r\n ElementHandle.style.setProperty('width', IntToStr(Width - 2) + 'px');\r\n ElementHandle.style.setProperty('height',IntToStr(Height - 2) + 'px');\r\n end;\r\nend;\r\n\r\nfunction TColorPicker.DoHandleChange(Event: TEventListenerEvent): Boolean;\r\nbegin \r\n Select;\r\n Result := true;\r\nend;\r\n\r\nprocedure TColorPicker.Select;\r\nbegin\r\n if Assigned(OnSelect) then\r\n OnSelect(Self);\r\nend;\r\n\r\nfunction TColorPicker.GetColor: TColor;\r\nbegin\r\n Result := FColor;\r\n\r\n if Assigned(Container) then\r\n Result := HexToColor(TJSHTMLInputElement(Container).value);\r\nend;\r\n\r\nprocedure TColorPicker.SetColor(AValue: TColor);\r\nbegin\r\n FColor := AValue;\r\n\r\n if Assigned(Container) then\r\n TJSHTMLInputElement(Container).value := ColorToHTML(AValue);\r\nend;\r\n\r\nfunction TColorPicker.GetInputType: string;\r\nbegin \r\n Result := 'COLOR';\r\nend;\r\n\r\nprocedure TColorPicker.GetMethodPointers;\r\nbegin\r\n inherited;\r\n FHandleChangePtr := @DoHandleChange;\r\nend;\r\n\r\n{ TScrollBar }\r\n\r\nprocedure TScrollBar.CreateInitialize;\r\nbegin\r\n inherited;\r\n TabStop := True;\r\n FKind := sbHorizontal;\r\n FPosition := 0;\r\n FMin := 0;\r\n FMax := 100;\r\n FSmallChange := 1;\r\n FLargeChange := 1;\r\n\r\n FContent := TScrollBarContent.Create(Self);\r\n FContent.Parent := Self;\r\n FContent.Width := 121;\r\n FContent.Height := 17;\r\n\r\n Width := 121;\r\n Height := 17;\r\n\r\n UpdateContent;\r\nend;\r\n\r\nprocedure TScrollBar.BindEvents;\r\nbegin\r\n inherited;\r\n if Assigned(ElementHandle) then\r\n ElementHandle.addEventListener('scroll', FScrollPtr);\r\nend;\r\n\r\nprocedure TScrollBar.ClearMethodPointers;\r\nbegin\r\n inherited;\r\n FScrollPtr := nil;\r\nend;\r\n\r\nfunction TScrollBar.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('SPAN');\r\nend;\r\n\r\ndestructor TScrollBar.Destroy;\r\nbegin\r\n FContent.Free;\r\n inherited;\r\nend;\r\n\r\nfunction TScrollBar.DoScroll(Event: TJSUIEvent): Boolean;\r\nbegin\r\n FScrolling := True;\r\n if Assigned(OnChange) then\r\n OnChange(Self);\r\n\r\n FScrolling := False;\r\n Result := True;\r\nend;\r\n\r\nprocedure TScrollBar.GetMethodPointers;\r\nbegin\r\n inherited;\r\n FScrollPtr := @DoScroll;\r\nend;\r\n\r\nfunction TScrollBar.GetPageSize: Integer;\r\nbegin\r\n Result := FPageSize;\r\n if Result = 0 then\r\n Result := 25;\r\nend;\r\n\r\nfunction TScrollBar.GetValue(XYPos: Double): Double;\r\nbegin\r\n Result := 0;\r\n if Assigned(FContent) then\r\n begin\r\n case Kind of\r\n sbHorizontal:\r\n begin\r\n if FContent.Width > 0 then\r\n Result := (XYPos / FContent.Width) * (Max - Min)\r\n end;\r\n sbVertical:\r\n begin\r\n if FContent.Height > 0 then\r\n Result := (XYPos / FContent.Height) * (Max - Min);\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TScrollBar.GetPosition: Integer;\r\nbegin\r\n Result := 0;\r\n if Assigned(Element) then\r\n begin\r\n case Kind of\r\n sbHorizontal: Result := Round(GetValue(Element.scrollLeft));\r\n sbVertical: Result := Round(GetValue(Element.scrollTop));\r\n end;\r\n end\r\n else\r\n Result := FPosition;\r\nend;\r\n\r\nprocedure TScrollBar.Loaded;\r\nbegin\r\n inherited;\r\n UpdateContent;\r\nend;\r\n\r\nprocedure TScrollBar.SetBounds(X, Y, AWidth, AHeight: Integer);\r\nbegin\r\n inherited;\r\n UpdateContent;\r\nend;\r\n\r\nprocedure TScrollBar.SetKind(const Value: TScrollBarKind);\r\nbegin\r\n if FKind <> Value then\r\n begin\r\n FKind := Value;\r\n// if not (csLoading in ComponentState) then\r\n begin\r\n case Kind of\r\n sbHorizontal:\r\n begin\r\n SetBounds(Left, Top, Height, 17)\r\n end;\r\n sbVertical:\r\n begin\r\n SetBounds(Left, Top, 17, Width)\r\n end;\r\n end;\r\n end;\r\n UpdateElement;\r\n UpdateContent;\r\n end;\r\nend;\r\n\r\nprocedure TScrollBar.SetMax(const Value: Integer);\r\nbegin\r\n if FMax <> Value then\r\n begin\r\n FMax := Value;\r\n UpdateContent;\r\n end;\r\nend;\r\n\r\nprocedure TScrollBar.SetMin(const Value: Integer);\r\nbegin\r\n if FMin <> Value then\r\n begin\r\n FMin := Value;\r\n UpdateContent;\r\n end;\r\nend;\r\n\r\nprocedure TScrollBar.SetPageSize(const Value: Integer);\r\nbegin\r\n if FPageSize <> Value then\r\n begin\r\n FPageSize := Value;\r\n UpdateContent;\r\n end;\r\nend;\r\n\r\nprocedure TScrollBar.SetPosition(const Value: Integer);\r\nbegin\r\n if FPosition <> Value then\r\n begin\r\n FPosition := Value;\r\n UpdateContent;\r\n end;\r\nend;\r\n\r\nprocedure TScrollBar.UpdateElementVisual;\r\nbegin\r\n inherited;\r\n\r\n if Assigned(ElementHandle) then\r\n begin\r\n ElementHandle.style.setProperty('overflow', 'auto');\r\n case Kind of\r\n sbHorizontal:\r\n begin\r\n ElementHandle.style.setProperty('overflow-y', 'hidden');\r\n ElementHandle.style.setProperty('overflow-x', '');\r\n end;\r\n sbVertical:\r\n begin\r\n ElementHandle.style.setProperty('overflow-y', '');\r\n ElementHandle.style.setProperty('overflow-x', 'hidden');\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TScrollBar.UnBindEvents;\r\nbegin\r\n inherited;\r\n if Assigned(ElementHandle) then\r\n ElementHandle.removeEventListener('scroll', FScrollPtr);\r\nend;\r\n\r\nprocedure TScrollBar.UpdateContent;\r\nvar\r\n x, y, w, h: Integer;\r\n ps: Integer;\r\n v: Single;\r\nbegin\r\n if not Assigned(FContent) or not Assigned(ElementHandle) or FScrolling then\r\n Exit;\r\n\r\n ps := PageSize;\r\n v := (Max - Min) / ps;\r\n\r\n case Kind of\r\n sbHorizontal:\r\n begin\r\n y := 0;\r\n h := Height;\r\n w := Round(v * Width);\r\n x := Round(((FPosition - Min) / (Max - Min)) * w);\r\n end;\r\n sbVertical:\r\n begin\r\n x := 0;\r\n w := Width;\r\n h := Round(v * Height);\r\n y := Round(((FPosition - Min) / (Max - Min)) * h);\r\n end;\r\n end;\r\n\r\n FContent.SetBounds(0, 0, w, h);\r\n ElementHandle.scrollLeft := x;\r\n ElementHandle.scrollTop := y;\r\nend;\r\n\r\n{ TScrollBarContent }\r\n\r\nfunction TScrollBarContent.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('SPAN');\r\nend;\r\n\r\n{ TCheckGroup }\r\n\r\nfunction TCheckGroup.CreateGroupControl(ALeft, ATop, AIndex: integer;\r\n ACaption: string; APosition: TElementPosition; AState, AEnabled: boolean): TCustomControl;\r\nvar\r\n cb: TCheckBox;\r\nbegin\r\n cb := TCheckBox.Create(GetID + IntToStr(AIndex));\r\n cb.Caption := ACaption;\r\n cb.ElementPosition := APosition;\r\n cb.ElementFont := ElementFont;\r\n cb.ElementClassName := ElementClassName;\r\n cb.ElementButtonClassName := ElementButtonClassName;\r\n cb.ElementLabelClassName := ElementLabelClassName;\r\n cb.ParentFont := false;\r\n cb.Font.Assign(Font);\r\n cb.Parent := Self;\r\n cb.Top := ATop;\r\n cb.Left := ALeft;\r\n cb.WidthStyle := ssPercent;\r\n cb.WidthPercent := 100;\r\n cb.HeightStyle := ssAuto;\r\n\r\n cb.OnCheckClick := DoControlClick;\r\n cb.Checked := AState;\r\n cb.Enabled := AEnabled;\r\n cb.Tag := AIndex;\r\n cb.TabStop := true;\r\n Result := cb;\r\nend;\r\n\r\nprocedure TCheckGroup.CreateInitialize;\r\nbegin\r\n inherited;\r\nend;\r\n\r\nprocedure TCheckGroup.DoHandleClick(AControl: TCustomControl);\r\nbegin\r\n inherited;\r\n if Assigned(OnCheckClick) then\r\n OnCheckClick(Self, AControl.Tag);\r\nend;\r\n\r\nfunction TCheckGroup.GetChecked(AIndex: integer): boolean;\r\nbegin\r\n Result := (GetGroupControl(AIndex) as TCheckBox).Checked;\r\nend;\r\n\r\nfunction TCheckGroup.GetGroupControlState(AIndex: integer): boolean;\r\nbegin\r\n Result := false;\r\nend;\r\n\r\nprocedure TCheckGroup.LoadState(AState: string);\r\nvar\r\n sl: TStringList;\r\n i: integer;\r\nbegin\r\n sl := TStringList.Create;\r\n sl.Delimiter := ',';\r\n sl.CommaText := AState;\r\n\r\n for i := 0 to sl.Count - 1 do\r\n begin\r\n Checked[i] := sl.Strings[i] = '1';\r\n end;\r\n\r\n sl.Free;\r\nend;\r\n\r\nfunction TCheckGroup.SaveState: string;\r\nvar\r\n i: integer;\r\n s: string;\r\nbegin\r\n s := '';\r\n for i := 0 to Items.Count - 1 do\r\n begin\r\n if Checked[i] then\r\n s := s + ',1'\r\n else\r\n s := s + ',0';\r\n end;\r\n\r\n Delete(s,1,1);\r\n Result := s;\r\nend;\r\n\r\nprocedure TCheckGroup.SetChecked(AIndex: integer; const Value: boolean);\r\nbegin\r\n (GetGroupControl(AIndex) as TCheckBox).Checked := Value;\r\nend;\r\n\r\nprocedure TCheckGroup.SetFocus;\r\nvar\r\n cb: TCheckBox;\r\nbegin\r\n if Items.Count > 0 then\r\n begin\r\n cb := TCheckBox(GetGroupControl(0));\r\n if Assigned(cb) then\r\n cb.SetFocus;\r\n end;\r\nend;\r\n\r\n\r\nend.\r\n","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright (c) 2018 - 2021 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.ExtCtrls;\r\n\r\n{$modeswitch externalclass}\r\n\r\n{$DEFINE NOPP}\r\n\r\ninterface\r\n\r\nuses\r\n Classes, SysUtils, Types, WEBLib.Controls, WEBLib.StdCtrls, WEBLib.Graphics,\r\n Web, JS, WEBLib.WebTools, WEBLib.Menus;\r\n\r\ntype\r\n TCustomLinkLabel = class(TCustomLabel)\r\n private\r\n FDisplText: string;\r\n FOnLinkClick: TLinkClickEvent;\r\n FWidthStyle: TSizeStyle;\r\n FHeightPercent: TPercentSize;\r\n FHeightStyle: TSizeStyle;\r\n FWidthPercent: TPercentSize;\r\n procedure SetHeightPercent(const Value: TPercentSize); reintroduce;\r\n procedure SetHeightStyle(const Value: TSizeStyle); reintroduce;\r\n procedure SetWidthPercent(const Value: TPercentSize); reintroduce;\r\n procedure SetWidthStyle(const Value: TSizeStyle); reintroduce;\r\n protected\r\n function GetOuterWidth: integer; override;\r\n function GetOuterHeight: integer; override;\r\n function GetDisplayText: string; override;\r\n\r\n procedure SetCaption(const AValue: string); override;\r\n procedure BindEvents; override;\r\n function DoLinkClick(Event: TJSMouseEvent): boolean;\r\n public\r\n constructor Create(AOwner: TComponent); overload; override;\r\n published\r\n property Align;\r\n property Alignment;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property AutoSize;\r\n property Caption;\r\n property Color;\r\n property DragMode;\r\n property EllipsisPosition;\r\n property ElementClassName;\r\n property ElementID;\r\n property ElementFont;\r\n property ElementPosition;\r\n property Enabled;\r\n property Font;\r\n property Height;\r\n property Hint;\r\n property Layout;\r\n property Left;\r\n property Margins;\r\n property ShowHint;\r\n property Top;\r\n property Visible;\r\n property Width;\r\n property WordWrap;\r\n\r\n property HeightStyle: TSizeStyle read FHeightStyle write SetHeightStyle default ssAbsolute;\r\n property WidthStyle: TSizeStyle read FWidthStyle write SetWidthStyle default ssAbsolute;\r\n property HeightPercent: TPercentSize read FHeightPercent write SetHeightPercent default 100;\r\n property WidthPercent: TPercentSize read FWidthPercent write SetWidthPercent default 100;\r\n\r\n property OnClick;\r\n property OnDblClick;\r\n property OnLinkClick: TLinkClickEvent read FOnLinkClick write FOnLinkClick;\r\n property OnDragDrop;\r\n property OnDragOver;\r\n property OnEndDrag;\r\n property OnStartDrag;\r\n end;\r\n\r\n TLinkLabel = class(TCustomLinkLabel)\r\n published\r\n property Caption;\r\n property ParentFont;\r\n end;\r\n\r\n TWebLinkLabel = class(TLinkLabel);\r\n\r\n TTrackBarOrientation = (trHorizontal, trVertical);\r\n\r\n TTrackBar = class(TCustomInput)\r\n private\r\n FMax: integer;\r\n FMin: integer;\r\n FPosition: integer;\r\n FOnChange: TNotifyEvent;\r\n FOrientation: TTrackBarOrientation;\r\n procedure SetOrientation(const Value: TTrackBarOrientation);\r\n protected\r\n function GetElementInputHandle: TJSHTMLInputElement;\r\n function GetInputType: string; override;\r\n function DoHandleChange(Event: TEventListenerEvent): Boolean;\r\n procedure BindEvents; override;\r\n procedure SetMax(AValue: integer);\r\n procedure SetMin(AValue: integer);\r\n procedure SetPosition(AValue: integer);\r\n function GetPosition: integer;\r\n procedure DoUpdate;\r\n procedure Change; virtual;\r\n procedure CreateControl; override;\r\n procedure UpdateElementVisual; override;\r\n public\r\n procedure CreateInitialize; override;\r\n property ElementInputHandle: TJSHTMLInputElement read GetElementInputHandle;\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property DragMode;\r\n property ElementClassName;\r\n property ElementID;\r\n property ElementFont;\r\n property ElementPosition;\r\n property Enabled;\r\n property Height;\r\n property HeightPercent;\r\n property HeightStyle;\r\n property Left;\r\n property Margins;\r\n property Max: integer read FMax write SetMax default 10;\r\n property Min: integer read FMin write SetMin default 0;\r\n property Orientation: TTrackBarOrientation read FOrientation write SetOrientation default trHorizontal;\r\n property Position: integer read GetPosition write SetPosition default 0;\r\n property Role;\r\n property ShowHint;\r\n property TabOrder;\r\n property TabStop;\r\n property Top;\r\n property Visible;\r\n property Width;\r\n property WidthPercent;\r\n property WidthStyle;\r\n property OnClick;\r\n property OnChange: TNotifyEvent read FOnChange write FOnChange;\r\n property OnDragDrop;\r\n property OnDragOver;\r\n property OnEndDrag;\r\n property OnStartDrag;\r\n end;\r\n\r\n TWebTrackBar = class(TTrackBar);\r\n\r\n TTimer = class(TComponent)\r\n private\r\n FInterval: integer;\r\n FTimerID: integer;\r\n FOnTimer: TNotifyEvent;\r\n FEnabled: boolean;\r\n protected\r\n procedure SetEnabled(Value: Boolean); virtual;\r\n procedure SetInterval(AValue: integer);\r\n procedure DoTimer;\r\n procedure DoUpdateTimer;\r\n procedure DoClearTimer;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n destructor Destroy; override;\r\n published\r\n property Enabled: boolean read FEnabled write SetEnabled default True;\r\n property Interval: integer read FInterval write SetInterval default 1000;\r\n property OnTimer: TNotifyEvent read FOnTimer write FOnTimer;\r\n end;\r\n\r\n TWebTimer = class(TTimer);\r\n\r\n TGeolocationEvent = procedure(Sender: TObject; Lat,Lon,Alt:double) of object;\r\n\r\n TGeoLocation = class(TComponent)\r\n private\r\n FOnGeolocation: TGeolocationEvent;\r\n FWidth: integer;\r\n FHeight: integer;\r\n protected\r\n procedure DoHandleGeolocation(APosition: TJSPosition);\r\n public\r\n function HasGeolocation: boolean;\r\n procedure GetGeolocation;\r\n property Width: integer read FWidth write FWidth;\r\n property Height: integer read FHeight write FHeight;\r\n published\r\n property OnGeolocation: TGeolocationEvent read FOnGeolocation write FOnGeolocation;\r\n end;\r\n\r\n TWebGeoLocation = class(TGeoLocation);\r\n\r\n TPaintBox = class(TGraphicControl)\r\n private\r\n FOnPaint: TNotifyEvent;\r\n protected\r\n procedure Paint; override;\r\n procedure UpdateElementVisual; override;\r\n public\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property DragMode;\r\n property ElementID;\r\n property ElementFont;\r\n property ElementPosition;\r\n property Enabled;\r\n property HeightPercent;\r\n property HeightStyle;\r\n property Margins;\r\n property WidthPercent;\r\n property WidthStyle;\r\n property OnClick;\r\n property OnDblClick;\r\n property OnMouseWheel;\r\n property OnPaint: TNotifyEvent read FOnPaint write FOnPaint;\r\n property OnTouchStart;\r\n property OnTouchMove;\r\n property OnTouchEnd;\r\n property OnDragDrop;\r\n property OnDragOver;\r\n property OnEndDrag;\r\n property OnStartDrag;\r\n end;\r\n\r\n TWebPaintBox = class(TPaintBox);\r\n\r\n TImageLoadedProc = reference to procedure(AEvent: TJSEvent);\r\n TImageErrorProc = reference to procedure(AEvent: TJSEvent);\r\n\r\n\r\n TCustomImageControl = class(TWebCustomControl)\r\n private\r\n FURL: string;\r\n FPicture: TURLPicture;\r\n FAutoSize: boolean;\r\n FOnLoaded: TNotifyEvent;\r\n FOnError: THTTPErrorEvent;\r\n FImageLoadPtr: pointer;\r\n FImageErrorPtr: pointer;\r\n FImageLoaded: TImageLoadedProc;\r\n FImageError: TImageErrorProc;\r\n procedure SetURL(AURL: string);\r\n function GetBase64Img: string;\r\n protected\r\n function HandleImageLoad(AEvent: TJSEvent): boolean; virtual;\r\n function HandleError(AEvent: TJSEvent): boolean; virtual;\r\n\r\n procedure SetPicture(const Value: TURLPicture);\r\n procedure PictureChanged(Sender: TObject);\r\n procedure PictureDataChanged(Sender: TObject);\r\n function CreateElement: TJSElement; override;\r\n procedure UpdateElement; override;\r\n procedure SetContainerURL(AURL: string);\r\n property Picture: TURLPicture read FPicture write SetPicture;\r\n property URL: string read FURL write SetURL;\r\n procedure BindEvents; override;\r\n procedure UnbindEvents; override;\r\n procedure ClearMethodPointers; override;\r\n procedure GetMethodPointers; override;\r\n public\r\n procedure CreateInitialize; override;\r\n destructor Destroy; override;\r\n function DataURL: string; overload;\r\n function DataURL(AWidth, AHeight: integer): string; overload;\r\n procedure ResizeImage; overload;\r\n procedure ResizeImage(AWidth, AHeight: integer); overload;\r\n procedure ResizeImage(AWidth, AHeight: integer; AspectRatio: boolean); overload;\r\n property Base64Image: string read GetBase64Img;\r\n function ImageWidth: integer;\r\n function ImageHeight: integer;\r\n function LoadFromURL(const AURL: string): TJSPromise; overload;\r\n procedure LoadFromURL(const AURL: string; ImageLoaded: TImageLoadedProc; ImageError: TImageErrorProc); overload;\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property AutoSize: boolean read FAutoSize write FAutoSize default false;\r\n property ChildOrder;\r\n property DragMode;\r\n property ElementClassName;\r\n property ElementFont;\r\n property ElementID;\r\n property ElementPosition;\r\n property HeightPercent;\r\n property HeightStyle;\r\n property Margins;\r\n property PopupMenu;\r\n property ShowHint;\r\n property WidthPercent;\r\n property WidthStyle;\r\n property OnClick;\r\n property OnDblClick;\r\n property OnError: THTTPErrorEvent read FOnError write FOnError;\r\n property OnLoaded: TNotifyEvent read FOnLoaded write FOnLoaded;\r\n property OnDragDrop;\r\n property OnDragOver;\r\n property OnEndDrag;\r\n property OnStartDrag;\r\n end;\r\n\r\n TImageControl = class(TCustomImageControl)\r\n published\r\n property Picture;\r\n property URL;\r\n end;\r\n\r\n TWebImageControl = class(TImageControl);\r\n\r\n TImageZoomControl = class;\r\n\r\n TImageZoomAppearance = class(TPersistent)\r\n private\r\n FOwner: TImageZoomControl;\r\n FHeightPercent: Integer;\r\n FWidthPercent: Integer;\r\n FResponsiveHeightPercent: Integer;\r\n FResponsiveWidthPercent: Integer;\r\n FResponsiveMaxWidth: Integer;\r\n procedure SetHeightPercent(const Value: Integer);\r\n procedure SetWidthPercent(const Value: Integer);\r\n procedure SetResponsiveHeightPercent(const Value: Integer);\r\n procedure SetResponsiveWidthPercent(const Value: Integer);\r\n procedure SetResponsiveMaxWidth(const Value: Integer);\r\n public\r\n constructor Create(AOwner: TImageZoomControl); overload;\r\n destructor Destroy; override;\r\n procedure Assign(Source: TPersistent); override;\r\n function GetOwner: TPersistent; override;\r\n published\r\n property HeightPercent: Integer read FHeightPercent write SetHeightPercent default 100;\r\n property WidthPercent: Integer read FWidthPercent write SetWidthPercent default 100;\r\n property ResponsiveHeightPercent: Integer read FResponsiveHeightPercent write SetResponsiveHeightPercent default 100;\r\n property ResponsiveWidthPercent: Integer read FResponsiveWidthPercent write SetResponsiveWidthPercent default 100;\r\n property ResponsiveMaxWidth: Integer read FResponsiveMaxWidth write SetResponsiveMaxWidth default 768;\r\n end;\r\n\r\n TImageZoomControl = class(TCustomImageControl)\r\n private\r\n FStyle: TJSElement;\r\n FOverlay: TJSElement;\r\n FPictureZoom: TURLPicture;\r\n FURLZoom: string;\r\n FPictureZoomDataURL: string;\r\n FAppearance: TImageZoomAppearance;\r\n procedure SetPictureZoom(const Value: TURLPicture);\r\n procedure SetURLZoom(const Value: string);\r\n protected\r\n procedure PictureZoomChanged(Sender: TObject);\r\n procedure PictureZoomDataChanged(Sender: TObject);\r\n procedure UpdateElement; override;\r\n public\r\n procedure CreateInitialize; override;\r\n function CreateElement: TJSElement; override;\r\n destructor Destroy; override;\r\n published\r\n property Appearance: TImageZoomAppearance read FAppearance write FAppearance;\r\n property Picture;\r\n property PopupMenu;\r\n property URL;\r\n property PictureZoom: TURLPicture read FPictureZoom write SetPictureZoom;\r\n property URLZoom: string read FURLZoom write SetURLZoom;\r\n end;\r\n\r\n TWebImageZoomControl = class(TImageZoomControl);\r\n\r\n TCustomPanel = class(TWebCustomControl)\r\n private\r\n FAutoSize: Boolean;\r\n FPadding: TPadding;\r\n FShowCaption: boolean;\r\n FLabel: TJSHTMLElement;\r\n FPanelBody: TJSHTMLElement;\r\n FElementBodyClassName: TElementClassName;\r\n FAlignment: TAlignment;\r\n procedure SetShowCaption(const Value: boolean);\r\n procedure SetPadding(const Value: TPadding);\r\n procedure SetAlignment(const Value: TAlignment);\r\n protected\r\n function CreateElement: TJSElement; override;\r\n procedure SetCaption(const AValue: string); override;\r\n procedure SetBorderStyle(const AValue: TBorderStyle); override;\r\n procedure SetAutoSize(AValue: boolean);\r\n procedure UpdateElementVisual; override;\r\n property AutoSize: boolean read FAutoSize write SetAutoSize default false;\r\n property Alignment: TAlignment read FAlignment write SetAlignment default taCenter;\r\n property Padding: TPadding read FPadding write SetPadding;\r\n property ShowCaption: boolean read FShowCaption write SetShowCaption default true;\r\n function GetOuterWidth: integer; override;\r\n function GetOuterHeight: integer; override;\r\n function GetChildContainer: TJSElement; override;\r\n property ElementBodyClassName: TElementClassName read FElementBodyClassName write FElementBodyClassName;\r\n procedure RegisterParent(AValue: TControl); override;\r\n procedure UnRegisterParent(AValue: TControl); override;\r\n procedure DoAutoSize;\r\n procedure AlignControl(AControl: TControl); override;\r\n public\r\n procedure CreateInitialize; override;\r\n destructor Destroy; override;\r\n procedure EndUpdate; override;\r\n procedure SetBounds(X, Y, AWidth, AHeight: Integer); override;\r\n end;\r\n\r\n TPanel = class(TCustomPanel)\r\n published\r\n property Align;\r\n property Alignment;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property AutoSize;\r\n property BorderColor;\r\n property BorderStyle;\r\n property Caption;\r\n property ChildOrder;\r\n property Color;\r\n property DragMode;\r\n property ElementBodyClassName;\r\n property ElementID;\r\n property ElementFont;\r\n property ElementPosition;\r\n property Font;\r\n property HeightPercent;\r\n property HeightStyle;\r\n property Margins;\r\n property Padding;\r\n property ParentFont;\r\n property PopupMenu;\r\n property Role;\r\n property ShowCaption;\r\n property WidthPercent;\r\n property WidthStyle;\r\n property OnClick;\r\n property OnDblClick;\r\n property OnDragDrop;\r\n property OnDragOver;\r\n property OnEndDrag;\r\n property OnStartDrag;\r\n end;\r\n\r\n TDivPanel = class(TPanel)\r\n protected\r\n function CreateElement: TJSElement; override;\r\n end;\r\n\r\n TWebPanel = class(TPanel);\r\n\r\n TCustomGroupBox = class(TWebCustomControl)\r\n private\r\n FCaption: string;\r\n FLegend: TJSHTMLElement;\r\n FFieldSet: TJSHTMLElement;\r\n protected\r\n procedure SetFieldSetSize; virtual;\r\n procedure SetCaption(const Value: string); override;\r\n function CreateElement: TJSElement; override;\r\n procedure UpdateElementData; override;\r\n procedure UpdateElementVisual; override;\r\n procedure SetBoundsInt(X, Y, AWidth, AHeight: Integer); override;\r\n property Caption: string read FCaption write SetCaption;\r\n public\r\n procedure CreateInitialize; override;\r\n property Legend: TJSHTMLElement read FLegend;\r\n property FieldSet: TJSHTMLElement read FFieldSet;\r\n end;\r\n\r\n TGroupBox = class(TCustomGroupBox)\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property BorderColor;\r\n property Caption;\r\n property Color;\r\n property DragMode;\r\n property ElementFont;\r\n property ElementID;\r\n property ElementPosition;\r\n property Font;\r\n property HeightPercent;\r\n property HeightStyle;\r\n property Margins;\r\n property ParentFont;\r\n property PopupMenu;\r\n property Role;\r\n property WidthPercent;\r\n property WidthStyle;\r\n property OnDragDrop;\r\n property OnDragOver;\r\n property OnEndDrag;\r\n property OnStartDrag;\r\n end;\r\n\r\n TWebGroupBox = class(TGroupBox);\r\n\r\n TScrollBox = class(TCustomPanel)\r\n private\r\n FAutoScroll: boolean;\r\n FScrollBars: TScrollStyle;\r\n FScrollPtr: pointer;\r\n FOnScroll: TNotifyEvent;\r\n FVertScrollBar: TControlScrollBar;\r\n FHorzScrollBar: TControlScrollBar;\r\n function GetScrollLeft: integer;\r\n function GetScrollTop: integer;\r\n procedure SetScrollLeft(const Value: integer);\r\n procedure SetScrollTop(const Value: integer);\r\n procedure SetScrollBars(const Value: TScrollStyle);\r\n protected\r\n procedure UpdateElement; override;\r\n procedure SetAutoScroll(AValue: boolean);\r\n function GetClientRect: TRect; override;\r\n function HandleDoScroll(Event: TJSMouseEvent): Boolean; virtual;\r\n procedure DoScroll; virtual;\r\n procedure ClearMethodPointers; override;\r\n procedure GetMethodPointers; override;\r\n procedure BindEvents; override;\r\n procedure UnbindEvents; override;\r\n public\r\n procedure CreateInitialize; override;\r\n destructor Destroy; override;\r\n property ScrollLeft: integer read GetScrollLeft write SetScrollLeft;\r\n property ScrollTop: integer read GetScrollTop write SetScrollTop;\r\n procedure ScrollBy(DeltaX: integer; DeltaY: integer);\r\n procedure EndUpdate; override;\r\n property VertScrollBar: TControlScrollBar read FVertScrollBar;\r\n property HorzScrollBar: TControlScrollBar read FHorzScrollBar;\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property AutoScroll: boolean read FAutoScroll write SetAutoScroll;\r\n property BorderStyle;\r\n property Color;\r\n property DragMode;\r\n property ElementFont;\r\n property ElementID;\r\n property ElementPosition;\r\n property HeightPercent;\r\n property HeightStyle;\r\n property Margins;\r\n property PopupMenu;\r\n property Role;\r\n property ScrollBars: TScrollStyle read FScrollBars write SetScrollBars;\r\n property WidthPercent;\r\n property WidthStyle;\r\n property OnClick;\r\n property OnDblClick;\r\n property OnMouseDown;\r\n property OnMouseMove;\r\n property OnMouseUp;\r\n property OnResize;\r\n property OnDragDrop;\r\n property OnDragOver;\r\n property OnEndDrag;\r\n property OnScroll: TNotifyEvent read FOnScroll write FOnScroll;\r\n property OnStartDrag;\r\n end;\r\n\r\n TWebScrollBox = class(TScrollBox);\r\n\r\n TSplitter = class(TCustomControl)\r\n private\r\n FLayer: TJSElement;\r\n FTouched: boolean;\r\n FFirstMove: boolean;\r\n FSplitControl: TControl;\r\n FSizing: boolean;\r\n FSizingX,FSizingY: double;\r\n FOriginalWidth,FOriginalHeight: integer;\r\n FGripColor: TColor;\r\n FOnMoved: TNotifyEvent;\r\n FOnMove: TNotifyEvent;\r\n procedure SetGripColor(const Value: TColor);\r\n protected\r\n function CreateElement: TJSElement; override;\r\n procedure UpdateElement; override;\r\n procedure UpdateElementSize; override;\r\n\r\n procedure ColorChanging; override;\r\n procedure DoSizeStart(X,Y: integer);\r\n function HandleDoTouchStart(Event: TJSTouchEvent): Boolean; override;\r\n\r\n function HandleDocDoMouseMove(Event: TJSMouseEvent): Boolean; virtual;\r\n function HandleDocDoMouseUp(Event: TJSMouseEvent): Boolean; virtual;\r\n\r\n function HandleDocDoTouchMove(Event: TJSTouchEvent): Boolean; virtual;\r\n function HandleDocDoTouchEnd(Event: TJSTouchEvent): Boolean; virtual;\r\n\r\n procedure DoMouseEnter; override;\r\n procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X,Y: Integer); override;\r\n procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X,Y: Integer); override;\r\n procedure Paint; override;\r\n public\r\n procedure CreateInitialize; override;\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Color;\r\n property HeightPercent;\r\n property HeightStyle;\r\n property ElementFont;\r\n property ElementID;\r\n property ElementPosition;\r\n property GripColor: TColor read FGripColor write SetGripColor default clWhite;\r\n property Margins;\r\n property WidthPercent;\r\n property WidthStyle;\r\n property OnClick;\r\n property OnMove: TNotifyEvent read FOnMove write FOnMove;\r\n property OnMoved: TNotifyEvent read FOnMoved write FOnMoved;\r\n end;\r\n\r\n TWebSplitter = class(TSplitter);\r\n\r\n TVerticalAlignment = (vaTop, vaCenter, vaBottom);\r\n TGridPanelExpandStyle = (esAddRows, esAddColumns);\r\n\r\n TGridPanelRow = class(TCollectionItem)\r\n private\r\n FSizeStyle: TSizeStyle;\r\n FValue: integer;\r\n FMarginBottom: integer;\r\n FMarginTop: integer;\r\n FAlignment: TVerticalAlignment;\r\n FElementClassName: string;\r\n procedure SetMarginBottom(const Value: integer);\r\n procedure SetMarginTop(const Value: integer);\r\n procedure SetSizeStyle(const Value: TSizeStyle);\r\n procedure SetValue(const Value: integer);\r\n protected\r\n function HeightAttribute: string;\r\n public\r\n constructor Create(ACollection: TCollection); override;\r\n procedure Assign(Source: TPersistent); override;\r\n published\r\n property Alignment: TVerticalAlignment read FAlignment write FAlignment default vaTop;\r\n property ElementClassName: string read FElementClassName write FElementClassName;\r\n property MarginTop: integer read FMarginTop write SetMarginTop;\r\n property MarginBottom: integer read FMarginBottom write SetMarginBottom;\r\n property SizeStyle: TSizeStyle read FSizeStyle write SetSizeStyle;\r\n property Value: integer read FValue write SetValue;\r\n end;\r\n\r\n TGridPanelRows = class(TOwnedCollection)\r\n private\r\n FOnChange: TNotifyEvent;\r\n function GetItem(Index: integer): TGridPanelRow; reintroduce;\r\n procedure SetItem(Index: integer; const Value: TGridPanelRow); reintroduce;\r\n protected\r\n procedure Update(Item: TCollectionItem); override;\r\n public\r\n constructor Create(AOwner: TComponent); reintroduce;\r\n function Add: TGridPanelRow; reintroduce;\r\n function Insert(Index: integer): TGridPanelRow; reintroduce;\r\n property Items[Index: integer]: TGridPanelRow read GetItem write SetItem; default;\r\n property OnChange: TNotifyEvent read FOnChange write FOnChange;\r\n end;\r\n\r\n TGridPanelColumn = class(TCollectionItem)\r\n private\r\n FSizeStyle: TSizeStyle;\r\n FValue: integer;\r\n FMarginLeft: integer;\r\n FAlignment: TAlignment;\r\n FMarginRight: integer;\r\n FElementClassName: string;\r\n procedure SetMarginLeft(const Value: integer);\r\n procedure SetMarginRight(const Value: integer);\r\n procedure SetSizeStyle(const Value: TSizeStyle);\r\n procedure SetValue(const Value: integer);\r\n protected\r\n function WidthAttribute: string;\r\n public\r\n constructor Create(ACollection: TCollection); override;\r\n procedure Assign(Source: TPersistent); override;\r\n published\r\n property Alignment: TAlignment read FAlignment write FAlignment default taLeftJustify;\r\n property ElementClassName: string read FElementClassName write FElementClassName;\r\n property MarginLeft: integer read FMarginLeft write SetMarginLeft default 0;\r\n property MarginRight: integer read FMarginRight write SetMarginRight default 0;\r\n property SizeStyle: TSizeStyle read FSizeStyle write SetSizeStyle default ssPercent;\r\n property Value: integer read FValue write SetValue;\r\n end;\r\n\r\n TGridPanelColumns = class(TOwnedCollection)\r\n private\r\n FOnChange: TNotifyEvent;\r\n function GetItem(Index: integer): TGridPanelColumn; reintroduce;\r\n procedure SetItem(Index: integer; const Value: TGridPanelColumn); reintroduce;\r\n protected\r\n procedure Update(Item: TCollectionItem); override;\r\n public\r\n constructor Create(AOwner: TComponent); reintroduce;\r\n function Add: TGridPanelColumn; reintroduce;\r\n function Insert(Index: integer): TGridPanelColumn; reintroduce;\r\n property Items[Index: integer]: TGridPanelColumn read GetItem write SetItem; default;\r\n property OnChange: TNotifyEvent read FOnChange write FOnChange;\r\n end;\r\n\r\n TControlCollectionItem = class(TCollectionItem)\r\n private\r\n FControl: TWinControl;\r\n FRow: integer;\r\n FColumn: integer;\r\n public\r\n procedure Assign(Source: TPersistent); override;\r\n published\r\n property Column: integer read FColumn write FColumn;\r\n property Row: integer read FRow write FRow;\r\n property Control: TWinControl read FControl write FControl;\r\n end;\r\n\r\n TControlCollection = class(TOwnedCollection)\r\n private\r\n function GetItem(Index: Integer): TControlCollectionItem; reintroduce;\r\n procedure SetItem(Index: Integer; const Value: TControlCollectionItem); reintroduce;\r\n public\r\n constructor Create(AOwner: TComponent); reintroduce;\r\n function Add: TControlCollectionItem; reintroduce;\r\n function Insert(Index: Integer): TControlCollectionItem; reintroduce;\r\n property Items[Index: Integer]: TControlCollectionItem read GetItem write SetItem;\r\n function FindItem(AControl: TWinControl): boolean;\r\n end;\r\n\r\n TGridPanel = class(TWebCustomControl)\r\n private\r\n FDesignTime: boolean;\r\n FUpdateTable: boolean;\r\n FColCount: integer;\r\n FRowCollection: TGridPanelRows;\r\n FColumnCollection: TGridPanelColumns;\r\n FControlCollection: TControlCollection;\r\n FGridLineWidth: integer;\r\n FGridLineColor: TColor;\r\n FExpandStyle: TGridPanelExpandStyle;\r\n FTbl: TJSElement;\r\n FTblBody: TJSElement;\r\n procedure SetColumnCollection(const Value: TGridPanelColumns);\r\n procedure SetRowCollection(const Value: TGridPanelRows);\r\n procedure SetControlCollection(const Value: TControlCollection);\r\n protected\r\n function CreateTable: TJSElement; virtual;\r\n function CreateRow(AIndex: integer): TJSElement; virtual;\r\n function CreateElement: TJSElement; override;\r\n procedure AlignControl(AControl: TControl); override;\r\n procedure UpdateTable;\r\n procedure UpdateElement; override;\r\n procedure UpdateElementVisual; override;\r\n procedure RegisterParent(AValue: TControl); override;\r\n procedure TableChanged(Sender: TObject);\r\n procedure Notification(AComponent: TComponent; Operation: TOperation); override;\r\n public\r\n procedure CreateInitialize; override;\r\n destructor Destroy; override;\r\n procedure AddControl(AControl: TWinControl);\r\n procedure RemoveControl(AControl: TWinControl);\r\n procedure EndUpdate; override;\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property Color;\r\n property ControlCollection: TControlCollection read FControlCollection write SetControlCollection;\r\n property ColumnCollection: TGridPanelColumns read FColumnCollection write SetColumnCollection;\r\n property DragMode;\r\n property ElementFont;\r\n property ElementID;\r\n property ElementPosition;\r\n property ExpandStyle: TGridPanelExpandStyle read FExpandStyle write FExpandStyle default esAddRows;\r\n property GridLineWidth: integer read FGridLineWidth write FGridLineWidth default 0;\r\n property GridLineColor: TColor read FGridLineColor write FGridLineColor default clBlack;\r\n property HeightPercent;\r\n property HeightStyle;\r\n property Margins;\r\n property PopupMenu;\r\n property Role;\r\n property RowCollection: TGridPanelRows read FRowCollection write SetRowCollection;\r\n property WidthPercent;\r\n property WidthStyle;\r\n property OnDragDrop;\r\n property OnDragOver;\r\n property OnEndDrag;\r\n property OnStartDrag;\r\n end;\r\n\r\n TWebGridPanel = class(TGridPanel);\r\n\r\n TMultiMediaType = (mtVideo, mtAudio);\r\n\r\n TMultiMediaVolume = 0..100;\r\n\r\n TMultimediaPlayer = class(TCustomControl)\r\n private\r\n FURL: string;\r\n FMultimediaType: TMultimediaType;\r\n FAutoPlay: boolean;\r\n FControls: boolean;\r\n FMuted: boolean;\r\n FLoop: boolean;\r\n FVolume: TMultiMediaVolume;\r\n FPlaybackRate: double;\r\n FContextMenu: boolean;\r\n procedure SetAutoPlay(const Value: boolean);\r\n procedure SetControls(const Value: boolean);\r\n procedure SetMuted(const Value: boolean);\r\n procedure SetLoop(const Value: boolean);\r\n procedure SetURL(const Value: string);\r\n procedure SetVolume(const Value: TMultiMediaVolume);\r\n function GetCurrentTime: double;\r\n procedure SetCurrentTime(const Value: double);\r\n function GetDuration: double;\r\n function GetEnded: boolean;\r\n function GetPaused: boolean;\r\n procedure SetPlaybackRate(const Value: double);\r\n procedure SetContextMenu(const Value: boolean);\r\n protected\r\n function CreateElement: TJSElement; override;\r\n procedure UpdateElement; override;\r\n public\r\n procedure CreateInitialize; override;\r\n procedure Play;\r\n procedure Pause;\r\n procedure ReLoad;\r\n property CurrentTime: double read GetCurrentTime write SetCurrentTime;\r\n property Duration: double read GetDuration;\r\n property Ended: boolean read GetEnded;\r\n property Paused: boolean read GetPaused;\r\n published\r\n property AlignWithMargins;\r\n property AutoPlay: boolean read FAutoPlay write SetAutoPlay;\r\n property Controls: boolean read FControls write SetControls;\r\n property ContextMenu: boolean read FContextMenu write SetContextMenu default true;\r\n property HeightPercent;\r\n property HeightStyle;\r\n property Loop: boolean read FLoop write SetLoop;\r\n property Margins;\r\n property MultimediaType: TMultimediaType read FMultiMediaType write FMultiMediaType;\r\n property Muted: boolean read FMuted write SetMuted;\r\n property PlaybackRate: double read FPlaybackRate write SetPlaybackRate;\r\n property URL: string read FURL write SetURL;\r\n property Volume: TMultiMediaVolume read FVolume write SetVolume;\r\n property WidthPercent;\r\n property WidthStyle;\r\n// property OnContextMenu;\r\n property OnMouseDown;\r\n property OnMouseUp;\r\n property OnMouseMove;\r\n end;\r\n\r\n TWebMultiMediaPlayer = class(TMultiMediaPlayer);\r\n\r\n THTMLContainer = class(TCustomControl)\r\n private\r\n FHTML: TStringList;\r\n FScrollStyle: TScrollStyle;\r\n procedure SetHTML(const Value: TStringList);\r\n protected\r\n function CreateElement: TJSElement; override;\r\n procedure UpdateElement; override;\r\n procedure HTMLChanged(Sender: TObject); virtual;\r\n public\r\n procedure CreateInitialize; override;\r\n destructor Destroy; override;\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property DragMode;\r\n property ElementFont;\r\n property ElementID;\r\n property ElementPosition;\r\n property Font;\r\n property HeightPercent;\r\n property HeightStyle;\r\n property HTML: TStringList read FHTML write SetHTML;\r\n property Margins;\r\n property Role;\r\n property ScrollStyle: TScrollStyle read FScrollStyle write FScrollStyle;\r\n property WidthPercent;\r\n property WidthStyle;\r\n property OnClick;\r\n property OnDblClick;\r\n property OnMouseDown;\r\n property OnMouseMove;\r\n property OnMouseUp;\r\n property OnTouchEnd;\r\n property OnTouchCancel;\r\n property OnTouchStart;\r\n property OnTouchMove;\r\n property OnDragDrop;\r\n property OnDragOver;\r\n property OnEndDrag;\r\n property OnStartDrag;\r\n end;\r\n\r\n TWebHTMLContainer = class(THTMLContainer);\r\n\r\n THTMLForm = class(TCustomControl)\r\n private\r\n FOnSubmit: TNotifyEvent;\r\n FAction: string;\r\n procedure SetAction(const Value: string);\r\n protected\r\n procedure UpdateElement; override;\r\n function CreateElement: TJSElement; override;\r\n function DoHandleSubmit(Event: TJSEvent): boolean; virtual;\r\n function GetChildContainer: TJSElement; override;\r\n procedure BindEvents; override;\r\n public\r\n function CheckValidity: boolean;\r\n procedure CreateInitialize; override;\r\n published\r\n property Action: string read FAction write SetAction;\r\n property Align;\r\n property Anchors;\r\n property ElementPosition;\r\n property ElementFont;\r\n property Font;\r\n property Role;\r\n property OnSubmit: TNotifyEvent read FOnSubmit write FOnSubmit;\r\n end;\r\n\r\n TWebHTMLForm = class(THTMLForm);\r\n\r\n TBadge = class(TCustomControl)\r\n private\r\n FTextColor: TColor;\r\n FText: string;\r\n procedure SetTextColor(const Value: TColor);\r\n procedure SetText(const Value: string);\r\n protected\r\n function CreateElement: TJSElement; override;\r\n procedure UpdateElement; override;\r\n procedure SetElementClassName(AValue: string); override;\r\n public\r\n procedure CreateInitialize; override;\r\n destructor Destroy; override;\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property Color default clRed;\r\n property ElementFont;\r\n property ElementID;\r\n property ElementPosition;\r\n property HeightPercent;\r\n property HeightStyle;\r\n property Margins;\r\n property Role;\r\n property Text: string read FText write SetText;\r\n property TextColor: TColor read FTextColor write SetTextColor;\r\n property WidthPercent;\r\n property WidthStyle;\r\n end;\r\n\r\n\r\n TWebBadge = class(TBadge);\r\n\r\n TAccordionSection = class(TCollectionItem)\r\n private\r\n FCaption: string;\r\n FContent: string;\r\n FTag: integer;\r\n FExpanded: boolean;\r\n procedure SetExpanded(const Value: boolean);\r\n procedure SetCaption(const Value: string);\r\n procedure SetContent(const Value: string);\r\n public\r\n procedure Assign(Source: TPersistent); override;\r\n property Expanded: boolean read FExpanded write SetExpanded;\r\n function CaptionElement: TJSHTMLElement;\r\n function PanelElement: TJSHTMLElement;\r\n published\r\n property Caption: string read FCaption write SetCaption;\r\n property Content: string read FContent write SetContent;\r\n property Tag: integer read FTag write FTag;\r\n end;\r\n\r\n TAccordionSections = class(TOwnedCollection)\r\n private\r\n FOnChange: TNotifyEvent;\r\n function GetItem(Index: integer): TAccordionSection; reintroduce;\r\n procedure SetItem(Index: integer; const Value: TAccordionSection);\r\n protected\r\n procedure Update(Item: TCollectionItem); override;\r\n public\r\n constructor Create(AOwner: TComponent); overload;\r\n function Add: TAccordionSection; reintroduce;\r\n function Insert(Index: integer): TAccordionSection; reintroduce;\r\n property Items[Index: integer]: TAccordionSection read GetItem write SetItem; default;\r\n property OnChange: TNotifyEvent read FOnChange write FOnChange;\r\n end;\r\n\r\n TAccordionSectionEvent = procedure(Sender: TObject; ASection: TAccordionSection) of object;\r\n TAccordionSectionAllowEvent = procedure(Sender: TObject; ASection: TAccordionSection; var Allow: boolean) of object;\r\n\r\n TAccordionSectionRenderEvent = procedure(Sender: TObject; ASection: TAccordionSection; ACaption, APanel: TJSHTMLElementRecord) of object;\r\n\r\n TAccordion = class(TCustomControl)\r\n private\r\n FStyleRendered: boolean;\r\n FSections: TAccordionSections;\r\n FOnCollapsing: TAccordionSectionAllowEvent;\r\n FOnExpanding: TAccordionSectionAllowEvent;\r\n FOnCollapsed: TAccordionSectionEvent;\r\n FOnExpanded: TAccordionSectionEvent;\r\n FOnRenderSection: TAccordionSectionRenderEvent;\r\n FElementSectionClassName: TElementClassName;\r\n FElementContentClassName: TElementClassName;\r\n procedure SetSections(const Value: TAccordionSections);\r\n protected\r\n function CreateElement: TJSElement; override;\r\n procedure UpdateElement; override;\r\n procedure RenderAccordion;\r\n procedure RenderStyle;\r\n procedure SectionsChanged(Sender: TObject); virtual;\r\n function DoAccordionClick(Event: TJSEvent): Boolean; virtual;\r\n procedure UpdateElementVisual; override;\r\n procedure Expand(ASection: TAccordionSection);\r\n procedure Collapse(ASection: TAccordionSection);\r\n procedure SetElementClassName(AValue: string); override;\r\n public\r\n procedure CreateInitialize; override;\r\n destructor Destroy; override;\r\n procedure EndUpdate; override;\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property Margins;\r\n property HeightPercent;\r\n property HeightStyle;\r\n property ElementSectionClassName: TElementClassName read FElementSectionClassName write FElementSectionClassName;\r\n property ElementContentClassName: TElementClassName read FElementContentClassName write FElementContentClassName;\r\n property ElementClassName;\r\n property ElementID;\r\n property ElementFont;\r\n property ElementPosition;\r\n property Role;\r\n property Sections: TAccordionSections read FSections write SetSections;\r\n property WidthPercent;\r\n property WidthStyle;\r\n property OnCollapsed: TAccordionSectionEvent read FOnCollapsed write FOnCollapsed;\r\n property OnCollapsing: TAccordionSectionAllowEvent read FOnCollapsing write FOnCollapsing;\r\n property OnExpanded: TAccordionSectionEvent read FOnExpanded write FOnExpanded;\r\n property OnExpanding: TAccordionSectionAllowEvent read FOnExpanding write FOnExpanding;\r\n property OnRenderSection: TAccordionSectionRenderEvent read FOnRenderSection write FOnRenderSection;\r\n end;\r\n\r\n TWebAccordion = class(TAccordion);\r\n\r\n\r\n TGridStyle = (gTemplateColumns, gTemplateRows);\r\n\r\n TResponsiveLayoutItem = class(TCollectionItem)\r\n private\r\n FWidth: integer;\r\n FStyleType: TGridStyle;\r\n FStyle: string;\r\n FColumnGap: string;\r\n FRowGap: string;\r\n FTag: integer;\r\n FDescription: string;\r\n FMargins: TMargins;\r\n procedure SetMargins(const Value: TMargins);\r\n procedure SetColumnGap(const Value: string);\r\n procedure SetRowGap(const Value: string);\r\n procedure SetStyle(const Value: string);\r\n procedure SetStyleType(const Value: TGridStyle);\r\n procedure SetWidth(const Value: integer);\r\n public\r\n constructor Create(AOwner: TCollection); override;\r\n destructor Destroy; override;\r\n procedure Assign(Source: TPersistent); override;\r\n published\r\n property ColumnGap: string read FColumnGap write SetColumnGap;\r\n property Description: string read FDescription write FDescription;\r\n property Margins: TMargins read FMargins write SetMargins;\r\n property RowGap: string read FRowGap write SetRowGap;\r\n property StyleType: TGridStyle read FStyleType write SetStyleType;\r\n property Style: string read FStyle write SetStyle;\r\n property Tag: integer read FTag write FTag;\r\n property Width: integer read FWidth write SetWidth;\r\n end;\r\n\r\n TResponsiveLayout = class(TOwnedCollection)\r\n private\r\n FOnChange: TNotifyEvent;\r\n function GetItem(Index: integer): TResponsiveLayoutItem; reintroduce;\r\n procedure SetItem(Index: integer; const Value: TResponsiveLayoutItem);\r\n protected\r\n procedure Update(Item: TCollectionItem); override;\r\n public\r\n function GetLayoutForWidth(w: integer): TResponsiveLayoutItem;\r\n constructor Create(AOwner: TComponent); reintroduce;\r\n function Add(AWidth: integer; AStyle: string): TResponsiveLayoutItem; overload; reintroduce;\r\n function Add: TResponsiveLayoutItem; overload; reintroduce;\r\n function Insert(Index: integer): TResponsiveLayoutItem; reintroduce;\r\n property Items[Index: integer]: TResponsiveLayoutItem read GetItem write SetItem;\r\n property OnChange: TNotifyEvent read FOnChange write FOnChange;\r\n end;\r\n\r\n //https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Grid_Layout\r\n\r\n TResponsiveLayoutChangeEvent = procedure(Sender: TObject; ALayout: TResponsiveLayoutItem) of object;\r\n\r\n TResponsiveGridPanel = class(TCustomControl)\r\n private\r\n FDesignTime: boolean;\r\n FLabel: TJSHTMLElement;\r\n FLayout: TResponsiveLayout;\r\n FActiveLayoutItem: TResponsiveLayoutItem;\r\n FOldWidth: integer;\r\n FControlCollection: TControlCollection;\r\n FOnLayoutChange: TResponsiveLayoutChangeEvent;\r\n FResizePtr: pointer;\r\n procedure SetControlCollection(const Value: TControlCollection);\r\n function HandleResize(Event: TEventListenerEvent): boolean; virtual;\r\n procedure SetResponsiveStyle;\r\n protected\r\n procedure BindEvents; override;\r\n procedure UnbindEvents; override;\r\n procedure UpdateControls;\r\n function CreateElement: TJSElement; override;\r\n function GridElementCount: integer;\r\n procedure UpdateElement; override;\r\n procedure Loaded; override;\r\n procedure RegisterParent(AValue: TControl); override;\r\n procedure Notification(AComponent: TComponent; Operation: TOperation); override;\r\n procedure LayoutChanged(Sender: TObject);\r\n public\r\n constructor Create(AOwner: TComponent); overload; override;\r\n destructor Destroy; override;\r\n procedure CreateInitialize; override;\r\n procedure AlignControls(AControl: TControl; var Rect: TRect); override;\r\n procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;\r\n procedure Resize; override;\r\n procedure AddControl(AControl: TWinControl);\r\n procedure RemoveControl(AControl: TWinControl);\r\n procedure EndUpdate; override;\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property ChildOrder;\r\n property Color;\r\n property ControlCollection: TControlCollection read FControlCollection write SetControlCollection;\r\n property ElementClassName;\r\n property ElementFont;\r\n property ElementID;\r\n property ElementPosition;\r\n property HeightPercent;\r\n property HeightStyle;\r\n property Hint;\r\n property Layout: TResponsiveLayout read FLayout write FLayout;\r\n property Margins;\r\n property Role;\r\n property ShowHint;\r\n property Visible;\r\n property WidthPercent;\r\n property WidthStyle;\r\n property OnLayoutChange: TResponsiveLayoutChangeEvent read FOnLayoutChange write FOnLayoutChange;\r\n end;\r\n\r\n TWebResponsiveGridPanel = class(TResponsiveGridPanel);\r\n\r\n\r\n TLookupValueItem = class(TCollectionItem)\r\n private\r\n FValue: string;\r\n FDisplayText: string;\r\n public\r\n\r\n published\r\n property Value: string read FValue write FValue;\r\n property DisplayText: string read FDisplayText write FDisplayText;\r\n end;\r\n\r\n TLookupValues = class(TOwnedCollection)\r\n private\r\n FOnChange: TNotifyEvent;\r\n function GetItem(Index: integer): TLookupValueItem; reintroduce;\r\n procedure SetItem(Index: integer; const Value: TLookupValueItem);\r\n protected\r\n procedure DoChange; virtual;\r\n public\r\n constructor Create(AOwner: TComponent); reintroduce;\r\n procedure AddPair(AValue, ADisplayText: string);\r\n function Add: TLookupValueItem; reintroduce;\r\n function Insert(Index: integer): TLookupValueItem; reintroduce;\r\n property Items[Index: integer]: TLookupValueItem read GetItem write SetItem; default;\r\n property OnChange: TNotifyEvent read FOnChange write FOnChange;\r\n end;\r\n\r\n TCustomLookupComboBox = class(TCustomComboBox)\r\n private\r\n FLookupValues: TLookupValues;\r\n procedure SetLookupValues(const Value: TLookupValues);\r\n function GetDisplayText: string;\r\n function GetValue: string;\r\n procedure SetDisplayText(const Value: string);\r\n protected\r\n procedure SetValue(const Value: string); virtual;\r\n procedure ValuesChanged(Sender: TObject);\r\n procedure DoUpdateList; override;\r\n public\r\n destructor Destroy; override;\r\n procedure CreateInitialize; override;\r\n property Value: string read GetValue write SetValue;\r\n property DisplayText: string read GetDisplayText write SetDisplayText;\r\n property LookupValues: TLookupValues read FLookupValues write SetLookupValues;\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property Color;\r\n property ElementClassName;\r\n property ElementID;\r\n property ElementFont;\r\n property ElementPosition;\r\n property Enabled;\r\n property Font;\r\n property Height;\r\n property HeightPercent;\r\n property HeightStyle;\r\n property Hint;\r\n property ItemIndex;\r\n property Left;\r\n property Margins;\r\n property ParentFont;\r\n property Role;\r\n property ShowFocus;\r\n property ShowHint;\r\n property TabOrder;\r\n property TabStop;\r\n property TextDirection;\r\n property TextHint;\r\n property Top;\r\n property Visible;\r\n property Width;\r\n property WidthPercent;\r\n property WidthStyle;\r\n property OnChange;\r\n property OnClick;\r\n property OnDblClick;\r\n property OnKeyDown;\r\n property OnKeyPress;\r\n property OnKeyUp;\r\n property OnMouseDown;\r\n property OnMouseUp;\r\n property OnMouseMove;\r\n property OnMouseLeave;\r\n property OnMouseEnter;\r\n property OnEnter;\r\n property OnExit;\r\n end;\r\n\r\n TLookupComboBox = class(TCustomLookupComboBox)\r\n published\r\n property LookupValues;\r\n end;\r\n\r\n TWebLookupComboBox = class(TLookupComboBox);\r\n\r\n\r\nimplementation\r\n\r\nuses\r\n WEBLib.Utils;\r\n\r\nvar\r\n geolocation : TJSGeoLocation; external name 'navigator.geolocation';\r\n\r\n\r\n{ TCustomLinkLabel }\r\n\r\nprocedure TCustomLinkLabel.SetCaption(const AValue: string);\r\nvar\r\n iopen, iopena, iopeni, iopenend, iopenendt, iclose: integer;\r\n scaption, shref, stext, sanchor, sid, stype: string;\r\n anchor, span, contentelement: TJSElement;\r\nbegin\r\n inherited SetCaption(AValue);\r\n\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n contentelement := ContentHandle;\r\n\r\n if (ElementID <> '') then\r\n begin\r\n contentelement := document.getElementById(ElementID);\r\n end;\r\n\r\n if Assigned(contentelement.nodeValue) then\r\n contentelement.nodeValue := '';\r\n\r\n scaption := Caption;\r\n\r\n sanchor := ' 0) or (pos(sid, scaption) > 0)) then\r\n begin\r\n while (Pos(sanchor, scaption) > 0) or (Pos(sid, scaption) > 0) do\r\n begin\r\n //find first link in string\r\n iopena := pos(sanchor, scaption);\r\n iopeni := pos(sid, scaption);\r\n\r\n if ((iopena < iopeni) or (iopeni <= 0)) and (iopena > 0) then\r\n begin\r\n stype := '#url#';\r\n iopen := iopena + length(sanchor);\r\n end\r\n else\r\n begin\r\n stype := '#id#';\r\n iopen := iopeni + length(sid);\r\n end;\r\n\r\n iopenend := pos('\">', scaption);\r\n iopenendt := pos('\" ', scaption);\r\n if (iopenendt > 0) and (iopenendt < iopenend) then\r\n iopenend := iopenendt;\r\n\r\n iclose := pos('', scaption);\r\n shref := copy(scaption, iopen, iopenend - iopen);\r\n\r\n iopenend := pos('\">', scaption);\r\n iclose := pos('', scaption);\r\n stext := copy(scaption, iopenend + 2, iclose - (iopenend + 2));\r\n\r\n //add prefix text\r\n span := document.createElement('SPAN');\r\n span.innerHTML := copy(scaption, 0, iopen);\r\n contentelement.appendChild(span);\r\n\r\n //add link\r\n anchor := document.createElement('A');\r\n anchor['href'] := '#';\r\n anchor['id'] := stype + shref;\r\n anchor.innerHTML := stext;\r\n TJSHTMLElement(anchor).onclick := DoLinkClick;\r\n contentelement.appendChild(anchor);\r\n\r\n //remove prefix + link\r\n Delete(scaption, 1, Pos('', scaption) + 3);\r\n end;\r\n\r\n //suffix text\r\n span := document.createElement('SPAN');\r\n span.innerHTML := scaption;\r\n contentelement.appendChild(span);\r\n FDisplText := scaption;\r\n end\r\n else\r\n begin\r\n FDisplText := StringReplace(AValue, '> <', '> <', [rfReplaceAll]);\r\n\r\n if Assigned(contentElement.nodeValue) then\r\n contentelement.nodeValue := FDisplText\r\n else\r\n if (contentelement.childelementcount <= 1) then\r\n contentelement.innerHTML := FDisplText;\r\n end;\r\nend;\r\n\r\nprocedure TCustomLinkLabel.SetHeightPercent(const Value: TPercentSize);\r\nbegin\r\n FHeightPercent := Value;\r\nend;\r\n\r\nprocedure TCustomLinkLabel.SetHeightStyle(const Value: TSizeStyle);\r\nbegin\r\n FHeightStyle := Value;\r\nend;\r\n\r\nprocedure TCustomLinkLabel.SetWidthPercent(const Value: TPercentSize);\r\nbegin\r\n FWidthPercent := Value;\r\nend;\r\n\r\nprocedure TCustomLinkLabel.SetWidthStyle(const Value: TSizeStyle);\r\nbegin\r\n FWidthStyle := Value;\r\nend;\r\n\r\nprocedure TCustomLinkLabel.BindEvents;\r\nbegin\r\n inherited;\r\nend;\r\n\r\nconstructor TCustomLinkLabel.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n FWidthStyle := ssAbsolute;\r\n FWidthPercent := 100;\r\n FHeightStyle := ssAbsolute;\r\n FHeightPercent := 100;\r\n Transparent := false;\r\nend;\r\n\r\nfunction TCustomLinkLabel.DoLinkClick(Event: TJSMouseEvent): boolean;\r\nvar\r\n slink, stype, svalue: string;\r\n ltype: TSysLinkType;\r\nbegin\r\n svalue := event.targetElement['id'];\r\n stype := '#url#';\r\n ltype := sltURL;\r\n\r\n if not (pos(stype, svalue) > 0) then\r\n begin\r\n stype := '#id#';\r\n ltype := sltID;\r\n end;\r\n\r\n slink := StringReplace(svalue, stype, '', []);\r\n\r\n if Assigned(FOnLinkClick) then\r\n FOnLinkClick(Self, slink, ltype);\r\n\r\n Result := true;\r\nend;\r\n\r\n\r\nfunction TCustomLinkLabel.GetDisplayText: string;\r\nbegin\r\n Result := FDisplText;\r\nend;\r\n\r\nfunction TCustomLinkLabel.GetOuterHeight: integer;\r\nbegin\r\n Result := Height;\r\n// if AutoSize then\r\n// Result := Result + 4;\r\nend;\r\n\r\nfunction TCustomLinkLabel.GetOuterWidth: integer;\r\nbegin\r\n Result := Width;\r\n// if AutoSize then\r\n// Result := Result + 4;\r\nend;\r\n\r\n{ TTrackBar }\r\n\r\nfunction TTrackBar.GetElementInputHandle: TJSHTMLInputElement;\r\nbegin\r\n Result := TJSHTMLInputElement(Container);\r\nend;\r\n\r\nfunction TTrackBar.GetInputType: string;\r\nbegin\r\n Result := 'range';\r\nend;\r\n\r\nprocedure TTrackBar.Change;\r\nbegin\r\n if Assigned(OnChange) then\r\n OnChange(Self);\r\nend;\r\n\r\n{$HINTS OFF}\r\nfunction TTrackBar.DoHandleChange(Event: TEventListenerEvent): Boolean;\r\nvar\r\n el: TJSHTMLElement;\r\nbegin\r\n el := ElementHandle;\r\n asm\r\n this.FPosition = el.value;\r\n end;\r\n\r\n Change;\r\n Result := True;\r\nend;\r\n{$HINTS ON}\r\n\r\nprocedure TTrackBar.BindEvents;\r\nbegin\r\n inherited;\r\n if Assigned(ElementHandle) then\r\n begin\r\n ElementHandle.oninput := DoHandleChange;\r\n end;\r\nend;\r\n\r\nprocedure TTrackBar.CreateControl;\r\nbegin\r\n inherited;\r\n DoUpdate;\r\nend;\r\n\r\nprocedure TTrackBar.CreateInitialize;\r\nbegin\r\n inherited;\r\n FMax := 100;\r\n FMin := 0;\r\n FPosition := 0;\r\nend;\r\n\r\nprocedure TTrackBar.SetMax(AValue: integer);\r\nbegin\r\n if (FMax <> AValue) then\r\n begin\r\n FMax := AValue;\r\n DoUpdate;\r\n end;\r\nend;\r\n\r\nprocedure TTrackBar.SetMin(AValue: integer);\r\nbegin\r\n if (FMin <> AValue) then\r\n begin\r\n FMin := AValue;\r\n DoUpdate;\r\n end;\r\nend;\r\n\r\nprocedure TTrackBar.SetOrientation(const Value: TTrackBarOrientation);\r\nvar\r\n ow, oh: integer;\r\nbegin\r\n if (FOrientation <> Value) then\r\n begin\r\n ow := Width;\r\n oh := Height;\r\n FOrientation := Value;\r\n if not (csLoading in ComponentState) then\r\n begin\r\n Width := oh;\r\n Height := ow;\r\n end;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\n{$HINTS OFF}\r\nprocedure TTrackBar.DoUpdate;\r\nvar\r\n el: TJSHTMLElement;\r\nbegin\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n Container['max'] := IntToStr(FMax);\r\n Container['min'] := IntToStr(FMin);\r\n\r\n el := ElementHandle;\r\n\r\n asm\r\n el.value = this.FPosition;\r\n el.setAttribute('value',this.FPosition);\r\n end;\r\nend;\r\n{$HINTS ON}\r\n\r\nprocedure TTrackBar.SetPosition(AValue: integer);\r\nbegin\r\n if (FPosition <> AValue) then\r\n begin\r\n FPosition := AValue;\r\n DoUpdate;\r\n end;\r\nend;\r\n\r\nprocedure TTrackBar.UpdateElementVisual;\r\nvar\r\n el: TJSHTMLElement;\r\nbegin\r\n inherited;\r\n\r\n el := ElementHandle;\r\n\r\n if Orientation = trHorizontal then\r\n begin\r\n el.removeAttribute('orient');\r\n el.style.removeProperty('writing-mode');\r\n el.style.removeProperty('-webkit-appearance');\r\n el.style.removeProperty('height');\r\n if WidthStyle = ssAbsolute then\r\n el.style.setProperty('width', IntToStr(Width));\r\n end\r\n else\r\n begin\r\n el.setAttribute('orient','vertical');\r\n el.style.setProperty('writing-mode','bt-lt');\r\n el.style.setProperty('-webkit-appearance','slider-vertical');\r\n el.style.removeProperty('width');\r\n if HeightStyle = ssAbsolute then\r\n el.style.setProperty('height', IntToStr(Height));\r\n el.style.setProperty('width','22px');\r\n end;\r\n\r\nend;\r\n\r\nfunction TTrackBar.GetPosition: integer;\r\nvar\r\n s: string;\r\nbegin\r\n Result := FPosition;\r\n\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n s := TJSHTMLInputElement(Container).value;\r\n if (s <> '') then\r\n Result := StrToInt(s);\r\nend;\r\n\r\n{ TTimer }\r\n\r\nconstructor TTimer.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n FInterval := 1000;\r\n FTimerID := -1;\r\n Enabled := True;\r\nend;\r\n\r\nprocedure TTimer.SetEnabled(Value: boolean);\r\nbegin\r\n FEnabled := Value;\r\n DoUpdateTimer;\r\nend;\r\n\r\nprocedure TTimer.SetInterval(AValue: integer);\r\nbegin\r\n FInterval := AValue;\r\n DoUpdateTimer;\r\nend;\r\n\r\nprocedure TTimer.DoTimer;\r\nbegin\r\n if Assigned(FOnTimer) then\r\n FOnTimer(Self);\r\nend;\r\n\r\ndestructor TTimer.Destroy;\r\nbegin\r\n DoClearTimer;\r\n inherited;\r\nend;\r\n\r\nprocedure TTimer.DoClearTimer;\r\nbegin\r\n if FTimerID <> -1 then\r\n begin\r\n window.clearInterval(FTimerID);\r\n FTimerID := -1;\r\n end;\r\nend;\r\n\r\nprocedure TTimer.DoUpdateTimer;\r\nbegin\r\n DoClearTimer;\r\n\r\n if Enabled then\r\n FTimerID := window.setInterval(@DoTimer, FInterval);\r\nend;\r\n\r\n{ TPaintBox }\r\n\r\nprocedure TPaintBox.UpdateElementVisual;\r\nbegin\r\n inherited;\r\n\r\n if (csDesigning in ComponentState) then\r\n begin\r\n ElementHandle.style.setProperty('border', '1px dotted gray');\r\n end;\r\nend;\r\n\r\nprocedure TPaintBox.Paint;\r\nbegin\r\n inherited;\r\n if Assigned(OnPaint) then\r\n OnPaint(Self);\r\nend;\r\n\r\n{ TScrollBox }\r\n\r\nprocedure TScrollBox.BindEvents;\r\nvar\r\n eh: TJSEventTarget;\r\nbegin\r\n inherited;\r\n if Assigned(ElementBindHandle) then\r\n begin\r\n eh := ElementBindHandle;\r\n eh.addEventListener('scroll',FScrollPtr);\r\n end;\r\nend;\r\n\r\nprocedure TScrollBox.ClearMethodPointers;\r\nbegin\r\n inherited;\r\n FScrollPtr := nil;\r\nend;\r\n\r\nprocedure TScrollBox.CreateInitialize;\r\nbegin\r\n inherited;\r\n FAutoScroll := true;\r\n FScrollBars := ssBoth;\r\n FHorzScrollBar := TControlScrollBar.Create(Self, TScrollBarKind.sbHorizontal);\r\n FVertScrollBar := TControlScrollBar.Create(Self, TScrollBarKind.sbVertical);\r\nend;\r\n\r\ndestructor TScrollBox.Destroy;\r\nbegin\r\n FHorzScrollBar.Free;\r\n FVertScrollBar.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TScrollBox.DoScroll;\r\nbegin\r\n if Assigned(OnScroll) then\r\n OnScroll(Self);\r\nend;\r\n\r\nprocedure TScrollBox.UnbindEvents;\r\nvar\r\n eh: TJSEventTarget;\r\nbegin\r\n inherited;\r\n if Assigned(ElementBindHandle) then\r\n begin\r\n eh := ElementBindHandle;\r\n eh.removeEventListener('scroll', FScrollPtr);\r\n end;\r\nend;\r\n\r\nprocedure TScrollBox.UpdateElement;\r\nbegin\r\n inherited;\r\n if Assigned(ElementHandle) and not IsUpdating then\r\n begin\r\n case ScrollBars of\r\n ssNone:\r\n begin\r\n ElementHandle.style.setProperty('overflow', 'hidden');\r\n end;\r\n ssVertical:\r\n begin\r\n ElementHandle.style.removeProperty('overflow');\r\n ElementHandle.style.setProperty('overflow-x', 'hidden');\r\n ElementHandle.style.setProperty('overflow-y', 'auto');\r\n end;\r\n ssHorizontal:\r\n begin\r\n ElementHandle.style.removeProperty('overflow');\r\n ElementHandle.style.setProperty('overflow-x', 'auto');\r\n ElementHandle.style.setProperty('overflow-y', 'hidden');\r\n end;\r\n ssBoth:\r\n begin\r\n ElementHandle.style.setProperty('overflow', 'auto');\r\n end;\r\n end;\r\n\r\n if Visible and not IsLinked then\r\n ElementHandle.style.setProperty('display', 'inline-block');\r\n end;\r\nend;\r\n\r\nprocedure TScrollBox.EndUpdate;\r\nbegin\r\n inherited;\r\n AlignControl(Self);\r\n // re-align in case align had effect on scrollbar appearance\r\n AlignControl(Self);\r\nend;\r\n\r\nfunction TScrollBox.GetClientRect: TRect;\r\nvar\r\n dw, dh: integer;\r\nbegin\r\n dw := 0;\r\n dh := 0;\r\n\r\n if (ElementHandle.scrollHeight > ElementHandle.ClientHeight) and (ScrollBars in [ssBoth, ssVertical]) then\r\n dw := 16; //GetScrollBarWidth;\r\n\r\n if (ElementHandle.scrollWidth > ElementHandle.ClientWidth) and (ScrollBars in [ssBoth, ssHorizontal]) then\r\n dh := 16; //GetScrollBarHeight;\r\n\r\n Result := Rect(0,0, TJSHTMLElement(ElementHandle).clientWidth - dw, TJSHTMLElement(ElementHandle).clientHeight - dh);\r\nend;\r\n\r\nprocedure TScrollBox.GetMethodPointers;\r\nbegin\r\n inherited;\r\n if FScrollPtr = nil then\r\n begin\r\n FScrollPtr := @HandleDoScroll;\r\n end;\r\nend;\r\n\r\nfunction TScrollBox.GetScrollLeft: integer;\r\nbegin\r\n Result := ElementHandle.scrollLeft;\r\nend;\r\n\r\nfunction TScrollBox.GetScrollTop: integer;\r\nbegin\r\n Result := ElementHandle.scrollTop;\r\nend;\r\n\r\nfunction TScrollBox.HandleDoScroll(Event: TJSMouseEvent): Boolean;\r\nbegin\r\n DoScroll;\r\n Result := true;\r\nend;\r\n\r\nprocedure TScrollBox.SetAutoScroll(AValue: boolean);\r\nbegin\r\n FAutoScroll := AValue;\r\nend;\r\n\r\nprocedure TScrollBox.SetScrollBars(const Value: TScrollStyle);\r\nbegin\r\n if (FScrollBars <> Value) then\r\n begin\r\n FScrollBars := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TScrollBox.SetScrollLeft(const Value: integer);\r\nbegin\r\n ElementHandle.scrollLeft := Value;\r\nend;\r\n\r\nprocedure TScrollBox.SetScrollTop(const Value: integer);\r\nbegin\r\n ElementHandle.scrollTop := Value;\r\nend;\r\n\r\nprocedure TScrollBox.ScrollBy(DeltaX: integer; DeltaY: integer);\r\nbegin\r\n ScrollLeft := ScrollLeft + deltaX;\r\n ScrollTop := ScrollTop + deltaY;\r\nend;\r\n\r\n{ TCustomImageControl }\r\n\r\nprocedure TCustomImageControl.CreateInitialize;\r\nbegin\r\n inherited;\r\n FPicture := TURLPicture.Create;\r\n FPicture.OnChange := PictureChanged;\r\n FPicture.OnDataChange := PictureDataChanged;\r\n Color := clNone;\r\n TabStop := false;\r\n if (csDesigning in ComponentState) then\r\n begin\r\n Width := 400;\r\n Height := 300;\r\n end;\r\nend;\r\n\r\nfunction TCustomImageControl.DataURL: string;\r\nbegin\r\n Result := 'data:image/png;base64,' + GetBase64Img;\r\nend;\r\n\r\nfunction TCustomImageControl.DataURL(AWidth, AHeight: integer): string;\r\nbegin\r\n Result := 'data:image/png;base64,' + GetBase64Image(ElementHandle, AWidth, AHeight);\r\nend;\r\n\r\ndestructor TCustomImageControl.Destroy;\r\nbegin\r\n FPicture.Free;\r\n inherited Destroy;\r\nend;\r\n\r\nfunction TCustomImageControl.GetBase64Img: string;\r\nbegin\r\n Result := GetBase64Image(ElementHandle);\r\nend;\r\n\r\nprocedure TCustomImageControl.GetMethodPointers;\r\nbegin\r\n inherited;\r\n if FImageLoadPtr = nil then\r\n FImageLoadPtr := @HandleImageLoad;\r\n if FImageErrorPtr = nil then\r\n FImageErrorPtr := @HandleError;\r\nend;\r\n\r\nprocedure TCustomImageControl.BindEvents;\r\nbegin\r\n inherited;\r\n\r\n if Assigned(ElementBindHandle) then\r\n begin\r\n ElementBindHandle.addEventListener('load',FImageLoadPtr);\r\n if not (csDesigning in ComponentState) then\r\n ElementBindHandle.addEventListener('error',FImageErrorPtr);\r\n end;\r\nend;\r\n\r\nprocedure TCustomImageControl.ClearMethodPointers;\r\nbegin\r\n inherited;\r\n\r\n FImageLoadPtr := nil;\r\n FImageErrorPtr := nil;\r\nend;\r\n\r\nfunction TCustomImageControl.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('IMG');\r\n\r\n if URL <> '' then\r\n Result.setAttribute('src', URL);\r\nend;\r\n\r\n{$HINTS OFF}\r\nfunction TCustomImageControl.HandleError(AEvent: TJSEvent): boolean;\r\nvar\r\n Handled: boolean;\r\n LEventRec: TJSEventRecord;\r\n LRequestRec: TJSXMLHttpRequestRecord;\r\nbegin\r\n Result := true;\r\n Handled := false;\r\n if Assigned(FOnError) then\r\n begin\r\n LEventRec.event := aEvent;\r\n LRequestRec.req := TJSXMLHttpRequest(aEvent.Target);\r\n FOnError(Self, LRequestRec, LEventRec, Handled);\r\n end;\r\n\r\n if Assigned(FImageError) then\r\n FImageError(AEvent);\r\n\r\n if not Handled and not (csDesigning in ComponentState) then\r\n raise Exception.Create('Error loading image ' + URL);\r\nend;\r\n\r\nfunction TCustomImageControl.HandleImageLoad(AEvent: TJSEvent): boolean;\r\nvar\r\n el: TJSElement;\r\n w,h: integer;\r\nbegin\r\n el := ElementHandle;\r\n\r\n asm\r\n w = el.naturalWidth;\r\n h = el.naturalHeight;\r\n end;\r\n\r\n FPicture.Width := w;\r\n FPicture.Height := h;\r\n\r\n if Assigned(OnLoaded) then\r\n OnLoaded(Self);\r\n\r\n if Assigned(FImageLoaded) then\r\n FImageLoaded(AEvent);\r\n\r\n Result := true;\r\nend;\r\n\r\nfunction TCustomImageControl.ImageHeight: integer;\r\nvar\r\n el: TJSElement;\r\n h: integer;\r\nbegin\r\n Result := -1;\r\n if Assigned(ElementHandle) then\r\n begin\r\n el := ElementHandle;\r\n asm\r\n h = el.naturalHeight;\r\n end;\r\n Result := h;\r\n end;\r\nend;\r\n\r\nfunction TCustomImageControl.ImageWidth: integer;\r\nvar\r\n el: TJSElement;\r\n w: integer;\r\nbegin\r\n Result := -1;\r\n if Assigned(ElementHandle) then\r\n begin\r\n el := ElementHandle;\r\n asm\r\n w = el.naturalWidth;\r\n end;\r\n Result := w;\r\n end;\r\nend;\r\n\r\nprocedure TCustomImageControl.LoadFromURL(const AURL: string;\r\n ImageLoaded: TImageLoadedProc; ImageError: TImageErrorProc);\r\nbegin\r\n FImageLoaded := ImageLoaded;\r\n FImageError := ImageError;\r\n\r\n URL := AURL;\r\nend;\r\n\r\nfunction TCustomImageControl.LoadFromURL(const AURL: string): TJSPromise;\r\nbegin\r\n Result := TJSPromise.new(\r\n procedure(ASuccess, AFailed: TJSPromiseResolver)\r\n begin\r\n LoadFromURL(AURL,\r\n procedure(AEvent: TJSEvent)\r\n begin\r\n ASuccess(AEvent);\r\n end,\r\n\r\n procedure(AEvent: TJSEvent)\r\n begin\r\n AFailed(AEvent);\r\n end)\r\n end);\r\nend;\r\n\r\n{$HINTS ON}\r\n\r\nprocedure TCustomImageControl.SetContainerURL(AURL: string);\r\nbegin\r\n if Assigned(Container) then\r\n begin\r\n if AURL = '' then\r\n Container.removeAttribute('src')\r\n else\r\n Container['src'] := AURL;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomImageControl.SetURL(AURL: string);\r\nbegin\r\n FURL := AURL;\r\n SetContainerURL(AURL);\r\nend;\r\n\r\nprocedure TCustomImageControl.UnbindEvents;\r\nvar\r\n eh: TJSEventTarget;\r\nbegin\r\n inherited;\r\n\r\n if Assigned(ElementBindHandle) then\r\n begin\r\n eh := ElementBindHandle;\r\n eh.removeEventListener('load', FImageLoadPtr);\r\n if not (csDesigning in ComponentState) then\r\n eh.removeEventListener('error',FImageErrorPtr);\r\n end;\r\nend;\r\n\r\nprocedure TCustomImageControl.UpdateElement;\r\nbegin\r\n inherited;\r\n if AutoSize and Assigned(ElementHandle) then\r\n begin\r\n ElementHandle.style.removeProperty('width');\r\n ElementHandle.style.removeProperty('height');\r\n end;\r\n\r\nend;\r\n\r\nprocedure TCustomImageControl.SetPicture(const Value: TURLPicture);\r\nbegin\r\n FPicture.Assign(Value);\r\nend;\r\n\r\nprocedure TCustomImageControl.PictureChanged(Sender: TObject);\r\nbegin\r\n SetURL(Picture.FileName);\r\n UpdateElement;\r\nend;\r\n\r\nprocedure TCustomImageControl.PictureDataChanged(Sender: TObject);\r\nbegin\r\n SetContainerURL('data:image/png;base64,' + HexImageDecodeAsBase64(Picture.Data));\r\nend;\r\n\r\nprocedure TCustomImageControl.ResizeImage(AWidth, AHeight: integer);\r\nbegin\r\n ResizeImage(AWidth, AHeight, false);\r\nend;\r\n\r\nprocedure TCustomImageControl.ResizeImage;\r\nbegin\r\n ResizeImage(Width, Height, false);\r\nend;\r\n\r\nprocedure TCustomImageControl.ResizeImage(AWidth, AHeight: integer;\r\n AspectRatio: boolean);\r\nvar\r\n w,h: integer;\r\n r: double;\r\nbegin\r\n if AspectRatio then\r\n begin\r\n if (ImageWidth = AWidth) or (ImageHeight = AHeight) then\r\n Exit;\r\n end\r\n else\r\n begin\r\n if (ImageWidth = AWidth) and (ImageHeight = AHeight) then\r\n Exit;\r\n end;\r\n\r\n if (AWidth = 0) or (AHeight = 0) then\r\n Exit;\r\n\r\n w := AWidth;\r\n h := AHeight;\r\n\r\n if AspectRatio then\r\n begin\r\n if (ImageWidth/w > ImageHeight/h) then\r\n r := ImageWidth/w\r\n else\r\n r := ImageHeight/h;\r\n\r\n w := Round(ImageWidth / r);\r\n h := Round(ImageHeight / r);\r\n end;\r\n\r\n URL := 'data:image/png;base64,' + GetBase64Image(ElementHandle, w, h);\r\nend;\r\n\r\n{ TSplitter }\r\n\r\nprocedure TSplitter.ColorChanging;\r\nbegin\r\n inherited;\r\n Invalidate;\r\nend;\r\n\r\nfunction TSplitter.CreateElement: TJSElement;\r\nbegin\r\n Result := inherited CreateElement;\r\nend;\r\n\r\nprocedure TSplitter.CreateInitialize;\r\n begin\r\n inherited;\r\n Cursor := crHSplit;\r\n Width := 6;\r\n Height := 100;\r\n Align := alLeft;\r\n FSplitControl := nil;\r\n GripColor := clWhite;\r\n end;\r\n\r\n procedure TSplitter.Paint;\r\n var\r\n xofs,dx: integer;\r\n yofs,dy: integer;\r\n i: integer;\r\n begin\r\n if FTouched then\r\n begin\r\n Canvas.Brush.Color := clGray;\r\n Canvas.Pen.Color := clGray;\r\n end\r\n else\r\n begin\r\n Canvas.Brush.Color := Color;\r\n Canvas.Pen.Color := Color;\r\n end;\r\n Canvas.Brush.Style := bsSolid;\r\n Canvas.Rectangle(ClientRect);\r\n\r\n if (Align in [alLeft, alRight]) then\r\n begin\r\n dx := 0;\r\n dy := 6;\r\n yofs := (Height div 2) - 9;\r\n xofs := (Width div 2);\r\n end;\r\n\r\n if (Align in [alTop, alBottom]) then\r\n begin\r\n dx := 6;\r\n dy := 0;\r\n xofs := (Width div 2) - 9;\r\n yofs := (Height div 2) - 1;\r\n end;\r\n\r\n Canvas.Brush.Color := GripColor;\r\n Canvas.Pen.Color := GripColor;\r\n\r\n for i := 0 to 2 do\r\n begin\r\n Canvas.Rectangle(xofs, yofs, xofs + 2, yofs + 2);\r\n xofs := xofs + dx;\r\n yofs := yofs + dy;\r\n end;\r\n end;\r\n\r\nprocedure TSplitter.SetGripColor(const Value: TColor);\r\nbegin\r\n if (FGripColor <> Value) then\r\n begin\r\n FGripColor := Value;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TSplitter.UpdateElement;\r\nbegin\r\n inherited;\r\nend;\r\n\r\nprocedure TSplitter.UpdateElementSize;\r\nbegin\r\n inherited;\r\nend;\r\n\r\nprocedure TSplitter.MouseUp(Button: TMouseButton; Shift: TShiftState; X,Y: Integer);\r\nbegin\r\n inherited;\r\n FSizing := false;\r\n FSplitControl := nil;\r\nend;\r\n\r\nprocedure TSplitter.MouseDown(Button: TMouseButton; Shift: TShiftState; X,Y: Integer);\r\nbegin\r\n inherited;\r\n DoSizeStart(X,Y);\r\nend;\r\n\r\nprocedure TSplitter.DoMouseEnter;\r\nbegin\r\n inherited;\r\n if (Align in [alLeft, alRight]) then\r\n Cursor := crHSplit;\r\n\r\n if (Align in [alTop, alBottom]) then\r\n Cursor := crVSplit;\r\nend;\r\n\r\nprocedure TSplitter.DoSizeStart(X,Y: integer);\r\nvar\r\n r,rc: TRect;\r\n i: integer;\r\n c: TControl;\r\n eh: TJSHTMLElement;\r\nbegin\r\n FSizing := true;\r\n\r\n r := Rect(Left, Top, Left + Width, Top + Height);\r\n\r\n if Assigned(Parent) then\r\n begin\r\n for i := 0 to Parent.ControlCount - 1 do\r\n begin\r\n c := Parent.Controls[i];\r\n\r\n if (c.Align = Align) and (c <> Self) then\r\n begin\r\n rc := Rect(c.Left, c.Top, c.Left + c.Width, c.Top + c.Height);\r\n\r\n //OutputDebugString(c.GetID+':'+inttostr(rc.Right)+':'+inttostr(r.Left));\r\n\r\n if (Align = alLeft) and (rc.Right - r.Left < 4) then\r\n begin\r\n FSplitControl := c;\r\n FOriginalWidth := FSplitControl.Width;\r\n FSizing := true;\r\n FSizingX := X;\r\n FSizingY := Y;\r\n break;\r\n //OutputDebugString('left:'+c.GetID);\r\n end;\r\n\r\n if (Align = alRight) and (rc.Left - r.Right < 4) then\r\n begin\r\n FSplitControl := c;\r\n FOriginalWidth := FSplitControl.Width;\r\n FSizing := true;\r\n FSizingX := X;\r\n FSizingY := Y;\r\n break;\r\n //OutputDebugString('left:'+c.GetID);\r\n end;\r\n\r\n if (Align = alTop) and (rc.Bottom - r.Top < 4) then\r\n begin\r\n FSplitControl := c;\r\n FOriginalHeight := FSplitControl.Height;\r\n FSizing := true;\r\n FSizingX := X;\r\n FSizingY := Y;\r\n break;\r\n //OutputDebugString('top:'+c.GetID);\r\n end;\r\n\r\n if (Align = alBottom) and (rc.Top - r.Bottom < 4) then\r\n begin\r\n FSplitControl := c;\r\n FOriginalHeight := FSplitControl.Height;\r\n FSizing := true;\r\n FSizingX := X;\r\n FSizingY := Y;\r\n break;\r\n //OutputDebugString('top:'+c.GetID);\r\n end;\r\n\r\n end;\r\n end;\r\n end;\r\n\r\n FLayer := document.createElement('SPAN');\r\n document.body.appendChild(FLayer);\r\n\r\n eh := TJSHTMLElement(FLayer);\r\n eh.style.setProperty('top', '0');\r\n eh.style.setProperty('left', '0');\r\n eh.style.setProperty('right', '0');\r\n eh.style.setProperty('bottom', '0');\r\n // make sure it is higher than the z-index of the layer associated with popup forms\r\n eh.style.setProperty('z-index', '99999999');\r\n\r\n eh.style.setProperty('webkit-user-select', 'none');\r\n eh.style.setProperty('moz-user-select', 'none');\r\n eh.style.setProperty('khtml-user-select', 'none');\r\n eh.style.setProperty('ms-user-select', 'none');\r\n eh.style.setProperty('user-select', 'none');\r\n eh.style.setProperty('position', 'absolute');\r\n\r\n if (Align in [alLeft, alRight]) then\r\n eh.style.setProperty('cursor', 'col-resize');\r\n\r\n if (Align in [alTop, alBottom]) then\r\n eh.style.setProperty('cursor', 'row-resize');\r\n\r\n FFirstMove := true;\r\n FSizing := true;\r\n\r\n eh.addEventListener('mousemove',@HandleDocDoMouseMove);\r\n eh.addEventListener('mouseup',@HandleDocDoMouseUp);\r\n\r\n eh.addEventListener('touchmove', @HandleDocDoTouchMove);\r\n eh.addEventListener('touchend', @HandleDocDoTouchEnd);\r\n\r\nend;\r\n\r\nfunction TSplitter.HandleDocDoMouseMove(Event: TJSMouseEvent): Boolean;\r\nvar\r\n dx,dy: integer;\r\nbegin\r\n if FSizing and Assigned(FSplitControl) then\r\n begin\r\n if FFirstMove then\r\n begin\r\n FSizingX := Event.clientX;\r\n FSizingY := Event.clientY;\r\n FFirstMove := false;\r\n end\r\n else\r\n begin\r\n dx := Round(Event.clientX - FSizingX);\r\n dy := Round(Event.clientY - FSizingY);\r\n\r\n if Align = alLeft then\r\n FSplitControl.Width := FOriginalWidth + dx;\r\n\r\n if Align = alRight then\r\n FSplitControl.Width := FOriginalWidth - dx;\r\n\r\n if Align = alTop then\r\n FSplitControl.Height := FOriginalHeight + dy;\r\n\r\n if Align = alBottom then\r\n FSplitControl.Height := FOriginalHeight - dy;\r\n\r\n DoRealign;\r\n\r\n if Assigned(OnMove) then\r\n OnMove(Self);\r\n end;\r\n end;\r\n Result := true;\r\nend;\r\n\r\nfunction TSplitter.HandleDocDoMouseUp(Event: TJSMouseEvent): Boolean;\r\nbegin\r\n FSizing := false;\r\n FSplitControl := nil;\r\n FFirstMove := true;\r\n FLayer.parentNode.removeChild(FLayer);\r\n Result := true;\r\n if Assigned(OnMoved) then\r\n OnMoved(Self);\r\nend;\r\n\r\n\r\nfunction TSplitter.HandleDocDoTouchMove(Event: TJSTouchEvent): Boolean;\r\nvar\r\n touch: TJSTouch;\r\n dx,dy: integer;\r\nbegin\r\n StopPropagation;\r\n\r\n if Event.Touches.length > 0 then\r\n begin\r\n touch := Event.touches.Touches[0];\r\n\r\n if FSizing and Assigned(FSplitControl) then\r\n begin\r\n if FFirstMove then\r\n begin\r\n FSizingX := touch.clientX;\r\n FSizingY := touch.clientY;\r\n FFirstMove := false;\r\n end\r\n else\r\n begin\r\n dx := Round(touch.clientX - FSizingX);\r\n dy := Round(touch.clientY - FSizingY);\r\n\r\n if Align = alLeft then\r\n FSplitControl.Width := FOriginalWidth + dx;\r\n\r\n if Align = alRight then\r\n FSplitControl.Width := FOriginalWidth - dx;\r\n\r\n if Align = alTop then\r\n FSplitControl.Height := FOriginalHeight + dy;\r\n\r\n if Align = alBottom then\r\n FSplitControl.Height := FOriginalHeight - dy;\r\n\r\n DoRealign;\r\n\r\n if Assigned(OnMove) then\r\n OnMove(Self);\r\n end;\r\n end;\r\n end;\r\n\r\n Result := True;\r\nend;\r\n\r\nfunction TSplitter.HandleDoTouchStart(Event: TJSTouchEvent): Boolean;\r\nvar\r\n l,t: single;\r\n touch: TJSTouch;\r\nbegin\r\n StopPropagation;\r\n PreventDefault;\r\n\r\n if Event.Touches.length > 0 then\r\n begin\r\n touch := Event.touches.Touches[0];\r\n\r\n FTouched := true;\r\n Invalidate;\r\n Invalidate;\r\n XYToClient(touch.clientX, touch.clientY, l, t);\r\n\r\n DoSizeStart(round(l),round(t));\r\n end;\r\n\r\n Result := false;\r\nend;\r\n\r\nfunction TSplitter.HandleDocDoTouchEnd(Event: TJSTouchEvent): Boolean;\r\nbegin\r\n FTouched := false;\r\n Invalidate;\r\n\r\n FSizing := false;\r\n FSplitControl := nil;\r\n FFirstMove := true;\r\n FLayer.parentNode.removeChild(FLayer);\r\n Result := true;\r\n if Assigned(OnMoved) then\r\n OnMoved(Self);\r\nend;\r\n\r\n{ TDivPanel }\r\n\r\nfunction TDivPanel.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('DIV');\r\nend;\r\n\r\n{ TCustomPanel }\r\n\r\nprocedure TCustomPanel.CreateInitialize;\r\nbegin\r\n inherited;\r\n EnablePropagation := True;\r\n FAutoSize := False;\r\n FAlignment := taCenter;\r\n Color := clBtnFace;\r\n TabStop := False;\r\n CustomBorder := true;\r\n ShowCaption := true;\r\n ControlStyle := ControlStyle + [csAcceptsControls];\r\n FLabel := nil;\r\n FPadding := TPadding.Create;\r\n\r\n if (csDesigning in ComponentState) then\r\n begin\r\n Width := 400;\r\n Height := 300;\r\n end;\r\nend;\r\n\r\ndestructor TCustomPanel.Destroy;\r\nbegin\r\n FPadding.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TCustomPanel.EndUpdate;\r\nbegin\r\n inherited;\r\n if AutoSize then\r\n AutoSize := true;\r\nend;\r\n\r\nfunction TCustomPanel.GetChildContainer: TJSElement;\r\nbegin\r\n if Assigned(FPanelBody) then\r\n Result := FPanelBody\r\n else\r\n Result := inherited;\r\nend;\r\n\r\nfunction TCustomPanel.GetOuterHeight: integer;\r\nbegin\r\n Result := inherited GetOuterHeight;\r\nend;\r\n\r\nfunction TCustomPanel.GetOuterWidth: integer;\r\nbegin\r\n Result := inherited GetOuterWidth;\r\nend;\r\n\r\nprocedure TCustomPanel.RegisterParent(AValue: TControl);\r\nbegin\r\n inherited;\r\n if AutoSize then\r\n DoAutoSize;\r\nend;\r\n\r\nprocedure TCustomPanel.AlignControl(AControl: TControl);\r\nbegin\r\n inherited;\r\n if AutoSize then\r\n DoAutoSize;\r\nend;\r\n\r\nfunction TCustomPanel.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('SPAN');\r\n FPanelBody := TJSHTMLElement(document.createElement('DIV'));\r\n FPanelBody['class'] := 'card-body';\r\n Result.appendChild(FPanelBody);\r\nend;\r\n\r\nprocedure TCustomPanel.DoAutoSize;\r\nvar\r\n i: integer;\r\n minx,miny,maxx,maxy: integer;\r\n r: TJSDomRect;\r\n el: TJSElement;\r\nbegin\r\n if (WidthStyle = ssAbsolute) and (HeightStyle = ssAbsolute) then\r\n begin\r\n maxx := 0;\r\n maxy := 0;\r\n minx := $FFFF;\r\n miny := $FFFF;\r\n for i := 0 to ControlCount - 1 do\r\n begin\r\n if Controls[i].WidthStyle = ssAbsolute then\r\n begin\r\n if Controls[i].Left + Controls[i].Width > maxx then\r\n maxx := Controls[i].Left + Controls[i].Width;\r\n\r\n if Controls[i].Left < minx then\r\n minx := Controls[i].Left;\r\n end\r\n else\r\n begin\r\n el := Controls[i].ElementHandle;\r\n if Assigned(el) then\r\n begin\r\n r := el.getBoundingClientRect;\r\n if r.X - Left + r.Width > maxx then\r\n maxx := Round(r.X - Left + r.Width);\r\n\r\n minx := 0;\r\n end;\r\n end;\r\n\r\n if Controls[i].HeightStyle = ssAbsolute then\r\n begin\r\n if Controls[i].Top + Controls[i].Height > maxy then\r\n maxy := Controls[i].Top + Controls[i].Height;\r\n\r\n if Controls[i].Top < miny then\r\n miny := Controls[i].Top;\r\n end\r\n else\r\n begin\r\n el := Controls[i].ElementHandle;\r\n if Assigned(el) then\r\n begin\r\n r := el.getBoundingClientRect;\r\n if r.Y - Top + r.Height > maxy then\r\n maxy := Round(r.Y - Top + r.Height);\r\n miny := 0;\r\n end;\r\n end;\r\n end;\r\n\r\n // don't do anything if it would render the panel invisible at design-time\r\n if (csDesigning in ComponentState) then\r\n begin\r\n if (ControlCount = 0) or (maxx = 0) or (maxy = 0) then\r\n Exit;\r\n end;\r\n\r\n if (BorderStyle = bsSingle) then\r\n begin\r\n inc(maxx);\r\n inc(maxy);\r\n end;\r\n\r\n for i := 0 to ControlCount - 1 do\r\n begin\r\n Controls[i].Left := Controls[i].Left - minx;\r\n Controls[i].Top := Controls[i].Top - miny;\r\n end;\r\n\r\n Width := maxx - minx;\r\n Height := maxy - miny;\r\n end\r\n else\r\n begin\r\n Width := -1;\r\n Height := -1;\r\n end;\r\n\r\n UpdateElement;\r\nend;\r\n\r\nprocedure TCustomPanel.SetAlignment(const Value: TAlignment);\r\nbegin\r\n if (FAlignment <> Value) then\r\n begin\r\n FAlignment := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomPanel.SetAutoSize(AValue: boolean);\r\nbegin\r\n FAutoSize := AValue;\r\n if FAutoSize and not IsUpdating then\r\n begin\r\n DoAutoSize;\r\n end;\r\nend;\r\n\r\nprocedure TCustomPanel.SetBorderStyle(const AValue: TBorderStyle);\r\nbegin\r\n inherited;\r\n UpdateElement;\r\nend;\r\n\r\nprocedure TCustomPanel.SetBounds(X, Y, AWidth, AHeight: Integer);\r\nbegin\r\n inherited;\r\n if AutoSize then\r\n DoAutoSize;\r\nend;\r\n\r\nprocedure TCustomPanel.SetCaption(const AValue: string);\r\nbegin\r\n inherited SetCaption(AValue);\r\n\r\n if Assigned(ElementHandle) and ShowCaption then\r\n begin\r\n if not Assigned(FLabel) then\r\n begin\r\n FLabel := TJSHTMLElement(document.createElement('SPAN'));\r\n FLabel.innerHTML := Caption;\r\n if Assigned(ChildContainer) then\r\n ChildContainer.appendChild(FLabel)\r\n else\r\n ElementHandle.appendChild(FLabel);\r\n\r\n UpdateElementVisual;\r\n end\r\n else\r\n begin\r\n FLabel.innerHTML := Caption;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TCustomPanel.SetPadding(const Value: TPadding);\r\nbegin\r\n FPadding.Assign(Value);\r\nend;\r\n\r\nprocedure TCustomPanel.SetShowCaption(const Value: boolean);\r\nbegin\r\n if (FShowCaption <> Value) then\r\n begin\r\n FShowCaption := Value;\r\n UpdateElementVisual;\r\n end;\r\nend;\r\n\r\nprocedure TCustomPanel.UnRegisterParent(AValue: TControl);\r\nbegin\r\n inherited;\r\n if AutoSize then\r\n DoAutoSize;\r\n\r\nend;\r\n\r\nprocedure TCustomPanel.UpdateElementVisual;\r\nbegin\r\n inherited;\r\n\r\n if Assigned(ElementHandle) then\r\n begin\r\n if not IsLinked then\r\n begin\r\n if AutoSize then\r\n begin\r\n ElementHandle.style.setProperty('overflow', '');\r\n ElementHandle.style.setProperty('white-space', 'normal');\r\n if Visible then\r\n ElementHandle.style.setProperty('display', 'inline');\r\n end\r\n else\r\n begin\r\n ElementHandle.style.setProperty('overflow', 'hidden');\r\n ElementHandle.style.setProperty('white-space', 'nowrap');\r\n if Visible then\r\n ElementHandle.style.setProperty('display', 'inline-block');\r\n end;\r\n\r\n ElementHandle.style.setProperty('padding-left',inttostr(Padding.Left)+'px');\r\n ElementHandle.style.setProperty('padding-right',inttostr(Padding.Right)+'px');\r\n ElementHandle.style.setProperty('padding-top',inttostr(Padding.Top)+'px');\r\n ElementHandle.style.setProperty('padding-bottom',inttostr(Padding.Bottom)+'px');\r\n ElementHandle.style.setProperty('box-sizing','border-box');\r\n\r\n if ElementBodyClassName <> '' then\r\n ChildContainer.setAttribute('class', ElementBodyClassName)\r\n else\r\n ChildContainer.removeAttribute('class');\r\n end;\r\n\r\n if Assigned(FLabel) then\r\n begin\r\n if ShowCaption then\r\n FLabel.innerHTML := Caption\r\n else\r\n FLabel.innerHTML := '';\r\n\r\n // center the label\r\n if Visible then\r\n begin\r\n ElementHandle.style.setProperty('display','flex');\r\n case Alignment of\r\n taLeftJustify: ElementHandle.style.setProperty('justify-content','flex-start');\r\n taCenter: ElementHandle.style.setProperty('justify-content','center');\r\n taRightJustify: ElementHandle.style.setProperty('justify-content','flex-end');\r\n end;\r\n ElementHandle.style.setProperty('align-items','center');\r\n end;\r\n end;\r\n\r\n // do not block selection in child controls\r\n ElementHandle.style.setProperty('user-select', '');\r\n\r\n // allow default caret on text\r\n if Cursor = crDefault then\r\n ElementHandle.style.setProperty('cursor', '');\r\n end;\r\nend;\r\n\r\n{ TGeoLocation }\r\n\r\n//function TGeoLocation.CreateElement: TJSElement;\r\n//begin\r\n// Result := nil;\r\n//end;\r\n\r\nprocedure TGeoLocation.DoHandleGeolocation(APosition: TJSPosition);\r\nbegin\r\n if Assigned(OnGeolocation) then\r\n OnGeolocation(Self, APosition.Coords.Latitude, APosition.Coords.Longitude, APosition.Coords.Altitude);\r\nend;\r\n\r\nprocedure TGeoLocation.GetGeolocation;\r\nbegin\r\n if Assigned(geolocation) then\r\n begin\r\n geolocation.getCurrentPosition(TJSGeoLocationCallback(@DoHandleGeoLocation));\r\n end;\r\nend;\r\n\r\nfunction TGeoLocation.HasGeolocation: boolean;\r\nbegin\r\n Result := Assigned(geolocation);\r\nend;\r\n\r\n{ TGridPanelRows }\r\n\r\nfunction TGridPanelRows.Add: TGridPanelRow;\r\nbegin\r\n Result := TGridPanelRow(inherited Add);\r\nend;\r\n\r\nconstructor TGridPanelRows.Create(AOwner: TComponent);\r\nbegin\r\n inherited Create(AOwner, TGridPanelRow);\r\nend;\r\n\r\nfunction TGridPanelRows.GetItem(Index: integer): TGridPanelRow;\r\nbegin\r\n Result := TGridPanelRow(inherited Items[Index]);\r\nend;\r\n\r\nfunction TGridPanelRows.Insert(Index: integer): TGridPanelRow;\r\nbegin\r\n Result := TGridPanelRow(inherited Insert(Index));\r\nend;\r\n\r\nprocedure TGridPanelRows.SetItem(Index: integer; const Value: TGridPanelRow);\r\nbegin\r\n inherited Items[Index] := Value;\r\nend;\r\n\r\nprocedure TGridPanelRows.Update(Item: TCollectionItem);\r\nbegin\r\n inherited;\r\n if Assigned(OnChange) then\r\n OnChange(Self);\r\nend;\r\n\r\n{ TGridPanelColumns }\r\n\r\nfunction TGridPanelColumns.Add: TGridPanelColumn;\r\nbegin\r\n Result := TGridPanelColumn(inherited Add);\r\nend;\r\n\r\nconstructor TGridPanelColumns.Create(AOwner: TComponent);\r\nbegin\r\n inherited Create(AOwner, TGridPanelColumn);\r\nend;\r\n\r\nfunction TGridPanelColumns.GetItem(Index: integer): TGridPanelColumn;\r\nbegin\r\n Result := TGridPanelColumn(inherited Items[Index]);\r\nend;\r\n\r\nfunction TGridPanelColumns.Insert(Index: integer): TGridPanelColumn;\r\nbegin\r\n Result := TGridPanelColumn(inherited Insert(Index));\r\nend;\r\n\r\nprocedure TGridPanelColumns.SetItem(Index: integer;\r\n const Value: TGridPanelColumn);\r\nbegin\r\n inherited Items[Index] := Value;\r\nend;\r\n\r\nprocedure TGridPanelColumns.Update(Item: TCollectionItem);\r\nbegin\r\n inherited;\r\n if Assigned(OnChange) then\r\n OnChange(Self);\r\nend;\r\n\r\n{ TGridPanel }\r\n\r\nprocedure TGridPanel.AddControl(AControl: TWinControl);\r\nbegin\r\n FControlCollection.Add.Control := AControl;\r\n AControl.Parent := Self;\r\n\r\n if FControlCollection.Count > FColumnCollection.Count * FRowCollection.Count then\r\n begin\r\n if ExpandStyle = esAddRows then\r\n FRowCollection.Add\r\n else\r\n FColumnCollection.Add;\r\n end;\r\nend;\r\n\r\nprocedure TGridPanel.AlignControl(AControl: TControl);\r\nbegin\r\n if not (csDestroying in ComponentState) then\r\n UpdateTable;\r\n\r\n inherited;\r\nend;\r\n\r\nfunction TGridPanel.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('SPAN');\r\nend;\r\n\r\nprocedure TGridPanel.CreateInitialize;\r\nbegin\r\n inherited;\r\n\r\n FDesignTime := (csDesigning in ComponentState) and not\r\n ((csReading in Owner.ComponentState) or (csLoading in Owner.ComponentState));\r\n\r\n EnablePropagation := true;\r\n ControlStyle := ControlStyle + [csAcceptsControls];\r\n FUpdateTable := true;\r\n FColCount := -1;\r\n FRowCollection := TGridPanelRows.Create(Self);\r\n FRowCollection.PropName := 'RowCollection';\r\n\r\n if FDesignTime and not (csLoading in ComponentState) then\r\n begin\r\n FRowCollection.Add;\r\n FRowCollection[0].Value := 100;\r\n FRowCollection[0].SizeStyle := ssPercent;\r\n end;\r\n\r\n FColumnCollection := TGridPanelColumns.Create(Self);\r\n FColumnCollection.PropName := 'ColumnCollection';\r\n\r\n if FDesignTime and not (csLoading in ComponentState) then\r\n begin\r\n FColumnCollection.Add;\r\n FColumnCollection.Add;\r\n FColumnCollection[0].Value := 50;\r\n FColumnCollection[1].Value := 50;\r\n FColumnCollection[0].SizeStyle := ssPercent;\r\n FColumnCollection[1].SizeStyle := ssPercent;\r\n end;\r\n\r\n FRowCollection.OnChange := TableChanged;\r\n FColumnCollection.OnChange := TableChanged;\r\n\r\n FControlCollection := TControlCollection.Create(Self);\r\n if (csDesigning in ComponentState) then\r\n begin\r\n Width := 400;\r\n Height := 300;\r\n end;\r\nend;\r\n\r\nfunction TGridPanel.CreateRow(AIndex: integer): TJSElement;\r\nvar\r\n row, cell: TJSElement;\r\n i: integer;\r\n ps: string;\r\n\r\nbegin\r\n if (GridLineColor <> clNone) and (GridLineWidth > 0) then\r\n ps := IntToStr(GridLineWidth)+'px solid '+ ColorToHTML(GridLineColor)\r\n else\r\n begin\r\n if (csDesigning in ComponentState) then\r\n ps := '1px dotted gray'\r\n else\r\n ps := '0px';\r\n end;\r\n\r\n row := document.createElement('tr');\r\n if (ElementClassName = '') then\r\n TJSHTMLElement(row).style.setProperty('border', ps);\r\n\r\n if RowCollection.Items[AIndex].MarginTop <> 0 then\r\n TJSHTMLElement(row).style.setProperty('margin-top', IntToStr(RowCollection.Items[AIndex].MarginTop));\r\n\r\n if RowCollection.Items[AIndex].MarginBottom <> 0 then\r\n TJSHTMLElement(row).style.setProperty('margin-bottom', IntToStr(RowCollection.Items[AIndex].MarginBottom));\r\n\r\n if (RowCollection.Items[AIndex].ElementClassName <> '') then\r\n begin\r\n TJSHTMLElement(row).setAttribute('class', RowCollection.Items[AIndex].ElementClassName);\r\n end;\r\n\r\n case RowCollection.Items[AIndex].Alignment of\r\n vaCenter: TJSHTMLElement(row).setAttribute('valign','middle');\r\n vaBottom: TJSHTMLElement(row).setAttribute('valign','bottom');\r\n end;\r\n\r\n if (ElementClassName = '') then\r\n TJSHTMLElement(row).style.setProperty('border', ps);\r\n\r\n row.setAttribute('height', RowCollection.Items[AIndex].HeightAttribute);\r\n\r\n for i := 0 to ColumnCollection.Count - 1 do\r\n begin\r\n cell := document.createElement('td');\r\n if (ElementClassName = '') then\r\n TJSHTMLElement(cell).style.setProperty('border', ps);\r\n\r\n if ColumnCollection.Items[i].MarginLeft <> 0 then\r\n TJSHTMLElement(cell).style.setProperty('padding-left', IntToStr(ColumnCollection.Items[i].MarginLeft) +'px');\r\n\r\n if ColumnCollection.Items[i].MarginRight <> 0 then\r\n TJSHTMLElement(cell).style.setProperty('padding-right', IntToStr(ColumnCollection.Items[i].MarginRight)+'px' );\r\n\r\n if (ColumnCollection.Items[i].ElementClassName <> '') then\r\n begin\r\n TJSHTMLElement(cell).setAttribute('class', ColumnCollection.Items[i].ElementClassName);\r\n end;\r\n\r\n case ColumnCollection.Items[i].Alignment of\r\n taCenter: TJSHTMLElement(cell).setAttribute('align','center');\r\n taRightJustify: TJSHTMLElement(cell).setAttribute('align','right');\r\n end;\r\n\r\n cell.setAttribute('id', Name+'R'+IntToStr(AIndex)+'C'+IntToStr(i));\r\n\r\n if AIndex = 0 then\r\n begin\r\n TJSHTMLElement(cell).style.setProperty('width',ColumnCollection.Items[i].WidthAttribute);\r\n end;\r\n\r\n //cellText := document.createTextNode('cell is row '+IntToStr(j)+', column '+IntToStr(i));\r\n //cell.appendChild(cellText);\r\n row.appendChild(cell);\r\n end;\r\n\r\n Result := row;\r\nend;\r\n\r\n\r\nfunction TGridPanel.CreateTable: TJSElement;\r\nvar\r\n row: TJSElement;\r\n j: integer;\r\n ps: string;\r\nbegin\r\n FTbl := document.createElement('table');\r\n\r\n FTbl.setAttribute('width','100%');\r\n FTbl.setAttribute('height','100%');\r\n\r\n if ElementClassName <> '' then\r\n FTbl.setAttribute('class', ElementClassName)\r\n else\r\n begin\r\n if (GridLineColor <> clNone) and (GridLineWidth > 0) then\r\n ps := IntToStr(GridLineWidth)+'px solid '+ ColorToHTML(GridLineColor)\r\n else\r\n begin\r\n if (csDesigning in ComponentState) then\r\n ps := '1px dotted gray'\r\n else\r\n ps := '0px';\r\n end;\r\n\r\n TJSHTMLElement(FTbl).style.setProperty('border', ps);\r\n TJSHTMLElement(FTbl).style.setProperty('border-collapse','collapse');\r\n end;\r\n\r\n SetHTMLElementColor(TJSHTMLElement(FTbl), Color, not ((ElementClassName = '') and not IsLinked));\r\n\r\n FTblBody := document.createElement('tbody');\r\n\r\n // cells creation\r\n for j := 0 to RowCollection.Count - 1 do\r\n begin\r\n row := CreateRow(j);\r\n FTblBody.appendChild(row);\r\n end;\r\n\r\n // append the inside the \r\n FTbl.appendChild(FTblBody);\r\n Result := FTbl;\r\nend;\r\n\r\nprocedure TGridPanel.UpdateTable;\r\nvar\r\n i,j,k,mw,numrows: integer;\r\n fragment: TJSDocumentFragment;\r\n destid: string;\r\n control: TWinControl;\r\n el,row: TJSElement;\r\n isPercent: boolean;\r\n f: single;\r\n\r\nbegin\r\n if not Assigned(FTblBody) then\r\n Exit;\r\n\r\n if IsUpdating then\r\n Exit;\r\n\r\n if (csDestroying in ComponentState) then\r\n Exit;\r\n\r\n // row height distribution\r\n isPercent := true;\r\n mw := 0;\r\n\r\n for i := 0 to RowCollection.Count - 1 do\r\n begin\r\n begin\r\n if RowCollection.Items[i].SizeStyle <> ssPercent then\r\n begin\r\n isPercent := false;\r\n break;\r\n end\r\n else\r\n mw := mw + RowCollection.Items[i].Value;\r\n end;\r\n end;\r\n\r\n if isPercent and (mw > 100) then\r\n begin\r\n f := mw/100;\r\n for i := 0 to RowCollection.Count - 1 do\r\n begin\r\n RowCollection.Items[i].FValue := Trunc(RowCollection.Items[i].FValue / f);\r\n end;\r\n end;\r\n\r\n // column width distribution\r\n isPercent := true;\r\n mw := 0;\r\n\r\n for i := 0 to ColumnCollection.Count - 1 do\r\n begin\r\n begin\r\n if ColumnCollection.Items[i].SizeStyle <> ssPercent then\r\n begin\r\n isPercent := false;\r\n break;\r\n end\r\n else\r\n mw := mw + ColumnCollection.Items[i].Value;\r\n end;\r\n end;\r\n\r\n if isPercent and (mw > 100) then\r\n begin\r\n f := mw/100;\r\n for i := 0 to ColumnCollection.Count - 1 do\r\n begin\r\n ColumnCollection.Items[i].FValue := Trunc(ColumnCollection.Items[i].FValue / f);\r\n end;\r\n end;\r\n\r\n numrows := RowCollection.Count;\r\n\r\n // change column structure\r\n if (FColCount <> ColumnCollection.Count) then\r\n numrows := 0;\r\n\r\n // remove rows when rows decreased\r\n while FTblBody.childNodes.length > numrows do\r\n begin\r\n FTblBody.removeChild(FTblBody.childNodes[FTblBody.childNodes.length - 1]);\r\n end;\r\n\r\n // fill rows to match RowCollection.Count\r\n while FTblBody.childNodes.length < RowCollection.Count do\r\n begin\r\n row := CreateRow(FTblBody.childNodes.length);\r\n FTblBody.appendChild(row);\r\n end;\r\n\r\n for i := 0 to RowCollection.Count - 1 do\r\n begin\r\n row := TJSElement(FTblBody.childNodes[i]);\r\n row.setAttribute('height', RowCollection.Items[i].HeightAttribute);\r\n end;\r\n\r\n i := 0;\r\n j := 0;\r\n\r\n // assign controls in grid cells\r\n for k := 0 to ControlCollection.Count - 1 do\r\n begin\r\n if Assigned(ControlCollection.Items[k].Control) then\r\n begin\r\n fragment := document.createDocumentFragment();\r\n control := ControlCollection.Items[k].Control;\r\n ControlCollection.Items[k].Column := i;\r\n ControlCollection.Items[k].Row := j;\r\n\r\n control.ElementPosition := epRelative;\r\n control.ChildOrder := -1;\r\n\r\n if control.Align = alLeft then\r\n begin\r\n control.HeightStyle := ssPercent;\r\n control.HeightPercent := 100;\r\n if Assigned(control.ElementHandle) then\r\n TJSHTMLElement(control.ElementHandle).style.setProperty('float','left');\r\n end;\r\n\r\n if control.Align = alRight then\r\n begin\r\n control.HeightStyle := ssPercent;\r\n control.HeightPercent := 100;\r\n if Assigned(control.ElementHandle) then\r\n TJSHTMLElement(control.ElementHandle).style.setProperty('float','right');\r\n end;\r\n\r\n if (control.Align in [alTop, alBottom]) then\r\n begin\r\n control.WidthStyle := ssPercent;\r\n control.WidthPercent := 100;\r\n end;\r\n\r\n if control.Align = alClient then\r\n begin\r\n control.WidthStyle := ssPercent;\r\n control.HeightStyle := ssPercent;\r\n control.WidthPercent := 100;\r\n control.HeightPercent:= 100;\r\n end;\r\n\r\n row := TJSElement(FTblBody.childNodes[j]);\r\n if Assigned(row) then\r\n begin\r\n row.setAttribute('height', RowCollection.Items[j].HeightAttribute);\r\n if (RowCollection.Items[j].ElementClassName <> '') then\r\n row.setAttribute('class', RowCollection.Items[j].ElementClassName)\r\n else\r\n row.removeAttribute('class');\r\n end;\r\n\r\n if Assigned(control.ElementHandle) then\r\n fragment.appendChild(control.ElementHandle);\r\n\r\n destid := Name + 'R'+ inttostr(j) + 'C' + inttostr(i);\r\n\r\n el := document.getElementById(destid);\r\n\r\n if not Assigned(el) then\r\n begin\r\n row := CreateRow(j);\r\n FTblBody.appendChild(row);\r\n el := document.getElementById(destid);\r\n row.setAttribute('height', RowCollection.Items[j].HeightAttribute);\r\n end\r\n else\r\n begin\r\n if (j = 0) then\r\n begin\r\n if ColumnCollection.Items[i].SizeStyle = ssAbsolute then\r\n begin\r\n TJSHTMLElement(FTbl).removeAttribute('width');\r\n TJSHTMLElement(FTbl).removeAttribute('height');\r\n end\r\n else\r\n begin\r\n TJSHTMLElement(FTbl).setAttribute('width','100%');\r\n TJSHTMLElement(FTbl).setAttribute('height','100%');\r\n end;\r\n\r\n TJSHTMLElement(el).style.setProperty('width',ColumnCollection.Items[i].WidthAttribute);\r\n end;\r\n end;\r\n\r\n if Assigned(el) then\r\n begin\r\n el.appendChild(fragment);\r\n\r\n if control.Align = alTop then\r\n TJSHTMLElement(el).style.setProperty('vertical-align','top');\r\n\r\n if control.Align = alBottom then\r\n TJSHTMLElement(el).style.setProperty('vertical-align','bottom');\r\n end;\r\n\r\n inc(i);\r\n if i = ColumnCollection.Count then\r\n begin\r\n i := 0;\r\n inc(j);\r\n end;\r\n end;\r\n end;\r\n\r\n for i := 0 to ColumnCollection.Count - 1 do\r\n begin\r\n destid := Name + 'R0C' + inttostr(i);\r\n el := document.getElementById(destid);\r\n if Assigned(el) then\r\n TJSHTMLElement(el).style.setProperty('width',ColumnCollection.Items[i].WidthAttribute);\r\n end;\r\n\r\n FColCount := ColumnCollection.Count;\r\nend;\r\n\r\ndestructor TGridPanel.Destroy;\r\nbegin\r\n FRowCollection.Free;\r\n FColumnCollection.Free;\r\n FControlCollection.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TGridPanel.EndUpdate;\r\nbegin\r\n inherited;\r\n UpdateTable;\r\nend;\r\n\r\nprocedure TGridPanel.Notification(AComponent: TComponent;\r\n Operation: TOperation);\r\nvar\r\n i: integer;\r\n destid: string;\r\n el: TJSElement;\r\nbegin\r\n if (Operation = opRemove) and not (csDestroying in ComponentState) then\r\n begin\r\n for i := ControlCollection.Count - 1 downto 0 do\r\n begin\r\n if ControlCollection.Items[i].Control = AComponent then\r\n begin\r\n destid := Name + 'R'+ inttostr(ControlCollection.Items[i].Row) + 'C' + inttostr(ControlCollection.Items[i].Column);\r\n el := document.getElementById(destid);\r\n el.removeChild(el.firstChild);\r\n\r\n ControlCollection.Items[i].FControl := nil;\r\n ControlCollection.Delete(i);\r\n end;\r\n end;\r\n\r\n UpdateTable;\r\n end;\r\n\r\n inherited;\r\nend;\r\n\r\nprocedure TGridPanel.RegisterParent(AValue: TControl);\r\nbegin\r\n inherited;\r\n\r\n if not IsUpdating and not (csLoading in ComponentState) then\r\n begin\r\n// if Assigned(Owner) and (csLoading in Owner.ComponentState) then\r\n// Exit;\r\n\r\n if (csLoading in AValue.ComponentState) then\r\n Exit;\r\n\r\n ControlCollection.Add.Control := TWinControl(AValue);\r\n\r\n if ControlCollection.Count > ColumnCollection.Count * RowCollection.Count then\r\n begin\r\n if ExpandStyle = esAddRows then\r\n RowCollection.Add\r\n else\r\n ColumnCollection.Add;\r\n end;\r\n\r\n UpdateTable;\r\n end;\r\nend;\r\n\r\nprocedure TGridPanel.RemoveControl(AControl: TWinControl);\r\nvar\r\n i,r,c: integer;\r\n row: TJSElement;\r\n d: double;\r\n\r\nbegin\r\n for i := 0 to FControlCollection.Count - 1 do\r\n begin\r\n if FControlCollection.Items[i].Control = AControl then\r\n begin\r\n r := FControlCollection.Items[i].Row;\r\n c := FControlCollection.Items[i].Column;\r\n\r\n row := TJSElement(FTblBody.childNodes[r]);\r\n\r\n TJSHTMLElement(row.childNodes[c]).innerHTML := '';\r\n\r\n FControlCollection.Delete(i);\r\n break;\r\n end;\r\n end;\r\n\r\n if ColumnCollection.Count > 0 then\r\n begin\r\n d := ControlCollection.Count / ColumnCollection.Count;\r\n\r\n if Frac(d) > 0 then\r\n d := Trunc(d + 1);\r\n\r\n while d < RowCollection.Count do\r\n begin\r\n RowCollection.Delete(RowCollection.Count - 1);\r\n end;\r\n end;\r\n\r\nend;\r\n\r\nprocedure TGridPanel.SetColumnCollection(const Value: TGridPanelColumns);\r\nbegin\r\n FColumnCollection.Assign(Value);\r\nend;\r\n\r\nprocedure TGridPanel.SetControlCollection(const Value: TControlCollection);\r\nbegin\r\n FControlCollection.Assign(Value);\r\nend;\r\n\r\nprocedure TGridPanel.SetRowCollection(const Value: TGridPanelRows);\r\nbegin\r\n FRowCollection.Assign(Value);\r\nend;\r\n\r\nprocedure TGridPanel.TableChanged(Sender: TObject);\r\nbegin\r\n UpdateTable;\r\nend;\r\n\r\nprocedure TGridPanel.UpdateElement;\r\nbegin\r\n inherited;\r\n\r\n if Assigned(ElementHandle) and not IsUpdating then\r\n begin\r\n // do not block selection in child controls\r\n ElementHandle.style.setProperty('user-select', '');\r\n\r\n // allow default caret on text\r\n if Cursor = crDefault then\r\n ElementHandle.style.setProperty('cursor', '');\r\n\r\n if FUpdateTable and Assigned(Container) then\r\n begin\r\n TJSElement(Container).appendChild(CreateTable);\r\n UpdateTable;\r\n FUpdateTable := false;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TGridPanel.UpdateElementVisual;\r\nbegin\r\n inherited;\r\n\r\n if (csDesigning in ComponentState) then\r\n begin\r\n ElementHandle.style.setProperty('border', '1px dotted gray');\r\n end;\r\nend;\r\n\r\n{ TGridPanelColumn }\r\n\r\nprocedure TGridPanelColumn.Assign(Source: TPersistent);\r\nbegin\r\n if (Source is TGridPanelColumn) then\r\n begin\r\n FAlignment := (Source as TGridPanelColumn).Alignment;\r\n FSizeStyle := (Source as TGridPanelColumn).SizeStyle;\r\n FElementClassName := (Source as TGridPanelColumn).ElementClassName;\r\n FValue := (Source as TGridPanelColumn).Value;\r\n FMarginLeft := (Source as TGridPanelColumn).MarginLeft;\r\n FMarginRight := (Source as TGridPanelColumn).MarginRight;\r\n end;\r\nend;\r\n\r\nconstructor TGridPanelColumn.Create(ACollection: TCollection);\r\nbegin\r\n inherited;\r\n FSizeStyle := ssPercent;\r\n FValue := 0;\r\n FMarginLeft := 0;\r\n FMarginRight := 0;\r\n FAlignment := taLeftJustify;\r\nend;\r\n\r\nprocedure TGridPanelColumn.SetMarginLeft(const Value: integer);\r\nbegin\r\n if (FMarginLeft <> Value) then\r\n begin\r\n FMarginLeft := Value;\r\n TGridPanelColumns(Collection).Update(Self);\r\n end;\r\nend;\r\n\r\nprocedure TGridPanelColumn.SetMarginRight(const Value: integer);\r\nbegin\r\n if (FMarginRight <> Value) then\r\n begin\r\n FMarginRight := Value;\r\n TGridPanelColumns(Collection).Update(Self);\r\n end;\r\nend;\r\n\r\nprocedure TGridPanelColumn.SetSizeStyle(const Value: TSizeStyle);\r\nbegin\r\n if (FSizeStyle <> Value) then\r\n begin\r\n FSizeStyle := Value;\r\n TGridPanelColumns(Collection).Update(Self);\r\n end;\r\nend;\r\n\r\nprocedure TGridPanelColumn.SetValue(const Value: integer);\r\nbegin\r\n if (FValue <> Value) then\r\n begin\r\n FValue := Value;\r\n TGridPanelColumns(Collection).Update(Self);\r\n end;\r\nend;\r\n\r\nfunction TGridPanelColumn.WidthAttribute: string;\r\nbegin\r\n Result := '';\r\n case SizeStyle of\r\n ssPercent: Result := IntTostr(Value)+'%';\r\n ssAbsolute: Result := IntTostr(Value)+'px';\r\n end;\r\nend;\r\n\r\n{ TGridPanelRow }\r\n\r\nprocedure TGridPanelRow.Assign(Source: TPersistent);\r\nbegin\r\n if (Source is TGridPanelRow) then\r\n begin\r\n FAlignment := (Source as TGridPanelRow).Alignment;\r\n FSizeStyle := (Source as TGridPanelRow).SizeStyle;\r\n FElementClassName := (Source as TGridPanelRow).ElementClassName;\r\n FValue := (Source as TGridPanelRow).Value;\r\n FMarginTop := (Source as TGridPanelRow).MarginTop;\r\n FMarginBottom := (Source as TGridPanelRow).MarginBottom;\r\n end;\r\nend;\r\n\r\nconstructor TGridPanelRow.Create(ACollection: TCollection);\r\nbegin\r\n inherited;\r\n FSizeStyle := ssPercent;\r\n FAlignment := vaTop;\r\n FMarginTop := 0;\r\n FMarginBottom := 0;\r\nend;\r\n\r\nfunction TGridPanelRow.HeightAttribute: string;\r\nbegin\r\n Result := '';\r\n case SizeStyle of\r\n ssPercent: Result := IntTostr(Value)+'%';\r\n ssAbsolute: Result := IntTostr(Value)+'px';\r\n end;\r\nend;\r\n\r\nprocedure TGridPanelRow.SetMarginBottom(const Value: integer);\r\nbegin\r\n if (FMarginBottom <> Value) then\r\n begin\r\n FMarginBottom := Value;\r\n TGridPanelColumns(Collection).Update(Self);\r\n end;\r\nend;\r\n\r\nprocedure TGridPanelRow.SetMarginTop(const Value: integer);\r\nbegin\r\n if (FMarginTop <> Value) then\r\n begin\r\n FMarginTop := Value;\r\n TGridPanelColumns(Collection).Update(Self);\r\n end;\r\nend;\r\n\r\nprocedure TGridPanelRow.SetSizeStyle(const Value: TSizeStyle);\r\nbegin\r\n if (FSizeStyle <> Value) then\r\n begin\r\n FSizeStyle := Value;\r\n TGridPanelColumns(Collection).Update(Self);\r\n end;\r\nend;\r\n\r\nprocedure TGridPanelRow.SetValue(const Value: integer);\r\nbegin\r\n if (FValue <> Value) then\r\n begin\r\n FValue := Value;\r\n TGridPanelColumns(Collection).Update(Self);\r\n end;\r\nend;\r\n\r\n{ TControlCollectionItem }\r\n\r\nprocedure TControlCollectionItem.Assign(Source: TPersistent);\r\nbegin\r\n if (Source is TControlCollectionItem) then\r\n begin\r\n FColumn := (Source as TControlCollectionItem).Column;\r\n FRow := (Source as TControlCollectionItem).Row;\r\n FControl := (Source as TControlCollectionItem).Control;\r\n end;\r\nend;\r\n\r\n\r\n{ TControlCollection }\r\n\r\nfunction TControlCollection.Add: TControlCollectionItem;\r\nbegin\r\n Result := TControlCollectionItem(inherited Add);\r\nend;\r\n\r\nconstructor TControlCollection.Create(AOwner: TComponent);\r\nbegin\r\n inherited Create(AOwner, TControlCollectionItem);\r\nend;\r\n\r\nfunction TControlCollection.FindItem(AControl: TWinControl): boolean;\r\nvar\r\n i: integer;\r\nbegin\r\n Result := false;\r\n for i := 0 to Count - 1 do\r\n begin\r\n if Items[i].Control = AControl then\r\n begin\r\n Result := true;\r\n Exit;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TControlCollection.GetItem(Index: Integer): TControlCollectionItem;\r\nbegin\r\n Result := TControlCollectionItem(inherited Items[Index]);\r\nend;\r\n\r\nfunction TControlCollection.Insert(Index: Integer): TControlCollectionItem;\r\nbegin\r\n Result := TControlCollectionItem(inherited Insert(Index));\r\nend;\r\n\r\nprocedure TControlCollection.SetItem(Index: Integer;\r\n const Value: TControlCollectionItem);\r\nbegin\r\n inherited Items[Index] := Value;\r\nend;\r\n\r\n{ TWebMultimediaPlayer }\r\n\r\nfunction TMultimediaPlayer.CreateElement: TJSElement;\r\nvar\r\n src: TJSElement;\r\nbegin\r\n if MultimediaType = mtVideo then\r\n Result := document.createElement('VIDEO')\r\n else\r\n Result := document.createElement('AUDIO');\r\n\r\n src := document.createElement('SOURCE');\r\n Result.appendChild(src);\r\nend;\r\n\r\nprocedure TMultimediaPlayer.CreateInitialize;\r\nbegin\r\n inherited;\r\n FVolume := 100;\r\n FPlaybackRate := 1;\r\n FMuted := false;\r\n FAutoPlay := false;\r\n FContextMenu := true;\r\n if (csDesigning in ComponentState) then\r\n begin\r\n Width := 400;\r\n Height := 300;\r\n end;\r\nend;\r\n\r\nfunction TMultimediaPlayer.GetCurrentTime: double;\r\nvar\r\n el: TJSElement;\r\n i: double;\r\nbegin\r\n el := ElementHandle;\r\n if Assigned(el) then\r\n begin\r\n asm\r\n i = el.currentTime;\r\n end;\r\n end;\r\n\r\n Result := i;\r\nend;\r\n\r\nfunction TMultimediaPlayer.GetDuration: double;\r\nvar\r\n el: TJSElement;\r\n i: double;\r\nbegin\r\n el := ElementHandle;\r\n if Assigned(el) then\r\n begin\r\n asm\r\n i = el.duration;\r\n end;\r\n end;\r\n Result := i;\r\nend;\r\n\r\nfunction TMultimediaPlayer.GetEnded: boolean;\r\nvar\r\n el: TJSElement;\r\n e: boolean;\r\nbegin\r\n el := ElementHandle;\r\n if Assigned(el) then\r\n begin\r\n asm\r\n e = el.ended;\r\n end;\r\n end;\r\n\r\n Result := e;\r\nend;\r\n\r\nfunction TMultimediaPlayer.GetPaused: boolean;\r\nvar\r\n el: TJSElement;\r\n e: boolean;\r\nbegin\r\n el := ElementHandle;\r\n if Assigned(el) then\r\n begin\r\n asm\r\n e = el.paused;\r\n end;\r\n end;\r\n\r\n Result := e;\r\nend;\r\n\r\n\r\nprocedure TMultimediaPlayer.Pause;\r\nvar\r\n el: TJSElement;\r\nbegin\r\n el := ElementHandle;\r\n if Assigned(el) then\r\n begin\r\n asm\r\n el.pause();\r\n end;\r\n end;\r\n\r\nend;\r\n\r\nprocedure TMultimediaPlayer.Play;\r\nvar\r\n el: TJSElement;\r\nbegin\r\n el := ElementHandle;\r\n if Assigned(el) then\r\n asm\r\n el.play();\r\n end;\r\nend;\r\n\r\nprocedure TMultimediaPlayer.ReLoad;\r\nvar\r\n el: TJSElement;\r\nbegin\r\n el := ElementHandle;\r\n if Assigned(el) then\r\n asm\r\n el.load();\r\n end;\r\nend;\r\n\r\nprocedure TMultimediaPlayer.SetAutoPlay(const Value: boolean);\r\nbegin\r\n if (FAutoPlay <> Value) then\r\n begin\r\n FAutoPlay := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TMultimediaPlayer.SetContextMenu(const Value: boolean);\r\nbegin\r\n if (FContextMenu <> Value) then\r\n begin\r\n FContextMenu := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TMultimediaPlayer.SetControls(const Value: boolean);\r\nbegin\r\n if (FControls <> Value) then\r\n begin\r\n FControls := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TMultimediaPlayer.SetCurrentTime(const Value: double);\r\nvar\r\n el: TJSElement;\r\nbegin\r\n el := ElementHandle;\r\n if Assigned(el) then\r\n asm\r\n el.currentTime = Value;\r\n end;\r\nend;\r\n\r\n{$HINTS OFF}\r\n\r\nprocedure TMultimediaPlayer.SetLoop(const Value: boolean);\r\nvar\r\n el: TJSElement;\r\nbegin\r\n if (FLoop <> Value) then\r\n begin\r\n FLoop := Value;\r\n if Assigned(ElementHandle) then\r\n begin\r\n el := ElementHandle;\r\n asm\r\n el.loop = Value;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TMultimediaPlayer.SetMuted(const Value: boolean);\r\nvar\r\n el: TJSElement;\r\nbegin\r\n if (FMuted <> Value) then\r\n begin\r\n FMuted := Value;\r\n if Assigned(ElementHandle) then\r\n begin\r\n el := ElementHandle;\r\n asm\r\n el.muted = Value;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TMultimediaPlayer.SetPlaybackRate(const Value: double);\r\nbegin\r\n if (FPlaybackRate <> Value) then\r\n begin\r\n FPlaybackRate := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TMultimediaPlayer.SetURL(const Value: string);\r\nbegin\r\n if (FURL <> Value) then\r\n begin\r\n FURL := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TMultimediaPlayer.SetVolume(const Value: TMultiMediaVolume);\r\nvar\r\n el: TJSElement;\r\nbegin\r\n if (FVolume <> Value) and (Value >= 0) and (Value <= 100) then\r\n begin\r\n FVolume := Value;\r\n if Assigned(ElementHandle) then\r\n begin\r\n el := ElementHandle;\r\n asm\r\n el.volume = Value/100;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\n\r\nprocedure TMultimediaPlayer.UpdateElement;\r\nvar\r\n el: TJSNode;\r\n vid: TJSElement;\r\n\r\n function booltoattr(b: boolean): string;\r\n begin\r\n if b then\r\n result := 'true'\r\n else\r\n result := 'false';\r\n end;\r\n\r\nbegin\r\n inherited;\r\n\r\n if Assigned(ElementHandle) then\r\n begin\r\n vid := TJSElement(ElementHandle);\r\n asm\r\n vid.controls = this.FControls;\r\n vid.playbackRate = this.FPlaybackRate;\r\n vid.muted = this.FMuted;\r\n end;\r\n\r\n if FControls then\r\n ElementHandle.setAttribute('controls','')\r\n else\r\n ElementHandle.removeAttribute('controls');\r\n\r\n if FAutoPlay then\r\n ElementHandle.setAttribute('autoplay',booltoattr(FAutoplay))\r\n else\r\n ElementHandle.removeAttribute('autoplay');\r\n\r\n if FMuted then\r\n ElementHandle.setAttribute('muted',booltoattr(FMuted))\r\n else\r\n ElementHandle.removeAttribute('muted');\r\n\r\n if not FContextMenu then\r\n ElementHandle.setAttribute('oncontextmenu','return false;')\r\n else\r\n ElementHandle.removeAttribute('oncontextmenu');\r\n\r\n ElementHandle.setAttribute('volume',Format('%.2f',[FVolume/100]));\r\n ElementHandle.setAttribute('src',url);\r\n\r\n// el := ElementHandle.firstChild;\r\n// if Assigned(el) then\r\n// begin\r\n// (el as TJSElement).setAttribute('src',url);\r\n// (el as TJSElement).setAttribute('type','video/mp4');\r\n// end;\r\n end;\r\nend;\r\n\r\n{$HINTS ON}\r\n\r\n{ TCustomGroupBox }\r\n\r\nfunction TCustomGroupBox.CreateElement: TJSElement;\r\nbegin\r\n// Result := document.createElement('FIELDSET');\r\n// FFieldSet := TJSHTMLElement(Result);\r\n\r\n Result := document.createElement('DIV');\r\n\r\n FFieldSet := TJSHTMLElement(document.createElement('FIELDSET'));\r\n Result.appendChild(FFieldSet);\r\n\r\n FLegend := TJSHTMLElement(document.createElement('LEGEND'));\r\n FFieldSet.appendChild(FLegend);\r\n FLegend.innerHTML := Caption;\r\nend;\r\n\r\nprocedure TCustomGroupBox.CreateInitialize;\r\nbegin\r\n inherited;\r\n EnablePropagation := True;\r\n ControlStyle := ControlStyle + [csAcceptsControls];\r\n Color := clBtnFace;\r\n if (csDesigning in ComponentState) then\r\n begin\r\n Width := 400;\r\n Height := 300;\r\n end;\r\nend;\r\n\r\n\r\nprocedure TCustomGroupBox.SetBoundsInt(X, Y, AWidth, AHeight: Integer);\r\nbegin\r\n inherited;\r\n SetFieldSetSize;\r\nend;\r\n\r\nprocedure TCustomGroupBox.SetCaption(const Value: string);\r\nbegin\r\n if FCaption <> Value then\r\n begin\r\n FCaption := Value;\r\n UpdateElementData;\r\n end;\r\nend;\r\n\r\nprocedure TCustomGroupBox.SetFieldSetSize;\r\nbegin\r\n if Assigned(FFieldSet) then\r\n begin\r\n if WidthStyle = ssAbsolute then\r\n FFieldSet.style.setProperty('width',IntToStr(Width - 25)+'px')\r\n else\r\n FFieldSet.style.setProperty('width','90%');\r\n\r\n if HeightStyle = ssAbsolute then\r\n FFieldSet.style.setProperty('height',IntToStr(Height - 16)+'px')\r\n else\r\n FFieldSet.style.setProperty('height','90%');\r\n end;\r\nend;\r\n\r\nprocedure TCustomGroupBox.UpdateElementData;\r\nbegin\r\n inherited;\r\n if Assigned(FLegend) then\r\n begin\r\n FLegend.innerHTML := Caption;\r\n end;\r\nend;\r\n\r\nprocedure TCustomGroupBox.UpdateElementVisual;\r\nbegin\r\n inherited;\r\n\r\n if Assigned(ElementHandle) then\r\n begin\r\n ElementHandle.style.removeProperty('background-color');\r\n end;\r\n\r\n if Assigned(FFieldSet) then\r\n begin\r\n FFieldSet.style.setProperty('background-color',ColorToHTML(Color));\r\n FFieldSet.style.setProperty('overflow', 'visible');\r\n\r\n SetFieldSetSize;\r\n\r\n FFieldSet.style.setProperty('white-space', 'nowrap');\r\n\r\n if Visible then\r\n FFieldSet.style.setProperty('display', 'inline-block');\r\n\r\n FFieldSet.style.setProperty('webkit-user-select', 'none');\r\n FFieldSet.style.setProperty('moz-user-select', 'none');\r\n FFieldSet.style.setProperty('khtml-user-select', 'none');\r\n FFieldSet.style.setProperty('ms-user-select', 'none');\r\n FFieldSet.style.setProperty('user-select', 'none');\r\n FFieldSet.style.setProperty('border','1px solid '+ ColorToHTML(BorderColor));\r\n end;\r\nend;\r\n\r\n{ THTMLContainer }\r\n\r\nfunction THTMLContainer.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('DIV');\r\nend;\r\n\r\nprocedure THTMLContainer.CreateInitialize;\r\nbegin\r\n inherited;\r\n FHTML := TStringList.Create;\r\n FHTML.SkipLastLinebreak := true;\r\n FHTML.OnChange := HTMLChanged;\r\n FScrollStyle := ssBoth;\r\nend;\r\n\r\ndestructor THTMLContainer.Destroy;\r\nbegin\r\n FHTML.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure THTMLContainer.HTMLChanged(Sender: TObject);\r\nbegin\r\n UpdateElement;\r\nend;\r\n\r\nprocedure THTMLContainer.SetHTML(const Value: TStringList);\r\nbegin\r\n FHTML.Assign(Value);\r\nend;\r\n\r\nprocedure THTMLContainer.UpdateElement;\r\nvar\r\n TextFound: Boolean;\r\nbegin\r\n inherited;\r\n\r\n if not IsUpdating and Assigned(ElementHandle) and Assigned(Container) then\r\n begin\r\n if (ElementClassname <> '') then\r\n begin\r\n ElementHandle.style.removeProperty('border');\r\n ElementHandle.style.removeProperty('background-color');\r\n end\r\n else\r\n ElementHandle.style.setProperty('white-space','normal');\r\n\r\n if Assigned(FHTML) then\r\n begin\r\n TextFound := FHTML.Text <> '';\r\n Container.innerHTML := FHTML.Text;\r\n end;\r\n\r\n if not IsLinked and (csDesigning in ComponentState) then\r\n RenderDesigning(ClassName, Container, Self, (not TextFound));\r\n\r\n case ScrollStyle of\r\n ssBoth: ElementHandle.style.setProperty('overflow','auto');\r\n ssNone: ElementHandle.style.setProperty('overflow','');\r\n ssVertical: ElementHandle.style.setProperty('overflow-y','auto');\r\n ssHorizontal: ElementHandle.style.setProperty('overflow-x','auto');\r\n end;\r\n end;\r\nend;\r\n\r\n\r\n{ THMTMLForm }\r\n\r\n{$HINTS OFF}\r\nprocedure THTMLForm.BindEvents;\r\nbegin\r\n inherited;\r\n GetChildContainer.addEventListener('submit',@DoHandleSubmit);\r\nend;\r\n\r\nfunction THTMLForm.CheckValidity: boolean;\r\nvar\r\n el: TJSHTMLElement;\r\n res: boolean;\r\nbegin\r\n el := ElementHandle;\r\n asm\r\n res = el.checkValidity();\r\n end;\r\n Result := res;\r\nend;\r\n\r\nfunction THTMLForm.GetChildContainer: TJSElement;\r\nbegin\r\n if (csDesigning in ComponentState) then\r\n Result := ElementHandle\r\n else\r\n begin\r\n if IsLinked then\r\n Result := ElementHandle\r\n else\r\n Result := TJSElement(ElementHandle.firstChild);\r\n end;\r\nend;\r\n\r\n{$HINTS ON}\r\n\r\nfunction THTMLForm.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('DIV');\r\n Result.appendChild(document.createElement('FORM'));\r\nend;\r\n\r\nprocedure THTMLForm.CreateInitialize;\r\nbegin\r\n inherited;\r\n EnablePropagation := true;\r\n ControlStyle := ControlStyle + [csAcceptsControls];\r\n if (csDesigning in ComponentState) then\r\n begin\r\n Width := 400;\r\n Height := 300;\r\n end;\r\nend;\r\n\r\nfunction THTMLForm.DoHandleSubmit(Event: TJSEvent): boolean;\r\nbegin\r\n ElementEvent := Event;\r\n if Assigned(OnSubmit) then\r\n OnSubmit(Self);\r\n Result := true;\r\nend;\r\n\r\nprocedure THTMLForm.SetAction(const Value: string);\r\nvar\r\n el: TJSElement;\r\nbegin\r\n FAction := Value;\r\n\r\n if not (csDesigning in ComponentState) then\r\n begin\r\n if IsLinked then\r\n el := ElementHandle\r\n else\r\n el := GetChildContainer;\r\n\r\n if Assigned(el) then\r\n el['action'] := FAction;\r\n end;\r\nend;\r\n\r\nprocedure THTMLForm.UpdateElement;\r\nbegin\r\n if not Assigned(ElementHandle) then\r\n Exit;\r\n\r\n inherited;\r\n\r\n if (csDesigning in ComponentState) then\r\n TJSHTMLElement(ElementHandle).style.setProperty('background','repeating-linear-gradient(45deg,#EEEEEE 10px,#EEEEEE 10px, #ffffff 20px)');\r\nend;\r\n\r\n{ TBadge }\r\n\r\nfunction TBadge.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('SPAN');\r\nend;\r\n\r\nprocedure TBadge.CreateInitialize;\r\nvar\r\n css: string;\r\nbegin\r\n inherited;\r\n Color := clRed;\r\n FTextColor := clWhite;\r\n FText := '1';\r\n\r\n css := 'span.tmsbadge {' +\r\n ' background: #FF0000;' +\r\n ' border-radius: 0.8em;' +\r\n ' -moz-border-radius: 0.8em;' +\r\n ' -webkit-border-radius: 0.8em;' +\r\n ' color: #ffffff;' +\r\n ' display: inline-block;' +\r\n ' line-height: 1.6em;' +\r\n ' margin-right: 5px;' +\r\n ' text-align: center;' +\r\n ' width: 1.6em;' +\r\n '}';\r\n\r\n AddControlStyle(css);\r\n\r\n Width := 20;\r\n Height := 20;\r\nend;\r\n\r\ndestructor TBadge.Destroy;\r\nbegin\r\n\r\n inherited;\r\nend;\r\n\r\nprocedure TBadge.SetElementClassName(AValue: string);\r\nbegin\r\n inherited;\r\n UpdateElement;\r\nend;\r\n\r\nprocedure TBadge.SetText(const Value: string);\r\nbegin\r\n FText := Value;\r\n UpdateElement;\r\nend;\r\n\r\nprocedure TBadge.SetTextColor(const Value: TColor);\r\nbegin\r\n FTextColor := Value;\r\n UpdateElement;\r\nend;\r\n\r\nprocedure TBadge.UpdateElement;\r\nbegin\r\n inherited;\r\n\r\n if Assigned(ElementHandle) then\r\n begin\r\n ElementHandle.innerHTML := FText;\r\n\r\n if ElementClassName = '' then\r\n begin\r\n ElementHandle.setAttribute('class','tmsbadge');\r\n ElementHandle.style.setProperty('color',ColorToHTML(TextColor));\r\n end\r\n else\r\n begin\r\n ElementHandle.style.removeProperty('color');\r\n end;\r\n\r\n ElementHandle.style.removeProperty('width');\r\n ElementHandle.style.removeProperty('height');\r\n end;\r\nend;\r\n\r\n{ TAccordion }\r\n\r\nprocedure TAccordion.Collapse(ASection: TAccordionSection);\r\nvar\r\n el,pnl: TJSHTMLElement;\r\n LClass: string;\r\nbegin\r\n el := ASection.CaptionElement;\r\n\r\n LClass := 'accordionactive_'+Name;\r\n\r\n if el.classList.contains(LClass) then\r\n el.classList.remove(LClass);\r\n\r\n pnl := TJSHTMLElement(el.nextElementSibling);\r\n pnl.style.setProperty('max-height','0')\r\nend;\r\n\r\nfunction TAccordion.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('DIV');\r\nend;\r\n\r\nprocedure TAccordion.CreateInitialize;\r\nbegin\r\n inherited;\r\n\r\n FSections := TAccordionSections.Create(Self);\r\n FSections.OnChange := SectionsChanged;\r\n FSections.PropName := 'Sections';\r\n FStyleRendered := false;\r\n\r\n Width := 400;\r\n Height := 300;\r\n\r\nend;\r\n\r\ndestructor TAccordion.Destroy;\r\nbegin\r\n FSections.Free;\r\n inherited;\r\nend;\r\n\r\nfunction TAccordion.DoAccordionClick(Event: TJSEvent): Boolean;\r\nvar\r\n el: TJSElement;\r\n pnl: TJSHTMLElement;\r\n s: string;\r\n Allow: boolean;\r\n ASection: TAccordionSection;\r\n i,e: integer;\r\nbegin\r\n asm\r\n el = Event.srcElement;\r\n end;\r\n\r\n Allow := true;\r\n ASection := nil;\r\n\r\n if el.hasAttribute('id') then\r\n begin\r\n s := el['id'];\r\n s := Copy(s, pos(Name,s) + Length(Name) + 1, Length(s));\r\n val(s,i,e);\r\n\r\n if (e = 0) and (i < Sections.Count) then\r\n ASection := Sections[i];\r\n end;\r\n\r\n if el.classlist.contains('accordionactive_'+Name) then\r\n begin\r\n if Assigned(OnCollapsing) then\r\n OnCollapsing(Self, ASection, Allow);\r\n end\r\n else\r\n begin\r\n if Assigned(OnExpanding) then\r\n OnExpanding(Self, ASection, Allow);\r\n end;\r\n\r\n if not Allow then\r\n Exit;\r\n\r\n el.classList.toggle('accordionactive_'+Name);\r\n\r\n pnl := TJSHTMLElement(el.nextElementSibling);\r\n\r\n s := pnl.style.getPropertyValue('max-height');\r\n\r\n if (s <> '0px') and (s <> '') then\r\n begin\r\n pnl.style.setProperty('max-height','0')\r\n end\r\n else\r\n begin\r\n pnl.style.setProperty('max-height', IntToStr(pnl.scrollHeight) + 'px');\r\n end;\r\n\r\n if el.classlist.contains('accordionactive_'+Name) then\r\n begin\r\n ASection.FExpanded := true;\r\n if Assigned(OnExpanded) then\r\n OnExpanded(Self, ASection);\r\n end\r\n else\r\n begin\r\n ASection.FExpanded := false;\r\n if Assigned(OnCollapsed) then\r\n OnCollapsed(Self, ASection);\r\n end;\r\n\r\n Result := true;\r\nend;\r\n\r\nprocedure TAccordion.EndUpdate;\r\nbegin\r\n inherited;\r\n RenderStyle;\r\n RenderAccordion;\r\nend;\r\n\r\nprocedure TAccordion.Expand(ASection: TAccordionSection);\r\nvar\r\n el,pnl: TJSHTMLElement;\r\n LClass: string;\r\nbegin\r\n el := ASection.CaptionElement;\r\n\r\n LClass := 'accordionactive_'+Name;\r\n\r\n if not el.classList.contains(LClass) then\r\n el.classList.add(LClass);\r\n\r\n pnl := TJSHTMLElement(el.nextElementSibling);\r\n pnl.style.setProperty('max-height', IntToStr(pnl.scrollHeight) + 'px');\r\nend;\r\n\r\nprocedure TAccordion.RenderAccordion;\r\nvar\r\n i: integer;\r\n sp,btn,divel,p: TJSHTMLElement;\r\n LCaptionElementRec, LPanelElementRec: TJSHTMLElementRecord;\r\n\r\nbegin\r\n if ElementHandle.childNodes.length > 0 then\r\n begin\r\n while Assigned(ElementHandle.firstChild) do\r\n ElementHandle.removeChild(ElementHandle.firstChild);\r\n\r\n if ElementClassname <> '' then\r\n begin\r\n ElementHandle.style.removeProperty('border');\r\n ElementHandle.style.removeProperty('background-color');\r\n end;\r\n end;\r\n\r\n sp := TJSHTMLElement(document.createElement('SPAN'));\r\n ElementHandle.appendChild(sp);\r\n\r\n for i := 0 to FSections.Count - 1 do\r\n begin\r\n btn := TJSHTMLElement(document.createElement('BUTTON'));\r\n btn.innerHTML := FSections.Items[i].Caption;\r\n btn['id'] := Name + '_' + inttostr(i);\r\n btn.setAttribute('class','accordion_'+Name);\r\n if ElementSectionClassName <> '' then\r\n btn.classList.Add(ElementSectionClassName);\r\n\r\n btn.addEventListener('click',@DoAccordionClick);\r\n divel := TJSHTMLElement(document.createElement('DIV'));\r\n divel.setAttribute('class','accordionpanel_'+Name);\r\n p := TJSHTMLElement(document.createElement('P'));\r\n p.style.SetProperty('user-select','text');\r\n if ElementContentClassName <> '' then\r\n p.setAttribute('class',ElementContentClassName);\r\n\r\n p.innerHTML := FSections[i].Content;\r\n\r\n sp.appendChild(btn);\r\n sp.appendChild(divel);\r\n divel.appendChild(p);\r\n\r\n if Assigned(OnRenderSection) then\r\n begin\r\n LCaptionElementRec.element := btn;\r\n LPanelElementRec.element := p;\r\n OnRenderSection(Self, FSections.Items[i], LCaptionElementRec, LPanelElementRec);\r\n end;\r\n end;\r\n\r\n if not IsLinked and (csDesigning in ComponentState) then\r\n RenderDesigning(Classname, Container, Self, (FSections.Count = 0));\r\nend;\r\n\r\nprocedure TAccordion.RenderStyle;\r\nvar\r\n css: string;\r\nbegin\r\n if FStyleRendered then\r\n Exit;\r\n\r\n FStyleRendered := true;\r\n\r\n css :=\r\n '.accordion_'+ Name +' {'+\r\n 'background-color: #eee;'+\r\n 'color: #444;'+\r\n 'cursor: pointer;'+\r\n 'padding: 18px;'+\r\n 'width: 100%;'+\r\n 'text-align: left;'+\r\n 'border: none;' +\r\n 'outline: none;' +\r\n 'transition: 0.4s;'+\r\n '}' +#13#10 +\r\n\r\n '.accordionactive_'+Name+', .accordion_'+Name+'::hover {'+\r\n 'background-color: #ccc;'+\r\n '}' +#13#10 +\r\n\r\n '.accordionactive_'+Name+'::before {'+\r\n 'transform: rotate(90deg);'+\r\n '}' +#13#10 +\r\n\r\n '.accordion_'+Name+'::before {'+\r\n ' content: \"\\25B6\";'+\r\n ' font-size: 13px;'+\r\n// ' color: #777;'+\r\n ' display: inline-block;'+\r\n ' margin-right: 5px;'+\r\n '}' +#13#10 +\r\n\r\n '.accordionpanel_'+Name+' {'+\r\n 'padding: 0 18px;'+\r\n// 'background-color: white;'+\r\n 'max-height: 0;'+\r\n 'overflow: hidden;'+\r\n 'transition: max-height 0.2s ease-out;'+\r\n '}';\r\n\r\n AddInstanceStyle(css);\r\nend;\r\n\r\nprocedure TAccordion.SectionsChanged(Sender: TObject);\r\nbegin\r\n if not IsUpdating then\r\n begin\r\n RenderStyle;\r\n RenderAccordion;\r\n end;\r\nend;\r\n\r\nprocedure TAccordion.SetElementClassName(AValue: string);\r\nbegin\r\n inherited;\r\n if ElementClassname <> '' then\r\n RenderAccordion;\r\nend;\r\n\r\nprocedure TAccordion.SetSections(const Value: TAccordionSections);\r\nbegin\r\n FSections.Assign(Value);\r\nend;\r\n\r\nprocedure TAccordion.UpdateElement;\r\nbegin\r\n inherited;\r\nend;\r\n\r\nprocedure TAccordion.UpdateElementVisual;\r\nbegin\r\n inherited;\r\n ElementHandle.style.setProperty('overflow-y','auto');\r\n ElementHandle.style.setProperty('overflow-x','hidden');\r\nend;\r\n\r\n{ TAccordionSections }\r\n\r\nfunction TAccordionSections.Add: TAccordionSection;\r\nbegin\r\n Result := TAccordionSection(inherited Add);\r\nend;\r\n\r\nconstructor TAccordionSections.Create(AOwner: TComponent);\r\nbegin\r\n inherited Create(AOwner, TAccordionSection);\r\nend;\r\n\r\nfunction TAccordionSections.GetItem(Index: integer): TAccordionSection;\r\nbegin\r\n Result := TAccordionSection(inherited Items[Index]);\r\nend;\r\n\r\nfunction TAccordionSections.Insert(Index: integer): TAccordionSection;\r\nbegin\r\n Result := TAccordionSection(inherited Insert(Index));\r\nend;\r\n\r\nprocedure TAccordionSections.SetItem(Index: integer;\r\n const Value: TAccordionSection);\r\nbegin\r\n inherited Items[Index] := Value;\r\nend;\r\n\r\nprocedure TAccordionSections.Update(Item: TCollectionItem);\r\nbegin\r\n inherited;\r\n\r\n if Assigned(OnChange) and (UpdateCount = 0) then\r\n OnChange(Self);\r\nend;\r\n\r\n{ TResponsiveGridPanel }\r\n\r\nprocedure TResponsiveGridPanel.AddControl(AControl: TWinControl);\r\nbegin\r\n FControlCollection.Add.Control := AControl;\r\n AControl.Parent := Self;\r\nend;\r\n\r\nprocedure TResponsiveGridPanel.AlignControls(AControl: TControl;\r\n var Rect: TRect);\r\nbegin\r\n inherited;\r\n Resize;\r\nend;\r\n\r\nprocedure TResponsiveGridPanel.BindEvents;\r\nbegin\r\n inherited;\r\n FResizePtr := @HandleResize;\r\n document.defaultView.addEventListener('resize', FResizePtr);\r\nend;\r\n\r\nconstructor TResponsiveGridPanel.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n FResizePtr := nil;\r\nend;\r\n\r\nfunction TResponsiveGridPanel.CreateElement: TJSElement;\r\nbegin\r\n if (csDesigning in ComponentState) and (ControlCollection.Count = 0) then\r\n begin\r\n Result := document.createElement('DIV');\r\n FLabel := TJSHTMLElement(document.createElement('DIV'));\r\n FLabel.innerHTML := ClassName;\r\n BorderStyle := bsSingle;\r\n FLabel['align'] := 'center';\r\n FLabel.style.setProperty('border','1px solid silver');\r\n FLabel.style.setProperty('vertical-align','middle');\r\n FLabel.style.setProperty('display','table-cell');\r\n Result.appendChild(FLabel);\r\n end\r\n else\r\n begin\r\n Result := document.createElement('DIV');\r\n end;\r\nend;\r\n\r\nprocedure TResponsiveGridPanel.CreateInitialize;\r\nvar\r\n li: TResponsiveLayoutItem;\r\nbegin\r\n inherited;\r\n FDesignTime := (csDesigning in ComponentState) and not\r\n ((csReading in Owner.ComponentState) or (csLoading in Owner.ComponentState));\r\n\r\n EnablePropagation := true;\r\n ControlStyle := ControlStyle + [csAcceptsControls];\r\n FControlCollection := TControlCollection.Create(Self);\r\n FControlCollection.PropName := 'ControlCollection';\r\n if (csDesigning in ComponentState) then\r\n begin\r\n Width := 400;\r\n Height := 300;\r\n end;\r\n\r\n FLabel := nil;\r\n FActiveLayoutItem := nil;\r\n FLayout := TResponsiveLayout.Create(Self);\r\n FLayout.OnChange := LayoutChanged;\r\n FLayout.PropName := 'Layout';\r\n\r\n if FDesignTime then\r\n begin\r\n li := FLayout.Add;\r\n li.Description := 'Smartphone';\r\n li.Width := 575;\r\n li.Style := '1fr';\r\n\r\n li := FLayout.Add;\r\n li.Description := 'Tablet';\r\n li.Width := 768;\r\n li.Style := '1fr 1fr';\r\n\r\n li := FLayout.Add;\r\n li.Description := 'Desktop';\r\n li.Width := 991;\r\n li.Style := '1fr 1fr 1fr';\r\n\r\n li := FLayout.Add;\r\n li.Description := 'Large Desktop';\r\n li.Width := 1199;\r\n li.Style := '1fr 1fr 1fr 1fr';\r\n\r\n end;\r\nend;\r\n\r\ndestructor TResponsiveGridPanel.Destroy;\r\nbegin\r\n FControlCollection.Free;\r\n FLayout.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TResponsiveGridPanel.EndUpdate;\r\nbegin\r\n inherited;\r\n UpdateControls;\r\nend;\r\n\r\nprocedure TResponsiveGridPanel.GetChildren(Proc: TGetChildProc;\r\n Root: TComponent);\r\n//var\r\n// i: integer;\r\nbegin\r\n inherited;\r\n// for i := 0 to ControlCollection.Count - 1 do\r\n// begin\r\n// if Assigned(ControlCollection.Items[i].Control) then\r\n// Proc(ControlCollection.Items[i].Control);\r\n// end;\r\nend;\r\n\r\nfunction TResponsiveGridPanel.GridElementCount: integer;\r\nvar\r\n i: integer;\r\n el: TJSHTMLElement;\r\nbegin\r\n Result := 0;\r\n\r\n for i := 0 to ElementHandle.childElementCount - 1 do\r\n begin\r\n el := TJSHTMLElement(ElementHandle.children[i]);\r\n if (el['data'] = 'grid') then\r\n inc(Result);\r\n end;\r\nend;\r\n\r\nfunction TResponsiveGridPanel.HandleResize(Event: TEventListenerEvent): boolean;\r\nvar\r\n w: integer;\r\nbegin\r\n if (csDestroying in ComponentState) then\r\n Exit;\r\n\r\n Result := true;\r\n w := Width;\r\n if FOldWidth <> w then\r\n begin\r\n FOldWidth := w;\r\n Resize;\r\n end;\r\nend;\r\n\r\nprocedure TResponsiveGridPanel.LayoutChanged(Sender: TObject);\r\nbegin\r\n inherited;\r\n\r\n if IsUpdating or (csLoading in ComponentState) then\r\n Exit;\r\n\r\n UpdateControls;\r\nend;\r\n\r\nprocedure TResponsiveGridPanel.Loaded;\r\nbegin\r\n inherited;\r\n UpdateControls;\r\nend;\r\n\r\nprocedure TResponsiveGridPanel.Notification(AComponent: TComponent;\r\n Operation: TOperation);\r\nvar\r\n i: integer;\r\n upd: boolean;\r\n el: TJSHTMLElement;\r\n\r\nbegin\r\n upd := false;\r\n\r\n if (Operation = opRemove) and not (csDestroying in ComponentState) then\r\n begin\r\n for i := ControlCollection.Count - 1 downto 0 do\r\n begin\r\n if (ControlCollection.Items[i].Control = AComponent) then\r\n begin\r\n el := TJSHTMLElement(ElementHandle.children[i]);\r\n while el.childElementCount > 0 do\r\n el.removeChild(el.firstChild);\r\n\r\n ControlCollection.Items[i].Control := nil;\r\n ControlCollection.Delete(i);\r\n upd := true;\r\n end;\r\n end;\r\n end;\r\n\r\n inherited;\r\n\r\n if upd then\r\n UpdateControls;\r\nend;\r\n\r\nprocedure TResponsiveGridPanel.RegisterParent(AValue: TControl);\r\nbegin\r\n inherited;\r\n\r\n if not IsUpdating and not (csLoading in ComponentState) then\r\n begin\r\n ControlCollection.Add.Control := TWinControl(AValue);\r\n UpdateControls;\r\n end;\r\n\r\nend;\r\n\r\nprocedure TResponsiveGridPanel.RemoveControl(AControl: TWinControl);\r\nvar\r\n i: integer;\r\n\r\nbegin\r\n for i := 0 to FControlCollection.Count - 1 do\r\n begin\r\n if FControlCollection.Items[i].Control = AControl then\r\n begin\r\n FControlCollection.Delete(i);\r\n break;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TResponsiveGridPanel.Resize;\r\nbegin\r\n inherited;\r\n SetResponsiveStyle;\r\nend;\r\n\r\nprocedure TResponsiveGridPanel.SetControlCollection(\r\n const Value: TControlCollection);\r\nbegin\r\n FControlCollection.Assign(Value);\r\nend;\r\n\r\nprocedure TResponsiveGridPanel.SetResponsiveStyle;\r\nvar\r\n li: TResponsiveLayoutItem;\r\n w: integer;\r\n lGap: string;\r\nbegin\r\n if not Assigned(Layout) then\r\n Exit;\r\n\r\n if (csDestroying in ComponentState) then\r\n Exit;\r\n\r\n if not Assigned(ElementHandle) then\r\n Exit;\r\n\r\n w := Width;\r\n\r\n li := Layout.GetLayoutForWidth(w);\r\n\r\n if Assigned(li) then\r\n begin\r\n if li.StyleType = gTemplateColumns then\r\n begin\r\n ElementHandle.style.setProperty('grid-template-columns', li.Style);\r\n ElementHandle.style.removeProperty('grid-template-rows');\r\n end\r\n else\r\n begin\r\n ElementHandle.style.removeProperty('grid-template-columns');\r\n ElementHandle.style.setProperty('grid-template-rows', li.Style);\r\n end;\r\n\r\n lGap := li.RowGap;\r\n if lGap.IsNumber then\r\n lGap := lGap + 'px';\r\n\r\n ElementHandle.style.setProperty('grid-row-gap', lGap);\r\n\r\n lGap := li.ColumnGap;\r\n if lGap.IsNumber then\r\n lGap := lGap + 'px';\r\n\r\n ElementHandle.style.setProperty('grid-column-gap', lGap);\r\n\r\n ElementHandle.style.setProperty('padding-left', inttostr(li.Margins.Left)+'px');\r\n ElementHandle.style.setProperty('padding-top', inttostr(li.Margins.Top)+'px');\r\n ElementHandle.style.setProperty('padding-right', inttostr(li.Margins.Right)+'px');\r\n ElementHandle.style.setProperty('padding-bottom', inttostr(li.Margins.Bottom)+'px');\r\n end;\r\n\r\n if li <> FActiveLayoutItem then\r\n begin\r\n FActiveLayoutItem := li;\r\n if Assigned(OnLayoutChange) then\r\n OnLayoutChange(Self, FActiveLayoutItem);\r\n end;\r\nend;\r\n\r\nprocedure TResponsiveGridPanel.UnbindEvents;\r\nbegin\r\n inherited;\r\n if Assigned(FResizePtr) then\r\n begin\r\n document.defaultView.removeEventListener('resize', FResizePtr);\r\n FResizePtr := nil;\r\n end;\r\nend;\r\n\r\nprocedure TResponsiveGridPanel.UpdateControls;\r\nvar\r\n i,j,k: integer;\r\n el,sp: TJSHTMLElement;\r\n fragment: TJSDocumentFragment;\r\n control: TControl;\r\nbegin\r\n if (csLoading in ComponentState) then\r\n Exit;\r\n\r\n if IsUpdating then\r\n Exit;\r\n\r\n if not Assigned(ElementHandle) then\r\n Exit;\r\n\r\n if (ControlCollection.Count > 0) and Assigned(FLabel) then\r\n begin\r\n ElementHandle.removeChild(FLabel);\r\n FLabel := nil;\r\n ElementHandle.style.setProperty('display','grid');\r\n end;\r\n\r\n if (csDesigning in ComponentState) then\r\n begin\r\n for i := ElementHandle.childElementCount - 1 downto 0 do\r\n begin\r\n if TJSElement(ElementHandle.children[i]).tagName = 'SPAN' then\r\n ElementHandle.removeChild(ElementHandle.children[i]);\r\n end;\r\n\r\n for i := 0 to Layout.Count - 1 do\r\n begin\r\n sp := TJSHTMLElement(document.createElement('SPAN'));\r\n sp.style.setProperty('position','absolute');\r\n sp.style.setProperty('width','4px');\r\n sp.style.setProperty('height','12px');\r\n sp.style.setProperty('background-color','red');\r\n sp.style.setProperty('top','0px');\r\n sp.style.setProperty('left', IntToStr(Layout.Items[i].Width)+'px');\r\n ElementHandle.appendChild(sp);\r\n end;\r\n end;\r\n\r\n for i := 0 to ControlCollection.Count - 1 do\r\n begin\r\n if GridElementCount <= i then\r\n begin\r\n el := TJSHTMLElement(document.createElement('DIV'));\r\n el['data'] := 'grid';\r\n\r\n if (csDesigning in ComponentState) then\r\n el.style.setProperty('border','1px silver dotted');\r\n\r\n ElementHandle.appendChild(el);\r\n end\r\n else\r\n begin\r\n k := 0;\r\n for j := 0 to ElementHandle.ChildElementCount - 1 do\r\n begin\r\n el := TJSHTMLElement(ElementHandle.children[j]);\r\n if (el['data'] = 'grid') then\r\n begin\r\n if (k = i) then\r\n break\r\n else\r\n inc(k);\r\n end;\r\n end;\r\n end;\r\n\r\n fragment := document.createDocumentFragment();\r\n control := ControlCollection.Items[i].Control;\r\n if Assigned(control) then\r\n begin\r\n control.ElementPosition := epRelative;\r\n control.ChildOrder := -1;\r\n if Assigned(control.ElementHandle) then\r\n begin\r\n fragment.appendChild(control.ElementHandle);\r\n el.appendChild(fragment);\r\n end;\r\n end;\r\n end;\r\n\r\n UpdateElement;\r\nend;\r\n\r\nprocedure TResponsiveGridPanel.UpdateElement;\r\nbegin\r\n inherited;\r\n\r\n if (csDestroying in ComponentState) then\r\n Exit;\r\n\r\n if not Assigned(ElementHandle) then\r\n Exit;\r\n\r\n if (csDesigning in ComponentState) then\r\n begin\r\n if (ControlCollection.Count = 0) then\r\n begin\r\n TJSHTMLElement(ElementHandle).style.setProperty('display','table');\r\n if (Color = clNone) then\r\n TJSHTMLElement(ElementHandle).style.setProperty('background-color','silver');\r\n end;\r\n end;\r\n\r\n if (csDesigning in ComponentState) then\r\n begin\r\n ElementHandle.style.setProperty('border','1px silver dotted');\r\n end;\r\n\r\n ElementHandle.style.setProperty('display','grid');\r\n SetResponsiveStyle;\r\nend;\r\n\r\n{ TLayout }\r\n\r\nfunction TResponsiveLayout.Add: TResponsiveLayoutItem;\r\nbegin\r\n Result := TResponsiveLayoutItem(inherited Add);\r\nend;\r\n\r\nfunction TResponsiveLayout.Add(AWidth: integer;\r\n AStyle: string): TResponsiveLayoutItem;\r\nbegin\r\n Result := Add;\r\n Result.Width := AWidth;\r\n Result.Style := AStyle;\r\nend;\r\n\r\nconstructor TResponsiveLayout.Create(AOwner: TComponent);\r\nbegin\r\n inherited Create(AOwner, TResponsiveLayoutItem);\r\nend;\r\n\r\nfunction TResponsiveLayout.GetItem(Index: integer): TResponsiveLayoutItem;\r\nbegin\r\n Result := TResponsiveLayoutItem(inherited Items[Index]);\r\nend;\r\n\r\nfunction TResponsiveLayout.GetLayoutForWidth(w: integer): TResponsiveLayoutItem;\r\nvar\r\n i,d,j,l,mx: integer;\r\n\r\nbegin\r\n Result := nil;\r\n if Count = 0 then\r\n Exit;\r\n\r\n d := $FFFF;\r\n j := -1;\r\n mx := 0;\r\n\r\n for i := 0 to Count - 1 do\r\n begin\r\n if Items[i].Width > mx then\r\n begin\r\n mx := Items[i].Width;\r\n l := i;\r\n end;\r\n\r\n if w < Items[i].Width then\r\n begin\r\n if Items[i].Width - w < d then\r\n begin\r\n d := Items[i].Width - w;\r\n j := i;\r\n end;\r\n end;\r\n end;\r\n\r\n if j = -1 then\r\n j := l;\r\n\r\n Result := Items[j];\r\nend;\r\n\r\nfunction TResponsiveLayout.Insert(Index: integer): TResponsiveLayoutItem;\r\nbegin\r\n Result := TResponsiveLayoutItem(inherited Insert(Index));\r\nend;\r\n\r\nprocedure TResponsiveLayout.SetItem(Index: integer; const Value: TResponsiveLayoutItem);\r\nbegin\r\n inherited Items[Index] := Value;\r\nend;\r\n\r\nprocedure TResponsiveLayout.Update(Item: TCollectionItem);\r\nbegin\r\n inherited;\r\n if Assigned(OnChange) then\r\n OnChange(Self);\r\nend;\r\n\r\n{ TResponsiveLayoutItem }\r\n\r\nprocedure TResponsiveLayoutItem.Assign(Source: TPersistent);\r\nbegin\r\n if (Source is TResponsiveLayoutItem) then\r\n begin\r\n FColumnGap := (Source as TResponsiveLayoutItem).ColumnGap;\r\n FDescription := (Source as TResponsiveLayoutItem).Description;\r\n FRowGap := (Source as TResponsiveLayoutItem).RowGap;\r\n FWidth := (Source as TResponsiveLayoutItem).Width;\r\n FStyle := (Source as TResponsiveLayoutItem).Style;\r\n FStyleType := (Source as TResponsiveLayoutItem).StyleType;\r\n FTag := (Source as TResponsiveLayoutItem).Tag;\r\n FMargins.Assign((Source as TResponsiveLayoutItem).Margins);\r\n end;\r\nend;\r\n\r\nconstructor TResponsiveLayoutItem.Create(AOwner: TCollection);\r\nbegin\r\n FMargins := TMargins.Create;\r\n FMargins.Left := 0;\r\n FMargins.Top := 0;\r\n FMargins.Right := 0;\r\n FMargins.Bottom := 0;\r\n\r\n inherited;\r\n\r\nend;\r\n\r\ndestructor TResponsiveLayoutItem.Destroy;\r\nbegin\r\n FMargins.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TResponsiveLayoutItem.SetColumnGap(const Value: string);\r\nbegin\r\n if (FColumnGap <> Value) then\r\n begin\r\n FColumnGap := Value;\r\n TResponsiveLayout(Collection).Update(Self);\r\n end;\r\nend;\r\n\r\nprocedure TResponsiveLayoutItem.SetMargins(const Value: TMargins);\r\nbegin\r\n FMargins.Assign(Value);\r\n TResponsiveLayout(Collection).Update(Self);\r\nend;\r\n\r\nprocedure TResponsiveLayoutItem.SetRowGap(const Value: string);\r\nbegin\r\n if (FRowGap <> Value) then\r\n begin\r\n FRowGap := Value;\r\n TResponsiveLayout(Collection).Update(Self);\r\n end;\r\nend;\r\n\r\nprocedure TResponsiveLayoutItem.SetStyle(const Value: string);\r\nbegin\r\n if (FStyle <> Value) then\r\n begin\r\n FStyle := Value;\r\n TResponsiveLayout(Collection).Update(Self);\r\n end;\r\nend;\r\n\r\nprocedure TResponsiveLayoutItem.SetStyleType(const Value: TGridStyle);\r\nbegin\r\n if (FStyleType <> Value) then\r\n begin\r\n FStyleType := Value;\r\n TResponsiveLayout(Collection).Update(Self);\r\n end;\r\nend;\r\n\r\nprocedure TResponsiveLayoutItem.SetWidth(const Value: integer);\r\nbegin\r\n if (FWidth <> Value) then\r\n begin\r\n FWidth := Value;\r\n TResponsiveLayout(Collection).Update(Self);\r\n end;\r\nend;\r\n\r\n{ TAccordionSection }\r\n\r\nprocedure TAccordionSection.Assign(Source: TPersistent);\r\nbegin\r\n if (Source is TAccordionSection) then\r\n begin\r\n FCaption := (Source as TAccordionSection).Caption;\r\n FContent := (Source as TAccordionSection).Content;\r\n FTag := (Source as TAccordionSection).Tag;\r\n end;\r\nend;\r\n\r\nfunction TAccordionSection.CaptionElement: TJSHTMLElement;\r\nbegin\r\n Result := TJSHTMLElement(document.getElementById(((Collection as TAccordionSections).Owner as TAccordion).Name+'_'+inttostr(Index)));\r\nend;\r\n\r\nfunction TAccordionSection.PanelElement: TJSHTMLElement;\r\nvar\r\n el: TJSHTMLElement;\r\nbegin\r\n el := CaptionElement;\r\n Result := TJSHTMLElement(el.nextElementSibling);\r\nend;\r\n\r\nprocedure TAccordionSection.SetCaption(const Value: string);\r\nbegin\r\n FCaption := Value;\r\n (Collection as TAccordionSections).Update(Self);\r\nend;\r\n\r\nprocedure TAccordionSection.SetContent(const Value: string);\r\nbegin\r\n FContent := Value;\r\n (Collection as TAccordionSections).Update(Self);\r\nend;\r\n\r\nprocedure TAccordionSection.SetExpanded(const Value: boolean);\r\nbegin\r\n if (FExpanded <> Value) then\r\n begin\r\n FExpanded := Value;\r\n\r\n if FExpanded then\r\n ((Collection as TAccordionSections).Owner as TAccordion).Expand(Self)\r\n else\r\n ((Collection as TAccordionSections).Owner as TAccordion).Collapse(Self);\r\n end;\r\nend;\r\n\r\n{ TImageZoomControl }\r\n\r\nfunction TImageZoomControl.CreateElement: TJSElement;\r\nbegin\r\n Result := inherited;\r\n\r\n FStyle := document.createElement('STYLE');\r\n FOverlay := document.createElement('DIV');\r\n document.body.appendChild(FStyle);\r\n document.body.appendChild(FOverlay);\r\nend;\r\n\r\nprocedure TImageZoomControl.CreateInitialize;\r\nbegin\r\n inherited;\r\n FAppearance := TImageZoomAppearance.Create(Self);\r\n FPictureZoom := TURLPicture.Create;\r\n FPictureZoom.OnChange := PictureZoomChanged;\r\n FPictureZoom.OnDataChange := PictureZoomDataChanged;\r\n FPictureZoomDataURL := '';\r\n\r\n if (csDesigning in ComponentState) then\r\n begin\r\n Width := 100;\r\n Height := 75;\r\n end;\r\nend;\r\n\r\ndestructor TImageZoomControl.Destroy;\r\nbegin\r\n FAppearance.Free;\r\n FPictureZoom.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TImageZoomControl.PictureZoomChanged(Sender: TObject);\r\nbegin\r\n SetURLZoom(PictureZoom.FileName);\r\n FPictureZoomDataURL := '';\r\n UpdateElement;\r\nend;\r\n\r\nprocedure TImageZoomControl.PictureZoomDataChanged(Sender: TObject);\r\nbegin\r\n FPictureZoomDataURL := 'data:image/png;base64,' + HexImageDecodeAsBase64(PictureZoom.Data);\r\n UpdateElement;\r\nend;\r\n\r\nprocedure TImageZoomControl.SetPictureZoom(const Value: TURLPicture);\r\nbegin\r\n FPictureZoom.Assign(Value);\r\nend;\r\n\r\nprocedure TImageZoomControl.SetURLZoom(const Value: string);\r\nbegin\r\n if FURLZoom <> Value then\r\n begin\r\n FURLZoom := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TImageZoomControl.UpdateElement;\r\nvar\r\n PopupImage: string;\r\n Popup: TJSElement;\r\nbegin\r\n inherited;\r\n\r\n if not Assigned(ElementHandle) then\r\n Exit;\r\n\r\n if Assigned(FOverlay) then\r\n begin\r\n ElementHandle.setAttribute('onClick', 'document.getElementById(\"' + Name + 'myModal\").style.display = \"block\"');\r\n\r\n if FPictureZoomDataURL <> '' then\r\n PopupImage := FPictureZoomDataURL\r\n else\r\n PopupImage := URLZoom;\r\n\r\n if PopupImage = '' then\r\n PopupImage := URL;\r\n\r\n FStyle.innerHTML := '.' + Name + 'modal-overlay {'#13\r\n + ' display: none;'#13\r\n + ' position: fixed;'#13\r\n + ' z-index: 99999999;'#13\r\n + ' width: 100%;'#13\r\n + ' height: 100%;'#13\r\n + ' overflow: hidden;'#13\r\n + ' top: 50%;'#13\r\n + ' left: 50%;'#13\r\n + ' -ms-transform: translate(-50%, -50%);'#13\r\n + ' transform: translate(-50%, -50%);'#13\r\n + ' background-color: rgba(0,0,0,0.2);'#13\r\n + '}'#13\r\n\r\n + '.' + Name + 'modal {'#13\r\n + ' display: block;'#13\r\n + ' position: absolute;'#13\r\n + ' z-index: 99999999;'#13\r\n + ' width: ' + IntToStr(Appearance.WidthPercent) + '%;'#13\r\n + ' height: ' + IntToStr(Appearance.HeightPercent) + '%;'#13\r\n + ' overflow: hidden;'#13\r\n + ' top: 50%;'#13\r\n + ' left: 50%;'#13\r\n + ' -ms-transform: translate(-50%, -50%);'#13\r\n + ' transform: translate(-50%, -50%);'#13\r\n + ' background-color: rgba(0,0,0,0.9);'#13\r\n + '}'#13\r\n\r\n + '.' + Name + 'modal-content {'#13\r\n + ' display: block;'#13\r\n + ' margin: 0;'#13\r\n + ' position: absolute;'#13\r\n + ' top: 50%;'#13\r\n + ' left: 50%;'#13\r\n + ' -ms-transform: translate(-50%, -50%);'#13\r\n + ' transform: translate(-50%, -50%);'#13\r\n + ' max-width: 100%;'#13\r\n + ' max-height: 100%;'#13\r\n + '}'#13\r\n\r\n + '.' + Name + 'close {'#13\r\n + ' z-index: 99999999;'#13\r\n + ' position: absolute;'#13\r\n + ' top: 15px;'#13\r\n + ' right: 35px;'#13\r\n + ' color: #f1f1f1;'#13\r\n + ' font-size: 40px;'#13\r\n + ' font-weight: bold;'#13\r\n + ' transition: 0.3s;'#13\r\n + '}'#13\r\n\r\n + '.' + Name + 'close:hover,'#13\r\n + '.' + Name + 'close:focus {'#13\r\n + ' color: #bbb;'#13\r\n + ' text-decoration: none;'#13\r\n + ' cursor: pointer;'#13\r\n + '}'#13\r\n\r\n + '@media only screen and (max-width: 769px) {'#13\r\n + '\t.' + Name + 'modal {'#13\r\n + ' width: ' + IntToStr(Appearance.ResponsiveWidthPercent) + '%;'#13\r\n + ' height: ' + IntToStr(Appearance.ResponsiveHeightPercent) + '%;'#13\r\n + '\t}'#13\r\n + '}'#13;\r\n\r\n FOverlay.setAttribute('onClick', 'this.style.display = \"none\";');\r\n FOverlay.setAttribute('id', Name + 'myModal');\r\n FOverlay.setAttribute('class', Name + 'modal-overlay');\r\n\r\n while Assigned(FOverlay.firstChild) do\r\n FOverlay.removeChild(FOverlay.firstChild);\r\n\r\n Popup := document.createElement('DIV');\r\n Popup.setAttribute('class', Name + 'modal');\r\n Popup.innerHTML := '×'\r\n + '';\r\n\r\n FOverlay.innerHTML := '';\r\n FOverlay.AppendChild(Popup);\r\n end;\r\nend;\r\n\r\n{ TImageZoomAppearance }\r\n\r\nprocedure TImageZoomAppearance.Assign(Source: TPersistent);\r\nbegin\r\n inherited;\r\n if (Source is TImageZoomAppearance) then\r\n begin\r\n FHeightPercent := (Source as TImageZoomAppearance).HeightPercent;\r\n FWidthPercent := (Source as TImageZoomAppearance).WidthPercent;\r\n FResponsiveHeightPercent := (Source as TImageZoomAppearance).ResponsiveHeightPercent;\r\n FResponsiveWidthPercent := (Source as TImageZoomAppearance).ResponsiveWidthPercent;\r\n FResponsiveMaxWidth := (Source as TImageZoomAppearance).ResponsiveMaxWidth;\r\n end;\r\nend;\r\n\r\nconstructor TImageZoomAppearance.Create(AOwner: TImageZoomControl);\r\nbegin\r\n FHeightPercent := 100;\r\n FWidthPercent := 100;\r\n FResponsiveHeightPercent := 100;\r\n FResponsiveWidthPercent := 100;\r\n FResponsiveMaxWidth := 768;\r\n FOwner := AOwner;\r\nend;\r\n\r\ndestructor TImageZoomAppearance.Destroy;\r\nbegin\r\n inherited;\r\nend;\r\n\r\nfunction TImageZoomAppearance.GetOwner: TPersistent;\r\nbegin\r\n Result := FOwner;\r\nend;\r\n\r\nprocedure TImageZoomAppearance.SetHeightPercent(const Value: Integer);\r\nbegin\r\n if (FHeightPercent <> Value) and (FHeightPercent <= 100) then\r\n begin\r\n FHeightPercent := Value;\r\n FOwner.UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TImageZoomAppearance.SetResponsiveHeightPercent(const Value: Integer);\r\nbegin\r\n if (FResponsiveHeightPercent <> Value) and (FResponsiveHeightPercent <= 100) then\r\n begin\r\n FResponsiveHeightPercent := Value;\r\n FOwner.UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TImageZoomAppearance.SetResponsiveMaxWidth(const Value: Integer);\r\nbegin\r\n if (FResponsiveMaxWidth <> Value) and (FResponsiveMaxWidth >= 0) then\r\n begin\r\n FResponsiveMaxWidth := Value;\r\n FOwner.UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TImageZoomAppearance.SetResponsiveWidthPercent(const Value: Integer);\r\nbegin\r\n if (FResponsiveWidthPercent <> Value) and (FResponsiveWidthPercent <= 100) then\r\n begin\r\n FResponsiveWidthPercent := Value;\r\n FOwner.UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TImageZoomAppearance.SetWidthPercent(const Value: Integer);\r\nbegin\r\n if (FWidthPercent <> Value) and (FWidthPercent <= 100) then\r\n begin\r\n FWidthPercent := Value;\r\n FOwner.UpdateElement;\r\n end;\r\nend;\r\n\r\n{ TCustomLookupComboBox }\r\n\r\nprocedure TCustomLookupComboBox.CreateInitialize;\r\nbegin\r\n inherited;\r\n FLookupValues := TLookupValues.Create(Self);\r\n FLookupValues.PropName := 'LookupValues';\r\n FLookupValues.OnChange := ValuesChanged;\r\nend;\r\n\r\ndestructor TCustomLookupComboBox.Destroy;\r\nbegin\r\n FLookupValues.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TCustomLookupComboBox.DoUpdateList;\r\nvar\r\n i: integer;\r\n opt: TJSElement;\r\nbegin\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n for i := TJSHTMLSelectElement(Container).options.length - 1 downto 0 do\r\n TJSHTMLSelectElement(Container).remove(i);\r\n\r\n AddTextHint;\r\n\r\n for i := 0 to FLookupValues.Count - 1 do\r\n begin\r\n opt := document.createElement('OPTION');\r\n opt['value'] := TLookupValueItem(FLookupValues.Items[i]).Value;\r\n opt.innerHTML := TLookupValueItem(FLookupValues.Items[i]).DisplayText;\r\n Container.appendChild(opt);\r\n end;\r\n\r\n UpdateElement;\r\nend;\r\n\r\nfunction TCustomLookupComboBox.GetDisplayText: string;\r\nbegin\r\n Result := '';\r\n if ItemIndex >= 0 then\r\n Result := FLookupValues[ItemIndex].DisplayText;\r\nend;\r\n\r\nfunction TCustomLookupComboBox.GetValue: string;\r\nbegin\r\n Result := '';\r\n if ItemIndex >= 0 then\r\n Result := FLookupValues[ItemIndex].Value;\r\nend;\r\n\r\nprocedure TCustomLookupComboBox.SetDisplayText(const Value: string);\r\nvar\r\n i,idx: integer;\r\nbegin\r\n idx := -1;\r\n for i := 0 to FLookupValues.Count - 1 do\r\n begin\r\n if FLookupValues[i].DisplayText = Value then\r\n begin\r\n idx := i;\r\n break;\r\n end;\r\n end;\r\n\r\n ItemIndex := idx;\r\nend;\r\n\r\nprocedure TCustomLookupComboBox.SetLookupValues(const Value: TLookupValues);\r\nbegin\r\n FLookupValues.Assign(Value);\r\nend;\r\n\r\nprocedure TCustomLookupComboBox.SetValue(const Value: string);\r\nvar\r\n i,idx: integer;\r\nbegin\r\n idx := -1;\r\n\r\n for i := 0 to FLookupValues.Count - 1 do\r\n begin\r\n if FLookupValues[i].Value = Value then\r\n begin\r\n idx := i;\r\n break;\r\n end;\r\n end;\r\n\r\n ItemIndex := idx;\r\nend;\r\n\r\nprocedure TCustomLookupComboBox.ValuesChanged(Sender: TObject);\r\nbegin\r\n DoUpdateList;\r\nend;\r\n\r\n{ TLookupValues }\r\n\r\nfunction TLookupValues.Add: TLookupValueItem;\r\nbegin\r\n Result := TLookupValueItem(inherited Add);\r\nend;\r\n\r\nprocedure TLookupValues.AddPair(AValue, ADisplayText: string);\r\nvar\r\n lv: TLookupValueItem;\r\nbegin\r\n lv := TLookupValueItem(inherited Add);\r\n lv.Value := AValue;\r\n lv.DisplayText := ADisplayText;\r\n if (UpdateCount = 0) then\r\n DoChange;\r\nend;\r\n\r\nconstructor TLookupValues.Create(AOwner: TComponent);\r\nbegin\r\n inherited Create(AOwner, TLookupValueItem);\r\nend;\r\n\r\nprocedure TLookupValues.DoChange;\r\nbegin\r\n if Assigned(OnChange) then\r\n OnChange(Self);\r\nend;\r\n\r\nfunction TLookupValues.GetItem(Index: integer): TLookupValueItem;\r\nbegin\r\n Result := TLookupValueItem(inherited Items[Index]);\r\nend;\r\n\r\nfunction TLookupValues.Insert(Index: integer): TLookupValueItem;\r\nbegin\r\n Result := TLookupValueItem(inherited Insert(Index));\r\nend;\r\n\r\nprocedure TLookupValues.SetItem(Index: integer; const Value: TLookupValueItem);\r\nbegin\r\n inherited Items[Index] := Value;\r\nend;\r\n\r\n\r\nend.\r\n","unit Bcl.Json.Common;\r\n\r\n{$I Bcl.inc}\r\n\r\ninterface\r\n\r\nuses\r\n Types,\r\n {$IFDEF PAS2JS}\r\n JS;\r\n {$ELSE}\r\n Bcl.Json.Classes;\r\n {$ENDIF}\r\n\r\ntype\r\n{$IFDEF PAS2JS}\r\n TJElement = JSValue;\r\n TJObject = TJSObject;\r\n TJArray = TJSArray;\r\n{$ELSE}\r\n TJElement = Bcl.Json.Classes.TJElement;\r\n TJObject = Bcl.Json.Classes.TJObject;\r\n TJArray = Bcl.Json.Classes.TJArray;\r\n{$ENDIF}\r\n\r\nfunction JValue(const Value: string): TJElement; overload;\r\nfunction JValue(const Value: Integer): TJElement; overload;\r\n{$IFNDEF PAS2JS}\r\nfunction JValue(const Value: Int64): TJElement; overload;\r\n{$ENDIF}\r\nfunction JValue(const Value: Double): TJElement; overload;\r\nfunction JValue(const Value: Boolean): TJElement; overload;\r\n\r\nfunction JToInt(Value: TJElement): Integer;\r\nfunction JToStr(Value: TJElement): string;\r\nfunction JToBool(Value: TJElement): Boolean;\r\nfunction AsJObject(Value: TJElement): TJObject;\r\nfunction AsJArray(Value: TJElement): TJArray;\r\n\r\nfunction JObjectKeys(Value: TJObject): TStringDynArray;\r\n\r\nimplementation\r\n\r\nfunction JValue(const Value: string): TJElement; overload;\r\nbegin\r\n {$IFDEF PAS2JS}\r\n Result := Value;\r\n {$ELSE}\r\n Result := TJPrimitive.Create(Value);\r\n {$ENDIF}\r\nend;\r\n\r\nfunction JValue(const Value: Integer): TJElement; overload;\r\nbegin\r\n {$IFDEF PAS2JS}\r\n Result := Value;\r\n {$ELSE}\r\n Result := TJPrimitive.Create(Value);\r\n {$ENDIF}\r\nend;\r\n\r\n{$IFNDEF PAS2JS}\r\nfunction JValue(const Value: Int64): TJElement; overload;\r\nbegin\r\n Result := TJPrimitive.Create(Value);\r\nend;\r\n{$ENDIF}\r\n\r\nfunction JValue(const Value: Double): TJElement; overload;\r\nbegin\r\n {$IFDEF PAS2JS}\r\n Result := Value;\r\n {$ELSE}\r\n Result := TJPrimitive.Create(Value);\r\n {$ENDIF}\r\nend;\r\n\r\nfunction JValue(const Value: Boolean): TJElement; overload;\r\nbegin\r\n {$IFDEF PAS2JS}\r\n Result := Value;\r\n {$ELSE}\r\n Result := TJPrimitive.Create(Value);\r\n {$ENDIF}\r\nend;\r\n\r\nfunction JToBool(Value: TJElement): Boolean;\r\nbegin\r\n {$IFDEF PAS2JS}\r\n Result := Boolean(Value);\r\n {$ELSE}\r\n Result := Value.AsBoolean;\r\n {$ENDIF}\r\nend;\r\n\r\nfunction JToInt(Value: TJElement): Integer;\r\nbegin\r\n {$IFDEF PAS2JS}\r\n Result := Integer(Value);\r\n {$ELSE}\r\n Result := Value.AsInteger;\r\n {$ENDIF}\r\nend;\r\n\r\nfunction JToStr(Value: TJElement): string;\r\nbegin\r\n {$IFDEF PAS2JS}\r\n Result := string(Value);\r\n {$ELSE}\r\n Result := Value.AsString;\r\n {$ENDIF}\r\nend;\r\n\r\nfunction AsJObject(Value: TJElement): TJObject;\r\nbegin\r\n {$IFDEF PAS2JS}\r\n Result := TJObject(Value);\r\n {$ELSE}\r\n Result := Value.AsObject;\r\n {$ENDIF}\r\nend;\r\n\r\nfunction AsJArray(Value: TJElement): TJArray;\r\nbegin\r\n {$IFDEF PAS2JS}\r\n Result := TJArray(Value);\r\n {$ELSE}\r\n Result := Value.AsArray;\r\n {$ENDIF}\r\nend;\r\n\r\nfunction JObjectKeys(Value: TJObject): TStringDynArray;\r\nbegin\r\n {$IFDEF PAS2JS}\r\n Result := TJSObject.keys(Value);\r\n {$ELSE}\r\n REsult := TJObject.keys(Value)\r\n {$ENDIF}\r\nend;\r\n\r\nend.\r\n","unit Bcl.Collections.Common;\r\n\r\n{$I Bcl.inc}\r\n\r\ninterface\r\n\r\nuses\r\n Types,\r\n {$IFDEF ISDELPHI}\r\n Generics.Collections,\r\n {$ELSE}\r\n Bcl.Json.Common,\r\n JS,\r\n {$ENDIF}\r\n SysUtils;\r\n\r\ntype\r\n TStringMap = class\r\n private\r\n {$IFDEF PAS2JS}\r\n FMap: TJObject;\r\n {$ELSE}\r\n FDictionary: TObjectDictionary;\r\n {$ENDIF}\r\n function GetItem(const Key: string): TObject;\r\n function GetKeys: TStringDynArray;\r\n public\r\n constructor Create(AOwnsObjects: Boolean = False); reintroduce;\r\n destructor Destroy; override;\r\n procedure Clear;\r\n procedure Add(const Key: string; const Value: TObject);\r\n procedure AddOrSetValue(const Key: string; const Value: TObject);\r\n function ContainsKey(const Key: string): Boolean;\r\n procedure Remove(const Key: string);\r\n property Items[const Key: string]: TObject read GetItem; default;\r\n property Keys: TStringDynArray read GetKeys;\r\n end;\r\n\r\nimplementation\r\n\r\n{ TStringMap }\r\n\r\nprocedure TStringMap.Add(const Key: string; const Value: TObject);\r\nbegin\r\n {$IFDEF PAS2JS}\r\n FMap[Key] := Value;\r\n {$ELSE}\r\n FDictionary.Add(Key, Value);\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TStringMap.AddOrSetValue(const Key: string; const Value: TObject);\r\nbegin\r\n {$IFDEF PAS2JS}\r\n FMap[Key] := Value;\r\n {$ELSE}\r\n FDictionary.AddOrSetValue(Key, Value);\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TStringMap.Clear;\r\n{$IFDEF PAS2JS}\r\nvar\r\n I: Integer;\r\nbegin\r\n for I := Length(Keys) - 1 downto 0 do\r\n Remove(Keys[I]);\r\nend;\r\n{$ELSE}\r\nbegin\r\n FDictionary.Clear;\r\nend;\r\n{$ENDIF}\r\n\r\nfunction TStringMap.ContainsKey(const Key: string): Boolean;\r\nbegin\r\n {$IFDEF PAS2JS}\r\n Result := FMap.hasOwnProperty(Key);\r\n {$ELSE}\r\n Result := FDictionary.ContainsKey(Key);\r\n {$ENDIF}\r\nend;\r\n\r\nconstructor TStringMap.Create(AOwnsObjects: Boolean);\r\n{$IFDEF PAS2JS}\r\nbegin\r\n FMap := TJSObject.new;\r\nend;\r\n{$ELSE}\r\nvar\r\n Ownership: TDictionaryOwnerships;\r\nbegin\r\n Ownership := [];\r\n if AOwnsObjects then\r\n Ownership := [doOwnsValues];\r\n FDictionary := TObjectDictionary.Create(Ownership);\r\nend;\r\n{$ENDIF}\r\n\r\ndestructor TStringMap.Destroy;\r\nbegin\r\n {$IFDEF PAS2JS}\r\n {$ELSE}\r\n FDictionary.Free;\r\n {$ENDIF}\r\n inherited;\r\nend;\r\n\r\nfunction TStringMap.GetItem(const Key: string): TObject;\r\nbegin\r\n {$IFDEF PAS2JS}\r\n Result := TObject(FMap[Key]);\r\n {$ELSE}\r\n Result := FDictionary[Key];\r\n {$ENDIF}\r\nend;\r\n\r\nfunction TStringMap.GetKeys: TStringDynArray;\r\n{$IFDEF PAS2JS}\r\nbegin\r\n Result := TJSObject.Keys(FMap);\r\nend;\r\n{$ELSE}\r\nvar\r\n Key: string;\r\n I: Integer;\r\nbegin\r\n SetLength(Result, FDictionary.Keys.Count);\r\n I := 0;\r\n for Key in FDictionary.Keys do\r\n begin\r\n Result[I] := Key;\r\n Inc(I);\r\n end;\r\nend;\r\n{$ENDIF}\r\n\r\nprocedure TStringMap.Remove(const Key: string);\r\nbegin\r\n {$IFDEF PAS2JS}\r\n asm delete this.FMap[Key]; end;\r\n {$ELSE}\r\n FDictionary.Remove(Key);\r\n {$ENDIF}\r\nend;\r\n\r\nend.\r\n","unit XData.Web.Headers;\r\n\r\ninterface\r\n\r\nuses\r\n Types, SysUtils, Bcl.Collections.Common;\r\n\r\ntype\r\n THttpHeaderInfo = class\r\n private\r\n FName: string;\r\n FValue: string;\r\n public\r\n constructor Create(const AName, AValue: string); reintroduce;\r\n property Name: string read FName;\r\n property Value: string read FValue;\r\n end;\r\n\r\n THttpHeaders = class\r\n strict private\r\n FHeaders: TStringMap;\r\n private\r\n function GetHeaderNames: TStringDynArray;\r\n public\r\n constructor Create; reintroduce;\r\n destructor Destroy; override;\r\n procedure SetValue(const HeaderName, HeaderValue: string);\r\n procedure AddValue(const HeaderName, HeaderValue: string);\r\n function Get(const HeaderName: string): string;\r\n function Exists(const HeaderName: string): boolean;\r\n function GetIfExists(const HeaderName: string; var HeaderValue: string): Boolean;\r\n procedure Remove(const HeaderName: string);\r\n procedure Clear;\r\n property HeaderNames: TStringDynArray read GetHeaderNames;\r\n end;\r\n\r\nimplementation\r\n\r\n{ THttpHeaderInfo }\r\n\r\nconstructor THttpHeaderInfo.Create(const AName, AValue: string);\r\nbegin\r\n FName := AName;\r\n FValue := AValue;\r\nend;\r\n\r\n{ THttpHeaders }\r\n\r\nprocedure THttpHeaders.AddValue(const HeaderName, HeaderValue: string);\r\nbegin\r\n if Exists(HeaderName) then\r\n SetValue(HeaderName, Get(HeaderName) + ',' + HeaderValue)\r\n else\r\n SetValue(HeaderName, HeaderValue);\r\nend;\r\n\r\nprocedure THttpHeaders.Clear;\r\nbegin\r\n FHeaders.Clear;\r\nend;\r\n\r\nconstructor THttpHeaders.Create;\r\nbegin\r\n FHeaders := TStringMap.Create(True);\r\nend;\r\n\r\ndestructor THttpHeaders.Destroy;\r\nbegin\r\n FHeaders.Free;\r\n inherited;\r\nend;\r\n\r\nfunction THttpHeaders.Exists(const HeaderName: string): boolean;\r\nbegin\r\n Result := FHeaders.ContainsKey(LowerCase(HeaderName));\r\nend;\r\n\r\nfunction THttpHeaders.Get(const HeaderName: string): string;\r\nbegin\r\n if FHeaders.ContainsKey(Lowercase(HeaderName)) then\r\n Result := THttpHeaderInfo(FHeaders[Lowercase(HeaderName)]).Value\r\n else\r\n Result := '';\r\nend;\r\n\r\nfunction THttpHeaders.GetHeaderNames: TStringDynArray;\r\nbegin\r\n Result := FHeaders.Keys;\r\nend;\r\n\r\nfunction THttpHeaders.GetIfExists(const HeaderName: string;\r\n var HeaderValue: string): Boolean;\r\nbegin\r\n Result := Exists(HeaderName);\r\n if Result then\r\n HeaderValue := Get(HeaderName);\r\nend;\r\n\r\nprocedure THttpHeaders.Remove(const HeaderName: string);\r\nbegin\r\n if FHeaders.ContainsKey(LowerCase(HeaderName)) then\r\n FHeaders.Remove(LowerCase(HeaderName));\r\nend;\r\n\r\nprocedure THttpHeaders.SetValue(const HeaderName, HeaderValue: string);\r\nbegin\r\n if HeaderName <> '' then\r\n FHeaders.AddOrSetValue(Lowercase(HeaderName),\r\n THttpHeaderInfo.Create(Lowercase(HeaderName), Trim(HeaderValue)));\r\nend;\r\n\r\nend.","unit XData.Web.Request;\r\n\r\ninterface\r\n\r\nuses\r\n XData.Web.Headers;\r\n\r\ntype\r\n IHttpRequest = interface\r\n ['{782AF543-EFEB-4DA5-AC25-842DF76723A0}']\r\n function GetMethod: string;\r\n procedure SetMethod(const Value: string);\r\n function GetUri: string;\r\n procedure SetUri(const Value: string);\r\n function GetTimeout: Integer;\r\n procedure SetTimeout(const Value: Integer);\r\n function GetHeaders: THttpHeaders;\r\n function GetContent: JSValue;\r\n procedure SetContent(const Value: JSValue);\r\n property Method: string read GetMethod write SetMethod;\r\n property Uri: string read GetUri write SetUri;\r\n property Headers: THttpHeaders read GetHeaders;\r\n property Content: JSValue read GetContent write SetContent;\r\n property Timeout: Integer read GetTimeout write SetTimeout;\r\n end;\r\n\r\n THttpRequest = class(TInterfacedObject, IHttpRequest)\r\n private\r\n FMethod: string;\r\n FUri: string;\r\n FHeaders: THttpHeaders;\r\n FContent: JSValue;\r\n FTimeout: Integer;\r\n function GetMethod: string;\r\n procedure SetMethod(const Value: string);\r\n function GetUri: string;\r\n procedure SetUri(const Value: string);\r\n function GetTimeout: Integer;\r\n procedure SetTimeout(const Value: Integer);\r\n function GetHeaders: THttpHeaders;\r\n function GetContent: JSValue;\r\n procedure SetContent(const Value: JSValue);\r\n public\r\n constructor Create; reintroduce; overload;\r\n constructor Create(const AUri: string); overload;\r\n constructor Create(const AUri, AMethod: string); overload;\r\n destructor Destroy; override;\r\n property Method: string read GetMethod write SetMethod;\r\n property Uri: string read GetUri write SetUri;\r\n property Headers: THttpHeaders read GetHeaders;\r\n property Content: JSValue read GetContent write SetContent;\r\n property Timeout: Integer read GetTimeout write SetTimeout;\r\n end;\r\n\r\nimplementation\r\n\r\nuses\r\n SysUtils;\r\n\r\n{ THttpRequest }\r\n\r\nconstructor THttpRequest.Create;\r\nbegin\r\n Create('', 'GET');\r\nend;\r\n\r\nconstructor THttpRequest.Create(const AUri, AMethod: string);\r\nbegin\r\n FHeaders := THttpHeaders.Create;\r\n FUri := AUri;\r\n FMethod := AMethod;\r\n FTimeout := 0;\r\nend;\r\n\r\nconstructor THttpRequest.Create(const AUri: string);\r\nbegin\r\n Create(AUri, 'GET');\r\nend;\r\n\r\ndestructor THttpRequest.Destroy;\r\nbegin\r\n FHeaders.Free;\r\n inherited;\r\nend;\r\n\r\nfunction THttpRequest.GetContent: JSValue;\r\nbegin\r\n Result := FContent;\r\nend;\r\n\r\nfunction THttpRequest.GetHeaders: THttpHeaders;\r\nbegin\r\n Result := FHeaders;\r\nend;\r\n\r\nfunction THttpRequest.GetMethod: string;\r\nbegin\r\n Result := FMethod;\r\nend;\r\n\r\nfunction THttpRequest.GetTimeout: Integer;\r\nbegin\r\n Result := FTimeout;\r\nend;\r\n\r\nfunction THttpRequest.GetUri: string;\r\nbegin\r\n Result := FUri;\r\nend;\r\n\r\nprocedure THttpRequest.SetContent(const Value: JSValue);\r\nbegin\r\n FContent := Value;\r\nend;\r\n\r\nprocedure THttpRequest.SetMethod(const Value: string);\r\nbegin\r\n FMethod := UpperCase(Value);\r\nend;\r\n\r\nprocedure THttpRequest.SetTimeout(const Value: Integer);\r\nbegin\r\n FTimeout := Value;\r\nend;\r\n\r\nprocedure THttpRequest.SetUri(const Value: string);\r\nbegin\r\n FUri := Value;\r\nend;\r\n\r\nend.","unit XData.Web.Response;\r\n\r\ninterface\r\n\r\nuses\r\n XData.Web.Headers,\r\n Web;\r\n\r\ntype\r\n IHttpResponse = interface\r\n ['{4F5FBBEB-2D03-446F-AD75-FFF8DB09B0B0}']\r\n function GetStatusCode: Integer;\r\n function GetStatusReason: string;\r\n function GetHeaders: THttpHeaders;\r\n function GetContentAsText: string;\r\n property StatusCode: Integer read GetStatusCode;\r\n property StatusReason: string read GetStatusReason;\r\n property Headers: THttpHeaders read GetHeaders;\r\n property ContentAsText: string read GetContentAsText;\r\n end;\r\n\r\n THttpResponse = class(TInterfacedObject, IHttpResponse)\r\n strict private\r\n FPrepared: Boolean;\r\n function GetHeaders: THttpHeaders;\r\n strict protected\r\n FHeaders: THttpHeaders;\r\n procedure PrepareResponse;\r\n strict protected\r\n function GetStatusCode: Integer; virtual; abstract;\r\n function GetStatusReason: string; virtual; abstract;\r\n procedure UpdateHeaders(AHeaders: THttpHeaders); virtual; abstract;\r\n function GetContentAsText: string; virtual; abstract;\r\n public\r\n constructor Create; reintroduce;\r\n destructor Destroy; override;\r\n property StatusCode: integer read GetStatusCode;\r\n property StatusReason: string read GetStatusReason;\r\n property Headers: THttpHeaders read GetHeaders;\r\n property ContentAsText: string read GetContentAsText;\r\n end;\r\n\r\n // Move this class to another unit later\r\n TXhrHttpResponse = class(THttpResponse, IHttpResponse)\r\n strict private\r\n FXhr: TJSXmlHttpRequest;\r\n strict protected\r\n function GetStatusCode: Integer; override;\r\n function GetStatusReason: string; override;\r\n procedure UpdateHeaders(AHeaders: THttpHeaders); override;\r\n function GetContentAsText: string; override;\r\n public\r\n constructor Create(AXhr: TJSXmlHttpRequest); reintroduce;\r\n end;\r\n\r\n // Move this class to another unit later\r\n TDummyHttpResponse = class(THttpResponse, IHttpResponse)\r\n strict protected\r\n function GetStatusCode: Integer; override;\r\n function GetStatusReason: string; override;\r\n procedure UpdateHeaders(AHeaders: THttpHeaders); override;\r\n function GetContentAsText: string; override;\r\n end;\r\n\r\nimplementation\r\n\r\nuses\r\n Types, SysUtils, JS;\r\n\r\n{ THttpResponse }\r\n\r\nconstructor THttpResponse.Create;\r\nbegin\r\n FHeaders := THttpHeaders.Create;\r\nend;\r\n\r\ndestructor THttpResponse.Destroy;\r\nbegin\r\n FHeaders.Free;\r\n inherited;\r\nend;\r\n\r\nfunction THttpResponse.GetHeaders: THttpHeaders;\r\nbegin\r\n PrepareResponse;\r\n Result := FHeaders;\r\nend;\r\n\r\nprocedure THttpResponse.PrepareResponse;\r\nbegin\r\n if FPrepared then\r\n Exit;\r\n FPrepared := True;\r\n UpdateHeaders(FHeaders);\r\nend;\r\n\r\n{ TXhrHttpResponse }\r\n\r\nconstructor TXhrHttpResponse.Create(AXhr: TJSXmlHttpRequest);\r\nbegin\r\n inherited Create;\r\n FXhr := AXhr;\r\nend;\r\n\r\nfunction TXhrHttpResponse.GetContentAsText: string;\r\nbegin\r\n Result := FXhr.responseText;\r\nend;\r\n\r\nfunction TXhrHttpResponse.GetStatusCode: Integer;\r\nbegin\r\n Result := FXhr.status;\r\nend;\r\n\r\nfunction TXhrHttpResponse.GetStatusReason: string;\r\nbegin\r\n Result := FXhr.statusText;\r\nend;\r\n\r\n{$HINTS OFF}\r\n// Pas2Js is raising a hint about \"HeaderPair never used\"\r\n// Let's disable the hint for now and remove it when compiler is fixed\r\nprocedure TXhrHttpResponse.UpdateHeaders(AHeaders: THttpHeaders);\r\nvar\r\n I: Integer;\r\n SplitHeaders: TStringDynArray;\r\n HeaderPair: TStringDynArray;\r\nbegin\r\n SplitHeaders := TJSString(Trim(FXhr.getAllResponseHeaders)).split(#13#10);\r\n FHeaders.Clear;\r\n for I := 0 to Length(SplitHeaders) - 1 do\r\n begin\r\n HeaderPair := TJSString(SplitHeaders[I]).split(':');\r\n FHeaders.SetValue(Trim(HeaderPair[0]), Trim(HeaderPair[1]));\r\n end;\r\nend;\r\n{$HINTS ON}\r\n\r\n{ TDummyHttpResponse }\r\n\r\nfunction TDummyHttpResponse.GetContentAsText: string;\r\nbegin\r\n Result := '';\r\nend;\r\n\r\nfunction TDummyHttpResponse.GetStatusCode: Integer;\r\nbegin\r\n Result := 0;\r\nend;\r\n\r\nfunction TDummyHttpResponse.GetStatusReason: string;\r\nbegin\r\n Result := '';\r\nend;\r\n\r\nprocedure TDummyHttpResponse.UpdateHeaders(AHeaders: THttpHeaders);\r\nbegin\r\nend;\r\n\r\nend.\r\n","{\r\n Delphi/Kylix compatibility unit: String handling routines.\r\n\r\n This file is part of the Free Pascal run time library.\r\n Copyright (c) 2018 by the Free Pascal development team\r\n\r\n See the file COPYING.FPC, included in this distribution,\r\n for details about the copyright.\r\n\r\n This program is distributed in the hope that it will be useful,\r\n but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r\n\r\n **********************************************************************}\r\n{$mode objfpc}\r\n\r\n{$inline on}\r\nunit strutils;\r\n\r\ninterface\r\n\r\nuses\r\n SysUtils, Types;\r\n\r\n{ ---------------------------------------------------------------------\r\n Case insensitive search/replace\r\n ---------------------------------------------------------------------}\r\n\r\nFunction AnsiResemblesText(const AText, AOther: string): Boolean;\r\nFunction AnsiContainsText(const AText, ASubText: string): Boolean;\r\nFunction AnsiStartsText(const ASubText, AText: string): Boolean;\r\nFunction AnsiEndsText(const ASubText, AText: string): Boolean;\r\nFunction AnsiReplaceText(const AText, AFromText, AToText: string): string;\r\nFunction AnsiMatchText(const AText: string; const AValues: array of string): Boolean;\r\nFunction AnsiIndexText(const AText: string; const AValues: array of string): Integer;\r\n\r\nFunction StartsText(const ASubText, AText: string): Boolean;\r\nFunction EndsText(const ASubText, AText: string): Boolean;\r\n\r\nfunction ResemblesText(const AText, AOther: string): Boolean;\r\nfunction ContainsText(const AText, ASubText: string): Boolean;\r\nfunction MatchText(const AText: string; const AValues: array of string): Boolean;\r\nfunction IndexText(const AText: string; const AValues: array of string): Integer;\r\n\r\n{ ---------------------------------------------------------------------\r\n Case sensitive search/replace\r\n ---------------------------------------------------------------------}\r\n\r\nFunction AnsiContainsStr(const AText, ASubText: string): Boolean;\r\nFunction AnsiStartsStr(const ASubText, AText: string): Boolean;\r\nFunction AnsiEndsStr(const ASubText, AText: string): Boolean;\r\nFunction AnsiReplaceStr(const AText, AFromText, AToText: string): string;\r\nFunction AnsiMatchStr(const AText: string; const AValues: array of string): Boolean;\r\nFunction AnsiIndexStr(const AText: string; const AValues: array of string): Integer;\r\nFunction MatchStr(const AText: String; const AValues: array of String): Boolean;\r\nFunction IndexStr(const AText: String; const AValues: array of String): Integer;\r\nfunction ContainsStr(const AText, ASubText: string): Boolean;\r\nFunction StartsStr(const ASubText, AText: string): Boolean;\r\nFunction EndsStr(const ASubText, AText: string): Boolean;\r\n\r\n{ ---------------------------------------------------------------------\r\n Miscellaneous\r\n ---------------------------------------------------------------------}\r\n\r\nFunction DupeString(const AText: string; ACount: Integer): string;\r\nFunction ReverseString(const AText: string): string;\r\nFunction AnsiReverseString(const AText: String): String;\r\nFunction StuffString(const AText: string; AStart, ALength: Cardinal; const ASubText: string): string;\r\nFunction RandomFrom(const AValues: array of string): string; overload;\r\nFunction IfThen(AValue: Boolean; const ATrue: string; const AFalse: string = ''): string; overload;\r\nfunction NaturalCompareText (const S1 , S2 : string ): Integer ;\r\nfunction NaturalCompareText(const Str1, Str2: string; const ADecSeparator, AThousandSeparator: String): Integer;\r\n\r\n\r\n{ ---------------------------------------------------------------------\r\n VB emulations.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction LeftStr(const AText: String; const ACount: SizeInt): String;\r\nFunction RightStr(const AText: String; const ACount: SizeInt): String;\r\nFunction MidStr(const AText: String; const AStart, ACount: SizeInt): String;\r\nFunction RightBStr(const AText: String; const AByteCount: SizeInt): String;\r\nFunction MidBStr(const AText: String; const AByteStart, AByteCount: SizeInt): String;\r\nFunction AnsiLeftStr(const AText: String; const ACount: SizeInt): String;\r\nFunction AnsiRightStr(const AText: String; const ACount: SizeInt): String;\r\nFunction AnsiMidStr(const AText: String; const AStart, ACount: SizeInt): String;\r\nFunction LeftBStr(const AText: String; const AByteCount: SizeInt): String;\r\n\r\n{ ---------------------------------------------------------------------\r\n Extended search and replace\r\n ---------------------------------------------------------------------}\r\n\r\nVar\r\n { Default word delimiters are any character except the core alphanumerics. }\r\n WordDelimiters: Array of Char;// = [#0..#255] - ['a'..'z','A'..'Z','1'..'9','0'];\r\n \r\nConst\r\n SErrAmountStrings = 'Amount of search and replace strings don''t match';\r\n SInvalidRomanNumeral = '%s is not a valid Roman numeral';\r\n\r\ntype\r\n TStringSearchOption = (soDown, soMatchCase, soWholeWord);\r\n TStringSearchOptions = set of TStringSearchOption;\r\n TStringSeachOption = TStringSearchOption;\r\n\r\nFunction PosEx(const SubStr, S: string; Offset: SizeUint): SizeInt;\r\nFunction PosEx(const SubStr, S: string): SizeInt; // Offset: Cardinal = 1\r\nFunction PosEx(c:char; const S: string; Offset: SizeUint): SizeInt;\r\nfunction StringsReplace(const S: string; OldPattern, NewPattern: array of string; Flags: TReplaceFlags): string;\r\n\r\n{ ---------------------------------------------------------------------\r\n Delphi compat\r\n ---------------------------------------------------------------------}\r\n\r\nFunction ReplaceStr(const AText, AFromText, AToText: string): string;\r\nFunction ReplaceText(const AText, AFromText, AToText: string): string;\r\n\r\n{ ---------------------------------------------------------------------\r\n Soundex Functions.\r\n ---------------------------------------------------------------------}\r\n\r\ntype\r\n TSoundexLength = 1..MaxInt;\r\n\r\nFunction Soundex(const AText: string; ALength: TSoundexLength): string;\r\nFunction Soundex(const AText: string): string; // ; ALength: TSoundexLength = 4\r\n\r\ntype\r\n TSoundexIntLength = 1..8;\r\n\r\nFunction SoundexInt(const AText: string; ALength: TSoundexIntLength): Integer;\r\nFunction SoundexInt(const AText: string): Integer; //; ALength: TSoundexIntLength = 4\r\nFunction DecodeSoundexInt(AValue: Integer): string;\r\nFunction SoundexWord(const AText: string): Word;\r\nFunction DecodeSoundexWord(AValue: Word): string;\r\nFunction SoundexSimilar(const AText, AOther: string; ALength: TSoundexLength): Boolean;\r\nFunction SoundexSimilar(const AText, AOther: string): Boolean; //; ALength: TSoundexLength = 4\r\nFunction SoundexCompare(const AText, AOther: string; ALength: TSoundexLength): Integer;\r\nFunction SoundexCompare(const AText, AOther: string): Integer; //; ALength: TSoundexLength = 4\r\nFunction SoundexProc(const AText, AOther: string): Boolean;\r\n\r\ntype\r\n TCompareTextProc = Function(const AText, AOther: string): Boolean;\r\n\r\nVar\r\n AnsiResemblesProc: TCompareTextProc;\r\n ResemblesProc: TCompareTextProc;\r\n\r\n{ ---------------------------------------------------------------------\r\n Other functions, based on RxStrUtils.\r\n ---------------------------------------------------------------------}\r\ntype\r\n TRomanConversionStrictness = (rcsStrict, rcsRelaxed, rcsDontCare);\r\n\r\n\r\nfunction IsEmptyStr(const S: string; const EmptyChars: Array of char): Boolean;\r\nfunction DelSpace(const S: string): string;\r\nfunction DelChars(const S: string; Chr: Char): string;\r\nfunction DelSpace1(const S: string): string;\r\nfunction Tab2Space(const S: string; Numb: Byte): string;\r\nfunction NPos(const C: string; S: string; N: Integer): SizeInt;\r\nFunction RPosEX(C:char;const S : String;offs:cardinal):SizeInt; overload;\r\nFunction RPosex (Const Substr : String; Const Source : String;offs:cardinal) : SizeInt; overload;\r\nFunction RPos(c:char;const S : String):SizeInt; overload;\r\nFunction RPos (Const Substr : String; Const Source : String) : SizeInt; overload;\r\nfunction AddChar(C: Char; const S: string; N: Integer): string;\r\nfunction AddCharR(C: Char; const S: string; N: Integer): string;\r\nfunction PadLeft(const S: string; N: Integer): string;\r\nfunction PadRight(const S: string; N: Integer): string;\r\nfunction PadCenter(const S: string; Len: SizeInt): string;\r\nfunction Copy2Symb(const S: string; Symb: Char): string;\r\nfunction Copy2SymbDel(var S: string; Symb: Char): string;\r\nfunction Copy2Space(const S: string): string;\r\nfunction Copy2SpaceDel(var S: string): string;\r\nfunction AnsiProperCase(const S: string; const WordDelims: Array of char): string;\r\nfunction WordCount(const S: string; const WordDelims: Array of char): SizeInt;\r\nfunction WordPosition(const N: Integer; const S: string; const WordDelims: Array of char): SizeInt;\r\nfunction ExtractWord(N: Integer; const S: string; const WordDelims: Array of char): string;\r\nfunction ExtractWordPos(N: Integer; const S: string; const WordDelims: Array of char; out Pos: Integer): string;\r\nfunction ExtractDelimited(N: Integer; const S: string; const Delims: Array of char): string;\r\nfunction ExtractSubstr(const S: string; var Pos: Integer; const Delims: Array of char): string;\r\nfunction IsWordPresent(const W, S: string; const WordDelims: Array of char): Boolean;\r\nfunction FindPart(const HelpWilds, InputStr: string): SizeInt;\r\nfunction IsWild(InputStr, Wilds: string; IgnoreCase: Boolean): Boolean;\r\nfunction XorString(const Key, Src: String): String;\r\nfunction XorEncode(const Key, Source: string): string;\r\nfunction XorDecode(const Key, Source: string): string;\r\nfunction GetCmdLineArg(const Switch: string; SwitchChars: Array of char): string;\r\nfunction Numb2USA(const S: string): string;\r\nfunction Hex2Dec(const S: string): Longint;\r\nfunction Dec2Numb(N: Longint; Len, Base: Byte): string;\r\nfunction Numb2Dec(S: string; Base: Byte): Longint;\r\nfunction IntToBin(Value: Longint; Digits, Spaces: Integer): string;\r\nfunction IntToBin(Value: Longint; Digits: Integer): string;\r\nfunction IntToBin(Value: NativeInt; Digits:integer): string;\r\nfunction IntToRoman(Value: Longint): string;\r\nfunction TryRomanToInt(S: String; out N: LongInt; Strictness: TRomanConversionStrictness = rcsRelaxed): Boolean;\r\nfunction RomanToInt(const S: string; Strictness: TRomanConversionStrictness = rcsRelaxed): Longint;\r\nfunction RomanToIntDef(Const S : String; const ADefault: Longint = 0; Strictness: TRomanConversionStrictness = rcsRelaxed): Longint;\r\n\r\nconst\r\n DigitChars = ['0'..'9'];\r\n Brackets = ['(',')','[',']','{','}'];\r\n StdWordDelims = [#0..' ',',','.',';','/','\\',':','''','\"','`'] + Brackets;\r\n StdSwitchChars = ['-','/'];\r\n\r\nfunction PosSet (const c:Array of char;const s : String ):SizeInt;\r\nfunction PosSet (const c:string;const s : String ):SizeInt;\r\nfunction PosSetEx (const c:Array of char;const s : String;count:Integer ):SizeInt;\r\nfunction PosSetEx (const c:string;const s : String;count:Integer ):SizeInt;\r\n\r\nProcedure Removeleadingchars(VAR S : String; Const CSet:Array of char);\r\nProcedure RemoveTrailingChars(VAR S : String;Const CSet:Array of char);\r\nProcedure RemovePadChars(VAR S : String;Const CSet:Array of char);\r\n\r\nfunction TrimLeftSet(const S: String;const CSet:Array of char): String;\r\nFunction TrimRightSet(const S: String;const CSet:Array of char): String;\r\nfunction TrimSet(const S: String;const CSet:Array of char): String;\r\n\r\nFunction SplitString(const S, Delimiters: string): TStringDynArray;\r\n\r\ntype\r\n SizeIntArray = array of SizeInt;\r\n\r\n\r\nimplementation\r\n\r\nuses js;\r\n\r\n{ ---------------------------------------------------------------------\r\n Possibly Exception raising functions\r\n ---------------------------------------------------------------------}\r\n\r\n\r\nfunction Hex2Dec(const S: string): Longint;\r\nvar\r\n HexStr: string;\r\nbegin\r\n if Pos('$',S)=0 then\r\n HexStr:='$'+ S\r\n else\r\n HexStr:=S;\r\n Result:=StrToInt(HexStr);\r\nend;\r\n\r\n{\r\n We turn off implicit exceptions, since these routines are tested, and it \r\n saves 20% codesize (and some speed) and don't throw exceptions, except maybe \r\n heap related. If they don't, that is consider a bug.\r\n\r\n In the future, be wary with routines that use strtoint, floating point \r\n and/or format() derivatives. And check every divisor for 0.\r\n}\r\n\r\n{$IMPLICITEXCEPTIONS OFF}\r\n\r\n{ ---------------------------------------------------------------------\r\n Case insensitive search/replace\r\n ---------------------------------------------------------------------}\r\nFunction AnsiResemblesText(const AText, AOther: string): Boolean;\r\n\r\nbegin\r\n if Assigned(AnsiResemblesProc) then\r\n Result:=AnsiResemblesProc(AText,AOther)\r\n else\r\n Result:=False;\r\nend;\r\n\r\nFunction AnsiContainsText(const AText, ASubText: string): Boolean;\r\nbegin\r\n Result:=Pos(Uppercase(ASubText),Uppercase(AText))>0;\r\nend;\r\n\r\n\r\nFunction AnsiStartsText(const ASubText, AText: string): Boolean;\r\nbegin\r\n if (Length(AText) >= Length(ASubText)) and (ASubText <> '') then\r\n Result := SameText(ASubText,Copy(AText,1,Length(ASubText)))\r\n else\r\n Result := False;\r\nend;\r\n\r\n\r\nFunction AnsiEndsText(const ASubText, AText: string): Boolean;\r\nbegin\r\n if Length(AText) >= Length(ASubText) then\r\n Result := SameText(aSubText,RightStr(aText,Length(ASubText)))\r\n else\r\n Result := False;\r\nend;\r\n\r\n\r\nFunction AnsiReplaceText(const AText, AFromText, AToText: string): string;\r\nbegin\r\n Result := StringReplace(AText,AFromText,AToText,[rfReplaceAll,rfIgnoreCase]);\r\nend;\r\n\r\n\r\nFunction AnsiMatchText(const AText: string; const AValues: array of string): Boolean;\r\nbegin\r\n Result:=(AnsiIndexText(AText,AValues)<>-1)\r\nend;\r\n\r\n\r\nFunction AnsiIndexText(const AText: string; const AValues: array of string): Integer;\r\n\r\nvar\r\n i : Integer;\r\n\r\nbegin\r\n Result:=-1;\r\n if (high(AValues)=-1) or (High(AValues)>MaxInt) Then\r\n Exit;\r\n for i:=low(AValues) to High(Avalues) do\r\n if CompareText(avalues[i],atext)=0 Then\r\n exit(i); // make sure it is the first val.\r\nend;\r\n\r\n\r\n{ ---------------------------------------------------------------------\r\n Case sensitive search/replace\r\n ---------------------------------------------------------------------}\r\n\r\nFunction AnsiContainsStr(const AText, ASubText: string): Boolean;\r\nbegin\r\n Result := Pos(ASubText,AText)>0;\r\nend;\r\n\r\n\r\nFunction AnsiStartsStr(const ASubText, AText: string): Boolean;\r\nbegin\r\n if (Length(AText) >= Length(ASubText)) and (ASubText <> '') then\r\n Result := (ASubText=Copy(aText,1,Length(ASubtext)))\r\n else\r\n Result := False;\r\nend;\r\n\r\n\r\nFunction AnsiEndsStr(const ASubText, AText: string): Boolean;\r\nbegin\r\n if Length(AText) >= Length(ASubText) then\r\n Result := (ASubText=RightStr(aText,Length(ASubText)))\r\n else\r\n Result := False;\r\nend;\r\n\r\n\r\nFunction AnsiReplaceStr(const AText, AFromText, AToText: string): string;\r\nbegin\r\n Result := StringReplace(AText,AFromText,AToText,[rfReplaceAll]);\r\nend;\r\n\r\n\r\nFunction AnsiMatchStr(const AText: string; const AValues: array of string): Boolean;\r\nbegin\r\n Result:=AnsiIndexStr(AText,Avalues)<>-1;\r\nend;\r\n\r\n\r\nFunction AnsiIndexStr(const AText: string; const AValues: array of string): Integer;\r\nvar\r\n i : longint;\r\nbegin\r\n result:=-1;\r\n if (high(AValues)=-1) or (High(AValues)>MaxInt) Then\r\n Exit;\r\n for i:=low(AValues) to High(Avalues) do\r\n if (avalues[i]=AText) Then\r\n exit(i); // make sure it is the first val.\r\nend;\r\n\r\n\r\nFunction MatchStr(const AText: String; const AValues: array of String): Boolean;\r\nbegin\r\n Result := IndexStr(AText,AValues) <> -1;\r\nend;\r\n\r\n\r\nFunction IndexStr(const AText: String; const AValues: array of String): Integer;\r\nvar\r\n i: longint;\r\nbegin\r\n Result := -1;\r\n if (high(AValues) = -1) or (High(AValues) > MaxInt) Then\r\n Exit;\r\n for i := low(AValues) to High(Avalues) do\r\n if (avalues[i] = AText) Then\r\n exit(i); // make sure it is the first val.\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n Playthingies\r\n ---------------------------------------------------------------------}\r\n\r\nFunction DupeString(const AText: string; ACount: Integer): string;\r\n\r\nvar i : SizeInt;\r\n\r\nbegin\r\n result:='';\r\n for i:=1 to ACount do\r\n Result:=Result+aText;\r\nend;\r\n\r\nFunction ReverseString(const AText: string): string;\r\n\r\nvar\r\n i,j : SizeInt;\r\n\r\nbegin\r\n setlength(result,length(atext));\r\n i:=1; j:=length(atext);\r\n while (i<=j) do\r\n begin\r\n result[i]:=atext[j-i+1];\r\n inc(i);\r\n end;\r\nend;\r\n\r\n\r\nFunction AnsiReverseString(const AText: String): String;\r\n\r\nbegin\r\n Result:=ReverseString(AText);\r\nend;\r\n\r\n\r\nFunction StuffString(const AText: string; AStart, ALength: Cardinal; const ASubText: string): string;\r\n\r\nvar i,j,k : SizeUInt;\r\n\r\nbegin\r\n j:=length(ASubText);\r\n i:=length(AText);\r\n if AStart>i then \r\n aStart:=i+1;\r\n k:=i+1-AStart;\r\n if ALength> k then\r\n ALength:=k;\r\n SetLength(Result,i+j-ALength);\r\n Result:=Copy(AText,1,AStart-1)+Copy(ASubText,1,J)+Copy(AText,AStart+ALength,I+1-AStart-ALength);\r\nend;\r\n\r\nFunction RandomFrom(const AValues: array of string): string; overload;\r\n\r\nbegin\r\n if high(AValues)=-1 then exit('');\r\n result:=Avalues[random(High(AValues)+1)];\r\nend;\r\n\r\nFunction IfThen(AValue: Boolean; const ATrue: string; const AFalse: string = ''): string; overload;\r\n\r\nbegin\r\n if avalue then\r\n result:=atrue\r\n else\r\n result:=afalse;\r\nend;\r\n\r\nfunction NaturalCompareText(const Str1, Str2: string; const ADecSeparator, AThousandSeparator: String): Integer;\r\n{\r\n NaturalCompareBase compares strings in a collated order and\r\n so numbers are sorted too. It sorts like this:\r\n\r\n 01\r\n 001\r\n 0001\r\n\r\n and\r\n\r\n 0\r\n 00\r\n 000\r\n 000_A\r\n 000_B\r\n\r\n in a intuitive order.\r\n }\r\nvar\r\n Num1, Num2: double;\r\n pStr1, pStr2: integer;\r\n Len1, Len2: SizeInt;\r\n TextLen1, TextLen2: SizeInt;\r\n TextStr1: string = '';\r\n TextStr2: string = '';\r\n i: SizeInt;\r\n j: SizeInt;\r\n \r\n function Sign(const AValue: sizeint): integer;\r\n\r\n begin\r\n If Avalue<0 then\r\n Result:=-1\r\n else If Avalue>0 then\r\n Result:=1\r\n else\r\n Result:=0;\r\n end;\r\n\r\n function IsNumber(ch: char): boolean; overload;\r\n begin\r\n Result := ch in ['0'..'9'];\r\n end;\r\n\r\n function GetInteger(aString : String; var pch: integer; var Len: sizeint): double;\r\n\r\n begin\r\n Result := 0;\r\n while (pch<=length(astring)) and IsNumber(AString[pch]) do\r\n begin\r\n Result := (Result * 10) + Ord(Astring[pch]) - Ord('0');\r\n Inc(Len);\r\n Inc(pch);\r\n end;\r\n end;\r\n\r\n procedure GetChars;\r\n\r\n begin\r\n TextLen1 := 0;\r\n while not (Str1[pStr1 + TextLen1] in ['0'..'9']) and ((pStr1 + TextLen1)<=Length(Str1)) do\r\n Inc(TextLen1);\r\n TextStr1:='';\r\n i := 1;\r\n j := 0;\r\n while i <= TextLen1 do\r\n begin\r\n TextStr1 := TextStr1+Str1[pStr1 + j];\r\n Inc(i);\r\n Inc(j);\r\n end;\r\n\r\n TextLen2 := 0;\r\n while not (Str2[pStr2 + TextLen2] in ['0'..'9']) and ((pStr2 + TextLen2)<=Length(Str2)) do\r\n Inc(TextLen2);\r\n i := 1;\r\n j := 0;\r\n while i <= TextLen2 do\r\n begin\r\n TextStr2 := TextStr2+Str2[pStr2 + j];\r\n Inc(i);\r\n Inc(j);\r\n end;\r\n end;\r\n\r\nbegin\r\n if (Str1 <> '') and (Str2 <> '') then\r\n begin\r\n pStr1 := 1;\r\n pStr2 := 1;\r\n Result := 0;\r\n while (pStr1<=Length(Str1)) and (pStr2 <=Length(Str2)) do\r\n begin\r\n TextLen1 := 1;\r\n TextLen2 := 1;\r\n Len1 := 0;\r\n Len2 := 0;\r\n while (Str1[pStr1] = ' ') do\r\n begin\r\n Inc(pStr1);\r\n Inc(Len1);\r\n end;\r\n while (Str2[pstr2] = ' ') do\r\n begin\r\n Inc(pStr2);\r\n Inc(Len2);\r\n end;\r\n if IsNumber(Str1[pStr1]) and IsNumber(Str2[pStr2]) then\r\n begin\r\n Num1 := GetInteger(Str1,pStr1, Len1);\r\n Num2 := GetInteger(Str2, pStr2, Len2);\r\n if Num1 < Num2 then\r\n Result := -1\r\n else if Num1 > Num2 then\r\n Result := 1\r\n else\r\n begin\r\n Result := Sign(Len1 - Len2);\r\n end;\r\n Dec(pStr1);\r\n Dec(pStr2);\r\n end\r\n else\r\n begin\r\n GetChars;\r\n if TextStr1 <> TextStr2 then\r\n Result := CompareText(TextStr1, TextStr2)\r\n else\r\n Result := 0;\r\n end;\r\n if Result <> 0 then\r\n Break;\r\n Inc(pStr1, TextLen1);\r\n Inc(pStr2, TextLen2);\r\n end;\r\n end;\r\n Num1:=Length(Str1);\r\n Num2:=Length(Str2);\r\n if (Result = 0) and (Num1 <> Num2) then\r\n begin\r\n if Num1 < Num2 then\r\n Result := -1\r\n else\r\n Result := 1;\r\n end;\r\n if ADecSeparator='' then ;\r\n if aThousandSeparator='' then ;\r\nend;\r\n\r\nfunction NaturalCompareText (const S1 , S2 : string ): Integer ;\r\nbegin\r\n Result := NaturalCompareText(S1, S2, DecimalSeparator,ThousandSeparator);\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n VB emulations.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction LeftStr(const AText: String; const ACount: SizeInt): String;\r\n\r\nbegin\r\n Result:=Copy(AText,1,ACount);\r\nend;\r\n\r\nFunction RightStr(const AText: String; const ACount: SizeInt): String;\r\n\r\nvar j,l:SizeInt;\r\n\r\nbegin\r\n l:=length(atext);\r\n j:=ACount;\r\n if j>l then j:=l;\r\n Result:=Copy(AText,l-j+1,j);\r\nend;\r\n\r\nFunction MidStr(const AText: String; const AStart, ACount: SizeInt): String;\r\n\r\nbegin\r\n if (ACount=0) or (AStart>length(atext)) then\r\n exit('');\r\n Result:=Copy(AText,AStart,ACount);\r\nend;\r\n\r\n\r\n\r\nFunction LeftBStr(const AText: String; const AByteCount: SizeInt): String;\r\n\r\nbegin\r\n Result:=LeftStr(AText,AByteCount);\r\nend;\r\n\r\n\r\nFunction RightBStr(const AText: String; const AByteCount: SizeInt): String;\r\nbegin\r\n Result:=RightStr(Atext,AByteCount);\r\nend;\r\n\r\n\r\nFunction MidBStr(const AText: String; const AByteStart, AByteCount: SizeInt): String;\r\nbegin\r\n Result:=MidStr(AText,AByteStart,AByteCount);\r\nend;\r\n\r\n\r\nFunction AnsiLeftStr(const AText: String; const ACount: SizeInt): String;\r\nbegin\r\n Result := copy(AText,1,ACount);\r\nend;\r\n\r\n\r\nFunction AnsiRightStr(const AText: String; const ACount: SizeInt): String;\r\nbegin\r\n Result := copy(AText,length(AText)-ACount+1,ACount);\r\nend;\r\n\r\n\r\nFunction AnsiMidStr(const AText: String; const AStart, ACount: SizeInt): String;\r\nbegin\r\n Result:=Copy(AText,AStart,ACount);\r\nend;\r\n\r\n\r\nFunction PosEx(const SubStr, S: string; Offset: SizeUint): SizeInt;\r\n\r\n\r\nbegin\r\n result:=TJSString.New(S).IndexOf(SubStr,offset-1)+1;\r\nend;\r\n\r\nFunction PosEx(c:char; const S: string; Offset: SizeUint): SizeInt;\r\nbegin\r\n result:=TJSString.New(S).IndexOf(c,offset-1)+1;\r\nend;\r\n\r\nFunction PosEx(const SubStr, S: string): SizeInt; // Offset: Cardinal = 1\r\n\r\nbegin\r\n Result:=posex(substr,s,1);\r\nend;\r\n\r\n\r\nfunction StringsReplace(const S: string; OldPattern, NewPattern: array of string; Flags: TReplaceFlags): string;\r\n\r\nvar pc,pcc,lastpc : integer;\r\n strcount : integer;\r\n ResStr,\r\n CompStr : string;\r\n Found : Boolean;\r\n sc : sizeint;\r\n\r\nbegin\r\n sc := length(OldPattern);\r\n if sc <> length(NewPattern) then\r\n raise exception.Create(SErrAmountStrings);\r\n\r\n dec(sc);\r\n\r\n if rfIgnoreCase in Flags then\r\n begin\r\n CompStr:=UpperCase(S);\r\n for strcount := 0 to sc do\r\n OldPattern[strcount] := UpperCase(OldPattern[strcount]);\r\n end\r\n else\r\n CompStr := s;\r\n\r\n ResStr := '';\r\n pc := 1;\r\n pcc := 1;\r\n lastpc := pc+Length(S);\r\n\r\n while pc < lastpc do\r\n begin\r\n Found := False;\r\n for strcount := 0 to sc do\r\n begin\r\n if (Copy(compStr,pc,Length(OldPattern[strcount]))=OldPattern[strcount]) then\r\n begin\r\n ResStr := ResStr + NewPattern[strcount];\r\n pc := pc+Length(OldPattern[strcount]);\r\n pcc := pcc+Length(OldPattern[strcount]);\r\n Found := true;\r\n end\r\n end;\r\n if not found then\r\n begin\r\n ResStr := ResStr + S[pcc];\r\n inc(pc);\r\n inc(pcc);\r\n end\r\n else if not (rfReplaceAll in Flags) then\r\n begin\r\n ResStr := ResStr + copy(S,pcc,Length(S)-pcc+1);\r\n break;\r\n end;\r\n end;\r\n Result := ResStr;\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n Delphi compat\r\n ---------------------------------------------------------------------}\r\n\r\nFunction ReplaceStr(const AText, AFromText, AToText: string): string;\r\nbegin\r\n result:=AnsiReplaceStr(AText, AFromText, AToText);\r\nend;\r\n\r\nFunction ReplaceText(const AText, AFromText, AToText: string): string;\r\nbegin\r\n result:=AnsiReplaceText(AText, AFromText, AToText);\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n Soundex Functions.\r\n ---------------------------------------------------------------------}\r\nVar\r\n SScore : String =\r\n '00000000000000000000000000000000'+ // 1..32\r\n '00000000000000000000000000000000'+ // 33..64\r\n '0123012i02245501262301i2i2'+ // 65..90\r\n '000000'+ // 91..96\r\n '0123012i02245501262301i2i2'+ // 97..122\r\n '00000000000000000000000000000000'+ // 123..154\r\n '00000000000000000000000000000000'+ // 155..186\r\n '00000000000000000000000000000000'+ // 187..218\r\n '00000000000000000000000000000000'+ // 219..250\r\n '00000'; // 251..255\r\n\r\nFunction Soundex(const AText: string; ALength: TSoundexLength): string;\r\n\r\nVar\r\n S,PS : Char;\r\n I,L : SizeInt;\r\n\r\nbegin\r\n Result:='';\r\n PS:=#0;\r\n If Length(AText)>0 then\r\n begin\r\n Result:=Upcase(AText[1]);\r\n I:=2;\r\n L:=Length(AText);\r\n While (I<=L) and (Length(Result)'i') then\r\n PS:=S;\r\n Inc(I);\r\n end;\r\n end;\r\n L:=Length(Result);\r\n If (L0 then\r\n begin\r\n Result:=Ord(SE[1])-OrdA;\r\n if ALength > 1 then\r\n begin\r\n Result:=Result*26+(Ord(SE[2])-Ord0);\r\n for I:=3 to ALength do\r\n Result:=(Ord(SE[I])-Ord0)+Result*7;\r\n end;\r\n Result:=ALength+Result*9;\r\n end;\r\nend;\r\n\r\n\r\nFunction SoundexInt(const AText: string): Integer; //; ALength: TSoundexIntLength = 4\r\nbegin\r\n Result:=SoundexInt(AText,4);\r\nend;\r\n\r\n\r\nFunction DecodeSoundexInt(AValue: Integer): string;\r\n\r\nvar\r\n I, Len: Integer;\r\n\r\nbegin\r\n Result := '';\r\n Len := AValue mod 9;\r\n AValue := AValue div 9;\r\n for I:=Len downto 3 do\r\n begin\r\n Result:=Chr(Ord0+(AValue mod 7))+Result;\r\n AValue:=AValue div 7;\r\n end;\r\n if Len>1 then\r\n begin\r\n Result:=Chr(Ord0+(AValue mod 26))+Result;\r\n AValue:=AValue div 26;\r\n end;\r\n Result:=Chr(OrdA+AValue)+Result;\r\nend;\r\n\r\n\r\nFunction SoundexWord(const AText: string): Word;\r\n\r\nVar\r\n S : String;\r\n\r\nbegin\r\n S:=SoundEx(Atext,4);\r\n Result:=Ord(S[1])-OrdA;\r\n Result:=Result*26+ord(S[2])-48;\r\n Result:=Result*7+ord(S[3])-48;\r\n Result:=Result*7+ord(S[4])-48;\r\nend;\r\n\r\n\r\nFunction DecodeSoundexWord(AValue: Word): string;\r\nbegin\r\n Result := Chr(Ord0+ (AValue mod 7));\r\n AValue := AValue div 7;\r\n Result := Chr(Ord0+ (AValue mod 7)) + Result;\r\n AValue := AValue div 7;\r\n Result := IntToStr(AValue mod 26) + Result;\r\n AValue := AValue div 26;\r\n Result := Chr(OrdA+AValue) + Result;\r\nend;\r\n\r\n\r\nFunction SoundexSimilar(const AText, AOther: string; ALength: TSoundexLength): Boolean;\r\nbegin\r\n Result:=Soundex(AText,ALength)=Soundex(AOther,ALength);\r\nend;\r\n\r\n\r\nFunction SoundexSimilar(const AText, AOther: string): Boolean; //; ALength: TSoundexLength = 4\r\nbegin\r\n Result:=SoundexSimilar(AText,AOther,4);\r\nend;\r\n\r\n\r\nFunction SoundexCompare(const AText, AOther: string; ALength: TSoundexLength): Integer;\r\nbegin\r\n Result:=AnsiCompareStr(Soundex(AText,ALength),Soundex(AOther,ALength));\r\nend;\r\n\r\n\r\nFunction SoundexCompare(const AText, AOther: string): Integer; //; ALength: TSoundexLength = 4\r\nbegin\r\n Result:=SoundexCompare(AText,AOther,4);\r\nend;\r\n\r\n\r\nFunction SoundexProc(const AText, AOther: string): Boolean;\r\nbegin\r\n Result:=SoundexSimilar(AText,AOther);\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n RxStrUtils-like functions.\r\n ---------------------------------------------------------------------}\r\n\r\n\r\n\r\nfunction IsEmptyStr(const S: string; const EmptyChars: Array of char): Boolean;\r\n\r\nvar\r\n i,l: SizeInt;\r\n\r\nbegin\r\n l:=Length(S);\r\n i:=1;\r\n Result:=True;\r\n while Result and (i<=l) do\r\n begin\r\n Result:=CharInSet(S[i],EmptyChars);\r\n Inc(i);\r\n end;\r\nend;\r\n\r\nfunction DelSpace(const S: String): string;\r\n\r\nbegin\r\n Result:=DelChars(S,' ');\r\nend;\r\n\r\nfunction DelChars(const S: string; Chr: Char): string;\r\n\r\nvar\r\n I,J: SizeInt;\r\n\r\nbegin\r\n Result:=S;\r\n I:=Length(Result);\r\n While I>0 do\r\n begin\r\n if Result[I]=Chr then\r\n begin\r\n J:=I-1;\r\n While (J>0) and (Result[J]=Chr) do\r\n Dec(j);\r\n Delete(Result,J+1,I-J);\r\n I:=J+1;\r\n end;\r\n dec(I);\r\n end;\r\nend;\r\n\r\nfunction DelSpace1(const S: string): string;\r\n\r\nvar\r\n I : SizeInt;\r\n\r\nbegin\r\n Result:=S;\r\n for i:=Length(Result) downto 2 do\r\n if (Result[i]=' ') and (Result[I-1]=' ') then\r\n Delete(Result,I,1);\r\nend;\r\n\r\nfunction Tab2Space(const S: string; Numb: Byte): string;\r\n\r\nvar\r\n I: SizeInt;\r\n\r\nbegin\r\n I:=1;\r\n Result:=S;\r\n while I <= Length(Result) do\r\n if Result[I]<>Chr(9) then\r\n inc(I)\r\n else\r\n begin\r\n Result[I]:=' ';\r\n If (Numb>1) then\r\n Insert(StringOfChar(' ',Numb-1),Result,I);\r\n Inc(I,Numb);\r\n end;\r\nend;\r\n\r\nfunction NPos(const C: string; S: string; N: Integer): SizeInt;\r\n\r\nvar\r\n i,p,k: SizeInt;\r\n\r\nbegin\r\n Result:=0;\r\n if N<1 then\r\n Exit;\r\n k:=0;\r\n i:=1;\r\n Repeat\r\n p:=pos(C,S);\r\n Inc(k,p);\r\n if p>0 then\r\n delete(S,1,p);\r\n Inc(i);\r\n Until (i>n) or (p=0);\r\n If (P>0) then\r\n Result:=K;\r\nend;\r\n\r\nfunction AddChar(C: Char; const S: string; N: Integer): string;\r\n\r\nVar\r\n l : SizeInt;\r\n\r\nbegin\r\n Result:=S;\r\n l:=Length(Result);\r\n if lN) do\r\n begin\r\n while (P<=PE) and CharInSet(S[P],WordDelims) do\r\n inc(P);\r\n if (P<=PE) then\r\n inc(Count);\r\n if (Count<>N) then\r\n while (P<=PE) and not CharInSet(S[P],WordDelims) do\r\n inc(P)\r\n else\r\n Result:=(P-PS)+1;\r\n end;\r\nend;\r\n\r\n\r\nfunction ExtractWord(N: Integer; const S: string; const WordDelims: Array of char): string;\r\nvar\r\n i: LongInt;\r\nbegin\r\n Result:=ExtractWordPos(N,S,WordDelims,i);\r\nend;\r\n\r\n\r\nfunction ExtractWordPos(N: Integer; const S: string; const WordDelims: Array of char; out Pos: Integer): string;\r\n\r\nvar\r\n i,j,l: SizeInt;\r\n\r\nbegin\r\n j:=0;\r\n i:=WordPosition(N, S, WordDelims);\r\n if (I>MaxInt) then\r\n begin\r\n Result:='';\r\n Pos:=-1;\r\n Exit;\r\n end;\r\n Pos:=i;\r\n if (i<>0) then\r\n begin\r\n j:=i;\r\n l:=Length(S);\r\n while (j<=L) and not CharInSet(S[j],WordDelims) do\r\n inc(j);\r\n end;\r\n Result:=Copy(S,I,j-I);\r\nend;\r\n\r\n\r\nfunction ExtractDelimited(N: Integer; const S: string; const Delims: Array of char): string;\r\nvar\r\n w,i,l,len: SizeInt;\r\nbegin\r\n w:=0;\r\n i:=1;\r\n l:=0;\r\n len:=Length(S);\r\n SetLength(Result, 0);\r\n while (i<=len) and (w<>N) do\r\n begin\r\n if CharInSet(S[i],Delims) then\r\n inc(w)\r\n else\r\n begin\r\n if (N-1)=w then\r\n begin\r\n inc(l);\r\n Result:=Result+S[i];\r\n end;\r\n end;\r\n inc(i);\r\n end;\r\nend;\r\n\r\n\r\nfunction ExtractSubstr(const S: string; var Pos: Integer; const Delims: Array of char): string;\r\n\r\nvar\r\n i,l: SizeInt;\r\n\r\nbegin\r\n i:=Pos;\r\n l:=Length(S);\r\n while (i<=l) and not CharInSet(S[i],Delims) do\r\n inc(i);\r\n Result:=Copy(S,Pos,i-Pos);\r\n while (i<=l) and CharInSet(S[i],Delims) do\r\n inc(i);\r\n if I>MaxInt then\r\n Pos:=MaxInt\r\n else\r\n Pos:=i;\r\nend;\r\n\r\nfunction isWordPresent(const W, S: string; const WordDelims: Array of char): Boolean;\r\n\r\nvar\r\n i,Count : SizeInt;\r\n\r\nbegin\r\n Result:=False;\r\n Count:=WordCount(S, WordDelims);\r\n I:=1;\r\n While (Not Result) and (I<=Count) do\r\n begin\r\n Result:=ExtractWord(i,S,WordDelims)=W;\r\n Inc(i);\r\n end;\r\nend;\r\n\r\n\r\nfunction Numb2USA(const S: string): string;\r\nvar\r\n i, NA: Integer;\r\nbegin\r\n i:=Length(S);\r\n Result:=S;\r\n NA:=0;\r\n while (i > 0) do begin\r\n if ((Length(Result) - i + 1 - NA) mod 3 = 0) and (i <> 1) then\r\n begin\r\n insert(',', Result, i);\r\n inc(NA);\r\n end;\r\n Dec(i);\r\n end;\r\nend;\r\n\r\nfunction PadCenter(const S: string; Len: SizeInt): string;\r\nbegin\r\n if Length(S)0 do\r\n begin\r\n C:=Number mod Base;\r\n if C>9 then\r\n C:=C+55\r\n else\r\n C:=C+48;\r\n Result:=Chr(C)+Result;\r\n Number:=Number div Base;\r\n end;\r\n end;\r\n if (Result<>'') then\r\n Result:=AddChar('0',Result,Len);\r\nend;\r\n\r\nfunction Numb2Dec(S: string; Base: Byte): Longint;\r\n\r\nvar\r\n i, P: sizeint;\r\n\r\nbegin\r\n i:=Length(S);\r\n Result:=0;\r\n S:=UpperCase(S);\r\n P:=1;\r\n while (i>=1) do\r\n begin\r\n if (S[i]>'@') then\r\n Result:=Result+(Ord(S[i])-55)*P\r\n else\r\n Result:=Result+(Ord(S[i])-48)*P;\r\n Dec(i);\r\n P:=P*Base;\r\n end;\r\nend;\r\n\r\nFunction RomanValues(C : Char) : Word;\r\n\r\nbegin\r\n Case c of\r\n 'C' : Result:=100;\r\n 'D' : Result:=500;\r\n 'I' : Result:=1;\r\n 'L' : Result:=50;\r\n 'M' : Result:=1000;\r\n 'V' : Result:=5;\r\n 'X' : Result:=10;\r\n else\r\n Result:=0;\r\n end;\r\nend;\r\n\r\nfunction RomanToIntDontCare(const S: String): Longint;\r\n{This was the original implementation of RomanToInt,\r\n it is internally used in TryRomanToInt when Strictness = rcsDontCare}\r\nconst\r\n RomanChars = ['C','D','I','L','M','V','X'];\r\n\r\nvar\r\n index, Next: Char;\r\n i,l: SizeInt;\r\n Negative: Boolean;\r\n\r\nbegin\r\n Result:=0;\r\n i:=0;\r\n Negative:=(Length(S)>0) and (S[1]='-');\r\n if Negative then\r\n inc(i);\r\n l:=Length(S);\r\n while (i 8\r\n - from M you can only subtract C\r\n - from D you can only subtract C\r\n - from C you can only subtract X\r\n - from L you can only subtract X\r\n - from X you can only subtract I\r\n - from V you can only subtract I\r\n * The numeral is parsed in \"groups\" (first M's, then D's etc.), the next group to be parsed\r\n must always be of a lower denomination than the previous one.\r\n Example: 'MMDCCXX' is allowed but 'MMCCXXDD' is not\r\n * There can only ever be 3 consecutive M's, C's, X's or I's\r\n * There can only ever be 1 D, 1 L and 1 V\r\n * After IX or IV there can be no more characters\r\n * Negative numbers are not supported\r\n // As a consequence the maximum allowed Roman numeral is MMMCMXCIX = 3999, also N can never become 0 (zero)\r\n\r\n - rcsRelaxed: Like rcsStrict but with the following exceptions:\r\n * An infinite number of (leading) M's is allowed\r\n * Up to 4 consecutive M's, C's, X's and I's are allowed\r\n // So this is allowed: 'MMMMMMCXIIII' = 6124\r\n\r\n - rcsDontCare:\r\n * no checking on the order of \"groups\" is done\r\n * there are no restrictions on the number of consecutive chars\r\n * negative numbers are supported\r\n * an empty string as input will return True and N will be 0\r\n * invalid input will return false\r\n // for backwards comatibility: it supports rather ludicrous input like '-IIIMIII' -> -(2+(1000-1)+3)=-1004\r\n}\r\n\r\nfunction TryRomanToInt(S: String; out N: LongInt; Strictness: TRomanConversionStrictness = rcsRelaxed): Boolean;\r\n\r\nvar\r\n i, Len: SizeInt;\r\n Terminated: Boolean;\r\n\r\nbegin\r\n Result := (False);\r\n S := UpperCase(S); //don't use AnsiUpperCase please\r\n Len := Length(S);\r\n if (Strictness = rcsDontCare) then\r\n begin\r\n N := RomanToIntDontCare(S);\r\n if (N = 0) then\r\n begin\r\n Result := (Len = 0);\r\n end\r\n else\r\n Result := True;\r\n Exit;\r\n end;\r\n if (Len = 0) then Exit;\r\n i := 1;\r\n N := 0;\r\n Terminated := False;\r\n //leading M's\r\n while (i <= Len) and ((Strictness <> rcsStrict) or (i < 4)) and (S[i] = 'M') do\r\n begin\r\n //writeln('TryRomanToInt: Found 1000');\r\n Inc(i);\r\n N := N + 1000;\r\n end;\r\n //then CM or or CD or D or (C, CC, CCC, CCCC)\r\n if (i <= Len) and (S[i] = 'D') then\r\n begin\r\n //writeln('TryRomanToInt: Found 500');\r\n Inc(i);\r\n N := N + 500;\r\n end\r\n else if (i + 1 <= Len) and (S[i] = 'C') then\r\n begin\r\n if (S[i+1] = 'M') then\r\n begin\r\n //writeln('TryRomanToInt: Found 900');\r\n Inc(i,2);\r\n N := N + 900;\r\n end\r\n else if (S[i+1] = 'D') then\r\n begin\r\n //writeln('TryRomanToInt: Found 400');\r\n Inc(i,2);\r\n N := N + 400;\r\n end;\r\n end ;\r\n //next max 4 or 3 C's, depending on Strictness\r\n if (i <= Len) and (S[i] = 'C') then\r\n begin\r\n //find max 4 C's\r\n //writeln('TryRomanToInt: Found 100');\r\n Inc(i);\r\n N := N + 100;\r\n if (i <= Len) and (S[i] = 'C') then\r\n begin\r\n //writeln('TryRomanToInt: Found 100');\r\n Inc(i);\r\n N := N + 100;\r\n end;\r\n if (i <= Len) and (S[i] = 'C') then\r\n begin\r\n //writeln('TryRomanToInt: Found 100');\r\n Inc(i);\r\n N := N + 100;\r\n end;\r\n if (Strictness <> rcsStrict) and (i <= Len) and (S[i] = 'C') then\r\n begin\r\n //writeln('TryRomanToInt: Found 100');\r\n Inc(i);\r\n N := N + 100;\r\n end;\r\n end;\r\n\r\n //then XC or XL\r\n if (i + 1 <= Len) and (S[i] = 'X') then\r\n begin\r\n if (S[i+1] = 'C') then\r\n begin\r\n //writeln('TryRomanToInt: Found 90');\r\n Inc(i,2);\r\n N := N + 90;\r\n end\r\n else if (S[i+1] = 'L') then\r\n begin\r\n //writeln('TryRomanToInt: Found 40');\r\n Inc(i,2);\r\n N := N + 40;\r\n end;\r\n end;\r\n\r\n //then L\r\n if (i <= Len) and (S[i] = 'L') then\r\n begin\r\n //writeln('TryRomanToInt: Found 50');\r\n Inc(i);\r\n N := N + 50;\r\n end;\r\n\r\n //then (X, xx, xxx, xxxx)\r\n if (i <= Len) and (S[i] = 'X') then\r\n begin\r\n //find max 3 or 4 X's, depending on Strictness\r\n //writeln('TryRomanToInt: Found 10');\r\n Inc(i);\r\n N := N + 10;\r\n if (i <= Len) and (S[i] = 'X') then\r\n begin\r\n //writeln('TryRomanToInt: Found 10');\r\n Inc(i);\r\n N := N + 10;\r\n end;\r\n if (i <= Len) and (S[i] = 'X') then\r\n begin\r\n //writeln('TryRomanToInt: Found 10');\r\n Inc(i);\r\n N := N + 10;\r\n end;\r\n if (Strictness <> rcsStrict) and (i <= Len) and (S[i] = 'X') then\r\n begin\r\n //writeln('TryRomanToInt: Found 10');\r\n Inc(i);\r\n N := N + 10;\r\n end;\r\n end;\r\n\r\n //then IX or IV\r\n if (i + 1 <= Len) and (S[i] = 'I') then\r\n begin\r\n if (S[i+1] = 'X') then\r\n begin\r\n Terminated := (True);\r\n //writeln('TryRomanToInt: Found 9');\r\n Inc(i,2);\r\n N := N + 9;\r\n end\r\n else if (S[i+1] = 'V') then\r\n begin\r\n Terminated := (True);\r\n //writeln('TryRomanToInt: Found 4');\r\n Inc(i,2);\r\n N := N + 4;\r\n end;\r\n end;\r\n\r\n //then V\r\n if (not Terminated) and (i <= Len) and (S[i] = 'V') then\r\n begin\r\n //writeln('TryRomanToInt: Found 5');\r\n Inc(i);\r\n N := N + 5;\r\n end;\r\n\r\n\r\n //then I\r\n if (not Terminated) and (i <= Len) and (S[i] = 'I') then\r\n begin\r\n Terminated := (True);\r\n //writeln('TryRomanToInt: Found 1');\r\n Inc(i);\r\n N := N + 1;\r\n //Find max 2 or 3 closing I's, depending on strictness\r\n if (i <= Len) and (S[i] = 'I') then\r\n begin\r\n //writeln('TryRomanToInt: Found 1');\r\n Inc(i);\r\n N := N + 1;\r\n end;\r\n if (i <= Len) and (S[i] = 'I') then\r\n begin\r\n //writeln('TryRomanToInt: Found 1');\r\n Inc(i);\r\n N := N + 1;\r\n end;\r\n if (Strictness <> rcsStrict) and (i <= Len) and (S[i] = 'I') then\r\n begin\r\n //writeln('TryRomanToInt: Found 1');\r\n Inc(i);\r\n N := N + 1;\r\n end;\r\n end;\r\n\r\n //writeln('TryRomanToInt: Len = ',Len,' i = ',i);\r\n Result := (i > Len);\r\n //if Result then writeln('TryRomanToInt: N = ',N);\r\n\r\nend;\r\n\r\nfunction RomanToInt(const S: string; Strictness: TRomanConversionStrictness = rcsRelaxed): Longint;\r\nbegin\r\n if not TryRomanToInt(S, Result, Strictness) then\r\n raise EConvertError.CreateFmt(SInvalidRomanNumeral,[S]);\r\nend;\r\n\r\nfunction RomanToIntDef(const S: String; const ADefault: Longint;\r\n Strictness: TRomanConversionStrictness): Longint;\r\nbegin\r\n if not TryRomanToInt(S, Result, Strictness) then\r\n Result := ADefault;\r\nend;\r\n\r\n\r\n\r\n\r\nfunction intToRoman(Value: Longint): string;\r\n\r\nconst\r\n Arabics : Array[1..13] of Integer\r\n = (1,4,5,9,10,40,50,90,100,400,500,900,1000);\r\n Romans : Array[1..13] of String\r\n = ('I','IV','V','IX','X','XL','L','XC','C','CD','D','CM','M');\r\n\r\nvar\r\n i: Integer;\r\n\r\nbegin\r\n Result:='';\r\n for i:=13 downto 1 do\r\n while (Value >= Arabics[i]) do\r\n begin\r\n Value:=Value-Arabics[i];\r\n Result:=Result+Romans[i];\r\n end;\r\nend;\r\n\r\nfunction intToBin(Value: Longint; Digits, Spaces: Integer): string;\r\n\r\nvar endpos : integer;\r\n p,p2: integer;\r\n k: integer;\r\n\r\nbegin\r\n Result:='';\r\n if (Digits>32) then\r\n Digits:=32;\r\n if (spaces=0) then\r\n begin\r\n result:=inttobin(value,digits);\r\n exit;\r\n end;\r\n endpos:=digits+ (digits-1) div spaces;\r\n setlength(result,endpos);\r\n p:=endpos;\r\n p2:=1;\r\n k:=spaces;\r\n while (p>=p2) do\r\n begin\r\n if k=0 then\r\n begin\r\n Result[p]:=' ';\r\n dec(p);\r\n k:=spaces;\r\n end;\r\n Result[P]:=chr(48+(cardinal(value) and 1));\r\n value:=cardinal(value) shr 1;\r\n dec(p); \r\n dec(k);\r\n end;\r\nend;\r\n\r\nfunction intToBin(Value: Longint; Digits:integer): string;\r\n\r\nvar\r\n p,p2 : integer;\r\n\r\nbegin\r\n result:='';\r\n if digits<=0 then exit;\r\n setlength(result,digits);\r\n p:=digits;\r\n p2:=1;\r\n // typecasts because we want to keep intto* delphi compat and take an integer\r\n while (p>=p2) and (cardinal(value)>0) do \r\n begin\r\n Result[p]:=chr(48+(cardinal(value) and 1));\r\n value:=cardinal(value) shr 1;\r\n dec(p); \r\n end;\r\n digits:=p-p2+1;\r\n While digits>0 do\r\n begin\r\n Result[Digits]:=Chr(48);\r\n Dec(Digits);\r\n end;\r\nend;\r\n\r\nfunction IntToBin(Value: NativeInt; Digits:integer): string;\r\nvar\r\n p,p2 : integer;\r\nbegin\r\n result:='';\r\n if digits<=0 then exit;\r\n setlength(result,digits);\r\n p:=digits;\r\n p2:=1;\r\n // typecasts because we want to keep intto* delphi compat and take a signed val\r\n // and avoid warnings\r\n while (p>=p2) and (value>0) do\r\n begin\r\n Result[p]:=chr(48+(cardinal(value) and 1));\r\n value:=value div 2;\r\n dec(p); \r\n end;\r\n digits:=p-p2+1;\r\n While digits>0 do\r\n result[digits]:=#48;\r\nend;\r\n\r\n\r\nfunction FindPart(const HelpWilds, inputStr: string): SizeInt;\r\nvar\r\n Diff, i, J: SizeInt;\r\n\r\nbegin\r\n Result:=0;\r\n i:=Pos('?',HelpWilds);\r\n if (i=0) then\r\n Result:=Pos(HelpWilds, inputStr)\r\n else\r\n begin\r\n Diff:=Length(inputStr) - Length(HelpWilds);\r\n for i:=0 to Diff do\r\n begin\r\n for J:=1 to Length(HelpWilds) do\r\n if (inputStr[i + J] = HelpWilds[J]) or (HelpWilds[J] = '?') then\r\n begin\r\n if (J=Length(HelpWilds)) then\r\n begin\r\n Result:=i+1;\r\n Exit;\r\n end;\r\n end\r\n else\r\n Break;\r\n end;\r\n end;\r\nend;\r\n\r\nFunction isMatch(level : integer;inputstr,wilds : string; CWild, CinputWord: SizeInt;MaxInputword,maxwilds : SizeInt; Out EOS : Boolean) : Boolean;\r\n\r\nbegin\r\n EOS:=False;\r\n Result:=True;\r\n repeat\r\n if Wilds[CWild] = '*' then { handling of '*' }\r\n begin\r\n inc(CWild);\r\n while Wilds[CWild] = '?' do { equal to '?' }\r\n begin\r\n { goto next letter }\r\n inc(CWild);\r\n inc(CinputWord);\r\n end;\r\n { increase until a match }\r\n Repeat\r\n while (inputStr[CinputWord]<>Wilds[CWild]) and (CinputWord <= MaxinputWord) do\r\n inc(CinputWord);\r\n Result:=isMatch(Level+1,inputstr,wilds,CWild, CinputWord,MaxInputword,maxwilds,EOS);\r\n if not Result then\r\n Inc(cInputWord);\r\n Until Result or (CinputWord>=MaxinputWord);\r\n if Result and EOS then\r\n Exit;\r\n Continue;\r\n end;\r\n if Wilds[CWild] = '?' then { equal to '?' }\r\n begin\r\n { goto next letter }\r\n inc(CWild);\r\n inc(CinputWord);\r\n Continue;\r\n end;\r\n if inputStr[CinputWord] = Wilds[CWild] then { equal letters }\r\n begin\r\n { goto next letter }\r\n inc(CWild);\r\n inc(CinputWord);\r\n Continue;\r\n end;\r\n Result:=false;\r\n Exit;\r\n until (CinputWord > MaxinputWord) or (CWild > MaxWilds);\r\n { no completed evaluation, we need to check what happened }\r\n if (CinputWord <= MaxinputWord) or (CWild < MaxWilds) then\r\n Result:=false\r\n else if (CWild>Maxwilds) then\r\n EOS:=False\r\n else\r\n begin\r\n EOS:=Wilds[CWild]='*';\r\n if not EOS then\r\n Result:=False;\r\n end\r\nend;\r\n\r\nfunction isWild(inputStr, Wilds: string; ignoreCase: boolean): boolean;\r\n\r\nvar\r\n i: SizeInt;\r\n MaxinputWord, MaxWilds: SizeInt; { Length of inputStr and Wilds }\r\n eos : Boolean;\r\n\r\nbegin\r\n Result:=true;\r\n if Wilds = inputStr then\r\n Exit;\r\n { delete '**', because '**' = '*' }\r\n i:=Pos('**', Wilds);\r\n while i > 0 do\r\n begin\r\n Delete(Wilds, i, 1);\r\n i:=Pos('**', Wilds);\r\n end;\r\n if Wilds = '*' then { for fast end, if Wilds only '*' }\r\n Exit;\r\n MaxinputWord:=Length(inputStr);\r\n MaxWilds:=Length(Wilds);\r\n if (MaxWilds = 0) or (MaxinputWord = 0) then\r\n begin\r\n Result:=false;\r\n Exit;\r\n end;\r\n if ignoreCase then { upcase all letters }\r\n begin\r\n inputStr:=UpperCase(inputStr);\r\n Wilds:=UpperCase(Wilds);\r\n end;\r\n Result:=isMatch(1,inputStr,wilds,1,1,MaxinputWord, MaxWilds,EOS);\r\nend;\r\n\r\n\r\nfunction XorString(const Key, Src: String): String;\r\nvar\r\n i: SizeInt;\r\nbegin\r\n Result:=Src;\r\n if Length(Key) > 0 then\r\n for i:=1 to Length(Src) do\r\n Result[i]:=Chr(Ord(Key[1 + ((i - 1) mod Length(Key))]) xor Ord(Src[i]));\r\nend;\r\n\r\nfunction XorEncode(const Key, Source: string): string;\r\n\r\nvar\r\n i: Integer;\r\n C: Byte;\r\n\r\nbegin\r\n Result:='';\r\n for i:=1 to Length(Source) do\r\n begin\r\n if Length(Key) > 0 then\r\n C:=Ord(Key[1 + ((i - 1) mod Length(Key))]) xor Ord(Source[i])\r\n else\r\n C:=Ord(Source[i]);\r\n Result:=Result+LowerCase(intToHex(C, 2));\r\n end;\r\nend;\r\n\r\nfunction XorDecode(const Key, Source: string): string;\r\nvar\r\n i: Integer;\r\n C: Char;\r\nbegin\r\n Result:='';\r\n for i:=0 to Length(Source) div 2 - 1 do\r\n begin\r\n C:=Chr(StrTointDef('$' + Copy(Source, (i * 2) + 1, 2), Ord(' ')));\r\n if Length(Key) > 0 then\r\n C:=Chr(Ord(Key[1 + (i mod Length(Key))]) xor Ord(C));\r\n Result:=Result + C;\r\n end;\r\nend;\r\n\r\nfunction GetCmdLineArg(const Switch: string; SwitchChars: Array of char): string;\r\nvar\r\n i: Integer;\r\n S: string;\r\nbegin\r\n i:=1;\r\n Result:='';\r\n while (Result='') and (i<=ParamCount) do\r\n begin\r\n S:=ParamStr(i);\r\n if (Length(SwitchChars)=0) or (CharInSet(S[1],SwitchChars) and (Length(S) > 1)) and\r\n (CompareText(Copy(S,2,Length(S)-1),Switch)=0) then\r\n begin\r\n inc(i);\r\n if i<=ParamCount then\r\n Result:=ParamStr(i);\r\n end;\r\n inc(i);\r\n end;\r\nend;\r\n\r\nFunction RPosEX(C:char;const S : String;offs:cardinal):SizeInt; overload;\r\n\r\nBegin\r\n Result:=TJSString.New(S).lastIndexOf(c,offs-1)+1;\r\nEnd;\r\n\r\nFunction RPos(c:char;const S : String):SizeInt;\r\n\r\nbegin\r\n Result:=RPosEx(string(C),S,Length(S));\r\nend;\r\n\r\nFunction RPos (Const Substr : String; Const Source : String) : SizeInt; overload;\r\nbegin\r\n Result:=RPosEx(SubStr,Source,Length(Source));\r\nend;\r\n\r\nFunction RPosex (Const Substr : String; Const Source : String;offs:cardinal) : SizeInt; overload;\r\n\r\nbegin\r\n Result:=TJSString.New(Source).lastIndexOf(SubStr,offs-1)+1;\r\nend;\r\n\r\nfunction possetex (const c:Array of char;const s : String;count:Integer ):SizeInt;\r\n\r\nvar i,j:SizeInt;\r\n\r\nbegin\r\n if s='' then\r\n j:=0\r\n else\r\n begin\r\n i:=length(s);\r\n j:=count;\r\n if j>i then\r\n begin\r\n result:=0;\r\n exit;\r\n end;\r\n while (j<=i) and (not CharInSet(s[j],c)) do inc(j);\r\n if (j>i) then\r\n j:=0; // not found.\r\n end;\r\n result:=j;\r\nend;\r\n\r\nfunction PosSetEx (const c:string;const s : String;count:Integer ):SizeInt;\r\n\r\nvar\r\n cset : Array of char;\r\n i,l : SizeInt;\r\nbegin\r\n L:=Length(C);\r\n SetLength(Cset,L);\r\n if L>0 then\r\n for i:=1 to l do\r\n cset[i-1]:=c[i];\r\n Result:=PosSetEx(cset,s,count);\r\nend;\r\n\r\nfunction posset (const c:Array of char;const s : String ):SizeInt;\r\n\r\nbegin\r\n result:=possetex(c,s,1);\r\nend;\r\n\r\nfunction PosSet (const c:string;const s : String ):SizeInt;\r\n\r\nbegin\r\n Result:=PosSetEx(c,S,1);\r\nend;\r\n\r\n\r\nProcedure Removeleadingchars(Var S : String; Const CSet:Array of char);\r\n\r\nvar\r\n I,J : Longint;\r\n\r\nbegin\r\n I:=Length(S);\r\n if (I>0) then\r\n begin\r\n J:=1;\r\n while (J<=I) and CharInSet(S[J],CSet) DO\r\n inc(J);\r\n if J>1 then\r\n Delete(S,1,J-1);\r\n end;\r\nend;\r\n\r\n\r\nfunction TrimLeftSet(const S: String;const CSet:Array of char): String;\r\n\r\nbegin\r\n result:=s;\r\n removeleadingchars(result,cset); \r\nend;\r\n\r\nProcedure RemoveTrailingChars(VAR S : String;Const CSet:Array of char);\r\n\r\nvar\r\n i,j : longint;\r\n\r\nbegin\r\n I:=Length(S);\r\n if (I>0) then\r\n begin\r\n J:=I;\r\n while (j>0) and CharInSet(S[J],CSet) do\r\n dec(J);\r\n if J<>I then\r\n setLength(S,J);\r\n End;\r\nEnd;\r\n\r\nFunction TrimRightSet(const S: String;const CSet:Array of char): String;\r\n\r\nbegin\r\n result:=s;\r\n RemoveTrailingchars(result,cset); \r\nend;\r\n\r\nProcedure RemovePadChars(VAR S : String;Const CSet:Array of char);\r\n\r\nvar\r\n I,J,K: longint;\r\n\r\nbegin\r\n I:=Length(S);\r\n if I=0 then exit;\r\n J:=I;\r\n while (j>0) and CharInset(S[J],CSet) do\r\n dec(J);\r\n if j=0 Then\r\n begin\r\n s:='';\r\n exit;\r\n end;\r\n SetLength(S,J);\r\n I:=J;\r\n k:=1;\r\n while (k<=I) and CharInSet(S[k],CSet) do\r\n inc(k);\r\n if k>1 Then\r\n Delete(S,1,K-1);\r\nend;\r\n\r\nfunction TrimSet(const S: String;const CSet:Array of char): String;\r\n\r\nbegin\r\n Result:=s;\r\n RemovePadChars(Result,cset);\r\nend;\r\n\r\nfunction SplitString(const S, Delimiters: string): TStringDynArray;\r\nbegin\r\n Result:=S.Split(Delimiters);\r\nend;\r\n\r\nfunction StartsText(const ASubText, AText: string): Boolean;\r\nbegin\r\n Result := AnsiStartsText(ASubText, AText);\r\nend;\r\n\r\n\r\nfunction EndsText(const ASubText, AText: string): Boolean;\r\nbegin\r\n Result := AnsiEndsText(ASubText, AText);\r\nend;\r\n\r\nfunction ResemblesText(const AText, AOther: string): Boolean;\r\nbegin\r\n if Assigned(ResemblesProc) then\r\n Result := ResemblesProc(AText, AOther)\r\n else\r\n Result := False;\r\nend;\r\n\r\nfunction ContainsText(const AText, ASubText: string): Boolean;\r\nbegin\r\n Result := AnsiContainsText(AText, ASubText);\r\nend;\r\n\r\nfunction MatchText(const AText: string; const AValues: array of string): Boolean;\r\nbegin\r\n Result := AnsiMatchText(AText, AValues);\r\nend;\r\n\r\nfunction IndexText(const AText: string; const AValues: array of string): Integer;\r\nbegin\r\n Result := AnsiIndexText(AText, AValues);\r\nend;\r\n\r\nfunction ContainsStr(const AText, ASubText: string): Boolean;\r\nbegin\r\n Result := AnsiContainsStr(AText, ASubText);\r\nend;\r\n\r\nFunction StartsStr(const ASubText, AText: string): Boolean;\r\n\r\nbegin\r\n Result := AnsiStartsStr(AText, ASubText);\r\nend;\r\n\r\nFunction EndsStr(const ASubText, AText: string): Boolean;\r\n\r\nbegin\r\n Result := AnsiEndsStr(AText, ASubText);\r\nend;\r\n\r\n\r\ninitialization\r\n AnsiResemblesProc:= @SoundexProc;\r\n ResemblesProc:=@SoundexProc;\r\n\r\nend.\r\n","unit Generics.Strings;\r\n\r\n{$Mode Delphi}\r\n\r\ninterface\r\n\r\nresourcestring\r\n SArgumentOutOfRange = 'Argument out of range';\r\n //SArgumentNilNode = 'Node is nil';\r\n //SDuplicatesNotAllowed = 'Duplicates not allowed in dictionary';\r\n //SCollectionInconsistency = 'Collection inconsistency';\r\n //SCollectionDuplicate = 'Collection does not allow duplicates';\r\n //SDictionaryKeyDoesNotExist = 'Dictionary key does not exist';\r\n //SItemNotFound = 'Item not found';\r\n\r\nimplementation\r\n\r\nend.\r\n\r\n","unit Generics.Defaults;\r\n\r\n{$MODE DELPHI}\r\n\r\ninterface\r\n\r\n//uses Classes;\r\n\r\ntype\r\n\r\n { IComparer }\r\n\r\n IComparer = interface ['{505778ED-F783-4456-9691-32F419CC5E18}']\r\n function Compare(const Left, Right: T): Integer; overload;\r\n end;\r\n\r\n TOnComparison = reference to function(const Left, Right: T): Integer;\r\n\r\n { TComparer }\r\n\r\n TComparer = class(TInterfacedObject, IComparer)\r\n private\r\n type TMyComparer = TComparer;\r\n class var DefaultComparer: TMyComparer;\r\n public\r\n class function Default: IComparer; static;\r\n function Compare(const ALeft, ARight: T): Integer; virtual; abstract; overload;\r\n\r\n class function Construct(const AComparison: TOnComparison): IComparer; overload;\r\n end;\r\n\r\n { TDefaultComparer }\r\n\r\n TDefaultComparer = class(TComparer)\r\n public\r\n function Compare(const ALeft, ARight: T): Integer; override; overload;\r\n end;\r\n\r\n { TDelegatedComparerEvents }\r\n\r\n TDelegatedComparerEvents = class(TComparer)\r\n private\r\n FComparison: TOnComparison;\r\n public\r\n function Compare(const ALeft, ARight: T): Integer; override;\r\n constructor Create(AComparison: TOnComparison);\r\n end;\r\n\r\n IEnumerator = interface\r\n function GetCurrent: T;\r\n function MoveNext: Boolean;\r\n procedure Reset;\r\n property Current: T read GetCurrent;\r\n end;\r\n\r\n IEnumerable = interface\r\n function GetEnumerator: IEnumerator;\r\n end;\r\n\r\nimplementation\r\n\r\n{ TComparer }\r\n\r\nclass function TComparer.Default: IComparer;\r\nbegin\r\n if DefaultComparer=nil then\r\n DefaultComparer:=TDefaultComparer.Create;\r\n Result:=DefaultComparer;\r\nend;\r\n\r\nclass function TComparer.Construct(const AComparison: TOnComparison\r\n ): IComparer;\r\nbegin\r\n Result := TDelegatedComparerEvents.Create(AComparison);\r\nend;\r\n\r\n{ TDefaultComparer }\r\n\r\nfunction TDefaultComparer.Compare(const ALeft, ARight: T): Integer;\r\nbegin\r\n asm\r\n if (ALeft < ARight) return -1;\r\n if (ALeft > ARight) return 1;\r\n end;\r\n Result:=0;\r\n if ALeft = ARight then exit;\r\nend;\r\n\r\n{ TDelegatedComparerEvents }\r\n\r\nfunction TDelegatedComparerEvents.Compare(const ALeft, ARight: T\r\n ): Integer;\r\nbegin\r\n Result := FComparison(ALeft, ARight);\r\nend;\r\n\r\nconstructor TDelegatedComparerEvents.Create(AComparison: TOnComparison);\r\nbegin\r\n Inherited create;\r\n FComparison := AComparison;\r\nend;\r\n\r\n\r\nend.\r\n\r\n","unit Generics.Collections;\r\n\r\n{$Mode Delphi}\r\n{$COperators On}\r\n\r\ninterface\r\n\r\nuses\r\n Classes, SysUtils, rtlconsts, Types,\r\n {$IFDEF Pas2js}JS,{$ENDIF}\r\n Generics.Strings, Generics.Defaults;\r\n\r\ntype\r\n TCollectionNotification = (cnAdded, cnRemoved, cnExtracted);\r\n TCollectionNotifyEvent = procedure(ASender: TObject; const AItem: T;\r\n AAction: TCollectionNotification) of object;\r\n\r\n { TBinarySearchResult }\r\n\r\n TBinarySearchResult = record\r\n FoundIndex, CandidateIndex: SizeInt;\r\n CompareResult: SizeInt;\r\n end;\r\n\r\n { TCustomArrayHelper }\r\n\r\n TCustomArrayHelper = class abstract\r\n protected\r\n class procedure QuickSort(var AValues: array of T; ALeft, ARight: SizeInt;\r\n const AComparer: IComparer); virtual; abstract;\r\n public\r\n //class procedure Sort(var AValues: array of T); overload;\r\n class procedure Sort(var AValues: array of T;\r\n const AComparer: IComparer); overload;\r\n class procedure Sort(var AValues: array of T;\r\n const AComparer: IComparer; AIndex, ACount: SizeInt); overload;\r\n\r\n class function BinarySearch(const AValues: array of T; const AItem: T;\r\n out ASearchResult: TBinarySearchResult; const AComparer: IComparer;\r\n AIndex, ACount: SizeInt): Boolean; virtual; abstract; overload;\r\n class function BinarySearch(const AValues: array of T; const AItem: T;\r\n out AFoundIndex: SizeInt; const AComparer: IComparer;\r\n AIndex, ACount: SizeInt): Boolean; virtual; abstract; overload;\r\n class function BinarySearch(const AValues: array of T; const AItem: T;\r\n out AFoundIndex: SizeInt; const AComparer: IComparer): Boolean; overload;\r\n class function BinarySearch(const AValues: array of T; const AItem: T;\r\n out ASearchResult: TBinarySearchResult; const AComparer: IComparer): Boolean; overload;\r\n // No support for automatically creating a comparer.\r\n // class function BinarySearch(const AValues: array of T; const AItem: T;\r\n // out AFoundIndex: SizeInt): Boolean; overload;\r\n // class function BinarySearch(const AValues: array of T; const AItem: T;\r\n // out ASearchResult: TBinarySearchResult): Boolean; overload;\r\n end;\r\n\r\n { TArrayHelper }\r\n\r\n TArrayHelper = class(TCustomArrayHelper)\r\n protected\r\n class procedure QuickSort(var AValues: array of T; ALeft, ARight: SizeInt;\r\n const AComparer: IComparer); override;\r\n public\r\n class function BinarySearch(const AValues: array of T; const AItem: T;\r\n out ASearchResult: TBinarySearchResult; const AComparer: IComparer;\r\n AIndex, ACount: SizeInt): Boolean; override; overload;\r\n class function BinarySearch(const AValues: array of T; const AItem: T;\r\n out AFoundIndex: SizeInt; const AComparer: IComparer;\r\n AIndex, ACount: SizeInt): Boolean; override; overload;\r\n end;\r\n\r\n { TEnumerator }\r\n\r\n TEnumerator = class abstract\r\n protected\r\n function DoGetCurrent: T; virtual; abstract;\r\n function DoMoveNext: boolean; virtual; abstract;\r\n public\r\n property Current: T read DoGetCurrent;\r\n function MoveNext: boolean;\r\n end;\r\n\r\n { TEnumerable }\r\n\r\n TEnumerable = class abstract\r\n protected\r\n type\r\n TMyEnumerator = TEnumerator;\r\n function DoGetEnumerator: TMyEnumerator; virtual; abstract;\r\n public\r\n type\r\n TMyArray = TArray;\r\n function GetEnumerator: TMyEnumerator; inline;\r\n function ToArray: TMyArray; virtual;\r\n end;\r\n\r\n { TCustomList }\r\n\r\n TCustomList = class abstract(TEnumerable)\r\n private\r\n FOnNotify: TCollectionNotifyEvent;\r\n function GetCapacity: SizeInt; inline;\r\n protected\r\n type TMyArrayHelper = TArrayHelper;\r\n protected\r\n FLength: SizeInt;\r\n FItems: array of T;\r\n function PrepareAddingItem: SizeInt; virtual;\r\n function PrepareAddingRange(ACount: SizeInt): SizeInt; virtual;\r\n procedure Notify(const AValue: T; ACollectionNotification: TCollectionNotification); virtual;\r\n function DoRemove(AIndex: SizeInt; ACollectionNotification: TCollectionNotification): T; virtual;\r\n procedure SetCapacity(AValue: SizeInt); virtual; abstract;\r\n function GetCount: SizeInt; virtual;\r\n public\r\n property Count: SizeInt read GetCount;\r\n property Capacity: SizeInt read GetCapacity write SetCapacity;\r\n property OnNotify: TCollectionNotifyEvent read FOnNotify write FOnNotify;\r\n procedure TrimExcess; virtual; abstract;\r\n end;\r\n\r\n { TCustomListEnumerator }\r\n\r\n TCustomListEnumerator = class abstract(TEnumerator)\r\n private\r\n FList: TCustomList;\r\n FIndex: SizeInt;\r\n protected\r\n function DoMoveNext: boolean; override;\r\n function DoGetCurrent: T; override;\r\n function GetCurrent: T; virtual;\r\n public\r\n constructor Create(AList: TCustomList);\r\n end;\r\n\r\n { TCustomInvertedListEnumerator }\r\n\r\n TCustomInvertedListEnumerator = class abstract(TEnumerator)\r\n private\r\n FList: TCustomList;\r\n FIndex: SizeInt;\r\n protected\r\n function DoMoveNext: boolean; override;\r\n function DoGetCurrent: T; override;\r\n function GetCurrent: T; virtual;\r\n public\r\n constructor Create(AList: TCustomList);\r\n end;\r\n\r\n { TList }\r\n{$SCOPEDENUMS ON}\r\n TDirection = (FromBeginning,fromEnd);\r\n{$SCOPEDENUMS OFF}\r\n\r\n TList = class(TCustomList)\r\n private\r\n FComparer: IComparer;\r\n function SameValue(const Left, Right: T): Boolean;\r\n protected\r\n procedure SetCapacity(AValue: SizeInt); override;\r\n procedure SetCount(AValue: SizeInt);\r\n procedure InitializeList; virtual;\r\n procedure InternalInsert(AIndex: SizeInt; const AValue: T);\r\n function DoGetEnumerator: TEnumerator; override;\r\n private\r\n function GetItem(AIndex: SizeInt): T;\r\n procedure SetItem(AIndex: SizeInt; const AValue: T);\r\n public\r\n type\r\n TEnumerator = class(TCustomListEnumerator);\r\n TMyType = TList;\r\n function GetEnumerator: TEnumerator; reintroduce;\r\n public\r\n constructor Create; overload;\r\n constructor Create(const AComparer: IComparer); overload;\r\n constructor Create(ACollection: TEnumerable); overload;\r\n\r\n destructor Destroy; override;\r\n\r\n function Add(const AValue: T): SizeInt; virtual;\r\n procedure AddRange(const AValues: array of T); virtual; overload;\r\n procedure AddRange(const AEnumerable: IEnumerable); overload;\r\n procedure AddRange(AEnumerable: TEnumerable); overload;\r\n\r\n procedure Insert(AIndex: SizeInt; const AValue: T); virtual;\r\n procedure InsertRange(AIndex: SizeInt; const AValues: array of T); virtual; overload;\r\n procedure InsertRange(AIndex: SizeInt; const AEnumerable: IEnumerable); overload;\r\n procedure InsertRange(AIndex: SizeInt; const AEnumerable: TEnumerable); overload;\r\n\r\n function Remove(const AValue: T): SizeInt;\r\n function RemoveItem(const AValue: T; Direction : TDirection): SizeInt;\r\n procedure Delete(AIndex: SizeInt); inline;\r\n procedure DeleteRange(AIndex, ACount: SizeInt);\r\n function ExtractIndex(const AIndex: SizeInt): T; overload;\r\n function Extract(const AValue: T): T; overload;\r\n\r\n procedure Exchange(AIndex1, AIndex2: SizeInt); virtual;\r\n procedure Move(AIndex, ANewIndex: SizeInt); virtual;\r\n\r\n function First: T; inline;\r\n function Last: T; inline;\r\n\r\n procedure Clear;\r\n\r\n function Contains(const AValue: T): Boolean; inline;\r\n function IndexOf(const AValue: T): SizeInt; virtual;\r\n function LastIndexOf(const AValue: T): SizeInt; virtual;\r\n\r\n procedure Reverse;\r\n\r\n procedure TrimExcess; override;\r\n\r\n procedure Sort; overload;\r\n procedure Sort(const AComparer: IComparer); overload;\r\n function BinarySearch(const AItem: T; out AIndex: SizeInt): Boolean; overload;\r\n function BinarySearch(const AItem: T; out AIndex: SizeInt; const AComparer: IComparer): Boolean; overload;\r\n\r\n property Count: SizeInt read FLength write SetCount;\r\n property Items[Index: SizeInt]: T read GetItem write SetItem; default;\r\n end;\r\n\r\n\r\n TObjectList = class(TList)\r\n private\r\n FObjectsOwner: Boolean;\r\n protected\r\n procedure Notify(const aValue: T; Action: TCollectionNotification); override;\r\n public\r\n constructor Create(aOwnsObjects: Boolean = True); overload;\r\n constructor Create(const AComparer: IComparer; aOwnsObjects: Boolean = True); overload;\r\n constructor Create(const aCollection: TEnumerable; aOwnsObjects: Boolean = True); overload;\r\n property OwnsObjects: Boolean read FObjectsOwner write FObjectsOwner;\r\n end;\r\n\r\n { TThreadList }\r\n // This is provided for delphi/FPC compatibility\r\n // No locking is done, since Javascript is single-threaded. We do keep a lock count for debugging purposes.\r\n\r\n TThreadList = class\r\n private\r\n FList: TList;\r\n FLock: Integer;\r\n FDuplicates: TDuplicates;\r\n public\r\n constructor Create;\r\n destructor Destroy; override;\r\n procedure Add(const Item: T);\r\n procedure Clear;\r\n function LockList: TList;\r\n procedure Remove(const Item: T); inline;\r\n procedure RemoveItem(const Item: T; Direction: TDirection);\r\n procedure UnlockList; inline;\r\n property Duplicates: TDuplicates read FDuplicates write FDuplicates;\r\n end;\r\n\r\n { TQueue }\r\n\r\n TQueue = class(TCustomList)\r\n private\r\n FMaxGapLength: Integer;\r\n FLow: SizeInt;\r\n protected\r\n function DoGetEnumerator: TEnumerator; override;\r\n public\r\n type\r\n TMyType = TQueue;\r\n { TEnumerator }\r\n TEnumerator = class(TCustomListEnumerator)\r\n public\r\n constructor Create(AQueue: TMyType);\r\n end;\r\n function GetEnumerator: TEnumerator; reintroduce;\r\n protected\r\n Procedure Rebase; virtual;\r\n procedure SetCapacity(AValue: SizeInt); override;\r\n function DoRemove(AIndex: SizeInt; ACollectionNotification: TCollectionNotification): T; override;\r\n function GetCount: SizeInt; override;\r\n public\r\n Constructor Create; overload;\r\n constructor Create(ACollection: TEnumerable); overload;\r\n destructor Destroy; override;\r\n procedure Enqueue(const AValue: T);\r\n function Dequeue: T;\r\n function Extract: T;\r\n function Peek: T;\r\n procedure Clear;\r\n procedure TrimExcess; override;\r\n // Maximum gap (=amount of empty slots in array before first element)\r\n // before doing a rebase of the list. Defaults to 10.\r\n Property MaxGapLength : Integer Read FMaxGapLength Write FMaxGapLength;\r\n end;\r\n\r\n { TObjectQueue }\r\n\r\n TObjectQueue = class(TQueue)\r\n private\r\n FOwnsObjects: Boolean;\r\n protected\r\n procedure Notify(const Value: T; Action: TCollectionNotification); override;\r\n public\r\n constructor Create(AOwnsObjects: Boolean = True); overload;\r\n constructor Create(const Collection: TEnumerable; AOwnsObjects: Boolean = True); overload;\r\n procedure Dequeue; reintroduce; // Can't use the result, it might have been freed;\r\n property OwnsObjects: Boolean read FOwnsObjects write FOwnsObjects;\r\n end;\r\n\r\n { TStack }\r\n\r\n TStack = class(TCustomList)\r\n private\r\n protected\r\n function DoRemove(AIndex: SizeInt; ACollectionNotification: TCollectionNotification): T; override;\r\n procedure SetCapacity(AValue: SizeInt); override;\r\n function DoGetEnumerator: TEnumerator; override;\r\n public\r\n type\r\n TMyType = TStack;\r\n\r\n { TEnumerator }\r\n\r\n TEnumerator = class(TCustomListEnumerator)\r\n public\r\n constructor Create(AStack: TMyType);\r\n end;\r\n function GetEnumerator: TEnumerator; reintroduce;\r\n Public\r\n destructor Destroy; override;\r\n procedure Clear;\r\n procedure Push(const aValue: T);\r\n function Pop: T;\r\n function Peek: T;\r\n function Extract: T;\r\n procedure TrimExcess; override;\r\n property Count: SizeInt read GetCount;\r\n end;\r\n\r\n { TObjectStack }\r\n\r\n TObjectStack = class(TStack)\r\n private\r\n FOwnsObjects: Boolean;\r\n protected\r\n procedure Notify(const aValue: T; Action: TCollectionNotification); override;\r\n public\r\n constructor Create(AOwnsObjects: Boolean = True); overload;\r\n constructor Create(const Collection: TEnumerable; AOwnsObjects: Boolean = True); overload;\r\n procedure Pop; reintroduce; // Can't use the result, it might have been freed;\r\n property OwnsObjects: Boolean read FOwnsObjects write FOwnsObjects;\r\n end;\r\n\r\n\r\n { TPair }\r\n\r\n TPair = record\r\n Key: TKey;\r\n Value: TValue;\r\n constructor Create(const AKey: TKey; const AValue: TValue);\r\n end;\r\n\r\n // Hash table using linear probing\r\n\r\n { TDictionary }\r\n EDictionary = Class(Exception);\r\n\r\n TDictionary = class(TEnumerable>)\r\n private\r\n FMap: TJSMap;\r\n FComparer: IComparer;\r\n function GetEffectiveKey(Key : TKey) : TKey;\r\n function GetItem(const Key: TKey): TValue;\r\n procedure SetItem(const Key: TKey; const Value: TValue);\r\n procedure DoAdd(const Key: TKey; const Value: TValue);\r\n function DoRemove(const Key: TKey; Notification: TCollectionNotification): TValue;\r\n Function GetCount : Integer;\r\n protected\r\n Function CanClearMap : Boolean; virtual;\r\n function DoGetEnumerator: TEnumerator>; override;\r\n procedure PairNotify(const Key: TKey; Value : TValue; Action: TCollectionNotification); virtual;\r\n procedure KeyNotify(const Key: TKey; Action: TCollectionNotification); virtual;\r\n procedure ValueNotify(const Value: TValue; Action: TCollectionNotification); virtual;\r\n public\r\n Type\r\n TMyType = TDictionary;\r\n TMyPair = TPair;\r\n\r\n constructor Create(ACapacity: Integer=0); overload;\r\n constructor Create(const Collection: TEnumerable); overload;\r\n constructor Create(const AComparer: IComparer); overload;\r\n destructor Destroy; override;\r\n\r\n procedure Add(const Key: TKey; const Value: TValue);\r\n procedure Remove(const Key: TKey);\r\n function ExtractPair(const Key: TKey): TMyPair;\r\n procedure Clear;\r\n function TryGetValue(const Key: TKey; out Value: TValue): Boolean;\r\n procedure AddOrSetValue(const Key: TKey; const Value: TValue);\r\n function ContainsKey(const Key: TKey): Boolean;\r\n function ContainsValue(const Value: TValue): Boolean;\r\n function ToArray: TArray; override;\r\n\r\n property Items[const Key: TKey]: TValue read GetItem write SetItem; default;\r\n property Count: Integer read GetCount;\r\n\r\n type\r\n { TPairEnumerator }\r\n\r\n TPairEnumerator = class(TEnumerator)\r\n private\r\n FIter: TJSIterator;\r\n FVal : TJSIteratorValue;\r\n function GetCurrent: TMyPair;\r\n protected\r\n function DoGetCurrent: TMyPair; override;\r\n function DoMoveNext: Boolean; override;\r\n public\r\n constructor Create(const ADictionary: TMyType);\r\n function MoveNext: Boolean; reintroduce;\r\n property Current: TMyPair read GetCurrent;\r\n end;\r\n\r\n { TKeyEnumerator }\r\n\r\n TKeyEnumerator = class(TEnumerator)\r\n private\r\n FIter: TJSIterator;\r\n FVal : TJSIteratorValue;\r\n function GetCurrent: TKey;\r\n protected\r\n function DoGetCurrent: TKey; override;\r\n function DoMoveNext: Boolean; override;\r\n public\r\n constructor Create(const AIter: TJSIterator); overload;\r\n constructor Create(const ADictionary: TMyType); overload;\r\n function MoveNext: Boolean; reintroduce;\r\n property Current: TKey read GetCurrent;\r\n end;\r\n\r\n { TValueEnumerator }\r\n\r\n TValueEnumerator = class(TEnumerator)\r\n private\r\n FIter: TJSIterator;\r\n FVal : TJSIteratorValue;\r\n function GetCurrent: TValue;\r\n protected\r\n function DoGetCurrent: TValue; override;\r\n function DoMoveNext: Boolean; override;\r\n public\r\n constructor Create(const AIter: TJSIterator); overload;\r\n constructor Create(const ADictionary: TMyType); overload;\r\n function MoveNext: Boolean; reintroduce;\r\n property Current: TValue read GetCurrent;\r\n end;\r\n\r\n { TValueCollection }\r\n\r\n TValueCollection = class(TEnumerable)\r\n private\r\n FMap: TJSMap;\r\n function GetCount: Integer;\r\n protected\r\n function DoGetEnumerator: TEnumerator; override;\r\n public\r\n constructor Create(const ADictionary: TMyType);\r\n function GetEnumerator: TValueEnumerator; reintroduce;\r\n function ToArray: TArray; override;\r\n property Count: Integer read GetCount;\r\n end;\r\n\r\n { TKeyCollection }\r\n\r\n TKeyCollection = class(TEnumerable)\r\n private\r\n FMap: TJSMap;\r\n function GetCount: Integer;\r\n protected\r\n function DoGetEnumerator: TEnumerator; override;\r\n public\r\n constructor Create(const ADictionary: TMyType);\r\n function GetEnumerator: TKeyEnumerator; reintroduce;\r\n function ToArray: TArray; override;\r\n property Count: Integer read GetCount;\r\n end;\r\n\r\n private\r\n FOnKeyNotify: TCollectionNotifyEvent;\r\n FOnValueNotify: TCollectionNotifyEvent;\r\n FKeyCollection: TKeyCollection;\r\n FValueCollection: TValueCollection;\r\n function GetKeys: TKeyCollection;\r\n function GetValues: TValueCollection;\r\n public\r\n function GetEnumerator: TPairEnumerator; reintroduce;\r\n property Keys: TKeyCollection read GetKeys;\r\n property Values: TValueCollection read GetValues;\r\n property OnKeyNotify: TCollectionNotifyEvent read FOnKeyNotify write FOnKeyNotify;\r\n property OnValueNotify: TCollectionNotifyEvent read FOnValueNotify write FOnValueNotify;\r\n end;\r\n\r\n TDictionaryOwnership = (doOwnsKeys, doOwnsValues);\r\n TDictionaryOwnerships = set of TDictionaryOwnership;\r\n\r\n { TObjectDictionary }\r\n\r\n TObjectDictionary = class(TDictionary)\r\n private\r\n FOwnerships: TDictionaryOwnerships;\r\n protected\r\n Function CanClearMap : Boolean; override;\r\n procedure KeyNotify(const Key: TKey; Action: TCollectionNotification); override;\r\n procedure ValueNotify(const Value: TValue; Action: TCollectionNotification); override;\r\n public\r\n constructor Create(aOwnerships: TDictionaryOwnerships; ACapacity: Integer); overload;\r\n constructor Create(aOwnerships: TDictionaryOwnerships); overload;\r\n Property OwnerShips : TDictionaryOwnerships Read FOwnerships Write FOwnerShips;\r\n end;\r\n\r\nimplementation\r\n\r\n{ TCustomArrayHelper }\r\n\r\nclass procedure TCustomArrayHelper.Sort(var AValues: array of T;\r\n const AComparer: IComparer);\r\nbegin\r\n QuickSort(AValues, 0, Length(AValues), AComparer);\r\nend;\r\n\r\nclass procedure TCustomArrayHelper.Sort(var AValues: array of T;\r\n const AComparer: IComparer; AIndex, ACount: SizeInt);\r\nbegin\r\n if ACount <= 1 then\r\n Exit;\r\n QuickSort(AValues, AIndex, Pred(AIndex + ACount), AComparer);\r\nend;\r\n\r\nclass function TCustomArrayHelper.BinarySearch(const AValues: array of T;\r\n const AItem: T; out AFoundIndex: SizeInt; const AComparer: IComparer\r\n ): Boolean;\r\nbegin\r\n Result := BinarySearch(AValues, AItem, AFoundIndex, AComparer,\r\n 0, Length(AValues));\r\nend;\r\n\r\nclass function TCustomArrayHelper.BinarySearch(const AValues: array of T;\r\n const AItem: T; out ASearchResult: TBinarySearchResult;\r\n const AComparer: IComparer): Boolean;\r\nbegin\r\n Result := BinarySearch(AValues, AItem, ASearchResult, AComparer,\r\n 0, Length(AValues));\r\nend;\r\n\r\n{ TArrayHelper }\r\n\r\nclass procedure TArrayHelper.QuickSort(var AValues: array of T; ALeft,\r\n ARight: SizeInt; const AComparer: IComparer);\r\nvar\r\n I, J: SizeInt;\r\n P, Q: T;\r\nbegin\r\n if ((ARight - ALeft) <= 0) or (Length(AValues) = 0) then\r\n Exit;\r\n repeat\r\n I := ALeft;\r\n J := ARight;\r\n P := AValues[ALeft + (ARight - ALeft) shr 1];\r\n repeat\r\n while AComparer.Compare(AValues[I], P) < 0 do\r\n Inc(I);\r\n while AComparer.Compare(AValues[J], P) > 0 do\r\n Dec(J);\r\n if I <= J then\r\n begin\r\n if I <> J then\r\n begin\r\n Q := AValues[I];\r\n AValues[I] := AValues[J];\r\n AValues[J] := Q;\r\n end;\r\n Inc(I);\r\n Dec(J);\r\n end;\r\n until I > J;\r\n // sort the smaller range recursively\r\n // sort the bigger range via the loop\r\n // Reasons: memory usage is O(log(n)) instead of O(n) and loop is faster than recursion\r\n if J - ALeft < ARight - I then\r\n begin\r\n if ALeft < J then\r\n QuickSort(AValues, ALeft, J, AComparer);\r\n ALeft := I;\r\n end\r\n else\r\n begin\r\n if I < ARight then\r\n QuickSort(AValues, I, ARight, AComparer);\r\n ARight := J;\r\n end;\r\n until ALeft >= ARight;\r\nend;\r\n\r\nclass function TArrayHelper.BinarySearch(const AValues: array of T;\r\n const AItem: T; out ASearchResult: TBinarySearchResult;\r\n const AComparer: IComparer; AIndex, ACount: SizeInt): Boolean;\r\nvar\r\n imin, imax, imid, ilo: Int32;\r\n\r\nbegin\r\n // Writeln('Enter ',Length(aValues),' Idx ',aIndex,' acount: ',aCount);\r\n // continually narrow search until just one element remains\r\n imin := AIndex;\r\n imax := Pred(AIndex + ACount);\r\n // Writeln('Start Imax, imin : ',Imax, ' - ', imin);\r\n ilo:=imid * imid;\r\n imid:=ilo*imid;\r\n while (imin < imax) do\r\n begin\r\n imid := (imax+imin) div 2;\r\n // writeln('imid',imid);\r\n\r\n ASearchResult.CompareResult := AComparer.Compare(AValues[imid], AItem);\r\n // reduce the search\r\n if (ASearchResult.CompareResult < 0) then\r\n imin := imid + 1\r\n else\r\n begin\r\n if ASearchResult.CompareResult = 0 then\r\n begin\r\n ASearchResult.FoundIndex := imid;\r\n ASearchResult.CandidateIndex := imid;\r\n Exit(True);\r\n end;\r\n imax := imid;\r\n end;\r\n end;\r\n // At exit of while:\r\n // if A[] is empty, then imax < imin\r\n // otherwise imax == imin\r\n\r\n // deferred test for equality\r\n // Writeln('End Imax, imin : ',Imax, ' - ', imin);\r\n Result:=(imax = imin);\r\n if Result then\r\n begin\r\n ASearchResult.CompareResult := AComparer.Compare(AValues[imin], AItem);\r\n ASearchResult.CandidateIndex := imin;\r\n Result:=(ASearchResult.CompareResult = 0);\r\n if Result then\r\n ASearchResult.FoundIndex := imin\r\n else\r\n ASearchResult.FoundIndex := -1;\r\n end\r\n else\r\n begin\r\n ASearchResult.CompareResult := 0;\r\n ASearchResult.FoundIndex := -1;\r\n ASearchResult.CandidateIndex := -1;\r\n end;\r\nend;\r\n\r\nclass function TArrayHelper.BinarySearch(const AValues: array of T;\r\n const AItem: T; out AFoundIndex: SizeInt; const AComparer: IComparer;\r\n AIndex, ACount: SizeInt): Boolean;\r\nvar\r\n imin, imax, imid: Int32;\r\n LCompare: SizeInt;\r\nbegin\r\n // continually narrow search until just one element remains\r\n imin := AIndex;\r\n imax := Pred(AIndex + ACount);\r\n\r\n // http://en.wikipedia.org/wiki/Binary_search_algorithm\r\n while (imin < imax) do\r\n begin\r\n imid := (imin + imax) div 2;\r\n\r\n // code must guarantee the interval is reduced at each iteration\r\n // assert(imid < imax);\r\n // note: 0 <= imin < imax implies imid will always be less than imax\r\n\r\n LCompare := AComparer.Compare(AValues[imid], AItem);\r\n // reduce the search\r\n if (LCompare < 0) then\r\n imin := imid + 1\r\n else\r\n begin\r\n if LCompare = 0 then\r\n begin\r\n AFoundIndex := imid;\r\n Exit(True);\r\n end;\r\n imax := imid;\r\n end;\r\n end;\r\n // At exit of while:\r\n // if A[] is empty, then imax < imin\r\n // otherwise imax == imin\r\n\r\n // deferred test for equality\r\n LCompare := AComparer.Compare(AValues[imin], AItem);\r\n Result:=(imax = imin) and (LCompare = 0);\r\n if Result then\r\n AFoundIndex := imin\r\n else\r\n AFoundIndex := -1;\r\nend;\r\n\r\n{ TEnumerator }\r\n\r\nfunction TEnumerator.MoveNext: boolean;\r\nbegin\r\n Result:=DoMoveNext;\r\nend;\r\n\r\n{ TEnumerable }\r\n\r\nfunction TEnumerable.GetEnumerator: TMyEnumerator;\r\nbegin\r\n Result:=DoGetEnumerator;\r\nend;\r\n\r\nfunction TEnumerable.ToArray: TMyArray;\r\nvar\r\n LEnumerator: TMyEnumerator;\r\nbegin\r\n Result:=[];\r\n LEnumerator := GetEnumerator;\r\n try\r\n while LEnumerator.MoveNext do\r\n TJSArray(Result).push(LEnumerator.Current);\r\n finally\r\n LEnumerator.Free;\r\n end;\r\nend;\r\n\r\n{ TCustomList }\r\n\r\nfunction TCustomList.GetCapacity: SizeInt;\r\nbegin\r\n Result:=length(FItems);\r\nend;\r\n\r\nfunction TCustomList.PrepareAddingItem: SizeInt;\r\nbegin\r\n if FLength=length(FItems) then\r\n TJSArray(FItems).push(Default(T));\r\n\r\n Result := FLength;\r\n Inc(FLength);\r\nend;\r\n\r\nfunction TCustomList.PrepareAddingRange(ACount: SizeInt): SizeInt;\r\nvar\r\n l: SizeInt;\r\nbegin\r\n if ACount < 0 then\r\n raise EArgumentOutOfRangeException.Create(SArgumentOutOfRange);\r\n if ACount = 0 then\r\n Exit(FLength - 1);\r\n\r\n for l:=length(FItems)+1 to FLength+ACount do\r\n TJSArray(FItems).push(Default(T));\r\n\r\n Result := FLength;\r\n Inc(FLength, ACount);\r\nend;\r\n\r\nprocedure TCustomList.Notify(const AValue: T;\r\n ACollectionNotification: TCollectionNotification);\r\nbegin\r\n if Assigned(FOnNotify) then\r\n FOnNotify(Self, AValue, ACollectionNotification);\r\nend;\r\n\r\nfunction TCustomList.DoRemove(AIndex: SizeInt;\r\n ACollectionNotification: TCollectionNotification): T;\r\nbegin\r\n if (AIndex < 0) or (AIndex >= FLength) then\r\n raise EArgumentOutOfRangeException.Create(SArgumentOutOfRange);\r\n\r\n Result := FItems[AIndex];\r\n Dec(FLength);\r\n\r\n FItems[AIndex] := Default(T); // needed for refcounted types\r\n TJSArray(FItems).splice(AIndex,1);\r\n\r\n Notify(Result, ACollectionNotification);\r\nend;\r\n\r\nfunction TCustomList.GetCount: SizeInt;\r\nbegin\r\n Result := FLength;\r\nend;\r\n\r\n\r\n{ TCustomListEnumerator }\r\n\r\nfunction TCustomListEnumerator.DoMoveNext: boolean;\r\nbegin\r\n Inc(FIndex);\r\n Result := (FList.FLength > 0) and (FIndex < FList.FLength)\r\nend;\r\n\r\nfunction TCustomListEnumerator.DoGetCurrent: T;\r\nbegin\r\n Result := GetCurrent;\r\nend;\r\n\r\nfunction TCustomListEnumerator.GetCurrent: T;\r\nbegin\r\n Result := FList.FItems[FIndex];\r\nend;\r\n\r\nconstructor TCustomListEnumerator.Create(AList: TCustomList);\r\nbegin\r\n inherited Create;\r\n FIndex := -1;\r\n FList := AList;\r\nend;\r\n\r\n{ TList }\r\n\r\nfunction TList.SameValue(const Left, Right: T): Boolean;\r\nbegin\r\n if Assigned(FComparer) then\r\n Result:=(FComparer.Compare(Left, Right) = 0)\r\n else\r\n Result:=(Left = Right);\r\nend;\r\n\r\nprocedure TList.SetCapacity(AValue: SizeInt);\r\nbegin\r\n if AValue < Count then\r\n Count := AValue;\r\n SetLength(FItems, AValue);\r\nend;\r\n\r\nprocedure TList.SetCount(AValue: SizeInt);\r\nbegin\r\n if AValue < 0 then\r\n raise EArgumentOutOfRangeException.Create(SArgumentOutOfRange);\r\n\r\n if AValue > Capacity then\r\n Capacity := AValue\r\n else if AValue < Count then\r\n DeleteRange(AValue, Count - AValue);\r\n\r\n FLength := AValue;\r\nend;\r\n\r\nprocedure TList.InitializeList;\r\nbegin\r\nend;\r\n\r\nprocedure TList.InternalInsert(AIndex: SizeInt; const AValue: T);\r\nbegin\r\n if (AIndex < 0) or (AIndex > Count) then\r\n raise EArgumentOutOfRangeException.Create(SArgumentOutOfRange);\r\n TJSArray(FItems).splice(AIndex,0,AValue);\r\n inc(FLength);\r\n\r\n FItems[AIndex] := AValue;\r\n Notify(AValue, cnAdded);\r\nend;\r\n\r\nfunction TList.DoGetEnumerator: TEnumerator;\r\nbegin\r\n Result := GetEnumerator;\r\nend;\r\n\r\nfunction TList.GetItem(AIndex: SizeInt): T;\r\nbegin\r\n if (AIndex < 0) or (AIndex >= Count) then\r\n raise EArgumentOutOfRangeException.Create(SArgumentOutOfRange);\r\n\r\n Result := FItems[AIndex];\r\nend;\r\n\r\nprocedure TList.SetItem(AIndex: SizeInt; const AValue: T);\r\nbegin\r\n if (AIndex < 0) or (AIndex >= Count) then\r\n raise EArgumentOutOfRangeException.Create(SArgumentOutOfRange);\r\n Notify(FItems[AIndex], cnRemoved);\r\n FItems[AIndex] := AValue;\r\n Notify(AValue, cnAdded);\r\nend;\r\n\r\nfunction TList.GetEnumerator: TEnumerator;\r\nbegin\r\n Result := TEnumerator.Create(Self);\r\nend;\r\n\r\nconstructor TList.Create;\r\nbegin\r\n InitializeList;\r\nend;\r\n\r\nconstructor TList.Create(const AComparer: IComparer);\r\nbegin\r\n InitializeList;\r\n FComparer := AComparer;\r\nend;\r\n\r\nconstructor TList.Create(ACollection: TEnumerable);\r\nvar\r\n LItem: T;\r\nbegin\r\n Create;\r\n for LItem in ACollection do\r\n Add(LItem);\r\nend;\r\n\r\ndestructor TList.Destroy;\r\nbegin\r\n SetCapacity(0);\r\nend;\r\n\r\nfunction TList.Add(const AValue: T): SizeInt;\r\nbegin\r\n Result := PrepareAddingItem;\r\n FItems[Result] := AValue;\r\n Notify(AValue, cnAdded);\r\nend;\r\n\r\nprocedure TList.AddRange(const AValues: array of T);\r\nbegin\r\n InsertRange(Count, AValues);\r\nend;\r\n\r\nprocedure TList.AddRange(const AEnumerable: IEnumerable);\r\nvar\r\n LValue: T;\r\nbegin\r\n for LValue in AEnumerable do\r\n Add(LValue);\r\nend;\r\n\r\nprocedure TList.AddRange(AEnumerable: TEnumerable);\r\nvar\r\n LValue: T;\r\nbegin\r\n for LValue in AEnumerable do\r\n Add(LValue);\r\nend;\r\n\r\nprocedure TList.Insert(AIndex: SizeInt; const AValue: T);\r\nbegin\r\n if (AIndex < 0) or (AIndex > Count) then\r\n raise EArgumentOutOfRangeException.Create(SArgumentOutOfRange);\r\n\r\n InternalInsert(AIndex, AValue);\r\nend;\r\n\r\nprocedure TList.InsertRange(AIndex: SizeInt; const AValues: array of T);\r\nvar\r\n LLength, i: sizeint;\r\n LValue: T;\r\nbegin\r\n if (AIndex < 0) or (AIndex > Count) then\r\n raise EArgumentOutOfRangeException.Create(SArgumentOutOfRange);\r\n\r\n LLength := Length(AValues);\r\n if LLength = 0 then\r\n Exit;\r\n\r\n if AIndex <> PrepareAddingRange(LLength) then\r\n begin\r\n for i := AIndex to Count - LLength -1 do\r\n FItems[i+LLength] := FItems[i];\r\n for i := 0 to LLength -1 do\r\n FItems[AIndex+i] := Default(T);\r\n end;\r\n\r\n for i := 0 to Pred(LLength) do\r\n begin\r\n LValue:=AValues[i];\r\n FItems[i+AIndex] := LValue;\r\n Notify(LValue, cnAdded);\r\n end;\r\nend;\r\n\r\nprocedure TList.InsertRange(AIndex: SizeInt; const AEnumerable: IEnumerable);\r\nvar\r\n LValue: T;\r\n i: SizeInt;\r\nbegin\r\n if (AIndex < 0) or (AIndex > Count) then\r\n raise EArgumentOutOfRangeException.Create(SArgumentOutOfRange);\r\n\r\n i := 0;\r\n for LValue in AEnumerable do\r\n begin\r\n InternalInsert(AIndex + i, LValue);\r\n Inc(i);\r\n end;\r\nend;\r\n\r\nprocedure TList.InsertRange(AIndex: SizeInt; const AEnumerable: TEnumerable);\r\nvar\r\n LValue: T;\r\n i: SizeInt;\r\nbegin\r\n if (AIndex < 0) or (AIndex > Count) then\r\n raise EArgumentOutOfRangeException.Create(SArgumentOutOfRange);\r\n\r\n i := 0;\r\n for LValue in AEnumerable do\r\n begin\r\n InternalInsert(Aindex + i, LValue);\r\n Inc(i);\r\n end;\r\nend;\r\n\r\nfunction TList.RemoveItem(const AValue: T; Direction : TDirection): SizeInt;\r\n\r\nbegin\r\n if Direction=TDirection.FromEnd then\r\n Result := LastIndexOf(AValue)\r\n else\r\n Result := IndexOf(AValue);\r\n if Result >= 0 then\r\n DoRemove(Result, cnRemoved);\r\nend;\r\n\r\nfunction TList.Remove(const AValue: T): SizeInt;\r\nbegin\r\n Result := IndexOf(AValue);\r\n if Result >= 0 then\r\n DoRemove(Result, cnRemoved);\r\nend;\r\n\r\nprocedure TList.Delete(AIndex: SizeInt);\r\nbegin\r\n DoRemove(AIndex, cnRemoved);\r\nend;\r\n\r\nprocedure TList.DeleteRange(AIndex, ACount: SizeInt);\r\nvar\r\n LDeleted: TMyArray;\r\n i: SizeInt;\r\nbegin\r\n if ACount = 0 then\r\n Exit;\r\n\r\n if (ACount < 0) or (AIndex < 0) or (AIndex + ACount > Count) then\r\n raise EArgumentOutOfRangeException.Create(SArgumentOutOfRange);\r\n\r\n LDeleted:=TMyArray(TJSArray(FItems).splice(AIndex,Count));\r\n Dec(FLength, ACount);\r\n\r\n for i := 0 to High(LDeleted) do\r\n Notify(LDeleted[i], cnRemoved);\r\nend;\r\n\r\nfunction TList.ExtractIndex(const AIndex: SizeInt): T;\r\nbegin\r\n Result := DoRemove(AIndex, cnExtracted);\r\nend;\r\n\r\nfunction TList.Extract(const AValue: T): T;\r\nvar\r\n LIndex: SizeInt;\r\nbegin\r\n LIndex := IndexOf(AValue);\r\n if LIndex < 0 then\r\n Result:=Default(T)\r\n else\r\n Result := DoRemove(LIndex, cnExtracted);\r\nend;\r\n\r\nprocedure TList.Exchange(AIndex1, AIndex2: SizeInt);\r\nvar\r\n LTemp: T;\r\nbegin\r\n LTemp := FItems[AIndex1];\r\n FItems[AIndex1] := FItems[AIndex2];\r\n FItems[AIndex2] := LTemp;\r\nend;\r\n\r\nprocedure TList.Move(AIndex, ANewIndex: SizeInt);\r\nvar\r\n Arr: TJSArray;\r\n LTemp: JSValue;\r\n i: SizeInt;\r\nbegin\r\n if ANewIndex = AIndex then\r\n Exit;\r\n\r\n if (ANewIndex < 0) or (ANewIndex >= Count) then\r\n raise EArgumentOutOfRangeException.Create(SArgumentOutOfRange);\r\n\r\n Arr := TJSArray(FItems);\r\n LTemp := Arr[AIndex];\r\n if AIndex < ANewIndex then\r\n for i := AIndex to ANewIndex-1 do\r\n Arr[i] := Arr[i+1]\r\n else\r\n for i := ANewIndex downto AIndex+1 do\r\n Arr[i] := Arr[i-1];\r\n Arr[ANewIndex] := LTemp;\r\nend;\r\n\r\nfunction TList.First: T;\r\nbegin\r\n Result := Items[0];\r\nend;\r\n\r\nfunction TList.Last: T;\r\nbegin\r\n Result := Items[Pred(Count)];\r\nend;\r\n\r\nprocedure TList.Clear;\r\nbegin\r\n SetCount(0);\r\n SetCapacity(0);\r\nend;\r\n\r\nfunction TList.Contains(const AValue: T): Boolean;\r\nbegin\r\n Result := IndexOf(AValue) >= 0;\r\nend;\r\n\r\nfunction TList.IndexOf(const AValue: T): SizeInt;\r\nvar\r\n i: SizeInt;\r\nbegin\r\n for i := 0 to Count - 1 do\r\n if SameValue(AValue, FItems[i]) then\r\n Exit(i);\r\n Result:=-1;\r\nend;\r\n\r\nfunction TList.LastIndexOf(const AValue: T): SizeInt;\r\nvar\r\n i: SizeInt;\r\nbegin\r\n for i := Count - 1 downto 0 do\r\n if SameValue(AValue, FItems[i]) then\r\n Exit(i);\r\n Result:=-1;\r\nend;\r\n\r\nprocedure TList.Reverse;\r\nvar\r\n a, b: SizeInt;\r\n LTemp: T;\r\nbegin\r\n a := 0;\r\n b := Count - 1;\r\n while a < b do\r\n begin\r\n LTemp := FItems[a];\r\n FItems[a] := FItems[b];\r\n FItems[b] := LTemp;\r\n Inc(a);\r\n Dec(b);\r\n end;\r\nend;\r\n\r\nprocedure TList.TrimExcess;\r\nbegin\r\n SetCapacity(Count);\r\nend;\r\n\r\nprocedure TList.Sort;\r\nbegin\r\n TMyArrayHelper.Sort(FItems, FComparer, 0, Count);\r\nend;\r\n\r\nprocedure TList.Sort(const AComparer: IComparer);\r\nbegin\r\n TMyArrayHelper.Sort(FItems, AComparer, 0, Count);\r\nend;\r\n\r\nfunction TList.BinarySearch(const AItem: T; out AIndex: SizeInt): Boolean;\r\nbegin\r\n Result := TMyArrayHelper.BinarySearch(FItems, AItem, AIndex, FComparer, 0, Count);\r\nend;\r\n\r\nfunction TList.BinarySearch(const AItem: T; out AIndex: SizeInt;\r\n const AComparer: IComparer): Boolean;\r\nbegin\r\n Result := TMyArrayHelper.BinarySearch(FItems, AItem, AIndex, AComparer, 0, Count);\r\nend;\r\n\r\n{ TPair }\r\n\r\nconstructor TPair.Create(const AKey: TKey; const AValue: TValue);\r\nbegin\r\n Key:=aKey;\r\n Value:=aValue;\r\nend;\r\n\r\n{ TDictionary }\r\n\r\nResourceString\r\n SErrDictKeyNotFound = 'Key value not found';\r\n SErrDictDuplicateKey = 'Duplicate key value';\r\n\r\nfunction TDictionary.GetEffectiveKey(Key: TKey): TKey;\r\n\r\nVar\r\n it : TJSIterator;\r\n v : TJSIteratorValue;\r\n// vv : JSValue;\r\n\r\nbegin\r\n if Not assigned(FComparer) then\r\n Exit(key);\r\n it:=FMap.Keys;\r\n v:=it.next;\r\n While not v.Done do\r\n begin\r\n Result:=TKey(v.Value);\r\n if FComparer.Compare(Result,Key)=0 then\r\n exit;\r\n v:=it.Next;\r\n end;\r\n Result:=Key;\r\nend;\r\n\r\nfunction TDictionary.GetItem(const Key: TKey): TValue;\r\n\r\nVar\r\n V : JSValue;\r\n\r\nbegin\r\n v:=FMap.Get(GetEffectiveKey(Key));\r\n if isUndefined(v) then\r\n Raise EDictionary.Create(SErrDictKeyNotFound);\r\n Result:=TValue(V);\r\nend;\r\n\r\nprocedure TDictionary.SetItem(const Key: TKey; const Value: TValue);\r\n\r\nVar\r\n V : JSValue;\r\n\r\nbegin\r\n v:=FMap.Get(GetEffectiveKey(Key));\r\n if Not isUndefined(v) then\r\n ValueNotify(TValue(V),cnRemoved);\r\n FMap.&Set(Key,Value);\r\n ValueNotify(Value, cnAdded);\r\nend;\r\n\r\nprocedure TDictionary.DoAdd(const Key: TKey; const Value: TValue);\r\n//Var\r\n// k : Tkey;\r\nbegin\r\n FMap.&Set(GetEffectiveKey(Key),Value);\r\n KeyNotify(Key,cnAdded);\r\n ValueNotify(Value,cnAdded);\r\nend;\r\n\r\n\r\nfunction TDictionary.DoRemove(const Key: TKey; Notification: TCollectionNotification): TValue;\r\nVar\r\n V : JSValue;\r\n K : TKey;\r\n\r\nbegin\r\n K:=GetEffectiveKey(Key);\r\n V:=FMap.Get(k);\r\n if Not isUndefined(v) then\r\n begin\r\n FMap.Delete(k);\r\n Result:=TValue(v);\r\n KeyNotify(Key,Notification);\r\n ValueNotify(Result,Notification);\r\n end;\r\nend;\r\n\r\nfunction TDictionary.GetCount: Integer;\r\nbegin\r\n Result:=FMap.Size;\r\nend;\r\n\r\nfunction TDictionary.DoGetEnumerator: TEnumerator>;\r\nbegin\r\n Result:=TPairEnumerator.Create(Self);\r\nend;\r\n\r\nprocedure TDictionary.PairNotify(const Key: TKey; Value : TValue; Action: TCollectionNotification);\r\n\r\nbegin\r\n KeyNotify(Key,action);\r\n ValueNotify(Value,action);\r\nend;\r\n\r\nprocedure TDictionary.KeyNotify(const Key: TKey; Action: TCollectionNotification);\r\nbegin\r\n if Assigned(FOnKeyNotify) then\r\n FOnKeyNotify(Self,Key,Action);\r\nend;\r\n\r\nprocedure TDictionary.ValueNotify(const Value: TValue; Action: TCollectionNotification);\r\nbegin\r\n if Assigned(FOnValueNotify) then\r\n FOnValueNotify(Self,Value,Action);\r\nend;\r\n\r\nconstructor TDictionary.Create(ACapacity: Integer = 0);\r\nbegin\r\n FMap:=TJSMap.New;\r\n if ACapacity>0 then ; // ToDo\r\nend;\r\n\r\nconstructor TDictionary.Create(const Collection: TEnumerable);\r\n\r\nVar\r\n aPair : TMyPair;\r\n\r\nbegin\r\n Create(0);\r\n For aPair in Collection do\r\n Add(aPair.Key,aPair.Value);\r\nend;\r\n\r\nconstructor TDictionary.Create(const AComparer: IComparer);\r\nbegin\r\n Create(0);\r\n FComparer:=aComparer;\r\nend;\r\n\r\ndestructor TDictionary.Destroy;\r\nbegin\r\n FreeAndNil(FKeyCollection);\r\n FreeAndNil(FValueCollection);\r\n Clear;\r\n FMap:=Nil;\r\n inherited Destroy;\r\nend;\r\n\r\nprocedure TDictionary.Add(const Key: TKey; const Value: TValue);\r\nbegin\r\n if FMap.Has(GetEffectiveKey(Key)) then\r\n Raise EDictionary.Create(SErrDictDuplicateKey);\r\n DoAdd(Key,Value);\r\nend;\r\n\r\nprocedure TDictionary.Remove(const Key: TKey);\r\nbegin\r\n doRemove(Key,cnRemoved);\r\nend;\r\n\r\nfunction TDictionary.ExtractPair(const Key: TKey): TMyPair;\r\n\r\nVar\r\n K : TKey;\r\n\r\nbegin\r\n Result:=Default(TMyPair);\r\n K:=GetEffectiveKey(Key);\r\n if FMap.Has(K) then\r\n begin\r\n Result.Create(Key,TValue(FMap.get(K)));\r\n FMap.Delete(k);\r\n end\r\n else\r\n Result.Create(Key,Default(TValue));\r\nend;\r\n\r\nfunction TDictionary.CanClearMap: Boolean;\r\n\r\nbegin\r\n Result:=(FOnKeyNotify=Nil) and (FOnValueNotify=Nil);\r\nend;\r\n\r\nprocedure TDictionary.Clear;\r\n\r\nVar\r\n Iter : TJSIterator;\r\n IVal : TJSIteratorValue;\r\n A : TJSValueDynArray;\r\n K : TKey;\r\n V : TValue;\r\n\r\nbegin\r\n if CanClearMap then\r\n Fmap.Clear\r\n else\r\n begin\r\n Iter:=FMap.Entries;\r\n Repeat\r\n IVal:=Iter.next;\r\n if not ival.Done then\r\n begin\r\n A:=TJSValueDynArray(IVal.Value);\r\n K:=TKey(A[0]);\r\n V:=TValue(A[1]);\r\n FMap.delete(k);\r\n PairNotify(K,V,cnRemoved);\r\n end;\r\n Until Ival.Done;\r\n end;\r\nend;\r\n\r\n\r\nfunction TDictionary.TryGetValue(const Key: TKey; out Value: TValue): Boolean;\r\n\r\nVar\r\n K : TKey;\r\nbegin\r\n K:=GetEffectiveKey(Key);\r\n Result:=FMap.Has(K);\r\n If Result then\r\n Value:=TValue(FMap.get(K));\r\nend;\r\n\r\n\r\nprocedure TDictionary.AddOrSetValue(const Key: TKey; const Value: TValue);\r\n\r\nVar\r\n k : TKey;\r\n\r\nbegin\r\n K:=GetEffectiveKey(Key);\r\n if Not FMap.Has(k) then\r\n DoAdd(Key,Value)\r\n else\r\n SetItem(K,Value);\r\nend;\r\n\r\nfunction TDictionary.ContainsKey(const Key: TKey): Boolean;\r\nbegin\r\n Result:=FMap.Has(GetEffectiveKey(Key));\r\nend;\r\n\r\nfunction TDictionary.ContainsValue(const Value: TValue): Boolean;\r\n\r\nVar\r\n It : TJSIterator;\r\n Res : TJSIteratorValue;\r\n\r\nbegin\r\n Result:=False;\r\n It:=FMap.Values;\r\n Repeat\r\n Res:=It.next;\r\n if not Res.done then\r\n Result:=(Value=TValue(Res.value));\r\n Until (Result or Res.done);\r\nend;\r\n\r\nfunction TDictionary.ToArray: TArray;\r\nbegin\r\n Result:=inherited ToArray;\r\nend;\r\n\r\nfunction TDictionary.GetKeys: TKeyCollection;\r\nbegin\r\n if FKeyCollection=Nil then\r\n FKeyCollection:=TKeyCollection.Create(Self);\r\n Result:=FKeyCollection;\r\nend;\r\n\r\nfunction TDictionary.GetValues: TValueCollection;\r\nbegin\r\n if FValueCollection=Nil then\r\n FValueCollection:=TValueCollection.Create(Self);\r\n Result:=FValueCollection;\r\nend;\r\n\r\nfunction TDictionary.GetEnumerator: TPairEnumerator;\r\nbegin\r\n Result:=TPairEnumerator.Create(Self);\r\nend;\r\n\r\n{ TDictionary.TPairEnumerator }\r\n\r\nfunction TDictionary.TPairEnumerator.GetCurrent: TMyPair;\r\nbegin\r\n Result:=DoGetCurrent();\r\nend;\r\n\r\nfunction TDictionary.TPairEnumerator.DoGetCurrent: TMyPair;\r\n\r\nVar\r\n A : TJSValueDynArray;\r\n\r\nbegin\r\n A:=TJSValueDynArray(FVal.Value);\r\n Result:=Default(TMyPair);\r\n Result.Create(TKey(A[0]),TValue(A[1]));\r\nend;\r\n\r\nfunction TDictionary.TPairEnumerator.DoMoveNext: Boolean;\r\nbegin\r\n FVal:=FIter.Next;\r\n Result:=Not FVal.Done;\r\nend;\r\n\r\nconstructor TDictionary.TPairEnumerator.Create(const ADictionary: TMyType);\r\nbegin\r\n FIter:=ADictionary.FMap.Entries;\r\nend;\r\n\r\nfunction TDictionary.TPairEnumerator.MoveNext: Boolean;\r\nbegin\r\n Result:=DoMoveNext;\r\nend;\r\n\r\n{ TDictionary.TKeyEnumerator }\r\n\r\nfunction TDictionary.TKeyEnumerator.GetCurrent: TKey;\r\nbegin\r\n Result:=DoGetCurrent();\r\nend;\r\n\r\nfunction TDictionary.TKeyEnumerator.DoGetCurrent: TKey;\r\nbegin\r\n Result:=TKey(FVal.Value);\r\nend;\r\n\r\nfunction TDictionary.TKeyEnumerator.DoMoveNext: Boolean;\r\nbegin\r\n FVal:=FIter.Next;\r\n Result:=Not FVal.Done;\r\nend;\r\n\r\nconstructor TDictionary.TKeyEnumerator.Create(const ADictionary: TMyType);\r\nbegin\r\n Create(ADictionary.FMap.Keys);\r\nend;\r\n\r\nconstructor TDictionary.TKeyEnumerator.Create(const AIter : TJSIterator);\r\nbegin\r\n FIter:=aIter;\r\nend;\r\n\r\nfunction TDictionary.TKeyEnumerator.MoveNext: Boolean;\r\nbegin\r\n Result:=DoMoveNext;\r\nend;\r\n\r\n{ TDictionary.TValueEnumerator }\r\n\r\nfunction TDictionary.TValueEnumerator.GetCurrent: TValue;\r\nbegin\r\n Result:=DoGetCurrent();\r\nend;\r\n\r\nfunction TDictionary.TValueEnumerator.DoGetCurrent: TValue;\r\nbegin\r\n Result:=TValue(FVal.Value);\r\nend;\r\n\r\nfunction TDictionary.TValueEnumerator.DoMoveNext: Boolean;\r\nbegin\r\n FVal:=FIter.Next;\r\n Result:=Not FVal.Done;\r\nend;\r\n\r\nconstructor TDictionary.TValueEnumerator.Create(const ADictionary: TMyType);\r\nbegin\r\n Create(aDictionary.FMap.Values);\r\nend;\r\n\r\nconstructor TDictionary.TValueEnumerator.Create(const AIter: TJSIterator);\r\nbegin\r\n FIter:=AIter;\r\nend;\r\n\r\nfunction TDictionary.TValueEnumerator.MoveNext: Boolean;\r\nbegin\r\n Result:=DoMoveNext;\r\nend;\r\n\r\n{ TDictionary.TValueCollection }\r\n\r\nfunction TDictionary.TValueCollection.GetCount: Integer;\r\nbegin\r\n Result:=FMap.Size;\r\nend;\r\n\r\nfunction TDictionary.TValueCollection.DoGetEnumerator: TEnumerator;\r\nbegin\r\n Result:=TValueEnumerator.Create(FMap.Values);\r\nend;\r\n\r\nconstructor TDictionary.TValueCollection.Create(const ADictionary: TMyType);\r\nbegin\r\n FMap:=ADictionary.FMap;\r\nend;\r\n\r\nfunction TDictionary.TValueCollection.GetEnumerator: TValueEnumerator;\r\nbegin\r\n Result:=TValueEnumerator(DoGetEnumerator);\r\nend;\r\n\r\nfunction TDictionary.TValueCollection.ToArray: TArray;\r\n\r\nVar\r\n I : Integer;\r\n P : TValue;\r\n\r\nbegin\r\n SetLength(Result,FMap.Size);\r\n For P in Self do\r\n begin\r\n Result[i]:=P;\r\n Inc(I);\r\n End;\r\nend;\r\n\r\n{ TDictionary.TKeyCollection }\r\n\r\nfunction TDictionary.TKeyCollection.GetCount: Integer;\r\nbegin\r\n Result:=FMap.Size;\r\nend;\r\n\r\nfunction TDictionary.TKeyCollection.DoGetEnumerator: TEnumerator;\r\nbegin\r\n Result:=GetEnumerator;\r\nend;\r\n\r\nconstructor TDictionary.TKeyCollection.Create(const ADictionary: TMyType);\r\nbegin\r\n FMap:=aDictionary.FMap;\r\nend;\r\n\r\nfunction TDictionary.TKeyCollection.GetEnumerator: TKeyEnumerator;\r\nbegin\r\n Result:=TKeyEnumerator.Create(FMap.Keys);\r\nend;\r\n\r\nfunction TDictionary.TKeyCollection.ToArray: TArray;\r\nbegin\r\n Result:=inherited ToArray;\r\nend;\r\n\r\n\r\n{ TObjectList }\r\n\r\nprocedure TObjectList.Notify(const aValue: T; Action: TCollectionNotification);\r\n\r\nVar\r\n A : TObject absolute aValue; // needed to fool compiler\r\n\r\nbegin\r\n inherited Notify(aValue, Action);\r\n if FObjectsOwner and (action = cnRemoved) then\r\n a.Free;\r\nend;\r\n\r\nconstructor TObjectList.Create(AOwnsObjects: Boolean);\r\nbegin\r\n inherited Create;\r\n FObjectsOwner := AOwnsObjects;\r\nend;\r\n\r\nconstructor TObjectList.Create(const AComparer: IComparer; AOwnsObjects: Boolean);\r\nbegin\r\n inherited Create(AComparer);\r\n FObjectsOwner := AOwnsObjects;\r\nend;\r\n\r\nconstructor TObjectList.Create(const ACollection: TEnumerable; aOwnsObjects: Boolean);\r\nbegin\r\n inherited Create(ACollection);\r\n FObjectsOwner := AOwnsObjects;\r\nend;\r\n\r\n{ TThreadList }\r\n\r\nconstructor TThreadList.Create;\r\nbegin\r\n inherited Create;\r\n FLock:=0;\r\n FList := TList.Create;\r\n FDuplicates := dupIgnore;\r\nend;\r\n\r\ndestructor TThreadList.Destroy;\r\nbegin\r\n // No need to unlock.\r\n FList.Free;\r\n inherited Destroy;\r\nend;\r\n\r\nprocedure TThreadList.Add(const Item: T);\r\nbegin\r\n LockList;\r\n try\r\n if (Duplicates = dupAccept) or (FList.IndexOf(Item) = -1) then\r\n FList.Add(Item)\r\n else if Duplicates = dupError then\r\n raise EListError.Create(SDuplicateItem);\r\n finally\r\n UnlockList;\r\n end;\r\nend;\r\n\r\nprocedure TThreadList.Clear;\r\nbegin\r\n LockList;\r\n try\r\n FList.Clear;\r\n finally\r\n UnlockList;\r\n end;\r\nend;\r\n\r\nfunction TThreadList.LockList: TList;\r\nbegin\r\n Inc(FLock);\r\n if (FLock>1) then\r\n Writeln('Locking already locked list, lockcount : ',FLock);\r\n Result:=FList;\r\nend;\r\n\r\nprocedure TThreadList.Remove(const Item: T);\r\n\r\nbegin\r\n RemoveItem(Item,TDirection.FromBeginning);\r\nend;\r\n\r\nprocedure TThreadList.RemoveItem(const Item: T; Direction: TDirection);\r\nbegin\r\n LockList;\r\n try\r\n FList.RemoveItem(Item,Direction);\r\n finally\r\n UnlockList;\r\n end;\r\nend;\r\n\r\nprocedure TThreadList.UnlockList;\r\nbegin\r\n Dec(FLock);\r\n if (FLock<0) then\r\n Writeln('Unlocking already unlocked list, lockcount : ',FLock);\r\nend;\r\n\r\n{ TObjectDictionary }\r\n\r\nfunction TObjectDictionary.CanClearMap: Boolean;\r\nbegin\r\n Result:=(Inherited CanClearMap) and (FOwnerships=[]);\r\nend;\r\n\r\nprocedure TObjectDictionary.KeyNotify(const Key: TKey; Action: TCollectionNotification);\r\n\r\nVar\r\n A : TObject absolute key; // Avoid typecast, refused by compiler\r\n\r\nbegin\r\n inherited KeyNotify(Key, Action);\r\n if (doOwnsKeys in FOwnerships) and (Action = cnRemoved) then\r\n A.Free;\r\nend;\r\n\r\nprocedure TObjectDictionary.ValueNotify(const Value: TValue; Action: TCollectionNotification);\r\n\r\nVar\r\n A : TObject absolute Value; // Avoid typecast, refused by compiler\r\n\r\nbegin\r\n inherited ValueNotify(Value, Action);\r\n if (doOwnsValues in FOwnerships) and (Action = cnRemoved) then\r\n A.Free;\r\nend;\r\n\r\nconstructor TObjectDictionary.Create(aOwnerships: TDictionaryOwnerships; ACapacity: Integer);\r\nbegin\r\n FOwnerShips:=aOwnerships;\r\n inherited Create(ACapacity);\r\nend;\r\n\r\nconstructor TObjectDictionary.Create(aOwnerships: TDictionaryOwnerships);\r\nbegin\r\n Inherited Create;\r\n FOwnerShips:=aOwnerships;\r\nend;\r\n\r\n{ TQueue }\r\n\r\nfunction TQueue.DoGetEnumerator: TEnumerator;\r\nbegin\r\n Result:=GetEnumerator;\r\nend;\r\n\r\nfunction TQueue.GetEnumerator: TEnumerator;\r\nbegin\r\n Result := TEnumerator.Create(Self);\r\nend;\r\n\r\nprocedure TQueue.SetCapacity(AValue: SizeInt);\r\nbegin\r\n if AValue < Count then\r\n raise EArgumentOutOfRangeException.Create(SArgumentOutOfRange);\r\n if FLow>0 then\r\n Rebase;\r\n SetLength(FItems,aValue);\r\nend;\r\n\r\nfunction TQueue.DoRemove(AIndex: SizeInt; ACollectionNotification: TCollectionNotification): T;\r\n\r\nbegin\r\n if (FLow>=FLength) then\r\n raise EArgumentOutOfRangeException.Create(SArgumentOutOfRange);\r\n Result := FItems[AIndex];\r\n FItems[AIndex] := Default(T);\r\n Inc(FLow);\r\n if FLow >= FLength then\r\n begin\r\n FLow:=0;\r\n FLength:=0;\r\n end;\r\n Notify(Result, ACollectionNotification);\r\nend;\r\n\r\nfunction TQueue.GetCount: SizeInt;\r\nbegin\r\n Result:=FLength-FLow;\r\nend;\r\n\r\nconstructor TQueue.Create;\r\nbegin\r\n FMaxGapLength:=10;\r\nend;\r\n\r\nconstructor TQueue.Create(ACollection: TEnumerable);\r\n\r\nvar\r\n Itm: T;\r\n\r\nbegin\r\n Create;\r\n for Itm in ACollection do\r\n Enqueue(Itm);\r\nend;\r\n\r\ndestructor TQueue.Destroy;\r\nbegin\r\n Clear;\r\n inherited Destroy;\r\nend;\r\n\r\nprocedure TQueue.Enqueue(const AValue: T);\r\nbegin\r\n if Capacity<=FLength then\r\n SetCapacity(FLength+10);\r\n FItems[FLength]:=aValue;\r\n Inc(FLength);\r\n Notify(aValue,cnAdded);\r\nend;\r\n\r\nfunction TQueue.Dequeue: T;\r\nbegin\r\n Result := DoRemove(FLow, cnRemoved);\r\n if FLow>FMaxGapLength then\r\n Rebase;\r\nend;\r\n\r\nfunction TQueue.Extract: T;\r\nbegin\r\n Result := DoRemove(FLow, cnExtracted);\r\n if FLow>FMaxGapLength then\r\n Rebase;\r\nend;\r\n\r\nfunction TQueue.Peek: T;\r\nbegin\r\n if (Count=0) then\r\n raise EArgumentOutOfRangeException.Create(SArgumentOutOfRange);\r\n Result:=FItems[FLow];\r\nend;\r\n\r\nprocedure TQueue.Clear;\r\nbegin\r\n while Count <> 0 do\r\n Dequeue;\r\nend;\r\n\r\nprocedure TQueue.Rebase;\r\n\r\nVar\r\n I,Spare : integer;\r\n\r\nbegin\r\n Spare:=Capacity-Count;\r\n if FLow>0 then\r\n begin\r\n For I:=Flow to FLength do\r\n FItems[I-FLow]:=FItems[I];\r\n SetLength(FItems,FLength+Spare);\r\n FLength:=FLength-Flow+1;\r\n Flow:=0;\r\n end;\r\nend;\r\n\r\nprocedure TQueue.TrimExcess;\r\nbegin\r\n Rebase;\r\n SetCapacity(Count);\r\nend;\r\n\r\n{ TQueue.TEnumerator }\r\n\r\nconstructor TQueue.TEnumerator.Create(AQueue: TMyType);\r\nbegin\r\n aQueue.Rebase;\r\n Inherited Create(aQueue);\r\nend;\r\n\r\n{ TObjectQueue }\r\n\r\nprocedure TObjectQueue.Notify(const Value: T; Action: TCollectionNotification);\r\n\r\nVar\r\n A : TObject absolute Value;\r\n\r\nbegin\r\n inherited Notify(Value, Action);\r\n if OwnsObjects and (Action = cnRemoved) then\r\n A.Free;\r\nend;\r\n\r\nconstructor TObjectQueue.Create(AOwnsObjects: Boolean);\r\nbegin\r\n Inherited create;\r\n FOwnsObjects:=aOwnsObjects;\r\nend;\r\n\r\nconstructor TObjectQueue.Create(const Collection: TEnumerable; AOwnsObjects: Boolean);\r\nVar\r\n A : T;\r\n\r\nbegin\r\n Create(aOwnsObjects);\r\n For A in Collection do\r\n EnQueue(A);\r\nend;\r\n\r\nprocedure TObjectQueue.Dequeue;\r\nbegin\r\n Inherited DeQueue;\r\nend;\r\n\r\n{ TStack }\r\n\r\nfunction TStack.DoRemove(aIndex : SizeInt; ACollectionNotification: TCollectionNotification): T;\r\n\r\nbegin\r\n if (FLength=0) or (aIndex<>FLength-1) then\r\n raise EArgumentOutOfRangeException.Create(SArgumentOutOfRange);\r\n Result:=FItems[AIndex];\r\n FItems[AIndex] := Default(T);\r\n Dec(FLength);\r\n Notify(Result, ACollectionNotification);\r\nend;\r\n\r\nprocedure TStack.SetCapacity(aValue: SizeInt);\r\n\r\nbegin\r\n if AValue < Count then\r\n raise EArgumentOutOfRangeException.Create(SArgumentOutOfRange);\r\n SetLength(FItems,aValue);\r\nend;\r\n\r\nfunction TStack.DoGetEnumerator: TEnumerator;\r\nbegin\r\n Result:=GetEnumerator;\r\nend;\r\n\r\nfunction TStack.GetEnumerator: TEnumerator;\r\nbegin\r\n Result:=TEnumerator.Create(Self);\r\nend;\r\n\r\n\r\ndestructor TStack.Destroy;\r\nbegin\r\n Clear;\r\n inherited Destroy;\r\nend;\r\n\r\nprocedure TStack.Clear;\r\nbegin\r\n While Count>0 do Pop;\r\nend;\r\n\r\nprocedure TStack.Push(const aValue: T);\r\nbegin\r\n if Capacity<=FLength then\r\n SetCapacity(FLength+10);\r\n FItems[FLength]:=aValue;\r\n Inc(FLength);\r\n Notify(aValue,cnAdded);\r\nend;\r\n\r\nfunction TStack.Pop: T;\r\nbegin\r\n Result:=DoRemove(FLength-1,cnRemoved);\r\nend;\r\n\r\nfunction TStack.Peek: T;\r\nbegin\r\n if Count<1 then\r\n raise EArgumentOutOfRangeException.Create(SArgumentOutOfRange);\r\n Result:=FItems[FLength-1];\r\nend;\r\n\r\nfunction TStack.Extract: T;\r\nbegin\r\n Result:=DoRemove(FLength-1,cnExtracted);\r\nend;\r\n\r\nprocedure TStack.TrimExcess;\r\nbegin\r\n SetCapacity(FLength);\r\nend;\r\n\r\n{ TCustomInvertedListEnumerator }\r\n\r\nfunction TCustomInvertedListEnumerator.DoMoveNext: boolean;\r\nbegin\r\n Result:=FIndex>0;\r\n If Result then\r\n Dec(FIndex);\r\nend;\r\n\r\nfunction TCustomInvertedListEnumerator.DoGetCurrent: T;\r\nbegin\r\n Result:=FList.FItems[FIndex];\r\nend;\r\n\r\nfunction TCustomInvertedListEnumerator.GetCurrent: T;\r\nbegin\r\n Result:=DoGetCurrent();\r\nend;\r\n\r\nconstructor TCustomInvertedListEnumerator.Create(AList: TCustomList);\r\nbegin\r\n inherited Create;\r\n FList:=AList;\r\n FIndex:=AList.FLength;\r\nend;\r\n\r\n{ TStack.TEnumerator }\r\n\r\nconstructor TStack.TEnumerator.Create(AStack: TMyType);\r\nbegin\r\n Inherited Create(aStack);\r\nend;\r\n\r\n{ TObjectStack }\r\n\r\nprocedure TObjectStack.Notify(const aValue: T; Action: TCollectionNotification);\r\n\r\nVar\r\n A : T absolute aValue;\r\n\r\nbegin\r\n inherited Notify(aValue, Action);\r\n if (Action=cnRemoved) and FOwnsObjects then\r\n a.Free;\r\nend;\r\n\r\nconstructor TObjectStack.Create(AOwnsObjects: Boolean);\r\nbegin\r\n Inherited Create;\r\n FOwnsObjects:=aOwnsObjects;\r\nend;\r\n\r\nconstructor TObjectStack.Create(const Collection: TEnumerable; AOwnsObjects: Boolean);\r\n\r\nVar\r\n A : T;\r\n\r\nbegin\r\n Create(aOwnsObjects);\r\n For A in Collection do\r\n Push(A);\r\nend;\r\n\r\nprocedure TObjectStack.Pop;\r\nbegin\r\n Inherited Pop;\r\nend;\r\n\r\nend.\r\n","unit Bcl.Json.Attributes;\r\n\r\n{$I Bcl.inc}\r\n\r\ninterface\r\n\r\nuses\r\n Generics.Collections,\r\n {$IFNDEF PAS2JS}\r\n Bcl.JSON.Converters,\r\n {$ENDIF}\r\n Classes;\r\n\r\ntype\r\n {$IFDEF PAS2JS}\r\n TInclusionMode = (Always, NonDefault);\r\n TJsonNamingStrategy = class\r\n end;\r\n TJsonNamingStrategyClass = class of TJsonNamingStrategy;\r\n TCustomJsonConverter = class\r\n end;\r\n TCustomJsonConverterClass = class of TCustomJsonConverter;\r\n {$ELSE}\r\n TInclusionMode = Bcl.Json.Converters.TInclusionMode;\r\n {$ENDIF}\r\n\r\n\r\n JsonPropertyAttribute = class(TCustomAttribute)\r\n strict private\r\n FName: string;\r\n public\r\n constructor Create; overload;\r\n constructor Create(const AName: string); overload;\r\n property Name: string read FName;\r\n end;\r\n\r\n JsonIgnoreAttribute = class(TCustomAttribute)\r\n end;\r\n\r\n JsonIncludeAttribute = class(TCustomAttribute)\r\n strict private\r\n FInclusionMode: TInclusionMode;\r\n public\r\n constructor Create(AInclusionMode: TInclusionMode);\r\n property InclusionMode: TInclusionMode read FInclusionMode;\r\n end;\r\n\r\n JsonNamingStrategyAttribute = class(TCustomAttribute)\r\n strict private\r\n FStrategyClass: TJsonNamingStrategyClass;\r\n public\r\n constructor Create(AStrategyClass: TJsonNamingStrategyClass);\r\n property StrategyClass: TJsonNamingStrategyClass read FStrategyClass;\r\n end;\r\n\r\n JsonEnumValuesAttribute = class(TCustomAttribute)\r\n strict private\r\n FEnumValues: TList;\r\n public\r\n constructor Create(const AEnumValues: string);\r\n destructor Destroy; override;\r\n property EnumValues: TList read FEnumValues;\r\n end;\r\n\r\n JsonConverterAttribute = class(TCustomAttribute)\r\n strict private\r\n FConverterClass: TCustomJsonConverterClass;\r\n private\r\n procedure SetConverterClass(const Value: TCustomJsonConverterClass);\r\n public\r\n constructor Create(AConverterClass: TCustomJsonConverterClass);\r\n property ConverterClass: TCustomJsonConverterClass read FConverterClass write SetConverterClass;\r\n end;\r\n\r\nimplementation\r\n\r\n{ JsonPropertyAttribute }\r\n\r\nconstructor JsonPropertyAttribute.Create(const AName: string);\r\nbegin\r\n FName := AName;\r\nend;\r\n\r\nconstructor JsonPropertyAttribute.Create;\r\nbegin\r\n Create('');\r\nend;\r\n\r\n{ JsonIncludeAttribute }\r\n\r\nconstructor JsonIncludeAttribute.Create(AInclusionMode: TInclusionMode);\r\nbegin\r\n FInclusionMode := AInclusionMode;\r\nend;\r\n\r\n{ JsonNamingStrategyAttribute }\r\n\r\nconstructor JsonNamingStrategyAttribute.Create(AStrategyClass: TJsonNamingStrategyClass);\r\nbegin\r\n FStrategyClass := AStrategyClass;\r\nend;\r\n\r\n{ JsonEnumValuesAttribute }\r\n\r\nconstructor JsonEnumValuesAttribute.Create(const AEnumValues: string);\r\nvar\r\n List: TStringList;\r\n I: Integer;\r\nbegin\r\n FEnumValues := TList.Create;\r\n\r\n List := TStringList.Create;\r\n try\r\n {$IFNDEF PAS2JS}\r\n ExtractStrings([',', ';'], [' '], PChar(AEnumValues), List);\r\n {$ENDIF}\r\n for I := 0 to List.Count - 1 do\r\n FEnumValues.Add(List[I]);\r\n finally\r\n List.Free;\r\n end;\r\nend;\r\n\r\ndestructor JsonEnumValuesAttribute.Destroy;\r\nbegin\r\n FEnumValues.Free;\r\n inherited;\r\nend;\r\n\r\n{ JsonConverterAttribute }\r\n\r\nconstructor JsonConverterAttribute.Create(\r\n AConverterClass: TCustomJsonConverterClass);\r\nbegin\r\n FConverterClass := AConverterClass;\r\nend;\r\n\r\nprocedure JsonConverterAttribute.SetConverterClass(\r\n const Value: TCustomJsonConverterClass);\r\nbegin\r\n FConverterClass := Value;\r\nend;\r\n\r\nend.\r\n","unit Bcl.Rtti.Common;\r\n\r\n{$I Bcl.inc}\r\n\r\ninterface\r\n\r\nuses\r\n SysUtils,\r\n {$IFDEF PAS2JS}\r\n JS;\r\n {$ELSE}\r\n Rtti,\r\n Bcl.TypInfo.Common;\r\n {$ENDIF}\r\n\r\ntype\r\n {$IFDEF ISDELPHI}\r\n TValue = Rtti.TValue;\r\n {$ELSE}\r\n {$IFDEF PAS2JS}\r\n TValue = JSValue;\r\n {$ELSE}\r\n TValue = Pointer;\r\n {$ENDIF}\r\n {$ENDIF}\r\n\r\n {$IFDEF PAS2JS}\r\n EInvalidJSCast = class(Exception)\r\n public\r\n constructor Create(Value: TValue; const TypeName: string); reintroduce;\r\n end;\r\n {$ENDIF}\r\n\r\nfunction TValue_IsArray(const Value: TValue): Boolean; {$IFDEF ISDELPHI}inline;{$ENDIF}\r\nfunction TValue_GetArrayLength(const Value: TValue): Integer; {$IFDEF ISDELPHI}inline;{$ENDIF}\r\nfunction TValue_GetArrayElement(const Value: TValue; Index: Integer): TValue; {$IFDEF ISDELPHI}inline;{$ENDIF}\r\nfunction TValue_AsString(const Value: TValue): String;\r\nfunction TValue_AsInteger(const Value: TValue): Integer;\r\nfunction TValue_AsOrdinal(const Value: TValue): {$IFDEF PAS2JS}Integer{$ELSE}Int64{$ENDIF};\r\nfunction TValue_AsBoolean(const Value: TValue): Boolean;\r\nfunction TValue_AsExtended(const Value: TValue): Extended;\r\nfunction TValue_AsDouble(const Value: TValue): Double;\r\nfunction TValue_AsBytes(const Value: TValue): TBytes;\r\nfunction TValue_IsEmpty(const Value: TValue): Boolean;\r\n\r\nfunction TValue_FromDateTime(const Value: TDateTime): TValue;\r\nfunction TValue_FromDate(const Value: TDate): TValue;\r\nfunction TValue_FromTime(const Value: TTime): TValue;\r\nfunction TValue_FromBytes(const Value: TBytes): TValue;\r\n\r\nfunction TValue_ToString(const Value: TValue): string;\r\n\r\n\r\nimplementation\r\n\r\n{ EInvalidJSCast }\r\n\r\n{$IFDEF PAS2JS}\r\nconstructor EInvalidJSCast.Create(Value: TValue; const TypeName: string);\r\nbegin\r\n inherited CreateFmt('Cannot cast value %s to type %s',\r\n [TValue_ToString(Value), TypeName]);\r\nend;\r\n{$ENDIF}\r\n\r\n{$IFDEF PAS2JS}\r\nfunction TValue_ToString(const Value: TValue): string;\r\nasm\r\n Result = \"\" + Value;\r\nend;\r\n{$ELSE}\r\nfunction TValue_ToString(const Value: TValue): string;\r\nbegin\r\n Result := Value.ToString;\r\nend;\r\n{$ENDIF}\r\n\r\nfunction TValue_IsArray(const Value: TValue): Boolean;\r\nbegin\r\n {$IFDEF PAS2JS}\r\n Result := JS.IsArray(Value);\r\n {$ELSE}\r\n Result := Value.IsArray;\r\n {$ENDIF}\r\nend;\r\n\r\nfunction TValue_GetArrayLength(const Value: TValue): Integer;\r\nbegin\r\n {$IFDEF PAS2JS}\r\n Result := TJSArray(Value).Length;\r\n {$ELSE}\r\n Result := Value.GetArrayLength;\r\n {$ENDIF}\r\nend;\r\n\r\nfunction TValue_GetArrayElement(const Value: TValue; Index: Integer): TValue;\r\nbegin\r\n {$IFDEF PAS2JS}\r\n Result := TJSArray(Value)[Index];\r\n {$ELSE}\r\n Result := Value.GetArrayElement(Index);\r\n {$ENDIF}\r\nend;\r\n\r\nfunction TValue_AsString(const Value: TValue): string;\r\nbegin\r\n {$IFDEF PAS2JS}\r\n if not JS.isString(Value) then\r\n raise EInvalidJSCast.Create(Value, 'String');\r\n Result := string(Value);\r\n {$ELSE}\r\n Result := Value.AsString;\r\n {$ENDIF}\r\nend;\r\n\r\nfunction TValue_AsInteger(const Value: TValue): Integer;\r\nbegin\r\n {$IFDEF PAS2JS}\r\n Result := 0; // Avoid hint\r\n asm\r\n Result = Math.floor(Value);\r\n end;\r\n if (Result <> Value) or (jsTypeOf(Value) <> 'number') then\r\n raise EInvalidJSCast.Create(Value, 'Integer');\r\n {$ELSE}\r\n Result := Value.AsInteger;\r\n {$ENDIF}\r\nend;\r\n\r\n{$IFDEF PAS2JS}\r\nfunction TValue_AsOrdinal(const Value: TValue): Integer;\r\nbegin\r\n Result := TValue_AsInteger(Value);\r\nend;\r\n{$ELSE}\r\nfunction TValue_AsOrdinal(const Value: TValue): Int64;\r\nbegin\r\n Result := Value.AsOrdinal;\r\nend;\r\n{$ENDIF}\r\n\r\nfunction TValue_AsBoolean(const Value: TValue): Boolean;\r\nbegin\r\n {$IFDEF PAS2JS}\r\n Result := False; // Avoid hint\r\n if not JS.isBoolean(Value) then\r\n raise EInvalidJSCast.Create(Value, 'Boolean');\r\n asm\r\n Result = !(Value == false);\r\n end;\r\n {$ELSE}\r\n Result := Value.AsBoolean;\r\n {$ENDIF}\r\nend;\r\n\r\nfunction TValue_AsExtended(const Value: TValue): Extended;\r\nbegin\r\n {$IFDEF PAS2JS}\r\n Result := 0.0; // Avoid hint\r\n if not JS.isNumber(Value) then\r\n raise EInvalidJSCast.Create(Value, 'Number');\r\n asm\r\n Result = rtl.getNumber(Value);\r\n end;\r\n {$ELSE}\r\n Result := Value.AsExtended;\r\n {$ENDIF}\r\nend;\r\n\r\nfunction TValue_FromDateTime(const Value: TDateTime): TValue;\r\nbegin\r\n {$IFDEF PAS2JS}\r\n Result := Value;\r\n {$ELSE}\r\n Result := TValue.From(Value);\r\n {$ENDIF}\r\nend;\r\n\r\nfunction TValue_FromDate(const Value: TDate): TValue;\r\nbegin\r\n {$IFDEF PAS2JS}\r\n Result := Value;\r\n {$ELSE}\r\n Result := TValue.From(Value);\r\n {$ENDIF}\r\nend;\r\n\r\nfunction TValue_FromTime(const Value: TTime): TValue;\r\nbegin\r\n {$IFDEF PAS2JS}\r\n Result := Value;\r\n {$ELSE}\r\n Result := TValue.From(Value);\r\n {$ENDIF}\r\nend;\r\n\r\nfunction TValue_AsDouble(const Value: TValue): Double;\r\nbegin\r\n {$IFDEF PAS2JS}\r\n Result := TValue_AsExtended(Value);\r\n {$ELSE}\r\n Result := Value.AsType;\r\n {$ENDIF}\r\nend;\r\n\r\nfunction TValue_AsBytes(const Value: TValue): TBytes;\r\nbegin\r\n {$IFDEF PAS2JS}\r\n Result := TBytes(Value);\r\n {$ELSE}\r\n Result := Value.AsType;\r\n {$ENDIF}\r\nend;\r\n\r\nfunction TValue_FromBytes(const Value: TBytes): TValue;\r\nbegin\r\n {$IFDEF PAS2JS}\r\n Result := Value;\r\n {$ELSE}\r\n Result := TValue.From(Value);\r\n {$ENDIF}\r\nend;\r\n\r\nfunction TValue_IsEmpty(const Value: TValue): Boolean;\r\nbegin\r\n {$IFDEF PAS2JS}\r\n Result := Value = nil;\r\n {$ELSE}\r\n Result := Value.IsEmpty;\r\n {$ENDIF}\r\nend;\r\n\r\nend.\r\n","unit Bcl.SysUtils;\r\n\r\n{$I Bcl.inc}\r\n\r\ninterface\r\n\r\nfunction TryStrToNumber(const S: string; out Value: double): Boolean;\r\nfunction NumberToStr(const Value: double): string; {$IFDEF PAS2JS}assembler;{$ENDIF}\r\n\r\nimplementation\r\n\r\nuses\r\n {$IFDEF PAS2JS}\r\n JS;\r\n {$ELSE}\r\n SysUtils;\r\n {$ENDIF}\r\n\r\nfunction TryStrToNumber(const S: string; out Value: double): Boolean;\r\n{$IFDEF PAS2JS}\r\nvar\r\n J: JSValue;\r\nbegin\r\n J := parseFloat(S);\r\n Result := not jsIsNaN(J);\r\n if Result then\r\n Value := double(J);\r\nend;\r\n{$ELSE}\r\nvar\r\n FS: TFormatSettings;\r\nbegin\r\n FS.DecimalSeparator := '.';\r\n FS.ThousandSeparator := #0;\r\n Result := TryStrToFloat(S, Value, FS);\r\nend;\r\n{$ENDIF}\r\n\r\n{$IFDEF PAS2JS}\r\nfunction NumberToStr(const Value: double): string; assembler;\r\nasm\r\n return Value.toString();\r\nend;\r\n{$ELSE}\r\nfunction NumberToStr(const Value: double): string;\r\nvar\r\n FS: TFormatSettings;\r\nbegin\r\n FS.DecimalSeparator := '.';\r\n FS.ThousandSeparator := #0;\r\n Result := FloatToStr(Value);\r\nend;\r\n{$ENDIF}\r\n\r\nend.\r\n","{$mode objfpc}\r\n\r\n{\r\n This file is part of the Free Pascal run time library.\r\n Copyright (c) 2018 by the Free Pascal development team\r\n\r\n Delphi/Kylix compatibility unit, provides Date/Time handling routines.\r\n\r\n See the file COPYING.FPC, included in this distribution,\r\n for details about the copyright.\r\n\r\n This program is distributed in the hope that it will be useful,\r\n but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r\n\r\n **********************************************************************}\r\n\r\nunit DateUtils;\r\n\r\ninterface\r\n\r\nuses\r\n SysUtils, Math;\r\n\r\n{ ---------------------------------------------------------------------\r\n Various constants\r\n ---------------------------------------------------------------------}\r\n\r\nconst\r\n DaysPerWeek = 7;\r\n WeeksPerFortnight = 2;\r\n MonthsPerYear = 12;\r\n YearsPerDecade = 10;\r\n YearsPerCentury = 100;\r\n YearsPerMillennium = 1000;\r\n\r\n // ISO day numbers.\r\n DayMonday = 1;\r\n DayTuesday = 2;\r\n DayWednesday = 3;\r\n DayThursday = 4;\r\n DayFriday = 5;\r\n DaySaturday = 6;\r\n DaySunday = 7;\r\n\r\n // Fraction of a day\r\n OneHour = TDateTime(1)/HoursPerDay;\r\n OneMinute = TDateTime(1)/MinsPerDay;\r\n OneSecond = TDateTime(1)/SecsPerDay;\r\n OneMillisecond = TDateTime(1)/MSecsPerDay;\r\n\r\n { This is actual days per year but you need to know if it's a leap year}\r\n DaysPerYear: array [Boolean] of Word = (365, 366);\r\n\r\n { Used in RecodeDate, RecodeTime and RecodeDateTime for those datetime }\r\n { fields you want to leave alone }\r\n RecodeLeaveFieldAsIs = 65535;\r\n\r\n{ ---------------------------------------------------------------------\r\n Global variables used in this unit\r\n ---------------------------------------------------------------------}\r\n\r\nConst\r\n\r\n { Average over a 4 year span. Valid for next 100 years }\r\n ApproxDaysPerMonth: Double = 30.4375;\r\n ApproxDaysPerYear: Double = 365.25;\r\n\r\n\r\n\r\n{ ---------------------------------------------------------------------\r\n Simple trimming functions.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction DateOf(const AValue: TDateTime): TDateTime;\r\nFunction TimeOf(const AValue: TDateTime): TDateTime;\r\n\r\n{ ---------------------------------------------------------------------\r\n Identification functions.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction IsInLeapYear(const AValue: TDateTime): Boolean;\r\nFunction IsPM(const AValue: TDateTime): Boolean;\r\nFunction IsValidDate(const AYear, AMonth, ADay: Word): Boolean;\r\nFunction IsValidTime(const AHour, AMinute, ASecond, AMilliSecond: Word): Boolean;\r\nFunction IsValidDateTime(const AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond: Word): Boolean;\r\nFunction IsValidDateDay(const AYear, ADayOfYear: Word): Boolean;\r\nFunction IsValidDateWeek(const AYear, AWeekOfYear, ADayOfWeek: Word): Boolean;\r\nFunction IsValidDateMonthWeek(const AYear, AMonth, AWeekOfMonth, ADayOfWeek: Word): Boolean;\r\n\r\n{ ---------------------------------------------------------------------\r\n Enumeration functions.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction WeeksInYear(const AValue: TDateTime): Word;\r\nFunction WeeksInAYear(const AYear: Word): Word;\r\nFunction DaysInYear(const AValue: TDateTime): Word;\r\nFunction DaysInAYear(const AYear: Word): Word;\r\nFunction DaysInMonth(const AValue: TDateTime): Word;\r\nFunction DaysInAMonth(const AYear, AMonth: Word): Word;\r\n\r\n\r\n{ ---------------------------------------------------------------------\r\n Variations on current date/time.\r\n ---------------------------------------------------------------------}\r\n\r\n\r\nFunction Today: TDateTime;\r\nFunction Yesterday: TDateTime;\r\nFunction Tomorrow: TDateTime;\r\nFunction IsToday(const AValue: TDateTime): Boolean;\r\nFunction IsSameDay(const AValue, ABasis: TDateTime): Boolean;\r\nfunction IsSameMonth(const Avalue, ABasis: TDateTime): Boolean;\r\nFunction PreviousDayOfWeek (DayOfWeek : Word) : Word;\r\n\r\n{ ---------------------------------------------------------------------\r\n Extraction functions.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction YearOf(const AValue: TDateTime): Word;\r\nFunction MonthOf(const AValue: TDateTime): Word;\r\nFunction WeekOf(const AValue: TDateTime): Word;\r\nFunction DayOf(const AValue: TDateTime): Word;\r\nFunction HourOf(const AValue: TDateTime): Word;\r\nFunction MinuteOf(const AValue: TDateTime): Word;\r\nFunction SecondOf(const AValue: TDateTime): Word;\r\nFunction MilliSecondOf(const AValue: TDateTime): Word;\r\n\r\n{ ---------------------------------------------------------------------\r\n Start/End of year functions.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction StartOfTheYear(const AValue: TDateTime): TDateTime;\r\nFunction EndOfTheYear(const AValue: TDateTime): TDateTime;\r\nFunction StartOfAYear(const AYear: Word): TDateTime;\r\nFunction EndOfAYear(const AYear: Word): TDateTime;\r\n\r\n{ ---------------------------------------------------------------------\r\n Start/End of month functions.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction StartOfTheMonth(const AValue: TDateTime): TDateTime;\r\nFunction EndOfTheMonth(const AValue: TDateTime): TDateTime;\r\nFunction StartOfAMonth(const AYear, AMonth: Word): TDateTime;\r\nFunction EndOfAMonth(const AYear, AMonth: Word): TDateTime;\r\n\r\n{ ---------------------------------------------------------------------\r\n Start/End of week functions.\r\n ---------------------------------------------------------------------}\r\n\r\n\r\nFunction StartOfTheWeek(const AValue: TDateTime): TDateTime;\r\nFunction EndOfTheWeek(const AValue: TDateTime): TDateTime;\r\nFunction StartOfAWeek(const AYear, AWeekOfYear: Word; const ADayOfWeek: Word): TDateTime;\r\nFunction StartOfAWeek(const AYear, AWeekOfYear: Word): TDateTime; // ADayOFWeek 1\r\nFunction EndOfAWeek(const AYear, AWeekOfYear: Word; const ADayOfWeek: Word): TDateTime;\r\nFunction EndOfAWeek(const AYear, AWeekOfYear: Word): TDateTime; // const ADayOfWeek: Word = 7\r\n\r\n\r\n{ ---------------------------------------------------------------------\r\n Start/End of day functions.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction StartOfTheDay(const AValue: TDateTime): TDateTime;\r\nFunction EndOfTheDay(const AValue: TDateTime): TDateTime;\r\nFunction StartOfADay(const AYear, AMonth, ADay: Word): TDateTime; overload;\r\nFunction StartOfADay(const AYear, ADayOfYear: Word): TDateTime; overload;\r\nFunction EndOfADay(const AYear, AMonth, ADay: Word): TDateTime; overload;\r\nFunction EndOfADay(const AYear, ADayOfYear: Word): TDateTime; overload;\r\n\r\n{ ---------------------------------------------------------------------\r\n Part of year functions.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction MonthOfTheYear(const AValue: TDateTime): Word;\r\nFunction WeekOfTheYear(const AValue: TDateTime): Word; overload;\r\nFunction WeekOfTheYear(const AValue: TDateTime; out AYear: Word): Word; overload;\r\nFunction DayOfTheYear(const AValue: TDateTime): Word;\r\nFunction HourOfTheYear(const AValue: TDateTime): Word;\r\nFunction MinuteOfTheYear(const AValue: TDateTime): LongWord;\r\nFunction SecondOfTheYear(const AValue: TDateTime): LongWord;\r\nFunction MilliSecondOfTheYear(const AValue: TDateTime): NativeLargeInt;\r\n\r\n{ ---------------------------------------------------------------------\r\n Part of month functions.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction WeekOfTheMonth(const AValue: TDateTime): Word; overload;\r\nFunction WeekOfTheMonth(const AValue: TDateTime; out AYear, AMonth: Word): Word; overload;\r\nFunction DayOfTheMonth(const AValue: TDateTime): Word;\r\nFunction HourOfTheMonth(const AValue: TDateTime): Word;\r\nFunction MinuteOfTheMonth(const AValue: TDateTime): Word;\r\nFunction SecondOfTheMonth(const AValue: TDateTime): LongWord;\r\nFunction MilliSecondOfTheMonth(const AValue: TDateTime): LongWord;\r\n\r\n{ ---------------------------------------------------------------------\r\n Part of week functions.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction DayOfTheWeek(const AValue: TDateTime): Word;\r\nFunction HourOfTheWeek(const AValue: TDateTime): Word;\r\nFunction MinuteOfTheWeek(const AValue: TDateTime): Word;\r\nFunction SecondOfTheWeek(const AValue: TDateTime): LongWord;\r\nFunction MilliSecondOfTheWeek(const AValue: TDateTime): LongWord;\r\n\r\n{ ---------------------------------------------------------------------\r\n Part of day functions.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction HourOfTheDay(const AValue: TDateTime): Word;\r\nFunction MinuteOfTheDay(const AValue: TDateTime): Word;\r\nFunction SecondOfTheDay(const AValue: TDateTime): LongWord;\r\nFunction MilliSecondOfTheDay(const AValue: TDateTime): LongWord;\r\n\r\n{ ---------------------------------------------------------------------\r\n Part of hour functions.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction MinuteOfTheHour(const AValue: TDateTime): Word;\r\nFunction SecondOfTheHour(const AValue: TDateTime): Word;\r\nFunction MilliSecondOfTheHour(const AValue: TDateTime): LongWord;\r\n\r\n{ ---------------------------------------------------------------------\r\n Part of minute functions.\r\n ---------------------------------------------------------------------}\r\n\r\n\r\nFunction SecondOfTheMinute(const AValue: TDateTime): Word;\r\nFunction MilliSecondOfTheMinute(const AValue: TDateTime): LongWord;\r\n\r\n{ ---------------------------------------------------------------------\r\n Part of second functions.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction MilliSecondOfTheSecond(const AValue: TDateTime): Word;\r\n\r\n\r\n{ ---------------------------------------------------------------------\r\n Range checking functions.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction WithinPastYears(const ANow, AThen: TDateTime; const AYears: Integer): Boolean;\r\nFunction WithinPastMonths(const ANow, AThen: TDateTime; const AMonths: Integer): Boolean;\r\nFunction WithinPastWeeks(const ANow, AThen: TDateTime; const AWeeks: Integer): Boolean;\r\nFunction WithinPastDays(const ANow, AThen: TDateTime; const ADays: Integer): Boolean;\r\nFunction WithinPastHours(const ANow, AThen: TDateTime; const AHours: NativeLargeInt): Boolean;\r\nFunction WithinPastMinutes(const ANow, AThen: TDateTime; const AMinutes: NativeLargeInt): Boolean;\r\nFunction WithinPastSeconds(const ANow, AThen: TDateTime; const ASeconds: NativeLargeInt): Boolean;\r\nFunction WithinPastMilliSeconds(const ANow, AThen: TDateTime; const AMilliSeconds: NativeLargeInt): Boolean;\r\n\r\n{ ---------------------------------------------------------------------\r\n Period functions.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction YearsBetween(const ANow, AThen: TDateTime; AExact : Boolean = False): Integer;\r\nFunction MonthsBetween(const ANow, AThen: TDateTime; AExact : Boolean = False): Integer;\r\nFunction WeeksBetween(const ANow, AThen: TDateTime): Integer;\r\nFunction DaysBetween(const ANow, AThen: TDateTime): Integer;\r\nFunction HoursBetween(const ANow, AThen: TDateTime): NativeLargeInt;\r\nFunction MinutesBetween(const ANow, AThen: TDateTime): NativeLargeInt;\r\nFunction SecondsBetween(const ANow, AThen: TDateTime): NativeLargeInt;\r\nFunction MilliSecondsBetween(const ANow, AThen: TDateTime): NativeLargeInt;\r\nProcedure PeriodBetween(const ANow, AThen: TDateTime; Out Years, months, days : Word); \r\n\r\n{ ---------------------------------------------------------------------\r\n Timespan in xxx functions.\r\n ---------------------------------------------------------------------}\r\n\r\n{ YearSpan and MonthSpan are approximate values }\r\nFunction YearSpan(const ANow, AThen: TDateTime): Double;\r\nFunction MonthSpan(const ANow, AThen: TDateTime): Double;\r\nFunction WeekSpan(const ANow, AThen: TDateTime): Double;\r\nFunction DaySpan(const ANow, AThen: TDateTime): Double;\r\nFunction HourSpan(const ANow, AThen: TDateTime): Double;\r\nFunction MinuteSpan(const ANow, AThen: TDateTime): Double;\r\nFunction SecondSpan(const ANow, AThen: TDateTime): Double;\r\nFunction MilliSecondSpan(const ANow, AThen: TDateTime): Double;\r\n\r\n{ ---------------------------------------------------------------------\r\n Increment/decrement functions.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction IncYear(const AValue: TDateTime; const ANumberOfYears: Integer ): TDateTime;\r\nFunction IncYear(const AValue: TDateTime): TDateTime; // ; const ANumberOfYears: Integer = 1)\r\n// Function IncMonth is in SysUtils\r\nFunction IncWeek(const AValue: TDateTime; const ANumberOfWeeks: Integer): TDateTime;\r\nFunction IncWeek(const AValue: TDateTime): TDateTime; // ; const ANumberOfWeeks: Integer = 1)\r\nFunction IncDay(const AValue: TDateTime; const ANumberOfDays: Integer): TDateTime;\r\nFunction IncDay(const AValue: TDateTime): TDateTime; //; const ANumberOfDays: Integer = 1)\r\nFunction IncHour(const AValue: TDateTime; const ANumberOfHours: NativeLargeInt): TDateTime;\r\nFunction IncHour(const AValue: TDateTime): TDateTime; //; const ANumberOfHours: NativeLargeInt = 1\r\nFunction IncMinute(const AValue: TDateTime; const ANumberOfMinutes: NativeLargeInt): TDateTime;\r\nFunction IncMinute(const AValue: TDateTime): TDateTime; // ; const ANumberOfMinutes: NativeLargeInt = 1\r\nFunction IncSecond(const AValue: TDateTime; const ANumberOfSeconds: NativeLargeInt): TDateTime;\r\nFunction IncSecond(const AValue: TDateTime): TDateTime; // ; const ANumberOfSeconds: NativeLargeInt = 1\r\nFunction IncMilliSecond(const AValue: TDateTime; const ANumberOfMilliSeconds: NativeLargeInt): TDateTime;\r\nFunction IncMilliSecond(const AValue: TDateTime): TDateTime; // ; const ANumberOfMilliSeconds: NativeLargeInt = 1\r\n\r\n{ ---------------------------------------------------------------------\r\n Encode/Decode of complete timestamp\r\n ---------------------------------------------------------------------}\r\n\r\nFunction EncodeDateTime(const AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond: Word): TDateTime;\r\nProcedure DecodeDateTime(const AValue: TDateTime; out AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond: Word);\r\nFunction TryEncodeDateTime(const AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond: Word; out AValue: TDateTime): Boolean;\r\n\r\n{ ---------------------------------------------------------------------\r\n Encode/decode date, specifying week of year and day of week\r\n ---------------------------------------------------------------------}\r\n\r\nFunction EncodeDateWeek(const AYear, AWeekOfYear: Word; const ADayOfWeek: Word): TDateTime;\r\nFunction EncodeDateWeek(const AYear, AWeekOfYear: Word): TDateTime; //; const ADayOfWeek: Word = 1\r\nProcedure DecodeDateWeek(const AValue: TDateTime; out AYear, AWeekOfYear, ADayOfWeek: Word);\r\nFunction TryEncodeDateWeek(const AYear, AWeekOfYear: Word; out AValue: TDateTime; const ADayOfWeek: Word): Boolean;\r\nFunction TryEncodeDateWeek(const AYear, AWeekOfYear: Word; out AValue: TDateTime): Boolean; //; const ADayOfWeek: Word = 1\r\n\r\n{ ---------------------------------------------------------------------\r\n Encode/decode date, specifying day of year\r\n ---------------------------------------------------------------------}\r\n\r\nFunction EncodeDateDay(const AYear, ADayOfYear: Word): TDateTime;\r\nProcedure DecodeDateDay(const AValue: TDateTime; out AYear, ADayOfYear: Word);\r\nFunction TryEncodeDateDay(const AYear, ADayOfYear: Word; out AValue: TDateTime): Boolean;\r\n\r\n{ ---------------------------------------------------------------------\r\n Encode/decode date, specifying week of month\r\n ---------------------------------------------------------------------}\r\n\r\nFunction EncodeDateMonthWeek(const AYear, AMonth, AWeekOfMonth, ADayOfWeek: Word): TDateTime;\r\nProcedure DecodeDateMonthWeek(const AValue: TDateTime; out AYear, AMonth, AWeekOfMonth, ADayOfWeek: Word);\r\nFunction TryEncodeDateMonthWeek(const AYear, AMonth, AWeekOfMonth, ADayOfWeek: Word; out AValue: TDateTime): Boolean;\r\n\r\n{ ---------------------------------------------------------------------\r\n Encode time interval, allowing hours>24\r\n ---------------------------------------------------------------------}\r\n\r\nfunction TryEncodeTimeInterval(Hour, Min, Sec, MSec:word; Out Time : TDateTime) : boolean;\r\nfunction EncodeTimeInterval(Hour, Minute, Second, MilliSecond:word): TDateTime;\r\n\r\n{ ---------------------------------------------------------------------\r\n Replace given element with supplied value.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction RecodeYear(const AValue: TDateTime; const AYear: Word): TDateTime;\r\nFunction RecodeMonth(const AValue: TDateTime; const AMonth: Word): TDateTime;\r\nFunction RecodeDay(const AValue: TDateTime; const ADay: Word): TDateTime;\r\nFunction RecodeHour(const AValue: TDateTime; const AHour: Word): TDateTime;\r\nFunction RecodeMinute(const AValue: TDateTime; const AMinute: Word): TDateTime;\r\nFunction RecodeSecond(const AValue: TDateTime; const ASecond: Word): TDateTime;\r\nFunction RecodeMilliSecond(const AValue: TDateTime; const AMilliSecond: Word): TDateTime;\r\nFunction RecodeDate(const AValue: TDateTime; const AYear, AMonth, ADay: Word): TDateTime;\r\nFunction RecodeTime(const AValue: TDateTime; const AHour, AMinute, ASecond, AMilliSecond: Word): TDateTime;\r\nFunction RecodeDateTime(const AValue: TDateTime; const AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond: Word): TDateTime;\r\nFunction TryRecodeDateTime(const AValue: TDateTime; const AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond: Word; out AResult: TDateTime): Boolean;\r\n\r\n{ ---------------------------------------------------------------------\r\n Comparision of date/time\r\n ---------------------------------------------------------------------}\r\n\r\nFunction CompareDateTime(const A, B: TDateTime): TValueRelationship;\r\nFunction CompareDate(const A, B: TDateTime): TValueRelationship;\r\nFunction CompareTime(const A, B: TDateTime): TValueRelationship;\r\nFunction SameDateTime(const A, B: TDateTime): Boolean;\r\nFunction SameDate(const A, B: TDateTime): Boolean;\r\nFunction SameTime(const A, B: TDateTime): Boolean;\r\n\r\n{ For a given date these Functions tell you the which day of the week of the\r\n month (or year). If its a Thursday, they will tell you if its the first,\r\n second, etc Thursday of the month (or year). Remember, even though its\r\n the first Thursday of the year it doesn't mean its the first week of the\r\n year. See ISO 8601 above for more information. }\r\n\r\nFunction NthDayOfWeek(const AValue: TDateTime): Word;\r\n\r\nProcedure DecodeDayOfWeekInMonth(const AValue: TDateTime; out AYear, AMonth, ANthDayOfWeek, ADayOfWeek: Word);\r\n\r\nFunction EncodeDayOfWeekInMonth(const AYear, AMonth, ANthDayOfWeek, ADayOfWeek: Word): TDateTime;\r\nFunction TryEncodeDayOfWeekInMonth(const AYear, AMonth, ANthDayOfWeek, ADayOfWeek: Word; out AValue: TDateTime): Boolean;\r\n\r\n{ ---------------------------------------------------------------------\r\n Exception throwing routines\r\n ---------------------------------------------------------------------}\r\n\r\nProcedure InvalidDateTimeError(const AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond: Word; const ABaseDate: TDateTime);\r\nProcedure InvalidDateTimeError(const AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond: Word); // const ABaseDate: TDateTime = 0\r\nProcedure InvalidDateWeekError(const AYear, AWeekOfYear, ADayOfWeek: Word);\r\nProcedure InvalidDateDayError(const AYear, ADayOfYear: Word);\r\nProcedure InvalidDateMonthWeekError(const AYear, AMonth, AWeekOfMonth, ADayOfWeek: Word);\r\nProcedure InvalidDayOfWeekInMonthError(const AYear, AMonth, ANthDayOfWeek, ADayOfWeek: Word);\r\n\r\n{ ---------------------------------------------------------------------\r\n Julian and Modified Julian Date conversion support\r\n ---------------------------------------------------------------------}\r\n\r\nFunction DateTimeToJulianDate(const AValue: TDateTime): Double;\r\nFunction JulianDateToDateTime(const AValue: Double): TDateTime;\r\nFunction TryJulianDateToDateTime(const AValue: Double; out ADateTime: TDateTime): Boolean;\r\n\r\nFunction DateTimeToModifiedJulianDate(const AValue: TDateTime): Double;\r\nFunction ModifiedJulianDateToDateTime(const AValue: Double): TDateTime;\r\nFunction TryModifiedJulianDateToDateTime(const AValue: Double; out ADateTime: TDateTime): Boolean;\r\n\r\n{ ---------------------------------------------------------------------\r\n Unix timestamp support.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction DateTimeToUnix(const AValue: TDateTime): NativeLargeInt;\r\nFunction UnixToDateTime(const AValue: NativeLargeInt): TDateTime;\r\nFunction UnixTimeStampToMac(const AValue: NativeLargeInt): NativeLargeInt;\r\n\r\n{ ---------------------------------------------------------------------\r\n Mac timestamp support.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction DateTimeToMac(const AValue: TDateTime): NativeLargeInt;\r\nFunction MacToDateTime(const AValue: NativeLargeInt): TDateTime;\r\nFunction MacTimeStampToUnix(const AValue: NativeLargeInt): NativeLargeInt;\r\n\r\n{ .....................................................................\r\n Dos <-> Delphi datetime support\r\n .....................................................................}\r\n\r\nFunction DateTimeToDosDateTime(const AValue: TDateTime): longint;\r\nFunction DosDateTimeToDateTime( AValue: longint): TDateTime;\r\n\r\n{ UTC <-> Local time }\r\n\r\nFunction UniversalTimeToLocal(UT: TDateTime): TDateTime;\r\nFunction UniversalTimeToLocal(UT: TDateTime; TZOffset : Integer): TDateTime;\r\nFunction LocalTimeToUniversal(LT: TDateTime): TDateTime;\r\nFunction LocalTimeToUniversal(LT: TDateTime; TZOffset: Integer): TDateTime;\r\n\r\n{ RFC 3339 support }\r\n\r\nFunction DateTimeToRFC3339(ADate :TDateTime):string;\r\nFunction DateToRFC3339(ADate :TDateTime):string;\r\nFunction TimeToRFC3339(ADate :TDateTime):string;\r\nFunction TryRFC3339ToDateTime(const Avalue: String; out ADateTime: TDateTime): Boolean;\r\nFunction RFC3339ToDateTime(const Avalue: String): TDateTime;\r\n\r\nType\r\n {\r\n Inverse of formatdatetime, destined for the dateutils unit of FPC.\r\n\r\n Limitations/implementation details:\r\n - An inverse of FormatDateTime is not 100% an inverse, simply because one can put e.g. time tokens twice in the format string,\r\n and scandatetime wouldn't know which time to pick.\r\n - Strings like hn can't be reversed safely. E.g. 1:2 (2 minutes after 1) delivers 12 which is parsed as 12:00 and then\r\n misses chars for the \"n\" part.\r\n - trailing characters are ignored.\r\n - no support for Eastern Asian formatting characters since they are windows only.\r\n - no MBCS support.\r\n\r\n Extensions\r\n - #9 eats whitespace.\r\n - whitespace at the end of a pattern is optional.\r\n - ? matches any char.\r\n - Quote the above chars to really match the char.\r\n }\r\n\r\n { TDateTimeScanner }\r\n\r\n TDateTimeScanner = Class\r\n Private\r\n FPattern: String;\r\n FText: String;\r\n FPatternOffset,\r\n FLen,FPatternLen: Integer;\r\n FPatternPos,FPos : Integer;\r\n FY,FM,FD : Word;\r\n FTimeval : TDateTime;\r\n procedure ArrayMatchError;\r\n procedure DoDateTime;\r\n procedure SetPattern(AValue: String);\r\n procedure SetText(AValue: String);\r\n function ScanFixedInt(maxv:integer):integer;\r\n function ScanPatternLength :integer;\r\n procedure MatchChar(c:char);\r\n function FindIMatch(const values :array of string; aTerm : string):integer;\r\n function FindMatch(const Values : array of string):integer;\r\n Procedure MatchPattern(const aPattern : String);\r\n Procedure DoYear;\r\n Procedure DoMonth;\r\n Procedure DoDay;\r\n Procedure DoTime;\r\n Procedure DoAMPM;\r\n Public\r\n Function Scan(StartPos: integer = -1) : TDateTime;\r\n property Pattern : String Read FPattern Write SetPattern;\r\n Property Text : String Read FText Write SetText;\r\n Property PatternOffset : Integer Read FPatternOffset;\r\n Property Position: Integer read FPos;\r\n end;\r\n\r\n // Easy access function\r\nFunction ScanDateTime(APattern,AValue: String; APos : integer = 1) : TDateTime;\r\n\r\nimplementation\r\n\r\nuses js, rtlconsts;\r\n\r\nconst\r\n TDateTimeEpsilon = 2.2204460493e-16;\r\n HalfMilliSecond = OneMillisecond /2 ;\r\n\r\n{ ---------------------------------------------------------------------\r\n Simple trimming functions.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction DateOf(const AValue: TDateTime): TDateTime;\r\nbegin\r\n Result:=Trunc(AValue);\r\nend;\r\n\r\n\r\nFunction TimeOf(const AValue: TDateTime): TDateTime;\r\nbegin\r\n Result:=Frac(Avalue);\r\nend;\r\n\r\n\r\n{ ---------------------------------------------------------------------\r\n Identification functions.\r\n ---------------------------------------------------------------------}\r\n\r\n\r\nFunction IsInLeapYear(const AValue: TDateTime): Boolean;\r\nbegin\r\n Result:=IsLeapYear(YearOf(AValue));\r\nend;\r\n\r\n\r\nFunction IsPM(const AValue: TDateTime): Boolean;\r\nbegin\r\n Result:=(HourOf(AValue)>=12);\r\nend;\r\n\r\n\r\nFunction IsValidMonth(AMonth : Word) : Boolean;\r\n\r\nbegin\r\n Result:=(AMonth>=1) and (AMonth<=12);\r\nend;\r\n\r\nFunction IsValidDayOfWeek(ADayOfWeek : Word) : Boolean;\r\n\r\nbegin\r\n Result:=(ADayOfWeek>=1) and (ADayOfWeek<=7);\r\nend;\r\n\r\nFunction IsValidWeekOfMonth(AWeekOfMonth : Word) : Boolean;\r\n\r\nbegin\r\n Result:=(AWeekOfMonth>=1) and (AWeekOfMonth<=5);\r\nend;\r\n\r\nFunction IsValidDate(const AYear, AMonth, ADay: Word): Boolean;\r\nbegin\r\n Result:=(AYear<>0) and (AYear<10000)\r\n and IsValidMonth(AMonth)\r\n and (ADay<>0) and (ADay<=MonthDays[IsleapYear(AYear),AMonth]);\r\nend;\r\n\r\n\r\nFunction IsValidTime(const AHour, AMinute, ASecond, AMilliSecond: Word): Boolean;\r\nbegin\r\n Result:=(AHour=HoursPerDay) and (AMinute=0) and (ASecond=0) and (AMillisecond=0);\r\n Result:=Result or\r\n ((AHour0) and (ADayOfYear<>0) and (AYear<10000) and\r\n (ADayOfYear<=DaysPerYear[IsLeapYear(AYear)]);\r\nend;\r\n\r\n\r\nFunction IsValidDateWeek(const AYear, AWeekOfYear, ADayOfWeek: Word): Boolean;\r\nbegin\r\n Result:=(AYear<>0) and (AYear<10000)\r\n and IsValidDayOfWeek(ADayOfWeek)\r\n and (AWeekOfYear<>0)\r\n and (AWeekOfYear<=WeeksInaYear(AYear));\r\n { should we not also check whether the day of the week is not\r\n larger than the last day of the last week in the year 9999 ?? }\r\nend;\r\n\r\n\r\nFunction IsValidDateMonthWeek(const AYear, AMonth, AWeekOfMonth, ADayOfWeek: Word): Boolean;\r\n\r\nbegin\r\n Result:=(AYear<>0) and (AYear<10000)\r\n and IsValidMonth(AMonth)\r\n and IsValidWeekOfMonth(AWeekOfMonth)\r\n and IsValidDayOfWeek(ADayOfWeek);\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n Enumeration functions.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction WeeksInYear(const AValue: TDateTime): Word;\r\nbegin\r\n Result:=WeeksInAYear(YearOf(AValue));\r\nend;\r\n\r\n\r\nFunction WeeksInAYear(const AYear: Word): Word;\r\n\r\nVar\r\n DOW : Word;\r\n\r\nbegin\r\n Result:=52;\r\n DOW:=DayOfTheWeek(StartOfAYear(AYear));\r\n If (DOW=4) or ((DOW=3) and IsLeapYear(AYear)) then\r\n Inc(Result);\r\nend;\r\n\r\n\r\nFunction DaysInYear(const AValue: TDateTime): Word;\r\nbegin\r\n Result:=DaysPerYear[IsLeapYear(YearOf(AValue))];\r\nend;\r\n\r\n\r\nFunction DaysInAYear(const AYear: Word): Word;\r\nbegin\r\n Result:=DaysPerYear[Isleapyear(AYear)];\r\nend;\r\n\r\n\r\nFunction DaysInMonth(const AValue: TDateTime): Word;\r\n\r\nVar\r\n Y,M,D : Word;\r\n\r\nbegin\r\n Decodedate(AValue,Y,M,D);\r\n Result:=MonthDays[IsLeapYear(Y),M];\r\nend;\r\n\r\n\r\nFunction DaysInAMonth(const AYear, AMonth: Word): Word;\r\nbegin\r\n Result:=MonthDays[IsLeapYear(AYear),AMonth];\r\nend;\r\n\r\n\r\n{ ---------------------------------------------------------------------\r\n Variations on current date/time.\r\n ---------------------------------------------------------------------}\r\n\r\n\r\nFunction Today: TDateTime;\r\nbegin\r\n Result:=Date();\r\nend;\r\n\r\n\r\nFunction Yesterday: TDateTime;\r\nbegin\r\n Result:=Date()-1;\r\nend;\r\n\r\n\r\nFunction Tomorrow: TDateTime; \r\nbegin\r\n Result:=Date()+1;\r\nend;\r\n\r\n\r\nFunction IsToday(const AValue: TDateTime): Boolean;\r\nbegin\r\n Result:=IsSameDay(AValue,Date());\r\nend;\r\n\r\n\r\nFunction IsSameDay(const AValue, ABasis: TDateTime): Boolean;\r\n\r\nVar\r\n D : TDateTime;\r\n\r\nbegin\r\n D:=AValue-Trunc(ABasis);\r\n Result:=(D>=0) and (D<1);\r\nend;\r\n\r\nfunction IsSameMonth(const Avalue, ABasis: TDateTime): Boolean;\r\nbegin\r\n result:=( YearOf(Avalue) = YearOf(Abasis) );\r\n result:=result and ( MonthOf(AValue) = MonthOf(ABasis) );\r\nend;\r\n\r\nconst\r\n DOWMap: array [1..7] of Word = (7, 1, 2, 3, 4, 5, 6);\r\n\r\nFunction PreviousDayOfWeek (DayOfWeek : Word) : Word;\r\n\r\nbegin\r\n If Not IsValidDayOfWeek(DayOfWeek) then\r\n Raise EConvertError.CreateFmt(SErrInvalidDayOfWeek,[DayOfWeek]);\r\n Result:=DOWMap[DayOfWeek];\r\nend;\r\n\r\n\r\n\r\n{ ---------------------------------------------------------------------\r\n Extraction functions.\r\n ---------------------------------------------------------------------}\r\n\r\n\r\nFunction YearOf(const AValue: TDateTime): Word;\r\n\r\nVar\r\n D,M : Word;\r\n\r\nbegin\r\n DecodeDate(AValue,Result,D,M);\r\nend;\r\n\r\n\r\nFunction MonthOf(const AValue: TDateTime): Word;\r\n\r\nVar\r\n Y,D : Word;\r\n\r\nbegin\r\n DecodeDate(AValue,Y,Result,D);\r\nend;\r\n\r\n\r\nFunction WeekOf(const AValue: TDateTime): Word;\r\nbegin\r\n Result:=WeekOfTheYear(AValue);\r\nend;\r\n\r\n\r\nFunction DayOf(const AValue: TDateTime): Word;\r\n\r\nVar\r\n Y,M : Word;\r\n\r\nbegin\r\n DecodeDate(AValue,Y,M,Result);\r\nend;\r\n\r\n\r\nFunction HourOf(const AValue: TDateTime): Word;\r\n\r\nVar\r\n N,S,MS : Word;\r\n\r\nbegin\r\n DecodeTime(AValue,Result,N,S,MS);\r\nend;\r\n\r\n\r\nFunction MinuteOf(const AValue: TDateTime): Word;\r\n\r\nVar\r\n H,S,MS : Word;\r\n\r\nbegin\r\n DecodeTime(AValue,H,Result,S,MS);\r\nend;\r\n\r\n\r\nFunction SecondOf(const AValue: TDateTime): Word;\r\n\r\nVar\r\n H,N,MS : Word;\r\n\r\nbegin\r\n DecodeTime(AValue,H,N,Result,MS);\r\nend;\r\n\r\n\r\nFunction MilliSecondOf(const AValue: TDateTime): Word;\r\n\r\nVar\r\n H,N,S : Word;\r\n\r\nbegin\r\n DecodeTime(AValue,H,N,S,Result);\r\nend;\r\n\r\n\r\n{ ---------------------------------------------------------------------\r\n Start/End of year functions.\r\n ---------------------------------------------------------------------}\r\n\r\n\r\nFunction StartOfTheYear(const AValue: TDateTime): TDateTime;\r\nbegin\r\n Result:=EncodeDate(YearOf(AValue),1,1);\r\nend;\r\n\r\n\r\nFunction EndOfTheYear(const AValue: TDateTime): TDateTime;\r\nbegin\r\n Result:=EncodeDateTime(YearOf(AValue),12,31,23,59,59,999);\r\nend;\r\n\r\n\r\nFunction StartOfAYear(const AYear: Word): TDateTime;\r\nbegin\r\n Result:=EncodeDate(AYear,1,1);\r\nend;\r\n\r\n\r\nFunction EndOfAYear(const AYear: Word): TDateTime;\r\n\r\nbegin\r\n Result:=(EncodeDateTime(AYear,12,31,23,59,59,999));\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n Start/End of month functions.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction StartOfTheMonth(const AValue: TDateTime): TDateTime;\r\n\r\nVar\r\n Y,M,D : Word;\r\n\r\nbegin\r\n DecodeDate(AValue,Y,M,D);\r\n Result:=EncodeDate(Y,M,1);\r\n// MonthDays[IsLeapYear(Y),M])\r\nend;\r\n\r\n\r\nFunction EndOfTheMonth(const AValue: TDateTime): TDateTime;\r\n\r\nVar\r\n Y,M,D : Word;\r\n\r\nbegin\r\n DecodeDate(AValue,Y,M,D);\r\n Result:=EncodeDateTime(Y,M,MonthDays[IsLeapYear(Y),M],23,59,59,999);\r\nend;\r\n\r\n\r\nFunction StartOfAMonth(const AYear, AMonth: Word): TDateTime;\r\nbegin\r\n Result:=EncodeDate(AYear,AMonth,1);\r\nend;\r\n\r\n\r\nFunction EndOfAMonth(const AYear, AMonth: Word): TDateTime;\r\n\r\nbegin\r\n Result:=EncodeDateTime(AYear,AMonth,MonthDays[IsLeapYear(AYear),AMonth],23,59,59,999);\r\nend;\r\n\r\n\r\n{ ---------------------------------------------------------------------\r\n Start/End of week functions.\r\n ---------------------------------------------------------------------}\r\n\r\n\r\nFunction StartOfTheWeek(const AValue: TDateTime): TDateTime;\r\nbegin\r\n Result:=Trunc(AValue)-DayOfTheWeek(AValue)+1;\r\nend;\r\n\r\n\r\nFunction EndOfTheWeek(const AValue: TDateTime): TDateTime;\r\nbegin\r\n Result:=EndOfTheDay(AValue-DayOfTheWeek(AValue)+7);\r\nend;\r\n\r\n\r\nFunction StartOfAWeek(const AYear, AWeekOfYear: Word; const ADayOfWeek: Word): TDateTime;\r\nbegin\r\n Result:=EncodeDateWeek(AYear,AWeekOfYear,ADayOfWeek);\r\nend;\r\n\r\n\r\nFunction StartOfAWeek(const AYear, AWeekOfYear: Word): TDateTime; // ADayOFWeek 1\r\nbegin\r\n Result:=StartOfAWeek(AYear,AWeekOfYear,1)\r\nend;\r\n\r\n\r\nFunction EndOfAWeek(const AYear, AWeekOfYear: Word; const ADayOfWeek: Word): TDateTime;\r\nbegin\r\n Result := EndOfTheDay(EncodeDateWeek(AYear, AWeekOfYear, ADayOfWeek));\r\nend;\r\n\r\n\r\nFunction EndOfAWeek(const AYear, AWeekOfYear: Word): TDateTime; // const ADayOfWeek: Word = 7\r\n\r\n\r\nbegin\r\n Result:=EndOfAWeek(AYear,AWeekOfYear,7);\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n Start/End of day functions.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction StartOfTheDay(const AValue: TDateTime): TDateTime;\r\nbegin\r\n Result:=Trunc(Avalue);\r\nend;\r\n\r\n\r\nFunction EndOfTheDay(const AValue: TDateTime): TDateTime;\r\n\r\nVar\r\n Y,M,D : Word;\r\n\r\nbegin\r\n DecodeDate(AValue,Y,M,D);\r\n Result:=EncodeDateTime(Y,M,D,23,59,59,999);\r\nend;\r\n\r\n\r\nFunction StartOfADay(const AYear, AMonth, ADay: Word): TDateTime;\r\nbegin\r\n Result:=EncodeDate(AYear,AMonth,ADay);\r\nend;\r\n\r\n\r\nFunction StartOfADay(const AYear, ADayOfYear: Word): TDateTime;\r\nbegin\r\n Result:=StartOfAYear(AYear)+ADayOfYear-1;\r\nend;\r\n\r\n\r\nFunction EndOfADay(const AYear, AMonth, ADay: Word): TDateTime;\r\nbegin\r\n Result:=EndOfTheDay(EncodeDate(AYear,AMonth,ADay));\r\nend;\r\n\r\n\r\nFunction EndOfADay(const AYear, ADayOfYear: Word): TDateTime;\r\n\r\n\r\nbegin\r\n Result:=StartOfAYear(AYear)+ADayOfYear-1+EncodeTime(23,59,59,999);\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n Part of year functions.\r\n ---------------------------------------------------------------------}\r\n\r\n\r\nFunction MonthOfTheYear(const AValue: TDateTime): Word;\r\nbegin\r\n Result:=MonthOf(AValue);\r\nend;\r\n\r\n\r\nFunction WeekOfTheYear(const AValue: TDateTime): Word;\r\n\r\nVar\r\n Y,DOW : Word;\r\n\r\nbegin\r\n DecodeDateWeek(AValue,Y,Result,DOW)\r\nend;\r\n\r\n\r\nFunction WeekOfTheYear(const AValue: TDateTime; out AYear: Word): Word;\r\n\r\nVar\r\n DOW : Word;\r\n\r\nbegin\r\n DecodeDateWeek(AValue,AYear,Result,DOW);\r\nend;\r\n\r\n\r\nFunction DayOfTheYear(const AValue: TDateTime): Word;\r\nbegin\r\n Result:=Trunc(AValue-StartOfTheYear(AValue)+1);\r\nend;\r\n\r\n\r\nFunction HourOfTheYear(const AValue: TDateTime): Word;\r\n\r\nVar\r\n H,M,S,MS : Word;\r\n\r\nbegin\r\n DecodeTime(AValue,H,M,S,MS);\r\n Result:=H+((DayOfTheYear(AValue)-1)*24);\r\nend;\r\n\r\n\r\nFunction MinuteOfTheYear(const AValue: TDateTime): LongWord;\r\n\r\nVar\r\n H,M,S,MS : Word;\r\n\r\nbegin\r\n DecodeTime(AValue,H,M,S,MS);\r\n Result:=M+(H+((DayOfTheYear(AValue)-1)*24))*60;\r\nend;\r\n\r\n\r\nFunction SecondOfTheYear(const AValue: TDateTime): LongWord;\r\n\r\nVar\r\n H,M,S,MS : Word;\r\n\r\nbegin\r\n DecodeTime(AValue,H,M,S,MS);\r\n Result:=(M+(H+((DayOfTheYear(AValue)-1)*24))*60)*60+S;\r\nend;\r\n\r\n\r\nFunction MilliSecondOfTheYear(const AValue: TDateTime): NativeLargeInt;\r\n\r\nVar\r\n H,M,S,MS : Word;\r\n\r\nbegin\r\n DecodeTime(AValue,H,M,S,MS);\r\n Result:=((M+(H+((NativeLargeInt(DayOfTheYear(AValue))-1)*24))*60)*60+S)*1000+MS;\r\nend;\r\n\r\n\r\n{ ---------------------------------------------------------------------\r\n Part of month functions.\r\n ---------------------------------------------------------------------}\r\n\r\n\r\nFunction WeekOfTheMonth(const AValue: TDateTime): Word;\r\n\r\nvar\r\n Y,M,DOW : word;\r\n\r\nbegin\r\n DecodeDateMonthWeek(AValue,Y,M,Result,DOW);\r\nend;\r\n\r\n\r\nFunction WeekOfTheMonth(const AValue: TDateTime; out AYear, AMonth: Word): Word;\r\n\r\nVar\r\n DOW : Word;\r\n\r\nbegin\r\n DecodeDateMonthWeek(AValue,AYear,AMonth,Result,DOW);\r\nend;\r\n\r\n\r\nFunction DayOfTheMonth(const AValue: TDateTime): Word;\r\n\r\nVar\r\n Y,M : Word;\r\n\r\nbegin\r\n DecodeDate(AValue,Y,M,Result);\r\nend;\r\n\r\n\r\nFunction HourOfTheMonth(const AValue: TDateTime): Word;\r\n\r\nVar\r\n Y,M,D,H,N,S,MS : Word;\r\n\r\nbegin\r\n DecodeDateTime(AValue,Y,M,D,H,N,S,MS);\r\n Result:=(D-1)*24+H;\r\nend;\r\n\r\n\r\nFunction MinuteOfTheMonth(const AValue: TDateTime): Word;\r\n\r\nVar\r\n Y,M,D,H,N,S,MS : Word;\r\n\r\nbegin\r\n DecodeDateTime(AValue,Y,M,D,H,N,S,MS);\r\n Result:=((D-1)*24+H)*60+N;\r\nend;\r\n\r\n\r\nFunction SecondOfTheMonth(const AValue: TDateTime): LongWord;\r\n\r\nVar\r\n Y,M,D,H,N,S,MS : Word;\r\n\r\nbegin\r\n DecodeDateTime(AValue,Y,M,D,H,N,S,MS);\r\n Result:=(((D-1)*24+H)*60+N)*60+S;\r\nend;\r\n\r\n\r\nFunction MilliSecondOfTheMonth(const AValue: TDateTime): LongWord;\r\n\r\nVar\r\n Y,M,D,H,N,S,MS : Word;\r\n\r\nbegin\r\n DecodeDateTime(AValue,Y,M,D,H,N,S,MS);\r\n Result:=((((D-1)*24+H)*60+N)*60+S)*1000+MS;\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n Part of week functions.\r\n ---------------------------------------------------------------------}\r\n\r\n\r\nFunction DayOfTheWeek(const AValue: TDateTime): Word;\r\n\r\nbegin\r\n Result:=DowMAP[DayOfWeek(AValue)];\r\nend;\r\n\r\n\r\nFunction HourOfTheWeek(const AValue: TDateTime): Word;\r\n\r\nVar\r\n H,M,S,MS : Word;\r\n\r\nbegin\r\n DecodeTime(AValue,H,M,S,MS);\r\n Result:=(DayOfTheWeek(AValue)-1)*24+H;\r\nend;\r\n\r\n\r\nFunction MinuteOfTheWeek(const AValue: TDateTime): Word;\r\n\r\nVar\r\n H,M,S,MS : Word;\r\n\r\nbegin\r\n DecodeTime(AValue,H,M,S,MS);\r\n Result:=((DayOfTheWeek(AValue)-1)*24+H)*60+M;\r\nend;\r\n\r\n\r\nFunction SecondOfTheWeek(const AValue: TDateTime): LongWord;\r\n\r\nVar\r\n H,M,S,MS : Word;\r\n\r\nbegin\r\n DecodeTime(AValue,H,M,S,MS);\r\n Result:=(((DayOfTheWeek(AValue)-1)*24+H)*60+M)*60+S;\r\nend;\r\n\r\n\r\nFunction MilliSecondOfTheWeek(const AValue: TDateTime): LongWord;\r\n\r\n\r\nVar\r\n H,M,S,MS : Word;\r\n\r\nbegin\r\n DecodeTime(AValue,H,M,S,MS);\r\n Result:=((((DayOfTheWeek(AValue)-1)*24+H)*60+M)*60+S)*1000+MS;\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n Part of day functions.\r\n ---------------------------------------------------------------------}\r\n\r\n\r\nFunction HourOfTheDay(const AValue: TDateTime): Word;\r\nbegin\r\n Result:=HourOf(AValue);\r\nend;\r\n\r\n\r\nFunction MinuteOfTheDay(const AValue: TDateTime): Word;\r\n\r\nVar\r\n H,M,S,MS : Word;\r\n\r\nbegin\r\n DecodeTime(AValue,H,M,S,MS);\r\n Result:=(H*60)+M;\r\nend;\r\n\r\n\r\nFunction SecondOfTheDay(const AValue: TDateTime): LongWord;\r\n\r\nVar\r\n H,M,S,MS : Word;\r\n\r\nbegin\r\n DecodeTime(AValue,H,M,S,MS);\r\n Result:=((H*60)+M)*60+S;\r\nend;\r\n\r\n\r\nFunction MilliSecondOfTheDay(const AValue: TDateTime): LongWord;\r\n\r\nVar\r\n H,M,S,MS : Word;\r\n\r\nbegin\r\n DecodeTime(AValue,H,M,S,MS);\r\n Result:=(((H*60)+M)*60+S)*1000+MS;\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n Part of hour functions.\r\n ---------------------------------------------------------------------}\r\n\r\n\r\nFunction MinuteOfTheHour(const AValue: TDateTime): Word;\r\nbegin\r\n Result:=MinuteOf(AValue);\r\nend;\r\n\r\n\r\nFunction SecondOfTheHour(const AValue: TDateTime): Word;\r\n\r\nVar\r\n H,S,M,MS : Word;\r\n\r\nbegin\r\n DecodeTime(AValue,H,M,S,MS);\r\n Result:=M*60+S;\r\nend;\r\n\r\n\r\nFunction MilliSecondOfTheHour(const AValue: TDateTime): LongWord;\r\n\r\nVar\r\n H,S,M,MS : Word;\r\n\r\nbegin\r\n DecodeTime(AValue,H,M,S,MS);\r\n Result:=(M*60+S)*1000+MS;\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n Part of minute functions.\r\n ---------------------------------------------------------------------}\r\n\r\n\r\nFunction SecondOfTheMinute(const AValue: TDateTime): Word;\r\nbegin\r\n Result:=SecondOf(AValue);\r\nend;\r\n\r\n\r\nFunction MilliSecondOfTheMinute(const AValue: TDateTime): LongWord;\r\n\r\nVar\r\n H,S,M,MS : Word;\r\n\r\nbegin\r\n DecodeTime(AValue,H,M,S,MS);\r\n Result:=S*1000+MS;\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n Part of second functions.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction MilliSecondOfTheSecond(const AValue: TDateTime): Word;\r\nbegin\r\n Result:=MilliSecondOf(AValue);\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n Range checking functions.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction WithinPastYears(const ANow, AThen: TDateTime; const AYears: Integer): Boolean;\r\nbegin\r\n Result:=YearsBetween(ANow,AThen)<=AYears;\r\nend;\r\n\r\n\r\nFunction WithinPastMonths(const ANow, AThen: TDateTime; const AMonths: Integer): Boolean;\r\nbegin\r\n Result:=MonthsBetween(ANow,AThen)<=AMonths;\r\nend;\r\n\r\n\r\nFunction WithinPastWeeks(const ANow, AThen: TDateTime; const AWeeks: Integer): Boolean;\r\nbegin\r\n Result:=WeeksBetween(ANow,AThen)<=AWeeks;\r\nend;\r\n\r\n\r\nFunction WithinPastDays(const ANow, AThen: TDateTime; const ADays: Integer): Boolean;\r\nbegin\r\n Result:=DaysBetween(ANow,AThen)<=ADays;\r\nend;\r\n\r\n\r\nFunction WithinPastHours(const ANow, AThen: TDateTime; const AHours: NativeLargeInt): Boolean;\r\nbegin\r\n Result:=HoursBetween(ANow,AThen)<=AHours;\r\nend;\r\n\r\n\r\nFunction WithinPastMinutes(const ANow, AThen: TDateTime; const AMinutes: NativeLargeInt): Boolean;\r\nbegin\r\n Result:=MinutesBetween(ANow,AThen)<=AMinutes;\r\nend;\r\n\r\n\r\nFunction WithinPastSeconds(const ANow, AThen: TDateTime; const ASeconds: NativeLargeInt): Boolean;\r\nbegin\r\n Result:=SecondsBetween(ANow,Athen)<=ASeconds;\r\nend;\r\n\r\n\r\nFunction WithinPastMilliSeconds(const ANow, AThen: TDateTime; const AMilliSeconds: NativeLargeInt): Boolean;\r\nbegin\r\n Result:=MilliSecondsBetween(ANow,AThen)<=AMilliSeconds;\r\nend;\r\n\r\n\r\n{ ---------------------------------------------------------------------\r\n Period functions.\r\n ---------------------------------------------------------------------}\r\n\r\n{\r\n These functions are declared as approximate by Borland.\r\n A bit strange, since it can be calculated exactly ?\r\n\r\n -- No, because you need rounding or truncating (JM)\r\n}\r\n\r\n\r\nFunction DateTimeDiff(const ANow, AThen: TDateTime): TDateTime;\r\nbegin\r\n Result:= ANow - AThen;\r\n if (ANow>0) and (AThen<0) then\r\n Result:=Result-0.5\r\n else if (ANow<-1.0) and (AThen>-1.0) then\r\n Result:=Result+0.5;\r\nend;\r\n\r\n\r\nFunction YearsBetween(const ANow, AThen: TDateTime; AExact : Boolean = False): Integer;\r\n\r\nvar\r\n yy, mm, dd: Word;\r\n \r\nbegin\r\n if AExact and (ANow >= -DateDelta) and (AThen >= -DateDelta) and\r\n (ANow <= MaxDateTime) and (AThen <= MaxDateTime) then\r\n begin\r\n PeriodBetween(ANow, AThen, yy , mm, dd);\r\n Result := yy;\r\n end\r\n else\r\n Result:=Trunc((Abs(DateTimeDiff(ANow,AThen))+HalfMilliSecond)/ApproxDaysPerYear);\r\nend;\r\n\r\n\r\nFunction MonthsBetween(const ANow, AThen: TDateTime; AExact : Boolean = False): Integer;\r\n\r\nvar\r\n y, m, d: Word;\r\n\r\nbegin\r\n if AExact and (ANow >= -DateDelta) and (AThen >= -DateDelta) and\r\n (ANow <= MaxDateTime) and (AThen <= MaxDateTime) then\r\n begin\r\n PeriodBetween(ANow, AThen, y, m, d);\r\n Result := y*12 + m;\r\n end\r\n else\r\n Result:=Trunc((Abs(DateTimeDiff(ANow,AThen))+HalfMilliSecond)/ApproxDaysPerMonth);\r\nend;\r\n\r\n\r\nFunction WeeksBetween(const ANow, AThen: TDateTime): Integer;\r\nbegin\r\n Result:=Trunc(Abs(DateTimeDiff(ANow,AThen))+HalfMilliSecond) div 7;\r\nend;\r\n\r\n\r\nFunction DaysBetween(const ANow, AThen: TDateTime): Integer;\r\nbegin\r\n Result:=Trunc(Abs(DateTimeDiff(ANow,AThen))+HalfMilliSecond);\r\nend;\r\n\r\n\r\nFunction HoursBetween(const ANow, AThen: TDateTime): NativeLargeInt;\r\nbegin\r\n Result:=Trunc((Abs(DateTimeDiff(ANow,AThen))+HalfMilliSecond)*HoursPerDay);\r\nend;\r\n\r\n\r\nFunction MinutesBetween(const ANow, AThen: TDateTime): NativeLargeInt;\r\nbegin\r\n Result:=Trunc((Abs(DateTimeDiff(ANow,AThen))+HalfMilliSecond)*MinsPerDay);\r\nend;\r\n\r\n\r\nFunction SecondsBetween(const ANow, AThen: TDateTime): NativeLargeInt;\r\nbegin\r\n Result:=Trunc((Abs(DateTimeDiff(ANow,AThen))+HalfMilliSecond)*SecsPerDay);\r\nend;\r\n\r\n\r\nFunction MilliSecondsBetween(const ANow, AThen: TDateTime): NativeLargeInt;\r\nbegin\r\n Result:=Trunc((Abs(DateTimeDiff(ANow,AThen))+HalfMilliSecond)*MSecsPerDay);\r\nend;\r\n\r\nProcedure PeriodBetween(Const ANow, AThen: TDateTime; Out Years, months, days : Word); \r\n\r\nvar\r\n Y1, Y2, M1, M2, D1, D2: word;\r\n\r\nbegin\r\n if (AThen>ANow) then\r\n begin\r\n DecodeDate(ANow,Y1,M1,D1);\r\n DecodeDate(AThen,Y2,M2,D2);\r\n end\r\n else\r\n begin \r\n DecodeDate(AThen,Y1,M1,D1);\r\n DecodeDate(ANow,Y2,M2,D2);\r\n end;\r\n Years:=Y2-Y1;\r\n if (M1>M2) or ((M1=M2) and (D1>D2)) then Dec(Years);\r\n if (M1>M2) then Inc(M2,12); //already adjusted Years in that case\r\n Months:=M2-M1;\r\n if (D2>=D1) then\r\n Days:=D2-D1\r\n else\r\n begin\r\n if (Months=0) then\r\n Months:=11\r\n else\r\n Dec(Months);\r\n Days:=(DaysInAMonth(Y1,M1)-D1)+D2;\r\n end;\r\nend; \r\n\r\n{ ---------------------------------------------------------------------\r\n Timespan in xxx functions.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction YearSpan(const ANow, AThen: TDateTime): Double;\r\nbegin\r\n Result:=Abs(DateTimeDiff(ANow,AThen))/ApproxDaysPerYear;\r\nend;\r\n\r\n\r\nFunction MonthSpan(const ANow, AThen: TDateTime): Double;\r\nbegin\r\n Result:=Abs(DateTimeDiff(ANow,AThen))/ApproxDaysPerMonth;\r\nend;\r\n\r\n\r\nFunction WeekSpan(const ANow, AThen: TDateTime): Double;\r\nbegin\r\n Result:=Abs(DateTimeDiff(ANow,AThen)) / 7\r\nend;\r\n\r\n\r\nFunction DaySpan(const ANow, AThen: TDateTime): Double;\r\nbegin\r\n Result:=Abs(DateTimeDiff(ANow,AThen));\r\nend;\r\n\r\n\r\nFunction HourSpan(const ANow, AThen: TDateTime): Double;\r\nbegin\r\n Result:=Abs(DateTimeDiff(ANow,AThen))*HoursPerDay;\r\nend;\r\n\r\n\r\nFunction MinuteSpan(const ANow, AThen: TDateTime): Double;\r\nbegin\r\n Result:=Abs(DateTimeDiff(ANow,AThen))*MinsPerDay;\r\nend;\r\n\r\n\r\nFunction SecondSpan(const ANow, AThen: TDateTime): Double;\r\nbegin\r\n Result:=Abs(DateTimeDiff(ANow,AThen))*SecsPerDay;\r\nend;\r\n\r\n\r\nFunction MilliSecondSpan(const ANow, AThen: TDateTime): Double;\r\nbegin\r\n Result:=Abs(DateTimeDiff(ANow,AThen))*MSecsPerDay;\r\nend;\r\n\r\n\r\n{ ---------------------------------------------------------------------\r\n Increment/decrement functions.\r\n ---------------------------------------------------------------------}\r\n\r\n{ TDateTime is not defined in the interval [-1.0..0.0[. Additionally, when\r\n negative the time part must be treated using its absolute value (0.25 always\r\n means \"6 a.m.\") -> skip the gap and convert the time part when crossing the\r\n gap -- and take care of rounding errors }\r\nProcedure MaybeSkipTimeWarp(OldDate: TDateTime; var NewDate: TDateTime);\r\nbegin\r\n if (OldDate>=0) and (NewDate<-TDateTimeEpsilon) then\r\n NewDate:=int(NewDate-1.0+TDateTimeEpsilon)-frac(1.0+frac(NewDate))\r\n else if (OldDate<=-1.0) and (NewDate>-1.0+TDateTimeEpsilon) then\r\n NewDate:=int(NewDate+1.0-TDateTimeEpsilon)+frac(1.0-abs(frac(1.0+NewDate)));\r\nend;\r\n\r\n\r\nfunction IncNegativeTime(AValue, Addend: TDateTime): TDateTime;\r\nvar\r\n newtime: tdatetime;\r\nbegin\r\n newtime:=-frac(Avalue)+frac(Addend);\r\n { handle rounding errors }\r\n if SameValue(newtime,int(newtime)+1,TDateTimeEpsilon) then\r\n newtime:=int(newtime)+1\r\n else if SameValue(newtime,int(newtime),TDateTimeEpsilon) then\r\n newtime:=int(newtime);\r\n { time underflow -> previous day }\r\n if newtime<-TDateTimeEpsilon then\r\n begin\r\n newtime:=1.0+newtime;\r\n avalue:=int(avalue)-1;\r\n end\r\n { time overflow -> next day }\r\n else if newtime>=1.0-TDateTimeEpsilon then\r\n begin\r\n newtime:=newtime-1.0;\r\n avalue:=int(avalue)+1;\r\n end;\r\n Result:=int(AValue)+int(Addend)-newtime;\r\nend;\r\n\r\nFunction IncYear(const AValue: TDateTime; const ANumberOfYears: Integer ): TDateTime;\r\n\r\nVar\r\n Y,M,D,H,N,S,MS : Word;\r\nbegin\r\n DecodeDateTime(AValue,Y,M,D,H,N,S,MS);\r\n Y:=Y+ANumberOfYears;\r\n If (M=2) and (D=29) And (Not IsLeapYear(Y)) then\r\n D:=28;\r\n Result:=EncodeDateTime(Y,M,D,H,N,S,MS);\r\nend;\r\n\r\n\r\nFunction IncYear(const AValue: TDateTime): TDateTime; // ; const ANumberOfYears: Integer = 1)\r\nbegin\r\n Result:=IncYear(Avalue,1);\r\nend;\r\n\r\n\r\nFunction IncWeek(const AValue: TDateTime; const ANumberOfWeeks: Integer): TDateTime;\r\nbegin\r\n Result:=AValue+ANumberOfWeeks*7;\r\n MaybeSkipTimeWarp(AValue,Result);\r\nend;\r\n\r\n\r\nFunction IncWeek(const AValue: TDateTime): TDateTime; // ; const ANumberOfWeeks: Integer = 1)\r\nbegin\r\n Result:=IncWeek(Avalue,1);\r\nend;\r\n\r\n\r\nFunction IncDay(const AValue: TDateTime; const ANumberOfDays: Integer): TDateTime;\r\nbegin\r\n Result:=AValue+ANumberOfDays;\r\n MaybeSkipTimeWarp(AValue,Result);\r\nend;\r\n\r\n\r\nFunction IncDay(const AValue: TDateTime): TDateTime; //; const ANumberOfDays: Integer = 1)\r\nbegin\r\n Result:=IncDay(Avalue,1);\r\nend;\r\n\r\n\r\nFunction IncHour(const AValue: TDateTime; const ANumberOfHours: NativeLargeInt): TDateTime;\r\nbegin\r\n if AValue>=0 then\r\n Result:=AValue+ANumberOfHours/HoursPerDay\r\n else\r\n Result:=IncNegativeTime(Avalue,ANumberOfHours/HoursPerDay);\r\n MaybeSkipTimeWarp(AValue,Result);\r\nend;\r\n\r\n\r\nFunction IncHour(const AValue: TDateTime): TDateTime; //; const ANumberOfHours: NativeLargeInt = 1\r\nbegin\r\n Result:=IncHour(AValue,1);\r\nend;\r\n\r\n\r\nFunction IncMinute(const AValue: TDateTime; const ANumberOfMinutes: NativeLargeInt): TDateTime;\r\nbegin\r\n if AValue>=0 then\r\n Result:=AValue+ANumberOfMinutes/MinsPerDay\r\n else\r\n Result:=IncNegativeTime(Avalue,ANumberOfMinutes/MinsPerDay);\r\n MaybeSkipTimeWarp(AValue,Result);\r\nend;\r\n\r\n\r\nFunction IncMinute(const AValue: TDateTime): TDateTime; // ; const ANumberOfMinutes: NativeLargeInt = 1\r\nbegin\r\n Result:=IncMinute(AValue,1);\r\nend;\r\n\r\n\r\nFunction IncSecond(const AValue: TDateTime; const ANumberOfSeconds: NativeLargeInt): TDateTime;\r\nbegin\r\n if AValue>=0 then\r\n Result:=AValue+ANumberOfSeconds/SecsPerDay\r\n else\r\n Result:=IncNegativeTime(Avalue,ANumberOfSeconds/SecsPerDay);\r\n MaybeSkipTimeWarp(AValue,Result);\r\nend;\r\n\r\n\r\nFunction IncSecond(const AValue: TDateTime): TDateTime; // ; const ANumberOfSeconds: NativeLargeInt = 1\r\nbegin\r\n Result:=IncSecond(Avalue,1);\r\nend;\r\n\r\n\r\nFunction IncMilliSecond(const AValue: TDateTime; const ANumberOfMilliSeconds: NativeLargeInt): TDateTime;\r\nbegin\r\n if Avalue>=0 then\r\n Result:=AValue+ANumberOfMilliSeconds/MSecsPerDay\r\n else\r\n Result:=IncNegativeTime(Avalue,ANumberOfMilliSeconds/MSecsPerDay);\r\n MaybeSkipTimeWarp(AValue,Result);\r\nend;\r\n\r\n\r\nFunction IncMilliSecond(const AValue: TDateTime): TDateTime; // ; const ANumberOfMilliSeconds: NativeLargeInt = 1\r\nbegin\r\n Result:=IncMilliSecond(AValue,1);\r\nend;\r\n\r\n\r\n{ ---------------------------------------------------------------------\r\n Encode/Decode of complete timestamp\r\n ---------------------------------------------------------------------}\r\n\r\n\r\nFunction EncodeDateTime(const AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond: Word): TDateTime;\r\nbegin\r\n If Not TryEncodeDateTime(AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond,Result) then\r\n InvalidDateTimeError(AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond)\r\nend;\r\n\r\n\r\nProcedure DecodeDateTime(const AValue: TDateTime; out AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond: Word);\r\nbegin\r\n DecodeTime(AValue,AHour,AMinute,ASecond,AMilliSecond);\r\n if AHour=24 then // can happen due rounding issues mantis 17123\r\n begin\r\n AHour:=0; // rest is already zero\r\n DecodeDate(round(AValue),AYear,AMonth,ADay);\r\n end\r\n else\r\n DecodeDate(AValue,AYear,AMonth,ADay);\r\nend;\r\n\r\n\r\nFunction TryEncodeDateTime(const AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond: Word; out AValue: TDateTime): Boolean;\r\n\r\nVar\r\n tmp : TDateTime;\r\n\r\nbegin\r\n Result:=TryEncodeDate(AYear,AMonth,ADay,AValue);\r\n Result:=Result and TryEncodeTime(AHour,AMinute,ASecond,Amillisecond,Tmp);\r\n If Result then\r\n Avalue:=ComposeDateTime(AValue,Tmp);\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n Encode/decode date, specifying week of year and day of week\r\n ---------------------------------------------------------------------}\r\n\r\nFunction EncodeDateWeek(const AYear, AWeekOfYear: Word; const ADayOfWeek: Word): TDateTime;\r\nbegin\r\n If Not TryEncodeDateWeek(AYear,AWeekOfYear,Result,ADayOfWeek) then\r\n InvalidDateWeekError(AYear,AWeekOfYear,ADayOfWeek);\r\nend;\r\n\r\n\r\nFunction EncodeDateWeek(const AYear, AWeekOfYear: Word): TDateTime; //; const ADayOfWeek: Word = 1\r\nbegin\r\n Result := EncodeDateWeek(AYear,AWeekOfYear,1);\r\nend;\r\n\r\n\r\nProcedure DecodeDateWeek(const AValue: TDateTime; out AYear, AWeekOfYear, ADayOfWeek: Word);\r\n\r\nvar\r\n DOY : Integer;\r\n D: Word;\r\n YS : TDateTime;\r\n YSDOW, YEDOW: Word;\r\n\r\nbegin\r\n AYear:=YearOf(AValue);\r\n // Correct to ISO DOW\r\n ADayOfWeek:=DayOfWeek(AValue)-1;\r\n If ADAyOfWeek=0 then\r\n ADayofweek:=7;\r\n YS:=StartOfAYear(AYear);\r\n DOY:=Trunc(AValue-YS)+1;\r\n YSDOW:=DayOfTheWeek(YS);\r\n // Correct week if later than wednesday. First week never starts later than wednesday\r\n if (YSDOW<5) then\r\n Inc(DOY,YSDOW-1)\r\n else\r\n Dec(DOY,8-YSDOW);\r\n if (DOY<=0) then // Day is in last week of previous year.\r\n DecodeDateWeek(YS-1,AYear,AWeekOfYear,D)\r\n else\r\n begin\r\n AWeekOfYear:=DOY div 7;\r\n if ((DOY mod 7)<>0) then\r\n Inc(AWeekOfYear);\r\n if (AWeekOfYear>52) then // Maybe in first week of next year ?\r\n begin\r\n YEDOW:=YSDOW;\r\n if IsLeapYear(AYear) then\r\n begin\r\n Inc(YEDOW);\r\n if (YEDOW>7) then\r\n YEDOW:=1;\r\n end;\r\n if (YEDOW<4) then // Really next year.\r\n begin\r\n Inc(AYear);\r\n AWeekOfYear:=1;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\n\r\n\r\nFunction TryEncodeDateWeek(const AYear, AWeekOfYear: Word; out AValue: TDateTime; const ADayOfWeek: Word): Boolean;\r\n\r\nVar\r\n DOW : Word;\r\n Rest : Integer;\r\n\r\nbegin\r\n Result:=IsValidDateWeek(Ayear,AWeekOfYear,ADayOfWeek);\r\n If Result then\r\n begin\r\n AValue:=EncodeDate(AYear,1,1)+(7*(AWeekOfYear-1));\r\n DOW:=DayOfTheWeek(AValue);\r\n Rest:=ADayOfWeek-DOW;\r\n If (DOW>4) then\r\n Inc(Rest,7);\r\n AValue:=AValue+Rest;\r\n end;\r\nend;\r\n\r\n\r\nFunction TryEncodeDateWeek(const AYear, AWeekOfYear: Word; out AValue: TDateTime): Boolean; //; const ADayOfWeek: Word = 1\r\nbegin\r\n Result:=TryEncodeDateWeek(AYear,AWeekOfYear,AValue,1);\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n Encode/decode date, specifying day of year\r\n ---------------------------------------------------------------------}\r\n\r\nFunction EncodeDateDay(const AYear, ADayOfYear: Word): TDateTime;\r\nbegin\r\n If Not TryEncodeDateDay(AYear,ADayOfYear,Result) then\r\n InvalidDateDayError(AYear,ADayOfYear);\r\nend;\r\n\r\n\r\nProcedure DecodeDateDay(const AValue: TDateTime; out AYear, ADayOfYear: Word);\r\n\r\nVar\r\n M,D : Word;\r\n\r\nbegin\r\n DecodeDate(AValue,AYear,M,D);\r\n ADayOfyear:=Trunc(AValue-EncodeDate(AYear,1,1))+1;\r\nend;\r\n\r\n\r\nFunction TryEncodeDateDay(const AYear, ADayOfYear: Word; out AValue: TDateTime): Boolean;\r\nbegin\r\n Result:=(ADayOfYear<>0) and (ADayOfYear<=DaysPerYear [IsleapYear(AYear)]);\r\n If Result then\r\n AValue:=EncodeDate(AYear,1,1)+ADayOfYear-1;\r\nend;\r\n\r\n\r\n{ ---------------------------------------------------------------------\r\n Encode/decode date, specifying week of month\r\n ---------------------------------------------------------------------}\r\n\r\n\r\nFunction EncodeDateMonthWeek(const AYear, AMonth, AWeekOfMonth, ADayOfWeek: Word): TDateTime;\r\nbegin\r\n If Not TryEncodeDateMonthWeek(Ayear,AMonth,AWeekOfMonth,ADayOfWeek,Result) then\r\n InvalidDateMonthWeekError(AYear,AMonth,AWeekOfMonth,ADayOfWeek);\r\nend;\r\n\r\nProcedure DecodeDateMonthWeek(const AValue: TDateTime; out AYear, AMonth, AWeekOfMonth, ADayOfWeek: Word);\r\n\r\nVar\r\n D,SDOM,EDOM : Word;\r\n SOM : TdateTime;\r\n DOM : Integer;\r\nbegin\r\n DecodeDate(AValue,AYear,AMonth,D);\r\n ADayOfWeek:=DayOfTheWeek(AValue);\r\n SOM:=EncodeDate(Ayear,Amonth,1);\r\n SDOM:=DayOfTheWeek(SOM);\r\n DOM:=D-1+SDOM;\r\n If SDOM>4 then\r\n Dec(DOM,7);\r\n // Too early in the month. First full week is next week, day is after thursday.\r\n If DOM<=0 Then\r\n DecodeDateMonthWeek(SOM-1,AYear,AMonth,AWeekOfMonth,D)\r\n else\r\n begin\r\n AWeekOfMonth:=(DOM div 7);\r\n if (DOM mod 7)<>0 then\r\n Inc(AWeekOfMonth);\r\n EDOM:=DayOfTheWeek(EndOfAMonth(Ayear,AMonth));\r\n // In last days of last long week, so in next month...\r\n If (EDOM<4) and ((DaysInAMonth(AYear,Amonth)-D)24\r\n ---------------------------------------------------------------------}\r\n\r\nfunction TryEncodeTimeInterval(Hour, Min, Sec, MSec: word; out Time: TDateTime): boolean;\r\nbegin\r\n Result:= (Min<60) and (Sec<60) and (MSec<1000);\r\n If Result then\r\n Time:=TDateTime(cardinal(Hour)*3600000+cardinal(Min)*60000+cardinal(Sec)*1000+MSec)/MSecsPerDay;\r\nend;\r\n\r\nfunction EncodeTimeInterval(Hour, Minute, Second, MilliSecond: word): TDateTime;\r\nbegin\r\n If not TryEncodeTimeInterval(Hour,Minute,Second,MilliSecond,Result) then\r\n Raise EConvertError.CreateFmt(SerrInvalidHourMinuteSecMsec,\r\n [Hour,Minute,Second,MilliSecond]);\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n Replace given element with supplied value.\r\n ---------------------------------------------------------------------}\r\n\r\nConst\r\n LFAI = RecodeLeaveFieldAsIS; // Less typing, readable code\r\n{\r\n Note: We have little choice but to implement it like Borland did:\r\n If AValue contains some 'wrong' value, it will throw an error.\r\n To simulate this we'd have to check in each function whether\r\n both arguments are correct. To avoid it, all is routed through\r\n the 'central' RecodeDateTime function as in Borland's implementation.\r\n}\r\n\r\nFunction RecodeYear(const AValue: TDateTime; const AYear: Word): TDateTime;\r\n\r\nbegin\r\n Result := RecodeDateTime(AValue,AYear,LFAI,LFAI,LFAI,LFAI,LFAI,LFAI);\r\nend;\r\n\r\n\r\nFunction RecodeMonth(const AValue: TDateTime; const AMonth: Word): TDateTime;\r\nbegin\r\n Result := RecodeDateTime(AValue,LFAI,AMonth,LFAI,LFAI,LFAI,LFAI,LFAI);\r\nend;\r\n\r\n\r\nFunction RecodeDay(const AValue: TDateTime; const ADay: Word): TDateTime;\r\nbegin\r\n Result := RecodeDateTime(AValue,LFAI,LFAI,ADay,LFAI,LFAI,LFAI,LFAI);\r\nend;\r\n\r\n\r\nFunction RecodeHour(const AValue: TDateTime; const AHour: Word): TDateTime;\r\nbegin\r\n Result := RecodeDateTime(AValue,LFAI,LFAI,LFAI,AHour,LFAI,LFAI,LFAI);\r\nend;\r\n\r\n\r\nFunction RecodeMinute(const AValue: TDateTime; const AMinute: Word): TDateTime;\r\nbegin\r\n Result := RecodeDateTime(AValue,LFAI,LFAI,LFAI,LFAI,AMinute,LFAI,LFAI);\r\nend;\r\n\r\n\r\nFunction RecodeSecond(const AValue: TDateTime; const ASecond: Word): TDateTime;\r\nbegin\r\n Result := RecodeDateTime(AValue,LFAI,LFAI,LFAI,LFAI,LFAI,ASecond,LFAI);\r\nend;\r\n\r\n\r\nFunction RecodeMilliSecond(const AValue: TDateTime; const AMilliSecond: Word): TDateTime;\r\nbegin\r\n Result := RecodeDateTime(AValue,LFAI,LFAI,LFAI,LFAI,LFAI,LFAI,AMilliSecond);\r\nend;\r\n\r\n\r\nFunction RecodeDate(const AValue: TDateTime; const AYear, AMonth, ADay: Word): TDateTime;\r\nbegin\r\n Result := RecodeDateTime(AValue,AYear,AMonth,ADay,LFAI,LFAI,LFAI,LFAI);\r\nend;\r\n\r\n\r\nFunction RecodeTime(const AValue: TDateTime; const AHour, AMinute, ASecond, AMilliSecond: Word): TDateTime;\r\nbegin\r\n Result := RecodeDateTime(AValue,LFAI,LFAI,LFAI,AHour,AMinute,ASecond,AMilliSecond);\r\nend;\r\n\r\n\r\nFunction RecodeDateTime(const AValue: TDateTime; const AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond: Word): TDateTime;\r\nbegin\r\n If Not TryRecodeDateTime(AValue,AYear,AMonth,ADay,AHour,AMinute,ASecond,AMilliSecond,Result) then\r\n InvalidDateTimeError(AYear,AMonth,ADay,AHour,AMinute,ASecond,AMilliSecond,AValue);\r\nend;\r\n\r\n\r\nFunction TryRecodeDateTime(const AValue: TDateTime; const AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond: Word; out AResult: TDateTime): Boolean;\r\n\r\n Procedure FV (var AV{%H-} : Word; Arg : Word);\r\n\r\n begin\r\n If (Arg<>LFAI) then\r\n AV:=Arg;\r\n end;\r\n\r\nVar\r\n Y,M,D,H,N,S,MS : Word;\r\n\r\nbegin\r\n DecodeDateTime(AValue,Y,M,D,H,N,S,MS);\r\n FV(Y,AYear);\r\n FV(M,AMonth);\r\n FV(D,ADay);\r\n FV(H,AHour);\r\n FV(N,AMinute);\r\n FV(S,ASecond);\r\n FV(MS,AMillisecond);\r\n Result:=TryEncodeDateTime(Y,M,D,H,N,S,MS,AResult);\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n Comparision of date/time\r\n ---------------------------------------------------------------------}\r\n\r\n\r\nFunction CompareDateTime(const A, B: TDateTime): TValueRelationship;\r\nbegin\r\n If SameDateTime(A,B) then\r\n Result:=EqualsValue\r\n else if trunc(a)=trunc(b) then\r\n begin\r\n if abs(frac(a))>abs(frac(b)) then \r\n result:=GreaterThanValue\r\n else \r\n result:=LessThanValue;\r\n end \r\n else \r\n begin\r\n if a>b then \r\n result:=GreaterThanValue\r\n else \r\n result:=LessThanValue;\r\n end;\r\nend;\r\n\r\n\r\nFunction CompareDate(const A, B: TDateTime): TValueRelationship;\r\nbegin\r\n If SameDate(A,B) then\r\n Result:=EQualsValue\r\n else if AADayOfWeek then\r\n D:=D+7; // Clearer would have been Inc(ANthDayOfweek) but it's a const\r\n Result:=TryEncodeDate(Ayear,AMonth,D,AValue);\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n Exception throwing routines\r\n ---------------------------------------------------------------------}\r\n\r\n\r\n\r\nProcedure InvalidDateTimeError(const AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond: Word; const ABaseDate: TDateTime);\r\n\r\n Function DoField(Arg,Def : Word; Unknown: String) : String;\r\n\r\n begin\r\n if Def=0 then ;\r\n If (Arg<>LFAI) then\r\n Result:=Format('%.*d',[Length(Unknown),Arg])\r\n else if (ABaseDate=0) then\r\n Result:=Unknown\r\n else\r\n Result:=Format('%.*d',[Length(Unknown),Arg]);\r\n end;\r\n\r\nVar\r\n Y,M,D,H,N,S,MS : Word;\r\n Msg : String;\r\n\r\nbegin\r\n DecodeDateTime(ABasedate,Y,M,D,H,N,S,MS);\r\n Msg:=DoField(AYear,Y,'????');\r\n Msg:=Msg+DateSeparator+DoField(AMonth,M,'??');\r\n Msg:=Msg+DateSeparator+DoField(ADay,D,'??');\r\n Msg:=Msg+' '+DoField(AHour,H,'??');\r\n Msg:=Msg+TimeSeparator+DoField(AMinute,N,'??');\r\n Msg:=Msg+TimeSeparator+Dofield(ASecond,S,'??');\r\n Msg:=Msg+DecimalSeparator+DoField(AMilliSecond,MS,'???');\r\n Raise EConvertError.CreateFmt(SErrInvalidTimeStamp,[Msg]);\r\nend;\r\n\r\n\r\nProcedure InvalidDateTimeError(const AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond: Word); // const ABaseDate: TDateTime = 0\r\nbegin\r\n InvalidDateTimeError(AYear,AMonth,ADay,AHour,AMinute,ASecond,AMilliSecond,0);\r\nend;\r\n\r\n\r\nProcedure InvalidDateWeekError(const AYear, AWeekOfYear, ADayOfWeek: Word);\r\nbegin\r\n Raise EConvertError.CreateFmt(SErrInvalidDateWeek,[AYear,AWeekOfYear,ADayOfWeek]);\r\nend;\r\n\r\n\r\nProcedure InvalidDateDayError(const AYear, ADayOfYear: Word);\r\nbegin\r\n Raise EConvertError.CreateFmt(SErrInvalidDayOfYear,[AYear,ADayOfYear]);\r\nend;\r\n\r\n\r\nProcedure InvalidDateMonthWeekError(const AYear, AMonth, AWeekOfMonth, ADayOfWeek: Word);\r\nbegin\r\n Raise EConvertError.CreateFmt(SErrInvalidDateMonthWeek,[Ayear,AMonth,AWeekOfMonth,ADayOfWeek]);\r\nend;\r\n\r\n\r\nProcedure InvalidDayOfWeekInMonthError(const AYear, AMonth, ANthDayOfWeek, ADayOfWeek: Word);\r\n\r\nbegin\r\n Raise EConvertError.CreateFmt(SErrInvalidDayOfWeekInMonth,[AYear,AMonth,ANthDayOfWeek,ADayOfWeek]);\r\nend;\r\n\r\n\r\n{ ---------------------------------------------------------------------\r\n Julian and Modified Julian Date conversion support\r\n ---------------------------------------------------------------------}\r\n\r\n{$push}\r\n{$R-}\r\n{$Q-}\r\n\r\nFunction DateTimeToJulianDate(const AValue: TDateTime): Double;\r\nvar\r\n day,month,year: word;\r\n a,y,m: longint;\r\nbegin\r\n DecodeDate ( AValue, year, month, day );\r\n a := (14-month) div 12;\r\n y := year + 4800 - a;\r\n m := month + (12*a) - 3;\r\n result := day + ((153*m+2) div 5) + (365*y)\r\n + (y div 4) - (y div 100) + (y div 400) - 32045.5 + frac(avalue);\r\nend;\r\n\r\n\r\nFunction JulianDateToDateTime(const AValue: Double): TDateTime;\r\nbegin\r\n if not TryJulianDateToDateTime(AValue, Result) then\r\n raise EConvertError.CreateFmt(SInvalidJulianDate, [AValue]);\r\nend;\r\n\r\n\r\nFunction TryJulianDateToDateTime(const AValue: Double; out ADateTime: TDateTime): Boolean;\r\nvar\r\n a,b,c,d,e,m:longint;\r\n day,month,year: word;\r\nbegin\r\n a := trunc(AValue + 32044.5);\r\n b := (4*a + 3) div 146097;\r\n c := a - (146097*b div 4);\r\n d := (4*c + 3) div 1461;\r\n e := c - (1461*d div 4);\r\n m := (5*e+2) div 153;\r\n day := e - ((153*m + 2) div 5) + 1;\r\n month := m + 3 - 12 * ( m div 10 );\r\n year := (100*b) + d - 4800 + ( m div 10 );\r\n result := TryEncodeDate ( Year, Month, Day, ADateTime );\r\n if Result then\r\n// ADateTime:=IncMilliSecond(IncHour(ADateTime,-12),MillisecondOfTheDay(Abs(Frac(aValue))));\r\n ADateTime:=ADateTime+frac(AValue-0.5);\r\nend;\r\n\r\nFunction DateTimeToModifiedJulianDate(const AValue: TDateTime): Double;\r\nbegin\r\n result := DateTimeToJulianDate(AValue) - 2400000.5;\r\nend;\r\n\r\n\r\nFunction ModifiedJulianDateToDateTime(const AValue: Double): TDateTime;\r\nbegin\r\n result := JulianDateToDateTime(AValue + 2400000.5);\r\nend;\r\n\r\n\r\nFunction TryModifiedJulianDateToDateTime(const AValue: Double; out ADateTime: TDateTime): Boolean;\r\nbegin\r\n Result:=TryJulianDateToDateTime(AValue + 2400000.5, ADateTime);\r\nend;\r\n\r\n{$pop}//{$R-}{$Q-} for Julian conversion functions\r\n\r\n{ ---------------------------------------------------------------------\r\n Unix timestamp support.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction DateTimeToUnix(const AValue: TDateTime): NativeLargeInt;\r\n\r\nbegin\r\n Result:=Round(DateTimeDiff(RecodeMillisecond(AValue,0),UnixEpoch)*SecsPerDay);\r\nend;\r\n\r\n\r\nFunction UnixToDateTime(const AValue: NativeLargeInt): TDateTime;\r\nbegin\r\n Result:=IncSecond(UnixEpoch, AValue);\r\nend;\r\n\r\n\r\nFunction UnixTimeStampToMac(const AValue: NativeLargeInt): NativeLargeInt;\r\nconst\r\n Epoch=24107 * 24 * 3600;\r\nbegin\r\n Result:=AValue + Epoch;\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n Mac timestamp support.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction DateTimeToMac(const AValue: TDateTime): NativeLargeInt;\r\nvar\r\n Epoch:TDateTime;\r\nbegin\r\n Epoch:=EncodeDateTime( 1904, 1, 1, 0, 0, 0, 0 );\r\n Result:=SecondsBetween( Epoch, AValue );\r\nend;\r\n\r\n\r\nFunction MacToDateTime(const AValue: NativeLargeInt): TDateTime;\r\nvar\r\n Epoch:TDateTime;\r\nbegin\r\n Epoch:=EncodeDateTime( 1904, 1, 1, 0, 0, 0, 0 );\r\n Result:=IncSecond( Epoch, AValue );\r\nend;\r\n\r\n\r\nFunction MacTimeStampToUnix(const AValue: NativeLargeInt): NativeLargeInt;\r\nconst\r\n Epoch=24107 * 24 * 3600;\r\nbegin\r\n Result:=AValue - Epoch;\r\nend;\r\n\r\nFunction DateTimeToDosDateTime(const AValue: TDateTime): longint;\r\nvar year,month,day,hour,min,sec,msec : word;\r\n zs : longint;\r\nbegin\r\n decodedatetime(avalue,year,month,day,hour,min,sec,msec);\r\n result:=-1980;\r\n result:=result+year and 127;\r\n result:=result shl 4;\r\n result:=result+month;\r\n result:=result shl 5;\r\n result:=result+day;\r\n result:=result shl 16;\r\n zs:=hour;\r\n zs:=zs shl 6;\r\n zs:=zs+min;\r\n zs:=zs shl 5;\r\n zs:=zs+sec div 2;\r\n result:=result+(zs and $ffff);\r\nend;\r\n\r\nFunction DosDateTimeToDateTime( AValue: longint): TDateTime;\r\nvar year,month,day,hour,min,sec : integer;\r\nbegin\r\n sec:=(AValue and 31) * 2;\r\n avalue:=AValue shr 5;\r\n min:=AValue and 63;\r\n avalue:=AValue shr 6;\r\n hour:=AValue and 31;\r\n avalue:=AValue shr 5;\r\n day:=AValue and 31;\r\n avalue:=AValue shr 5;\r\n month:=AValue and 15;\r\n avalue:=AValue shr 4;\r\n year:=AValue+1980;\r\n result:=EncodeDateTime(year,month,day,hour,min,sec,0);\r\nend;\r\n\r\n\r\n\r\nconst whitespace = [' ',#13,#10];\r\n hrfactor = 1/(24);\r\n minfactor = 1/(24*60);\r\n secfactor = 1/(24*60*60);\r\n mssecfactor = 1/(24*60*60*1000);\r\n\r\nconst AMPMformatting : array[0..2] of string =('am/pm','a/p','ampm');\r\n\r\nprocedure raiseexception(const s:string);\r\n\r\nbegin\r\n raise EConvertError.Create(s);\r\nend;\r\n\r\n{ Conversion of UTC to local time and vice versa }\r\n\r\nFunction GetLocalTimeOffset : Integer;\r\n\r\nbegin\r\n Result:=TJSDate.New.getTimezoneOffset();\r\nend;\r\n\r\nfunction UniversalTimeToLocal(UT: TDateTime): TDateTime;\r\n\r\nbegin\r\n Result:=UniversalTimeToLocal(UT,-GetLocalTimeOffset);\r\nend;\r\n\r\nfunction UniversalTimeToLocal(UT: TDateTime; TZOffset : Integer): TDateTime;\r\n\r\nbegin\r\n if (TZOffset > 0) then\r\n Result := UT + EncodeTime(TZOffset div 60, TZOffset mod 60, 0, 0)\r\n else if (TZOffset < 0) then\r\n Result := UT - EncodeTime(Abs(TZOffset) div 60, Abs(TZOffset) mod 60, 0, 0)\r\n else\r\n Result := UT;\r\nend;\r\n \r\nFunction LocalTimeToUniversal(LT: TDateTime): TDateTime;\r\n\r\nbegin\r\n Result:=LocalTimeToUniversal(LT,-GetLocalTimeOffset);\r\nend;\r\n\r\nFunction LocalTimeToUniversal(LT: TDateTime;TZOffset: Integer): TDateTime;\r\n\r\nbegin\r\n if (TZOffset > 0) then\r\n Result := LT - EncodeTime(TZOffset div 60, TZOffset mod 60, 0, 0)\r\n else if (TZOffset < 0) then\r\n Result := LT + EncodeTime(Abs(TZOffset) div 60, Abs(TZOffset) mod 60, 0, 0)\r\n else\r\n Result := LT;\r\nend;\r\n\r\n\r\n{ RFC 3339 }\r\n\r\nfunction DateTimeToRFC3339(ADate :TDateTime):string;\r\n\r\nbegin\r\n Result:=FormatDateTime('yyyy-mm-dd\"T\"hh\":\"nn\":\"ss\".\"zzz\"Z\"',ADate);\r\nend;\r\n\r\nfunction DateToRFC3339(ADate: TDateTime): string;\r\nbegin\r\n Result:=FormatDateTime('yyyy-mm-dd',ADate);\r\nend;\r\n\r\nfunction TimeToRFC3339(ADate :TDateTime):string;\r\n\r\nbegin\r\n Result:=FormatDateTime('hh\":\"nn\":\"ss\".\"zzz',ADate);\r\nend;\r\n\r\nFunction TryRFC3339ToDateTime(const Avalue: String; out ADateTime: TDateTime): Boolean;\r\n\r\n// 1 2\r\n// 12345678901234567890123\r\n// yyyy-mm-ddThh:nn:ss.zzz\r\n\r\nType\r\n TPartPos = (ppTime,ppYear,ppMonth,ppDay,ppHour,ppMinute,ppSec,ppMSec);\r\n TPos = Array [TPartPos] of byte;\r\n\r\nConst\r\n P : TPos = (11,1,6,9,12,15,18,21);\r\n\r\nvar\r\n lY, lM, lD, lH, lMi, lS, lMs: Integer;\r\n\r\nbegin\r\n if Trim(AValue) = '' then\r\n begin\r\n Result:=True;\r\n ADateTime:=0;\r\n end;\r\n lY:=StrToIntDef(Copy(AValue,P[ppYear],4),-1);\r\n lM:=StrToIntDef(Copy(AValue,P[ppMonth],2),-1);\r\n lD:=StrToIntDef(Copy(AValue,P[ppDay],2),-1);\r\n if (Length(AValue)>=P[ppTime]) then\r\n begin\r\n lH:=StrToIntDef(Copy(AValue,P[ppHour],2),-1);\r\n lMi:=StrToIntDef(Copy(AValue,P[ppMinute],2),-1);\r\n // Bug ID 37974\r\n if (Length(AValue)>=P[ppSec]) then\r\n lS:=StrToIntDef(Copy(AValue,P[ppSec],2),-1)\r\n else\r\n LS:=0;\r\n if (Length(AValue)>=P[ppMSec]) then\r\n lmS := StrToIntDef(Copy(AValue,P[ppMSec],3),-1);\r\n end\r\n else\r\n begin\r\n lH:=0;\r\n lMi:=0;\r\n lS:=0;\r\n lMS:=0;\r\n end;\r\n Result:=(lY>=0) and (lM>=0) and (lD>=0) and (lH>=0) and (lMi>=0) and (ls>=0) and (lMS>=0);\r\n if Not Result then\r\n ADateTime:=0\r\n else\r\n { Cannot EncodeDate if any part equals 0. EncodeTime is okay. }\r\n if (lY = 0) or (lM = 0) or (lD = 0) then\r\n ADateTime:=EncodeTime(lH, lMi, lS, 0)\r\n else\r\n ADateTime:=EncodeDate(lY, lM, lD) + EncodeTime(lH, lMi, lS, lMs);\r\nend;\r\n\r\nFunction RFC3339ToDateTime(const Avalue: String): TDateTime;\r\n\r\nbegin\r\n if Not TryRFC3339ToDateTime(AValue,Result) then\r\n Result:=0;\r\nend;\r\n\r\nconst\r\n\r\n SPatternCharMismatch = 'Pattern mismatch char \"%s\" at position %d.';\r\n SNoCharMatch = 'Mismatch char \"%s\" <> \"%s\" at pattern position %d, string position %d.';\r\n SHHMMError = 'mm in a sequence hh:mm is interpreted as minutes. No longer versions allowed! (Position : %d).' ;\r\n SNoArrayMatch = 'Can''t match any allowed value at pattern position %d, string position %d.';\r\n //SFullpattern = 'Couldn''t match entire pattern string. Input too short at pattern position %d.';\r\n\r\n\r\n{ TDateTimeScanner }\r\nprocedure TDateTimeScanner.ArrayMatchError;\r\n\r\nbegin\r\n raiseexception(format(SNoArrayMatch,[FPatternPos+1,FPos]))\r\nend;\r\n\r\nprocedure TDateTimeScanner.SetPattern(AValue: String);\r\nbegin\r\n if FPattern=AValue then Exit;\r\n FPattern:=AValue;\r\n FPatternLen:=Length(FPattern);\r\nend;\r\n\r\nprocedure TDateTimeScanner.SetText(AValue: String);\r\nbegin\r\n if FText=AValue then Exit;\r\n FText:=AValue;\r\n FLen:=Length(FText);\r\nend;\r\n\r\nfunction TDateTimeScanner.ScanFixedInt(maxv:integer):integer;\r\n\r\nvar\r\n c,n : char;\r\n oi:integer;\r\n\r\nbegin\r\n Result:=0;\r\n oi:=FPos;\r\n c:=FPattern[FPatternPos];\r\n while (FPatternPos<=FPatternLen) and (FPattern[FPatternPos]=c) do\r\n Inc(FPatternPos);\r\n N:=FText[FPos];\r\n while (maxv>0) and (FPos<=FLen) and (N IN ['0'..'9']) do\r\n begin\r\n Result:=(Result*10)+ord(N)-48;\r\n inc(FPos);\r\n dec(maxv);\r\n if FPos<=FLen then\r\n N:=FText[FPos];\r\n end;\r\n if (OI=FPos) then\r\n raiseexception(format(SPatternCharMismatch,[c,oi]));\r\nend;\r\n\r\nfunction TDateTimeScanner.FindIMatch(const values :array of string; aTerm : string):integer;\r\n\r\nvar\r\n l,i : integer;\r\n\r\nbegin\r\n Result:=-1;\r\n l:=high(values);\r\n i:=0;\r\n while (i<=l) and (result=-1) do\r\n begin\r\n if SameText(Copy(aTerm,1,Length(values[i])),values[i]) then\r\n Result:=i;\r\n inc(i);\r\n end;\r\nend;\r\n\r\nfunction TDateTimeScanner.FindMatch(const Values : array of string):integer;\r\n\r\nbegin\r\n result:=FindIMatch(Values,Copy(FText,FPos,FLen-FPos+1));\r\n if result=-1 then\r\n arraymatcherror\r\n else\r\n begin\r\n inc(FPos,length(Values[result])+1);\r\n inc(FPatternPos,length(Values[result])+1);\r\n inc(result); // was 0 based.\r\n end;\r\nend;\r\n\r\n\r\nprocedure TDateTimeScanner.MatchChar(c:char);\r\n\r\nVar\r\n N : Char;\r\n\r\nbegin\r\n if (FPos<=Flen) then\r\n N:=FText[FPos]\r\n else\r\n N:='?';\r\n if (N<>c) then\r\n raiseexception(format(SNoCharMatch,[N,C,FPatternPos+FPatternOffset,FPos]));\r\n inc(FPatternPos);\r\n inc(FPos);\r\nend;\r\n\r\nfunction TDateTimeScanner.ScanPatternLength :integer;\r\n\r\nvar\r\n c : char;\r\n i : Integer;\r\n\r\nbegin\r\n result:=FPatternPos;\r\n I:=FPatternPos;\r\n c:=FPattern[I];\r\n while (I<=FPatternLen) and (FPattern[i]=c) do\r\n inc(I);\r\n Result:=I-Result;\r\nend;\r\n\r\nprocedure TDateTimeScanner.MatchPattern(const aPattern: String);\r\n\r\nVar\r\n T : String;\r\n cPos: Integer;\r\n\r\nbegin\r\n T:=FPattern;\r\n cPos:=FPatternPos;\r\n FPatternOffset:=FPatternPos;\r\n FPattern:=aPattern;\r\n FPatternLen:=Length(aPattern);\r\n try\r\n Scan;\r\n finally\r\n FPattern:=T;\r\n FPatternLen:=Length(aPattern);\r\n FPatternPos:=cPos;\r\n FPatternOffset:=0;\r\n end;\r\nend;\r\n\r\nprocedure TDateTimeScanner.DoDay;\r\n\r\nVar\r\n I : integer;\r\n\r\nbegin\r\n i:=ScanPatternLength;\r\n case i of\r\n 1,2 : FD:=scanfixedint(2);\r\n 3 : FD:=findmatch(shortDayNames);\r\n 4 : FD:=findmatch(longDayNames);\r\n 5 : matchpattern(shortdateformat);\r\n 6 : matchpattern(longdateformat);\r\n end;\r\nend;\r\n\r\nprocedure TDateTimeScanner.DoYear;\r\n\r\nVar\r\n I : integer;\r\n pivot : Integer;\r\n\r\nbegin\r\n i:=ScanPatternLength;\r\n FY:=scanfixedint(4);\r\n if i<=2 then\r\n begin\r\n Pivot:=YearOf(Now)-TwoDigitYearCenturyWindow;\r\n inc(FY, Pivot div 100 * 100);\r\n if (TwoDigitYearCenturyWindow > 0) and (FY < Pivot) then\r\n inc(FY, 100);\r\n end;\r\nend;\r\n\r\nprocedure TDateTimeScanner.DoMonth;\r\n\r\nVar\r\n I : integer;\r\n\r\nbegin\r\n I:=ScanPatternLength;\r\n case i of\r\n 1,2: FM:=scanfixedint(2);\r\n 3: FM:=findmatch(ShortMonthNames);\r\n 4: FM:=findmatch(LongMonthNames);\r\n end;\r\nend;\r\n\r\nprocedure TDateTimeScanner.DoTime;\r\n\r\nVar\r\n I : integer;\r\n\r\nbegin\r\n i:=ScanPatternLength;\r\n case i of\r\n 1: matchpattern(ShortTimeFormat);\r\n 2: matchpattern(LongTimeFormat);\r\n end;\r\nend;\r\n\r\nprocedure TDateTimeScanner.DoDateTime;\r\n\r\nbegin\r\n MatchPattern(ShortDateFormat);\r\n MatchPattern(#9);\r\n MatchPattern(LongTimeFormat);\r\n inc(FPatternPos);\r\nend;\r\n\r\nprocedure TDateTimeScanner.DoAMPM;\r\n\r\nVar\r\n I : integer;\r\n\r\nbegin\r\n i:=FindIMatch(AMPMformatting,Copy(FPattern,FPatternPos,5));\r\n case i of\r\n 0:\r\n begin\r\n i:=FindIMatch(['AM','PM'],Copy(FText,FPos,2));\r\n case i of\r\n 0: ;\r\n 1: FTimeval:=FTimeval+12*hrfactor;\r\n else\r\n ArrayMatchError\r\n end;\r\n inc(FPatternPos,length(AMPMformatting[0]));\r\n inc(FPos,2);\r\n end;\r\n 1:\r\n begin\r\n case Upcase(FText[FPos]) of\r\n 'A' : ;\r\n 'P' : FTimeval:=FTimeval+12*hrfactor;\r\n else\r\n ArrayMatchError\r\n end;\r\n inc(FPatternPos,length(AMPMformatting[1]));\r\n inc(FPos);\r\n end;\r\n 2:\r\n begin\r\n i:=FindIMatch([timeamstring,timepmstring],Copy(FText,FPos,5));\r\n case i of\r\n 0: inc(FPos,length(timeamstring));\r\n 1: begin\r\n FTimeval:=FTimeval+12*hrfactor;\r\n inc(FPos,length(timepmstring));\r\n end;\r\n else\r\n arraymatcherror\r\n end;\r\n inc(FPatternPos,length(AMPMformatting[2]));\r\n inc(FPatternPos,2);\r\n inc(FPos,2);\r\n end;\r\n else // no AM/PM match. Assume 'a' is simply a char\r\n MatchChar(FPattern[FPatternPos]);\r\n end;\r\nend;\r\n\r\nfunction TDateTimeScanner.Scan(StartPos: integer): TDateTime;\r\n\r\nvar\r\n lasttoken,\r\n activequote,\r\n lch : char;\r\n i : Integer;\r\n\r\nbegin\r\n if StartPos<1 then\r\n StartPos:=1;\r\n if FPos#0 then\r\n begin\r\n if (activequote<>lch) then\r\n MatchChar(lch)\r\n else\r\n begin\r\n activequote:=#0;\r\n inc(FPatternPos);\r\n end\r\n end\r\n else\r\n begin\r\n if (lch='M') and (lasttoken='H') then\r\n begin\r\n i:=ScanPatternLength;\r\n if i>2 then\r\n raiseexception(format(SHHMMError,[FPatternOffset+FPatternPos+1]));\r\n FTimeval:=FTimeval+scanfixedint(2)* minfactor;\r\n end\r\n else\r\n case lch of\r\n 'Y': DoYear;\r\n 'M': DoMonth;\r\n 'D': DoDay;\r\n 'T': DoTime;\r\n 'H': FTimeval:=FTimeval+scanfixedint(2)* hrfactor;\r\n 'N': FTimeval:=FTimeval+scanfixedint(2)* minfactor;\r\n 'S': FTimeval:=FTimeval+scanfixedint(2)* secfactor;\r\n 'Z': FTimeval:=FTimeval+scanfixedint(3)* mssecfactor;\r\n 'A': DoAMPM;\r\n '/': MatchChar(DateSeparator);\r\n ':': begin\r\n MatchChar(TimeSeparator);\r\n lch:=lasttoken;\r\n end;\r\n #39,'\"' :\r\n begin\r\n activequote:=lch;\r\n inc(FPatternPos);\r\n end;\r\n 'C': DoDateTime;\r\n '?': begin\r\n inc(FPatternPos);\r\n inc(FPos)\r\n end;\r\n #9: begin\r\n while (FPos<=FLen) and (FText[FPos] in WhiteSpace) do\r\n inc(FPos);\r\n inc(FPatternPos);\r\n end;\r\n else\r\n MatchChar(FPattern[FPatternPos]);\r\n end; {case}\r\n lasttoken:=lch;\r\n end\r\n end;\r\n// if (FPatternPos0) and (FPattern[FPatternLen-1]<>#9) then // allow omission of trailing whitespace\r\n// RaiseException(format(SFullpattern,[FPatternOffset+FPatternPos]));\r\n Result:=FTimeval;\r\n if (FY>0) and (FM>0) and (FD>0) then\r\n Result:=Result+EncodeDate(FY,FM,FD);\r\nend;\r\n\r\nFunction ScanDateTime(APattern,AValue: String; APos : integer = 1) : TDateTime;\r\n\r\nVar\r\n T : TDateTimeScanner;\r\n\r\nbegin\r\n T:=TDateTimeScanner.Create;\r\n try\r\n T.Pattern:=APattern;\r\n T.Text:=AValue;\r\n Result:=T.Scan(APos);\r\n finally\r\n T.Free;\r\n end;\r\nend;\r\n\r\n\r\nend.\r\n","unit Bcl.Utils;\r\n\r\n{$I Bcl.inc}\r\n\r\ninterface\r\n\r\nuses\r\n {$IFNDEF PAS2JS}\r\n Character,\r\n {$ELSE}\r\n JS,\r\n {$ENDIF}\r\n SysUtils;\r\n\r\ntype\r\n TBase64EncodeTable = array[0..63] of Char;\r\n\r\n TTimeZoneMode = (Error, Ignore, AsUTC, AsLocal);\r\n\r\n TTimeZoneInfo = record\r\n HourOff: Integer;\r\n MinOff: Integer;\r\n HasTimeZone: Boolean;\r\n procedure Init;\r\n end;\r\n\r\n TBclUtils = class\r\n {$IFNDEF PAS2JS}\r\n public\r\n class procedure InitFormatSettings(var FS: TFormatSettings); {$IFNDEF PAS2JS}static;{$ENDIF}\r\n {$ENDIF}\r\n private\r\n class function InternalISOToTime(const Text: string; out DateTime: TDateTime; out TimeZone: TTimeZoneInfo): boolean; overload; {$IFNDEF PAS2JS}static;{$ENDIF}\r\n class function AdjustTimeZone(var DateTime: TDateTime; const TimeZone: TTimeZoneInfo;\r\n TimeZoneMode: TTimeZoneMode): Boolean; {$IFNDEF PAS2JS}static;{$ENDIF}\r\n public\r\n class function DateTimeToISO(const Value: TDateTime; FullNotation: boolean): string; {$IFNDEF PAS2JS}static;{$ENDIF}\r\n class function TryISOToDateTime(const Value: string; out DateTime: TDateTime): boolean; overload; {$IFNDEF PAS2JS}static;{$ENDIF}\r\n class function TryISOToDateTime(const Value: string; out DateTime: TDateTime; TimeZoneMode: TTimeZoneMode): boolean; overload; {$IFNDEF PAS2JS}static;{$ENDIF}\r\n class function TimeToISO(const Value: TTime): string; {$IFNDEF PAS2JS}static;{$ENDIF}\r\n class function TryISOToTime(const Value: string; out DateTime: TTime): boolean; overload; {$IFNDEF PAS2JS}static;{$ENDIF}\r\n class function TryISOToTime(const Value: string; out DateTime: TTime; TimeZoneMode: TTimeZoneMode): boolean; overload; {$IFNDEF PAS2JS}static;{$ENDIF}\r\n class function DateToISO(const Value: TDate): string; {$IFNDEF PAS2JS}static;{$ENDIF}\r\n class function TryISOToDate(const Value: string; out DateTime: TDate): boolean; {$IFNDEF PAS2JS}static;{$ENDIF}\r\n class function ISOToDate(const Value: string): TDate; {$IFNDEF PAS2JS}static;{$ENDIF}\r\n class function ISOToDateTime(const Value: string): TDateTime; {$IFNDEF PAS2JS}static;{$ENDIF}\r\n class function ISOToTime(const Value: string): TTime; {$IFNDEF PAS2JS}static;{$ENDIF}\r\n class function DateTimeToUtcString(const Value: TDateTime): string; {$IFNDEF PAS2JS}static;{$ENDIF}\r\n class function EncodeBase64(const Input: TBytes): string; overload; {$IFNDEF PAS2JS}static;{$ENDIF}\r\n {$IFNDEF PAS2JS}\r\n class function EncodeBase64(Data: Pointer; Len: Integer): string; overload; {$IFNDEF PAS2JS}static;{$ENDIF}\r\n {$ENDIF}\r\n class function EncodeBase64Url(const Input: TBytes): string; {$IFNDEF PAS2JS}static;{$ENDIF}\r\n class function DecodeBase64(const Input: string): TBytes; {$IFNDEF PAS2JS}static;{$ENDIF}\r\n class function DecodeBase64Url(const Input: string): TBytes; {$IFNDEF PAS2JS}static;{$ENDIF}\r\n\r\n {$IFNDEF PAS2JS}\r\n class function TryStringToGuid(const Value: string; out Guid: TGuid): boolean; {$IFNDEF PAS2JS}static;{$ENDIF}\r\n {$ENDIF}\r\n\r\n class function RandomNumber(Length: Integer): string;\r\n class function RandomString(Length: Integer): string;\r\n public\r\n {$IFNDEF PAS2JS}\r\n class function IsLetter(C: Char): Boolean; {$IFNDEF PAS2JS}static; inline;{$ENDIF}\r\n class function IsLower(C: Char): Boolean; {$IFNDEF PAS2JS}static; inline;{$ENDIF}\r\n class function IsUpper(C: Char): Boolean; {$IFNDEF PAS2JS}static; inline;{$ENDIF}\r\n {$ENDIF}\r\n class function IsDigit(C: Char): Boolean; {$IFNDEF PAS2JS}static; inline;{$ENDIF}\r\n public\r\n class function CombineUrlFast(const AbsoluteUrl, RelativeUrl: string): string; {$IFNDEF PAS2JS}static;{$ENDIF}\r\n private\r\n class function InternalEncodeBase64(const Input: TBytes;\r\n EncodeTable: TBase64EncodeTable; Padding: Boolean): string; overload; {$IFNDEF PAS2JS}static;{$ENDIF}\r\n\r\n {$IFNDEF PAS2JS}\r\n class function InternalEncodeBase64(Data: Pointer; Len: Integer;\r\n EncodeTable: TBase64EncodeTable; Padding: Boolean): string; overload; {$IFNDEF PAS2JS}static;{$ENDIF}\r\n {$ENDIF}\r\n public\r\n class function PercentEncode(const S: string): string; {$IFNDEF PAS2JS}static;{$ENDIF}\r\n end;\r\n\r\n{$IFDEF PAS2JS}\r\nprocedure FreeObj(var Obj);\r\n{$ELSE}\r\n {$IFDEF DELPHISYDNEY_LVL}\r\nprocedure FreeObj(const [ref] Obj: TObject); inline;\r\n {$ELSE}\r\nprocedure FreeObj(var Obj); inline;\r\n {$ENDIF}\r\n{$ENDIF}\r\n\r\nvar\r\n DefaultTimeZoneMode: TTimeZoneMode;\r\n FullISOTimeNotation: Boolean;\r\n\r\nimplementation\r\n\r\nuses\r\n {$IFNDEF PAS2JS}\r\n Types, StrUtils,\r\n {$ENDIF}\r\n DateUtils;\r\n\r\nconst\r\n SInvalidDateFormat = 'Value %s is not a valid datetime';\r\n\r\n\r\n{$IFDEF PAS2JS}\r\nprocedure FreeObj(var Obj);\r\n{$ELSE}\r\n {$IFDEF DELPHISYDNEY_LVL}\r\nprocedure FreeObj(const [ref] Obj: TObject);\r\n {$ELSE}\r\nprocedure FreeObj(var Obj);\r\n {$ENDIF}\r\n{$ENDIF}\r\n{$IFDEF AUTOREFCOUNT}\r\nbegin\r\n if (Pointer(Obj) <> nil) then TObject(Obj).DisposeOf;\r\n TObject(Obj) := nil;\r\nend;\r\n{$ELSE}\r\nbegin\r\n FreeAndNil(Obj);\r\nend;\r\n{$ENDIF}\r\n\r\n\r\n{ TBclUtils }\r\n\r\n//type\r\n// TAcceptItem = record\r\n// TypeName: string;\r\n// SubType: string;\r\n// Q: double;\r\n// end;\r\n//\r\n// TMatchWeight = record\r\n// Value: integer;\r\n// Q: double;\r\n// TypeName: string;\r\n// end;\r\n//\r\n//function ParseMediaItem(const Item: string): TAcceptItem;\r\n//var\r\n// Parts: TStringDynArray;\r\n// Param, ParamName, ParamValue: string;\r\n// QValue: double;\r\n// I: integer;\r\n// P: integer;\r\n// FullType: string;\r\n//begin\r\n// Parts := SplitString(Trim(Item), ';');\r\n//\r\n// // parse params\r\n// Result.Q := 1;\r\n// for I := 1 to Length(Parts) - 1 do\r\n// begin\r\n// Param := Parts[I];\r\n// P := Pos('=', Param);\r\n// if P > 0 then\r\n// begin\r\n// ParamName := Copy(Param, 1, P - 1);\r\n// ParamValue := Copy(Param, P + 1, MaxInt);\r\n// if ParamName = 'q' then\r\n// begin\r\n// // ignore other parameters for now\r\n// if not TryStrToFloat(ParamValue, QValue) or (QValue < 0) or (QValue > 1) then\r\n// QValue := 1;\r\n// Result.Q := QValue;\r\n// end;\r\n// end;\r\n// end;\r\n//\r\n// if Length(Parts) > 0 then\r\n// FullType := Parts[0]\r\n// else\r\n// FullType := '*/*';\r\n// if FullType = '*' then\r\n// FullType := '*/*';\r\n//\r\n// P := Pos('/', FullType);\r\n// if P > 0 then\r\n// begin\r\n// Result.TypeName := Copy(FullType, 1, P - 1);\r\n// Result.SubType := Copy(FullType, P + 1, MaxInt);\r\n// end\r\n// else\r\n// begin\r\n// Result.TypeName := FullType;\r\n// Result.SubType := '*';\r\n// end;\r\n//end;\r\n//\r\n//function MediaItemWeight(const Item: string; Acceptables: TArray): TMatchWeight;\r\n//var\r\n// Target: TAcceptItem;\r\n// Acceptable: TAcceptItem;\r\n// EqualsType, EqualsSubType: boolean;\r\n// TempWeight: integer;\r\n//begin\r\n// Target := ParseMediaItem(Item);\r\n// Result.Value := -1;\r\n// Result.Q := 0;\r\n//\r\n// for Acceptable in Acceptables do\r\n// begin\r\n// EqualsType := SameText(Target.TypeName, Acceptable.TypeName);\r\n// EqualsSubType := SameText(Target.SubType, Acceptable.SubType);\r\n// if (EqualsType or (Acceptable.TypeName = '*') or (Target.TypeName = '*'))\r\n// and\r\n// (EqualsSubType or (Acceptable.SubType = '*') or (Target.SubType = '*')) then\r\n// begin\r\n// TempWeight := 0;\r\n// if EqualsType then\r\n// TempWeight := TempWeight + 100;\r\n// if EqualsSubType then\r\n// TempWeight := TempWeight + 10;\r\n// if (TempWeight > Result.Value) then\r\n// begin\r\n// Result.Value := TempWeight;\r\n// Result.Q := Acceptable.Q;\r\n// end;\r\n// end;\r\n// end;\r\n//end;\r\n//\r\n//function GetAcceptables(const Accept: string): TArray;\r\n//var\r\n// MediaItems: TStringDynArray;\r\n// I: integer;\r\n//begin\r\n// MediaItems := SplitString(Accept, ',');\r\n// SetLength(Result, Length(MediaItems));\r\n// for I := 0 to Length(MediaItems) - 1 do\r\n// Result[I] := ParseMediaItem(MediaItems[I]);\r\n//end;\r\n//\r\n//function BestAcceptableMatch(Acceptables: TArray; Values: TArray): TMatchWeight;\r\n//var\r\n// Weight: TMatchWeight;\r\n// I: integer;\r\n//begin\r\n// Result.Value := -1;\r\n// Result.Q := 0;\r\n// for I := 0 to Length(Values) - 1 do\r\n// begin\r\n// Weight := MediaItemWeight(Values[I], Acceptables);\r\n// if Weight.Value = -1 then Continue;\r\n//\r\n// if (Weight.Value > Result.Value) or\r\n// ((Weight.Value = Result.Value) and (Weight.Q > Result.Q)) or\r\n// (Result.Q = 0) then\r\n// begin\r\n// Result := Weight;\r\n// Result.TypeName := Values[I];\r\n// end;\r\n// end;\r\n//// if Result.Q > 0 then\r\n//// Result := '';\r\n//end;\r\n//\r\n//class function TBclUtils.AcceptsType(const Accept: string; const Value: string): boolean;\r\n//begin\r\n// Result := AcceptsType(Accept, TArray.Create(Value)) <> '';\r\n//end;\r\n//\r\n//class function TBclUtils.AcceptsType(const Accept: string; const Values: TArray): string;\r\n//var\r\n// Acceptables: TArray;\r\n// Match: TMatchWeight;\r\n//begin\r\n// if Length(Values) = 0 then Exit('');\r\n// if Accept = '' then Exit(Values[0]);\r\n//\r\n// Acceptables := GetAcceptables(Accept);\r\n//\r\n// Match := BestAcceptableMatch(Acceptables, Values);\r\n// if Match.Q > 0 then\r\n// Result := Match.TypeName\r\n// else\r\n// Result := '';\r\n//end;\r\n//\r\n//class function TBclUtils.AcceptsEncoding(const Accept: string; const Value: string): boolean;\r\n//begin\r\n// Result := AcceptsType(Accept, TArray.Create(Value)) <> '';\r\n//end;\r\n//\r\n//class function TBclUtils.AcceptsEncoding(const Accept: string; const Values: TArray): string;\r\n//var\r\n// Acceptables: TArray;\r\n// Acceptable: TAcceptItem;\r\n// HasIdentity: boolean;\r\n// Value: string;\r\n// Match: TMatchWeight;\r\n//begin\r\n// if Length(Values) = 0 then Exit('');\r\n//// if Accept = '' then Exit(Values[0]); // we must consider identity\r\n//\r\n// HasIdentity := false;\r\n// Acceptables := GetAcceptables(Accept);\r\n// for Acceptable in Acceptables do\r\n// begin\r\n// if not HasIdentity and SameText(Acceptable.TypeName, 'identity') then\r\n// HasIdentity := True;\r\n// end;\r\n//\r\n// Match := BestAcceptableMatch(Acceptables, Values);\r\n// if Match.Q > 0 then\r\n// Exit(Match.TypeName);\r\n//\r\n// // check for identity\r\n// if not HasIdentity and not SameText(Match.TypeName, 'identity') then\r\n// for Value in Values do\r\n// if SameText(Value, 'identity') then\r\n// Exit(Value);\r\n//end;\r\n//\r\n//class function TBclUtils.BasicAuthHeaderValue(const UserName, Password: string): string;\r\n//begin\r\n// Result := 'Basic ' + EncodeBase64(TEncoding.UTF8.GetBytes(Format('%s:%s', [UserName, Password])));\r\n//end;\r\n//\r\n//class function TBclUtils.CombineUrlFast(const AbsoluteUrl,\r\n// RelativeUrl: string): string;\r\n//begin\r\n// // Do a faster url combination because we know RelativeUrl comes correct\r\n// Result := AbsoluteUrl;\r\n// if (Length(Result) > 0) and (Result[Length(Result)] <> '/') then\r\n// Result := Result + '/';\r\n// Result := Result + RelativeUrl;\r\n//end;\r\n\r\n//class function TBclUtils.DateTimeToDayTimeDuration(\r\n// const Value: TTime): string;\r\n//var\r\n// D, H, M, S, MS: Word;\r\n//begin\r\n// D := Trunc(Value);\r\n// DecodeTime(Value, H, M, S, MS);\r\n// Result := 'P';\r\n// if D > 0 then\r\n// Result := Result + IntToStr(D) + 'D';\r\n// if H > 0 then\r\n// Result := Result + IntToStr(H) + 'H';\r\n// if M > 0 then\r\n// Result := Result + IntToStr(M) + 'M';\r\n// if S > 0 then\r\n// Result := Result + IntToStr(S) + 'S';\r\n// if Result = 'P' then\r\n// Result := 'P0D';\r\n//end;\r\n\r\nclass function TBclUtils.AdjustTimeZone(var DateTime: TDateTime; const TimeZone: TTimeZoneInfo;\r\n TimeZoneMode: TTimeZoneMode): Boolean;\r\n\r\n function AdjustTime(Value: TDateTime; HourOff, MinOff: Integer): TDateTime;\r\n var\r\n Delta: TDateTime;\r\n begin\r\n Result := Value;\r\n Delta := EncodeTime(Abs(HourOff), Abs(MinOff), 0, 0);\r\n if ((HourOff * MinsPerHour) + MinOff) > 0 then\r\n Result := Result - Delta\r\n else\r\n Result := Result + Delta;\r\n end;\r\n\r\nbegin\r\n case TimeZoneMode of\r\n TTimeZoneMode.Error:\r\n // do not accept timezone in the format, otherwise, return local date time\r\n if TimeZone.HasTimeZone then Exit(False);\r\n\r\n TTimeZoneMode.Ignore: ;\r\n // Return local time ignoring time zone\r\n\r\n TTimeZoneMode.AsUTC:\r\n if TimeZone.HasTimeZone then\r\n DateTime := AdjustTime(DateTime, TimeZone.HourOff, TimeZone.MinOff)\r\n else\r\n begin\r\n {$IFDEF PAS2JS}\r\n DateTime := IncMinute(DateTime, DateTimeToJSDate(DateTime).getTimezoneOffset);\r\n {$ELSE}\r\n DateTime := TTimeZone.Local.ToUniversalTime(DateTime);\r\n {$ENDIF}\r\n end;\r\n\r\n TTimeZoneMode.AsLocal:\r\n if TimeZone.HasTimeZone then\r\n begin\r\n DateTime := AdjustTime(DateTime, TimeZone.HourOff, TimeZone.MinOff);\r\n {$IFDEF PAS2JS}\r\n DateTime := IncMinute(DateTime, -DateTimeToJSDate(DateTime).getTimezoneOffset);\r\n {$ELSE}\r\n DateTime := TTimeZone.Local.ToLocalTime(DateTime);\r\n {$ENDIF}\r\n end;\r\n end;\r\n Result := True;\r\nend;\r\n\r\nclass function TBclUtils.CombineUrlFast(const AbsoluteUrl,\r\n RelativeUrl: string): string;\r\nbegin\r\n // Do a faster url combination because we know RelativeUrl comes correct\r\n Result := AbsoluteUrl;\r\n if (Length(Result) > 0) and (Result[Length(Result)] <> '/') then\r\n Result := Result + '/';\r\n Result := Result + RelativeUrl;\r\nend;\r\n\r\nclass function TBclUtils.DateTimeToISO(const Value: TDateTime; FullNotation: boolean): string;\r\nvar\r\n Year, Month, Day, Hour, Minute, Second, MS: Word;\r\nbegin\r\n if not FullNotation and (Value = DateOf(Value)) then\r\n Result := DateToISO(Value)\r\n else\r\n begin\r\n DecodeDateTime(Value, Year, Month, Day, Hour, Minute, Second, MS);\r\n if FullNotation or (DateOf(Value) <> 0) then\r\n Result := Format('%sT%s', [DateToISO(Value), TimeToISO(Value)])\r\n else\r\n Result := Format('%s', [TimeToISO(Value)])\r\n end;\r\nend;\r\n\r\nclass function TBclUtils.DateTimeToUtcString(const Value: TDateTime): string;\r\nconst\r\n DayNames: array[1..7] of string = ('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat');\r\n MonthNames: array[1..12] of string = ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul',\r\n 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');\r\nvar\r\n Y, M, D: Word;\r\n H, Mn, S, MS: Word;\r\nbegin\r\n DecodeDate(Value, Y, M, D);\r\n DecodeTime(Value, H, Mn, S, MS);\r\n Result := Format('%s, %.2d %s %.4d %.2d:%.2d:%.2d GMT',\r\n [DayNames[DayOfWeek(Value)], D, MonthNames[M], Y, H, Mn, S]\r\n );\r\nend;\r\n\r\n//class function TBclUtils.DateTimeToJson(const Value: TDateTime): string;\r\n//begin\r\n// Result := Format('\\/Date(%d)\\/', [DateTimeToUnix(Value) * 1000]);\r\n//end;\r\n//\r\n//class function TBclUtils.DateTimeToUnix(const Value: TDateTime): Int64;\r\n//begin\r\n// Result := Round((Value - UnixDateDelta) * SecsPerDay);\r\n//end;\r\n\r\ntype\r\n TPacket = packed record\r\n a: array[0..3] of Byte;\r\n end;\r\n\r\nclass function TBclUtils.DecodeBase64(const Input: string): TBytes;\r\nvar\r\n StrLen: Integer;\r\nconst\r\n DecodeTable: array[#0..#127] of Integer = (\r\n 61, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,\r\n 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,\r\n 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64, 62, 64, 63,\r\n 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64,\r\n 64, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,\r\n 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, 64, 64, 63,\r\n 64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,\r\n 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64);\r\n\r\n function DecodePacket(Idx: Integer; var nChars: Integer): TPacket;\r\n begin\r\n Result.a[0] := (DecodeTable[Input[Idx + 0]] shl 2) or\r\n (DecodeTable[Input[Idx + 1]] shr 4);\r\n NChars := 1;\r\n if (Idx + 2 <= StrLen) and (Input[Idx + 2] <> '=') then\r\n begin\r\n Inc(NChars);\r\n Result.a[1] := ((DecodeTable[Input[Idx + 1]] shl 4) or (DecodeTable[Input[Idx + 2]] shr 2)) and $FF;\r\n end;\r\n if (Idx + 3 <= StrLen) and (Input[Idx + 3] <> '=') then\r\n begin\r\n Inc(NChars);\r\n Result.a[2] := ((DecodeTable[Input[Idx + 2]] shl 6) or DecodeTable[Input[Idx + 3]]) and $FF;\r\n end;\r\n end;\r\n\r\nvar\r\n I, J, K: Integer;\r\n Packet: TPacket;\r\n Len: integer;\r\nbegin\r\n SetLength(Result, ((Length(Input) + 2) div 4) * 3);\r\n StrLen := Length(Input);\r\n Len := 0;\r\n for I := 1 to (StrLen + 2) div 4 do\r\n begin\r\n Packet := DecodePacket((I - 1) * 4 + 1, J);\r\n K := 0;\r\n while J > 0 do\r\n begin\r\n Result[Len] := Packet.a[K];\r\n Inc(Len);\r\n Inc(K);\r\n Dec(J);\r\n end;\r\n end;\r\n SetLength(Result, Len);\r\nend;\r\n\r\nclass function TBclUtils.DecodeBase64Url(const Input: string): TBytes;\r\nbegin\r\n Result := DecodeBase64(Input);\r\nend;\r\n\r\nclass function TBclUtils.EncodeBase64(const Input: TBytes): string;\r\nconst\r\n EncodeTable: TBase64EncodeTable =\r\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' +\r\n 'abcdefghijklmnopqrstuvwxyz' +\r\n '0123456789+/';\r\nbegin\r\n Result := InternalEncodeBase64(Input, EncodeTable, True);\r\nend;\r\n\r\n{$IFNDEF PAS2JS}\r\nclass function TBclUtils.EncodeBase64(Data: Pointer; Len: Integer): string;\r\nconst\r\n EncodeTable: TBase64EncodeTable =\r\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' +\r\n 'abcdefghijklmnopqrstuvwxyz' +\r\n '0123456789+/';\r\nbegin\r\n Result := InternalEncodeBase64(Data, Len, EncodeTable, True);\r\nend;\r\n{$ENDIF}\r\n\r\nclass function TBclUtils.EncodeBase64Url(const Input: TBytes): string;\r\nconst\r\n EncodeTable: TBase64EncodeTable =\r\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' +\r\n 'abcdefghijklmnopqrstuvwxyz' +\r\n '0123456789-_';\r\nbegin\r\n Result := InternalEncodeBase64(Input, EncodeTable, False);\r\nend;\r\n\r\nclass function TBclUtils.InternalEncodeBase64(const Input: TBytes;\r\n EncodeTable: TBase64EncodeTable; Padding: Boolean): string;\r\nvar\r\n Output: string;\r\n\r\n procedure EncodePacket(const Packet: TPacket; NumChars: Integer; Idx: Integer);\r\n begin\r\n Output[Idx + 0] := EnCodeTable[Packet.a[0] shr 2];\r\n Output[Idx + 1] := EnCodeTable[((Packet.a[0] shl 4) or (Packet.a[1] shr 4)) and $0000003f];\r\n\r\n if NumChars < 2 then\r\n Output[Idx + 2] := '='\r\n else\r\n Output[Idx + 2] := EnCodeTable[((Packet.a[1] shl 2) or (Packet.a[2] shr 6)) and $0000003f];\r\n\r\n if NumChars < 3 then\r\n Output[Idx + 3] := '='\r\n else\r\n Output[Idx + 3] := EnCodeTable[Packet.a[2] and $0000003f];\r\n end;\r\n\r\nvar\r\n I, K, J: Integer;\r\n Packet: TPacket;\r\nbegin\r\n Output := '';\r\n I := (Length(Input) div 3) * 4;\r\n if Length(Input) mod 3 > 0 then Inc(I, 4);\r\n SetLength(Output, I);\r\n J := 1;\r\n for I := 1 to Length(Input) div 3 do\r\n begin\r\n Packet.a[0] := Input[(I - 1) * 3];\r\n Packet.a[1] := Input[(I - 1) * 3 + 1];\r\n Packet.a[2] := Input[(I - 1) * 3 + 2];\r\n Packet.a[3] := 0;\r\n EncodePacket(Packet, 3, J);\r\n Inc(J, 4);\r\n end;\r\n K := 0;\r\n\r\n Packet.a[0] := 0;\r\n Packet.a[1] := 0;\r\n Packet.a[2] := 0;\r\n Packet.a[3] := 0;\r\n\r\n for I := Length(Input) - (Length(Input) mod 3) + 1 to Length(Input) do\r\n begin\r\n Packet.a[K] := Byte(Input[I - 1]);\r\n Inc(K);\r\n if I = Length(Input) then\r\n EncodePacket(Packet, Length(Input) mod 3, J);\r\n end;\r\n\r\n if not Padding and (Length(Output) >= 2) then\r\n begin\r\n if Output[Length(Output) - 1] = '=' then\r\n SetLength(Output, Length(Output) - 2)\r\n else\r\n if Output[Length(Output)] = '=' then\r\n SetLength(Output, Length(Output) - 1);\r\n end;\r\n Result := Output;\r\nend;\r\n\r\nclass function TBclUtils.InternalISOToTime(const Text: string;\r\n out DateTime: TDateTime; out TimeZone: TTimeZoneInfo): boolean;\r\nvar\r\n TextLen: Integer;\r\n\r\n function ExtractDigit(var CharIndex: Integer; out Value: Integer): Boolean;\r\n begin\r\n Result := (CharIndex <= TextLen) and IsDigit(Text[CharIndex]);\r\n if Result then\r\n begin\r\n Value := Ord(Text[CharIndex]) - Ord('0');\r\n Inc(CharIndex);\r\n end;\r\n end;\r\n\r\n function ExtractDoubleDigit(var CharIndex: Integer; out Value: Integer): Boolean;\r\n var\r\n N10, N: Integer;\r\n begin\r\n Result := ExtractDigit(CharIndex, N10) and ExtractDigit(CharIndex, N);\r\n if Result then\r\n Value := N10 * 10 + N;\r\n end;\r\n\r\n function ExtractTripleDigit(var CharIndex: Integer; out Value: Integer): Boolean;\r\n var\r\n N100, N10, N: Integer;\r\n begin\r\n Result := ExtractDigit(CharIndex, N100) and ExtractDigit(CharIndex, N10) and ExtractDigit(CharIndex, N);\r\n if Result then\r\n Value := N100 * 100 + N10 * 10 + N;\r\n end;\r\n\r\n function ExtractChar(var CharIndex: Integer; C: Char): Boolean;\r\n begin\r\n Result := (CharIndex <= TextLen) and (Text[CharIndex] = C);\r\n if Result then\r\n Inc(CharIndex);\r\n end;\r\n\r\n function ExtractHourMinOffset(var CharIndex: Integer; out HourOff, MinOff: Integer): Boolean;\r\n begin\r\n Result :=\r\n ExtractDoubleDigit(CharIndex, HourOff)\r\n and ExtractChar(CharIndex, ':')\r\n and ExtractDoubleDigit(CharIndex, MinOff)\r\n and (CharIndex > TextLen);\r\n end;\r\n\r\n function ExtractTimeZone(var CharIndex: Integer; out HourOff, MinOff: Integer): Boolean;\r\n begin\r\n HourOff := 0;\r\n MinOff := 0;\r\n if ExtractChar(CharIndex, 'Z') then\r\n begin\r\n Result := CharIndex > TextLen;\r\n end\r\n else\r\n if ExtractChar(CharIndex, '+') then\r\n begin\r\n Result := ExtractHourMinOffset(CharIndex, HourOff, MinOff);\r\n end\r\n else\r\n if ExtractChar(CharIndex, '-') then\r\n begin\r\n Result := ExtractHourMinOffset(CharIndex, HourOff, MinOff);\r\n HourOff := -HourOff;\r\n MinOff := -MinOff;\r\n end\r\n else\r\n Result := False;\r\n end;\r\n\r\n function IsFinal(var CharIndex: Integer; out HasTimeZone: Boolean): Boolean;\r\n var\r\n C: Char;\r\n begin\r\n if CharIndex <= TextLen then\r\n C := Text[CharIndex]\r\n else\r\n C := #0;\r\n Result := (C = #0) or (C = 'Z') or (C = '+') or (C = '-');\r\n HasTimeZone := C <> #0;\r\n end;\r\n\r\nvar\r\n Hour, Min, Sec, MSec: Integer;\r\n HourOff, MinOff: Integer;\r\n HasTimeZone: Boolean;\r\n CharIndex: Integer;\r\nbegin\r\n DateTime := 0;\r\n if Text = '' then\r\n begin\r\n Result := True;\r\n end else\r\n begin\r\n Hour := 0;\r\n Min := 0;\r\n Sec := 0;\r\n MSec := 0;\r\n HourOff := 0;\r\n MinOff := 0;\r\n HasTimeZone := False;\r\n\r\n TextLen := Length(Text);\r\n CharIndex := 1;\r\n if not ExtractDoubleDigit(CharIndex, Hour) then Exit(False);\r\n if not ExtractChar(CharIndex, ':') then Exit(False);\r\n if not ExtractDoubleDigit(CharIndex, Min) then Exit(False);\r\n if not IsFinal(CharIndex, HasTimeZone) then\r\n begin\r\n if not ExtractChar(CharIndex, ':') then Exit(False);\r\n if not ExtractDoubleDigit(CharIndex, Sec) then Exit(False);\r\n if not IsFinal(CharIndex, HasTimeZone) then\r\n begin\r\n if not (ExtractChar(CharIndex, '.') and ExtractTripleDigit(CharIndex, MSec) and IsFinal(CharIndex, HasTimeZone)) then\r\n Exit(False);\r\n end;\r\n end;\r\n if HasTimeZone then\r\n begin\r\n if not ExtractTimeZone(CharIndex, HourOff, MinOff) then Exit(False);\r\n end;\r\n\r\n DateTime := EncodeTime(Hour, Min, Sec, MSec);\r\n TimeZone.HourOff := HourOff;\r\n TimeZone.MinOff := MinOff;\r\n TimeZone.HasTimeZone := HasTimeZone;\r\n\r\n Result := True;\r\n end;\r\nend;\r\n\r\n{$IFNDEF PAS2JS}\r\nclass procedure TBclUtils.InitFormatSettings(var FS: TFormatSettings);\r\nbegin\r\n {$IFDEF DELPHIXE2_LVL}\r\n FS := System.SysUtils.FormatSettings;\r\n {$ELSE}\r\n {$IFDEF DELPHIXE_LVL}\r\n FS := TFormatSettings.Create;\r\n {$ELSE}\r\n GetLocaleFormatSettings(0, FS);\r\n {$ENDIF}\r\n {$ENDIF}\r\nend;\r\n{$ENDIF}\r\n\r\n{$IFNDEF PAS2JS}\r\nclass function TBclUtils.IsDigit(C: Char): Boolean;\r\nbegin\r\n {$IFDEF DELPHIXE4_LVL}\r\n Result := C.IsDigit;\r\n {$ELSE}\r\n Result := Character.IsDigit(C);\r\n {$ENDIF}\r\nend;\r\n{$ELSE}\r\nclass function TBclUtils.IsDigit(C: Char): Boolean;\r\nbegin\r\n Result := (C >= '0') and (C <= '9');\r\nend;\r\n{$ENDIF}\r\n\r\n{$IFNDEF PAS2JS}\r\nclass function TBclUtils.IsLetter(C: Char): Boolean;\r\nbegin\r\n {$IFDEF DELPHIXE4_LVL}\r\n Result := C.IsLetter;\r\n {$ELSE}\r\n Result := Character.IsLetter(C);\r\n {$ENDIF}\r\nend;\r\n{$ENDIF}\r\n\r\n{$IFNDEF PAS2JS}\r\nclass function TBclUtils.IsLower(C: Char): Boolean;\r\nbegin\r\n {$IFDEF DELPHIXE4_LVL}\r\n Result := C.IsLower;\r\n {$ELSE}\r\n Result := Character.IsLower(C);\r\n {$ENDIF}\r\nend;\r\n{$ENDIF}\r\n\r\n{$IFNDEF PAS2JS}\r\nclass function TBclUtils.IsUpper(C: Char): Boolean;\r\nbegin\r\n {$IFDEF DELPHIXE4_LVL}\r\n Result := C.IsUpper;\r\n {$ELSE}\r\n Result := Character.IsUpper(C);\r\n {$ENDIF}\r\nend;\r\n{$ENDIF}\r\n\r\nclass function TBclUtils.PercentEncode(const S: string): string;\r\nvar\r\n {$IFDEF PAS2JS}\r\n Bytes: string;\r\n {$ELSE}\r\n Bytes: TBytes;\r\n {$ENDIF}\r\n B: Byte;\r\n I: integer;\r\n L: integer;\r\n H: string;\r\nbegin\r\n {$IFDEF PAS2JS}\r\n Bytes := S;\r\n {$ELSE}\r\n Bytes := TEncoding.UTF8.GetBytes(S);\r\n {$ENDIF}\r\n\r\n SetLength(Result, Length(Bytes) * 3); // final string will be maximum 3 times the original bytes\r\n L := 1;\r\n {$IFDEF PAS2JS}\r\n for I := 1 to Length(Bytes) do\r\n begin\r\n B := Ord(Bytes[I]);\r\n {$ELSE}\r\n for I := 0 to Length(Bytes) - 1 do\r\n begin\r\n B := Bytes[I];\r\n {$ENDIF}\r\n\r\n // Check if is unreserved char\r\n if ((B >= 65) and (B <= 90)) // A..Z\r\n or ((B >= 97) and (B <= 122)) // a..z\r\n or ((B >= 48) and (B <= 57)) //0..9\r\n or (B in [45, 46, 95, 126]) // - . _ ~\r\n or (B in [33, 39, 40, 41, 42]) then // ! ' ( ) *\r\n begin\r\n Result[L] := Chr(B);\r\n Inc(L);\r\n end else\r\n begin\r\n Result[L] := '%';\r\n H := IntToHex(B, 2);\r\n Result[L + 1] := H[1];\r\n Result[L + 2] := H[2];\r\n Inc(L, 3);\r\n end;\r\n end;\r\n SetLength(Result, L - 1);\r\nend;\r\n\r\nclass function TBclUtils.RandomNumber(Length: Integer): string;\r\nconst\r\n cNumbers = '0123456789';\r\nvar\r\n I: integer;\r\nbegin\r\n SetLength(Result, Length);\r\n for I := 1 to Length do\r\n Result[I] := cNumbers[Random(10) + 1];\r\nend;\r\n\r\nclass function TBclUtils.RandomString(Length: Integer): string;\r\nconst\r\n cLetters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';\r\nvar\r\n I: integer;\r\nbegin\r\n SetLength(Result, Length);\r\n for I := 1 to Length do\r\n Result[I] := cLetters[Random(62) + 1];\r\nend;\r\n\r\n//class procedure TBclUtils.GetNameAndAnnotation(const Text: string; out AName,\r\n// AAnnotation: string);\r\n//var\r\n// P: integer;\r\n//begin\r\n// P := Pos('@', Text);\r\n// if P = 0 then\r\n// begin\r\n// AName := Text;\r\n// AAnnotation := '';\r\n// end else\r\n// begin\r\n// AName := Copy(Text, 1, P - 1);\r\n// AAnnotation := Copy(Text, P + 1, MaxInt);\r\n// end;\r\n//end;\r\n//\r\n//class function TBclUtils.GetQueryParams(const Query: string): TArray>;\r\n//var\r\n// QueryItem: string;\r\n// QueryItems: TStringDynArray;\r\n// I, P: integer;\r\n// Name, Value: string;\r\n//begin\r\n// if (Length(Query) > 0) and (Query[1] = '?') then\r\n// QueryItems := SplitString(Copy(Query, 2, MaxInt), '&')\r\n// else\r\n// QueryItems := SplitString(Query, '&');\r\n// SetLength(Result, Length(QueryItems));\r\n// for I := 0 to Length(QueryItems) - 1 do\r\n// begin\r\n// QueryItem := QueryItems[I];\r\n// P := Pos('=', QueryItem);\r\n// Name := Copy(QueryItem, 1, P - 1);\r\n// Value := Copy(QueryItem, P + 1, MaxInt);\r\n// Name := TBclUtils.PercentDecode(Name);\r\n// Value := TBclUtils.PercentDecode(Value);\r\n// Result[I].Key := Name;\r\n// Result[I].Value := Value;\r\n// end;\r\n//end;\r\n//\r\n//class function TBclUtils.GetStatusReason(const StatusCode: integer): string;\r\n//begin\r\n// case StatusCode of\r\n// 100: Result := 'Continue';\r\n// 101: Result := 'Switching Protocols';\r\n// 102: Result := 'Processing';\r\n// 200: Result := 'OK';\r\n// 201: Result := 'Created';\r\n// 202: Result := 'Accepted';\r\n// 203: Result := 'Non-Authoritative Information';\r\n// 204: Result := 'No Content';\r\n// 205: Result := 'Reset Content';\r\n// 206: Result := 'Partial Content';\r\n// 207: Result := 'Multi-Status';\r\n// 208: Result := 'Already Reported';\r\n// 300: Result := 'Multiple Choices';\r\n// 301: Result := 'Moved Permanently';\r\n// 302: Result := 'Found';\r\n// 303: Result := 'See Other';\r\n// 304: Result := 'Not Modified';\r\n// 305: Result := 'Use Proxy';\r\n// 306: Result := 'Switch Proxy';\r\n// 307: Result := 'Temporary Redirect';\r\n// 400: Result := 'Bad Request';\r\n// 401: Result := 'Unauthorized';\r\n// 402: Result := 'Payment Required';\r\n// 403: Result := 'Forbidden';\r\n// 404: Result := 'Not Found';\r\n// 405: Result := 'Method Not Allowed';\r\n// 406: Result := 'Not Acceptable';\r\n// 407: Result := 'Proxy Authentication Required';\r\n// 408: Result := 'Request Timeout';\r\n// 409: Result := 'Conflict';\r\n// 410: Result := 'Gone';\r\n// 411: Result := 'Length Required';\r\n// 412: Result := 'Precondition Failed';\r\n// 413: Result := 'Request Entity Too Large';\r\n// 414: Result := 'Request-URI Too Long';\r\n// 415: Result := 'Unsupported Media Type';\r\n// 416: Result := 'Request Range Not Satisfiable';\r\n// 417: Result := 'Expectation Failed';\r\n// 422: Result := 'Unprocessable Entity';\r\n// 423: Result := 'Locked';\r\n// 424: Result := 'Failed Dependency';\r\n// 500: Result := 'Internal Server Error';\r\n// 501: Result := 'Not Implemented';\r\n// 502: Result := 'Bad Gateway';\r\n// 503: Result := 'Service Unavailable';\r\n// 504: Result := 'Gateway Timeout';\r\n// 505: Result := 'Http Version Not Supported';\r\n// 506: Result := 'Variant Also Negotiates';\r\n// 507: Result := 'Insufficient Storage';\r\n// else\r\n// Result := '';\r\n// end;\r\n//end;\r\n//\r\n//class function TBclUtils.ISOToTime(const Value: string): TTime;\r\n//begin\r\n// if Value = '' then Exit(0);\r\n// Result := StrToDateTime(Value, FISODateSettings);\r\n//end;\r\n\r\nclass function TBclUtils.TimeToISO(const Value: TTime): string;\r\nvar\r\n Year, Month, Day, Hour, Minute, Second, MS: Word;\r\nbegin\r\n DecodeDateTime(Value, Year, Month, Day, Hour, Minute, Second, MS);\r\n if (MS <> 0) or FullISOTimeNotation then\r\n Result := Format('%.2d:%.2d:%.2d.%.3d', [Hour, Minute, Second, MS])\r\n else\r\n if Second <> 0 then\r\n Result := Format('%.2d:%.2d:%.2d', [Hour, Minute, Second])\r\n else\r\n Result := Format('%.2d:%.2d', [Hour, Minute]);\r\nend;\r\n\r\nclass function TBclUtils.TryISOToTime(const Value: string; out DateTime: TTime;\r\n TimeZoneMode: TTimeZoneMode): boolean;\r\nvar\r\n TimeZone: TTimeZoneInfo;\r\n TempDate: TDateTime;\r\nbegin\r\n Result := InternalISOToTime(Value, TempDate, TimeZone);\r\n if Result then\r\n begin\r\n TempDate := Date + TempDate;\r\n Result := AdjustTimeZone(TempDate, TimeZone, TimeZoneMode);\r\n TempDate := Frac(TempDate);\r\n end;\r\n DateTime := TempDate;\r\nend;\r\n\r\n//class function TBclUtils.ISOToDateTime(const Value: string): TDateTime;\r\n//begin\r\n// if Value = '' then Exit(0);\r\n// Result := StrToDateTime(Value, FISODateSettings);\r\n//end;\r\n//\r\n//class function TBclUtils.PercentDecode(const S: string): string;\r\n//\r\n// function IsHexa(C: Char): boolean;\r\n// begin\r\n// Result := ((C >= '0') and (C <= '9'))\r\n// or ((C >= 'a') and (C <= 'f'))\r\n// or ((C >= 'A') and (C <= 'F'));\r\n// end;\r\n//\r\n//var\r\n// B: TBytes;\r\n// L: integer;\r\n// I: integer;\r\n//begin\r\n// SetLength(B, Length(S));\r\n// L := 1;\r\n// I := 0;\r\n// while L <= Length(S) do\r\n// begin\r\n// if (S[L] = '%') and (L + 2 <= Length(S)) and IsHexa(S[L + 1]) and IsHexa(S[L + 2]) then\r\n// begin\r\n// B[I] := StrToInt('$' + S[L + 1] + S[L + 2]);\r\n// Inc(L, 3);\r\n// end\r\n// else\r\n// begin\r\n// B[I] := Ord(S[L]);\r\n// Inc(L);\r\n// end;\r\n// Inc(I);\r\n// end;\r\n// SetLength(B, I);\r\n// Result := TEncoding.UTF8.GetString(B);\r\n//end;\r\n//\r\n//class function TBclUtils.PercentEncode(Segments: TArray): string;\r\n//var\r\n// Segment: string;\r\n//begin\r\n// Result := '';\r\n// for Segment in Segments do\r\n// begin\r\n// if Result <> '' then\r\n// Result := Result + '/';\r\n// Result := Result + PercentEncode(Segment);\r\n// end;\r\n//end;\r\n//\r\n//class function TBclUtils.PercentEncode(const S: string): string;\r\n//var\r\n// B: TBytes;\r\n// I: integer;\r\n// L: integer;\r\n// H: string;\r\n//begin\r\n// B := TEncoding.UTF8.GetBytes(S);\r\n// SetLength(Result, Length(B) * 3); // final string will be maximum 3 times the original bytes\r\n// L := 1;\r\n// for I := 0 to Length(B) - 1 do\r\n// begin\r\n// // Check if is unreserved char\r\n// if ((B[I] >= 65) and (B[I] <= 90)) // A..Z\r\n// or ((B[I] >= 97) and (B[I] <= 122)) // a..z\r\n// or ((B[I] >= 48) and (B[I] <= 57)) //0..9\r\n// or (B[I] in [45, 46, 95, 126]) // - . _ ~\r\n// or (B[I] in [33, 39, 40, 41, 42]) then // ! ' ( ) *\r\n// begin\r\n// Result[L] := Char(B[I]);\r\n// Inc(L);\r\n// end else\r\n// begin\r\n// Result[L] := '%';\r\n// H := IntToHex(B[I], 2);\r\n// Result[L + 1] := H[1];\r\n// Result[L + 2] := H[2];\r\n// Inc(L, 3);\r\n// end;\r\n// end;\r\n// SetLength(Result, L - 1);\r\n//end;\r\n//\r\n//class function TBclUtils.TryDayTimeDurationToDateTime(const Value: string;\r\n// out Time: TTime): boolean;\r\n//var\r\n// Len: integer;\r\n// Day, Hour, Min, Sec: integer;\r\n//\r\n// function ExtractNumber(const Value: string; var I: integer): boolean;\r\n// var\r\n// Start: integer;\r\n// C: Char;\r\n// Number: integer;\r\n// begin\r\n// Start := I;\r\n// while (I <= Len) and\r\n// {$IFDEF DELPHIXE4_LVL}\r\n// Value[I].IsDigit\r\n// {$ELSE}\r\n// IsDigit(Value[I])\r\n// {$ENDIF}\r\n// do\r\n// Inc(I);\r\n// Result := TryStrToInt(Copy(Value, Start, I - Start), Number) and (I <= Len);\r\n// if Result then\r\n// begin\r\n// C := Value[I];\r\n// Inc(I);\r\n// if C = 'D' then\r\n// Day := Number\r\n// else\r\n// if C = 'H' then\r\n// Hour := Number\r\n// else\r\n// if C = 'M' then\r\n// Min := Number\r\n// else\r\n// if C = 'S' then\r\n// Sec := Number\r\n// else\r\n// Result := false;\r\n// end;\r\n// end;\r\n//\r\n//var\r\n// I: integer;\r\n//begin\r\n// Len := Length(Value);\r\n// if (Len = 0) or (Value[1] <> 'P') then\r\n// Exit(false);\r\n// I := 2;\r\n//\r\n// Day := 0;\r\n// Hour := 0;\r\n// Min := 0;\r\n// Sec := 0;\r\n//\r\n// // at least one part must exist\r\n// if not ExtractNumber(Value, I) then\r\n// Exit(false);\r\n//\r\n// // now extract as many as exist\r\n// while ExtractNumber(Value, I) do ;\r\n// Time := EncodeTime(Hour, Min, Sec, 0);\r\n// Result := true;\r\n//end;\r\n\r\nclass function TBclUtils.ISOToDate(const Value: string): TDate;\r\nbegin\r\n if not TryISOToDate(Value, Result) then\r\n raise EConvertError.CreateFmt(SInvalidDateFormat, [Value]);\r\nend;\r\n\r\nclass function TBclUtils.ISOToDateTime(const Value: string): TDateTime;\r\nbegin\r\n if not TryISOToDateTime(Value, Result) then\r\n raise EConvertError.CreateFmt(SInvalidDateFormat, [Value]);\r\nend;\r\n\r\nclass function TBclUtils.ISOToTime(const Value: string): TTime;\r\nbegin\r\n if not TryISOToTime(Value, Result) then\r\n raise EConvertError.CreateFmt(SInvalidDateFormat, [Value]);\r\nend;\r\n\r\nclass function TBclUtils.TryISOToDateTime(const Value: string;\r\n out DateTime: TDateTime): boolean;\r\nbegin\r\n Result := TryISOToDateTime(Value, DateTime, DefaultTimeZoneMode);\r\nend;\r\n\r\nclass function TBclUtils.TryISOToTime(const Value: string; out DateTime: TTime): boolean;\r\nbegin\r\n Result := TryISOToTime(Value, DateTime, DefaultTimeZoneMode);\r\nend;\r\n\r\n{$IFNDEF PAS2JS}\r\nclass function TBclUtils.TryStringToGuid(const Value: string;\r\n out Guid: TGuid): boolean;\r\nbegin\r\n // TODO: Optimize this to a TryStringToGUID\r\n try\r\n Guid := StringToGUID('{' + Value + '}');\r\n Result := true;\r\n except\r\n Result := false;\r\n end;\r\nend;\r\n{$ENDIF}\r\n\r\nclass function TBclUtils.TryISOToDate(const Value: string; out DateTime: TDate): boolean;\r\nvar\r\n Year, Month, Day: Integer;\r\nbegin\r\n DateTime := 0;\r\n if Value = '' then\r\n begin\r\n Result := true;\r\n end else\r\n begin\r\n case Length(Value) of\r\n 10:\r\n begin\r\n Result := (Value[5] = '-') and (Value[8] = '-')\r\n and TryStrToInt(Copy(Value, 1, 4), Year)\r\n and TryStrToInt(Copy(Value, 6, 2), Month)\r\n and TryStrToInt(Copy(Value, 9, 2), Day);\r\n if Result then\r\n DateTime := EncodeDate(Year, Month, Day);\r\n end;\r\n else\r\n Result := False;\r\n end;\r\n end;\r\nend;\r\n\r\n//{$IFDEF PAS2JS}\r\n//class function TBclUtils.TryISOToDateTime(const Value: string;\r\n// out DateTime: TDateTime; TimeZoneMode: TTimeZoneMode): boolean;\r\n//var\r\n// JD: TJSDate;\r\n//begin\r\n// JD := TJSDate.new(Value);\r\n// Result := not JSisNan(JD);\r\n// if Result then\r\n// case TimeZoneMode of\r\n// TTimeZoneMode.Error, TTimeZoneMode.Ignore, TTimeZoneMode.AsLocal:\r\n// // In Pas2JS, Error and Ignore are not supported and considered as local\r\n// DateTime := EncodeDateTime(JD.FullYear, JD.Month + 1, JD.Date,\r\n// JD.Hours, JD.Minutes, JD.Seconds, JD.Milliseconds);\r\n// else\r\n// // UTC\r\n// DateTime := EncodeDateTime(JD.UTCFullYear, JD.UTCMonth + 1, JD.UTCDate,\r\n// JD.UTCHours, JD.UTCMinutes, JD.UTCSeconds, JD.UTCMilliseconds);\r\n// end;\r\n//end;\r\n//{$ELSE}\r\nclass function TBclUtils.TryISOToDateTime(const Value: string;\r\n out DateTime: TDateTime; TimeZoneMode: TTimeZoneMode): boolean;\r\nvar\r\n DatePart: TDate;\r\n TimePart: TDateTime;\r\n TimeZone: TTimeZoneInfo;\r\n TIndex: Integer;\r\nbegin\r\n TimeZone.Init;\r\n DateTime := 0;\r\n if Value = '' then\r\n begin\r\n Result := true;\r\n end else\r\n begin\r\n Result := False;\r\n TIndex := Pos('T', Value);\r\n if TIndex > 0 then\r\n begin\r\n Result := TryISOToDate(Copy(Value, 1, TIndex - 1), DatePart) and\r\n InternalISOToTime(Copy(Value, TIndex + 1, MaxInt), TimePart, TimeZone);\r\n if Result then\r\n DateTime := DatePart + TimePart;\r\n end\r\n else\r\n if TryISOToDate(Value, DatePart) then\r\n begin\r\n Result := True;\r\n DateTime := DatePart;\r\n end\r\n else\r\n if InternalISOToTime(Value, TimePart, TimeZone) then\r\n begin\r\n Result := True;\r\n DateTime := TimePart;\r\n end;\r\n if Result then\r\n Result := AdjustTimeZone(DateTime, TimeZone, TimeZoneMode);\r\n end;\r\nend;\r\n//{$ENDIF}\r\n\r\n//class function TBclUtils.ISOToDate(const Value: string): TDate;\r\n//begin\r\n// if Value = '' then Exit(0);\r\n// Result := StrToDate(Value, FISODateSettings);\r\n//end;\r\n\r\nclass function TBclUtils.DateToISO(const Value: TDate): string;\r\nvar\r\n Year, Month, Day: Word;\r\nbegin\r\n DecodeDate(Value, Year, Month, Day);\r\n Result := Format('%.4d-%.2d-%.2d', [Year, Month, Day]);\r\nend;\r\n\r\n{ TTimeZoneInfo }\r\n\r\nprocedure TTimeZoneInfo.Init;\r\nbegin\r\n HourOff := 0;\r\n MinOff := 0;\r\n HasTimeZone := False;\r\nend;\r\n\r\n{$IFNDEF PAS2JS}\r\nclass function TBclUtils.InternalEncodeBase64(Data: Pointer; Len: Integer;\r\n EncodeTable: TBase64EncodeTable; Padding: Boolean): string;\r\nvar\r\n Output: string;\r\n\r\n procedure EncodePacket(const Packet: TPacket; NumChars: Integer; Idx: Integer);\r\n begin\r\n Output[Idx + 0] := EnCodeTable[Packet.a[0] shr 2];\r\n Output[Idx + 1] := EnCodeTable[((Packet.a[0] shl 4) or (Packet.a[1] shr 4)) and $0000003f];\r\n\r\n if NumChars < 2 then\r\n Output[Idx + 2] := '='\r\n else\r\n Output[Idx + 2] := EnCodeTable[((Packet.a[1] shl 2) or (Packet.a[2] shr 6)) and $0000003f];\r\n\r\n if NumChars < 3 then\r\n Output[Idx + 3] := '='\r\n else\r\n Output[Idx + 3] := EnCodeTable[Packet.a[2] and $0000003f];\r\n end;\r\n\r\nvar\r\n I, K, J: Integer;\r\n Packet: TPacket;\r\n Input: PByte;\r\nbegin\r\n Input := PByte(Data);\r\n Output := '';\r\n I := (Len div 3) * 4;\r\n if Len mod 3 > 0 then Inc(I, 4);\r\n SetLength(Output, I);\r\n J := 1;\r\n for I := 1 to Len div 3 do\r\n begin\r\n Packet.a[0] := Input[(I - 1) * 3];\r\n Packet.a[1] := Input[(I - 1) * 3 + 1];\r\n Packet.a[2] := Input[(I - 1) * 3 + 2];\r\n Packet.a[3] := 0;\r\n EncodePacket(Packet, 3, J);\r\n Inc(J, 4);\r\n end;\r\n K := 0;\r\n\r\n Packet.a[0] := 0;\r\n Packet.a[1] := 0;\r\n Packet.a[2] := 0;\r\n Packet.a[3] := 0;\r\n\r\n for I := Len - (Len mod 3) + 1 to Len do\r\n begin\r\n Packet.a[K] := Byte(Input[I - 1]);\r\n Inc(K);\r\n if I = Len then\r\n EncodePacket(Packet, Len mod 3, J);\r\n end;\r\n\r\n if not Padding and (Length(Output) >= 2) then\r\n begin\r\n if Output[Length(Output) - 1] = '=' then\r\n SetLength(Output, Length(Output) - 2)\r\n else\r\n if Output[Length(Output)] = '=' then\r\n SetLength(Output, Length(Output) - 1);\r\n end;\r\n Result := Output;\r\nend;\r\n{$ENDIF}\r\n\r\ninitialization\r\n {$IFNDEF PAS2JS}\r\n Randomize;\r\n {$ENDIF}\r\n DefaultTimeZoneMode := TTimeZoneMode.Error;\r\n FullISOTimeNotation := False;\r\nend.\r\n\r\n","unit XData.Model.Types;\r\n\r\n{$I XData.inc}\r\n\r\ninterface\r\n\r\nuses\r\n SysUtils, Bcl.SysUtils,\r\n Bcl.Collections.Common,\r\n XData.Model.Classes;\r\n\r\ntype\r\n TXDataBinaryType = class(TXDataPrimitiveType)\r\n strict protected\r\n function GetName: string; override;\r\n function GetTypeKind: TXTypeKind; override;\r\n public\r\n function ValueToLiteral(Value: TBytes; var Literal: string): boolean;\r\n function LiteralToValue(const Literal: string; var Value: TBytes): boolean;\r\n end;\r\n\r\n TXDataBooleanType = class(TXDataPrimitiveType)\r\n strict protected\r\n function GetName: string; override;\r\n function GetTypeKind: TXTypeKind; override;\r\n public\r\n function ValueToLiteral(Value: Boolean; var Literal: string): boolean;\r\n function LiteralToValue(const Literal: string; var Value: boolean): boolean;\r\n end;\r\n\r\n TXDataByteType = class(TXDataPrimitiveType)\r\n strict protected\r\n function GetName: string; override;\r\n function GetTypeKind: TXTypeKind; override;\r\n public\r\n function ValueToLiteral(Value: byte; var Literal: string): boolean;\r\n function LiteralToValue(const Literal: string; var Value: byte): boolean;\r\n end;\r\n\r\n TXDataDateTimeType = class(TXDataPrimitiveType)\r\n strict protected\r\n function GetName: string; override;\r\n function GetTypeKind: TXTypeKind; override;\r\n public\r\n function ValueToLiteral(Value: TDateTime; var Literal: string): boolean;\r\n function LiteralToValue(const Literal: string; var Value: TDateTime): boolean;\r\n end;\r\n\r\n TXDataDateType = class(TXDataPrimitiveType)\r\n strict protected\r\n function GetName: string; override;\r\n function GetTypeKind: TXTypeKind; override;\r\n public\r\n function ValueToLiteral(Value: TDate; var Literal: string): boolean;\r\n function LiteralToValue(const Literal: string; var Value: TDate): boolean;\r\n end;\r\n\r\n TXDataCurrencyType = class(TXDataPrimitiveType)\r\n strict protected\r\n function GetName: string; override;\r\n function GetTypeKind: TXTypeKind; override;\r\n {$IFNDEF PAS2JS}\r\n strict private\r\n FFormatSettings: TFormatSettings;\r\n public\r\n procedure AfterConstruction; override;\r\n function ValueToLiteral(Value: Currency; var Literal: string): boolean;\r\n function LiteralToValue(const Literal: string; var Value: Currency): boolean;\r\n {$ENDIF}\r\n end;\r\n\r\n TXDataDoubleType = class(TXDataPrimitiveType)\r\n strict protected\r\n function GetName: string; override;\r\n function GetTypeKind: TXTypeKind; override;\r\n public\r\n function ValueToLiteral(Value: Double; var Literal: string): boolean;\r\n function LiteralToValue(const Literal: string; var Value: double): boolean;\r\n end;\r\n\r\n TXDataGuidType = class(TXDataPrimitiveType)\r\n strict protected\r\n function GetName: string; override;\r\n function GetTypeKind: TXTypeKind; override;\r\n public\r\n {$IFDEF PAS2JS}\r\n function ValueToLiteral(Value: string; var Literal: string): boolean;\r\n function LiteralToValue(const Literal: string; var Value: string): boolean;\r\n {$ELSE}\r\n function ValueToLiteral(Value: TGuid; var Literal: string): boolean;\r\n function LiteralToValue(const Literal: string; var Value: TGuid): boolean;\r\n {$ENDIF}\r\n end;\r\n\r\n TXDataVariantType = class(TXDataPrimitiveType)\r\n strict protected\r\n function GetName: string; override;\r\n function GetTypeKind: TXTypeKind; override;\r\n public\r\n {$IFNDEF PAS2JS}\r\n function ValueToLiteral(Value: Variant; var Literal: string): boolean;\r\n function LiteralToValue(const Literal: string; var Value: Variant): boolean;\r\n {$ELSE}\r\n function ValueToLiteral(Value: JSValue; var Literal: string): boolean;\r\n function LiteralToValue(const Literal: string; var Value: JSValue): boolean;\r\n {$ENDIF}\r\n end;\r\n\r\n TXDataInt16Type = class(TXDataPrimitiveType)\r\n strict protected\r\n function GetName: string; override;\r\n function GetTypeKind: TXTypeKind; override;\r\n public\r\n function ValueToLiteral(Value: Integer; var Literal: string): boolean;\r\n function LiteralToValue(const Literal: string; var Value: Integer): boolean;\r\n end;\r\n\r\n TXDataInt32Type = class(TXDataPrimitiveType)\r\n strict protected\r\n function GetName: string; override;\r\n function GetTypeKind: TXTypeKind; override;\r\n public\r\n function ValueToLiteral(const Value: Integer; var Literal: string): boolean;\r\n function LiteralToValue(const Literal: string; var Value: integer): boolean;\r\n end;\r\n\r\n TXDataInt64Type = class(TXDataPrimitiveType)\r\n strict protected\r\n function GetName: string; override;\r\n function GetTypeKind: TXTypeKind; override;\r\n public\r\n {$IFDEF PAS2JS}\r\n function ValueToLiteral(const Value: Integer; var Literal: string): boolean;\r\n function LiteralToValue(const Literal: string; var Value: integer): boolean;\r\n {$ELSE}\r\n function ValueToLiteral(Value: Int64; var Literal: string): boolean;\r\n function LiteralToValue(const Literal: string; var Value: Int64): boolean;\r\n {$ENDIF}\r\n end;\r\n\r\n TXDataSByteType = class(TXDataPrimitiveType)\r\n strict protected\r\n function GetName: string; override;\r\n function GetTypeKind: TXTypeKind; override;\r\n public\r\n function ValueToLiteral(Value: ShortInt; var Literal: string): boolean;\r\n function LiteralToValue(const Literal: string; var Value: ShortInt): boolean;\r\n end;\r\n\r\n TXDataStringType = class(TXDataPrimitiveType)\r\n strict protected\r\n function GetName: string; override;\r\n function GetTypeKind: TXTypeKind; override;\r\n public\r\n function ValueToLiteral(const Value: string; var Literal: string): boolean;\r\n function LiteralToValue(const Literal: string; var Value: string): boolean;\r\n end;\r\n\r\n TXDataTimeType = class(TXDataPrimitiveType)\r\n strict protected\r\n function GetName: string; override;\r\n function GetTypeKind: TXTypeKind; override;\r\n public\r\n function ValueToLiteral(Value: TTime; var Literal: string): boolean;\r\n function LiteralToValue(const Literal: string; var Value: TTime): boolean;\r\n end;\r\n\r\n TXDataStreamType = class(TXDataPrimitiveType)\r\n strict protected\r\n function GetName: string; override;\r\n function GetTypeKind: TXTypeKind; override;\r\n end;\r\n\r\n TXDataRawType = class(TXDataPrimitiveType)\r\n strict protected\r\n function GetName: string; override;\r\n function GetTypeKind: TXTypeKind; override;\r\n end;\r\n\r\n TXDataTypeMap = TStringMap;\r\n\r\n TXDataPrimitiveTypes = class\r\n strict private\r\n class var\r\n FInstance: TXDataPrimitiveTypes;\r\n strict private\r\n FTypes: TXDataTypeMap;\r\n FBinaryType: TXDataBinaryType;\r\n FBooleanType: TXDataBooleanType;\r\n FByteType: TXDataByteType;\r\n FDateTimeType: TXDataDateTimeType;\r\n FDateType: TXDataDateType;\r\n FDoubleType: TXDataDoubleType;\r\n FInt16Type: TXDataInt16Type;\r\n FInt32Type: TXDataInt32Type;\r\n FInt64Type: TXDataInt64Type;\r\n FSByteType: TXDataSByteType;\r\n FStringType: TXDataStringType;\r\n FTimeType: TXDataTimeType;\r\n FStreamType: TXDataStreamType;\r\n FRawType: TXDataRawType;\r\n FGuidType: TXDataGuidType;\r\n FCurrencyType: TXDataCurrencyType;\r\n FVariantType: TXDataVariantType;\r\n procedure PrivateCreate;\r\n procedure PrivateDestroy;\r\n procedure AddType(const Key: string; Value: TXDataPrimitiveType);\r\n public\r\n class function Instance: TXDataPrimitiveTypes;\r\n class procedure ClassDestroy;\r\n function Find(const AName: string): TXDataPrimitiveType; overload;\r\n destructor Destroy; override;\r\n property BinaryType: TXDataBinaryType read FBinaryType;\r\n property BooleanType: TXDataBooleanType read FBooleanType;\r\n property ByteType: TXDataByteType read FByteType;\r\n property DateTimeType: TXDataDateTimeType read FDateTimeType;\r\n property DateType: TXDataDateType read FDateType;\r\n property DoubleType: TXDataDoubleType read FDoubleType;\r\n property Int16Type: TXDataInt16Type read FInt16Type;\r\n property Int32Type: TXDataInt32Type read FInt32Type;\r\n property Int64Type: TXDataInt64Type read FInt64Type;\r\n property SByteType: TXDataSByteType read FSByteType;\r\n property StringType: TXDataStringType read FStringType;\r\n property TimeType: TXDataTimeType read FTimeType;\r\n property StreamType: TXDataStreamType read FStreamType;\r\n property RawType: TXDataRawType read FRawType;\r\n property GuidType: TXDataGuidType read FGuidType;\r\n property CurrencyType: TXDataCurrencyType read FCurrencyType;\r\n property VariantType: TXDataVariantType read FVariantType;\r\n end;\r\n\r\n// helper methods for some base types. Should refactor this to a better place later\r\nfunction LiteralQuote(const Str: string): string;\r\nfunction LiteralUnquote(var Str: string): boolean;\r\n\r\nimplementation\r\n\r\nuses\r\n {$IFDEF PAS2JS}\r\n JS,\r\n {$ELSE}\r\n System.Variants,\r\n {$ENDIF}\r\n Bcl.Utils;\r\n\r\nfunction LiteralUnquote(var Str: string): boolean;\r\nvar\r\n Len: integer;\r\nbegin\r\n Result := True;\r\n Len := Length(Str);\r\n if (Len >= 2) and (Str[1] = '''') and (Str[Len] = '''') then\r\n Str := Copy(Str, 2, Len - 2);\r\nend;\r\n\r\nfunction LiteralQuote(const Str: string): string;\r\nbegin\r\n Result := '''' + Str + '''';\r\nend;\r\n\r\n{ TXDataPrimitiveTypes }\r\n\r\nprocedure TXDataPrimitiveTypes.AddType(const Key: string;\r\n Value: TXDataPrimitiveType);\r\nbegin\r\n FTypes.Add(Key, Value);\r\nend;\r\n\r\ndestructor TXDataPrimitiveTypes.Destroy;\r\nbegin\r\n PrivateDestroy;\r\n inherited;\r\nend;\r\n\r\nclass procedure TXDataPrimitiveTypes.ClassDestroy;\r\nbegin\r\n if FInstance <> nil then\r\n begin\r\n FInstance.Free;\r\n FInstance := nil;\r\n end;\r\nend;\r\n\r\nfunction TXDataPrimitiveTypes.Find(const AName: string): TXDataPrimitiveType;\r\nbegin\r\n if FTypes.ContainsKey(Lowercase(AName)) then\r\n Result := TXDataPrimitiveType(FTypes[Lowercase(AName)])\r\n else\r\n Result := nil;\r\nend;\r\n\r\nclass function TXDataPrimitiveTypes.Instance: TXDataPrimitiveTypes;\r\nbegin\r\n if FInstance = nil then\r\n begin\r\n FInstance := TXDataPrimitiveTypes.Create;\r\n FInstance.PrivateCreate;\r\n end;\r\n Result := FInstance;\r\nend;\r\n\r\nprocedure TXDataPrimitiveTypes.PrivateCreate;\r\nbegin\r\n FTypes := TXDataTypeMap.Create(False);\r\n\r\n FBinaryType := TXDataBinaryType.Create;\r\n FBooleanType := TXDataBooleanType.Create;\r\n FByteType := TXDataByteType.Create;\r\n FDateTimeType := TXDataDateTimeType.Create;\r\n FDateType := TXDataDateType.Create;\r\n FDoubleType := TXDataDoubleType.Create;\r\n FInt16Type := TXDataInt16Type.Create;\r\n FInt32Type := TXDataInt32Type.Create;\r\n FInt64Type := TXDataInt64Type.Create;\r\n FSByteType := TXDataSByteType.Create;\r\n FStringType := TXDataStringType.Create;\r\n FTimeType := TXDataTimeType.Create;\r\n FStreamType := TXDataStreamType.Create;\r\n FRawType := TXDataRawType.Create;\r\n FGuidType := TXDataGuidType.Create;\r\n FCurrencyType := TXDataCurrencyType.Create;\r\n FVariantType := TXDataVariantType.Create;\r\n\r\n AddType(Lowercase(FBinaryType.Name), FBinaryType);\r\n AddType(Lowercase(FBooleanType.Name), FBooleanType);\r\n AddType(Lowercase(FByteType.Name), FByteType);\r\n AddType(Lowercase(FDateTimeType.Name), FDateTimeType);\r\n AddType(Lowercase(FDateType.Name), FDateType);\r\n AddType(Lowercase(FDoubleType.Name), FDoubleType);\r\n AddType(Lowercase(FInt16Type.Name), FInt16Type);\r\n AddType(Lowercase(FInt32Type.Name), FInt32Type);\r\n AddType(Lowercase(FInt64Type.Name), FInt64Type);\r\n AddType(Lowercase(FSByteType.Name), FSByteType);\r\n AddType(Lowercase(FStringType.Name), FStringType);\r\n AddType(Lowercase(FTimeType.Name), FTimeType);\r\n AddType(Lowercase(FStreamType.Name), FStreamType);\r\n AddType(Lowercase(FRawType.Name), FRawType);\r\n AddType(Lowercase(FGuidType.Name), FGuidType);\r\n AddType(Lowercase(FCurrencyType.Name), FCurrencyType);\r\n AddType(Lowercase(FVariantType.Name), FVariantType);\r\nend;\r\n\r\nprocedure TXDataPrimitiveTypes.PrivateDestroy;\r\nbegin\r\n FTypes.Free;\r\n FVariantType.Free;\r\n FCurrencyType.Free;\r\n FGuidType.Free;\r\n FBinaryType.Free;\r\n FBooleanType.Free;\r\n FByteType.Free;\r\n FDateTimeType.Free;\r\n FDateType.Free;\r\n FDoubleType.Free;\r\n FInt16Type.Free;\r\n FInt32Type.Free;\r\n FInt64Type.Free;\r\n FSByteType.Free;\r\n FStringType.Free;\r\n FTimeType.Free;\r\n FStreamType.Free;\r\n FRawType.Free;\r\nend;\r\n\r\n{ TXDataStreamType }\r\n\r\nfunction TXDataStreamType.GetName: string;\r\nbegin\r\n Result := 'Stream';\r\nend;\r\n\r\nfunction TXDataStreamType.GetTypeKind: TXTypeKind;\r\nbegin\r\n Result := TXTypeKind.xtStream;\r\nend;\r\n\r\n{ TXDataBinaryType }\r\n\r\nfunction TXDataBinaryType.GetName: string;\r\nbegin\r\n Result := 'Binary';\r\nend;\r\n\r\nfunction TXDataBinaryType.GetTypeKind: TXTypeKind;\r\nbegin\r\n Result := TXTypeKind.xtBinary;\r\nend;\r\n\r\nfunction TXDataBinaryType.LiteralToValue(const Literal: string;\r\n var Value: TBytes): boolean;\r\nbegin\r\n Value := TBclUtils.DecodeBase64(Literal);\r\n Result := true;\r\nend;\r\n\r\nfunction TXDataBinaryType.ValueToLiteral(Value: TBytes;\r\n var Literal: string): boolean;\r\nbegin\r\n Literal := TBclUtils.EncodeBase64(Value);\r\n Result := true;\r\nend;\r\n\r\n{ TXDataBooleanType }\r\n\r\nfunction TXDataBooleanType.GetName: string;\r\nbegin\r\n Result := 'Boolean';\r\nend;\r\n\r\nfunction TXDataBooleanType.GetTypeKind: TXTypeKind;\r\nbegin\r\n Result := TXTypeKind.xtBoolean;\r\nend;\r\n\r\nfunction TXDataBooleanType.LiteralToValue(const Literal: string;\r\n var Value: boolean): boolean;\r\nbegin\r\n if SameText(Literal, 'true') then\r\n begin\r\n Value := true;\r\n Result := true;\r\n end\r\n else\r\n if SameText(Literal, 'false') then\r\n begin\r\n Value := false;\r\n Result := true;\r\n end\r\n else\r\n Result := false;\r\nend;\r\n\r\nfunction TXDataBooleanType.ValueToLiteral(Value: Boolean; var Literal: string): boolean;\r\nbegin\r\n if Value then\r\n Literal := 'true'\r\n else\r\n Literal := 'false';\r\n Result := true;\r\nend;\r\n\r\n{ TXDataByteType }\r\n\r\nfunction TXDataByteType.GetName: string;\r\nbegin\r\n Result := 'Byte';\r\nend;\r\n\r\nfunction TXDataByteType.GetTypeKind: TXTypeKind;\r\nbegin\r\n Result := TXTypeKind.xtByte;\r\nend;\r\n\r\nfunction TXDataByteType.LiteralToValue(const Literal: string; var Value: byte): boolean;\r\nvar\r\n V: integer;\r\nbegin\r\n Result := TryStrToInt(Literal, V);\r\n Value := byte(V);\r\nend;\r\n\r\nfunction TXDataByteType.ValueToLiteral(Value: byte; var Literal: string): boolean;\r\nbegin\r\n Literal := IntToStr(Value);\r\n Result := True;\r\nend;\r\n\r\n{ TXDataDateTimeType }\r\n\r\nfunction TXDataDateTimeType.GetName: string;\r\nbegin\r\n Result := 'DateTime'; // DateTimeOffset\r\nend;\r\n\r\nfunction TXDataDateTimeType.GetTypeKind: TXTypeKind;\r\nbegin\r\n Result := TXTypeKind.xtDateTime;\r\nend;\r\n\r\nfunction TXDataDateTimeType.LiteralToValue(const Literal: string;\r\n var Value: TDateTime): boolean;\r\nbegin\r\n Result := TBclUtils.TryISOToDateTime(Literal, Value);\r\nend;\r\n\r\nfunction TXDataDateTimeType.ValueToLiteral(Value: TDateTime;\r\n var Literal: string): boolean;\r\nbegin\r\n Result := true;\r\n Literal := TBclUtils.DateTimeToISO(Value, false);\r\nend;\r\n\r\n{ TXDataCurrencyType }\r\n\r\n{$IFNDEF PAS2JS}\r\nprocedure TXDataCurrencyType.AfterConstruction;\r\nbegin\r\n inherited;\r\n TBclUtils.InitFormatSettings(FFormatSettings);\r\n FFormatSettings.DecimalSeparator := '.';\r\n FFormatSettings.ThousandSeparator := #0;\r\nend;\r\n{$ENDIF}\r\n\r\nfunction TXDataCurrencyType.GetName: string;\r\nbegin\r\n Result := 'Currency';\r\nend;\r\n\r\nfunction TXDataCurrencyType.GetTypeKind: TXTypeKind;\r\nbegin\r\n Result := TXTypeKind.xtCurrency;\r\nend;\r\n\r\n{$IFNDEF PAS2JS}\r\nfunction TXDataCurrencyType.LiteralToValue(const Literal: string; var Value: Currency): boolean;\r\nbegin\r\n Result := TryStrToCurr(Literal, Value, FFormatSettings);\r\nend;\r\n{$ENDIF}\r\n\r\n{$IFNDEF PAS2JS}\r\nfunction TXDataCurrencyType.ValueToLiteral(Value: Currency; var Literal: string): boolean;\r\nbegin\r\n Literal := CurrToStr(Value, FFormatSettings);\r\n Result := true;\r\nend;\r\n{$ENDIF}\r\n\r\n{ TXDataDoubleType }\r\n\r\nfunction TXDataDoubleType.GetName: string;\r\nbegin\r\n Result := 'Double';\r\nend;\r\n\r\nfunction TXDataDoubleType.GetTypeKind: TXTypeKind;\r\nbegin\r\n Result := TXTypeKind.xtDouble;\r\nend;\r\n\r\nfunction TXDataDoubleType.LiteralToValue(const Literal: string;\r\n var Value: double): boolean;\r\nbegin\r\n Result := TryStrToNumber(Literal, Value);\r\nend;\r\n\r\nfunction TXDataDoubleType.ValueToLiteral(Value: Double;\r\n var Literal: string): boolean;\r\nbegin\r\n Literal := NumberToStr(Value);\r\n Result := true;\r\nend;\r\n\r\n{ TXDataGuidType }\r\n\r\nfunction TXDataGuidType.GetName: string;\r\nbegin\r\n Result := 'Guid';\r\nend;\r\n\r\nfunction TXDataGuidType.GetTypeKind: TXTypeKind;\r\nbegin\r\n Result := TXTypeKind.xtGuid;\r\nend;\r\n\r\n{$IFDEF PAS2JS}\r\nfunction TXDataGuidType.LiteralToValue(const Literal: string;\r\n var Value: string): boolean;\r\nbegin\r\n Result := True;\r\n case Length(Literal) of\r\n 36: Value := Literal;\r\n 38: Value := Copy(Literal, 2, 36);\r\n else\r\n Result := False;\r\n end;\r\nend;\r\n\r\nfunction TXDataGuidType.ValueToLiteral(Value: string;\r\n var Literal: string): boolean;\r\nbegin\r\n Result := True;\r\n case Length(Value) of\r\n 36: Literal := Value;\r\n 38: Literal := Copy(Value, 2, 36);\r\n else\r\n Result := False;\r\n end;\r\nend;\r\n{$ELSE}\r\nfunction TXDataGuidType.LiteralToValue(const Literal: string;\r\n var Value: TGuid): boolean;\r\nbegin\r\n Result := TBclUtils.TryStringToGuid(Literal, Value);\r\nend;\r\n\r\nfunction TXDataGuidType.ValueToLiteral(Value: TGuid;\r\n var Literal: string): boolean;\r\nbegin\r\n Literal := Copy(GuidToString(Value), 2, 36);\r\n Result := true;\r\nend;\r\n{$ENDIF}\r\n\r\n{ TXDataInt16Type }\r\n\r\nfunction TXDataInt16Type.GetName: string;\r\nbegin\r\n Result := 'Int16';\r\nend;\r\n\r\nfunction TXDataInt16Type.GetTypeKind: TXTypeKind;\r\nbegin\r\n Result := TXTypeKind.xtInt16;\r\nend;\r\n\r\nfunction TXDataInt16Type.LiteralToValue(const Literal: string;\r\n var Value: integer): boolean;\r\nbegin\r\n Result := TryStrToInt(Literal, Value);\r\nend;\r\n\r\nfunction TXDataInt16Type.ValueToLiteral(Value: Integer;\r\n var Literal: string): boolean;\r\nbegin\r\n Literal := IntToStr(Value);\r\n Result := True;\r\nend;\r\n\r\n{ TXDataInt32Type }\r\n\r\nfunction TXDataInt32Type.GetName: string;\r\nbegin\r\n Result := 'Int32';\r\nend;\r\n\r\nfunction TXDataInt32Type.GetTypeKind: TXTypeKind;\r\nbegin\r\n Result := TXTypeKind.xtInt32;\r\nend;\r\n\r\nfunction TXDataInt32Type.LiteralToValue(const Literal: string;\r\n var Value: integer): boolean;\r\nbegin\r\n Result := TryStrToInt(Literal, Value);\r\nend;\r\n\r\nfunction TXDataInt32Type.ValueToLiteral(const Value: Integer;\r\n var Literal: string): boolean;\r\nbegin\r\n Literal := IntToStr(Value);\r\n Result := True;\r\nend;\r\n\r\n{ TXDataInt64Type }\r\n\r\nfunction TXDataInt64Type.GetName: string;\r\nbegin\r\n Result := 'Int64';\r\nend;\r\n\r\nfunction TXDataInt64Type.GetTypeKind: TXTypeKind;\r\nbegin\r\n Result := TXTypeKind.xtInt64;\r\nend;\r\n\r\n{$IFDEF PAS2JS}\r\nfunction TXDataInt64Type.LiteralToValue(const Literal: string;\r\n var Value: Integer): boolean;\r\nbegin\r\n Result := TryStrToInt(Literal, Value);\r\nend;\r\n\r\nfunction TXDataInt64Type.ValueToLiteral(const Value: Integer;\r\n var Literal: string): boolean;\r\nbegin\r\n Literal := IntToStr(Value);\r\n Result := True;\r\nend;\r\n{$ELSE}\r\nfunction TXDataInt64Type.LiteralToValue(const Literal: string;\r\n var Value: Int64): boolean;\r\nbegin\r\n Result := TryStrToInt64(Literal, Value);\r\nend;\r\n\r\nfunction TXDataInt64Type.ValueToLiteral(Value: Int64;\r\n var Literal: string): boolean;\r\nbegin\r\n Literal := IntToStr(Value);\r\n Result := True;\r\nend;\r\n{$ENDIF}\r\n\r\n{ TXDataSByteType }\r\n\r\nfunction TXDataSByteType.GetName: string;\r\nbegin\r\n Result := 'SByte';\r\nend;\r\n\r\nfunction TXDataSByteType.GetTypeKind: TXTypeKind;\r\nbegin\r\n Result := TXTypeKind.xtSByte;\r\nend;\r\n\r\nfunction TXDataSByteType.LiteralToValue(const Literal: string; var Value: ShortInt): boolean;\r\nvar\r\n V: integer;\r\nbegin\r\n Result := TryStrToInt(Literal, V);\r\n Value := ShortInt(V);\r\nend;\r\n\r\nfunction TXDataSByteType.ValueToLiteral(Value: ShortInt; var Literal: string): boolean;\r\nbegin\r\n Literal := IntToStr(Value);\r\n Result := True;\r\nend;\r\n\r\n{ TXDataStringType }\r\n\r\nfunction TXDataStringType.GetName: string;\r\nbegin\r\n Result := 'String';\r\nend;\r\n\r\nfunction TXDataStringType.GetTypeKind: TXTypeKind;\r\nbegin\r\n Result := TXTypeKind.xtText;\r\nend;\r\n\r\nfunction TXDataStringType.LiteralToValue(const Literal: string;\r\n var Value: string): boolean;\r\nbegin\r\n Value := Literal;\r\n Result := true;\r\nend;\r\n\r\nfunction TXDataStringType.ValueToLiteral(const Value: string;\r\n var Literal: string): boolean;\r\nbegin\r\n // strictly we should convert it to UTF-8. Let's keep it this way as a trade-off for speed\r\n Literal := Value;\r\n Result := true;\r\nend;\r\n\r\n{ TXDataTimeType }\r\n\r\nfunction TXDataTimeType.GetName: string;\r\nbegin\r\n Result := 'Time';\r\nend;\r\n\r\nfunction TXDataTimeType.GetTypeKind: TXTypeKind;\r\nbegin\r\n Result := TXTypeKind.xtTime;\r\nend;\r\n\r\nfunction TXDataTimeType.LiteralToValue(const Literal: string;\r\n var Value: TTime): boolean;\r\nbegin\r\n Result := TBclUtils.TryISOToTime(Literal, Value);\r\nend;\r\n\r\nfunction TXDataTimeType.ValueToLiteral(Value: TTime;\r\n var Literal: string): boolean;\r\nbegin\r\n Result := true;\r\n Literal := TBclUtils.TimeToISO(Value);\r\nend;\r\n\r\n{ TXDataDateType }\r\n\r\nfunction TXDataDateType.GetName: string;\r\nbegin\r\n Result := 'Date';\r\nend;\r\n\r\nfunction TXDataDateType.GetTypeKind: TXTypeKind;\r\nbegin\r\n Result := TXTypeKind.xtDate;\r\nend;\r\n\r\nfunction TXDataDateType.LiteralToValue(const Literal: string; var Value: TDate): boolean;\r\nbegin\r\n Result := TBclUtils.TryISOToDate(Literal, Value);\r\nend;\r\n\r\nfunction TXDataDateType.ValueToLiteral(Value: TDate; var Literal: string): boolean;\r\nbegin\r\n Result := true;\r\n Literal := TBclUtils.DateToISO(Value);\r\nend;\r\n\r\n{ TXDataVariantType }\r\n\r\nfunction TXDataVariantType.GetName: string;\r\nbegin\r\n Result := 'Variant';\r\nend;\r\n\r\nfunction TXDataVariantType.GetTypeKind: TXTypeKind;\r\nbegin\r\n Result := TXTypeKind.xtVariant;\r\nend;\r\n\r\n{$IFDEF PAS2JS}\r\nfunction TXDataVariantType.LiteralToValue(const Literal: string;\r\n var Value: JSValue): boolean;\r\nvar\r\n T: TXDataPrimitiveTypes;\r\n BoolValue: Boolean;\r\n Int32Value: Integer;\r\n Int64Value: Integer;\r\n DoubleValue: Double;\r\n StringValue: string;\r\nbegin\r\n T := TXDataPrimitiveTypes.Instance;\r\n Result := True;\r\n if Literal = 'null' then\r\n Value := nil\r\n else\r\n if T.BooleanType.LiteralToValue(Literal, BoolValue) then\r\n Value := BoolValue\r\n else\r\n if T.Int32Type.LiteralToValue(Literal, Int32Value) then\r\n Value := Int32Value\r\n else\r\n if T.Int64Type.LiteralToValue(Literal, Int64Value) then\r\n Value := Int64Value\r\n else\r\n if T.DoubleType.LiteralToValue(Literal, DoubleValue) then\r\n Value := DoubleValue\r\n else\r\n if T.StringType.LiteralToValue(Literal, StringValue) and LiteralUnquote(StringValue) then\r\n Value := StringValue\r\n else\r\n Result := False;\r\nend;\r\n\r\nfunction TXDataVariantType.ValueToLiteral(Value: JSValue;\r\n var Literal: string): boolean;\r\nvar\r\n T: TXDataPrimitiveTypes;\r\nbegin\r\n T := TXDataPrimitiveTypes.Instance;\r\n Result := True;\r\n case GetValueType(Value) of\r\n jvtNull:\r\n Literal := 'null';\r\n jvtBoolean:\r\n Result := T.BooleanType.ValueToLiteral(Boolean(Value), Literal);\r\n jvtInteger:\r\n Result := T.Int32Type.ValueToLiteral(NativeInt(Value), Literal);\r\n jvtFloat:\r\n Result := T.DoubleType.ValueToLiteral(Double(Value), Literal);\r\n jvtString:\r\n begin\r\n Result := T.StringType.ValueToLiteral(string(Value), Literal);\r\n Literal := LiteralQuote(Literal);\r\n end;\r\n else\r\n Result := False;\r\n end;\r\nend;\r\n{$ELSE}\r\nfunction TXDataVariantType.LiteralToValue(const Literal: string;\r\n var Value: Variant): boolean;\r\nvar\r\n T: TXDataPrimitiveTypes;\r\n BoolValue: Boolean;\r\n Int32Value: Integer;\r\n Int64Value: Int64;\r\n DoubleValue: Double;\r\n GuidValue: TGuid;\r\n StringValue: string;\r\nbegin\r\n T := TXDataPrimitiveTypes.Instance;\r\n Result := True;\r\n if Literal = 'null' then\r\n Value := NULL\r\n else\r\n if T.BooleanType.LiteralToValue(Literal, BoolValue) then\r\n Value := BoolValue\r\n else\r\n if T.Int32Type.LiteralToValue(Literal, Int32Value) then\r\n Value := Int32Value\r\n else\r\n if T.Int64Type.LiteralToValue(Literal, Int64Value) then\r\n Value := Int64Value\r\n else\r\n if T.DoubleType.LiteralToValue(Literal, DoubleValue) then\r\n Value := DoubleValue\r\n else\r\n if T.GuidType.LiteralToValue(Literal, GuidValue) then\r\n Value := GuidToString(GuidValue)\r\n else\r\n if T.StringType.LiteralToValue(Literal, StringValue) and LiteralUnquote(StringValue) then\r\n Value := StringValue\r\n else\r\n Result := False;\r\nend;\r\n\r\nfunction TXDataVariantType.ValueToLiteral(Value: Variant;\r\n var Literal: string): boolean;\r\nvar\r\n VarData: TVarData;\r\n T: TXDataPrimitiveTypes;\r\nbegin\r\n T := TXDataPrimitiveTypes.Instance;\r\n VarData := TVarData(Value);\r\n Result := True;\r\n case VarType(Value) of\r\n varEmpty, varNull:\r\n Literal := 'null';\r\n varBoolean:\r\n Result := T.BooleanType.ValueToLiteral(VarData.VBoolean, Literal);\r\n varShortInt:\r\n Result := T.Int32Type.ValueToLiteral(VarData.VShortInt, Literal);\r\n varSmallint:\r\n Result := T.Int32Type.ValueToLiteral(VarData.VSmallInt, Literal);\r\n varInteger:\r\n Result := T.Int32Type.ValueToLiteral(VarData.VInteger, Literal);\r\n varSingle:\r\n Result := T.DoubleType.ValueToLiteral(VarData.VSingle, Literal);\r\n varDouble:\r\n Result := T.DoubleType.ValueToLiteral(VarData.VDouble, Literal);\r\n varCurrency:\r\n Result := T.CurrencyType.ValueToLiteral(VarData.VCurrency, Literal);\r\n// varDate:\r\n// Result := T.DaType.ValueToLiteral(VarData.VCurrency, Literal);\r\n// Writer.WriteDouble(VarData.VDate);\r\n varOleStr:\r\n begin\r\n Result := T.StringType.ValueToLiteral(VarData.VOleStr, Literal);\r\n Literal := LiteralQuote(Literal);\r\n end;\r\n varError:\r\n Result := T.Int32Type.ValueToLiteral(VarData.VError, Literal);\r\n varByte:\r\n Result := T.Int32Type.ValueToLiteral(VarData.VByte, Literal);\r\n varWord:\r\n Result := T.Int32Type.ValueToLiteral(VarData.VWord, Literal);\r\n varLongWord:\r\n Result := T.Int32Type.ValueToLiteral(VarData.VLongWord, Literal);\r\n varInt64:\r\n Result := T.Int64Type.ValueToLiteral(VarData.VInt64, Literal);\r\n varUInt64:\r\n Result := T.Int64Type.ValueToLiteral(VarData.VUInt64, Literal);\r\n varString:\r\n begin\r\n {$IFNDEF NEXTGEN}\r\n Result := T.StringType.ValueToLiteral(string(AnsiString(VarData.VString)), Literal);\r\n {$ELSE}\r\n Result := T.StringType.ValueToLiteral(string(VarData.VString), Literal);\r\n {$ENDIF}\r\n Literal := LiteralQuote(Literal);\r\n end;\r\n varUString:\r\n begin\r\n Result := T.StringType.ValueToLiteral(UnicodeString(VarData.VUString), Literal);\r\n Literal := LiteralQuote(Literal);\r\n end\r\n else\r\n Result := False;\r\n end;\r\nend;\r\n{$ENDIF}\r\n\r\n{ TXDataRawType }\r\n\r\nfunction TXDataRawType.GetName: string;\r\nbegin\r\n Result := 'Raw';\r\nend;\r\n\r\nfunction TXDataRawType.GetTypeKind: TXTypeKind;\r\nbegin\r\n Result := TXTypeKind.xtRaw;\r\nend;\r\n\r\ninitialization\r\n{$IFNDEF PAS2JS}\r\nfinalization\r\n TXDataPrimitiveTypes.ClassDestroy;\r\n{$ENDIF}\r\n\r\nend.\r\n\r\n","unit XData.Types.Converters;\r\n\r\n{$I XData.inc}\r\n\r\ninterface\r\n\r\nuses\r\n SysUtils,\r\n Bcl.Rtti.Common,\r\n {$IFDEF PAS2JS}\r\n JS,\r\n {$ENDIF}\r\n XData.Model.Classes;\r\n\r\ntype\r\n TXDataTypeBaseConverter = class(TXDataTypeConverter)\r\n end;\r\n\r\n TXDataInt32Converter = class(TXDataTypeBaseConverter)\r\n strict protected\r\n function GetXDataType: TXDataScalarType; override;\r\n strict protected\r\n function TryValueToUrl(const Value: TValue; out Literal: string; Prop: TXDataSimpleProperty): boolean; override;\r\n function TryUrlToValue(const Literal: string; out Value: TValue; Prop: TXDataSimpleProperty): boolean; override;\r\n end;\r\n\r\n TXDataInt16Converter = class(TXDataTypeBaseConverter)\r\n strict protected\r\n function GetXDataType: TXDataScalarType; override;\r\n strict protected\r\n function TryValueToUrl(const Value: TValue; out Literal: string; Prop: TXDataSimpleProperty): boolean; override;\r\n function TryUrlToValue(const Literal: string; out Value: TValue; Prop: TXDataSimpleProperty): boolean; override;\r\n end;\r\n\r\n {$IFDEF PAS2JS}\r\n TXDataInt64Converter = TXDataInt32Converter;\r\n {$ELSE}\r\n TXDataInt64Converter = class(TXDataTypeBaseConverter)\r\n strict protected\r\n function GetXDataType: TXDataScalarType; override;\r\n strict protected\r\n function TryValueToUrl(const Value: TValue; out Literal: string; Prop: TXDataSimpleProperty): boolean; override;\r\n function TryUrlToValue(const Literal: string; out Value: TValue; Prop: TXDataSimpleProperty): boolean; override;\r\n end;\r\n {$ENDIF}\r\n\r\n TXDataBooleanConverter = class(TXDataTypeBaseConverter)\r\n strict protected\r\n function GetXDataType: TXDataScalarType; override;\r\n strict protected\r\n function TryValueToUrl(const Value: TValue; out Literal: string; Prop: TXDataSimpleProperty): boolean; override;\r\n function TryUrlToValue(const Literal: string; out Value: TValue; Prop: TXDataSimpleProperty): boolean; override;\r\n end;\r\n\r\n TXDataDoubleConverter = class(TXDataTypeBaseConverter)\r\n strict protected\r\n function GetXDataType: TXDataScalarType; override;\r\n strict protected\r\n function TryValueToUrl(const Value: TValue; out Literal: string; Prop: TXDataSimpleProperty): boolean; override;\r\n function TryUrlToValue(const Literal: string; out Value: TValue; Prop: TXDataSimpleProperty): boolean; override;\r\n end;\r\n\r\n {$IFNDEF PAS2JS}\r\n TXDataCurrencyConverter = class(TXDataTypeBaseConverter)\r\n strict protected\r\n function GetXDataType: TXDataScalarType; override;\r\n strict protected\r\n function TryValueToUrl(const Value: TValue; out Literal: string; Prop: TXDataSimpleProperty): boolean; override;\r\n function TryUrlToValue(const Literal: string; out Value: TValue; Prop: TXDataSimpleProperty): boolean; override;\r\n end;\r\n {$ENDIF}\r\n\r\n TXDataDateTimeConverter = class(TXDataTypeBaseConverter)\r\n strict protected\r\n function GetXDataType: TXDataScalarType; override;\r\n strict protected\r\n function TryValueToUrl(const Value: TValue; out Literal: string; Prop: TXDataSimpleProperty): boolean; override;\r\n function TryUrlToValue(const Literal: string; out Value: TValue; Prop: TXDataSimpleProperty): boolean; override;\r\n end;\r\n\r\n TXDataDateConverter = class(TXDataTypeBaseConverter)\r\n strict protected\r\n function GetXDataType: TXDataScalarType; override;\r\n strict protected\r\n function TryValueToUrl(const Value: TValue; out Literal: string; Prop: TXDataSimpleProperty): boolean; override;\r\n function TryUrlToValue(const Literal: string; out Value: TValue; Prop: TXDataSimpleProperty): boolean; override;\r\n end;\r\n\r\n TXDataTimeConverter = class(TXDataTypeBaseConverter)\r\n strict protected\r\n function GetXDataType: TXDataScalarType; override;\r\n strict protected\r\n function TryValueToUrl(const Value: TValue; out Literal: string; Prop: TXDataSimpleProperty): boolean; override;\r\n function TryUrlToValue(const Literal: string; out Value: TValue; Prop: TXDataSimpleProperty): boolean; override;\r\n end;\r\n\r\n TXDataBinaryConverter = class(TXDataTypeBaseConverter)\r\n strict protected\r\n function GetXDataType: TXDataScalarType; override;\r\n strict protected\r\n function TryValueToUrl(const Value: TValue; out Literal: string; Prop: TXDataSimpleProperty): boolean; override;\r\n function TryUrlToValue(const Literal: string; out Value: TValue; Prop: TXDataSimpleProperty): boolean; override;\r\n end;\r\n\r\n TXDataStringConverter = class(TXDataTypeBaseConverter)\r\n strict protected\r\n function GetXDataType: TXDataScalarType; override;\r\n strict protected\r\n function TryValueToUrl(const Value: TValue; out Literal: string; Prop: TXDataSimpleProperty): boolean; override;\r\n function TryUrlToValue(const Literal: string; out Value: TValue; Prop: TXDataSimpleProperty): boolean; override;\r\n end;\r\n\r\n TXDataCharConverter = class(TXDataTypeBaseConverter)\r\n strict protected\r\n function GetXDataType: TXDataScalarType; override;\r\n strict protected\r\n function TryValueToUrl(const Value: TValue; out Literal: string; Prop: TXDataSimpleProperty): boolean; override;\r\n function TryUrlToValue(const Literal: string; out Value: TValue; Prop: TXDataSimpleProperty): boolean; override;\r\n end;\r\n\r\n TXDataGuidConverter = class(TXDataTypeBaseConverter)\r\n strict protected\r\n function GetXDataType: TXDataScalarType; override;\r\n strict protected\r\n function TryValueToUrl(const Value: TValue; out Literal: string; Prop: TXDataSimpleProperty): boolean; override;\r\n function TryUrlToValue(const Literal: string; out Value: TValue; Prop: TXDataSimpleProperty): boolean; override;\r\n end;\r\n\r\n TXDataVariantConverter = class(TXDataTypeBaseConverter)\r\n strict protected\r\n function GetXDataType: TXDataScalarType; override;\r\n strict protected\r\n function TryValueToUrl(const Value: TValue; out Literal: string; Prop: TXDataSimpleProperty): boolean; override;\r\n function TryUrlToValue(const Literal: string; out Value: TValue; Prop: TXDataSimpleProperty): boolean; override;\r\n end;\r\n\r\n TXDataEnumConverter = class(TXDataTypeConverter)\r\n strict private\r\n {$IFDEF AUTOREFCOUNT}[Weak]{$ENDIF}\r\n FEnumType: TXDataEnumType;\r\n strict protected\r\n function GetXDataType: TXDataScalarType; override;\r\n strict protected\r\n function TryValueToUrl(const Value: TValue; out Literal: string; Prop: TXDataSimpleProperty): boolean; override;\r\n function TryUrlToValue(const Literal: string; out Value: TValue; Prop: TXDataSimpleProperty): boolean; override;\r\n public\r\n constructor Create(AEnumType: TXDataEnumType); reintroduce;\r\n end;\r\n\r\nprocedure AddDefaultUrlConverters(Converters: TXDataUrlConverters);\r\n\r\nimplementation\r\n\r\nuses\r\n XData.Model.Types;\r\n\r\nprocedure AddDefaultUrlConverters(Converters: TXDataUrlConverters);\r\nbegin\r\n // Integer types\r\n Converters.RegisterConverter('Int32', TXDataInt32Converter.Create);\r\n Converters.RegisterConverter('Int16', TXDataInt16Converter.Create);\r\n Converters.RegisterConverter('Int64', TXDataInt64Converter.Create);\r\n\r\n // Boolean types\r\n Converters.RegisterConverter('Boolean', TXDataBooleanConverter.Create);\r\n\r\n // Float types\r\n Converters.RegisterConverter('Double', TXDataDoubleConverter.Create);\r\n {$IFDEF PAS2JS}\r\n Converters.RegisterConverter('Currency', TXDataDoubleConverter.Create);\r\n {$ELSE}\r\n Converters.RegisterConverter('Currency', TXDataCurrencyConverter.Create);\r\n {$ENDIF}\r\n\r\n // Date time types\r\n Converters.RegisterConverter('DateTime', TXDataDateTimeConverter.Create);\r\n Converters.RegisterConverter('Date', TXDataDateConverter.Create);\r\n Converters.RegisterConverter('Time', TXDataTimeConverter.Create);\r\n\r\n // Blob types\r\n Converters.RegisterConverter('Binary', TXDataBinaryConverter.Create);\r\n Converters.RegisterConverter('Stream', TXDataBinaryConverter.Create);\r\n\r\n // String types\r\n Converters.RegisterConverter('String', TXDataStringConverter.Create);\r\n\r\n // Char types\r\n Converters.RegisterConverter('Char', TXDataCharConverter.Create);\r\n\r\n // Guid types\r\n Converters.RegisterConverter('Guid', TXDataGuidConverter.Create);\r\n\r\n // Variant\r\n Converters.RegisterConverter('Variant', TXDataVariantConverter.Create);\r\nend;\r\n\r\n{ TXDataIntegerConverter }\r\n\r\nfunction TXDataInt32Converter.GetXDataType: TXDataScalarType;\r\nbegin\r\n Result := TXDataPrimitiveTypes.Instance.Int32Type;\r\nend;\r\n\r\nfunction TXDataInt32Converter.TryUrlToValue(const Literal: string; out Value: TValue;\r\n Prop: TXDataSimpleProperty): boolean;\r\nvar\r\n IntValue: integer;\r\nbegin\r\n Result := TXDataPrimitiveTypes.Instance.Int32Type.LiteralToValue(Literal, IntValue);\r\n Value := IntValue;\r\nend;\r\n\r\nfunction TXDataInt32Converter.TryValueToUrl(const Value: TValue; out Literal: string;\r\n Prop: TXDataSimpleProperty): boolean;\r\nbegin\r\n Result := TXDataPrimitiveTypes.Instance.Int32Type.ValueToLiteral(\r\n TValue_AsInteger(Value), Literal);\r\nend;\r\n\r\n{ TXDataInt16Converter }\r\n\r\nfunction TXDataInt16Converter.GetXDataType: TXDataScalarType;\r\nbegin\r\n Result := TXDataPrimitiveTypes.Instance.Int16Type;\r\nend;\r\n\r\nfunction TXDataInt16Converter.TryUrlToValue(const Literal: string; out Value: TValue;\r\n Prop: TXDataSimpleProperty): boolean;\r\nvar\r\n IntValue: integer;\r\nbegin\r\n Result := TXDataPrimitiveTypes.Instance.Int16Type.LiteralToValue(Literal, IntValue);\r\n Value := IntValue;\r\nend;\r\n\r\nfunction TXDataInt16Converter.TryValueToUrl(const Value: TValue; out Literal: string;\r\n Prop: TXDataSimpleProperty): boolean;\r\nbegin\r\n Result := TXDataPrimitiveTypes.Instance.Int16Type.ValueToLiteral(\r\n TValue_AsInteger(Value), Literal);\r\nend;\r\n\r\n{ TXDataInt64Converter }\r\n\r\n{$IFNDEF PAS2JS}\r\nfunction TXDataInt64Converter.GetXDataType: TXDataScalarType;\r\nbegin\r\n Result := TXDataPrimitiveTypes.Instance.Int64Type;\r\nend;\r\n\r\nfunction TXDataInt64Converter.TryUrlToValue(const Literal: string; out Value: TValue;\r\n Prop: TXDataSimpleProperty): boolean;\r\nvar\r\n IntValue: Int64;\r\nbegin\r\n Result := TXDataPrimitiveTypes.Instance.Int64Type.LiteralToValue(Literal, IntValue);\r\n Value := IntValue;\r\nend;\r\n\r\nfunction TXDataInt64Converter.TryValueToUrl(const Value: TValue; out Literal: string;\r\n Prop: TXDataSimpleProperty): boolean;\r\nbegin\r\n Result := TXDataPrimitiveTypes.Instance.Int64Type.ValueToLiteral(\r\n TValue_AsOrdinal(Value),\r\n Literal);\r\nend;\r\n{$ENDIF}\r\n\r\n{ TXDataBooleanConverter }\r\n\r\nfunction TXDataBooleanConverter.GetXDataType: TXDataScalarType;\r\nbegin\r\n Result := TXDataPrimitiveTypes.Instance.BooleanType;\r\nend;\r\n\r\nfunction TXDataBooleanConverter.TryUrlToValue(const Literal: string; out Value: TValue;\r\n Prop: TXDataSimpleProperty): boolean;\r\nvar\r\n BoolValue: boolean;\r\nbegin\r\n Result := TXDataPrimitiveTypes.Instance.BooleanType.LiteralToValue(Literal, BoolValue);\r\n if Result then\r\n Value := BoolValue;\r\nend;\r\n\r\nfunction TXDataBooleanConverter.TryValueToUrl(const Value: TValue; out Literal: string;\r\n Prop: TXDataSimpleProperty): boolean;\r\nbegin\r\n Result := TXDataPrimitiveTypes.Instance.BooleanType.ValueToLiteral(\r\n TValue_AsBoolean(Value), Literal);\r\nend;\r\n\r\n{ TXDataDoubleConverter }\r\n\r\nfunction TXDataDoubleConverter.GetXDataType: TXDataScalarType;\r\nbegin\r\n Result := TXDataPrimitiveTypes.Instance.DoubleType;\r\nend;\r\n\r\nfunction TXDataDoubleConverter.TryUrlToValue(const Literal: string; out Value: TValue;\r\n Prop: TXDataSimpleProperty): boolean;\r\nvar\r\n DoubleValue: Double;\r\nbegin\r\n Result := TXDataPrimitiveTypes.Instance.DoubleType.LiteralToValue(Literal, DoubleValue);\r\n if Result then\r\n Value := DoubleValue;\r\nend;\r\n\r\nfunction TXDataDoubleConverter.TryValueToUrl(const Value: TValue; out Literal: string;\r\n Prop: TXDataSimpleProperty): boolean;\r\nbegin\r\n Result := TXDataPrimitiveTypes.Instance.DoubleType.ValueToLiteral(\r\n TValue_AsExtended(Value), Literal);\r\nend;\r\n\r\n{ TXDataDateTimeConverter }\r\n\r\nfunction TXDataDateTimeConverter.GetXDataType: TXDataScalarType;\r\nbegin\r\n Result := TXDataPrimitiveTypes.Instance.DateTimeType;\r\nend;\r\n\r\nfunction TXDataDateTimeConverter.TryUrlToValue(const Literal: string; out Value: TValue;\r\n Prop: TXDataSimpleProperty): boolean;\r\nvar\r\n DateValue: TDateTime;\r\nbegin\r\n Result := TXDataPrimitiveTypes.Instance.DateTimeType.LiteralToValue(Literal, DateValue);\r\n if Result then\r\n Value := TValue_FromDateTime(DateValue);\r\nend;\r\n\r\nfunction TXDataDateTimeConverter.TryValueToUrl(const Value: TValue; out Literal: string;\r\n Prop: TXDataSimpleProperty): boolean;\r\nbegin\r\n {$IFDEF PAS2JS}\r\n // for Pas2JS, value can be string thus we just bypass the value (todo: test format yyyy-mm-dd)\r\n if JS.IsString(Value) then\r\n begin\r\n Result := True;\r\n Literal := string(value);\r\n end\r\n else\r\n {$ENDIF}\r\n Result := TXDataPrimitiveTypes.Instance.DateTimeType.ValueToLiteral(\r\n TDateTime(TValue_AsDouble(Value)), Literal);\r\nend;\r\n\r\n{ TXDataTimeConverter }\r\n\r\nfunction TXDataTimeConverter.GetXDataType: TXDataScalarType;\r\nbegin\r\n Result := TXDataPrimitiveTypes.Instance.TimeType;\r\nend;\r\n\r\nfunction TXDataTimeConverter.TryUrlToValue(const Literal: string; out Value: TValue;\r\n Prop: TXDataSimpleProperty): boolean;\r\nvar\r\n TimeValue: TTime;\r\nbegin\r\n Result := TXDataPrimitiveTypes.Instance.TimeType.LiteralToValue(Literal, TimeValue);\r\n if Result then\r\n Value := TValue_FromTime(TimeValue);\r\nend;\r\n\r\nfunction TXDataTimeConverter.TryValueToUrl(const Value: TValue; out Literal: string;\r\n Prop: TXDataSimpleProperty): boolean;\r\nbegin\r\n {$IFDEF PAS2JS}\r\n // for Pas2JS, value can be string thus we just bypass the value (todo: test format yyyy-mm-dd)\r\n if JS.IsString(Value) then\r\n begin\r\n Result := True;\r\n Literal := string(value);\r\n end\r\n else\r\n {$ENDIF}\r\n Result := TXDataPrimitiveTypes.Instance.TimeType.ValueToLiteral(\r\n TTime(TValue_AsDouble(Value)), Literal);\r\nend;\r\n\r\n{ TXDataBinaryConverter }\r\n\r\nfunction TXDataBinaryConverter.GetXDataType: TXDataScalarType;\r\nbegin\r\n Result := TXDataPrimitiveTypes.Instance.BinaryType;\r\nend;\r\n\r\nfunction TXDataBinaryConverter.TryUrlToValue(const Literal: string; out Value: TValue;\r\n Prop: TXDataSimpleProperty): boolean;\r\nvar\r\n Bytes: TBytes;\r\n StringValue: string;\r\nbegin\r\n StringValue := Literal;\r\n LiteralUnquote(StringValue);\r\n Result := TXDataPrimitiveTypes.Instance.BinaryType.LiteralToValue(StringValue, Bytes);\r\n if Result then\r\n Value := TValue_FromBytes(Bytes);\r\nend;\r\n\r\nfunction TXDataBinaryConverter.TryValueToUrl(const Value: TValue; out Literal: string;\r\n Prop: TXDataSimpleProperty): boolean;\r\nvar\r\n Bytes: TBytes;\r\nbegin\r\n Bytes := TValue_AsBytes(Value);\r\n Result := TXDataPrimitiveTypes.Instance.BinaryType.ValueToLiteral(Bytes, Literal);\r\n Literal := LiteralQuote(Literal);\r\nend;\r\n\r\n{ TXDataStringConverter }\r\n\r\nfunction TXDataStringConverter.GetXDataType: TXDataScalarType;\r\nbegin\r\n Result := TXDataPrimitiveTypes.Instance.StringType;\r\nend;\r\n\r\nfunction TXDataStringConverter.TryUrlToValue(const Literal: string; out Value: TValue;\r\n Prop: TXDataSimpleProperty): boolean;\r\nvar\r\n StringValue: string;\r\nbegin\r\n Result := TXDataPrimitiveTypes.Instance.StringType.LiteralToValue(Literal, StringValue)\r\n and LiteralUnquote(StringValue);\r\n if Result then\r\n Value := StringValue;\r\nend;\r\n\r\nfunction TXDataStringConverter.TryValueToUrl(const Value: TValue; out Literal: string;\r\n Prop: TXDataSimpleProperty): boolean;\r\nbegin\r\n Result := TXDataPrimitiveTypes.Instance.StringType.ValueToLiteral(\r\n LiteralQuote(TValue_AsString(Value)), Literal);\r\nend;\r\n\r\n{ TXDataCharConverter }\r\n\r\nfunction TXDataCharConverter.GetXDataType: TXDataScalarType;\r\nbegin\r\n Result := TXDataPrimitiveTypes.Instance.StringType;\r\nend;\r\n\r\nfunction TXDataCharConverter.TryUrlToValue(const Literal: string; out Value: TValue;\r\n Prop: TXDataSimpleProperty): boolean;\r\nvar\r\n StringValue: string;\r\nbegin\r\n Result := TXDataPrimitiveTypes.Instance.StringType.LiteralToValue(Literal, StringValue)\r\n and LiteralUnquote(StringValue);\r\n if Result then\r\n Value := StringValue;\r\nend;\r\n\r\nfunction TXDataCharConverter.TryValueToUrl(const Value: TValue; out Literal: string;\r\n Prop: TXDataSimpleProperty): boolean;\r\nbegin\r\n Result := TXDataPrimitiveTypes.Instance.StringType.ValueToLiteral(\r\n LiteralQuote(TValue_AsString(Value)), Literal);\r\nend;\r\n\r\n{ TXDataGuidConverter }\r\n\r\nfunction TXDataGuidConverter.GetXDataType: TXDataScalarType;\r\nbegin\r\n Result := TXDataPrimitiveTypes.Instance.GuidType;\r\nend;\r\n\r\n{$IFDEF PAS2JS}\r\ntype TGuid = string;\r\n{$ENDIF}\r\n\r\nfunction TXDataGuidConverter.TryUrlToValue(const Literal: string; out Value: TValue;\r\n Prop: TXDataSimpleProperty): boolean;\r\nvar\r\n GuidValue: TGuid;\r\nbegin\r\n Result := TXDataPrimitiveTypes.Instance.GuidType.LiteralToValue(Literal, GuidValue);\r\n if Result then\r\n {$IFDEF PAS2JS}\r\n Value := GuidValue;\r\n {$ELSE}\r\n Value := TValue.From(GuidValue);\r\n {$ENDIF}\r\nend;\r\n\r\nfunction TXDataGuidConverter.TryValueToUrl(const Value: TValue; out Literal: string;\r\n Prop: TXDataSimpleProperty): boolean;\r\nbegin\r\n {$IFDEF PAS2JS}\r\n Result := TXDataPrimitiveTypes.Instance.GuidType.ValueToLiteral(TValue_AsString(Value), Literal);\r\n {$ELSE}\r\n Result := TXDataPrimitiveTypes.Instance.GuidType.ValueToLiteral(Value.AsType, Literal);\r\n {$ENDIF}\r\nend;\r\n\r\n{ TXDataCurrencyConverter }\r\n\r\n{$IFNDEF PAS2JS}\r\nfunction TXDataCurrencyConverter.GetXDataType: TXDataScalarType;\r\nbegin\r\n Result := TXDataPrimitiveTypes.Instance.CurrencyType;\r\nend;\r\n{$ENDIF}\r\n\r\n{$IFNDEF PAS2JS}\r\nfunction TXDataCurrencyConverter.TryUrlToValue(const Literal: string; out Value: TValue;\r\n Prop: TXDataSimpleProperty): boolean;\r\nvar\r\n Curr: Currency;\r\nbegin\r\n Result := TXDataPrimitiveTypes.Instance.CurrencyType.LiteralToValue(Literal, Curr);\r\n if Result then\r\n Value := Curr;\r\nend;\r\n{$ENDIF}\r\n\r\n{$IFNDEF PAS2JS}\r\nfunction TXDataCurrencyConverter.TryValueToUrl(const Value: TValue; out Literal: string;\r\n Prop: TXDataSimpleProperty): boolean;\r\nbegin\r\n Result := TXDataPrimitiveTypes.Instance.CurrencyType.ValueToLiteral(Value.AsCurrency, Literal);\r\nend;\r\n{$ENDIF}\r\n\r\n{ TXDataEnumConverter }\r\n\r\nconstructor TXDataEnumConverter.Create(AEnumType: TXDataEnumType);\r\nbegin\r\n FEnumType := AEnumType;\r\nend;\r\n\r\nfunction TXDataEnumConverter.GetXDataType: TXDataScalarType;\r\nbegin\r\n Result := FEnumType;\r\nend;\r\n\r\nfunction TXDataEnumConverter.TryUrlToValue(const Literal: string; out Value: TValue;\r\n Prop: TXDataSimpleProperty): boolean;\r\nvar\r\n I: integer;\r\n StringValue: string;\r\nbegin\r\n StringValue := Literal;\r\n Result := False;\r\n if LiteralUnquote(StringValue) then\r\n for I := 0 to FEnumType.Members.Count - 1 do\r\n if StringValue = FEnumType.Members[I].Name then\r\n begin\r\n Value := FEnumType.Members[I].Value;\r\n Exit(True);\r\n end;\r\nend;\r\n\r\nfunction TXDataEnumConverter.TryValueToUrl(const Value: TValue; out Literal: string;\r\n Prop: TXDataSimpleProperty): boolean;\r\nvar\r\n I: Integer;\r\n EnumValue: Integer;\r\nbegin\r\n EnumValue := TValue_AsOrdinal(Value);\r\n Result := False;\r\n for I := 0 to FEnumType.Members.Count - 1 do\r\n if EnumValue = FEnumType.Members[I].Value then\r\n begin\r\n Result := TXDataPrimitiveTypes.Instance.StringType.ValueToLiteral(\r\n LiteralQuote(FEnumType.Members[I].Name),\r\n Literal);\r\n Exit;\r\n end;\r\nend;\r\n\r\n{ TXDataDateConverter }\r\n\r\nfunction TXDataDateConverter.GetXDataType: TXDataScalarType;\r\nbegin\r\n Result := TXDataPrimitiveTypes.Instance.DateType;\r\nend;\r\n\r\nfunction TXDataDateConverter.TryUrlToValue(const Literal: string; out Value: TValue;\r\n Prop: TXDataSimpleProperty): boolean;\r\nvar\r\n DateValue: TDate;\r\nbegin\r\n Result := TXDataPrimitiveTypes.Instance.DateType.LiteralToValue(Literal, DateValue);\r\n if Result then\r\n Value := TValue_FromDate(DateValue);\r\nend;\r\n\r\nfunction TXDataDateConverter.TryValueToUrl(const Value: TValue; out Literal: string;\r\n Prop: TXDataSimpleProperty): boolean;\r\nbegin\r\n {$IFDEF PAS2JS}\r\n // for Pas2JS, value can be string thus we just bypass the value (todo: test format yyyy-mm-dd)\r\n if JS.IsString(Value) then\r\n begin\r\n Result := True;\r\n Literal := string(value);\r\n end\r\n else\r\n {$ENDIF}\r\n Result := TXDataPrimitiveTypes.Instance.DateType.ValueToLiteral(\r\n TDate(TValue_AsDouble(Value)), Literal);\r\nend;\r\n\r\n{ TXDataVariantConverter }\r\n\r\nfunction TXDataVariantConverter.GetXDataType: TXDataScalarType;\r\nbegin\r\n Result := TXDataPrimitiveTypes.Instance.VariantType;\r\nend;\r\n\r\n{$IFDEF PAS2JS}\r\ntype\r\n Variant = JSValue;\r\n{$ENDIF}\r\n\r\nfunction TXDataVariantConverter.TryUrlToValue(const Literal: string; out Value: TValue;\r\n Prop: TXDataSimpleProperty): boolean;\r\nvar\r\n VariantValue: Variant;\r\nbegin\r\n Result := TXDataPrimitiveTypes.Instance.VariantType.LiteralToValue(Literal, VariantValue);\r\n {$IFNDEF PAS2JS}\r\n if Result then\r\n Value := TValue.From(VariantValue);\r\n {$ENDIF}\r\nend;\r\n\r\nfunction TXDataVariantConverter.TryValueToUrl(const Value: TValue; out Literal: string;\r\n Prop: TXDataSimpleProperty): boolean;\r\nbegin\r\n Result := TXDataPrimitiveTypes.Instance.VariantType.ValueToLiteral(\r\n {$IFDEF PAS2JS}\r\n Value,\r\n {$ELSE}\r\n Value.AsType,\r\n {$ENDIF}\r\n Literal);\r\nend;\r\n\r\nend.\r\n\r\n","unit XData.Utils;\r\n\r\n{$I XData.inc}\r\n\r\ninterface\r\n\r\nuses\r\n SysUtils;\r\n\r\ntype\r\n TXDataUtils = class\r\n public\r\n class function GetNameAndKey(const Input: string; out Name, Key: string): boolean;\r\n class procedure GetQualifiedName(const AQualifiedName: string; out APrefix, AName: string); {$IFNDEF PAS2JS}{$IFNDEF PAS2JS}static;{$ENDIF}{$ENDIF}\r\n class function XSBoolean(const S: string; ADefault: boolean = false): boolean; {$IFNDEF PAS2JS}inline; static;{$ENDIF}\r\n// class function DateTimeToDayTimeDuration(const Value: TTime): string; {$IFNDEF PAS2JS}static;{$ENDIF}\r\n// class function TryDayTimeDurationToDateTime(const Value: string; out Time: TTime): boolean; {$IFNDEF PAS2JS}static;{$ENDIF}\r\n class function CombineUrlFast(const AbsoluteUrl, RelativeUrl: string): string; {$IFNDEF PAS2JS}static;{$ENDIF}\r\n {$IFDEF PAS2JS}\r\n class function DateTimeToUnix(const Value: TDateTime): Integer;\r\n {$ELSE}\r\n class function DateTimeToUnix(const Value: TDateTime): Int64; static;\r\n {$ENDIF}\r\n class function DateTimeToJson(const Value: TDateTime): string; {$IFNDEF PAS2JS}static;{$ENDIF}\r\n end;\r\n\r\nimplementation\r\n\r\n{ TXDataUtils }\r\n\r\nclass function TXDataUtils.CombineUrlFast(const AbsoluteUrl,\r\n RelativeUrl: string): string;\r\nbegin\r\n // Do a faster url combination because we know RelativeUrl comes correct\r\n Result := AbsoluteUrl;\r\n if (Length(Result) > 0) and (Result[Length(Result)] <> '/') then\r\n Result := Result + '/';\r\n Result := Result + RelativeUrl;\r\nend;\r\n\r\n//class function TXDataUtils.DateTimeToDayTimeDuration(\r\n// const Value: TTime): string;\r\n//var\r\n// D, H, M, S, MS: Word;\r\n//begin\r\n// D := Trunc(Value);\r\n// DecodeTime(Value, H, M, S, MS);\r\n// Result := 'P';\r\n// if D > 0 then\r\n// Result := Result + IntToStr(D) + 'D';\r\n// if H > 0 then\r\n// Result := Result + IntToStr(H) + 'H';\r\n// if M > 0 then\r\n// Result := Result + IntToStr(M) + 'M';\r\n// if S > 0 then\r\n// Result := Result + IntToStr(S) + 'S';\r\n// if Result = 'P' then\r\n// Result := 'P0D';\r\n//end;\r\n\r\nclass function TXDataUtils.DateTimeToJson(const Value: TDateTime): string;\r\nbegin\r\n Result := Format('\\/Date(%d)\\/', [DateTimeToUnix(Value) * 1000]);\r\nend;\r\n\r\n{$IFDEF PAS2JS}\r\nclass function TXDataUtils.DateTimeToUnix(const Value: TDateTime): Integer;\r\n{$ELSE}\r\nclass function TXDataUtils.DateTimeToUnix(const Value: TDateTime): Int64;\r\n{$ENDIF}\r\nbegin\r\n Result := Round((Value - UnixDateDelta) * SecsPerDay);\r\nend;\r\n\r\nclass function TXDataUtils.GetNameAndKey(const Input: string; out Name, Key: string): boolean;\r\nvar\r\n P1: integer;\r\n Len: integer;\r\n KeyLen: integer;\r\nbegin\r\n P1 := Pos('(', Input);\r\n Len := Length(Input);\r\n KeyLen := Len - P1 - 1;\r\n Result :=\r\n (P1 > 1) //open parentesis must exist and must have one space for name\r\n and (Len >= 4) // at least one char for name and one char for key plus 2 parentesis: A(B)\r\n and (Input[Len] = ')') // last char must be close parentesis\r\n and (KeyLen > 0); // and key must have at least one char\r\n if Result then\r\n begin\r\n Name := Copy(Input, 1, P1 - 1);\r\n Key := Copy(Input, P1 + 1, KeyLen);\r\n end;\r\nend;\r\n\r\nclass procedure TXDataUtils.GetQualifiedName(const AQualifiedName: string;\r\n out APrefix, AName: string);\r\nvar\r\n I, Len: integer;\r\nbegin\r\n Len := Length(AQualifiedName);\r\n I := Len;\r\n while I > 0 do\r\n begin\r\n if AQualifiedName[I] = '.' then\r\n break;\r\n Dec(I);\r\n end;\r\n if I > 0 then\r\n begin\r\n APrefix := Copy(AQualifiedName, 1, I - 1);\r\n AName := Copy(AQualifiedName, I + 1, MaxInt)\r\n end\r\n else\r\n begin\r\n APrefix := '';\r\n AName := AQualifiedName;\r\n end;\r\nend;\r\n\r\n//class function TXDataUtils.TryDayTimeDurationToDateTime(const Value: string;\r\n// out Time: TTime): boolean;\r\n//var\r\n// Len: integer;\r\n// Day, Hour, Min, Sec: integer;\r\n//\r\n// function ExtractNumber(const Value: string; var I: integer): boolean;\r\n// var\r\n// Start: integer;\r\n// C: Char;\r\n// Number: integer;\r\n// begin\r\n// Start := I;\r\n// {$IFDEF DELPHIXE4_LVL}\r\n// while (I <= Len) and Value[I].IsDigit do\r\n// {$ELSE}\r\n// while (I <= Len) and IsDigit(Value[I]) do\r\n// {$ENDIF}\r\n// Inc(I);\r\n// Result := TryStrToInt(Copy(Value, Start, I - Start), Number) and (I <= Len);\r\n// if Result then\r\n// begin\r\n// C := Value[I];\r\n// Inc(I);\r\n// if C = 'D' then\r\n// Day := Number\r\n// else\r\n// if C = 'H' then\r\n// Hour := Number\r\n// else\r\n// if C = 'M' then\r\n// Min := Number\r\n// else\r\n// if C = 'S' then\r\n// Sec := Number\r\n// else\r\n// Result := false;\r\n// end;\r\n// end;\r\n//\r\n//var\r\n// I: integer;\r\n//begin\r\n// Len := Length(Value);\r\n// if (Len = 0) or (Value[1] <> 'P') then\r\n// Exit(false);\r\n// I := 2;\r\n//\r\n// Day := 0;\r\n// Hour := 0;\r\n// Min := 0;\r\n// Sec := 0;\r\n//\r\n// // at least one part must exist\r\n// if not ExtractNumber(Value, I) then\r\n// Exit(false);\r\n//\r\n// // now extract as many as exist\r\n// while ExtractNumber(Value, I) do ;\r\n// Time := EncodeTime(Hour, Min, Sec, 0);\r\n// Result := true;\r\n//end;\r\n\r\nclass function TXDataUtils.XSBoolean(const S: string; ADefault: boolean): boolean;\r\nbegin\r\n if S = '' then\r\n Exit(ADefault);\r\n Result := (S = 'true') or (S = '1') or (S = 'yes');\r\nend;\r\n\r\nend.\r\n\r\n","unit XData.Model.Classes;\r\n\r\n{$I XData.inc}\r\n\r\ninterface\r\n\r\nuses\r\n Classes, SysUtils, Types, StrUtils, TypInfo,\r\n {$IFDEF ISDELPHI}\r\n Rtti,\r\n Bcl.TypInfo.Common,\r\n {$ELSE}\r\n// JS,\r\n {$ENDIF}\r\n {$IFDEF GENERICS}\r\n Generics.Collections,\r\n {$ELSE}\r\n Contnrs,\r\n {$ENDIF}\r\n Bcl.Json.Attributes,\r\n Bcl.Collections.Common,\r\n Bcl.Rtti.Common;\r\n\r\ntype\r\n// TXDataVersion = (v1, v2);\r\n TXDataEntityType = class;\r\n\r\n TXTypeKind = (\r\n xtUndefined,\r\n xtText,\r\n xtInt32,\r\n xtInt64,\r\n xtDouble,\r\n xtBoolean,\r\n xtDateTime,\r\n xtDate,\r\n xtTime,\r\n xtCurrency,\r\n xtGuid,\r\n xtVariant,\r\n xtBinary,\r\n xtStream,\r\n xtInt16,\r\n xtByte,\r\n xtSByte,\r\n xtEntity,\r\n xtEntityCollection,\r\n xtEnum,\r\n xtScalarCollection,\r\n xtRaw\r\n );\r\n\r\n TXDataSchema = class;\r\n TXDataModel = class;\r\n TXDataTypeConverter = class;\r\n\r\n [JsonInclude(TInclusionMode.NonDefault)]\r\n TXDataModelObject = class\r\n strict private\r\n [JsonIgnore]\r\n FData: TValue;\r\n [JsonIgnore]\r\n FOwnsDataObject: Boolean;\r\n FDescription: string;\r\n {$IFDEF AUTOREFCOUNT}[Weak]{$ENDIF}\r\n [JsonIgnore]\r\n FParent: TXDataModelObject;\r\n protected\r\n property Parent: TXDataModelObject read FParent write FParent;\r\n public\r\n destructor Destroy; override;\r\n property Data: TValue read FData write FData;\r\n property OwnsDataObject: boolean read FOwnsDataObject write FOwnsDataObject;\r\n property Description: string read FDescription write FDescription;\r\n end;\r\n\r\n {$IFDEF GENERICS}\r\n {$ELSE}\r\n TXDataOwnedList = class(TObjectList)\r\n private\r\n [JsonIgnore]\r\n {$IFDEF AUTOREFCOUNT}[Weak]{$ENDIF}\r\n FOwner: TXDataModelObject;\r\n protected\r\n {$IFDEF PAS2JS}\r\n procedure Notify(Ptr: JSValue; Action: TListNotification); override;\r\n {$ELSE}\r\n procedure Notify(Ptr: Pointer; Action: TListNotification); override;\r\n {$ENDIF}\r\n public\r\n constructor Create(AOwner: TXDataModelObject); overload;\r\n constructor Create; reintroduce; overload;\r\n end;\r\n {$ENDIF}\r\n\r\n TXDataType = class(TXDataModelObject)\r\n strict private\r\n FName: string;\r\n strict protected\r\n function GetName: string; virtual;\r\n function GetIsCollection: boolean; virtual;\r\n function GetWrappedType: TXDataType; virtual;\r\n function GetTypeKind: TXTypeKind; virtual;\r\n public\r\n function QualifiedName: string; virtual;\r\n property Name: string read GetName write FName;\r\n property IsCollection: boolean read GetIsCollection;\r\n property WrappedType: TXDataType read GetWrappedType;\r\n property TypeKind: TXTypeKind read GetTypeKind;\r\n end;\r\n\r\n TXDataScalarCollectionType = class;\r\n\r\n TXDataScalarType = class(TXDataType)\r\n strict private\r\n [JsonIgnore]\r\n FCollection: TXDataScalarCollectionType;\r\n strict protected\r\n function GetCollection: TXDataScalarType;\r\n public\r\n destructor Destroy; override;\r\n property Collection: TXDataScalarType read GetCollection;\r\n end;\r\n\r\n TXDataPrimitiveType = class(TXDataScalarType)\r\n end;\r\n\r\n TXDataEnumMember = class(TXDataModelObject)\r\n private\r\n FName: string;\r\n FValue: integer;\r\n public\r\n property Name: string read FName write FName;\r\n property Value: integer read FValue write FValue;\r\n end;\r\n\r\n {$IFDEF GENERICS}\r\n TXDataEnumMemberList = TList;\r\n {$ELSE}\r\n TXDataEnumMemberList = class(TObjectList)\r\n private\r\n function GetItem(Index: Integer): TXDataEnumMember; reintroduce;\r\n public\r\n property Items[Index: Integer]: TXDataEnumMember read GetItem; default;\r\n end;\r\n {$ENDIF}\r\n\r\n [JsonInclude(TInclusionMode.NonDefault)]\r\n TXDataEnumType = class(TXDataScalarType)\r\n strict private\r\n FMembers: TXDataEnumMemberList;\r\n function GetSchema: TXDataSchema;\r\n strict protected\r\n function GetTypeKind: TXTypeKind; override;\r\n public\r\n function QualifiedName: string; override;\r\n property Schema: TXDataSchema read GetSchema;\r\n public\r\n constructor Create; reintroduce;\r\n destructor Destroy; override;\r\n function AddMember(const AName: string; AValue: integer): TXDataEnumMember;\r\n property Members: TXDataEnumMemberList read FMembers;\r\n end;\r\n\r\n {$IFDEF GENERICS}\r\n TXDataEnumTypeList = TList;\r\n {$ELSE}\r\n TXDataEnumTypeList = class(TXDataOwnedList)\r\n private\r\n function GetItem(Index: Integer): TXDataEnumType; reintroduce;\r\n public\r\n property Items[Index: Integer]: TXDataEnumType read GetItem; default;\r\n end;\r\n {$ENDIF}\r\n\r\n TXDataStructuredType = class(TXDataType)\r\n end;\r\n\r\n TXDataScalarCollectionType = class(TXDataScalarType)\r\n strict private\r\n {$IFDEF AUTOREFCOUNT}[Weak]{$ENDIF}\r\n [JsonIgnore]\r\n FItemType: TXDataScalarType;\r\n strict protected\r\n function GetIsCollection: boolean; override;\r\n function GetName: string; override;\r\n function GetWrappedType: TXDataType; override;\r\n function GetTypeKind: TXTypeKind; override;\r\n public\r\n function QualifiedName: string; override;\r\n property ItemType: TXDataScalarType read FItemType write FItemType;\r\n end;\r\n\r\n [JsonInclude(TInclusionMode.NonDefault)]\r\n TXDataProperty = class(TXDataModelObject)\r\n strict private\r\n FName: string;\r\n FRequired: Boolean;\r\n function GetParent: TXDataEntityType;\r\n public\r\n function IsSimple: Boolean; virtual; abstract;\r\n property Parent: TXDataEntityType read GetParent;\r\n public\r\n constructor Create; reintroduce;\r\n destructor Destroy; override;\r\n function QualifiedName: string;\r\n property Name: string read FName write FName;\r\n property Required: Boolean read FRequired write FRequired;\r\n end;\r\n\r\n {$IFDEF GENERICS}\r\n TXDataPropertyList = TList;\r\n {$ELSE}\r\n TXDataPropertyList = class(TObjectList)\r\n private\r\n function GetItem(Index: Integer): TXDataProperty; reintroduce;\r\n public\r\n property Items[Index: Integer]: TXDataProperty read GetItem; default;\r\n end;\r\n {$ENDIF}\r\n\r\n [JsonInclude(TInclusionMode.NonDefault)]\r\n TXDataSimpleProperty = class(TXDataProperty)\r\n strict private\r\n [JsonIgnore]\r\n FType: TXDataScalarType;\r\n FLength: Integer;\r\n FPrecision: Integer;\r\n FScale: Integer;\r\n private\r\n [JsonIgnore]\r\n FUrlConverter: TXDataTypeConverter;\r\n private\r\n [JsonIgnore]\r\n FTypeRef: string;\r\n function GetTypeRef: string;\r\n public\r\n [JsonProperty('Type')]\r\n property TypeRef: string read GetTypeRef write FTypeRef;\r\n private\r\n procedure Prepare;\r\n protected\r\n procedure SetType(const Value: TXDataScalarType);\r\n function GetTypeKind: TXTypeKind;\r\n// procedure SetTypeKind(const Value: TOTypeKind);\r\n public\r\n property UrlConverter: TXDataTypeConverter read FUrlConverter write FUrlConverter;\r\n public\r\n function IsSimple: Boolean; override;\r\n property PropertyType: TXDataScalarType read FType write SetType;\r\n property TypeKind: TXTypeKind read GetTypeKind; // write SetTypeKind;\r\n\r\n property Length: Integer read FLength write FLength;\r\n property Precision: Integer read FPrecision write FPrecision;\r\n property Scale: Integer read FScale write FScale;\r\n end;\r\n\r\n {$IFDEF GENERICS}\r\n TXDataSimplePropertyList = TList;\r\n {$ELSE}\r\n TXDataSimplePropertyList = class(TXDataOwnedList)\r\n private\r\n function GetItem(Index: Integer): TXDataSimpleProperty; reintroduce;\r\n public\r\n property Items[Index: Integer]: TXDataSimpleProperty read GetItem; default;\r\n end;\r\n {$ENDIF}\r\n\r\n [JsonInclude(TInclusionMode.NonDefault)]\r\n TXDataNavigationProperty = class(TXDataProperty)\r\n strict private\r\n [JsonIgnore]\r\n FTarget: TXDataEntityType;\r\n private\r\n [JsonIgnore]\r\n FTargetRef: string;\r\n function GetTargetRef: string;\r\n public\r\n [JsonProperty('Target')]\r\n property TargetRef: string read GetTargetRef write FTargetRef;\r\n private\r\n procedure Prepare;\r\n public\r\n function IsSimple: Boolean; override;\r\n property Target: TXDataEntityType read FTarget write FTarget;\r\n end;\r\n\r\n {$IFDEF GENERICS}\r\n TXDataNavigationPropertyList = TList;\r\n {$ELSE}\r\n TXDataNavigationPropertyList = class(TXDataOwnedList)\r\n private\r\n function GetItem(Index: Integer): TXDataNavigationProperty; reintroduce;\r\n public\r\n property Items[Index: Integer]: TXDataNavigationProperty read GetItem; default;\r\n end;\r\n {$ENDIF}\r\n\r\n TXDataEntityCollectionType = class;\r\n TXDataEntitySet = class;\r\n TXDataSimplePropertyArray = array of TXDataSimpleProperty;\r\n\r\n [JsonInclude(TInclusionMode.NonDefault)]\r\n TXDataEntityType = class(TXDataStructuredType)\r\n strict private\r\n [JsonIgnore]\r\n FKey: TXDataPropertyList;\r\n [JsonIgnore]\r\n FBaseType: TXDataEntityType;\r\n FProperties: TXDataSimplePropertyList;\r\n FNavigationProperties: TXDataNavigationPropertyList;\r\n [JsonIgnore]\r\n FCollection: TXDataEntityCollectionType;\r\n {$IFDEF AUTOREFCOUNT}[Weak]{$ENDIF}\r\n [JsonIgnore]\r\n FDefaultEntitySet: TXDataEntitySet;\r\n function FindDeclaredProperty(const AName: string): TXDataSimpleProperty;\r\n function FindDeclaredNavigationProperty(const AName: string): TXDataNavigationProperty;\r\n function GetSchema: TXDataSchema;\r\n private\r\n [JsonIgnore]\r\n FBaseTypeRef: string;\r\n [JsonIgnore]\r\n FKeyRef: TStringDynArray;\r\n function GetBaseTypeRef: string;\r\n function GetKeyRef: TStringDynArray;\r\n public\r\n [JsonProperty('BaseType')]\r\n property BaseTypeRef: string read GetBaseTypeRef write FBaseTypeRef;\r\n [JsonProperty('Key')]\r\n property KeyRef: TStringDynArray read GetKeyRef write FKeyRef;\r\n private\r\n procedure Prepare;\r\n strict protected\r\n function GetCollection: TXDataEntityCollectionType;\r\n function GetTypeKind: TXTypeKind; override;\r\n procedure SetSchema(Value: TXDataSchema);\r\n private\r\n property DefaultEntitySet: TXDataEntitySet read FDefaultEntitySet write FDefaultEntitySet;\r\n public\r\n function QualifiedName: string; override;\r\n function FindProperty(const AName: string): TXDataSimpleProperty;\r\n function FindNavigationProperty(const AName: string): TXDataNavigationProperty;\r\n function FindAnyProperty(const AName: string): TXDataProperty;\r\n function IsInheritedFrom(ABase: TXDataEntityType): boolean;\r\n function RootType: TXDataEntityType;\r\n function KeyScalarProperties: TXDataSimplePropertyArray;\r\n property Schema: TXDataSchema read GetSchema;\r\n public\r\n constructor Create; reintroduce;\r\n destructor Destroy; override;\r\n property BaseType: TXDataEntityType read FBaseType write FBaseType;\r\n property Key: TXDataPropertyList read FKey;\r\n property Properties: TXDataSimplePropertyList read FProperties;\r\n property NavigationProperties: TXDataNavigationPropertyList read FNavigationProperties;\r\n property Collection: TXDataEntityCollectionType read GetCollection;\r\n end;\r\n\r\n {$IFDEF GENERICS}\r\n TXDataEntityTypeList = TList;\r\n {$ELSE}\r\n TXDataEntityTypeList = class(TXDataOwnedList)\r\n private\r\n function GetItem(Index: Integer): TXDataEntityType; reintroduce;\r\n public\r\n property Items[Index: Integer]: TXDataEntityType read GetItem; default;\r\n end;\r\n {$ENDIF}\r\n\r\n TXDataEntityCollectionType = class(TXDataEntityType)\r\n strict private\r\n {$IFDEF AUTOREFCOUNT}[Weak]{$ENDIF}\r\n [JsonIgnore]\r\n FItemType: TXDataEntityType;\r\n strict protected\r\n function GetName: string; override;\r\n function GetIsCollection: boolean; override;\r\n function GetWrappedType: TXDataType; override;\r\n function GetTypeKind: TXTypeKind; override;\r\n public\r\n function QualifiedName: string; override;\r\n property ItemType: TXDataEntityType read FItemType write FItemType;\r\n end;\r\n\r\n TXDataEntityContainer = class;\r\n\r\n [JsonInclude(TInclusionMode.NonDefault)]\r\n TXDataEntitySet = class(TXDataModelObject)\r\n strict private\r\n FName: string;\r\n [JsonIgnore]\r\n FEntityType: TXDataEntityType;\r\n [JsonIgnore]\r\n FTagName: string;\r\n function GetContainer: TXDataEntityContainer;\r\n private\r\n [JsonIgnore]\r\n FEntityTypeRef: string;\r\n function GetEntityTypeRef: string;\r\n public\r\n [JsonProperty('EntityType')]\r\n property EntityTypeRef: string read GetEntityTypeRef write FEntityTypeRef;\r\n private\r\n procedure Prepare;\r\n public\r\n property Name: string read FName write FName;\r\n property EntityType: TXDataEntityType read FEntityType write FEntityType;\r\n property Container: TXDataEntityContainer read GetContainer;\r\n property TagName: string read FTagName write FTagName;\r\n end;\r\n\r\n {$IFDEF GENERICS}\r\n TXDataEntitySetList = TList;\r\n {$ELSE}\r\n TXDataEntitySetList = class(TXDataOwnedList)\r\n private\r\n function GetItem(Index: Integer): TXDataEntitySet; reintroduce;\r\n public\r\n property Items[Index: Integer]: TXDataEntitySet read GetItem; default;\r\n end;\r\n {$ENDIF}\r\n\r\n [JsonInclude(TInclusionMode.NonDefault)]\r\n TXDataEntityContainer = class(TXDataModelObject)\r\n strict private\r\n FName: string;\r\n FEntitySets: TXDataEntitySetList;\r\n function GetSchema: TXDataSchema;\r\n public\r\n property Schema: TXDataSchema read GetSchema;\r\n public\r\n constructor Create; reintroduce;\r\n destructor Destroy; override;\r\n function FindEntitySet(const AName: string): TXDataEntitySet;\r\n property Name: string read FName write FName;\r\n property EntitySets: TXDataEntitySetList read FEntitySets;\r\n end;\r\n\r\n {$IFDEF GENERICS}\r\n TXDataEntityContainerList = TList;\r\n {$ELSE}\r\n TXDataEntityContainerList = class(TXDataOwnedList)\r\n private\r\n function GetItem(Index: Integer): TXDataEntityContainer; reintroduce;\r\n public\r\n property Items[Index: Integer]: TXDataEntityContainer read GetItem; default;\r\n end;\r\n {$ENDIF}\r\n\r\n TXDataAction = class;\r\n\r\n TBindingMode = (FromBody, FromURI {FromQuery}, FromPath);\r\n\r\n [JsonInclude(TInclusionMode.NonDefault)]\r\n TXDataParamDef = class(TXDataModelObject)\r\n strict private\r\n FName: string;\r\n private\r\n [JsonIgnore]\r\n FTypeRef: string;\r\n function GetTypeRef: string;\r\n public\r\n [JsonProperty('Type')]\r\n property TypeRef: string read GetTypeRef write FTypeRef;\r\n private\r\n procedure Prepare;\r\n private\r\n [JsonIgnore]\r\n FUrlConverter: TXDataTypeConverter;\r\n [JsonIgnore]\r\n FType: TXDataType;\r\n FBindingMode: TBindingMode;\r\n FOutput: Boolean;\r\n FInput: Boolean;\r\n [JsonIgnore]\r\n FDefaultValue: TValue;\r\n function GetParent: TXDataAction;\r\n {$IFDEF ISDELPHI}\r\n strict private\r\n [JsonIgnore]\r\n FRttiType: TRttiType;\r\n public\r\n property RttiType: TRttiType read FRttiType write FRttiType;\r\n {$ENDIF}\r\n public\r\n function Index: Integer;\r\n property Parent: TXDataAction read GetParent;\r\n public\r\n property UrlConverter: TXDataTypeConverter read FUrlConverter write FUrlConverter;\r\n property Name: string read FName write FName;\r\n property BindingMode: TBindingMode read FBindingMode write FBindingMode;\r\n property Output: Boolean read FOutput write FOutput;\r\n property Input: Boolean read FInput write FInput;\r\n property DefaultValue: TValue read FDefaultValue write FDefaultValue;\r\n property ParamType: TXDataType read FType write FType;\r\n end;\r\n\r\n {$IFDEF GENERICS}\r\n TXDataParamDefList = TList;\r\n {$ELSE}\r\n TXDataParamDefList = class(TXDataOwnedList)\r\n private\r\n function GetItem(Index: Integer): TXDataParamDef; reintroduce;\r\n public\r\n property Items[Index: Integer]: TXDataParamDef read GetItem; default;\r\n end;\r\n {$ENDIF}\r\n\r\n EFromURIBindingNotSupported = class(Exception)\r\n public\r\n constructor Create(AParam: TXDataParamDef); reintroduce;\r\n end;\r\n\r\n TXDataController = class;\r\n\r\n// TXDataRouteSegmentType = (Literal, Parameter);\r\n\r\n TXDataRouteSegment = class\r\n private\r\n FParamName: string;\r\n FValue: string;\r\n FParamIndex: Integer;\r\n FIsParam: Boolean;\r\n// FSegmentType: TXDataRouteSegmentType;\r\n public\r\n constructor Create(const AValue: string);\r\n// property SegmentType: TXDataRouteSegmentType read FSegmentType;\r\n property Value: string read FValue write FValue;\r\n property ParamName: string read FParamName write FParamName;\r\n property ParamIndex: Integer read FParamIndex write FParamIndex;\r\n property IsParam: Boolean read FIsParam;\r\n end;\r\n\r\n {$IFDEF GENERICS}\r\n TXDataRouteSegmentList = TObjectList;\r\n {$ELSE}\r\n TXDataRouteSegmentList = class(TXDataOwnedList)\r\n private\r\n function GetItem(Index: Integer): TXDataRouteSegment; reintroduce;\r\n public\r\n property Items[Index: Integer]: TXDataRouteSegment read GetItem; default;\r\n end;\r\n {$ENDIF}\r\n\r\n TXDataRouteInfo = class\r\n strict private\r\n FSegments: TXDataRouteSegmentList;\r\n FParamCount: Integer;\r\n FPriority: Integer;\r\n function GetSegment(Index: Integer): TXDataRouteSegment;\r\n function GetSegmentCount: Integer;\r\n public\r\n constructor Create;\r\n destructor Destroy; override;\r\n procedure Process(const ARoute: string);\r\n property Segments[Index: Integer]: TXDataRouteSegment read GetSegment;\r\n property SegmentCount: Integer read GetSegmentCount;\r\n property ParamCount: Integer read FParamCount;\r\n property Priority: Integer read FPriority;\r\n end;\r\n\r\n [JsonInclude(TInclusionMode.NonDefault)]\r\n TXDataAction = class(TXDataModelObject)\r\n strict private\r\n FName: string;\r\n FParameters: TXDataParamDefList;\r\n FHttpMethod: string;\r\n FIsParamStream: Boolean;\r\n FIsResultStream: Boolean;\r\n FIsResultCriteria: Boolean;\r\n FIsResultSingleObject: Boolean;\r\n FOperationId: string;\r\n [JsonIgnore]\r\n FRemarks: string;\r\n [JsonIgnore]\r\n FRouteInfo: TXDataRouteInfo;\r\n function ParamCount(Binding: TBindingMode): Integer;\r\n function GetParam(Binding: TBindingMode; Index: Integer): TXDataParamDef;\r\n private\r\n procedure Prepare;\r\n function GetBodyParam(Index: Integer): TXDataParamDef;\r\n function GetPathParam(Index: Integer): TXDataParamDef;\r\n function GetQueryParam(Index: Integer): TXDataParamDef;\r\n protected\r\n function GetController: TXDataController;\r\n public\r\n property Controller: TXDataController read GetController;\r\n property Remarks: string read FRemarks write FRemarks;\r\n public\r\n property IsParamStream: Boolean read FIsParamStream write FIsParamStream;\r\n property IsResultStream: Boolean read FIsResultStream write FIsResultStream;\r\n property IsResultCriteria: Boolean read FIsResultCriteria write FIsResultCriteria;\r\n property IsResultSingleObject: Boolean read FIsResultSingleObject write FIsResultSingleObject;\r\n property OperationId: string read FOperationId write FOperationId;\r\n function HasOutputParams: Boolean;\r\n public\r\n constructor Create; reintroduce;\r\n destructor Destroy; override;\r\n function FindParameter(const AName: string): TXDataParamDef;\r\n function IndexOfParameter(const AName: string): Integer;\r\n function IndexOf(Param: TXDataParamDef): Integer;\r\n function ParamStreamIndex: Integer;\r\n function BodyParamCount: Integer;\r\n property BodyParams[Index: Integer]: TXDataParamDef read GetBodyParam;\r\n function QueryParamCount: Integer;\r\n property QueryParams[Index: Integer]: TXDataParamDef read GetQueryParam;\r\n function RequiredPathParamCount: Integer;\r\n function PathParamCount: Integer;\r\n property PathParams[Index: Integer]: TXDataParamDef read GetPathParam;\r\n property RouteInfo: TXDataRouteInfo read FRouteInfo;\r\n public\r\n // Despite the name, kept this way for backward compatibility, Name property is actually\r\n // the relative Route (path) for the action, so besides just \"GetCustomers\" it can also\r\n // be \"customers/?/items\", for example\r\n property Name: string read FName write FName;\r\n property Parameters: TXDataParamDefList read FParameters;\r\n property HttpMethod: string read FHttpMethod write FHttpMethod;\r\n end;\r\n\r\n {$IFDEF GENERICS}\r\n TXDataActionList = TList;\r\n {$ELSE}\r\n TXDataActionList = class(TXDataOwnedList)\r\n private\r\n function GetItem(Index: Integer): TXDataAction; reintroduce;\r\n public\r\n property Items[Index: Integer]: TXDataAction read GetItem; default;\r\n end;\r\n {$ENDIF}\r\n\r\n [JsonInclude(TInclusionMode.NonDefault)]\r\n TXDataController = class(TXDataModelObject)\r\n strict private\r\n FName: string;\r\n FActions: TXDataActionList;\r\n [JsonIgnore]\r\n FServiceClass: TClass;\r\n [JsonIgnore]\r\n FRouteInfo: TXDataRouteInfo;\r\n [JsonIgnore]\r\n FTagName: string;\r\n function GetSchema: TXDataSchema;\r\n public\r\n property Schema: TXDataSchema read GetSchema;\r\n public\r\n property ServiceClass: TClass read FServiceClass write FServiceClass;\r\n property RouteInfo2: TXDataRouteInfo read FRouteInfo;\r\n property TagName: string read FTagName write FTagName;\r\n private\r\n procedure Prepare;\r\n public\r\n constructor Create; reintroduce;\r\n destructor Destroy; override;\r\n property Name: string read FName write FName;\r\n property Actions: TXDataActionList read FActions;\r\n end;\r\n\r\n {$IFDEF GENERICS}\r\n TXDataControllerList = TList;\r\n {$ELSE}\r\n TXDataControllerList = class(TXDataOwnedList)\r\n private\r\n function GetItem(Index: Integer): TXDataController; reintroduce;\r\n public\r\n property Items[Index: Integer]: TXDataController read GetItem; default;\r\n end;\r\n {$ENDIF}\r\n\r\n [JsonInclude(TInclusionMode.NonDefault)]\r\n TXDataSchema = class(TXDataModelObject)\r\n private\r\n FNamespace: string;\r\n FAlias: string;\r\n function GetModel: TXDataModel;\r\n function FindOrDefineConverter(AType: TXDataType): TXDataTypeConverter;\r\n strict private\r\n FEntityTypes: TXDataEntityTypeList;\r\n FEntityContainers: TXDataEntityContainerList;\r\n FEnumTypes: TXDataEnumTypeList;\r\n FControllers: TXDataControllerList;\r\n public\r\n constructor Create; reintroduce;\r\n destructor Destroy; override;\r\n function FindEntityType(const AName: string): TXDataEntityType;\r\n function FindEnumType(const AName: string): TXDataEnumType;\r\n function FindEnumMember(const AName: string): TXDataEnumMember;\r\n function FindContainer(const AName: string): TXDataEntityContainer;\r\n function FindController(const AName: string): TXDataController;\r\n public\r\n property Namespace: string read FNamespace write FNamespace;\r\n property Alias: string read FAlias write FAlias;\r\n property EntityTypes: TXDataEntityTypeList read FEntityTypes;\r\n property EntityContainers: TXDataEntityContainerList read FEntityContainers;\r\n property EnumTypes: TXDataEnumTypeList read FEnumTypes;\r\n property Controllers: TXDataControllerList read FControllers;\r\n property Model: TXDataModel read GetModel;\r\n end;\r\n\r\n {$IFDEF GENERICS}\r\n TXDataSchemaList = TList;\r\n {$ELSE}\r\n TXDataSchemaList = class(TXDataOwnedList)\r\n private\r\n function GetItem(Index: Integer): TXDataSchema; reintroduce;\r\n public\r\n property Items[Index: Integer]: TXDataSchema read GetItem; default;\r\n end;\r\n {$ENDIF}\r\n\r\n TXDataUrlConverters = class\r\n strict private\r\n FConverterMap: TStringMap;\r\n public\r\n constructor Create; reintroduce;\r\n destructor Destroy; override;\r\n function Find(const ATypeName: string): TXDataTypeConverter;\r\n procedure RegisterConverter(const ATypeName: string; AConverter: TXDataTypeConverter);\r\n end;\r\n\r\n [JsonInclude(TInclusionMode.NonDefault)]\r\n TXDataBaseModel = class(TXDataModelObject)\r\n strict private\r\n FTitle: string;\r\n FVersion: string;\r\n FSchemas: TXDataSchemaList;\r\n private\r\n [JsonIgnore]\r\n FUrlConverters: TXDataUrlConverters;\r\n strict private\r\n function GetDefaultEntityContainer: TXDataEntityContainer;\r\n public\r\n // This method must be called before using a model. It does the initialization of several\r\n // parts of the model, like solving references and settings converters\r\n procedure Prepare;\r\n public\r\n constructor Create; reintroduce;\r\n destructor Destroy; override;\r\n function FindSchema(const APrefix: string): TXDataSchema;\r\n property Schemas: TXDataSchemaList read FSchemas;\r\n function GetEntityType(const QualifiedName: string): TXDataEntityType;\r\n function FindEntityType(const QualifiedName: string): TXDataEntityType;\r\n function GetEntitySet(const QualifiedName: string): TXDataEntitySet;\r\n function FindEntitySet(const QualifiedName: string): TXDataEntitySet;\r\n function FindController(const AName: string): TXDataController;\r\n function FindActionByOperationId(const AOperationId: string): TXDataAction;\r\n function DefaultEntitySet(AType: TXDataEntityType): TXDataEntitySet;\r\n procedure DefineDefaultEntitySet(AType: TXDataEntityType; EntitySet: TXDataEntitySet);\r\n property DefaultEntityContainer: TXDataEntityContainer read GetDefaultEntityContainer;\r\n property Title: string read FTitle write FTitle;\r\n property Version: string read FVersion write FVersion;\r\n end;\r\n\r\n TXDataGetPropValueProc = reference to function(Entity: TValue; Prop: TXDataSimpleProperty): TValue;\r\n TXDataGetNavPropValueProc = reference to function(Entity: TValue; NavProp: TXDataNavigationProperty): TValue;\r\n\r\n [JsonInclude(TInclusionMode.NonDefault)]\r\n TXDataModel = class(TXDataBaseModel)\r\n strict protected\r\n ///\t\r\n ///\t Returns the key predicate of an object instance, to be used in Url.\r\n ///\t\r\n ///\t\r\n ///\t The object instance for which the key predicate will be generated\r\n ///\t\r\n ///\t\r\n ///\t The entity type associated with the object. Just for optimization purposes\r\n ///\t\r\n ///\t\r\n ///\t Reference to a procedure that will read the value of a property\r\n ///\t\r\n ///\t\r\n ///\t Reference to a procedure that will read the value of a navigation property\r\n ///\t\r\n ///\t\r\n ///\t The key predicate of the object\r\n ///\t\r\n ///\t\r\n ///\t This function returns a string containing the key predicate of an\r\n ///\t object instance. The key predicate is a string representation of the\r\n ///\t object id, to be used in an Url to identify a web resource relate to\r\n ///\t the object. For example, in the url\r\n ///\t ), the key predicate\r\n ///\t is 'ABC' (with the quotes).\r\n ///\t\r\n function IdToKeyPredicate(const Entity: TValue; AType: TXDataEntityType;\r\n GetPropValue: TXDataGetPropValueProc; GetNavPropValue: TXDataGetNavPropValueProc): string; overload;\r\n /// \r\n /// Returns the key predicate for an entity of the specified class, given a specified value\r\n /// \r\n ///\t\r\n ///\t This function returns a string containing the key predicate of a class given the specified id.\r\n ///\t The key predicate is a string representation of the\r\n ///\t object id, to be used in an Url to identify a web resource relate to\r\n ///\t the object. For example, in the url\r\n ///\t ), the key predicate\r\n ///\t is 'ABC' (with the quotes).\r\n /// If the class has multiple keys (composite key), TValue must be an array of TValue elements\r\n /// with the same number of elements as the entity key properties\r\n ///\t\r\n function IdToKeyPredicate(AType: TXDataEntityType; const Id: TValue): string; overload;\r\n public\r\n ///\t\r\n ///\t Retrieves the canonical relative Url for an object instance.\r\n ///\t\r\n ///\t\r\n ///\t The object instance which the canonical Url will be generated for\r\n ///\t\r\n ///\t\r\n ///\t The TXDataEntityType object which relates to the AObject instance.\r\n /// It's used only for optimization and can be nil. If AType doesn't match\r\n /// the exact type associated with the object, the function will find\r\n /// the correct type. If type matches, a search is avoided for performance reasons\r\n ///\t\r\n ///\t\r\n /// The identifier or the entity\r\n ///\t\r\n ///\t\r\n ///\t The canonical Url, relative to the server base path, without trailing\r\n ///\t slash\r\n ///\t\r\n ///\t\r\n ///\t Use this method to build the Url to the resource that represents the\r\n ///\t object instance. The canonical Url returned is relative to the server\r\n ///\t base path.\r\n ///\t\r\n ///\t\r\n ///\t \r\n ///\t CanonicalUrl := Model.CanonicalUrl(Customer, CustomerType);\r\n ///\t \r\n ///\t \r\n ///\t // returns \"Customers(15)\" if Customer.Id is equal to 15\r\n ///\t \r\n ///\t\r\n function CanonicalUrlFromId(EntityType: TXDataEntityType; Id: TValue): string; overload;\r\n function CanonicalUrlFromEntity(EntityType: TXDataEntityType; const Entity: TValue;\r\n GetPropValue: TXDataGetPropValueProc; GetNavPropValue: TXDataGetNavPropValueProc): string;\r\n function EntitySetUrl(const AEntitySet: TXDataEntitySet): string;\r\n function DefaultSchema: TXDataSchema;\r\n end;\r\n\r\n ECannotSetTypeKind = class(Exception)\r\n public\r\n constructor Create(Prop: TXDataProperty; Value: TXTypeKind); reintroduce;\r\n end;\r\n\r\n TXDataTypeConverter = class\r\n strict protected\r\n function GetXDataType: TXDataScalarType; virtual; abstract;\r\n function TryValueToUrl(const Value: TValue; out Literal: string; Prop: TXDataSimpleProperty): boolean; virtual;\r\n function TryUrlToValue(const Literal: string; out Value: TValue; Prop: TXDataSimpleProperty): boolean; virtual;\r\n public\r\n function ValueToUrl(const Value: TValue; Prop: TXDataSimpleProperty): string;\r\n function UrlToValue(const Literal: string; Prop: TXDataSimpleProperty): TValue;\r\n property XDataType: TXDataScalarType read GetXDataType;\r\n end;\r\n\r\n EConvertToUrlError = class(Exception)\r\n public\r\n constructor Create(Prop: TXDataSimpleProperty; Value: TValue); reintroduce;\r\n end;\r\n EConvertFromUrlError = class(Exception)\r\n public\r\n constructor Create(const Prop: TXDataSimpleProperty; const Literal: string); reintroduce;\r\n end;\r\n\r\n EModelTypeNotFound = class(Exception);\r\n\r\n EModelReferenceNotFound = class(Exception);\r\n\r\n EXDataEntityTypeNotFound = class(Exception)\r\n public\r\n constructor Create(const AName: string); reintroduce;\r\n end;\r\n\r\n EXDataEntitySetNotFound = class(Exception)\r\n public\r\n constructor Create(const AName: string); reintroduce;\r\n end;\r\n\r\n ECannotBuildKeyPredicateWrongValueLength = class(Exception)\r\n public\r\n constructor Create(AType: TXDataEntityType); reintroduce;\r\n end;\r\n\r\n ECannotBuildCanonicalUrl = class(Exception)\r\n public\r\n constructor Create(AType: TXDataEntityType); reintroduce;\r\n end;\r\n\r\n EUrlConverterNotFound = class(Exception)\r\n public\r\n constructor Create(AType: TXDataType); reintroduce;\r\n end;\r\n\r\n EIndexOutOfRange = class(Exception)\r\n end;\r\n\r\n EXDataInvalidRouteParam = class(Exception)\r\n public\r\n constructor Create(Action: TXDataAction; const ParamName: string);\r\n end;\r\n\r\nimplementation\r\n\r\nuses\r\n XData.Model.Types,\r\n XData.Types.Converters,\r\n XData.Utils;\r\n\r\nprocedure ErrorOutOfRange;\r\nbegin\r\n raise EIndexOutOfRange.Create('Index out of range');\r\nend;\r\n\r\n{ TXDataTypeConverter }\r\n\r\nfunction TXDataTypeConverter.UrlToValue(const Literal: string;\r\n Prop: TXDataSimpleProperty): TValue;\r\nbegin\r\n if not TryUrlToValue(Literal, Result, Prop) then\r\n raise EConvertFromUrlError.Create(Prop, Literal);\r\nend;\r\n\r\nfunction TXDataTypeConverter.TryUrlToValue(const Literal: string;\r\n out Value: TValue; Prop: TXDataSimpleProperty): boolean;\r\nbegin\r\n Result := False;\r\nend;\r\n\r\nfunction TXDataTypeConverter.TryValueToUrl(const Value: TValue;\r\n out Literal: string; Prop: TXDataSimpleProperty): boolean;\r\nbegin\r\n Result := false;\r\nend;\r\n\r\nfunction TXDataTypeConverter.ValueToUrl(const Value: TValue;\r\n Prop: TXDataSimpleProperty): string;\r\nbegin\r\n {$IFDEF ISDELPHI}\r\n if Value.IsEmpty then\r\n Exit('null')\r\n else\r\n {$ELSE}\r\n if Value = nil then\r\n Exit('null')\r\n else\r\n {$ENDIF}\r\n begin\r\n if not TryValueToUrl(Value, Result, Prop) then\r\n raise EConvertToUrlError.Create(Prop, Value);\r\n end;\r\nend;\r\n\r\n{ EConvertToUrlError }\r\n\r\nconstructor EConvertToUrlError.Create(\r\n Prop: TXDataSimpleProperty; Value: TValue);\r\nbegin\r\n inherited CreateFmt('Cannot serialize value \"%s\" to Url format',\r\n {$IFDEF ISDELPHI}\r\n [Value.ToString]\r\n {$ELSE}\r\n [TValue_ToString(Value)]\r\n {$ENDIF}\r\n );\r\nend;\r\n\r\n{ EConvertFromUrlError }\r\n\r\nconstructor EConvertFromUrlError.Create(\r\n const Prop: TXDataSimpleProperty; const Literal: string);\r\nbegin\r\n inherited CreateFmt('Cannot deserialize value \"%s\" from Url format',\r\n [Literal]);\r\nend;\r\n\r\n{ TOwnedList }\r\n\r\n{$IFDEF GENERICS}\r\ntype\r\n TOwnedList = class(TObjectList)\r\n strict private\r\n {$IFDEF AUTOREFCOUNT}[Weak]{$ENDIF}\r\n FOwner: {$IFDEF DELPHIXE6_LVL}TOwner{$ELSE}TObject{$ENDIF};\r\n protected\r\n procedure Notify(const Value: T; Action: TCollectionNotification); override;\r\n public\r\n constructor Create(AOwner: TOwner);\r\n end;\r\n\r\nconstructor TOwnedList.Create(AOwner: TOwner);\r\nbegin\r\n inherited Create(true);\r\n FOwner := AOwner;\r\nend;\r\n\r\nprocedure TOwnedList.Notify(const Value: T;\r\n Action: TCollectionNotification);\r\nbegin\r\n if Action = cnAdded then\r\n {$IFDEF DELPHIXE6_LVL}\r\n Value.Parent := FOwner\r\n {$ELSE}\r\n Value.Parent := TXDataModelObject(FOwner)\r\n {$ENDIF}\r\n else\r\n Value.Parent := nil;\r\n inherited;\r\nend;\r\n{$ENDIF}\r\n\r\n{ TXDataSchema }\r\n\r\nconstructor TXDataSchema.Create;\r\nbegin\r\n inherited;\r\n {$IFDEF GENERICS}\r\n FEntityTypes := TOwnedList.Create(Self);\r\n FEnumTypes := TOwnedList.Create(Self);\r\n FEntityContainers := TOwnedList.Create(Self);\r\n FControllers := TOwnedList.Create(Self);\r\n {$ELSE}\r\n FEntityTypes := TXDataEntityTypeList.Create(Self);\r\n FEnumTypes := TXDataEnumTypeList.Create(Self);\r\n FEntityContainers := TXDataEntityContainerList.Create(Self);\r\n FControllers := TXDataControllerList.Create(Self);\r\n {$ENDIF}\r\nend;\r\n\r\ndestructor TXDataSchema.Destroy;\r\nbegin\r\n FEntityTypes.Free;\r\n FEnumTypes.Free;\r\n FEntityContainers.Free;\r\n FControllers.Free;\r\n inherited;\r\nend;\r\n\r\nfunction TXDataSchema.FindController(const AName: string): TXDataController;\r\nvar\r\n Controller: TXDataController;\r\n I: Integer;\r\nbegin\r\n for I := 0 to Controllers.Count - 1 do\r\n begin\r\n Controller := Controllers[I];\r\n if SameText(Controller.Name, AName) then\r\n Exit(Controller);\r\n end;\r\n Result := nil;\r\nend;\r\n\r\nfunction TXDataSchema.FindContainer(const AName: string): TXDataEntityContainer;\r\nvar\r\n Container: TXDataEntityContainer;\r\n I: Integer;\r\nbegin\r\n for I := 0 to EntityContainers.Count - 1 do\r\n begin\r\n Container := EntityContainers[I];\r\n if SameText(Container.Name, AName) then\r\n Exit(Container);\r\n end;\r\n Result := nil;\r\nend;\r\n\r\nfunction TXDataSchema.FindEntityType(const AName: string): TXDataEntityType;\r\nvar\r\n EntityType: TXDataEntityType;\r\n Wrapper, SubType: string;\r\n I: Integer;\r\nbegin\r\n // Check if it's a collection type\r\n if TXDataUtils.GetNameAndKey(AName, Wrapper, SubType) and\r\n (Wrapper = 'Collection') then\r\n begin\r\n EntityType := FindEntityType(SubType);\r\n Result := EntityType.Collection;\r\n end\r\n else\r\n begin\r\n for I := 0 to EntityTypes.Count - 1 do\r\n begin\r\n EntityType := EntityTypes[I];\r\n if SameText(EntityType.Name, AName) then\r\n Exit(EntityType);\r\n end;\r\n\r\n Result := nil;\r\n end;\r\nend;\r\n\r\nfunction TXDataSchema.FindEnumMember(const AName: string): TXDataEnumMember;\r\nvar\r\n EnumType: TXDataEnumType;\r\n EnumMember: TXDataEnumMember;\r\n I, J: Integer;\r\nbegin\r\n for I := 0 to EnumTypes.Count - 1 do\r\n begin\r\n EnumType := EnumTypes[I];\r\n for J := 0 to EnumType.Members.Count - 1 do\r\n begin\r\n EnumMember := EnumType.Members[J];\r\n if SameText(EnumMember.Name, AName) then\r\n Exit(EnumMember);\r\n end;\r\n end;\r\n Result := nil;\r\nend;\r\n\r\nfunction TXDataSchema.FindEnumType(const AName: string): TXDataEnumType;\r\nvar\r\n EnumType: TXDataEnumType;\r\n I: Integer;\r\nbegin\r\n for I := 0 to EnumTypes.Count - 1 do\r\n begin\r\n EnumType := EnumTypes[I];\r\n if SameText(EnumType.Name, AName) then\r\n Exit(EnumType);\r\n end;\r\n Result := nil;\r\nend;\r\n\r\nfunction TXDataSchema.FindOrDefineConverter(\r\n AType: TXDataType): TXDataTypeConverter;\r\nbegin\r\n if AType = nil then Exit(nil);\r\n \r\n Result := Model.FUrlConverters.Find(AType.Name);\r\n if Result = nil then\r\n begin\r\n if AType is TXDataEnumType then\r\n begin\r\n Result := TXDataEnumConverter.Create(TXDataEnumType(AType));\r\n Model.FUrlConverters.RegisterConverter(AType.Name, Result);\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TXDataSchema.GetModel: TXDataModel;\r\nbegin\r\n Result := TXDataModel(inherited Parent);\r\nend;\r\n\r\n{ TXDataProperty }\r\n\r\nconstructor TXDataProperty.Create;\r\nbegin\r\n inherited;\r\nend;\r\n\r\ndestructor TXDataProperty.Destroy;\r\nbegin\r\n inherited;\r\nend;\r\n\r\nfunction TXDataProperty.GetParent: TXDataEntityType;\r\nbegin\r\n Result := TXDataEntityType(inherited Parent);\r\nend;\r\n\r\nfunction TXDataProperty.QualifiedName: string;\r\nbegin\r\n if Parent <> nil then\r\n Result := Parent.QualifiedName + '.' + Self.Name\r\n else\r\n Result := Self.Name;\r\nend;\r\n\r\n{ TXDataEntityType }\r\n\r\nconstructor TXDataEntityType.Create;\r\nbegin\r\n inherited;\r\n {$IFDEF GENERICS}\r\n FKey := TList.Create;\r\n FProperties := TOwnedList.Create(Self);\r\n FNavigationProperties := TOwnedList.Create(Self);\r\n {$ELSE}\r\n FKey := TXDataPropertyList.Create(False);\r\n FProperties := TXDataSimplePropertyList.Create(Self);\r\n FNavigationProperties := TXDataNavigationPropertyList.Create(Self);\r\n {$ENDIF}\r\nend;\r\n\r\ndestructor TXDataEntityType.Destroy;\r\nbegin\r\n FKey.Free;\r\n FNavigationProperties.Free;\r\n FProperties.Free;\r\n FCollection.Free;\r\n inherited;\r\nend;\r\n\r\nfunction TXDataEntityType.FindAnyProperty(const AName: string): TXDataProperty;\r\nbegin\r\n Result := FindProperty(AName);\r\n if Result = nil then\r\n Result := FindNavigationProperty(AName);\r\nend;\r\n\r\nfunction TXDataEntityType.FindDeclaredNavigationProperty(\r\n const AName: string): TXDataNavigationProperty;\r\nvar\r\n Prop: TXDataNavigationProperty;\r\n I: Integer;\r\nbegin\r\n for I := 0 to NavigationProperties.Count - 1 do\r\n begin\r\n Prop := NavigationProperties[I];\r\n if SameText(AName, Prop.Name) then\r\n Exit(Prop);\r\n end;\r\n Result := nil;\r\nend;\r\n\r\nfunction TXDataEntityType.FindDeclaredProperty(\r\n const AName: string): TXDataSimpleProperty;\r\nvar\r\n Prop: TXDataSimpleProperty;\r\n I: Integer;\r\nbegin\r\n for I := 0 to Properties.Count - 1 do\r\n begin\r\n Prop := Properties[I];\r\n if SameText(AName, Prop.Name) then\r\n Exit(Prop);\r\n end;\r\n Result := nil;\r\nend;\r\n\r\nfunction TXDataEntityType.FindNavigationProperty(const AName: string): TXDataNavigationProperty;\r\nbegin\r\n Result := FindDeclaredNavigationProperty(AName);\r\n if (Result = nil) and (BaseType <> nil) then\r\n Result := BaseType.FindNavigationProperty(AName);\r\nend;\r\n\r\nfunction TXDataEntityType.FindProperty(const AName: string): TXDataSimpleProperty;\r\nbegin\r\n Result := FindDeclaredProperty(AName);\r\n if (Result = nil) and (BaseType <> nil) then\r\n Result := BaseType.FindProperty(AName);\r\nend;\r\n\r\nfunction TXDataEntityType.GetBaseTypeRef: string;\r\nbegin\r\n if FBaseType <> nil then\r\n Result := FBaseType.Name\r\n else\r\n Result := '';\r\nend;\r\n\r\nfunction TXDataEntityType.GetCollection: TXDataEntityCollectionType;\r\nbegin\r\n if FCollection = nil then\r\n begin\r\n FCollection := TXDataEntityCollectionType.Create;\r\n FCollection.ItemType := Self;\r\n FCollection.SetSchema(Self.Schema);\r\n end;\r\n Result := FCollection;\r\nend;\r\n\r\nfunction TXDataEntityType.GetKeyRef: TStringDynArray;\r\nvar\r\n I: Integer;\r\nbegin\r\n SetLength(Result, Key.Count);\r\n for I := 0 to Key.Count - 1 do\r\n Result[I] := Key[I].Name;\r\nend;\r\n\r\nfunction TXDataEntityType.GetSchema: TXDataSchema;\r\nbegin\r\n Result := TXDataSchema(inherited Parent);\r\nend;\r\n\r\n//function TXDataEntityType.GetOpenType: boolean;\r\n//begin\r\n// if (BaseType <> nil) then\r\n// Result := BaseType.OpenType\r\n// else\r\n// Result := FOpenType;\r\n//end;\r\n\r\nfunction TXDataEntityType.GetTypeKind: TXTypeKind;\r\nbegin\r\n Result := TXTypeKind.xtEntity;\r\nend;\r\n\r\nfunction TXDataEntityType.IsInheritedFrom(ABase: TXDataEntityType): boolean;\r\nbegin\r\n if ABase = Self then\r\n Result := true\r\n else\r\n Result := (BaseType <> nil) and BaseType.IsInheritedFrom(ABase);\r\nend;\r\n\r\nfunction TXDataEntityType.KeyScalarProperties: TXDataSimplePropertyArray;\r\n\r\n procedure FillKeyConverters(AType: TXDataEntityType; var KeyProps: TXDataSimplePropertyArray);\r\n var\r\n Key: TXDataProperty;\r\n I: Integer;\r\n begin\r\n AType := AType.RootType;\r\n for I := 0 to AType.Key.Count - 1 do\r\n begin\r\n Key := AType.Key[I];\r\n if Key.IsSimple then\r\n begin\r\n SetLength(KeyProps, Length(KeyProps) + 1);\r\n KeyProps[Length(KeyProps) - 1] := TXDataSimpleProperty(Key);\r\n end\r\n else\r\n FillKeyConverters(TXDataNavigationProperty(Key).Target, KeyProps);\r\n end;\r\n end;\r\n\r\nvar\r\n KeyProps: TXDataSimplePropertyArray;\r\nbegin\r\n SetLength(KeyProps, 0);\r\n FillKeyConverters(Self, KeyProps);\r\n Result := KeyProps;\r\nend;\r\n\r\nfunction TXDataEntityType.QualifiedName: string;\r\nbegin\r\n Result := Self.Name;\r\n if Self.Schema <> nil then\r\n begin\r\n if Self.Schema.Alias <> '' then\r\n Result := Self.Schema.Alias + '.' + Self.Name\r\n else\r\n if Self.Schema.Namespace <> '' then\r\n Result := Self.Schema.Namespace + '.' + Self.Name;\r\n end;\r\nend;\r\n\r\nfunction TXDataEntityType.RootType: TXDataEntityType;\r\nbegin\r\n Result := Self;\r\n while Result.BaseType <> nil do\r\n Result := Result.BaseType;\r\nend;\r\n\r\nprocedure TXDataEntityType.SetSchema(Value: TXDataSchema);\r\nbegin\r\n inherited Parent := Value;\r\n if FCollection <> nil then\r\n FCollection.SetSchema(Value);\r\nend;\r\n\r\nprocedure TXDataEntityType.Prepare;\r\nvar\r\n KeyItem: string;\r\n TempProp: TXDataProperty;\r\n I: Integer;\r\nbegin\r\n if FBaseTypeRef <> '' then\r\n begin\r\n BaseType := Schema.FindEntityType(FBaseTypeRef);\r\n if BaseType = nil then\r\n raise EModelReferenceNotFound.CreateFmt('BaseType %s not found for entity type %s', [FBaseTypeRef, Name]);\r\n FBaseTypeRef := '';\r\n end;\r\n if BaseType <> nil then\r\n BaseType.Prepare;\r\n\r\n if Length(FKeyRef) > 0 then\r\n begin\r\n Key.Clear;\r\n for I := 0 to Length(FKeyRef) - 1 do\r\n begin\r\n KeyItem := FKeyRef[I];\r\n TempProp := FindProperty(KeyItem);\r\n if TempProp = nil then\r\n TempProp := FindNavigationProperty(KeyItem);\r\n if TempProp = nil then\r\n raise EModelReferenceNotFound.CreateFmt('Key property %s not found on entity type %s', [KeyItem, Name]);\r\n Key.Add(TempProp);\r\n end;\r\n SetLength(FKeyRef, 0);\r\n end;\r\n\r\n for I := 0 to Properties.Count - 1 do\r\n Properties[I].Prepare;\r\n for I := 0 to NavigationProperties.Count - 1 do\r\n NavigationProperties[I].Prepare;\r\nend;\r\n\r\n{ TXDataSimpleProperty }\r\n\r\nfunction TXDataSimpleProperty.GetTypeKind: TXTypeKind;\r\nbegin\r\n if PropertyType = nil then\r\n Result := TXTypeKind.xtUndefined\r\n else\r\n Result := PropertyType.TypeKind;\r\nend;\r\n\r\nfunction TXDataSimpleProperty.GetTypeRef: string;\r\nbegin\r\n if FType <> nil then\r\n Result := FType.Name\r\n else\r\n Result := '';\r\nend;\r\n\r\nfunction TXDataSimpleProperty.IsSimple: Boolean;\r\nbegin\r\n Result := True;\r\nend;\r\n\r\nprocedure TXDataSimpleProperty.SetType(const Value: TXDataScalarType);\r\nbegin\r\n // add a restriction here, property cannot be entity type\r\n // (but can be complex type so we can't restrict by class)\r\n\r\n // Also, type must be in scope (same namespace as property). I.e, property can be\r\n // either a scalar type, a collection or a complex type in scope\r\n FType := Value;\r\nend;\r\n\r\nprocedure TXDataSimpleProperty.Prepare;\r\nbegin\r\n // Resolve type reference\r\n if FTypeRef <> '' then\r\n begin\r\n PropertyType := Parent.Schema.FindEnumType(FTypeRef);\r\n if PropertyType = nil then\r\n PropertyType := TXDataPrimitiveTypes.Instance.Find(FTypeRef);\r\n if PropertyType = nil then\r\n raise EModelReferenceNotFound.CreateFmt('Property type %s not found for property %s.%s',\r\n [FTypeRef, Parent.Name, Name]);\r\n FTypeRef := '';\r\n end;\r\n\r\n // Set converter\r\n UrlConverter := Parent.Schema.FindOrDefineConverter(PropertyType);\r\n if UrlConverter = nil then\r\n raise EUrlConverterNotFound.Create(PropertyType);\r\nend;\r\n\r\n//procedure TXDataSimpleProperty.SetTypeKind(const Value: TOTypeKind);\r\n//begin\r\n// raise ECannotSetTypeKind.Create(Self, Value);\r\n//end;\r\n\r\n{ TXDataEntityContainer }\r\n\r\nconstructor TXDataEntityContainer.Create;\r\nbegin\r\n inherited;\r\n {$IFDEF GENERICS}\r\n FEntitySets := TOwnedList.Create(Self);\r\n {$ELSE}\r\n FEntitySets := TXDataEntitySetList.Create(Self);\r\n {$ENDIF}\r\nend;\r\n\r\ndestructor TXDataEntityContainer.Destroy;\r\nbegin\r\n FEntitySets.Free;\r\n inherited;\r\nend;\r\n\r\nfunction TXDataEntityContainer.FindEntitySet(\r\n const AName: string): TXDataEntitySet;\r\nvar\r\n EntitySet: TXDataEntitySet;\r\n I: Integer;\r\nbegin\r\n for I := 0 to EntitySets.Count - 1 do\r\n begin\r\n EntitySet := EntitySets[I];\r\n if SameText(EntitySet.Name, AName) then\r\n Exit(EntitySet);\r\n end;\r\n Result := nil;\r\nend;\r\n\r\nfunction TXDataEntityContainer.GetSchema: TXDataSchema;\r\nbegin\r\n Result := TXDataSchema(inherited Parent);\r\nend;\r\n\r\n{ TXDataEnumType }\r\n\r\nfunction TXDataEnumType.AddMember(const AName: string; AValue: integer): TXDataEnumMember;\r\nbegin\r\n Result := TXDataEnumMember.Create;\r\n Members.Add(Result);\r\n Result.Name := AName;\r\n Result.Value := AValue;\r\nend;\r\n\r\nconstructor TXDataEnumType.Create;\r\nbegin\r\n {$IFDEF GENERICS}\r\n FMembers := TObjectList.Create(True);\r\n {$ELSE}\r\n FMembers := TXDataEnumMemberList.Create;\r\n {$ENDIF}\r\nend;\r\n\r\ndestructor TXDataEnumType.Destroy;\r\nbegin\r\n FMembers.Free;\r\n inherited;\r\nend;\r\n\r\nfunction TXDataEnumType.GetSchema: TXDataSchema;\r\nbegin\r\n Result := TXDataSchema(inherited Parent);\r\nend;\r\n\r\nfunction TXDataEnumType.GetTypeKind: TXTypeKind;\r\nbegin\r\n Result := TXTypeKind.xtEnum;\r\nend;\r\n\r\nfunction TXDataEnumType.QualifiedName: string;\r\nbegin\r\n Result := Self.Name;\r\n if Self.Schema <> nil then\r\n begin\r\n if Self.Schema.Alias <> '' then\r\n Result := Self.Schema.Alias + '.' + Self.Name\r\n else\r\n if Self.Schema.Namespace <> '' then\r\n Result := Self.Schema.Namespace + '.' + Self.Name;\r\n end;\r\nend;\r\n\r\n{ TXDataModel }\r\n\r\nconstructor TXDataBaseModel.Create;\r\nbegin\r\n FTitle := 'Server API';\r\n FVersion := '2.0';\r\n {$IFDEF GENERICS}\r\n FSchemas := TOwnedList.Create(Self);\r\n {$ELSE}\r\n FSchemas := TXDataSchemaList.Create(Self);\r\n {$ENDIF}\r\n FUrlConverters := TXDataUrlConverters.Create;\r\nend;\r\n\r\nfunction TXDataBaseModel.DefaultEntitySet(AType: TXDataEntityType): TXDataEntitySet;\r\nvar\r\n Schema: TXDataSchema;\r\n EntitySet: TXDataEntitySet;\r\n Container: TXDataEntityContainer;\r\n SchemaIndex, ContainerIndex, EntitySetIndex: Integer;\r\nbegin\r\n if AType.DefaultEntitySet <> nil then\r\n Exit(AType.DefaultEntitySet);\r\n\r\n for SchemaIndex := 0 to Schemas.Count - 1 do\r\n begin\r\n Schema := Schemas[SchemaIndex];\r\n for ContainerIndex := 0 to Schema.EntityContainers.Count - 1 do\r\n begin\r\n Container := Schema.EntityContainers[ContainerIndex];\r\n for EntitySetIndex := 0 to Container.EntitySets.Count - 1 do\r\n begin\r\n EntitySet := Container.EntitySets[EntitySetIndex];\r\n if EntitySet.EntityType = AType then\r\n begin\r\n DefineDefaultEntitySet(AType, EntitySet);\r\n Exit(EntitySet);\r\n end;\r\n end;\r\n end;\r\n end;\r\n Result := nil;\r\nend;\r\n\r\nprocedure TXDataBaseModel.DefineDefaultEntitySet(AType: TXDataEntityType;\r\n EntitySet: TXDataEntitySet);\r\nbegin\r\n AType.DefaultEntitySet := EntitySet;\r\nend;\r\n\r\ndestructor TXDataBaseModel.Destroy;\r\nbegin\r\n FSchemas.Free;\r\n FUrlConverters.Free;\r\n inherited;\r\nend;\r\n\r\nfunction TXDataBaseModel.FindActionByOperationId(\r\n const AOperationId: string): TXDataAction;\r\nvar\r\n Schema: TXDataSchema;\r\n Controller: TXDataController;\r\n Action: TXDataAction;\r\n I, J, L: Integer;\r\nbegin\r\n Result := nil;\r\n for I := 0 to Schemas.Count - 1 do\r\n begin\r\n Schema := Schemas[I];\r\n for J := 0 to Schema.Controllers.Count - 1 do\r\n begin\r\n Controller := Schema.Controllers[J];\r\n for L := 0 to Controller.Actions.Count - 1 do\r\n begin\r\n Action := Controller.Actions[L];\r\n\r\n if SameText(Action.OperationId, AOperationId) then\r\n Exit(Action);\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TXDataBaseModel.FindController(const AName: string): TXDataController;\r\nvar\r\n Schema: TXDataSchema;\r\n I: Integer;\r\nbegin\r\n Result := nil;\r\n for I := 0 to Schemas.Count - 1 do\r\n begin\r\n Schema := Schemas[I];\r\n Result := Schema.FindController(AName);\r\n if Result <> nil then\r\n break;\r\n end;\r\nend;\r\n\r\nfunction TXDataBaseModel.FindEntitySet(const QualifiedName: string): TXDataEntitySet;\r\nvar\r\n Prefix, LocalName: string;\r\n Schema: TXDataSchema;\r\n Container: TXDataEntityContainer;\r\n I: Integer;\r\nbegin\r\n Result := nil;\r\n TXDataUtils.GetQualifiedName(QualifiedName, Prefix, LocalName);\r\n Container := nil;\r\n if Prefix = '' then\r\n begin\r\n Container := DefaultEntityContainer;\r\n end else\r\n begin\r\n for I := 0 to Schemas.Count - 1 do\r\n begin\r\n Schema := Schemas[I];\r\n Container := Schema.FindContainer(Prefix);\r\n if Container <> nil then\r\n break;\r\n end;\r\n end;\r\n if Container <> nil then\r\n Result := Container.FindEntitySet(LocalName);\r\nend;\r\n\r\nfunction TXDataBaseModel.FindEntityType(\r\n const QualifiedName: string): TXDataEntityType;\r\nvar\r\n Prefix, LocalName: string;\r\n Schema: TXDataSchema;\r\nbegin\r\n Result := nil;\r\n TXDataUtils.GetQualifiedName(QualifiedName, Prefix, LocalName);\r\n Schema := FindSchema(Prefix);\r\n if Schema <> nil then\r\n Result := Schema.FindEntityType(LocalName);\r\nend;\r\n\r\nfunction TXDataBaseModel.FindSchema(const APrefix: string): TXDataSchema;\r\nvar\r\n LocalSchema: TXDataSchema;\r\n I: Integer;\r\nbegin\r\n for I := 0 to Schemas.Count - 1 do\r\n begin\r\n LocalSchema := Schemas[I];\r\n if SameText(APrefix, LocalSchema.Namespace) or SameText(APrefix, LocalSchema.Alias) then\r\n Exit(LocalSchema);\r\n end;\r\n Result := nil;\r\nend;\r\n\r\nfunction TXDataBaseModel.GetDefaultEntityContainer: TXDataEntityContainer;\r\nbegin\r\n if (Schemas.Count > 0) and (Schemas[0].EntityContainers.Count > 0) then\r\n Result := Schemas[0].EntityContainers[0]\r\n else\r\n Result := nil;\r\nend;\r\n\r\nfunction TXDataBaseModel.GetEntitySet(\r\n const QualifiedName: string): TXDataEntitySet;\r\nbegin\r\n Result := FindEntitySet(QualifiedName);\r\n if Result = nil then\r\n raise EXDataEntitySetNotFound.Create(QualifiedName);\r\nend;\r\n\r\nfunction TXDataBaseModel.GetEntityType(\r\n const QualifiedName: string): TXDataEntityType;\r\nbegin\r\n Result := FindEntityType(QualifiedName);\r\n if Result = nil then\r\n raise EXDataEntityTypeNotFound.Create(QualifiedName);\r\nend;\r\n\r\nprocedure TXDataBaseModel.Prepare;\r\nvar\r\n Schema: TXDataSchema;\r\n Container: TXDataEntityContainer;\r\n EntitySet: TXDataEntitySet;\r\n EntityType: TXDataEntityType;\r\n SchemaIndex: Integer;\r\n ContainerIndex: Integer;\r\n EntitySetIndex: Integer;\r\n EntityTypeIndex: Integer;\r\n ControllerIndex: Integer;\r\n Controller: TXDataController;\r\nbegin\r\n for SchemaIndex := 0 to Schemas.Count - 1 do\r\n begin\r\n Schema := Schemas[SchemaIndex];\r\n\r\n for ContainerIndex := 0 to Schema.EntityContainers.Count - 1 do\r\n begin\r\n Container := Schema.EntityContainers[ContainerIndex];\r\n for EntitySetIndex := 0 to Container.EntitySets.Count - 1 do\r\n begin\r\n EntitySet := Container.EntitySets[EntitySetIndex];\r\n EntitySet.Prepare;\r\n end;\r\n end;\r\n\r\n for EntityTypeIndex := 0 to Schema.EntityTypes.Count - 1 do\r\n begin\r\n EntityType := Schema.EntityTypes[EntityTypeIndex];\r\n EntityType.Prepare;\r\n end;\r\n\r\n for ControllerIndex := 0 to Schema.Controllers.Count - 1 do\r\n begin\r\n Controller := Schema.Controllers[ControllerIndex];\r\n Controller.Prepare;\r\n end;\r\n end;\r\nend;\r\n\r\n{ TXDataModel }\r\n\r\ntype\r\n TValueArray = array of TValue;\r\n\r\nfunction TXDataModel.IdToKeyPredicate(const Entity: TValue; AType: TXDataEntityType;\r\n GetPropValue: TXDataGetPropValueProc; GetNavPropValue: TXDataGetNavPropValueProc): string;\r\n\r\n procedure FillKeyValues(Entity: TValue; AType: TXDataEntityType; var Values: TValueArray);\r\n var\r\n Key: TXDataProperty;\r\n I: Integer;\r\n begin\r\n AType := AType.RootType;\r\n for I := 0 to AType.Key.Count - 1 do\r\n begin\r\n Key := AType.Key[I];\r\n if Key.IsSimple then\r\n begin\r\n SetLength(Values, Length(Values) + 1);\r\n Values[Length(Values) - 1] := GetPropValue(Entity, TXDataSimpleProperty(Key));\r\n end\r\n else\r\n FillKeyValues(\r\n GetNavPropValue(Entity, TXDataNavigationProperty(Key)),\r\n TXDataNavigationProperty(Key).Target,\r\n Values\r\n );\r\n end;\r\n end;\r\n\r\nvar\r\n ValueList: TValueArray;\r\n SimpleKey: TXDataSimpleProperty;\r\nbegin\r\n AType := AType.RootType;\r\n if AType.Key.Count = 0 then\r\n Exit('');\r\n\r\n if (AType.Key.Count = 1) and AType.Key[0].IsSimple then\r\n begin\r\n SimpleKey := TXDataSimpleProperty(AType.Key[0]);\r\n Result := SimpleKey.UrlConverter.ValueToUrl(\r\n GetPropValue(Entity, SimpleKey),\r\n nil\r\n )\r\n end\r\n else\r\n begin\r\n SetLength(ValueList, 0);\r\n FillKeyValues(Entity, AType, ValueList);\r\n {$IFDEF PAS2JS}\r\n Result := IdToKeyPredicate(AType, ValueList);\r\n {$ELSE}\r\n Result := IdToKeyPredicate(AType, TValue.From(ValueList));\r\n {$ENDIF}\r\n end;\r\nend;\r\n\r\nfunction TXDataModel.CanonicalUrlFromEntity(EntityType: TXDataEntityType;\r\n const Entity: TValue; GetPropValue: TXDataGetPropValueProc;\r\n GetNavPropValue: TXDataGetNavPropValueProc): string;\r\nvar\r\n EntitySet: TXDataEntitySet;\r\nbegin\r\n EntitySet := DefaultEntitySet(EntityType);\r\n if EntitySet = nil then\r\n raise ECannotBuildCanonicalUrl.Create(EntityType);\r\n Result := Format('%s(%s)', [\r\n EntitySetUrl(EntitySet),\r\n IdToKeyPredicate(Entity, EntityType, GetPropValue, GetNavPropValue)\r\n ]);\r\nend;\r\n\r\nfunction TXDataModel.CanonicalUrlFromId(EntityType: TXDataEntityType; Id: TValue): string;\r\nvar\r\n EntitySet: TXDataEntitySet;\r\nbegin\r\n EntitySet := DefaultEntitySet(EntityType);\r\n if EntitySet = nil then\r\n raise ECannotBuildCanonicalUrl.Create(EntityType);\r\n Result := Format('%s(%s)', [EntitySetUrl(EntitySet), IdToKeyPredicate(EntityType, Id)]);\r\nend;\r\n\r\nfunction TXDataModel.DefaultSchema: TXDataSchema;\r\nbegin\r\n if Schemas.Count >= 0 then\r\n Result := Schemas[0]\r\n else\r\n Result := nil;\r\nend;\r\n\r\nfunction TXDataModel.EntitySetUrl(const AEntitySet: TXDataEntitySet): string;\r\nbegin\r\n // todo: use prefixed, qualified name when model has more than one entity container\r\n // for now, we will consider there is only one default entity container\r\n Result := AEntitySet.Name;\r\nend;\r\n\r\nfunction TXDataModel.IdToKeyPredicate(AType: TXDataEntityType;\r\n const Id: TValue): string;\r\nvar\r\n I: integer;\r\n Value, CastValue: TValue;\r\n KeyProps: TXDataSimplePropertyArray;\r\nbegin\r\n AType := AType.RootType;\r\n if AType.Key.Count = 0 then\r\n Exit('');\r\n if (AType.Key.Count = 1) and AType.Key[0].IsSimple then\r\n Result := TXDataSimpleProperty(AType.Key[0]).UrlConverter.ValueToUrl(Id, nil)\r\n else\r\n begin\r\n // complex predicate (composite or using associations)\r\n KeyProps := AType.KeyScalarProperties;\r\n if not (TValue_IsArray(Id) and (TValue_GetArrayLength(Id) = Length(KeyProps))) then\r\n raise ECannotBuildKeyPredicateWrongValueLength.Create(AType);\r\n\r\n for I := 0 to Length(KeyProps) - 1 do\r\n begin\r\n Value := TValue_GetArrayElement(Id, I);\r\n {$IFDEF PAS2JS}\r\n CastValue := Value;\r\n {$ELSE}\r\n if Value.TypeInfo = TypeInfo(TValue) then\r\n CastValue := Value.AsType\r\n else\r\n CastValue := Value;\r\n {$ENDIF}\r\n\r\n if Result <> '' then\r\n Result := Result + ',';\r\n Result := Result + KeyProps[I].UrlConverter.ValueToUrl(CastValue, nil);\r\n end;\r\n end;\r\nend;\r\n\r\n{ TXDataModelObject }\r\n\r\ndestructor TXDataModelObject.Destroy;\r\nbegin\r\n {$IFDEF ISDELPHI}\r\n {$IFNDEF AUTOREFCOUNT}\r\n if OwnsDataObject and FData.IsObject then\r\n FData.AsObject.Free;\r\n {$ENDIF}\r\n {$ENDIF}\r\n inherited;\r\nend;\r\n\r\n{ TXDataType }\r\n\r\nfunction TXDataType.GetIsCollection: boolean;\r\nbegin\r\n Result := false;\r\nend;\r\n\r\nfunction TXDataType.GetName: string;\r\nbegin\r\n Result := FName;\r\nend;\r\n\r\n\r\nfunction TXDataType.GetTypeKind: TXTypeKind;\r\nbegin\r\n Result := TXTypeKind.xtUndefined;\r\nend;\r\n\r\nfunction TXDataType.GetWrappedType: TXDataType;\r\nbegin\r\n Result := nil;\r\nend;\r\n\r\nfunction TXDataType.QualifiedName: string;\r\nbegin\r\n Result := Name;\r\nend;\r\n\r\n{ TXDataScalarType }\r\n\r\ndestructor TXDataScalarType.Destroy;\r\nbegin\r\n FCollection.Free;\r\n inherited;\r\nend;\r\n\r\nfunction TXDataScalarType.GetCollection: TXDataScalarType;\r\nbegin\r\n if FCollection = nil then\r\n begin\r\n FCollection := TXDataScalarCollectionType.Create;\r\n FCollection.ItemType := Self;\r\n end;\r\n Result := FCollection;\r\nend;\r\n\r\n{ TDataScalarCollectionType }\r\n\r\nfunction TXDataScalarCollectionType.GetIsCollection: boolean;\r\nbegin\r\n Result := true;\r\nend;\r\n\r\n{ TXDataEntityCollectionType }\r\n\r\nfunction TXDataEntityCollectionType.GetIsCollection: boolean;\r\nbegin\r\n Result := true;\r\nend;\r\n\r\nfunction TXDataScalarCollectionType.GetName: string;\r\nbegin\r\n if ItemType <> nil then\r\n Result := Format('Collection(%s)', [ItemType.Name])\r\n else\r\n Result := 'Collection()';\r\nend;\r\n\r\nfunction TXDataScalarCollectionType.GetTypeKind: TXTypeKind;\r\nbegin\r\n Result := TXTypeKind.xtScalarCollection;\r\nend;\r\n\r\nfunction TXDataScalarCollectionType.GetWrappedType: TXDataType;\r\nbegin\r\n Result := ItemType;\r\nend;\r\n\r\nfunction TXDataScalarCollectionType.QualifiedName: string;\r\nbegin\r\n if ItemType <> nil then\r\n Result := Format('Collection(%s)', [ItemType.QualifiedName])\r\n else\r\n Result := 'Collection()';\r\nend;\r\n\r\nfunction TXDataEntityCollectionType.GetName: string;\r\nbegin\r\n if ItemType <> nil then\r\n Result := Format('Collection(%s)', [ItemType.Name])\r\n else\r\n Result := 'Collection()';\r\nend;\r\n\r\nfunction TXDataEntityCollectionType.GetTypeKind: TXTypeKind;\r\nbegin\r\n Result := TXTypeKind.xtEntityCollection;\r\nend;\r\n\r\nfunction TXDataEntityCollectionType.GetWrappedType: TXDataType;\r\nbegin\r\n Result := ItemType;\r\nend;\r\n\r\nfunction TXDataEntityCollectionType.QualifiedName: string;\r\nbegin\r\n if ItemType <> nil then\r\n Result := Format('Collection(%s)', [ItemType.QualifiedName])\r\n else\r\n Result := 'Collection()';\r\nend;\r\n\r\n{ TXDataEntitySet }\r\n\r\nfunction TXDataEntitySet.GetContainer: TXDataEntityContainer;\r\nbegin\r\n Result := TXDataEntityContainer(inherited Parent);\r\nend;\r\n\r\nfunction TXDataEntitySet.GetEntityTypeRef: string;\r\nbegin\r\n if EntityType <> nil then\r\n Result := EntityType.Name\r\n else\r\n Result := '';\r\nend;\r\n\r\nprocedure TXDataEntitySet.Prepare;\r\nbegin\r\n if FEntityTypeRef <> '' then\r\n begin\r\n EntityType := Container.Schema.FindEntityType(FEntityTypeRef);\r\n if EntityType = nil then\r\n raise EModelReferenceNotFound.CreateFmt('EntityType not found: %s', [FEntityTypeRef]);\r\n FEntityTypeRef := '';\r\n end;\r\nend;\r\n\r\n{ ECannotSetTypeKind }\r\n\r\nconstructor ECannotSetTypeKind.Create(Prop: TXDataProperty; Value: TXTypeKind);\r\nbegin\r\n inherited CreateFmt('Cannot set property \"%s\" type to type kind %s',\r\n [Prop.QualifiedName, IntToStr(Ord(Value))]);\r\nend;\r\n\r\n{ TXDataAction }\r\n\r\nfunction TXDataAction.BodyParamCount: Integer;\r\nbegin\r\n Result := ParamCount(TBindingMode.FromBody);\r\nend;\r\n\r\nconstructor TXDataAction.Create;\r\nbegin\r\n FHttpMethod := 'POST';\r\n {$IFDEF GENERICS}\r\n FParameters := TOwnedList.Create(Self);\r\n {$ELSE}\r\n FParameters := TXDataParamDefList.Create(Self);\r\n {$ENDIF}\r\nend;\r\n\r\ndestructor TXDataAction.Destroy;\r\nbegin\r\n FParameters.Free;\r\n FRouteInfo.Free;\r\n inherited;\r\nend;\r\n\r\nfunction TXDataAction.FindParameter(const AName: string): TXDataParamDef;\r\nvar\r\n I: Integer;\r\nbegin\r\n I := IndexOfParameter(AName);\r\n if I >= 0 then\r\n Result := Parameters[I]\r\n else\r\n Result := nil;\r\nend;\r\n\r\nfunction TXDataAction.HasOutputParams: Boolean;\r\nvar\r\n ParamDef: TXDataParamDef;\r\n I: Integer;\r\nbegin\r\n for I := 0 to Parameters.Count - 1 do\r\n begin\r\n ParamDef := Parameters[I];\r\n if ParamDef.Output then\r\n Exit(True);\r\n end;\r\n Result := False;\r\nend;\r\n\r\nfunction TXDataAction.IndexOf(Param: TXDataParamDef): Integer;\r\nbegin\r\n Result := FParameters.IndexOf(Param);\r\nend;\r\n\r\nfunction TXDataAction.IndexOfParameter(const AName: string): Integer;\r\nvar\r\n I: Integer;\r\nbegin\r\n for I := 0 to Parameters.Count - 1 do\r\n if SameText(Parameters[I].Name, AName) then\r\n Exit(I);\r\n Result := -1;\r\nend;\r\n\r\nfunction TXDataAction.ParamCount(Binding: TBindingMode): Integer;\r\nvar\r\n I: Integer;\r\nbegin\r\n Result := 0;\r\n for I := 0 to Parameters.Count - 1 do\r\n if Parameters[I].BindingMode = Binding then\r\n Inc(Result);\r\nend;\r\n\r\nfunction TXDataAction.PathParamCount: Integer;\r\nbegin\r\n Result := ParamCount(TBindingMode.FromPath);\r\nend;\r\n\r\nprocedure TXDataAction.Prepare;\r\nvar\r\n ParamDefIndex: Integer;\r\n ParamDef: TXDataParamDef;\r\n Segment: TXDataRouteSegment;\r\n I: Integer;\r\nbegin\r\n for ParamDefIndex := 0 to Parameters.Count - 1 do\r\n begin\r\n ParamDef := Parameters[ParamDefIndex];\r\n ParamDef.Prepare;\r\n end;\r\n\r\n // Prepare Route\r\n FreeAndNil(FRouteInfo);\r\n FRouteInfo := TXDataRouteInfo.Create;\r\n FRouteInfo.Process(Controller.Name + '/' + Self.Name);\r\n\r\n // Bind parameters to existing PathParams\r\n for I := 0 to FRouteInfo.SegmentCount - 1 do\r\n begin\r\n Segment := FRouteInfo.Segments[I];\r\n if Segment.IsParam then\r\n begin\r\n Segment.ParamIndex := -1;\r\n // find an existing parameter by name\r\n for ParamDefIndex := 0 to PathParamCount - 1 do\r\n if SameText(PathParams[ParamDefIndex].Name, Segment.ParamName) then\r\n begin\r\n Segment.ParamIndex := ParamDefIndex;\r\n break;\r\n end;\r\n if Segment.ParamIndex = -1 then\r\n raise EXDataInvalidRouteParam.Create(Self, Segment.Value);\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TXDataAction.QueryParamCount: Integer;\r\nbegin\r\n Result := ParamCount(TBindingMode.FromURI);\r\nend;\r\n\r\nfunction TXDataAction.RequiredPathParamCount: Integer;\r\nvar\r\n I: Integer;\r\nbegin\r\n Result := 0;\r\n for I := 0 to Parameters.Count - 1 do\r\n if Parameters[I].BindingMode = TBindingMode.FromPath then\r\n if TValue_IsEmpty(Parameters[I].DefaultValue) then\r\n Inc(Result);\r\nend;\r\n\r\nfunction TXDataAction.ParamStreamIndex: Integer;\r\nvar\r\n I: Integer;\r\nbegin\r\n for I := 0 to Parameters.Count - 1 do\r\n if Assigned(Parameters[I].ParamType) and (Parameters[I].ParamType.TypeKind = TXTypeKind.xtRaw) then\r\n begin\r\n Result := I;\r\n Exit;\r\n end;\r\n\r\n if IsParamStream then\r\n Result := 0\r\n else\r\n Result := -1;\r\nend;\r\n\r\nfunction TXDataAction.GetBodyParam(Index: Integer): TXDataParamDef;\r\nbegin\r\n Result := GetParam(TBindingMode.FromBody, Index);\r\nend;\r\n\r\nfunction TXDataAction.GetController: TXDataController;\r\nbegin\r\n Result := TXDataController(inherited Parent);\r\nend;\r\n\r\nfunction TXDataAction.GetParam(Binding: TBindingMode; Index: Integer): TXDataParamDef;\r\nvar\r\n I, CurIndex: Integer;\r\nbegin\r\n Result := nil;\r\n CurIndex := -1;\r\n for I := 0 to Parameters.Count - 1 do\r\n if Parameters[I].BindingMode = Binding then\r\n begin\r\n Inc(CurIndex);\r\n if Index = CurIndex then\r\n begin\r\n Result := Parameters[I];\r\n Exit;\r\n end;\r\n end;\r\n ErrorOutOfRange;\r\nend;\r\n\r\nfunction TXDataAction.GetPathParam(Index: Integer): TXDataParamDef;\r\nbegin\r\n Result := GetParam(TBindingMode.FromPath, Index);\r\nend;\r\n\r\nfunction TXDataAction.GetQueryParam(Index: Integer): TXDataParamDef;\r\nbegin\r\n Result := GetParam(TBindingMode.FromURI, Index);\r\nend;\r\n\r\n{ TXDataParamDef }\r\n\r\nfunction TXDataParamDef.GetParent: TXDataAction;\r\nbegin\r\n Result := TXDataAction(inherited Parent);\r\nend;\r\n\r\nfunction TXDataParamDef.GetTypeRef: string;\r\nbegin\r\n if FType <> nil then\r\n Result := FType.Name\r\n else\r\n Result := '';\r\nend;\r\n\r\nfunction TXDataParamDef.Index: Integer;\r\nbegin\r\n Result := Parent.IndexOf(Self);\r\nend;\r\n\r\nprocedure TXDataParamDef.Prepare;\r\nbegin\r\n // Solve type reference, if any\r\n if FTypeRef <> '' then\r\n begin\r\n ParamType := Parent.Controller.Schema.FindEnumType(FTypeRef);\r\n if ParamType = nil then\r\n ParamType := TXDataPrimitiveTypes.Instance.Find(FTypeRef);\r\n if ParamType = nil then\r\n raise EModelReferenceNotFound.CreateFmt('Param type %s not found for property %s.%s',\r\n [FTypeRef, Parent.Name, Name]);\r\n FTypeRef := '';\r\n end;\r\n\r\n // Find the type converter for the param def\r\n if (BindingMode in [TBindingMode.FromURI, TBindingMode.FromPath]) then\r\n begin\r\n UrlConverter := Parent.Controller.Schema.FindOrDefineConverter(ParamType);\r\n if UrlConverter = nil then\r\n raise EFromURIBindingNotSupported.Create(Self);\r\n end;\r\nend;\r\n\r\n{ TXDataController }\r\n\r\nconstructor TXDataController.Create;\r\nbegin\r\n {$IFDEF GENERICS}\r\n FActions := TOwnedList.Create(Self);\r\n {$ELSE}\r\n FActions := TXDataActionList.Create(Self);\r\n {$ENDIF}\r\nend;\r\n\r\ndestructor TXDataController.Destroy;\r\nbegin\r\n FActions.Free;\r\n FRouteInfo.Free;\r\n inherited;\r\nend;\r\n\r\nfunction TXDataController.GetSchema: TXDataSchema;\r\nbegin\r\n Result := TXDataSchema(inherited Parent);\r\nend;\r\n\r\nprocedure TXDataController.Prepare;\r\nvar\r\n ActionIndex: Integer;\r\n Action: TXDataAction;\r\nbegin\r\n // prepare RouteInof\r\n FreeAndNil(FRouteInfo);\r\n FRouteInfo := TXDataRouteInfo.Create;\r\n FRouteInfo.Process(Name);\r\n\r\n // prepare actions\r\n for ActionIndex := 0 to Actions.Count - 1 do\r\n begin\r\n Action := Actions[ActionIndex];\r\n Action.Prepare;\r\n end;\r\nend;\r\n\r\n{ TXDataNavigationProperty }\r\n\r\nfunction TXDataNavigationProperty.GetTargetRef: string;\r\nbegin\r\n if FTarget <> nil then\r\n Result := FTarget.Name\r\n else\r\n Result := FTargetRef;\r\nend;\r\n\r\nfunction TXDataNavigationProperty.IsSimple: Boolean;\r\nbegin\r\n Result := False;\r\nend;\r\n\r\nprocedure TXDataNavigationProperty.Prepare;\r\nbegin\r\n if FTargetRef <> '' then\r\n begin\r\n Target := Parent.Schema.FindEntityType(FTargetRef);\r\n if Target = nil then\r\n raise EModelReferenceNotFound.CreateFmt('Target %s not found for navigation property %s.%s',\r\n [FTargetRef, Parent.Name, Name]);\r\n FTargetRef := '';\r\n end;\r\nend;\r\n\r\n{ TXDataOwnedList }\r\n\r\n{$IFNDEF GENERICS}\r\nconstructor TXDataOwnedList.Create;\r\nbegin\r\n Create(nil);\r\nend;\r\n\r\nconstructor TXDataOwnedList.Create(AOwner: TXDataModelObject);\r\nbegin\r\n inherited Create(AOwner <> nil);\r\n FOwner := AOwner;\r\nend;\r\n\r\n{$IFDEF PAS2JS}\r\nprocedure TXDataOwnedList.Notify(Ptr: JSValue; Action: TListNotification);\r\n{$ELSE}\r\nprocedure TXDataOwnedList.Notify(Ptr: Pointer; Action: TListNotification);\r\n{$ENDIF}\r\nbegin\r\n if FOwner = nil then Exit; // not managed\r\n \r\n if Action = lnAdded then\r\n TXDataModelObject(Ptr).Parent := FOwner\r\n else\r\n TXDataModelObject(Ptr).Parent := nil;\r\n inherited;\r\nend;\r\n{$ENDIF}\r\n\r\n{ TXDataParamDefList }\r\n\r\n{$IFNDEF GENERICS}\r\nfunction TXDataParamDefList.GetItem(Index: Integer): TXDataParamDef;\r\nbegin\r\n Result := TXDataParamDef(inherited Items[Index]);\r\nend;\r\n{$ENDIF}\r\n\r\n{ TXDataEntityContainerList }\r\n\r\n{$IFNDEF GENERICS}\r\nfunction TXDataEntityContainerList.GetItem(\r\n Index: Integer): TXDataEntityContainer;\r\nbegin\r\n Result := TXDataEntityContainer(inherited Items[Index]);\r\nend;\r\n{$ENDIF}\r\n\r\n{ TXDataSchemaList }\r\n\r\n{$IFNDEF GENERICS}\r\nfunction TXDataSchemaList.GetItem(Index: Integer): TXDataSchema;\r\nbegin\r\n Result := TXDataSchema(inherited Items[Index]);\r\nend;\r\n{$ENDIF}\r\n\r\n{ TXDataPropertyList }\r\n\r\n{$IFNDEF GENERICS}\r\nfunction TXDataPropertyList.GetItem(Index: Integer): TXDataProperty;\r\nbegin\r\n Result := TXDataProperty(inherited Items[Index]);\r\nend;\r\n{$ENDIF}\r\n\r\n{ TXDataEnumTypeList }\r\n\r\n{$IFNDEF GENERICS}\r\nfunction TXDataEnumTypeList.GetItem(Index: Integer): TXDataEnumType;\r\nbegin\r\n Result := TXDataEnumType(inherited Items[Index]);\r\nend;\r\n{$ENDIF}\r\n\r\n{ TXDataEnumMemberList }\r\n\r\n{$IFNDEF GENERICS}\r\nfunction TXDataEnumMemberList.GetItem(Index: Integer): TXDataEnumMember;\r\nbegin\r\n Result := TXDataEnumMember(inherited Items[Index]);\r\nend;\r\n{$ENDIF}\r\n\r\n{ TXDataEntityTypeList }\r\n\r\n{$IFNDEF GENERICS}\r\nfunction TXDataEntityTypeList.GetItem(Index: Integer): TXDataEntityType;\r\nbegin\r\n Result := TXDataEntityType(inherited Items[Index]);\r\nend;\r\n{$ENDIF}\r\n\r\n{ TXDataControllerList }\r\n\r\n{$IFNDEF GENERICS}\r\nfunction TXDataControllerList.GetItem(Index: Integer): TXDataController;\r\nbegin\r\n Result := TXDataController(inherited Items[Index]);\r\nend;\r\n{$ENDIF}\r\n\r\n{ TXDataOwnedActionList }\r\n\r\n{$IFNDEF GENERICS}\r\nfunction TXDataActionList.GetItem(Index: Integer): TXDataAction;\r\nbegin\r\n Result := TXDataAction(inherited Items[Index]);\r\nend;\r\n{$ENDIF}\r\n\r\n{ TXDataSimplePropertyList }\r\n\r\n{$IFNDEF GENERICS}\r\nfunction TXDataSimplePropertyList.GetItem(Index: Integer): TXDataSimpleProperty;\r\nbegin\r\n Result := TXDataSimpleProperty(inherited Items[Index]);\r\nend;\r\n{$ENDIF}\r\n\r\n{ EXDataEntityTypeNotFound }\r\n\r\nconstructor EXDataEntityTypeNotFound.Create(const AName: string);\r\nbegin\r\n inherited CreateFmt('Entity type not found for type \"%s\"', [AName]);\r\nend;\r\n\r\n{ EXDataEntitySetNotFound }\r\n\r\nconstructor EXDataEntitySetNotFound.Create(const AName: string);\r\nbegin\r\n inherited CreateFmt('Entity set \"%s\" not found', [AName]);\r\nend;\r\n\r\n{ ECannotBuildKeyPredicateWrongValueLength }\r\n\r\nconstructor ECannotBuildKeyPredicateWrongValueLength.Create(\r\n AType: TXDataEntityType);\r\nbegin\r\n inherited CreateFmt('Cannot create id predicate for type \"%s\". ' +\r\n 'The length of id value does not match number of elements in composite key', [AType.QualifiedName]);\r\nend;\r\n\r\n{ ECannotBuildCanonicalUrl }\r\n\r\nconstructor ECannotBuildCanonicalUrl.Create(AType: TXDataEntityType);\r\nbegin\r\n inherited CreateFmt('Cannot create canonical url for type \"%s\"', [AType.QualifiedName]);\r\nend;\r\n\r\n{ TXDataEntitySetList }\r\n\r\n{$IFNDEF GENERICS}\r\nfunction TXDataEntitySetList.GetItem(Index: Integer): TXDataEntitySet;\r\nbegin\r\n Result := TXDataEntitySet(inherited Items[Index]);\r\nend;\r\n{$ENDIF}\r\n\r\n{ TXDataNavigationPropertyList }\r\n\r\n{$IFNDEF GENERICS}\r\nfunction TXDataNavigationPropertyList.GetItem(\r\n Index: Integer): TXDataNavigationProperty;\r\nbegin\r\n Result := TXDataNavigationProperty(inherited Items[Index]);\r\nend;\r\n{$ENDIF}\r\n\r\n{ EFromURIBindingNotSupported }\r\n\r\nconstructor EFromURIBindingNotSupported.Create(AParam: TXDataParamDef);\r\nvar\r\n ParamTypeName: string;\r\nbegin\r\n if AParam.ParamType <> nil then\r\n ParamTypeName := AParam.ParamType.Name\r\n else\r\n ParamTypeName := '(undefined)';\r\n\r\n inherited CreateFmt('Cannot define action \"%s\": Type \"%s\" for param \"%s\" cannot be bound from URI',\r\n [AParam.Parent.Name, ParamTypeName, AParam.Name]);\r\nend;\r\n\r\n{ EUrlConverterNotFound }\r\n\r\nconstructor EUrlConverterNotFound.Create(AType: TXDataType);\r\nvar\r\n ATypeName: string;\r\nbegin\r\n if AType = nil then\r\n ATypeName := '(null)'\r\n else\r\n ATypeName := AType.Name;\r\n inherited CreateFmt('Could not find URL converter for type \"%s\"', [ATypeName]);\r\nend;\r\n\r\n{ TXDataUrlConverters }\r\n\r\nconstructor TXDataUrlConverters.Create;\r\nbegin\r\n FConverterMap := TStringMap.Create(True);\r\n AddDefaultUrlConverters(Self);\r\nend;\r\n\r\ndestructor TXDataUrlConverters.Destroy;\r\nbegin\r\n FConverterMap.Free;\r\n inherited;\r\nend;\r\n\r\nfunction TXDataUrlConverters.Find(const ATypeName: string): TXDataTypeConverter;\r\nbegin\r\n if FConverterMap.ContainsKey(ATypeName) then\r\n Result := TXDataTypeConverter(FConverterMap[ATypeName])\r\n else\r\n Result := nil;\r\nend;\r\n\r\nprocedure TXDataUrlConverters.RegisterConverter(const ATypeName: string;\r\n AConverter: TXDataTypeConverter);\r\nbegin\r\n FConverterMap.AddOrSetValue(ATypeName, AConverter);\r\nend;\r\n\r\n{ TXDataRouteInfo }\r\n\r\nconstructor TXDataRouteInfo.Create;\r\nbegin\r\n FSegments := TXDataRouteSegmentList.Create;\r\nend;\r\n\r\ndestructor TXDataRouteInfo.Destroy;\r\nbegin\r\n FSegments.Free;\r\n inherited;\r\nend;\r\n\r\nfunction TXDataRouteInfo.GetSegment(Index: Integer): TXDataRouteSegment;\r\nbegin\r\n Result := FSegments[Index];\r\nend;\r\n\r\nfunction TXDataRouteInfo.GetSegmentCount: Integer;\r\nbegin\r\n Result := FSegments.Count;\r\nend;\r\n\r\n{$IFDEF PAS2JS}\r\nfunction FindDelimiter(const S: string; StartIdx: Integer = 1): Integer;\r\nvar\r\n Stop: Boolean;\r\n Len: Integer;\r\nbegin\r\n Result := 0;\r\n\r\n Len := Length(S);\r\n Stop := False;\r\n while (not Stop) and (StartIdx <= Len) do\r\n if S[StartIdx] = '/' then\r\n begin\r\n Result := StartIdx;\r\n Stop := True;\r\n end\r\n else\r\n Inc(StartIdx);\r\nend;\r\n\r\nfunction SplitString(const S, Delimiters: string): TStringDynArray;\r\nvar\r\n StartIdx: Integer;\r\n FoundIdx: Integer;\r\n SplitPoints: Integer;\r\n CurrentSplit: Integer;\r\n i: Integer;\r\nbegin\r\n Result := nil;\r\n\r\n if S <> '' then\r\n begin\r\n { Determine the length of the resulting array }\r\n SplitPoints := 0;\r\n for i := 1 to Length(S) do\r\n if S[i] = '/' then\r\n Inc(SplitPoints);\r\n\r\n SetLength(Result, SplitPoints + 1);\r\n\r\n { Split the string and fill the resulting array }\r\n StartIdx := 1;\r\n CurrentSplit := 0;\r\n repeat\r\n FoundIdx := FindDelimiter(S, StartIdx);\r\n if FoundIdx <> 0 then\r\n begin\r\n Result[CurrentSplit] := Copy(S, StartIdx, FoundIdx - StartIdx);\r\n Inc(CurrentSplit);\r\n StartIdx := FoundIdx + 1;\r\n end;\r\n until CurrentSplit = SplitPoints;\r\n\r\n // copy the remaining part in case the string does not end in a delimiter\r\n Result[SplitPoints] := Copy(S, StartIdx, Length(S) - StartIdx + 1);\r\n end;\r\nend;\r\n{$ENDIF}\r\n\r\nprocedure TXDataRouteInfo.Process(const ARoute: string);\r\nvar\r\n I: Integer;\r\n StrSegments: TStringDynArray;\r\nbegin\r\n // add the segments\r\n StrSegments := SplitString(ARoute, '/');\r\n for I := 0 to Length(StrSegments) - 1 do\r\n if StrSegments[I] <> '' then\r\n FSegments.Add(TXDataRouteSegment.Create(StrSegments[I]));\r\n\r\n // Define the priority and count the parameters\r\n // Priority is defined as this: all the exact segments that come first have\r\n // higher priority. Any segment with parameter is less priority.\r\n // For example, the following routes are in order of priority (higher to low)\r\n // a/b/c\r\n // a/b/?\r\n // a/?/c\r\n // ?/b/c\r\n // ?\r\n FPriority := 0;\r\n FParamCount := 0;\r\n for I := 0 to SegmentCount - 1 do\r\n begin\r\n if Segments[I].IsParam then\r\n Inc(FParamCount)\r\n else\r\n FPriority := FPriority or (1 shl (16 - I));\r\n end;\r\nend;\r\n\r\n{ TXDataRouteSegment }\r\n\r\nconstructor TXDataRouteSegment.Create(const AValue: string);\r\nbegin\r\n FValue := AValue;\r\n// if Value = '?' then\r\n// FSegmentType := TXDataRouteSegmentType.Parameter;\r\n\r\n if (Length(Value) >= 3) and (Value[1] = '{') and (Value[Length(Value)] = '}') then\r\n begin\r\n FIsParam := True;\r\n FParamName := Copy(Value, 2, Length(Value) - 2);\r\n end;\r\nend;\r\n\r\n{ EXDataInvalidRouteParam }\r\n\r\nconstructor EXDataInvalidRouteParam.Create(Action: TXDataAction;\r\n const ParamName: string);\r\nbegin\r\n inherited CreateFmt('Invalid param \"%s\" in route of action \"%s\"',\r\n [ParamName, Action.OperationId]);\r\nend;\r\n\r\n{ TXDataRouteSegmentList }\r\n\r\n{$IFNDEF GENERICS}\r\nfunction TXDataRouteSegmentList.GetItem(Index: Integer): TXDataRouteSegment;\r\nbegin\r\n Result := TXDataRouteSegment(inherited Items[Index]);\r\nend;\r\n{$ENDIF}\r\n\r\nend.\r\n\r\n","unit Bcl.TypInfo.Common;\r\n\r\n{$I Bcl.inc}\r\n\r\ninterface\r\n\r\nuses\r\n TypInfo;\r\n\r\ntype\r\n{$IFDEF PAS2JS}\r\n PTypeInfo = TypInfo.TTypeInfo;\r\n{$ELSE}\r\n PTypeInfo = TypInfo.PTypeInfo;\r\n{$ENDIF}\r\n\r\nfunction GetTypeName_(TypeInfo: PTypeInfo): string;\r\nfunction GetEnumName_(TypeInfo: PTypeInfo; Value: Integer): string;\r\nfunction GetEnumValue_(TypeInfo: PTypeInfo; const Name: string): Integer;\r\n\r\n\r\nimplementation\r\n\r\nfunction GetTypeName_(TypeInfo: PTypeInfo): string;\r\nbegin\r\n {$IFDEF PAS2JS}\r\n Result := TypeInfo.Name;\r\n {$ELSE}\r\n Result := TypInfo.GetTypeName(TypeInfo);\r\n {$ENDIF}\r\nend;\r\n\r\nfunction GetEnumName_(TypeInfo: PTypeInfo; Value: Integer): string;\r\nbegin\r\n {$IFDEF PAS2JS}\r\n Result := TTypeInfoEnum(TypeInfo).EnumType.IntToName[Value];\r\n {$ELSE}\r\n Result := TypInfo.GetEnumName(TypeInfo, Value);\r\n {$ENDIF}\r\nend;\r\n\r\nfunction GetEnumValue_(TypeInfo: PTypeInfo; const Name: string): Integer;\r\nbegin\r\n {$IFDEF PAS2JS}\r\n Result := TTypeInfoEnum(TypeInfo).EnumType.NameToInt[Name];\r\n {$ELSE}\r\n Result := TypInfo.GetEnumValue(TypeInfo, Name);\r\n {$ENDIF}\r\nend;\r\n\r\nend.","unit XData.Model.Deserializer;\r\n\r\n{$I XData.inc}\r\n\r\ninterface\r\n\r\nuses\r\n SysUtils, Types, TypInfo,\r\n {$IFDEF PAS2JS}\r\n JS,\r\n {$ELSE}\r\n Bcl.Json.Classes,\r\n Bcl.Json,\r\n {$ENDIF}\r\n Bcl.Json.Common,\r\n Bcl.TypInfo.Common,\r\n XData.Model.Classes;\r\n\r\ntype\r\n EXDataModelDeserialization = class(Exception);\r\n\r\n TXDataModelDeserializer = class\r\n strict private\r\n FModel: TXDataModel;\r\n FRoot: TJObject;\r\n public\r\n constructor Create(AModel: TXDataModel; const Json: string); reintroduce;\r\n destructor Destroy; override;\r\n\r\n procedure Read;\r\n procedure ReadBase(Base: TXDataModelObject; JObj: TJObject);\r\n procedure ReadType(XDataType: TXDataType; JObj: TJObject);\r\n procedure ReadStructuredType(StructuredType: TXDataStructuredType; JObj: TJObject);\r\n procedure ReadScalarType(ScalarType: TXDataScalarType; JObj: TJObject);\r\n\r\n procedure ReadModel(Model: TXDataModel; JObj: TJObject);\r\n procedure ReadSchema(Schema: TXDataSchema; JObj: TJObject);\r\n procedure ReadEntityType(EntityType: TXDataEntityType; JObj: TJObject);\r\n procedure ReadSimpleProperty(SimpleProperty: TXDataSimpleProperty; JObj: TJObject);\r\n procedure ReadNavigationProperty(NavigationProperty: TXDataNavigationProperty; JObj: TJObject);\r\n procedure ReadProperty(Prop: TXDataProperty; JObj: TJObject);\r\n procedure ReadEntityContainer(Container: TXDataEntityContainer; JObj: TJObject);\r\n procedure ReadEntitySet(EntitySet: TXDataEntitySet; JObj: TJObject);\r\n procedure ReadEnumType(EnumType: TXDataEnumType; JObj: TJObject);\r\n procedure ReadEnumMember(EnumMember: TXDataEnumMember; JObj: TJObject);\r\n procedure ReadController(Controller: TXDataController; JObj: TJObject);\r\n procedure ReadAction(Action: TXDataAction; JObj: TJObject);\r\n procedure ReadParamDef(ParamDef: TXDataParamDef; JObj: TJObject);\r\n public\r\n class procedure Deserialize(AModel: TXDataModel; const Json: string);\r\n end;\r\n\r\nimplementation\r\n\r\n{ TXDataModelDeserializer }\r\n\r\nconstructor TXDataModelDeserializer.Create(AModel: TXDataModel; const Json: string);\r\nbegin\r\n FModel := AModel;\r\n {$IFDEF PAS2JS}\r\n FRoot := TJSJSON.parseObject(Json);\r\n {$ELSE}\r\n FRoot := TJson.Deserialize(Json);\r\n {$ENDIF}\r\nend;\r\n\r\nclass procedure TXDataModelDeserializer.Deserialize(AModel: TXDataModel; const Json: string);\r\nvar\r\n Deserializer: TXDataModelDeserializer;\r\nbegin\r\n Deserializer := TXDataModelDeserializer.Create(AModel, Json);\r\n try\r\n Deserializer.Read;\r\n finally\r\n Deserializer.Free;\r\n end;\r\nend;\r\n\r\ndestructor TXDataModelDeserializer.Destroy;\r\nbegin\r\n {$IFNDEF PAS2JS}\r\n FRoot.Free;\r\n {$ENDIF}\r\n inherited;\r\nend;\r\n\r\nprocedure TXDataModelDeserializer.ReadModel(Model: TXDataModel; JObj: TJObject);\r\nvar\r\n Key: string;\r\n I: Integer;\r\n JSchemas: TJArray;\r\n Keys: TStringDynArray;\r\n KeyIndex: Integer;\r\nbegin\r\n ReadBase(Model, JObj);\r\n Model.Schemas.Clear;\r\n Keys := JObjectKeys(JObj);\r\n for KeyIndex := 0 to Length(Keys) - 1 do\r\n begin\r\n Key := Keys[KeyIndex];\r\n if Key = 'Title' then\r\n Model.Title := JToStr(JObj[Key])\r\n else\r\n if Key = 'Version' then\r\n Model.Version := JToStr(JObj[Key])\r\n else\r\n if Key = 'Schemas' then\r\n begin\r\n JSchemas := AsJArray(JObj[Key]);\r\n for I := 0 to JSchemas.Length - 1 do\r\n ReadSchema(Model.Schemas[Model.Schemas.Add(TXDataSchema.Create)], AsJObject(JSchemas[I]));\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TXDataModelDeserializer.ReadNavigationProperty(\r\n NavigationProperty: TXDataNavigationProperty; JObj: TJObject);\r\nvar\r\n Key: string;\r\n Keys: TStringDynArray;\r\n KeyIndex: Integer;\r\nbegin\r\n ReadProperty(NavigationProperty, JObj);\r\n Keys := JObjectKeys(JObj);\r\n for KeyIndex := 0 to Length(Keys) - 1 do\r\n begin\r\n Key := Keys[KeyIndex];\r\n if Key = 'Target' then\r\n NavigationProperty.TargetRef := JToStr(JObj[Key]);\r\n end;\r\nend;\r\n\r\nprocedure TXDataModelDeserializer.ReadParamDef(ParamDef: TXDataParamDef;\r\n JObj: TJObject);\r\nvar\r\n Key: string;\r\n Keys: TStringDynArray;\r\n KeyIndex: Integer;\r\nbegin\r\n ReadBase(ParamDef, JObj);\r\n Keys := JObjectKeys(JObj);\r\n for KeyIndex := 0 to Length(Keys) - 1 do\r\n begin\r\n Key := Keys[KeyIndex];\r\n if Key = 'Name' then\r\n ParamDef.Name := JToStr(JObj[Key])\r\n else\r\n if Key = 'BindingMode' then\r\n ParamDef.BindingMode := TBindingMode(GetEnumValue_(TypeInfo(TBindingMode), JToStr(JObj[Key])))\r\n else\r\n if Key = 'Output' then\r\n ParamDef.Output := JToBool(JObj[Key])\r\n else\r\n if Key = 'Input' then\r\n ParamDef.Input := JToBool(JObj[Key])\r\n else\r\n if Key = 'Type' then\r\n ParamDef.TypeRef := JToStr(JObj[Key]);\r\n end;\r\nend;\r\n\r\nprocedure TXDataModelDeserializer.ReadProperty(Prop: TXDataProperty;\r\n JObj: TJObject);\r\nvar\r\n Key: string;\r\n Keys: TStringDynArray;\r\n KeyIndex: Integer;\r\nbegin\r\n ReadBase(Prop, JObj);\r\n Keys := JObjectKeys(JObj);\r\n for KeyIndex := 0 to Length(Keys) - 1 do\r\n begin\r\n Key := Keys[KeyIndex];\r\n if Key = 'Name' then\r\n Prop.Name := JToStr(JObj[Key])\r\n else\r\n if Key = 'Required' then\r\n Prop.Required := JToBool(JObj[Key]);\r\n end;\r\nend;\r\n\r\nprocedure TXDataModelDeserializer.Read;\r\nbegin\r\n ReadModel(FModel, FRoot);\r\n FModel.Prepare;\r\nend;\r\n\r\nprocedure TXDataModelDeserializer.ReadAction(Action: TXDataAction;\r\n JObj: TJObject);\r\nvar\r\n Key: string;\r\n I: Integer;\r\n JParamDefs: TJArray;\r\n Keys: TStringDynArray;\r\n KeyIndex: Integer;\r\nbegin\r\n ReadBase(Action, JObj);\r\n Keys := JObjectKeys(JObj);\r\n for KeyIndex := 0 to Length(Keys) - 1 do\r\n begin\r\n Key := Keys[KeyIndex];\r\n if Key = 'Name' then\r\n Action.Name := JToStr(JObj[Key])\r\n else\r\n if Key = 'Parameters' then\r\n begin\r\n JParamDefs := AsJArray(JObj[Key]);\r\n for I := 0 to JParamDefs.Length - 1 do\r\n ReadParamDef(Action.Parameters[Action.Parameters.Add(TXDataParamDef.Create)], AsJObject(JParamDefs[I]));\r\n end\r\n else\r\n if Key = 'HttpMethod' then\r\n Action.HttpMethod := JToStr(JObj[Key])\r\n else\r\n if Key = 'IsParamStream' then\r\n Action.IsParamStream := JToBool(JObj[Key])\r\n else\r\n if Key = 'IsResultStream' then\r\n Action.IsResultStream := JToBool(JObj[Key])\r\n else\r\n if Key = 'IsResultCriteria' then\r\n Action.IsResultCriteria := JToBool(JObj[Key])\r\n else\r\n if Key = 'IsResultSingleObject' then\r\n Action.IsResultSingleObject := JToBool(JObj[Key])\r\n else\r\n if Key = 'OperationId' then\r\n Action.OperationId := JToStr(JObj[Key]);\r\n end;\r\nend;\r\n\r\nprocedure TXDataModelDeserializer.ReadBase(Base: TXDataModelObject;\r\n JObj: TJObject);\r\nvar\r\n Key: string;\r\n Keys: TStringDynArray;\r\n KeyIndex: Integer;\r\nbegin\r\n Keys := JObjectKeys(JObj);\r\n for KeyIndex := 0 to Length(Keys) - 1 do\r\n begin\r\n Key := Keys[KeyIndex];\r\n if Key = 'Description' then\r\n Base.Description := JToStr(JObj[Key]);\r\n end;\r\nend;\r\n\r\nprocedure TXDataModelDeserializer.ReadController(Controller: TXDataController;\r\n JObj: TJObject);\r\nvar\r\n Key: string;\r\n I: Integer;\r\n JActions: TJArray;\r\n Keys: TStringDynArray;\r\n KeyIndex: Integer;\r\nbegin\r\n ReadBase(Controller, JObj);\r\n Keys := JObjectKeys(JObj);\r\n for KeyIndex := 0 to Length(Keys) - 1 do\r\n begin\r\n Key := Keys[KeyIndex];\r\n if Key = 'Name' then\r\n Controller.Name := JToStr(JObj[Key])\r\n else\r\n if Key = 'Actions' then\r\n begin\r\n JActions := AsJArray(JObj[Key]);\r\n for I := 0 to JActions.Length - 1 do\r\n ReadAction(Controller.Actions[Controller.Actions.Add(TXDataAction.Create)], AsJObject(JActions[I]));\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TXDataModelDeserializer.ReadEntityContainer(\r\n Container: TXDataEntityContainer; JObj: TJObject);\r\nvar\r\n Key: string;\r\n I: Integer;\r\n JEntitySets: TJArray;\r\n Keys: TStringDynArray;\r\n KeyIndex: Integer;\r\nbegin\r\n ReadBase(Container, JObj);\r\n Keys := JObjectKeys(JObj);\r\n for KeyIndex := 0 to Length(Keys) - 1 do\r\n begin\r\n Key := Keys[KeyIndex];\r\n if Key = 'Name' then\r\n Container.Name := JToStr(JObj[Key])\r\n else\r\n if Key = 'EntitySets' then\r\n begin\r\n JEntitySets := AsJArray(JObj[Key]);\r\n for I := 0 to JEntitySets.Length - 1 do\r\n ReadEntitySet(Container.EntitySets[Container.EntitySets.Add(TXDataEntitySet.Create)], AsJObject(JEntitySets[I]));\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TXDataModelDeserializer.ReadEntitySet(EntitySet: TXDataEntitySet;\r\n JObj: TJObject);\r\nvar\r\n Key: string;\r\n Keys: TStringDynArray;\r\n KeyIndex: Integer;\r\nbegin\r\n ReadBase(EntitySet, JObj);\r\n Keys := JObjectKeys(JObj);\r\n for KeyIndex := 0 to Length(Keys) - 1 do\r\n begin\r\n Key := Keys[KeyIndex];\r\n if Key = 'Name' then\r\n EntitySet.Name := JToStr(JObj[Key])\r\n else\r\n if Key = 'EntityType' then\r\n EntitySet.EntityTypeRef := JToStr(JObj[Key]); // Reference\r\n end;\r\nend;\r\n\r\nprocedure TXDataModelDeserializer.ReadEntityType(EntityType: TXDataEntityType;\r\n JObj: TJObject);\r\nvar\r\n Key: string;\r\n I: Integer;\r\n JProperties: TJArray;\r\n JNavigationProperties: TJArray;\r\n JKey: TJArray;\r\n TempKeyRef: TStringDynArray;\r\n Keys: TStringDynArray;\r\n KeyIndex: Integer;\r\nbegin\r\n ReadStructuredType(EntityType, JObj);\r\n SetLength(TempKeyRef, 0);\r\n EntityType.Properties.Clear;\r\n EntityType.NavigationProperties.Clear;\r\n Keys := JObjectKeys(JObj);\r\n for KeyIndex := 0 to Length(Keys) - 1 do\r\n begin\r\n Key := Keys[KeyIndex];\r\n if Key = 'Properties' then\r\n begin\r\n JProperties := AsJArray(JObj[Key]);\r\n for I := 0 to JProperties.Length - 1 do\r\n ReadSimpleProperty(EntityType.Properties[EntityType.Properties.Add(TXDataSimpleProperty.Create)], AsJObject(JProperties[I]));\r\n end\r\n else\r\n if Key = 'NavigationProperties' then\r\n begin\r\n JNavigationProperties := AsJArray(JObj[Key]);\r\n for I := 0 to JNavigationProperties.Length - 1 do\r\n ReadNavigationProperty(EntityType.NavigationProperties[EntityType.NavigationProperties.Add(TXDataNavigationProperty.Create)], AsJObject(JNavigationProperties[I]));\r\n end\r\n else\r\n if Key = 'BaseType' then\r\n EntityType.BaseTypeRef := JToStr(JObj[Key])\r\n else\r\n if Key = 'Key' then\r\n begin\r\n JKey := AsJArray(JObj[Key]);\r\n SetLength(TempKeyRef, JKey.Length);\r\n for I := 0 to JKey.Length - 1 do\r\n TempKeyRef[I] := JToStr(JKey[I]);\r\n EntityType.KeyRef := TempKeyRef;\r\n end\r\n end;\r\nend;\r\n\r\nprocedure TXDataModelDeserializer.ReadEnumMember(EnumMember: TXDataEnumMember;\r\n JObj: TJObject);\r\nvar\r\n Key: string;\r\n Keys: TStringDynArray;\r\n KeyIndex: Integer;\r\nbegin\r\n ReadBase(EnumMember, JObj);\r\n Keys := JObjectKeys(JObj);\r\n for KeyIndex := 0 to Length(Keys) - 1 do\r\n begin\r\n Key := Keys[KeyIndex];\r\n if Key = 'Name' then\r\n EnumMember.Name := JToStr(JObj[Key])\r\n else\r\n if Key = 'Value' then\r\n EnumMember.Value := JToInt(JObj[Key]);\r\n end;\r\nend;\r\n\r\nprocedure TXDataModelDeserializer.ReadEnumType(EnumType: TXDataEnumType;\r\n JObj: TJObject);\r\nvar\r\n Key: string;\r\n I: Integer;\r\n JMembers: TJArray;\r\n Keys: TStringDynArray;\r\n KeyIndex: Integer;\r\nbegin\r\n ReadScalarType(EnumType, JObj);\r\n Keys := JObjectKeys(JObj);\r\n for KeyIndex := 0 to Length(Keys) - 1 do\r\n begin\r\n Key := Keys[KeyIndex];\r\n if Key = 'Members' then\r\n begin\r\n JMembers := AsJArray(JObj[Key]);\r\n for I := 0 to JMembers.Length - 1 do\r\n ReadEnumMember(EnumType.Members[EnumType.Members.Add(TXDataEnumMember.Create)], AsJObject(JMembers[I]));\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TXDataModelDeserializer.ReadScalarType(ScalarType: TXDataScalarType;\r\n JObj: TJObject);\r\nbegin\r\n ReadType(ScalarType, JObj);\r\nend;\r\n\r\nprocedure TXDataModelDeserializer.ReadSchema(Schema: TXDataSchema;\r\n JObj: TJObject);\r\nvar\r\n Key: string;\r\n I: Integer;\r\n JEntityTypes: TJArray;\r\n JEntityContainers: TJArray;\r\n JEnumTypes: TJArray;\r\n JControllers: TJArray;\r\n Keys: TStringDynArray;\r\n KeyIndex: Integer;\r\nbegin\r\n ReadBase(Schema, JObj);\r\n Schema.EntityTypes.Clear;\r\n Schema.EntityContainers.Clear;\r\n Schema.EnumTypes.Clear;\r\n Schema.Controllers.Clear;\r\n Keys := JObjectKeys(JObj);\r\n for KeyIndex := 0 to Length(Keys) - 1 do\r\n begin\r\n Key := Keys[KeyIndex];\r\n if Key = 'Namespace' then\r\n Schema.Namespace := JToStr(JObj[Key])\r\n else\r\n if Key = 'Alias' then\r\n Schema.Alias := JToStr(JObj[Key])\r\n else\r\n if Key = 'EntityTypes' then\r\n begin\r\n JEntityTypes := AsJArray(JObj[Key]);\r\n for I := 0 to JEntityTypes.Length - 1 do\r\n ReadEntityType(Schema.EntityTypes[Schema.EntityTypes.Add(TXDataEntityType.Create)], AsJObject(JEntityTypes[I]));\r\n end\r\n else\r\n if Key = 'EntityContainers' then\r\n begin\r\n JEntityContainers := AsJArray(JObj[Key]);\r\n for I := 0 to JEntityContainers.Length - 1 do\r\n ReadEntityContainer(Schema.EntityContainers[Schema.EntityContainers.Add(TXDataEntityContainer.Create)], AsJObject(JEntityContainers[I]));\r\n end\r\n else\r\n if Key = 'EnumTypes' then\r\n begin\r\n JEnumTypes := AsJArray(JObj[Key]);\r\n for I := 0 to JEnumTypes.Length - 1 do\r\n ReadEnumType(Schema.EnumTypes[Schema.EnumTypes.Add(TXDataEnumType.Create)], AsJObject(JEnumTypes[I]));\r\n end\r\n else\r\n if Key = 'Controllers' then\r\n begin\r\n JControllers := AsJArray(JObj[Key]);\r\n for I := 0 to JControllers.Length - 1 do\r\n ReadController(Schema.Controllers[Schema.Controllers.Add(TXDataController.Create)], AsJObject(JControllers[I]));\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TXDataModelDeserializer.ReadSimpleProperty(\r\n SimpleProperty: TXDataSimpleProperty; JObj: TJObject);\r\nvar\r\n Key: string;\r\n Keys: TStringDynArray;\r\n KeyIndex: Integer;\r\nbegin\r\n ReadProperty(SimpleProperty, JObj);\r\n Keys := JObjectKeys(JObj);\r\n for KeyIndex := 0 to Length(Keys) - 1 do\r\n begin\r\n Key := Keys[KeyIndex];\r\n if Key = 'Length' then\r\n SimpleProperty.Length := JToInt(JObj[Key])\r\n else\r\n if Key = 'Precision' then\r\n SimpleProperty.Precision := JToInt(JObj[Key])\r\n else\r\n if Key = 'Scale' then\r\n SimpleProperty.Scale := JToInt(JObj[Key])\r\n else\r\n if Key = 'Type' then\r\n SimpleProperty.TypeRef := JToStr(JObj[Key]);\r\n end;\r\nend;\r\n\r\nprocedure TXDataModelDeserializer.ReadStructuredType(\r\n StructuredType: TXDataStructuredType; JObj: TJObject);\r\nbegin\r\n ReadType(StructuredType, JObj);\r\nend;\r\n\r\nprocedure TXDataModelDeserializer.ReadType(XDataType: TXDataType;\r\n JObj: TJObject);\r\nvar\r\n Key: string;\r\n Keys: TStringDynArray;\r\n KeyIndex: Integer;\r\nbegin\r\n ReadBase(XDataType, JObj);\r\n Keys := JObjectKeys(JObj);\r\n for KeyIndex := 0 to Length(Keys) - 1 do\r\n begin\r\n Key := Keys[KeyIndex];\r\n if Key = 'Name' then\r\n XDataType.Name := JToStr(JObj[Key]);\r\n end;\r\nend;\r\n\r\nend.\r\n","unit XData.Web.Connection;\r\n\r\n{$I XData.inc}\r\n{$IF PAS2JS_FULLVERSION >= 20000}\r\n {$DEFINE JSASYNC}\r\n{$ENDIF}\r\n\r\ninterface\r\n\r\nuses\r\n Types, Classes, SysUtils, Web, JS,\r\n XData.Web.Request, XData.Web.Response,\r\n XData.Model.Classes;\r\n\r\ntype\r\n TXDataWebConnection = class;\r\n TXDataWebConnectionDesignData = class;\r\n\r\n// Later refactor this to THttpEngine + THttpClient\r\n THttpResponseProc = reference to procedure(Response: IHttpResponse);\r\n THttpErrorProc = reference to procedure;\r\n THttpRequestProc = reference to procedure(Request: IHttpRequest);\r\n\r\n TXDataWebConnectionRequest = class\r\n strict private\r\n FRequest: IHttpRequest;\r\n FConnection: TXDataWebConnection;\r\n FRequestProc: THttpRequestProc;\r\n FAsync: Boolean;\r\n strict protected\r\n property Connection: TXDataWebConnection read FConnection;\r\n public\r\n constructor Create(AConnection: TXDataWebConnection; ARequest: IHttpRequest); reintroduce;\r\n property Request: IHttpRequest read FRequest;\r\n property RequestProc: THttpRequestProc read FRequestProc write FRequestProc;\r\n property Async: Boolean read FAsync write FAsync;\r\n end;\r\n\r\n TXDataWebConnectionResponse = class\r\n strict private\r\n FRequest: IHttpRequest;\r\n FResponse: IHttpResponse;\r\n FConnection: TXDataWebConnection;\r\n FSuccessProc: THttpResponseProc;\r\n FAsync: Boolean;\r\n strict protected\r\n property Connection: TXDataWebConnection read FConnection;\r\n public\r\n constructor Create(AConnection: TXDataWebConnection; ARequest: IHttpRequest;\r\n AResponse: IHttpResponse); reintroduce;\r\n property Request: IHttpRequest read FRequest;\r\n property Response: IHttpResponse read FResponse write FResponse;\r\n property SuccessProc: THttpResponseProc read FSuccessProc write FSuccessProc;\r\n property Async: Boolean read FAsync write FAsync;\r\n end;\r\n\r\n TXDataWebConnectionError = class\r\n strict private\r\n FResponse: IHttpResponse;\r\n FConnection: TXDataWebConnection;\r\n FErrorMessage: string;\r\n FRequestUrl: string;\r\n strict protected\r\n property Connection: TXDataWebConnection read FConnection;\r\n public\r\n constructor Create(AConnection: TXDataWebConnection; AResponse: IHttpResponse;\r\n ARequestUrl: string; AErrorMessage: string); reintroduce;\r\n property Response: IHttpResponse read FResponse;\r\n property ErrorMessage: string read FErrorMessage;\r\n property RequestUrl: string read FRequestUrl;\r\n end;\r\n\r\n EXDataWebConnectionException = class(Exception)\r\n strict private\r\n FError: TXDataWebConnectionError;\r\n public\r\n constructor Create(AError: TXDataWebConnectionError);\r\n property Error: TXDataWebConnectionError read FError;\r\n end;\r\n\r\n TXDataWebConnectionRequestEvent = procedure(Args: TXDataWebConnectionRequest) of object;\r\n TXDataWebConnectionResponseEvent = procedure(Args: TXDataWebConnectionResponse) of object;\r\n TXDataWebConnectionErrorEvent = procedure(Error: TXDataWebConnectionError) of object;\r\n TXDataWebConnectionErrorProc = reference to procedure(Error: TXDataWebConnectionError);\r\n TXDataWebConnectionConnectProc = reference to procedure;\r\n\r\n TXDataWebConnection = class(TComponent)\r\n private\r\n FURL: string;\r\n FModel: TXDataModel;\r\n FOnConnect: TNotifyEvent;\r\n FStreamedConnected: Boolean;\r\n FOnRequest: TXDataWebConnectionRequestEvent;\r\n FOnResponse: TXDataWebConnectionResponseEvent;\r\n FOnError: TXDataWebConnectionErrorEvent;\r\n FDesignData: TXDataWebConnectionDesignData;\r\n function GetConnected: Boolean;\r\n procedure SetConnected(const Value: Boolean);\r\n function IsDesignDataStored: Boolean;\r\n procedure SetDesignData(const Value: TXDataWebConnectionDesignData);\r\n procedure DoError(Response: IHttpResponse; RequestUrl: string; ErrorMessage: string;\r\n ErrorProc: TXDataWebConnectionErrorProc);\r\n procedure SetURL(const Value: string);\r\n protected\r\n procedure DoConnect(ConnectProc: TXDataWebConnectionConnectProc;\r\n ErrorProc: TXDataWebConnectionErrorProc); virtual;\r\n procedure DoDisconnect; virtual;\r\n public\r\n procedure LoadModel; deprecated;\r\n procedure SendRequest(Request: IHttpRequest; SuccessProc: THttpResponseProc; ErrorProc: THttpErrorProc = nil);\r\n {$IFDEF JSASYNC}\r\n function SendRequestAsync(Request: IHttpRequest): IHttpResponse; async;\r\n {$ENDIF}\r\n function AbsoluteUrl(const RelativeUrl: string): string;\r\n property Model: TXDataModel read FModel;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n destructor Destroy; override;\r\n procedure Open(ConnectProc: TXDataWebConnectionConnectProc = nil; ErrorProc: TXDataWebConnectionErrorProc = nil);\r\n {$IFDEF JSASYNC}\r\n function OpenAsync: JSValue; async;\r\n {$ENDIF}\r\n procedure Close;\r\n procedure Loaded; override;\r\n published\r\n property URL: string read FURL write SetURL;\r\n property DesignData: TXDataWebConnectionDesignData read FDesignData write SetDesignData stored IsDesignDataStored;\r\n property Connected: Boolean read GetConnected write SetConnected default False;\r\n property OnConnect: TNotifyEvent read FOnConnect write FOnConnect;\r\n property OnError: TXDataWebConnectionErrorEvent read FOnError write FOnError;\r\n property OnRequest: TXDataWebConnectionRequestEvent read FOnRequest write FOnRequest;\r\n property OnResponse: TXDataWebConnectionResponseEvent read FOnResponse write FOnResponse;\r\n end;\r\n\r\n TXDataWebConnectionDesignData = class(TPersistent)\r\n private\r\n FHeaders: TStrings;\r\n FPersist: Boolean;\r\n function IsStored: Boolean;\r\n procedure SetHeaders(const Value: TStrings);\r\n public\r\n constructor Create;\r\n destructor Destroy; override;\r\n procedure Assign(Source: TPersistent); override;\r\n published\r\n property Headers: TStrings read FHeaders write SetHeaders stored IsStored;\r\n property Persist: Boolean read FPersist write FPersist stored IsStored;\r\n end;\r\n\r\nimplementation\r\n\r\nuses\r\n Bcl.Utils,\r\n XData.Model.Deserializer;\r\n\r\nprocedure InternalSendRequest(Req: IHttpRequest; SuccessProc: THttpResponseProc;\r\n ErrorProc: THttpErrorProc = nil);\r\nvar\r\n Xhr: TJSXmlHttpRequest;\r\n\r\n procedure XhrLoad;\r\n var\r\n Resp: IHttpResponse;\r\n begin\r\n Resp := TXhrHttpResponse.Create(Xhr);\r\n if Assigned(SuccessProc) then\r\n SuccessProc(Resp);\r\n end;\r\n\r\n procedure XhrError;\r\n begin\r\n if Assigned(ErrorProc) then\r\n ErrorProc();\r\n end;\r\n\r\nvar\r\n HeaderNames: TStringDynArray;\r\n I: Integer;\r\nbegin\r\n Xhr := TJSXMLHttpRequest.new;\r\n Xhr.open(Req.Method, Req.Uri, True);\r\n HeaderNames := Req.Headers.HeaderNames;\r\n for I := 0 to Length(HeaderNames) - 1 do\r\n Xhr.setRequestHeader(HeaderNames[I], Req.Headers.Get(HeaderNames[I]));\r\n\r\n Xhr.addEventListener('load', @XhrLoad);\r\n Xhr.addEventListener('error', @XhrError);\r\n Xhr.addEventListener('timeout', @XhrError);\r\n if Req.Timeout > 0 then\r\n Xhr.timeout := Req.Timeout;\r\n if not Js.IsNull(Req.Content) then\r\n Xhr.send(Req.Content)\r\n else\r\n Xhr.send;\r\nend;\r\n\r\n//{$IFDEF JSASYNC}\r\n//function InternalSendRequestAsync(Req: IHttpRequest): IHttpResponse; async;\r\n//var\r\n// Promise: TJSPromise;\r\n//begin\r\n// Promise := TJSPromise.new(\r\n// procedure(resolve, reject: TJSPromiseResolver)\r\n// begin\r\n// InternalSendRequest(\r\n// Req,\r\n// procedure(Response: IHttpResponse)\r\n// begin\r\n// resolve(Response);\r\n// end,\r\n// procedure\r\n// begin\r\n// reject(Exception.Create('Request error: ' + Req.Uri));\r\n// end\r\n// );\r\n// end\r\n// );\r\n// Exit(Promise);\r\n//end;\r\n//{$ENDIF}\r\n\r\n{ TXDataWebConnection }\r\n\r\nfunction TXDataWebConnection.AbsoluteUrl(const RelativeUrl: string): string;\r\nbegin\r\n Result := TBclUtils.CombineUrlFast(Self.URL, RelativeUrl);\r\nend;\r\n\r\nprocedure TXDataWebConnection.Close;\r\nbegin\r\n SetConnected(False);\r\nend;\r\n\r\nconstructor TXDataWebConnection.Create(AOwner: TComponent);\r\nbegin\r\n inherited Create(AOwner);\r\n FDesignData := TXDataWebConnectionDesignData.Create;\r\nend;\r\n\r\ndestructor TXDataWebConnection.Destroy;\r\nbegin\r\n FDesignData.Free;\r\n FModel.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TXDataWebConnection.DoConnect(ConnectProc: TXDataWebConnectionConnectProc = nil;\r\n ErrorProc: TXDataWebConnectionErrorProc = nil);\r\nvar\r\n ModelUrl: string;\r\n\r\n procedure OnSuccess(Resp: IHttpResponse);\r\n var\r\n LocalModel: TXDataModel;\r\n begin\r\n if Resp.StatusCode = 200 then\r\n begin\r\n LocalModel := TXDataModel.Create;\r\n try\r\n TXDataModelDeserializer.Deserialize(LocalModel, Resp.ContentAsText);\r\n FModel := LocalModel;\r\n except\r\n LocalModel.Free;\r\n raise;\r\n end;\r\n\r\n // Connect callback\r\n if Assigned(ConnectProc) then\r\n ConnectProc()\r\n else\r\n if Assigned(FOnConnect) then\r\n FOnConnect(Self);\r\n end\r\n else\r\n DoError(Resp, ModelUrl,\r\n Format('Error %d. Could not connect retrieve XData model from %s', [Resp.StatusCode, ModelUrl]),\r\n ErrorProc\r\n );\r\n end;\r\n\r\n procedure LocalError;\r\n var\r\n Resp: IHttpResponse;\r\n begin\r\n Resp := TDummyHttpResponse.Create;\r\n DoError(Resp, ModelUrl, 'Error connecting to XData server', ErrorProc);\r\n end;\r\n\r\nvar\r\n Req: IHttpRequest;\r\n I: Integer;\r\nbegin\r\n // DoDisconnect\r\n FModel.Free;\r\n FModel := nil;\r\n\r\n ModelUrl := TBclUtils.CombineUrlFast(Self.URL, '$model');\r\n\r\n Req := THttpRequest.Create(ModelUrl);\r\n for I := 0 to DesignData.Headers.Count - 1 do\r\n if DesignData.Headers.Names[I] <> '' then\r\n Req.Headers.SetValue(DesignData.Headers.Names[I], DesignData.Headers.ValueFromIndex[I]);\r\n\r\n SendRequest(Req, @OnSuccess, @LocalError);\r\nend;\r\n\r\nprocedure TXDataWebConnection.DoDisconnect;\r\nbegin\r\n FModel.Free;\r\n FModel := nil;\r\nend;\r\n\r\nprocedure TXDataWebConnection.DoError(Response: IHttpResponse;\r\n RequestUrl: string; ErrorMessage: string; ErrorProc: TXDataWebConnectionErrorProc);\r\nvar\r\n Error: TXDataWebConnectionError;\r\nbegin\r\n Error := TXDataWebConnectionError.Create(Self, Response, RequestUrl, ErrorMessage);\r\n if Assigned(ErrorProc) then\r\n ErrorProc(Error)\r\n else\r\n if Assigned(FOnError) then\r\n FOnError(Error)\r\n else\r\n raise Exception.Create('XDataConnectionError: ' + ErrorMessage);\r\nend;\r\n\r\nfunction TXDataWebConnection.GetConnected: Boolean;\r\nbegin\r\n Result := Assigned(FModel);\r\nend;\r\n\r\nfunction TXDataWebConnection.IsDesignDataStored: Boolean;\r\nbegin\r\n Result := FDesignData.Persist;\r\nend;\r\n\r\nprocedure TXDataWebConnection.Loaded;\r\nbegin\r\n inherited Loaded;\r\n if FStreamedConnected then SetConnected(True);\r\nend;\r\n\r\nprocedure TXDataWebConnection.LoadModel;\r\nbegin\r\n DoConnect(nil, nil);\r\nend;\r\n\r\nprocedure TXDataWebConnection.Open(ConnectProc: TXDataWebConnectionConnectProc = nil; ErrorProc: TXDataWebConnectionErrorProc = nil);\r\nbegin\r\n if not Connected then\r\n DoConnect(ConnectProc, ErrorProc);\r\nend;\r\n\r\n{$IFDEF JSASYNC}\r\nfunction TXDataWebConnection.OpenAsync: JSValue; async;\r\nbegin\r\n Result := TJSPromise.new(\r\n procedure(resolve, reject: TJSPromiseResolver)\r\n begin\r\n DoConnect(\r\n procedure\r\n begin\r\n if Assigned(FOnConnect) then\r\n FOnConnect(Self);\r\n resolve(nil);\r\n end,\r\n procedure(Error: TXDataWebConnectionError)\r\n begin\r\n reject(EXDataWebConnectionException.Create(Error));\r\n end\r\n );\r\n end\r\n );\r\nend;\r\n{$ENDIF}\r\n\r\nprocedure TXDataWebConnection.SendRequest(Request: IHttpRequest;\r\n SuccessProc: THttpResponseProc; ErrorProc: THttpErrorProc);\r\n\r\n procedure LocalSuccess(Response: IHttpResponse);\r\n var\r\n ResponseArgs: TXDataWebConnectionResponse;\r\n Async: Boolean;\r\n begin\r\n Async := False;\r\n if Assigned(FOnResponse) then\r\n begin\r\n ResponseArgs := TXDataWebConnectionResponse.Create(Self, Request, Response);\r\n try\r\n ResponseArgs.SuccessProc :=\r\n procedure(Response: IHttpResponse)\r\n begin\r\n SuccessProc(Response);\r\n end;\r\n FOnResponse(ResponseArgs);\r\n Async := ResponseArgs.Async;\r\n if not Async then\r\n Response := ResponseArgs.Response;\r\n finally\r\n if not Async then\r\n ResponseArgs.Free;\r\n end;\r\n end;\r\n if not Async then\r\n SuccessProc(Response);\r\n end;\r\n\r\nvar\r\n RequestArgs: TXDataWebConnectionRequest;\r\n Async: Boolean;\r\nbegin\r\n Async := False;\r\n\r\n if Assigned(FOnRequest) then\r\n begin\r\n RequestArgs := TXDataWebConnectionRequest.Create(Self, Request);\r\n try\r\n RequestArgs.RequestProc :=\r\n procedure(Request: IHttpRequest)\r\n begin\r\n InternalSendRequest(Request, @LocalSuccess, ErrorProc);\r\n end;\r\n FOnRequest(RequestArgs);\r\n Async := RequestArgs.Async;\r\n finally\r\n if not Async then\r\n RequestArgs.Free;\r\n end;\r\n end;\r\n if not Async then\r\n InternalSendRequest(Request, @LocalSuccess, ErrorProc);\r\nend;\r\n\r\n{$IFDEF JSASYNC}\r\nfunction TXDataWebConnection.SendRequestAsync(\r\n Request: IHttpRequest): IHttpResponse;\r\nvar\r\n Promise: TJSPromise;\r\nbegin\r\n Promise := TJSPromise.new(\r\n procedure(resolve, reject: TJSPromiseResolver)\r\n begin\r\n SendRequest(\r\n Request,\r\n procedure(Response: IHttpResponse)\r\n begin\r\n resolve(Response);\r\n end,\r\n procedure\r\n begin\r\n reject(Exception.Create('Request error: ' + Request.Uri));\r\n end\r\n );\r\n end\r\n );\r\n Exit(Promise);\r\nend;\r\n{$ENDIF}\r\n\r\nprocedure TXDataWebConnection.SetConnected(const Value: Boolean);\r\nbegin\r\n if (csLoading in ComponentState) and Value then\r\n FStreamedConnected := True else\r\n begin\r\n if Value = GetConnected then Exit;\r\n if Value then\r\n begin\r\n DoConnect(nil, nil);\r\n end else\r\n begin\r\n DoDisconnect;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TXDataWebConnection.SetDesignData(\r\n const Value: TXDataWebConnectionDesignData);\r\nbegin\r\n FDesignData.Assign(Value);\r\nend;\r\n\r\nprocedure TXDataWebConnection.SetURL(const Value: string);\r\nbegin\r\n if FURL <> Value then\r\n begin\r\n FUrl := Value;\r\n DoDisconnect;\r\n end;\r\nend;\r\n\r\n{ TXDataWebConnectionRequest }\r\n\r\nconstructor TXDataWebConnectionRequest.Create(AConnection: TXDataWebConnection;\r\n ARequest: IHttpRequest);\r\nbegin\r\n FConnection := AConnection;\r\n FRequest := ARequest;\r\nend;\r\n\r\n{ TXDataWebConnectionError }\r\n\r\nconstructor TXDataWebConnectionError.Create(AConnection: TXDataWebConnection;\r\n AResponse: IHttpResponse; ARequestUrl: string; AErrorMessage: string);\r\nbegin\r\n FConnection := AConnection;\r\n FResponse := AResponse;\r\n FErrorMessage := AErrorMessage;\r\n FRequestUrl := ARequestUrl;\r\nend;\r\n\r\n{ TXDataWebConnectionDesignData }\r\n\r\nprocedure TXDataWebConnectionDesignData.Assign(Source: TPersistent);\r\nbegin\r\n if Source is TXDataWebConnectionDesignData then\r\n begin\r\n Persist := TXDataWebConnectionDesignData(Source).Persist;\r\n Headers := TXDataWebConnectionDesignData(Source).Headers;\r\n end\r\n else\r\n inherited Assign(Source);\r\nend;\r\n\r\nconstructor TXDataWebConnectionDesignData.Create;\r\nbegin\r\n inherited Create;\r\n FHeaders := TStringList.Create;\r\nend;\r\n\r\ndestructor TXDataWebConnectionDesignData.Destroy;\r\nbegin\r\n FHeaders.Free;\r\n inherited;\r\nend;\r\n\r\nfunction TXDataWebConnectionDesignData.IsStored: Boolean;\r\nbegin\r\n Result := FPersist;\r\nend;\r\n\r\nprocedure TXDataWebConnectionDesignData.SetHeaders(const Value: TStrings);\r\nbegin\r\n FHeaders.Assign(Value);\r\nend;\r\n\r\n{ TXDataWebConnectionResponse }\r\n\r\nconstructor TXDataWebConnectionResponse.Create(AConnection: TXDataWebConnection;\r\n ARequest: IHttpRequest; AResponse: IHttpResponse);\r\nbegin\r\n FConnection := AConnection;\r\n FRequest := ARequest;\r\n FResponse := AResponse;\r\nend;\r\n\r\n{ EXDataWebConnectionException }\r\n\r\nconstructor EXDataWebConnectionException.Create(\r\n AError: TXDataWebConnectionError);\r\nbegin\r\n FError := AError;\r\n inherited CreateFmt('Error connecting to %s', [AError.RequestUrl]);\r\nend;\r\n\r\nend.\r\n","unit XData.Bind.Converter;\r\n\r\ninterface\r\n\r\nuses\r\n TypInfo, SysUtils,\r\n XData.Model.Classes;\r\n\r\nfunction BindValueToUrl(const Value: JSValue; const Info: TTypeInfo;\r\n UrlConverter: TXDataTypeConverter): string;\r\n\r\nimplementation\r\n\r\nfunction BindValueToUrl(const Value: JSValue; const Info: TTypeInfo;\r\n UrlConverter: TXDataTypeConverter): string;\r\nbegin\r\n Result := UrlConverter.ValueToUrl(Value, nil);\r\nend;\r\n\r\nend.\r\n","unit XData.Web.Client;\r\n\r\n{$I XData.inc}\r\n{$SCOPEDENUMS OFF} // to keep backward compatibility\r\n{$IF PAS2JS_FULLVERSION >= 20000}\r\n {$DEFINE JSASYNC}\r\n{$ENDIF}\r\n\r\ninterface\r\n\r\nuses\r\n JS, SysUtils, Classes, Types,\r\n Bcl.Rtti.Common,\r\n Bcl.Json.Common,\r\n XData.Model.Classes,\r\n XData.Web.Connection,\r\n XData.Web.Request,\r\n XData.Web.Response;\r\n\r\ntype\r\n TXDataWebClient = class;\r\n TXDataClientRequestType = (rtGet, rtList, rtPut, rtPost, rtDelete, rtRawInvoke);\r\n\r\n TXDataClientResponse = class\r\n strict private\r\n FResponse: IHttpResponse;\r\n FRequestType: TXDataClientRequestType;\r\n FResult: JSValue;\r\n FRequestId: string;\r\n FCount: Integer;\r\n FClient: TXDataWebClient;\r\n function GetResponseText: string;\r\n function GetStatusCode: Integer;\r\n strict private\r\n function GetResultAsArray: TJSArray;\r\n function GetResultAsObject: TJSObject; protected\r\n property RequestType: TXDataClientRequestType read FRequestType;\r\n public\r\n constructor Create(AClient: TXDataWebClient; AResponse: IHttpResponse; AResult: JSValue;\r\n ARequestType: TXDataClientRequestType; ARequestId: string; ACount: Integer = 0); reintroduce;\r\n property StatusCode: Integer read GetStatusCode;\r\n property ResponseText: string read GetResponseText;\r\n property Result: JSValue read FResult;\r\n property ResultAsObject: TJSObject read GetResultAsObject;\r\n property ResultAsArray: TJSArray read GetResultAsArray;\r\n property RequestId: string read FRequestId;\r\n property Count: Integer read FCount;\r\n property Client: TXDataWebClient read FClient;\r\n property Response: IHttpResponse read FResponse;\r\n end;\r\n\r\n TXDataClientRequest = class\r\n strict private\r\n FRequest: IHttpRequest;\r\n FRequestType: TXDataClientRequestType;\r\n FRequestId: string;\r\n FClient: TXDataWebClient;\r\n strict protected\r\n property RequestType: TXDataClientRequestType read FRequestType;\r\n public\r\n constructor Create(AClient: TXDataWebClient; ARequest: IHttpRequest;\r\n ARequestType: TXDataClientRequestType; ARequestId: string); reintroduce;\r\n property RequestId: string read FRequestId;\r\n property Client: TXDataWebClient read FClient;\r\n property Request: IHttpRequest read FRequest;\r\n end;\r\n\r\n TXDataClientError = class\r\n private\r\n FResponse: IHttpResponse;\r\n FRequestId: string;\r\n FErrorCode: string;\r\n FErrorMessage: string;\r\n FRequestUrl: string;\r\n FClient: TXDataWebClient;\r\n function GetStatusCode: Integer;\r\n public\r\n constructor Create(AClient: TXDataWebClient; AResponse: IHttpResponse;\r\n const ARequestUrl, AErrorCode, AErrorMessage, ARequestId: string); reintroduce;\r\n property StatusCode: Integer read GetStatusCode;\r\n property RequestUrl: string read FRequestUrl;\r\n property RequestId: string read FRequestId;\r\n property ErrorCode: string read FErrorCode;\r\n property ErrorMessage: string read FErrorMessage;\r\n property Client: TXDataWebClient read FClient;\r\n property Response: IHttpResponse read FResponse;\r\n end;\r\n\r\n TXDataClientLoadEvent = procedure(Response: TXDataClientResponse) of object;\r\n TXDataClientLoadProc = reference to procedure(Response: TXDataClientResponse);\r\n TXDataClientErrorEvent = procedure(Error: TXDataClientError) of object;\r\n TXDataClientErrorProc = reference to procedure(Error: TXDataClientError);\r\n TXDataClientRequestEvent = procedure(Request: TXDataClientRequest) of object;\r\n THttpResponseProc = reference to procedure(Response: IHttpResponse);\r\n\r\n TReferenceSolvingMode = (rsAll, rsNone);\r\n\r\n TXDataWebClient = class(TComponent)\r\n strict private\r\n FOnLoad: TXDataClientLoadEvent;\r\n FOnError: TXDataClientErrorEvent;\r\n FOnRequest: TXDataClientRequestEvent;\r\n// FMaxEagerFetchDepth: integer;\r\n FConnection: TXDataWebConnection;\r\n FReferenceSolvingMode: TReferenceSolvingMode;\r\n function EntityTypeFromEntitySet(const EntitySetName: string): TXDataEntityType;\r\n procedure SetConnection(const Value: TXDataWebConnection);\r\n function Model: TXDataModel;\r\n function Url: string;\r\n procedure CheckConnection;\r\n procedure ParseError(Response: IHttpResponse; var ErrorCode, ErrorMessage: string);\r\n procedure SolveReferences(json: JSValue);\r\n// procedure SetIdFromResponse(Entity: TObject; Req: THttpRequest; Resp: THttpResponse);\r\n private\r\n { callback functions to build canonical url's }\r\n procedure DoLoad(Response: TXDataClientResponse; SuccessProc: TXDataClientLoadProc; AsyncMode: Boolean);\r\n procedure DoError(Response: IHttpResponse; RequestUrl, RequestId: string;\r\n ErrorMessage: string; ErrorProc: TXDataClientErrorProc; AsyncMode: Boolean);\r\n function RequestUrl(const RelativeUrl: string): string;\r\n function GetNavPropValue(Entity: JSValue; Prop: TXDataNavigationProperty): JSValue;\r\n function GetPropValue(Entity: JSValue; Prop: TXDataSimpleProperty): JSValue;\r\n private\r\n procedure InternalGet(const EntitySet, QueryString: string; Id: JSValue; const RequestId: string;\r\n SuccessProc: TXDataClientLoadProc; ErrorProc: TXDataClientErrorProc; AsyncMode: Boolean = False);\r\n procedure InternalPut(const EntitySet: string; Entity: TJObject; const RequestId: string;\r\n SuccessProc: TXDataClientLoadProc; ErrorProc: TXDataClientErrorProc; AsyncMode: Boolean = False);\r\n procedure InternalPost(const EntitySet: string; Entity: TJObject; const RequestId: string;\r\n SuccessProc: TXDataClientLoadProc; ErrorProc: TXDataClientErrorProc; AsyncMode: Boolean = False);\r\n procedure InternalDelete(const EntitySet: string; Entity: TJObject; const RequestId: string;\r\n SuccessProc: TXDataClientLoadProc; ErrorProc: TXDataClientErrorProc; AsyncMode: Boolean = False);\r\n procedure InternalList(const EntitySet: string; const Query: string; const RequestId: string;\r\n SuccessProc: TXDataClientLoadProc; ErrorProc: TXDataClientErrorProc; AsyncMode: Boolean = False);\r\n procedure InternalRawInvoke(const OperationId: string; Args: array of JSValue;\r\n RequestId: string; SuccessProc: TXDataClientLoadProc; ErrorProc: TXDataClientErrorProc; AsyncMode: Boolean = False);\r\n protected\r\n procedure DoRequest(Request: TXDataClientRequest);\r\n procedure Send(Req: IHttpRequest; SuccessProc: THttpResponseProc; ErrorProc: THttpErrorProc);\r\n procedure Notification(AComponent: TComponent; Operation: TOperation); override;\r\n public\r\n procedure Get(const EntitySet: string; Id: JSValue; const RequestId: string = 'get'); overload;\r\n procedure Get(const EntitySet: string; Id: JSValue; SuccessProc: TXDataClientLoadProc; ErrorProc: TXDataClientErrorProc = nil); overload;\r\n procedure Get(const EntitySet, QueryString: string; Id: JSValue; const RequestId: string = 'get'); overload;\r\n procedure Get(const EntitySet, QueryString: string; Id: JSValue; SuccessProc: TXDataClientLoadProc; ErrorProc: TXDataClientErrorProc = nil); overload;\r\n {$IFDEF JSASYNC}\r\n function GetAsync(const EntitySet, QueryString: string; Id: JSValue): TXDataClientResponse; async; overload;\r\n function GetAsync(const EntitySet: string; Id: JSValue): TXDataClientResponse; async; overload;\r\n {$ENDIF}\r\n\r\n procedure Put(const EntitySet: string; Entity: TJObject; const RequestId: string = 'put'); overload;\r\n procedure Put(const EntitySet: string; Entity: TJObject; SuccessProc: TXDataClientLoadProc; ErrorProc: TXDataClientErrorProc = nil); overload;\r\n {$IFDEF JSASYNC}\r\n function PutAsync(const EntitySet: string; Entity: TJObject): TXDataClientResponse; async;\r\n {$ENDIF}\r\n\r\n procedure Post(const EntitySet: string; Entity: TJObject; const RequestId: string = 'post'); overload;\r\n procedure Post(const EntitySet: string; Entity: TJObject; SuccessProc: TXDataClientLoadProc; ErrorProc: TXDataClientErrorProc = nil); overload;\r\n {$IFDEF JSASYNC}\r\n function PostAsync(const EntitySet: string; Entity: TJObject): TXDataClientResponse; async;\r\n {$ENDIF}\r\n\r\n procedure Delete(const EntitySet: string; Entity: TJObject; const RequestId: string = 'delete'); overload;\r\n procedure Delete(const EntitySet: string; Entity: TJObject; SuccessProc: TXDataClientLoadProc; ErrorProc: TXDataClientErrorProc = nil); overload;\r\n {$IFDEF JSASYNC}\r\n function DeleteAsync(const EntitySet: string; Entity: TJObject): TXDataClientResponse; async;\r\n {$ENDIF}\r\n\r\n procedure List(const EntitySet: string; const Query: string = ''; const RequestId: string = 'list'); overload;\r\n procedure List(const EntitySet: string; const Query: string; SuccessProc: TXDataClientLoadProc; ErrorProc: TXDataClientErrorProc = nil); overload;\r\n {$IFDEF JSASYNC}\r\n function ListAsync(const EntitySet: string; const Query: string = ''): TXDataClientResponse; async;\r\n {$ENDIF}\r\n\r\n procedure RawInvoke(const OperationId: string; Args: array of JSValue; RequestId: string = ''); overload;\r\n procedure RawInvoke(const OperationId: string; Args: array of JSValue; SuccessProc: TXDataClientLoadProc; ErrorProc: TXDataClientErrorProc = nil); overload;\r\n {$IFDEF JSASYNC}\r\n function RawInvokeAsync(const OperationId: string; Args: array of JSValue): TXDataClientResponse; async;\r\n {$ENDIF}\r\n\r\n// function Count(Clazz: TClass; const Query: string = ''): Integer;\r\n// function Service: T;\r\n published\r\n property Connection: TXDataWebConnection read FConnection write SetConnection;\r\n property OnLoad: TXDataClientLoadEvent read FOnLoad write FOnLoad;\r\n property OnError: TXDataClientErrorEvent read FOnError write FOnError;\r\n property OnRequest: TXDataClientRequestEvent read FOnRequest write FOnRequest;\r\n property ReferenceSolvingMode: TReferenceSolvingMode read FReferenceSolvingMode write FReferenceSolvingMode default rsAll;\r\n end;\r\n\r\n TXDataWebInvoker = class\r\n strict private\r\n FClient: TXDataWebClient;\r\n FAction: TXDataAction;\r\n FRequestId: string;\r\n FSuccessProc: TXDataClientLoadProc;\r\n FErrorProc: TXDataClientErrorProc;\r\n FAsyncMode: Boolean;\r\n protected\r\n procedure DoLoad(Response: TXDataClientResponse);\r\n procedure DoError(Response: IHttpResponse; RequestUrl, RequestId: string;\r\n ErrorMessage: string);\r\n property Action: TXDataAction read FAction;\r\n property RequestId: string read FRequestId write FRequestId;\r\n strict private\r\n function CreateHttpRequest: IHttpRequest;\r\n function RequestUrl(const RelativeUrl: string): string;\r\n strict private\r\n function BuildQueryString(Args: array of JSValue): string;\r\n function GetPathParamValues(Args: array of JSValue): TStringDynArray;\r\n function BuildUrlRoute(Args: array of JSValue): string;\r\n procedure SetParamStreamBody(Req: IHttpRequest; const Args: array of JSValue; ArgIndex: Integer);\r\n procedure SetJsonParamsBody(Req: IHttpRequest; const Args: array of JSValue);\r\n procedure SetJsonObjectBody(Req: IHttpRequest; const Args: array of JSValue);\r\n procedure TransformParam(Param: TXDataParamDef; var Value: JSValue);\r\n public\r\n constructor Create(AClient: TXDataWebClient; AAction: TXDataAction;\r\n ASuccessProc: TXDataClientLoadProc; AErrorProc: TXDataClientErrorProc;\r\n AAsyncMode: Boolean); reintroduce;\r\n procedure Execute(const Args: array of JSValue);\r\n end;\r\n\r\n EXDataClientException = class(Exception)\r\n end;\r\n\r\n EXDataClientRequestException = class(EXDataClientException)\r\n private\r\n FErrorResult: TXDataClientError;\r\n public\r\n constructor Create(AClientError: TXDataClientError); reintroduce;\r\n property ErrorResult: TXDataClientError read FErrorResult;\r\n end;\r\n\r\n EXDataOperationRequestException = class(EXDataClientRequestException)\r\n end;\r\n\r\n EXDataWrongParameterCount = class(EXDataClientException)\r\n public\r\n constructor Create(Action: TXDataAction; PassedParameters: integer); reintroduce;\r\n end;\r\n\r\n EXDataWrongRouteParams = class(EXDataClientException)\r\n public\r\n constructor Create(Action: TXDataAction);\r\n end;\r\n\r\nimplementation\r\n\r\nuses\r\n Bcl.Utils,\r\n XData.Bind.Converter,\r\n XData.Utils;\r\n\r\n{ TXDataWebClient }\r\n\r\nprocedure TXDataWebClient.CheckConnection;\r\nbegin\r\n if not Assigned(FConnection) then\r\n raise EXDataClientException.Create('Missing XData Connection');\r\nend;\r\n\r\nprocedure TXDataWebClient.Delete(const EntitySet: string; Entity: TJObject;\r\n const RequestId: string = 'delete');\r\nbegin\r\n InternalDelete(EntitySet, Entity, RequestId, nil, nil);\r\nend;\r\n\r\nprocedure TXDataWebClient.Delete(const EntitySet: string; Entity: TJObject;\r\n SuccessProc: TXDataClientLoadProc; ErrorProc: TXDataClientErrorProc);\r\nbegin\r\n InternalDelete(EntitySet, Entity, 'delete', SuccessProc, ErrorProc);\r\nend;\r\n\r\n{$IFDEF JSASYNC}\r\nfunction TXDataWebClient.DeleteAsync(const EntitySet: string; Entity: TJObject): TXDataClientResponse;\r\nvar\r\n Promise: TJSPromise;\r\nbegin\r\n Promise := TJSPromise.new(\r\n procedure(resolve, reject: TJSPromiseResolver)\r\n begin\r\n InternalDelete(EntitySet, Entity, 'delete',\r\n procedure(Response: TXDataClientResponse)\r\n begin\r\n resolve(Response);\r\n end,\r\n procedure(Error: TXDataClientError)\r\n begin\r\n reject(EXDataClientRequestException.Create(Error));\r\n end,\r\n True\r\n );\r\n end\r\n );\r\n Exit(Promise);\r\nend;\r\n{$ENDIF}\r\n\r\nprocedure TXDataWebClient.DoError(Response: IHttpResponse; RequestUrl, RequestId: string;\r\n ErrorMessage: string; ErrorProc: TXDataClientErrorProc; AsyncMode: Boolean);\r\nvar\r\n ErrorCode: string;\r\n ClientError: TXDataClientError;\r\nbegin\r\n if Response = nil then\r\n Response := TDummyHttpResponse.Create;\r\n\r\n ErrorCode := '';\r\n if ErrorMessage = '' then\r\n ParseError(Response, ErrorCode, ErrorMessage);\r\n ClientError := TXDataClientError.Create(Self, Response, RequestUrl, ErrorCode, ErrorMessage, RequestId);\r\n\r\n if AsyncMode then\r\n begin\r\n if Assigned(FOnError) then\r\n FOnError(ClientError);\r\n if Assigned(ErrorProc) then\r\n ErrorProc(ClientError)\r\n else\r\n raise EXDataClientRequestException.Create(ClientError);\r\n end\r\n else\r\n begin\r\n if Assigned(ErrorProc) then\r\n begin\r\n ErrorProc(ClientError);\r\n Exit;\r\n end;\r\n\r\n if Assigned(FOnError) then\r\n FOnError(ClientError)\r\n else\r\n raise EXDataClientRequestException.Create(ClientError);\r\n end;\r\nend;\r\n\r\nprocedure TXDataWebClient.DoLoad(Response: TXDataClientResponse;\r\n SuccessProc: TXDataClientLoadProc; AsyncMode: Boolean);\r\nbegin\r\n try\r\n case ReferenceSolvingMode of\r\n rsAll: SolveReferences(Response.Result);\r\n end;\r\n\r\n if AsyncMode then\r\n begin\r\n if Assigned(FOnLoad) then\r\n FOnLoad(Response);\r\n if Assigned(SuccessProc) then\r\n SuccessProc(Response);\r\n end\r\n else\r\n begin\r\n if Assigned(SuccessProc) then\r\n begin\r\n SuccessProc(Response);\r\n Exit;\r\n end;\r\n if Assigned(FOnLoad) then\r\n FOnLoad(Response);\r\n end;\r\n finally\r\n if not AsyncMode then\r\n Response.Free;\r\n end;\r\nend;\r\n\r\nprocedure TXDataWebClient.DoRequest(Request: TXDataClientRequest);\r\nbegin\r\n try\r\n if Assigned(FOnRequest) then\r\n FOnRequest(Request);\r\n finally\r\n Request.Free;\r\n end;\r\nend;\r\n\r\nfunction TXDataWebClient.EntityTypeFromEntitySet(\r\n const EntitySetName: string): TXDataEntityType;\r\nbegin\r\n Result := nil;\r\n Result := Model.GetEntitySet(EntitySetName).EntityType;\r\n\r\n if Result = nil then\r\n raise EXDataClientException.CreateFmt('Invalid entity set \"%s\"', [EntitySetName]);\r\nend;\r\n\r\nprocedure TXDataWebClient.Get(const EntitySet: string; Id: JSValue;\r\n const RequestId: string = 'get');\r\nbegin\r\n Get(EntitySet, '', id, RequestId);\r\nend;\r\n\r\nprocedure TXDataWebClient.Get(const EntitySet, QueryString: string; Id: JSValue;\r\n const RequestId: string);\r\nbegin\r\n InternalGet(EntitySet, QueryString, Id, RequestId, nil, nil);\r\nend;\r\n\r\nprocedure TXDataWebClient.Get(const EntitySet: string; Id: JSValue;\r\n SuccessProc: TXDataClientLoadProc; ErrorProc: TXDataClientErrorProc);\r\nbegin\r\n InternalGet(EntitySet, '', Id, 'get', SuccessProc, ErrorProc);\r\nend;\r\n\r\nfunction TXDataWebClient.GetNavPropValue(Entity: JSValue;\r\n Prop: TXDataNavigationProperty): JSValue;\r\nbegin\r\n Result := TJSObject(Entity)[Prop.Name];\r\nend;\r\n\r\nfunction TXDataWebClient.GetPropValue(Entity: JSValue;\r\n Prop: TXDataSimpleProperty): JSValue;\r\nbegin\r\n Result := TJSObject(Entity)[Prop.Name];\r\nend;\r\n\r\nprocedure TXDataWebClient.InternalDelete(const EntitySet: string;\r\n Entity: TJObject; const RequestId: string; SuccessProc: TXDataClientLoadProc;\r\n ErrorProc: TXDataClientErrorProc; AsyncMode: Boolean = False);\r\nvar\r\n Req: IHttpRequest;\r\n RequestUri: string;\r\n\r\n procedure LocalSuccess(Resp: IHttpResponse);\r\n begin\r\n if Resp.StatusCode = 204 then\r\n DoLoad(TXDataClientResponse.Create(Self, Resp, JS.NULL, rtDelete, RequestId), SuccessProc, AsyncMode)\r\n else\r\n DoError(Resp, RequestUri, RequestId, '', ErrorProc, AsyncMode);\r\n end;\r\n\r\n procedure LocalError;\r\n begin\r\n DoError(nil, RequestUri, RequestId, '', ErrorProc, AsyncMode);\r\n end;\r\n\r\nbegin\r\n RequestUri := RequestUrl(TBclUtils.PercentEncode(\r\n Model.CanonicalUrlFromEntity(EntityTypeFromEntitySet(EntitySet), Entity,\r\n @GetPropValue, @GetNavPropValue)));\r\n\r\n Req := THttpRequest.Create(RequestUri, 'DELETE');\r\n DoRequest(TXDataClientRequest.Create(Self, Req, rtDelete, RequestId));\r\n Send(Req, @LocalSuccess, @LocalError);\r\nend;\r\n\r\nprocedure TXDataWebClient.InternalGet(const EntitySet, QueryString: string;\r\n Id: JSValue; const RequestId: string; SuccessProc: TXDataClientLoadProc;\r\n ErrorProc: TXDataClientErrorProc; AsyncMode: Boolean = False);\r\nvar\r\n RequestUri: string;\r\n\r\n procedure LocalSuccess(Resp: IHttpResponse);\r\n var\r\n JsonResult: JSValue;\r\n begin\r\n if Resp.StatusCode = 200 then\r\n begin\r\n JsonResult := TJSJSON.parse(Resp.ContentAsText);\r\n if isObject(JsonResult) then\r\n DoLoad(TXDataClientResponse.Create(Self, Resp, JsonResult, rtGet, RequestId), SuccessProc, AsyncMode)\r\n else\r\n DoError(Resp, RequestUri, RequestId, 'Invalid JSON object from GET request', ErrorProc, AsyncMode);\r\n end\r\n else\r\n if Resp.StatusCode = 404 then\r\n DoLoad(TXDataClientResponse.Create(Self, Resp, JS.NULL, rtGet, RequestId), SuccessProc, AsyncMode)\r\n else\r\n DoError(Resp, RequestUri, RequestId, '', ErrorProc, AsyncMode);\r\n end;\r\n\r\n procedure LocalError;\r\n begin\r\n DoError(nil, RequestUri, RequestId, '', ErrorProc, AsyncMode);\r\n end;\r\n\r\nvar\r\n Req: IHttpRequest;\r\nbegin\r\n RequestUri := RequestUrl(TBclUtils.PercentEncode(\r\n Model.CanonicalUrlFromId(EntityTypeFromEntitySet(EntitySet), Id)));\r\n if QueryString <> '' then\r\n RequestUri := RequestUri + '?' + QueryString;\r\n\r\n Req := THttpRequest.Create(RequestUri);\r\n DoRequest(TXDataClientRequest.Create(Self, Req, rtGet, RequestId));\r\n Send(Req, @LocalSuccess, @LocalError);\r\nend;\r\n\r\nprocedure TXDataWebClient.InternalList(const EntitySet, Query,\r\n RequestId: string; SuccessProc: TXDataClientLoadProc;\r\n ErrorProc: TXDataClientErrorProc; AsyncMode: Boolean);\r\nvar\r\n RequestUri: string;\r\n\r\n procedure LocalSuccess(Resp: IHttpResponse);\r\n var\r\n JsonResult: JSValue;\r\n ObjResult: TJSObject;\r\n Count: Integer;\r\n begin\r\n if Resp.StatusCode = 200 then\r\n begin\r\n JsonResult := TJSJSON.parse(Resp.ContentAsText);\r\n if isObject(JsonResult) and isArray(TJSObject(JsonResult)['value']) then\r\n begin\r\n ObjResult := TJSObject(JsonResult);\r\n if ObjResult.hasOwnProperty('@xdata.count') then\r\n Count := Integer(ObjResult['@xdata.count'])\r\n else\r\n Count := 0;\r\n DoLoad(TXDataClientResponse.Create(Self, Resp, ObjResult['value'], rtList, RequestId, Count), SuccessProc, AsyncMode);\r\n end\r\n else\r\n DoError(Resp, RequestUri, RequestId, 'Invalid JSON array from LIST request', ErrorProc, AsyncMode);\r\n end\r\n else\r\n DoError(Resp, RequestUri, RequestId, '', ErrorProc, AsyncMode);\r\n end;\r\n\r\n procedure LocalError;\r\n begin\r\n DoError(nil, RequestUri, RequestId, '', ErrorProc, AsyncMode);\r\n end;\r\n\r\nvar\r\n Req: IHttpRequest;\r\nbegin\r\n RequestUri := RequestUrl(TBclUtils.PercentEncode(\r\n Model.EntitySetUrl(Model.GetEntitySet(EntitySet))));\r\n if Query <> '' then\r\n RequestUri := RequestUri + '?' + Query;\r\n\r\n Req := THttpRequest.Create(RequestUri);\r\n DoRequest(TXDataClientRequest.Create(Self, Req, rtList, RequestId));\r\n Send(Req, @LocalSuccess, @LocalError);\r\nend;\r\n\r\nprocedure TXDataWebClient.InternalPost(const EntitySet: string;\r\n Entity: TJObject; const RequestId: string; SuccessProc: TXDataClientLoadProc;\r\n ErrorProc: TXDataClientErrorProc; AsyncMode: Boolean = False);\r\nvar\r\n RequestUri: string;\r\n\r\n procedure LocalSuccess(Resp: IHttpResponse);\r\n var\r\n Value: JSValue;\r\n Obj: TJSObject;\r\n EntityType: TXDataEntityType;\r\n I: Integer;\r\n Prop: string;\r\n begin\r\n // SetIdFromResponse\r\n if Resp.StatusCode = 201 then\r\n begin\r\n // Get the resulted object and set the id from the result\r\n Value := TJSJSON.parse(Resp.ContentAsText);\r\n if IsObject(Value) then\r\n begin\r\n Obj := ToObject(Value);\r\n EntityType := EntityTypeFromEntitySet(EntitySet);\r\n for I := 0 to EntityType.Key.Count - 1 do\r\n begin\r\n Prop := EntityType.Key[I].Name;\r\n if not IsNull(Obj[Prop]) then\r\n Entity[Prop] := Obj[Prop];\r\n end;\r\n end;\r\n\r\n DoLoad(TXDataClientResponse.Create(Self, Resp, TJSJSON.parse(Resp.ContentAsText), rtPost, RequestId), SuccessProc, AsyncMode);\r\n end\r\n else\r\n DoError(Resp, RequestUri, RequestId, '', ErrorProc, AsyncMode);\r\n end;\r\n\r\n procedure LocalError;\r\n begin\r\n DoError(nil, RequestUri, RequestId, '', ErrorProc, AsyncMode);\r\n end;\r\n\r\nvar\r\n Req: IHttpRequest;\r\nbegin\r\n RequestUri := RequestUrl(TBclUtils.PercentEncode(\r\n Model.EntitySetUrl(Model.GetEntitySet(EntitySet))\r\n ));\r\n\r\n Req := THttpRequest.Create(RequestUri, 'POST');\r\n Req.Headers.SetValue('content-type', 'application/json');\r\n Req.Content := TJSJson.stringify(Entity);\r\n DoRequest(TXDataClientRequest.Create(Self, Req, rtPost, RequestId));\r\n Send(Req, @LocalSuccess, @LocalError);\r\nend;\r\n\r\nprocedure TXDataWebClient.InternalPut(const EntitySet: string; Entity: TJObject;\r\n const RequestId: string; SuccessProc: TXDataClientLoadProc;\r\n ErrorProc: TXDataClientErrorProc; AsyncMode: Boolean = False);\r\nvar\r\n RequestUri: string;\r\n\r\n procedure LocalSuccess(Resp: IHttpResponse);\r\n begin\r\n if Resp.StatusCode = 200 then\r\n DoLoad(TXDataClientResponse.Create(Self, Resp, JS.NULL, rtPut, RequestId), SuccessProc, AsyncMode)\r\n else\r\n DoError(Resp, RequestUri, RequestId, '', ErrorProc, AsyncMode);\r\n end;\r\n\r\n procedure LocalError;\r\n begin\r\n DoError(nil, RequestUri, RequestId, '', ErrorProc, AsyncMode);\r\n end;\r\n\r\nvar\r\n Req: IHttpRequest;\r\nbegin\r\n RequestUri := RequestUrl(TBclUtils.PercentEncode(\r\n Model.CanonicalUrlFromEntity(EntityTypeFromEntitySet(EntitySet), Entity,\r\n @GetPropValue, @GetNavPropValue)));\r\n\r\n Req := THttpRequest.Create(RequestUri, 'PUT');\r\n Req.Headers.SetValue('content-type', 'application/json');\r\n Req.Content := TJSJson.stringify(Entity);\r\n DoRequest(TXDataClientRequest.Create(Self, Req, rtPut, RequestId));\r\n Send(Req, @LocalSuccess, @LocalError);\r\nend;\r\n\r\nprocedure TXDataWebClient.InternalRawInvoke(const OperationId: string;\r\n Args: array of JSValue; RequestId: string; SuccessProc: TXDataClientLoadProc;\r\n ErrorProc: TXDataClientErrorProc; AsyncMode: Boolean = False);\r\nvar\r\n Invoker: TXDataWebInvoker;\r\n Action: TXDataAction;\r\nbegin\r\n if RequestId = '' then\r\n RequestId := OperationId;\r\n\r\n Action := Model.FindActionByOperationId(OperationId);\r\n if Action = nil then\r\n raise EXDataClientException.CreateFmt('Operation \"%s\" not found', [OperationId]);\r\n\r\n Invoker := TXDataWebInvoker.Create(Self, Action, SuccessProc, ErrorProc, AsyncMode);\r\n Invoker.RequestId := RequestId;\r\n Invoker.Execute(Args);\r\nend;\r\n\r\nprocedure TXDataWebClient.List(const EntitySet, Query: string;\r\n SuccessProc: TXDataClientLoadProc; ErrorProc: TXDataClientErrorProc);\r\nbegin\r\n InternalList(EntitySet, Query, 'list', SuccessProc, ErrorProc);\r\nend;\r\n\r\nprocedure TXDataWebClient.List(const EntitySet, Query: string; const RequestId: string = 'list');\r\nbegin\r\n InternalList(EntitySet, Query, RequestId, nil, nil);\r\nend;\r\n\r\n{$IFDEF JSASYNC}\r\nfunction TXDataWebClient.ListAsync(const EntitySet: string; const Query: string = ''): TXDataClientResponse;\r\nvar\r\n Promise: TJSPromise;\r\nbegin\r\n Promise := TJSPromise.new(\r\n procedure(resolve, reject: TJSPromiseResolver)\r\n begin\r\n InternalList(EntitySet, Query, 'list',\r\n procedure(Response: TXDataClientResponse)\r\n begin\r\n resolve(Response);\r\n end,\r\n procedure(Error: TXDataClientError)\r\n begin\r\n reject(EXDataClientRequestException.Create(Error));\r\n end,\r\n True\r\n );\r\n end\r\n );\r\n Exit(Promise);\r\nend;\r\n{$ENDIF}\r\n\r\nfunction TXDataWebClient.Model: TXDataModel;\r\nbegin\r\n CheckConnection;\r\n if not Assigned(Connection.Model) then\r\n raise EXDataClientException.Create('TXDataWebConnection is not connected');\r\n Result := Connection.Model;\r\nend;\r\n\r\nprocedure TXDataWebClient.Notification(AComponent: TComponent;\r\n Operation: TOperation);\r\nbegin\r\n inherited;\r\n if (Operation = opRemove) and (AComponent = FConnection) then\r\n Connection := nil;\r\nend;\r\n\r\nprocedure TXDataWebClient.ParseError(Response: IHttpResponse; var ErrorCode,\r\n ErrorMessage: string);\r\nvar\r\n ErrorResult: JSValue;\r\n ErrorObject: TJSObject;\r\nbegin\r\n ErrorCode := '';\r\n ErrorMessage := Response.StatusReason;\r\n if SameText(Response.Headers.Get('content-type'), 'application/json') then\r\n begin\r\n ErrorResult := JS.Null;\r\n try\r\n ErrorResult := TJSJson.parse(Response.ContentAsText);\r\n except\r\n end;\r\n if IsObject(ErrorResult) and IsObject(TJSObject(ErrorResult)['error']) then\r\n begin\r\n ErrorObject := TJSObject(TJSObject(ErrorResult)['error']);\r\n ErrorCode := JS.ToString(ErrorObject['code']);\r\n ErrorMessage := JS.ToString(ErrorObject['message']);\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TXDataWebClient.Post(const EntitySet: string; Entity: TJObject;\r\n SuccessProc: TXDataClientLoadProc; ErrorProc: TXDataClientErrorProc);\r\nbegin\r\n InternalPost(EntitySet, Entity, 'post', SuccessProc, ErrorProc);\r\nend;\r\n\r\nprocedure TXDataWebClient.Post(const EntitySet: string; Entity: TJObject;\r\n const RequestId: string = 'post');\r\nbegin\r\n InternalPost(EntitySet, Entity, RequestId, nil, nil);\r\nend;\r\n\r\n{$IFDEF JSASYNC}\r\nfunction TXDataWebClient.PostAsync(const EntitySet: string; Entity: TJObject): TXDataClientResponse;\r\nvar\r\n Promise: TJSPromise;\r\nbegin\r\n Promise := TJSPromise.new(\r\n procedure(resolve, reject: TJSPromiseResolver)\r\n begin\r\n InternalPost(EntitySet, Entity, 'post',\r\n procedure(Response: TXDataClientResponse)\r\n begin\r\n resolve(Response);\r\n end,\r\n procedure(Error: TXDataClientError)\r\n begin\r\n reject(EXDataClientRequestException.Create(Error));\r\n end,\r\n True\r\n );\r\n end\r\n );\r\n Exit(Promise);\r\nend;\r\n{$ENDIF}\r\n\r\nprocedure TXDataWebClient.Put(const EntitySet: string; Entity: TJObject;\r\n const RequestId: string = 'put');\r\nbegin\r\n InternalPut(EntitySet, Entity, RequestId, nil, nil);\r\nend;\r\n\r\nprocedure TXDataWebClient.RawInvoke(const OperationId: string;\r\n Args: array of JSValue; RequestId: string);\r\nbegin\r\n InternalRawInvoke(OperationId, Args, RequestId, nil, nil);\r\nend;\r\n\r\nprocedure TXDataWebClient.RawInvoke(const OperationId: string;\r\n Args: array of JSValue; SuccessProc: TXDataClientLoadProc;\r\n ErrorProc: TXDataClientErrorProc);\r\nbegin\r\n InternalRawInvoke(OperationId, Args, '', SuccessProc, ErrorProc);\r\nend;\r\n\r\n{$IFDEF JSASYNC}\r\nfunction TXDataWebClient.RawInvokeAsync(const OperationId: string;\r\n Args: array of JSValue): TXDataClientResponse;\r\nvar\r\n Promise: TJSPromise;\r\nbegin\r\n Promise := TJSPromise.new(\r\n procedure(resolve, reject: TJSPromiseResolver)\r\n begin\r\n InternalRawInvoke(OperationId, Args, '',\r\n procedure(Response: TXDataClientResponse)\r\n begin\r\n resolve(Response);\r\n end,\r\n procedure(Error: TXDataClientError)\r\n begin\r\n reject(EXDataClientRequestException.Create(Error));\r\n end,\r\n True\r\n );\r\n end\r\n );\r\n Exit(Promise);\r\nend;\r\n{$ENDIF}\r\n\r\nfunction TXDataWebClient.RequestUrl(const RelativeUrl: string): string;\r\nbegin\r\n Result := TXDataUtils.CombineUrlFast(Self.Url, RelativeUrl);\r\nend;\r\n\r\nprocedure TXDataWebClient.Send(Req: IHttpRequest; SuccessProc: THttpResponseProc;\r\n ErrorProc: THttpErrorProc);\r\nbegin\r\n Connection.SendRequest(Req, SuccessProc, ErrorProc);\r\nend;\r\n\r\nprocedure TXDataWebClient.SetConnection(const Value: TXDataWebConnection);\r\nbegin\r\n if Value <> FConnection then\r\n begin\r\n if FConnection <> nil then\r\n FConnection.RemoveFreeNotification(Self);\r\n FConnection := Value;\r\n if FConnection <> nil then\r\n FConnection.FreeNotification(Self);\r\n end;\r\nend;\r\n\r\n//procedure TXDataWebClient.SetIdFromResponse(Entity: TObject; Req: THttpRequest;\r\n// Resp: THttpResponse);\r\n//var\r\n// Uri: TUri;\r\n// Len: integer;\r\n// IdValue: Variant;\r\n// Clazz: TClass;\r\n//begin\r\n// if not Resp.Headers.Exists('location') then\r\n// raise EXDataMissingLocationHeader.Create(Req.Uri);\r\n// Uri := TUri.Create(Resp.Headers.Get('location'));\r\n// try\r\n// Len := Length(Uri.Segments);\r\n// if Len = 0 then\r\n// raise EXDataInvalidLocationHeader.Create(Req.Uri, Resp.Headers.Get('location'));\r\n// Clazz := Entity.ClassType;\r\n// Model.ParseCanonicalUrl(Uri.Segments[Len - 1], Clazz, IdValue);\r\n// finally\r\n// Uri.Free;\r\n// end;\r\n//\r\n// // If the server generates the id, the set it now\r\n// if not FModel.Explorer.GetId(Clazz).IsUserAssignedId then\r\n// FModel.Explorer.SetIdValue(Entity, IdValue);\r\n//end;\r\n\r\nprocedure TXDataWebClient.SolveReferences(json: JSValue);\r\nasm\r\n var byid = {}, // all objects by id\r\n refs = []; // references to objects that could not be resolved\r\n json = (function recurse(obj, prop, parent) {\r\n if (typeof obj !== 'object' || !obj) // a primitive value\r\n return obj;\r\n if (Object.prototype.toString.call(obj) === '[object Array]') {\r\n for (var i = 0; i < obj.length; i++)\r\n // check also if the array element is not a primitive value\r\n if (typeof obj[i] !== 'object' || !obj[i]) // a primitive value\r\n continue;\r\n else if (\"$ref\" in obj[i])\r\n obj[i] = recurse(obj[i], i, obj);\r\n else\r\n obj[i] = recurse(obj[i], prop, obj);\r\n return obj;\r\n }\r\n if (\"$ref\" in obj) { // a reference\r\n var ref = obj.$ref;\r\n if (ref in byid)\r\n return byid[ref];\r\n // else we have to make it lazy:\r\n refs.push([parent, prop, ref]);\r\n return;\r\n } else if (\"$id\" in obj) {\r\n var id = obj.$id;\r\n delete obj.$id;\r\n if (\"$values\" in obj) // an array\r\n obj = obj.$values.map(recurse);\r\n else // a plain object\r\n for (var p in obj)\r\n obj[p] = recurse(obj[p], p, obj);\r\n byid[id] = obj;\r\n }\r\n return obj;\r\n })(json); // run it!\r\n\r\n for (var i = 0; i < refs.length; i++) { // resolve previously unknown references\r\n var ref = refs[i];\r\n ref[0][ref[1]] = byid[ref[2]];\r\n // Notice that this throws if you put in a reference at top-level\r\n }\r\nend;\r\n\r\nfunction TXDataWebClient.Url: string;\r\nbegin\r\n CheckConnection;\r\n Result := Connection.URL;\r\nend;\r\n\r\nprocedure TXDataWebClient.Get(const EntitySet, QueryString: string; Id: JSValue;\r\n SuccessProc: TXDataClientLoadProc; ErrorProc: TXDataClientErrorProc);\r\nbegin\r\n InternalGet(EntitySet, QueryString, Id, 'get', SuccessProc, ErrorProc);\r\nend;\r\n\r\n{$IFDEF JSASYNC}\r\nfunction TXDataWebClient.GetAsync(const EntitySet, QueryString: string;\r\n Id: JSValue): TXDataClientResponse;\r\nvar\r\n Promise: TJSPromise;\r\nbegin\r\n Promise := TJSPromise.new(\r\n procedure(resolve, reject: TJSPromiseResolver)\r\n begin\r\n InternalGet(EntitySet, QueryString, Id, 'get',\r\n procedure(Response: TXDataClientResponse)\r\n begin\r\n resolve(Response);\r\n end,\r\n procedure(Error: TXDataClientError)\r\n begin\r\n reject(EXDataClientRequestException.Create(Error));\r\n end,\r\n True\r\n );\r\n end\r\n );\r\n Exit(Promise);\r\nend;\r\n{$ENDIF}\r\n\r\n{$IFDEF JSASYNC}\r\nfunction TXDataWebClient.GetAsync(const EntitySet: string;\r\n Id: JSValue): TXDataClientResponse;\r\nbegin\r\n Result := await(GetAsync(EntitySet, '', Id));\r\nend;\r\n{$ENDIF}\r\n\r\nprocedure TXDataWebClient.Put(const EntitySet: string; Entity: TJObject;\r\n SuccessProc: TXDataClientLoadProc; ErrorProc: TXDataClientErrorProc);\r\nbegin\r\n InternalPut(EntitySet, Entity, 'put', SuccessProc, ErrorProc);\r\nend;\r\n\r\n{$IFDEF JSASYNC}\r\nfunction TXDataWebClient.PutAsync(const EntitySet: string; Entity: TJObject): TXDataClientResponse;\r\nvar\r\n Promise: TJSPromise;\r\nbegin\r\n Promise := TJSPromise.new(\r\n procedure(resolve, reject: TJSPromiseResolver)\r\n begin\r\n InternalPut(EntitySet, Entity, 'put',\r\n procedure(Response: TXDataClientResponse)\r\n begin\r\n resolve(Response);\r\n end,\r\n procedure(Error: TXDataClientError)\r\n begin\r\n reject(EXDataClientRequestException.Create(Error));\r\n end,\r\n True\r\n );\r\n end\r\n );\r\n Exit(Promise);\r\nend;\r\n{$ENDIF}\r\n\r\n{ TXDataClientResponse }\r\n\r\nconstructor TXDataClientResponse.Create(AClient: TXDataWebClient; AResponse: IHttpResponse;\r\n AResult: JSValue; ARequestType: TXDataClientRequestType; ARequestId: string; ACount: Integer = 0);\r\nbegin\r\n FResponse := AResponse;\r\n FResult := AResult;\r\n FRequestType := ARequestType;\r\n FRequestId := ARequestId;\r\n FCount := ACount;\r\n FClient := AClient;\r\nend;\r\n\r\nfunction TXDataClientResponse.GetResponseText: string;\r\nbegin\r\n Result := Response.ContentAsText;\r\nend;\r\n\r\nfunction TXDataClientResponse.GetStatusCode: Integer;\r\nbegin\r\n Result := Response.StatusCode;\r\nend;\r\n\r\nfunction TXDataClientResponse.GetResultAsArray: TJSArray;\r\nbegin\r\n Result := JS.ToArray(Self.FResult);\r\nend;\r\n\r\nfunction TXDataClientResponse.GetResultAsObject: TJSObject;\r\nbegin\r\n Result := JS.ToObject(Self.FResult);\r\nend;\r\n\r\n{ EXDataClientRequestException }\r\n\r\nconstructor EXDataClientRequestException.Create(AClientError: TXDataClientError);\r\nvar\r\n Msg: string;\r\nbegin\r\n FErrorResult := AClientError;\r\n Msg := 'XData server request error.' + sLineBreak + 'Uri: ' + AClientError.RequestUrl;\r\n Msg := Msg + sLineBreak + 'Status code: ' + IntToStr(AClientError.StatusCode);\r\n if AClientError.ErrorCode <> '' then\r\n Msg := Msg + sLineBreak + 'Error Code: ' + AClientError.ErrorCode;\r\n if AClientError.ErrorMessage <> '' then\r\n Msg := Msg + sLineBreak + AClientError.ErrorMessage;\r\n inherited Create(Msg);\r\nend;\r\n\r\n{ TXDataClientError }\r\n\r\nconstructor TXDataClientError.Create(AClient: TXDataWebClient; AResponse: IHttpResponse;\r\n const ARequestUrl, AErrorCode, AErrorMessage, ARequestId: string);\r\nbegin\r\n FResponse := AResponse;\r\n FErrorCode := AErrorCode;\r\n FErrorMessage := AErrorMessage;\r\n FRequestId := ARequestId;\r\n FRequestUrl := ARequestUrl;\r\n FClient := AClient;\r\nend;\r\n\r\nfunction TXDataClientError.GetStatusCode: Integer;\r\nbegin\r\n Result := Response.StatusCode;\r\nend;\r\n\r\n{ TXDataClientRequest }\r\n\r\nconstructor TXDataClientRequest.Create(AClient: TXDataWebClient;\r\n ARequest: IHttpRequest; ARequestType: TXDataClientRequestType;\r\n ARequestId: string);\r\nbegin\r\n FRequest := ARequest;\r\n FRequestType := ARequestType;\r\n FRequestId := ARequestId;\r\n FClient := AClient;\r\nend;\r\n\r\n{ TXDataWebInvoker }\r\n\r\nfunction TXDataWebInvoker.GetPathParamValues(Args: array of JSValue): TStringDynArray;\r\nvar\r\n I: Integer;\r\n Param: TXDataParamDef;\r\n ParamIndex: Integer;\r\nbegin\r\n ParamIndex := 0;\r\n SetLength(Result, Action.Parameters.Count);\r\n for I := 0 to Action.Parameters.Count - 1 do\r\n if Action.Parameters[I].BindingMode = TBindingMode.FromPath then\r\n begin\r\n Param := Action.Parameters[I];\r\n if Param.Input and (I <= Length(Args)) then\r\n begin\r\n Result[ParamIndex] :=\r\n TBclUtils.PercentEncode(\r\n BindValueToUrl(Args[I], nil {Param.RttiType.Handle}, Param.UrlConverter)\r\n );\r\n Inc(ParamIndex);\r\n end;\r\n end;\r\n Result := Copy(Result, 0, ParamIndex);\r\nend;\r\n\r\nfunction TXDataWebInvoker.BuildUrlRoute(Args: array of JSValue): string;\r\nvar\r\n PathParamValues: TStringDynArray;\r\n UsedParamValues: array of Boolean;\r\n\r\n procedure AddRouteSegments(RouteInfo: TXDataRouteInfo);\r\n var\r\n I: Integer;\r\n begin\r\n for I := 0 to RouteInfo.SegmentCount - 1 do\r\n begin\r\n if RouteInfo.Segments[I].IsParam then\r\n begin\r\n // Segment is a path param\r\n if RouteInfo.Segments[I].ParamIndex < Length(PathParamValues) then\r\n Result := Result + PathParamValues[RouteInfo.Segments[I].ParamIndex]\r\n else\r\n raise EXDataWrongRouteParams.Create(Action);\r\n UsedParamValues[RouteInfo.Segments[I].ParamIndex] := True;\r\n end\r\n else\r\n Result := Result + RouteInfo.Segments[I].Value;\r\n Result := Result + '/';\r\n end;\r\n end;\r\n\r\nvar\r\n I: Integer;\r\nbegin\r\n PathParamValues := GetPathParamValues(Args);\r\n SetLength(UsedParamValues, Length(PathParamValues));\r\n Result := '';\r\n\r\n AddRouteSegments(Action.RouteInfo);\r\n\r\n for I := 0 to Length(UsedParamValues) - 1 do\r\n if not UsedParamValues[I] then\r\n Result := Result + PathParamValues[I] + '/';\r\nend;\r\n\r\nfunction TXDataWebInvoker.BuildQueryString(Args: array of JSValue): string;\r\nvar\r\n QueryString: string;\r\n I: Integer;\r\n Param: TXDataParamDef;\r\nbegin\r\n // set query string (parameters that are defined to be in uri query string)\r\n QueryString := '';\r\n for I := 0 to Action.Parameters.Count - 1 do\r\n if Action.Parameters[I].BindingMode = TBindingMode.FromURI then\r\n begin\r\n Param := Action.Parameters[I];\r\n if Param.Input and (I < Length(Args)) then\r\n begin\r\n if QueryString <> '' then\r\n QueryString := QueryString + '&';\r\n QueryString := QueryString +\r\n TBclUtils.PercentEncode(Param.Name) +\r\n '=' +\r\n TBclUtils.PercentEncode(\r\n BindValueToUrl(Args[I], nil {Param.RttiType.Handle}, Param.UrlConverter)\r\n );\r\n end;\r\n end;\r\n if QueryString <> '' then\r\n QueryString := '?' + QueryString;\r\n\r\n Result := QueryString;\r\nend;\r\n\r\nconstructor TXDataWebInvoker.Create(AClient: TXDataWebClient; AAction: TXDataAction;\r\n ASuccessProc: TXDataClientLoadProc; AErrorProc: TXDataClientErrorProc; AAsyncMode: Boolean);\r\nbegin\r\n FClient := AClient;\r\n FAction := AAction;\r\n FSuccessProc := ASuccessProc;\r\n FErrorProc := AErrorProc;\r\n FAsyncMode := AAsyncMode;\r\nend;\r\n\r\nfunction TXDataWebInvoker.CreateHttpRequest: IHttpRequest;\r\nbegin\r\n Result := THttpRequest.Create;\r\nend;\r\n\r\nprocedure TXDataWebInvoker.DoError(Response: IHttpResponse; RequestUrl,\r\n RequestId, ErrorMessage: string);\r\nbegin\r\n FClient.DoError(Response, RequestUrl, RequestId, ErrorMessage, FErrorProc, FAsyncMode);\r\nend;\r\n\r\nprocedure TXDataWebInvoker.DoLoad(Response: TXDataClientResponse);\r\nbegin\r\n FClient.DoLoad(Response, FSuccessProc, FAsyncMode);\r\nend;\r\n\r\nprocedure TXDataWebInvoker.Execute(const Args: array of JSValue);\r\nvar\r\n RequestUrl: string;\r\n\r\n procedure OnSuccess(Resp: IHttpResponse);\r\n var\r\n ResultValue: JSValue;\r\n JsonResult: JSValue;\r\n begin\r\n // check errors\r\n if (Resp.StatusCode <> 200) and (Resp.StatusCode <> 204) and (Resp.StatusCode <> 404) then\r\n begin\r\n DoError(Resp, RequestUrl, RequestId, '');\r\n Exit;\r\n end;\r\n\r\n // has content\r\n if Action.IsResultStream then\r\n begin\r\n if Resp.StatusCode = 404 then\r\n DoError(Resp, RequestUrl, RequestId, '')\r\n else\r\n begin\r\n ResultValue := Resp.ContentAsText; //TBytesStream.Create(Resp.ContentAsBytes);\r\n DoLoad(TXDataClientResponse.Create(FClient, Resp, ResultValue, rtRawInvoke, RequestId));\r\n end;\r\n end\r\n else\r\n if Action.IsResultCriteria then\r\n begin\r\n DoError(Resp, RequestUrl, RequestId, 'TCriteria result yet not supported in TXDataClient');\r\n end\r\n else\r\n begin\r\n if (Resp.StatusCode <> 204) then\r\n begin\r\n JsonResult := TJSJSON.parse(Resp.ContentAsText)\r\n end\r\n else\r\n JsonResult := JS.Null;\r\n DoLoad(TXDataClientResponse.Create(FClient, Resp, JsonResult, rtRawInvoke, RequestId));\r\n end;\r\n end;\r\n\r\n procedure LocalError;\r\n begin\r\n DoError(nil, RequestUrl, RequestId, '');\r\n end;\r\n\r\nvar\r\n Req: IHttpRequest;\r\n QueryString: string;\r\n SingleBodyParamIndex: Integer;\r\nbegin\r\n // check number of parameters\r\n // note that first item in Args array is not the parameter, but instead always the interface pointer\r\n// if Action.Parameters.Count <> Length(Args) then\r\n// raise EXDataWrongParameterCount.Create(Action, Length(Args));\r\n\r\n// Resp := nil;\r\n Req := CreateHttpRequest;\r\n\r\n // Set request uri, method and other parameters before setting message body\r\n // TODO: Later Uri must be defined based on a more advanced routing system\r\n QueryString := BuildQueryString(Args);\r\n RequestUrl := BuildUrlRoute(Args);\r\n RequestUrl := RequestUrl + QueryString;\r\n RequestUrl := Self.RequestUrl(RequestUrl);\r\n Req.Uri := RequestUrl;\r\n Req.Method := Action.HttpMethod;\r\n\r\n if Action.IsParamStream then\r\n SetParamStreamBody(Req, Args, Action.ParamStreamIndex)\r\n else\r\n if Action.BodyParamCount > 0 then\r\n begin\r\n // Set content (parameters that are defined to be in the message body)\r\n // Check for special case: single parameter object and list. Server-side equivalent code for this is\r\n // in XData.Payload.Json.Reader unit: TJsonParamsReader.ReadParams method\r\n // Check there if you change something here.\r\n// if (Action.Parameters.Count = 1) and (Action.Parameters[0].ParamType is TXDataEntityType) then\r\n SingleBodyParamIndex := Action.BodyParams[0].Index;\r\n if (Action.BodyParamCount = 1) and (Length(Args) > SingleBodyParamIndex) and (JS.IsObject(Args[SingleBodyParamIndex])) then\r\n SetJsonObjectBody(Req, Args)\r\n else\r\n SetJsonParamsBody(Req, Args);\r\n Req.Headers.SetValue('content-type', 'application/json');\r\n end;\r\n\r\n FClient.DoRequest(TXDataClientRequest.Create(FClient, Req, rtRawInvoke, FRequestId));\r\n FClient.Send(Req, @OnSuccess, @LocalError);\r\nend;\r\n\r\nfunction TXDataWebInvoker.RequestUrl(const RelativeUrl: string): string;\r\nbegin\r\n Result := FClient.RequestUrl(RelativeUrl);\r\nend;\r\n\r\nprocedure TXDataWebInvoker.SetJsonObjectBody(Req: IHttpRequest;\r\n const Args: array of JSValue);\r\nvar\r\n ParamIndex: Integer;\r\nbegin\r\n // Review this when Aurelius entities are supported\r\n // For now, just set the raw Json content\r\n ParamIndex := Action.BodyParams[0].Index;\r\n if Length(Args) <= ParamIndex then\r\n raise EXDataWrongParameterCount.Create(Action, ParamIndex + 1);\r\n Req.Content := TJSJson.stringify(Args[ParamIndex]);\r\nend;\r\n\r\nprocedure TXDataWebInvoker.SetJsonParamsBody(Req: IHttpRequest;\r\n const Args: array of JSValue);\r\nvar\r\n I: Integer;\r\n Param: TXDataParamDef;\r\n ParamObj: TJSObject;\r\n ParamValue: JSValue;\r\nbegin\r\n ParamObj := TJSObject.new;\r\n for I := 0 to Action.Parameters.Count - 1 do\r\n if Action.Parameters[I].BindingMode = TBindingMode.FromBody then\r\n begin\r\n Param := Action.Parameters[I];\r\n if Param.Input and (I < Length(Args)) then\r\n begin\r\n ParamValue := Args[I];\r\n TransformParam(Param, ParamValue);\r\n ParamObj[Param.Name] := ParamValue;\r\n end;\r\n end;\r\n Req.COntent := TJSJson.stringify(ParamObj);\r\nend;\r\n\r\nprocedure TXDataWebInvoker.SetParamStreamBody(Req: IHttpRequest;\r\n const Args: array of JSValue; ArgIndex: Integer);\r\nbegin\r\n if ArgIndex >= Length(Args) then\r\n raise EXDataWrongParameterCount.Create(Action, ArgIndex + 1);\r\n Req.Content := Args[ArgIndex];\r\nend;\r\n\r\nprocedure TXDataWebInvoker.TransformParam(Param: TXDataParamDef;\r\n var Value: JSValue);\r\nbegin\r\n// case Param.ParamType.TypeKind of\r\n//// xtDateTime,\r\n//// xtDate,\r\n//// xtTime,\r\n// TXTypeKind.xtGuid:\r\n// begin\r\n// // Must be TGuid type\r\n// if JS.IsObject(Value) then\r\n// begin\r\n// Value := Copy(GuidToString(TGuid(Value)), 2, 36);\r\n// end;\r\n// end;\r\n//// xtBinary,\r\n//// xtEnum,\r\n//// xtScalarCollection\r\n// end;\r\nend;\r\n\r\n{ EXDataWrongParameterCount }\r\n\r\nconstructor EXDataWrongParameterCount.Create(Action: TXDataAction;\r\n PassedParameters: integer);\r\nbegin\r\n inherited CreateFmt('Incorrect parameter count for Operation \"%s\". Expected at least: %d, actual: %d',\r\n [Action.OperationId, Action.Parameters.Count, PassedParameters]);\r\nend;\r\n\r\n{ EXDataWrongRouteParams }\r\n\r\nconstructor EXDataWrongRouteParams.Create(Action: TXDataAction);\r\nbegin\r\n inherited CreateFmt('Invalid number of route params for Operation \"%s\". ' +\r\n 'Route params: %d, Path params: %d',\r\n [Action.OperationId, Action.RouteInfo.ParamCount, Action.PathParamCount]);\r\nend;\r\n\r\nend.\r\n","unit Parameters;\r\n\r\ninterface\r\nuses SysUtils, Classes, StrUtils;\r\n\r\nfunction ConvertBoolean(b: boolean): string;\r\nfunction SubstituteParamStr(parm: string; ndx: integer; val: string): string;\r\n\r\ntype\r\n TStringParams = class\r\n private\r\n function gParamArr(index: integer): string;\r\n procedure sParamArr(index: integer; const Value: string);\r\n function gPAFloat(index: integer): double;\r\n procedure sPAFloat(index: integer; const Value: double);\r\n function gPAFloatDef(index: integer; def: double): double;\r\n function gPAInteger(index: integer): integer;\r\n procedure sPAInteger(index: integer; const Value: integer);\r\n function gPAIntegerDef(index, def: integer): integer;\r\n function gPABoolean(index: integer): boolean;\r\n procedure sPABoolean(index: integer; const Value: boolean);\r\n \tfunction gPAString: string;\r\n \tprocedure sPAString(const Value: string);\r\n function gPAList(index: integer): string;\r\n procedure sPAList(index: integer; const Value: string);\r\n function gPAStringU(index: integer): string;\r\n function gPAQuoted(index: integer): string;\r\n function Decrypt(txt: string): string;\r\n function Encrypt(txt: string): string;\r\n function gPAEncrypted: string;\r\n procedure sPAEncrypted(const Value: string);\r\n function gPADate(index: integer): TDate;\r\n procedure sPADate(index: integer; const Value: TDate);\r\n function gPADateTime(index: integer): TDateTime;\r\n function gPAWDateTime(index: integer): string;\r\n procedure sPADateTime(index: integer; const Value: TDateTime);\r\n procedure sPAWDateTime(index: integer; const Value: string);\r\n public\r\n MAXPARMS, nParams, NextNdx: integer;\r\n ParamArr: array of string;\r\n delimitedby: string;\r\n procedure FillParams(s: string; delim: string='');\tvirtual;\r\n procedure FillFlexParams(s: string); virtual;\r\n function SetString(num: integer=-1; delim: string=''; skipblanks: boolean=false): string;\t\tvirtual;\r\n function SetFlexString(num: integer): string;\r\n function NoParams: string;\r\n function Any: boolean;\r\n function AnyValues: boolean;\r\n procedure Clear;\r\n procedure Reset;\r\n function NextIndex: integer;\r\n procedure Add(s: string); virtual;\r\n procedure AddString(s: string; delim: string='|'); virtual;\r\n procedure CopyIn(InParams: TStringParams); virtual;\r\n procedure CopyToStringArray(var arr: array of string);\r\n function InList(s: string; ignorecase: boolean=false): boolean;\r\n function FindInList(s: string; ignorecase: boolean=false): integer;\r\n property Arr[index: integer]: string read gParamArr write sParamArr; default;\r\n property AsInteger[index: integer]: integer read gPAInteger write sPAInteger;\r\n property AsIntegerDef[index, def: integer]: integer read gPAIntegerDef;\r\n property AsFloat[index: integer]: double read gPAFloat write sPAFloat;\r\n property AsFloatDef[index: integer; def: double]: double read gPAFloatDef;\r\n property AsBoolean[index: integer]: boolean read gPABoolean write sPABoolean;\r\n property Quoted[index: integer]: string read gPAQuoted;\r\n property AsString: string read gPAString write sPAString;\r\n property AsUpper[index: integer]: string read gPAStringU;\r\n property AsList[index: integer]: string read gPAList write sPAList;\t\t// special for using tilde from pipes\r\n property AsDate[index: integer]: TDate read gPADate write sPADate;\r\n property AsDateTime[index: integer]: TDateTime read gPADateTime write sPADateTime;\r\n property AsWDateTime[index: integer]: string read gPAWDateTime write sPAWDateTime;\r\n \tproperty AsEncrypted: string read gPAEncrypted write sPAEncrypted;\r\n property Count: integer read nParams write nParams;\r\n constructor Create(sz: integer=500; del: string='|');\r\n destructor Destroy; override;\r\n end;\r\n\r\n TDataParams = class\r\n private\r\n List: array[1..3] of TStringParams;\r\n function gListArr(typ, index: integer): string;\r\n function gMainArr(index: integer): string;\r\n function gParm1Arr(index: integer): string;\r\n function gParm2Arr(index: integer): string;\r\n procedure sListArr(typ, index: integer; const Value: string);\r\n procedure sMainArr(index: integer; const Value: string);\r\n procedure sParm1Arr(index: integer; const Value: string);\r\n procedure sParm2Arr(index: integer; const Value: string);\r\n public\r\n MAXPARMS, nParams, NextNdx, nLists: integer;\r\n DelimitedBy: string;\r\n procedure SetAll(ndx: integer; val: string='');\r\n function NoParams: string;\r\n function Any: boolean;\r\n procedure Clear;\r\n procedure Reset;\r\n function NextIndex: integer;\r\n procedure FillParams(s: string; splitsep: string='-');\r\n function SetString(num: integer): string;\r\n procedure AddValues(val1: string; val2: string=''; val3: string='');\r\n procedure SetValues(ndx: integer; val1: string; val2: string=''; val3: string='');\r\n procedure SplitDataLine(ln: string; var s1, s2, s3: string; splitsep: string='-');\r\n function SetDataLine(s1, s2, s3: string; splitsep: string='-'): string;\r\n function FindInList(s: string; ndx: integer=1; ignorecase: boolean=false): integer;\r\n property Main[index: integer]: string read gMainArr write sMainArr; default;\r\n property Parm1[index: integer]: string read gParm1Arr write sParm1Arr;\r\n property Parm2[index: integer]: string read gParm2Arr write sParm2Arr;\r\n property PList[typ, index: integer]: string read gListArr write sListArr;\r\n constructor Create(sz: integer=500; del: string='|'; cnt: integer=3);\r\n destructor Destroy; override;\r\n end;\r\n\r\n TDataPairParams = class(TDataParams)\r\n private\r\n function gCodeValue(index: integer): integer;\r\n function gValues: TStringParams;\r\n function gCodeString(index: integer): string;\r\n function gPAString: string;\r\n procedure sCodeString(index: integer; const Value: string);\r\n procedure sPAString(const Value: string);\r\n public\r\n \tcodeln: integer;\r\n sep: string;\r\n procedure SplitDataLine(ln: string; var s1, s2: string);\r\n function SetDataLine(s1, s2: string): string;\r\n\t function FindCode(cod: integer): integer;\t\toverload;\r\n\t function FindCode(cod: string): integer; overload;\r\n\t function GetByCode(cod: integer): string;\t\toverload;\r\n\t function GetByCode(cod: string): string; overload;\r\n property CodeInteger[index: integer]: integer read gCodeValue;\r\n property CodeString[index: integer]: string read gCodeString write sCodeString;\r\n property Values: TStringParams read gValues;\r\n property AsString: string read gPAString write sPAString;\r\n constructor Create(sz: integer=500; del: string='|'; ln: integer=4; lnsep: string='');\r\n end;\r\n\r\n TStringParamArray = class(TStringParams)\r\n private\r\n function gSPAParam(index: integer): TStringParams;\r\n procedure sSPAParam(index: integer; const Value: TStringParams);\r\n function gSPAPair(index: integer): TDataPairParams;\r\n procedure sSPAPair(index: integer; const Value: TDataPairParams);\r\n// function gSPAString(index: integer): String;\r\n// procedure sSPAString(index: integer; const Value: String);\r\n public\r\n Parm: TStringParams;\r\n Pair: TDataPairParams;\r\n procedure SetIndex(index: integer);\r\n \tproperty AsParam[index: integer]: TStringParams read gSPAParam write sSPAParam;\r\n \tproperty AsDataPair[index: integer]: TDataPairParams read gSPAPair write sSPAPair;\r\n// \tproperty ParamAsString[index: integer]: String read gSPAString write sSPAString;\r\n// function SetString(num: integer=-1; delim: string=''; skipblanks: boolean=false): string;\r\n// procedure AddString(s: string; delim: string='|');\r\n// procedure FillParams(s: string; delim: string='');\r\n constructor Create(sz: integer=500; psz: integer=500; del: string=#13#10; pdel: string='|');\r\n destructor Destroy; override;\r\n end;\r\n\r\nvar Param: TStringParams;\r\n DataParams: TDataParams;\r\n\r\n\r\nimplementation\r\n\r\n\r\n{ TStringParams }\r\n\r\n//uses Encryption;\r\n\r\nfunction IsBlank(s: string): boolean;\r\nbegin\r\n result := (s = '');\r\nend;\r\n\r\nfunction SubstituteParamStr(parm: string; ndx: integer; val: string): string;\r\nvar s: TStringParams;\r\nbegin\r\n s := TStringParams.Create;\r\n\ts.FillParams(parm);\r\n s[ndx] := val;\r\n result := s.SetString(s.nParams);\r\n s.free;\r\nend;\r\n\r\nfunction ConvertBoolean(b: boolean): string;\r\nbegin\r\n if b then Result := 'Y'\r\n else Result := 'N';\r\nend;\r\n\r\nprocedure TStringParams.FillParams(s: string; delim: string='');\r\nbegin\r\n\t// s: 1: 'parameter string'|2: 'param2'| etc\r\n Reset;\r\n if delim = '' then delim := delimitedby;\r\n AddString(s, delim);\r\nend;\r\n\r\nprocedure TStringParams.AddString(s: string; delim: string='|');\r\nvar p, ln: integer;\r\n\t s2: string;\r\nbegin\r\n delimitedby := delim;\r\n ln := length(delimitedby);\r\n while not IsBlank(s) do begin\r\n\t\tp := pos(delim, s);\r\n if p = 0 then p := length(s) + 1;\r\n s2 := copy(s, 1, p-1);\r\n\t\tif nParams < MAXPARMS then begin\r\n \t inc(nParams);\r\n \tParamArr[nParams] := s2;\r\n end;\r\n \ts := copy(s, p+ln, length(s)-p-ln+1);\r\n end;\r\nend;\r\n\r\nfunction TStringParams.SetString(num: integer=-1; delim: string=''; skipblanks: boolean=false): string;\r\nvar i: integer;\r\nbegin\r\n\tif delim = '' then delim := delimitedby;\r\n\tif num < 0 then num := nParams;\r\n\tif num = 0 then Result := delim\r\n else begin\r\n \tResult := '';\r\n \tfor i := 1 to num do\r\n if not skipblanks or (ParamArr[i] > '') then\r\n \t\tResult := Result + ParamArr[i] + delim;\r\n end;\r\n if copy(result, length(result), 1) = ',' then result := copy(result, 1, length(result)-1);\r\n nParams := num;\r\nend;\r\n\r\nfunction TStringParams.NextIndex: integer;\r\nbegin\r\n inc(NextNdx);\r\n result := NextNdx;\r\nend;\r\n\r\nfunction TStringParams.NoParams: string;\r\nbegin\r\n\tResult := delimitedby;\r\nend;\r\n\r\nprocedure TStringParams.FillFlexParams(s: string);\r\nvar p: integer;\r\n\t s2: string;\r\nbegin\r\n\t// s: 1: 'parameter string'|2: 'param2'| etc\r\n\tnParams := 0;\r\n while not IsBlank(s) do begin\r\n\t\tp := pos(delimitedby, s);\r\n if p = 0 then p := length(s) + 1;\r\n s2 := copy(s, 1, p-1);\r\n if length(s2) = 3 then s2 := copy(s2, 1, 2) + '00' + copy(s2, 3, 1);\r\n inc(nParams);\r\n ParamArr[nParams] := s2;\r\n \ts := copy(s, p+1, length(s)-p);\r\n end;\r\nend;\r\n\r\nfunction TStringParams.SetFlexString(num: integer): string;\r\nvar i: integer;\r\nbegin\r\n\tif num = 0 then Result := NoParams\r\n else begin\r\n \tResult := '';\r\n \tfor i := 1 to num do begin\r\n if (length(ParamArr[i]) = 5) and (copy(ParamArr[i], 3, 2) = '00') then\r\n \tResult := Result + copy(ParamArr[i], 1, 2) + copy(ParamArr[i], 5,1) + delimitedby\r\n else\r\n \t\tResult := Result + ParamArr[i] + delimitedby;\r\n end;\r\n end;\r\n nParams := num;\r\nend;\r\n\r\nprocedure TStringParams.Clear;\r\nvar p: integer;\r\nbegin\r\n for p := 1 to MAXPARMS do ParamArr[p] := '';\r\nend;\r\n\r\nprocedure TStringParams.Reset;\r\nbegin\r\n\tnParams := 0;\r\n NextNdx := 0;\r\n Clear;\r\nend;\r\n\r\nfunction TStringParams.Any: boolean;\r\nbegin\r\n\tresult := (nParams > 0);\r\nend;\r\n\r\nfunction TStringParams.gParamArr(index: integer): string;\r\nbegin\r\n if index > nParams then result := ''\r\n\telse result := ParamArr[index];\r\nend;\r\n\r\nprocedure TStringParams.sParamArr(index: integer; const Value: string);\r\nbegin\r\n\tif index <= MAXPARMS then begin\r\n if value > ' ' then\r\n ParamArr[index] := value\r\n else\r\n ParamArr[index] := '';\r\n if index > nParams then nParams := index;\r\n end;\r\nend;\r\n\r\nfunction TStringParams.gPAFloat(index: integer): double;\r\nbegin\r\n if IsBlank(ParamArr[index]) then result := 0.0\r\n else if index > nParams then result := 0.0\r\n else\r\n \ttry\r\n\t\t\tresult := strtofloat(ParamArr[index]);\r\n except\r\n result := 0.0;\r\n end;\r\nend;\r\n\r\nfunction TStringParams.gPAInteger(index: integer): integer;\r\nbegin\r\n if IsBlank(ParamArr[index]) then result := 0\r\n else if index > nParams then result := 0\r\n else result := strtointdef(ParamArr[index], 0);\r\nend;\r\n\r\nprocedure TStringParams.sPAFloat(index: integer; const Value: double);\r\nbegin\r\n\tsParamArr(index, floattostr(value));\r\nend;\r\n\r\nprocedure TStringParams.sPAInteger(index: integer; const Value: integer);\r\nbegin\r\n\tsParamArr(index, inttostr(value));\r\nend;\r\n\r\nfunction TStringParams.gPABoolean(index: integer): boolean;\r\nbegin\r\n if index > nParams then result := false\r\n\telse result := (ParamArr[index] = 'Y') or (ParamArr[index] = 'T');\r\nend;\r\n\r\nprocedure TStringParams.sPABoolean(index: integer; const Value: boolean);\r\nvar val: string;\r\nbegin\r\n\tif Value then val := 'Y'\r\n else val := 'N';\r\n\tsParamArr(index, val);\r\nend;\r\n\r\nfunction TStringParams.gPADate(index: integer): TDate;\r\nvar s, y, m, d: string;\r\n\t p: integer;\r\nbegin\r\n\ts := ParamArr[index];\r\n\tif pos('/', s) > 0 then begin\r\n \tp := pos('/', s);\r\n m := copy(s, 1, p-1);\r\n s := copy(s, p+1, length(s)-p);\r\n \tp := pos('/', s);\r\n d := copy(s, 1, p-1);\r\n y := copy(s, p+1, length(s)-p);\r\n \ts := y + '-' + m + '-' + d;\r\n end;\r\n if (s = '') or (s = '0') then result := strtodate('1899-12-30')\t//'12/30/1899')\r\n else if index > nParams then result := strtodate('1899-12-30')\t//'12/30/1899')\r\n\telse result := strtodate(s);\r\nend;\r\n\r\nfunction WebDateTimeToDateTime(wdt: string): string;\r\nvar s, sy, sm, sd, st: string;\r\nbegin\r\n if wdt > '' then begin\r\n\t\tsy := copy(wdt, 1, 4);\r\n sm := copy(wdt, 6, 2);\r\n sd := copy(wdt, 9, 2);\r\n st := copy(wdt, 12, 12);\r\n s := sm + '/' + sd + '/' + sy;\r\n if st > ' ' then\r\n \ts := s + ' ' + st;\r\n \tresult := s;\r\n end\r\n else\r\n \tresult := '';\r\nend;\r\n\r\nfunction TStringParams.gPADateTime(index: integer): TDateTime;\r\nvar s: string;\r\nbegin\r\n if ParamArr[index] = '' then result := strtodate('12/30/1899')\r\n else if index > nParams then result := strtodate('12/30/1899')\r\n\telse begin\r\n \ts := ParamArr[index];\r\n if pos('T', s) > 0 then // Web format\r\n s := WebDateTimeToDateTime(s);\r\n \tresult := strtodatetime(s);\r\n end;\r\nend;\r\n\r\nfunction TStringParams.gPAEncrypted: string;\r\nbegin\r\n\tresult := Encrypt(SetString);\r\nend;\r\n\r\nprocedure TStringParams.sPADate(index: integer; const Value: TDate);\r\nbegin\r\n\tsParamArr(index, datetostr(value));\r\nend;\r\n\r\nprocedure TStringParams.sPADateTime(index: integer; const Value: TDateTime);\r\nbegin\r\n\tsParamArr(index, datetimetostr(value));\r\nend;\r\n\r\nprocedure TStringParams.sPAEncrypted(const Value: string);\r\nbegin\r\n\tFillParams(Decrypt(Value));\r\nend;\r\n\r\nprocedure TStringParams.CopyIn(InParams: TStringParams);\r\nvar i: integer;\r\nbegin\r\n nParams := InParams.nParams;\r\n NextNdx := InParams.NextNdx;\r\n\tfor i := 1 to nParams do\r\n \tParamArr[i] := InParams.ParamArr[i];\r\nend;\r\n\r\nprocedure TStringParams.CopyToStringArray(var arr: array of string);\r\nvar i: integer;\r\nbegin\r\n\tfor i := 1 to nParams do\r\n \tarr[i-1] := ParamArr[i];\r\nend;\r\n\r\nprocedure TStringParams.Add(s: string);\r\nbegin\r\n if nParams < MAXPARMS then begin\r\n\t\tinc(nParams);\r\n ParamArr[nParams] := s;\r\n end;\r\nend;\r\n\r\nfunction TStringParams.gPAString: string;\r\nbegin\r\n\tresult := SetString;\r\nend;\r\n\r\nfunction TStringParams.gPAStringU(index: integer): string;\r\nbegin\r\n if index > nParams then result := ''\r\n\telse result := uppercase(ParamArr[index]);\r\nend;\r\n\r\nfunction TStringParams.gPAWDateTime(index: integer): string;\r\nbegin\r\n\t// internet datetime is yyyy-mm-ddThh:nn:ss.zzz\r\n if ParamArr[index] = '' then result := ''\r\n else if index > nParams then result := ''\r\n\telse result := formatdatetime('yyyy-mm-ddThh:nn:ss.zzz', gPADateTime(index));\r\nend;\r\n\r\nprocedure TStringParams.sPAString(const Value: string);\r\nbegin\r\n\tFillParams(value);\r\nend;\r\n\r\nprocedure TStringParams.sPAWDateTime(index: integer; const Value: string);\r\nbegin\r\n\tsParamArr(index, WebDateTimeToDateTime(Value));\r\nend;\r\n\r\nfunction TStringParams.InList(s: string; ignorecase: boolean=false): boolean;\r\nvar i: integer;\r\n\t ups: string;\r\nbegin\r\n\tresult := false;\r\n ups := uppercase(s);\r\n for i := 1 to nParams do begin\r\n \tif not ignorecase and (s = ParamArr[i]) then result := true\r\n else if ignorecase and (ups = uppercase(ParamArr[i])) then result := true;\r\n end;\r\nend;\r\n\r\nfunction TStringParams.FindInList(s: string; ignorecase: boolean=false): integer;\r\nvar i: integer;\r\n\t ups: string;\r\nbegin\r\n\tresult := 0;\r\n ups := uppercase(s);\r\n for i := 1 to nParams do if result = 0 then begin\r\n \tif not ignorecase and (s = ParamArr[i]) then result := i\r\n else if ignorecase and (ups = uppercase(ParamArr[i])) then result := i;\r\n end;\r\nend;\r\n\r\nfunction TStringParams.gPAList(index: integer): string;\r\nvar s: string;\r\n\t i: integer;\r\nbegin\r\n result := '';\r\n s := ParamArr[index];\r\n for i := 1 to length(s) do\r\n \tif s[i] = '~' then s[i] := '|';\r\n result := s;\r\nend;\r\n\r\nfunction TStringParams.gPAQuoted(index: integer): string;\r\nbegin\r\n if index > nParams then result := ''\r\n\telse result := QuotedStr(ParamArr[index]);\r\nend;\r\n\r\nprocedure TStringParams.sPAList(index: integer; const Value: string);\r\nvar s: string;\r\n\t i: integer;\r\nbegin\r\n s := Value;\r\n for i := 1 to length(s) do\r\n \tif s[i] = '|' then s[i] := '~';\r\n sParamArr(index, s);\r\nend;\r\n\r\n{ TDataParams }\r\n\r\nprocedure TDataParams.AddValues(val1: string; val2: string=''; val3: string='');\r\nbegin\r\n inc(nParams);\r\n List[1][nParams] := val1;\r\n List[2][nParams] := val2;\r\n if nLists > 2 then\r\n\t List[3][nParams] := val3;\r\nend;\r\n\r\nprocedure TDataParams.SetValues(ndx: integer; val1: string; val2: string=''; val3: string='');\r\nbegin\r\n List[1][ndx] := val1;\r\n List[2][ndx] := val2;\r\n if nLists > 2 then\r\n\t List[3][ndx] := val3;\r\nend;\r\n\r\nconstructor TDataParams.Create(sz: integer=500; del: string='|'; cnt: integer=3);\r\nvar i: integer;\r\nbegin\r\n\tMAXPARMS := sz;\r\n nLists := cnt;\r\n DelimitedBy := del;\r\n for i := 1 to nLists do\r\n List[i] := TStringParams.create(MAXPARMS, del);\r\n Reset;\r\nend;\r\n\r\ndestructor TDataParams.Destroy;\r\nvar i: integer;\r\nbegin\r\n for i := 1 to nLists do\r\n List[i].free;\r\nend;\r\n\r\nfunction TDataParams.gListArr(typ, index: integer): string;\r\nbegin\r\n\tresult := List[typ][index];\r\nend;\r\n\r\nfunction TDataParams.gMainArr(index: integer): string;\r\nbegin\r\n\tresult := List[1][index];\r\nend;\r\n\r\nfunction TDataParams.gParm1Arr(index: integer): string;\r\nbegin\r\n\tresult := List[2][index];\r\nend;\r\n\r\nfunction TDataParams.gParm2Arr(index: integer): string;\r\nbegin\r\n if nLists > 2 then\r\n\t\tresult := List[3][index]\r\n else\r\n \tresult := '';\r\nend;\r\n\r\nfunction TDataParams.Any: boolean;\r\nbegin\r\n\tresult := (nParams > 0);\r\nend;\r\n\r\nfunction TDataParams.NextIndex: integer;\r\nbegin\r\n inc(NextNdx);\r\n result := NextNdx;\r\nend;\r\n\r\nfunction TDataParams.NoParams: string;\r\nbegin\r\n\tResult := delimitedby;\r\nend;\r\n\r\nprocedure TDataParams.Reset;\r\nbegin\r\n\tnParams := 0;\r\n NextNdx := 0;\r\n Clear;\r\nend;\r\n\r\nprocedure TDataParams.Clear;\r\nvar i, j: integer;\r\nbegin\r\n for i := 1 to nLists do\r\n for j := 1 to MAXPARMS do\r\n List[i][j] := '';\r\nend;\r\n\r\nprocedure TDataParams.sListArr(typ, index: integer; const Value: string);\r\nbegin\r\n\tList[typ][index] := value;\r\nend;\r\n\r\nprocedure TDataParams.sMainArr(index: integer; const Value: string);\r\nbegin\r\n\tList[1][index] := value;\r\nend;\r\n\r\nprocedure TDataParams.sParm1Arr(index: integer; const Value: string);\r\nbegin\r\n\tList[2][index] := value;\r\nend;\r\n\r\nprocedure TDataParams.sParm2Arr(index: integer; const Value: string);\r\nbegin\r\n if nLists > 2 then\r\n\t\tList[3][index] := value;\r\nend;\r\n\r\nprocedure TDataParams.SplitDataLine(ln: string; var s1, s2, s3: string; splitsep: string='-');\r\nvar p: integer;\r\nbegin\r\n if copy(ln, length(ln), 1) = delimitedby then ln := copy(ln, 1, length(ln)-1);\r\n s1 := '';\r\n s2 := '';\r\n s3 := '';\r\n p := pos(splitsep, ln);\r\n if p = 0 then s1 := ln\r\n else begin\r\n s1 := copy(ln, 1, p-1);\r\n ln := copy(ln, p+1, length(ln)-p);\r\n p := pos(splitsep, ln);\r\n if p = 0 then s2 := ln\r\n else begin\r\n s2 := copy(ln, 1, p-1);\r\n s3 := copy(ln, p+1, length(ln)-p);\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TDataParams.FillParams(s: string; splitsep: string='-');\r\nvar p: integer;\r\n\t s2: string;\r\n\r\n procedure WriteEach;\r\n var a1, a2, a3: string;\r\n begin\r\n SplitDataLine(s2, a1, a2, a3, splitsep);\r\n AddValues(a1, a2, a3);\r\n end;\r\n\r\nbegin\r\n\t// s: 1: 'parameter string'|2: 'param2'| etc\r\n Reset;\r\n while not IsBlank(s) do begin\r\n\t\tp := pos(delimitedby, s);\r\n if p = 0 then p := length(s) + 1;\r\n s2 := copy(s, 1, p-1);\r\n WriteEach;\r\n \ts := copy(s, p+1, length(s)-p);\r\n end;\r\nend;\r\n\r\nfunction TDataParams.FindInList(s: string; ndx: integer=1;\r\n ignorecase: boolean=false): integer;\r\nbegin\r\n if ndx <= nLists then\r\n\t\tresult := List[ndx].FindInList(s, ignorecase)\r\n else\r\n \tresult := 0;\r\nend;\r\n\r\nprocedure TDataParams.SetAll(ndx: integer; val: string);\r\nvar i: integer;\r\nbegin\r\n if ndx <= nLists then\r\n\t for i := 1 to nParams do\r\n \t List[ndx][i] := val;\r\nend;\r\n\r\nfunction TDataParams.SetDataLine(s1, s2, s3: string; splitsep: string='-'): string;\r\nbegin\r\n result := s1 + splitsep + s2 + splitsep + s3;\r\nend;\r\n\r\nfunction TDataParams.SetString(num: integer): string;\r\nvar i: integer;\r\nbegin\r\n\tif num < 0 then num := nParams;\r\n\tif num = 0 then Result := delimitedby\r\n else begin\r\n \tResult := '';\r\n \tfor i := 1 to num do\r\n \tResult := Result + SetDataLine(List[1][i], List[2][i], List[3][i]) + delimitedby;\r\n end;\r\n nParams := num;\r\nend;\r\n\r\n\r\nfunction TStringParams.AnyValues: boolean;\r\nvar i: integer;\r\nbegin\r\n\tresult := false;\r\n for i := 1 to nParams do\r\n \tif ParamArr[i] > '' then\r\n\t\t\tresult := true;\r\nend;\r\n\r\nconstructor TStringParams.Create(sz: integer=500; del: string='|');\r\nbegin\r\n\tMAXPARMS := sz;\r\n delimitedby := del;\r\n nParams := 0;\r\n\tSetLength(ParamArr, MAXPARMS+1);\t\t// creates a 0 that we ignore\r\nend;\r\n\r\nfunction TStringParams.Decrypt(txt: string): string;\r\nbegin\r\n\tresult := txt;\t//DecryptText(txt);\r\nend;\r\n\r\ndestructor TStringParams.Destroy;\r\nbegin\r\n\tParamArr := nil;\r\n inherited;\r\nend;\r\n\r\nfunction TStringParams.Encrypt(txt: string): string;\r\nbegin\r\n\tresult := txt;\t//EncryptText(txt);\r\nend;\r\n\r\nfunction TStringParams.gPAFloatDef(index: integer; def: double): double;\r\nbegin\r\n if IsBlank(ParamArr[index]) then result := 0.0\t\t// should this be def instead?\r\n else if index > nParams then result := def\r\n else\r\n \ttry\r\n\t\t\tresult := strtofloat(ParamArr[index]);\r\n except\r\n result := def;\r\n end;\r\nend;\r\n\r\nfunction TStringParams.gPAIntegerDef(index, def: integer): integer;\r\nbegin\r\n if IsBlank(ParamArr[index]) then result := 0\r\n else if index > nParams then result := def\r\n else result := strtointdef(ParamArr[index], def);\r\nend;\r\n\r\n\r\n{ TDataPairParams }\r\n\r\nfunction TDataPairParams.FindCode(cod: integer): integer;\r\nvar i: integer;\r\nbegin\r\n\tresult := 0;\r\n if cod > 0 then begin\r\n\t\tfor i := 1 to List[1].nParams do\r\n \t\tif List[1].AsInteger[i] = cod then\r\n \t\tresult := i;\r\n end;\r\nend;\r\n\r\nconstructor TDataPairParams.Create(sz: integer=500; del: string='|'; ln: integer=4; lnsep: string='');\r\nbegin\r\n\tMAXPARMS := sz;\r\n inherited create(sz, del, 2);\r\n\tCodeLn := ln;\r\n Sep := lnsep;\r\nend;\r\n\r\nfunction TDataPairParams.FindCode(cod: string): integer;\r\nvar i: integer;\r\nbegin\r\n\tresult := 0;\r\n\tfor i := 1 to List[1].nParams do\r\n \tif List[1][i] = cod then\r\n \tresult := i;\r\nend;\r\n\r\nfunction TDataPairParams.gCodeString(index: integer): string;\r\nbegin\r\n\tresult := List[1][index];\r\nend;\r\n\r\nfunction TDataPairParams.gCodeValue(index: integer): integer;\r\nbegin\r\n\tresult := List[1].asInteger[index];\r\nend;\r\n\r\nfunction TDataPairParams.GetByCode(cod: integer): string;\r\nvar ndx: integer;\r\nbegin\r\n\tndx := FindCode(cod);\r\n result := List[2][ndx];\r\nend;\r\n\r\nfunction TDataPairParams.GetByCode(cod: string): string;\r\nvar ndx: integer;\r\nbegin\r\n\tndx := FindCode(cod);\r\n result := List[2][ndx];\r\nend;\r\n\r\nfunction TDataPairParams.gPAString: string;\r\nvar i: integer;\r\n\t par: TStringParams;\r\nbegin\r\n\tpar := TStringParams.create;\r\n par.nParams := nParams;\r\n for i := 1 to nParams do begin\r\n \tpar[i] := List[1][i] + sep + List[2][i];\r\n end;\r\n result := par.asString;\r\n par.free;\r\nend;\r\n\r\nfunction TDataPairParams.gValues: TStringParams;\r\nbegin\r\n result := List[2];\r\nend;\r\n\r\nprocedure TDataPairParams.sCodeString(index: integer;\r\n const Value: string);\r\nbegin\r\n\tList[1][index] := value;\r\nend;\r\n\r\nfunction TDataPairParams.SetDataLine(s1, s2: string): string;\r\nbegin\r\n result := s1 + sep + s2;\r\nend;\r\n\r\nprocedure TDataPairParams.sPAString(const Value: string);\r\nvar i, p: integer;\r\n\t par: TStringParams;\r\nbegin\r\n\tpar := TStringParams.create;\r\n par.asString := Value;\r\n nParams := par.nParams;\r\n List[1].nParams := nParams;\r\n List[2].nParams := nParams;\r\n for i := 1 to nParams do begin\r\n \tif sep = '' then p := Codeln\r\n else p := pos(sep, par[i]);\r\n if p > 0 then begin\r\n\t List[1][i] := trim(copy(par[i], 1, p-1));\r\n \t List[2][i] := trim(copy(par[i], p+length(sep), length(par[i])-p-Length(sep)+1));\r\n end\r\n else begin\r\n\t List[1][i] := trim(copy(par[i], 1, p-1));\r\n \t List[2][i] := trim(copy(par[i], p+length(sep), length(par[i])-p-Length(sep)+1));\r\n end;\r\n end;\r\n par.free;\r\nend;\r\n\r\nprocedure TDataPairParams.SplitDataLine(ln: string; var s1, s2: string);\r\nvar p: integer;\r\nbegin\r\n if copy(ln, length(ln), 1) = delimitedby then ln := copy(ln, 1, length(ln)-1);\r\n s1 := '';\r\n s2 := '';\r\n p := pos(sep, ln);\r\n if p = 0 then s1 := ln\r\n else begin\r\n s1 := copy(ln, 1, p-1);\r\n s2 := copy(ln, p+1, length(ln)-p);\r\n end;\r\nend;\r\n\r\n{ TStringParamArray }\r\n\r\nconstructor TStringParamArray.Create(sz: integer=500; psz: integer=500; del: string=#13#10; pdel: string='|');\r\nbegin\r\n\tinherited create(sz, del);\r\n Parm := TStringParams.create(psz, pdel);\r\nend;\r\n\r\ndestructor TStringParamArray.Destroy;\r\nbegin\r\n\tParm.free;\r\n inherited;\r\nend;\r\n\r\nfunction TStringParamArray.gSPAPair(index: integer): TDataPairParams;\r\nbegin\r\n\tPair.AsString := ParamArr[index];\r\n result := Pair;\r\nend;\r\n\r\nfunction TStringParamArray.gSPAParam(index: integer): TStringParams;\r\nbegin\r\n\tParm.AsString := ParamArr[index];\r\n result := Parm;\r\nend;\r\n\r\nprocedure TStringParamArray.SetIndex(index: integer);\r\nbegin\r\n\tParm.AsString := ParamArr[index];\r\nend;\r\n\r\n(*function TStringParamArray.gSPAString(index: integer): String;\r\nbegin\r\n\tresult := gSPAParam(index).AsString;\r\nend;\r\n\r\n*)\r\n\r\nprocedure TStringParamArray.sSPAPair(index: integer;\r\n const Value: TDataPairParams);\r\nbegin\r\n\tParamArr[index] := Value.AsString;\r\nend;\r\n\r\nprocedure TStringParamArray.sSPAParam(index: integer; const Value: TStringParams);\r\nbegin\r\n\tParamArr[index] := Value.AsString;\r\nend;\r\n\r\n(*procedure TStringParamArray.sSPAString(index: integer; const Value: String);\r\nbegin\r\n\tParamArr[index] := Value;\r\nend;\r\n*)\r\n(*\r\n\r\nprocedure TStringParamArray.FillParams(s: string; delim: string='');\r\nbegin\r\n\t// s: 1: 'parameter string'|2: 'param2'| etc\r\n Reset;\r\n if delim = '' then delim := delimitedby;\r\n AddString(s, delim);\r\nend;\r\n\r\nprocedure TStringParamArray.AddString(s: string; delim: string='|');\r\nvar p: integer;\r\n\t s2: string;\r\nbegin\r\n delimitedby := delim;\r\n while not IsBlank(s) do begin\r\n\t\tp := pos(delim, s);\r\n if p = 0 then p := length(s) + 1;\r\n s2 := copy(s, 1, p-1);\r\n inc(nParams);\r\n ParamArr.AsString[nParams] := s2;\r\n \ts := copy(s, p+1, length(s)-p);\r\n end;\r\nend;\r\n\r\nfunction TStringParamArray.SetString(num: integer; delim: string; skipblanks: boolean): string;\r\nvar i: integer;\r\nbegin\r\n\tif delim = '' then delim := delimitedby;\r\n\tif num < 0 then num := nParams;\r\n\tif num = 0 then Result := delim\r\n else begin\r\n \tResult := '';\r\n \tfor i := 1 to num do\r\n \t\tResult := Result + ParamArr.AsString[i] + delim;\r\n end;\r\n nParams := num;\r\nend;\r\n\r\n*)\r\n\r\nend.\r\n","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright (c) 2018 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\nunit WEBLib.Imaging.gifimg;\r\n\r\ninterface\r\n\r\nimplementation\r\n\r\nbegin\r\nasm\r\nend;\r\n\r\n\r\nend.\r\n","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright (c) 2018 - 2021 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.Storage;\r\n\r\n{$DEFINE NOPP}\r\n\r\ninterface\r\n\r\nuses\r\n Web, Classes;\r\n\r\ntype\r\n TStorageChangeEvent = procedure(Sender: TObject; AKey: string; AOldValue: string; ANewValue: string; AURL: string) of object;\r\n\r\n TLocalStorage = class(TComponent)\r\n private\r\n FChangePtr: pointer;\r\n FOnChange: TStorageChangeEvent;\r\n protected\r\n procedure SetValues(AKey, AValue: string);\r\n function GetValues(AKey: string): string;\r\n function GetKey(AIndex: integer): string;\r\n function GetCount: integer;\r\n procedure StorageChanged(AEvent:TJSStorageEvent);\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n destructor Destroy; override;\r\n property Keys[AIndex: integer]: string read GetKey;\r\n property Count: integer read GetCount;\r\n property Values[Key: string]: string read GetValues write SetValues;\r\n class procedure SetValue(AKey, AValue: string);\r\n class function GetValue(AKey: string): string;\r\n class procedure RemoveKey(AKey: string);\r\n published\r\n property OnChange: TStorageChangeEvent read FOnChange write FOnChange;\r\n end;\r\n\r\n TWebLocalStorage = class(TLocalStorage);\r\n\r\n TSessionStorage = class(TComponent)\r\n private\r\n FChangePtr: pointer;\r\n FOnChange: TStorageChangeEvent;\r\n protected\r\n procedure SetValues(AKey, AValue: string);\r\n function GetValues(AKey: string): string;\r\n function GetKey(AIndex: integer): string;\r\n function GetCount: integer;\r\n procedure StorageChanged(AEvent:TJSStorageEvent);\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n destructor Destroy; override;\r\n property Keys[AIndex: integer]: string read GetKey;\r\n property Count: integer read GetCount;\r\n property Values[key: string]: string read GetValues write SetValues;\r\n class procedure SetValue(AKey, AValue: string);\r\n class function GetValue(AKey: string): string;\r\n published\r\n property OnChange: TStorageChangeEvent read FOnChange write FOnChange;\r\n end;\r\n\r\n TWebSessionStorage = class(TSessionStorage);\r\n\r\nimplementation\r\n\r\nuses\r\n SysUtils;\r\n\r\n{ TLocalStorage }\r\n\r\nclass procedure TLocalStorage.SetValue(AKey, AValue: string);\r\nbegin\r\n window.localStorage.setItem(AKey, AValue);\r\nend;\r\n\r\nprocedure TLocalStorage.SetValues(AKey, AValue: string);\r\nbegin\r\n window.localStorage.setItem(AKey, AValue);\r\nend;\r\n\r\nprocedure TLocalStorage.StorageChanged(AEvent: TJSStorageEvent);\r\nvar\r\n s:string;\r\nbegin\r\n s := AEvent.storageArea+' ';\r\n if Assigned(OnChange) and (pos('OBJECT', UpperCase(s)) > 0) then\r\n OnChange(Self, AEvent.key, AEvent.oldValue, AEvent.newValue, AEVent.url);\r\nend;\r\n\r\nclass function TLocalStorage.GetValue(AKey: string): string;\r\nvar\r\n s: string;\r\nbegin\r\n s := window.localStorage.getItem(AKey);\r\n if not Assigned(s) then\r\n Result := ''\r\n else\r\n Result := s;\r\nend;\r\n\r\nfunction TLocalStorage.GetValues(AKey: string): string;\r\nvar\r\n s: string;\r\nbegin\r\n s := window.localStorage.getItem(AKey);\r\n if not Assigned(s) then\r\n Result := ''\r\n else\r\n Result := s;\r\nend;\r\n\r\nclass procedure TLocalStorage.RemoveKey(AKey: string);\r\nbegin\r\n window.localStorage.removeItem(AKey);\r\nend;\r\n\r\nfunction TLocalStorage.GetKey(AIndex: integer): string;\r\nbegin\r\n Result := window.localStorage.Keys[AIndex];\r\nend;\r\n\r\nconstructor TLocalStorage.Create(AOwner: TComponent);\r\nbegin\r\n FChangePtr := @StorageChanged;\r\n inherited;\r\n\r\n window.addEventListener('storage', FChangePtr);\r\nend;\r\n\r\ndestructor TLocalStorage.Destroy;\r\nbegin\r\n window.removeEventListener('storage',FChangePtr);\r\n inherited;\r\nend;\r\n\r\nfunction TLocalStorage.GetCount: integer;\r\nbegin\r\n Result := window.localStorage.length;\r\nend;\r\n\r\n{ TSessionStorage }\r\n\r\nclass procedure TSessionStorage.SetValue(AKey, AValue: string);\r\nbegin\r\n window.sessionStorage.setItem(AKey, AValue);\r\nend;\r\n\r\nprocedure TSessionStorage.SetValues(AKey, AValue: string);\r\nbegin\r\n window.sessionStorage.setItem(AKey, AValue);\r\nend;\r\n\r\nprocedure TSessionStorage.StorageChanged(AEvent: TJSStorageEvent);\r\nvar\r\n s:string;\r\nbegin\r\n s := AEvent.storageArea+' ';\r\n if Assigned(OnChange) and (pos('OBJECT', Uppercase(s)) = 0) then\r\n OnChange(Self, AEvent.key, AEvent.oldValue, AEvent.newValue, AEVent.url);\r\nend;\r\n\r\nclass function TSessionStorage.GetValue(AKey: string): string;\r\nvar\r\n s: string;\r\nbegin\r\n s := window.sessionStorage.getItem(AKey);\r\n if not Assigned(s) then\r\n Result := ''\r\n else\r\n Result := s;\r\nend;\r\n\r\nfunction TSessionStorage.GetValues(AKey: string): string;\r\nvar\r\n s: string;\r\nbegin\r\n s := window.sessionStorage.getItem(AKey);\r\n if not Assigned(s) then\r\n Result := ''\r\n else\r\n Result := s;\r\nend;\r\n\r\nfunction TSessionStorage.GetKey(AIndex: integer): string;\r\nbegin\r\n Result := window.sessionStorage.Keys[AIndex];\r\nend;\r\n\r\nconstructor TSessionStorage.Create(AOwner: TComponent);\r\nbegin\r\n FChangePtr := @StorageChanged;\r\n\r\n inherited;\r\n\r\n window.addEventListener('storage', FChangePtr);\r\nend;\r\n\r\ndestructor TSessionStorage.Destroy;\r\nbegin\r\n window.removeEventListener('storage', FChangePtr);\r\n inherited;\r\nend;\r\n\r\nfunction TSessionStorage.GetCount: integer;\r\nbegin\r\n Result := window.sessionStorage.length;\r\nend;\r\n\r\n\r\n\r\nend.","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright (c) 2018 - 2021 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.REST;\r\n\r\n{$DEFINE NOPP}\r\n\r\ninterface\r\n\r\nuses\r\n Classes, Web, JS, SysUtils, WEBLib.Controls, WEBLib.JSON;\r\n\r\ntype\r\n THTTPCommand = (httpGET, httpPOST, httpPUT, httpDELETE, httpHEAD, httpPATCH, httpCUSTOM);\r\n\r\n THTTPRequestResponseType = (rtDefault, rtText, rtBlob, rtJSON, rtDocument, rtArrayBuffer);\r\n\r\n THTTPResponseProc = reference to procedure(AResponse: string; ARequest: TJSXMLHttpRequest);\r\n THTTPErrorProc = reference to procedure(ARequest: TJSXMLHttpRequest);\r\n\r\n THttpRequest = class(TComponent)\r\n private\r\n FURL: string;\r\n FOnResponse: THTTPResponseEvent;\r\n FOnAbort: THTTPAbortEvent;\r\n FHeaders: TStringList;\r\n FCommand: THTTPCommand;\r\n FCustomCommand: string;\r\n FPostData: string;\r\n FOnRequestResponse: THTTPRequestResponseEvent;\r\n FPassword: string;\r\n FUser: string;\r\n FTimeout: integer;\r\n FOnTimeout: TNotifyEvent;\r\n FOnError: THTTPErrorEvent;\r\n FResponse: THttpResponseProc;\r\n FErrorProc: THttpErrorProc;\r\n FTimeOutProc: THttpErrorProc;\r\n FResponseType: THTTPRequestResponseType;\r\n protected\r\n function HandleResponse(Event: TEventListenerEvent): boolean;\r\n function HandleAbort(Event: TEventListenerEvent): boolean;\r\n function HandleTimeout(Event: TEventListenerEvent): boolean;\r\n function HandleError(Event: TEventListenerEvent): boolean;\r\n procedure SetHeaders(const AValue: TStringList);\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n destructor Destroy; override;\r\n class function GetResponseType(AResponseType: THTTPRequestResponseType): string;\r\n procedure Execute(AResponse: THTTPResponseProc = nil); overload;\r\n procedure Execute(AResponse: THTTPResponseProc; AError: THTTPErrorProc); overload;\r\n procedure Execute(AResponse: THTTPResponseProc; AError: THTTPErrorProc; ATimeOut: THTTPErrorProc); overload;\r\n [async]\r\n function Perform: TJSPromise;\r\n published\r\n property Command: THTTPCommand read FCommand write FCommand;\r\n property CustomCommand: string read FCustomCommand write FCustomCommand;\r\n property Headers: TStringList read FHeaders write SetHeaders;\r\n property Password: string read FPassword write FPassword;\r\n property PostData: string read FPostData write FPostData;\r\n property ResponseType: THTTPRequestResponseType read FResponseType write FResponseType default rtDefault;\r\n property Timeout: integer read FTimeout write FTimeout default 0;\r\n property URL: string read FURL write FURL;\r\n property User: string read FUser write FUser;\r\n property OnError: THTTPErrorEvent read FOnError write FOnError;\r\n property OnAbort: THTTPAbortEvent read FOnAbort write FOnAbort;\r\n property OnRequestResponse: THTTPRequestResponseEvent read FOnRequestResponse write FOnRequestResponse;\r\n property OnResponse: THTTPResponseEvent read FOnResponse write FOnResponse;\r\n property OnTimeout: TNotifyEvent read FOnTimeout write FOnTimeout;\r\n end;\r\n\r\n TWebHTTPRequest = class(THTTPRequest);\r\n\r\n THttpResponse = procedure(Sender: TObject; AResponse: string) of object;\r\n TInternalHttpResponse = procedure(Sender: TObject; AResponse: string; var Handled: boolean) of object;\r\n\r\n TPersistTokens = class(TPersistent)\r\n private\r\n FKey: string;\r\n FEnabled: boolean;\r\n public\r\n constructor Create; reintroduce;\r\n procedure Assign(Source: TPersistent); override;\r\n published\r\n property Key: string read FKey write FKey;\r\n property Enabled: boolean read FEnabled write FEnabled default false;\r\n end;\r\n\r\n TRESTApp = class(TPersistent)\r\n private\r\n FKey: string;\r\n FCallbackURL: string;\r\n FSecret: string;\r\n public\r\n procedure Assign(Source: TPersistent); override;\r\n published\r\n property Key: string read FKey write FKey;\r\n property CallbackURL: string read FCallbackURL write FCallbackURL;\r\n property Secret: string read FSecret write FSecret;\r\n end;\r\n\r\n TAuthLocale = (lcDefault, lcEnglish, lcDutch, lcGerman, lcFrench, lcSpanish, lcItalian,\r\n lcPortuguese, lcGreek, lcDanish, lcRussian, lcRomanian, lcSwedish, lcFinnish, lcTurkish,\r\n lcJapanese);\r\n\r\n TCoreCloudHeader = record\r\n header: String;\r\n value: String;\r\n end;\r\n\r\n TCoreCloudHeaders = array of TCoreCloudHeader;\r\n\r\n TRESTClient = class(TComponent)\r\n private\r\n FAPIBase: string;\r\n FAccessToken: string;\r\n FOnAccessToken: TNotifyEvent;\r\n FEventRegistered: boolean;\r\n FOnResponse: THttpResponse;\r\n FPersistTokens: TPersistTokens;\r\n FOnHttpResponse: TInternalHttpResponse;\r\n FApp: TRESTApp;\r\n FScopes: TStrings;\r\n FLocale: TAuthLocale;\r\n FOnRequestResponse: THTTPRequestResponseEvent;\r\n FOnError: THttpErrorEvent;\r\n FResponseType: THTTPRequestResponseType;\r\n procedure SetPersistTokens(const Value: TPersistTokens);\r\n procedure SetApp(const Value: TRESTApp);\r\n procedure SetScopes(const Value: TStrings);\r\n protected\r\n class function InstallCallback: boolean;\r\n function HandleAccessToken(const s: TJSObject): boolean;\r\n function HandleResponse(Event: TEventListenerEvent): boolean;\r\n function GetAuthURL: string; virtual;\r\n function ScopeParamText(Delimiter: string; Encode: boolean = false): string;\r\n function GetLocaleParam: string; virtual;\r\n function GetJSONValue(o: TJSONObject; ID: string): TJSONValue;\r\n function GetJSONObject(o: TJSONObject; ID: string): TJSONObject;\r\n property APIBase: string read FAPIBase write FAPIBase;\r\n procedure ReadTokens; virtual;\r\n procedure WriteTokens; virtual;\r\n property Locale: TAuthLocale read FLocale write FLocale;\r\n property Token_Access: string read FAccessToken;\r\n function TMSUTF8Encode(s: string): string;\r\n procedure HttpsCommand(Command, URL, Data, ContentType: string; headers: TCoreCloudHeaders); virtual;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n destructor Destroy; override;\r\n procedure HttpsDelete(URL: string); overload; virtual;\r\n procedure HttpsDelete(URL: string; headers: TCoreCloudHeaders); overload; virtual;\r\n procedure HttpsGet(URL: string); overload; virtual;\r\n procedure HttpsGet(URL: string; headers: TCoreCloudHeaders); overload; virtual;\r\n procedure HttpsPost(URL: string; Data: string); overload; virtual;\r\n procedure HttpsPost(URL: string; ContentType, Data: string); overload; virtual;\r\n procedure HttpsPost(URL: string; headers: TCoreCloudHeaders; Data: string); overload; virtual;\r\n procedure HttpsUpdate(URL: string; headers: TCoreCloudHeaders; Data: string); virtual;\r\n\r\n procedure HttpsPut(URL: string; ContentType, Data: string); virtual;\r\n property AccessToken: string read FAccessToken write FAccessToken;\r\n function URLEncode(URI: string): string;\r\n class function JSONEscape(s: string): string;\r\n class function IsoToDateTime(const s: string): TDateTime; overload;\r\n class function IsoToDateTime(const s: string; IsUTC: Boolean): TDateTime; overload;\r\n class function IsoToDate(const s: string): TDateTime;\r\n class function IsIsoDateTime(const s: string): boolean;\r\n class function DateTimeToWL(dt: TDateTime): string;\r\n class function DateTimeToDaylightSavings(dt: TDateTime): TDateTime;\r\n class function GetJSONProp(O: TJSONOBject; ID: string): string; overload;\r\n class function GetJSONInt(O: TJSONOBject; ID: string): integer; overload;\r\n procedure DoAuth; virtual;\r\n procedure Connect;\r\n procedure TestTokens; virtual;\r\n procedure ClearTokens; virtual;\r\n property OnHttpResponse: TInternalHttpResponse read FOnHttpResponse write FOnHttpResponse;\r\n published\r\n property App: TRESTApp read FApp write SetApp;\r\n property PersistTokens: TPersistTokens read FPersistTokens write SetPersistTokens;\r\n property ResponseType: THTTPRequestResponseType read FResponseType write FResponseType default rtDefault;\r\n property Scopes: TStrings read FScopes write SetScopes;\r\n property OnAccessToken: TNotifyEvent read FOnAccessToken write FOnAccessToken;\r\n property OnRequestResponse: THTTPRequestResponseEvent read FOnRequestResponse write FOnRequestResponse;\r\n property OnResponse: THttpResponse read FOnResponse write FOnResponse;\r\n property OnError: THttpErrorEvent read FOnError write FOnError;\r\n end;\r\n\r\n TWebRESTClient = class(TRESTClient);\r\n\r\n\r\nprocedure AddHeader(var AHeaders: TCoreCloudHeaders; Header: string; Value: string);\r\nfunction GetArraySize(ja: TJSONArray): integer;\r\nfunction GetArrayItem(ja: TJSONArray; Index: integer): TJSONObject;\r\nfunction HTTPCommand(ACommand: THTTPCommand; ACustomCommand: string): string;\r\n\r\nimplementation\r\n\r\nuses\r\n WEBLib.Storage;\r\n\r\nfunction HTTPCommand(ACommand: THTTPCommand; ACustomCommand: string): string;\r\nvar\r\n cmd: string;\r\nbegin\r\n case ACommand of\r\n httpGET: cmd := 'GET';\r\n httpPOST: cmd := 'POST';\r\n httpPUT: cmd := 'PUT';\r\n httpDELETE: cmd := 'DELETE';\r\n httpHEAD: cmd := 'HEAD';\r\n httpPATCH: cmd := 'PATCH';\r\n httpCUSTOM: cmd := ACustomCommand;\r\n end;\r\n Result := cmd;\r\nend;\r\n\r\nfunction GetArraySize(ja: TJSONArray): integer;\r\nbegin\r\n Result := ja.Count;\r\nend;\r\n\r\nfunction GetArrayItem(ja: TJSONArray; Index: integer): TJSONObject;\r\nbegin\r\n Result := TJSONObject(ja.Items[Index]);\r\nend;\r\n\r\n\r\nprocedure AddHeader(var AHeaders: TCoreCloudHeaders; Header: String; Value: String);\r\nbegin\r\n SetLength(AHeaders, Length(AHeaders) + 1);\r\n AHeaders[Length(AHeaders) - 1].header := Header;\r\n AHeaders[Length(AHeaders) - 1].value := Value;\r\nend;\r\n\r\n{ THttpRequest }\r\n\r\nconstructor THttpRequest.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n FHeaders := TStringList.Create;\r\n FResponseType := rtDefault;\r\n FCommand := httpGET;\r\n FTimeout := 0;\r\n FResponse := nil;\r\nend;\r\n\r\ndestructor THttpRequest.Destroy;\r\nbegin\r\n FHeaders.Free;\r\n inherited;\r\nend;\r\n\r\nfunction THttpRequest.Perform: TJSPromise;\r\nbegin\r\n Result := TJSPromise.new(\r\n procedure(ASuccess, AFailed: TJSPromiseResolver)\r\n begin\r\n Execute(\r\n procedure(AResponse: string; ARequest: TJSXMLHttpRequest)\r\n begin\r\n ASuccess(ARequest);\r\n end,\r\n procedure(ARequest: TJSXMLHttpRequest)\r\n begin\r\n AFailed(ARequest);\r\n end,\r\n procedure(ARequest: TJSXMLHttpRequest)\r\n begin\r\n AFailed(ARequest);\r\n end);\r\n end);\r\nend;\r\n\r\nprocedure THttpRequest.Execute(AResponse: THttpResponseProc = nil);\r\nbegin\r\n Execute(AResponse, nil, nil);\r\nend;\r\n\r\nprocedure THttpRequest.Execute(AResponse: THTTPResponseProc; AError: THTTPErrorProc);\r\nbegin\r\n Execute(AResponse, AError, nil);\r\nend;\r\n\r\n\r\nprocedure THttpRequest.Execute(AResponse: THTTPResponseProc; AError: THTTPErrorProc; ATimeOut: THTTPErrorProc);\r\nvar\r\n i: integer;\r\n cmd: string;\r\n req: TJSXMLHttpRequest;\r\n headname,headvalue: string;\r\nbegin\r\n FResponse := AResponse;\r\n FErrorProc := AError;\r\n FTimeOutProc := ATimeOut;\r\n\r\n req := TJSXMLHttpRequest.new;\r\n req.addEventListener('load', @HandleResponse);\r\n req.addEventListener('abort',@HandleAbort);\r\n req.addEventListener('timeout',@HandleTimeout);\r\n req.addEventListener('error',@HandleError);\r\n req.responseType := THTTPRequest.GetResponseType(FResponseType);\r\n\r\n cmd := HTTPCommand(Command, CustomCommand);\r\n\r\n if FTimeout <> 0 then\r\n req.timeout := FTimeout;\r\n\r\n if (FUser <> '') then\r\n begin\r\n req.open(cmd, FURL, true, FUser, FPassword);\r\n req.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\r\n end\r\n else\r\n req.open(cmd, FURL);\r\n\r\n for i := 0 to FHeaders.Count - 1 do\r\n begin\r\n FHeaders.GetNameValue(i, headname, headvalue);\r\n req.setRequestHeader(headname, headvalue);\r\n end;\r\n\r\n if PostData <> '' then\r\n req.send(PostData)\r\n else\r\n req.send;\r\nend;\r\n\r\nclass function THttpRequest.GetResponseType(AResponseType: THTTPRequestResponseType): string;\r\nbegin\r\n Result := '';\r\n case AResponseType of\r\n rtText: Result := 'text';\r\n rtBlob: Result := 'blob';\r\n rtDocument: Result := 'document';\r\n rtJSON: Result := 'json';\r\n rtArrayBuffer: Result := 'arraybuffer';\r\n end;\r\nend;\r\n\r\nfunction THttpRequest.HandleAbort(Event: TEventListenerEvent): boolean;\r\nbegin\r\n if Assigned(OnAbort) then\r\n OnAbort(Self);\r\n Result := true;\r\nend;\r\n\r\nfunction THttpRequest.HandleError(Event: TEventListenerEvent): boolean;\r\nvar\r\n Handled: boolean;\r\n LEventRec: TJSEventRecord;\r\n LRequestRec: TJSXMLHttpRequestRecord;\r\nbegin\r\n Result := true;\r\n Handled := false;\r\n\r\n if Assigned(FOnError) then\r\n begin\r\n LEventRec.event := Event;\r\n LRequestRec.req := TJSXMLHttpRequest(Event.Target);\r\n FOnError(Self, LRequestRec, LEventRec, Handled);\r\n end;\r\n\r\n if Assigned(FErrorProc) then\r\n FErrorProc(LRequestRec.req);\r\n\r\n if not Handled then\r\n raise Exception.Create('HTTP request error @' + URL);\r\nend;\r\n\r\nfunction THttpRequest.HandleResponse(Event: TEventListenerEvent): boolean;\r\nvar\r\n s: string;\r\n LRequestRec: TJSXMLHttpRequestRecord;\r\n\r\nbegin\r\n LRequestRec.req := TJSXMLHttpRequest(Event.target);\r\n\r\n s := '';\r\n if ResponseType in [rtText, rtDefault] then\r\n begin\r\n asm\r\n s = Event.target.responseText;\r\n end;\r\n end;\r\n\r\n if Assigned(OnRequestResponse) then\r\n begin\r\n OnRequestResponse(Self, LRequestRec, s);\r\n end;\r\n\r\n if Assigned(OnResponse) then\r\n OnResponse(Self, s);\r\n\r\n if Assigned(FResponse) then\r\n begin\r\n FResponse(s, LRequestRec.req);\r\n end;\r\n\r\n Result := true;\r\nend;\r\n\r\nfunction THttpRequest.HandleTimeout(Event: TEventListenerEvent): boolean;\r\nbegin\r\n if Assigned(OnTimeout) then\r\n OnTimeout(Self);\r\n\r\n if Assigned(FTimeOutProc) then\r\n FTimeOutProc(TJSXMLHttpRequest(Event.Target));\r\n\r\n Result := true;\r\nend;\r\n\r\nprocedure THttpRequest.SetHeaders(const AValue: TStringList);\r\nbegin\r\n FHeaders.Assign(AValue);\r\nend;\r\n\r\n\r\n{ TRESTClient }\r\n\r\nprocedure TRESTClient.ClearTokens;\r\nbegin\r\n AccessToken := '';\r\n WriteTokens;\r\nend;\r\n\r\nprocedure TRESTClient.Connect;\r\nbegin\r\n if not FEventRegistered then\r\n begin\r\n document.addEventListener('oauthcallback', @HandleAccessToken);\r\n FEventRegistered := true;\r\n end;\r\n\r\n if FPersistTokens.Enabled then\r\n begin\r\n ReadTokens;\r\n\r\n if AccessToken <> '' then\r\n begin\r\n TestTokens;\r\n end\r\n else\r\n DoAuth;\r\n end\r\n else\r\n DoAuth;\r\nend;\r\n\r\nconstructor TRESTClient.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n FPersistTokens := TPersistTokens.Create;\r\n FApp := TRESTApp.Create;\r\n FScopes := TStringList.Create;\r\n FLocale := lcDefault;\r\n FResponseType := rtDefault;\r\nend;\r\n\r\nfunction IntToZStr(i,l: Integer): string;\r\nvar\r\n Res: string;\r\nbegin\r\n Res := IntToStr(i);\r\n while Length(Res) '' then\r\n req.setRequestHeader('Content-Type', ContentType);\r\n\r\n if FAccessToken <> '' then\r\n req.setRequestHeader('Authorization', 'Bearer ' + FAccessToken);\r\n\r\n if Assigned(headers) then\r\n begin\r\n for i := 0 to Length(headers) - 1 do\r\n req.setRequestHeader(headers[i].header, headers[i].value);\r\n end;\r\n\r\n if Data = '' then\r\n req.send(nil)\r\n else\r\n req.send(Data);\r\nend;\r\n\r\nprocedure TRESTClient.HttpsDelete(URL: string);\r\nbegin\r\n HttpsCommand('DELETE', URL, '','', nil);\r\nend;\r\n\r\nprocedure TRESTClient.HttpsDelete(URL: string; headers: TCoreCloudHeaders);\r\nbegin\r\n HttpsCommand('DELETE', URL,'','', headers);\r\nend;\r\n\r\nprocedure TRESTClient.HttpsGet(URL: string; headers: TCoreCloudHeaders);\r\nbegin\r\n HttpsCommand('GET', URL,'','', headers);\r\nend;\r\n\r\nprocedure TRESTClient.HttpsGet(URL: string);\r\nbegin\r\n HttpsCommand('GET', URL,'','', nil);\r\nend;\r\n\r\nprocedure TRESTClient.HttpsPost(URL, ContentType, Data: string);\r\nbegin\r\n HttpsCommand('POST',URL,Data,ContentType,nil);\r\nend;\r\n\r\nprocedure TRESTClient.HttpsPost(URL: string; headers: TCoreCloudHeaders;\r\n Data: string);\r\nbegin\r\n HttpsCommand('POST', URL, Data, '', headers);\r\nend;\r\n\r\nprocedure TRESTClient.HttpsPut(URL, ContentType, Data: string);\r\nbegin\r\n HttpsCommand('PUT', URL, Data, ContentType, nil);\r\nend;\r\n\r\nprocedure TRESTClient.HttpsUpdate(URL: string; headers: TCoreCloudHeaders;\r\n Data: string);\r\nbegin\r\n HttpsCommand('PUT', URL, Data, '', headers);\r\nend;\r\n\r\nprocedure TRESTClient.HttpsPost(URL, Data: string);\r\nbegin\r\n HttpsPost(URL, Data, '');\r\nend;\r\n\r\n{$HINTS OFF}\r\nclass function TRESTClient.InstallCallback: boolean;\r\nvar\r\n scriptsrc: string;\r\nbegin\r\n scriptsrc :=\r\n ' function processAuthData(access_token) {'\r\n +'var event = new CustomEvent(\"oauthcallback\", {'#13\r\n\t\t\t+' detail: {'#13\r\n\t\t\t+' message: access_token'#13\r\n\t\t\t+' },'#13\r\n\t\t\t+' bubbles: true,'#13\r\n\t\t\t+' cancelable: true});'#13\r\n +' document.dispatchEvent(event);'\r\n +'}';\r\n\r\n asm\r\n var script = document.createElement(\"script\");\r\n script.innerHTML = scriptsrc;\r\n document.head.appendChild(script);\r\n\r\n var scr = document.createElement('script');\r\n scr.async = true;\r\n scr.defer = true;\r\n scr.type = 'text/javascript';\r\n document.body.appendChild(scr);\r\n end;\r\n\r\n Result := true;\r\nend;\r\n{$HINTS ON}\r\n\r\nclass function TRESTClient.IsoToDate(const s: string): TDateTime;\r\nvar\r\n da,mo,ye: Word;\r\n err: Integer;\r\nbegin\r\n Val(Copy(s,1,4),ye,err);\r\n Val(Copy(s,6,2),mo,err);\r\n Val(Copy(s,9,2),da,err);\r\n\r\n if ye < 1 then\r\n ye := 1;\r\n if mo < 1 then\r\n mo := 1;\r\n if da < 1 then\r\n da := 1;\r\n\r\n Result := EncodeDate(ye,mo,da) + EncodeTime(0,0,0,0);\r\nend;\r\n\r\nclass function TRESTClient.IsIsoDateTime(const s: string): boolean;\r\nvar\r\n da,mo,ye,ho,mi,se: Word;\r\n err: Integer;\r\nbegin\r\n Result := true;\r\n\r\n Val(Copy(s,1,4),ye,err);\r\n if err <> 0 then\r\n exit(False);\r\n if not (copy(s,5,1) = '-') then\r\n exit(False);\r\n\r\n Val(Copy(s,6,2),mo,err);\r\n if err <> 0 then\r\n exit(False);\r\n\r\n if not (copy(s,8,1) = '-') then\r\n exit(False);\r\n\r\n Val(Copy(s,9,2),da,err);\r\n if err <> 0 then\r\n exit(False);\r\n\r\n Val(Copy(s,12,2),ho,err);\r\n if err = 0 then\r\n begin\r\n if not (copy(s,14,1) = ':') then\r\n exit(False);\r\n\r\n Val(Copy(s,15,2),mi,err);\r\n if err <> 0 then\r\n exit(False);\r\n\r\n if not (copy(s,17,1) = ':') then\r\n exit(False);\r\n\r\n Val(Copy(s,18,2),se,err);\r\n if err <> 0 then\r\n exit(False);\r\n end;\r\nend;\r\n\r\n\r\nclass function TRESTClient.IsoToDateTime(const s: string;\r\n IsUTC: Boolean): TDateTime;\r\nvar\r\n da,mo,ye,ho,mi,se: Word;\r\n HourOffset, MinuteOffset: Integer;\r\n err: Integer;\r\n sign: string;\r\nbegin\r\n HourOffset := 0;\r\n MinuteOffset := 0;\r\n\r\n Val(Copy(s,1,4),ye,err);\r\n Val(Copy(s,6,2),mo,err);\r\n Val(Copy(s,9,2),da,err);\r\n Val(Copy(s,12,2),ho,err);\r\n Val(Copy(s,15,2),mi,err);\r\n Val(Copy(s,18,2),se,err);\r\n\r\n if ye < 1 then\r\n ye := 1;\r\n if mo < 1 then\r\n mo := 1;\r\n if da < 1 then\r\n da := 1;\r\n\r\n //Get TimeOffset from ISO string\r\n if Length(s) > 20 then\r\n begin\r\n sign := Copy(s,20,1);\r\n Val(Copy(s,22,2), HourOffset, err);\r\n Val(Copy(s,25,2), MinuteOffset, err);\r\n\r\n if sign = '-' then\r\n begin\r\n HourOffset := HourOffset * -1;\r\n MinuteOffset := MinuteOffset * -1;\r\n end;\r\n end;\r\n\r\n Result := EncodeDate(ye,mo,da) + EncodeTime(ho,mi,se,0);\r\n// Result := AdjustDateTime(Result, HourOffset, MinuteOffset, IsUTC);\r\nend;\r\n\r\nclass function TRESTClient.IsoToDateTime(const s: string): TDateTime;\r\nvar\r\n da,mo,ye,ho,mi,se: Word;\r\n err: Integer;\r\nbegin\r\n Val(Copy(s,1,4),ye,err);\r\n Val(Copy(s,6,2),mo,err);\r\n Val(Copy(s,9,2),da,err);\r\n Val(Copy(s,12,2),ho,err);\r\n Val(Copy(s,15,2),mi,err);\r\n Val(Copy(s,18,2),se,err);\r\n\r\n if ye < 1 then\r\n ye := 1;\r\n if mo < 1 then\r\n mo := 1;\r\n if da < 1 then\r\n da := 1;\r\n\r\n Result := EncodeDate(ye,mo,da) + EncodeTime(ho,mi,se,0);\r\nend;\r\n\r\nclass function TRESTClient.JSONEscape(s: string): string;\r\nbegin\r\n Result := encodeURIComponent(s);\r\nend;\r\n\r\nprocedure TRESTClient.ReadTokens;\r\nvar\r\n ls: TLocalStorage;\r\nbegin\r\n // retrieve the token from local storage\r\n if FPersistTokens.Enabled and (FPersistTokens.Key <> '') then\r\n begin\r\n ls := TLocalStorage.Create;\r\n FAccessToken := ls.Values[FPersistTokens.Key];\r\n ls.Free;\r\n end;\r\n\r\nend;\r\n\r\nfunction TRESTClient.ScopeParamText(Delimiter: string; Encode: boolean): string;\r\nvar\r\n i: integer;\r\n scopestr: string;\r\nbegin\r\n Result := '';\r\n for i := 0 to Scopes.Count - 1 do\r\n begin\r\n if Encode then\r\n scopestr := encodeURIComponent(Scopes[i])\r\n else\r\n scopestr := Scopes[i];\r\n\r\n if Result = '' then\r\n Result := scopestr\r\n else\r\n Result := Result + Delimiter + scopestr;\r\n end;\r\nend;\r\n\r\nprocedure TRESTClient.SetApp(const Value: TRESTApp);\r\nbegin\r\n FApp.Assign(Value);\r\nend;\r\n\r\nprocedure TRESTClient.SetPersistTokens(const Value: TPersistTokens);\r\nbegin\r\n FPersistTokens.Assign(Value);\r\nend;\r\n\r\nprocedure TRESTClient.SetScopes(const Value: TStrings);\r\nbegin\r\n FScopes.Assign(Value);\r\nend;\r\n\r\nprocedure TRESTClient.TestTokens;\r\nbegin\r\n if Assigned(OnAccessToken) then\r\n OnAccessToken(Self);\r\nend;\r\n\r\nfunction TRESTClient.TMSUTF8Encode(s: string): string;\r\nbegin\r\n Result := s;\r\nend;\r\n\r\nfunction TRESTClient.URLEncode(URI: string): string;\r\nbegin\r\n Result := encodeURIComponent(URI);\r\nend;\r\n\r\nprocedure TRESTClient.WriteTokens;\r\nvar\r\n ls: TLocalStorage;\r\nbegin\r\n if FPersistTokens.Enabled and (FPersistTokens.Key <> '') then\r\n begin\r\n ls := TLocalStorage.Create;\r\n ls.Values[FPersistTokens.Key] := FAccessToken;\r\n ls.Free;\r\n end;\r\nend;\r\n\r\n{ TPersistTokens }\r\n\r\nprocedure TPersistTokens.Assign(Source: TPersistent);\r\nbegin\r\n if (Source is TPersistTokens) then\r\n begin\r\n FKey := (Source as TPersistTokens).Key;\r\n FEnabled := (Source as TPersistTokens).Enabled;\r\n end;\r\nend;\r\n\r\nconstructor TPersistTokens.Create;\r\nbegin\r\n FEnabled := false;\r\n FKey := '';\r\nend;\r\n\r\n{ TRESTApp }\r\n\r\nprocedure TRESTApp.Assign(Source: TPersistent);\r\nbegin\r\n if (Source is TRESTApp) then\r\n begin\r\n FKey := (Source as TRESTApp).Key;\r\n FCallbackURL := (Source as TRESTApp).CallbackURL;\r\n FSecret := (Source as TRESTApp).Secret;\r\n end;\r\nend;\r\n\r\n\r\nbegin\r\n TRESTClient.InstallCallback;\r\n\r\nend.\r\n","unit Utilities;\r\n\r\ninterface\r\n\r\nuses\r\n SysUtils, Classes, JS, Web, WEBLib.Dialogs, WEBLib.Modules,\r\n Parameters;\r\n\r\nconst\r\n ccLogin = 1;\r\n ccSetupOptions = 2;\r\n ccFormLayouts = 3;\r\n ccGetData = 4;\r\n ccSendData = 5;\r\n ccGetPDF = 6;\r\n ccUploadDoc = 7;\r\n ccPayService = 8;\r\n ccPayServiceComplete = 9;\r\n ccSDSave = 10;\r\n ccSDSaveWH = 11;\r\n ccSDSaveTP = 12;\r\n ccSDMail = 13;\r\n ccSDSubm = 14;\r\n ccSDPay = 15;\r\n ccTouch = 16;\r\n ccMessage = 17;\r\n\r\n procedure LogMessage; varargs;\r\n// function XMLSplitArray(tXML: string): TStringParamArray;\r\n function XMLSplitList(tXML: string): TDataPairParams;\r\n function XMLSplitValue(tXML: string): string;\r\n function XMLSplitPairParams(tXML: string): TDataPairParams;\r\n function XMLSplitParams(tXML: string): TStringParams;\r\n\r\n function BoolToString(b: boolean): string;\r\n procedure IncCallCounter(ndx: integer; sub: string='');\r\n procedure ZeroCallCounters;\r\n function CallCounterList: string;\r\n function LoginPurposes(minus, plus: string): string;\r\n\r\n function IndexInList(val, lst: string): integer;\r\n\r\nvar CallCounters: array[1..20] of integer;\r\n\r\nimplementation\r\n\r\nuses entForms;\r\n\r\nprocedure LogMessage; varargs;\r\nvar i: integer;\r\nbegin\r\n\tfor i := 0 to JSArguments.length - 1 do\r\n \tconsole.log(JSArguments[i]);\r\nend;\r\n\r\nprocedure IncCallCounter(ndx: integer; sub: string='');\r\nbegin\r\n\tif sub > '' then begin\r\n \tif sub = 'SAVE' then ndx := ccSDSave\r\n else if sub = 'SAVEWH' then ndx := ccSDSaveWH\r\n else if sub = 'SAVETP' then ndx := ccSDSaveTP\r\n else if sub = 'MAIL' then ndx := ccSDMail\r\n else if sub = 'SUBM' then ndx := ccSDSubm\r\n else if copy(sub, 1, 3) = 'PAY' then ndx := ccSDPay;\r\n \tCallCounters[ndx] := CallCounters[ndx] + 1;\r\n end\r\n\telse\r\n \tCallCounters[ndx] := CallCounters[ndx] + 1;\r\nend;\r\n\r\nprocedure ZeroCallCounters;\r\nvar ndx: integer;\r\nbegin\r\n\tfor ndx := 1 to 20 do\r\n\t\tCallCounters[ndx] := 0;\r\nend;\r\n\r\nfunction CallCounterList: string;\r\nvar ndx: integer;\r\n\r\n\tfunction GetType(i: integer): string;\r\n begin\r\n \tcase i of\r\n ccLogin: result := 'Login: ';\r\n ccGetData: result := 'GetData: ';\r\n ccSetupOptions: result := 'Opts: ';\r\n ccFormLayouts: result := 'FormLay: ';\r\n ccSendData: result := 'SendData: ';\r\n ccGetPDF: result := 'GetPDF: ';\r\n ccUploadDoc: result := 'UplDoc: ';\r\n ccPayService: result := 'PaySvc: ';\r\n ccPayServiceComplete: result := 'PaySvcComp: ';\r\n ccSDSave: result := 'SDSave: ';\r\n ccSDSaveWH: result := 'SDSaveWH: ';\r\n ccSDSaveTP: result := 'SDSaveTP: ';\r\n ccSDMail: result := 'SDMail: ';\r\n ccSDSubm: result := 'SDSubm: ';\r\n ccSDPay: result := 'SDPay: ';\r\n ccTouch: result := 'Touch: ';\r\n ccMessage: result := 'Msg: ';\r\n end;\r\n end;\r\n\r\nbegin\r\n\tresult := '';\r\n\tfor ndx := 1 to 20 do\r\n \tif CallCounters[ndx] > 0 then\r\n\t\t\tresult := result + gettype(ndx) + inttostr(CallCounters[ndx]) + ' ' + #13;\r\nend;\r\n\r\n{function XMLSplitArray(tXML: string): TStringParamArray;\r\nbegin\r\nend;\r\n}\r\n\r\nfunction StripWrapper(tXML: string): string;\r\nvar s, sout: string;\r\n\t i, p: integer;\r\nbegin\r\n\tp := pos('\"value\"', tXML);\r\n s := copy(tXML, p+9, length(tXML)-p-10);\r\n sout := '';\r\n for i := 1 to length(s) do begin\r\n \tif (s[i] <> '\"') and (s[i] <> #13) then begin\r\n \tif s[i] = #10 then sout := sout + '|'\r\n else if (s[i] = ',') and (s[i+1]=#13) then begin end\t// just skip comma at end of line\r\n else if (s[i] = ' ') and (i > 1) and (s[i-1]=':') then begin end\t// just skip comma at end of line\r\n else sout := sout + s[i];\r\n end;\r\n end;\r\n result := sout;\r\nend;\r\n\r\nfunction XMLSplitList(tXML: string): TDataPairParams;\r\nvar s: string;\r\n st, en, cnt: integer;\r\nbegin\r\n s := StripWrapper(tXML);\r\n // should look like [|{|cod:val| ... |}|]|\r\n cnt := 0;\r\n st := 1;\r\n while (cnt < 2) and (st < length(s)) do begin\r\n if s[st] = '|' then inc(cnt);\r\n inc(st);\r\n end;\r\n cnt := 0;\r\n en := length(s);\r\n while (cnt < 3) and (en > 1) do begin\r\n if s[en] = '|' then inc(cnt);\r\n dec(en);\r\n end;\r\n s := copy(s, st, en-st+2);\r\n result := TDataPairParams.Create(50, '|', 0, ':');\r\n result.AsString := s;\r\nend;\r\n\r\nfunction XMLSplitPairParams(tXML: string): TDataPairParams;\r\nvar s: string;\r\nbegin\r\n s := StripWrapper(tXML);\r\n // should look like cod:val| ... |\r\n result := TDataPairParams.Create(100, '|', 0, '=');\r\n result.AsString := s;\r\nend;\r\n\r\nfunction XMLSplitParams(tXML: string): TStringParams;\r\nvar s: string;\r\nbegin\r\n s := StripWrapper(tXML);\r\n // should look like val1|val2 ... |\r\n result := TStringParams.Create(150, '|');\r\n result.AsString := s;\r\nend;\r\n\r\nfunction XMLSplitValue(tXML: string): string;\r\nvar s, sout: string;\r\n\t i, p: integer;\r\nbegin\r\n\tp := pos('\"value\"', tXML);\r\n s := copy(tXML, p+9, length(tXML)-p-10);\r\n sout := '';\r\n i := 1;\r\n while (i <= length(s)) do begin\r\n \tif (s[i] = '\\') then begin\r\n if copy(s, i, 4) = '\\r\\n' then begin\r\n \tsout := sout + '~';\r\n i := i + 3;\r\n end;\r\n end\r\n \telse if (s[i] <> '\"') then begin\r\n sout := sout + s[i];\r\n end;\r\n inc(i);\r\n end;\r\n result := sout;\r\n(* showmessage('SplitValue:'+#13+sout);\r\n s := '';\r\n p := 0;\r\n for i := 1 to length(sout) do begin\r\n \tif sout[i] = #13 then begin\r\n\t s := s + '{CR';\r\n \t\tp := 0;\r\n end\r\n \telse if sout[i] = #10 then s := s + 'LF}'\r\n else if sout[i] = '~' then begin\r\n \ts := s + '{~}';\r\n p := 0;\r\n end\r\n \telse if p < 15 then s := s + sout[i];\r\n inc(p);\r\n end;\r\n showmessage('SplitValue2:'+#13+s);\r\n*)\r\nend;\r\n\r\n\r\nfunction BoolToString(b: boolean): string;\r\nbegin\r\n\tif b then result := 'Y'\r\n else result := 'N';\r\nend;\r\n\r\nfunction LoginPurposes(minus, plus: string): string;\r\nvar s, sout, c: string;\r\n\t i: integer;\r\nbegin\r\n\tsout := '';\r\n s := LoginForm.Purposes;\r\n for i := 1 to length(s) do begin\r\n \tc := copy(s, i, 1);\r\n if pos(c, minus) = 0 then\r\n \tsout := sout + c;\r\n end;\r\n for i := 1 to length(plus) do begin\r\n \tc := copy(plus, i, 1);\r\n if pos(c, sout) = 0 then\r\n \tsout := sout + c;\r\n end;\r\n result := sout;\r\nend;\r\n\r\nfunction IndexInList(val, lst: string): integer;\r\nvar parm: TStringParams;\r\nbegin\r\n parm := TStringParams.create;\r\n parm.asString := lst;\r\n result := parm.FindInList(val);\r\n parm.free;\r\nend;\r\n\r\nend.\r\n","{*************************************************************************}\r\n{ TAdvTreeNodes }\r\n{ for Delphi & C++Builder }\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright (c) 2019 - 2021 }\r\n{ Email : info@tmssoftware.com }\r\n{ Website : http://www.tmssoftware.com/ }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The component can be freely used in any application. The complete }\r\n{ source code remains property of the author and may not be distributed, }\r\n{ published, given or sold in any form as such. No parts of the source }\r\n{ code can be included in any other component or application without }\r\n{ written authorization of the author. }\r\n{*************************************************************************}\r\n\r\nunit WEBLib.TreeNodes;\r\n\r\n\r\ninterface\r\nuses\r\n Classes, Types, SysUtils, Web;\r\n\r\ntype\r\n TTreeNode = class;\r\n TTreeNodes = class;\r\n\r\n TDbgList = class(TList)\r\n private\r\n function GetItemsEx(Index: Integer): TTreeNode;\r\n procedure SetItemsEx(Index: Integer; const Value: TTreeNode);\r\n public\r\n procedure AssignList(ListA: TList);\r\n property Items[Index: Integer]: TTreeNode read GetItemsEx write SetItemsEx; default;\r\n end;\r\n\r\n{ TTreeNode }\r\n\r\n TNodeType = (ntText, ntCheckbox, ntRadioButton);\r\n\r\n TImageIndex = integer;\r\n\r\n PNodeInfo = ^TNodeInfo;\r\n TNodeInfo = packed record\r\n SelectedIndex: Integer;\r\n StateIndex: Integer;\r\n OverlayIndex: Integer;\r\n Data: Pointer;\r\n Count: Integer;\r\n Text: string;\r\n NodeType: TNodeType;\r\n Checked: Boolean;\r\n ImageURL: string;\r\n ImageCollapsedURL: string;\r\n URL: string;\r\n Tag: Integer;\r\n Hint: string;\r\n IsExpanded: Boolean;\r\n end;\r\n\r\n TNodeDataInfo = packed record\r\n SelectedIndex: Integer;\r\n StateIndex: Integer;\r\n OverlayIndex: Integer;\r\n Data: Pointer;\r\n Count: Integer;\r\n NodeType: TNodeType;\r\n Checked: Boolean;\r\n Tag: Integer;\r\n IsExpanded: Boolean;\r\n TextLen: Byte;\r\n HintLen: Byte;\r\n URLLen: Byte;\r\n ImageURLLen: Byte;\r\n ImageCollapsedURLLen: Byte;\r\n end;\r\n\r\n TTreeNodeClass = class of TTreeNode;\r\n\r\n TTreeNode = class(TPersistent)\r\n private\r\n FOwner: TTreeNodes;\r\n FText: string;\r\n FData: TObject;\r\n FDeleting: Boolean;\r\n FIsExpanded: Boolean;\r\n FFirstChild: TTreeNode;\r\n FNextSibling: TTreeNode;\r\n FPrevSibling: TTreeNode;\r\n FParentNode: TTreeNode;\r\n FShowText: Boolean;\r\n FImageCollapsedURL: string;\r\n FImageURL: string;\r\n FNodeType: TNodeType;\r\n FURL: string;\r\n FChecked: boolean;\r\n FTag: Integer;\r\n FHint: string;\r\n function GetLevel: Integer;\r\n function GetParent: TTreeNode;\r\n function GetIndex: Integer;\r\n function GetItem(Index: Integer): TTreeNode;\r\n function GetCount: Integer;\r\n procedure SetData(Value: TObject);\r\n procedure SetItem(Index: Integer; Value: TTreeNode);\r\n procedure SetText(const S: string);\r\n function GetHasChildren: Boolean;\r\n procedure SetShowText(const Value: Boolean);\r\n //procedure ReadData(Stream: TStream; var Info: TNodeDataInfo);\r\n //procedure WriteData(Stream: TStream; var Info: TNodeDataInfo);\r\n procedure SetChecked(const Value: boolean);\r\n procedure SetImageCollapsedURL(const Value: string);\r\n procedure SetImageURL(const Value: string);\r\n procedure SetNodeType(const Value: TNodeType);\r\n procedure SetURL(const Value: string);\r\n procedure SetTag(const Value: Integer);\r\n procedure SetHint(const Value: string);\r\n procedure SetIsExpanded(const Value: Boolean);\r\n protected\r\n function CompareCount(CompareMe: Integer): Boolean;\r\n property Owner: TTreeNodes read FOwner;\r\n function IsEqual(Node: TTreeNode): Boolean;\r\n public\r\n property Item[Index: Integer]: TTreeNode read GetItem write SetItem; default;\r\n function IndexOf(Value: TTreeNode): Integer;\r\n property Count: Integer read GetCount;\r\n property Index: Integer read GetIndex;\r\n\r\n constructor Create(AOwner: TTreeNodes);\r\n destructor Destroy; override;\r\n\r\n function AddFirstChild(const S: string): TTreeNode; overload;\r\n function AddFirstChild(const S: string; Data: TObject): TTreeNode; overload;\r\n function AddChild(const S: string): TTreeNode; overload;\r\n function AddChild(const S: string; Data: TObject): TTreeNode; overload;\r\n procedure Assign(Source: TPersistent); override;\r\n\r\n procedure Expand(Recurse: boolean); virtual;\r\n procedure Collapse(Recurse: boolean); virtual;\r\n\r\n procedure Delete;\r\n procedure DeleteChildren;\r\n\r\n function GetFirstChild: TTreeNode;\r\n function GetLastChild: TTreeNode;\r\n function GetNextChild(Value: TTreeNode): TTreeNode;\r\n function GetNextSibling: TTreeNode;\r\n function GetPrevChild(Value: TTreeNode): TTreeNode;\r\n function GetPrevSibling: TTreeNode;\r\n function HasAsParent(Value: TTreeNode): Boolean;\r\n function IsFirstNode: Boolean;\r\n function IsFirstChild: Boolean;\r\n\r\n property Deleting: Boolean read FDeleting;\r\n property Expanded: Boolean read FIsExpanded write SetIsExpanded;\r\n property HasChildren: Boolean read GetHasChildren;\r\n property Level: Integer read GetLevel;\r\n property Parent: TTreeNode read GetParent;\r\n property Text: string read FText write SetText;\r\n property Data: TObject read FData write SetData;\r\n property ShowText: Boolean read FShowText write SetShowText default true;\r\n property NodeType: TNodeType read FNodeType write SetNodeType default ntText;\r\n property Checked: boolean read FChecked write SetChecked default False;\r\n property URL: string read FURL write SetURL;\r\n\r\n property ImageCollapsedURL: string read FImageCollapsedURL write SetImageCollapsedURL;\r\n property ImageURL: string read FImageURL write SetImageURL;\r\n property Tag: Integer read FTag write SetTag default 0;\r\n property Hint: string read FHint write SetHint;\r\n end;\r\n\r\n\r\n TNodeEvent = procedure(Sender: TObject; ANode: TTreeNode) of object;\r\n\r\n{ TTreeNodes }\r\n\r\n TTreeNodes = class(TPersistent)\r\n private\r\n FOwner: TComponent;\r\n FFirstNode: TTreeNode;\r\n FNodeList: TDbgList;\r\n FDeleting: Boolean;\r\n FReading: Boolean;\r\n FOnChange: TNotifyEvent;\r\n FOnExpandedChange: TNodeEvent;\r\n function GetNodeFromIndex(Index: Integer): TTreeNode;\r\n //procedure ReadData(Stream: TStream);\r\n //procedure WriteData(Stream: TStream);\r\n protected\r\n //procedure DefineProperties(Filer: TFiler); override;\r\n procedure SetItem(Index: Integer; Value: TTreeNode);\r\n function GetCount: Integer;\r\n function InsertNode(ParentNode: TTreeNode; DesNode: TTreeNode; InsertBefore: Boolean): TTreeNode;\r\n function IsVeryFirstNode(Node: TTreeNode): Boolean;\r\n function CreateNode: TTreeNode;\r\n property Reading: Boolean read FReading;\r\n public\r\n constructor Create(AOwner: TComponent);\r\n destructor Destroy; override;\r\n function AddFirst(const S: string): TTreeNode; overload;\r\n function AddFirst(Data: TObject; const S: string): TTreeNode; overload;\r\n function Add(Sibling: TTreeNode; const S: string): TTreeNode; overload;\r\n function Add(Sibling: TTreeNode; const S: string; Data: TObject): TTreeNode; overload;\r\n function Add(const S: string): TTreeNode; overload;\r\n function Add(const S: string; Data: TObject): TTreeNode; overload;\r\n function AddChild(Parent: TTreeNode; const S: string): TTreeNode; overload;\r\n function AddChild(Parent: TTreeNode; const S: string; Data: TObject): TTreeNode; overload;\r\n function AddChildFirst(Parent: TTreeNode; const S: string): TTreeNode; overload;\r\n function AddChildFirst(Parent: TTreeNode; const S: string; Data: TObject): TTreeNode; overload;\r\n\r\n procedure Assign(Source: TPersistent); override;\r\n procedure Clear;\r\n procedure Delete(Node: TTreeNode);\r\n function GetFirstNode: TTreeNode;\r\n function GetLastNode: TTreeNode;\r\n function Insert(Sibling: TTreeNode; const S: string): TTreeNode;\r\n function InsertObject(Sibling: TTreeNode; const S: string; Data: TObject): TTreeNode;\r\n property Count: Integer read GetCount;\r\n property Item[Index: Integer]: TTreeNode read GetNodeFromIndex; default;\r\n property Owner: TComponent read FOwner;\r\n property OnChange: TNotifyEvent read FOnChange write FOnChange;\r\n property OnExpandedChange: TNodeEvent read FOnExpandedChange write FOnExpandedChange;\r\n procedure Changed;\r\n end;\r\n\r\nimplementation\r\n\r\nuses\r\n Math;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\n{ TDbgList }\r\n\r\nprocedure TDbgList.AssignList(ListA: TList);\r\nvar\r\n I: Integer;\r\nbegin\r\n Clear;\r\n for I := 0 to ListA.Count - 1 do\r\n Add(ListA[I]);\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nfunction TDbgList.GetItemsEx(Index: Integer): TTreeNode;\r\nbegin\r\n if (Index >= Count) then\r\n begin\r\n raise Exception.Create('Index out of bounds in list read access');\r\n end;\r\n\r\n if Index < Count then\r\n Result := TTreeNode(inherited Items[Index])\r\n else\r\n Result := nil;\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nprocedure TDbgList.SetItemsEx(Index: Integer; const Value: TTreeNode);\r\nbegin\r\n if (Index >= Count) then\r\n begin\r\n raise Exception.Create('Index out of bounds in list write access');\r\n end;\r\n if Index < Count then\r\n inherited Items[Index] := value;\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\n{ TTreeNode }\r\n\r\nconstructor TTreeNode.Create(AOwner: TTreeNodes);\r\nbegin\r\n inherited Create;\r\n FOwner := AOwner;\r\n FShowText := true;\r\n FNodeType := ntText;\r\n FChecked := False;\r\n FIsExpanded := False;\r\n FTag := 0;\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\ndestructor TTreeNode.Destroy;\r\nvar\r\n N, PN, NN: TTreeNode;\r\n i: Integer;\r\nbegin\r\n FDeleting := True;\r\n\r\n DeleteChildren;\r\n\r\n N := Parent;\r\n if (((N <> nil) and (not N.Deleting)) or (N = nil)) and (not Owner.FDeleting) and Assigned(Owner) and Assigned(Owner.Owner) and not (csDestroying in Owner.Owner.ComponentState) then\r\n begin\r\n PN := getPrevSibling;\r\n NN := getNextSibling;\r\n\r\n if not Assigned(NN) then\r\n begin\r\n if IsFirstNode then\r\n Owner.FFirstNode := nil\r\n else if Assigned(Parent) and IsFirstChild then\r\n Parent.FFirstChild := nil\r\n else\r\n begin\r\n if Assigned(PN) then\r\n PN.FNextSibling := nil;\r\n end;\r\n end\r\n else if not Assigned(PN) then\r\n begin\r\n if IsFirstNode then\r\n begin\r\n Owner.FFirstNode := NN;\r\n NN.FPrevSibling := PN;\r\n end\r\n else if Assigned(Parent) and IsFirstChild then\r\n Parent.FFirstChild := NN;\r\n end\r\n else\r\n begin\r\n PN.FNextSibling := NN;\r\n NN.FPrevSibling := PN;\r\n end;\r\n end;\r\n\r\n if not Assigned(Parent) then\r\n begin\r\n i := Owner.FNodeList.IndexOf(Self);\r\n if (i >= 0) then\r\n begin\r\n Owner.FNodeList.Delete(i);\r\n end;\r\n end;\r\n\r\n Data := nil;\r\n inherited Destroy;\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nprocedure TTreeNode.Expand(Recurse: boolean);\r\nvar\r\n i: integer;\r\nbegin\r\n Expanded := true;\r\n\r\n if recurse then\r\n begin\r\n for i := 0 to Count - 1 do\r\n Item[i].Expand(Recurse);\r\n end;\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nfunction TTreeNode.HasAsParent(Value: TTreeNode): Boolean;\r\nbegin\r\n if Value <> Nil then\r\n begin\r\n if Parent = nil then Result := False\r\n else if Parent = Value then Result := True\r\n else Result := Parent.HasAsParent(Value);\r\n end\r\n else Result := True;\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nprocedure TTreeNode.SetTag(const Value: Integer);\r\nbegin\r\n FTag := Value;\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nprocedure TTreeNode.SetText(const S: string);\r\nbegin\r\n if not Deleting and (S <> Text) then\r\n begin\r\n FText := S;\r\n end;\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nprocedure TTreeNode.SetURL(const Value: string);\r\nbegin\r\n FURL := Value;\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nprocedure TTreeNode.SetChecked(const Value: boolean);\r\nbegin\r\n FChecked := Value;\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nprocedure TTreeNode.SetData(Value: TObject);\r\nbegin\r\n if not Deleting and (Value <> Data) then\r\n begin\r\n FData := Value;\r\n end;\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nprocedure TTreeNode.SetHint(const Value: string);\r\nbegin\r\n FHint := Value;\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nprocedure TTreeNode.SetImageCollapsedURL(const Value: string);\r\nbegin\r\n FImageCollapsedURL := Value;\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nprocedure TTreeNode.SetImageURL(const Value: string);\r\nbegin\r\n FImageURL := Value;\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nprocedure TTreeNode.SetIsExpanded(const Value: Boolean);\r\nbegin\r\n FIsExpanded := Value;\r\n if Assigned(FOwner) then\r\n if Assigned(FOwner.OnExpandedChange) then\r\n FOwner.OnExpandedChange(FOwner, Self);\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nprocedure TTreeNode.Collapse(Recurse: boolean);\r\nvar\r\n i: integer;\r\nbegin\r\n Expanded := false;\r\n\r\n if recurse then\r\n begin\r\n for i := 0 to Count - 1 do\r\n Item[i].Collapse(Recurse);\r\n end;\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nfunction TTreeNode.CompareCount(CompareMe: Integer): Boolean;\r\nvar\r\n Count: integer;\r\n Node: TTreeNode;\r\nBegin\r\n Count := 0;\r\n Result := False;\r\n Node := GetFirstChild;\r\n while Node <> nil do\r\n begin\r\n Inc(Count);\r\n Node := Node.GetNextChild(Node);\r\n if Count > CompareMe then\r\n Exit;\r\n end;\r\n if Count = CompareMe then\r\n Result := True;\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nfunction TTreeNode.GetHasChildren: Boolean;\r\nbegin\r\n Result := Assigned(FFirstChild);\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nfunction TTreeNode.GetParent: TTreeNode;\r\nbegin\r\n Result := FParentNode;\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nfunction TTreeNode.GetNextSibling: TTreeNode;\r\nbegin\r\n Result := FNextSibling;\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nfunction TTreeNode.GetPrevSibling: TTreeNode;\r\nbegin\r\n Result := FPrevSibling;\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nfunction TTreeNode.GetNextChild(Value: TTreeNode): TTreeNode;\r\nbegin\r\n if Value <> nil then Result := Value.GetNextSibling\r\n else Result := nil;\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nfunction TTreeNode.GetPrevChild(Value: TTreeNode): TTreeNode;\r\nbegin\r\n if Value <> nil then Result := Value.GetPrevSibling\r\n else Result := nil;\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nfunction TTreeNode.GetFirstChild: TTreeNode;\r\nbegin\r\n Result := FFirstChild;\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nfunction TTreeNode.GetLastChild: TTreeNode;\r\nvar\r\n Node: TTreeNode;\r\nbegin\r\n Result := GetFirstChild;\r\n if Result <> nil then\r\n begin\r\n Node := Result;\r\n repeat\r\n Result := Node;\r\n Node := Result.GetNextSibling;\r\n until Node = nil;\r\n end;\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nfunction TTreeNode.GetIndex: Integer;\r\nvar\r\n Node: TTreeNode;\r\nbegin\r\n Result := -1;\r\n Node := Self;\r\n// while Node <> nil do\r\n while Assigned(Node) do\r\n begin\r\n Inc(Result);\r\n Node := Node.GetPrevSibling;\r\n end;\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nfunction TTreeNode.GetItem(Index: Integer): TTreeNode;\r\nbegin\r\n Result := GetFirstChild;\r\n while (Result <> nil) and (Index > 0) do\r\n begin\r\n Result := GetNextChild(Result);\r\n Dec(Index);\r\n end;\r\n if Result = nil then raise Exception.Create('Invalid index');\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nprocedure TTreeNode.SetItem(Index: Integer; Value: TTreeNode);\r\nbegin\r\n item[Index].Assign(Value);\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nprocedure TTreeNode.SetNodeType(const Value: TNodeType);\r\nbegin\r\n FNodeType := Value;\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nprocedure TTreeNode.SetShowText(const Value: Boolean);\r\nbegin\r\n FShowText := Value;\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nfunction TTreeNode.IndexOf(Value: TTreeNode): Integer;\r\nvar\r\n Node: TTreeNode;\r\nbegin\r\n Result := -1;\r\n Node := GetFirstChild;\r\n while (Node <> nil) do\r\n begin\r\n Inc(Result);\r\n if Node = Value then Break;\r\n Node := GetNextChild(Node);\r\n end;\r\n if Node = nil then Result := -1;\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nfunction TTreeNode.GetCount: Integer;\r\nvar\r\n Node: TTreeNode;\r\nbegin\r\n Result := 0;\r\n Node := GetFirstChild;\r\n while Node <> nil do\r\n begin\r\n Inc(Result);\r\n Node := Node.GetNextChild(Node);\r\n end;\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nfunction TTreeNode.IsFirstNode: Boolean;\r\nbegin\r\n Result := Self = Owner.FFirstNode; // not Deleting and (Parent = nil) and (GetPrevSibling = nil);\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nfunction TTreeNode.IsFirstChild: Boolean;\r\nbegin\r\n Result := IsFirstNode or (Assigned(Parent) and (Parent.getFirstChild = Self));\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nfunction TTreeNode.GetLevel: Integer;\r\nvar\r\n Node: TTreeNode;\r\nbegin\r\n Result := 0;\r\n Node := Parent;\r\n while Node <> nil do\r\n begin\r\n Inc(Result);\r\n Node := Node.Parent;\r\n end;\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nprocedure TTreeNode.Delete;\r\nbegin\r\n if not Deleting then\r\n Free;\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nprocedure TTreeNode.DeleteChildren;\r\nvar\r\n ChildList: TDbgList;\r\n N: TTreeNode;\r\n i: Integer;\r\nbegin\r\n ChildList := TDbgList.Create;\r\n N := GetFirstChild;\r\n if N <> nil then\r\n begin\r\n repeat\r\n ChildList.Add(N);\r\n N := N.GetNextSibling;\r\n until N = nil;\r\n end;\r\n\r\n for i := ChildList.Count - 1 downto 0 do\r\n begin\r\n N := ChildList[i];\r\n N.Free;\r\n ChildList[i].Delete;\r\n end;\r\n ChildList.Free;\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nfunction TTreeNode.AddChild(const S: string): TTreeNode;\r\nbegin\r\n Result := AddChild(S, nil);\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nfunction TTreeNode.AddChild(const S: string; Data: TObject): TTreeNode;\r\nvar\r\n N: TTreeNode;\r\nbegin\r\n N := GetLastChild;\r\n if Assigned(N) then\r\n Result := Owner.InsertNode(nil, N, False)\r\n else\r\n Result := Owner.InsertNode(Self, nil, False);\r\n Result.Text := S;\r\n Result.Data := Data;\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nfunction TTreeNode.AddFirstChild(const S: string): TTreeNode;\r\nbegin\r\n Result := AddFirstChild(S, nil);\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nfunction TTreeNode.AddFirstChild(const S: string; Data: TObject): TTreeNode;\r\nbegin\r\n if not Assigned(FFirstChild) then\r\n Result := Owner.InsertNode(Self, nil, True)\r\n else\r\n Result := Owner.InsertNode(nil, FFirstChild, True);\r\n Result.Text := S;\r\n Result.Data := Data;\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nprocedure TTreeNode.Assign(Source: TPersistent);\r\nvar\r\n Node: TTreeNode;\r\nbegin\r\n if not Deleting and (Source is TTreeNode) then\r\n begin\r\n Node := TTreeNode(Source);\r\n Text := Node.Text;\r\n Data := Node.Data;\r\n ShowText := Node.ShowText;\r\n NodeType := Node.NodeType;\r\n Checked := Node.Checked;\r\n URL := Node.URL;\r\n Hint := Node.Hint;\r\n ImageURL := Node.ImageURL;\r\n ImageCollapsedURL := Node.ImageCollapsedURL;\r\n Tag := Node.Tag;\r\n FIsExpanded := Node.Expanded;\r\n end\r\n else\r\n inherited Assign(Source);\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nfunction TTreeNode.IsEqual(Node: TTreeNode): Boolean;\r\nbegin\r\n Result := (Text = Node.Text) and (Data = Node.Data);\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n(*\r\nprocedure TTreeNode.ReadData(Stream: TStream; var Info: TNodeDataInfo);\r\nvar\r\n I, Size, ItemCount, SzM: Integer;\r\n LNode: TTreeNode;\r\n s: string;\r\nbegin\r\n Stream.ReadBuffer(Size, SizeOf(Size));\r\n Stream.ReadBuffer(Info, SizeOf(TNodeDataInfo));\r\n\r\n {$IFDEF DELPHI_UNICODE}\r\n SzM := 2;\r\n {$ENDIF}\r\n\r\n {$IFNDEF DELPHI_UNICODE}\r\n SzM := 1;\r\n {$ENDIF}\r\n\r\n SetLength(S, Info.TextLen);\r\n Stream.ReadBuffer(S[1], SzM * Info.TextLen);\r\n Text := S;\r\n\r\n SetLength(S, Info.HintLen);\r\n Stream.ReadBuffer(S[1], SzM * Info.HintLen);\r\n Hint := S;\r\n\r\n SetLength(S, Info.URLLen);\r\n Stream.ReadBuffer(S[1], SzM * Info.URLLen);\r\n URL := S;\r\n\r\n SetLength(S, Info.ImageURLLen);\r\n Stream.ReadBuffer(S[1], SzM * Info.ImageURLLen);\r\n ImageURL := S;\r\n\r\n SetLength(S, Info.ImageCollapsedURLLen);\r\n Stream.ReadBuffer(S[1], SzM * Info.ImageCollapsedURLLen);\r\n ImageCollapsedURL := S;\r\n\r\n NodeType := Info.NodeType;\r\n Checked := Info.Checked;\r\n Tag := Info.Tag;\r\n IsExpanded := Info.IsExpanded;\r\n\r\n ItemCount := Info.Count;\r\n for I := 0 to ItemCount - 1 do\r\n begin\r\n LNode := AddChild(''); //Owner.Add(Self, '');\r\n LNode.FParentNode := Self;\r\n LNode.ReadData(Stream, Info);\r\n //Owner.Owner.Added(LNode);\r\n end;\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nprocedure TTreeNode.WriteData(Stream: TStream; var Info: TNodeDataInfo);\r\nvar\r\n I, Size, ItemCount, SzM: Integer;\r\nbegin\r\n //L := Length(Text);\r\n //if L > 255 then L := 255;\r\n //Size := SizeOf(TNodeInfo) + L - 255;\r\n\r\n //L := Min(255, Length(Text)) + Min(255, Length(URL)) + Min(255, Length(Hint)) + Min(255, Length(ImageURL)) + Min(255, Length(ImageCollapsedURL));\r\n //Size := SizeOf(TNodeInfo) + L - 255 * 5;\r\n\r\n {$IFDEF DELPHI_UNICODE}\r\n SzM := 2;\r\n {$ENDIF}\r\n\r\n {$IFNDEF DELPHI_UNICODE}\r\n SzM := 1;\r\n {$ENDIF}\r\n\r\n Info.TextLen := Min(255, Length(Text));\r\n Info.HintLen := Min(255, Length(Hint));\r\n Info.URLLen := Min(255, Length(URL));\r\n Info.ImageURLLen := Min(255, Length(ImageURL));\r\n Info.ImageCollapsedURLLen := Min(255, Length(ImageCollapsedURL));\r\n\r\n Info.NodeType := NodeType;\r\n Info.Checked := Checked;\r\n Info.Tag := Tag;\r\n Info.IsExpanded := IsExpanded;\r\n\r\n ItemCount := Count;\r\n Info.Count := ItemCount;\r\n\r\n Size := SizeOf(TNodeDataInfo) + (Info.TextLen + Info.HintLen + Info.URLLen + Info.ImageURLLen + Info.ImageCollapsedURLLen);\r\n\r\n Stream.WriteBuffer(Size, SizeOf(Size));\r\n Stream.WriteBuffer(Info, SizeOf(TNodeDataInfo));\r\n Stream.WriteBuffer(Text[1], SzM * Info.TextLen);\r\n Stream.WriteBuffer(Hint[1], SzM * Info.HintLen);\r\n Stream.WriteBuffer(URL[1], SzM * Info.URLLen);\r\n Stream.WriteBuffer(ImageURL[1], SzM * Info.ImageURLLen);\r\n Stream.WriteBuffer(ImageCollapsedURL[1], SzM * Info.ImageCollapsedURLLen);\r\n\r\n for I := 0 to ItemCount - 1 do\r\n Item[I].WriteData(Stream, Info);\r\nend;\r\n*)\r\n//------------------------------------------------------------------------------\r\n\r\n{ TTreeNodes }\r\n\r\nconstructor TTreeNodes.Create(AOwner: TComponent);\r\nbegin\r\n inherited Create;\r\n FOwner := AOwner;\r\n FFirstNode := nil;\r\n FNodeList := TDbgList.Create;\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nfunction TTreeNodes.CreateNode: TTreeNode;\r\nvar\r\n LClass: TTreeNodeClass;\r\nbegin\r\n LClass := TTreeNode;\r\n Result := LClass.Create(Self);\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\ndestructor TTreeNodes.Destroy;\r\nbegin\r\n FDeleting := True;\r\n Clear;\r\n FNodeList.Free;\r\n inherited Destroy;\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nprocedure TTreeNodes.Delete(Node: TTreeNode);\r\nbegin\r\n Node.Delete;\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nprocedure TTreeNodes.Changed;\r\nbegin\r\n if Assigned(OnChange) then\r\n OnChange(Self);\r\nend;\r\n\r\nprocedure TTreeNodes.Clear;\r\nvar\r\n i: Integer;\r\nbegin\r\n for i := FNodeList.Count - 1 downto 0 do\r\n FNodeList[i].Delete;\r\n\r\n FNodeList.Clear;\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nfunction TTreeNodes.GetCount: Integer;\r\nbegin\r\n Result := FNodeList.Count;\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nfunction TTreeNodes.GetNodeFromIndex(Index: Integer): TTreeNode;\r\nbegin\r\n Result := nil;\r\n if (Index >= 0) and (Index < FNodeList.Count) then\r\n Result := FNodeList[Index];\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nprocedure TTreeNodes.SetItem(Index: Integer; Value: TTreeNode);\r\nbegin\r\n if (Index >= 0) and (Index < FNodeList.Count) then\r\n GetNodeFromIndex(Index).Assign(Value);\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nfunction TTreeNodes.Insert(Sibling: TTreeNode; const S: string): TTreeNode;\r\nbegin\r\n Result := InsertObject(Sibling, S, nil);\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nfunction TTreeNodes.InsertObject(Sibling: TTreeNode; const S: string;\r\n Data: TObject): TTreeNode;\r\nbegin\r\n Result := InsertNode(nil, Sibling, True);\r\n if Assigned(Result) then\r\n begin\r\n Result.Text := S;\r\n Result.Data := Data;\r\n end;\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nfunction TTreeNodes.IsVeryFirstNode(Node: TTreeNode): Boolean;\r\nbegin\r\n Result := Assigned(Node) and (Node = FFirstNode); \r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nfunction TTreeNodes.GetFirstNode: TTreeNode;\r\nbegin\r\n Result := FFirstNode;\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nfunction TTreeNodes.GetLastNode: TTreeNode;\r\nbegin\r\n Result := FFirstNode;\r\n if Assigned(Result) then\r\n while (Result.getNextSibling <> nil) do\r\n Result := Result.getNextSibling;\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nfunction TTreeNodes.Add(Sibling: TTreeNode; const S: string): TTreeNode;\r\nbegin\r\n Result := Add(Sibling, S, nil);\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nfunction TTreeNodes.Add(Sibling: TTreeNode; const S: string; Data: TObject): TTreeNode;\r\nbegin\r\n Result := InsertNode(Sibling, GetLastNode, False);\r\n Result.Text := S;\r\n Result.Data := Data;\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nfunction TTreeNodes.Add(const S: string): TTreeNode;\r\nbegin\r\n Result := Add(S, nil);\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nfunction TTreeNodes.Add(const S: string; Data: TObject): TTreeNode;\r\nbegin\r\n Result := InsertNode(nil, GetLastNode, False);\r\n Result.Text := S;\r\n Result.Data := Data;\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nfunction TTreeNodes.AddChild(Parent: TTreeNode; const S: string): TTreeNode;\r\nbegin\r\n Result := AddChild(Parent, S, nil);\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nfunction TTreeNodes.AddChild(Parent: TTreeNode;\r\n const S: string; Data: TObject): TTreeNode;\r\nbegin\r\n Result := nil;\r\n\r\n if Assigned(Parent) then\r\n Result := Parent.AddChild(S, Data);\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nfunction TTreeNodes.AddChildFirst(Parent: TTreeNode;\r\n const S: string): TTreeNode;\r\nbegin\r\n Result := AddChildFirst(Parent, S, nil);\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nfunction TTreeNodes.AddChildFirst(Parent: TTreeNode;\r\n const S: string; Data: TObject): TTreeNode;\r\nbegin\r\n Result := nil;\r\n if Assigned(Parent) then\r\n Result := Parent.AddFirstChild(S, Data)\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nfunction TTreeNodes.AddFirst(const S: string): TTreeNode;\r\nbegin\r\n Result := AddFirst(nil, S);\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nfunction TTreeNodes.AddFirst(Data: TObject; const S: string): TTreeNode;\r\nbegin\r\n if not Assigned(FFirstNode) then\r\n begin\r\n //Result := CreateNode;\r\n //FFirstNode := Result\r\n Result := InsertNode(nil, nil, True);\r\n end\r\n else\r\n begin\r\n Result := InsertNode(nil, FFirstNode, True);\r\n end;\r\n Result.Text := S;\r\n Result.Data := Data;\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nfunction TTreeNodes.InsertNode(ParentNode: TTreeNode; DesNode: TTreeNode; InsertBefore: Boolean): TTreeNode;\r\nvar\r\n N: TTreeNode;\r\nbegin\r\n Result := nil;\r\n if not Assigned(DesNode) then\r\n begin\r\n if Assigned(ParentNode) then\r\n begin\r\n N := ParentNode.GetLastChild;\r\n if Assigned(N) then\r\n begin\r\n InsertNode(nil, N, False);\r\n Exit;\r\n end\r\n else // First Child Node\r\n begin\r\n Result := CreateNode;\r\n ParentNode.FFirstChild := Result;\r\n Result.FParentNode := ParentNode;\r\n Exit;\r\n {\r\n if Assigned(ParentNode.GetNextSibling) then\r\n FNodeList.Insert(ParentNode.GetNextSibling.Index, Result)\r\n else\r\n FNodeList.Add(Result);\r\n }\r\n end;\r\n end\r\n else\r\n begin\r\n if not Assigned(FFirstNode) then\r\n begin\r\n Result := CreateNode;\r\n FFirstNode := Result; // very first Node\r\n FNodeList.Add(Result);\r\n end;\r\n end;\r\n end\r\n else\r\n begin\r\n Result := CreateNode;\r\n if InsertBefore then\r\n begin\r\n if IsVeryFirstNode(DesNode) then\r\n begin\r\n FFirstNode := Result;\r\n Result.FNextSibling := DesNode;\r\n DesNode.FPrevSibling := Result;\r\n FNodeList.Insert(0,Result);\r\n end\r\n else\r\n begin\r\n//fix: if DesNode is not the first node in a treeview, but a first child in a parent node (with DesNode.FPrevSibling = nil),\r\n//then execution continues on \"else\" branch and DesNode.Parent.FFirstChild does not change\r\n//- it remains pointing to DesNode, not on newly inserted node\r\n// if DesNode.IsFirstNode and Assigned(DesNode.Parent) then\r\n if DesNode.IsFirstChild and Assigned(DesNode.Parent) then\r\n begin\r\n DesNode.Parent.FFirstChild := Result;\r\n Result.FNextSibling := DesNode;\r\n DesNode.FPrevSibling := Result;\r\n Result.FParentNode := DesNode.Parent;\r\n end\r\n else\r\n begin\r\n Result.FPrevSibling := DesNode.FPrevSibling;\r\n Result.FNextSibling := DesNode;\r\n DesNode.FPrevSibling := Result;\r\n Result.FParentNode := DesNode.Parent;\r\n if Assigned(Result.FPrevSibling) then\r\n Result.FPrevSibling.FNextSibling := Result;\r\n end;\r\n end;\r\n end\r\n else // Insert after DesNode\r\n begin\r\n Result.FNextSibling := DesNode.FNextSibling;\r\n Result.FPrevSibling := DesNode;\r\n DesNode.FNextSibling := Result;\r\n if Assigned(Result.FNextSibling) then\r\n Result.FNextSibling.FPrevSibling := Result;\r\n Result.FParentNode := DesNode.Parent;\r\n if not Assigned(DesNode.Parent) then // Root Node\r\n FNodeList.Add(Result);\r\n end;\r\n end;\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nprocedure TTreeNodes.Assign(Source: TPersistent);\r\nvar\r\n// TreeNodes: TTreeNodes;\r\n// MemStream: TMemoryStream;\r\nbegin\r\n\r\n if Source is TTreeNodes then\r\n begin\r\n// TreeNodes := TTreeNodes(Source);\r\n Clear;\r\n (*\r\n MemStream := TMemoryStream.Create;\r\n try\r\n TreeNodes.WriteData(MemStream);\r\n MemStream.Position := 0;\r\n ReadData(MemStream);\r\n finally\r\n MemStream.Free;\r\n end;\r\n *)\r\n end\r\n else inherited Assign(Source);\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n(*\r\nprocedure TTreeNodes.DefineProperties(Filer: TFiler);\r\n\r\n function WriteNodes: Boolean;\r\n var\r\n I: Integer;\r\n Nodes: TTreeNodes;\r\n begin\r\n Nodes := TTreeNodes(Filer.Ancestor);\r\n if Nodes = nil then\r\n Result := Count > 0\r\n else if Nodes.Count <> Count then\r\n Result := True\r\n else\r\n begin\r\n Result := False;\r\n for I := 0 to Count - 1 do\r\n begin\r\n Result := not Item[I].IsEqual(Nodes[I]);\r\n if Result then\r\n Break;\r\n end\r\n end;\r\n end;\r\n\r\nbegin\r\n inherited DefineProperties(Filer);\r\n Filer.DefineBinaryProperty('Data', ReadData, WriteData, WriteNodes);\r\nend;\r\n*)\r\n//------------------------------------------------------------------------------\r\n(*\r\nprocedure TTreeNodes.ReadData(Stream: TStream);\r\nvar\r\n I, Count: Integer;\r\n NodeInfo: TNodeDataInfo;\r\n LNode: TTreeNode;\r\nbegin\r\n FReading := True;\r\n try\r\n Clear;\r\n Stream.ReadBuffer(Count, SizeOf(Count));\r\n for I := 0 to Count - 1 do\r\n begin\r\n LNode := Add('');\r\n LNode.ReadData(Stream, NodeInfo);\r\n end;\r\n finally\r\n FReading := False;\r\n end;\r\nend;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\nprocedure TTreeNodes.WriteData(Stream: TStream);\r\nvar\r\n I: Integer;\r\n Node: TTreeNode;\r\n NodeInfo: TNodeDataInfo;\r\nbegin\r\n I := 0;\r\n Node := GetFirstNode;\r\n while Node <> nil do\r\n begin\r\n Inc(I);\r\n Node := Node.GetNextSibling;\r\n end;\r\n Stream.WriteBuffer(I, SizeOf(I));\r\n Node := GetFirstNode;\r\n while Node <> nil do\r\n begin\r\n Node.WriteData(Stream, NodeInfo);\r\n Node := Node.GetNextSibling;\r\n end;\r\nend;\r\n*)\r\n//------------------------------------------------------------------------------\r\n\r\n\r\nend.\r\n","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright (c) 2018 - 2021 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.ComCtrls;\r\n\r\n{$DEFINE NOPP}\r\n\r\ninterface\r\n\r\nuses\r\n Classes, SysUtils, Web, WEBLib.Controls, WEBLib.Graphics, WEBLib.ExtCtrls,\r\n WEBLib.TreeNodes;\r\n\r\ntype\r\n TCustomRichEdit = class;\r\n\r\n TTextAttributes = class(TPersistent)\r\n private\r\n RichEdit: TCustomRichEdit;\r\n FAlignment: TAlignment;\r\n FIsBold: Boolean;\r\n FIsItalic: Boolean;\r\n FIsUnderline: Boolean;\r\n FIsStrikeOut: Boolean;\r\n FBackColor: TColor;\r\n FColor: TColor;\r\n FHeight: Integer;\r\n FName: String;\r\n FOrderedList: Boolean;\r\n FSize: Integer;\r\n FStyle: TFontStyles;\r\n FUnOrderedList: Boolean;\r\n procedure SetAlignment(Value: TAlignment);\r\n procedure SetBackColor(Value: TColor);\r\n procedure SetColor(Value: TColor);\r\n procedure SetHeight(Value: Integer);\r\n procedure SetName(Value: String);\r\n procedure SetOrderedList(Value: Boolean);\r\n procedure SetSize(Value: Integer);\r\n procedure SetStyle(Value: TFontStyles);\r\n procedure SetUnOrderedList(Value: Boolean);\r\n protected\r\n procedure AssignTo(Dest: TPersistent); override;\r\n public\r\n constructor Create(AOwner: TCustomRichEdit); reintroduce;\r\n procedure Assign(Source: TPersistent); override;\r\n procedure Cut;\r\n procedure Copy;\r\n procedure Paste;\r\n procedure Image;\r\n procedure Link;\r\n property Alignment: TAlignment read FAlignment write SetAlignment;\r\n property BackColor: TColor read FBackColor write SetBackColor;\r\n property Color: TColor read FColor write SetColor;\r\n property Height: Integer read FHeight write SetHeight;\r\n property Name: String read FName write SetName;\r\n property OrderedList: Boolean read FOrderedList write SetOrderedList;\r\n property Size: Integer read FSize write SetSize;\r\n property Style: TFontStyles read FStyle write SetStyle;\r\n property UnOrderedList: Boolean read FUnOrderedList write SetUnOrderedList;\r\n end;\r\n\r\n TSelAttributes = record\r\n FontName: string;\r\n FontSize: string;\r\n FontColor: string;\r\n BkColor: string;\r\n IsBold: boolean;\r\n IsItalic: boolean;\r\n IsStrikeThrough: boolean;\r\n IsUnderline: boolean;\r\n IsLeft: boolean;\r\n IsRight: boolean;\r\n IsCenter: boolean;\r\n end;\r\n\r\n TAttributesChangeEvent = procedure(Sender: TObject; Attributes: TSelAttributes) of object;\r\n\r\n TCustomRichEdit = class(TCustomControl)\r\n private\r\n FOwner: TCustomControl;\r\n FLines: TStrings;\r\n FSelAttributes: TTextAttributes;\r\n FAutoSize: Boolean;\r\n FOnSelectionChange: TNotifyEvent;\r\n FShowFocus: boolean;\r\n FInsertLineBreaks: boolean;\r\n FWantTabs: boolean;\r\n FReadOnly: boolean;\r\n FOnChange: TNotifyEvent;\r\n FOnAttributesChanged: TAttributesChangeEvent;\r\n function GetText: String;\r\n function GetPlainText: String;\r\n procedure SetText(const Value: String);\r\n procedure SetSelAttributes(Value: TTextAttributes);\r\n procedure SetAutoSize(const Value: Boolean);\r\n procedure SetShowFocus(const Value: boolean); reintroduce;\r\n procedure SetReadOnly(const Value: boolean);\r\n function GetLines: TStrings;\r\n protected\r\n function CreateElement: TJSElement; override;\r\n// function ElementIFrameHandle: TJSWindow;\r\n function ElementIFrameHandle: TJSDocument;\r\n procedure UpdateElement; override;\r\n procedure Loaded; override;\r\n function CanShowFocus: boolean; override;\r\n procedure DoHandleInput(Event: TJSEvent); virtual;\r\n function HandleDoSelectionChange(Event: TEventListenerEvent): Boolean; virtual;\r\n function HandleDoKeyDown(Event: TJSKeyBoardEvent): Boolean; override;\r\n procedure SetLines(ALines: TStrings);\r\n procedure DoLinesChange(Sender: TObject);\r\n property Text: String read GetText write SetText;\r\n property Font;\r\n property Color;\r\n property BorderStyle;\r\n property AutoSize: Boolean read FAutoSize write SetAutoSize default false;\r\n property Lines: TStrings read GetLines write SetLines;\r\n property OnClick;\r\n property OnDblClick;\r\n property OnChange: TNotifyEvent read FOnChange write FOnChange;\r\n property OnSelectionChange: TNotifyEvent read FOnSelectionChange write FOnSelectionChange;\r\n property PlainText: string read GetPlainText;\r\n procedure DoChange; virtual;\r\n procedure BindEvents; override;\r\n procedure GetSelectionAttributes(selnode:TJSNode);\r\n property OnAttributesChanged: TAttributesChangeEvent read FOnAttributesChanged write FOnAttributesChanged;\r\n public\r\n procedure CreateInitialize; override;\r\n destructor Destroy; override;\r\n function GetContent: string;\r\n procedure DoSelectAction(StartPosition, EndPosition: integer);\r\n procedure DoEditAction(ActionString: string); overload;\r\n procedure DoEditAction(ActionString: string; Data: string); overload;\r\n procedure SelectText(StartPosition, EndPosition: integer);\r\n procedure DoImageAction;\r\n procedure DoLinkAction;\r\n procedure AppendHTML(HTML: string);\r\n procedure AppendLineBreak;\r\n procedure InsertHTML(HTML: String);\r\n procedure InsertLineBreak;\r\n property InsertLineBreaks: boolean read FInsertLineBreaks write FInsertLineBreaks default false;\r\n property SelAttributes: TTextAttributes read FSelAttributes write SetSelAttributes;\r\n property ShowFocus: boolean read FShowFocus write SetShowFocus default true;\r\n property Owner: TCustomControl read FOwner write FOwner;\r\n property ReadOnly: boolean read FReadOnly write SetReadOnly default false;\r\n property WantTabs: boolean read FWantTabs write FWantTabs default false;\r\n end;\r\n\r\n TRichEdit = class(TCustomRichEdit)\r\n public\r\n property Owner;\r\n property PlainText;\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property AutoSize;\r\n property ElementClassName;\r\n property ElementFont;\r\n property ElementID;\r\n property ElementPosition;\r\n property Font;\r\n property Color;\r\n property DragMode;\r\n property BorderStyle;\r\n property Height;\r\n property HeightPercent;\r\n property HeightStyle;\r\n property InsertLinebreaks;\r\n property Lines;\r\n property Margins;\r\n property ReadOnly;\r\n property WantTabs;\r\n property Width;\r\n property WidthPercent;\r\n property WidthStyle;\r\n property OnChange;\r\n property OnClick;\r\n property OnDblClick;\r\n property OnSelectionChange;\r\n property OnKeyDown;\r\n property OnKeyPress;\r\n property OnKeyUp;\r\n property OnMouseDown;\r\n property OnMouseUp;\r\n property OnMouseMove;\r\n property OnMouseLeave;\r\n property OnMouseEnter;\r\n property OnEnter;\r\n property OnExit;\r\n property OnDragDrop;\r\n property OnDragOver;\r\n property OnEndDrag;\r\n property OnStartDrag;\r\n end;\r\n\r\n TWebRichEdit = class(TRichEdit);\r\n\r\n TTabSet = class(TCustomControl)\r\n private\r\n FItems: TStringList;\r\n FItemIndex: integer;\r\n FSelectedColor: TColor;\r\n FOnChange: TNotifyEvent;\r\n FSelectedTextColor: TColor;\r\n procedure SetSelectedColor(const Value: TColor);\r\n procedure SetSelectedTextColor(const Value: TColor);\r\n protected\r\n function CreateElement: TJSElement; override;\r\n function HandleDoClick(Event: TJSMouseEvent): Boolean; override;\r\n function HandleDoChange(Event: TEventListenerEvent): Boolean; virtual;\r\n function HandleDoItemMouseOut(Event: TJSMouseEvent): Boolean; virtual;\r\n function HandleDoItemMouseOver(Event: TJSMouseEvent): Boolean; virtual;\r\n procedure BindEvents; override;\r\n procedure SetItems(AItems: TStringList);\r\n procedure SetItemIndex(AIndex: integer);\r\n procedure DoUpdateList; virtual;\r\n procedure Loaded; override;\r\n procedure ItemsChanged(Sender: TObject);\r\n procedure EnableDrag; override;\r\n procedure DisableDrag; override;\r\n public\r\n procedure CreateInitialize; override;\r\n destructor Destroy; override;\r\n procedure EndUpdate; override;\r\n procedure Clear;\r\n procedure SelectNextTab(GoForward: boolean);\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property Color;\r\n property DragMode;\r\n property ElementClassName;\r\n property ElementFont;\r\n property ElementID;\r\n property ElementPosition;\r\n property Enabled;\r\n property Font;\r\n property Height;\r\n property HeightPercent;\r\n property HeightStyle;\r\n property Hint;\r\n property ItemIndex: integer read FItemIndex write SetItemIndex;\r\n property Items: TStringList read FItems write SetItems;\r\n property Left;\r\n property Margins;\r\n property ParentFont;\r\n property ShowHint;\r\n property SelectedColor: TColor read FSelectedColor write SetSelectedColor default clSilver;\r\n property SelectedTextColor: TColor read FSelectedTextColor write SetSelectedTextColor default clBlack;\r\n property TabOrder;\r\n property TabStop;\r\n property Top;\r\n property Visible;\r\n property Width;\r\n property WidthPercent;\r\n property WidthStyle;\r\n property OnChange: TNotifyEvent read FOnChange write FOnChange;\r\n property OnClick;\r\n property OnDblClick;\r\n property OnKeyDown;\r\n property OnKeyPress;\r\n property OnKeyUp;\r\n property OnMouseDown;\r\n property OnMouseUp;\r\n property OnMouseMove;\r\n property OnMouseLeave;\r\n property OnMouseEnter;\r\n property OnEnter;\r\n property OnExit;\r\n property OnDragDrop;\r\n property OnDragOver;\r\n property OnEndDrag;\r\n property OnStartDrag;\r\n end;\r\n\r\n TWebTabSet = class(TTabSet);\r\n\r\n TTabSheet = class(TCustomPanel)\r\n private\r\n FTabVisible: Boolean;\r\n FPosUpdating: Boolean;\r\n FOnShow: TNotifyEvent;\r\n FOnHide: TNotifyEvent;\r\n procedure SetTabVisible(const Value: Boolean);\r\n protected\r\n procedure SetCaption(const AValue: string); override;\r\n procedure SetParent(AValue: TControl); override;\r\n procedure ResetUpdate;\r\n public\r\n procedure CreateInitialize; override;\r\n procedure EndUpdate; override;\r\n procedure SetBounds(X, Y, AWidth, AHeight: Integer); override;\r\n destructor Destroy; override;\r\n property ShowCaption;\r\n published\r\n property Alignment;\r\n property AlignWithMargins;\r\n property BorderColor;\r\n property BorderStyle;\r\n property Caption;\r\n property Color;\r\n property DragMode;\r\n property ElementBodyClassName;\r\n property ElementID;\r\n property ElementFont;\r\n property ElementPosition;\r\n property Font;\r\n property HeightPercent;\r\n property HeightStyle;\r\n property Margins;\r\n property Padding;\r\n property ParentFont;\r\n property Role;\r\n property WidthPercent;\r\n property WidthStyle;\r\n property TabVisible: Boolean read FTabVisible write SetTabVisible default True;\r\n property Visible;\r\n property OnClick;\r\n property OnDblClick;\r\n property OnHide: TNotifyEvent read FOnHide write FOnHide;\r\n property OnMouseDown;\r\n property OnMouseMove;\r\n property OnMouseUp;\r\n property OnDragDrop;\r\n property OnDragOver;\r\n property OnEndDrag;\r\n property OnShow: TNotifyEvent read FOnShow write FOnShow;\r\n property OnStartDrag;\r\n end;\r\n\r\n TWebTabSheet = class(TTabSheet);\r\n\r\n TPageControl = class(TCustomControl)\r\n private\r\n FDesignTime: boolean;\r\n FPrevTabIndex: Integer;\r\n FItems: TStringList;\r\n FTabIndex: Integer;\r\n FSelectedColor: TColor;\r\n FOnChange: TNotifyEvent;\r\n FSelectedTextColor: TColor;\r\n FShowTabs: boolean;\r\n procedure SetSelectedColor(const AValue: TColor);\r\n procedure SetItems(AItems: TStringList);\r\n procedure SetTabIndex(AIndex: integer);\r\n function GetActivePage: TTabsheet;\r\n function GetActivePageIndex: integer;\r\n procedure SetActivePageIndex(const Value: integer);\r\n procedure SetSelectedTextColor(const Value: TColor);\r\n procedure SetActivePage(const Value: TTabsheet);\r\n procedure SetShowTabs(const Value: boolean);\r\n protected\r\n function GetPage(Index: integer): TTabSheet;\r\n function CreateElement: TJSElement; override;\r\n function HandleDoClick(Event: TJSMouseEvent): Boolean; override;\r\n function HandleDoChange(Event: TJSMouseEvent): Boolean; virtual;\r\n function HandleDoItemMouseOut(Event: TJSMouseEvent): Boolean; virtual;\r\n function HandleDoItemMouseOver(Event: TJSMouseEvent): Boolean; virtual;\r\n function CanAcceptChild(AValue: TControl): TControl; override;\r\n procedure BindEvents; override;\r\n procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;\r\n procedure UpdateElement; override;\r\n procedure DoUpdateList; virtual;\r\n procedure DoUpdateResize; virtual;\r\n procedure Loaded; override;\r\n procedure VisibleChanged; override;\r\n procedure ItemsChanged(Sender: TObject); virtual;\r\n procedure SetParent(AValue: TControl); override;\r\n function GetUniqueName: string;\r\n procedure EnableDrag; override;\r\n procedure DisableDrag; override;\r\n public\r\n procedure CreateInitialize; override;\r\n destructor Destroy; override;\r\n procedure Clear;\r\n procedure EndUpdate; override;\r\n procedure SelectNextPage(GoForward: boolean);\r\n function PageCount: integer;\r\n function PageIndexFromElement(AElement: TJSElement): Integer;\r\n property Pages[index: integer]: TTabSheet read GetPage;\r\n property ActivePageIndex: integer read GetActivePageIndex write SetActivePageIndex;\r\n property ActivePage: TTabsheet read GetActivePage write SetActivePage;\r\n property Items: TStringList read FItems write SetItems;\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property BorderStyle default bsNone;\r\n property ChildOrder;\r\n property DragMode;\r\n property ElementClassName;\r\n property ElementFont;\r\n property ElementID;\r\n property ElementPosition;\r\n property Enabled;\r\n property Font;\r\n property Height;\r\n property HeightPercent;\r\n property HeightStyle;\r\n property Hint;\r\n property TabIndex: integer read FTabIndex write SetTabIndex;\r\n property Left;\r\n property Margins;\r\n property ParentFont;\r\n property ShowHint;\r\n property ShowTabs: boolean read FShowTabs write SetShowTabs default true;\r\n property SelectedColor: TColor read FSelectedColor write SetSelectedColor default clSilver;\r\n property SelectedTextColor: TColor read FSelectedTextColor write SetSelectedTextColor default clBlack;\r\n property TabOrder;\r\n property TabStop;\r\n property Top;\r\n property Visible;\r\n property Width;\r\n property WidthPercent;\r\n property WidthStyle;\r\n property OnChange: TNotifyEvent read FOnChange write FOnChange;\r\n property OnClick;\r\n property OnDblClick;\r\n property OnKeyDown;\r\n property OnKeyPress;\r\n property OnKeyUp;\r\n property OnMouseDown;\r\n property OnMouseUp;\r\n property OnMouseMove;\r\n property OnMouseLeave;\r\n property OnMouseEnter;\r\n property OnEnter;\r\n property OnExit;\r\n property OnDragDrop;\r\n property OnDragOver;\r\n property OnEndDrag;\r\n property OnStartDrag;\r\n end;\r\n\r\n TWebPageControl = class(TPageControl);\r\n\r\n TProgressBarStyle = (pbstNormal, pbstMarquee, pbstDiv);\r\n TProgressBarValue = (pbvNone, pbvPercentage, pbvAbsolute);\r\n\r\n TProgressBar = class(TCustomControl)\r\n private\r\n FMax: integer;\r\n FMin: integer;\r\n FPosition: integer;\r\n FStyle: TProgressBarStyle;\r\n FElementBarClassName: string;\r\n FValue: TProgressBarValue;\r\n procedure SetStyle(const Value: TProgressBarStyle);\r\n procedure SetElementBarClassName(const Value: string);\r\n procedure SetValue(const Value: TProgressBarValue);\r\n protected\r\n function CreateElement: TJSElement; override;\r\n procedure SetMax(AValue: integer);\r\n procedure SetMin(AValue: integer);\r\n procedure SetPosition(AValue: integer);\r\n procedure DoUpdate; virtual;\r\n procedure CreateProgressElement(AElement: TJSElement);\r\n public\r\n procedure CreateInitialize; override;\r\n procedure AfterLoadDFMValues; override;\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property DragMode;\r\n property ElementBarClassName: string read FElementBarClassName write SetElementBarClassName;\r\n property ElementPosition;\r\n property Height;\r\n property HeightPercent;\r\n property HeightStyle;\r\n property Left;\r\n property Margins;\r\n property Max: integer read FMax write SetMax;\r\n property Min: integer read FMin write SetMin;\r\n property Position: integer read FPosition write SetPosition;\r\n property Style: TProgressBarStyle read FStyle write SetStyle;\r\n property Top;\r\n property Value: TProgressBarValue read FValue write SetValue;\r\n property Visible;\r\n property Width;\r\n property WidthPercent;\r\n property WidthStyle;\r\n property OnDragDrop;\r\n property OnDragOver;\r\n property OnEndDrag;\r\n property OnStartDrag;\r\n end;\r\n\r\n TWebProgressBar = class(TProgressBar);\r\n\r\n TTreeViewNodeEvent = procedure(Sender: TObject; Node: TTreeNode) of object;\r\n TTreeViewNodeAllowEvent = procedure(Sender: TObject; Node: TTreeNode; var Allow: boolean) of object;\r\n\r\n TTreeViewNodeRenderEvent = procedure(Sender: TObject; Node: TTreeNode; AElement: TJSHTMLElementRecord) of object;\r\n\r\n TTreeView = class(TCustomControl)\r\n private\r\n FItems: TTreeNodes;\r\n FSelected: TTreeNode;\r\n FOnCollapsing: TTreeViewNodeAllowEvent;\r\n FOnExpanding: TTreeViewNodeAllowEvent;\r\n FOnCollapsed: TTreeViewNodeEvent;\r\n FOnExpanded: TTreeViewNodeEvent;\r\n FOnClickNode: TTreeViewNodeEvent;\r\n FOnDblClickNode: TTreeViewNodeEvent;\r\n FOnRenderNode: TTreeViewNodeRenderEvent;\r\n FAutoExpand: boolean;\r\n FOnChange: TTreeViewNodeEvent;\r\n FOnChanging: TTreeViewNodeAllowEvent;\r\n FElementNodeSelectedClassName: TElementClassName;\r\n FElementNodeClassName: TElementClassName;\r\n procedure SetItems(const Value: TTreeNodes);\r\n function GetSelected: TTreeNode;\r\n procedure SetSelected(const Value: TTreeNode);\r\n procedure SetElementNodeClassName(const Value: TElementClassName);\r\n procedure SetElementNodeSelectedClassName(const Value: TElementClassName);\r\n protected\r\n procedure DoRenderNode(ANode: TTreeNode; AElement: TJSHTMLElement);\r\n function RenderNode(ANode: TTreeNode; AElementName: string): TJSHTMLElement;\r\n procedure RenderNodes;\r\n function CreateElement: TJSElement; override;\r\n procedure DoNodesChanged(Sender: TObject);\r\n procedure DoExpandedChanged(Sender: TObject; ANode: TTreeNode);\r\n function HandleNode(Event: TJSEvent): Boolean; virtual;\r\n function HandleClick(Event: TJSEvent): Boolean; virtual;\r\n function HandleDblClick(Event: TJSEvent): Boolean; virtual;\r\n procedure KeyDown(var Key: Word; Shift: TShiftState); override;\r\n procedure DoChangeSelection(NewNode: TTreeNode); virtual;\r\n procedure EnableDrag; override;\r\n procedure DisableDrag; override;\r\n public\r\n procedure CreateInitialize; override;\r\n destructor Destroy; override;\r\n procedure BeginUpdate; override;\r\n procedure EndUpdate; override;\r\n function GetNodeFromID(AId: string): TTreeNode;\r\n function GetNodeElement(ANode: TTreeNode): TJSHTMLElement;\r\n property Selected: TTreeNode read GetSelected write SetSelected;\r\n procedure Select(const ANode: TTreeNode);\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n\r\n property AutoExpand: boolean read FAutoExpand write FAutoExpand;\r\n property DragMode;\r\n property ElementNodeClassName: TElementClassName read FElementNodeClassName write SetElementNodeClassName;\r\n property ElementNodeSelectedClassName: TElementClassName read FElementNodeSelectedClassName write SetElementNodeSelectedClassName;\r\n property ElementClassName;\r\n property ElementID;\r\n property ElementFont;\r\n property ElementPosition;\r\n\r\n property Font;\r\n property HeightPercent;\r\n property HeightStyle;\r\n\r\n property Items: TTreeNodes read FItems write SetItems;\r\n property Margins;\r\n property ParentFont;\r\n property WidthPercent;\r\n property WidthStyle;\r\n property OnClick;\r\n property OnDblClick;\r\n property OnClickNode: TTreeViewNodeEvent read FOnClickNode write FOnClickNode;\r\n property OnDblClickNode: TTreeViewNodeEvent read FOnDblClickNode write FOnDblClickNode;\r\n property OnRenderNode: TTreeViewNodeRenderEvent read FOnRenderNode write FOnRenderNode;\r\n property OnChange: TTreeViewNodeEvent read FOnChange write FOnChange;\r\n property OnChanging: TTreeViewNodeAllowEvent read FOnChanging write FOnChanging;\r\n\r\n property OnCollapsed: TTreeViewNodeEvent read FOnCollapsed write FOnCollapsed;\r\n property OnCollapsing: TTreeViewNodeAllowEvent read FOnCollapsing write FOnCollapsing;\r\n property OnExpanded: TTreeViewNodeEvent read FOnExpanded write FOnExpanded;\r\n property OnExpanding: TTreeViewNodeAllowEvent read FOnExpanding write FOnExpanding;\r\n\r\n property OnDragDrop;\r\n property OnDragOver;\r\n property OnEndDrag;\r\n property OnStartDrag;\r\n end;\r\n\r\n TWebTreeView = class(TTreeView);\r\n\r\n\r\n\r\nimplementation\r\n\r\nuses\r\n WEBLib.Buttons, WEBLib.Forms;\r\n\r\n{ TCustomRichEdit }\r\n\r\nprocedure TCustomRichEdit.CreateInitialize;\r\nbegin\r\n inherited;\r\n FLines := TStringList.Create;\r\n TStringList(FLines).OnChange := DoLinesChange;\r\n FSelAttributes := TTextAttributes.Create(Self);\r\n FShowFocus := true;\r\n FInsertLineBreaks := false;\r\n Width := 400;\r\n Height := 300;\r\nend;\r\n\r\nprocedure TCustomRichEdit.BindEvents;\r\nbegin\r\n inherited;\r\n Container.addEventListener('input',@DoHandleInput);\r\nend;\r\n\r\nfunction TCustomRichEdit.CanShowFocus: boolean;\r\nbegin\r\n Result := FShowFocus;\r\nend;\r\n\r\nfunction TCustomRichEdit.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('DIV');\r\n TJSHTMLElement(Result).style.setProperty('white-space','normal');\r\nend;\r\n\r\ndestructor TCustomRichEdit.Destroy;\r\nbegin\r\n FLines.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TCustomRichEdit.DoLinesChange(Sender: TObject);\r\nbegin\r\n UpdateElement;\r\nend;\r\n\r\nprocedure TCustomRichEdit.SelectText(StartPosition, EndPosition: integer);\r\nbegin\r\n DoSelectAction(StartPosition, EndPosition);\r\nend;\r\n\r\nprocedure TCustomRichEdit.SetAutoSize(const Value: Boolean);\r\nbegin\r\n if FAutoSize <> Value then\r\n begin\r\n FAutoSize := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomRichEdit.SetLines(ALines: TStrings);\r\nbegin\r\n FLines.Assign(ALines);\r\nend;\r\n\r\nprocedure TCustomRichEdit.SetReadOnly(const Value: boolean);\r\nbegin\r\n if FReadOnly <> Value then\r\n begin\r\n FReadOnly := Value;\r\n if Assigned(ElementHandle) then\r\n begin\r\n if FReadOnly then\r\n ElementHandle.contentEditable := 'false'\r\n else\r\n ElementHandle.contentEditable := 'true';\r\n end;\r\n\r\n end;\r\nend;\r\n\r\nprocedure TCustomRichEdit.SetText(const Value: String);\r\nbegin\r\n FLines.Text := Value;\r\n UpdateElement;\r\nend;\r\n\r\n//function TCustomRichEdit.ElementIFrameHandle: TJSWindow;\r\nfunction TCustomRichEdit.ElementIFrameHandle: TJSDocument;\r\n//var\r\n// iframe: TJSHTMLIFrameElement;\r\nbegin\r\n Result := nil;\r\n if Assigned(ElementHandle) then\r\n begin\r\n// iframe := TJSHTMLIFrameElement(document.getElementById(ElementID));\r\n// if Assigned(iframe) then\r\n// result := iframe.contentWindow.document;\r\n Result := document;\r\n end;\r\nend;\r\n\r\nprocedure GetTextNodes(node: TJSNode; nodes: TList);\r\nvar\r\n children: TJSNodeList;\r\n i, j: integer;\r\n childlist: TList;\r\nbegin\r\n if (node.nodeType = 3) then\r\n nodes.Add(node)\r\n else\r\n begin\r\n children := node.childNodes;\r\n\r\n childlist := TList.Create;\r\n for i := 0 to children.length - 1 do\r\n begin\r\n GetTextNodes(children[i], childlist);\r\n for j := 0 to childlist.count - 1 do\r\n nodes.Add(childlist[j]);\r\n end;\r\n childlist.Free;\r\n end;\r\nend;\r\n\r\nprocedure TCustomRichEdit.DoSelectAction(StartPosition, EndPosition: integer);\r\nvar\r\n s: string;\r\n sstart, send: integer;\r\n el: TJSElement;\r\n range: TJSRange;\r\n textNodes: TList;\r\n textNode: TJSNode;\r\n i: integer;\r\n foundStart: boolean;\r\n charCount, endCharCount: integer;\r\n sel: TJSSelection;\r\nbegin\r\n s := ElementID;\r\n sstart := StartPosition;\r\n send := EndPosition;\r\n\r\n el := document.getElementById(s);\r\n if Assigned(el) then\r\n begin\r\n range := document.createRange;\r\n range.selectNodeContents(el);\r\n textNodes := TList.Create;\r\n\r\n GetTextNodes(el, textNodes);\r\n foundStart := false;\r\n charCount := 0;\r\n endCharCount := 0;\r\n\r\n for i := 0 to textNodes.count - 1 do\r\n begin\r\n textNode := TJSNode(textNodes[i]);\r\n endCharCount := charCount + length(TJSNode(textNode).nodeValue);\r\n\r\n if (not foundStart) and (sstart >= charCount) and ((sstart < endCharCount) or ((sstart = endCharCount) and (i <= textNodes.count))) then\r\n begin\r\n range.setStart(textNode, sstart - charCount);\r\n foundStart := true;\r\n end;\r\n\r\n if (foundStart) and (send <= endCharCount) then\r\n begin\r\n range.setEnd(textNode, send - charCount);\r\n \tbreak;\r\n end;\r\n charCount := endCharCount;\r\n end;\r\n\r\n sel := document.getSelection();\r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n\r\n textNodes.Free;\r\n end;\r\nend;\r\n\r\nprocedure TCustomRichEdit.DoEditAction(ActionString: string);\r\nbegin\r\n if Assigned(ElementIFrameHandle) then\r\n ElementIFrameHandle.execCommand(ActionString, false);\r\nend;\r\n\r\nprocedure TCustomRichEdit.DoChange;\r\nbegin\r\n if Assigned(OnChange) then\r\n OnChange(Self);\r\nend;\r\n\r\nprocedure TCustomRichEdit.DoEditAction(ActionString: string; Data: string);\r\nbegin\r\n if Assigned(ElementIFrameHandle) then\r\n ElementIFrameHandle.execCommand(ActionString, false, Data);\r\nend;\r\n\r\nprocedure TCustomRichEdit.DoHandleInput(Event: TJSEvent);\r\nbegin\r\n DoChange;\r\nend;\r\n\r\nprocedure TCustomRichEdit.DoLinkAction;\r\nvar\r\n url: string;\r\nbegin\r\n if Assigned(ElementHandle) then\r\n begin\r\n url := window.prompt('Enter URL:', 'http://');\r\n if Assigned(url) then\r\n begin\r\n if (url <> '') and (url <> 'http://') and (url <> 'https://') then\r\n DoEditAction('createLink', url);\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TCustomRichEdit.DoImageAction;\r\nvar\r\n url: string;\r\nbegin\r\n if Assigned(ElementHandle) then\r\n begin\r\n url := window.prompt('Enter Image URL:', 'http://');\r\n if Assigned(url) then\r\n begin\r\n if (url <> '') and (url <> 'http://') and (url <> 'https://') then\r\n DoEditAction('insertImage', url);\t\r\n end;\r\n end; \r\nend;\r\n\r\nprocedure TCustomRichEdit.UpdateElement;\r\nvar\r\n i: integer;\r\n s: string;\r\nbegin\r\n inherited;\r\n\r\n if Assigned(ElementIFrameHandle) then\r\n begin\r\n// ElementIFrameHandle.designMode := 'On';\r\n// ElementIFrameHandle.document.open;\r\n// ElementIFrameHandle.document.write(FLines.Text);\r\n// ElementIFrameHandle.document.close;\r\n// ElementIFrameHandle.document.contentEditable = true;\r\n// ElementIFrameHandle.body.innerHTML := FLines.Text;\r\n end;\r\n\r\n if Assigned(ElementHandle) then\r\n begin\r\n s := '';\r\n for i := 0 to FLines.Count - 1 do\r\n begin\r\n if i > 0 then\r\n s := s + '
';\r\n s := s + FLines[i];\r\n end;\r\n\r\n ElementHandle.innerHTML := s;\r\n\r\n if ReadOnly then\r\n ElementHandle.contentEditable := 'false'\r\n else\r\n ElementHandle.contentEditable := 'true';\r\n\r\n ElementHandle.style.setProperty('overflow', 'auto');\r\n ElementHandle.style.setProperty('padding', '3px');\r\n\r\n if BorderStyle = bsSingle then\r\n ElementHandle.style.setProperty('border', '1px solid silver')\r\n else\r\n ElementHandle.style.setProperty('border', '');\r\n end;\r\nend;\r\n\r\nfunction TCustomRichEdit.GetText: String;\r\nbegin\r\n if Assigned(ElementHandle) then\r\n FLines.Text := ElementHandle.innerHTML;\r\n Result := FLines.Text;\r\nend;\r\n\r\nfunction TCustomRichEdit.GetContent: string;\r\nbegin\r\n Result := self.GetText;\r\nend;\r\n\r\nfunction TCustomRichEdit.GetLines: TStrings;\r\nbegin\r\n Result := FLines;\r\nend;\r\n\r\nfunction TCustomRichEdit.GetPlainText: String;\r\nbegin\r\n Result := '';\r\n if Assigned(ElementHandle) then\r\n Result := ElementHandle.innerText;\r\nend;\r\n\r\nprocedure TCustomRichEdit.GetSelectionAttributes(selnode: TJSNode);\r\nvar\r\n el: TJSElement;\r\n fn,fs,fc,fbk: string;\r\n found: boolean;\r\n Attr: TSelAttributes;\r\nbegin\r\n if Assigned(OnAttributesChanged) then\r\n begin\r\n asm\r\n el = null;\r\n if (selnode.focusNode) {\r\n el = selnode.focusNode.parentElement;\r\n }\r\n end;\r\n\r\n repeat\r\n found := false;\r\n if Assigned(el) then\r\n begin\r\n if el.tagName = 'B' then\r\n begin\r\n found := true;\r\n Attr.IsBold := true;\r\n end;\r\n if el.tagName = 'I' then\r\n begin\r\n found := true;\r\n Attr.IsItalic := true;\r\n end;\r\n if el.tagName = 'U' then\r\n begin\r\n found := true;\r\n Attr.IsUnderline := true;\r\n end;\r\n\r\n if el.tagName = 'STRIKE' then\r\n begin\r\n found := true;\r\n Attr.IsStrikeThrough := true;\r\n end;\r\n\r\n if el.tagName = 'SPAN' then\r\n begin\r\n fbk := TJSHTMLElement(el).style.getPropertyValue('background-color');\r\n\r\n asm\r\n if (fbk == null) {\r\n fbk = ''; }\r\n end;\r\n Attr.BkColor := fbk;\r\n\r\n found := true;\r\n end;\r\n\r\n if el.tagName = 'DIV' then\r\n begin\r\n fbk := TJSHTMLElement(el).style.getPropertyValue('text-align');\r\n\r\n asm\r\n if (fbk == null) {\r\n fbk = ''; }\r\n end;\r\n\r\n if fbk = 'center' then\r\n Attr.isCenter := true;\r\n\r\n if fbk = 'right' then\r\n Attr.isRight := true;\r\n\r\n if fbk = 'left' then\r\n Attr.isLeft := true;\r\n\r\n found := true;\r\n end;\r\n\r\n if el.tagName = 'FONT' then\r\n begin\r\n fn := el['face'];\r\n\r\n asm\r\n if (fn == null) {\r\n fn = ''; }\r\n end;\r\n\r\n fs := el['size'];\r\n\r\n asm\r\n if (fs == null) {\r\n fs = ''; }\r\n end;\r\n\r\n fc := el['color'];\r\n\r\n asm\r\n if (fc == null) {\r\n fc = ''; }\r\n end;\r\n\r\n fbk := TJSHTMLElement(el).style.getPropertyValue('background-color');\r\n\r\n asm\r\n if (fbk == null) {\r\n fbk = ''; }\r\n end;\r\n\r\n found := true;\r\n\r\n Attr.FontName := fn;\r\n Attr.FontColor := fc;\r\n\r\n if (fs <> '') then\r\n begin\r\n if fs = '7' then\r\n fs := '36';\r\n\r\n if fs = '6' then\r\n fs := '24';\r\n\r\n if fs = '5' then\r\n fs := '18';\r\n\r\n if fs = '4' then\r\n fs := '14';\r\n\r\n if fs = '3' then\r\n fs := '10';\r\n\r\n if fs = '2' then\r\n fs := '9';\r\n\r\n if fs = '1' then\r\n fs := '8';\r\n end;\r\n\r\n Attr.FontSize := fs;\r\n Attr.BkColor := fbk;\r\n end;\r\n\r\n el := TJSElement(el.parentElement);\r\n\r\n if (el = ElementHandle) then\r\n found := false;\r\n end;\r\n until not found;\r\n\r\n OnAttributesChanged(Self, Attr);\r\n end;\r\nend;\r\n\r\nprocedure TCustomRichEdit.SetSelAttributes(Value: TTextAttributes);\r\nbegin\r\n SelAttributes.Assign(Value);\r\nend;\r\n\r\nprocedure TCustomRichEdit.SetShowFocus(const Value: boolean);\r\nbegin\r\n if (FShowFocus <> Value) then\r\n begin\r\n FShowFocus := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomRichEdit.Loaded;\r\nvar\r\n doc: TJSDocument;\r\n el: TJSHTMLElement;\r\nbegin\r\n inherited;\r\n\r\n if Assigned(ElementIFrameHandle) then\r\n begin\r\n doc := ElementIFrameHandle;\r\n el := ElementHandle;\r\n el.onclick := @HandleDoClick;\r\n el.ondblclick := @HandleDoDblClick;\r\n el.onmousedown := @HandleDoMouseDown;\r\n el.onmouseup := @HandleDoMouseUp;\r\n el.onmousemove := @HandleDoMouseMove;\r\n el.onkeydown := @HandleDoKeyDown;\r\n el.onkeyup := @HandleDoKeyUp;\r\n el.onkeypress := @HandleDoKeyPress;\r\n el.onfocus := @HandleDoEnter;\r\n el.onblur := @HandleDoExit;\r\n doc.onselectionchange := @HandleDoSelectionChange;\r\n end;\r\nend;\r\n\r\nprocedure TCustomRichEdit.AppendHTML(HTML: string);\r\nvar\r\n sel: TJSSelection;\r\n range: TJSRange;\r\n el: TJSHTMLElement;\r\n frag: TJSDocumentFragment;\r\n node, lastNode: TJSNode;\r\nbegin\r\n sel := nil;\r\n\r\n if Focused then\r\n begin\r\n sel := document.getSelection;\r\n range := sel.getRangeAt(0);\r\n range.deleteContents;\r\n end\r\n else\r\n begin\r\n range := document.createRange();\r\n node := ElementHandle.firstChild;\r\n lastNode := node;\r\n while Assigned(node) do\r\n begin\r\n node := node.nextSibling;\r\n if Assigned(node) then\r\n lastNode := node;\r\n end;\r\n\r\n if Assigned(lastNode) then\r\n begin\r\n range.setStartAfter(lastNode);\r\n range.setEndAfter(lastNode);\r\n end\r\n else\r\n begin\r\n range.setStart(ElementHandle, 0);\r\n range.setEnd(ElementHandle,0);\r\n end;\r\n end;\r\n\r\n el := TJSHTMLElement(document.createElement('div'));\r\n el.innerHTML := HTML;\r\n frag := document.createDocumentFragment;\r\n node := el.firstChild;\r\n\r\n while (node = el.firstChild) do\r\n begin\r\n lastNode := frag.appendChild(node);\r\n range.insertNode(frag);\r\n end;\r\n\r\n if Assigned(lastNode) then\r\n begin\r\n range := range.cloneRange();\r\n range.setStartAfter(lastNode);\r\n range.collapse;\r\n if Assigned(sel) then\r\n begin\r\n sel.removeAllRanges;\r\n sel.addRange(range);\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TCustomRichEdit.AppendLinebreak;\r\nbegin\r\n AppendHTML('
');\r\nend;\r\n\r\nprocedure TCustomRichEdit.InsertHTML(HTML: String);\r\nvar\r\n sel: TJSSelection;\r\n range: TJSRange;\r\n el: TJSHTMLElement;\r\n frag: TJSDocumentFragment;\r\n node, lastNode: TJSNode;\r\nbegin\r\n sel := nil;\r\n if Focused then\r\n begin\r\n sel := document.getSelection;\r\n range := sel.getRangeAt(0);\r\n range.deleteContents;\r\n end\r\n else\r\n begin\r\n range := document.createRange();\r\n range.setStart(ElementHandle, 0);\r\n range.setEnd(ElementHandle, 0);\r\n end;\r\n\r\n el := TJSHTMLElement(document.createElement('div'));\r\n el.innerHTML := HTML;\r\n frag := document.createDocumentFragment;\r\n node := el.firstChild;\r\n\r\n\r\n while (node = el.firstChild) do\r\n begin\r\n lastNode := frag.appendChild(node);\r\n range.insertNode(frag);\r\n end;\r\n\r\n if Assigned(lastNode) then\r\n begin\r\n range := range.cloneRange();\r\n range.setStartAfter(lastNode);\r\n range.collapse;\r\n if Assigned(sel) then\r\n begin\r\n sel.removeAllRanges;\r\n sel.addRange(range);\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TCustomRichEdit.InsertLineBreak;\r\nbegin\r\n InsertHTML('
');\r\nend;\r\n\r\nfunction TCustomRichEdit.HandleDoSelectionChange(Event: TEventListenerEvent): Boolean;\r\nbegin\r\n if Assigned(Owner) then\r\n begin\r\n //reset to a color close to black to avoid being unable to\r\n //select black as the new color\r\n (Owner as TRichEditToolBar).TextColor := $000001;\r\n (Owner as TRichEditToolBar).BackgroundColor := $000001;\r\n end;\r\n\r\n GetSelectionAttributes(TJSNode(document.getSelection()));\r\n\r\n if Assigned(OnSelectionChange) then\r\n OnSelectionChange(Self);\r\n Result := True;\r\nend;\r\n\r\nfunction TCustomRichEdit.HandleDoKeyDown(Event: TJSKeyBoardEvent): Boolean;\r\nbegin\r\n Result := false;\r\n\r\n //Handle Return Key\r\n if (GetKeyCode(Event.Key) = 13) and InsertLineBreaks then\r\n InsertHTML('
')\r\n else\r\n //Handle Tab Key\r\n if (GetKeyCode(Event.Key) = 9) and WantTabs then\r\n InsertHTML(' ')\r\n else\r\n begin \r\n Result := True;\r\n end;\r\n\r\n inherited;\r\nend;\r\n\r\n\r\n{ TTextAttributes }\r\n\r\nconstructor TTextAttributes.Create(AOwner: TCustomRichEdit);\r\nbegin\r\n inherited Create;\r\n RichEdit := AOwner;\r\n FAlignment := taLeftJustify;\r\n FIsBold := False;\r\n FIsItalic := False;\r\n FIsUnderline := False;\r\n FIsStrikeOut := False;\r\n FOrderedList := False;\r\n FUnOrderedList := False;\r\nend;\r\n\r\nprocedure TTextAttributes.Cut;\r\nbegin\r\n RichEdit.DoEditAction('cut');\r\nend;\r\n\r\nprocedure TTextAttributes.Copy;\r\nbegin\r\n RichEdit.DoEditAction('copy');\r\nend;\r\n\r\nprocedure TTextAttributes.Paste;\r\nbegin\r\n RichEdit.DoEditAction('paste');\r\nend;\r\n\r\nprocedure TTextAttributes.Image;\r\nbegin\r\n RichEdit.DoImageAction;\r\nend;\r\n\r\nprocedure TTextAttributes.Link;\r\nbegin\r\n RichEdit.DoLinkAction;\r\nend;\r\n\r\nprocedure TTextAttributes.SetAlignment(Value: TAlignment);\r\nbegin\r\n FAlignment := Value;\r\n\r\n case FAlignment of\r\n taLeftJustify: RichEdit.DoEditAction('justifyleft');\r\n taCenter: RichEdit.DoEditAction('justifycenter');\r\n taRightJustify: RichEdit.DoEditAction('justifyright');\r\n end;\r\nend;\r\n\r\nprocedure TTextAttributes.SetBackColor(Value: TColor);\r\nbegin\r\n FColor := Value;\r\n RichEdit.DoEditAction('hiliteColor', ColorToHtml(Value));\r\nend;\r\n\r\nprocedure TTextAttributes.SetColor(Value: TColor);\r\nbegin\r\n FColor := Value;\r\n RichEdit.DoEditAction('foreColor', ColorToHtml(Value));\r\nend;\r\n\r\nprocedure TTextAttributes.SetName(Value: string);\r\nbegin\r\n FName := Value;\r\n RichEdit.DoEditAction('fontName', Value);\r\nend;\r\n\r\nprocedure TTextAttributes.SetOrderedList(Value: Boolean);\r\nbegin\r\n if (FOrderedLIst <> Value) then\r\n RichEdit.DoEditAction('insertorderedlist');\r\n\r\n FOrderedList := Value;\r\nend;\r\n\r\nprocedure TTextAttributes.SetUnOrderedList(Value: Boolean);\r\nbegin\r\n if (FUnOrderedLIst <> Value) then\r\n RichEdit.DoEditAction('insertunorderedlist');\r\n\r\n FUnOrderedList := Value;\r\nend;\r\n\r\nprocedure TTextAttributes.SetStyle(Value: TFontStyles);\r\nbegin\r\n FStyle := Value;\r\n\r\n if (fsBold in FStyle) and (not FIsBold) then\r\n begin\r\n RichEdit.DoEditAction('bold');\r\n FIsBold := True;\r\n end;\r\n\r\n if (not(fsBold in FStyle)) and (FIsBold) then\r\n begin\r\n RichEdit.DoEditAction('bold');\r\n FIsBold := False;\r\n end;\r\n \r\n if (fsItalic in FStyle) and (not FIsItalic) then\r\n begin\r\n RichEdit.DoEditAction('italic');\r\n FIsItalic := True;\r\n end;\r\n\r\n if (not(fsItalic in FStyle)) and (FIsItalic) then\r\n begin\r\n RichEdit.DoEditAction('italic');\r\n FIsItalic := False;\r\n end;\r\n \r\n if (fsUnderline in FStyle) and (not FIsUnderline) then\r\n begin\r\n RichEdit.DoEditAction('underline');\r\n FIsUnderline := True;\r\n end;\r\n\r\n if (not(fsUnderline in FStyle)) and (FIsUnderline) then\r\n begin\r\n RichEdit.DoEditAction('underline');\r\n FIsUnderline := False;\r\n end;\r\n\r\n if (fsStrikeOut in FStyle) and (not FIsStrikeOut) then\r\n begin\r\n RichEdit.DoEditAction('strikethrough');\r\n FIsStrikeOut := True;\r\n end;\r\n\r\n if (not(fsStrikeOut in FStyle)) and (FIsStrikeOut) then\r\n begin\r\n RichEdit.DoEditAction('strikethrough');\r\n FIsStrikeOut := False;\r\n end;\r\n\r\n// RichEdit.UpdateElement;\r\nend;\r\n\r\nprocedure TTextAttributes.SetSize(Value: Integer);\r\nbegin\r\n if (Value > 0) and (Value < 8) then\r\n begin\r\n FSize := Value;\r\n FHeight := Value;\r\n RichEdit.DoEditAction('fontSize', IntToStr(Value));\r\n end;\r\nend;\r\n\r\nprocedure TTextAttributes.SetHeight(Value: Integer);\r\nbegin\r\n if (Value > 0) and (Value < 8) then\r\n begin\r\n FSize := Value;\r\n FHeight := Value;\r\n RichEdit.DoEditAction('fontSize', IntToStr(Value));\r\n end;\r\nend;\r\n\r\nprocedure TTextAttributes.Assign(Source: TPersistent);\r\nbegin\r\n if Source is TFont then\r\n begin\r\n Color := TFont(Source).Color;\r\n Name := TFont(Source).Name;\r\n Style := TFont(Source).Style;\r\n Size := TFont(Source).Size;\r\n end\r\n else if Source is TTextAttributes then\r\n begin\r\n Color := TTextAttributes(Source).Color;\r\n Name := TTextAttributes(Source).Name;\r\n Style := TTextAttributes(Source).Style;\r\n Size := TTextAttributes(Source).Size;\r\n end\r\n else inherited Assign(Source);\r\nend;\r\n\r\nprocedure TTextAttributes.AssignTo(Dest: TPersistent);\r\nbegin\r\n if Dest is TFont then\r\n begin\r\n TFont(Dest).Color := Color;\r\n TFont(Dest).Name := Name;\r\n TFont(Dest).Style := Style;\r\n TFont(Dest).Size := Size;\r\n end\r\n else if Dest is TTextAttributes then\r\n begin\r\n TTextAttributes(Dest).Color := Color;\r\n TTextAttributes(Dest).Name := Name;\r\n TTextAttributes(Dest).Style := Style;\r\n end\r\n else inherited AssignTo(Dest);\r\nend;\r\n\r\n{ TTabSet }\r\n\r\nprocedure TTabSet.BindEvents;\r\nbegin\r\n inherited;\r\n if Assigned(ElementHandle) then\r\n begin\r\n ElementHandle.onchange := @HandleDoChange;\r\n end;\r\nend;\r\n\r\nprocedure TTabSet.Clear;\r\nbegin\r\n Items.Clear;\r\nend;\r\n\r\nprocedure TTabSet.CreateInitialize;\r\nbegin\r\n inherited;\r\n FItems := TStringList.Create;\r\n FItems.OnChange := ItemsChanged;\r\n FItemIndex := 0;\r\n FSelectedColor := clSilver;\r\n FSelectedTextColor := clBlack;\r\nend;\r\n\r\nfunction TTabSet.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('SPAN');\r\nend;\r\n\r\ndestructor TTabSet.Destroy;\r\nbegin\r\n FItems.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TTabSet.DisableDrag;\r\n procedure RemoveDraggableAttribute(AElement: TJSElement);\r\n var\r\n I: Integer;\r\n begin\r\n for I := 0 to AElement.children.length - 1 do\r\n begin\r\n if TJSElement(AElement.children[I]).tagName = 'LI' then\r\n begin\r\n TJSElement(AElement.children[I]).removeAttribute('draggable');\r\n RemoveDraggableAttribute(TJSElement(AElement.children[I]));\r\n end\r\n else if TJSElement(AElement.children[I]).tagName = 'A' then\r\n TJSElement(AElement.children[I]).removeAttribute('draggable')\r\n else\r\n RemoveDraggableAttribute(TJSElement(AElement.children[I]));\r\n end;\r\n end;\r\nbegin\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n RemoveDraggableAttribute(Container);\r\nend;\r\n\r\nprocedure TTabSet.SetItems(AItems: TStringList);\r\nbegin\r\n FItems.Assign(AItems);\r\nend;\r\n\r\nfunction TTabSet.HandleDoChange(Event: TEventListenerEvent): Boolean;\r\nbegin\r\n if Assigned(OnChange) then\r\n OnChange(Self);\r\n Result := True;\r\nend;\r\n\r\nprocedure TTabSet.Loaded;\r\nbegin\r\n inherited;\r\n DoUpdateList;\r\nend;\r\n\r\nprocedure TTabSet.SelectNextTab(GoForward: boolean);\r\nbegin\r\n if GoForward then\r\n begin\r\n if ItemIndex < Items.Count - 1 then\r\n ItemIndex := ItemIndex + 1\r\n else\r\n ItemIndex := 0;\r\n end\r\n else\r\n begin\r\n if ItemIndex > 0 then\r\n ItemIndex := ItemIndex - 1\r\n else\r\n ItemIndex := Items.Count - 1;\r\n end;\r\n\r\nend;\r\n\r\nprocedure TTabSet.SetItemIndex(AIndex: integer);\r\nbegin\r\n if FItemIndex <> AIndex then\r\n begin\r\n FItemIndex := AIndex;\r\n DoUpdateList;\r\n end;\r\nend;\r\n\r\nprocedure TTabSet.SetSelectedColor(const Value: TColor);\r\nbegin\r\n if FSelectedColor <> Value then\r\n begin\r\n FSelectedColor := Value;\r\n DoUpdateList;\r\n end;\r\nend;\r\n\r\nprocedure TTabSet.SetSelectedTextColor(const Value: TColor);\r\nbegin\r\n if (FSelectedColor <> Value) then\r\n begin\r\n FSelectedTextColor := Value;\r\n DoUpdateList;\r\n end;\r\nend;\r\n\r\nprocedure TTabSet.DoUpdateList;\r\nvar\r\n i: integer;\r\n s: string;\r\n ul, li, a: TJSElement;\r\nbegin\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n while Assigned(Container.firstChild) do\r\n Container.removeChild(Container.firstChild);\r\n\r\n Container['class'] := '';\r\n\r\n ul := document.createElement('UL');\r\n ul['class'] := ElementClassName;\r\n\r\n if ElementClassName <> '' then\r\n ul['role'] := 'tablist'\r\n else\r\n begin\r\n (TJSHTMLElement(ul)).style.setProperty('list-style-type', 'none');\r\n (TJSHTMLElement(ul)).style.setProperty('margin', '0');\r\n (TJSHTMLElement(ul)).style.setProperty('padding', '0');\r\n (TJSHTMLElement(ul)).style.setProperty('display', 'inline-block');\r\n end;\r\n\r\n Container.appendChild(ul);\r\n\r\n for i := 0 to FItems.Count - 1 do\r\n begin\r\n s := FItems[i];\r\n\r\n li := document.createElement('LI');\r\n\r\n if ElementClassName <> '' then\r\n li['class'] := 'nav-item'\r\n else\r\n begin\r\n (TJSHTMLElement(li)).style.setProperty('float', 'left');\r\n (TJSHTMLElement(li)).style.setProperty('border-bottom', '1px solid lightgray');\r\n end;\r\n\r\n SetHTMLElementFont(TJSHTMLElement(li), Font, not ((ElementClassName = '') and (ElementFont = efProperty)));\r\n\r\n if DragMode = dmAutomatic then\r\n li['draggable'] := 'true';\r\n\r\n ul.appendChild(li);\r\n\r\n if not Enabled then\r\n a := document.createElement('SPAN')\r\n else\r\n begin\r\n a := document.createElement('A');\r\n a['href'] := '#' + s;\r\n end;\r\n\r\n a.innerHTML := s;\r\n a['id'] := GetID + '_' + IntToStr(i);\r\n\r\n if ElementClassName <> '' then\r\n begin\r\n\r\n if ItemIndex = i then\r\n a['class'] := 'nav-link active'\r\n else\r\n a['class'] := 'nav-link';\r\n a['role'] := 'tab';\r\n\r\n a['data-toggle'] := 'tab';\r\n a['aria-controls'] := s;\r\n\r\n if ItemIndex = i then\r\n a['aria-selected'] := 'true'\r\n else\r\n a['aria-selected'] := 'false';\r\n\r\n if DragMode = dmAutomatic then\r\n a['draggable'] := 'false';\r\n end\r\n else\r\n begin\r\n (TJSHTMLElement(a)).style.setProperty('display', 'block');\r\n (TJSHTMLElement(a)).style.setProperty('text-align', 'center');\r\n (TJSHTMLElement(a)).style.setProperty('padding', '3px 15px');\r\n (TJSHTMLElement(a)).style.setProperty('text-decoration', 'none');\r\n (TJSHTMLElement(a)).style.setProperty('min-width', '50px');\r\n\r\n (TJSHTMLElement(a)).style.setProperty('color', 'inherit');\r\n (TJSHTMLElement(a)).style.setProperty('font-family', 'inherit');\r\n (TJSHTMLElement(a)).style.setProperty('font-style', 'inherit');\r\n (TJSHTMLElement(a)).style.setProperty('font-size', 'inherit');\r\n\r\n if not Enabled then\r\n (TJSHTMLElement(a)).style.setProperty('pointer-events', 'none');\r\n\r\n if DragMode = dmAutomatic then\r\n a['draggable'] := 'false';\r\n\r\n if ItemIndex = i then\r\n begin\r\n if SelectedColor <> clNone then\r\n (TJSHTMLElement(a)).style.setProperty('background-color', ColorToHtml(SelectedColor));\r\n if SelectedTextColor <> clNone then\r\n (TJSHTMLElement(a)).style.setProperty('color', ColorToHtml(SelectedTextColor));\r\n end;\r\n end;\r\n\r\n li.appendChild(a);\r\n end;\r\n\r\n if not IsLinked and (csDesigning in ComponentState) then\r\n RenderDesigning('TWebTabSet', Container, Self, (FItems.Count = 0));\r\n\r\n UpdateElement;\r\nend;\r\n\r\nprocedure TTabSet.EnableDrag;\r\n procedure AddDraggableAttribute(AElement: TJSElement);\r\n var\r\n I: Integer;\r\n begin\r\n for I := 0 to AElement.children.length - 1 do\r\n begin\r\n if TJSElement(AElement.children[I]).tagName = 'LI' then\r\n begin\r\n TJSElement(AElement.children[I]).Attrs['draggable'] := 'true';\r\n AddDraggableAttribute(TJSElement(AElement.children[I]));\r\n end\r\n else if TJSElement(AElement.children[I]).tagName = 'A' then\r\n TJSElement(AElement.children[I]).Attrs['draggable'] := 'false'\r\n else\r\n AddDraggableAttribute(TJSElement(AElement.children[I]));\r\n end;\r\n end;\r\nbegin\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n AddDraggableAttribute(Container);\r\nend;\r\n\r\nprocedure TTabSet.EndUpdate;\r\nbegin\r\n inherited;\r\n DoUpdateList;\r\nend;\r\n\r\nfunction TTabSet.HandleDoClick(Event: TJSMouseEvent): Boolean;\r\nvar\r\n sid: string;\r\n i: integer;\r\n el: TJSElement;\r\nbegin\r\n el := Event.targetElement;\r\n\r\n sid := '';\r\n if el.hasAttribute('id') then\r\n sid := el.getAttribute('id');\r\n\r\n if sid <> '' then\r\n begin\r\n sid := StringReplace(sid, GetID + '_', '', []); \r\n if TryStrToInt(sid,i) then\r\n begin\r\n FItemIndex := i;\r\n DoUpdateList;\r\n end;\r\n inherited;\r\n end;\r\n\r\n Result := true;\r\nend;\r\n\r\nfunction TTabSet.HandleDoItemMouseOut(Event: TJSMouseEvent): Boolean;\r\nvar\r\n el: TJSHTMLElement;\r\nbegin\r\n Result := true;\r\n //Event.stopPropagation;\r\n\r\n el := TJSHTMLElement(Event.relatedTarget);\r\n if Assigned(el) then\r\n begin\r\n if el.nodeName = 'A' then\r\n el.style.setProperty('background-color', '');\r\n end\r\nend;\r\n\r\nfunction TTabSet.HandleDoItemMouseOver(Event: TJSMouseEvent): Boolean;\r\nvar\r\n el: TJSHTMLElement;\r\nbegin\r\n Result := true;\r\n //Event.stopPropagation;\r\n\r\n el := TJSHTMLElement(Event.relatedTarget);\r\n if Assigned(el) then\r\n begin\r\n if el.nodeName = 'A' then\r\n el.style.setProperty('background-color', 'lightgray');\r\n end\r\nend;\r\n\r\n\r\nprocedure TTabSet.ItemsChanged(Sender: TObject);\r\nbegin\r\n DoUpdateList;\r\nend;\r\n\r\n{ TPageControl }\r\n\r\nprocedure TPageControl.BindEvents;\r\nbegin\r\n inherited;\r\n if Assigned(ElementHandle) then\r\n begin\r\n //The ElementHandle doesn't have an onchange event\r\n //so the onclick is used instead.\r\n //HandleDoChange checks if a different tab is clicked\r\n ElementHandle.onclick := @HandleDoChange;\r\n end;\r\nend;\r\n\r\nfunction TPageControl.CanAcceptChild(AValue: TControl): TControl;\r\nbegin\r\n Result := inherited;\r\n\r\n if Assigned(AValue) and not (AValue is TTabSheet) then\r\n begin\r\n Result := Parent;\r\n end;\r\nend;\r\n\r\nprocedure TPageControl.Clear;\r\nbegin\r\n Items.Clear;\r\nend;\r\n\r\nprocedure TPageControl.CreateInitialize;\r\nbegin\r\n inherited;\r\n\r\n FDesignTime := (csDesigning in ComponentState) and not\r\n ((csReading in Owner.ComponentState) or (csLoading in Owner.ComponentState));\r\n\r\n ControlStyle := ControlStyle + [csAcceptsControls];\r\n BorderStyle := bsNone;\r\n FItems := TStringList.Create;\r\n FItems.OnChange := ItemsChanged;\r\n FTabIndex := 0;\r\n FPrevTabIndex := FTabIndex;\r\n FShowTabs := true;\r\n TabStop := false;\r\n FSelectedColor := clSilver;\r\n FSelectedTextColor := clBlack;\r\n Width := 400;\r\n Height := 300;\r\n EnablePropagation := true;\r\nend;\r\n\r\nfunction TPageControl.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('SPAN');\r\nend;\r\n\r\ndestructor TPageControl.Destroy;\r\nbegin\r\n FItems.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TPageControl.DisableDrag;\r\n procedure RemoveDraggableAttribute(AElement: TJSElement);\r\n var\r\n I: Integer;\r\n tn: string;\r\n begin\r\n for I := 0 to AElement.children.length - 1 do\r\n begin\r\n tn := TJSElement(AElement.children[I]).tagName;\r\n if tn = 'LI' then\r\n begin\r\n TJSElement(AElement.children[I]).removeAttribute('draggable');\r\n RemoveDraggableAttribute(TJSElement(AElement.children[I]));\r\n end\r\n else if tn = 'A' then\r\n TJSElement(AElement.children[I]).removeAttribute('draggable')\r\n else if tn = 'UL' then\r\n RemoveDraggableAttribute(TJSElement(AElement.children[I]));\r\n end;\r\n end;\r\nbegin\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n RemoveDraggableAttribute(Container);\r\nend;\r\n\r\nprocedure TPageControl.SelectNextPage(GoForward: boolean);\r\nbegin\r\n if GoForward then\r\n begin\r\n if TabIndex < PageCount - 1 then\r\n TabIndex := TabIndex + 1\r\n else\r\n TabIndex := 0;\r\n end\r\n else\r\n begin\r\n if TabIndex > 0 then\r\n TabIndex := TabIndex - 1\r\n else\r\n TabIndex := PageCount - 1;\r\n end;\r\nend;\r\n\r\nfunction TPageControl.PageCount: integer;\r\nvar\r\n i: integer;\r\nbegin\r\n Result := 0;\r\n\r\n for i := 0 to ControlCount - 1 do\r\n begin\r\n if (Controls[i] is TTabSheet) then\r\n inc(Result);\r\n end;\r\nend;\r\n\r\n\r\nfunction TPageControl.PageIndexFromElement(AElement: TJSElement): Integer;\r\nvar\r\n sid: string;\r\n i: Integer;\r\nbegin\r\n Result := -1;\r\n\r\n sid := '';\r\n if AElement.tagName = 'LI' then\r\n AElement := TJSElement(AElement.firstChild);\r\n\r\n if AElement.hasAttribute('id') then\r\n sid := AElement.getAttribute('id');\r\n\r\n if (sid <> '') then\r\n begin\r\n sid := StringReplace(sid, GetID + '_', '', []);\r\n if TryStrToInt(sid, i) then\r\n Result := i;\r\n end;\r\nend;\r\n\r\nfunction TPageControl.GetActivePage: TTabsheet;\r\nvar\r\n pi: integer;\r\nbegin\r\n Result := nil;\r\n\r\n pi := GetActivePageIndex;\r\n if (pi >= 0) then\r\n Result := Pages[pi];\r\nend;\r\n\r\nfunction TPageControl.GetActivePageIndex: integer;\r\nbegin\r\n Result := -1;\r\n if (PageCount >= 0) and (TabIndex >= 0) and (TabIndex < PageCount) then\r\n Result := TabIndex;\r\nend;\r\n\r\nprocedure TPageControl.GetChildren(Proc: TGetChildProc; Root: TComponent);\r\nvar\r\n i: integer;\r\nbegin\r\n for i := 0 to ControlCount - 1 do\r\n begin\r\n if (Controls[i] is TTabSheet) then\r\n begin\r\n Proc(Controls[i]);\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TPageControl.GetPage(index: integer): TTabSheet;\r\nvar\r\n c,i: integer;\r\nbegin\r\n c := -1;\r\n Result := nil;\r\n\r\n for i := 0 to ControlCount - 1 do\r\n begin\r\n if (Controls[i] is TTabSheet) then\r\n inc(c);\r\n\r\n if c = index then\r\n begin\r\n Result := Controls[i] as TTabSheet;\r\n break;\r\n end;\r\n end;\r\nend;\r\n\r\n\r\nfunction TPageControl.GetUniqueName: string;\r\nvar\r\n i,id: integer;\r\n found: boolean;\r\n AName: string;\r\nbegin\r\n id := 1;\r\n\r\n AName := Name + 'sheet';\r\n\r\n repeat\r\n Result := AName + inttostr(id);\r\n\r\n found := true;\r\n\r\n for i := 0 to Owner.ComponentCount - 1 do\r\n begin\r\n if Owner.Components[i].Name = Result then\r\n begin\r\n found := false;\r\n inc(id);\r\n break;\r\n end;\r\n end;\r\n\r\n until found;\r\nend;\r\n\r\nprocedure TPageControl.SetActivePage(const Value: TTabsheet);\r\nvar\r\n i: integer;\r\nbegin\r\n for i := 0 to ControlCount - 1 do\r\n begin\r\n if Controls[i] = Value then\r\n begin\r\n ActivePageINdex := i;\r\n break;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TPageControl.SetActivePageIndex(const Value: integer);\r\nbegin\r\n if (Value >= 0) and (Value < PageCount) then\r\n TabIndex := Value;\r\nend;\r\n\r\n\r\nprocedure TPageControl.SetItems(AItems: TStringList);\r\nbegin\r\n FItems.Assign(AItems);\r\nend;\r\n\r\nprocedure TPageControl.SetParent(AValue: TControl);\r\nvar\r\n ts: TTabSheet;\r\n frm: TCustomForm;\r\nbegin\r\n inherited;\r\n\r\n if FDesignTime then\r\n begin\r\n frm := GetParentForm(Self);\r\n\r\n FDesignTime := false;\r\n ts := TWebTabSheet.Create(frm);\r\n ts.Parent := Self;\r\n ts.Caption := 'Page1';\r\n ts.Name := GetUniqueName;\r\n\r\n ts := TWebTabSheet.Create(frm);\r\n ts.Parent := Self;\r\n ts.Caption := 'Page2';\r\n ts.Name := GetUniqueName;\r\n end;\r\n\r\n DoUpdateList;\r\nend;\r\n\r\nfunction TPageControl.HandleDoChange(Event: TJSMouseEvent): Boolean;\r\nbegin\r\n if FPrevTabIndex <> FTabIndex then\r\n begin\r\n FPrevTabIndex := FTabIndex;\r\n if Assigned(OnChange) then\r\n OnChange(Self);\r\n end;\r\n Result := True;\r\nend;\r\n\r\nprocedure TPageControl.Loaded;\r\nbegin\r\n inherited;\r\n DoUpdateList;\r\n TabIndex := FTabIndex;\r\nend;\r\n\r\nprocedure TPageControl.SetTabIndex(AIndex: integer);\r\nbegin\r\n if (csLoading in ComponentState) then\r\n FTabIndex := AIndex;\r\n\r\n\r\n if (FTabIndex <> AIndex) and (AIndex >= 0) and (AIndex < PageCount) then\r\n begin\r\n FTabIndex := AIndex;\r\n FPrevTabIndex := FTabIndex;\r\n DoUpdateList;\r\n end;\r\nend;\r\n\r\nprocedure TPageControl.UpdateElement;\r\nbegin\r\n inherited;\r\nend;\r\n\r\nprocedure TPageControl.VisibleChanged;\r\nbegin\r\n inherited;\r\n DoUpdateList;\r\nend;\r\n\r\nprocedure TPageControl.SetSelectedColor(const AValue: TColor);\r\nbegin\r\n if FSelectedColor <> AValue then\r\n begin\r\n FSelectedColor := AValue;\r\n DoUpdateList;\r\n end;\r\nend;\r\n\r\nprocedure TPageControl.SetSelectedTextColor(const Value: TColor);\r\nbegin\r\n if FSelectedTextColor <> Value then\r\n begin\r\n FSelectedTextColor := Value;\r\n DoUpdateList;\r\n end;\r\nend;\r\n\r\nprocedure TPageControl.SetShowTabs(const Value: boolean);\r\nbegin\r\n if FShowTabs <> Value then\r\n begin\r\n FShowTabs := Value;\r\n DoUpdateList;\r\n end;\r\nend;\r\n\r\nprocedure TPageControl.DoUpdateList;\r\nvar\r\n i, vistabindex: integer;\r\n s: string;\r\n shidden: string;\r\n n: TJSNode;\r\n ul, li, a: TJSElement;\r\n tabs: TStringList;\r\n tab: TTabSheet;\r\n LLabel: TJSHTMLElement;\r\n LHasLabel: boolean;\r\n\r\nbegin\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n if not Assigned(ElementHandle) or IsUpdating then\r\n Exit;\r\n\r\n tab := nil;\r\n\r\n if ControlCount > 0 then\r\n begin\r\n BorderStyle := bsNone;\r\n LLabel := TJSHTMLElement(ElementHandle.firstChild);\r\n LHasLabel := Assigned(LLabel) and (LLabel.tagName = 'DIV') and (LLabel.getAttribute('data-design') = '1');\r\n if LHasLabel then\r\n begin\r\n ElementHandle.removeChild(ElementHandle.firstChild);\r\n ElementHandle.style.removeProperty('border');\r\n end;\r\n\r\n tabs := TStringList.Create;\r\n\r\n shidden := '{#hidden#}';\r\n\r\n vistabindex := TabIndex;\r\n\r\n for i := 0 to ControlCount - 1 do\r\n begin\r\n if (csDestroying in Controls[i].ComponentState) and (i <= TabIndex) then\r\n inc(vistabindex);\r\n\r\n if (Controls[i] is TTabSheet) and not (csDestroying in Controls[i].ComponentState) then\r\n begin\r\n tab := TTabSheet(Controls[i]);\r\n\r\n if tab.TabVisible then\r\n tabs.Add(tab.Caption)\r\n else\r\n tabs.Add(shidden);\r\n\r\n tab.BeginUpdate;\r\n\r\n if (vistabindex = i) then\r\n tab.Align := alClient\r\n else\r\n tab.Align := alNone;\r\n\r\n tab.AlignWithMargins := True;\r\n tab.Margins.Left := 0;\r\n tab.BorderStyle := bsSingle;\r\n tab.Visible := (vistabindex = i);\r\n\r\n tab.ResetUpdate;\r\n\r\n // change order of tabs to bring visible tab to front\r\n if (vistabindex = i) then\r\n tab.ElementHandle.parentElement.insertBefore(tab.ElementHandle, nil {tab.ElementHandle.parentElement.firstChild});\r\n\r\n tab.GetElementHandle.style.setProperty('background-color', ColorToHtml(tab.Color));\r\n end;\r\n end;\r\n\r\n for i := 0 to Container.childNodes.length - 1 do\r\n begin\r\n n := Container.childNodes[i];\r\n if Assigned(n) and (TJSElement(n)['id'] = GetID + '_UL') then\r\n Container.removeChild(n);\r\n end;\r\n\r\n Container['class'] := '';\r\n\r\n if not Enabled then\r\n ElementHandle.style.setProperty('pointer-events', 'none')\r\n else\r\n ElementHandle.style.setProperty('pointer-events', 'auto');\r\n\r\n ul := document.createElement('UL');\r\n ul['class'] := ElementClassName;\r\n ul['id'] := GetID + '_UL';\r\n\r\n if ElementClassName <> '' then\r\n ul['role'] := 'tablist'\r\n else\r\n begin\r\n (TJSHTMLElement(ul)).style.setProperty('list-style-type', 'none');\r\n (TJSHTMLElement(ul)).style.setProperty('margin', '0');\r\n (TJSHTMLElement(ul)).style.setProperty('padding', '0');\r\n if FShowTabs then\r\n (TJSHTMLElement(ul)).style.setProperty('display', 'inline-block')\r\n else\r\n (TJSHTMLElement(ul)).style.setProperty('display', 'none');\r\n end;\r\n\r\n Container.appendChild(ul);\r\n\r\n for i := 0 to tabs.Count - 1 do\r\n begin\r\n s := tabs[i];\r\n if s <> shidden then\r\n begin\r\n if s = '' then\r\n s := 'tab' + IntToStr(i);\r\n\r\n li := document.createElement('LI');\r\n\r\n if ElementClassName <> '' then\r\n li['class'] := 'nav-item'\r\n else\r\n begin\r\n (TJSHTMLElement(li)).style.setProperty('float', 'left');\r\n if BorderStyle <> bsNone then\r\n (TJSHTMLElement(li)).style.setProperty('border-bottom', '1px solid lightgray');\r\n end;\r\n\r\n if DragMode = dmAutomatic then\r\n li['draggable'] := 'true';\r\n\r\n SetHTMLElementFont(TJSHTMLElement(li), Font, not ((ElementClassName = '') and (ElementFont = efProperty)));\r\n\r\n ul.appendChild(li);\r\n\r\n if not Enabled then\r\n a := document.createElement('SPAN')\r\n else\r\n begin\r\n a := document.createElement('A');\r\n a['href'] := '#' + s;\r\n end;\r\n\r\n if DragMode = dmAutomatic then\r\n a['draggable'] := 'false';\r\n\r\n a.innerHTML := s;\r\n a['id'] := GetID + '_' + IntToStr(i);\r\n\r\n if ElementClassName <> '' then\r\n begin\r\n if TabIndex = i then\r\n a['class'] := 'nav-link active'\r\n else\r\n a['class'] := 'nav-link';\r\n a['role'] := 'tab';\r\n\r\n a['data-toggle'] := 'tab';\r\n a['aria-controls'] := s;\r\n\r\n if TabIndex = i then\r\n a['aria-selected'] := 'true'\r\n else\r\n a['aria-selected'] := 'false';\r\n end\r\n else\r\n begin\r\n (TJSHTMLElement(a)).style.setProperty('display', 'block');\r\n (TJSHTMLElement(a)).style.setProperty('text-align', 'center');\r\n (TJSHTMLElement(a)).style.setProperty('padding', '3px 15px');\r\n (TJSHTMLElement(a)).style.setProperty('text-decoration', 'none');\r\n (TJSHTMLElement(a)).style.setProperty('min-width', '50px');\r\n\r\n (TJSHTMLElement(a)).style.setProperty('color', 'inherit');\r\n (TJSHTMLElement(a)).style.setProperty('font-family', 'inherit');\r\n (TJSHTMLElement(a)).style.setProperty('font-style', 'inherit');\r\n (TJSHTMLElement(a)).style.setProperty('font-size', 'inherit');\r\n\r\n if not enabled then\r\n (TJSHTMLElement(a)).style.setProperty('pointer-events', 'none');\r\n\r\n if TabIndex = i then\r\n begin\r\n if SelectedColor <> clNone then\r\n (TJSHTMLElement(a)).style.setProperty('background-color', ColorToHtml(SelectedColor));\r\n if SelectedTextColor <> clNone then\r\n (TJSHTMLElement(a)).style.setProperty('color', ColorToHtml(SelectedTextColor));\r\n end;\r\n end;\r\n\r\n li.appendChild(a);\r\n end;\r\n end;\r\n\r\n for i := 0 to ControlCount - 1 do\r\n begin\r\n if Controls[i] is TTabSheet then\r\n begin\r\n TTabSheet(Controls[i]).Margins.Top := Round((TJSHTMLElement(ul)).offsetHeight) - 1;\r\n TTabSheet(Controls[i]).ElementHandle.style.setProperty('white-space', '');\r\n end;\r\n end;\r\n\r\n tabs.Free;\r\n end\r\n else\r\n begin\r\n if not IsLinked then\r\n begin\r\n ClearChildElements;\r\n if (csDesigning in ComponentState) then\r\n begin\r\n RenderDesigning('TWebPageControl', Container, Self, True);\r\n end;\r\n end;\r\n end;\r\n\r\n DoUpdateResize;\r\n\r\n if Assigned(tab) then\r\n begin\r\n tab.Align := alNone;\r\n tab.Align := alClient;\r\n end;\r\n\r\n UpdateElement;\r\n\r\n if not IsLinked and (ControlCount = 0) then\r\n begin\r\n ElementHandle.style.setProperty('border','1px solid lightgray');\r\n end;\r\nend;\r\n\r\nprocedure TPageControl.DoUpdateResize;\r\nvar\r\n i, vistabindex: integer;\r\nbegin\r\n // hide all\r\n for i := 0 to ControlCount - 1 do\r\n begin\r\n if Controls[i] is TTabSheet then\r\n Controls[i].Visible := false;\r\n end;\r\n\r\n // cause client alignment for all\r\n for i := 0 to ControlCount - 1 do\r\n begin\r\n if Controls[i] is TTabSheet then\r\n begin\r\n Controls[i].Visible := true;\r\n Controls[i].Align := alNone;\r\n Controls[i].Align := alClient;\r\n Controls[i].Visible := false;\r\n end;\r\n end;\r\n\r\n vistabindex := TabIndex;\r\n\r\n // make active tab visible\r\n for i := 0 to ControlCount - 1 do\r\n begin\r\n if (csDestroying in Controls[i].ComponentState) and (i <= TabIndex) then\r\n inc(vistabindex);\r\n\r\n if Controls[i] is TTabSheet then\r\n begin\r\n Controls[i].Visible := (vistabindex = i);\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TPageControl.EnableDrag;\r\n procedure AddDraggableAttribute(AElement: TJSElement);\r\n var\r\n I: Integer;\r\n tn: string;\r\n begin\r\n for I := 0 to AElement.children.length - 1 do\r\n begin\r\n tn := TJSElement(AElement.children[I]).tagName;\r\n if tn = 'LI' then\r\n begin\r\n TJSElement(AElement.children[I]).Attrs['draggable'] := 'true';\r\n AddDraggableAttribute(TJSElement(AElement.children[I]));\r\n end\r\n else if tn = 'A' then\r\n TJSElement(AElement.children[I]).Attrs['draggable'] := 'false'\r\n else if tn = 'UL' then\r\n AddDraggableAttribute(TJSElement(AElement.children[I]));\r\n end;\r\n end;\r\nbegin\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n AddDraggableAttribute(Container);\r\nend;\r\n\r\nprocedure TPageControl.EndUpdate;\r\nbegin\r\n inherited;\r\n DoUpdateList;\r\nend;\r\n\r\nfunction TPageControl.HandleDoClick(Event: TJSMouseEvent): Boolean;\r\nvar\r\n sid: string;\r\n i: integer;\r\n el: TJSElement;\r\n ts: TTabSheet;\r\nbegin\r\n el := Event.targetElement;\r\n\r\n sid := '';\r\n if el.hasAttribute('id') then\r\n sid := el.getAttribute('id');\r\n\r\n if (sid <> '') then\r\n begin\r\n sid := StringReplace(sid, GetID + '_', '', []);\r\n if TryStrToInt(sid,i) then\r\n begin\r\n if FTabIndex <> -1 then\r\n begin\r\n ts := GetPage(FTabIndex);\r\n if Assigned(ts) and Assigned(ts.OnHide) then\r\n ts.OnHide(ts);\r\n end;\r\n\r\n FTabIndex := i;\r\n\r\n DoUpdateList;\r\n\r\n if FTabIndex <> -1 then\r\n begin\r\n ts := GetPage(FTabIndex);\r\n if Assigned(ts) and Assigned(ts.OnShow) then\r\n ts.OnShow(ts);\r\n end;\r\n\r\n end;\r\n inherited;\r\n end;\r\n\r\n Result := true;\r\nend;\r\n\r\nfunction TPageControl.HandleDoItemMouseOut(Event: TJSMouseEvent): Boolean;\r\nvar\r\n el: TJSHTMLElement;\r\nbegin\r\n Result := true;\r\n //Event.stopPropagation;\r\n\r\n el := TJSHTMLElement(Event.relatedTarget);\r\n if Assigned(el) then\r\n begin\r\n if el.nodeName = 'A' then\r\n el.style.setProperty('background-color', '');\r\n end\r\nend;\r\n\r\nfunction TPageControl.HandleDoItemMouseOver(Event: TJSMouseEvent): Boolean;\r\nvar\r\n el: TJSHTMLElement;\r\nbegin\r\n Result := true;\r\n //Event.stopPropagation;\r\n\r\n el := TJSHTMLElement(Event.relatedTarget);\r\n if Assigned(el) then\r\n begin\r\n if el.nodeName = 'A' then\r\n el.style.setProperty('background-color', 'lightgray');\r\n end\r\nend;\r\n\r\nprocedure TPageControl.ItemsChanged(Sender: TObject);\r\nvar\r\n i: integer;\r\n ts: TTabSheet;\r\n\r\nbegin\r\n if (PageCount = 0) and (Items.Count > 0) and (ElementHandle.childElementCount > 0) then\r\n begin\r\n ElementHandle.removeChild(ElementHandle.firstChild);\r\n end;\r\n\r\n for i := 0 to FItems.Count - 1 do\r\n begin\r\n if PageCount <= i then\r\n begin\r\n ts := TTabSheet.Create(Owner);\r\n ts.Parent := Self;\r\n ts.Name := Name + 'sheet' + inttostr(i + 1);\r\n end;\r\n Pages[i].Caption := FItems[i];\r\n end;\r\n\r\n for i := PageCount - 1 downto 0 do\r\n begin\r\n if i >= Items.Count then\r\n begin\r\n ts := Pages[i];\r\n ts.Free;\r\n end;\r\n end;\r\n\r\n DoUpdateList;\r\nend;\r\n\r\n{ TTabSheet }\r\n\r\nprocedure TTabSheet.CreateInitialize;\r\nbegin\r\n inherited;\r\n EnablePropagation := true;\r\n ControlStyle := ControlStyle + [csAcceptsControls];\r\n Color := clWhite;\r\n TabVisible := True;\r\n ShowCaption := False;\r\n FPosUpdating := False;\r\nend;\r\n\r\ndestructor TTabSheet.Destroy;\r\nvar\r\n p: TPageControl;\r\nbegin\r\n p := nil;\r\n\r\n if Assigned(Parent) then\r\n begin\r\n if Parent is TPageControl then\r\n begin\r\n p := (Parent as TPageControl);\r\n end;\r\n end;\r\n\r\n inherited;\r\n\r\n if Assigned(p) then\r\n begin\r\n p.DoUpdateList;\r\n p.TabIndex := 0;\r\n end;\r\nend;\r\n\r\nprocedure TTabSheet.EndUpdate;\r\nbegin\r\n inherited;\r\n if Assigned(Parent) then\r\n begin\r\n if Parent is TPageControl then\r\n (Parent as TPageControl).DoUpdateList;\r\n end;\r\nend;\r\n\r\nprocedure TTabSheet.ResetUpdate;\r\nbegin\r\n inherited EndUpdate;\r\nend;\r\n\r\nprocedure TTabSheet.SetBounds(X, Y, AWidth, AHeight: Integer);\r\nbegin\r\n inherited;\r\n\r\n if (Parent is TPageControl) and not FPosUpdating then\r\n begin\r\n FPosupdating := true;\r\n (Parent as TPageControl).DoUpdateList;\r\n FPosupdating := false;\r\n end;\r\nend;\r\n\r\nprocedure TTabSheet.SetCaption(const AValue: string);\r\nbegin\r\n inherited;\r\n\r\n if Assigned(Parent) then\r\n begin\r\n if Parent is TPageControl then\r\n (Parent as TPageControl).DoUpdateList;\r\n end;\r\nend;\r\n\r\nprocedure TTabSheet.SetParent(AValue: TControl);\r\nbegin\r\n if (AValue is TTabSheet) then\r\n begin\r\n if (AValue as TTabSheet).Parent is TPageControl then\r\n AValue := (AValue as TTabSheet).Parent;\r\n end;\r\n\r\n inherited SetParent(AValue);\r\n\r\n if Assigned(Parent) then\r\n begin\r\n if Parent is TPageControl then\r\n begin\r\n (Parent as TPageControl).DoUpdateList;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTabSheet.SetTabVisible(const Value: Boolean);\r\nbegin\r\n if FTabVisible <> Value then\r\n begin\r\n FTabVisible := Value;\r\n\r\n if Assigned(Parent) then\r\n begin\r\n if Parent is TPageControl then\r\n (Parent as TPageControl).DoUpdateList;\r\n end;\r\n end;\r\nend;\r\n\r\n{ TProgressBar }\r\n\r\nprocedure TProgressBar.CreateInitialize;\r\nbegin\r\n inherited;\r\n FMax := 100;\r\n FMin := 0;\r\n FPosition := 0;\r\n FStyle := pbstNormal;\r\nend;\r\n\r\nprocedure TProgressBar.CreateProgressElement(AElement: TJSElement);\r\nvar\r\n d: TJSElement;\r\nbegin\r\n while Assigned(AElement.firstChild) do\r\n AElement.removeChild(AElement.firstChild);\r\n\r\n if FStyle = pbstDiv then\r\n begin\r\n d := document.createElement('DIV');\r\n d.appendChild(document.createElement('DIV'));\r\n end\r\n else\r\n d := document.createElement('PROGRESS');\r\n\r\n AElement.appendChild(d);\r\nend;\r\n\r\nprocedure TProgressBar.AfterLoadDFMValues;\r\nbegin\r\n inherited;\r\n DoUpdate;\r\nend;\r\n\r\nfunction TProgressBar.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('SPAN');\r\n CreateProgressElement(Result);\r\nend;\r\n\r\nprocedure TProgressBar.SetElementBarClassName(const Value: string);\r\nbegin\r\n FElementBarClassName := Value;\r\n DoUpdate;\r\nend;\r\n\r\nprocedure TProgressBar.SetMax(AValue: integer);\r\nbegin\r\n FMax := AValue;\r\n DoUpdate;\r\nend;\r\n\r\nprocedure TProgressBar.SetMin(AValue: integer);\r\nbegin\r\n FMin := AValue;\r\n DoUpdate;\r\nend;\r\n\r\nprocedure TProgressBar.DoUpdate;\r\nvar\r\n pvalue: integer;\r\n maxvalue: integer;\r\n el: TJSHTMLElement;\r\n pos: integer;\r\nbegin\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n if FMax <> FMin then\r\n pos := Round((FPosition - Min) / (Max - Min) * 100)\r\n else\r\n pos := 0;\r\n\r\n //\r\n if isLinked then\r\n begin\r\n if ElementHandle.TagName= 'DIV' then\r\n begin\r\n if ElementHandle['role'] = 'progressbar' then\r\n ElementHandle.style.setProperty('width',inttostr(pos)+'%')\r\n else\r\n ElementHandle.innerHTML := inttostr(pos)\r\n end\r\n else\r\n ElementHandle.setAttribute('value',inttostr(pos));\r\n\r\n Exit;\r\n end;\r\n\r\n\r\n if Style = pbstDiv then\r\n begin\r\n\r\n el := TJSHTMLElement(ElementHandle.firstChild);\r\n\r\n if ElementClassName <> '' then\r\n begin\r\n el.setAttribute('class',ElementClassName);\r\n ElementHandle.removeAttribute('class');\r\n end;\r\n\r\n el.style.setProperty('height',inttostr(Height)+'px');\r\n\r\n if WidthStyle = ssAbsolute then\r\n el.style.setProperty('width',inttostr(Width)+'px');\r\n\r\n el := TJSHTMLElement(el.firstChild);\r\n\r\n if ElementBarClassName <> '' then\r\n el.setAttribute('class',ElementBarClassName);\r\n\r\n el.setAttribute('role','progressbar');\r\n el.style.setProperty('width',inttostr(pos)+'%');\r\n\r\n case Value of\r\n pbvPercentage: el.innerHTML := inttostr(pos)+'%';\r\n pbvAbsolute: el.innerHTML := inttostr(Position);\r\n pbvNone: el.innerHTML := '';\r\n end;\r\n end\r\n else\r\n begin\r\n el := TJSHTMLElement(ElementHandle.firstChild);\r\n el.style.setProperty('width','100%');\r\n el.style.setProperty('height','100%');\r\n pvalue := FPosition - FMin;\r\n maxvalue := FMax - FMin;\r\n el['max'] := IntToStr(maxvalue);\r\n\r\n if Style = pbstNormal then\r\n el['value'] := IntToStr(pvalue)\r\n else\r\n el.removeAttribute('value');\r\n end;\r\nend;\r\n\r\nprocedure TProgressBar.SetPosition(AValue: integer);\r\nbegin\r\n if (AValue >= Min) and (AValue <= Max) then\r\n begin\r\n FPosition := AValue;\r\n DoUpdate;\r\n end;\r\nend;\r\n\r\nprocedure TProgressBar.SetStyle(const Value: TProgressBarStyle);\r\nbegin\r\n if FStyle <> Value then\r\n begin\r\n FStyle := Value;\r\n\r\n if Assigned(ElementHandle) then\r\n begin\r\n CreateProgressElement(ElementHandle);\r\n DoUpdate;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TProgressBar.SetValue(const Value: TProgressBarValue);\r\nbegin\r\n FValue := Value;\r\n DoUpdate;\r\nend;\r\n\r\n{ TWebTreeView }\r\n\r\nprocedure TTreeView.BeginUpdate;\r\nbegin\r\n inherited;\r\nend;\r\n\r\nfunction TTreeView.CreateElement: TJSElement;\r\nvar\r\n tn: TTreeNode;\r\nbegin\r\n if (csDesigning in ComponentState) then\r\n begin\r\n BeginUpdate;\r\n\r\n tn := Items.Add(' Item 1');\r\n Items.AddChild(tn,'Child Item 1');\r\n\r\n tn := Items.Add(' Item 2');\r\n Items.AddChild(tn,'Child Item 2');\r\n\r\n tn := Items.Add(' Item 3');\r\n Items.AddChild(tn,'Child Item 3');\r\n\r\n EndUpdate;\r\n end;\r\n\r\n Result := document.createElement('DIV');\r\nend;\r\n\r\nprocedure TTreeView.CreateInitialize;\r\nvar\r\n css: string;\r\nbegin\r\n inherited;\r\n FSelected := nil;\r\n FItems := TTreeNodes.Create(Self);\r\n FItems.OnChange := DoNodesChanged;\r\n FItems.OnExpandedChange := DOExpandedChanged;\r\n\r\n // remove default bullets\r\n css := '.TVUL {' +\r\n ' list-style-type: none;' +\r\n ' margin: 0;' +\r\n ' padding-left: 15px;' +\r\n '}' + #13#10 +\r\n\r\n ' .TVCARET {' +\r\n ' cursor: pointer;' +\r\n ' user-select: none;' +\r\n '}' + #13#10 +\r\n\r\n '.TVCARET::before {' +\r\n 'content: \"\\25B6\";' +\r\n// 'color: black;' +\r\n 'display: inline-block;' +\r\n 'margin-right: 6px;' +\r\n '}' + #13#10 +\r\n\r\n '.TVCARET-DOWN::before {'+\r\n 'transform: rotate(90deg);'+\r\n '}'+ #13#10 +\r\n\r\n '.TVNESTED {' +\r\n ' display: none;' +\r\n '}' + #13#10 +\r\n\r\n '.TVACTIVE {' +\r\n ' display: block;' +\r\n '}' + #13#10 +\r\n\r\n '.TVNODE {' +\r\n ' padding: 3px;'+\r\n ' display: inline-block;' +\r\n '}' + #13#10 +\r\n\r\n '.TVNOCURSOR {' +\r\n ' cursor: initial;'+\r\n '}' + #13#10 +\r\n\r\n '.TVSELECTED {' +\r\n ' background-color: #0000ff;' +\r\n ' color: #ffffff;' +\r\n '}';\r\n\r\n AddControlStyle(css);\r\n\r\n Width := 200;\r\n Height := 200;\r\nend;\r\n\r\ndestructor TTreeView.Destroy;\r\nbegin\r\n FItems.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TTreeView.DisableDrag;\r\n procedure RemoveDraggableAttribute(AElement: TJSElement);\r\n var\r\n I: Integer;\r\n begin\r\n for I := 0 to AElement.children.length - 1 do\r\n begin\r\n if TJSElement(AElement.children[I]).tagName = 'LI' then\r\n begin\r\n TJSElement(AElement.children[I]).removeAttribute('draggable');\r\n RemoveDraggableAttribute(TJSElement(AElement.children[I]));\r\n end\r\n else\r\n RemoveDraggableAttribute(TJSElement(AElement.children[I]));\r\n end;\r\n end;\r\nbegin\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n RemoveDraggableAttribute(Container);\r\nend;\r\n\r\nprocedure TTreeView.DoChangeSelection(NewNode: TTreeNode);\r\nvar\r\n Allow: boolean;\r\nbegin\r\n Allow := true;\r\n\r\n if Assigned(OnChanging) then\r\n OnChanging(Self, NewNode, Allow);\r\n\r\n if Allow then\r\n begin\r\n Selected := NewNode;\r\n if Assigned(OnChange) then\r\n OnChange(Self, NewNode);\r\n end;\r\nend;\r\n\r\nprocedure TTreeView.DoExpandedChanged(Sender: TObject; ANode: TTreeNode);\r\nvar\r\n el, su: TJSElement;\r\n i: integer;\r\nbegin\r\n if ANode.Count > 0 then\r\n begin\r\n el := GetNodeElement(ANode);\r\n\r\n if Assigned(el) and Assigned(el.parentElement) and Assigned(el.parentElement.parentElement) then\r\n begin\r\n su := el.parentElement.parentElement.querySelector('.TVNESTED');\r\n if Assigned(su) then\r\n begin\r\n su.classList.toggle('TVACTIVE');\r\n el.parentElement.classList.toggle('TVCARET-DOWN');\r\n end;\r\n end;\r\n\r\n if AutoExpand then\r\n begin\r\n for i := 0 to ANode.Count - 1 do\r\n begin\r\n if ANode.Item[i].Count > 0 then\r\n begin\r\n ANode.Item[i].Expanded := ANode.Expanded;\r\n end;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTreeView.DoNodesChanged(Sender: TObject);\r\nbegin\r\n //\r\nend;\r\n\r\nprocedure TTreeView.DoRenderNode(ANode: TTreeNode; AElement: TJSHTMLElement);\r\nvar\r\n LElementRec: TJSHTMLElementRecord;\r\nbegin\r\n if Assigned(OnRenderNode) then\r\n begin\r\n LElementRec.element := AElement;\r\n OnRenderNode(Self, ANode, LElementRec);\r\n end;\r\nend;\r\n\r\nprocedure TTreeView.EnableDrag;\r\n procedure AddDraggableAttribute(AElement: TJSElement);\r\n var\r\n I: Integer;\r\n begin\r\n for I := 0 to AElement.children.length - 1 do\r\n begin\r\n if TJSElement(AElement.children[I]).tagName = 'LI' then\r\n begin\r\n TJSElement(AElement.children[I]).Attrs['draggable'] := 'true';\r\n AddDraggableAttribute(TJSElement(AElement.children[I]));\r\n end\r\n else\r\n AddDraggableAttribute(TJSElement(AElement.children[I]));\r\n end;\r\n end;\r\nbegin\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n AddDraggableAttribute(Container);\r\nend;\r\n\r\nprocedure TTreeView.EndUpdate;\r\nbegin\r\n inherited;\r\n\r\n if not IsUpdating then\r\n begin\r\n Selected := nil;\r\n RenderNodes;\r\n end;\r\nend;\r\n\r\nfunction TTreeView.GetNodeElement(ANode: TTreeNode): TJSHTMLElement;\r\nvar\r\n s: string;\r\n tn: TTreeNode;\r\nbegin\r\n Result := nil;\r\n tn := ANode;\r\n\r\n if not Assigned(tn) then\r\n Exit;\r\n\r\n s := '';\r\n\r\n // generate HTML element ID\r\n repeat\r\n if s = '' then\r\n s := IntToStr(tn.Index)\r\n else\r\n s := IntTostr(tn.Index) + '_' + s;\r\n\r\n tn := tn.Parent;\r\n\r\n// until (tn = nil);\r\n until (not Assigned(tn));\r\n\r\n s := Name + '_' + s;\r\n\r\n Result := TJSHTMLElement(document.getElementById(s));\r\n\r\n if Assigned(Result) then\r\n begin\r\n if Result.classlist.contains('TVCARET') then\r\n Result := TJSHTMLElement(Result.firstChild);\r\n end;\r\nend;\r\n\r\nfunction TTreeView.GetNodeFromID(AId: string): TTreeNode;\r\nvar\r\n s: string;\r\n sl: TStringList;\r\n n: TTreeNode;\r\n i,j,e: integer;\r\n\r\nbegin\r\n Result := nil;\r\n\r\n s := AID;\r\n s := Copy(s, Length(Name) + 2, Length(s));\r\n\r\n if (s <> '') then\r\n begin\r\n sl := TStringList.Create;\r\n sl.Delimiter := '_';\r\n sl.StrictDelimiter := true;\r\n sl.DelimitedText := s;\r\n\r\n n := nil;\r\n for i := 0 to sl.Count - 1 do\r\n begin\r\n val(sl.Strings[i], j, e);\r\n\r\n if (i = 0) then\r\n n := Items[j]\r\n else\r\n n := n.Item[j];\r\n end;\r\n sl.Free;\r\n\r\n Result := n;\r\n end;\r\nend;\r\n\r\nfunction TTreeView.GetSelected: TTreeNode;\r\nbegin\r\n Result := FSelected;\r\nend;\r\n\r\nfunction TTreeView.HandleClick(Event: TJSEvent): Boolean;\r\nvar\r\n n: TTreeNode;\r\n el: TJSHTMLElement;\r\nbegin\r\n Result := true;\r\n asm\r\n el = Event.srcElement;\r\n end;\r\n\r\n while Assigned(el) and (el.tagName <> 'SPAN') do\r\n el := TJSHTMLElement(el.parentElement);\r\n\r\n if Assigned(el) then\r\n begin\r\n if el.hasAttribute('id') then\r\n begin\r\n n := GetNodeFromID(el['id']);\r\n\r\n if Assigned(OnClick) then\r\n OnClick(Self);\r\n\r\n if Assigned(n) then\r\n begin\r\n DoChangeSelection(n);\r\n\r\n if Assigned(OnClickNode) then\r\n OnClickNode(Self, n);\r\n end;\r\n end;\r\n\r\n end;\r\nend;\r\n\r\nfunction TTreeView.HandleDblClick(Event: TJSEvent): Boolean;\r\nvar\r\n n: TTreeNode;\r\n el: TJSElement;\r\nbegin\r\n Result := true;\r\n\r\n asm\r\n el = Event.srcElement;\r\n end;\r\n\r\n while Assigned(el) and (el.tagName <> 'SPAN') do\r\n el := TJSHTMLElement(el.parentElement);\r\n\r\n if Assigned(el) then\r\n begin\r\n if not el.hasAttribute('id') then\r\n el := el.parentElement;\r\n\r\n if el.hasAttribute('id') then\r\n begin\r\n n := GetNodeFromID(el['id']);\r\n\r\n if Assigned(OnDblClick) then\r\n OnDblClick(Self);\r\n\r\n if Assigned(n) and Assigned(OnDblClickNode) then\r\n OnDblClickNode(Self, n);\r\n\r\n // toggle expanded state on dbl click\r\n n.Expanded := not n.Expanded;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTreeView.HandleNode(Event: TJSEvent): Boolean;\r\nvar\r\n el: TJSElement;\r\n n: TTreeNode;\r\n Allow: boolean;\r\nbegin\r\n asm\r\n el = Event.srcElement;\r\n end;\r\n\r\n if Assigned(el) and (el.hasAttribute('id')) then\r\n begin\r\n n := GetNodeFromID(el['id']);\r\n\r\n Allow := true;\r\n\r\n if n.Expanded then\r\n begin\r\n if Assigned(OnCollapsing) then\r\n OnCollapsing(Self, n, Allow);\r\n end\r\n else\r\n begin\r\n if Assigned(OnExpanding) then\r\n OnExpanding(Self, n, Allow);\r\n end;\r\n\r\n if Allow then\r\n begin\r\n n.Expanded := not n.Expanded;\r\n\r\n if n.Expanded then\r\n begin\r\n if Assigned(OnExpanded) then\r\n OnExpanded(Self, n);\r\n end\r\n else\r\n begin\r\n if Assigned(OnCollapsed) then\r\n OnCollapsed(Self, n);\r\n end;\r\n end;\r\n\r\n DoChangeSelection(n);\r\n\r\n if Assigned(OnClickNode) then\r\n OnClickNode(Self, n);\r\n\r\n Result := true;\r\n Event.preventDefault;\r\n end\r\n else\r\n begin\r\n if Assigned(el) then\r\n begin\r\n el := el.parentElement;\r\n if el.hasAttribute('id') then\r\n begin\r\n n := GetNodeFromID(el['id']);\r\n DoChangeSelection(n);\r\n\r\n if Assigned(OnClickNode) then\r\n OnClickNode(Self, n);\r\n\r\n Result := true;\r\n Event.preventDefault;\r\n end;\r\n end;\r\n\r\n end;\r\n\r\n\r\n\r\nend;\r\n\r\nprocedure TTreeView.KeyDown(var Key: Word; Shift: TShiftState);\r\nvar\r\n tn,sn,ln: TTreeNode;\r\nbegin\r\n tn := Selected;\r\n\r\n if (Key = VK_HOME) then\r\n begin\r\n if Assigned(Items[0]) then\r\n DoChangeSelection(Items[0]);\r\n end;\r\n\r\n if (Key = VK_END) and (Items.Count > 0) then\r\n begin\r\n tn := Items[Items.Count - 1];\r\n\r\n while tn.Expanded do\r\n begin\r\n if tn.Count > 0 then\r\n tn := tn.Item[tn.Count -1];\r\n end;\r\n\r\n DoChangeSelection(tn);\r\n end;\r\n\r\n if (Key = VK_DOWN) then\r\n begin\r\n if Assigned(tn) then\r\n begin\r\n if tn.Expanded and (tn.Count > 0) then\r\n begin\r\n tn := tn.GetFirstChild;\r\n end\r\n else\r\n tn := tn.GetNextSibling;\r\n\r\n if not Assigned(tn) then\r\n begin\r\n tn := Selected;\r\n sn := tn;\r\n\r\n while not Assigned(sn.GetNextSibling) and Assigned(sn.Parent) do\r\n begin\r\n sn := sn.Parent;\r\n if Assigned(sn) then\r\n ln := sn.GetNextSibling;\r\n\r\n if Assigned(ln) then\r\n begin\r\n tn := ln;\r\n end;\r\n end;\r\n end;\r\n\r\n if Assigned(tn) then\r\n DoChangeSelection(tn);\r\n end;\r\n end;\r\n\r\n if (Key = VK_UP) then\r\n begin\r\n if Assigned(tn) then\r\n begin\r\n tn := tn.GetPrevSibling;\r\n if Assigned(tn) then\r\n begin\r\n sn := tn;\r\n while Assigned(sn) and sn.Expanded and (sn.Count > 0) do\r\n begin\r\n sn := sn.Item[tn.Count - 1];\r\n if Assigned(sn) then\r\n tn := sn;\r\n end;\r\n\r\n DoChangeSelection(tn);\r\n end\r\n else\r\n begin\r\n tn := Selected.Parent;\r\n if Assigned(tn) then\r\n DoChangeSelection(tn);\r\n end;\r\n end;\r\n end;\r\n\r\n if (Key = VK_RIGHT) then\r\n begin\r\n if Assigned(tn) then\r\n Selected.Expanded := true;\r\n end;\r\n\r\n if (Key = VK_LEFT) then\r\n begin\r\n if Assigned(tn) then\r\n Selected.Expanded := false;\r\n end;\r\n\r\n if (Key in [VK_LEFT, VK_RIGHT, VK_DOWN, VK_UP]) then\r\n begin\r\n Key := 0;\r\n Exit;\r\n end;\r\n\r\n inherited;\r\nend;\r\n\r\nfunction TTreeView.RenderNode(ANode: TTreeNode; AElementName: string): TJSHTMLElement;\r\nbegin\r\n Result := TJSHTMLElement(document.createElement('SPAN'));\r\n if AElementName <> '' then\r\n Result.setAttribute('id',AElementName);\r\n\r\n Result.innerHTML := ANode.Text;\r\n Result.classlist.add('TVNODE');\r\n\r\n if ElementNodeClassName <> '' then\r\n Result.classlist.add(ElementNodeClassName);\r\n\r\n if Assigned(Selected) then\r\n begin\r\n if Selected = ANode then\r\n begin\r\n Result.classlist.add('TVSELECTED');\r\n if ElementNodeSelectedClassName <> '' then\r\n Result.classlist.add(ElementNodeSelectedClassName);\r\n end;\r\n end;\r\n\r\n// if not Assigned(OnClickNode) and not Assigned(OnDblClickNode) then\r\n// Result.style.setProperty('pointer-events','none');\r\n\r\n if ANode.Hint <> '' then\r\n Result.setAttribute('title', ANode.Hint);\r\nend;\r\n\r\nprocedure TTreeView.RenderNodes;\r\n\r\n procedure RenderChildNode(LinkElement: TJSHTMLElement; ANode: TTreeNode; AElementName: string);\r\n var\r\n sp,nd: TJSHTMLElement;\r\n begin\r\n sp := TJSHTMLElement(document.createElement('SPAN'));\r\n if AElementName <> '' then\r\n sp.setAttribute('id', AElementName);\r\n\r\n sp.addEventListener('click',@HandleNode);\r\n sp.addEventListener('dblclick',@HandleDblClick);\r\n\r\n nd := TJSHTMLElement(document.createElement('SPAN'));\r\n\r\n if AutoExpand then\r\n nd.style.setProperty('pointer-events', 'none');\r\n\r\n nd.innerHTML := ANode.Text;\r\n nd.classlist.add('TVNODE');\r\n\r\n if ElementNodeClassName <> '' then\r\n nd.classlist.add(ElementNodeClassName);\r\n\r\n if not AutoExpand then\r\n nd.classlist.add('TVNOCURSOR');\r\n\r\n if Assigned(Selected) then\r\n begin\r\n if Selected = ANode then\r\n begin\r\n nd.classlist.add('TVSELECTED');\r\n if ElementNodeSelectedClassName <> '' then\r\n nd.classlist.add(ElementNodeSelectedClassName);\r\n end;\r\n end;\r\n\r\n if ANode.Hint <> '' then\r\n nd.setAttribute('title', ANode.Hint);\r\n\r\n LinkElement.appendChild(sp);\r\n sp.appendChild(nd);\r\n if ANode.Expanded then\r\n sp.setAttribute('class', 'TVCARET TVCARET-DOWN')\r\n else\r\n sp.setAttribute('class', 'TVCARET');\r\n\r\n DoRenderNode(ANode, nd);\r\n end;\r\n\r\n procedure FillChilds(ParentElement: TJSElement; ParentName: string; ANode: TTreeNode);\r\n var\r\n i: integer;\r\n ul: TJSElement;\r\n nd,li: TJSHTMLElement;\r\n nn: string;\r\n begin\r\n ul := document.createElement('UL');\r\n ul.setAttribute('class','TVUL');\r\n ul.setAttribute('id',ParentName);\r\n if DragMode = dmAutomatic then\r\n ul.setAttribute('draggable', 'true');\r\n ParentElement.appendChild(ul);\r\n\r\n if not Assigned(ANode) then\r\n begin\r\n // root items\r\n for i := 0 to FItems.Count - 1 do\r\n begin\r\n nn := ParentName + '_' + inttostr(i);\r\n\r\n li := TJSHTMLElement(document.createElement('LI'));\r\n if DragMode = dmAutomatic then\r\n li.setAttribute('draggable', 'true');\r\n ul.appendChild(li);\r\n\r\n if FItems[i].Count > 0 then\r\n begin\r\n RenderChildNode(li, FItems[i], nn);\r\n FillChilds(li, nn, FItems[i]);\r\n end\r\n else\r\n begin\r\n nd := RenderNode(FItems[i], nn);\r\n li.appendChild(nd);\r\n DoRenderNode(FItems[i], nd);\r\n\r\n nd.addEventListener('click', @HandleClick);\r\n nd.addEventListener('dblclick', @HandleDblClick);\r\n end;\r\n end;\r\n end\r\n else\r\n begin\r\n // child items\r\n if ANode.Expanded then\r\n ul.setAttribute('class','TVNESTED TVUL TVACTIVE')\r\n else\r\n ul.setAttribute('class','TVNESTED TVUL');\r\n\r\n for i := 0 to ANode.Count - 1 do\r\n begin\r\n nn := ParentName + '_' + inttostr(i);\r\n\r\n li := TJSHTMLElement(document.createElement('LI'));\r\n if DragMode = dmAutomatic then\r\n li.setAttribute('draggable', 'true');\r\n ul.appendChild(li);\r\n\r\n if ANode.Item[i].Count > 0 then\r\n begin\r\n RenderChildNode(li, ANode.Item[i], nn);\r\n FillChilds(li, nn, ANode.Item[i]);\r\n end\r\n else\r\n begin\r\n nd := RenderNode(ANode.Item[i], nn);\r\n li.appendChild(nd);\r\n\r\n DoRenderNode(ANode.Item[i], nd);\r\n\r\n nd.addEventListener('click', @HandleClick);\r\n nd.addEventListener('dblclick', @HandleDblClick);\r\n end;\r\n end;\r\n end;\r\n end;\r\n\r\nbegin\r\n if not Assigned(ElementHandle) then\r\n Exit;\r\n\r\n // remove previous tree\r\n while ElementHandle.childNodes.length > 0 do\r\n ElementHandle.removeChild(ElementHandle.FirstChild);\r\n\r\n FillChilds(ElementHandle, Name, nil);\r\n ElementHandle.style.setProperty('overflow','auto');\r\nend;\r\n\r\nprocedure TTreeView.Select(const ANode: TTreeNode);\r\nbegin\r\n SetSelected(ANode);\r\nend;\r\n\r\nprocedure TTreeView.SetElementNodeClassName(const Value: TElementClassName);\r\nbegin\r\n if (FElementNodeClassName <> Value) then\r\n begin\r\n FElementNodeClassName := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TTreeView.SetElementNodeSelectedClassName(\r\n const Value: TElementClassName);\r\nbegin\r\n if (FElementNodeSelectedClassName <> Value) then\r\n begin\r\n FElementNodeSelectedClassName := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TTreeView.SetItems(const Value: TTreeNodes);\r\nbegin\r\n FItems.Assign(Value);\r\nend;\r\n\r\nprocedure TTreeView.SetSelected(const Value: TTreeNode);\r\nvar\r\n el: TJSHTMLElement;\r\nbegin\r\n if Assigned(FSelected) then\r\n begin\r\n el := GetNodeElement(FSelected);\r\n if Assigned(el) then\r\n begin\r\n el.classlist.toggle('TVSELECTED');\r\n if ElementNodeSelectedClassName <> '' then\r\n el.classlist.toggle(ElementNodeSelectedClassName);\r\n end;\r\n end;\r\n\r\n FSelected := Value;\r\n el := GetNodeElement(FSelected);\r\n if Assigned(el) then\r\n begin\r\n el.classlist.toggle('TVSELECTED');\r\n if ElementNodeSelectedClassName <> '' then\r\n el.classlist.toggle(ElementNodeSelectedClassName);\r\n end;\r\nend;\r\n\r\nend.","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright (c) 2018 - 2021 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.Buttons;\r\n\r\n{$DEFINE NOPP}\r\n\r\ninterface\r\n\r\nuses\r\n Classes, SysUtils, WEBLib.Controls, Web, WEBLib.Graphics, WEBLib.StdCtrls,\r\n WEBlib.ComCtrls, WEBLib.ExtCtrls;\r\n\r\ntype\r\n\r\n TButtonLayout = (blGlyphLeft, blGlyphRight, blGlyphTop, blGlyphBottom);\r\n\r\n\r\n TCustomSpeedButton = class(TCustomControl)\r\n private\r\n FMaterialGlyph: TMaterialGlyph;\r\n FColor: TColor;\r\n FIntColor: TColor;\r\n FDown: boolean;\r\n FFlat: boolean;\r\n FGroupIndex: integer;\r\n FAllowAllUp: boolean;\r\n FGlyph: TURLPicture;\r\n FLayout: TButtonLayout;\r\n FGlyphURL: String;\r\n FMaterialGlyphSize: integer;\r\n FMaterialGlyphColor: TColor;\r\n procedure SetMaterialGlyph(const AValue: TMaterialGlyph);\r\n procedure SetColorEx(const AValue: TColor);\r\n procedure SetIntColor(const AValue: TColor);\r\n procedure SetGroupIndex(const AValue: integer);\r\n procedure SetDown(const AValue: boolean);\r\n procedure SetFlat(const Value: boolean);\r\n procedure SetGlyph(const Value: TURLPicture);\r\n procedure SetGlyphURL(const Value: String);\r\n procedure SetMaterialGlyphSiz(const Value: integer);\r\n procedure SetMaterialGyphColor(const Value: TColor);\r\n protected\r\n procedure SetEnabled(Value: Boolean); override;\r\n procedure SetCaption(const AValue: string); override;\r\n function CreateElement: TJSElement; override;\r\n procedure UpdateElement; override;\r\n procedure UpdateGroup; virtual;\r\n procedure DoMouseLeave; override;\r\n procedure DoMouseEnter; override;\r\n procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X,Y: Integer); override;\r\n procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X,Y: Integer); override;\r\n procedure GlyphChanged(Sender: TObject);\r\n property AllowAllUp: boolean read FAllowAllUp write FAllowAllUp;\r\n property Color: TColor read FColor write SetColorEx default clNone;\r\n property IntColor: TColor read FIntColor write SetIntColor;\r\n property Down: boolean read FDown write SetDown;\r\n property Flat: boolean read FFlat write SetFlat default false;\r\n property Glyph: TURLPicture read FGlyph write SetGlyph;\r\n property GlyphURL: String read FGlyphURL write SetGlyphURL;\r\n property GroupIndex: integer read FGroupIndex write SetGroupIndex;\r\n property Layout: TButtonLayout read FLayout write FLayout default blGlyphLeft;\r\n property MaterialGlyph: TMaterialGlyph read FMaterialGlyph write SetMaterialGlyph;\r\n property MaterialGlyphColor: TColor read FMaterialGlyphColor write SetMaterialGyphColor default clNone;\r\n property MaterialGlyphSize: integer read FMaterialGlyphSize write SetMaterialGlyphSiz default 18;\r\n public\r\n destructor Destroy; override;\r\n procedure CreateInitialize; override;\r\n function CanFocus: Boolean; override;\r\n end;\r\n\r\n TSpeedButton = class(TCustomSpeedButton)\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property AllowAllUp;\r\n property Caption;\r\n property Color;\r\n property Down;\r\n property ElementClassName;\r\n property ElementID;\r\n property ElementFont;\r\n property ElementPosition;\r\n property Enabled;\r\n property Flat;\r\n property Font;\r\n property Glyph;\r\n property GlyphURL;\r\n property GroupIndex;\r\n property Height;\r\n property Hint;\r\n property Layout;\r\n property Margins;\r\n property MaterialGlyph;\r\n property MaterialGlyphColor;\r\n property MaterialGlyphSize;\r\n property ShowHint;\r\n property Visible;\r\n property Width;\r\n property OnClick;\r\n property OnDblClick;\r\n property OnKeyDown;\r\n property OnKeyPress;\r\n property OnKeyUp;\r\n property OnMouseDown;\r\n property OnMouseUp;\r\n property OnMouseMove;\r\n property OnMouseLeave;\r\n property OnMouseEnter;\r\n property OnEnter;\r\n property OnExit;\r\n end;\r\n\r\n\r\n TWebSpeedButton = class(TSpeedButton);\r\n\r\n TCustomBitBtn = class(TCustomControl)\r\n private\r\n FMaterialGlyph: TMaterialGlyph;\r\n FLayout: TButtonLayout;\r\n FFlat: boolean;\r\n FGlyph: TURLPicture;\r\n FColor: TColor;\r\n FIntColor: TColor;\r\n FAlignment: TAlignment;\r\n FGlyphURL: String;\r\n FMaterialGlyphSize: integer;\r\n FMaterialGlyphColor: TColor;\r\n procedure SetFlat(const Value: boolean);\r\n procedure SetGlyph(const Value: TURLPicture);\r\n procedure SetLayout(const Value: TButtonLayout);\r\n procedure SetMaterialGlyph(const Value: TMaterialGlyph);\r\n procedure SetColorEx(const Value: TColor);\r\n procedure SetIntColor(const Value: TColor);\r\n procedure SetAlignment(const Value: TAlignment);\r\n procedure SetGlyphURL(const Value: String);\r\n procedure SetMaterialGlyphSiz(const Value: integer);\r\n procedure SetMaterialGyphColor(const Value: TColor);\r\n protected\r\n procedure SetCaption(const AValue: string); override;\r\n function CreateElement: TJSElement; override;\r\n procedure UpdateElement; override;\r\n procedure UpdateElementVisual; override;\r\n procedure GlyphChanged(Sender: TObject);\r\n property Alignment: TAlignment read FAlignment write SetAlignment default taCenter;\r\n property Color: TColor read FColor write SetColorEx;\r\n property IntColor: TColor read FIntColor write SetIntColor;\r\n property Flat: boolean read FFlat write SetFlat default false;\r\n property Layout: TButtonLayout read FLayout write SetLayout default blGlyphLeft;\r\n property MaterialGlyph: TMaterialGlyph read FMaterialGlyph write SetMaterialGlyph;\r\n property MaterialGlyphColor: TColor read FMaterialGlyphColor write SetMaterialGyphColor default clNone;\r\n property MaterialGlyphSize: integer read FMaterialGlyphSize write SetMaterialGlyphSiz default 18;\r\n property Glyph: TURLPicture read FGlyph write SetGlyph;\r\n property GlyphURL: String read FGlyphURL write SetGlyphURL;\r\n public\r\n destructor Destroy; override;\r\n procedure CreateInitialize; override;\r\n end;\r\n\r\n TBitBtn = class(TCustomBitBtn)\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Alignment;\r\n property Anchors;\r\n property Caption;\r\n property Color;\r\n property DragMode;\r\n property ElementClassName;\r\n property ElementID;\r\n property ElementFont;\r\n property ElementPosition;\r\n property Enabled;\r\n property Font;\r\n property Flat;\r\n property Glyph;\r\n property GlyphURL;\r\n property Height;\r\n property Hint;\r\n property Layout;\r\n property MaterialGlyph;\r\n property MaterialGlyphColor;\r\n property MaterialGlyphSize;\r\n property ParentFont;\r\n property ShowHint;\r\n property TabOrder;\r\n property TabStop;\r\n property Visible;\r\n property Width;\r\n property OnClick;\r\n property OnDblClick;\r\n property OnKeyDown;\r\n property OnKeyPress;\r\n property OnKeyUp;\r\n property OnMouseDown;\r\n property OnMouseUp;\r\n property OnMouseMove;\r\n property OnMouseLeave;\r\n property OnMouseEnter;\r\n property OnEnter;\r\n property OnExit;\r\n property OnDragDrop;\r\n property OnDragOver;\r\n property OnEndDrag;\r\n property OnStartDrag;\r\n end;\r\n\r\n TWebBitBtn = class(TBitBtn);\r\n\r\n TCustomToolBar = class(TCustomControl)\r\n protected\r\n function CreateElement: TJSElement; override;\r\n public\r\n procedure CreateInitialize; override;\r\n property Color default $CFCFCF;\r\n end;\r\n\r\n TToolBar = class(TCustomToolBar)\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property Color;\r\n property DragMode;\r\n property Enabled;\r\n property ElementClassName;\r\n property ElementID;\r\n property ElementFont;\r\n property ElementPosition;\r\n property Height;\r\n property Hint;\r\n property Left;\r\n property Margins;\r\n property ShowHint;\r\n property Top;\r\n property Visible;\r\n property Width;\r\n property OnClick;\r\n property OnDblClick;\r\n property OnDragDrop;\r\n property OnDragOver;\r\n property OnEndDrag;\r\n property OnStartDrag;\r\n end;\r\n\r\n TWebToolBar = class(TToolBar);\r\n\r\n\r\n TRichEditBtn = (reFont, reFontSize, reBold, reItalic, reUnderline, reStrikeThrough,\r\n reAlignLeft, reAlignCenter, reAlignRight, reUnorderedList, reOrderedList, reForegroundColor, reBackgroundColor);\r\n\r\n TRichEditButtonSet = set of TRichEditBtn;\r\n\r\n TRichEditToolBar = class(TToolBar)\r\n private\r\n FBold: TSpeedButton;\r\n FItalic: TSpeedButton;\r\n FUnderline: TSpeedButton;\r\n FStrikeThrough: TSpeedButton;\r\n FAlignLeft: TSpeedButton;\r\n FAlignCenter: TSpeedButton;\r\n FAlignRight: TSpeedButton;\r\n FUList: TSpeedButton;\r\n FOList: TSpeedButton;\r\n FRichEdit: TRichEdit;\r\n FFnt: TFontPicker;\r\n FFntSize: TFontSizePicker;\r\n FFgClr: TColorPicker;\r\n FBkClr: TColorPicker;\r\n FOnSpeedButtonClick: TNotifyEvent;\r\n FTextColor: TColor;\r\n FBackgroundColor: TColor;\r\n FVisibleButtons: TRichEditButtonSet;\r\n FHints: TStrings;\r\n FBtnID: string;\r\n procedure SetRichEdit(const AValue: TRichEdit);\r\n function GetRichEdit: TRichEdit;\r\n procedure SetTextColor(const Value: TColor);\r\n procedure SetBackgroundColor(const Value: TColor);\r\n procedure SetVisibleButtons(const Value: TRichEditButtonSet);\r\n procedure SetHints(const Value: TStrings);\r\n protected\r\n procedure Notification(AComponent: TComponent; Operation: TOperation); override;\r\n procedure CreateButton(var btn: TSpeedButton; BtnID, Glyph, Hint: string);\r\n procedure HandleSpeedButtonClick(Sender: TObject); virtual;\r\n procedure FgSelect(Sender: TObject);\r\n procedure BkSelect(Sender: TObject);\r\n procedure FntChange(Sender: TObject);\r\n procedure FntSizeChange(Sender: TObject);\r\n procedure UpdateButtons; virtual;\r\n procedure UpdateElement; override;\r\n procedure Loaded; override;\r\n procedure HandleAttributeChanged(Sender: TObject; Attributes: TSelAttributes);\r\n procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;\r\n function InitButtons(): boolean;\r\n procedure SetParent(AValue: TControl); override;\r\n public\r\n procedure CreateInitialize; override;\r\n destructor Destroy; override;\r\n property FontPicker: TFontPicker read FFnt;\r\n property FontSizePicker: TFontSizePicker read FFntSize;\r\n published\r\n property BackgroundColor: TColor read FBackgroundColor write SetBackgroundColor default clWhite;\r\n property Hints: TStrings read FHints write SetHints;\r\n property RichEdit: TRichEdit read GetRichEdit write SetRichEdit;\r\n property TextColor: TColor read FTextColor write SetTextColor default clBlack;\r\n property VisibleButtons: TRichEditButtonSet read FVisibleButtons write SetVisibleButtons;\r\n property OnSpeedButtonClick: TNotifyEvent read FOnSpeedButtonClick write FOnSpeedButtonClick;\r\n end;\r\n\r\n TWebRichEditToolBar = class(TRichEditToolBar);\r\n\r\n TToggleButtonStyle = (tsRectangular, tsRounded);\r\n\r\n TToggleButton = class(TCustomControl)\r\n private\r\n FChecked: boolean;\r\n FLabel: TJSHTMLElement;\r\n FInput: TJSHTMLElement;\r\n FSlider: TJSHTMLElement;\r\n FStyle: TToggleButtonStyle;\r\n procedure SetStyle(const Value: TToggleButtonStyle);\r\n function GetChecked: boolean;\r\n procedure SetChecked(const Value: boolean);\r\n protected\r\n function HandleDoClick(Event: TJSMouseEvent): Boolean; override;\r\n procedure UpdateElement; override;\r\n function CreateElement: TJSElement; override;\r\n procedure Loaded; override;\r\n public\r\n procedure CreateInitialize; override;\r\n published\r\n property Anchors;\r\n property Checked: boolean read GetChecked write SetChecked;\r\n property DragMode;\r\n property ElementClassName;\r\n property ElementID;\r\n property ElementFont;\r\n property ElementPosition;\r\n property Style: TToggleButtonStyle read FStyle write SetStyle default tsRectangular;\r\n property Visible;\r\n property OnClick;\r\n property OnMouseDown;\r\n property OnMouseUp;\r\n property OnMouseMove;\r\n property OnMouseLeave;\r\n property OnMouseEnter;\r\n property OnEnter;\r\n property OnExit;\r\n property OnDragDrop;\r\n property OnDragOver;\r\n property OnEndDrag;\r\n property OnStartDrag;\r\n end;\r\n\r\n TWebToggleButton = class(TToggleButton);\r\n\r\n\r\nimplementation\r\n\r\nuses\r\n WEBLib.WebTools;\r\n\r\n// https://stackoverflow.com/questions/1720320/how-to-dynamically-create-css-class-in-javascript-and-apply\r\n// https://www.w3schools.com/howto/howto_css_switch.asp\r\n\r\ntype\r\n TRichEditorCracker = class(TRichEdit);\r\n\r\n{ TCustomSpeedButton }\r\n\r\nprocedure TCustomSpeedButton.CreateInitialize;\r\nbegin\r\n inherited;\r\n FColor := clNone;\r\n FIntColor := clNone;\r\n FGroupIndex := 0;\r\n FDown := false;\r\n FFlat := false;\r\n FGlyph := TURLPicture.Create;\r\n FGlyph.OnChange := GlyphChanged;\r\n FGlyph.OnDataChange := GlyphChanged;\r\n FLayout := blGlyphLeft;\r\n FMaterialGlyphSize := 18;\r\n FMaterialGlyphColor := clNone;\r\nend;\r\n\r\nfunction TCustomSpeedButton.CanFocus: Boolean;\r\nbegin\r\n Result := false;\r\nend;\r\n\r\nfunction TCustomSpeedButton.CreateElement: TJSElement;\r\nbegin\r\n if FFlat then\r\n Result := document.createElement('SPAN')\r\n else\r\n Result := document.createElement('BUTTON');\r\nend;\r\n\r\nprocedure TCustomSpeedButton.SetCaption(const AValue: string);\r\nbegin\r\n if (Caption <> AValue) then\r\n begin\r\n inherited SetCaption(AValue);\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomSpeedButton.SetColorEx(const AValue: TColor);\r\nbegin\r\n if FColor <> AValue then\r\n begin\r\n FColor := AValue;\r\n FIntColor := AValue;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomSpeedButton.SetDown(const AValue: boolean);\r\nbegin\r\n if (FDown <> AValue) then\r\n begin\r\n FDown := AValue;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomSpeedButton.SetEnabled(Value: Boolean);\r\nbegin\r\n inherited;\r\n UpdateElement;\r\nend;\r\n\r\nprocedure TCustomSpeedButton.SetFlat(const Value: boolean);\r\nbegin\r\n if (FFlat <> Value) then\r\n begin\r\n FFlat := Value;\r\n RecreateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomSpeedButton.SetIntColor(const AValue: TColor);\r\nbegin\r\n if FIntColor <> AValue then\r\n begin\r\n FIntColor := AValue;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomSpeedButton.SetMaterialGlyph(const AValue: TMaterialGlyph);\r\nbegin\r\n if FMaterialGlyph <> AValue then\r\n begin\r\n FMaterialGlyph := AValue;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomSpeedButton.SetMaterialGlyphSiz(const Value: integer);\r\nbegin\r\n if (Value > 0) and (Value < 0) then\r\n begin\r\n FMaterialGlyphSize := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomSpeedButton.SetMaterialGyphColor(const Value: TColor);\r\nbegin\r\n if (FMaterialGlyphColor <> Value) then\r\n begin\r\n FMaterialGlyphColor := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomSpeedButton.SetGlyph(const Value: TURLPicture);\r\nbegin\r\n FGlyph.Assign(Value);\r\n UpdateElement;\r\nend;\r\n\r\nprocedure TCustomSpeedButton.SetGlyphURL(const Value: String);\r\nbegin\r\n if FGlyphURL <> Value then\r\n begin\r\n FGlyphURL := Value;\r\n RecreateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomSpeedButton.SetGroupIndex(const AValue: integer);\r\nbegin\r\n FGroupIndex := AValue;\r\nend;\r\n\r\nprocedure TCustomSpeedButton.UpdateElement;\r\nvar\r\n s,inactive,noptr,icn,imgsrc: string;\r\n clr: TColor;\r\n matclr: string;\r\nbegin\r\n inherited;\r\n\r\n if not IsUpdating and (MaterialGlyph <> '') then\r\n AddControlLink('googlematerial', 'https://fonts.googleapis.com/icon?family=Material+Icons');\r\n\r\n if Assigned(ElementHandle) then\r\n begin\r\n if Down then\r\n clr := clGray\r\n else\r\n clr := FIntColor;\r\n\r\n if (clr <> clNone) and (ElementClassName = '') then\r\n ElementHandle.style.setProperty('background-color', ColorToHTML(clr))\r\n else\r\n ElementHandle.style.setProperty('background-color', '');\r\n\r\n ElementHandle.style.setProperty('vertical-align','middle');\r\n\r\n// if Visible then\r\n// ElementHandle.style.setProperty('display','table');\r\n\r\n ElementHandle.style.setProperty('overflow','hidden');\r\n ElementHandle.style.setProperty('padding','0px');\r\n ElementHandle.style.setProperty('text-align','center');\r\n\r\n s := '';\r\n inactive := '';\r\n noptr := '';\r\n\r\n if not Enabled then\r\n inactive := ' md-light md-inactive';\r\n\r\n noptr := 'pointer-events:none';\r\n\r\n if FMaterialGlyph <> '' then\r\n begin\r\n matclr := '';\r\n if FMaterialGlyphColor <> clNone then\r\n matclr := ';color:'+ColorToHTML(FMaterialGlyphColor);\r\n\r\n icn := '' + FMaterialGlyph + '';\r\n end;\r\n\r\n if FGlyph.Data <> '' then\r\n imgsrc := 'data:image/jpeg;base64,' + HexImageDecodeAsBase64(FGlyph.Data)\r\n else\r\n if FGlyph.FileName <> '' then\r\n imgsrc := FGlyph.FileName\r\n else\r\n if FGlyphURL <> '' then\r\n imgsrc := FGlyphURL;\r\n\r\n if imgsrc <> '' then\r\n icn := '';\r\n\r\n case Layout of\r\n blGlyphLeft: s := '
'+icn+''+Caption+'
';\r\n blGlyphRight: s := '
'+Caption+''+icn+'
';\r\n blGlyphTop: s := '
'+icn+'
'+Caption+'
';\r\n blGlyphBottom: s := '
'+Caption+'
'+icn+'
';\r\n end;\r\n\r\n ElementHandle.innerHTML := s;\r\n\r\n SetHTMLElementFont(TJSHTMLElement(ElementHandle.firstChild), Font, not ((ElementClassName = '') and (ElementFont = efProperty)) );\r\n end;\r\nend;\r\n\r\nprocedure TCustomSpeedButton.UpdateGroup;\r\nvar\r\n i: integer;\r\nbegin\r\n if Assigned(Parent) then\r\n begin\r\n for i := 0 to Parent.ControlCount - 1 do\r\n begin\r\n if (Parent.Controls[i] <> Self) and (Parent.Controls[i] is TSpeedButton) and ((Parent.Controls[i] as TSpeedButton).GroupIndex = GroupIndex) then\r\n (Parent.Controls[i] as TSpeedButton).Down := false;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TCustomSpeedButton.DoMouseLeave;\r\nbegin\r\n inherited;\r\n IntColor := FColor;\r\nend;\r\n\r\nprocedure TCustomSpeedButton.GlyphChanged(Sender: TObject);\r\nbegin\r\n UpdateElement;\r\nend;\r\n\r\ndestructor TCustomSpeedButton.Destroy;\r\nbegin\r\n FGlyph.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TCustomSpeedButton.DoMouseEnter;\r\nbegin\r\n inherited;\r\n if Enabled then\r\n IntColor := clSilver;\r\nend;\r\n\r\nprocedure TCustomSpeedButton.MouseUp(Button: TMouseButton; Shift: TShiftState; X,Y: Integer);\r\nbegin\r\n inherited;\r\n if Enabled then\r\n IntColor := clSilver;\r\nend;\r\n\r\nprocedure TCustomSpeedButton.MouseDown(Button: TMouseButton; Shift: TShiftState; X,Y: Integer);\r\nbegin\r\n inherited;\r\n if not Enabled then\r\n Exit;\r\n\r\n IntColor := clGray;\r\n\r\n if GroupIndex > 0 then\r\n begin\r\n if Down and AllowAllUp then\r\n Down := false\r\n else\r\n begin\r\n Down := true;\r\n UpdateGroup;\r\n end;\r\n end;\r\nend;\r\n\r\n{ TCustomToolBar }\r\n\r\nfunction TCustomToolBar.CreateElement: TJSElement;\r\nvar\r\n el: TJSHTMLElement;\r\nbegin\r\n Result := document.createElement('SPAN');\r\n // add design-time layer to prevent interacting with the controls on the toolbar\r\n if (csDesigning in ComponentState) then\r\n begin\r\n el := TJSHTMLElement(document.createElement('DIV'));\r\n el.style.setProperty('z-index','10');\r\n el.style.setProperty('width','100%');\r\n el.style.setProperty('height','100%');\r\n el.style.setProperty('webkit-user-select', 'none');\r\n el.style.setProperty('moz-user-select', 'none');\r\n el.style.setProperty('khtml-user-select', 'none');\r\n el.style.setProperty('ms-user-select', 'none');\r\n el.style.setProperty('user-select', 'none');\r\n el.style.setProperty('position', 'absolute');\r\n\r\n Result.appendChild(el);\r\n end;\r\nend;\r\n\r\nprocedure TCustomToolBar.CreateInitialize;\r\nbegin\r\n inherited;\r\n Color := $CFCFCF;\r\n ControlStyle := ControlStyle + [csAcceptsControls];\r\n Width := 300;\r\n Height := 32;\r\nend;\r\n\r\n{ TRichEditToolBar }\r\n\r\nprocedure TRichEditToolBar.CreateInitialize;\r\nbegin\r\n inherited;\r\n\r\n // do not permit other child controls\r\n ControlStyle := ControlStyle - [csAcceptsControls];\r\n\r\n FTextColor := clBlack;\r\n FBackgroundColor := clWhite;\r\n\r\n FBtnID := FindUniqueName('RETBBtn');\r\n\r\n FFnt := TFontPicker.Create(Self);\r\n FFnt.Name := FBtnID + '_fontname';\r\n FFnt.Parent := Self;\r\n FFnt.Width := 150;\r\n FFnt.Align := alLeft;\r\n FFnt.OnChange := FntChange;\r\n\r\n FFntSize := TFontSizePicker.Create(Self);\r\n FFntSize.Name := FBtnID + '_fontsize';\r\n FFntSize.Parent := Self;\r\n FFntSize.Width := 50;\r\n FFntSize.Align := alLeft;\r\n FFntSize.PickerMode := fmRelativeSize;\r\n FFntSize.OnChange := FntSizeChange;\r\n\r\n FHints := TStringList.Create;\r\n FHints.Add('Bold');\r\n FHints.Add('Italic');\r\n FHints.Add('Underline');\r\n FHints.Add('Strike Throught');\r\n\r\n FHints.Add('Text Color');\r\n FHints.Add('Background Color');\r\n FHints.Add('Align lef');\r\n FHints.Add('Align center');\r\n FHints.Add('Align right');\r\n FHints.Add('Numbered list');\r\n FHints.Add('List');\r\n\r\n CreateButton(FBold, FBtnID + '_bold', '',FHints.Strings[0]);\r\n CreateButton(FItalic, FBtnID + '_italic', '',FHints.Strings[1]);\r\n CreateButton(FUnderline, FBtnID + '_underline', '',FHints.Strings[2]);\r\n CreateButton(FStrikeThrough, FBtnID + '_strikethrough', '',FHints.Strings[3]);\r\n\r\n FFgClr := TColorPicker.Create(Self);\r\n FFgClr.Name := FBtnID + '_fgclr';\r\n FFgClr.Parent := Self;\r\n FFgClr.Align := alLeft;\r\n FFgClr.Hint := FHints.Strings[4];\r\n FFgClr.Width := 32;\r\n FFgClr.Height := 24;\r\n FFgClr.Color := clBlack;\r\n FFgClr.OnSelect := FgSelect;\r\n\r\n FBkClr := TColorPicker.Create(Self);\r\n FBkClr.Name := FBtnID + '_bkclr';\r\n FBkClr.Parent := Self;\r\n FBkClr.Align := alLeft;\r\n FBkClr.Hint := FHints.Strings[5];\r\n FBkClr.Width := 32;\r\n FBkClr.Height := 24;\r\n FBkClr.Color := clWhite;\r\n FBkClr.OnSelect := BkSelect;\r\n\r\n CreateButton(FAlignLeft, FBtnID + '_alignleft', '',FHints.Strings[6]);\r\n CreateButton(FAlignCenter, FBtnID + '_aligncenter', '',FHints.Strings[7]);\r\n CreateButton(FAlignRight, FBtnID + '_alignright', '',FHints.Strings[8]);\r\n\r\n CreateButton(FOList, FBtnID + '_olist','',FHints.Strings[9]);\r\n CreateButton(FUList, FBtnID + '_ulist','',FHints.Strings[10]);\r\n\r\n FVisibleButtons := [reFont, reFontSize, reBold, reItalic, reUnderline, reStrikeThrough,\r\n reAlignLeft, reAlignCenter, reAlignRight, reUnorderedList, reOrderedList, reForegroundColor, reBackgroundColor];\r\n\r\n Width := 540;\r\n Height := 32;\r\n\r\n RichEdit := nil;\r\nend;\r\n\r\ndestructor TRichEditToolBar.Destroy;\r\nbegin\r\n FHints.Free;\r\n if Assigned(FRichEdit) then\r\n TRichEditorCracker(FRichEdit).OnAttributesChanged := nil;\r\n\r\n inherited;\r\nend;\r\n\r\nprocedure TRichEditToolBar.CreateButton(var btn: TSpeedButton; BtnID, Glyph, Hint: string);\r\nbegin\r\n btn := TSpeedButton.Create(BtnID);\r\n btn.Name := BtnID;\r\n btn.Parent := Self;\r\n btn.MaterialGlyph := Glyph;\r\n btn.Top := 0;\r\n btn.Width := 32;\r\n btn.Height := 24;\r\n btn.Align := alLeft;\r\n btn.Flat := true;\r\n btn.Hint := Hint;\r\n btn.ShowHint := Hint <> '';\r\n btn.Enabled := true;\r\n btn.OnClick := HandleSpeedButtonClick;\r\nend;\r\n\r\nprocedure TRichEditToolBar.SetBackgroundColor(const Value: TColor);\r\nbegin\r\n FBackgroundColor := Value;\r\n FBkClr.Color := Value;\r\nend;\r\n\r\nprocedure TRichEditToolBar.SetHints(const Value: TStrings);\r\nbegin\r\n FHints.Assign(Value);\r\nend;\r\n\r\nprocedure TRichEditToolBar.SetParent(AValue: TControl);\r\nbegin\r\n inherited;\r\n\r\n if not (csLoading in ComponentState) then\r\n InitButtons;\r\nend;\r\n\r\nprocedure TRichEditToolBar.SetRichEdit(const AValue: TRichEdit);\r\nbegin\r\n if Assigned(AValue) then\r\n begin\r\n FRichEdit := AValue;\r\n FRichEdit.Owner := Self;\r\n TRichEditorCracker(FRichEdit).OnAttributesChanged := HandleAttributeChanged;\r\n end;\r\nend;\r\n\r\nprocedure TRichEditToolBar.SetTextColor(const Value: TColor);\r\nbegin\r\n FTextColor := Value;\r\n FFgClr.Color := Value;\r\nend;\r\n\r\nprocedure TRichEditToolBar.SetVisibleButtons(const Value: TRichEditButtonSet);\r\nbegin\r\n FVisibleButtons := Value;\r\n UpdateButtons;\r\nend;\r\n\r\nprocedure TRichEditToolBar.UpdateButtons;\r\nbegin\r\n if IsUpdating then\r\n Exit;\r\n\r\n FBold.Visible := reBold in FVisibleButtons;\r\n FItalic.Visible := reItalic in VisibleButtons;\r\n FUnderline.Visible := reUnderline in VisibleButtons;\r\n FStrikeThrough.Visible := reStrikeThrough in VisibleButtons;\r\n FAlignLeft.Visible := reAlignLeft in VisibleButtons;\r\n FAlignCenter.Visible := reAlignCenter in VisibleButtons;\r\n FAlignRight.Visible := reAlignRight in VisibleButtons;\r\n FUList.Visible := reUnorderedList in VisibleButtons;\r\n FOList.Visible := reOrderedList in VisibleButtons;\r\n FFnt.Visible := reFont in VisibleButtons;\r\n FFntSize.Visible := reFontSize in VisibleButtons;\r\n FFgClr.Visible := reForegroundColor in VisibleButtons;\r\n FBkClr.Visible := reBackgroundColor in VisibleButtons;\r\n\r\n if ElementPosition = epRelative then\r\n begin\r\n if Assigned(ElementHandle) then\r\n ElementHandle.style.setProperty('display','flex');\r\n end;\r\n\r\n FFnt.ElementPosition := ElementPosition;\r\n FFntSize.ElementPosition := ElementPosition;\r\n FBold.ElementPosition := ElementPosition;\r\n FItalic.ElementPosition := ElementPosition;\r\n FUnderline.ElementPosition := ElementPosition;\r\n FStrikeThrough.ElementPosition := ElementPosition;\r\n FFgClr.ElementPosition := ElementPosition;\r\n FBkClr.ElementPosition := ElementPosition;\r\n FAlignLeft.ElementPosition := ElementPosition;\r\n FAlignCenter.ElementPosition := ElementPosition;\r\n FAlignRight.ElementPosition := ElementPosition;\r\n FUList.ElementPosition := ElementPosition;\r\n FOList.ElementPosition := ElementPosition;\r\n\r\n while FHints.Count < 13 do\r\n FHints.Add('');\r\n\r\n FBold.Hint := FHints.Strings[0];\r\n FItalic.Hint := FHints.Strings[1];\r\n FUnderline.Hint := FHints.Strings[2];\r\n FStrikeThrough.Hint := FHints.Strings[3];\r\n FAlignLeft.Hint := FHints.Strings[4];\r\n FAlignCenter.Hint := FHints.Strings[5];\r\n FAlignRight.Hint := FHints.Strings[6];\r\n FUList.Hint := FHints.Strings[7];\r\n FOList.Hint := FHints.Strings[8];\r\n FFgClr.Hint := FHints.Strings[9];\r\n FBkClr.Hint := FHints.Strings[10];\r\nend;\r\n\r\nprocedure TRichEditToolBar.UpdateElement;\r\nbegin\r\n inherited;\r\n\r\n if Assigned(ElementHandle) then\r\n begin\r\n ElementHandle.style.SetProperty('height', '32px');\r\n end;\r\nend;\r\n\r\nprocedure TRichEditToolBar.GetChildren(Proc: TGetChildProc; Root: TComponent);\r\nbegin\r\n // do nothing\r\nend;\r\n\r\nfunction TRichEditToolBar.GetRichEdit: TRichEdit;\r\nbegin\r\n Result := FRichEdit;\r\nend;\r\n\r\nprocedure TRichEditToolBar.FgSelect(Sender: TObject);\r\nbegin\r\n if Assigned(RichEdit) then\r\n RichEdit.SelAttributes.Color := FFgClr.Color;\r\nend;\r\n\r\nprocedure TRichEditToolBar.BkSelect(Sender: TObject);\r\nbegin\r\n if Assigned(RichEdit) then\r\n RichEdit.SelAttributes.BackColor := FBkClr.Color;\r\nend;\r\n\r\nprocedure TRichEditToolBar.FntChange(Sender: TObject);\r\nbegin\r\n if Assigned(RichEdit) then\r\n RichEdit.SelAttributes.Name := FFnt.Items[FFnt.ItemIndex];\r\nend;\r\n\r\nprocedure TRichEditToolBar.FntSizeChange(Sender: TObject);\r\nbegin\r\n if Assigned(RichEdit) then\r\n RichEdit.SelAttributes.Height := FFntSize.ItemIndex + 1;\r\nend;\r\n\r\nprocedure TRichEditToolBar.HandleAttributeChanged(Sender: TObject; Attributes: TSelAttributes);\r\nbegin\r\n FFnt.ItemIndex := FFnt.Items.IndexOf(Attributes.FontName);\r\n FFntSize.ItemIndex := FFntSize.Items.IndexOf(Attributes.FontSize);\r\n FBold.Down := Attributes.isBold;\r\n FItalic.Down := Attributes.isItalic;\r\n FUnderline.Down := Attributes.isUnderline;\r\n FStrikeThrough.Down := Attributes.isStrikeThrough;\r\n\r\n FAlignLeft.Down := Attributes.isLeft;\r\n FAlignRight.Down := Attributes.isRight;\r\n FAlignCenter.Down := Attributes.isCenter;\r\n\r\n if Attributes.FontColor <> '' then\r\n begin\r\n FFgClr.Color := HexToColor(Attributes.FontColor);\r\n end;\r\n\r\n if Attributes.BkColor <> '' then\r\n begin\r\n FBkClr.Color := RgbToColor(Attributes.BkColor);\r\n end;\r\nend;\r\n\r\nprocedure TRichEditToolBar.HandleSpeedButtonClick(Sender: TObject);\r\nvar\r\n BID: string;\r\nbegin\r\n if Assigned(RichEdit) then\r\n begin\r\n BID := TControl(Sender).GetID;\r\n\r\n if BID = FBtnID + '_bold' then\r\n begin\r\n if fsBold in RichEdit.SelAttributes.Style then\r\n RichEdit.SelAttributes.Style := RichEdit.SelAttributes.Style - [fsBold]\r\n else\r\n RichEdit.SelAttributes.Style := RichEdit.SelAttributes.Style + [fsBold];\r\n end\r\n else if BID = FBtnID + '_italic' then\r\n begin\r\n if fsItalic in RichEdit.SelAttributes.Style then\r\n RichEdit.SelAttributes.Style := RichEdit.SelAttributes.Style - [fsItalic]\r\n else\r\n RichEdit.SelAttributes.Style := RichEdit.SelAttributes.Style + [fsItalic];\r\n end\r\n else if BID = FBtnID + '_underline' then\r\n begin\r\n if fsUnderline in RichEdit.SelAttributes.Style then\r\n RichEdit.SelAttributes.Style := RichEdit.SelAttributes.Style - [fsUnderline]\r\n else\r\n RichEdit.SelAttributes.Style := RichEdit.SelAttributes.Style + [fsUnderline];\r\n end\r\n else if BID = FBtnID + '_strikethrough' then\r\n begin\r\n if fsStrikeOut in RichEdit.SelAttributes.Style then\r\n RichEdit.SelAttributes.Style := RichEdit.SelAttributes.Style - [fsStrikeOut]\r\n else\r\n RichEdit.SelAttributes.Style := RichEdit.SelAttributes.Style + [fsStrikeOut];\r\n end\r\n else if BID = FBtnID + '_alignleft' then\r\n RichEdit.SelAttributes.Alignment := taleftJustify\r\n else if BID = FBtnID + '_aligncenter' then\r\n RichEdit.SelAttributes.Alignment := taCenter\r\n else if BID = FBtnID + '_alignright' then\r\n RichEdit.SelAttributes.Alignment := taRightJustify\r\n else if BID = FBtnID + '_olist' then\r\n RichEdit.SelAttributes.OrderedList := not RichEdit.SelAttributes.OrderedList\r\n else if BID = FBtnID + '_ulist' then\r\n RichEdit.SelAttributes.UnOrderedList := not RichEdit.SelAttributes.UnOrderedList;\r\n end;\r\n\r\n if Assigned(OnSpeedButtonClick) then\r\n OnSpeedButtonClick(Self);\r\nend;\r\n\r\n{$HINTS OFF}\r\nfunction TRichEditToolBar.InitButtons(): boolean;\r\n\r\n procedure HandleTimeOut;\r\n var\r\n i: integer;\r\n begin\r\n for i := 0 to ControlCount - 1 do\r\n begin\r\n Controls[i].UpdateElement;\r\n end;\r\n end;\r\n\r\nbegin\r\n Result := true;\r\n if not IsLinked then\r\n Exit;\r\n\r\n if (1 < 0) then\r\n HandleTimeOut;\r\n\r\n asm\r\n setTimeout(function() {HandleTimeOut();}, 10);\r\n end;\r\nend;\r\n{$HINTS ON}\r\n\r\nprocedure TRichEditToolBar.Loaded;\r\nbegin\r\n inherited;\r\n UpdateButtons;\r\n InitButtons;\r\nend;\r\n\r\nprocedure TRichEditToolBar.Notification(AComponent: TComponent;\r\n Operation: TOperation);\r\nbegin\r\n inherited;\r\n if (Operation = opRemove) and (AComponent = FRichEdit) then\r\n begin\r\n FRichEdit := nil;\r\n end;\r\nend;\r\n\r\n{ TToggleButton }\r\n\r\nfunction TToggleButton.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('span');\r\n FLabel := TJSHTMLElement(document.createElement('label'));\r\n FInput := TJSHTMLElement(document.createElement('input'));\r\n FSlider := TJSHTMLElement(document.createElement('span'));\r\n FInput.setAttribute('type','checkbox');\r\n\r\n Result.appendChild(FLabel);\r\n FLabel.appendChild(FInput);\r\n FLabel.appendChild(FSlider);\r\nend;\r\n\r\nprocedure TToggleButton.CreateInitialize;\r\nvar\r\n css: string;\r\nbegin\r\n inherited;\r\n\r\n css := '.switch {'+\r\n 'position: relative;'+\r\n 'display: inline-block;'+\r\n 'width: 44px;'+\r\n 'height: 22px;'+\r\n '}'+\r\n\r\n '.switch input {display:none;}'+\r\n\r\n '.slider {'+\r\n 'position: absolute;'+\r\n 'cursor: pointer;'+\r\n 'top: 0;'+\r\n 'left: 0;'+\r\n 'right: 0;'+\r\n 'bottom: 0;'+\r\n 'background-color: #ccc;'+\r\n '-webkit-transition: .4s;'+\r\n 'transition: .4s;'+\r\n '}'+\r\n\r\n '.slider:before {'+\r\n 'position: absolute;'+\r\n 'content: \"\";'+\r\n 'height: 14px;'+\r\n 'width: 14px;'+\r\n 'left: 4px;'+\r\n 'bottom: 4px;'+\r\n 'background-color: white;'+\r\n '-webkit-transition: .4s;'+\r\n 'transition: .4s;'+\r\n '}'+\r\n\r\n 'input:checked + .slider {'+\r\n 'background-color: #2196F3;'+\r\n '}'+\r\n\r\n 'input:focus + .slider {'+\r\n 'box-shadow: 0 0 1px #2196F3;'+\r\n '}'+\r\n\r\n 'input:checked + .slider:before {'+\r\n '-webkit-transform: translateX(22px);'+\r\n '-ms-transform: translateX(22px);'+\r\n 'transform: translateX(22px);'+\r\n '}'+\r\n\r\n '/* Rounded sliders */'+\r\n '.slider.round {'+\r\n 'border-radius: 22px;'+\r\n '}'+\r\n\r\n '.slider.round:before {'+\r\n 'border-radius: 50%;'+\r\n '}';\r\n\r\n AddControlStyle(css);\r\n\r\n Width := 48;\r\n Height := 24;\r\nend;\r\n\r\nfunction TToggleButton.GetChecked: boolean;\r\nbegin\r\n if Assigned(Container) then\r\n FChecked := TJSHTMLInputElement(FInput).checked;\r\n\r\n Result := FChecked;\r\nend;\r\n\r\nfunction TToggleButton.HandleDoClick(Event: TJSMouseEvent): Boolean;\r\nbegin\r\n ElementEvent := Event;\r\n StopPropagation;\r\n if Event.target = FInput then\r\n Click;\r\n Result := True;\r\n ElementEvent := nil;\r\nend;\r\n\r\nprocedure TToggleButton.Loaded;\r\nbegin\r\n inherited;\r\nend;\r\n\r\nprocedure TToggleButton.SetChecked(const Value: boolean);\r\nbegin\r\n FChecked := Value;\r\n UpdateElement;\r\nend;\r\n\r\nprocedure TToggleButton.SetStyle(const Value: TToggleButtonStyle);\r\nbegin\r\n if (FStyle <> Value) then\r\n begin\r\n FStyle := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TToggleButton.UpdateElement;\r\nbegin\r\n inherited;\r\n if not IsUpdating then\r\n begin\r\n InjectCSS;\r\n\r\n FLabel.setAttribute('class','switch');\r\n\r\n TJSHTMLInputElement(FInput).checked := FChecked;\r\n\r\n if Style = tsRectangular then\r\n FSlider.setAttribute('class','slider')\r\n else\r\n FSlider.setAttribute('class','slider round');\r\n end;\r\nend;\r\n\r\n{ TCustomBitBtn }\r\n\r\nfunction TCustomBitBtn.CreateElement: TJSElement;\r\nbegin\r\n if FFlat then\r\n Result := document.createElement('SPAN')\r\n else\r\n Result := document.createElement('BUTTON');\r\nend;\r\n\r\nprocedure TCustomBitBtn.CreateInitialize;\r\nbegin\r\n inherited;\r\n FColor := clNone;\r\n FIntColor := clNone;\r\n FFlat := false;\r\n Width := 80;\r\n Height := 25;\r\n FAlignment := taCenter;\r\n FGlyph := TURLPicture.Create;\r\n FGlyph.OnChange := GlyphChanged;\r\n FGlyph.OnDataChange := GlyphChanged;\r\n FMaterialGlyphSize := 18;\r\n FMaterialGlyphColor := clNone;\r\nend;\r\n\r\ndestructor TCustomBitBtn.Destroy;\r\nbegin\r\n FGlyph.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TCustomBitBtn.GlyphChanged(Sender: TObject);\r\nbegin\r\n UpdateElement;\r\nend;\r\n\r\n\r\nprocedure TCustomBitBtn.SetCaption(const AValue: string);\r\nbegin\r\n if (Caption <> AValue) then\r\n begin\r\n inherited SetCaption(AValue);\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomBitBtn.SetColorEx(const Value: TColor);\r\nbegin\r\n if (FColor <> Value) then\r\n begin\r\n FColor := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomBitBtn.SetFlat(const Value: boolean);\r\nbegin\r\n if (FFlat <> Value) then\r\n begin\r\n FFlat := Value;\r\n RecreateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomBitBtn.SetGlyph(const Value: TURLPicture);\r\nbegin\r\n FGlyph.Assign(Value);\r\n UpdateElement;\r\nend;\r\n\r\nprocedure TCustomBitBtn.SetGlyphURL(const Value: String);\r\nbegin\r\n if FGlyphURL <> Value then\r\n begin\r\n FGlyphURL := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomBitBtn.SetIntColor(const Value: TColor);\r\nbegin\r\n FIntColor := Value;\r\nend;\r\n\r\nprocedure TCustomBitBtn.SetAlignment(const Value: TAlignment);\r\nbegin\r\n if (FAlignment <> Value) then\r\n begin\r\n FAlignment := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomBitBtn.SetLayout(const Value: TButtonLayout);\r\nbegin\r\n if (FLayout <> Value) then\r\n begin\r\n FLayout := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomBitBtn.SetMaterialGlyph(const Value: TMaterialGlyph);\r\nbegin\r\n if (FMaterialGlyph <> Value) then\r\n begin\r\n FMaterialGlyph := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomBitBtn.SetMaterialGlyphSiz(const Value: integer);\r\nbegin\r\n if (Value > 0) and (Value < 100) then\r\n begin\r\n FMaterialGlyphSize := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomBitBtn.SetMaterialGyphColor(const Value: TColor);\r\nbegin\r\n if (FMaterialGlyphColor <> Value) then\r\n begin\r\n FMaterialGlyphColor := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomBitBtn.UpdateElement;\r\nvar\r\n s,inactive,noptr,matgl,imgsrc,matclr: string;\r\nbegin\r\n inherited;\r\n\r\n if Assigned(ElementHandle) then\r\n begin\r\n if (Color <> clNone) and not Flat then\r\n ElementHandle.style.setProperty('background-color', ColorToHTML(Color))\r\n else\r\n ElementHandle.style.setProperty('background-color', '');\r\n\r\n ElementHandle.style.setProperty('vertical-align','middle');\r\n if Visible then\r\n ElementHandle.style.setProperty('display','table');\r\n ElementHandle.style.setProperty('overflow','hidden');\r\n ElementHandle.style.setProperty('padding','0px');\r\n\r\n case Alignment of\r\n taLeftJustify: ElementHandle.style.setProperty('text-align','left');\r\n taCenter: ElementHandle.style.setProperty('text-align','center');\r\n taRightJustify: ElementHandle.style.setProperty('text-align','right');\r\n end;\r\n\r\n s := '';\r\n inactive := '';\r\n noptr := '';\r\n matgl := '';\r\n\r\n if not Enabled then\r\n inactive := ' md-light md-inactive';\r\n\r\n noptr := 'pointer-events:none';\r\n\r\n if FMaterialGlyph <> '' then\r\n begin\r\n matclr := '';\r\n if FMaterialGlyphColor <> clNone then\r\n matclr := ';color:'+ColorToHTML(FMaterialGlyphColor);\r\n\r\n matgl := '' + FMaterialGlyph + '';\r\n end;\r\n\r\n// if (FMaterialGlyph <> '') and (Caption <> '') then\r\n// s := s + ' ';\r\n\r\n if (Caption <> '') then\r\n s := '' + Caption + '';\r\n\r\n if FGlyph.Data <> '' then\r\n imgsrc := 'data:image/jpeg;base64,' + HexImageDecodeAsBase64(FGlyph.Data)\r\n else\r\n if FGlyph.FileName <> '' then\r\n imgsrc := FGlyph.FileName\r\n else\r\n if FGlyphURL <> '' then\r\n imgsrc := FGlyphURL;\r\n\r\n case Layout of\r\n blGlyphLeft:\r\n begin\r\n if matgl <> '' then\r\n s := matgl + ' ' + s;\r\n\r\n if imgsrc <> '' then\r\n s := ' ' + s;\r\n end;\r\n\r\n blGlyphRight:\r\n begin\r\n if matgl <> '' then\r\n s := s + ' ' + matgl;\r\n\r\n if imgsrc <> '' then\r\n s := s+ ' ';\r\n end;\r\n\r\n blGlyphTop:\r\n begin\r\n if matgl <> '' then\r\n s := matgl + '
' + s;\r\n\r\n if imgsrc <> '' then\r\n s := '
' + s;\r\n end;\r\n\r\n blGlyphBottom:\r\n begin\r\n if matgl <> '' then\r\n s := s+ '
' + matgl;\r\n\r\n if imgsrc <> '' then\r\n s := s + '
';\r\n end;\r\n end;\r\n\r\n ElementHandle.innerHTML := s;\r\n SetHTMLElementFont(TJSHTMLElement(ElementHandle), Font, not ((ElementClassName = '') and (ElementFont = efProperty)) );\r\n end;\r\nend;\r\n\r\nprocedure TCustomBitBtn.UpdateElementVisual;\r\nbegin\r\n inherited;\r\n if Assigned(ElementHandle) then\r\n begin\r\n ElementHandle.style.removeProperty('outline');\r\n ElementHandle.style.removeProperty('user-select');\r\n end;\r\n\r\nend;\r\n\r\nend.\r\n","{\r\n This file is part of the Free Pascal run time library.\r\n Copyright (c) 1999-2000 by Michael Van Canneyt, member of the\r\n Free Pascal development team\r\n\r\n Constants used for displaying messages in DB units\r\n\r\n See the file COPYING.FPC, included in this distribution,\r\n for details about the copyright.\r\n\r\n This program is distributed in the hope that it will be useful,\r\n but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r\n\r\n **********************************************************************}\r\n\r\nunit DBConst;\r\n\r\nInterface\r\n\r\nResourcestring\r\n SActiveDataset = 'Operation cannot be performed on an active dataset';\r\n SBadParamFieldType = 'Bad fieldtype for parameter \"%s\".';\r\n SCantSetAutoIncFields = 'AutoInc Fields are read-only';\r\n SConnected = 'Operation cannot be performed on a connected database';\r\n SDatasetReadOnly = 'Dataset is read-only.';\r\n SDatasetRegistered = 'Dataset already registered : \"%s\"';\r\n SDuplicateFieldName = 'Duplicate fieldname : \"%s\"';\r\n SErrAssTransaction = 'Cannot assign transaction while old transaction active!';\r\n SErrColumnNotFound = 'Column \"%s\" not found.';\r\n SErrDatabasenAssigned = 'Database not assigned!';\r\n SErrNoDatabaseAvailable = 'Invalid operation: Not attached to database';\r\n SErrNoDatabaseName = 'Database connect string (DatabaseName) not filled in!';\r\n SErrNoSelectStatement = 'Cannot open a non-select statement';\r\n SErrNoStatement = 'SQL statement not set';\r\n SErrTransAlreadyActive = 'Transaction already active';\r\n SErrTransactionnSet = 'Transaction not set';\r\n SErrIndexResultTooLong = 'Index result for \"%s\" too long, >100 characters (%d).';\r\n SErrIndexBasedOnInvField = 'Field \"%s\" has an invalid field type (%s) to base index on.';\r\n SErrIndexBasedOnUnkField = 'Index based on unknown field \"%s\".';\r\n SErrConnTransactionnSet = 'Transaction of connection not set';\r\n SErrNotASQLConnection = '\"%s\" is not a TSQLConnection';\r\n SErrNotASQLQuery = '\"%s\" is not a TCustomSQLQuery';\r\n STransNotActive = 'Operation cannot be performed on an inactive transaction';\r\n STransActive = 'Operation cannot be performed on an active transaction';\r\n SFieldNotFound = 'Field not found : \"%s\"';\r\n SInactiveDataset = 'Operation cannot be performed on an inactive dataset';\r\n SInvalidDisplayValues = '\"%s\" are not valid boolean displayvalues';\r\n SInvalidFieldKind = '%s : invalid field kind : ';\r\n SInvalidBookmark = 'Invalid bookmark';\r\n SInvalidFieldSize = 'Invalid field size : %d';\r\n SInvalidTypeConversion = 'Invalid type conversion to %s in field %s';\r\n SNeedField = 'Field %s is required, but not supplied.';\r\n SNeedFieldName = 'Field needs a name';\r\n SNoDataset = 'No dataset asssigned for field : \"%s\"';\r\n SNoDatasetRegistered = 'No such dataset registered : \"%s\"';\r\n SNoDatasets = 'No datasets are attached to the database';\r\n SNoSuchRecord = 'Could not find the requested record.';\r\n SNoTransactionRegistered = 'No such transaction registered : \"%s\"';\r\n SNoTransactions = 'No transactions are attached to the database';\r\n SNotABoolean = '\"%s\" is not a valid boolean';\r\n SNotAFloat = '\"%s\" is not a valid float';\r\n SNotAninteger = '\"%s\" is not a valid integer';\r\n SNotConnected = 'Operation cannot be performed on an disconnected database';\r\n SNotEditing = 'Operation not allowed, dataset \"%s\" is not in an edit or insert state.';\r\n SParameterNotFound = 'Parameter \"%s\" not found';\r\n SRangeError = '%f is not between %f and %f for %s';\r\n SReadOnlyField = 'Field %s cannot be modified, it is read-only.';\r\n STransactionRegistered = 'Transaction already registered : \"%s\"';\r\n SUniDirectional = 'Operation cannot be performed on an unidirectional dataset';\r\n SUnknownField = 'No field named \"%s\" was found in dataset \"%s\"';\r\n SUnknownFieldType = 'Unknown field type : %s';\r\n SUnknownParamFieldType = 'Unknown fieldtype for parameter \"%s\".';\r\n SMetadataUnavailable = 'The metadata is not available for this type of database.';\r\n SDeletedRecord = 'The record is deleted.';\r\n SIndexNotFound = 'Index ''%s'' not found';\r\n SParameterCountIncorrect = 'The number of parameters is incorrect.';\r\n SUnsupportedParameter = 'Parameters of the type ''%s'' are not (yet) supported.';\r\n SFieldValueError = 'Invalid value for field ''%s''';\r\n SInvalidCalcType = 'Field ''%s'' cannot be a calculated or lookup field';\r\n SDuplicateName = 'Duplicate name ''%s'' in %s';\r\n SNoParseSQL = '%s is only possible if ParseSQL is True';\r\n SLookupInfoError = 'Lookup information for field ''%s'' is incomplete';\r\n SUnsupportedFieldType = 'Fieldtype %s is not supported';\r\n SInvPacketRecordsValue = 'PacketRecords has to be larger then 0';\r\n SInvPacketRecordsValueFieldNames = 'PacketRecords must be -1 if IndexFieldNames is set';\r\n SInvalidSearchFieldType = 'Searching in fields of type %s is not supported';\r\n SDatasetEmpty = 'The dataset is empty';\r\n SFieldIsNull = 'The field is null';\r\n SOnUpdateError = 'An error occurred while applying the updates in a record: %s';\r\n SApplyRecNotSupported = 'Applying updates is not supported by this TDataset descendent';\r\n SNoWhereFields = 'No %s query specified and failed to generate one. (No fields for inclusion in where statement found)';\r\n SNoUpdateFields = 'No %s query specified and failed to generate one. (No fields found for insert- or update-statement found)';\r\n SNotSupported = 'Operation is not supported by this type of database';\r\n SDBCreateDropFailed = 'Creation or dropping of database failed';\r\n SMaxIndexes = 'The maximum amount of indexes is reached';\r\n SMinIndexes = 'The minimum amount of indexes is 1';\r\n STooManyFields = 'More fields specified then really exist';\r\n// These are added for Delphi-compatilility, but not used by the fcl:\r\n SFieldIndexError = 'Field index out of range';\r\n SIndexFieldMissing = 'Cannot access index field ''%s''';\r\n SNoFieldIndexes = 'No index currently active';\r\n SNotIndexField = 'Field ''%s'' is not indexed and cannot be modified';\r\n SErrUnknownConnectorType = 'Unknown connector type: \"%s\"';\r\n SNoIndexFieldNameGiven = 'There are no fields selected to base the index on';\r\n SStreamNotRecognised = 'The data-stream format is not recognized';\r\n SNoReaderClassRegistered = 'There is no TDatapacketReaderClass registered for this kind of data-stream';\r\n SErrCircularDataSourceReferenceNotAllowed = 'Circular datasource references are not allowed.';\r\n SCommitting = 'Committing transaction';\r\n SRollingBack = 'Rolling back transaction';\r\n SCommitRetaining = 'Commit and retaining transaction';\r\n SRollBackRetaining = 'Rollback and retaining transaction';\r\n SErrNoFieldsDefined = 'Can not create a dataset when there are no fielddefinitions or fields defined';\r\n SErrApplyUpdBeforeRefresh = 'Must apply updates before refreshing data';\r\n SErrNoDataset = 'Missing (compatible) underlying dataset, can not open';\r\n SErrDisconnectedPacketRecords = 'For disconnected TSQLQuery instances, packetrecords must be -1';\r\n SErrImplicitNoRollBack = 'Implicit use of transactions does not allow rollback.';\r\n SErrNoImplicitTransaction = 'Connection %s does not allow implicit transactions.';\r\n SErrImplictTransactionStart = 'Error: attempt to implicitly start a transaction on Connection \"%s\", transaction \"%s\".';\r\n SErrImplicitConnect = 'Error: attempt to implicitly activate connection \"%s\".';\r\n SErrFailedToUpdateRecord = 'Failed to apply record updates: %d rows updated.';\r\n SErrRefreshNotSingleton = 'Refresh SQL resulted in multiple records: %d.';\r\n SErrRefreshEmptyResult = 'Refresh SQL resulted in empty result set.';\r\n SErrNoKeyFieldForRefreshClause = 'No key field found to construct refresh SQL WHERE clause';\r\n SErrFailedToFetchReturningResult = 'Failed to fetch returning result';\r\n SLogParamValue = 'Parameter \"%s\" value : \"%s\"';\r\n SErrInvalidDateTime = 'Invalid date/time value : \"%s\"';\r\n SatEOFInternalOnly = 'loAtEOF is for internal use only.';\r\n SErrInsertingSameRecordtwice = 'Attempt to insert the same record twice.';\r\n SErrDoApplyUpdatesNeedsProxy = 'Cannot apply updates without Data proxy';\r\n\r\nImplementation\r\n\r\nend.\r\n","{\r\n This file is part of the Free Pascal run time library.\r\n Copyright (c) 1999-2017 by Michael Van Canneyt, member of the\r\n Free Pascal development team\r\n\r\n DB database unit\r\n\r\n See the file COPYING.FPC, included in this distribution,\r\n for details about the copyright.\r\n\r\n This program is distributed in the hope that it will be useful,\r\n but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r\n\r\n **********************************************************************}\r\nunit DB;\r\n\r\n{$mode objfpc}\r\n\r\n{ $define dsdebug}\r\ninterface\r\n\r\nuses Classes, SysUtils, JS, Types, DateUtils;\r\n\r\nconst\r\n\r\n dsMaxBufferCount = MAXINT div 8;\r\n dsMaxStringSize = 8192;\r\n\r\n // Used in AsBoolean for string fields to determine\r\n // whether it's true or false.\r\n YesNoChars : Array[Boolean] of char = ('N', 'Y');\r\n\r\n SQLDelimiterCharacters = [';',',',' ','(',')',#13,#10,#9];\r\n\r\ntype\r\n\r\n{ Misc Dataset types }\r\n\r\n TDataSetState = (dsInactive, dsBrowse, dsEdit, dsInsert, dsSetKey,\r\n dsCalcFields, dsFilter, dsNewValue, dsOldValue, dsCurValue, dsBlockRead,\r\n dsInternalCalc, dsOpening, dsRefreshFields);\r\n\r\n TDataEvent = (deFieldChange, deRecordChange, deDataSetChange,\r\n deDataSetScroll, deLayoutChange, deUpdateRecord, deUpdateState,\r\n deCheckBrowseMode, dePropertyChange, deFieldListChange, deFocusControl,\r\n deParentScroll,deConnectChange,deReconcileError,deDisabledStateChange);\r\n\r\n TUpdateStatus = (usModified, usInserted, usDeleted);\r\n TUpdateStatusSet = Set of TUpdateStatus;\r\n\r\n TResolveStatus = (rsUnresolved, rsResolving, rsResolved, rsResolveFailed);\r\n TResolveStatusSet = Set of TResolveStatus;\r\n\r\n TUpdateMode = (upWhereAll, upWhereChanged, upWhereKeyOnly);\r\n TResolverResponse = (rrSkip, rrAbort, rrMerge, rrApply, rrIgnore);\r\n\r\n TProviderFlag = (pfInUpdate, pfInWhere, pfInKey, pfHidden, pfRefreshOnInsert,pfRefreshOnUpdate);\r\n TProviderFlags = set of TProviderFlag;\r\n\r\n{ Forward declarations }\r\n\r\n TFieldDef = class;\r\n TFieldDefs = class;\r\n TField = class;\r\n TFields = Class;\r\n TDataSet = class;\r\n TDataSource = Class;\r\n TDataLink = Class;\r\n TDataProxy = Class;\r\n TDataRequest = class;\r\n TRecordUpdateDescriptor = class;\r\n TRecordUpdateDescriptorList = class;\r\n TRecordUpdateBatch = class;\r\n\r\n{ Exception classes }\r\n\r\n EDatabaseError = class(Exception);\r\n\r\n EUpdateError = class(EDatabaseError)\r\n private\r\n FContext : String;\r\n FErrorCode : integer;\r\n FOriginalException : Exception;\r\n FPreviousError : Integer;\r\n public\r\n constructor Create(NativeError, Context : String;\r\n ErrCode, PrevError : integer; E: Exception); reintroduce;\r\n Destructor Destroy; override;\r\n property Context : String read FContext;\r\n property ErrorCode : integer read FErrorcode;\r\n property OriginalException : Exception read FOriginalException;\r\n property PreviousError : Integer read FPreviousError;\r\n end;\r\n \r\n\r\n{ TFieldDef }\r\n\r\n TFieldClass = class of TField;\r\n\r\n // Data type for field.\r\n TFieldType = (\r\n ftUnknown, ftString, ftInteger, ftLargeInt, ftBoolean, ftFloat, ftDate,\r\n ftTime, ftDateTime, ftAutoInc, ftBlob, ftMemo, ftFixedChar,\r\n ftVariant, ftDataset, ftWideString\r\n );\r\n\r\n{ TDateTimeRec }\r\n\r\n TFieldAttribute = (faHiddenCol, faReadonly, faRequired, faLink, faUnNamed, faFixed);\r\n TFieldAttributes = set of TFieldAttribute;\r\n\r\n{ TNamedItem }\r\n\r\n TNamedItem = class(TCollectionItem)\r\n private\r\n FName: string;\r\n protected\r\n function GetDisplayName: string; override;\r\n procedure SetDisplayName(const Value: string); override;\r\n Public \r\n property DisplayName : string read GetDisplayName write SetDisplayName;\r\n published\r\n property Name : string read FName write SetDisplayName;\r\n end;\r\n\r\n{ TDefCollection }\r\n\r\n TDefCollection = class(TOwnedCollection)\r\n private\r\n FDataset: TDataset;\r\n FUpdated: boolean;\r\n protected\r\n procedure SetItemName(Item: TCollectionItem); override;\r\n public\r\n constructor create(ADataset: TDataset; AOwner: TPersistent; AClass: TCollectionItemClass); reintroduce;\r\n function Find(const AName: string): TNamedItem;\r\n procedure GetItemNames(List: TStrings);\r\n function IndexOf(const AName: string): Longint;\r\n property Dataset: TDataset read FDataset;\r\n property Updated: boolean read FUpdated write FUpdated;\r\n end;\r\n\r\n{ TFieldDef }\r\n\r\n TFieldDef = class(TNamedItem)\r\n Private\r\n FAttributes : TFieldAttributes;\r\n FDataType : TFieldType;\r\n FFieldNo : Longint;\r\n FInternalCalcField : Boolean;\r\n FPrecision : Longint;\r\n FRequired : Boolean;\r\n FSize : Integer;\r\n Function GetFieldClass : TFieldClass;\r\n procedure SetAttributes(AValue: TFieldAttributes);\r\n procedure SetDataType(AValue: TFieldType);\r\n procedure SetPrecision(const AValue: Longint);\r\n procedure SetSize(const AValue: Integer);\r\n procedure SetRequired(const AValue: Boolean);\r\n public\r\n constructor Create(ACollection : TCollection); override;\r\n constructor Create(AOwner: TFieldDefs; const AName: string; ADataType: TFieldType; ASize: Integer; ARequired: Boolean; AFieldNo: Longint); overload;\r\n destructor Destroy; override;\r\n procedure Assign(Source: TPersistent); override;\r\n function CreateField(AOwner: TComponent): TField;\r\n property FieldClass: TFieldClass read GetFieldClass;\r\n property FieldNo: Longint read FFieldNo;\r\n property InternalCalcField: Boolean read FInternalCalcField write FInternalCalcField;\r\n property Required: Boolean read FRequired write SetRequired;\r\n Published\r\n property Attributes: TFieldAttributes read FAttributes write SetAttributes default [];\r\n property DataType: TFieldType read FDataType write SetDataType;\r\n property Precision: Longint read FPrecision write SetPrecision default 0;\r\n property Size: Integer read FSize write SetSize default 0;\r\n end;\r\n TFieldDefClass = Class of TFieldDef;\r\n\r\n{ TFieldDefs }\r\n\r\n TFieldDefs = class(TDefCollection)\r\n private\r\n FHiddenFields : Boolean;\r\n function GetItem(Index: Longint): TFieldDef; reintroduce;\r\n procedure SetItem(Index: Longint; const AValue: TFieldDef); reintroduce;\r\n Protected\r\n Class Function FieldDefClass : TFieldDefClass; virtual;\r\n public\r\n constructor Create(ADataSet: TDataSet); reintroduce;\r\n// destructor Destroy; override;\r\n Function Add(const AName: string; ADataType: TFieldType; ASize, APrecision{%H-}: Integer; ARequired, AReadOnly: Boolean; AFieldNo : Integer) : TFieldDef; overload;\r\n Function Add(const AName: string; ADataType: TFieldType; ASize: Word; ARequired: Boolean; AFieldNo : Integer) : TFieldDef; overload;\r\n procedure Add(const AName: string; ADataType: TFieldType; ASize: Word; ARequired: Boolean); overload;\r\n procedure Add(const AName: string; ADataType: TFieldType; ASize: Word); overload;\r\n procedure Add(const AName: string; ADataType: TFieldType); overload;\r\n function Add: TFieldDef; overload; reintroduce;\r\n Function AddFieldDef : TFieldDef;\r\n procedure Assign(FieldDefs: TFieldDefs); overload;\r\n function Find(const AName: string): TFieldDef; reintroduce;\r\n// procedure Clear;\r\n// procedure Delete(Index: Longint);\r\n procedure Update; overload;\r\n Function MakeNameUnique(const AName : String) : string; virtual;\r\n Property HiddenFields : Boolean Read FHiddenFields Write FHiddenFields;\r\n property Items[Index: Longint]: TFieldDef read GetItem write SetItem; default;\r\n end;\r\n TFieldDefsClass = Class of TFieldDefs;\r\n\r\n{ TField }\r\n\r\n TFieldKind = (fkData, fkCalculated, fkLookup, fkInternalCalc);\r\n TFieldKinds = Set of TFieldKind;\r\n\r\n TFieldNotifyEvent = procedure(Sender: TField) of object;\r\n TFieldGetTextEvent = procedure(Sender: TField; var aText: string;\r\n DisplayText: Boolean) of object;\r\n TFieldSetTextEvent = procedure(Sender: TField; const aText: string) of object;\r\n TFieldChars = Array of Char;\r\n\r\n{ TLookupList }\r\n\r\n TLookupList = class(TObject)\r\n private\r\n FList: TFPList;\r\n public\r\n constructor Create; reintroduce;\r\n destructor Destroy; override;\r\n procedure Add(const AKey, AValue: JSValue);\r\n procedure Clear;\r\n function FirstKeyByValue(const AValue: JSValue): JSValue;\r\n function ValueOfKey(const AKey: JSValue): JSValue;\r\n procedure ValuesToStrings(AStrings: TStrings);\r\n end;\r\n\r\n{ TField }\r\n\r\n TField = class(TComponent)\r\n private\r\n FAlignment : TAlignment;\r\n FAttributeSet : String;\r\n FCalculated : Boolean;\r\n FConstraintErrorMessage : String;\r\n FCustomConstraint : String;\r\n FDataSet : TDataSet;\r\n// FDataSize : Word;\r\n FDataType : TFieldType;\r\n FDefaultExpression : String;\r\n FDisplayLabel : String;\r\n FDisplayWidth : Longint;\r\n// FEditMask: TEditMask;\r\n FFieldDef: TFieldDef;\r\n FFieldKind : TFieldKind;\r\n FFieldName : String;\r\n FFieldNo : Longint;\r\n FFields : TFields;\r\n FHasConstraints : Boolean;\r\n FImportedConstraint : String;\r\n FIsIndexField : Boolean;\r\n FKeyFields : String;\r\n FLookupCache : Boolean;\r\n FLookupDataSet : TDataSet;\r\n FLookupKeyfields : String;\r\n FLookupresultField : String;\r\n FLookupList: TLookupList;\r\n FOnChange : TFieldNotifyEvent;\r\n FOnGetText: TFieldGetTextEvent;\r\n FOnSetText: TFieldSetTextEvent;\r\n FOnValidate: TFieldNotifyEvent;\r\n FOrigin : String;\r\n FReadOnly : Boolean;\r\n FRequired : Boolean;\r\n FSize : integer;\r\n FValidChars : TFieldChars;\r\n FValueBuffer : JSValue;\r\n FValidating : Boolean;\r\n FVisible : Boolean;\r\n FProviderFlags : TProviderFlags;\r\n function GetIndex : longint;\r\n function GetLookup: Boolean;\r\n procedure SetAlignment(const AValue: TAlignMent);\r\n procedure SetIndex(const AValue: Longint);\r\n function GetDisplayText: String;\r\n function GetEditText: String;\r\n procedure SetEditText(const AValue: string);\r\n procedure SetDisplayLabel(const AValue: string);\r\n procedure SetDisplayWidth(const AValue: Longint);\r\n function GetDisplayWidth: integer;\r\n procedure SetLookup(const AValue: Boolean);\r\n procedure SetReadOnly(const AValue: Boolean);\r\n procedure SetVisible(const AValue: Boolean);\r\n function IsDisplayLabelStored : Boolean;\r\n function IsDisplayWidthStored: Boolean;\r\n function GetLookupList: TLookupList;\r\n procedure CalcLookupValue;\r\n protected\r\n Procedure RaiseAccessError(const TypeName: string);\r\n function AccessError(const TypeName: string): EDatabaseError;\r\n procedure CheckInactive;\r\n class procedure CheckTypeSize(AValue: Longint); virtual;\r\n procedure Change; virtual;\r\n procedure Bind(Binding: Boolean); virtual;\r\n procedure DataChanged;\r\n function GetAsBoolean: Boolean; virtual;\r\n function GetAsBytes: TBytes; virtual;\r\n function GetAsLargeInt: NativeInt; virtual;\r\n function GetAsDateTime: TDateTime; virtual;\r\n function GetAsFloat: Double; virtual;\r\n function GetAsLongint: Longint; virtual;\r\n function GetAsInteger: Longint; virtual;\r\n function GetAsJSValue: JSValue; virtual;\r\n function GetOldValue: JSValue; virtual;\r\n function GetAsString: string; virtual;\r\n function GetCanModify: Boolean; virtual;\r\n function GetClassDesc: String; virtual;\r\n function GetDataSize: Integer; virtual;\r\n function GetDefaultWidth: Longint; virtual;\r\n function GetDisplayName : String;\r\n function GetCurValue: JSValue; virtual;\r\n function GetNewValue: JSValue; virtual;\r\n function GetIsNull: Boolean; virtual;\r\n procedure GetText(var AText: string; ADisplayText{%H-}: Boolean); virtual;\r\n procedure Notification(AComponent: TComponent; Operation: TOperation); override;\r\n procedure PropertyChanged(LayoutAffected: Boolean);\r\n procedure SetAsBoolean(AValue{%H-}: Boolean); virtual;\r\n procedure SetAsDateTime(AValue{%H-}: TDateTime); virtual;\r\n procedure SetAsFloat(AValue{%H-}: Double); virtual;\r\n procedure SetAsLongint(AValue: Longint); virtual;\r\n procedure SetAsInteger(AValue{%H-}: Longint); virtual;\r\n procedure SetAsLargeInt(AValue{%H-}: NativeInt); virtual;\r\n procedure SetAsJSValue(const AValue: JSValue); virtual;\r\n procedure SetAsString(const AValue{%H-}: string); virtual;\r\n procedure SetDataset(AValue : TDataset); virtual;\r\n procedure SetDataType(AValue: TFieldType);\r\n procedure SetNewValue(const AValue: JSValue);\r\n procedure SetSize(AValue: Integer); virtual;\r\n procedure SetText(const AValue: string); virtual;\r\n procedure SetVarValue(const AValue{%H-}: JSValue); virtual;\r\n procedure SetAsBytes(const AValue{%H-}: TBytes); virtual;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n destructor Destroy; override;\r\n function GetParentComponent: TComponent; override;\r\n procedure SetParentComponent(Value: TComponent); override;\r\n function HasParent: Boolean; override;\r\n procedure Assign(Source: TPersistent); override;\r\n procedure AssignValue(const AValue: JSValue);\r\n procedure Clear; virtual;\r\n procedure FocusControl;\r\n function GetData : JSValue;\r\n class function IsBlob: Boolean; virtual;\r\n function IsValidChar(InputChar: Char): Boolean; virtual;\r\n procedure RefreshLookupList;\r\n procedure SetData(Buffer: JSValue); overload;\r\n procedure SetFieldType(AValue{%H-}: TFieldType); virtual;\r\n procedure Validate(Buffer: Pointer);\r\n property AsBytes: TBytes read GetAsBytes write SetAsBytes;\r\n property AsBoolean: Boolean read GetAsBoolean write SetAsBoolean;\r\n property AsDateTime: TDateTime read GetAsDateTime write SetAsDateTime;\r\n property AsFloat: Double read GetAsFloat write SetAsFloat;\r\n property AsLongint: Longint read GetAsLongint write SetAsLongint;\r\n property AsLargeInt: NativeInt read GetAsLargeInt write SetAsLargeInt;\r\n property AsInteger: Longint read GetAsInteger write SetAsInteger;\r\n property AsString: string read GetAsString write SetAsString;\r\n property AsJSValue: JSValue read GetAsJSValue write SetAsJSValue;\r\n property AttributeSet: string read FAttributeSet write FAttributeSet;\r\n property Calculated: Boolean read FCalculated write FCalculated;\r\n property CanModify: Boolean read GetCanModify;\r\n property CurValue: JSValue read GetCurValue;\r\n property DataSet: TDataSet read FDataSet write SetDataSet;\r\n property DataSize: Integer read GetDataSize;\r\n property DataType: TFieldType read FDataType;\r\n property DisplayName: String Read GetDisplayName;\r\n property DisplayText: String read GetDisplayText;\r\n property FieldNo: Longint read FFieldNo;\r\n property IsIndexField: Boolean read FIsIndexField;\r\n property IsNull: Boolean read GetIsNull;\r\n property Lookup: Boolean read GetLookup write SetLookup; deprecated;\r\n property NewValue: JSValue read GetNewValue write SetNewValue;\r\n property Size: Integer read FSize write SetSize;\r\n property Text: string read GetEditText write SetEditText;\r\n property ValidChars : TFieldChars read FValidChars write FValidChars;\r\n property Value: JSValue read GetAsJSValue write SetAsJSValue;\r\n property OldValue: JSValue read GetOldValue;\r\n property LookupList: TLookupList read GetLookupList;\r\n Property FieldDef : TFieldDef Read FFieldDef;\r\n published\r\n property Alignment : TAlignment read FAlignment write SetAlignment default taLeftJustify;\r\n property CustomConstraint: string read FCustomConstraint write FCustomConstraint;\r\n property ConstraintErrorMessage: string read FConstraintErrorMessage write FConstraintErrorMessage;\r\n property DefaultExpression: string read FDefaultExpression write FDefaultExpression;\r\n property DisplayLabel : string read GetDisplayName write SetDisplayLabel stored IsDisplayLabelStored;\r\n property DisplayWidth: Longint read GetDisplayWidth write SetDisplayWidth stored IsDisplayWidthStored;\r\n property FieldKind: TFieldKind read FFieldKind write FFieldKind;\r\n property FieldName: string read FFieldName write FFieldName;\r\n property HasConstraints: Boolean read FHasConstraints;\r\n property Index: Longint read GetIndex write SetIndex;\r\n property ImportedConstraint: string read FImportedConstraint write FImportedConstraint;\r\n property KeyFields: string read FKeyFields write FKeyFields;\r\n property LookupCache: Boolean read FLookupCache write FLookupCache;\r\n property LookupDataSet: TDataSet read FLookupDataSet write FLookupDataSet;\r\n property LookupKeyFields: string read FLookupKeyFields write FLookupKeyFields;\r\n property LookupResultField: string read FLookupResultField write FLookupResultField;\r\n property Origin: string read FOrigin write FOrigin;\r\n property ProviderFlags : TProviderFlags read FProviderFlags write FProviderFlags;\r\n property ReadOnly: Boolean read FReadOnly write SetReadOnly;\r\n property Required: Boolean read FRequired write FRequired;\r\n property Visible: Boolean read FVisible write SetVisible default True;\r\n property OnChange: TFieldNotifyEvent read FOnChange write FOnChange;\r\n property OnGetText: TFieldGetTextEvent read FOnGetText write FOnGetText;\r\n property OnSetText: TFieldSetTextEvent read FOnSetText write FOnSetText;\r\n property OnValidate: TFieldNotifyEvent read FOnValidate write FOnValidate;\r\n end;\r\n\r\n{ TStringField }\r\n\r\n TStringField = class(TField)\r\n private\r\n FFixedChar : boolean;\r\n FTransliterate : Boolean;\r\n protected\r\n class procedure CheckTypeSize(AValue: Longint); override;\r\n function GetAsBoolean: Boolean; override;\r\n function GetAsDateTime: TDateTime; override;\r\n function GetAsFloat: Double; override;\r\n function GetAsInteger: Longint; override;\r\n function GetAsLargeInt: NativeInt; override;\r\n function GetAsString: String; override;\r\n function GetAsJSValue: JSValue; override;\r\n function GetDefaultWidth: Longint; override;\r\n procedure GetText(var AText: string; ADisplayText{%H-}: Boolean); override;\r\n procedure SetAsBoolean(AValue: Boolean); override;\r\n procedure SetAsDateTime(AValue: TDateTime); override;\r\n procedure SetAsFloat(AValue: Double); override;\r\n procedure SetAsInteger(AValue: Longint); override;\r\n procedure SetAsLargeInt(AValue: NativeInt); override;\r\n procedure SetAsString(const AValue: String); override;\r\n procedure SetVarValue(const AValue: JSValue); override;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n procedure SetFieldType(AValue: TFieldType); override;\r\n property FixedChar : Boolean read FFixedChar write FFixedChar;\r\n property Transliterate: Boolean read FTransliterate write FTransliterate;\r\n property Value: String read GetAsString write SetAsString;\r\n published\r\n property Size default 20;\r\n end;\r\n\r\n\r\n{ TNumericField }\r\n\r\n TNumericField = class(TField)\r\n Private\r\n FDisplayFormat : String;\r\n FEditFormat : String;\r\n protected\r\n class procedure CheckTypeSize(AValue: Longint); override;\r\n procedure RangeError(AValue, Min, Max: Double);\r\n procedure SetDisplayFormat(const AValue: string);\r\n procedure SetEditFormat(const AValue: string);\r\n function GetAsBoolean: Boolean; override;\r\n Procedure SetAsBoolean(AValue: Boolean); override;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n published\r\n property Alignment default taRightJustify;\r\n property DisplayFormat: string read FDisplayFormat write SetDisplayFormat;\r\n property EditFormat: string read FEditFormat write SetEditFormat;\r\n end;\r\n\r\n{ TLongintField }\r\n\r\n TIntegerField = class(TNumericField)\r\n private\r\n FMinValue,\r\n FMaxValue,\r\n FMinRange,\r\n FMaxRange : Longint;\r\n Procedure SetMinValue (AValue : longint);\r\n Procedure SetMaxValue (AValue : longint);\r\n protected\r\n function GetAsFloat: Double; override;\r\n function GetAsInteger: Longint; override;\r\n function GetAsString: string; override;\r\n function GetAsJSValue: JSValue; override;\r\n procedure GetText(var AText: string; ADisplayText: Boolean); override;\r\n function GetValue(var AValue: Longint): Boolean;\r\n procedure SetAsFloat(AValue: Double); override;\r\n procedure SetAsInteger(AValue: Longint); override;\r\n procedure SetAsString(const AValue: string); override;\r\n procedure SetVarValue(const AValue: JSValue); override;\r\n function GetAsLargeInt: NativeInt; override;\r\n procedure SetAsLargeInt(AValue: NativeInt); override;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n Function CheckRange(AValue : Longint) : Boolean;\r\n property Value: Longint read GetAsInteger write SetAsInteger;\r\n published\r\n property MaxValue: Longint read FMaxValue write SetMaxValue default 0;\r\n property MinValue: Longint read FMinValue write SetMinValue default 0;\r\n end;\r\n\r\n{ TLargeintField }\r\n\r\n TLargeintField = class(TNumericField)\r\n private\r\n FMinValue,\r\n FMaxValue,\r\n FMinRange,\r\n FMaxRange : NativeInt;\r\n Procedure SetMinValue (AValue : NativeInt);\r\n Procedure SetMaxValue (AValue : NativeInt);\r\n protected\r\n function GetAsFloat: Double; override;\r\n function GetAsInteger: Longint; override;\r\n function GetAsLargeInt: NativeInt; override;\r\n function GetAsString: string; override;\r\n function GetAsJSValue: JSValue; override;\r\n procedure GetText(var AText: string; ADisplayText: Boolean); override;\r\n function GetValue(var AValue: NativeInt): Boolean;\r\n procedure SetAsFloat(AValue: Double); override;\r\n procedure SetAsInteger(AValue: Longint); override;\r\n procedure SetAsLargeInt(AValue: NativeInt); override;\r\n procedure SetAsString(const AValue: string); override;\r\n procedure SetVarValue(const AValue: JSValue); override;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n Function CheckRange(AValue : NativeInt) : Boolean;\r\n property Value: NativeInt read GetAsLargeInt write SetAsLargeInt;\r\n published\r\n property MaxValue: NativeInt read FMaxValue write SetMaxValue default 0;\r\n property MinValue: NativeInt read FMinValue write SetMinValue default 0;\r\n end;\r\n\r\n{ TAutoIncField }\r\n\r\n TAutoIncField = class(TIntegerField)\r\n Protected\r\n procedure SetAsInteger(AValue: Longint); override;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n end;\r\n\r\n{ TFloatField }\r\n\r\n TFloatField = class(TNumericField)\r\n private\r\n FCurrency: Boolean;\r\n FMaxValue : Double;\r\n FMinValue : Double;\r\n FPrecision : Longint;\r\n procedure SetCurrency(const AValue: Boolean);\r\n procedure SetPrecision(const AValue: Longint);\r\n protected\r\n function GetAsFloat: Double; override;\r\n function GetAsLargeInt: NativeInt; override;\r\n function GetAsInteger: Longint; override;\r\n function GetAsJSValue: JSValue; override;\r\n function GetAsString: string; override;\r\n procedure GetText(var AText: string; ADisplayText: Boolean); override;\r\n procedure SetAsFloat(AValue: Double); override;\r\n procedure SetAsLargeInt(AValue: NativeInt); override;\r\n procedure SetAsInteger(AValue: Longint); override;\r\n procedure SetAsString(const AValue: string); override;\r\n procedure SetVarValue(const AValue: JSValue); override;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n Function CheckRange(AValue : Double) : Boolean;\r\n property Value: Double read GetAsFloat write SetAsFloat;\r\n\r\n published\r\n property Currency: Boolean read FCurrency write SetCurrency default False;\r\n property MaxValue: Double read FMaxValue write FMaxValue;\r\n property MinValue: Double read FMinValue write FMinValue;\r\n property Precision: Longint read FPrecision write SetPrecision default 15; // min 2 instellen, delphi compat\r\n end;\r\n\r\n\r\n{ TBooleanField }\r\n\r\n TBooleanField = class(TField)\r\n private\r\n FDisplayValues : String;\r\n // First byte indicates uppercase or not.\r\n FDisplays : Array[Boolean,Boolean] of string;\r\n Procedure SetDisplayValues(const AValue : String);\r\n protected\r\n function GetAsBoolean: Boolean; override;\r\n function GetAsString: string; override;\r\n function GetAsJSValue: JSValue; override;\r\n function GetAsInteger: Longint; override;\r\n function GetDefaultWidth: Longint; override;\r\n procedure SetAsBoolean(AValue: Boolean); override;\r\n procedure SetAsString(const AValue: string); override;\r\n procedure SetAsInteger(AValue: Longint); override;\r\n procedure SetVarValue(const AValue: JSValue); override;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n property Value: Boolean read GetAsBoolean write SetAsBoolean;\r\n published\r\n property DisplayValues: string read FDisplayValues write SetDisplayValues;\r\n end;\r\n\r\n{ TDateTimeField }\r\n\r\n TDateTimeField = class(TField)\r\n private\r\n FDisplayFormat : String;\r\n procedure SetDisplayFormat(const AValue: string);\r\n protected\r\n Function ConvertToDateTime(aValue : JSValue; aRaiseError : Boolean) : TDateTime; virtual;\r\n Function DateTimeToNativeDateTime(aValue : TDateTime) : JSValue; virtual;\r\n function GetAsDateTime: TDateTime; override;\r\n function GetAsFloat: Double; override;\r\n function GetAsString: string; override;\r\n function GetAsJSValue: JSValue; override;\r\n function GetDataSize: Integer; override;\r\n procedure GetText(var AText: string; ADisplayText: Boolean); override;\r\n procedure SetAsDateTime(AValue: TDateTime); override;\r\n procedure SetAsFloat(AValue: Double); override;\r\n procedure SetAsString(const AValue: string); override;\r\n procedure SetVarValue(const AValue: JSValue); override;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n property Value: TDateTime read GetAsDateTime write SetAsDateTime;\r\n published\r\n property DisplayFormat: string read FDisplayFormat write SetDisplayFormat;\r\n end;\r\n\r\n{ TDateField }\r\n\r\n TDateField = class(TDateTimeField)\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n end;\r\n\r\n{ TTimeField }\r\n\r\n TTimeField = class(TDateTimeField)\r\n protected\r\n procedure SetAsString(const AValue: string); override;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n end;\r\n\r\n{ TBinaryField }\r\n\r\n TBinaryField = class(TField)\r\n protected\r\n class procedure CheckTypeSize(AValue: Longint); override;\r\n Function BlobToBytes(aValue : JSValue) : TBytes; virtual;\r\n Function BytesToBlob(aValue : TBytes) : JSValue; virtual;\r\n function GetAsString: string; override;\r\n function GetAsJSValue: JSValue; override;\r\n function GetValue(var AValue: TBytes): Boolean;\r\n procedure SetAsString(const AValue: string); override;\r\n procedure SetVarValue(const AValue: JSValue); override;\r\n Function GetAsBytes: TBytes; override;\r\n Procedure SetAsBytes(const aValue: TBytes); override;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n published\r\n property Size default 16;\r\n end;\r\n\r\n{ TBytesField }\r\n\r\n\r\n{ TBlobField }\r\n TBlobStreamMode = (bmRead, bmWrite, bmReadWrite);\r\n TBlobType = ftBlob..ftMemo;\r\n\r\n TBlobField = class(TBinaryField)\r\n private\r\n FModified : Boolean;\r\n FBlobType: TBlobType;\r\n // Wrapper that retrieves FDataType as a TBlobType\r\n // function GetBlobType: TBlobType;\r\n // Wrapper that calls SetFieldType\r\n // procedure SetBlobType(AValue: TBlobType);\r\n protected\r\n class procedure CheckTypeSize(AValue: Longint); override;\r\n function GetBlobSize: Longint; virtual;\r\n function GetIsNull: Boolean; override;\r\n procedure GetText(var AText: string; ADisplayText{%H-}: Boolean); override;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n procedure Clear; override;\r\n class function IsBlob: Boolean; override;\r\n procedure SetFieldType(AValue: TFieldType); override;\r\n property BlobSize: Longint read GetBlobSize;\r\n property Modified: Boolean read FModified write FModified;\r\n property Value: string read GetAsString write SetAsString;\r\n published\r\n property BlobType: TBlobType read FBlobType write FBlobType; // default ftBlob;\r\n property Size default 0;\r\n end;\r\n\r\n{ TMemoField }\r\n\r\n TMemoField = class(TBlobField)\r\n protected\r\n procedure GetText(var AText: string; ADisplayText{%H-}: Boolean); override;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n end;\r\n\r\n\r\n{ TVariantField }\r\n\r\n TVariantField = class(TField)\r\n protected\r\n class procedure CheckTypeSize(aValue{%H-}: Integer); override;\r\n\r\n function GetAsBoolean: Boolean; override;\r\n procedure SetAsBoolean(aValue: Boolean); override;\r\n\r\n function GetAsDateTime: TDateTime; override;\r\n procedure SetAsDateTime(aValue: TDateTime); override;\r\n\r\n function GetAsFloat: Double; override;\r\n procedure SetAsFloat(aValue: Double); override;\r\n\r\n function GetAsInteger: Longint; override;\r\n procedure SetAsInteger(AValue: Longint); override;\r\n\r\n function GetAsString: string; override;\r\n procedure SetAsString(const aValue: string); override;\r\n\r\n\r\n function GetAsJSValue: JSValue; override;\r\n procedure SetVarValue(const aValue: JSValue); override;\r\n\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n end;\r\n\r\n{ TIndexDef }\r\n\r\n TIndexDefs = class;\r\n\r\n TIndexOption = (ixPrimary, ixUnique, ixDescending, ixCaseInsensitive,\r\n ixExpression, ixNonMaintained);\r\n TIndexOptions = set of TIndexOption;\r\n\r\n TIndexDef = class(TNamedItem)\r\n Private\r\n FCaseinsFields: string;\r\n FDescFields: string;\r\n FExpression : String;\r\n FFields : String;\r\n FOptions : TIndexOptions;\r\n FSource : String;\r\n protected\r\n function GetExpression: string;\r\n procedure SetCaseInsFields(const AValue: string); virtual;\r\n procedure SetDescFields(const AValue: string);\r\n procedure SetExpression(const AValue: string);\r\n public\r\n constructor Create(Owner: TIndexDefs; const AName, TheFields: string;\r\n TheOptions: TIndexOptions); overload;\r\n procedure Assign(Source: TPersistent); override;\r\n published\r\n property Expression: string read GetExpression write SetExpression;\r\n property Fields: string read FFields write FFields;\r\n property CaseInsFields: string read FCaseinsFields write SetCaseInsFields;\r\n property DescFields: string read FDescFields write SetDescFields;\r\n property Options: TIndexOptions read FOptions write FOptions;\r\n property Source: string read FSource write FSource;\r\n end;\r\n TIndexDefClass = class of TIndexDef;\r\n{ TIndexDefs }\r\n\r\n TIndexDefs = class(TDefCollection)\r\n Private\r\n Function GetItem(Index: Integer): TIndexDef; reintroduce;\r\n Procedure SetItem(Index: Integer; Value: TIndexDef); reintroduce;\r\n public\r\n constructor Create(ADataSet: TDataSet); virtual; overload;\r\n procedure Add(const Name, Fields: string; Options: TIndexOptions); reintroduce;\r\n Function AddIndexDef: TIndexDef;\r\n function Find(const IndexName: string): TIndexDef; reintroduce;\r\n function FindIndexForFields(const Fields{%H-}: string): TIndexDef;\r\n function GetIndexForFields(const Fields: string;\r\n CaseInsensitive: Boolean): TIndexDef;\r\n procedure Update; overload; virtual;\r\n Property Items[Index: Integer] : TIndexDef read GetItem write SetItem; default;\r\n end;\r\n\r\n{ TCheckConstraint }\r\n\r\n TCheckConstraint = class(TCollectionItem)\r\n Private\r\n FCustomConstraint : String;\r\n FErrorMessage : String;\r\n FFromDictionary : Boolean;\r\n FImportedConstraint : String;\r\n public\r\n procedure Assign(Source{%H-}: TPersistent); override;\r\n // function GetDisplayName: string; override;\r\n published\r\n property CustomConstraint: string read FCustomConstraint write FCustomConstraint;\r\n property ErrorMessage: string read FErrorMessage write FErrorMessage;\r\n property FromDictionary: Boolean read FFromDictionary write FFromDictionary;\r\n property ImportedConstraint: string read FImportedConstraint write FImportedConstraint;\r\n end;\r\n\r\n{ TCheckConstraints }\r\n\r\n TCheckConstraints = class(TCollection)\r\n Private\r\n Function GetItem(Index{%H-} : Longint) : TCheckConstraint; reintroduce;\r\n Procedure SetItem(index{%H-} : Longint; Value{%H-} : TCheckConstraint); reintroduce;\r\n protected\r\n function GetOwner: TPersistent; override;\r\n public\r\n constructor Create(AOwner{%H-}: TPersistent); reintroduce;\r\n function Add: TCheckConstraint; reintroduce;\r\n property Items[Index: Longint]: TCheckConstraint read GetItem write SetItem; default;\r\n end;\r\n\r\n { TFieldsEnumerator }\r\n\r\n TFieldsEnumerator = class\r\n private\r\n FPosition: Integer;\r\n FFields: TFields;\r\n function GetCurrent: TField;\r\n public\r\n constructor Create(AFields: TFields); reintroduce;\r\n function MoveNext: Boolean;\r\n property Current: TField read GetCurrent;\r\n end;\r\n\r\n{ TFields }\r\n\r\n TFields = Class(TObject)\r\n Private\r\n FDataset : TDataset;\r\n FFieldList : TFpList;\r\n FOnChange : TNotifyEvent;\r\n FValidFieldKinds : TFieldKinds;\r\n Protected\r\n Procedure ClearFieldDefs;\r\n Procedure Changed;\r\n Procedure CheckfieldKind(Fieldkind : TFieldKind; Field : TField);\r\n Function GetCount : Longint;\r\n Function GetField (Index : Integer) : TField;\r\n Procedure SetField(Index: Integer; Value: TField);\r\n Procedure SetFieldIndex (Field : TField;Value : Integer);\r\n Property OnChange : TNotifyEvent Read FOnChange Write FOnChange;\r\n Property ValidFieldKinds : TFieldKinds Read FValidFieldKinds;\r\n Public\r\n Constructor Create(ADataset : TDataset); reintroduce;\r\n Destructor Destroy;override;\r\n Procedure Add(Field : TField);\r\n Procedure CheckFieldName (Const Value : String);\r\n Procedure CheckFieldNames (Const Value : String);\r\n Procedure Clear;\r\n Function FindField (Const Value : String) : TField;\r\n Function FieldByName (Const Value : String) : TField;\r\n Function FieldByNumber(FieldNo : Integer) : TField;\r\n Function GetEnumerator: TFieldsEnumerator;\r\n Procedure GetFieldNames (Values : TStrings);\r\n Function IndexOf(Field : TField) : Longint;\r\n procedure Remove(Value : TField);\r\n Property Count : Integer Read GetCount;\r\n Property Dataset : TDataset Read FDataset;\r\n Property Fields [Index : Integer] : TField Read GetField Write SetField; default;\r\n end;\r\n TFieldsClass = Class of TFields;\r\n\r\n{ TParam }\r\n\r\n TBlobData = TBytes; // Delphi defines it as alias to TBytes\r\n\r\n TParamBinding = array of integer;\r\n\r\n TParamType = (ptUnknown, ptInput, ptOutput, ptInputOutput, ptResult);\r\n TParamTypes = set of TParamType;\r\n\r\n TParamStyle = (psInterbase,psPostgreSQL,psSimulated);\r\n\r\n TParams = class;\r\n\r\n TParam = class(TCollectionItem)\r\n private\r\n FValue: JSValue;\r\n FPrecision: Integer;\r\n FNumericScale: Integer;\r\n FName: string;\r\n FDataType: TFieldType;\r\n FBound: Boolean;\r\n FParamType: TParamType;\r\n FSize: Integer;\r\n Function GetDataSet: TDataSet;\r\n Function IsParamStored: Boolean;\r\n protected\r\n Procedure AssignParam(Param: TParam);\r\n Procedure AssignTo(Dest: TPersistent); override;\r\n Function GetAsBoolean: Boolean;\r\n Function GetAsBytes: TBytes;\r\n Function GetAsDateTime: TDateTime;\r\n Function GetAsFloat: Double;\r\n Function GetAsInteger: Longint;\r\n Function GetAsLargeInt: NativeInt;\r\n Function GetAsMemo: string;\r\n Function GetAsString: string;\r\n Function GetAsJSValue: JSValue;\r\n Function GetDisplayName: string; override;\r\n Function GetIsNull: Boolean;\r\n Function IsEqual(AValue: TParam): Boolean;\r\n Procedure SetAsBlob(const AValue: TBlobData);\r\n Procedure SetAsBoolean(AValue: Boolean);\r\n Procedure SetAsBytes(const AValue{%H-}: TBytes);\r\n Procedure SetAsDate(const AValue: TDateTime);\r\n Procedure SetAsDateTime(const AValue: TDateTime);\r\n Procedure SetAsFloat(const AValue: Double);\r\n Procedure SetAsInteger(AValue: Longint);\r\n Procedure SetAsLargeInt(AValue: NativeInt);\r\n Procedure SetAsMemo(const AValue: string);\r\n Procedure SetAsString(const AValue: string);\r\n Procedure SetAsTime(const AValue: TDateTime);\r\n Procedure SetAsJSValue(const AValue: JSValue);\r\n Procedure SetDataType(AValue: TFieldType);\r\n Procedure SetText(const AValue: string);\r\n public\r\n constructor Create(ACollection: TCollection); overload; override;\r\n constructor Create(AParams: TParams; AParamType: TParamType); reintroduce; overload;\r\n Procedure Assign(Source: TPersistent); override;\r\n Procedure AssignField(Field: TField);\r\n Procedure AssignToField(Field: TField);\r\n Procedure AssignFieldValue(Field: TField; const AValue: JSValue);\r\n Procedure AssignFromField(Field : TField);\r\n Procedure Clear;\r\n Property AsBlob : TBlobData read GetAsBytes write SetAsBytes;\r\n Property AsBoolean : Boolean read GetAsBoolean write SetAsBoolean;\r\n Property AsBytes : TBytes read GetAsBytes write SetAsBytes;\r\n Property AsDate : TDateTime read GetAsDateTime write SetAsDate;\r\n Property AsDateTime : TDateTime read GetAsDateTime write SetAsDateTime;\r\n Property AsFloat : Double read GetAsFloat write SetAsFloat;\r\n Property AsInteger : LongInt read GetAsInteger write SetAsInteger;\r\n Property AsLargeInt : NativeInt read GetAsLargeInt write SetAsLargeInt;\r\n Property AsMemo : string read GetAsMemo write SetAsMemo;\r\n Property AsSmallInt : LongInt read GetAsInteger write SetAsInteger;\r\n Property AsString : string read GetAsString write SetAsString;\r\n Property AsTime : TDateTime read GetAsDateTime write SetAsTime;\r\n Property Bound : Boolean read FBound write FBound;\r\n Property Dataset : TDataset Read GetDataset;\r\n Property IsNull : Boolean read GetIsNull;\r\n Property Text : string read GetAsString write SetText;\r\n published\r\n Property DataType : TFieldType read FDataType write SetDataType;\r\n Property Name : string read FName write FName;\r\n Property NumericScale : Integer read FNumericScale write FNumericScale default 0;\r\n Property ParamType : TParamType read FParamType write FParamType;\r\n Property Precision : Integer read FPrecision write FPrecision default 0;\r\n Property Size : Integer read FSize write FSize default 0;\r\n Property Value : JSValue read GetAsJSValue write SetAsJSValue stored IsParamStored;\r\n end;\r\n TParamClass = Class of TParam;\r\n\r\n{ TParams }\r\n\r\n TParams = class(TCollection)\r\n private\r\n FOwner: TPersistent;\r\n Function GetItem(Index: Integer): TParam; reintroduce;\r\n Function GetParamValue(const ParamName: string): JSValue;\r\n Procedure SetItem(Index: Integer; Value: TParam); reintroduce;\r\n Procedure SetParamValue(const ParamName: string; const Value: JSValue);\r\n protected\r\n Procedure AssignTo(Dest: TPersistent); override;\r\n Function GetDataSet: TDataSet;\r\n Function GetOwner: TPersistent; override;\r\n Class Function ParamClass : TParamClass; virtual;\r\n public\r\n Constructor Create(AOwner: TPersistent; AItemClass : TCollectionItemClass); overload;\r\n Constructor Create(AOwner: TPersistent); overload;\r\n Constructor Create; overload; reintroduce;\r\n Procedure AddParam(Value: TParam);\r\n Procedure AssignValues(Value: TParams);\r\n Function CreateParam(FldType: TFieldType; const ParamName: string; ParamType: TParamType): TParam;\r\n Function FindParam(const Value: string): TParam;\r\n Procedure GetParamList(List: TList; const ParamNames: string);\r\n Function IsEqual(Value: TParams): Boolean;\r\n Function ParamByName(const Value: string): TParam;\r\n Function ParseSQL(SQL: String; DoCreate: Boolean): String; overload;\r\n Function ParseSQL(SQL: String; DoCreate, EscapeSlash, EscapeRepeat : Boolean; ParameterStyle : TParamStyle): String; overload;\r\n Function ParseSQL(SQL: String; DoCreate, EscapeSlash, EscapeRepeat : Boolean; ParameterStyle : TParamStyle; out ParamBinding: TParambinding): String; overload;\r\n Function ParseSQL(SQL: String; DoCreate, EscapeSlash, EscapeRepeat : Boolean; ParameterStyle : TParamStyle; out ParamBinding: TParambinding; out ReplaceString : string): String; overload;\r\n Procedure RemoveParam(Value: TParam);\r\n Procedure CopyParamValuesFromDataset(ADataset : TDataset; CopyBound : Boolean);\r\n Property Dataset : TDataset Read GetDataset;\r\n Property Items[Index: Integer] : TParam read GetItem write SetItem; default;\r\n function Add: TParam; reintroduce;\r\n Property ParamValues[const ParamName: string] : JSValue read GetParamValue write SetParamValue;\r\n end;\r\n\r\n{ TDataSet }\r\n \r\n TBookmarkFlag = (bfCurrent, bfBOF, bfEOF, bfInserted);\r\n TBookmark = record\r\n Data : JSValue;\r\n Flag : TBookmarkFlag;\r\n end; // Bookmark is always the index in the data array.\r\n TBookmarkStr = string; // JSON encoded version of the above\r\n\r\n TGetMode = (gmCurrent, gmNext, gmPrior);\r\n TGetResult = (grOK, grBOF, grEOF, grError);\r\n\r\n TResyncMode = set of (rmExact, rmCenter);\r\n TDataAction = (daFail, daAbort, daRetry);\r\n TUpdateAction = (uaFail, uaAbort, uaSkip, uaRetry, uaApplied);\r\n TUpdateKind = (ukModify, ukInsert, ukDelete);\r\n\r\n TLocateOption = (loCaseInsensitive, loPartialKey, loFromCurrent);\r\n TLocateOptions = set of TLocateOption;\r\n TDataOperation = procedure of object;\r\n\r\n TDataSetNotifyEvent = procedure(DataSet: TDataSet) of object;\r\n TDataSetErrorEvent = procedure(DataSet: TDataSet; E: EDatabaseError;\r\n var DataAction: TDataAction) of object;\r\n\r\n TFilterOption = (foCaseInsensitive, foNoPartialCompare);\r\n TFilterOptions = set of TFilterOption;\r\n\r\n TLoadOption = (loNoOpen,loNoEvents,loAtEOF,loCancelPending);\r\n TLoadOptions = Set of TLoadOption;\r\n TDatasetLoadEvent = procedure(DataSet: TDataSet; Data : JSValue) of object;\r\n TDatasetLoadFailEvent = procedure(DataSet: TDataSet; ID : Integer; Const ErrorMsg : String) of object;\r\n\r\n TFilterRecordEvent = procedure(DataSet: TDataSet;\r\n var Accept: Boolean) of object;\r\n TDatasetClass = Class of TDataset;\r\n\r\n TRecordState = (rsNew,rsClean,rsUpdate,rsDelete);\r\n TDataRecord = record\r\n data : JSValue;\r\n state : TRecordState;\r\n bookmark : JSValue;\r\n bookmarkFlag : TBookmarkFlag;\r\n end;\r\n TBuffers = Array of TDataRecord;\r\n\r\n TResolveInfo = record\r\n Data : JSValue;\r\n Status : TUpdateStatus;\r\n ResolveStatus : TResolveStatus;\r\n Error : String; // Only filled on error.\r\n BookMark : TBookmark;\r\n _private : JSValue; // for use by descendents of TDataset\r\n end;\r\n TResolveInfoArray = Array of TResolveInfo;\r\n\r\n // Record so we can extend later on\r\n TResolveResults = record\r\n Records : TResolveInfoArray;\r\n end;\r\n\r\n TOnRecordResolveEvent = Procedure (Sender : TDataset; info : TResolveInfo) of object;\r\n TApplyUpdatesEvent = Procedure (Sender : TDataset; info : TResolveResults) of object;\r\n\r\n{------------------------------------------------------------------------------}\r\n\r\n TDataSet = class(TComponent)\r\n Private\r\n FAfterApplyUpdates: TApplyUpdatesEvent;\r\n FAfterLoad: TDatasetNotifyEvent;\r\n FBeforeApplyUpdates: TDatasetNotifyEvent;\r\n FBeforeLoad: TDatasetNotifyEvent;\r\n FBlockReadSize: Integer;\r\n FCalcBuffer: TDataRecord;\r\n FCalcFieldsCount: Longint;\r\n FOnLoadFail: TDatasetLoadFailEvent;\r\n FOnRecordResolved: TOnRecordResolveEvent;\r\n FOpenAfterRead : boolean;\r\n FActiveRecord: Longint;\r\n FAfterCancel: TDataSetNotifyEvent;\r\n FAfterClose: TDataSetNotifyEvent;\r\n FAfterDelete: TDataSetNotifyEvent;\r\n FAfterEdit: TDataSetNotifyEvent;\r\n FAfterInsert: TDataSetNotifyEvent;\r\n FAfterOpen: TDataSetNotifyEvent;\r\n FAfterPost: TDataSetNotifyEvent;\r\n FAfterRefresh: TDataSetNotifyEvent;\r\n FAfterScroll: TDataSetNotifyEvent;\r\n FAutoCalcFields: Boolean;\r\n FBOF: Boolean;\r\n FBeforeCancel: TDataSetNotifyEvent;\r\n FBeforeClose: TDataSetNotifyEvent;\r\n FBeforeDelete: TDataSetNotifyEvent;\r\n FBeforeEdit: TDataSetNotifyEvent;\r\n FBeforeInsert: TDataSetNotifyEvent;\r\n FBeforeOpen: TDataSetNotifyEvent;\r\n FBeforePost: TDataSetNotifyEvent;\r\n FBeforeRefresh: TDataSetNotifyEvent;\r\n FBeforeScroll: TDataSetNotifyEvent;\r\n FBlobFieldCount: Longint;\r\n FBuffers : TBuffers;\r\n // The actual length of FBuffers is FBufferCount+1\r\n FBufferCount: Longint;\r\n FConstraints: TCheckConstraints;\r\n FDisableControlsCount : Integer;\r\n FDisableControlsState : TDatasetState;\r\n FCurrentRecord: Longint;\r\n FDataSources : TFPList;\r\n FDefaultFields: Boolean;\r\n FEOF: Boolean;\r\n FEnableControlsEvent : TDataEvent;\r\n FFieldList : TFields;\r\n FFieldDefs: TFieldDefs;\r\n FFilterOptions: TFilterOptions;\r\n FFilterText: string;\r\n FFiltered: Boolean;\r\n FFound: Boolean;\r\n FInternalCalcFields: Boolean;\r\n FModified: Boolean;\r\n FOnCalcFields: TDataSetNotifyEvent;\r\n FOnDeleteError: TDataSetErrorEvent;\r\n FOnEditError: TDataSetErrorEvent;\r\n FOnFilterRecord: TFilterRecordEvent;\r\n FOnNewRecord: TDataSetNotifyEvent;\r\n FOnPostError: TDataSetErrorEvent;\r\n FRecordCount: Longint;\r\n FIsUniDirectional: Boolean;\r\n FState : TDataSetState;\r\n FInternalOpenComplete: Boolean;\r\n FDataProxy : TDataProxy;\r\n FDataRequestID : Integer;\r\n FUpdateBatchID : Integer;\r\n FChangeList : TFPList;\r\n FBatchList : TFPList;\r\n FInApplyupdates : Boolean;\r\n FLoadCount : Integer;\r\n FMinLoadID : Integer;\r\n Procedure DoInsertAppend(DoAppend : Boolean);\r\n Procedure DoInternalOpen;\r\n Function GetBuffer (Index : longint) : TDataRecord;\r\n function GetDataProxy: TDataProxy;\r\n function GetIsLoading: Boolean;\r\n Procedure RegisterDataSource(ADataSource : TDataSource);\r\n procedure SetConstraints(Value: TCheckConstraints);\r\n procedure SetDataProxy(AValue: TDataProxy);\r\n Procedure ShiftBuffersForward;\r\n Procedure ShiftBuffersBackward;\r\n Function TryDoing (P : TDataOperation; Ev : TDatasetErrorEvent) : Boolean;\r\n Function GetActive : boolean;\r\n Procedure UnRegisterDataSource(ADataSource : TDataSource);\r\n procedure SetBlockReadSize(AValue: Integer); virtual;\r\n Procedure SetFieldDefs(AFieldDefs: TFieldDefs);\r\n procedure DoInsertAppendRecord(const Values: array of jsValue; DoAppend : boolean);\r\n // Callback for Tdataproxy.DoGetData;\r\n function ResolveRecordUpdate(anUpdate: TRecordUpdateDescriptor): Boolean;\r\n procedure HandleRequestResponse(ARequest: TDataRequest);\r\n protected\r\n // Proxy methods\r\n // Override this to integrate package in local data\r\n // call OnRecordResolved\r\n procedure DoOnRecordResolved(anUpdate: TRecordUpdateDescriptor); virtual;\r\n // Convert TRecordUpdateDescriptor to ResolveInfo\r\n function RecordUpdateDescriptorToResolveInfo(anUpdate: TRecordUpdateDescriptor): TResolveInfo; virtual;\r\n function DoResolveRecordUpdate(anUpdate{%H-}: TRecordUpdateDescriptor): Boolean; virtual;\r\n Function GetRecordUpdates(AList: TRecordUpdateDescriptorList) : Integer; virtual;\r\n procedure ResolveUpdateBatch(Sender: TObject; aBatch: TRecordUpdateBatch); virtual;\r\n Function DataPacketReceived(ARequest{%H-}: TDataRequest) : Boolean; virtual;\r\n function DoLoad(aOptions: TLoadOptions; aAfterLoad: TDatasetLoadEvent): Boolean; virtual;\r\n function DoGetDataProxy: TDataProxy; virtual;\r\n Procedure InitChangeList; virtual;\r\n Procedure DoneChangeList; virtual;\r\n Procedure ClearChangeList;\r\n procedure ResetUpdateDescriptors;\r\n Function IndexInChangeList(aBookmark: TBookmark): Integer; virtual;\r\n Function AddToChangeList(aChange : TUpdateStatus) : TRecordUpdateDescriptor ; virtual;\r\n Procedure RemoveFromChangeList(R : TRecordUpdateDescriptor); virtual;\r\n Procedure DoApplyUpdates;\r\n procedure RecalcBufListSize;\r\n procedure ActivateBuffers; virtual;\r\n procedure BindFields(Binding: Boolean);\r\n procedure BlockReadNext; virtual;\r\n function BookmarkAvailable: Boolean;\r\n procedure CalculateFields(Var Buffer: TDataRecord); virtual;\r\n procedure CheckActive; virtual;\r\n procedure CheckInactive; virtual;\r\n procedure CheckBiDirectional;\r\n procedure Loaded; override;\r\n procedure ClearBuffers; virtual;\r\n procedure ClearCalcFields(var Buffer{%H-}: TDataRecord); virtual;\r\n procedure CloseBlob(Field{%H-}: TField); virtual;\r\n procedure CloseCursor; virtual;\r\n procedure CreateFields; virtual;\r\n procedure DataEvent(Event: TDataEvent; Info: JSValue); virtual;\r\n procedure DestroyFields; virtual;\r\n procedure DoAfterCancel; virtual;\r\n procedure DoAfterClose; virtual;\r\n procedure DoAfterDelete; virtual;\r\n procedure DoAfterEdit; virtual;\r\n procedure DoAfterInsert; virtual;\r\n procedure DoAfterOpen; virtual;\r\n procedure DoAfterPost; virtual;\r\n procedure DoAfterScroll; virtual;\r\n procedure DoAfterRefresh; virtual;\r\n procedure DoBeforeCancel; virtual;\r\n procedure DoBeforeClose; virtual;\r\n procedure DoBeforeDelete; virtual;\r\n procedure DoBeforeEdit; virtual;\r\n procedure DoBeforeInsert; virtual;\r\n procedure DoBeforeOpen; virtual;\r\n procedure DoBeforePost; virtual;\r\n procedure DoBeforeScroll; virtual;\r\n procedure DoBeforeRefresh; virtual;\r\n procedure DoOnCalcFields; virtual;\r\n procedure DoOnNewRecord; virtual;\r\n procedure DoBeforeLoad; virtual;\r\n procedure DoAfterLoad; virtual;\r\n procedure DoBeforeApplyUpdates; virtual;\r\n procedure DoAfterApplyUpdates(const ResolveInfo: TResolveResults); virtual;\r\n function FieldByNumber(FieldNo: Longint): TField;\r\n function FindRecord(Restart{%H-}, GoForward{%H-}: Boolean): Boolean; virtual;\r\n function GetBookmarkStr: TBookmarkStr; virtual;\r\n procedure GetCalcFields(Var Buffer: TDataRecord); virtual;\r\n function GetCanModify: Boolean; virtual;\r\n procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;\r\n function GetFieldClass(FieldType: TFieldType): TFieldClass; virtual;\r\n Function GetfieldCount : Integer;\r\n function GetFieldValues(const FieldName : string) : JSValue; virtual;\r\n function GetIsIndexField(Field{%H-}: TField): Boolean; virtual;\r\n function GetIndexDefs(IndexDefs : TIndexDefs; IndexTypes : TIndexOptions) : TIndexDefs;\r\n function GetNextRecords: Longint; virtual;\r\n function GetNextRecord: Boolean; virtual;\r\n function GetPriorRecords: Longint; virtual;\r\n function GetPriorRecord: Boolean; virtual;\r\n function GetRecordCount: Longint; virtual;\r\n function GetRecNo: Longint; virtual;\r\n procedure InitFieldDefs; virtual;\r\n procedure InitFieldDefsFromfields;\r\n procedure InitRecord(var Buffer: TDataRecord); virtual;\r\n procedure InternalCancel; virtual;\r\n procedure InternalEdit; virtual;\r\n procedure InternalInsert; virtual;\r\n procedure InternalRefresh; virtual;\r\n procedure OpenCursor(InfoQuery: Boolean); virtual;\r\n procedure OpenCursorcomplete; virtual;\r\n procedure RefreshInternalCalcFields(Var Buffer{%H-}: TDataRecord); virtual;\r\n procedure RestoreState(const Value: TDataSetState);\r\n Procedure SetActive (Value : Boolean); virtual;\r\n procedure SetBookmarkStr(const Value: TBookmarkStr); virtual;\r\n procedure SetBufListSize(Value: Longint); virtual;\r\n procedure SetChildOrder(Child: TComponent; Order: Longint); override;\r\n procedure SetCurrentRecord(Index: Longint); virtual;\r\n procedure SetDefaultFields(const Value: Boolean);\r\n procedure SetFiltered(Value: Boolean); virtual;\r\n procedure SetFilterOptions(Value: TFilterOptions); virtual;\r\n procedure SetFilterText(const Value: string); virtual;\r\n procedure SetFieldValues(const FieldName: string; Value: JSValue); virtual;\r\n procedure SetFound(const Value: Boolean); virtual;\r\n procedure SetModified(Value: Boolean);\r\n procedure SetName(const NewName: TComponentName); override;\r\n procedure SetOnFilterRecord(const Value: TFilterRecordEvent); virtual;\r\n procedure SetRecNo(Value{%H-}: Longint); virtual;\r\n procedure SetState(Value: TDataSetState);\r\n function SetTempState(const Value: TDataSetState): TDataSetState;\r\n Function TempBuffer: TDataRecord;\r\n procedure UpdateIndexDefs; virtual;\r\n property ActiveRecord: Longint read FActiveRecord;\r\n property CurrentRecord: Longint read FCurrentRecord;\r\n property BlobFieldCount: Longint read FBlobFieldCount;\r\n property Buffers[Index: Longint]: TDataRecord read GetBuffer;\r\n property BufferCount: Longint read FBufferCount;\r\n property CalcBuffer: TDataRecord read FCalcBuffer;\r\n property CalcFieldsCount: Longint read FCalcFieldsCount;\r\n property InternalCalcFields: Boolean read FInternalCalcFields;\r\n property Constraints: TCheckConstraints read FConstraints write SetConstraints;\r\n function AllocRecordBuffer: TDataRecord; virtual;\r\n procedure FreeRecordBuffer(var Buffer{%H-}: TDataRecord); virtual;\r\n procedure GetBookmarkData(Buffer{%H-}: TDataRecord; var Data{%H-}: TBookmark); virtual;\r\n function GetBookmarkFlag(Buffer{%H-}: TDataRecord): TBookmarkFlag; virtual;\r\n function GetDataSource: TDataSource; virtual;\r\n function GetRecordSize: Word; virtual;\r\n procedure InternalAddRecord(Buffer{%H-}: Pointer; AAppend{%H-}: Boolean); virtual;\r\n procedure InternalDelete; virtual;\r\n procedure InternalFirst; virtual;\r\n procedure InternalGotoBookmark(ABookmark{%H-}: TBookmark); virtual;\r\n procedure InternalHandleException(E: Exception); virtual;\r\n procedure InternalInitRecord(var Buffer{%H-}: TDataRecord); virtual;\r\n procedure InternalLast; virtual;\r\n procedure InternalPost; virtual;\r\n procedure InternalSetToRecord(Buffer{%H-}: TDataRecord); virtual;\r\n procedure SetBookmarkFlag(Var Buffer{%H-}: TDataRecord; Value{%H-}: TBookmarkFlag); virtual;\r\n procedure SetBookmarkData(Var Buffer{%H-}: TDataRecord; Data{%H-}: TBookmark); virtual;\r\n procedure SetUniDirectional(const Value: Boolean);\r\n procedure Notification(AComponent: TComponent; Operation: TOperation); override;\r\n // These use the active buffer\r\n function GetFieldData(Field: TField): JSValue; virtual; overload;\r\n procedure SetFieldData(Field: TField; AValue : JSValue); virtual; overload;\r\n function GetFieldData(Field: TField; Buffer: TDatarecord): JSValue; virtual; overload;\r\n procedure SetFieldData(Field: TField; var Buffer: TDatarecord; AValue : JSValue); virtual; overload;\r\n class function FieldDefsClass : TFieldDefsClass; virtual;\r\n class function FieldsClass : TFieldsClass; virtual;\r\n protected { abstract methods }\r\n function GetRecord(var Buffer: TDataRecord; GetMode: TGetMode; DoCheck: Boolean): TGetResult; virtual; abstract;\r\n procedure InternalClose; virtual; abstract;\r\n procedure InternalOpen; virtual; abstract;\r\n procedure InternalInitFieldDefs; virtual; abstract;\r\n function IsCursorOpen: Boolean; virtual; abstract;\r\n property DataProxy : TDataProxy Read GetDataProxy Write SetDataProxy;\r\n Property LoadCount : Integer Read FLoadCount;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n destructor Destroy; override;\r\n function ActiveBuffer: TDataRecord;\r\n procedure Append;\r\n procedure AppendRecord(const Values: array of jsValue);\r\n function BookmarkValid(ABookmark{%H-}: TBookmark): Boolean; virtual;\r\n function ConvertToDateTime(aField : TField; aValue : JSValue; ARaiseException : Boolean) : TDateTime; virtual;\r\n function ConvertDateTimeToNative(aField : TField; aValue : TDateTime) : JSValue; virtual;\r\n Class function DefaultConvertToDateTime(aField : TField; aValue : JSValue; ARaiseException{%H-} : Boolean) : TDateTime; virtual;\r\n Class function DefaultConvertDateTimeToNative(aField : TField; aValue : TDateTime) : JSValue; virtual;\r\n Function BlobDataToBytes(aValue : JSValue) : TBytes; virtual;\r\n Class Function DefaultBlobDataToBytes(aValue : JSValue) : TBytes; virtual;\r\n Function BytesToBlobData(aValue : TBytes) : JSValue ; virtual;\r\n Class Function DefaultBytesToBlobData(aValue : TBytes) : JSValue; virtual;\r\n procedure Cancel; virtual;\r\n procedure CheckBrowseMode;\r\n procedure ClearFields;\r\n procedure Close;\r\n Procedure ApplyUpdates;\r\n function ControlsDisabled: Boolean;\r\n function CompareBookmarks(Bookmark1{%H-}, Bookmark2{%H-}: TBookmark): Longint; virtual;\r\n procedure CursorPosChanged;\r\n procedure Delete; virtual;\r\n procedure DisableControls;\r\n procedure Edit;\r\n procedure EnableControls;\r\n function FieldByName(const FieldName: string): TField;\r\n function FindField(const FieldName: string): TField;\r\n function FindFirst: Boolean; virtual;\r\n function FindLast: Boolean; virtual;\r\n function FindNext: Boolean; virtual;\r\n function FindPrior: Boolean; virtual;\r\n procedure First;\r\n procedure FreeBookmark(ABookmark{%H-}: TBookmark); virtual;\r\n function GetBookmark: TBookmark; virtual;\r\n function GetCurrentRecord(Buffer{%H-}: TDataRecord): Boolean; virtual;\r\n procedure GetFieldList(List: TList; const FieldNames: string); overload;\r\n procedure GetFieldList(List: TFPList; const FieldNames: string); overload;\r\n procedure GetFieldNames(List: TStrings);\r\n procedure GotoBookmark(const ABookmark: TBookmark);\r\n procedure Insert; reintroduce;\r\n procedure InsertRecord(const Values: array of JSValue);\r\n function IsEmpty: Boolean;\r\n function IsLinkedTo(ADataSource: TDataSource): Boolean;\r\n function IsSequenced: Boolean; virtual;\r\n procedure Last;\r\n Function Load(aOptions : TLoadOptions; aAfterLoad : TDatasetLoadEvent) : Boolean;\r\n function Locate(const KeyFields{%H-}: string; const KeyValues{%H-}: JSValue; Options{%H-}: TLocateOptions) : boolean; virtual;\r\n function Lookup(const KeyFields{%H-}: string; const KeyValues{%H-}: JSValue; const ResultFields{%H-}: string): JSValue; virtual;\r\n function MoveBy(Distance: Longint): Longint;\r\n procedure Next;\r\n procedure Open;\r\n procedure Post; virtual;\r\n procedure Prior;\r\n procedure Refresh;\r\n procedure Resync(Mode: TResyncMode); virtual;\r\n Procedure CancelLoading;\r\n procedure SetFields(const Values: array of JSValue);\r\n procedure UpdateCursorPos;\r\n procedure UpdateRecord;\r\n Function GetPendingUpdates : TResolveInfoArray;\r\n Property Loading : Boolean Read GetIsLoading;\r\n property BlockReadSize: Integer read FBlockReadSize write SetBlockReadSize;\r\n property BOF: Boolean read FBOF;\r\n property Bookmark: TBookmark read GetBookmark write GotoBookmark;\r\n property CanModify: Boolean read GetCanModify;\r\n property DataSource: TDataSource read GetDataSource;\r\n property DefaultFields: Boolean read FDefaultFields;\r\n property EOF: Boolean read FEOF;\r\n property FieldCount: Longint read GetFieldCount;\r\n property FieldDefs: TFieldDefs read FFieldDefs write SetFieldDefs;\r\n property Found: Boolean read FFound;\r\n property Modified: Boolean read FModified;\r\n property IsUniDirectional: Boolean read FIsUniDirectional default False;\r\n property RecordCount: Longint read GetRecordCount;\r\n property RecNo: Longint read GetRecNo write SetRecNo;\r\n property RecordSize: Word read GetRecordSize;\r\n property State: TDataSetState read FState;\r\n property Fields : TFields read FFieldList;\r\n property FieldValues[FieldName : string] : JSValue read GetFieldValues write SetFieldValues; default;\r\n property Filter: string read FFilterText write SetFilterText;\r\n property Filtered: Boolean read FFiltered write SetFiltered default False;\r\n property FilterOptions: TFilterOptions read FFilterOptions write SetFilterOptions;\r\n property Active: Boolean read GetActive write SetActive default False;\r\n property AutoCalcFields: Boolean read FAutoCalcFields write FAutoCalcFields default true;\r\n property BeforeOpen: TDataSetNotifyEvent read FBeforeOpen write FBeforeOpen;\r\n property AfterOpen: TDataSetNotifyEvent read FAfterOpen write FAfterOpen;\r\n property BeforeClose: TDataSetNotifyEvent read FBeforeClose write FBeforeClose;\r\n property AfterClose: TDataSetNotifyEvent read FAfterClose write FAfterClose;\r\n property BeforeInsert: TDataSetNotifyEvent read FBeforeInsert write FBeforeInsert;\r\n property AfterInsert: TDataSetNotifyEvent read FAfterInsert write FAfterInsert;\r\n property BeforeEdit: TDataSetNotifyEvent read FBeforeEdit write FBeforeEdit;\r\n property AfterEdit: TDataSetNotifyEvent read FAfterEdit write FAfterEdit;\r\n property BeforePost: TDataSetNotifyEvent read FBeforePost write FBeforePost;\r\n property AfterPost: TDataSetNotifyEvent read FAfterPost write FAfterPost;\r\n property BeforeCancel: TDataSetNotifyEvent read FBeforeCancel write FBeforeCancel;\r\n property AfterCancel: TDataSetNotifyEvent read FAfterCancel write FAfterCancel;\r\n property BeforeDelete: TDataSetNotifyEvent read FBeforeDelete write FBeforeDelete;\r\n property AfterDelete: TDataSetNotifyEvent read FAfterDelete write FAfterDelete;\r\n property BeforeScroll: TDataSetNotifyEvent read FBeforeScroll write FBeforeScroll;\r\n property AfterScroll: TDataSetNotifyEvent read FAfterScroll write FAfterScroll;\r\n property BeforeRefresh: TDataSetNotifyEvent read FBeforeRefresh write FBeforeRefresh;\r\n property BeforeLoad : TDatasetNotifyEvent Read FBeforeLoad Write FBeforeLoad;\r\n Property AfterLoad : TDatasetNotifyEvent Read FAfterLoad Write FAfterLoad;\r\n Property BeforeApplyUpdates : TDatasetNotifyEvent Read FBeforeApplyUpdates Write FBeforeApplyUpdates;\r\n Property AfterApplyUpdates : TApplyUpdatesEvent Read FAfterApplyUpdates Write FAfterApplyUpdates;\r\n property AfterRefresh: TDataSetNotifyEvent read FAfterRefresh write FAfterRefresh;\r\n property OnCalcFields: TDataSetNotifyEvent read FOnCalcFields write FOnCalcFields;\r\n property OnDeleteError: TDataSetErrorEvent read FOnDeleteError write FOnDeleteError;\r\n property OnEditError: TDataSetErrorEvent read FOnEditError write FOnEditError;\r\n property OnFilterRecord: TFilterRecordEvent read FOnFilterRecord write SetOnFilterRecord;\r\n property OnNewRecord: TDataSetNotifyEvent read FOnNewRecord write FOnNewRecord;\r\n Property OnRecordResolved : TOnRecordResolveEvent Read FOnRecordResolved Write FOnRecordResolved;\r\n property OnPostError: TDataSetErrorEvent read FOnPostError write FOnPostError;\r\n property OnLoadFail : TDatasetLoadFailEvent Read FOnLoadFail Write FOnLoadFail;\r\n end;\r\n\r\n{ TDataLink }\r\n\r\n TDataLink = class(TPersistent)\r\n private\r\n FFirstRecord,\r\n FBufferCount : Integer;\r\n FActive,\r\n FDataSourceFixed,\r\n FEditing,\r\n FReadOnly,\r\n FUpdatingRecord,\r\n FVisualControl : Boolean;\r\n FDataSource : TDataSource;\r\n Function CalcFirstRecord(Index : Integer) : Integer;\r\n Procedure CalcRange;\r\n Procedure CheckActiveAndEditing;\r\n Function GetDataset : TDataset;\r\n procedure SetActive(AActive: Boolean);\r\n procedure SetDataSource(Value: TDataSource);\r\n Procedure SetReadOnly(Value : Boolean);\r\n protected\r\n procedure ActiveChanged; virtual;\r\n procedure CheckBrowseMode; virtual;\r\n procedure DataEvent(Event: TDataEvent; Info: JSValue); virtual;\r\n procedure DataSetChanged; virtual;\r\n procedure DataSetScrolled(Distance{%H-}: Integer); virtual;\r\n procedure EditingChanged; virtual;\r\n procedure FocusControl(Field{%H-}: JSValue); virtual;\r\n function GetActiveRecord: Integer; virtual;\r\n function GetBOF: Boolean; virtual;\r\n function GetBufferCount: Integer; virtual;\r\n function GetEOF: Boolean; virtual;\r\n function GetRecordCount: Integer; virtual;\r\n procedure LayoutChanged; virtual;\r\n function MoveBy(Distance: Integer): Integer; virtual;\r\n procedure RecordChanged(Field{%H-}: TField); virtual;\r\n procedure SetActiveRecord(Value: Integer); virtual;\r\n procedure SetBufferCount(Value: Integer); virtual;\r\n procedure UpdateData; virtual;\r\n property VisualControl: Boolean read FVisualControl write FVisualControl;\r\n property FirstRecord: Integer read FFirstRecord write FFirstRecord;\r\n public\r\n constructor Create; reintroduce;\r\n destructor Destroy; override;\r\n function Edit: Boolean;\r\n procedure UpdateRecord;\r\n property Active: Boolean read FActive;\r\n property ActiveRecord: Integer read GetActiveRecord write SetActiveRecord;\r\n property BOF: Boolean read GetBOF;\r\n property BufferCount: Integer read GetBufferCount write SetBufferCount;\r\n property DataSet: TDataSet read GetDataSet;\r\n property DataSource: TDataSource read FDataSource write SetDataSource;\r\n property DataSourceFixed: Boolean read FDataSourceFixed write FDataSourceFixed;\r\n property Editing: Boolean read FEditing;\r\n property Eof: Boolean read GetEOF;\r\n property ReadOnly: Boolean read FReadOnly write SetReadOnly;\r\n property RecordCount: Integer read GetRecordCount;\r\n end;\r\n\r\n{ TDetailDataLink }\r\n\r\n TDetailDataLink = class(TDataLink)\r\n protected\r\n function GetDetailDataSet: TDataSet; virtual;\r\n public\r\n property DetailDataSet: TDataSet read GetDetailDataSet;\r\n end;\r\n\r\n{ TMasterDataLink }\r\n\r\n TMasterDataLink = class(TDetailDataLink)\r\n private\r\n FDetailDataSet: TDataSet;\r\n FFieldNames: string;\r\n FFields: TList;\r\n FOnMasterChange: TNotifyEvent;\r\n FOnMasterDisable: TNotifyEvent;\r\n procedure SetFieldNames(const Value: string);\r\n protected\r\n procedure ActiveChanged; override;\r\n procedure CheckBrowseMode; override;\r\n function GetDetailDataSet: TDataSet; override;\r\n procedure LayoutChanged; override;\r\n procedure RecordChanged(Field: TField); override;\r\n Procedure DoMasterDisable; virtual;\r\n Procedure DoMasterChange; virtual;\r\n public\r\n constructor Create(ADataSet: TDataSet);virtual; reintroduce;\r\n destructor Destroy; override;\r\n property FieldNames: string read FFieldNames write SetFieldNames;\r\n property Fields: TList read FFields;\r\n property OnMasterChange: TNotifyEvent read FOnMasterChange write FOnMasterChange;\r\n property OnMasterDisable: TNotifyEvent read FOnMasterDisable write FOnMasterDisable;\r\n end;\r\n\r\n{ TMasterParamsDataLink }\r\n\r\n TMasterParamsDataLink = Class(TMasterDataLink)\r\n Private\r\n FParams : TParams;\r\n Procedure SetParams(AValue : TParams);\r\n Protected\r\n Procedure DoMasterDisable; override;\r\n Procedure DoMasterChange; override;\r\n Public\r\n constructor Create(ADataSet: TDataSet); override;\r\n Procedure RefreshParamNames; virtual;\r\n Procedure CopyParamsFromMaster(CopyBound : Boolean); virtual;\r\n Property Params : TParams Read FParams Write SetParams;\r\n end;\r\n\r\n{ TDataSource }\r\n\r\n TDataChangeEvent = procedure(Sender: TObject; Field: TField) of object;\r\n\r\n TDataSource = class(TComponent)\r\n private\r\n FDataSet: TDataSet;\r\n FDataLinks: TList;\r\n FEnabled: Boolean;\r\n FAutoEdit: Boolean;\r\n FState: TDataSetState;\r\n FOnStateChange: TNotifyEvent;\r\n FOnDataChange: TDataChangeEvent;\r\n FOnUpdateData: TNotifyEvent;\r\n procedure DistributeEvent(Event: TDataEvent; Info: JSValue);\r\n procedure RegisterDataLink(DataLink: TDataLink);\r\n Procedure ProcessEvent(Event : TDataEvent; Info : JSValue);\r\n procedure SetDataSet(ADataSet: TDataSet);\r\n procedure SetEnabled(Value: Boolean);\r\n procedure UnregisterDataLink(DataLink: TDataLink);\r\n protected\r\n Procedure DoDataChange (Info : Pointer);virtual;\r\n Procedure DoStateChange; virtual;\r\n Procedure DoUpdateData;\r\n property DataLinks: TList read FDataLinks;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n destructor Destroy; override;\r\n procedure Edit;\r\n function IsLinkedTo(ADataSet{%H-}: TDataSet): Boolean;\r\n property State: TDataSetState read FState;\r\n published\r\n property AutoEdit: Boolean read FAutoEdit write FAutoEdit default True;\r\n property DataSet: TDataSet read FDataSet write SetDataSet;\r\n property Enabled: Boolean read FEnabled write SetEnabled default True;\r\n property OnStateChange: TNotifyEvent read FOnStateChange write FOnStateChange;\r\n property OnDataChange: TDataChangeEvent read FOnDataChange write FOnDataChange;\r\n property OnUpdateData: TNotifyEvent read FOnUpdateData write FOnUpdateData;\r\n end;\r\n\r\n\r\n { TDataRequest }\r\n TDataRequestResult = (rrFail,rrEOF,rrOK);\r\n TDataRequestEvent = Procedure (ARequest : TDataRequest) of object;\r\n\r\n TDataRequest = Class(TObject)\r\n private\r\n FBookmark: TBookMark;\r\n FCurrent: TBookMark;\r\n FDataset: TDataset;\r\n FErrorMsg: String;\r\n FEvent: TDatasetLoadEvent;\r\n FLoadOptions: TLoadOptions;\r\n FRequestID: Integer;\r\n FSuccess: TDataRequestResult;\r\n FData : JSValue;\r\n FAfterRequest : TDataRequestEvent;\r\n FDataProxy : TDataProxy;\r\n Protected\r\n Procedure DoAfterRequest;\r\n Public\r\n Constructor Create(aDataProxy : TDataProxy; aOptions: TLoadOptions; aAfterRequest: TDataRequestEvent; aAfterLoad: TDatasetLoadEvent); virtual; reintroduce;\r\n property DataProxy : TDataProxy Read FDataProxy;\r\n Property Dataset : TDataset Read FDataset;\r\n Property Bookmark : TBookMark Read FBookmark;\r\n Property RequestID : Integer Read FRequestID;\r\n Property LoadOptions : TLoadOptions Read FLoadOptions;\r\n Property Current : TBookMark Read FCurrent;\r\n Property Success : TDataRequestResult Read FSuccess Write FSuccess;\r\n Property Event : TDatasetLoadEvent Read FEvent;\r\n Property ErrorMsg : String Read FErrorMsg Write FErrorMsg;\r\n Property Data : JSValue read FData Write FData;\r\n end;\r\n TDataRequestClass = Class of TDataRequest;\r\n\r\n { TRecordUpdateDescriptor }\r\n\r\n TRecordUpdateDescriptor = Class(TObject)\r\n private\r\n FBookmark: TBookmark;\r\n FData: JSValue;\r\n FDataset: TDataset;\r\n FProxy: TDataProxy;\r\n FResolveStatus: TResolveStatus;\r\n FResolveError: String;\r\n FServerData: JSValue;\r\n FStatus: TUpdateStatus;\r\n Protected\r\n Procedure SetResolveStatus(aValue : TResolveStatus); virtual;\r\n Procedure Reset;\r\n Public\r\n Constructor Create(aProxy : TDataProxy; aDataset : TDataset; aBookmark : TBookMark; AData : JSValue; AStatus : TUpdateStatus); reintroduce;\r\n Procedure Resolve(aData : JSValue);\r\n Procedure ResolveFailed(aError : String);\r\n Property Proxy : TDataProxy read FProxy;\r\n Property Dataset : TDataset Read FDataset;\r\n Property OriginalStatus : TUpdateStatus Read FStatus; deprecated;\r\n Property Status : TUpdateStatus Read FStatus;\r\n Property ResolveStatus : TResolveStatus Read FResolveStatus;\r\n Property ServerData : JSValue Read FServerData;\r\n Property Data : JSValue Read FData;\r\n Property Bookmark : TBookmark Read FBookmark;\r\n Property ResolveError : String Read FResolveError ;\r\n end;\r\n TRecordUpdateDescriptorClass = Class of TRecordUpdateDescriptor;\r\n\r\n { TRecordUpdateDescriptorList }\r\n\r\n TRecordUpdateDescriptorList = Class(TFPList)\r\n private\r\n function GetUpdate(AIndex : Integer): TRecordUpdateDescriptor;\r\n Public\r\n Property UpdateDescriptors[AIndex : Integer] : TRecordUpdateDescriptor Read GetUpdate; Default;\r\n end;\r\n\r\n { TRecordUpdateBatch }\r\n TUpdateBatchStatus = (ubsPending,ubsProcessing,ubsProcessed,ubsResolved);\r\n TResolveBatchEvent = Procedure (Sender : TObject; ARequest : TRecordUpdateBatch) of object;\r\n\r\n TRecordUpdateBatch = class(TObject)\r\n private\r\n FBatchID: Integer;\r\n FDataset: TDataset;\r\n FLastChangeIndex: Integer;\r\n FList: TRecordUpdateDescriptorList;\r\n FOnResolve: TResolveBatchEvent;\r\n FOwnsList: Boolean;\r\n FStatus: TUpdateBatchStatus;\r\n Protected\r\n Property LastChangeIndex : Integer Read FLastChangeIndex;\r\n Public\r\n Constructor Create (aBatchID : Integer; AList : TRecordUpdateDescriptorList; AOwnsList : Boolean); reintroduce;\r\n Destructor Destroy; override;\r\n Procedure FreeList;\r\n Property Dataset : TDataset Read FDataset Write FDataset;\r\n Property OnResolve : TResolveBatchEvent Read FOnResolve Write FOnResolve;\r\n Property OwnsList : Boolean Read FOwnsList;\r\n property BatchID : Integer Read FBatchID;\r\n Property Status : TUpdateBatchStatus Read FStatus Write FStatus;\r\n Property List : TRecordUpdateDescriptorList Read FList;\r\n end;\r\n TRecordUpdateBatchClass = Class of TRecordUpdateBatch;\r\n\r\n { TDataProxy }\r\n\r\n TDataProxy = Class(TComponent)\r\n Protected\r\n Function GetDataRequestClass : TDataRequestClass; virtual;\r\n Function GetUpdateDescriptorClass : TRecordUpdateDescriptorClass; virtual;\r\n Function GetUpdateBatchClass : TRecordUpdateBatchClass; virtual;\r\n // Use this to call resolve event, and free the batch.\r\n Procedure ResolveBatch(aBatch : TRecordUpdateBatch);\r\n Public\r\n Function GetDataRequest(aOptions: TLoadOptions; aAfterRequest: TDataRequestEvent; aAfterLoad: TDatasetLoadEvent) : TDataRequest; virtual;\r\n Function GetUpdateDescriptor(aDataset : TDataset; aBookmark : TBookMark; AData : JSValue; AStatus : TUpdateStatus) : TRecordUpdateDescriptor; virtual;\r\n function GetRecordUpdateBatch(aBatchID: Integer; AList: TRecordUpdateDescriptorList; AOwnsList: Boolean=True): TRecordUpdateBatch; virtual;\r\n // actual calls to do the work. Dataset wi\r\n Function DoGetData(aRequest : TDataRequest) : Boolean; virtual; abstract;\r\n // TDataProxy is responsible for calling OnResolve and if not, Freeing the batch.\r\n Function ProcessUpdateBatch(aBatch : TRecordUpdateBatch): Boolean; virtual; abstract;\r\n end;\r\n\r\nconst\r\n {\r\n TFieldType = (\r\n ftUnknown, ftString, ftInteger, ftLargeInt, ftBoolean, ftFloat, ftDate,\r\n ftTime, ftDateTime, ftAutoInc, ftBlob, ftMemo, ftFixedChar,\r\n ftVariant\r\n );\r\n }\r\n\r\nConst\r\n Fieldtypenames : Array [TFieldType] of String =\r\n (\r\n {ftUnknown} 'Unknown',\r\n {ftString} 'String',\r\n {ftInteger} 'Integer',\r\n {ftLargeint} 'NativeInt',\r\n {ftBoolean} 'Boolean',\r\n {ftFloat} 'Float',\r\n {ftDate} 'Date',\r\n {ftTime} 'Time',\r\n {ftDateTime} 'DateTime',\r\n {ftAutoInc} 'AutoInc',\r\n {ftBlob} 'Blob',\r\n {ftMemo} 'Memo',\r\n {ftFixedChar} 'FixedChar',\r\n {ftVariant} 'Variant',\r\n {ftDataset} 'Dataset',\r\n {ftWideString} 'WideString'\r\n );\r\n\r\n DefaultFieldClasses : Array [TFieldType] of TFieldClass =\r\n (\r\n { ftUnknown} Tfield,\r\n { ftString} TStringField,\r\n { ftInteger} TIntegerField,\r\n { ftLargeint} TLargeIntField,\r\n { ftBoolean} TBooleanField,\r\n { ftFloat} TFloatField,\r\n { ftDate} TDateField,\r\n { ftTime} TTimeField,\r\n { ftDateTime} TDateTimeField,\r\n { ftAutoInc} TAutoIncField,\r\n { ftBlob} TBlobField,\r\n { ftMemo} TMemoField,\r\n { ftFixedChar} TStringField,\r\n { ftVariant} TVariantField,\r\n { ftDataset} Nil,\r\n { ftWideString} TStringField\r\n );\r\n\r\n dsEditModes = [dsEdit, dsInsert, dsSetKey];\r\n dsWriteModes = [dsEdit, dsInsert, dsSetKey, dsCalcFields, dsFilter,\r\n dsNewValue, dsInternalCalc, dsRefreshFields];\r\n // Correct list of all field types that are BLOB types.\r\n // Please use this instead of checking TBlobType which will give\r\n // incorrect results\r\n ftBlobTypes = [ftBlob, ftMemo];\r\n\r\n\r\n{ Auxiliary functions }\r\n\r\nProcedure DatabaseError (Const Msg : String); overload;\r\nProcedure DatabaseError (Const Msg : String; Comp : TComponent); overload;\r\nProcedure DatabaseErrorFmt (Const Fmt : String; Const Args : Array Of JSValue); overload;\r\nProcedure DatabaseErrorFmt (Const Fmt : String; Const Args : Array Of JSValue; Comp : TComponent); overload;\r\nFunction ExtractFieldName(Const Fields: String; var Pos: Integer): String;\r\n\r\n// function SkipComments(var p: PChar; EscapeSlash, EscapeRepeat : Boolean) : boolean;\r\n\r\n// operator Enumerator(ADataSet: TDataSet): TDataSetEnumerator;\r\n \r\nimplementation\r\n\r\nuses DBConst,TypInfo;\r\n\r\n{ ---------------------------------------------------------------------\r\n Auxiliary functions\r\n ---------------------------------------------------------------------}\r\n\r\nProcedure DatabaseError (Const Msg : String);\r\n\r\nbegin\r\n Raise EDataBaseError.Create(Msg);\r\nend;\r\n\r\nProcedure DatabaseError (Const Msg : String; Comp : TComponent);\r\n\r\nbegin\r\n if assigned(Comp) and (Comp.Name <> '') then\r\n Raise EDatabaseError.CreateFmt('%s : %s',[Comp.Name,Msg])\r\n else\r\n DatabaseError(Msg);\r\nend;\r\n\r\nProcedure DatabaseErrorFmt (Const Fmt : String; Const Args : Array Of JSValue);\r\n\r\nbegin\r\n Raise EDatabaseError.CreateFmt(Fmt,Args);\r\nend;\r\n\r\nProcedure DatabaseErrorFmt (Const Fmt : String; Const Args : Array Of JSValue;\r\n Comp : TComponent);\r\nbegin\r\n if assigned(comp) then\r\n Raise EDatabaseError.CreateFmt(Format('%s : %s',[Comp.Name,Fmt]),Args)\r\n else\r\n DatabaseErrorFmt(Fmt, Args);\r\nend;\r\n\r\nfunction ExtractFieldName(const Fields: string; var Pos: Integer): string;\r\nvar\r\n i: Integer;\r\n FieldsLength: Integer;\r\nbegin\r\n i:=Pos;\r\n FieldsLength:=Length(Fields);\r\n while (i<=FieldsLength) and (Fields[i]<>';') do Inc(i);\r\n Result:=Trim(Copy(Fields,Pos,i-Pos));\r\n if (i<=FieldsLength) and (Fields[i]=';') then Inc(i);\r\n Pos:=i;\r\nend;\r\n\r\n{ TRecordUpdateBatch }\r\n\r\nconstructor TRecordUpdateBatch.Create(aBatchID: Integer; AList: TRecordUpdateDescriptorList; AOwnsList : Boolean);\r\nbegin\r\n FBatchID:=aBatchID;\r\n FList:=AList;\r\n FOwnsList:=AOwnsList;\r\n FStatus:=ubsPending;\r\nend;\r\n\r\ndestructor TRecordUpdateBatch.Destroy;\r\nbegin\r\n if OwnsList then\r\n FreeList;\r\n inherited Destroy;\r\nend;\r\n\r\nprocedure TRecordUpdateBatch.FreeList;\r\nbegin\r\n FreeAndNil(FList);\r\nend;\r\n\r\n{ TRecordUpdateDescriptorList }\r\n\r\nfunction TRecordUpdateDescriptorList.GetUpdate(AIndex : Integer): TRecordUpdateDescriptor;\r\nbegin\r\n Result:=TRecordUpdateDescriptor(Items[AIndex]);\r\nend;\r\n\r\n{ TRecordUpdateDescriptor }\r\n\r\nprocedure TRecordUpdateDescriptor.SetResolveStatus(aValue: TResolveStatus);\r\nbegin\r\n FResolveStatus:=AValue;\r\nend;\r\n\r\nprocedure TRecordUpdateDescriptor.Reset;\r\nbegin\r\n FResolveStatus:=rsUnresolved;\r\n FResolveError:='';\r\n FServerData:=Null;\r\nend;\r\n\r\nconstructor TRecordUpdateDescriptor.Create(aProxy: TDataProxy; aDataset: TDataset; aBookmark: TBookMark; AData: JSValue;\r\n AStatus: TUpdateStatus);\r\nbegin\r\n FDataset:=aDataset;\r\n FBookmark:=aBookmark;\r\n FData:=AData;\r\n FStatus:=AStatus;\r\n FProxy:=aProxy;\r\nend;\r\n\r\n\r\nprocedure TRecordUpdateDescriptor.Resolve(aData: JSValue);\r\nbegin\r\n SetResolveStatus(rsResolved);\r\n FServerData:=AData;\r\nend;\r\n\r\nprocedure TRecordUpdateDescriptor.ResolveFailed(aError: String);\r\nbegin\r\n SetResolveStatus(rsResolveFailed);\r\n FResolveError:=AError;\r\nend;\r\n\r\n{ TDataRequest }\r\n\r\nprocedure TDataRequest.DoAfterRequest;\r\nbegin\r\n if Assigned(FAfterRequest) then\r\n FAfterRequest(Self);\r\nend;\r\n\r\nconstructor TDataRequest.Create(aDataProxy : TDataProxy; aOptions: TLoadOptions; aAfterRequest: TDataRequestEvent; aAfterLoad: TDatasetLoadEvent);\r\nbegin\r\n FDataProxy:=aDataProxy;\r\n FLoadOptions:=aOptions;\r\n FEvent:=aAfterLoad;\r\n FAfterRequest:=aAfterRequest;\r\nend;\r\n\r\n{ TDataProxy }\r\n\r\nfunction TDataProxy.GetDataRequestClass: TDataRequestClass;\r\nbegin\r\n Result:=TDataRequest;\r\nend;\r\n\r\nfunction TDataProxy.GetUpdateDescriptorClass: TRecordUpdateDescriptorClass;\r\nbegin\r\n Result:=TRecordUpdateDescriptor;\r\nend;\r\n\r\nfunction TDataProxy.GetUpdateBatchClass: TRecordUpdateBatchClass;\r\nbegin\r\n Result:=TRecordUpdateBatch;\r\nend;\r\n\r\nprocedure TDataProxy.ResolveBatch(aBatch: TRecordUpdateBatch);\r\nbegin\r\n try\r\n If Assigned(ABatch.FOnResolve) then\r\n ABatch.FOnResolve(Self,ABatch);\r\n finally\r\n aBatch.Free;\r\n end;\r\nend;\r\n\r\nfunction TDataProxy.GetDataRequest(aOptions: TLoadOptions; aAfterRequest : TDataRequestEvent; aAfterLoad: TDatasetLoadEvent): TDataRequest;\r\nbegin\r\n Result:=GetDataRequestClass.Create(Self,aOptions,aAfterRequest,aAfterLoad);\r\nend;\r\n\r\nfunction TDataProxy.GetUpdateDescriptor(aDataset : TDataset; aBookmark: TBookMark; AData: JSValue; AStatus: TUpdateStatus): TRecordUpdateDescriptor;\r\nbegin\r\n Result:=GetUpdateDescriptorClass.Create(Self,aDataset, aBookmark,AData,AStatus);\r\nend;\r\n\r\nfunction TDataProxy.GetRecordUpdateBatch(aBatchID: Integer; AList: TRecordUpdateDescriptorList; AOwnsList : Boolean = True): TRecordUpdateBatch;\r\nbegin\r\n Result:=GetUpdateBatchClass.Create(aBatchID,AList,AOwnsList);\r\nend;\r\n\r\n\r\n{ EUpdateError }\r\nconstructor EUpdateError.Create(NativeError, Context : String;\r\n ErrCode, PrevError : integer; E: Exception);\r\n \r\nbegin\r\n Inherited CreateFmt(NativeError,[Context]);\r\n FContext := Context;\r\n FErrorCode := ErrCode;\r\n FPreviousError := PrevError;\r\n FOriginalException := E;\r\nend;\r\n\r\nDestructor EUpdateError.Destroy;\r\n\r\nbegin\r\n FOriginalException.Free;\r\n Inherited;\r\nend;\r\n\r\n{ TNamedItem }\r\n\r\nfunction TNamedItem.GetDisplayName: string;\r\nbegin\r\n Result := FName;\r\nend;\r\n\r\nprocedure TNamedItem.SetDisplayName(const Value: string);\r\nVar TmpInd : Integer;\r\nbegin\r\n if FName=Value then exit;\r\n if (Value <> '') and (Collection is TFieldDefs ) then\r\n begin\r\n TmpInd := (TDefCollection(Collection).IndexOf(Value));\r\n if (TmpInd >= 0) and (TmpInd <> Index) then\r\n DatabaseErrorFmt(SDuplicateName, [Value, Collection.ClassName]);\r\n end;\r\n FName:=Value;\r\n inherited SetDisplayName(Value);\r\nend;\r\n\r\n{ TDefCollection }\r\n\r\nprocedure TDefCollection.SetItemName(Item: TCollectionItem);\r\n\r\nVar\r\n N : TNamedItem;\r\n TN : String;\r\n\r\nbegin\r\n N:=Item as TNamedItem;\r\n if N.Name = '' then\r\n begin\r\n TN:=Copy(ClassName, 2, 5) + IntToStr(N.ID+1);\r\n if assigned(Dataset) then\r\n TN:=Dataset.Name+TN;\r\n N.Name:=TN;\r\n end\r\n else\r\n inherited SetItemName(Item);\r\nend;\r\n\r\nconstructor TDefCollection.create(ADataset: TDataset; AOwner: TPersistent;\r\n AClass: TCollectionItemClass);\r\nbegin\r\n inherited Create(AOwner,AClass);\r\n FDataset := ADataset;\r\nend;\r\n\r\nfunction TDefCollection.Find(const AName: string): TNamedItem;\r\nvar i: integer;\r\nbegin\r\n Result := Nil;\r\n for i := 0 to Count - 1 do\r\n if AnsiSameText(TNamedItem(Items[i]).Name, AName) then\r\n begin\r\n Result := TNamedItem(Items[i]);\r\n Break;\r\n end;\r\nend;\r\n\r\nprocedure TDefCollection.GetItemNames(List: TStrings);\r\nvar i: LongInt;\r\nbegin\r\n for i := 0 to Count - 1 do\r\n List.Add(TNamedItem(Items[i]).Name);\r\nend;\r\n\r\nfunction TDefCollection.IndexOf(const AName: string): Longint;\r\nvar i: LongInt;\r\nbegin\r\n Result := -1;\r\n for i := 0 to Count - 1 do\r\n if AnsiSameText(TNamedItem(Items[i]).Name, AName) then\r\n begin\r\n Result := i;\r\n Break;\r\n end;\r\nend;\r\n\r\n{ TIndexDef }\r\n\r\nprocedure TIndexDef.SetDescFields(const AValue: string);\r\nbegin\r\n if FDescFields=AValue then exit;\r\n if AValue <> '' then FOptions:=FOptions + [ixDescending];\r\n FDescFields:=AValue;\r\nend;\r\n\r\nprocedure TIndexDef.Assign(Source: TPersistent);\r\nvar idef : TIndexDef;\r\nbegin\r\n idef := nil;\r\n if Source is TIndexDef then\r\n idef := Source as TIndexDef;\r\n if Assigned(idef) then\r\n begin\r\n FName := idef.Name;\r\n FFields := idef.Fields;\r\n FOptions := idef.Options;\r\n FCaseinsFields := idef.CaseInsFields;\r\n FDescFields := idef.DescFields;\r\n FSource := idef.Source;\r\n FExpression := idef.Expression;\r\n end\r\n else\r\n inherited Assign(Source);\r\nend;\r\n\r\nfunction TIndexDef.GetExpression: string;\r\nbegin\r\n Result := FExpression;\r\nend;\r\n\r\nprocedure TIndexDef.SetExpression(const AValue: string);\r\nbegin\r\n FExpression := AValue;\r\nend;\r\n\r\nprocedure TIndexDef.SetCaseInsFields(const AValue: string);\r\nbegin\r\n if FCaseinsFields=AValue then exit;\r\n if AValue <> '' then FOptions:=FOptions + [ixCaseInsensitive];\r\n FCaseinsFields:=AValue;\r\nend;\r\n\r\nconstructor TIndexDef.Create(Owner: TIndexDefs; const AName, TheFields: string;\r\n TheOptions: TIndexOptions);\r\n\r\nbegin\r\n FName := aname;\r\n inherited create(Owner);\r\n FFields := TheFields;\r\n FOptions := TheOptions;\r\nend;\r\n\r\n\r\n{ TIndexDefs }\r\n\r\nFunction TIndexDefs.GetItem (Index : integer) : TIndexDef;\r\n\r\nbegin\r\n Result:=(Inherited GetItem(Index)) as TIndexDef;\r\nend;\r\n\r\nProcedure TIndexDefs.SetItem(Index: Integer; Value: TIndexDef);\r\nbegin\r\n Inherited SetItem(Index,Value);\r\nend;\r\n\r\nconstructor TIndexDefs.Create(ADataSet: TDataSet);\r\n\r\nbegin\r\n inherited create(ADataset, Owner, TIndexDef);\r\nend;\r\n\r\n\r\nFunction TIndexDefs.AddIndexDef: TIndexDef;\r\n\r\nbegin\r\n// Result := inherited add as TIndexDef;\r\n Result:=TIndexDefClass(Self.ItemClass).Create(Self,'','',[]);\r\nend;\r\n\r\nprocedure TIndexDefs.Add(const Name, Fields: string; Options: TIndexOptions);\r\n\r\nbegin\r\n TIndexDefClass(Self.ItemClass).Create(Self,Name,Fields,Options);\r\nend;\r\n\r\nfunction TIndexDefs.Find(const IndexName: string): TIndexDef;\r\nbegin\r\n Result := (inherited Find(IndexName)) as TIndexDef;\r\n if (Result=Nil) Then\r\n DatabaseErrorFmt(SIndexNotFound, [IndexName], FDataSet);\r\nend;\r\n\r\nfunction TIndexDefs.FindIndexForFields(const Fields: string): TIndexDef;\r\n\r\nbegin\r\n //!! To be implemented\r\n Result:=nil;\r\nend;\r\n\r\n\r\nfunction TIndexDefs.GetIndexForFields(const Fields: string;\r\n CaseInsensitive: Boolean): TIndexDef;\r\n\r\nvar\r\n i, FieldsLen: integer;\r\n Last: TIndexDef;\r\nbegin\r\n Last := nil;\r\n FieldsLen := Length(Fields);\r\n for i := 0 to Count - 1 do\r\n begin\r\n Result := Items[I];\r\n if (Result.Options * [ixDescending, ixExpression] = []) and\r\n (not CaseInsensitive or (ixCaseInsensitive in Result.Options)) and\r\n AnsiSameText(Fields, Result.Fields) then\r\n begin\r\n Exit;\r\n end else\r\n if AnsiSameText(Fields, Copy(Result.Fields, 1, FieldsLen)) and\r\n ((Length(Result.Fields) = FieldsLen) or\r\n (Result.Fields[FieldsLen + 1] = ';')) then\r\n begin\r\n if (Last = nil) or\r\n ((Last <> nil) And (Length(Last.Fields) > Length(Result.Fields))) then\r\n Last := Result;\r\n end;\r\n end;\r\n Result := Last;\r\nend;\r\n\r\nprocedure TIndexDefs.Update;\r\n\r\nbegin\r\n if (not updated) and assigned(Dataset) then\r\n begin\r\n Dataset.UpdateIndexDefs;\r\n updated := True;\r\n end;\r\nend;\r\n\r\n{ TCheckConstraint }\r\n\r\nprocedure TCheckConstraint.Assign(Source: TPersistent);\r\n\r\nbegin\r\n //!! To be implemented\r\nend;\r\n\r\n\r\n\r\n{ TCheckConstraints }\r\n\r\nFunction TCheckConstraints.GetItem(Index : Longint) : TCheckConstraint;\r\n\r\nbegin\r\n //!! To be implemented\r\n Result := nil;\r\nend;\r\n\r\n\r\nProcedure TCheckConstraints.SetItem(index : Longint; Value : TCheckConstraint);\r\n\r\nbegin\r\n //!! To be implemented\r\nend;\r\n\r\n\r\nfunction TCheckConstraints.GetOwner: TPersistent;\r\n\r\nbegin\r\n //!! To be implemented\r\n Result := nil;\r\nend;\r\n\r\n\r\nconstructor TCheckConstraints.Create(AOwner: TPersistent);\r\n\r\nbegin\r\n //!! To be implemented\r\n inherited Create(TCheckConstraint);\r\nend;\r\n\r\n\r\nfunction TCheckConstraints.Add: TCheckConstraint;\r\n\r\nbegin\r\n //!! To be implemented\r\n Result := nil;\r\nend;\r\n\r\n{ TLookupList }\r\n\r\nconstructor TLookupList.Create;\r\n\r\nbegin\r\n FList := TFPList.Create;\r\nend;\r\n\r\ndestructor TLookupList.Destroy;\r\n\r\nbegin\r\n Clear;\r\n FList.Destroy;\r\n inherited Destroy;\r\nend;\r\n\r\nprocedure TLookupList.Add(const AKey, AValue: JSValue);\r\n\r\nvar LookupRec: TJSObject;\r\n\r\nbegin\r\n LookupRec:=New(['Key',AKey,'Value',AValue]);\r\n FList.Add(LookupRec);\r\nend;\r\n\r\nprocedure TLookupList.Clear;\r\n\r\nbegin\r\n FList.Clear;\r\nend;\r\n\r\nfunction TLookupList.FirstKeyByValue(const AValue: JSValue): JSValue;\r\nvar\r\n i: Integer;\r\nbegin\r\n for i := 0 to FList.Count - 1 do\r\n with TJSObject(FList[i]) do\r\n if Properties['Value'] = AValue then\r\n begin\r\n Result := Properties['Key'];\r\n exit;\r\n end;\r\n Result := Null;\r\nend;\r\n\r\nfunction TLookupList.ValueOfKey(const AKey: JSValue): JSValue;\r\n\r\n Function VarArraySameValues(VarArray1,VarArray2 : TJSValueDynArray) : Boolean;\r\n // This only works for one-dimensional vararrays with a lower bound of 0\r\n // and equal higher bounds wich only contains JSValues.\r\n // The vararrays returned by GetFieldValues do apply.\r\n var i : integer;\r\n begin\r\n Result := True;\r\n if (Length(VarArray1)<>Length(VarArray2)) then\r\n exit;\r\n for i := 0 to Length(VarArray1) do\r\n begin\r\n if VarArray1[i]<>VarArray2[i] then\r\n begin\r\n Result := false;\r\n Exit;\r\n end;\r\n end;\r\n end;\r\n\r\nvar I: Integer;\r\nbegin\r\n Result := Null;\r\n if IsNull(AKey) then Exit;\r\n i := FList.Count - 1;\r\n if IsArray(AKey) then\r\n while (i >= 0) And not VarArraySameValues(TJSValueDynArray(TJSOBject(FList.Items[I]).Properties['Key']),TJSValueDynArray(AKey)) do Dec(i)\r\n else\r\n while (i >= 0) And (TJSObject(FList[I]).Properties['Key'] <> AKey) do Dec(i);\r\n if i >= 0 then Result := TJSObject(FList[I]).Properties['Value'];\r\nend;\r\n\r\nprocedure TLookupList.ValuesToStrings(AStrings: TStrings);\r\n\r\nvar\r\n i: Integer;\r\n p: TJSObject;\r\n\r\nbegin\r\n AStrings.Clear;\r\n for i := 0 to FList.Count - 1 do\r\n begin\r\n p := TJSObject(FList[i]);\r\n AStrings.AddObject(String(p.properties['Value']), TObject(p));\r\n end;\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n TDataSet\r\n ---------------------------------------------------------------------}\r\n\r\nConst\r\n DefaultBufferCount = 10;\r\n\r\nconstructor TDataSet.Create(AOwner: TComponent);\r\n\r\nbegin\r\n Inherited Create(AOwner);\r\n FFieldDefs:=FieldDefsClass.Create(Self);\r\n FFieldList:=FieldsClass.Create(Self);\r\n FDataSources:=TFPList.Create;\r\n FConstraints:=TCheckConstraints.Create(Self);\r\n SetLength(FBuffers,1);\r\n FActiveRecord := 0;\r\n FEOF := True;\r\n FBOF := True;\r\n FIsUniDirectional := False;\r\n FAutoCalcFields := True;\r\n FDataRequestID:=0;\r\nend;\r\n\r\n\r\n\r\ndestructor TDataSet.Destroy;\r\n\r\nvar\r\n i: Integer;\r\n\r\nbegin\r\n Active:=False;\r\n FFieldDefs.Free;\r\n FFieldList.Free;\r\n With FDataSources do\r\n begin\r\n While Count>0 do\r\n TDataSource(Items[Count - 1]).DataSet:=Nil;\r\n Destroy;\r\n end;\r\n for i := 0 to FBufferCount do\r\n FreeRecordBuffer(FBuffers[i]);\r\n FConstraints.Free;\r\n SetLength(FBuffers,1);\r\n Inherited Destroy;\r\nend;\r\n\r\n// This procedure must be called when the first record is made/read\r\nprocedure TDataSet.ActivateBuffers;\r\n\r\nbegin\r\n FBOF:=False;\r\n FEOF:=False;\r\n FActiveRecord:=0;\r\nend;\r\n\r\nprocedure TDataSet.BindFields(Binding: Boolean);\r\n\r\nvar i, FieldIndex: Integer;\r\n FieldDef: TFieldDef;\r\n Field: TField;\r\n\r\nbegin\r\n { FieldNo is set to -1 for calculated/lookup fields, to 0 for unbound field\r\n and for bound fields it is set to FieldDef.FieldNo }\r\n FCalcFieldsCount := 0;\r\n FBlobFieldCount := 0;\r\n for i := 0 to Fields.Count - 1 do\r\n begin\r\n Field := Fields[i];\r\n Field.FFieldDef := Nil;\r\n if not Binding then\r\n Field.FFieldNo := 0\r\n else if Field.FieldKind in [fkCalculated, fkLookup] then\r\n begin\r\n Field.FFieldNo := -1;\r\n Inc(FCalcFieldsCount);\r\n end\r\n else\r\n begin\r\n FieldIndex := FieldDefs.IndexOf(Field.FieldName);\r\n if FieldIndex = -1 then\r\n DatabaseErrorFmt(SFieldNotFound,[Field.FieldName],Self)\r\n else\r\n begin\r\n FieldDef := FieldDefs[FieldIndex];\r\n Field.FFieldDef := FieldDef;\r\n Field.FFieldNo := FieldDef.FieldNo;\r\n if FieldDef.InternalCalcField then\r\n FInternalCalcFields := True;\r\n if Field.IsBlob then\r\n begin\r\n Field.FSize := FieldDef.Size;\r\n Inc(FBlobFieldCount);\r\n end;\r\n // synchronize CodePage between TFieldDef and TField\r\n // character data in record buffer and field buffer should have same CodePage\r\n end;\r\n end;\r\n Field.Bind(Binding);\r\n end;\r\nend;\r\n\r\nfunction TDataSet.BookmarkAvailable: Boolean;\r\n\r\nConst BookmarkStates = [dsBrowse,dsEdit,dsInsert];\r\n\r\nbegin\r\n Result:=(Not IsEmpty) and not FIsUniDirectional and (State in BookmarkStates)\r\n and (getBookMarkFlag(ActiveBuffer)=bfCurrent);\r\nend;\r\n\r\nprocedure TDataSet.CalculateFields(var Buffer: TDataRecord);\r\nvar\r\n i: Integer;\r\n OldState: TDatasetState;\r\nbegin\r\n FCalcBuffer := Buffer; \r\n if FState <> dsInternalCalc then\r\n begin\r\n OldState := FState;\r\n FState := dsCalcFields;\r\n try\r\n ClearCalcFields(FCalcBuffer);\r\n if not IsUniDirectional then\r\n for i := 0 to FFieldList.Count - 1 do\r\n if FFieldList[i].FieldKind = fkLookup then\r\n FFieldList[i].CalcLookupValue;\r\n finally\r\n DoOnCalcFields;\r\n FState := OldState;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TDataSet.CheckActive;\r\n\r\nbegin\r\n If Not Active then\r\n DataBaseError(SInactiveDataset,Self);\r\nend;\r\n\r\nprocedure TDataSet.CheckInactive;\r\n\r\nbegin\r\n If Active then\r\n DataBaseError(SActiveDataset,Self);\r\nend;\r\n\r\nprocedure TDataSet.ClearBuffers;\r\n\r\nbegin\r\n FRecordCount:=0;\r\n FActiveRecord:=0;\r\n FCurrentRecord:=-1;\r\n FBOF:=True;\r\n FEOF:=True;\r\nend;\r\n\r\nprocedure TDataSet.ClearCalcFields(var Buffer: TDataRecord);\r\n\r\nbegin\r\n // Empty\r\nend;\r\n\r\nprocedure TDataSet.CloseBlob(Field: TField);\r\n\r\nbegin\r\n //!! To be implemented\r\nend;\r\n\r\nprocedure TDataSet.CloseCursor;\r\n\r\nbegin\r\n ClearBuffers;\r\n SetBufListSize(0);\r\n Fields.ClearFieldDefs;\r\n InternalClose;\r\n FInternalOpenComplete := False;\r\nend;\r\n\r\nprocedure TDataSet.CreateFields;\r\n\r\nVar I : longint;\r\n\r\nbegin\r\n{$ifdef DSDebug}\r\n Writeln ('Creating fields');\r\n Writeln ('Count : ',fielddefs.Count);\r\n For I:=0 to FieldDefs.Count-1 do\r\n Writeln('Def ',I,' : ',Fielddefs.items[i].Name,'(',Fielddefs.items[i].FieldNo,')');\r\n{$endif}\r\n For I:=0 to FieldDefs.Count-1 do\r\n With FieldDefs.Items[I] do\r\n If DataType<>ftUnknown then\r\n begin\r\n {$ifdef DSDebug}\r\n Writeln('About to create field ',FieldDefs.Items[i].Name);\r\n {$endif}\r\n CreateField(self);\r\n end;\r\nend;\r\n\r\nprocedure TDataSet.DataEvent(Event: TDataEvent; Info: JSValue);\r\n\r\n procedure HandleFieldChange(aField: TField);\r\n begin\r\n if aField.FieldKind in [fkData, fkInternalCalc] then\r\n SetModified(True);\r\n \r\n if State <> dsSetKey then begin\r\n if aField.FieldKind = fkData then begin\r\n if FInternalCalcFields then\r\n RefreshInternalCalcFields(FBuffers[FActiveRecord])\r\n else if FAutoCalcFields and (FCalcFieldsCount <> 0) then\r\n CalculateFields(FBuffers[FActiveRecord]);\r\n end;\r\n aField.Change;\r\n end;\r\n end;\r\n \r\n procedure HandleScrollOrChange;\r\n begin\r\n if State <> dsInsert then\r\n UpdateCursorPos;\r\n end;\r\n\r\nvar\r\n i: Integer;\r\nbegin\r\n case Event of\r\n deFieldChange : HandleFieldChange(TField(Info));\r\n deDataSetChange,\r\n deDataSetScroll : HandleScrollOrChange;\r\n deLayoutChange : FEnableControlsEvent:=deLayoutChange; \r\n end;\r\n\r\n if not ControlsDisabled and (FState <> dsBlockRead) then begin\r\n for i := 0 to FDataSources.Count - 1 do\r\n TDataSource(FDataSources[i]).ProcessEvent(Event, Info);\r\n end;\r\nend;\r\n\r\nprocedure TDataSet.DestroyFields;\r\n\r\nbegin\r\n FFieldList.Clear;\r\nend;\r\n\r\nprocedure TDataSet.DoAfterCancel;\r\n\r\nbegin\r\n If assigned(FAfterCancel) then\r\n FAfterCancel(Self);\r\nend;\r\n\r\nprocedure TDataSet.DoAfterClose;\r\n\r\nbegin\r\n If assigned(FAfterClose) and not (csDestroying in ComponentState) then\r\n FAfterClose(Self);\r\nend;\r\n\r\nprocedure TDataSet.DoAfterDelete;\r\n\r\nbegin\r\n If assigned(FAfterDelete) then\r\n FAfterDelete(Self);\r\nend;\r\n\r\nprocedure TDataSet.DoAfterEdit;\r\n\r\nbegin\r\n If assigned(FAfterEdit) then\r\n FAfterEdit(Self);\r\nend;\r\n\r\nprocedure TDataSet.DoAfterInsert;\r\n\r\nbegin\r\n If assigned(FAfterInsert) then\r\n FAfterInsert(Self);\r\nend;\r\n\r\nprocedure TDataSet.DoAfterOpen;\r\n\r\nbegin\r\n If assigned(FAfterOpen) then\r\n FAfterOpen(Self);\r\nend;\r\n\r\nprocedure TDataSet.DoAfterPost;\r\n\r\nbegin\r\n If assigned(FAfterPost) then\r\n FAfterPost(Self);\r\nend;\r\n\r\nprocedure TDataSet.DoAfterScroll;\r\n\r\nbegin\r\n If assigned(FAfterScroll) then\r\n FAfterScroll(Self);\r\nend;\r\n\r\nprocedure TDataSet.DoAfterRefresh;\r\n\r\nbegin\r\n If assigned(FAfterRefresh) then\r\n FAfterRefresh(Self);\r\nend;\r\n\r\nprocedure TDataSet.DoBeforeCancel;\r\n\r\nbegin\r\n If assigned(FBeforeCancel) then\r\n FBeforeCancel(Self);\r\nend;\r\n\r\nprocedure TDataSet.DoBeforeClose;\r\n\r\nbegin\r\n If assigned(FBeforeClose) and not (csDestroying in ComponentState) then\r\n FBeforeClose(Self);\r\nend;\r\n\r\nprocedure TDataSet.DoBeforeDelete;\r\n\r\nbegin\r\n If assigned(FBeforeDelete) then\r\n FBeforeDelete(Self);\r\nend;\r\n\r\nprocedure TDataSet.DoBeforeEdit;\r\n\r\nbegin\r\n If assigned(FBeforeEdit) then\r\n FBeforeEdit(Self);\r\nend;\r\n\r\nprocedure TDataSet.DoBeforeInsert;\r\n\r\nbegin\r\n If assigned(FBeforeInsert) then\r\n FBeforeInsert(Self);\r\nend;\r\n\r\nprocedure TDataSet.DoBeforeOpen;\r\n\r\nbegin\r\n If assigned(FBeforeOpen) then\r\n FBeforeOpen(Self);\r\nend;\r\n\r\nprocedure TDataSet.DoBeforePost;\r\n\r\nbegin\r\n If assigned(FBeforePost) then\r\n FBeforePost(Self);\r\nend;\r\n\r\nprocedure TDataSet.DoBeforeScroll;\r\n\r\nbegin\r\n If assigned(FBeforeScroll) then\r\n FBeforeScroll(Self);\r\nend;\r\n\r\nprocedure TDataSet.DoBeforeRefresh;\r\n\r\nbegin\r\n If assigned(FBeforeRefresh) then\r\n FBeforeRefresh(Self);\r\nend;\r\n\r\nprocedure TDataSet.DoInternalOpen;\r\n\r\nbegin\r\n InternalOpen;\r\n FInternalOpenComplete := True;\r\n{$ifdef dsdebug}\r\n Writeln ('Calling internal open');\r\n{$endif}\r\n{$ifdef dsdebug}\r\n Writeln ('Calling RecalcBufListSize');\r\n{$endif}\r\n FRecordCount := 0;\r\n RecalcBufListSize;\r\n FBOF := True;\r\n FEOF := (FRecordCount = 0);\r\n if Assigned(DataProxy) then\r\n InitChangeList;\r\nend;\r\n\r\nprocedure TDataSet.DoOnCalcFields;\r\n\r\nbegin\r\n If Assigned(FOnCalcfields) then\r\n FOnCalcFields(Self);\r\nend;\r\n\r\nprocedure TDataSet.DoOnNewRecord;\r\n\r\nbegin\r\n If assigned(FOnNewRecord) then\r\n FOnNewRecord(Self);\r\nend;\r\n\r\nprocedure TDataSet.DoBeforeLoad;\r\nbegin\r\n If Assigned(FBeforeLoad) then\r\n FBeforeLoad(Self);\r\nend;\r\n\r\nprocedure TDataSet.DoAfterLoad;\r\nbegin\r\n if Assigned(FAfterLoad) then\r\n FAfterLoad(Self);\r\nend;\r\n\r\nprocedure TDataSet.DoBeforeApplyUpdates;\r\n\r\nbegin\r\n If Assigned(FBeforeApplyUpdates) then\r\n FBeforeApplyUpdates(Self);\r\nend;\r\n\r\nprocedure TDataSet.DoAfterApplyUpdates(const ResolveInfo: TResolveResults);\r\n\r\nbegin\r\n If Assigned(FAfterApplyUpdates) then\r\n FAfterApplyUpdates(Self,ResolveInfo);\r\nend;\r\n\r\nfunction TDataSet.FieldByNumber(FieldNo: Longint): TField;\r\n\r\nbegin\r\n Result:=FFieldList.FieldByNumber(FieldNo);\r\nend;\r\n\r\nfunction TDataSet.FindRecord(Restart, GoForward: Boolean): Boolean;\r\n\r\nbegin\r\n //!! To be implemented\r\n Result:=false;\r\nend;\r\n\r\n\r\nfunction TDataSet.GetBookmarkStr: TBookmarkStr;\r\n\r\nVar\r\n B : TBookMark;\r\n\r\nbegin\r\n Result:='';\r\n If BookMarkAvailable then\r\n begin\r\n GetBookMarkData(ActiveBuffer,B);\r\n Result:=TJSJSON.stringify(B);\r\n end\r\nend;\r\n\r\nfunction TDataSet.GetBuffer(Index: longint): TDataRecord;\r\n\r\nbegin\r\n Result:=FBuffers[Index];\r\nend;\r\n\r\nfunction TDataSet.DoGetDataProxy: TDataProxy;\r\n\r\nbegin\r\n Result:=nil;\r\nend;\r\n\r\nprocedure TDataSet.InitChangeList;\r\n\r\nbegin\r\n DoneChangeList;\r\n FChangeList:=TFPList.Create;\r\nend;\r\n\r\nprocedure TDataSet.ClearChangeList;\r\n\r\nVar\r\n I : integer;\r\n\r\nbegin\r\n If not Assigned(FChangeList) then\r\n exit;\r\n For I:=0 to FChangeList.Count-1 do\r\n begin\r\n TObject(FChangeList[i]).Destroy;\r\n FChangeList[i]:=Nil;\r\n end;\r\nend;\r\n\r\nprocedure TDataSet.ResetUpdateDescriptors;\r\n\r\nVar\r\n I : Integer;\r\n\r\nbegin\r\n For I:=0 to FChangeList.Count-1 do\r\n TRecordUpdateDescriptor(FChangeList[i]).Reset;\r\nend;\r\n\r\nfunction TDataSet.IndexInChangeList(aBookmark: TBookmark): Integer;\r\n\r\nbegin\r\n Result:=-1;\r\n if Not assigned(FChangeList) then\r\n exit;\r\n Result:=FChangeList.Count-1;\r\n While (Result>=0) and (CompareBookmarks(aBookMark,TRecordUpdateDescriptor(FChangeList[Result]).Bookmark)<>0) do\r\n Dec(Result);\r\nend;\r\n\r\nfunction TDataSet.AddToChangeList(aChange: TUpdateStatus): TRecordUpdateDescriptor;\r\n\r\nVar\r\n B : TBookmark;\r\n I : Integer;\r\n\r\nbegin\r\n Result:=Nil;\r\n if Not Assigned(FChangeList) then\r\n Exit;\r\n B:=GetBookmark;\r\n I:=IndexInChangeList(B);\r\n if (I=-1) then\r\n begin\r\n if Assigned(DataProxy) then\r\n Result:=DataProxy.GetUpdateDescriptor(Self,B,ActiveBuffer.data,aChange)\r\n else\r\n Result:=TRecordUpdateDescriptor.Create(Nil,Self,B,ActiveBuffer.data,aChange);\r\n FChangeList.Add(Result);\r\n end\r\n else\r\n begin\r\n Result:=TRecordUpdateDescriptor(FChangeList[i]);\r\n Case aChange of\r\n usDeleted : Result.FStatus:=usDeleted;\r\n usInserted : DatabaseError(SErrInsertingSameRecordtwice,Self);\r\n usModified : Result.FData:=ActiveBuffer.Data;\r\n end\r\n end;\r\nend;\r\n\r\nprocedure TDataSet.RemoveFromChangeList(R: TRecordUpdateDescriptor);\r\n\r\nbegin\r\n if Not (Assigned(R) and Assigned(FChangeList)) then\r\n Exit;\r\nend;\r\n\r\nfunction TDataSet.GetRecordUpdates(AList: TRecordUpdateDescriptorList): Integer;\r\n\r\nVar\r\n I,MinIndex : integer;\r\n\r\nbegin\r\n MinIndex:=0; // Check batch list for minimal index ?\r\n For I:=MinIndex to FChangeList.Count-1 do\r\n if TRecordUpdateDescriptor(FChangeList[i]).ResolveStatus=rsUnResolved then\r\n Alist.Add(FChangeList[i]);\r\n Result:=FChangeList.Count;\r\nend;\r\n\r\nfunction TDataSet.ResolveRecordUpdate(anUpdate: TRecordUpdateDescriptor): Boolean;\r\n\r\n// This must return true if the record may be removed from the list of 'modified' records.\r\n// If it returns false, the record is kept in the list of modified records.\r\n\r\nbegin\r\n try\r\n Result:=DoResolveRecordUpdate(anUpdate);\r\n If not Result then\r\n anUpdate.SetResolveStatus(rsResolveFailed);\r\n except\r\n On E : Exception do\r\n begin\r\n anUpdate.ResolveFailed(E.Classname+': '+E.Message);\r\n Result:=False;\r\n end;\r\n end;\r\n DoOnRecordResolved(anUpdate);\r\nend;\r\n\r\nfunction TDataSet.RecordUpdateDescriptorToResolveInfo(anUpdate: TRecordUpdateDescriptor): TResolveInfo;\r\n\r\nbegin\r\n Result.BookMark:=anUpdate.Bookmark;\r\n Result.Data:=anUpdate.Data;\r\n Result.Status:=anUpdate.Status;\r\n Result.Error:=anUpdate.ResolveError;\r\nend;\r\n\r\nprocedure TDataSet.DoOnRecordResolved(anUpdate: TRecordUpdateDescriptor) ;\r\n\r\nVar\r\n Info : TResolveInfo;\r\n\r\nbegin\r\n if Not Assigned(OnRecordResolved) then exit;\r\n Info:=RecordUpdateDescriptorToResolveInfo(anUpdate);\r\n OnRecordResolved(Self,Info);\r\nend;\r\n\r\nprocedure TDataSet.ResolveUpdateBatch(Sender: TObject; aBatch : TRecordUpdateBatch);\r\n\r\nVar\r\n BI,RI,Idx: integer;\r\n RUD : TRecordUpdateDescriptor;\r\n doRemove : Boolean;\r\n Results : TResolveResults;\r\n\r\nbegin\r\n if Assigned(FBatchList) and (aBatch.Dataset=Self) then\r\n BI:=FBatchList.IndexOf(aBatch)\r\n else\r\n BI:=-1;\r\n if (BI=-1) then\r\n Exit;\r\n FBatchList.Delete(Bi);\r\n SetLength(Results.Records, aBatch.List.Count);\r\n For RI:=0 to aBatch.List.Count-1 do\r\n begin\r\n RUD:=aBatch.List[RI];\r\n Results.Records[RI]:=RecordUpdateDescriptorToResolveInfo(RUD);\r\n aBatch.List.Items[RI]:=Nil;\r\n Idx:=IndexInChangeList(RUD.Bookmark);\r\n if (Idx<>-1) then\r\n begin\r\n doRemove:=False;\r\n if (RUD.ResolveStatus=rsResolved) then\r\n DoRemove:=ResolveRecordUpdate(RUD)\r\n else\r\n // What if not resolvable.. ?\r\n DoRemove:=(RUD.ResolveStatus=rsResolved);\r\n If DoRemove then\r\n begin\r\n RUD.Free;\r\n FChangeList.Delete(Idx);\r\n end\r\n else\r\n RUD.Reset; // So we try it again in next applyupdates.\r\n end;\r\n end;\r\n if (FBatchList.Count=0) then\r\n FreeAndNil(FBatchList);\r\n DoAfterApplyUpdates(Results);\r\nend;\r\n\r\nprocedure TDataSet.DoApplyUpdates;\r\n\r\nVar\r\n B : TRecordUpdateBatch;\r\n l : TRecordUpdateDescriptorList;\r\n I : integer;\r\n\r\nbegin\r\n if Not Assigned(DataProxy) then\r\n DatabaseError(SErrDoApplyUpdatesNeedsProxy,Self);\r\n if FInApplyupdates then\r\n exit;\r\n try\r\n FInApplyupdates:=True;\r\n if Not (Assigned(FChangeList) and (FChangeList.Count>0)) then\r\n Exit;\r\n L:=TRecordUpdateDescriptorList.Create;\r\n try\r\n I:=GetRecordUpdates(L);\r\n except\r\n L.Free;\r\n Raise;\r\n end;\r\n Inc(FUpdateBatchID);\r\n For I:=0 to L.Count-1 do\r\n TRecordUpdateDescriptor(L[i]).SetResolveStatus(rsResolving);\r\n B:=DataProxy.GetRecordUpdateBatch(FUpdateBatchID,L,True);\r\n B.FDataset:=Self;\r\n B.FLastChangeIndex:=I;\r\n B.OnResolve:=@ResolveUpdateBatch;\r\n If not Assigned(FBatchlist) then\r\n FBatchlist:=TFPList.Create;\r\n FBatchList.Add(B);\r\n DataProxy.ProcessUpdateBatch(B);\r\n Finally\r\n FInApplyupdates:=False;\r\n end;\r\nend;\r\n\r\nprocedure TDataSet.DoneChangeList;\r\n\r\nbegin\r\n ClearChangeList;\r\n FreeAndNil(FChangeList);\r\nend;\r\n\r\nfunction TDataSet.GetDataProxy: TDataProxy;\r\n\r\nbegin\r\n If (FDataProxy=Nil) then\r\n DataProxy:=DoGetDataProxy;\r\n Result:=FDataProxy;\r\nend;\r\n\r\nfunction TDataSet.GetIsLoading: Boolean;\r\nbegin\r\n// Writeln(Name,' GetIsLoading Loadcount : ',LoadCount);\r\n Result:=(FLoadCount>0);\r\nend;\r\n\r\nfunction TDataSet.DataPacketReceived(ARequest: TDataRequest): Boolean;\r\n\r\nbegin\r\n Result:=False;\r\nend;\r\n\r\nprocedure TDataSet.HandleRequestResponse(ARequest: TDataRequest);\r\n\r\nVar\r\n DataAdded : Boolean;\r\n\r\nbegin\r\n if Not Assigned(ARequest) then\r\n exit;\r\n// Writeln(Name,' Check request response: ',ARequest.FRequestID,', min: ',FMinLoadID,' Loadcount:',FLoadCount);\r\n if ARequest.FRequestID<=FMinLoadID then\r\n begin\r\n ARequest.Destroy;\r\n Exit;\r\n end;\r\n Dec(FloadCount);\r\n// Writeln(Name,' Handle request response: ',ARequest.FRequestID,', min: ',FMinLoadID,' Loadcount:',FLoadCount);\r\n Case ARequest.Success of\r\n rrFail:\r\n begin\r\n if Assigned(FOnLoadFail) then\r\n FOnLoadFail(Self,aRequest.RequestID,aRequest.ErrorMsg);\r\n end;\r\n rrEOF,\r\n rrOK :\r\n begin\r\n DataAdded:=False;\r\n // Notify caller\r\n if Assigned(ARequest.Event) then\r\n ARequest.Event(Self,aRequest.Data);\r\n // allow descendent to integrate data.\r\n // Must be done before user is notified or dataset is opened...\r\n if (ARequest.Success<>rrEOF) then\r\n DataAdded:=DataPacketReceived(aRequest);\r\n // Open if needed.\r\n if Not (Active or (loNoOpen in aRequest.LoadOptions)) then\r\n begin\r\n // Notify user\r\n if not (loNoEvents in aRequest.LoadOptions) then\r\n DoAfterLoad;\r\n Open\r\n end\r\n else\r\n begin\r\n if (loAtEOF in aRequest.LoadOptions) and DataAdded then\r\n FEOF:=False;\r\n if not (loNoEvents in aRequest.LoadOptions) then\r\n DoAfterLoad;\r\n end;\r\n end;\r\n end;\r\n aRequest.Destroy;\r\nend;\r\n\r\nfunction TDataSet.DoResolveRecordUpdate(anUpdate: TRecordUpdateDescriptor): Boolean;\r\nbegin\r\n Result:=True;\r\nend;\r\n\r\nprocedure TDataSet.GetCalcFields(var Buffer: TDataRecord);\r\n\r\nbegin\r\n if (FCalcFieldsCount > 0) or FInternalCalcFields then\r\n CalculateFields(Buffer);\r\nend;\r\n\r\nfunction TDataSet.GetCanModify: Boolean;\r\n\r\nbegin\r\n Result:= not FIsUnidirectional;\r\nend;\r\n\r\nprocedure TDataSet.GetChildren(Proc: TGetChildProc; Root: TComponent);\r\n\r\nvar\r\n I: Integer;\r\n Field: TField;\r\n\r\nbegin\r\n for I := 0 to Fields.Count - 1 do begin\r\n Field := Fields[I];\r\n if (Field.Owner = Root) then\r\n Proc(Field);\r\n end;\r\nend;\r\n\r\nfunction TDataSet.GetDataSource: TDataSource;\r\nbegin\r\n Result:=nil;\r\nend;\r\n\r\nfunction TDataSet.GetRecordSize: Word;\r\nbegin\r\n Result := 0;\r\nend;\r\n\r\nprocedure TDataSet.InternalAddRecord(Buffer: Pointer; AAppend: Boolean);\r\nbegin\r\n // empty stub\r\nend;\r\n\r\nprocedure TDataSet.InternalDelete;\r\nbegin\r\n // empty stub\r\nend;\r\n\r\nprocedure TDataSet.InternalFirst;\r\nbegin\r\n // empty stub\r\nend;\r\n\r\nprocedure TDataSet.InternalGotoBookmark(ABookmark: TBookmark);\r\nbegin\r\n // empty stub\r\nend;\r\n\r\n\r\nfunction TDataSet.GetFieldData(Field: TField; Buffer: TDatarecord): JSValue;\r\n\r\nbegin\r\n Result:=TJSObject(buffer.data).Properties[Field.FieldName];\r\nend;\r\n\r\n\r\nprocedure TDataSet.SetFieldData(Field: TField; var Buffer: TDatarecord; AValue: JSValue);\r\n\r\nbegin\r\n TJSObject(buffer.data).Properties[Field.FieldName]:=AValue;\r\nend;\r\n\r\n\r\nfunction TDataSet.GetFieldClass(FieldType: TFieldType): TFieldClass;\r\n\r\nbegin\r\n Result := DefaultFieldClasses[FieldType];\r\nend;\r\n\r\nfunction TDataSet.GetIsIndexField(Field: TField): Boolean;\r\n\r\nbegin\r\n Result:=False;\r\nend;\r\n\r\nfunction TDataSet.GetIndexDefs(IndexDefs: TIndexDefs; IndexTypes: TIndexOptions\r\n ): TIndexDefs;\r\n \r\nvar i,f : integer;\r\n IndexFields : TStrings;\r\n \r\nbegin\r\n IndexDefs.Update;\r\n Result := TIndexDefs.Create(Self);\r\n Result.Assign(IndexDefs);\r\n i := 0;\r\n IndexFields := TStringList.Create;\r\n while i < result.Count do\r\n begin\r\n if (not ((IndexTypes = []) and (result[i].Options = []))) and\r\n ((IndexTypes * result[i].Options) = []) then\r\n begin\r\n result.Delete(i);\r\n dec(i);\r\n end\r\n else\r\n begin\r\n// ExtractStrings([';'],[' '],result[i].Fields,Indexfields);\r\n for f := 0 to IndexFields.Count-1 do\r\n if FindField(Indexfields[f]) = nil then\r\n begin\r\n result.Delete(i);\r\n dec(i);\r\n break;\r\n end;\r\n end;\r\n inc(i);\r\n end;\r\n IndexFields.Free;\r\nend;\r\n\r\nfunction TDataSet.GetNextRecord: Boolean;\r\n\r\nVar\r\n T : TDataRecord;\r\n\r\nbegin\r\n{$ifdef dsdebug}\r\n Writeln ('Getting next record. Internal RecordCount : ',FRecordCount);\r\n Writeln ('Getting next record. Internal buffercount : ',FBufferCount);\r\n{$endif}\r\n If FRecordCount>0 Then\r\n SetCurrentRecord(FRecordCount-1);\r\n Result:=GetRecord(FBuffers[FBufferCount],gmNext,True)=grOK;\r\n if Result then\r\n begin\r\n If FRecordCount=0 then ActivateBuffers;\r\n if FRecordCount=FBufferCount then\r\n ShiftBuffersBackward\r\n else\r\n begin\r\n Inc(FRecordCount);\r\n FCurrentRecord:=FRecordCount - 1;\r\n T:=FBuffers[FCurrentRecord];\r\n FBuffers[FCurrentRecord]:=FBuffers[FBufferCount];\r\n FBuffers[FBufferCount]:=T;\r\n end;\r\n end\r\n else\r\n CursorPosChanged;\r\n{$ifdef dsdebug}\r\n Writeln ('Result getting next record : ',Result);\r\n{$endif}\r\nend;\r\n\r\nfunction TDataSet.GetNextRecords: Longint;\r\n\r\nbegin\r\n Result:=0;\r\n{$ifdef dsdebug}\r\n Writeln ('Getting next record(s), need :',FBufferCount);\r\n{$endif}\r\n While (FRecordCount0 Then SetCurrentRecord(0);\r\n Result:=GetRecord(FBuffers[FBufferCount],gmPrior,True)=grOK;\r\n if Result then\r\n begin\r\n If FRecordCount=0 then ActivateBuffers;\r\n ShiftBuffersForward;\r\n\r\n if FRecordCount 0 then\r\n begin\r\n CheckActive; \r\n SetState(dsBlockRead);\r\n end\t\r\n else\r\n begin\r\n //update state only when in dsBlockRead \r\n if FState = dsBlockRead then\r\n SetState(dsBrowse);\r\n end;\t\r\nend;\r\n\r\nprocedure TDataSet.SetFieldDefs(AFieldDefs: TFieldDefs);\r\n\r\nbegin\r\n Fields.ClearFieldDefs;\r\n FFieldDefs.Assign(AFieldDefs);\r\nend;\r\n\r\nprocedure TDataSet.DoInsertAppendRecord(const Values: array of jsValue; DoAppend: boolean);\r\nvar i : integer;\r\n ValuesSize : integer;\r\nbegin\r\n ValuesSize:=Length(Values);\r\n if ValuesSize>FieldCount then DatabaseError(STooManyFields,self);\r\n if DoAppend then\r\n Append\r\n else\r\n Insert;\r\n for i := 0 to ValuesSize-1 do\r\n Fields[i].AssignValue(Values[i]);\r\n Post;\r\nend;\r\n\r\nprocedure TDataSet.InitFieldDefsFromfields;\r\nvar i : integer;\r\n\r\nbegin\r\n if FieldDefs.Count = 0 then\r\n begin\r\n FieldDefs.BeginUpdate;\r\n try\r\n for i := 0 to Fields.Count-1 do with Fields[i] do\r\n if not (FieldKind in [fkCalculated,fkLookup]) then // Do not add fielddefs for calculated/lookup fields.\r\n begin\r\n FFieldDef:=FieldDefs.FieldDefClass.Create(FieldDefs,FieldName,DataType,Size,Required,FieldDefs.Count+1);\r\n with FFieldDef do\r\n begin\r\n if Required then Attributes := Attributes + [faRequired];\r\n if ReadOnly then Attributes := Attributes + [faReadOnly];\r\n end;\r\n end;\r\n finally\r\n FieldDefs.EndUpdate;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TDataSet.InitRecord(var Buffer: TDataRecord);\r\n\r\nbegin\r\n InternalInitRecord(Buffer);\r\n ClearCalcFields(Buffer);\r\nend;\r\n\r\nprocedure TDataSet.InternalCancel;\r\n\r\nbegin\r\n //!! To be implemented\r\nend;\r\n\r\nprocedure TDataSet.InternalEdit;\r\n\r\nbegin\r\n //!! To be implemented\r\nend;\r\n\r\nprocedure TDataSet.InternalRefresh;\r\n\r\nbegin\r\n //!! To be implemented\r\nend;\r\n\r\nprocedure TDataSet.OpenCursor(InfoQuery: Boolean);\r\n\r\nbegin\r\n if InfoQuery then\r\n InternalInitFieldDefs\r\n else if State <> dsOpening then\r\n DoInternalOpen;\r\nend;\r\n\r\nprocedure TDataSet.OpenCursorcomplete;\r\nbegin\r\n try\r\n if FState = dsOpening then DoInternalOpen\r\n finally\r\n if FInternalOpenComplete then\r\n begin\r\n SetState(dsBrowse);\r\n DoAfterOpen;\r\n if not IsEmpty then\r\n DoAfterScroll;\r\n end\r\n else\r\n begin\r\n SetState(dsInactive);\r\n CloseCursor;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TDataSet.RefreshInternalCalcFields(var Buffer: TDataRecord);\r\n\r\nbegin\r\n //!! To be implemented\r\nend;\r\n\r\nfunction TDataSet.SetTempState(const Value: TDataSetState): TDataSetState;\r\n\r\nbegin\r\n result := FState;\r\n FState := value;\r\n inc(FDisableControlsCount);\r\nend;\r\n\r\nprocedure TDataSet.RestoreState(const Value: TDataSetState);\r\n\r\nbegin\r\n FState := value;\r\n dec(FDisableControlsCount);\r\nend;\r\n\r\nfunction TDataSet.GetActive: boolean;\r\n\r\nbegin\r\n result := (FState <> dsInactive) and (FState <> dsOpening);\r\nend;\r\n\r\nprocedure TDataSet.InternalHandleException(E :Exception);\r\n\r\nbegin\r\n ShowException(E,Nil);\r\nend;\r\n\r\nprocedure TDataSet.InternalInitRecord(var Buffer: TDataRecord);\r\nbegin\r\n // empty stub\r\nend;\r\n\r\nprocedure TDataSet.InternalLast;\r\nbegin\r\n // empty stub\r\nend;\r\n\r\nprocedure TDataSet.InternalPost;\r\n\r\n Procedure CheckRequiredFields;\r\n\r\n Var I : longint;\r\n\r\n begin\r\n For I:=0 to FFieldList.Count-1 do\r\n With FFieldList[i] do\r\n // Required fields that are NOT autoinc !! Autoinc cannot be set !!\r\n if Required and not ReadOnly and\r\n (FieldKind=fkData) and Not (DataType=ftAutoInc) and IsNull then\r\n DatabaseErrorFmt(SNeedField,[DisplayName],Self);\r\n end;\r\n\r\nbegin\r\n CheckRequiredFields;\r\nend;\r\n\r\nprocedure TDataSet.InternalSetToRecord(Buffer: TDataRecord);\r\nbegin\r\n // empty stub\r\nend;\r\n\r\nprocedure TDataSet.SetBookmarkFlag(var Buffer: TDataRecord; Value: TBookmarkFlag);\r\nbegin\r\n // empty stub\r\nend;\r\n\r\nprocedure TDataSet.SetBookmarkData(var Buffer: TDataRecord; Data: TBookmark);\r\nbegin\r\n // empty stub\r\nend;\r\n\r\nprocedure TDataSet.SetUniDirectional(const Value: Boolean);\r\nbegin\r\n FIsUniDirectional := Value;\r\nend;\r\n\r\nprocedure TDataSet.Notification(AComponent: TComponent; Operation: TOperation);\r\nbegin\r\n inherited Notification(AComponent, Operation);\r\n if (Operation=opRemove) and (AComponent=FDataProxy) then\r\n FDataProxy:=Nil;\r\nend;\r\n\r\nclass function TDataSet.FieldDefsClass: TFieldDefsClass;\r\nbegin\r\n Result:=TFieldDefs;\r\nend;\r\n\r\nclass function TDataSet.FieldsClass: TFieldsClass;\r\nbegin\r\n Result:=TFields;\r\nend;\r\n\r\nprocedure TDataSet.SetActive(Value: Boolean);\r\n\r\nbegin\r\n if value and (Fstate = dsInactive) then\r\n begin\r\n if csLoading in ComponentState then\r\n begin\r\n FOpenAfterRead := true;\r\n exit;\r\n end\r\n else\r\n begin\r\n DoBeforeOpen;\r\n FEnableControlsEvent:=deLayoutChange;\r\n FInternalCalcFields:=False;\r\n try\r\n FDefaultFields:=FieldCount=0;\r\n OpenCursor(False);\r\n finally\r\n if FState <> dsOpening then OpenCursorComplete;\r\n end;\r\n end;\r\n FModified:=False;\r\n end\r\n else if not value and (Fstate <> dsinactive) then\r\n begin\r\n DoBeforeClose;\r\n SetState(dsInactive);\r\n FDataRequestID:=0;\r\n DoneChangeList;\r\n CloseCursor;\r\n DoAfterClose;\r\n FModified:=False;\r\n end\r\nend;\r\n\r\nprocedure TDataSet.Loaded;\r\n\r\nbegin\r\n inherited;\r\n try\r\n if FOpenAfterRead then SetActive(true);\r\n except\r\n on E : Exception do\r\n if csDesigning in Componentstate then\r\n InternalHandleException(E);\r\n else\r\n raise;\r\n end;\r\nend;\r\n\r\n\r\nprocedure TDataSet.RecalcBufListSize;\r\n\r\nvar\r\n i, j, ABufferCount: Integer;\r\n DataLink: TDataLink;\r\n\r\nbegin\r\n{$ifdef dsdebug}\r\n Writeln('Recalculating buffer list size - check cursor');\r\n{$endif}\r\n If Not IsCursorOpen Then\r\n Exit;\r\n{$ifdef dsdebug}\r\n Writeln('Recalculating buffer list size');\r\n{$endif}\r\n if IsUniDirectional then\r\n ABufferCount := 1\r\n else\r\n ABufferCount := DefaultBufferCount;\r\n{$ifdef dsdebug}\r\n Writeln('Recalculating buffer list size, start count: ',ABufferCount);\r\n{$endif}\r\n for i := 0 to FDataSources.Count - 1 do\r\n for j := 0 to TDataSource(FDataSources[i]).DataLinks.Count - 1 do\r\n begin\r\n DataLink:=TDataLink(TDataSource(FDataSources[i]).DataLinks[j]);\r\n if ABufferCountFBufferCount then\r\n begin\r\n SetLength(FBuffers,Value+1); // FBuffers[FBufferCount] is used as a temp buffer\r\n For I:=FBufferCount to Value do\r\n FBuffers[i]:=AllocRecordBuffer;\r\n end\r\n else if value=0) and (FActiveRecord>Value-1) then\r\n begin\r\n for i := 0 to (FActiveRecord-Value) do\r\n ShiftBuffersBackward;\r\n FActiveRecord := Value -1;\r\n end;\r\n SetLength(FBuffers,Value+1); // FBuffers[FBufferCount] is used as a temp buffer\r\n FBufferCount:=Value;\r\n if FRecordCount > FBufferCount then\r\n FRecordCount := FBufferCount;\r\n\r\nend;\r\n\r\nprocedure TDataSet.SetChildOrder(Child: TComponent; Order: Longint);\r\n\r\nvar\r\n Field: TField;\r\nbegin\r\n Field := Child as TField;\r\n if Fields.IndexOf(Field) >= 0 then\r\n Field.Index := Order;\r\nend;\r\n\r\nprocedure TDataSet.SetCurrentRecord(Index: Longint);\r\n\r\nbegin\r\n If FCurrentRecord<>Index then\r\n begin\r\n{$ifdef DSdebug}\r\n Writeln ('Setting current record to: ',index);\r\n{$endif}\r\n if not FIsUniDirectional then Case GetBookMarkFlag(FBuffers[Index]) of\r\n bfCurrent : InternalSetToRecord(FBuffers[Index]);\r\n bfBOF : InternalFirst;\r\n bfEOF : InternalLast;\r\n end;\r\n FCurrentRecord:=Index;\r\n end;\r\nend;\r\n\r\nprocedure TDataSet.SetDefaultFields(const Value: Boolean);\r\nbegin\r\n FDefaultFields := Value;\r\nend;\r\n\r\nprocedure TDataSet.CheckBiDirectional;\r\n\r\nbegin\r\n if FIsUniDirectional then DataBaseError(SUniDirectional,Self);\r\nend;\r\n\r\nprocedure TDataSet.SetFilterOptions(Value: TFilterOptions);\r\n\r\nbegin\r\n CheckBiDirectional;\r\n FFilterOptions := Value;\r\nend;\r\n\r\nprocedure TDataSet.SetFilterText(const Value: string);\r\n\r\nbegin\r\n FFilterText := value;\r\nend;\r\n\r\nprocedure TDataSet.SetFiltered(Value: Boolean);\r\n\r\nbegin\r\n if Value then CheckBiDirectional;\r\n FFiltered := value;\r\nend;\r\n\r\nprocedure TDataSet.SetFound(const Value: Boolean);\r\nbegin\r\n FFound := Value;\r\nend;\r\n\r\nprocedure TDataSet.SetModified(Value: Boolean);\r\n\r\nbegin\r\n FModified := value;\r\nend;\r\n\r\nprocedure TDataSet.SetName(const NewName: TComponentName);\r\n\r\n function CheckName(const FieldName: string): string;\r\n var i,j: integer;\r\n begin\r\n Result := FieldName;\r\n i := 0;\r\n j := 0;\r\n while (i < Fields.Count) do begin\r\n if Result = Fields[i].FieldName then begin\r\n inc(j);\r\n Result := FieldName + IntToStr(j);\r\n end else Inc(i);\r\n end;\r\n end;\r\n\r\nvar\r\n i: integer;\r\n nm: string;\r\n old: string;\r\n\r\nbegin\r\n if Self.Name = NewName then Exit;\r\n old := Self.Name;\r\n inherited SetName(NewName);\r\n if (csDesigning in ComponentState) then\r\n for i := 0 to Fields.Count - 1 do begin\r\n nm := old + Fields[i].FieldName;\r\n if Copy(Fields[i].Name, 1, Length(nm)) = nm then\r\n Fields[i].Name := CheckName(NewName + Fields[i].FieldName);\r\n end;\r\nend;\r\n\r\nprocedure TDataSet.SetOnFilterRecord(const Value: TFilterRecordEvent);\r\n\r\nbegin\r\n CheckBiDirectional;\r\n FOnFilterRecord := Value;\r\nend;\r\n\r\nprocedure TDataSet.SetRecNo(Value: Longint);\r\n\r\nbegin\r\n //!! To be implemented\r\nend;\r\n\r\nprocedure TDataSet.SetState(Value: TDataSetState);\r\n\r\nbegin\r\n If Value<>FState then\r\n begin\r\n FState:=Value;\r\n if Value=dsBrowse then\r\n FModified:=false;\r\n DataEvent(deUpdateState,0);\r\n end;\r\nend;\r\n\r\nfunction TDataSet.TempBuffer: TDataRecord;\r\n\r\nbegin\r\n Result := FBuffers[FRecordCount];\r\nend;\r\n\r\nprocedure TDataSet.UpdateIndexDefs;\r\n\r\nbegin\r\n // Empty Abstract\r\nend;\r\n\r\nfunction TDataSet.AllocRecordBuffer: TDataRecord;\r\nbegin\r\n Result.data:=Null;\r\n Result.state:=rsNew;\r\n// Result := nil;\r\nend;\r\n\r\nprocedure TDataSet.FreeRecordBuffer(var Buffer: TDataRecord);\r\nbegin\r\n // empty stub\r\nend;\r\n\r\nprocedure TDataSet.GetBookmarkData(Buffer: TDataRecord; var Data: TBookmark);\r\nbegin\r\n\r\nend;\r\n\r\n\r\nfunction TDataSet.GetBookmarkFlag(Buffer: TDataRecord): TBookmarkFlag;\r\nbegin\r\n Result := bfCurrent;\r\nend;\r\n\r\nfunction TDataSet.ControlsDisabled: Boolean;\r\n\r\nbegin\r\n Result := (FDisableControlsCount > 0);\r\nend;\r\n\r\nfunction TDataSet.ActiveBuffer: TDataRecord;\r\n\r\nbegin\r\n{$ifdef dsdebug}\r\n Writeln ('Active buffer requested. Returning record number: ',ActiveRecord);\r\n{$endif}\r\n if FactiveRecord<>-1 then\r\n Result:=FBuffers[FActiveRecord]\r\n else\r\n Result:=Default(TDataRecord);\r\nend;\r\n\r\nfunction TDataSet.GetFieldData(Field: TField): JSValue;\r\nbegin\r\n Result:=GetFieldData(Field,ActiveBuffer);\r\nend;\r\n\r\nprocedure TDataSet.SetFieldData(Field: TField; AValue: JSValue);\r\nbegin\r\n SetFieldData(Field,FBuffers[FActiveRecord],AValue);\r\nend;\r\n\r\nprocedure TDataSet.Append;\r\n\r\nbegin\r\n DoInsertAppend(True);\r\nend;\r\n\r\nprocedure TDataSet.InternalInsert;\r\n\r\nbegin\r\n //!! To be implemented\r\nend;\r\n\r\nprocedure TDataSet.AppendRecord(const Values: array of jsValue);\r\n\r\nbegin\r\n DoInsertAppendRecord(Values,True);\r\nend;\r\n\r\nfunction TDataSet.BookmarkValid(ABookmark: TBookmark): Boolean;\r\n{\r\n Should be overridden by descendant objects.\r\n}\r\nbegin\r\n Result:=False\r\nend;\r\n\r\n\r\n\r\nfunction TDataSet.ConvertToDateTime(aField: TField; aValue: JSValue; ARaiseException: Boolean): TDateTime;\r\nbegin\r\n Result:=DefaultConvertToDateTime(aField,aValue,ARaiseException);\r\nend;\r\n\r\nclass function TDataSet.DefaultConvertToDateTime(aField: TField; aValue: JSValue; ARaiseException: Boolean): TDateTime;\r\nbegin\r\n Result:=0;\r\n if IsString(aValue) then\r\n begin\r\n if not TryRFC3339ToDateTime(String(AValue),Result) then\r\n Raise EConvertError.CreateFmt(SErrInvalidDateTime,[String(aValue)])\r\n end\r\n else if IsNumber(aValue) then\r\n Result:=TDateTime(AValue)\r\n else if IsDate(aValue) then\r\n Result := JSDateToDateTime(TJSDate(aValue));\r\nend;\r\n\r\nfunction TDataSet.ConvertDateTimeToNative(aField: TField; aValue : TDateTime) : JSValue;\r\n\r\nbegin\r\n Result:=DefaultConvertDateTimeToNative(aField, aValue);\r\nend;\r\n\r\nclass function TDataSet.DefaultConvertDateTimeToNative(aField: TField; aValue: TDateTime): JSValue;\r\n\r\nbegin\r\n Result:=DateTimeToRFC3339(aValue);\r\nend;\r\n\r\nfunction TDataSet.BlobDataToBytes(aValue: JSValue): TBytes;\r\nbegin\r\n Result:=DefaultBlobDataToBytes(aValue);\r\nend;\r\n\r\nclass function TDataSet.DefaultBlobDataToBytes(aValue: JSValue): TBytes;\r\n\r\nVar\r\n S : String;\r\n I,J,L : Integer;\r\nbegin\r\n SetLength(Result,0);\r\n // We assume a string, hex-encoded.\r\n if isString(AValue) then\r\n begin\r\n S:=String(Avalue);\r\n L:=Length(S);\r\n SetLength(Result,(L+1) div 2);\r\n I:=1;\r\n J:=0;\r\n While (I dsSetKey then\r\n GetCalcFields(FBuffers[FActiveRecord]);\r\n DataEvent(deRecordChange, 0);\r\nend;\r\n\r\nprocedure TDataSet.Close;\r\n\r\nbegin\r\n Active:=False;\r\nend;\r\n\r\nprocedure TDataSet.ApplyUpdates;\r\nbegin\r\n DoBeforeApplyUpdates;\r\n DoApplyUpdates;\r\nend;\r\n\r\nfunction TDataSet.CompareBookmarks(Bookmark1, Bookmark2: TBookmark): Longint;\r\n\r\nbegin\r\n Result:=0;\r\nend;\r\n\r\nprocedure TDataSet.CursorPosChanged;\r\n\r\n\r\nbegin\r\n FCurrentRecord:=-1;\r\nend;\r\n\r\nprocedure TDataSet.Delete;\r\n\r\nVar\r\n R : TRecordUpdateDescriptor;\r\n\r\nbegin\r\n If Not CanModify then\r\n DatabaseError(SDatasetReadOnly,Self);\r\n If IsEmpty then\r\n DatabaseError(SDatasetEmpty,Self);\r\n if State in [dsInsert] then\r\n begin\r\n Cancel;\r\n end else begin\r\n DataEvent(deCheckBrowseMode,0);\r\n{$ifdef dsdebug}\r\n writeln ('Delete: checking required fields');\r\n{$endif}\r\n DoBeforeDelete;\r\n DoBeforeScroll;\r\n R:=AddToChangeList(usDeleted);\r\n If Not TryDoing(@InternalDelete,OnDeleteError) then\r\n begin\r\n if Assigned(R) then\r\n RemoveFromChangeList(R);\r\n exit;\r\n end;\r\n{$ifdef dsdebug}\r\n writeln ('Delete: Internaldelete succeeded');\r\n{$endif}\r\n SetState(dsBrowse);\r\n{$ifdef dsdebug}\r\n writeln ('Delete: Browse mode set');\r\n{$endif}\r\n SetCurrentRecord(FActiveRecord);\r\n Resync([]);\r\n DoAfterDelete;\r\n DoAfterScroll;\r\n end;\r\nend;\r\n\r\nprocedure TDataSet.DisableControls;\r\n\r\n\r\nbegin\r\n If FDisableControlsCount=0 then\r\n begin\r\n { Save current state,\r\n needed to detect change of state when enabling controls.\r\n }\r\n FDisableControlsState:=FState;\r\n FEnableControlsEvent:=deDatasetChange;\r\n end;\r\n Inc(FDisableControlsCount);\r\nend;\r\n\r\nprocedure TDataSet.DoInsertAppend(DoAppend: Boolean);\r\n\r\n\r\n procedure DoInsert(DoAppend : Boolean);\r\n\r\n Var\r\n BookBeforeInsert : TBookmark;\r\n TempBuf : TDataRecord;\r\n I : integer;\r\n\r\n begin\r\n // need to scroll up al buffers after current one,\r\n // but copy current bookmark to insert buffer.\r\n If FRecordCount > 0 then\r\n BookBeforeInsert:=Bookmark;\r\n\r\n if not DoAppend then\r\n begin\r\n if FRecordCount > 0 then\r\n begin\r\n TempBuf := FBuffers[FBufferCount];\r\n for I:=FBufferCount downto FActiveRecord+1 do\r\n FBuffers[I]:=FBuffers[I-1];\r\n FBuffers[FActiveRecord]:=TempBuf;\r\n end;\r\n end\r\n else if FRecordCount=FBufferCount then\r\n ShiftBuffersBackward\r\n else\r\n begin\r\n if FRecordCount>0 then\r\n inc(FActiveRecord);\r\n end;\r\n\r\n // Active buffer is now edit buffer. Initialize.\r\n InitRecord(FBuffers[FActiveRecord]);\r\n CursorPosChanged;\r\n\r\n // Put bookmark in edit buffer.\r\n if FRecordCount=0 then\r\n SetBookmarkFlag(FBuffers[FActiveRecord],bfEOF)\r\n else\r\n begin\r\n fBOF := false;\r\n // 29:01:05, JvdS: Why is this here?!? It can result in records with the same bookmark-data?\r\n // I would say that the 'internalinsert' should do this. But I don't know how Tdbf handles it\r\n\r\n // 1-apr-06, JvdS: It just sets the bookmark of the newly inserted record to the place\r\n // where the record should be inserted. So it is ok.\r\n if FRecordCount > 0 then\r\n begin\r\n SetBookMarkData(FBuffers[FActiveRecord],BookBeforeInsert);\r\n FreeBookmark(BookBeforeInsert);\r\n end;\r\n end;\r\n\r\n InternalInsert;\r\n\r\n // update buffer count.\r\n If FRecordCount0 then\r\n FActiveRecord:=FRecordCount-1;\r\n DoInsert(True);\r\n SetBookmarkFlag(FBuffers[FActiveRecord],bfEOF);\r\n FBOF :=False;\r\n FEOF := true;\r\n end;\r\n SetState(dsInsert);\r\n try\r\n DoOnNewRecord;\r\n except\r\n SetCurrentRecord(FActiveRecord);\r\n resync([]);\r\n raise;\r\n end;\r\n // mark as not modified.\r\n FModified:=False;\r\n // Final events.\r\n DataEvent(deDatasetChange,0);\r\n DoAfterInsert;\r\n DoAfterScroll;\r\n{$ifdef dsdebug}\r\n Writeln ('Done with append');\r\n{$endif}\r\nend;\r\n\r\nprocedure TDataSet.Edit;\r\n\r\nbegin\r\n If State in [dsEdit,dsInsert] then exit;\r\n CheckBrowseMode;\r\n If Not CanModify then\r\n DatabaseError(SDatasetReadOnly,Self);\r\n If FRecordCount = 0 then\r\n begin\r\n Append;\r\n Exit;\r\n end;\r\n DoBeforeEdit;\r\n If Not TryDoing(@InternalEdit,OnEditError) then exit;\r\n GetCalcFields(FBuffers[FActiveRecord]);\r\n SetState(dsEdit);\r\n DataEvent(deRecordChange,0);\r\n DoAfterEdit;\r\nend;\r\n\r\nprocedure TDataSet.EnableControls;\r\n\r\n\r\nbegin\r\n if FDisableControlsCount > 0 then\r\n Dec(FDisableControlsCount);\r\n\r\n if FDisableControlsCount = 0 then begin\r\n if FState <> FDisableControlsState then\r\n DataEvent(deUpdateState, 0);\r\n\r\n if (FState <> dsInactive) and (FDisableControlsState <> dsInactive) then\r\n DataEvent(FEnableControlsEvent, 0);\r\n end;\r\nend;\r\n\r\nfunction TDataSet.FieldByName(const FieldName: string): TField;\r\n\r\n\r\nbegin\r\n Result:=FindField(FieldName);\r\n If Result=Nil then\r\n DatabaseErrorFmt(SFieldNotFound,[FieldName],Self);\r\nend;\r\n\r\nfunction TDataSet.FindField(const FieldName: string): TField;\r\n\r\n\r\nbegin\r\n Result:=FFieldList.FindField(FieldName);\r\nend;\r\n\r\nfunction TDataSet.FindFirst: Boolean;\r\n\r\n\r\nbegin\r\n Result:=False;\r\nend;\r\n\r\nfunction TDataSet.FindLast: Boolean;\r\n\r\n\r\nbegin\r\n Result:=False;\r\nend;\r\n\r\nfunction TDataSet.FindNext: Boolean;\r\n\r\n\r\nbegin\r\n Result:=False;\r\nend;\r\n\r\nfunction TDataSet.FindPrior: Boolean;\r\n\r\n\r\nbegin\r\n Result:=False;\r\nend;\r\n\r\nprocedure TDataSet.First;\r\n\r\n\r\nbegin\r\n CheckBrowseMode;\r\n DoBeforeScroll;\r\n if not FIsUniDirectional then\r\n ClearBuffers\r\n else if not FBof then\r\n begin\r\n Active := False;\r\n Active := True;\r\n end;\r\n try\r\n InternalFirst;\r\n if not FIsUniDirectional then GetNextRecords;\r\n finally\r\n FBOF:=True;\r\n DataEvent(deDatasetChange,0);\r\n DoAfterScroll;\r\n end;\r\nend;\r\n\r\nprocedure TDataSet.FreeBookmark(ABookmark: TBookmark);\r\n\r\n\r\nbegin\r\n {$ifdef noautomatedbookmark}\r\n FreeMem(ABookMark,FBookMarkSize);\r\n {$endif}\r\nend;\r\n\r\nfunction TDataSet.GetBookmark: TBookmark;\r\n\r\n\r\nbegin\r\n if BookmarkAvailable then\r\n GetBookMarkdata(ActiveBuffer,Result)\r\n else\r\n Result.Data:=Null;\r\nend;\r\n\r\nfunction TDataSet.GetCurrentRecord(Buffer: TDataRecord): Boolean;\r\n\r\n\r\nbegin\r\n Result:=False;\r\nend;\r\n\r\nprocedure TDataSet.GetFieldList(List: TList; const FieldNames: string);\r\n\r\nvar\r\n F: TField;\r\n N: String;\r\n StrPos: Integer;\r\n\r\nbegin\r\n if (FieldNames = '') or (List = nil) then\r\n Exit;\r\n StrPos := 1;\r\n repeat\r\n N := ExtractFieldName(FieldNames, StrPos);\r\n F := FieldByName(N);\r\n List.Add(F);\r\n until StrPos > Length(FieldNames);\r\nend;\r\n\r\nprocedure TDataSet.GetFieldList(List: TFPList; const FieldNames: string);\r\nvar\r\n F: TField;\r\n N: String;\r\n StrPos: Integer;\r\n\r\nbegin\r\n if (FieldNames = '') or (List = nil) then\r\n Exit;\r\n StrPos := 1;\r\n repeat\r\n N := ExtractFieldName(FieldNames, StrPos);\r\n F := FieldByName(N);\r\n List.Add(F);\r\n until StrPos > Length(FieldNames);\r\nend;\r\n\r\nprocedure TDataSet.GetFieldNames(List: TStrings);\r\n\r\n\r\nbegin\r\n FFieldList.GetFieldNames(List);\r\nend;\r\n\r\nprocedure TDataSet.GotoBookmark(const ABookmark: TBookmark);\r\n\r\n\r\nbegin\r\n If Not IsNull(ABookMark.Data) then\r\n begin\r\n CheckBrowseMode;\r\n DoBeforeScroll;\r\n{$ifdef dsdebug}\r\n Writeln('Gotobookmark: ',ABookMark.Data);\r\n{$endif}\r\n InternalGotoBookMark(ABookMark);\r\n Resync([rmExact,rmCenter]);\r\n DoAfterScroll;\r\n end;\r\nend;\r\n\r\nprocedure TDataSet.Insert;\r\n\r\nbegin\r\n DoInsertAppend(False);\r\nend;\r\n\r\nprocedure TDataSet.InsertRecord(const Values: array of JSValue);\r\n\r\nbegin\r\n DoInsertAppendRecord(Values,False);\r\nend;\r\n\r\nfunction TDataSet.IsEmpty: Boolean;\r\n\r\nbegin\r\n Result:=(fBof and fEof) and\r\n (not (State = dsInsert)); // After an insert on an empty dataset, both fBof and fEof are true\r\nend;\r\n\r\nfunction TDataSet.IsLinkedTo(ADataSource: TDataSource): Boolean;\r\n\r\nbegin\r\n//!! Not tested, I never used nested DS\r\n if (ADataSource = nil) or (ADataSource.Dataset = nil) then begin\r\n Result := False\r\n end else if ADataSource.Dataset = Self then begin\r\n Result := True;\r\n end else begin\r\n Result := ADataSource.Dataset.IsLinkedTo(ADataSource.Dataset.DataSource);\r\n end;\r\n//!! DataSetField not implemented\r\nend;\r\n\r\nfunction TDataSet.IsSequenced: Boolean;\r\n\r\nbegin\r\n Result := True;\r\nend;\r\n\r\nprocedure TDataSet.Last;\r\n\r\nbegin\r\n CheckBiDirectional;\r\n CheckBrowseMode;\r\n DoBeforeScroll;\r\n ClearBuffers;\r\n try\r\n // Writeln('FActiveRecord before last',FActiveRecord);\r\n InternalLast;\r\n // Writeln('FActiveRecord after last',FActiveRecord);\r\n GetPriorRecords;\r\n // Writeln('FRecordCount: ',FRecordCount);\r\n if FRecordCount>0 then\r\n FActiveRecord:=FRecordCount-1;\r\n // Writeln('FActiveRecord ',FActiveRecord);\r\n finally\r\n FEOF:=true;\r\n DataEvent(deDataSetChange, 0);\r\n DoAfterScroll;\r\n end;\r\nend;\r\n\r\nfunction TDataSet.DoLoad(aOptions: TLoadOptions; aAfterLoad: TDatasetLoadEvent): Boolean;\r\n\r\nVar\r\n Request : TDataRequest;\r\n\r\nbegin\r\n if not (loNoEvents in aOptions) then\r\n DoBeforeLoad;\r\n Result:=DataProxy<>Nil;\r\n if Not Result then\r\n Exit;\r\n Request:=DataProxy.GetDataRequest(aOptions,@HandleRequestResponse,aAfterLoad);\r\n Request.FDataset:=Self;\r\n If Active then\r\n Request.FBookmark:=GetBookmark;\r\n Inc(FDataRequestID);\r\n Request.FRequestID:=FDataRequestID;\r\n if DataProxy.DoGetData(Request) then\r\n Inc(FLoadCount)\r\n else\r\n Request.Free;\r\n// Writeln(Name,' End of Load call. Count: ',LoadCount);\r\nend;\r\n\r\n\r\nfunction TDataSet.Load(aOptions: TLoadOptions; aAfterLoad: TDatasetLoadEvent): Boolean;\r\n\r\nbegin\r\n if loAtEOF in aOptions then\r\n DatabaseError(SatEOFInternalOnly,Self);\r\n if loCancelPending in aOptions then\r\n CancelLoading;\r\n Result:=DoLoad(aOptions,aAfterLoad);\r\nend;\r\n\r\nfunction TDataSet.MoveBy(Distance: Longint): Longint;\r\nVar\r\n TheResult: Integer;\r\n\r\n Function ScrollForward : Integer;\r\n begin\r\n Result:=0;\r\n{$ifdef dsdebug}\r\n Writeln('Scrolling forward : ',Distance);\r\n Writeln('Active buffer : ',FActiveRecord);\r\n Writeln('RecordCount : ',FRecordCount);\r\n WriteLn('BufferCount : ',FBufferCount);\r\n{$endif}\r\n FBOF:=False;\r\n While (Distance>0) and not FEOF do\r\n begin\r\n If FActiveRecord0 then\r\n begin\r\n Dec(FActiveRecord);\r\n Inc(Distance);\r\n Dec(TheResult); //Dec(Result);\r\n end\r\n else\r\n begin\r\n {$ifdef dsdebug}\r\n Writeln('Moveby : need next record');\r\n {$endif}\r\n If GetPriorRecord then\r\n begin\r\n Inc(Distance);\r\n Inc(Result);\r\n Dec(TheResult); //Dec(Result);\r\n end\r\n else\r\n FBOF:=true;\r\n end;\r\n end\r\n end;\r\n\r\nVar\r\n Scrolled : Integer;\r\n\r\nbegin\r\n CheckBrowseMode;\r\n Result:=0; TheResult:=0;\r\n DoBeforeScroll;\r\n If (Distance = 0) or\r\n ((Distance>0) and FEOF) or\r\n ((Distance<0) and FBOF) then\r\n exit;\r\n Try\r\n Scrolled := 0;\r\n If Distance>0 then\r\n Scrolled:=ScrollForward\r\n else\r\n Scrolled:=ScrollBackward;\r\n finally\r\n{$ifdef dsdebug}\r\n WriteLn('ActiveRecord=', FActiveRecord,' FEOF=',FEOF,' FBOF=',FBOF);\r\n{$Endif}\r\n DataEvent(deDatasetScroll,Scrolled);\r\n DoAfterScroll;\r\n Result:=TheResult;\r\n end;\r\nend;\r\n\r\nprocedure TDataSet.Next;\r\n\r\nbegin\r\n if BlockReadSize>0 then\r\n BlockReadNext\r\n else\r\n MoveBy(1);\r\nend;\r\n\r\nprocedure TDataSet.BlockReadNext;\r\nbegin\r\n MoveBy(1);\r\nend;\r\n\r\nprocedure TDataSet.Open;\r\n\r\nbegin\r\n Active:=True;\r\nend;\r\n\r\nprocedure TDataSet.Post;\r\n\r\nConst\r\n UpdateStates : Array[Boolean] of TUpdateStatus = (usModified,usInserted);\r\n\r\nVar\r\n R : TRecordUpdateDescriptor;\r\n WasInsert : Boolean;\r\n\r\nbegin\r\n UpdateRecord;\r\n if State in [dsEdit,dsInsert] then\r\n begin\r\n DataEvent(deCheckBrowseMode,0);\r\n{$ifdef dsdebug}\r\n writeln ('Post: checking required fields');\r\n{$endif}\r\n DoBeforePost;\r\n WasInsert:=State=dsInsert;\r\n If Not TryDoing(@InternalPost,OnPostError) then exit;\r\n CursorPosChanged;\r\n{$ifdef dsdebug}\r\n writeln ('Post: Internalpost succeeded');\r\n{$endif}\r\n// First set the state to dsBrowse, then the Resync, to prevent the calling of\r\n// the deDatasetChange event, while the state is still 'editable', while the db isn't\r\n SetState(dsBrowse);\r\n Resync([]);\r\n // We get the new values here, since the bookmark should now be correct to find the record later on when doing applyupdates.\r\n R:=AddToChangeList(UpdateStates[wasInsert]);\r\n if Assigned(R) then\r\n R.FBookmark:=BookMark;\r\n{$ifdef dsdebug}\r\n writeln ('Post: Browse mode set');\r\n{$endif}\r\n DoAfterPost;\r\n end\r\n else if State<>dsSetKey then\r\n DatabaseErrorFmt(SNotEditing, [Name], Self);\r\nend;\r\n\r\nprocedure TDataSet.Prior;\r\n\r\nbegin\r\n MoveBy(-1);\r\nend;\r\n\r\nprocedure TDataSet.Refresh;\r\n\r\nbegin\r\n CheckbrowseMode;\r\n DoBeforeRefresh;\r\n UpdateCursorPos;\r\n InternalRefresh;\r\n{ SetCurrentRecord is called by UpdateCursorPos already, so as long as\r\n InternalRefresh doesn't do strange things this should be ok. }\r\n// SetCurrentRecord(FActiveRecord);\r\n Resync([]);\r\n DoAfterRefresh;\r\nend;\r\n\r\nprocedure TDataSet.RegisterDataSource(ADataSource: TDataSource);\r\n\r\nbegin\r\n FDataSources.Add(ADataSource);\r\n RecalcBufListSize;\r\nend;\r\n\r\n\r\nprocedure TDataSet.Resync(Mode: TResyncMode);\r\n\r\nvar i,count : integer;\r\n\r\nbegin\r\n // See if we can find the requested record.\r\n{$ifdef dsdebug}\r\n Writeln ('Resync called');\r\n{$endif}\r\n if FIsUnidirectional then Exit;\r\n// place the cursor of the underlying dataset to the active record\r\n// SetCurrentRecord(FActiveRecord);\r\n\r\n// Now look if the data on the current cursor of the underlying dataset is still available\r\n If GetRecord(FBuffers[0],gmCurrent,False)<>grOk Then\r\n// If that fails and rmExact is set, then raise an exception\r\n If rmExact in Mode then\r\n DatabaseError(SNoSuchRecord,Self)\r\n// else, if rmexact is not set, try to fetch the next or prior record in the underlying dataset\r\n else if (GetRecord(FBuffers[0],gmNext,True)<>grOk) and\r\n (GetRecord(FBuffers[0],gmPrior,True)<>grOk) then\r\n begin\r\n{$ifdef dsdebug}\r\n Writeln ('Resync: fuzzy resync');\r\n{$endif}\r\n // nothing found, invalidate buffer and bail out.\r\n ClearBuffers;\r\n // Make sure that the active record is 'empty', ie: that all fields are null\r\n InternalInitRecord(FBuffers[FActiveRecord]);\r\n DataEvent(deDatasetChange,0);\r\n exit;\r\n end;\r\n FCurrentRecord := 0;\r\n FEOF := false;\r\n FBOF := false;\r\n\r\n// If we've arrived here, FBuffer[0] is the current record\r\n If (rmCenter in Mode) then\r\n count := (FRecordCount div 2)\r\n else\r\n count := FActiveRecord;\r\n i := 0;\r\n FRecordCount := 1;\r\n FActiveRecord := 0;\r\n\r\n// Fill the buffers before the active record\r\n while (i < count) and GetPriorRecord do\r\n inc(i);\r\n FActiveRecord := i;\r\n// Fill the rest of the buffer\r\n GetNextRecords;\r\n// If the buffer is not full yet, try to fetch some more prior records\r\n if FRecordCount < FBufferCount then FActiveRecord:=FActiveRecord+getpriorrecords;\r\n// That's all folks!\r\n DataEvent(deDatasetChange,0);\r\nend;\r\n\r\nprocedure TDataSet.CancelLoading;\r\nbegin\r\n FMinLoadID:=FDataRequestID;\r\n FloadCount:=0;\r\nend;\r\n\r\nprocedure TDataSet.SetFields(const Values: array of JSValue);\r\n\r\nVar I : longint;\r\nbegin\r\n For I:=0 to high(Values) do\r\n Fields[I].AssignValue(Values[I]);\r\nend;\r\n\r\nfunction TDataSet.TryDoing(P: TDataOperation; Ev: TDatasetErrorEvent): Boolean;\r\n\r\nVar Retry : TDataAction;\r\n\r\nbegin\r\n{$ifdef dsdebug}\r\n Writeln ('Trying to do');\r\n If P=Nil then writeln ('Procedure to call is nil !!!');\r\n{$endif dsdebug}\r\n Result:=True;\r\n Retry:=daRetry;\r\n while Retry=daRetry do\r\n Try\r\n{$ifdef dsdebug}\r\n Writeln ('Trying : updatecursorpos');\r\n{$endif dsdebug}\r\n UpdateCursorPos;\r\n{$ifdef dsdebug}\r\n Writeln ('Trying to do it');\r\n{$endif dsdebug}\r\n P();\r\n exit;\r\n except\r\n On E : EDatabaseError do\r\n begin\r\n retry:=daFail;\r\n If Assigned(Ev) then\r\n Ev(Self,E,Retry);\r\n Case Retry of\r\n daFail : Raise;\r\n daAbort : Abort;\r\n end;\r\n end;\r\n else\r\n Raise;\r\n end;\r\n{$ifdef dsdebug}\r\n Writeln ('Exit Trying to do');\r\n{$endif dsdebug}\r\nend;\r\n\r\nprocedure TDataSet.UpdateCursorPos;\r\n\r\nbegin\r\n If FRecordCount>0 then\r\n SetCurrentRecord(FActiveRecord);\r\nend;\r\n\r\nprocedure TDataSet.UpdateRecord;\r\n\r\nbegin\r\n if not (State in dsEditModes) then\r\n DatabaseErrorFmt(SNotEditing, [Name], Self);\r\n DataEvent(deUpdateRecord, 0);\r\nend;\r\n\r\nfunction TDataSet.GetPendingUpdates: TResolveInfoArray;\r\n\r\nVar\r\n L : TRecordUpdateDescriptorList;\r\n I : integer;\r\n\r\nbegin\r\n L:=TRecordUpdateDescriptorList.Create;\r\n try\r\n SetLength(Result,GetRecordUpdates(L));\r\n For I:=0 to L.Count-1 do\r\n Result[i]:=RecordUpdateDescriptorToResolveInfo(L[i]);\r\n finally\r\n L.Free;\r\n end;\r\nend;\r\n\r\n\r\n\r\nprocedure TDataSet.SetConstraints(Value: TCheckConstraints);\r\nbegin\r\n FConstraints.Assign(Value);\r\nend;\r\n\r\nprocedure TDataSet.SetDataProxy(AValue: TDataProxy);\r\nbegin\r\n If AValue=FDataProxy then\r\n exit;\r\n if Assigned(FDataProxy) then\r\n FDataProxy.RemoveFreeNotification(Self);\r\n FDataProxy:=AValue;\r\n if Assigned(FDataProxy) then\r\n FDataProxy.FreeNotification(Self)\r\nend;\r\n\r\nfunction TDataSet.GetfieldCount: Integer;\r\n\r\nbegin\r\n Result:=FFieldList.Count;\r\nend;\r\n\r\nprocedure TDataSet.ShiftBuffersBackward;\r\n\r\nvar\r\n TempBuf : TDataRecord;\r\n I : Integer;\r\n\r\nbegin\r\n TempBuf := FBuffers[0];\r\n For I:=1 to FBufferCount do\r\n FBuffers[I-1]:=FBuffers[i];\r\n FBuffers[FBufferCount]:=TempBuf;\r\nend;\r\n\r\nprocedure TDataSet.ShiftBuffersForward;\r\n\r\nvar\r\n TempBuf : TDataRecord;\r\n I : Integer;\r\n\r\nbegin\r\n TempBuf := FBuffers[FBufferCount];\r\n For I:=FBufferCount downto 1 do\r\n FBuffers[I]:=FBuffers[i-1];\r\n FBuffers[0]:=TempBuf;\r\nend;\r\n\r\nfunction TDataSet.GetFieldValues(const FieldName: string): JSValue;\r\n\r\nvar\r\n i: Integer;\r\n FieldList: TList;\r\n A : TJSValueDynArray;\r\n\r\nbegin\r\n FieldList := TList.Create;\r\n try\r\n GetFieldList(FieldList, FieldName);\r\n if FieldList.Count>1 then\r\n begin\r\n SetLength(A,FieldList.Count);\r\n for i := 0 to FieldList.Count - 1 do\r\n A[i] := TField(FieldList[i]).Value;\r\n Result:=A;\r\n end\r\n else\r\n Result := FieldByName(FieldName).Value;\r\n finally\r\n FieldList.Free;\r\n end;\r\nend;\r\n\r\nprocedure TDataSet.SetFieldValues(const FieldName: string; Value: JSValue);\r\n\r\nvar\r\n i : Integer;\r\n FieldList: TList;\r\n A : TJSValueDynArray;\r\n\r\nbegin\r\n if IsArray(Value) then\r\n begin\r\n FieldList := TList.Create;\r\n try\r\n GetFieldList(FieldList, FieldName);\r\n A:=TJSValueDynArray(Value);\r\n if (FieldList.Count = 1) and (Length(A)>0) then\r\n // Allow for a field type that can deal with an array\r\n FieldByName(FieldName).Value := Value\r\n else\r\n for i := 0 to FieldList.Count - 1 do\r\n TField(FieldList[i]).Value := A[i];\r\n finally\r\n FieldList.Free;\r\n end;\r\n end\r\n else\r\n FieldByName(FieldName).Value := Value;\r\nend;\r\n\r\nfunction TDataSet.Locate(const KeyFields: string; const KeyValues: JSValue;\r\n Options: TLocateOptions): boolean;\r\n\r\nbegin\r\n CheckBiDirectional;\r\n Result := False;\r\nend;\r\n\r\nfunction TDataSet.Lookup(const KeyFields: string; const KeyValues: JSValue;\r\n const ResultFields: string): JSValue;\r\n\r\nbegin\r\n CheckBiDirectional;\r\n Result := Null;\r\nend;\r\n\r\n\r\nprocedure TDataSet.UnRegisterDataSource(ADataSource: TDataSource);\r\n\r\nbegin\r\n FDataSources.Remove(ADataSource);\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n TFieldDef\r\n ---------------------------------------------------------------------}\r\n\r\nconstructor TFieldDef.Create(ACollection: TCollection);\r\n\r\nbegin\r\n Inherited Create(ACollection);\r\n FFieldNo:=Index+1;\r\nend;\r\n\r\nconstructor TFieldDef.Create(AOwner: TFieldDefs; const AName: string; ADataType: TFieldType; ASize: Integer; ARequired: Boolean;\r\n AFieldNo: Longint);\r\nbegin\r\n{$ifdef dsdebug }\r\n Writeln('TFieldDef.Create : ',Aname,'(',AFieldNo,')');\r\n{$endif}\r\n Inherited Create(AOwner);\r\n Name:=Aname;\r\n FDatatype:=ADatatype;\r\n FSize:=ASize;\r\n FRequired:=ARequired;\r\n FPrecision:=-1;\r\n FFieldNo:=AFieldNo;\r\nend;\r\n\r\ndestructor TFieldDef.Destroy;\r\n\r\nbegin\r\n Inherited destroy;\r\nend;\r\n\r\nprocedure TFieldDef.Assign(Source: TPersistent);\r\nvar fd: TFieldDef;\r\nbegin\r\n fd := nil;\r\n if Source is TFieldDef then\r\n fd := Source as TFieldDef;\r\n if Assigned(fd) then begin\r\n Collection.BeginUpdate;\r\n try\r\n Name := fd.Name;\r\n DataType := fd.DataType;\r\n Size := fd.Size;\r\n Precision := fd.Precision;\r\n FRequired := fd.Required;\r\n finally\r\n Collection.EndUpdate;\r\n end;\r\n end\r\n else\r\n inherited Assign(Source);\r\nend;\r\n\r\nfunction TFieldDef.CreateField(AOwner: TComponent): TField;\r\n\r\nvar TheField : TFieldClass;\r\n\r\nbegin\r\n{$ifdef dsdebug}\r\n Writeln ('Creating field '+FNAME);\r\n{$endif dsdebug}\r\n TheField:=GetFieldClass;\r\n if TheField=Nil then\r\n DatabaseErrorFmt(SUnknownFieldType,[FName]);\r\n Result:=TheField.Create(AOwner);\r\n Try\r\n Result.FFieldDef:=Self;\r\n Result.Size:=FSize;\r\n Result.Required:=FRequired;\r\n Result.FFieldName:=FName;\r\n Result.FDisplayLabel:=DisplayName;\r\n Result.FFieldNo:=Self.FieldNo;\r\n Result.SetFieldType(DataType);\r\n Result.FReadOnly:=(faReadOnly in Attributes);\r\n{$ifdef dsdebug}\r\n Writeln ('TFieldDef.CreateField : Result Fieldno : ',Result.FieldNo,'; Self : ',FieldNo);\r\n Writeln ('TFieldDef.CreateField : Trying to set dataset');\r\n{$endif dsdebug}\r\n Result.Dataset:=TFieldDefs(Collection).Dataset;\r\n if (Result is TFloatField) then\r\n TFloatField(Result).Precision := FPrecision;\r\n except\r\n Result.Free;\r\n Raise;\r\n end;\r\nend;\r\n\r\nprocedure TFieldDef.SetAttributes(AValue: TFieldAttributes);\r\nbegin\r\n FAttributes := AValue;\r\n Changed(False);\r\nend;\r\n\r\nprocedure TFieldDef.SetDataType(AValue: TFieldType);\r\nbegin\r\n FDataType := AValue;\r\n Changed(False);\r\nend;\r\n\r\nprocedure TFieldDef.SetPrecision(const AValue: Longint);\r\nbegin\r\n FPrecision := AValue;\r\n Changed(False);\r\nend;\r\n\r\nprocedure TFieldDef.SetSize(const AValue: Integer);\r\nbegin\r\n FSize := AValue;\r\n Changed(False);\r\nend;\r\n\r\nprocedure TFieldDef.SetRequired(const AValue: Boolean);\r\nbegin\r\n FRequired := AValue;\r\n Changed(False);\r\nend;\r\n\r\nfunction TFieldDef.GetFieldClass: TFieldClass;\r\n\r\nbegin\r\n //!! Should be owner as tdataset but that doesn't work ??\r\n\r\n If Assigned(Collection) And\r\n (Collection is TFieldDefs) And\r\n Assigned(TFieldDefs(Collection).Dataset) then\r\n Result:=TFieldDefs(Collection).Dataset.GetFieldClass(FDataType)\r\n else\r\n Result:=Nil;\r\nend;\r\n\r\n\r\n{ ---------------------------------------------------------------------\r\n TFieldDefs\r\n ---------------------------------------------------------------------}\r\n\r\n{\r\ndestructor TFieldDefs.Destroy;\r\n\r\nbegin\r\n FItems.Free;\r\n // This will destroy all fielddefs since we own them...\r\n Inherited Destroy;\r\nend;\r\n}\r\n\r\nprocedure TFieldDefs.Add(const AName: string; ADataType: TFieldType);\r\n\r\nbegin\r\n Add(AName,ADatatype,0,False);\r\nend;\r\n\r\nprocedure TFieldDefs.Add(const AName: string; ADataType: TFieldType; ASize : Word);\r\n\r\nbegin\r\n Add(AName,ADatatype,ASize,False);\r\nend;\r\n\r\nprocedure TFieldDefs.Add(const AName: string; ADataType: TFieldType; ASize: Word;\r\n ARequired: Boolean);\r\n\r\nbegin\r\n If Length(AName)=0 Then\r\n DatabaseError(SNeedFieldName,Dataset);\r\n // the fielddef will register itself here as an owned component.\r\n // fieldno is 1 based !\r\n BeginUpdate;\r\n try\r\n Add(AName,ADataType,ASize,ARequired,Count+1);\r\n finally\r\n EndUpdate;\r\n end;\r\nend;\r\n\r\nfunction TFieldDefs.Add: TFieldDef;\r\nbegin\r\n Result := TFieldDef(inherited Add);\r\nend;\r\n\r\nfunction TFieldDefs.GetItem(Index: Longint): TFieldDef;\r\n\r\nbegin\r\n Result := TFieldDef(inherited Items[Index]);\r\nend;\r\n\r\nprocedure TFieldDefs.SetItem(Index: Longint; const AValue: TFieldDef);\r\nbegin\r\n inherited Items[Index] := AValue;\r\nend;\r\n\r\nclass function TFieldDefs.FieldDefClass: TFieldDefClass;\r\nbegin\r\n Result:=TFieldDef;\r\nend;\r\n\r\nconstructor TFieldDefs.Create(ADataSet: TDataSet);\r\nbegin\r\n Inherited Create(ADataset, Owner, FieldDefClass);\r\nend;\r\n\r\nfunction TFieldDefs.Add(const AName: string; ADataType: TFieldType; ASize, APrecision: Integer;\r\n ARequired, AReadOnly: Boolean; AFieldNo: Integer): TFieldDef;\r\nbegin\r\n Result:=FieldDefClass.Create(Self, MakeNameUnique(AName), ADataType, ASize, ARequired, AFieldNo);\r\n if AReadOnly then\r\n Result.Attributes := Result.Attributes + [faReadOnly];\r\nend;\r\n\r\nfunction TFieldDefs.Add(const AName: string; ADataType: TFieldType; ASize: Word; ARequired: Boolean; AFieldNo: Integer): TFieldDef;\r\nbegin\r\n Result:=FieldDefClass.Create(Self,AName,ADataType,ASize,ARequired,AFieldNo);\r\nend;\r\n\r\nprocedure TFieldDefs.Assign(FieldDefs: TFieldDefs);\r\n\r\nvar I : longint;\r\n\r\nbegin\r\n Clear;\r\n For i:=0 to FieldDefs.Count-1 do\r\n With FieldDefs[i] do\r\n Add(Name,DataType,Size,Required);\r\nend;\r\n\r\nfunction TFieldDefs.Find(const AName: string): TFieldDef;\r\nbegin\r\n Result := (Inherited Find(AName)) as TFieldDef;\r\n if Result=nil then DatabaseErrorFmt(SFieldNotFound,[AName],FDataset);\r\nend;\r\n\r\n{\r\nprocedure TFieldDefs.Clear;\r\n\r\nvar I : longint;\r\n\r\nbegin\r\n For I:=FItems.Count-1 downto 0 do\r\n TFieldDef(Fitems[i]).Free;\r\n FItems.Clear;\r\nend;\r\n}\r\n\r\nprocedure TFieldDefs.Update;\r\n\r\nbegin\r\n if not Updated then\r\n begin\r\n If Assigned(Dataset) then\r\n DataSet.InitFieldDefs;\r\n Updated := True;\r\n end;\r\nend;\r\n\r\nfunction TFieldDefs.MakeNameUnique(const AName: String): string;\r\nvar DblFieldCount : integer;\r\nbegin\r\n DblFieldCount := 0;\r\n Result := AName;\r\n while assigned(inherited Find(Result)) do\r\n begin\r\n inc(DblFieldCount);\r\n Result := AName + '_' + IntToStr(DblFieldCount);\r\n end;\r\nend;\r\n\r\nfunction TFieldDefs.AddFieldDef: TFieldDef;\r\n\r\nbegin\r\n Result:=FieldDefClass.Create(Self,'',ftUnknown,0,False,Count+1);\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n TField\r\n ---------------------------------------------------------------------}\r\n\r\nConst\r\n// SBCD = 'BCD';\r\n SBoolean = 'Boolean';\r\n SDateTime = 'TDateTime';\r\n SFloat = 'Float';\r\n SInteger = 'Integer';\r\n SLargeInt = 'NativeInt';\r\n SJSValue = 'JSValue';\r\n SString = 'String';\r\n SBytes = 'Bytes';\r\n\r\nconstructor TField.Create(AOwner: TComponent);\r\n\r\n//Var\r\n// I : Integer;\r\n\r\nbegin\r\n Inherited Create(AOwner);\r\n FVisible:=True;\r\n SetLength(FValidChars,255);\r\n// For I:=0 to 255 do\r\n// FValidChars[i]:=Char(i);\r\n\r\n FProviderFlags := [pfInUpdate,pfInWhere];\r\nend;\r\n\r\ndestructor TField.Destroy;\r\n\r\nbegin\r\n IF Assigned(FDataSet) then\r\n begin\r\n FDataSet.Active:=False;\r\n if Assigned(FFields) then\r\n FFields.Remove(Self);\r\n end;\r\n FLookupList.Free;\r\n Inherited Destroy;\r\nend;\r\n\r\nProcedure TField.RaiseAccessError(const TypeName: string);\r\n\r\nVar\r\n E : EDatabaseError;\r\n\r\nbegin\r\n E:=AccessError(TypeName);\r\n Raise E;\r\nend;\r\n\r\nfunction TField.AccessError(const TypeName: string): EDatabaseError;\r\n\r\nbegin\r\n Result:=EDatabaseError.CreateFmt(SinvalidTypeConversion,[TypeName,FFieldName]);\r\nend;\r\n\r\nprocedure TField.Assign(Source: TPersistent);\r\n\r\nbegin\r\n if Source = nil then Clear\r\n else if Source is TField then begin\r\n Value := TField(Source).Value;\r\n end else\r\n inherited Assign(Source);\r\nend;\r\n\r\nprocedure TField.AssignValue(const AValue: JSValue);\r\n\r\n procedure Error;\r\n begin\r\n DatabaseErrorFmt(SFieldValueError, [DisplayName]);\r\n end;\r\n\r\nbegin\r\n Case GetValueType(AValue) of\r\n jvtNull : Clear;\r\n jvtBoolean : AsBoolean:=Boolean(AValue);\r\n jvtInteger : AsLargeInt:=NativeInt(AValue);\r\n jvtFloat : AsFloat:=Double(AValue);\r\n jvtString : AsString:=String(AValue);\r\n jvtArray : SetAsBytes(TBytes(AValue));\r\n else\r\n Error;\r\n end;\r\nend;\r\n\r\nprocedure TField.Bind(Binding: Boolean);\r\n\r\nbegin\r\n if Binding and (FieldKind=fkLookup) then\r\n begin\r\n if ((FLookupDataSet = nil) or (FLookupKeyFields = '') or\r\n (FLookupResultField = '') or (FKeyFields = '')) then\r\n DatabaseErrorFmt(SLookupInfoError, [DisplayName]);\r\n FFields.CheckFieldNames(FKeyFields);\r\n FLookupDataSet.Open;\r\n FLookupDataSet.Fields.CheckFieldNames(FLookupKeyFields);\r\n FLookupDataSet.FieldByName(FLookupResultField);\r\n if FLookupCache then\r\n RefreshLookupList;\r\n end;\r\nend;\r\n\r\nprocedure TField.Change;\r\n\r\nbegin\r\n If Assigned(FOnChange) Then\r\n FOnChange(Self);\r\nend;\r\n\r\nprocedure TField.CheckInactive;\r\n\r\nbegin\r\n If Assigned(FDataSet) then\r\n FDataset.CheckInactive;\r\nend;\r\n\r\nprocedure TField.Clear;\r\n\r\nbegin\r\n SetData(Nil);\r\nend;\r\n\r\nprocedure TField.DataChanged;\r\n\r\nbegin\r\n FDataset.DataEvent(deFieldChange,self);\r\nend;\r\n\r\nprocedure TField.FocusControl;\r\nvar\r\n Field1: TField;\r\nbegin\r\n Field1 := Self;\r\n FDataSet.DataEvent(deFocusControl,Field1);\r\nend;\r\n\r\nfunction TField.GetAsBoolean: Boolean;\r\nbegin\r\n raiseAccessError(SBoolean);\r\n Result:=false;\r\nend;\r\n\r\nfunction TField.GetAsBytes: TBytes;\r\n\r\nbegin\r\n raiseAccessError(SBytes);\r\n Result:=nil;\r\nend;\r\n\r\n\r\nfunction TField.GetAsDateTime: TDateTime;\r\n\r\nbegin\r\n raiseAccessError(SdateTime);\r\n Result:=0.0;\r\nend;\r\n\r\nfunction TField.GetAsFloat: Double;\r\n\r\nbegin\r\n raiseAccessError(SDateTime);\r\n Result:=0.0;\r\nend;\r\n\r\nfunction TField.GetAsLargeInt: NativeInt;\r\nbegin\r\n RaiseAccessError(SLargeInt);\r\n Result:=0;\r\nend;\r\n\r\nfunction TField.GetAsLongint: Longint;\r\n\r\nbegin\r\n Result:=GetAsInteger;\r\nend;\r\n\r\nfunction TField.GetAsInteger: Longint;\r\n\r\nbegin\r\n RaiseAccessError(SInteger);\r\n Result:=0;\r\nend;\r\n\r\nfunction TField.GetAsJSValue: JSValue;\r\n\r\nbegin\r\n Result:=GetData\r\nend;\r\n\r\n\r\nfunction TField.GetAsString: string;\r\nbegin\r\n Result := GetClassDesc\r\nend;\r\n\r\nfunction TField.GetOldValue: JSValue;\r\n\r\nvar SaveState : TDatasetState;\r\n\r\nbegin\r\n SaveState := FDataset.State;\r\n try\r\n FDataset.SetTempState(dsOldValue);\r\n Result := GetAsJSValue;\r\n finally\r\n FDataset.RestoreState(SaveState);\r\n end;\r\nend;\r\n\r\nfunction TField.GetNewValue: JSValue;\r\n\r\nvar SaveState : TDatasetState;\r\n\r\nbegin\r\n SaveState := FDataset.State;\r\n try\r\n FDataset.SetTempState(dsNewValue);\r\n Result := GetAsJSValue;\r\n finally\r\n FDataset.RestoreState(SaveState);\r\n end;\r\nend;\r\n\r\nprocedure TField.SetNewValue(const AValue: JSValue);\r\n\r\nvar SaveState : TDatasetState;\r\n\r\nbegin\r\n SaveState := FDataset.State;\r\n try\r\n FDataset.SetTempState(dsNewValue);\r\n SetAsJSValue(AValue);\r\n finally\r\n FDataset.RestoreState(SaveState);\r\n end;\r\nend;\r\n\r\nfunction TField.GetCurValue: JSValue;\r\n\r\nvar SaveState : TDatasetState;\r\n\r\nbegin\r\n SaveState := FDataset.State;\r\n try\r\n FDataset.SetTempState(dsCurValue);\r\n Result := GetAsJSValue;\r\n finally\r\n FDataset.RestoreState(SaveState);\r\n end;\r\nend;\r\n\r\nfunction TField.GetCanModify: Boolean;\r\n\r\nbegin\r\n Result:=Not ReadOnly;\r\n If Result then\r\n begin\r\n Result := FieldKind in [fkData, fkInternalCalc];\r\n if Result then\r\n begin\r\n Result:=Assigned(DataSet) and Dataset.Active;\r\n If Result then\r\n Result:= DataSet.CanModify;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TField.GetClassDesc: String;\r\nvar ClassN : string;\r\nbegin\r\n ClassN := copy(ClassName,2,pos('Field',ClassName)-2);\r\n if isNull then\r\n result := '(' + LowerCase(ClassN) + ')'\r\n else\r\n result := '(' + UpperCase(ClassN) + ')';\r\nend;\r\n\r\n\r\nfunction TField.GetData : JSValue;\r\n\r\nbegin\r\n IF FDataset=Nil then\r\n DatabaseErrorFmt(SNoDataset,[FieldName]);\r\n If FValidating then\r\n result:=FValueBuffer\r\n else\r\n Result:=FDataset.GetFieldData(Self);\r\nend;\r\n\r\nfunction TField.GetDataSize: Integer;\r\n\r\nbegin\r\n Result:=0;\r\nend;\r\n\r\nfunction TField.GetDefaultWidth: Longint;\r\n\r\nbegin\r\n Result:=10;\r\nend;\r\n\r\nfunction TField.GetDisplayName : String;\r\n\r\nbegin\r\n If FDisplayLabel<>'' then\r\n result:=FDisplayLabel\r\n else\r\n Result:=FFieldName;\r\nend;\r\n\r\nfunction TField.IsDisplayLabelStored: Boolean;\r\n\r\nbegin\r\n Result:=(DisplayLabel<>FieldName);\r\nend;\r\n\r\nfunction TField.IsDisplayWidthStored: Boolean;\r\n\r\nbegin\r\n Result:=(FDisplayWidth<>0);\r\nend;\r\n\r\nfunction TField.GetLookupList: TLookupList;\r\nbegin\r\n if not Assigned(FLookupList) then\r\n FLookupList := TLookupList.Create;\r\n Result := FLookupList;\r\nend;\r\n\r\nprocedure TField.CalcLookupValue;\r\nbegin\r\n// MVC: TODO\r\n// if FLookupCache then\r\n// Value := LookupList.ValueOfKey(FDataSet.FieldValues[FKeyFields])\r\n// else if\r\n if Assigned(FLookupDataSet) and FDataSet.Active then\r\n Value := FLookupDataSet.Lookup(FLookupKeyfields, FDataSet.FieldValues[FKeyFields], FLookupresultField)\r\n else\r\n Value:=Null;\r\nend;\r\n\r\nfunction TField.GetIndex: longint;\r\n\r\nbegin\r\n If Assigned(FDataset) then\r\n Result:=FDataset.FFieldList.IndexOf(Self)\r\n else\r\n Result:=-1;\r\nend;\r\n\r\nfunction TField.GetLookup: Boolean;\r\nbegin\r\n Result := FieldKind = fkLookup;\r\nend;\r\n\r\nprocedure TField.SetAlignment(const AValue: TAlignMent);\r\nbegin\r\n if FAlignment <> AValue then\r\n begin\r\n FAlignment := AValue;\r\n PropertyChanged(false);\r\n end;\r\nend;\r\n\r\nprocedure TField.SetIndex(const AValue: Longint);\r\nbegin\r\n if FFields <> nil then FFields.SetFieldIndex(Self, AValue)\r\nend;\r\n\r\nfunction TField.GetIsNull: Boolean;\r\n\r\nbegin\r\n Result:=js.IsNull(GetData);\r\nend;\r\n\r\nfunction TField.GetParentComponent: TComponent;\r\n\r\nbegin\r\n Result := DataSet;\r\nend;\r\n\r\nprocedure TField.GetText(var AText: string; ADisplayText: Boolean);\r\n\r\nbegin\r\n AText:=GetAsString;\r\nend;\r\n\r\nfunction TField.HasParent: Boolean;\r\n\r\nbegin\r\n HasParent:=True;\r\nend;\r\n\r\nfunction TField.IsValidChar(InputChar: Char): Boolean;\r\n\r\nbegin\r\n // FValidChars must be set in Create.\r\n Result:=CharInset(InputChar,FValidChars);\r\nend;\r\n\r\nprocedure TField.RefreshLookupList;\r\nvar\r\n tmpActive: Boolean;\r\nbegin\r\n if not Assigned(FLookupDataSet) or (Length(FLookupKeyfields) = 0)\r\n or (Length(FLookupresultField) = 0) or (Length(FKeyFields) = 0) then\r\n Exit;\r\n \r\n tmpActive := FLookupDataSet.Active;\r\n try\r\n FLookupDataSet.Active := True;\r\n FFields.CheckFieldNames(FKeyFields);\r\n FLookupDataSet.Fields.CheckFieldNames(FLookupKeyFields);\r\n FLookupDataset.FieldByName(FLookupResultField); // I presume that if it doesn't exist it throws exception, and that a field with null value is still valid\r\n LookupList.Clear; // have to be F-less because we might be creating it here with getter!\r\n\r\n FLookupDataSet.DisableControls;\r\n try\r\n FLookupDataSet.First;\r\n while not FLookupDataSet.Eof do\r\n begin\r\n// FLookupList.Add(FLookupDataSet.FieldValues[FLookupKeyfields], FLookupDataSet.FieldValues[FLookupResultField]);\r\n FLookupDataSet.Next;\r\n end;\r\n finally\r\n FLookupDataSet.EnableControls;\r\n end;\r\n finally\r\n FLookupDataSet.Active := tmpActive;\r\n end;\r\nend;\r\n\r\nprocedure TField.Notification(AComponent: TComponent; Operation: TOperation);\r\n\r\nbegin\r\n Inherited Notification(AComponent,Operation);\r\n if (Operation = opRemove) and (AComponent = FLookupDataSet) then\r\n FLookupDataSet := nil;\r\nend;\r\n\r\nprocedure TField.PropertyChanged(LayoutAffected: Boolean);\r\n\r\nbegin\r\n If (FDataset<>Nil) and (FDataset.Active) then\r\n If LayoutAffected then\r\n FDataset.DataEvent(deLayoutChange,0)\r\n else\r\n FDataset.DataEvent(deDatasetchange,0);\r\nend;\r\n\r\n\r\nprocedure TField.SetAsBytes(const AValue: TBytes);\r\nbegin\r\n RaiseAccessError(SBytes);\r\nend;\r\n\r\nprocedure TField.SetAsBoolean(AValue: Boolean);\r\n\r\nbegin\r\n RaiseAccessError(SBoolean);\r\nend;\r\n\r\nprocedure TField.SetAsDateTime(AValue: TDateTime);\r\n\r\nbegin\r\n RaiseAccessError(SDateTime);\r\nend;\r\n\r\nprocedure TField.SetAsFloat(AValue: Double);\r\n\r\nbegin\r\n RaiseAccessError(SFloat);\r\nend;\r\n\r\nprocedure TField.SetAsJSValue(const AValue: JSValue);\r\n\r\nbegin\r\n if js.IsNull(AValue) then\r\n Clear\r\n else\r\n try\r\n SetVarValue(AValue);\r\n except\r\n on EVariantError do\r\n DatabaseErrorFmt(SFieldValueError, [DisplayName]);\r\n end;\r\nend;\r\n\r\n\r\nprocedure TField.SetAsLongint(AValue: Longint);\r\nbegin\r\n SetAsInteger(AValue);\r\nend;\r\n\r\nprocedure TField.SetAsInteger(AValue: Longint);\r\nbegin\r\n RaiseAccessError(SInteger);\r\nend;\r\n\r\nprocedure TField.SetAsLargeInt(AValue: NativeInt);\r\nbegin\r\n RaiseAccessError(SLargeInt);\r\nend;\r\n\r\nprocedure TField.SetAsString(const AValue: string);\r\nbegin\r\n RaiseAccessError(SString);\r\nend;\r\n\r\nprocedure TField.SetData(Buffer: JSValue);\r\n\r\nbegin\r\n If Not Assigned(FDataset) then\r\n DatabaseErrorFmt(SNoDataset,[FieldName]);\r\n FDataSet.SetFieldData(Self,Buffer);\r\nend;\r\n\r\nprocedure TField.SetDataset(AValue: TDataset);\r\n\r\nbegin\r\n{$ifdef dsdebug}\r\n Writeln ('Setting dataset');\r\n{$endif}\r\n If AValue=FDataset then exit;\r\n If Assigned(FDataset) Then\r\n begin\r\n FDataset.CheckInactive;\r\n FDataset.FFieldList.Remove(Self);\r\n end;\r\n If Assigned(AValue) then\r\n begin\r\n AValue.CheckInactive;\r\n AValue.FFieldList.Add(Self);\r\n end;\r\n FDataset:=AValue;\r\nend;\r\n\r\nprocedure TField.SetDataType(AValue: TFieldType);\r\nbegin\r\n FDataType := AValue;\r\nend;\r\n\r\nprocedure TField.SetFieldType(AValue: TFieldType);\r\nbegin\r\n { empty }\r\nend;\r\n\r\nprocedure TField.SetParentComponent(Value: TComponent);\r\nbegin\r\n// if not (csLoading in ComponentState) then\r\n DataSet := Value as TDataSet\r\nend;\r\n\r\nprocedure TField.SetSize(AValue: Integer);\r\nbegin\r\n CheckInactive;\r\n CheckTypeSize(AValue);\r\n FSize:=AValue;\r\nend;\r\n\r\nprocedure TField.SetText(const AValue: string);\r\nbegin\r\n SetAsString(AValue);\r\nend;\r\n\r\nprocedure TField.SetVarValue(const AValue: JSValue);\r\nbegin\r\n RaiseAccessError(SJSValue);\r\nend;\r\n\r\nprocedure TField.Validate(Buffer: Pointer);\r\nbegin\r\n If assigned(OnValidate) Then\r\n begin\r\n FValueBuffer:=Buffer;\r\n FValidating:=True;\r\n Try\r\n OnValidate(Self);\r\n finally\r\n FValidating:=False;\r\n end;\r\n end;\r\nend;\r\n\r\nclass function TField.IsBlob: Boolean;\r\nbegin\r\n Result:=False;\r\nend;\r\n\r\nclass procedure TField.CheckTypeSize(AValue: Longint);\r\n\r\nbegin\r\n If (AValue<>0) and Not IsBlob Then\r\n DatabaseErrorFmt(SInvalidFieldSize,[AValue]);\r\nend;\r\n\r\n// TField private methods\r\n\r\nprocedure TField.SetEditText(const AValue: string);\r\nbegin\r\n if Assigned(OnSetText) then\r\n OnSetText(Self, AValue)\r\n else\r\n SetText(AValue);\r\nend;\r\n\r\nfunction TField.GetEditText: String;\r\nbegin\r\n SetLength(Result, 0);\r\n if Assigned(OnGetText) then\r\n OnGetText(Self, Result, False)\r\n else\r\n GetText(Result, False);\r\nend;\r\n\r\nfunction TField.GetDisplayText: String;\r\nbegin\r\n SetLength(Result, 0);\r\n if Assigned(OnGetText) then\r\n OnGetText(Self, Result, True)\r\n else\r\n GetText(Result, True);\r\nend;\r\n\r\nprocedure TField.SetDisplayLabel(const AValue: string);\r\nbegin\r\n if FDisplayLabel<>AValue then\r\n begin\r\n FDisplayLabel:=AValue;\r\n PropertyChanged(true);\r\n end;\r\nend;\r\n\r\nprocedure TField.SetDisplayWidth(const AValue: Longint);\r\nbegin\r\n if FDisplayWidth<>AValue then\r\n begin\r\n FDisplayWidth:=AValue;\r\n PropertyChanged(True);\r\n end;\r\nend;\r\n\r\nfunction TField.GetDisplayWidth: integer;\r\nbegin\r\n if FDisplayWidth=0 then\r\n result:=GetDefaultWidth\r\n else\r\n result:=FDisplayWidth;\r\nend;\r\n\r\nprocedure TField.SetLookup(const AValue: Boolean);\r\nconst\r\n ValueToLookupMap: array[Boolean] of TFieldKind = (fkData, fkLookup);\r\nbegin\r\n FieldKind := ValueToLookupMap[AValue];\r\nend;\r\n\r\nprocedure TField.SetReadOnly(const AValue: Boolean);\r\nbegin\r\n if (FReadOnly<>AValue) then\r\n begin\r\n FReadOnly:=AValue;\r\n PropertyChanged(True);\r\n end;\r\nend;\r\n\r\nprocedure TField.SetVisible(const AValue: Boolean);\r\nbegin\r\n if FVisible<>AValue then\r\n begin\r\n FVisible:=AValue;\r\n PropertyChanged(True);\r\n end;\r\nend;\r\n\r\n\r\n{ ---------------------------------------------------------------------\r\n TStringField\r\n ---------------------------------------------------------------------}\r\n\r\n\r\nconstructor TStringField.Create(AOwner: TComponent);\r\n\r\nbegin\r\n Inherited Create(AOwner);\r\n SetDataType(ftString);\r\n FFixedChar := False;\r\n FTransliterate := False;\r\n FSize := 20;\r\nend;\r\n\r\nprocedure TStringField.SetFieldType(AValue: TFieldType);\r\nbegin\r\n if AValue in [ftString, ftFixedChar, ftWideString] then\r\n SetDataType(AValue);\r\nend;\r\n\r\nclass procedure TStringField.CheckTypeSize(AValue: Longint);\r\n\r\nbegin\r\n// A size of 0 is allowed, since for example Firebird allows\r\n// a query like: 'select '' as fieldname from table' which\r\n// results in a string with size 0.\r\n If (AValue<0) Then\r\n DatabaseErrorFmt(SInvalidFieldSize,[AValue])\r\nend;\r\n\r\nfunction TStringField.GetAsBoolean: Boolean;\r\n\r\nvar S : String;\r\n\r\nbegin\r\n S:=GetAsString;\r\n result := (Length(S)>0) and (Upcase(S[1]) in ['T',YesNoChars[True]]);\r\nend;\r\n\r\nfunction TStringField.GetAsDateTime: TDateTime;\r\n\r\nbegin\r\n Result:=StrToDateTime(GetAsString);\r\nend;\r\n\r\nfunction TStringField.GetAsFloat: Double;\r\n\r\nbegin\r\n Result:=StrToFloat(GetAsString);\r\nend;\r\n\r\nfunction TStringField.GetAsInteger: Longint;\r\n\r\nbegin\r\n Result:=StrToInt(GetAsString);\r\nend;\r\n\r\nfunction TStringField.GetAsLargeInt: NativeInt;\r\n\r\nbegin\r\n Result:=StrToInt64(GetAsString);\r\nend;\r\n\r\nfunction TStringField.GetAsString: String;\r\n\r\nVar\r\n V : JSValue;\r\n\r\nbegin\r\n V:=GetData;\r\n if isString(V) then\r\n Result := String(V)\r\n else\r\n Result:='';\r\nend;\r\n\r\n\r\nfunction TStringField.GetAsJSValue: JSValue;\r\n\r\nbegin\r\n Result:=GetData\r\nend;\r\n\r\n\r\nfunction TStringField.GetDefaultWidth: Longint;\r\n\r\nbegin\r\n result:=Size;\r\nend;\r\n\r\nprocedure TStringField.GetText(var AText: string; ADisplayText: Boolean);\r\n\r\nbegin\r\n AText:=GetAsString;\r\nend;\r\n\r\n\r\nprocedure TStringField.SetAsBoolean(AValue: Boolean);\r\n\r\nbegin\r\n If AValue Then\r\n SetAsString('T')\r\n else\r\n SetAsString('F');\r\nend;\r\n\r\nprocedure TStringField.SetAsDateTime(AValue: TDateTime);\r\n\r\nbegin\r\n SetAsString(DateTimeToStr(AValue));\r\nend;\r\n\r\nprocedure TStringField.SetAsFloat(AValue: Double);\r\n\r\nbegin\r\n SetAsString(FloatToStr(AValue));\r\nend;\r\n\r\nprocedure TStringField.SetAsInteger(AValue: Longint);\r\n\r\nbegin\r\n SetAsString(IntToStr(AValue));\r\nend;\r\n\r\nprocedure TStringField.SetAsLargeInt(AValue: NativeInt);\r\n\r\nbegin\r\n SetAsString(IntToStr(AValue));\r\nend;\r\n\r\n\r\nprocedure TStringField.SetAsString(const AValue: String);\r\nbegin\r\n SetData(AValue);\r\nend;\r\n\r\n\r\nprocedure TStringField.SetVarValue(const AValue: JSValue);\r\nbegin\r\n if isString(AVAlue) then\r\n SetAsString(String(AValue))\r\n else\r\n RaiseAccessError(SFieldValueError);\r\nend;\r\n\r\n\r\n{ ---------------------------------------------------------------------\r\n TNumericField\r\n ---------------------------------------------------------------------}\r\n\r\n\r\nconstructor TNumericField.Create(AOwner: TComponent);\r\n\r\nbegin\r\n Inherited Create(AOwner);\r\n AlignMent:=taRightJustify;\r\nend;\r\n\r\nclass procedure TNumericField.CheckTypeSize(AValue: Longint);\r\nbegin\r\n // This procedure is only added because some TDataset descendents have the\r\n // but that they set the Size property as if it is the DataSize property.\r\n // To avoid problems with those descendents, allow values <= 16.\r\n If (AValue>16) Then\r\n DatabaseErrorFmt(SInvalidFieldSize,[AValue]);\r\nend;\r\n\r\nprocedure TNumericField.RangeError(AValue, Min, Max: Double);\r\n\r\nbegin\r\n DatabaseErrorFmt(SRangeError,[AValue,Min,Max,FieldName]);\r\nend;\r\n\r\nprocedure TNumericField.SetDisplayFormat(const AValue: string);\r\n\r\nbegin\r\n If FDisplayFormat<>AValue then\r\n begin\r\n FDisplayFormat:=AValue;\r\n PropertyChanged(True);\r\n end;\r\nend;\r\n\r\nprocedure TNumericField.SetEditFormat(const AValue: string);\r\n\r\nbegin\r\n If FEditFormat<>AValue then\r\n begin\r\n FEditFormat:=AValue;\r\n PropertyChanged(True);\r\n end;\r\nend;\r\n\r\nfunction TNumericField.GetAsBoolean: Boolean;\r\nbegin\r\n Result:=GetAsInteger<>0;\r\nend;\r\n\r\nprocedure TNumericField.SetAsBoolean(AValue: Boolean);\r\nbegin\r\n SetAsInteger(ord(AValue));\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n TIntegerField\r\n ---------------------------------------------------------------------}\r\n\r\n\r\nconstructor TIntegerField.Create(AOwner: TComponent);\r\n\r\nbegin\r\n Inherited Create(AOwner);\r\n SetDataType(ftInteger);\r\n FMinRange:=Low(LongInt);\r\n FMaxRange:=High(LongInt);\r\n// MVC : Todo\r\n// FValidchars:=['+','-','0'..'9'];\r\nend;\r\n\r\nfunction TIntegerField.GetAsFloat: Double;\r\n\r\nbegin\r\n Result:=GetAsInteger;\r\nend;\r\n\r\nfunction TIntegerField.GetAsLargeInt: NativeInt;\r\nbegin\r\n Result:=GetAsInteger;\r\nend;\r\n\r\nfunction TIntegerField.GetAsInteger: Longint;\r\n\r\nbegin\r\n If Not GetValue(Result) then\r\n Result:=0;\r\nend;\r\n\r\nfunction TIntegerField.GetAsJSValue: JSValue;\r\n\r\nvar L : Longint;\r\n\r\nbegin\r\n If GetValue(L) then\r\n Result:=L\r\n else\r\n Result:=Null;\r\nend;\r\n\r\nfunction TIntegerField.GetAsString: string;\r\n\r\nvar L : Longint;\r\n\r\nbegin\r\n If GetValue(L) then\r\n Result:=IntTostr(L)\r\n else\r\n Result:='';\r\nend;\r\n\r\n\r\nprocedure TIntegerField.GetText(var AText: string; ADisplayText: Boolean);\r\n\r\nvar l : longint;\r\n fmt : string;\r\n\r\nbegin\r\n Atext:='';\r\n If Not GetValue(l) then exit;\r\n If ADisplayText or (FEditFormat='') then\r\n fmt:=FDisplayFormat\r\n else\r\n fmt:=FEditFormat;\r\n If length(fmt)<>0 then\r\n AText:=FormatFloat(fmt,L)\r\n else\r\n Str(L,AText);\r\nend;\r\n\r\nfunction TIntegerField.GetValue(var AValue: Longint): Boolean;\r\n\r\nvar\r\n V : JSValue;\r\n\r\nbegin\r\n V:=GetData;\r\n Result:=isInteger(V);\r\n if Result then\r\n AValue:=Longint(V);\r\nend;\r\n\r\nprocedure TIntegerField.SetAsLargeInt(AValue: NativeInt);\r\nbegin\r\n if (AValue>=FMinRange) and (AValue<=FMaxRange) then\r\n SetAsInteger(AValue)\r\n else\r\n RangeError(AValue,FMinRange,FMaxRange);\r\nend;\r\n\r\nprocedure TIntegerField.SetAsFloat(AValue: Double);\r\n\r\nbegin\r\n SetAsInteger(Round(AValue));\r\nend;\r\n\r\nprocedure TIntegerField.SetAsInteger(AValue: Longint);\r\nbegin\r\n If CheckRange(AValue) then\r\n SetData(AValue)\r\n else\r\n if (FMinValue<>0) or (FMaxValue<>0) then\r\n RangeError(AValue,FMinValue,FMaxValue)\r\n else\r\n RangeError(AValue,FMinRange,FMaxRange);\r\nend;\r\n\r\nprocedure TIntegerField.SetVarValue(const AValue: JSValue);\r\nbegin\r\n if IsInteger(aValue) then\r\n SetAsInteger(Integer(AValue))\r\n else\r\n RaiseAccessError(SInteger);\r\nend;\r\n\r\nprocedure TIntegerField.SetAsString(const AValue: string);\r\n\r\nvar L,Code : longint;\r\n\r\nbegin\r\n If length(AValue)=0 then\r\n Clear\r\n else\r\n begin\r\n Val(AValue,L,Code);\r\n If Code=0 then\r\n SetAsInteger(L)\r\n else\r\n DatabaseErrorFmt(SNotAnInteger,[AValue]);\r\n end;\r\nend;\r\n\r\nFunction TIntegerField.CheckRange(AValue : longint) : Boolean;\r\n\r\nbegin\r\n if (FMinValue<>0) or (FMaxValue<>0) then\r\n Result := (AValue>=FMinValue) and (AValue<=FMaxValue)\r\n else\r\n Result := (AValue>=FMinRange) and (AValue<=FMaxRange);\r\nend;\r\n\r\nProcedure TIntegerField.SetMaxValue (AValue : longint);\r\n\r\nbegin\r\n If (AValue>=FMinRange) and (AValue<=FMaxRange) then\r\n FMaxValue:=AValue\r\n else\r\n RangeError(AValue,FMinRange,FMaxRange);\r\nend;\r\n\r\nProcedure TIntegerField.SetMinValue (AValue : longint);\r\n\r\nbegin\r\n If (AValue>=FMinRange) and (AValue<=FMaxRange) then\r\n FMinValue:=AValue\r\n else\r\n RangeError(AValue,FMinRange,FMaxRange);\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n TLargeintField\r\n ---------------------------------------------------------------------}\r\n\r\n\r\nconstructor TLargeintField.Create(AOwner: TComponent);\r\n\r\nbegin\r\n Inherited Create(AOwner);\r\n SetDataType(ftLargeint);\r\n FMinRange:=Low(NativeInt);\r\n FMaxRange:=High(NativeInt);\r\n// MVC : Todo\r\n// FValidchars:=['+','-','0'..'9'];\r\nend;\r\n\r\nfunction TLargeintField.GetAsFloat: Double;\r\n\r\nbegin\r\n Result:=GetAsLargeInt;\r\nend;\r\n\r\nfunction TLargeintField.GetAsLargeInt: NativeInt;\r\n\r\nbegin\r\n If Not GetValue(Result) then\r\n Result:=0;\r\nend;\r\n\r\nfunction TLargeIntField.GetAsJSValue: JSValue;\r\n\r\nvar L : NativeInt;\r\n\r\nbegin\r\n If GetValue(L) then\r\n Result:=L\r\n else\r\n Result:=Null;\r\nend;\r\n\r\nfunction TLargeintField.GetAsInteger: Longint;\r\n\r\nbegin\r\n Result:=GetAsLargeInt;\r\nend;\r\n\r\nfunction TLargeintField.GetAsString: string;\r\n\r\nvar L : NativeInt;\r\n\r\nbegin\r\n If GetValue(L) then\r\n Result:=IntTostr(L)\r\n else\r\n Result:='';\r\nend;\r\n\r\nprocedure TLargeintField.GetText(var AText: string; ADisplayText: Boolean);\r\n\r\nvar l : NativeInt;\r\n fmt : string;\r\n\r\nbegin\r\n Atext:='';\r\n If Not GetValue(l) then exit;\r\n If ADisplayText or (FEditFormat='') then\r\n fmt:=FDisplayFormat\r\n else\r\n fmt:=FEditFormat;\r\n If length(fmt)<>0 then\r\n AText:=FormatFloat(fmt,L)\r\n else\r\n Str(L,AText);\r\nend;\r\n\r\nfunction TLargeintField.GetValue(var AValue: NativeInt): Boolean;\r\n\r\nvar\r\n P : JSValue;\r\n\r\nbegin\r\n P:=GetData;\r\n Result:=isInteger(P);\r\n if Result then\r\n AValue:=NativeInt(P);\r\nend;\r\n\r\nprocedure TLargeintField.SetAsFloat(AValue: Double);\r\n\r\nbegin\r\n SetAsLargeInt(Round(AValue));\r\nend;\r\n\r\nprocedure TLargeintField.SetAsLargeInt(AValue: NativeInt);\r\n\r\nbegin\r\n If CheckRange(AValue) then\r\n SetData(AValue)\r\n else\r\n RangeError(AValue,FMinValue,FMaxValue);\r\nend;\r\n\r\nprocedure TLargeintField.SetAsInteger(AValue: Longint);\r\n\r\nbegin\r\n SetAsLargeInt(AValue);\r\nend;\r\n\r\nprocedure TLargeintField.SetAsString(const AValue: string);\r\n\r\nvar L : NativeInt;\r\n code : Longint;\r\n\r\nbegin\r\n If length(AValue)=0 then\r\n Clear\r\n else\r\n begin\r\n Val(AValue,L,Code);\r\n If Code=0 then\r\n SetAsLargeInt(L)\r\n else\r\n DatabaseErrorFmt(SNotAnInteger,[AValue]);\r\n end;\r\nend;\r\n\r\nprocedure TLargeintField.SetVarValue(const AValue: JSValue);\r\nbegin\r\n if IsInteger(Avalue) then\r\n SetAsLargeInt(NativeInt(AValue))\r\n else\r\n RaiseAccessError(SLargeInt);\r\nend;\r\n\r\nFunction TLargeintField.CheckRange(AValue : NativeInt) : Boolean;\r\n\r\nbegin\r\n if (FMinValue<>0) or (FMaxValue<>0) then\r\n Result := (AValue>=FMinValue) and (AValue<=FMaxValue)\r\n else\r\n Result := (AValue>=FMinRange) and (AValue<=FMaxRange);\r\nend;\r\n\r\nProcedure TLargeintField.SetMaxValue (AValue : NativeInt);\r\n\r\nbegin\r\n If (AValue>=FMinRange) and (AValue<=FMaxRange) then\r\n FMaxValue:=AValue\r\n else\r\n RangeError(AValue,FMinRange,FMaxRange);\r\nend;\r\n\r\nProcedure TLargeintField.SetMinValue (AValue : NativeInt);\r\n\r\nbegin\r\n If (AValue>=FMinRange) and (AValue<=FMaxRange) then\r\n FMinValue:=AValue\r\n else\r\n RangeError(AValue,FMinRange,FMaxRange);\r\nend;\r\n\r\n\r\n{ TAutoIncField }\r\n\r\nconstructor TAutoIncField.Create(AOwner: TComponent);\r\n\r\nbegin\r\n Inherited Create(AOWner);\r\n SetDataType(ftAutoInc);\r\nend;\r\n\r\nProcedure TAutoIncField.SetAsInteger(AValue: Longint);\r\n\r\nbegin\r\n // Some databases allows insertion of explicit values into identity columns\r\n // (some of them also allows (some not) updating identity columns)\r\n // So allow it at client side and leave check for server side\r\n //if not(FDataSet.State in [dsFilter,dsSetKey,dsInsert]) then\r\n // DataBaseError(SCantSetAutoIncFields);\r\n inherited;\r\nend;\r\n\r\n{ TFloatField }\r\n\r\nprocedure TFloatField.SetCurrency(const AValue: Boolean);\r\nbegin\r\n if FCurrency=AValue then exit;\r\n FCurrency:=AValue;\r\nend;\r\n\r\nprocedure TFloatField.SetPrecision(const AValue: Longint);\r\nbegin\r\n if (AValue = -1) or (AValue > 1) then\r\n FPrecision := AValue\r\n else\r\n FPrecision := 2;\r\nend;\r\n\r\nfunction TFloatField.GetAsFloat: Double;\r\n\r\nVar\r\n P : JSValue;\r\n\r\nbegin\r\n P:=GetData;\r\n If IsNumber(P) then\r\n Result:=Double(P)\r\n else\r\n Result:=0.0;\r\nend;\r\n\r\nfunction TFloatField.GetAsJSValue: JSValue;\r\n\r\nvar\r\n P : JSValue;\r\n\r\nbegin\r\n P:=GetData;\r\n if IsNumber(P) then\r\n Result:=P\r\n else\r\n Result:=Null;\r\nend;\r\n\r\nfunction TFloatField.GetAsLargeInt: NativeInt;\r\nbegin\r\n Result:=Round(GetAsFloat);\r\nend;\r\n\r\nfunction TFloatField.GetAsInteger: Longint;\r\n\r\nbegin\r\n Result:=Round(GetAsFloat);\r\nend;\r\n\r\nfunction TFloatField.GetAsString: string;\r\n\r\nvar\r\n P : JSValue;\r\n\r\nbegin\r\n P:=GetData;\r\n if IsNumber(P) then\r\n Result:=FloatToStr(Double(P))\r\n else\r\n Result:='';\r\nend;\r\n\r\nprocedure TFloatField.GetText(var AText: string; ADisplayText: Boolean);\r\n\r\nVar\r\n fmt : string;\r\n E : Double;\r\n Digits : integer;\r\n ff: TFloatFormat;\r\n P : JSValue;\r\n\r\nbegin\r\n AText:='';\r\n P:=GetData;\r\n if Not IsNumber(P) then\r\n exit;\r\n E:=Double(P);\r\n If ADisplayText or (Length(FEditFormat) = 0) Then\r\n Fmt:=FDisplayFormat\r\n else\r\n Fmt:=FEditFormat;\r\n \r\n Digits := 0;\r\n if not FCurrency then\r\n ff := ffGeneral\r\n else\r\n begin\r\n Digits := 2;\r\n ff := ffFixed;\r\n end;\r\n\r\n\r\n If fmt<>'' then\r\n AText:=FormatFloat(fmt,E)\r\n else\r\n AText:=FloatToStrF(E,ff,FPrecision,Digits);\r\nend;\r\n\r\nprocedure TFloatField.SetAsFloat(AValue: Double);\r\n\r\nbegin\r\n If CheckRange(AValue) then\r\n SetData(AValue)\r\n else\r\n RangeError(AValue,FMinValue,FMaxValue);\r\nend;\r\n\r\nprocedure TFloatField.SetAsLargeInt(AValue: NativeInt);\r\nbegin\r\n SetAsFloat(AValue);\r\nend;\r\n\r\nprocedure TFloatField.SetAsInteger(AValue: Longint);\r\n\r\nbegin\r\n SetAsFloat(AValue);\r\nend;\r\n\r\nprocedure TFloatField.SetAsString(const AValue: string);\r\n\r\nvar f : Double;\r\n\r\nbegin\r\n If (AValue='') then\r\n Clear\r\n else \r\n begin\r\n If not TryStrToFloat(AValue,F) then\r\n DatabaseErrorFmt(SNotAFloat, [AValue]);\r\n SetAsFloat(f);\r\n end;\r\nend;\r\n\r\nprocedure TFloatField.SetVarValue(const AValue: JSValue);\r\nbegin\r\n if IsNumber(aValue) then\r\n SetAsFloat(Double(AValue))\r\n else\r\n RaiseAccessError('Float');\r\nend;\r\n\r\nconstructor TFloatField.Create(AOwner: TComponent);\r\n\r\nbegin\r\n Inherited Create(AOwner);\r\n SetDataType(ftFloat);\r\n FPrecision:=15;\r\n// MVC\r\n// FValidChars := [DecimalSeparator, '+', '-', '0'..'9', 'E', 'e'];\r\nend;\r\n\r\nFunction TFloatField.CheckRange(AValue : Double) : Boolean;\r\n\r\nbegin\r\n If (FMinValue<>0) or (FMaxValue<>0) then\r\n Result:=(AValue>=FMinValue) and (AValue<=FMaxValue)\r\n else\r\n Result:=True;\r\nend;\r\n\r\n{ TBooleanField }\r\n\r\nfunction TBooleanField.GetAsBoolean: Boolean;\r\n\r\nvar\r\n P : JSValue;\r\n\r\nbegin\r\n P:=GetData;\r\n if isBoolean(P) then\r\n Result:=Boolean(P)\r\n else\r\n Result:=False;\r\nend;\r\n\r\nfunction TBooleanField.GetAsJSValue: JSValue;\r\n\r\nvar\r\n P : JSValue;\r\n\r\nbegin\r\n P:=GetData;\r\n if isBoolean(P) then\r\n Result:=Boolean(P)\r\n else\r\n Result:=Null;\r\nend;\r\n\r\nfunction TBooleanField.GetAsString: string;\r\n\r\nvar\r\n P : JSValue;\r\n\r\nbegin\r\n P:=GetData;\r\n if isBoolean(P) then\r\n Result:=FDisplays[False,Boolean(P)]\r\n else\r\n result:='';\r\nend;\r\n\r\nfunction TBooleanField.GetDefaultWidth: Longint;\r\n\r\nbegin\r\n Result:=Length(FDisplays[false,false]);\r\n If Result0);\r\nend;\r\n\r\nprocedure TBooleanField.SetAsBoolean(AValue: Boolean);\r\n\r\nbegin\r\n SetData(AValue);\r\nend;\r\n\r\nprocedure TBooleanField.SetAsString(const AValue: string);\r\n\r\nvar Temp : string;\r\n\r\nbegin\r\n Temp:=UpperCase(AValue);\r\n if Temp='' then\r\n Clear\r\n else if pos(Temp, FDisplays[True,True])=1 then\r\n SetAsBoolean(True)\r\n else if pos(Temp, FDisplays[True,False])=1 then\r\n SetAsBoolean(False)\r\n else\r\n DatabaseErrorFmt(SNotABoolean,[AValue]);\r\nend;\r\n\r\nprocedure TBooleanField.SetVarValue(const AValue: JSValue);\r\nbegin\r\n if isBoolean(aValue) then\r\n SetAsBoolean(Boolean(AValue))\r\n else if isNumber(aValue) then\r\n SetAsBoolean(Double(AValue)<>0)\r\nend;\r\n\r\nconstructor TBooleanField.Create(AOwner: TComponent);\r\n\r\nbegin\r\n Inherited Create(AOwner);\r\n SetDataType(ftBoolean);\r\n DisplayValues:='True;False';\r\nend;\r\n\r\nProcedure TBooleanField.SetDisplayValues(const AValue : String);\r\n\r\nvar I : longint;\r\n\r\nbegin\r\n If FDisplayValues<>AValue then\r\n begin\r\n I:=Pos(';',AValue);\r\n If (I<2) or (I=Length(AValue)) then\r\n DatabaseErrorFmt(SInvalidDisplayValues,[AValue]);\r\n FdisplayValues:=AValue;\r\n // Store display values and their uppercase equivalents;\r\n FDisplays[False,True]:=Copy(AValue,1,I-1);\r\n FDisplays[True,True]:=UpperCase(FDisplays[False,True]);\r\n FDisplays[False,False]:=Copy(AValue,I+1,Length(AValue)-i);\r\n FDisplays[True,False]:=UpperCase(FDisplays[False,False]);\r\n PropertyChanged(True);\r\n end;\r\nend;\r\n\r\n{ TDateTimeField }\r\n\r\nprocedure TDateTimeField.SetDisplayFormat(const AValue: string);\r\nbegin\r\n if FDisplayFormat<>AValue then begin\r\n FDisplayFormat:=AValue;\r\n PropertyChanged(True);\r\n end;\r\nend;\r\n\r\nfunction TDateTimeField.ConvertToDateTime(aValue: JSValue; aRaiseError: Boolean): TDateTime;\r\nbegin\r\n if JS.isNull(aValue) then\r\n Result:=0\r\n else if Assigned(Dataset) then\r\n Result:=Dataset.ConvertToDateTime(Self,aValue,aRaiseError)\r\n else\r\n Result:=TDataset.DefaultConvertToDateTime(Self,aValue,aRaiseError);\r\nend;\r\n\r\nfunction TDateTimeField.DateTimeToNativeDateTime(aValue: TDateTime): JSValue;\r\nbegin\r\n if Assigned(Dataset) then\r\n Result:=Dataset.ConvertDateTimeToNative(Self,aValue)\r\n else\r\n Result:=TDataset.DefaultConvertDateTimeToNative(Self,aValue);\r\nend;\r\n\r\nfunction TDateTimeField.GetAsDateTime: TDateTime;\r\n\r\nbegin\r\n Result:=ConvertToDateTime(GetData,False);\r\nend;\r\n\r\nprocedure TDateTimeField.SetVarValue(const AValue: JSValue);\r\n\r\nbegin\r\n SetAsDateTime(ConvertToDateTime(aValue,True));\r\nend;\r\n\r\nfunction TDateTimeField.GetAsJSValue: JSValue;\r\n\r\nbegin\r\n Result:=GetData;\r\n if Not isString(Result) then\r\n Result:=Null;\r\nend;\r\n\r\nfunction TDateTimeField.GetDataSize: Integer;\r\nbegin\r\n Result:=inherited GetDataSize;\r\nend;\r\n\r\nfunction TDateTimeField.GetAsFloat: Double;\r\n\r\nbegin\r\n Result:=GetAsdateTime;\r\nend;\r\n\r\n\r\nfunction TDateTimeField.GetAsString: string;\r\n\r\nbegin\r\n GetText(Result,False);\r\nend;\r\n\r\n\r\nProcedure TDateTimeField.GetText(var AText: string; ADisplayText: Boolean);\r\n\r\nvar\r\n R : TDateTime;\r\n F : String;\r\n\r\nbegin\r\n R:=ConvertToDateTime(GetData,false);\r\n If (R=0) then\r\n AText:=''\r\n else\r\n begin\r\n If (ADisplayText) and (Length(FDisplayFormat)<>0) then\r\n F:=FDisplayFormat\r\n else\r\n Case DataType of\r\n ftTime : F:=LongTimeFormat;\r\n ftDate : F:=ShortDateFormat;\r\n else\r\n F:='c'\r\n end;\r\n AText:=FormatDateTime(F,R);\r\n end;\r\nend;\r\n\r\n\r\nprocedure TDateTimeField.SetAsDateTime(AValue: TDateTime);\r\n\r\nbegin\r\n SetData(DateTimeToNativeDateTime(aValue));\r\nend;\r\n\r\n\r\nprocedure TDateTimeField.SetAsFloat(AValue: Double);\r\n\r\nbegin\r\n SetAsDateTime(AValue);\r\nend;\r\n\r\n\r\nprocedure TDateTimeField.SetAsString(const AValue: string);\r\n\r\nvar R : TDateTime;\r\n\r\nbegin\r\n if AValue<>'' then\r\n begin\r\n R:=StrToDateTime(AValue);\r\n SetData(DateTimeToNativeDateTime(R));\r\n end\r\n else\r\n SetData(Null);\r\nend;\r\n\r\n\r\nconstructor TDateTimeField.Create(AOwner: TComponent);\r\n\r\nbegin\r\n Inherited Create(AOwner);\r\n SetDataType(ftDateTime);\r\nend;\r\n\r\n\r\n{ TDateField }\r\n\r\nconstructor TDateField.Create(AOwner: TComponent);\r\n\r\nbegin\r\n Inherited Create(AOwner);\r\n SetDataType(ftDate);\r\nend;\r\n\r\n\r\n{ TTimeField }\r\n\r\nconstructor TTimeField.Create(AOwner: TComponent);\r\n\r\nbegin\r\n Inherited Create(AOwner);\r\n SetDataType(ftTime);\r\nend;\r\n\r\nprocedure TTimeField.SetAsString(const AValue: string);\r\n\r\nvar\r\n R : TDateTime;\r\n\r\nbegin\r\n if AValue<>'' then\r\n begin\r\n R:=StrToTime(AValue);\r\n SetData(DateTimeToNativeDateTime(R));\r\n end\r\n else\r\n SetData(Null);\r\nend;\r\n\r\n\r\n\r\n{ TBinaryField }\r\n\r\nclass procedure TBinaryField.CheckTypeSize(AValue: Longint);\r\n\r\nbegin\r\n // Just check for really invalid stuff; actual size is\r\n // dependent on the record...\r\n If AValue<1 then\r\n DatabaseErrorFmt(SInvalidFieldSize,[AValue]);\r\nend;\r\n\r\nfunction TBinaryField.BlobToBytes(aValue: JSValue): TBytes;\r\n\r\nbegin\r\n if Assigned(Dataset) then\r\n Result:=DataSet.BlobDataToBytes(aValue)\r\n else\r\n Result:=TDataSet.DefaultBlobDataToBytes(aValue)\r\nend;\r\n\r\nfunction TBinaryField.BytesToBlob(aValue: TBytes): JSValue;\r\n\r\nbegin\r\n if Assigned(Dataset) then\r\n Result:=DataSet.BytesToBlobData(aValue)\r\n else\r\n Result:=TDataSet.DefaultBytesToBlobData(aValue)\r\nend;\r\n\r\nfunction TBinaryField.GetAsString: string;\r\n\r\nvar\r\n V : JSValue;\r\n S : TBytes;\r\n I : Integer;\r\n\r\nbegin\r\n Result := '';\r\n V:=GetData;\r\n if V<>Null then\r\n if (DataType=ftMemo) then\r\n Result:=String(V)\r\n else\r\n begin\r\n S:=BlobToBytes(V);\r\n For I:=0 to Length(S)-1 do\r\n Result:=TJSString(Result).Concat(TJSString.fromCharCode(S[I]));\r\n end;\r\nend;\r\n\r\n\r\nfunction TBinaryField.GetAsJSValue: JSValue;\r\n\r\nbegin\r\n Result:=GetData;\r\nend;\r\n\r\n\r\nfunction TBinaryField.GetValue(var AValue: TBytes): Boolean;\r\nvar\r\n V : JSValue;\r\nbegin\r\n V:=GetData;\r\n Result:=(V<>Null);\r\n if Result then\r\n AValue:=BlobToBytes(V)\r\n else\r\n SetLength(AValue,0);\r\nend;\r\n\r\n\r\n\r\nprocedure TBinaryField.SetAsString(const AValue: string);\r\n\r\nvar\r\n B : TBytes;\r\n i : Integer;\r\n\r\nbegin\r\n if DataType=ftMemo then\r\n SetData(aValue)\r\n else\r\n begin\r\n SetLength(B, Length(aValue));\r\n For I:=1 to Length(aValue) do\r\n B[i-1]:=Ord(aValue[i]);\r\n SetAsBytes(B);\r\n end;\r\nend;\r\n\r\n\r\nprocedure TBinaryField.SetVarValue(const AValue: JSValue);\r\n\r\nvar\r\n B: TBytes;\r\n I,Len: integer;\r\n\r\nbegin\r\n if IsArray(AValue) then\r\n begin\r\n Len:=Length(TJSValueDynArray(AValue));\r\n SetLength(B, Len);\r\n For I:=1 to Len-1 do\r\n B[i]:=TBytes(AValue)[i];\r\n SetAsBytes(B);\r\n end\r\n else if IsString(AValue) then\r\n SetAsString(String(AValue))\r\n else\r\n RaiseAccessError('Blob');\r\nend;\r\n\r\nfunction TBinaryField.GetAsBytes: TBytes;\r\n\r\nVar\r\n V : JSValue;\r\n\r\nbegin\r\n V:=GetData;\r\n if Assigned(V) then\r\n Result:=BlobToBytes(V)\r\n else\r\n SetLength(Result,0);\r\nend;\r\n\r\nprocedure TBinaryField.SetAsBytes(const aValue: TBytes);\r\nbegin\r\n SetData(BytesToBlob(aValue))\r\nend;\r\n\r\n\r\nconstructor TBinaryField.Create(AOwner: TComponent);\r\n\r\nbegin\r\n Inherited Create(AOwner);\r\nend;\r\n\r\n\r\n\r\n{ TBlobField }\r\n\r\nconstructor TBlobField.Create(AOwner: TComponent);\r\n\r\nbegin\r\n Inherited Create(AOwner);\r\n SetDataType(ftBlob);\r\nend;\r\n\r\nprocedure TBlobField.Clear;\r\nbegin\r\n SetData(Null);\r\nend;\r\n\r\n(*\r\nfunction TBlobField.GetBlobType: TBlobType;\r\nbegin\r\n Result:=ftBlob;\r\nend;\r\n\r\nprocedure TBlobField.SetBlobType(AValue: TBlobType);\r\nbegin\r\n SetFieldType(TFieldType(AValue));\r\nend;\r\n*)\r\n\r\n\r\n\r\nclass procedure TBlobField.CheckTypeSize(AValue: Longint);\r\nbegin\r\n If AValue<0 then\r\n DatabaseErrorFmt(SInvalidFieldSize,[AValue]);\r\nend;\r\n\r\nfunction TBlobField.GetBlobSize: Longint;\r\n\r\nvar\r\n B : TBytes;\r\n\r\nbegin\r\n B:=GetAsBytes;\r\n Result:=Length(B);\r\nend;\r\n\r\n\r\nfunction TBlobField.GetIsNull: Boolean;\r\n\r\nbegin\r\n if Not Modified then\r\n Result:= inherited GetIsNull\r\n else\r\n Result:=GetBlobSize=0;\r\nend;\r\n\r\nprocedure TBlobField.GetText(var AText: string; ADisplayText: Boolean);\r\nbegin\r\n if ADisplayText then\r\n AText := '(BLOB)'\r\n else\r\n AText := inherited GetAsString;\r\nend;\r\n\r\nclass function TBlobField.IsBlob: Boolean;\r\n\r\nbegin\r\n Result:=True;\r\nend;\r\n\r\nprocedure TBlobField.SetFieldType(AValue: TFieldType);\r\nbegin\r\n if AValue in ftBlobTypes then\r\n SetDataType(AValue);\r\nend;\r\n\r\n{ TMemoField }\r\n\r\nconstructor TMemoField.Create(AOwner: TComponent);\r\nbegin\r\n inherited Create(AOwner);\r\n SetDataType(ftMemo);\r\nend;\r\n\r\nprocedure TMemoField.GetText(var AText: string; ADisplayText: Boolean);\r\nbegin\r\n AText := inherited GetAsString;\r\nend;\r\n\r\n\r\n{ TVariantField }\r\n\r\nconstructor TVariantField.Create(AOwner: TComponent);\r\nbegin\r\n inherited Create(AOwner);\r\n SetDataType(ftVariant);\r\nend;\r\n\r\nclass procedure TVariantField.CheckTypeSize(aValue: Integer);\r\nbegin\r\n { empty }\r\nend;\r\n\r\nfunction TVariantField.GetAsBoolean: Boolean;\r\nbegin\r\n Result :=GetAsJSValue=True;\r\nend;\r\n\r\nfunction TVariantField.GetAsDateTime: TDateTime;\r\n\r\nVar\r\n V : JSValue;\r\n\r\nbegin\r\n V:=GetData;\r\n if Assigned(Dataset) then\r\n Result:=Dataset.ConvertToDateTime(Self,V,True)\r\n else\r\n Result:=TDataset.DefaultConvertToDateTime(Self,V,True)\r\nend;\r\n\r\nfunction TVariantField.GetAsFloat: Double;\r\n\r\nVar\r\n V : JSValue;\r\n\r\nbegin\r\n V:=GetData;\r\n if isNumber(V) then\r\n Result:=Double(V)\r\n else if isString(V) then\r\n Result:=parsefloat(String(V))\r\n else\r\n RaiseAccessError('Variant');\r\nend;\r\n\r\nfunction TVariantField.GetAsInteger: Longint;\r\nVar\r\n V : JSValue;\r\n\r\nbegin\r\n V:=GetData;\r\n if isInteger(V) then\r\n Result:=Integer(V)\r\n else if isString(V) then\r\n Result:=parseInt(String(V))\r\n else\r\n RaiseAccessError('Variant');\r\nend;\r\n\r\nfunction TVariantField.GetAsString: string;\r\nVar\r\n V : JSValue;\r\n\r\nbegin\r\n V:=GetData;\r\n if isInteger(V) then\r\n Result:=IntToStr(Integer(V))\r\n else if isNumber(V) then\r\n Result:=FloatToStr(Double(V))\r\n else if isString(V) then\r\n Result:=String(V)\r\n else\r\n RaiseAccessError('Variant');\r\nend;\r\n\r\n\r\nfunction TVariantField.GetAsJSValue: JSValue;\r\nbegin\r\n Result:=GetData;\r\nend;\r\n\r\nprocedure TVariantField.SetAsBoolean(aValue: Boolean);\r\nbegin\r\n SetVarValue(aValue);\r\nend;\r\n\r\nprocedure TVariantField.SetAsDateTime(aValue: TDateTime);\r\nbegin\r\n SetVarValue(aValue);\r\nend;\r\n\r\nprocedure TVariantField.SetAsFloat(aValue: Double);\r\nbegin\r\n SetVarValue(aValue);\r\nend;\r\n\r\nprocedure TVariantField.SetAsInteger(AValue: Longint);\r\nbegin\r\n SetVarValue(aValue);\r\nend;\r\n\r\nprocedure TVariantField.SetAsString(const aValue: string);\r\nbegin\r\n SetVarValue(aValue);\r\nend;\r\n\r\nprocedure TVariantField.SetVarValue(const aValue: JSValue);\r\nbegin\r\n SetData(aValue);\r\nend;\r\n\r\n{ TFieldsEnumerator }\r\n\r\nfunction TFieldsEnumerator.GetCurrent: TField;\r\nbegin\r\n Result := FFields[FPosition];\r\nend;\r\n\r\nconstructor TFieldsEnumerator.Create(AFields: TFields);\r\nbegin\r\n inherited Create;\r\n FFields := AFields;\r\n FPosition := -1;\r\nend;\r\n\r\nfunction TFieldsEnumerator.MoveNext: Boolean;\r\nbegin\r\n inc(FPosition);\r\n Result := FPosition < FFields.Count;\r\nend;\r\n\r\n{ TFields }\r\n\r\nconstructor TFields.Create(ADataset: TDataset);\r\n\r\nbegin\r\n FDataSet:=ADataset;\r\n FFieldList:=TFpList.Create;\r\n FValidFieldKinds:=[fkData..fkInternalcalc];\r\nend;\r\n\r\ndestructor TFields.Destroy;\r\n\r\nbegin\r\n if Assigned(FFieldList) then\r\n Clear;\r\n FreeAndNil(FFieldList);\r\n inherited Destroy;\r\nend;\r\n\r\nprocedure TFields.ClearFieldDefs;\r\n\r\nVar\r\n i : Integer;\r\n\r\nbegin\r\n For I:=0 to Count-1 do\r\n Fields[i].FFieldDef:=Nil;\r\nend;\r\n\r\nprocedure TFields.Changed;\r\n\r\nbegin\r\n // Removed FDataSet.Active check, needed for Persistent fields (see bug ID 30954)\r\n if (FDataSet <> nil) and not (csDestroying in FDataSet.ComponentState) then\r\n FDataSet.DataEvent(deFieldListChange, 0);\r\n If Assigned(FOnChange) then\r\n FOnChange(Self);\r\nend;\r\n\r\nprocedure TFields.CheckfieldKind(Fieldkind: TFieldKind; Field: TField);\r\n\r\nbegin\r\n If Not (FieldKind in ValidFieldKinds) Then\r\n DatabaseErrorFmt(SInvalidFieldKind,[Field.FieldName]);\r\nend;\r\n\r\nfunction TFields.GetCount: Longint;\r\n\r\nbegin\r\n Result:=FFieldList.Count;\r\nend;\r\n\r\n\r\nfunction TFields.GetField(Index: Integer): TField;\r\n\r\nbegin\r\n Result:=Tfield(FFieldList[Index]);\r\nend;\r\n\r\nprocedure TFields.SetField(Index: Integer; Value: TField);\r\nbegin\r\n Fields[Index].Assign(Value);\r\nend;\r\n\r\nprocedure TFields.SetFieldIndex(Field: TField; Value: Integer);\r\nvar Old : Longint;\r\nbegin\r\n Old := FFieldList.indexOf(Field);\r\n If Old=-1 then\r\n Exit;\r\n // Check value\r\n If Value<0 Then Value:=0;\r\n If Value>=Count then Value:=Count-1;\r\n If Value<>Old then\r\n begin\r\n FFieldList.Delete(Old);\r\n FFieldList.Insert(Value,Field);\r\n Field.PropertyChanged(True);\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TFields.Add(Field: TField);\r\n\r\nbegin\r\n CheckFieldName(Field.FieldName);\r\n FFieldList.Add(Field);\r\n Field.FFields:=Self;\r\n Changed;\r\nend;\r\n\r\nprocedure TFields.CheckFieldName(const Value: String);\r\n\r\nbegin\r\n If FindField(Value)<>Nil then\r\n DataBaseErrorFmt(SDuplicateFieldName,[Value],FDataset);\r\nend;\r\n\r\nprocedure TFields.CheckFieldNames(const Value: String);\r\n\r\nvar\r\n N: String;\r\n StrPos: Integer;\r\n\r\nbegin\r\n if Value = '' then\r\n Exit;\r\n StrPos := 1;\r\n repeat\r\n N := ExtractFieldName(Value, StrPos);\r\n // Will raise an error if no such field...\r\n FieldByName(N);\r\n until StrPos > Length(Value);\r\nend;\r\n\r\nprocedure TFields.Clear;\r\nvar\r\n AField: TField;\r\nbegin\r\n while FFieldList.Count > 0 do \r\n begin\r\n AField := TField(FFieldList.Last);\r\n AField.FDataSet := Nil;\r\n AField.Free;\r\n FFieldList.Delete(FFieldList.Count - 1);\r\n end;\r\n Changed;\r\nend;\r\n\r\nfunction TFields.FindField(const Value: String): TField;\r\nvar S : String;\r\n I : longint;\r\nbegin\r\n S:=UpperCase(Value);\r\n For I:=0 To FFieldList.Count-1 do\r\n begin\r\n Result:=TField(FFieldList[I]);\r\n if S=UpperCase(Result.FieldName) then\r\n begin\r\n {$ifdef dsdebug}\r\n Writeln ('Found field ',Value);\r\n {$endif}\r\n Exit;\r\n end;\r\n end;\r\n Result:=Nil;\r\nend;\r\n\r\nfunction TFields.FieldByName(const Value: String): TField;\r\n\r\nbegin\r\n Result:=FindField(Value);\r\n If result=Nil then\r\n DatabaseErrorFmt(SFieldNotFound,[Value],FDataset);\r\nend;\r\n\r\nfunction TFields.FieldByNumber(FieldNo: Integer): TField;\r\nvar i : Longint;\r\nbegin\r\n For I:=0 to FFieldList.Count-1 do\r\n begin\r\n Result:=TField(FFieldList[I]);\r\n if FieldNo=Result.FieldNo then\r\n Exit;\r\n end;\r\n Result:=Nil;\r\nend;\r\n\r\nfunction TFields.GetEnumerator: TFieldsEnumerator;\r\n\r\nbegin\r\n Result:=TFieldsEnumerator.Create(Self);\r\nend;\r\n\r\nprocedure TFields.GetFieldNames(Values: TStrings);\r\nvar i : longint;\r\nbegin\r\n Values.Clear;\r\n For I:=0 to FFieldList.Count-1 do\r\n Values.Add(Tfield(FFieldList[I]).FieldName);\r\nend;\r\n\r\nfunction TFields.IndexOf(Field: TField): Longint;\r\n\r\nbegin\r\n Result:=FFieldList.IndexOf(Field);\r\nend;\r\n\r\nprocedure TFields.Remove(Value : TField);\r\n\r\nbegin\r\n FFieldList.Remove(Value);\r\n Value.FFields := nil;\r\n Changed;\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n TDatalink\r\n ---------------------------------------------------------------------}\r\n\r\nConstructor TDataLink.Create;\r\n\r\nbegin\r\n Inherited Create;\r\n FBufferCount:=1;\r\n FFirstRecord := 0;\r\n FDataSource := nil;\r\n FDatasourceFixed:=False;\r\nend;\r\n\r\n\r\nDestructor TDataLink.Destroy;\r\n\r\nbegin\r\n Factive:=False;\r\n FEditing:=False;\r\n FDataSourceFixed:=False;\r\n DataSource:=Nil;\r\n Inherited Destroy;\r\nend;\r\n\r\n\r\nProcedure TDataLink.ActiveChanged;\r\n\r\nbegin\r\n FFirstRecord := 0;\r\nend;\r\n\r\nProcedure TDataLink.CheckActiveAndEditing;\r\n\r\nVar\r\n B : Boolean;\r\n\r\nbegin\r\n B:=Assigned(DataSource) and Not (DataSource.State in [dsInactive,dsOpening]);\r\n If B<>FActive then\r\n begin\r\n FActive:=B;\r\n ActiveChanged;\r\n end;\r\n B:=Assigned(DataSource) and (DataSource.State in dsEditModes) and Not FReadOnly;\r\n If B<>FEditing Then\r\n begin\r\n FEditing:=B;\r\n EditingChanged;\r\n end;\r\nend;\r\n\r\n\r\nProcedure TDataLink.CheckBrowseMode;\r\n\r\nbegin\r\nend;\r\n\r\n\r\nFunction TDataLink.CalcFirstRecord(Index : Integer) : Integer;\r\nbegin\r\n if DataSource.DataSet.FActiveRecord > FFirstRecord + Index + FBufferCount - 1 then\r\n Result := DataSource.DataSet.FActiveRecord - (FFirstRecord + Index + FBufferCount - 1)\r\n else if DataSource.DataSet.FActiveRecord < FFirstRecord + Index then\r\n Result := DataSource.DataSet.FActiveRecord - (FFirstRecord + Index)\r\n else Result := 0;\r\n \r\n Inc(FFirstRecord, Index + Result);\r\nend;\r\n\r\n\r\nProcedure TDataLink.CalcRange;\r\nvar\r\n aMax, aMin: integer;\r\nbegin\r\n aMin:= DataSet.FActiveRecord - FBufferCount + 1;\r\n If aMin < 0 Then aMin:= 0;\r\n aMax:= Dataset.FBufferCount - FBufferCount;\r\n If aMax < 0 then aMax:= 0;\r\n\r\n If aMax>DataSet.FActiveRecord Then aMax:=DataSet.FActiveRecord;\r\n If FFirstRecord < aMin Then FFirstRecord:= aMin;\r\n If FFirstrecord > aMax Then FFirstRecord:= aMax;\r\n\r\n If (FfirstRecord<>0) And\r\n (DataSet.FActiveRecord - FFirstRecord < FBufferCount -1) Then\r\n Dec(FFirstRecord, 1);\r\n\r\nend;\r\n\r\n\r\nProcedure TDataLink.DataEvent(Event: TDataEvent; Info: JSValue);\r\n\r\n\r\nbegin\r\n Case Event of\r\n deFieldChange, deRecordChange:\r\n If Not FUpdatingRecord then\r\n RecordChanged(TField(Info));\r\n deDataSetChange: begin\r\n SetActive(DataSource.DataSet.Active);\r\n CalcRange;\r\n CalcFirstRecord(Integer(Info));\r\n DatasetChanged;\r\n end;\r\n deDataSetScroll: DatasetScrolled(CalcFirstRecord(Integer(Info)));\r\n deLayoutChange: begin\r\n CalcFirstRecord(Integer(Info));\r\n LayoutChanged;\r\n end;\r\n deUpdateRecord: UpdateRecord;\r\n deUpdateState: CheckActiveAndEditing;\r\n deCheckBrowseMode: CheckBrowseMode;\r\n deFocusControl:\r\n FocusControl(Info);\r\n end;\r\nend;\r\n\r\n\r\nProcedure TDataLink.DataSetChanged;\r\n\r\nbegin\r\n RecordChanged(Nil);\r\nend;\r\n\r\n\r\nProcedure TDataLink.DataSetScrolled(Distance: Integer);\r\n\r\nbegin\r\n DataSetChanged;\r\nend;\r\n\r\n\r\nProcedure TDataLink.EditingChanged;\r\n\r\nbegin\r\nend;\r\n\r\n\r\nProcedure TDataLink.FocusControl(Field: JSValue);\r\n\r\nbegin\r\nend;\r\n\r\n\r\nFunction TDataLink.GetActiveRecord: Integer;\r\n\r\nbegin\r\n Result:=Dataset.FActiveRecord - FFirstRecord;\r\nend;\r\n\r\nFunction TDatalink.GetDataSet : TDataset;\r\n\r\nbegin\r\n If Assigned(Datasource) then\r\n Result:=DataSource.DataSet\r\n else\r\n Result:=Nil; \r\nend;\r\n\r\n\r\nFunction TDataLink.GetBOF: Boolean;\r\n\r\nbegin\r\n Result:=DataSet.BOF\r\nend;\r\n\r\n\r\nFunction TDataLink.GetBufferCount: Integer;\r\n\r\nbegin\r\n Result:=FBufferCount;\r\nend;\r\n\r\n\r\nFunction TDataLink.GetEOF: Boolean;\r\n\r\nbegin\r\n Result:=DataSet.EOF\r\nend;\r\n\r\n\r\nFunction TDataLink.GetRecordCount: Integer;\r\n\r\nbegin\r\n Result:=Dataset.FRecordCount;\r\n If Result>BufferCount then\r\n Result:=BufferCount;\r\nend;\r\n\r\n\r\nProcedure TDataLink.LayoutChanged;\r\n\r\nbegin\r\n DataSetChanged;\r\nend;\r\n\r\n\r\nFunction TDataLink.MoveBy(Distance: Integer): Integer;\r\n\r\nbegin\r\n Result:=DataSet.MoveBy(Distance);\r\nend;\r\n\r\n\r\nProcedure TDataLink.RecordChanged(Field: TField);\r\n\r\nbegin\r\nend;\r\n\r\n\r\nProcedure TDataLink.SetActiveRecord(Value: Integer);\r\n\r\nbegin\r\n{$ifdef dsdebug}\r\n Writeln('Datalink. Setting active record to ',Value,' with firstrecord ',ffirstrecord);\r\n{$endif}\r\n Dataset.FActiveRecord:=Value + FFirstRecord;\r\nend;\r\n\r\n\r\nProcedure TDataLink.SetBufferCount(Value: Integer);\r\n\r\nbegin\r\n If FBufferCount<>Value then\r\n begin\r\n FBufferCount:=Value;\r\n if Active then begin\r\n DataSet.RecalcBufListSize;\r\n CalcRange;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TDataLink.SetActive(AActive: Boolean);\r\nbegin\r\n if Active <> AActive then\r\n begin\r\n FActive := AActive;\r\n // !!!: Set internal state\r\n ActiveChanged;\r\n end;\r\nend;\r\n\r\nProcedure TDataLink.SetDataSource(Value : TDatasource);\r\n\r\nbegin\r\n if FDataSource = Value then\r\n Exit;\r\n if not FDataSourceFixed then\r\n begin\r\n if Assigned(DataSource) then\r\n Begin\r\n DataSource.UnregisterDatalink(Self);\r\n FDataSource := nil;\r\n CheckActiveAndEditing;\r\n End;\r\n FDataSource := Value;\r\n if Assigned(DataSource) then\r\n begin\r\n DataSource.RegisterDatalink(Self);\r\n CheckActiveAndEditing;\r\n End;\r\n end;\r\nend;\r\n\r\nProcedure TDatalink.SetReadOnly(Value : Boolean);\r\n\r\nbegin\r\n If FReadOnly<>Value then\r\n begin\r\n FReadOnly:=Value;\r\n CheckActiveAndEditing;\r\n end;\r\nend;\r\n\r\nProcedure TDataLink.UpdateData;\r\n\r\nbegin\r\nend;\r\n\r\n\r\n\r\nFunction TDataLink.Edit: Boolean;\r\n\r\nbegin\r\n If Not FReadOnly then\r\n DataSource.Edit;\r\n // Triggered event will set FEditing\r\n Result:=FEditing;\r\nend;\r\n\r\n\r\nProcedure TDataLink.UpdateRecord;\r\n\r\nbegin\r\n FUpdatingRecord:=True;\r\n Try\r\n UpdateData;\r\n finally\r\n FUpdatingRecord:=False;\r\n end;\r\nend;\r\n\r\n\r\n{ ---------------------------------------------------------------------\r\n TDetailDataLink\r\n ---------------------------------------------------------------------}\r\n\r\nFunction TDetailDataLink.GetDetailDataSet: TDataSet;\r\n\r\nbegin\r\n Result := nil;\r\nend;\r\n\r\n\r\n{ ---------------------------------------------------------------------\r\n TMasterDataLink\r\n ---------------------------------------------------------------------}\r\n\r\nconstructor TMasterDataLink.Create(ADataSet: TDataSet);\r\n\r\nbegin\r\n inherited Create;\r\n FDetailDataSet:=ADataSet;\r\n FFields:=TList.Create;\r\nend;\r\n\r\n\r\ndestructor TMasterDataLink.Destroy;\r\n\r\nbegin\r\n FFields.Free;\r\n inherited Destroy;\r\nend;\r\n\r\n\r\nProcedure TMasterDataLink.ActiveChanged;\r\n\r\nbegin\r\n FFields.Clear;\r\n if Active then\r\n try\r\n DataSet.GetFieldList(FFields, FFieldNames);\r\n except\r\n FFields.Clear;\r\n raise;\r\n end;\r\n if FDetailDataSet.Active and not (csDestroying in FDetailDataSet.ComponentState) then\r\n if Active and (FFields.Count > 0) then\r\n DoMasterChange\r\n else\r\n DoMasterDisable; \r\nend;\r\n\r\n\r\nProcedure TMasterDataLink.CheckBrowseMode;\r\n\r\nbegin\r\n if FDetailDataSet.Active then FDetailDataSet.CheckBrowseMode;\r\nend;\r\n\r\n\r\nFunction TMasterDataLink.GetDetailDataSet: TDataSet;\r\n\r\nbegin\r\n Result := FDetailDataSet;\r\nend;\r\n\r\n\r\nProcedure TMasterDataLink.LayoutChanged;\r\n\r\nbegin\r\n ActiveChanged;\r\nend;\r\n\r\n\r\nProcedure TMasterDataLink.RecordChanged(Field: TField);\r\n\r\nbegin\r\n if (DataSource.State <> dsSetKey) and FDetailDataSet.Active and\r\n (FFields.Count > 0) and ((Field = nil) or\r\n (FFields.IndexOf(Field) >= 0)) then\r\n DoMasterChange; \r\nend;\r\n\r\nprocedure TMasterDatalink.SetFieldNames(const Value: string);\r\n\r\nbegin\r\n if FFieldNames <> Value then\r\n begin\r\n FFieldNames := Value;\r\n ActiveChanged;\r\n end;\r\nend;\r\n\r\nProcedure TMasterDataLink.DoMasterDisable; \r\n\r\nbegin\r\n if Assigned(FOnMasterDisable) then \r\n FOnMasterDisable(Self);\r\nend;\r\n\r\nProcedure TMasterDataLink.DoMasterChange; \r\n\r\nbegin\r\n If Assigned(FOnMasterChange) then\r\n FOnMasterChange(Self);\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n TMasterParamsDataLink\r\n ---------------------------------------------------------------------}\r\n\r\nconstructor TMasterParamsDataLink.Create(ADataSet: TDataSet);\r\n\r\nVar\r\n P : TParams;\r\n\r\nbegin\r\n inherited Create(ADataset);\r\n If (ADataset<>Nil) then\r\n begin\r\n P:=TParams(GetObjectProp(ADataset,'Params',TParams));\r\n if (P<>Nil) then\r\n Params:=P;\r\n end; \r\nend;\r\n\r\n\r\nProcedure TMasterParamsDataLink.SetParams(AValue : TParams);\r\n\r\nbegin\r\n FParams:=AValue;\r\n If (AValue<>Nil) then\r\n RefreshParamNames;\r\nend;\r\n\r\nProcedure TMasterParamsDataLink.RefreshParamNames; \r\n\r\nVar\r\n FN : String;\r\n DS : TDataset;\r\n F : TField;\r\n I : Integer;\r\n P : TParam;\r\n\r\n\r\nbegin\r\n FN:='';\r\n DS:=Dataset;\r\n If Assigned(FParams) then\r\n begin\r\n F:=Nil;\r\n For I:=0 to FParams.Count-1 do\r\n begin\r\n P:=FParams[i];\r\n if not P.Bound then\r\n begin\r\n If Assigned(DS) then\r\n F:=DS.FindField(P.Name);\r\n If (Not Assigned(DS)) or (not DS.Active) or (F<>Nil) then\r\n begin\r\n If (FN<>'') then\r\n FN:=FN+';';\r\n FN:=FN+P.Name;\r\n end;\r\n end;\r\n end;\r\n end;\r\n FieldNames:=FN; \r\nend;\r\n\r\nProcedure TMasterParamsDataLink.CopyParamsFromMaster(CopyBound : Boolean);\r\n\r\nbegin\r\n if Assigned(FParams) then\r\n FParams.CopyParamValuesFromDataset(Dataset,CopyBound);\r\nend;\r\n\r\nProcedure TMasterParamsDataLink.DoMasterDisable; \r\n\r\nbegin\r\n Inherited;\r\n // If master dataset is closing, leave detail dataset intact (Delphi compatible behavior)\r\n // If master dataset is reopened, relationship will be reestablished\r\nend;\r\n\r\nProcedure TMasterParamsDataLink.DoMasterChange; \r\n\r\nbegin\r\n Inherited;\r\n if Assigned(Params) and Assigned(DetailDataset) and DetailDataset.Active then\r\n begin\r\n DetailDataSet.CheckBrowseMode;\r\n DetailDataset.Close;\r\n DetailDataset.Open;\r\n end;\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n TDatasource\r\n ---------------------------------------------------------------------}\r\n\r\nConstructor TDataSource.Create(AOwner: TComponent);\r\n\r\nbegin\r\n Inherited Create(AOwner);\r\n FDatalinks := TList.Create;\r\n FEnabled := True;\r\n FAutoEdit := True;\r\nend;\r\n\r\n\r\nDestructor TDataSource.Destroy;\r\n\r\nbegin\r\n FOnStateCHange:=Nil;\r\n Dataset:=Nil;\r\n With FDataLinks do\r\n While Count>0 do\r\n TDatalink(Items[Count - 1]).DataSource:=Nil;\r\n FDatalinks.Free;\r\n inherited Destroy;\r\nend;\r\n\r\n\r\nProcedure TDatasource.Edit;\r\n\r\nbegin\r\n If (State=dsBrowse) and AutoEdit Then\r\n Dataset.Edit;\r\nend;\r\n\r\n\r\nFunction TDataSource.IsLinkedTo(ADataSet: TDataSet): Boolean;\r\n\r\nbegin\r\n Result:=False;\r\nend;\r\n\r\n\r\nprocedure TDatasource.DistributeEvent(Event: TDataEvent; Info: JSValue);\r\n\r\n\r\nVar\r\n i : Longint;\r\n\r\nbegin\r\n With FDatalinks do\r\n begin\r\n For I:=0 to Count-1 do\r\n With TDatalink(Items[i]) do\r\n If Not VisualControl Then\r\n DataEvent(Event,Info);\r\n For I:=0 to Count-1 do\r\n With TDatalink(Items[i]) do\r\n If VisualControl Then\r\n DataEvent(Event,Info);\r\n end;\r\nend;\r\n\r\nprocedure TDatasource.RegisterDataLink(DataLink: TDataLink);\r\n\r\nbegin\r\n FDatalinks.Add(DataLink);\r\n if Assigned(DataSet) then\r\n DataSet.RecalcBufListSize;\r\nend;\r\n\r\n\r\nprocedure TDatasource.SetDataSet(ADataSet: TDataSet);\r\nbegin\r\n If FDataset<>Nil Then\r\n Begin\r\n FDataset.UnRegisterDataSource(Self);\r\n FDataSet:=nil;\r\n ProcessEvent(deUpdateState,0);\r\n End;\r\n If ADataset<>Nil Then\r\n begin\r\n ADataset.RegisterDatasource(Self);\r\n FDataSet:=ADataset;\r\n ProcessEvent(deUpdateState,0);\r\n End;\r\nend;\r\n\r\n\r\nprocedure TDatasource.SetEnabled(Value: Boolean);\r\nbegin\r\n FEnabled:=Value;\r\nend;\r\n\r\nprocedure TDatasource.DoDataChange (Info : Pointer);\r\nbegin\r\n if Assigned(OnDataChange) then\r\n if Assigned(Info) Then\r\n OnDataChange(Self, TField(Info))\r\n else\r\n OnDataChange(Self, nil);\r\nend;\r\n\r\nprocedure TDatasource.DoStateChange;\r\nbegin\r\n If Assigned(OnStateChange) Then\r\n OnStateChange(Self);\r\nend;\r\n\r\nprocedure TDatasource.DoUpdateData;\r\nbegin\r\n If Assigned(OnUpdateData) Then\r\n OnUpdateData(Self);\r\nend;\r\n\r\n\r\nprocedure TDatasource.UnregisterDataLink(DataLink: TDataLink);\r\n\r\nbegin\r\n FDatalinks.Remove(Datalink);\r\n If Dataset<>Nil then\r\n DataSet.RecalcBufListSize;\r\n //Dataset.SetBufListSize(DataLink.BufferCount);\r\nend;\r\n\r\n\r\nprocedure TDataSource.ProcessEvent(Event : TDataEvent; Info : JSValue);\r\n\r\nConst\r\n OnDataChangeEvents = [deRecordChange, deDataSetChange, deDataSetScroll,\r\n deLayoutChange,deUpdateState];\r\n\r\nVar\r\n NeedDataChange : Boolean;\r\n FLastState : TdataSetState;\r\n\r\nbegin\r\n // Special UpdateState handling.\r\n If Event=deUpdateState then\r\n begin\r\n NeedDataChange:=(FState=dsInactive);\r\n FLastState:=FState;\r\n If Assigned(Dataset) then\r\n FState:=Dataset.State\r\n else\r\n FState:=dsInactive;\r\n // Don't do events if nothing changed.\r\n If FState=FLastState then\r\n exit;\r\n end\r\n else\r\n NeedDataChange:=True;\r\n DistributeEvent(Event,Info);\r\n // Extra handlers\r\n If Not (csDestroying in ComponentState) then\r\n begin\r\n If (Event=deUpdateState) then\r\n DoStateChange;\r\n If (Event in OnDataChangeEvents) and\r\n NeedDataChange Then\r\n DoDataChange(Nil);\r\n If (Event = deFieldChange) Then\r\n DoDataCHange(Pointer(Info));\r\n If (Event=deUpdateRecord) then\r\n DoUpdateData;\r\n end;\r\n end;\r\n\r\n\r\nprocedure SkipQuotesString(S : String; var p : integer; QuoteChar : char; EscapeSlash, EscapeRepeat : Boolean);\r\n\r\nvar notRepeatEscaped : boolean;\r\nbegin\r\n Inc(p);\r\n repeat\r\n notRepeatEscaped := True;\r\n while not CharInSet(S[p],[#0, QuoteChar]) do\r\n begin\r\n if EscapeSlash and (S[p]='\\') and (P=0) do\r\n If (CompareText(Value,Items[i].Name)=0) then\r\n Result:=Items[i]\r\n else\r\n Dec(i);\r\nend;\r\n\r\nProcedure TParams.GetParamList(List: TList; const ParamNames: string);\r\n\r\nVar\r\n P: TParam;\r\n N: String;\r\n StrPos: Integer;\r\n\r\nbegin\r\n if (ParamNames = '') or (List = nil) then\r\n Exit;\r\n StrPos := 1;\r\n repeat\r\n N := ExtractFieldName(ParamNames, StrPos);\r\n P := ParamByName(N);\r\n List.Add(P);\r\n until StrPos > Length(ParamNames);\r\nend;\r\n\r\nFunction TParams.IsEqual(Value: TParams): Boolean;\r\n\r\nVar\r\n I : Integer;\r\n\r\nbegin\r\n Result:=(Value.Count=Count);\r\n I:=Count-1;\r\n While Result and (I>=0) do\r\n begin\r\n Result:=Items[I].IsEqual(Value[i]);\r\n Dec(I);\r\n end;\r\nend;\r\n\r\nFunction TParams.ParamByName(const Value: string): TParam;\r\nbegin\r\n Result:=FindParam(Value);\r\n If (Result=Nil) then\r\n DatabaseErrorFmt(SParameterNotFound,[Value],Dataset);\r\nend;\r\n\r\nFunction TParams.ParseSQL(SQL: String; DoCreate: Boolean): String;\r\n\r\nvar pb : TParamBinding;\r\n rs : string;\r\n\r\nbegin\r\n Result := ParseSQL(SQL,DoCreate,True,True,psInterbase, pb, rs);\r\nend;\r\n\r\nFunction TParams.ParseSQL(SQL: String; DoCreate, EscapeSlash,\r\n EscapeRepeat: Boolean; ParameterStyle: TParamStyle): String;\r\n\r\nvar pb : TParamBinding;\r\n rs : string;\r\n\r\nbegin\r\n Result := ParseSQL(SQL,DoCreate,EscapeSlash,EscapeRepeat,ParameterStyle,pb, rs);\r\nend;\r\n\r\nFunction TParams.ParseSQL(SQL: String; DoCreate, EscapeSlash,\r\n EscapeRepeat: Boolean; ParameterStyle: TParamStyle; out\r\n ParamBinding: TParambinding): String;\r\n\r\nvar rs : string;\r\n\r\nbegin\r\n Result := ParseSQL(SQL,DoCreate,EscapeSlash, EscapeRepeat, ParameterStyle,ParamBinding, rs);\r\nend;\r\n\r\nfunction SkipComments(S : String; Var p: Integer; EscapeSlash, EscapeRepeat : Boolean) : Boolean;\r\n\r\nbegin\r\n Result := False;\r\n case S[P] of\r\n '''', '\"', '`':\r\n begin\r\n Result := True;\r\n // single quote, double quote or backtick delimited string\r\n SkipQuotesString(S,p, S[p], EscapeSlash, EscapeRepeat);\r\n end;\r\n '-': // possible start of -- comment\r\n begin\r\n Inc(p);\r\n if S[p]='-' then // -- comment\r\n begin\r\n Result := True;\r\n repeat // skip until at end of line\r\n Inc(p);\r\n until CharInset(S[p],[#10, #13, #0]);\r\n while CharInSet(S[p],[#10, #13]) do\r\n Inc(p); // newline is part of comment\r\n end;\r\n end;\r\n '/': // possible start of /* */ comment\r\n begin\r\n Inc(p);\r\n if S[p]='*' then // /* */ comment\r\n begin\r\n Result := True;\r\n Inc(p);\r\n while p<=Length(S) do\r\n begin\r\n if S[p]='*' then // possible end of comment\r\n begin\r\n Inc(p);\r\n if S[p]='/' then Break; // end of comment\r\n end\r\n else\r\n Inc(p);\r\n end;\r\n if (P<=Length(s)) and (S[p]='/') then\r\n Inc(p); // skip final /\r\n end;\r\n end;\r\n end; {case}\r\nend;\r\n\r\nFunction TParams.ParseSQL(SQL: String; DoCreate, EscapeSlash,\r\n EscapeRepeat: Boolean; ParameterStyle: TParamStyle; out\r\n ParamBinding: TParambinding; out ReplaceString: string): String;\r\n\r\ntype\r\n // used for ParamPart\r\n TStringPart = record\r\n Start,Stop:integer;\r\n end;\r\n\r\nconst\r\n ParamAllocStepSize = 8;\r\n PAramDelimiters : Array of char = (';',',',' ','(',')',#13,#10,#9,#0,'=','+','-','*','\\','/','[',']','|');\r\n\r\nvar\r\n IgnorePart:boolean;\r\n p,ParamNameStart,BufStart:Integer;\r\n ParamName:string;\r\n QuestionMarkParamCount,ParameterIndex,NewLength:integer;\r\n ParamCount:integer; // actual number of parameters encountered so far;\r\n // always <= Length(ParamPart) = Length(Parambinding)\r\n // Parambinding will have length ParamCount in the end\r\n ParamPart:array of TStringPart; // describe which parts of buf are parameters\r\n NewQueryLength:integer;\r\n NewQuery:string;\r\n NewQueryIndex,BufIndex,CopyLen,i:integer; // Parambinding will have length ParamCount in the end\r\n tmpParam:TParam;\r\n\r\nbegin\r\n if DoCreate then Clear;\r\n // Parse the SQL and build ParamBinding\r\n ParamCount:=0;\r\n NewQueryLength:=Length(SQL);\r\n SetLength(ParamPart,ParamAllocStepSize);\r\n SetLength(ParamBinding,ParamAllocStepSize);\r\n QuestionMarkParamCount:=0; // number of ? params found in query so far\r\n\r\n ReplaceString := '$';\r\n if ParameterStyle = psSimulated then\r\n while pos(ReplaceString,SQL) > 0 do ReplaceString := ReplaceString+'$';\r\n\r\n p:=1;\r\n BufStart:=p; // used to calculate ParamPart.Start values\r\n repeat\r\n while SkipComments(SQL,p,EscapeSlash,EscapeRepeat) do ;\r\n case SQL[p] of\r\n ':','?': // parameter\r\n begin\r\n IgnorePart := False;\r\n if SQL[p]=':' then\r\n begin // find parameter name\r\n Inc(p);\r\n if charInSet(SQL[p],[':','=',' ']) then // ignore ::, since some databases uses this as a cast (wb 4813)\r\n begin\r\n IgnorePart := True;\r\n Inc(p);\r\n end\r\n else\r\n begin\r\n if (SQL[p]='\"') then // Check if the parameter-name is between quotes\r\n begin\r\n ParamNameStart:=p;\r\n SkipQuotesString(SQL,p,'\"',EscapeSlash,EscapeRepeat);\r\n // Do not include the quotes in ParamName, but they must be included\r\n // when the parameter is replaced by some place-holder.\r\n ParamName:=Copy(SQL,ParamNameStart+1,p-ParamNameStart-2);\r\n end\r\n else\r\n begin\r\n ParamNameStart:=p;\r\n while not CharInSet(SQL[p], ParamDelimiters) do\r\n Inc(p);\r\n ParamName:=Copy(SQL,ParamNameStart,p-ParamNameStart);\r\n end;\r\n end;\r\n end\r\n else\r\n begin\r\n Inc(p);\r\n ParamNameStart:=p;\r\n ParamName:='';\r\n end;\r\n if not IgnorePart then\r\n begin\r\n Inc(ParamCount);\r\n if ParamCount>Length(ParamPart) then\r\n begin\r\n NewLength:=Length(ParamPart)+ParamAllocStepSize;\r\n SetLength(ParamPart,NewLength);\r\n SetLength(ParamBinding,NewLength);\r\n end;\r\n if DoCreate then\r\n begin\r\n // Check if this is the first occurance of the parameter\r\n tmpParam := FindParam(ParamName);\r\n // If so, create the parameter and assign the Parameterindex\r\n if not assigned(tmpParam) then\r\n ParameterIndex := CreateParam(ftUnknown, ParamName, ptInput).Index\r\n else // else only assign the ParameterIndex\r\n ParameterIndex := tmpParam.Index;\r\n end\r\n // else find ParameterIndex\r\n else\r\n begin\r\n if ParamName<>'' then\r\n ParameterIndex:=ParamByName(ParamName).Index\r\n else\r\n begin\r\n ParameterIndex:=QuestionMarkParamCount;\r\n Inc(QuestionMarkParamCount);\r\n end;\r\n end;\r\n if ParameterStyle in [psPostgreSQL,psSimulated] then\r\n begin\r\n i:=ParameterIndex+1;\r\n repeat\r\n inc(NewQueryLength);\r\n i:=i div 10;\r\n until i=0;\r\n end;\r\n // store ParameterIndex in FParamIndex, ParamPart data\r\n ParamBinding[ParamCount-1]:=ParameterIndex;\r\n ParamPart[ParamCount-1].Start:=ParamNameStart-BufStart;\r\n ParamPart[ParamCount-1].Stop:=p-BufStart+1;\r\n // update NewQueryLength\r\n Dec(NewQueryLength,p-ParamNameStart);\r\n end;\r\n end;\r\n #0:\r\n Break; // end of SQL\r\n else\r\n Inc(p);\r\n end;\r\n until false;\r\n SetLength(ParamPart,ParamCount);\r\n SetLength(ParamBinding,ParamCount);\r\n if ParamCount<=0 then\r\n NewQuery:=SQL\r\n else\r\n begin\r\n // replace :ParamName by ? for interbase and by $x for postgresql/psSimulated\r\n // (using ParamPart array and NewQueryLength)\r\n if (ParameterStyle = psSimulated) and (length(ReplaceString) > 1) then\r\n inc(NewQueryLength,(paramcount)*(length(ReplaceString)-1));\r\n\r\n SetLength(NewQuery,NewQueryLength);\r\n NewQueryIndex:=1;\r\n BufIndex:=1;\r\n for i:=0 to High(ParamPart) do\r\n begin\r\n CopyLen:=ParamPart[i].Start-BufIndex;\r\n NewQuery:=NewQuery+Copy(SQL,BufIndex,CopyLen);\r\n Inc(NewQueryIndex,CopyLen);\r\n case ParameterStyle of\r\n psInterbase : begin\r\n NewQuery:=NewQuery+'?';\r\n Inc(NewQueryIndex);\r\n end;\r\n psPostgreSQL,\r\n psSimulated : begin\r\n ParamName := IntToStr(ParamBinding[i]+1);\r\n NewQuery:=StringOfChar('$',Length(ReplaceString));\r\n NewQuery:=NewQuery+ParamName;\r\n end;\r\n end;\r\n BufIndex:=ParamPart[i].Stop;\r\n end;\r\n CopyLen:=Length(SQL)+1-BufIndex;\r\n if (CopyLen>0) then\r\n NewQuery:=NewQuery+Copy(SQL,BufIndex,CopyLen);\r\n end;\r\n Result:=NewQuery;\r\nend;\r\n\r\n\r\nProcedure TParams.RemoveParam(Value: TParam);\r\nbegin\r\n Value.Collection:=Nil;\r\nend;\r\n\r\n{ TParam }\r\n\r\nFunction TParam.GetDataSet: TDataSet;\r\nbegin\r\n If Assigned(Collection) and (Collection is TParams) then\r\n Result:=TParams(Collection).GetDataset\r\n else\r\n Result:=Nil;\r\nend;\r\n\r\nFunction TParam.IsParamStored: Boolean;\r\nbegin\r\n Result:=Bound;\r\nend;\r\n\r\nProcedure TParam.AssignParam(Param: TParam);\r\nbegin\r\n if Not Assigned(Param) then\r\n begin\r\n Clear;\r\n FDataType:=ftunknown;\r\n FParamType:=ptUnknown;\r\n Name:='';\r\n Size:=0;\r\n Precision:=0;\r\n NumericScale:=0;\r\n end\r\n else\r\n begin\r\n FDataType:=Param.DataType;\r\n if Param.IsNull then\r\n Clear\r\n else\r\n FValue:=Param.FValue;\r\n FBound:=Param.Bound;\r\n Name:=Param.Name;\r\n if (ParamType=ptUnknown) then\r\n ParamType:=Param.ParamType;\r\n Size:=Param.Size;\r\n Precision:=Param.Precision;\r\n NumericScale:=Param.NumericScale;\r\n end;\r\nend;\r\n\r\nProcedure TParam.AssignTo(Dest: TPersistent);\r\nbegin\r\n if (Dest is TField) then\r\n AssignToField(TField(Dest))\r\n else\r\n inherited AssignTo(Dest);\r\nend;\r\n\r\nFunction TParam.GetAsBoolean: Boolean;\r\nbegin\r\n If IsNull then\r\n Result:=False\r\n else\r\n Result:=FValue=true;\r\nend;\r\n\r\nFunction TParam.GetAsBytes: TBytes;\r\nbegin\r\n if IsNull then\r\n Result:=nil\r\n else if isArray(FValue) then\r\n Result:=TBytes(FValue)\r\nend;\r\n\r\nFunction TParam.GetAsDateTime: TDateTime;\r\nbegin\r\n If IsNull then\r\n Result:=0.0\r\n else\r\n Result:=TDateTime(FValue);\r\nend;\r\n\r\nFunction TParam.GetAsFloat: Double;\r\nbegin\r\n If IsNull then\r\n Result:=0.0\r\n else\r\n Result:=Double(FValue);\r\nend;\r\n\r\nFunction TParam.GetAsInteger: Longint;\r\nbegin\r\n If IsNull or not IsInteger(FValue) then\r\n Result:=0\r\n else\r\n Result:=Integer(FValue);\r\nend;\r\n\r\nFunction TParam.GetAsLargeInt: NativeInt;\r\nbegin\r\n If IsNull or not IsInteger(FValue) then\r\n Result:=0\r\n else\r\n Result:=NativeInt(FValue);\r\nend;\r\n\r\n\r\nFunction TParam.GetAsMemo: string;\r\nbegin\r\n If IsNull or not IsString(FValue) then\r\n Result:=''\r\n else\r\n Result:=String(FValue);\r\nend;\r\n\r\nFunction TParam.GetAsString: string;\r\n\r\nbegin\r\n If IsNull or not IsString(FValue) then\r\n Result:=''\r\n else\r\n Result:=String(FValue);\r\nend;\r\n\r\nFunction TParam.GetAsJSValue: JSValue;\r\nbegin\r\n if IsNull then\r\n Result:=Null\r\n else\r\n Result:=FValue;\r\nend;\r\nFunction TParam.GetDisplayName: string;\r\nbegin\r\n if (FName<>'') then\r\n Result:=FName\r\n else\r\n Result:=inherited GetDisplayName\r\nend;\r\n\r\nFunction TParam.GetIsNull: Boolean;\r\nbegin\r\n Result:= JS.IsNull(FValue);\r\nend;\r\n\r\nFunction TParam.IsEqual(AValue: TParam): Boolean;\r\nbegin\r\n Result:=(Name=AValue.Name)\r\n and (IsNull=AValue.IsNull)\r\n and (Bound=AValue.Bound)\r\n and (DataType=AValue.DataType)\r\n and (ParamType=AValue.ParamType)\r\n and (GetValueType(FValue)=GetValueType(AValue.FValue))\r\n and (FValue=AValue.FValue);\r\nend;\r\n\r\nProcedure TParam.SetAsBlob(const AValue: TBlobData);\r\nbegin\r\n FDataType:=ftBlob;\r\n Value:=AValue;\r\nend;\r\n\r\nProcedure TParam.SetAsBoolean(AValue: Boolean);\r\nbegin\r\n FDataType:=ftBoolean;\r\n Value:=AValue;\r\nend;\r\n\r\nprocedure TParam.SetAsBytes(const AValue: TBytes);\r\nbegin\r\n\r\nend;\r\n\r\nProcedure TParam.SetAsDate(const AValue: TDateTime);\r\nbegin\r\n FDataType:=ftDate;\r\n Value:=AValue;\r\nend;\r\n\r\nProcedure TParam.SetAsDateTime(const AValue: TDateTime);\r\nbegin\r\n FDataType:=ftDateTime;\r\n Value:=AValue;\r\nend;\r\n\r\nProcedure TParam.SetAsFloat(const AValue: Double);\r\nbegin\r\n FDataType:=ftFloat;\r\n Value:=AValue;\r\nend;\r\n\r\nProcedure TParam.SetAsInteger(AValue: Longint);\r\nbegin\r\n FDataType:=ftInteger;\r\n Value:=AValue;\r\nend;\r\n\r\nProcedure TParam.SetAsLargeInt(AValue: NativeInt);\r\nbegin\r\n FDataType:=ftLargeint;\r\n Value:=AValue;\r\nend;\r\n\r\nProcedure TParam.SetAsMemo(const AValue: string);\r\nbegin\r\n FDataType:=ftMemo;\r\n Value:=AValue;\r\nend;\r\n\r\nProcedure TParam.SetAsString(const AValue: string);\r\nbegin\r\n if FDataType <> ftFixedChar then\r\n FDataType := ftString;\r\n Value:=AValue;\r\nend;\r\n\r\n\r\nProcedure TParam.SetAsTime(const AValue: TDateTime);\r\nbegin\r\n FDataType:=ftTime;\r\n Value:=AValue;\r\nend;\r\n\r\nProcedure TParam.SetAsJSValue(const AValue: JSValue);\r\n\r\nbegin\r\n FValue:=AValue;\r\n FBound:=not JS.IsNull(AValue);\r\n if FBound then\r\n case GetValueType(aValue) of\r\n jvtBoolean : FDataType:=ftBoolean;\r\n jvtInteger : FDataType:=ftInteger;\r\n jvtFloat : FDataType:=ftFloat;\r\n jvtObject,jvtArray : FDataType:=ftBlob;\r\n end;\r\nend;\r\n\r\nProcedure TParam.SetDataType(AValue: TFieldType);\r\n\r\n\r\nbegin\r\n FDataType:=AValue;\r\n\r\nend;\r\n\r\nProcedure TParam.SetText(const AValue: string);\r\nbegin\r\n Value:=AValue;\r\nend;\r\n\r\nconstructor TParam.Create(ACollection: TCollection);\r\nbegin\r\n inherited Create(ACollection);\r\n ParamType:=ptUnknown;\r\n DataType:=ftUnknown;\r\n FValue:=Null;\r\nend;\r\n\r\nconstructor TParam.Create(AParams: TParams; AParamType: TParamType);\r\nbegin\r\n Create(AParams);\r\n ParamType:=AParamType;\r\nend;\r\n\r\nProcedure TParam.Assign(Source: TPersistent);\r\nbegin\r\n if (Source is TParam) then\r\n AssignParam(TParam(Source))\r\n else if (Source is TField) then\r\n AssignField(TField(Source))\r\n else if (source is TStrings) then\r\n AsMemo:=TStrings(Source).Text\r\n else\r\n inherited Assign(Source);\r\nend;\r\n\r\nProcedure TParam.AssignField(Field: TField);\r\nbegin\r\n if Assigned(Field) then\r\n begin\r\n // Need TField.Value\r\n AssignFieldValue(Field,Field.Value);\r\n Name:=Field.FieldName;\r\n end\r\n else\r\n begin\r\n Clear;\r\n Name:='';\r\n end\r\nend;\r\n\r\nProcedure TParam.AssignToField(Field : TField);\r\n\r\nbegin\r\n if Assigned(Field) then\r\n case FDataType of\r\n ftUnknown : DatabaseErrorFmt(SUnknownParamFieldType,[Name],DataSet);\r\n // Need TField.AsSmallInt\r\n // Need TField.AsWord\r\n ftInteger,\r\n ftAutoInc : Field.AsInteger:=AsInteger;\r\n ftFloat : Field.AsFloat:=AsFloat;\r\n ftBoolean : Field.AsBoolean:=AsBoolean;\r\n ftBlob,\r\n ftString,\r\n ftWideString,\r\n ftMemo,\r\n ftFixedChar: Field.AsString:=AsString;\r\n ftTime,\r\n ftDate,\r\n ftDateTime : Field.AsDateTime:=AsDateTime;\r\n end;\r\nend;\r\n\r\nProcedure TParam.AssignFromField(Field : TField);\r\n\r\nbegin\r\n if Assigned(Field) then\r\n begin\r\n FDataType:=Field.DataType;\r\n case Field.DataType of\r\n ftUnknown : DatabaseErrorFmt(SUnknownParamFieldType,[Name],DataSet);\r\n ftInteger,\r\n ftAutoInc : AsInteger:=Field.AsInteger;\r\n ftFloat : AsFloat:=Field.AsFloat;\r\n ftBoolean : AsBoolean:=Field.AsBoolean;\r\n ftBlob,\r\n ftString,\r\n ftWideString,\r\n ftMemo,\r\n ftFixedChar: AsString:=Field.AsString;\r\n ftTime,\r\n ftDate,\r\n ftDateTime : AsDateTime:=Field.AsDateTime;\r\n end;\r\n end;\r\nend;\r\n\r\nProcedure TParam.AssignFieldValue(Field: TField; const AValue: JSValue);\r\n\r\nbegin\r\n If Assigned(Field) then\r\n begin\r\n\r\n if (Field.DataType = ftString) and TStringField(Field).FixedChar then\r\n FDataType := ftFixedChar\r\n else if (Field.DataType = ftMemo) and (Field.Size > 255) then\r\n FDataType := ftString\r\n else\r\n FDataType := Field.DataType;\r\n if JS.IsNull(AValue) then\r\n Clear\r\n else\r\n Value:=AValue;\r\n\r\n Size:=Field.DataSize;\r\n FBound:=True;\r\n\r\n end;\r\nend;\r\n\r\nProcedure TParam.Clear;\r\nbegin\r\n FValue:=Null;\r\nend;\r\n\r\n\r\nProcedure TParams.CopyParamValuesFromDataset(ADataSet: TDataSet;\r\n CopyBound: Boolean);\r\n\r\nVar\r\n I : Integer;\r\n P : TParam;\r\n F : TField;\r\n\r\nbegin\r\n If assigned(ADataSet) then\r\n For I:=0 to Count-1 do\r\n begin\r\n P:=Items[i];\r\n if CopyBound or (not P.Bound) then\r\n begin\r\n // Master dataset must be active and unbound parameters must have fields\r\n // with same names in master dataset (Delphi compatible behavior)\r\n F:=ADataSet.FieldByName(P.Name);\r\n P.AssignField(F);\r\n If Not CopyBound then\r\n P.Bound:=False;\r\n end;\r\n end;\r\nend;\r\n\r\ninitialization\r\n\r\nend.\r\n","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ Copyright (c) 2018 - 2020 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit jsdelphisystem;\r\n\r\ninterface\r\n\r\nimplementation\r\n\r\nend.\r\n","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright (c) 2018 - 2021 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.Mask;\r\n\r\n{$DEFINE NOPP}\r\n\r\ninterface\r\n\r\nuses\r\n Classes, SysUtils, StrUtils, WEBLib.Controls, WEBLib.StdCtrls, Web;\r\n\r\ntype\r\n TMaskedState = set of (mStateMasked, mStateReEnter, mStateDBSetText);\r\n\r\n TMaskedText = type string;\r\n TEditMask = type string;\r\n\r\n TCustomMaskEdit = class(TEdit)\r\n private\r\n FEditMask: TEditMask;\r\n FMaskBlank: Char;\r\n FMaxChars: Integer;\r\n FMaskState: TMaskedState;\r\n FCaretPos: Integer;\r\n FOldValue: string;\r\n FEditText: string;\r\n function GetEditText: string;\r\n procedure SetEditText(const Value: string);\r\n function AddEditFormat(const Value: string; Active: Boolean): string;\r\n function RemoveEditFormat(const Value: string): string;\r\n procedure ArrowKeys(CharCode: Word; Shift: TShiftState);\r\n procedure CursorInc(CursorPos: Integer; Incr: Integer);\r\n function CursorDec(CursorPos: Integer): Integer;\r\n procedure DeleteKeys(CharCode: Word);\r\n function DeleteSelection(var Value: string; Offset: Integer;\r\n Len: Integer): Boolean;\r\n procedure HomeEndKeys(CharCode: Word; Shift: TShiftState);\r\n function CharKeys(var CharCode: Char): Boolean;\r\n function InputChar(var NewChar: Char; Offset: Integer): Boolean;\r\n function DoInputChar(var NewChar: Char; MaskOffset: Integer): Boolean;\r\n function FindLiteralChar (MaskOffset: Integer; InChar: Char): Integer;\r\n protected\r\n procedure SetEditMask(const Value: TEditMask);\r\n function GetMasked: Boolean;\r\n function GetTextLen: integer;\r\n function EditCanModify: boolean; virtual;\r\n procedure ReformatText(const NewMask: string);\r\n procedure KeyDown(var Key: Word; Shift: TShiftState); override;\r\n procedure KeyUp(var Key: Word; Shift: TShiftState); override;\r\n procedure KeyPress(var Key: Char); override;\r\n procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X,Y: Integer); override;\r\n procedure CheckCursor;\r\n procedure Reset; virtual;\r\n procedure Loaded; override;\r\n procedure DoEnter; override;\r\n public\r\n procedure CreateInitialize; override;\r\n procedure GetSel(var ASelStart: Integer; var ASelStop: Integer);\r\n procedure SetSel(ASelStart: Integer; ASelStop: Integer);\r\n procedure SetCursor(Pos: Integer);\r\n\r\n property EditMask: TEditMask read FEditMask write SetEditMask;\r\n property EditText: string read GetEditText write SetEditText;\r\n\r\n function GetFirstEditChar: Integer;\r\n function GetLastEditChar: Integer;\r\n function GetNextEditChar(Offset: Integer): Integer;\r\n function GetPriorEditChar(Offset: Integer): Integer;\r\n function GetMaxChars: Integer;\r\n property IsMasked: Boolean read GetMasked;\r\n end;\r\n\r\n TMaskEdit = class(TCustomMaskEdit)\r\n published\r\n property EditMask;\r\n property ElementClassName;\r\n property ElementID;\r\n property ElementFont;\r\n property ElementPosition;\r\n end;\r\n\r\n TWebMaskEdit = class(TMaskEdit);\r\n\r\nimplementation\r\n\r\nuses\r\n Math, WEBLib.WebTools;\r\n\r\ntype\r\n TMaskCharType = (mcNone, mcLiteral, mcIntlLiteral, mcDirective, mcMask,\r\n mcMaskOpt, mcFieldSeparator, mcField);\r\n\r\n TMaskInstructions = set of (miReverseDir, miUpperCase, miLowerCase,\r\n miLiteralChar);\r\n\r\nconst\r\n dMaskReverse = '!';\r\n dMaskUpperCase = '>';\r\n dMaskLowerCase = '<';\r\n dMaskLiteral = '\\';\r\n\r\n cMaskAlpha = 'L';\r\n cMaskAlphaOpt = 'l';\r\n cMaskAlphaNum = 'A';\r\n cMaskAlphaNumOpt = 'a';\r\n cMaskAscii = 'C';\r\n cMaskAsciiOpt = 'c';\r\n cMaskNumeric = '0';\r\n cMaskNumericOpt = '9';\r\n cMaskNumSymOpt = '#';\r\n cMaskTimeSeparator = ':';\r\n cMaskDateSeparator = '/';\r\n mskSeparator = ';';\r\n mskBlank = '_';\r\n\r\nfunction IsCharAlpha(IChar: Char): boolean;\r\nbegin\r\n Result := ((IChar >= 'a') and (IChar <= 'z')) or\r\n ((IChar >= 'A') and (IChar <= 'Z'));\r\nend;\r\n\r\nfunction IsCharAlphaNumeric(IChar: Char): boolean;\r\nbegin\r\n Result := ((IChar >= 'a') and (IChar <= 'z')) or\r\n ((IChar >= 'A') and (IChar <= 'Z')) or\r\n ((IChar >= '0') and (IChar <= '9'));\r\nend;\r\n\r\nfunction GetMaskCharType(const EditMask: string; MaskOffset: Integer): TMaskCharType;\r\nvar\r\n MaskChar: Char;\r\nbegin\r\n Result := mcLiteral;\r\n MaskChar := #0;\r\n if MaskOffset <= Length(EditMask) then\r\n MaskChar := EditMask[MaskOffset];\r\n if MaskOffset > Length(EditMask) then\r\n Result := mcNone\r\n else if (MaskOffset > 1) and (EditMask[MaskOffset - 1] = dMaskLiteral) and\r\n not ((MaskOffset > 2) and (EditMask[MaskOffset - 2] = dMaskLiteral)) then\r\n Result := mcLiteral\r\n else if (MaskChar = mskSeparator) and\r\n (Length(EditMask) >= 4) and\r\n (MaskOffset > Length(EditMask) - 4) then\r\n Result := mcFieldSeparator\r\n else if (Length(EditMask) >= 4) and\r\n (MaskOffset > (Length(EditMask) - 4)) and\r\n (EditMask[MaskOffset - 1] = mskSeparator) and\r\n not ((MaskOffset > 2) and (EditMask[MaskOffset - 2] = dMaskLiteral)) then\r\n Result := mcField\r\n\r\n else if MaskChar in [cMaskTimeSeparator, cMaskDateSeparator] then\r\n Result := mcIntlLiteral\r\n\r\n else if MaskChar in [dMaskReverse, dMaskUpperCase, dMaskLowerCase,\r\n dMaskLiteral] then\r\n Result := mcDirective\r\n\r\n else if MaskChar in [cMaskAlphaOpt, cMaskAlphaNumOpt, cMaskAsciiOpt,\r\n cMaskNumSymOpt, cMaskNumericOpt] then\r\n Result := mcMaskOpt\r\n\r\n else if MaskChar in [cMaskAlpha, cMaskAlphaNum, cMaskAscii, cMaskNumeric] then\r\n Result := mcMask;\r\nend;\r\n\r\n\r\nfunction GetMaskInstructions(const EditMask: string; MaskOffset: Integer): TMaskInstructions;\r\nvar\r\n I: Integer;\r\n MaskChar: Char;\r\nbegin\r\n Result := [];\r\n for I := 0 to Length(EditMask) - 1 do\r\n begin\r\n MaskChar := EditMask[I+1];\r\n if (MaskChar = dMaskReverse) then\r\n Result := Result + [miReverseDir]\r\n else\r\n if (MaskChar = dMaskLowerCase) and (I < MaskOffset-1) then\r\n begin\r\n Result := Result - [miUpperCase] + [miLowerCase];\r\n end\r\n else\r\n if (MaskChar = dMaskUpperCase) and (I < MaskOffset-1) then\r\n begin\r\n Result := Result - [miLowerCase];\r\n if not ((I > 0) and (EditMask[I] = dMaskLowerCase)) then\r\n Result := Result + [miUpperCase];\r\n end;\r\n end;\r\n if GetMaskCharType(EditMask, MaskOffset) = mcLiteral then\r\n Result := Result + [miLiteralChar];\r\nend;\r\n\r\nfunction GetFormatSettingsChar(IChar: Char): Char;\r\nbegin\r\n Result := IChar;\r\n case IChar of\r\n cMaskTimeSeparator: Result := Char(FormatSettings.TimeSeparator);\r\n cMaskDateSeparator: Result := Char(FormatSettings.DateSeparator);\r\n end;\r\nend;\r\n\r\nfunction MaskOffsetToString(const EditMask: String; MaskOffset: Integer): string;\r\nvar\r\n I: Integer;\r\n CType: TMaskCharType;\r\nbegin\r\n Result := '';\r\n for I := 1 to MaskOffset do\r\n begin\r\n CType := GetMaskCharType(EditMask, I);\r\n if not (CType in [mcDirective, mcField, mcFieldSeparator]) then\r\n Result := Result + EditMask[I];\r\n end;\r\nend;\r\n\r\nfunction MaskOffsetToOffset(const EditMask: String; MaskOffset: Integer): Integer;\r\nbegin\r\n Result := Length(MaskOffsetToString(Editmask, MaskOffset));\r\nend;\r\n\r\nfunction OffsetToMaskOffset(const EditMask: string; Offset: Integer): Integer;\r\nvar\r\n I: Integer;\r\n Count: Integer;\r\n MaxChars: Integer;\r\nbegin\r\n MaxChars := MaskOffsetToOffset(EditMask, Length(EditMask));\r\n if Offset > MaxChars then\r\n begin\r\n Result := -1;\r\n Exit;\r\n end;\r\n\r\n Result := 0;\r\n Count := Offset;\r\n for I := 1 to Length(EditMask) do\r\n begin\r\n Inc(Result);\r\n if not (mcDirective = GetMaskCharType(EditMask, I)) then\r\n begin\r\n Dec(Count);\r\n if Count < 0 then\r\n Exit;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction FormatMaskedText(const EditMask: string; const Value: string; Blank: Char): string;\r\nvar\r\n I: Integer;\r\n Offset, MaskOffset: Integer;\r\n CType: TMaskCharType;\r\n Dir: TMaskInstructions;\r\nbegin\r\n Result := Value;\r\n Dir := GetMaskInstructions(EditMask, 1);\r\n\r\n if not (miReverseDir in Dir) then\r\n begin\r\n { starting at the beginning, insert literal chars in the string\r\n and add spaces on the end }\r\n Offset := 1;\r\n for MaskOffset := 1 to Length(EditMask) do\r\n begin\r\n CType := GetMaskCharType(EditMask, MaskOffset);\r\n\r\n if CType in [mcLiteral, mcIntlLiteral] then\r\n begin\r\n Result := Copy(Result, 1, Offset - 1) +\r\n GetFormatSettingsChar(EditMask[MaskOffset]) +\r\n Copy(Result, Offset, Length(Result) - Offset + 1);\r\n Inc(Offset);\r\n end\r\n else if CType in [mcMask, mcMaskOpt] then\r\n begin\r\n if Offset > Length(Result) then\r\n Result := Result + Blank;\r\n Inc(Offset);\r\n end;\r\n end;\r\n end\r\n else\r\n begin\r\n { starting at the end, insert literal chars in the string\r\n and add spaces at the beginning }\r\n Offset := Length(Result);\r\n for I := 0 to (Length(EditMask) - 1) do\r\n begin\r\n MaskOffset := Length(EditMask) - I;\r\n CType := GetMaskCharType(EditMask, MaskOffset);\r\n\r\n if CType in [mcLiteral, mcIntlLiteral] then\r\n begin\r\n Result := Copy(Result, 1, Offset) +\r\n GetFormatSettingsChar(EditMask[MaskOffset]) +\r\n Copy(Result, Offset + 1, Length(Result) - Offset);\r\n end\r\n else if CType in [mcMask, mcMaskOpt] then\r\n begin\r\n if Offset < 1 then\r\n Result := Blank + Result\r\n else\r\n Dec(Offset);\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction IsLiteralChar(const EditMask: string; Offset: Integer): Boolean;\r\nvar\r\n MaskOffset: Integer;\r\n CType: TMaskCharType;\r\nbegin\r\n Result := False;\r\n MaskOffset := OffsetToMaskOffset(EditMask, Offset);\r\n if MaskOffset >= 0 then\r\n begin\r\n CType := GetMaskCharType(EditMask, MaskOffset);\r\n Result := CType in [mcLiteral, mcIntlLiteral];\r\n end;\r\nend;\r\n\r\nfunction GetMaskBlank(const EditMask: string): Char;\r\nbegin\r\n Result := mskBlank;\r\n if Length(EditMask) >= 4 then\r\n begin\r\n if (GetMaskCharType(EditMask, Length(EditMask) - 1) = mcFieldSeparator) then\r\n begin\r\n if (GetMaskCharType(EditMask, Length(EditMask) - 2) = mcFieldSeparator) or\r\n (GetMaskCharType(EditMask, Length(EditMask) - 3) = mcFieldSeparator) then\r\n begin\r\n Result := EditMask[Length(EditMask)];\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\n{ TCustomMaskEdit }\r\n\r\nfunction TCustomMaskEdit.AddEditFormat(const Value: string;\r\n Active: Boolean): string;\r\nbegin\r\n if not Active then\r\n Result := FormatMaskedText(EditMask, Value, ' ')\r\n else\r\n Result := FormatMaskedText(EditMask, Value, FMaskBlank);\r\nend;\r\n\r\nprocedure TCustomMaskEdit.ArrowKeys(CharCode: Word; Shift: TShiftState);\r\nvar\r\n ASelStart, ASelStop : Integer;\r\nbegin\r\n if (ssCtrl in Shift) then Exit;\r\n GetSel(ASelStart, ASelStop);\r\n if (ssShift in Shift) then\r\n begin\r\n if (CharCode = VK_RIGHT) then\r\n begin\r\n Inc(FCaretPos);\r\n if (ASelStop = ASelStart + 1) then\r\n begin\r\n SetSel(ASelStart, ASelStop); {reset caret to end of string}\r\n Inc(FCaretPos);\r\n end;\r\n if FCaretPos > FMaxChars then FCaretPos := FMaxChars;\r\n end\r\n else {if (CharCode = VK_LEFT) then}\r\n begin\r\n Dec(FCaretPos);\r\n if (ASelStop = ASelStart + 2) and\r\n (FCaretPos > ASelStart) then\r\n begin\r\n SetSel(ASelStart + 1, ASelStart + 1); {reset caret to show up at start}\r\n Dec(FCaretPos);\r\n end;\r\n if FCaretPos < 0 then FCaretPos := 0;\r\n end;\r\n end\r\n else\r\n begin\r\n if (ASelStop - ASelStart) > 1 then\r\n begin\r\n if ASelStop = FCaretPos then\r\n Dec(FCaretPos);\r\n SetCursor(FCaretPos);\r\n end\r\n else if (CharCode = VK_LEFT) then\r\n CursorDec(ASelStart)\r\n else { if (CharCode = VK_RIGHT) then }\r\n begin\r\n if ASelStop = ASelStart then\r\n SetCursor(ASelStart)\r\n else\r\n CursorInc(ASelStart, 1);\r\n end;\r\n end;\r\n\r\nend;\r\n\r\nfunction TCustomMaskEdit.CharKeys(var CharCode: Char): Boolean;\r\nvar\r\n ASelStart, ASelStop : Integer;\r\n Txt: string;\r\nbegin\r\n Result := False;\r\n\r\n GetSel(ASelStart, ASelStop);\r\n\r\n if (ASelStop - ASelStart) > 1 then\r\n begin\r\n DeleteKeys(VK_DELETE);\r\n ASelStart := GetNextEditChar(ASelStart);\r\n SetCursor(ASelStart);\r\n end;\r\n\r\n Result := InputChar(CharCode, ASelStart);\r\n\r\n if Result then\r\n begin\r\n Txt := CharCode;\r\n\r\n Text := Copy(Text, 1, ASelStart) + Txt + Copy(Text, ASelStop + 1, Length(Text));\r\n\r\n CursorInc(ASelStart, 1);\r\n end;\r\nend;\r\n\r\nprocedure TCustomMaskEdit.CheckCursor;\r\nvar\r\n ASelStart, ASelStop: Integer;\r\nbegin\r\n if not HandleAllocated then Exit;\r\n if (IsMasked) then\r\n begin\r\n GetSel(ASelStart, ASelStop);\r\n if ASelStart = ASelStop then\r\n SetCursor(ASelStart);\r\n end;\r\nend;\r\n\r\nprocedure TCustomMaskEdit.CreateInitialize;\r\nbegin\r\n inherited;\r\n Height := 25;\r\nend;\r\n\r\nfunction TCustomMaskEdit.CursorDec(CursorPos: Integer): integer;\r\nvar\r\n nuPos: Integer;\r\nbegin\r\n Result := 0;\r\n\r\n if CursorPos > 0 then\r\n begin\r\n nuPos := CursorPos;\r\n Dec(nuPos);\r\n nuPos := GetPriorEditChar(nuPos);\r\n SetCursor(NuPos);\r\n Result := NuPos;\r\n end;\r\nend;\r\n\r\nprocedure TCustomMaskEdit.CursorInc(CursorPos, Incr: Integer);\r\nvar\r\n NuPos: Integer;\r\nbegin\r\n if (CursorPos < Length(Text)) then\r\n begin\r\n NuPos := CursorPos + Incr;\r\n NuPos := GetNextEditChar(NuPos);\r\n if IsLiteralChar(EditMask, nuPos) then\r\n NuPos := CursorPos;\r\n SetCursor(NuPos);\r\n end;\r\nend;\r\n\r\nprocedure TCustomMaskEdit.DeleteKeys(CharCode: Word);\r\nvar\r\n ASelStart, ASelStop: Integer;\r\n Str, Orig: string;\r\nbegin\r\n GetSel(ASelStart, ASelStop);\r\n\r\n if (ASelStop - ASelStart) < 1 then Exit;\r\n\r\n Str := Text;\r\n Orig := Text;\r\n\r\n DeleteSelection(Str, ASelStart, ASelStop - ASelStart);\r\n\r\n Str := Copy(Str, ASelStart + 1, ASelStop - ASelStart);\r\n\r\n Str := Copy(Orig, 1, ASelStart) + Str + Copy(Orig, ASelStop + 1, Length(Orig));\r\n\r\n Text := Str;\r\n\r\n SetCursor(ASelStart);\r\nend;\r\n\r\nfunction TCustomMaskEdit.DeleteSelection(var Value: string; Offset,\r\n Len: Integer): Boolean;\r\nvar\r\n EndDel: Integer;\r\n StrOffset, MaskOffset, Temp: Integer;\r\n CType: TMaskCharType;\r\nbegin\r\n Result := True;\r\n if Len = 0 then Exit;\r\n\r\n StrOffset := Offset + 1;\r\n EndDel := StrOffset + Len;\r\n Temp := OffsetToMaskOffset(EditMask, Offset);\r\n if Temp < 0 then Exit;\r\n for MaskOffset := Temp to Length(EditMask) do\r\n begin\r\n CType := GetMaskCharType(EditMask, MaskOffset);\r\n if CType in [mcLiteral, mcIntlLiteral] then\r\n Inc(StrOffset)\r\n else if CType in [mcMask, mcMaskOpt] then\r\n begin\r\n Value[StrOffset] := FMaskBlank;\r\n Inc(StrOffset);\r\n end;\r\n if StrOffset >= EndDel then Break;\r\n end;\r\nend;\r\n\r\nprocedure TCustomMaskEdit.DoEnter;\r\nbegin\r\n inherited;\r\n SelStart := 0;\r\n SelLength := 1;\r\nend;\r\n\r\nfunction TCustomMaskEdit.DoInputChar(var NewChar: Char;\r\n MaskOffset: Integer): Boolean;\r\nvar\r\n Instr: TMaskInstructions;\r\n Str: string;\r\n CType: TMaskCharType;\r\n\r\nbegin\r\n Result := True;\r\n CType := GetMaskCharType(EditMask, MaskOffset);\r\n if CType in [mcLiteral, mcIntlLiteral] then\r\n NewChar := GetFormatSettingsChar(EditMask[MaskOffset])\r\n else\r\n begin\r\n Instr := GetMaskInstructions(EditMask, MaskOffset);\r\n case EditMask[MaskOffset] of\r\n cMaskNumeric, cMaskNumericOpt:\r\n begin\r\n if not ((NewChar >= '0') and (NewChar <= '9')) then\r\n Result := False;\r\n end;\r\n cMaskNumSymOpt:\r\n begin\r\n if not (((NewChar >= '0') and (NewChar <= '9')) or\r\n (NewChar = ' ') or(NewChar = '+') or(NewChar = '-')) then\r\n Result := False;\r\n end;\r\n cMaskAscii, cMaskAsciiOpt:\r\n begin\r\n if IsCharAlpha(NewChar) then\r\n begin\r\n Str := ' ';\r\n Str[1] := NewChar;\r\n if (miUpperCase in Instr) then\r\n Str := UpperCase(Str)\r\n else if miLowerCase in Instr then\r\n Str := LowerCase(Str);\r\n NewChar := Str[1];\r\n end;\r\n end;\r\n cMaskAlpha, cMaskAlphaOpt, cMaskAlphaNum, cMaskAlphaNumOpt:\r\n begin\r\n Str := ' ';\r\n Str[1] := NewChar;\r\n if not IsCharAlpha(NewChar) then\r\n begin\r\n Result := False;\r\n if ((EditMask[MaskOffset] = cMaskAlphaNum) or\r\n (EditMask[MaskOffset] = cMaskAlphaNumOpt)) and\r\n (IsCharAlphaNumeric(NewChar)) then\r\n Result := True;\r\n end\r\n else if miUpperCase in Instr then\r\n Str := UpperCase(Str)\r\n else if miLowerCase in Instr then\r\n Str := LowerCase(Str);\r\n NewChar := Str[1];\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TCustomMaskEdit.EditCanModify: boolean;\r\nbegin\r\n Result := not ReadOnly;\r\nend;\r\n\r\nfunction TCustomMaskEdit.FindLiteralChar(MaskOffset: Integer;\r\n InChar: Char): Integer;\r\nvar\r\n CType: TMaskCharType;\r\n LitChar: Char;\r\nbegin\r\n Result := -1;\r\n while MaskOffset < Length(EditMask) do\r\n begin\r\n Inc(MaskOffset);\r\n CType := GetMaskCharType(EditMask, MaskOffset);\r\n if CType in [mcLiteral, mcIntlLiteral] then\r\n begin\r\n LitChar := EditMask[MaskOffset];\r\n if CType = mcIntlLiteral then\r\n LitChar := GetFormatSettingsChar(LitChar);\r\n if LitChar = InChar then\r\n Result := MaskOffset;\r\n Exit;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TCustomMaskEdit.GetEditText: string;\r\nbegin\r\n Result := RemoveEditFormat(inherited Text);\r\nend;\r\n\r\nfunction TCustomMaskEdit.GetFirstEditChar: Integer;\r\nbegin\r\n Result := 0;\r\n if IsMasked then\r\n Result := GetNextEditChar(0);\r\nend;\r\n\r\nfunction TCustomMaskEdit.GetLastEditChar: Integer;\r\nbegin\r\n Result := GetMaxChars;\r\n if IsMasked then\r\n Result := GetPriorEditChar(Result - 1);\r\nend;\r\n\r\nfunction TCustomMaskEdit.GetMasked: Boolean;\r\nbegin\r\n Result := EditMask <> '';\r\nend;\r\n\r\nfunction TCustomMaskEdit.GetMaxChars: Integer;\r\nbegin\r\n if IsMasked then\r\n Result := FMaxChars\r\n else\r\n Result := GetTextLen;\r\nend;\r\n\r\nfunction TCustomMaskEdit.GetNextEditChar(Offset: Integer): Integer;\r\nbegin\r\n Result := Offset;\r\n while (Result < FMaxChars) and (IsLiteralChar(EditMask, Result)) do\r\n Inc(Result);\r\nend;\r\n\r\nfunction TCustomMaskEdit.GetPriorEditChar(Offset: Integer): Integer;\r\nbegin\r\n Result := Offset;\r\n while (Result >= 0) and (IsLiteralChar(EditMask, Result)) do\r\n Dec(Result);\r\n if Result < 0 then\r\n Result := GetNextEditChar(Result);\r\nend;\r\n\r\nprocedure TCustomMaskEdit.GetSel(var ASelStart, ASelStop: Integer);\r\nbegin\r\n ASelStart := SelStart;\r\n ASelStop := SelStart + SelLength;\r\nend;\r\n\r\nfunction TCustomMaskEdit.GetTextLen: integer;\r\nbegin\r\n Result := Length(Text);\r\nend;\r\n\r\nprocedure TCustomMaskEdit.HomeEndKeys(CharCode: Word; Shift: TShiftState);\r\nvar\r\n ASelStart, ASelStop : Integer;\r\nbegin\r\n GetSel(ASelStart, ASelStop);\r\n if (CharCode = VK_HOME) then\r\n begin\r\n if (ssShift in Shift) then\r\n begin\r\n if (ASelStart <> FCaretPos) and (ASelStop <> (ASelStart + 1)) then\r\n ASelStop := ASelStart + 1;\r\n SetSel(0, ASelStop);\r\n CheckCursor;\r\n end\r\n else\r\n SetCursor(0);\r\n FCaretPos := 0;\r\n end\r\n else\r\n begin\r\n if (ssShift in Shift) then\r\n begin\r\n if (ASelStop <> FCaretPos) and (ASelStop <> (ASelStart + 1)) then\r\n ASelStart := ASelStop - 1;\r\n SetSel(ASelStart, FMaxChars);\r\n CheckCursor;\r\n end\r\n else\r\n SetCursor(FMaxChars - 1);\r\n FCaretPos := FMaxChars;\r\n end;\r\n\r\nend;\r\n\r\nfunction TCustomMaskEdit.InputChar(var NewChar: Char; Offset: Integer): Boolean;\r\nvar\r\n MaskOffset: Integer;\r\n CType: TMaskCharType;\r\n InChar: Char;\r\nbegin\r\n Result := True;\r\n\r\n if EditMask <> '' then\r\n begin\r\n Result := False;\r\n if Offset < FMaxChars then\r\n begin\r\n MaskOffset := OffsetToMaskOffset(EditMask, Offset);\r\n if MaskOffset >= 0 then\r\n begin\r\n CType := GetMaskCharType(EditMask, MaskOffset);\r\n InChar := NewChar;\r\n Result := DoInputChar(NewChar, MaskOffset);\r\n if not Result and (CType in [mcMask, mcMaskOpt]) then\r\n begin\r\n MaskOffset := FindLiteralChar (MaskOffset, InChar);\r\n if MaskOffset > 0 then\r\n begin\r\n MaskOffset := MaskOffsetToOffset(EditMask, MaskOffset);\r\n SetCursor (MaskOffset);\r\n Exit;\r\n end;\r\n end;\r\n end;\r\n end;\r\n end;\r\n if not Result and (NewChar <> #13) and (NewChar <> #27) then\r\n begin\r\n MessageBeep(0)\r\n end;\r\nend;\r\n\r\nprocedure TCustomMaskEdit.KeyDown(var Key: Word; Shift: TShiftState);\r\nbegin\r\n inherited KeyDown(Key, Shift);\r\n\r\n if (Key in [VK_LEFT, VK_RIGHT, VK_HOME, VK_END]) then\r\n begin\r\n PreventDefault;\r\n StopPropagation;\r\n end;\r\n\r\n if IsMasked and (Key <> 0) and not (ssAlt in Shift) then\r\n begin\r\n if not (Key in [VK_LEFT, VK_RIGHT, VK_HOME, VK_END]) then\r\n begin\r\n if SelLength > 1 then\r\n begin\r\n SelStart := 0;\r\n SelLength := 1;\r\n end;\r\n end;\r\n\r\n if (Key = VK_LEFT) or(Key = VK_RIGHT) then\r\n begin\r\n ArrowKeys(Key, Shift);\r\n if not ((ssShift in Shift) or (ssCtrl in Shift)) then\r\n Key := 0;\r\n Exit;\r\n end\r\n else if (Key = VK_UP) or(Key = VK_DOWN) then\r\n begin\r\n Key := 0;\r\n Exit;\r\n end\r\n else if (Key = VK_HOME) or(Key = VK_END) then\r\n begin\r\n HomeEndKeys(Key, Shift);\r\n Key := 0;\r\n Exit;\r\n end\r\n else if ((Key = VK_DELETE) and not (ssShift in Shift)) or\r\n (Key = VK_BACK) then\r\n begin\r\n if EditCanModify then\r\n DeleteKeys(Key);\r\n Key := 0;\r\n PreventDefault;\r\n StopPropagation;\r\n Exit;\r\n end;\r\n CheckCursor;\r\n end;\r\nend;\r\n\r\nprocedure TCustomMaskEdit.KeyPress(var Key: Char);\r\nbegin\r\n inherited KeyPress(Key);\r\n\r\n if IsMasked and (Key <> #0) and not CharInSet(Key, [^V, ^X, ^C, #8]) then\r\n begin\r\n CharKeys(Key);\r\n Key := #0;\r\n PreventDefault;\r\n StopPropagation;\r\n end;\r\nend;\r\n\r\nprocedure TCustomMaskEdit.KeyUp(var Key: Word; Shift: TShiftState);\r\nbegin\r\n inherited KeyUp(Key, Shift);\r\n\r\n if IsMasked and (Key <> 0) then\r\n begin\r\n if ((Key = VK_LEFT) or(Key = VK_RIGHT)) and (ssCtrl in Shift) then\r\n CheckCursor;\r\n end;\r\nend;\r\n\r\nprocedure TCustomMaskEdit.Loaded;\r\nbegin\r\n inherited;\r\n //Text := FEditText;\r\nend;\r\n\r\nprocedure TCustomMaskEdit.MouseUp(Button: TMouseButton; Shift: TShiftState; X,\r\n Y: Integer);\r\nbegin\r\n inherited;\r\nend;\r\n\r\nprocedure TCustomMaskEdit.ReformatText(const NewMask: string);\r\nvar\r\n OldText: string;\r\nbegin\r\n OldText := RemoveEditFormat(EditText);\r\n FEditMask := NewMask;\r\n FMaxChars := MaskOffsetToOffset(EditMask, Length(NewMask));\r\n FMaskBlank := GetMaskBlank(NewMask);\r\n// OldText := AddEditFormat(OldText, True);\r\n EditText := OldText;\r\nend;\r\n\r\nfunction TCustomMaskEdit.RemoveEditFormat(const Value: string): string;\r\nvar\r\n I: Integer;\r\n OldLen: Integer;\r\n Offset, MaskOffset: Integer;\r\n CType: TMaskCharType;\r\n Dir: TMaskInstructions;\r\nbegin\r\n Offset := 1;\r\n Result := Value;\r\n for MaskOffset := 1 to Length(EditMask) do\r\n begin\r\n CType := GetMaskCharType(EditMask, MaskOffset);\r\n\r\n if CType in [mcLiteral, mcIntlLiteral] then\r\n Result := Copy(Result, 1, Offset - 1) +\r\n Copy(Result, Offset + 1, Length(Result) - Offset);\r\n if CType in [mcMask, mcMaskOpt] then Inc(Offset);\r\n end;\r\n\r\n Dir := GetMaskInstructions(EditMask, 1);\r\n if miReverseDir in Dir then\r\n begin\r\n Offset := 1;\r\n for I := 1 to Length(Result) do\r\n begin\r\n if Result[I] = FMaskBlank then\r\n Inc(Offset)\r\n else\r\n break;\r\n end;\r\n if Offset <> 1 then\r\n Result := Copy(Result, Offset, Length(Result) - Offset + 1);\r\n end\r\n else begin\r\n OldLen := Length(Result);\r\n for I := 1 to OldLen do\r\n begin\r\n if Result[OldLen - I + 1] = FMaskBlank then\r\n SetLength(Result, Length(Result) - 1)\r\n else Break;\r\n end;\r\n end;\r\n if FMaskBlank <> ' ' then\r\n begin\r\n OldLen := Length(Result);\r\n for I := 1 to OldLen do\r\n begin\r\n if Result[I] = FMaskBlank then\r\n Result[I] := ' ';\r\n if I > OldLen then Break;\r\n end;\r\n end;\r\n\r\nend;\r\n\r\nprocedure TCustomMaskEdit.Reset;\r\nbegin\r\n EditText := FOldValue;\r\nend;\r\n\r\nprocedure TCustomMaskEdit.SetCursor(Pos: Integer);\r\nbegin\r\n SetSel(Pos,Pos + 1);\r\nend;\r\n\r\nprocedure TCustomMaskEdit.SetEditMask(const Value: TEditMask);\r\nvar\r\n SelStart, SelStop: Integer;\r\nbegin\r\n if Value <> EditMask then\r\n begin\r\n if (csDesigning in ComponentState) and (Value <> '') and\r\n not (csLoading in ComponentState) then\r\n EditText := '';\r\n\r\n if HandleAllocated then GetSel(SelStart, SelStop);\r\n\r\n ReformatText(Value);\r\n Exclude(FMaskState, mStateMasked);\r\n\r\n if EditMask <> '' then\r\n Include(FMaskState, mStateMasked);\r\n\r\n inherited MaxLength := 0;\r\n\r\n if IsMasked and (FMaxChars > 0) then\r\n begin\r\n inherited MaxLength := FMaxChars;\r\n end;\r\n\r\n if HandleAllocated and Focused and\r\n not (csDesigning in ComponentState) then\r\n SetCursor(SelStart);\r\n end;\r\nend;\r\n\r\nprocedure TCustomMaskEdit.SetEditText(const Value: string);\r\nbegin\r\n FEditText := AddEditFormat(Value, True);\r\n inherited Text := FEditText;\r\nend;\r\n\r\nprocedure TCustomMaskEdit.SetSel(ASelStart, ASelStop: Integer);\r\nbegin\r\n SelStart := ASelStart;\r\n SelLength := Max(1,ASelStop - ASelStart);\r\nend;\r\n\r\nend.\r\n","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ Copyright (c) 2018 - 2021 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.Grids;\r\n\r\n{$DEFINE NOPP}\r\n\r\ninterface\r\n\r\n{$HINTS OFF}\r\n\r\nuses\r\n Classes, JS, WEBLib.Controls, WEBLib.Graphics, Web, DB, jsdelphisystem,\r\n WEBLib.Menus, WEBLib.StdCtrls, WEBLib.Mask;\r\n\r\ntype\r\n{\r\n TJSTable = class external name 'Table' (TJSNode)\r\n private\r\n FRows : TJSElement; external name 'rows';\r\n\r\n public\r\n\r\n end;\r\n}\r\n TInitMethod = (imRandom, imLinear);\r\n\r\n TGridRect = record\r\n Left, Top, Right, Bottom: Longint;\r\n end;\r\n\r\n TGridCoord = record\r\n X: Longint;\r\n Y: Longint;\r\n end;\r\n\r\n TGridOption = (goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine,\r\n goRangeSelect, goDrawFocusSelected, goRowSizing, goColSizing, goRowMoving,\r\n goColMoving, goEditing, goTabs, goRowSelect, goAlwaysShowEditor,\r\n goThumbTracking, goFixedColClick, goFixedRowClick, goFixedHotTrack,goFixedRowDefAlign);\r\n\r\n TGridCellEditor = (geText, geNumber, geDate, geTime, geRange, geColor, geWeek, geMonth, geURL, geEmail, geTel, geMask, geCombo);\r\n\r\n TGridOptions = set of TGridOption;\r\n\r\n TGridGetCellDataEvent = procedure(Sender: TObject; ACol,ARow: integer; AField: TField; var AValue: string) of object;\r\n\r\n TGridGetCellClassEvent = procedure(Sender: TObject; ACol,ARow: integer; AField: TField; AValue: string; var AClassName: string) of object;\r\n\r\n TGridGetCellChildrenEvent = procedure(Sender: TObject; ACol,ARow: integer; AField: TField; AValue: string; AElement: TJSHTMLElementRecord) of object;\r\n\r\n TGridGetCellEditorEvent = procedure(Sender: TObject; ACol,ARow: integer; var AEditor: TGridCellEditor) of object;\r\n\r\n TGridRequestEvent = procedure(Sender: TObject; ARequest: TJSXMLHttpRequestRecord) of object;\r\n\r\n TGetEditEvent = procedure (Sender: TObject; ACol, ARow: Longint; var Value: string) of object;\r\n TSetEditEvent = procedure (Sender: TObject; ACol, ARow: Longint; const Value: string) of object;\r\n\r\n TCustomGrid = class(TWebCustomControl)\r\n private\r\n FRowCount: integer;\r\n FColCount: integer;\r\n function GetCells(ACol, ARow: integer): string; virtual;\r\n procedure SetCells(ACol, ARow: integer; const Value: string); virtual;\r\n function GetCellsArray: TJSArray;\r\n procedure SetCellsArray(const Value: TJSArray);\r\n protected\r\n function ColOffset: integer; virtual;\r\n function RowOffset: integer; virtual;\r\n procedure SetColCount(const Value: integer); virtual;\r\n procedure SetRowCount(const Value: integer); virtual;\r\n procedure GridChanged; virtual;\r\n procedure RowCountChanged(delta: integer); virtual;\r\n procedure ColCountChanged(delta: integer); virtual;\r\n property RowCount: integer read FRowCount write SetRowCount;\r\n property ColCount: integer read FColCount write SetColCount;\r\n public\r\n property CellsArray: TJSArray read GetCellsArray write SetCellsArray;\r\n property Visible;\r\n procedure Clear; virtual;\r\n property Cells[ACol,ARow: integer]: string read GetCells write SetCells;\r\n property BorderColor;\r\n end;\r\n\r\n // for VCL design-time compatibility\r\n TGridDrawingStyle = (gdsClassic, gdsThemed, gdsGradient);\r\n\r\n TCellEvent = procedure(Sender: TObject; ACol, ARow: integer) of object;\r\n TCellCheckEvent = procedure(Sender: TObject; ACol, ARow: integer; Checked: boolean) of object;\r\n TCellCanEditEvent = procedure(Sender: TObject; ACol,ARow: integer; var CanEdit: boolean) of object;\r\n\r\n TSelectCellEvent = procedure(Sender: TObject; ACol, ARow: integer; var CanSelect: boolean) of object;\r\n TColumnSizedEvent = procedure(Sender: TObject; ACol: integer) of object;\r\n\r\n TGridRange = class(TPersistent)\r\n private\r\n FMax: single;\r\n FMin: single;\r\n FStep: single;\r\n public\r\n constructor Create;\r\n procedure Assign(Source: TPersistent); override;\r\n published\r\n property Min: single read FMin write FMin default 0;\r\n property Max: single read FMax write FMax default 100;\r\n property Step: single read FStep write FStep default 1;\r\n end;\r\n\r\n TCustomStringGrid = class(TCustomGrid, ITMSFNCDataBinderGrid)\r\n private\r\n FReq: TJSXMLHttpRequest;\r\n FDataNode: string;\r\n FOrigVal: string;\r\n FGrid: TJSElement;\r\n FFixedColor: TColor;\r\n FFixedColRow: TJSElement;\r\n FFixedRow: TJSElement;\r\n FFixedCol: TJSElement;\r\n FNormalCells: TJSElement;\r\n FDefaultRowHeight: integer;\r\n FDefaultColWidth: integer;\r\n FColWidths: TList;\r\n FRowHeights: TList;\r\n FSelectedCell: TJSElement;\r\n FEdit: TJSHTMLElement;\r\n FFixedCols: integer;\r\n FFixedRows: integer;\r\n FEditMode: boolean;\r\n FOnSelectCell: TSelectCellEvent;\r\n FOnTopLeftChanged: TNotifyEvent;\r\n FOptions: TGridOptions;\r\n FDelimiter: char;\r\n FLoadFixed: boolean;\r\n FSelection: TGridRect;\r\n FStartCell: TGridCoord;\r\n FOnHttpRequestError: TNotifyEvent;\r\n FOnHttpRequestSuccess: TNotifyEvent;\r\n FOnGetCellClass: TGridGetCellClassEvent;\r\n FOnGetCellData: TGridGetCellDataEvent;\r\n FOnGetCellChildren: TGridGetCellChildrenEvent;\r\n FScrollBars: TScrollStyle;\r\n FSelMouseDown: boolean;\r\n FStyleElements: TStyleElements;\r\n FDefaultDrawing: boolean;\r\n FDragCursor: TCursor;\r\n FDragKind: TDragKind;\r\n FGradientStartColor: TColor;\r\n FGradientEndColor: TColor;\r\n FEditCol: integer;\r\n FEditRow: integer;\r\n FEditType: TGridCellEditor;\r\n FCtl3D: boolean;\r\n FParentCtl3D: boolean;\r\n FOnGetEditText: TGetEditEvent;\r\n FOnSetEditText: TSetEditEvent;\r\n FOnHttpRequest: TGridRequestEvent;\r\n FOnCheckClick: TCellCheckEvent;\r\n FOnFixedCellClick: TCellEvent;\r\n FOnValidateEdit: TGetEditEvent;\r\n FHandleEditBlurPtr: pointer;\r\n FHandleEditKeypressPtr: pointer;\r\n FHandleCheckClickPtr: pointer;\r\n FDrawingStyle: TGridDrawingStyle;\r\n FOnCanEditCell: TCellCanEditEvent;\r\n FFixedTextColor: TColor;\r\n FOnColumnSized: TColumnSizedEvent;\r\n FRows: TStringList;\r\n FRowsIndex: integer;\r\n FOnGetCellEditor: TGridGetCellEditorEvent;\r\n FCombo: TWebComboBox;\r\n FMask: TWebMaskEdit;\r\n FEditMask: TEditMask;\r\n FComboBoxItems: TStrings;\r\n FRange: TGridRange;\r\n FShowSelection: boolean;\r\n FOnClickCell: TCellEvent;\r\n FElementTableClassName: string;\r\n FGridLineColor: TColor;\r\n FSelectionTextColor: TColor;\r\n FSelectionColor: TColor;\r\n function GetCells(ACol, ARow: integer): string; override;\r\n procedure SetCells(ACol, ARow: integer; const Value: string); override;\r\n procedure SetFixedCols(const Value: integer);\r\n procedure SetFixedRows(const Value: integer);\r\n function GetColWidths(ACol: integer): integer;\r\n function GetRowHeights(ARow: integer): integer;\r\n procedure SetColWidths(ACol: integer; const Value: integer);\r\n procedure SetRowHeights(ARow: integer; const Value: integer);\r\n procedure SetDefaultColWidth(const Value: integer);\r\n procedure SetDefaultRowHeight(const Value: integer);\r\n function GetCol: integer;\r\n function GetRow: integer;\r\n procedure SetCol(const Value: integer);\r\n procedure SetRow(const Value: integer);\r\n function GetCellElements(ACol, ARow: integer): TJSHTMLElement;\r\n function GetCheckElement(ACol, ARow: integer): TJSHTMLElement;\r\n function GetSelection: TGridRect;\r\n procedure SetSelection(const Value: TGridRect);\r\n function GetLeftCol: integer;\r\n function GetTopRow: integer;\r\n procedure SetLeftCol(const Value: integer);\r\n procedure SetTopRow(const Value: integer);\r\n procedure SetFixedColor(const Value: TColor);\r\n procedure SetFixedTextColor(const Value: TColor);\r\n function GetVisibleColCount: integer;\r\n function GetVisibleRowCount: integer;\r\n function GetRows(Index: integer): TStrings;\r\n procedure SetRows(Index: integer; const Value: TStrings);\r\n procedure RowsChanged(Sender: TObject);\r\n function GetCheckState(ACol, ARow: integer): boolean;\r\n procedure SetCheckState(ACol, ARow: integer; const Value: boolean);\r\n procedure SetRange(const Value: TGridRange);\r\n procedure SetElementTableClassName(const Value: string);\r\n procedure SetGridLineColor(const Value: TColor);\r\n procedure SetSelectionColor(const Value: TColor);\r\n procedure SetSelectionTextColor(const Value: TColor);\r\n protected\r\n // ITMSFNCDataBinderGrid interface\r\n function GetDataRowCount: Integer;\r\n procedure ClearData;\r\n procedure SetDataColumnCount(AValue: Integer);\r\n procedure SetDataRowCount(AValue: Integer);\r\n procedure SetDataValue(AColumn, ARow: Integer; AValue: string);\r\n procedure SetDataHeader(AColumn: Integer; AValue: string);\r\n procedure DataBeginUpdate;\r\n procedure DataEndUpdate;\r\n procedure DataInsertRow(AInsertPosition: Integer);\r\n\r\n function ColOffset: integer; override;\r\n function RowOffset: integer; override;\r\n function CellColSpan(ACol,ARow: integer): integer;\r\n function CellRowSpan(ACol,ARow: integer): integer;\r\n function CellRealElement(const ACol,ARow: integer): TJSHTMLElement;\r\n function GetDirectCellElements(ACol, ARow: integer): TJSHTMLElement;\r\n\r\n procedure MouseMove(Shift: TShiftState; X,Y: Integer); override;\r\n function HandleClick(Event: TJSEvent): Boolean; virtual;\r\n function HandleFixedClick(Event: TJSEvent): Boolean; virtual;\r\n function HandleMouseDown(Event: TJSMouseEvent): Boolean; virtual;\r\n function HandleMouseMove(Event: TJSMouseEvent): Boolean; virtual;\r\n function HandleMouseUp(Event: TJSMouseEvent): Boolean; virtual;\r\n function HandleKeyDown(Event: TJSKeyboardEvent): boolean; virtual;\r\n function HandleTableFocus(Event: TJSEvent): Boolean; virtual;\r\n function HandleScroll(Event: TJSEvent): Boolean; virtual;\r\n function HandleEditBlur(Event: TJSEvent): Boolean; virtual;\r\n function HandleEditKeyPress(Event: TJSKeyboardEvent): boolean; virtual;\r\n\r\n procedure HandleComboExit(Sender: TObject);\r\n procedure HandleComboKeyPress(Sender: TObject; var Key: Char);\r\n procedure HandleMaskExit(Sender: TObject);\r\n procedure HandleMaskKeyPress(Sender: TObject; var Key: Char);\r\n\r\n function HandleCheckBoxClick(Event: TJSEvent): Boolean; virtual;\r\n function HandleDoMouseUp(Event: TJSMouseEvent): Boolean; override;\r\n function HandleDoMouseMove(Event: TJSMouseEvent): Boolean; override;\r\n function DoHttpLoadJson(Event: TEventListenerEvent): boolean; virtual;\r\n function DoHttpLoadCsv(Event: TEventListenerEvent): boolean; virtual;\r\n function DoHttpAbort(Event: TEventListenerEvent): boolean; virtual;\r\n procedure DoHttpRequest(ARequest: TJSXMLHttpRequest); virtual;\r\n procedure DoCheckClick(ACol, ARow: Longint; Checked: boolean); virtual;\r\n function GetEditText(ACol, ARow: Longint): string; virtual;\r\n procedure SetEditText(ACol, ARow: Longint; const AValue: string); virtual;\r\n procedure GetCellData(ACol,ARow: integer; AField: TField; var AValue: string); virtual;\r\n procedure GetCellClassName(ACol,ARow: integer; AField: TField; AValue: string; var AClassName: string); virtual;\r\n procedure GetCellChildren(ACol,ARow: integer; AField: TField; AValue: string; AElement: TJSHTMLElement); virtual;\r\n procedure GetCellEditor(const ACol,ARow: integer; var AEditor: TGridCellEditor); virtual;\r\n procedure AddSelection(ACell: TJSElement); virtual;\r\n procedure RemoveSelection(ACell: TJSElement); virtual;\r\n procedure BindCellChildren(ACol,ARow: integer; AElement: TJSHTMLElement); virtual;\r\n procedure DoBoundsChange; override;\r\n procedure DoColumnSized(AColumn: integer); virtual;\r\n procedure LoadFromStringList(AStrings: TStrings);\r\n function GetGridCSS(id: string): string; virtual;\r\n procedure RenderGrid;\r\n procedure ReRenderGrid;\r\n procedure RenderGridSize;\r\n procedure RenderGridScript;\r\n procedure UpdateGridSize;\r\n procedure BindEvents; override;\r\n procedure Resize; override;\r\n procedure GridChanged; override;\r\n function CreateElement: TJSElement; override;\r\n procedure UpdateElement; override;\r\n procedure UpdateElementVisual; override;\r\n function FixedColWidth: integer;\r\n function FixedRowHeight: integer;\r\n function NormalColWidth: integer;\r\n function NormalRowHeight: integer;\r\n function FocusedCell: TJSElement;\r\n function CanSelect(ACol, ARow: integer): boolean; virtual;\r\n procedure UpdateCell(ACol, ARow: integer; var AValue: string); virtual;\r\n procedure ValidateCell(ACol, ARow: integer; var AValue: string); virtual;\r\n procedure TopLeftChanged; virtual;\r\n procedure RowCountChanged(delta: integer); override;\r\n procedure ColCountChanged(delta: integer); override;\r\n procedure ClearMethodPointers; override;\r\n procedure GetMethodPointers; override;\r\n procedure StartEdit(ch: string); virtual;\r\n function StopEdit: string; virtual;\r\n function CanEditCell(ACol,ARow: integer): boolean; virtual;\r\n procedure ChangeRow; virtual;\r\n property ColCount;\r\n property RowCount;\r\n property OriginalValue: string read FOrigVal;\r\n property OnHttpRequestError: TNotifyEvent read FOnHttpRequestError write FOnHttpRequestError;\r\n property OnHttpRequestSuccess: TNotifyEvent read FOnHttpRequestSuccess write FOnHttpRequestSuccess;\r\n property OnHttpRequest: TGridRequestEvent read FOnHttpRequest write FOnHttpRequest;\r\n procedure EnableColResize;\r\n procedure EnableDrag; override;\r\n procedure DisableDrag; override;\r\n public\r\n constructor Create(AOwner: TComponent); override; overload;\r\n destructor Destroy; override;\r\n procedure CreateInitialize; override;\r\n procedure SetFocus; override;\r\n procedure ShowEdit; virtual;\r\n procedure HideEdit; virtual;\r\n procedure CancelEdit; virtual;\r\n procedure Clear; override;\r\n property Rows[Index: integer]: TStrings read GetRows write SetRows;\r\n procedure InitSample(AInitMethod: TInitMethod);\r\n property Ctl3D: boolean read FCtl3D write FCtl3D;\r\n property ParentCtl3D: boolean read FParentCtl3D write FParentCtl3D;\r\n property Col: integer read GetCol write SetCol;\r\n property Row: integer read GetRow write SetRow;\r\n property Selection: TGridRect read GetSelection write SetSelection;\r\n property EditMode: boolean read FEditMode;\r\n procedure MouseToCell(X,Y: integer; var C, R: integer);\r\n procedure LoadFromJSON(const AURL: string; ADataNode: string = ''); overload;\r\n procedure LoadFromJSON(AJSON: TJSObject; ADataNode: string = ''); overload;\r\n procedure LoadFromCSV(const AURL: string; Delimiter: char = ';'; LoadFixed: boolean = false);\r\n procedure LoadFromStrings(AStrings: TStrings; Delimiter: char = ';'; LoadFixed: boolean = false);\r\n procedure SaveToCSV(const AFileName: string; Delimiter: char = ';'; SaveFixed: boolean = false);\r\n procedure SaveToStrings(AStrings: TStrings; Delimiter: char = ';'; SaveFixed: boolean = false);\r\n procedure SelectCell(ACol, ARow: integer); virtual;\r\n procedure InsertRow(const Index: integer);\r\n procedure RemoveRow(const Index: integer);\r\n procedure InsertColumn(const Index: integer);\r\n procedure RemoveColumn(const Index: integer);\r\n property CellElements[ACol,ARow: integer]: TJSHTMLElement read GetCellElements;\r\n property ColWidths[ACol: integer]: integer read GetColWidths write SetColWidths;\r\n property RowHeights[ARow: integer]: integer read GetRowHeights write SetRowHeights;\r\n property FixedColRow: TJSElement read FFixedColRow;\r\n property FixedCol: TJSElement read FFixedCol;\r\n property FixedRow: TJSElement read FFixedRow;\r\n property TopRow: integer read GetTopRow write SetTopRow;\r\n property LeftCol: integer read GetLeftCol write SetLeftCol;\r\n property VisibleRowCount: integer read GetVisibleRowCount;\r\n property VisibleColCount: integer read GetVisibleColCount;\r\n\r\n procedure AddCheckBox(const ACol,ARow: integer);\r\n procedure RemoveCheckBox(const ACol,ARow: integer);\r\n function HasCheckBox(const ACol,ARow: integer): boolean;\r\n function HasVertScrollBar: boolean; override;\r\n function HasHorzScrollBar: boolean; override;\r\n property CheckState[ACol,ARow: integer]: boolean read GetCheckState write SetCheckState;\r\n\r\n procedure MergeCells(const ACol,ARow, NumCol,NumRow: integer);\r\n procedure SplitCells(const ACol,ARow: integer);\r\n function IsMergedCell(const ACol,ARow: integer; var NumCol,NumRow: integer): boolean;\r\n\r\n property ComboBoxItems: TStrings read FComboBoxItems;\r\n\r\n // for design-time VCL class compatibility\r\n property DefaultDrawing: boolean read FDefaultDrawing write FDefaultDrawing;\r\n property DragCursor: TCursor read FDragCursor write FDragCursor;\r\n property DragKind: TDragKind read FDragKind write FDragKind;\r\n property DrawingStyle: TGridDrawingStyle read FDrawingStyle write FDrawingStyle;\r\n property GradientEndColor: TColor read FGradientEndColor write FGradientEndColor;\r\n property GradientStartColor: TColor read FGradientStartColor write FGradientStartColor;\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property BiDiMode;\r\n property BorderColor;\r\n property BorderStyle;\r\n property DragMode;\r\n property DefaultColWidth: integer read FDefaultColWidth write SetDefaultColWidth default 64;\r\n property DefaultRowHeight: integer read FDefaultRowHeight write SetDefaultRowHeight default 24;\r\n property EditMask: TEditMask read FEditMask write FEditMask;\r\n\r\n property ElementID;\r\n property ElementClassName;\r\n property ElementFont;\r\n property ElementPosition;\r\n property ElementTableClassName: string read FElementTableClassName write SetElementTableClassName;\r\n property FixedRows: integer read FFixedRows write SetFixedRows default 1;\r\n property FixedCols: integer read FFixedCols write SetFixedCols default 1;\r\n property FixedColor: TColor read FFixedColor write SetFixedColor default clBtnFace;\r\n property FixedTextColor: TColor read FFixedTextColor write SetFixedTextColor default clBlack;\r\n property Font;\r\n property GridLineColor: TColor read FGridLineColor write SetGridLineColor default clSilver;\r\n property Height;\r\n property HeightPercent;\r\n property HeightStyle;\r\n property Margins;\r\n property Options: TGridOptions read FOptions write FOptions;\r\n property ParentFont;\r\n property ParentBiDiMode;\r\n property PopupMenu;\r\n property RangeEdit: TGridRange read FRange write SetRange;\r\n property Scrollbars: TScrollStyle read FScrollBars write FScrollBars default ssBoth;\r\n property SelectionColor: TColor read FSelectionColor write SetSelectionColor default $FF8F5B;\r\n property SelectionTextColor: TColor read FSelectionTextColor write SetSelectionTextColor default $FFFFFF;\r\n property ShowSelection: boolean read FShowSelection write FShowSelection default true;\r\n property StyleElements: TStyleElements read FStyleElements write FStyleElements;\r\n property TabOrder;\r\n\r\n property Visible;\r\n property Width;\r\n property WidthPercent;\r\n property WidthStyle;\r\n\r\n property OnClick;\r\n property OnClickCell: TCellEvent read FOnClickCell write FOnClickCell;\r\n property OnDblClick;\r\n property OnEnter;\r\n property OnExit;\r\n property OnMouseWheelDown;\r\n property OnMouseWheelUp;\r\n property OnCanEditCell: TCellCanEditEvent read FOnCanEditCell write FOnCanEditCell;\r\n property OnColumnSized: TColumnSizedEvent read FOnColumnSized write FOnColumnSized;\r\n property OnGetCellData: TGridGetCellDataEvent read FOnGetCellData write FOnGetCellData;\r\n property OnGetCellChildren: TGridGetCellChildrenEvent read FOnGetCellChildren write FOnGetCellChildren;\r\n property OnGetCellClass: TGridGetCellClassEvent read FOnGetCellClass write FOnGetCellClass;\r\n property OnGetCellEditor: TGridGetCellEditorEvent read FOnGetCellEditor write FOnGetCellEditor;\r\n property OnCheckClick: TCellCheckEvent read FOnCheckClick write FOnCheckClick;\r\n property OnFixedCellClick: TCellEvent read FOnFixedCellClick write FOnFixedCellClick;\r\n property OnGetEditText: TGetEditEvent read FOnGetEditText write FOnGetEditText;\r\n property OnSetEditText: TSetEditEvent read FOnSetEditText write FOnSetEditText;\r\n property OnSelectCell: TSelectCellEvent read FOnSelectCell write FOnSelectCell;\r\n property OnTopLeftChanged: TNotifyEvent read FOnTopLeftChanged write FOnTopLeftChanged;\r\n property OnValidateEdit: TGetEditEvent read FOnValidateEdit write FOnValidateEdit;\r\n property OnDragDrop;\r\n property OnDragOver;\r\n property OnEndDrag;\r\n property OnStartDrag;\r\n end;\r\n\r\n TStringGrid = class(TCustomStringGrid)\r\n published\r\n property ColCount;\r\n property RowCount;\r\n property OnHttpRequestError;\r\n property OnHttpRequestSuccess;\r\n end;\r\n\r\n TGridFillType = (gfLinear, gfRandom);\r\n\r\n TStringGridHelper = class helper for TStringGrid\r\n public\r\n procedure Fill(AFillType: TGridFillType; Fixed: boolean);\r\n end;\r\n\r\n TWebStringGrid = class(TStringGrid);\r\n\r\n TCustomTableControl = class;\r\n\r\n TTableControlOptions = class(TPersistent)\r\n private\r\n FOwner: TCustomTableControl;\r\n FScrollVertical: boolean;\r\n FResizeColumns: boolean;\r\n procedure SetResizeColumns(const Value: boolean);\r\n public\r\n constructor Create(AOwner: TCustomTableControl);\r\n procedure Assign(Source: TPersistent); override;\r\n published\r\n property ScrollVertical: boolean read FScrollVertical write FScrollVertical default false;\r\n property ResizeColumns: boolean read FResizeColumns write SetResizeColumns default false;\r\n end;\r\n\r\n TCustomTableControl = class(TCustomGrid, ITMSFNCDataBinderGrid)\r\n private\r\n FReq: TJSXMLHttpRequest;\r\n FDataNode: string;\r\n FTable: TJSElement;\r\n FBody: TJSElement;\r\n FRowHeader: boolean;\r\n FColHeader: boolean;\r\n FDelimiter: char;\r\n FLoadFixed: boolean;\r\n FElementHeaderClassName: TElementClassName;\r\n FElementTableClassName: TElementClassName;\r\n FOnHttpRequestError: TNotifyEvent;\r\n FOnHttpRequestSuccess: TNotifyEvent;\r\n FOnDblClickCell: TCellEvent;\r\n FOnClickCell: TCellEvent;\r\n FOptions: TTableControlOptions;\r\n FOnGetCellClass: TGridGetCellClassEvent;\r\n FOnGetCellData: TGridGetCellDataEvent;\r\n FOnGetCellChildren: TGridGetCellChildrenEvent;\r\n FOnHttpRequest: TGridRequestEvent;\r\n FOnCheckClick: TCellCheckEvent;\r\n function GetCells(col, row: integer): string; override;\r\n procedure SetCells(col, row: integer; const Value: string); override;\r\n function GetRowClassName(row: integer): TElementClassName;\r\n procedure SetRowClassName(row: integer; const Value: TElementClassName);\r\n function GetCellElement(col, row: integer): TJSHTMLElement;\r\n procedure SetOptions(const Value: TTableControlOptions);\r\n procedure SetElementHeaderClassName(const Value: TElementClassName);\r\n procedure SetElementTableClassName(const Value: TElementClassName);\r\n protected\r\n // ITMSFNCDataBinderGrid interface\r\n function GetDataRowCount: Integer;\r\n procedure ClearData;\r\n procedure SetDataColumnCount(AValue: Integer);\r\n procedure SetDataRowCount(AValue: Integer);\r\n procedure SetDataValue(AColumn, ARow: Integer; AValue: string);\r\n procedure SetDataHeader(AColumn: Integer; AValue: string);\r\n procedure DataBeginUpdate;\r\n procedure DataEndUpdate;\r\n procedure DataInsertRow(AInsertPosition: Integer);\r\n\r\n function ColOffset: integer; override;\r\n function RowOffset: integer; override;\r\n\r\n function HandleDoClick(Event: TJSMouseEvent): Boolean; override;\r\n function HandleDoDblClick(Event: TJSMouseEvent): Boolean; override;\r\n function HandleCheckBoxClick(Event: TJSEvent): Boolean; virtual;\r\n function HandleDoMouseUp(Event: TJSMouseEvent): Boolean; override;\r\n function HandleDoMouseMove(Event: TJSMouseEvent): Boolean; override;\r\n procedure DoCheckClick(ACol, ARow: Longint; Checked: boolean); virtual;\r\n function DoHttpLoadJson(Event: TEventListenerEvent): boolean; virtual;\r\n function DoHttpLoadCsv(Event: TEventListenerEvent): boolean; virtual;\r\n function DoHttpAbort(Event: TEventListenerEvent): boolean; virtual;\r\n procedure DoHttpRequest(ARequest: TJSXMLHttpRequest); virtual;\r\n procedure GetCellData(ACol,ARow: integer; AField: TField; var AValue: string); virtual;\r\n procedure GetCellClassName(ACol,ARow: integer; AField: TField; AValue: string; var AClassName: string); virtual;\r\n procedure GetCellChildren(ACol,ARow: integer; AField: TField; AValue: string; AElement: TJSHTMLElement); virtual;\r\n procedure BindCellChildren(ACol,ARow: integer; AElement: TJSHTMLElement); virtual;\r\n procedure RenderGrid;\r\n procedure RenderGridData;\r\n procedure RenderGridScript;\r\n procedure BindEvents; override;\r\n function CreateElement: TJSElement; override;\r\n procedure UpdateElement; override;\r\n procedure SetRowCount(const Value: integer); override;\r\n procedure RowCountChanged(delta: integer); override;\r\n procedure ColCountChanged(delta: integer); override;\r\n procedure LoadFromStringList(AStrings: TStrings);\r\n property OnHttpRequestError: TNotifyEvent read FOnHttpRequestError write FOnHttpRequestError;\r\n property OnHttpRequestSuccess: TNotifyEvent read FOnHttpRequestSuccess write FOnHttpRequestSuccess;\r\n property OnHttpRequest: TGridRequestEvent read FOnHttpRequest write FOnHttpRequest;\r\n property RowCount;\r\n property ColCount;\r\n procedure EnableColResize;\r\n procedure EnableDrag; override;\r\n procedure DisableDrag; override;\r\n public\r\n constructor Create(AOwner: TComponent); override; overload;\r\n procedure CreateInitialize; override;\r\n destructor Destroy; override;\r\n procedure InitSample(AInitMethod: TInitMethod);\r\n procedure LoadFromJSON(const AURL: string; ADataNode: string = '');\r\n procedure LoadFromCSV(const AURL: string; Delimiter: char = ';'; LoadFixed: boolean = false);\r\n procedure LoadFromStrings(AStrings: TStrings; Delimiter: char = ';'; LoadFixed: boolean = false);\r\n procedure SaveToCSV(const AFileName: string; Delimiter: char = ';'; SaveFixed: boolean = false);\r\n procedure SaveToStrings(AStrings: TStrings; Delimiter: char = ';'; SaveFixed: boolean = false);\r\n procedure AddCheckBox(ACol, ARow: integer; Checked: boolean);\r\n procedure Clear; override;\r\n property CellElements[col,row: integer]: TJSHTMLElement read GetCellElement;\r\n property RowClassName[row: integer]: TElementClassName read GetRowClassName write SetRowClassName;\r\n procedure InsertRow(Index: integer);\r\n procedure RemoveRow(Index: integer);\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property BorderColor;\r\n property BorderStyle;\r\n property Color;\r\n property DragMode;\r\n property ElementClassName;\r\n property ElementFont;\r\n property ElementID;\r\n property ElementPosition;\r\n property ElementHeaderClassName: TElementClassName read FElementHeaderClassName write SetElementHeaderClassName;\r\n property ElementTableClassName: TElementClassName read FElementTableClassName write SetElementTableClassName;\r\n property Font;\r\n property Height;\r\n property HeightPercent;\r\n property HeightStyle;\r\n property Margins;\r\n property RowHeader: boolean read FRowHeader write FRowHeader default true;\r\n property ColHeader: boolean read FColHeader write FColHeader default true;\r\n property Options: TTableControlOptions read FOptions write SetOptions;\r\n property ParentBiDiMode;\r\n property PopupMenu;\r\n property Visible;\r\n property Width;\r\n property WidthPercent;\r\n property WidthStyle;\r\n property OnCheckClick: TCellCheckEvent read FOnCheckClick write FOnCheckClick;\r\n property OnClick;\r\n property OnClickCell: TCellEvent read FOnClickCell write FOnClickCell;\r\n property OnDblClickCell: TCellEvent read FOnDblClickCell write FOnDblClickCell;\r\n property OnDblClick;\r\n property OnGetCellData: TGridGetCellDataEvent read FOnGetCellData write FOnGetCellData;\r\n property OnGetCellChildren: TGridGetCellChildrenEvent read FOnGetCellChildren write FOnGetCellChildren;\r\n property OnGetCellClass: TGridGetCellClassEvent read FOnGetCellClass write FOnGetCellClass;\r\n property OnDragDrop;\r\n property OnDragOver;\r\n property OnEndDrag;\r\n property OnStartDrag;\r\n end;\r\n\r\n TTableControl = class(TCustomTableControl)\r\n published\r\n property RowCount;\r\n property ColCount;\r\n property OnHttpRequestError;\r\n property OnHttpRequestSuccess;\r\n end;\r\n\r\n TWebTableControl = class(TTableControl);\r\n\r\n TResponsiveGridItem = class(TCollectionItem)\r\n private\r\n FHTML: string;\r\n FElementHandle: TJSHTMLElement;\r\n FTag: integer;\r\n FItemObject: TObject;\r\n FVisible: boolean;\r\n FJSONObject: JSValue;\r\n procedure SetHTML(const Value: string);\r\n procedure SetVisible(const Value: boolean);\r\n function GetJSONElementValue(id: string): string;\r\n public\r\n constructor Create(ACollection: TCollection); override;\r\n destructor Destroy; override;\r\n property ElementHandle: TJSHTMLElement read FElementHandle;\r\n property ItemObject: TObject read FItemObject write FItemObject;\r\n property JSONElement: JSValue read FJSONObject write FJSONObject;\r\n property JSONElementValue[id: string]: string read GetJSONElementValue;\r\n published\r\n property HTML: string read FHTML write SetHTML;\r\n property Tag: integer read FTag write FTag default 0;\r\n property Visible: boolean read FVisible write SetVisible default true;\r\n end;\r\n\r\n TResponsiveGridItemEvent = procedure(Sender: TObject; Index: integer) of object;\r\n\r\n TResponsiveGridItemFieldValueEvent = procedure(Sender: TObject; Index: integer; AFieldName: string; var AValue: string) of object;\r\n\r\n TResponsiveGridItems = class(TOwnedCollection)\r\n private\r\n FOnItemDelete: TResponsiveGridItemEvent;\r\n FOnItemUpdate: TResponsiveGridItemEvent;\r\n FOnItemInsert: TResponsiveGridItemEvent;\r\n FOnItemAdd: TResponsiveGridItemEvent;\r\n FOnItemClear: TNotifyEvent;\r\n function GetItem(Index: integer): TResponsiveGridItem;\r\n procedure SetItem(Index: integer; const Value: TResponsiveGridItem);\r\n protected\r\n procedure DoItemClear; virtual;\r\n procedure DoItemAdd(Index: integer); virtual;\r\n procedure DoItemDelete(Index: integer); virtual;\r\n procedure DoItemInsert(Index: integer); virtual;\r\n procedure DoItemUpdate(Index: integer); virtual;\r\n property OnItemAdd: TResponsiveGridItemEvent read FOnItemAdd write FOnItemAdd;\r\n property OnItemUpdate: TResponsiveGridItemEvent read FOnItemUpdate write FOnItemUpdate;\r\n property OnItemDelete: TResponsiveGridItemEvent read FOnItemDelete write FOnItemDelete;\r\n property OnItemInsert: TResponsiveGridItemEvent read FOnItemInsert write FOnItemInsert;\r\n property OnItemClear: TNotifyEvent read FOnItemClear write FOnItemClear;\r\n procedure Update(Item: TCollectionItem); override;\r\n public\r\n constructor Create(AOwner: TComponent);\r\n procedure Clear;\r\n procedure Delete(Index: integer);\r\n function Add: TResponsiveGridItem; overload;\r\n function Add(HTML: string): TResponsiveGridItem; overload;\r\n function Insert(Index: integer): TResponsiveGridItem;\r\n property Items[Index: integer]: TResponsiveGridItem read GetItem write SetItem; default;\r\n end;\r\n\r\n TResponsiveGridOptions = class(TPersistent)\r\n private\r\n FItemWidthMin: integer;\r\n FItemHeight: integer;\r\n FItemGap: integer;\r\n FScrollVertical: boolean;\r\n FItemClassName: string;\r\n FItemColor: TColor;\r\n FItemBorderColor: TColor;\r\n FItemHoverColor: TColor;\r\n FItemHoverBorderColor: TColor;\r\n FOnChange: TNotifyEvent;\r\n FItemPadding: integer;\r\n FItemTemplate: string;\r\n FItemSelectedBorderColor: TColor;\r\n FItemSelectedTextColor: TColor;\r\n FItemSelectedColor: TColor;\r\n procedure SetItemBorderColor(const Value: TColor);\r\n procedure SetItemColor(const Value: TColor);\r\n procedure SetItemGap(const Value: integer);\r\n procedure SetItemHeight(const Value: integer);\r\n procedure SetItemHoverBorderColor(const Value: TColor);\r\n procedure SetItemHoverColor(const Value: TColor);\r\n procedure SetItemWidthMin(const Value: integer);\r\n procedure SetScrollVertical(const Value: boolean);\r\n procedure SetItemPadding(const Value: integer);\r\n procedure SetItemTemplate(const Value: string);\r\n procedure SetItemSelectedBorderColor(const Value: TColor);\r\n procedure SetItemSelectedColor(const Value: TColor);\r\n procedure SetItemSelectedTextColor(const Value: TColor);\r\n protected\r\n procedure Changed;\r\n public\r\n constructor Create;\r\n procedure Assign(Source: TPersistent); override;\r\n published\r\n property ItemClassName: string read FItemClassName write FItemClassName;\r\n property ItemColor: TColor read FItemColor write SetItemColor default clNone;\r\n property ItemBorderColor: TColor read FItemBorderColor write SetItemBorderColor default clNone;\r\n property ItemGap: integer read FItemGap write SetItemGap default 10;\r\n property ItemHeight: integer read FItemHeight write SetItemHeight default 100;\r\n property ItemHoverColor: TColor read FItemHoverColor write SetItemHoverColor default clNone;\r\n property ItemHoverBorderColor: TColor read FItemHoverBorderColor write SetItemHoverBorderColor default clNone;\r\n property ItemSelectedColor: TColor read FItemSelectedColor write SetItemSelectedColor default clNone;\r\n property ItemSelectedBorderColor: TColor read FItemSelectedBorderColor write SetItemSelectedBorderColor default clNone;\r\n property ItemSelectedTextColor: TColor read FItemSelectedTextColor write SetItemSelectedTextColor default clNone;\r\n property ItemPadding: integer read FItemPadding write SetItemPadding default 0;\r\n property ItemTemplate: string read FItemTemplate write SetItemTemplate;\r\n property ItemWidthMin: integer read FItemWidthMin write SetItemWidthMin default 100;\r\n property ScrollVertical: boolean read FScrollVertical write SetScrollVertical default True;\r\n property OnChange: TNotifyEvent read FOnChange write FOnChange;\r\n end;\r\n\r\n TResponsiveGrid = class(TWebCustomControl)\r\n private\r\n FDesignTime: boolean;\r\n FReq: TJSXMLHttpRequest;\r\n FDataNode: string;\r\n FOptions: TResponsiveGridOptions;\r\n FItems: TResponsiveGridItems;\r\n FOnItemDblClick: TResponsiveGridItemEvent;\r\n FOnItemClick: TResponsiveGridItemEvent;\r\n FOnHttpRequestError: TNotifyEvent;\r\n FOnHttpRequestSuccess: TNotifyEvent;\r\n FOnItemCreated: TResponsiveGridItemEvent;\r\n FOnItemGetFieldValue: TResponsiveGridItemFieldValueEvent;\r\n FItemIndex: integer;\r\n FDelimiter: char;\r\n FOnHttpRequest: TGridRequestEvent;\r\n FListElement: TJSHTMLElement;\r\n procedure SetOptions(const Value: TResponsiveGridOptions);\r\n procedure SetItems(const Value: TResponsiveGridItems);\r\n procedure SetItemIndex(const Value: integer);\r\n protected\r\n function DoHttpLoadJson(Event: TEventListenerEvent): boolean; virtual;\r\n function DoHttpLoadCsv(Event: TEventListenerEvent): boolean; virtual;\r\n function DoHttpAbort(Event: TEventListenerEvent): boolean; virtual;\r\n procedure DoHttpRequest(ARequest: TJSXMLHttpRequest); virtual;\r\n procedure DoItemCreated(Index: integer); virtual;\r\n procedure DoItemGetFieldValue(Index: integer; AFieldName: string; var AValue: string); virtual;\r\n\r\n procedure HandleDoItemClick(Index: integer); virtual;\r\n procedure HandleDoItemDblClick(Index: integer); virtual;\r\n function TargetIsParent(tgt,el: TJSElement): boolean; virtual;\r\n function HandleDoMouseEnter(Event: TJSMouseEvent): Boolean; override;\r\n function HandleDoClick(Event: TJSMouseEvent): Boolean; override;\r\n function HandleDoDblClick(Event: TJSMouseEvent): Boolean; override;\r\n procedure HandleItemAdd(Sender: TObject; Index: integer);\r\n procedure HandleItemUpdate(Sender: TObject; Index: integer);\r\n procedure HandleItemDelete(Sender: TObject; Index: integer);\r\n procedure HandleItemInsert(Sender: TObject; Index: integer);\r\n procedure HandleItemClear(Sender: TObject);\r\n procedure OptionsChanged(Sender: TObject); virtual;\r\n procedure FontChanged; override;\r\n function CreateElement: TJSElement; override;\r\n procedure CreateControl; override;\r\n procedure BindElement; override;\r\n procedure UpdateElement; override;\r\n procedure RenderGrid;\r\n procedure Loaded; override;\r\n public\r\n constructor Create(AOwner: TComponent); override; overload;\r\n procedure CreateInitialize; override;\r\n destructor Destroy; override;\r\n procedure LoadFromJSON(const AURL: string; ADataNode: string = '');\r\n procedure LoadFromCSV(const AURL: string; Delimiter: char = ';');\r\n function ListElementHandle: TJSElement;\r\n function ItemByTag(ATag: integer): TResponsiveGridItem;\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property ElementID;\r\n property ElementClassName;\r\n property ElementFont;\r\n property ElementPosition;\r\n property Font;\r\n property Height;\r\n property HeightPercent;\r\n property HeightStyle;\r\n\r\n property ItemIndex: integer read FItemIndex write SetItemIndex default 0;\r\n property Items: TResponsiveGridItems read FItems write SetItems;\r\n property Margins;\r\n property Options: TResponsiveGridOptions read FOptions write SetOptions;\r\n property ParentFont;\r\n property PopupMenu;\r\n property Visible;\r\n property Width;\r\n property WidthPercent;\r\n property WidthStyle;\r\n property OnClick;\r\n property OnDblClick;\r\n property OnMouseDown;\r\n property OnMouseUp;\r\n property OnMouseMove;\r\n property OnMouseLeave;\r\n property OnMouseEnter;\r\n property OnItemCreated: TResponsiveGridItemEvent read FOnItemCreated write FOnItemCreated;\r\n property OnItemGetFieldValue: TResponsiveGridItemFieldValueEvent read FOnItemGetFieldValue write FOnItemGetFieldValue;\r\n property OnItemClick: TResponsiveGridItemEvent read FOnItemClick write FOnItemClick;\r\n property OnItemDblClick: TResponsiveGridItemEvent read FOnItemDblClick write FOnItemDblClick;\r\n property OnHttpRequestError: TNotifyEvent read FOnHttpRequestError write FOnHttpRequestError;\r\n property OnHttpRequestSuccess: TNotifyEvent read FOnHttpRequestSuccess write FOnHttpRequestSuccess;\r\n property OnHttpRequest: TGridRequestEvent read FOnHttpRequest write FOnHttpRequest;\r\n end;\r\n\r\n TWebResponsiveGrid = class(TResponsiveGrid);\r\n\r\nfunction GridRect(Left,Top,Right,Bottom: integer): TGridRect;\r\n\r\nimplementation\r\n\r\nuses\r\n SysUtils, Math, WEBLib.Utils, WEBLib.WebTools;\r\n\r\nfunction GridRect(Left,Top,Right,Bottom: integer): TGridRect;\r\nbegin\r\n Result.Left := Left;\r\n Result.Top := Top;\r\n Result.Right := Right;\r\n Result.Bottom := Bottom;\r\nend;\r\n\r\n{ TCustomStringGrid }\r\n\r\nprocedure TCustomStringGrid.AddCheckBox(const ACol, ARow: integer);\r\nvar\r\n chk: TJSElement;\r\nbegin\r\n if (ACol < ColCount) and (ARow < RowCount) then\r\n begin\r\n if not HasCheckBox(ACol,ARow) then\r\n begin\r\n chk := document.createElement('INPUT');\r\n chk['type'] := 'checkbox';\r\n CellElements[ACol,ARow].insertBefore(chk, CellElements[ACol,ARow].firstChild);\r\n chk.addEventListener('click',FHandleCheckClickPtr);\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TCustomStringGrid.AddSelection(ACell: TJSElement);\r\nbegin\r\n if ShowSelection then\r\n ACell.classlist.Add('selected');\r\nend;\r\n\r\nprocedure TCustomStringGrid.BindCellChildren(ACol, ARow: integer; AElement: TJSHTMLElement);\r\nvar\r\n el: TJSHTMLElement;\r\nbegin\r\n el := TJSHTMLElement(AElement.firstChild);\r\n\r\n if Assigned(el) and (el.tagName = 'INPUT') then\r\n begin\r\n if (lowercase(el.getAttribute('TYPE'))= 'checkbox') then\r\n begin\r\n el.addEventListener('click', @HandleCheckBoxClick);\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TCustomStringGrid.BindEvents;\r\nbegin\r\n inherited;\r\n RenderGridScript;\r\nend;\r\n\r\nprocedure TCustomStringGrid.CancelEdit;\r\nvar\r\n eh: TJSHTMLElement;\r\nbegin\r\n if EditMode then\r\n begin\r\n if FEditType = geCombo then\r\n begin\r\n eh := FCombo.ElementHandle;\r\n end\r\n else\r\n if FEditType = geMask then\r\n begin\r\n eh := FMask.ElementHandle;\r\n end\r\n else\r\n begin\r\n eh := FEdit;\r\n end;\r\n\r\n FEditMode := false;\r\n\r\n ValidateCell(FEditCol, FEditRow, FOrigVal);\r\n\r\n FSelectedCell.removeChild(eh);\r\n FSelectedCell.innerHTML := FOrigVal;\r\n UpdateCell(FEditCol, FEditRow, FOrigVal);\r\n\r\n AddSelection(FSelectedCell);\r\n\r\n SetEditText(FEditCol, FEditRow, FOrigVal);\r\n\r\n TJSHTMLElement(FNormalCells).focus();\r\n end;\r\nend;\r\n\r\nfunction TCustomStringGrid.CanEditCell(ACol, ARow: integer): boolean;\r\nvar\r\n CanEdit: boolean;\r\nbegin\r\n CanEdit := true;\r\n if Assigned(OnCanEditCell) then\r\n OnCanEditCell(Self, ACol, ARow, CanEdit);\r\n\r\n Result := CanEdit;\r\nend;\r\n\r\nfunction TCustomStringGrid.CanSelect(ACol, ARow: integer): boolean;\r\nbegin\r\n Result := true;\r\n if Assigned(OnSelectCell) then\r\n OnSelectCell(Self, ACol, ARow, Result);\r\nend;\r\n\r\nfunction TCustomStringGrid.CellColSpan(ACol, ARow: integer): integer;\r\nvar\r\n el: TJSHTMLElement;\r\n s: string;\r\n e: integer;\r\nbegin\r\n Result := 0;\r\n\r\n el := CellRealElement(ACol,ARow);\r\n if Assigned(el) then\r\n begin\r\n s := el['colspan'];\r\n val(s,Result,e);\r\n end;\r\nend;\r\n\r\n\r\nfunction TCustomStringGrid.CellRealElement(const ACol, ARow: integer):TJSHTMLElement;\r\nvar\r\n el: TJSHTMLElement;\r\n t: TJSElement;\r\n c,r: integer;\r\nbegin\r\n if (ACol < FixedCols) and (ARow < FixedRows) then\r\n begin\r\n t := FFixedColRow;\r\n c := ACol;\r\n r := ARow;\r\n end\r\n else\r\n if (ACol < FixedCols) and (ARow >= FixedRows) then\r\n begin\r\n t := FFixedCol;\r\n c := ACol;\r\n r := ARow - FixedRows;\r\n end\r\n else\r\n if (ACol >= FixedCols) and (ARow < FixedRows) then\r\n begin\r\n t := FFixedRow;\r\n c := ACol - FixedCols;\r\n r := ARow;\r\n end\r\n else\r\n begin\r\n t := FNormalCells;\r\n c := ACol - FixedCols;\r\n r := ARow - FixedRows;\r\n end;\r\n\r\n el := nil;\r\n\r\n asm\r\n var getTableCell = function (table, x, y) {\r\n var m = [], row, cell, xx, tx, ty, xxx, yyy;\r\n for(yyy = 0; yyy < table.rows.length; yyy++) {\r\n row = table.rows[yyy];\r\n for(xxx = 0; xxx < row.cells.length; xxx++) {\r\n cell = row.cells[xxx];\r\n xx = xxx;\r\n for(; m[yyy] && m[yyy][xx]; ++xx) {}\r\n for(tx = xx; tx < xx + cell.colSpan; ++tx) {\r\n for(ty = yyy; ty < yyy + cell.rowSpan; ++ty) {\r\n if (!m[ty])\r\n m[ty] = [];\r\n m[ty][tx] = true;\r\n }\r\n }\r\n if (xx <= x && x < xx + cell.colSpan && yyy <= y && y < yyy + cell.rowSpan)\r\n return cell;\r\n }\r\n }\r\n return null;\r\n };\r\n el = getTableCell(t, c, r);\r\n\r\n end;\r\n Result := el;\r\nend;\r\n\r\nfunction TCustomStringGrid.CellRowSpan(ACol, ARow: integer): integer;\r\nvar\r\n el: TJSHTMLElement;\r\n s: string;\r\n e: integer;\r\nbegin\r\n Result := 0;\r\n\r\n el := CellRealElement(ACol,ARow);\r\n if Assigned(el) then\r\n begin\r\n s := el['rowspan'];\r\n val(s,Result,e);\r\n end;\r\nend;\r\n\r\nprocedure TCustomStringGrid.ChangeRow;\r\nbegin\r\n //\r\nend;\r\n\r\nprocedure TCustomStringGrid.Clear;\r\nvar\r\n c,r: integer;\r\nbegin\r\n for c := 0 to ColCount - 1 do\r\n for r := 0 to Rowcount - 1 do\r\n Cells[c,r] := '';\r\nend;\r\n\r\nprocedure TCustomStringGrid.ClearData;\r\nbegin\r\n Clear;\r\n RowCount := FixedRows + 5;\r\n ColCount := FixedCols + 5;\r\nend;\r\n\r\nprocedure TCustomStringGrid.ClearMethodPointers;\r\nbegin\r\n inherited;\r\n FHandleEditBlurPtr := nil;\r\n FHandleEditKeypressPtr := nil;\r\n FHandleCheckClickPtr := nil;\r\nend;\r\n\r\n\r\nprocedure TCustomStringGrid.ColCountChanged(delta: integer);\r\nvar\r\n c: integer;\r\n fixcol,fixtxtcol: string;\r\nbegin\r\n if IsUpdating then\r\n Exit;\r\n\r\n if delta > 0 then\r\n begin\r\n fixcol := ColorToHTML(FFixedColor);\r\n fixtxtcol := ColorToHTML(FFixedTextColor);\r\n\r\n asm\r\n var i = 0;\r\n var j = 0;\r\n var k = 0;\r\n var tr = undefined;\r\n var td = undefined;\r\n var sizediv,div = undefined;\r\n\r\n var l = this.FNormalCells.rows.length;\r\n\r\n for(j = 0; j < l; j++)\r\n {\r\n tr = this.FNormalCells.rows[j];\r\n\r\n k = tr.cells.length;\r\n\r\n for(i = 0; i < delta; i++)\r\n {\r\n tr.insertCell(k);\r\n }\r\n }\r\n\r\n for(j = 0; j < this.FFixedRows; j++)\r\n {\r\n k = this.FFixedRow.rows[j].cells.length;\r\n\r\n for(i = 0; i < delta; i++)\r\n {\r\n td = this.FFixedRow.rows[j].insertCell(k);\r\n td.style.setProperty('background-color',fixcol);\r\n td.style.setProperty('color',fixtxtcol);\r\n div = document.createElement(\"DIV\");\r\n div.style = 'position:relative;height:100%;width:100%';\r\n td.appendChild(div);\r\n sizediv = document.createElement(\"DIV\");\r\n sizediv.style = 'position:absolute;height:100%;width:5px;margin-right:-5px;left:100%;top:0px;cursor:w-resize;z-index:999;';\r\n div.appendChild(sizediv);\r\n }\r\n }\r\n end;\r\n\r\n for c := 1 to delta do\r\n begin\r\n ColWidths[ColCount - c] := DefaultColWidth;\r\n end;\r\n\r\n if DragMode = dmAutomatic then\r\n EnableDrag;\r\n end;\r\n\r\n if delta < 0 then\r\n begin\r\n\r\n asm\r\n var i = 0;\r\n var j = 0;\r\n var k = 0;\r\n var tr = undefined;\r\n\r\n var l = this.FNormalCells.rows.length;\r\n\r\n for(j = 0; j < l; j++)\r\n {\r\n tr = this.FNormalCells.rows[j];\r\n\r\n k = tr.cells.length;\r\n\r\n for(i = 0; i < -delta; i++)\r\n {\r\n tr.deleteCell(k - i - 1);\r\n }\r\n }\r\n\r\n if (this.FFixedRows > 0) {\r\n\r\n k = this.FFixedRow.rows[0].cells.length;\r\n\r\n for(i = 0; i < -delta; i++)\r\n {\r\n this.FFixedRow.rows[0].deleteCell(k- i - 1);\r\n }\r\n }\r\n end;\r\n\r\n if ColCount > 0 then\r\n ColWidths[ColCount - 1] := ColWidths[ColCount - 1];\r\n end;\r\nend;\r\n\r\nfunction TCustomStringGrid.ColOffset: integer;\r\nbegin\r\n Result := FixedCols;\r\nend;\r\n\r\nconstructor TCustomStringGrid.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n DrawingStyle := gdsThemed;\r\nend;\r\n\r\nfunction TCustomStringGrid.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('SPAN');\r\n FGrid := nil;\r\nend;\r\n\r\nprocedure TCustomStringGrid.CreateInitialize;\r\nbegin\r\n inherited;\r\n FColWidths := TList.Create;\r\n FRowHeights := TList.Create;\r\n FRows := TStringList.Create;\r\n FRows.OnChange := RowsChanged;\r\n FComboBoxItems := TStringList.Create;\r\n FRange := TGridRange.Create;\r\n\r\n FStartCell.X := -1;\r\n FStartCell.Y := -1;\r\n FFixedColor := clBtnFace;\r\n FRowCount := 5;\r\n FColCount := 5;\r\n FFixedCols := 1;\r\n FFixedRows := 1;\r\n FDefaultColWidth := 64;\r\n FDefaultRowHeight := 22;\r\n FShowSelection := true;\r\n ElementFont := efProperty;\r\n ElementPosition := epAbsolute;\r\n ScrollBars := ssBoth;\r\n FGridLineColor := clSilver;\r\n FSelectionColor := $FF8F5B;\r\n FSelectionTextColor := $FFFFFF;\r\n Options := [goHorzLine, goVertLine, goRangeSelect];\r\n if (csDesigning in ComponentState) then\r\n begin\r\n Width := 400;\r\n Height := 300;\r\n end;\r\nend;\r\n\r\nprocedure TCustomStringGrid.DataBeginUpdate;\r\nbegin\r\nend;\r\n\r\nprocedure TCustomStringGrid.DataEndUpdate;\r\nbegin\r\nend;\r\n\r\nprocedure TCustomStringGrid.DataInsertRow(AInsertPosition: Integer);\r\nbegin\r\n InsertRow(AInsertPosition);\r\nend;\r\n\r\ndestructor TCustomStringGrid.Destroy;\r\nbegin\r\n FRange.Free;\r\n FColWidths.Free;\r\n FRowHeights.Free;\r\n FRows.Free;\r\n FComboBoxItems.Free;\r\n if Assigned(FCombo) then\r\n FCombo.Free;\r\n if Assigned(FMask) then\r\n FMask.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TCustomStringGrid.DisableDrag;\r\n procedure RemoveDraggableAttribute(AElement: TJSElement);\r\n var\r\n I: Integer;\r\n begin\r\n for I := 0 to AElement.children.length - 1 do\r\n begin\r\n if TJSElement(AElement.children[I]).tagName = 'TD' then\r\n begin\r\n TJSElement(AElement.children[I]).removeAttribute('draggable');\r\n RemoveDraggableAttribute(TJSElement(AElement.children[I]));\r\n end\r\n else\r\n RemoveDraggableAttribute(TJSElement(AElement.children[I]));\r\n end;\r\n end;\r\nbegin\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n RemoveDraggableAttribute(Container);\r\nend;\r\n\r\nfunction TCustomStringGrid.DoHttpLoadCsv(Event: TEventListenerEvent): boolean;\r\nvar\r\n sl: TStringList;\r\n req: TJSXMLHttpRequest;\r\nbegin\r\n req := TJSXMLHttpRequest(Event.target);\r\n\r\n if (req.status >= 200) and (req.status <= 208) then\r\n begin\r\n sl := TStringList.Create;\r\n\r\n sl.Text := req.responseText;\r\n\r\n try\r\n LoadFromStringList(sl);\r\n finally\r\n sl.Free;\r\n end;\r\n\r\n if Assigned(OnHttpRequestSuccess) then\r\n OnHttpRequestSuccess(Self);\r\n end;\r\n\r\n Result := true;\r\nend;\r\n\r\nprocedure TCustomStringGrid.LoadFromJSON(AJSON: TJSObject; ADataNode: string = '');\r\nvar\r\n JO: JSValue;\r\n JA: TJSArray;\r\n r,c: integer;\r\n arow: string;\r\n sl: TStringList;\r\n ce: TJSHTMLElement;\r\n cd, cn: string;\r\n\r\nbegin\r\n if ADataNode <> '' then\r\n JA := TJSArray(AJSON.Properties[ADataNode])\r\n else\r\n JA := TJSArray(AJSON);\r\n\r\n if Assigned(JA) then\r\n begin\r\n sl := TStringList.Create;\r\n\r\n RowCount := JA.length + FixedRows;\r\n\r\n for r := 0 to JA.length - 1 do\r\n begin\r\n JO := JA.Elements[r];\r\n\r\n c := 0;\r\n arow := '';\r\n\r\n asm\r\n var x = undefined;\r\n for (x in JO) {\r\n arow += \"|\" + JO[x];\r\n c++;\r\n }\r\n end;\r\n\r\n Delete(arow, 1, 1);\r\n sl.StrictDelimiter := true;\r\n sl.Delimiter := '|';\r\n sl.DelimitedText := arow;\r\n if ColCount < sl.Count then\r\n ColCount := sl.Count + FixedCols;\r\n\r\n for c := 0 to sl.Count - 1 do\r\n begin\r\n cd := sl.Strings[c];\r\n GetCellData(FixedCols + c, FixedRows + r, nil, cd);\r\n Cells[FixedCols + c, FixedRows + r] := cd;\r\n cn := '';\r\n\r\n ce := CellElements[FixedCols + c, FixedRows + r];\r\n\r\n GetCellChildren(FixedCols + c, FixedRows + r, nil, cd, ce);\r\n\r\n GetCellClassName(FixedCols + c, FixedRows + r, nil, cd, cn);\r\n if cn <> '' then\r\n ce.setAttribute('class',cn);\r\n end;\r\n end;\r\n\r\n sl.Free;\r\n end;\r\n\r\n UpdateGridSize;\r\nend;\r\n\r\nprocedure TCustomStringGrid.LoadFromStringList(AStrings: TStrings);\r\nvar\r\n arow: TStringList;\r\n i,j,maxcol: integer;\r\n sr,sc: integer;\r\n cd, cn: string;\r\n ce: TJSHTMLElement;\r\n\r\nbegin\r\n RowCount := AStrings.Count + FixedRows;\r\n\r\n arow := TStringList.Create;\r\n\r\n sc := FixedCols;\r\n sr := FixedRows;\r\n\r\n if FLoadFixed then\r\n begin\r\n sr := 0;\r\n sc := 0;\r\n end;\r\n\r\n maxcol := 0;\r\n\r\n try\r\n for i := 0 to AStrings.Count - 1 do\r\n begin\r\n arow.StrictDelimiter := true;\r\n arow.Delimiter := FDelimiter;\r\n arow.DelimitedText := AStrings.Strings[i];\r\n\r\n if arow.Count > maxcol then\r\n maxcol := arow.Count;\r\n\r\n if arow.Count > ColCount - sc then\r\n ColCount := arow.Count + sc;\r\n\r\n for j := 0 to arow.Count - 1 do\r\n begin\r\n cd := arow.Strings[j];\r\n GetCellData(j + sc, i + sr, nil, cd);\r\n Cells[j + sc, i + sr] := cd;\r\n\r\n ce := CellElements[j + sc, i + sr];\r\n\r\n GetCellChildren(j + sc, i + sr, nil, cd, ce);\r\n\r\n cn := '';\r\n GetCellClassName(j + sc, i + sr, nil, cd, cn);\r\n if cn <> '' then\r\n ce.setAttribute('class',cn);\r\n end;\r\n end;\r\n finally\r\n arow.Free;\r\n end;\r\n\r\n if maxcol < ColCount - sc then\r\n ColCount := maxcol + sc;\r\nend;\r\n\r\nprocedure TCustomStringGrid.LoadFromStrings(AStrings: TStrings; Delimiter: char;\r\n LoadFixed: boolean);\r\nbegin\r\n FDelimiter := Delimiter;\r\n FLoadFixed := LoadFixed;\r\n\r\n LoadFromStringList(AStrings);\r\nend;\r\n\r\n{$HINTS OFF}\r\nfunction TCustomStringGrid.DoHttpLoadJson(Event: TEventListenerEvent): boolean;\r\nvar\r\n J: TJSObject;\r\n req: TJSXMLHttpRequest;\r\nbegin\r\n req := TJSXMLHttpRequest(Event.target);\r\n\r\n if (req.status >= 200) and (req.status <= 208) then\r\n begin\r\n J := TJSJSON.parseObject(req.responseText);\r\n\r\n LoadFromJSON(J, FDataNode);\r\n\r\n if Assigned(OnHttpRequestSuccess) then\r\n OnHttpRequestSuccess(Self);\r\n end;\r\n\r\n Result := true;\r\nend;\r\n\r\n\r\nprocedure TCustomStringGrid.DoHttpRequest(ARequest: TJSXMLHttpRequest);\r\nvar\r\n LRequestRec: TJSXMLHttpRequestRecord;\r\nbegin\r\n if Assigned(OnHttpRequest) then\r\n begin\r\n LRequestRec.req := ARequest;\r\n OnHttpRequest(Self, LRequestRec);\r\n end;\r\nend;\r\n\r\nprocedure TCustomStringGrid.EnableColResize;\r\nvar\r\n TableName: string;\r\n ResizeEnabled: Boolean;\r\nbegin\r\n if not (csDesigning in ComponentState) then\r\n begin\r\n TableName := GetID + 'ResizeRow';\r\n\r\n ResizeEnabled := (goColSizing in Options);\r\n asm\r\n TMSStringGridresizableGrid(TableName, ResizeEnabled);\r\n end;\r\n\r\n TableName := GetID + 'ResizeFixedRow';\r\n ResizeEnabled := (goColSizing in Options);\r\n asm\r\n TMSStringGridresizableGrid(TableName, ResizeEnabled);\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TCustomStringGrid.EnableDrag;\r\n procedure AddDraggableAttribute(AElement: TJSElement);\r\n var\r\n I: Integer;\r\n begin\r\n for I := 0 to AElement.children.length - 1 do\r\n begin\r\n if TJSElement(AElement.children[I]).tagName = 'TD' then\r\n begin\r\n TJSElement(AElement.children[I]).Attrs['draggable'] := 'true';\r\n AddDraggableAttribute(TJSElement(AElement.children[I]));\r\n end\r\n else\r\n AddDraggableAttribute(TJSElement(AElement.children[I]));\r\n end;\r\n end;\r\nbegin\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n AddDraggableAttribute(Container);\r\nend;\r\n\r\n{$HINTS ON}\r\n\r\nprocedure TCustomStringGrid.DoBoundsChange;\r\nvar\r\n fw,fh,nwvis,nhvis: integer;\r\n\r\nbegin\r\n inherited;\r\n\r\n if Assigned(ElementHandle) then\r\n begin\r\n\r\n UpdateGridSize;\r\n\r\n fw := FixedColWidth;\r\n fh := FixedRowHeight;\r\n\r\n nwvis := Width - fw;\r\n nhvis := Height - fh;\r\n\r\n if Assigned(FNormalCells) then\r\n begin\r\n TJSHTMLElement(FNormalCells.parentElement.parentElement).style.setProperty('width',inttostr(nwvis)+'px');\r\n TJSHTMLElement(FNormalCells.parentElement.parentElement).style.setProperty('height',inttostr(nhvis)+'px');\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TCustomStringGrid.DoCheckClick(ACol, ARow: Longint; Checked: boolean);\r\nbegin\r\n if Assigned(OnCheckClick) then\r\n OnCheckClick(Self, ACol, ARow, Checked);\r\nend;\r\n\r\nprocedure TCustomStringGrid.DoColumnSized(AColumn: integer);\r\nbegin\r\n if Assigned(OnColumnSized) then\r\n OnColumnSized(Self, AColumn);\r\nend;\r\n\r\nfunction TCustomStringGrid.DoHttpAbort(Event: TEventListenerEvent): boolean;\r\nbegin\r\n if Assigned(OnHttpRequestError) then\r\n OnHttpRequestError(Self);\r\n\r\n Result := true;\r\nend;\r\n\r\nfunction TCustomStringGrid.FixedColWidth: integer;\r\nvar\r\n i: integer;\r\nbegin\r\n Result := 0;\r\n\r\n for i := 0 to FixedCols - 1 do\r\n Result := Result + ColWidths[i];\r\nend;\r\n\r\nfunction TCustomStringGrid.FixedRowHeight: integer;\r\nvar\r\n i: integer;\r\nbegin\r\n Result := 0;\r\n\r\n for i := 0 to FixedRows - 1 do\r\n Result := Result + RowHeights[i];\r\nend;\r\n\r\nfunction TCustomStringGrid.FocusedCell: TJSElement;\r\nbegin\r\n Result := FSelectedCell;\r\nend;\r\n\r\nprocedure TCustomStringGrid.GetCellChildren(ACol, ARow: integer; AField: TField;\r\n AValue: string; AElement: TJSHTMLElement);\r\nvar\r\n LElementRec: TJSHTMLElementRecord;\r\nbegin\r\n if Assigned(OnGetCellChildren) then\r\n begin\r\n LElementRec.element := AElement;\r\n OnGetCellChildren(Self, ACol, ARow, AField, AValue, LElementRec);\r\n end;\r\nend;\r\n\r\nprocedure TCustomStringGrid.GetCellClassName(ACol, ARow: integer;\r\n AField: TField; AValue: string; var AClassName: string);\r\nbegin\r\n if Assigned(OnGetCellClass) then\r\n OnGetCellClass(Self, ACol, ARow, AField, AValue, AClassName);\r\nend;\r\n\r\nprocedure TCustomStringGrid.GetCellData(ACol, ARow: integer; AField: TField;\r\n var AValue: string);\r\nbegin\r\n if Assigned(OnGetCellData) then\r\n OnGetCellData(Self, ACol, ARow, AField, AValue);\r\nend;\r\n\r\n{$HINTS OFF}\r\nprocedure TCustomStringGrid.GetCellEditor(const ACol, ARow: integer;\r\n var AEditor: TGridCellEditor);\r\nbegin\r\n if Assigned(OnGetCellEditor) then\r\n OnGetCellEditor(Self, ACol, ARow, AEditor);\r\nend;\r\n\r\nfunction TCustomStringGrid.GetCellElements(ACol, ARow: integer): TJSHTMLElement;\r\nvar\r\n rc,rr: integer;\r\n res: TJSHTMLElement;\r\nbegin\r\n\r\n Result := CellRealElement(ACol,ARow);\r\n Exit;\r\n\r\n res := nil;\r\n if (ACol < FixedCols) and (ARow >= FixedRows) then\r\n begin\r\n rr := ARow - FixedRows;\r\n rc := ACol;\r\n\r\n asm\r\n res = this.FFixedCol.rows[rr].cells[rc];\r\n end;\r\n end;\r\n\r\n if (ARow < FixedRows) and (ACol >= FixedCols) then\r\n begin\r\n rc := ACol - FixedCols;\r\n rr := ARow;\r\n\r\n asm\r\n res = this.FFixedRow.rows[rr].cells[rc];\r\n end;\r\n end;\r\n\r\n if (ACol < FixedCols) and (ARow < FixedRows) then\r\n begin\r\n rr := ARow;\r\n rc := ACol;\r\n asm\r\n res = this.FFixedColRow.rows[rr].cells[rc];\r\n end;\r\n end;\r\n\r\n if (ACol >= FixedCols) and (ARow >= FixedRows) and (ARow < RowCount) and (ACol < ColCount) then\r\n begin\r\n rc := ACol - FixedCols;\r\n rr := ARow - FixedRows;\r\n asm\r\n res = this.FNormalCells.rows[rr].cells[rc];\r\n end;\r\n end;\r\n\r\n Result := res;\r\nend;\r\n\r\n\r\nfunction TCustomStringGrid.GetDirectCellElements(ACol, ARow: integer): TJSHTMLElement;\r\nvar\r\n rc,rr: integer;\r\n res: TJSHTMLElement;\r\nbegin\r\n res := nil;\r\n\r\n if (ACol < FixedCols) and (ARow >= FixedRows) then\r\n begin\r\n rr := ARow - FixedRows;\r\n rc := ACol;\r\n\r\n asm\r\n res = this.FFixedCol.rows[rr].cells[rc];\r\n end;\r\n end;\r\n\r\n if (ARow < FixedRows) and (ACol >= FixedCols) then\r\n begin\r\n rc := ACol - FixedCols;\r\n rr := ARow;\r\n\r\n asm\r\n res = this.FFixedRow.rows[rr].cells[rc];\r\n end;\r\n end;\r\n\r\n if (ACol < FixedCols) and (ARow < FixedRows) then\r\n begin\r\n rr := ARow;\r\n rc := ACol;\r\n asm\r\n res = this.FFixedColRow.rows[rr].cells[rc];\r\n end;\r\n end;\r\n\r\n if (ACol >= FixedCols) and (ARow >= FixedRows) and (ARow < RowCount) and (ACol < ColCount) then\r\n begin\r\n rc := ACol - FixedCols;\r\n rr := ARow - FixedRows;\r\n asm\r\n res = this.FNormalCells.rows[rr].cells[rc];\r\n end;\r\n end;\r\n\r\n Result := res;\r\nend;\r\n\r\n{$HINTS ON}\r\n\r\nfunction TCustomStringGrid.GetCells(ACol, ARow: integer): string;\r\nvar\r\n td: TJSHTMLElement;\r\nbegin\r\n td := CellElements[ACol,ARow];\r\n Result := td.innerHTML;\r\nend;\r\n\r\nfunction TCustomStringGrid.GetCheckElement(ACol, ARow: integer): TJSHTMLElement;\r\nvar\r\n el: TJSElement;\r\nbegin\r\n Result := nil;\r\n\r\n if (ACol < ColCount) and (ARow < RowCount) then\r\n begin\r\n el := TJSElement(CellElements[ACol,ARow].firstChild);\r\n if Assigned(el) and (el is TJSElement) then\r\n begin\r\n if (uppercase(el['type']) = 'CHECKBOX') then\r\n begin\r\n Result := TJSHTMLElement(el);\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TCustomStringGrid.GetCheckState(ACol, ARow: integer): boolean;\r\nvar\r\n el: TJSElement;\r\n res: boolean;\r\nbegin\r\n Result := false;\r\n\r\n if (ACol < ColCount) and (ARow < RowCount) then\r\n begin\r\n el := GetCheckElement(ACol,ARow);\r\n if Assigned(el) then\r\n begin\r\n asm\r\n res = el.checked;\r\n end;\r\n Result := res;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TCustomStringGrid.GetCol: integer;\r\nvar\r\n res: integer;\r\nbegin\r\n res := -1;\r\n if Assigned(FSelectedCell) then\r\n begin\r\n asm\r\n res = this.FSelectedCell.cellIndex;\r\n end;\r\n res := res + FixedCols;\r\n end;\r\n\r\n Result := res;\r\nend;\r\n\r\nfunction TCustomStringGrid.GetColWidths(ACol: integer): integer;\r\nbegin\r\n if ACol < FColWidths.Count then\r\n Result := integer(FColWidths.Items[ACol])\r\n else\r\n Result := DefaultColWidth;\r\nend;\r\n\r\nfunction TCustomStringGrid.GetDataRowCount: Integer;\r\nbegin\r\n Result := RowCount - FixedRows;\r\nend;\r\n\r\nfunction TCustomStringGrid.GetEditText(ACol, ARow: Longint): string;\r\nbegin\r\n Result := Cells[ACol,ARow];\r\n\r\n if Assigned(OnGetEditText) then\r\n OnGetEditText(Self, ACol, ARow, Result);\r\nend;\r\n\r\nfunction TCustomStringGrid.GetGridCSS(id: string): string;\r\nbegin\r\n Result := '';\r\n\r\n if ElementTableClassName <> '' then\r\n Exit;\r\n\r\n if not (goVertLine in Options) then\r\n Result := 'border-left: 0px; border-right: 0px;';\r\n\r\n if not (goHorzLine in Options) then\r\n Result := Result + 'border-top: 0px; border-bottom: 0px;';\r\n\r\n if ElementFont = efProperty then\r\n Result := Result + CSSFont(Font);\r\n\r\n Result := 'table#' + id + ' td { overflow: hidden; text-overflow: ellipsis; white-space:nowrap; border: solid 1px '+ ColorToHTML(GridLineColor) +'; padding: 0px;' + Result + '} '+\r\n 'table#'+id+' td.selected { background-color: '+ ColorToHTML(SelectionColor)+ '; color: '+ ColorToHTML(SelectionTextColor)+';} '+\r\n 'table#'+id+' tr.selected { background-color: '+ ColorToHTML(SelectionColor)+ '; color: '+ ColorToHTML(SelectionTextColor)+';} ';\r\nend;\r\n\r\nfunction TCustomStringGrid.GetLeftCol: integer;\r\nvar\r\n i,w,l: integer;\r\nbegin\r\n Result := FixedCols;\r\n\r\n\r\n if Assigned(FNormalCells) then\r\n begin\r\n l := FNormalCells.parentElement.parentElement.scrollLeft;\r\n w := 0;\r\n for i := FixedCols to ColCount - 1 do\r\n begin\r\n if l <= w then\r\n begin\r\n Result := i;\r\n break;\r\n end;\r\n w := w + ColWidths[i]+1;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TCustomStringGrid.GetMethodPointers;\r\nbegin\r\n inherited;\r\n FHandleEditBlurPtr := @HandleEditBlur;\r\n FHandleEditKeypressPtr := @HandleEditKeypress;\r\n FHandleCheckClickPtr := @HandleCheckBoxClick;\r\nend;\r\n\r\nfunction TCustomStringGrid.GetRow: integer;\r\nvar\r\n res: integer;\r\nbegin\r\n res := -1;\r\n if Assigned(FSelectedCell) then\r\n begin\r\n asm\r\n res = this.FSelectedCell.parentElement.rowIndex;\r\n end;\r\n res := res + FixedRows;\r\n end;\r\n\r\n Result := res;\r\nend;\r\n\r\nfunction TCustomStringGrid.GetRowHeights(ARow: integer): integer;\r\nbegin\r\n if ARow < FRowHeights.Count then\r\n Result := integer(FRowHeights.Items[ARow])\r\n else\r\n Result := DefaultRowHeight;\r\nend;\r\n\r\nfunction TCustomStringGrid.GetRows(Index: integer): TStrings;\r\nvar\r\n i: integer;\r\nbegin\r\n if (Index >= 0) and (Index < RowCount) then\r\n begin\r\n FRowsIndex := Index;\r\n FRows.Clear;\r\n for i := 0 to ColCount - 1 do\r\n FRows.Add(Cells[i,Index]);\r\n\r\n Result := FRows;\r\n end\r\n else\r\n raise Exception.Create('Invalid row index');\r\nend;\r\n\r\nfunction TCustomStringGrid.GetSelection: TGridRect;\r\nbegin\r\n Result := FSelection;\r\nend;\r\n\r\nfunction TCustomStringGrid.GetTopRow: integer;\r\nvar\r\n pixVal: integer;\r\nbegin\r\n Result := FixedRows;\r\n\r\n if Assigned(FNormalCells) and (pixVal >= 0) then\r\n begin\r\n pixVal := FNormalCells.parentElement.parentElement.scrollTop;\r\n\r\n Result := FixedRows + pixVal div DefaultRowHeight;\r\n end;\r\nend;\r\n\r\nfunction TCustomStringGrid.GetVisibleColCount: integer;\r\nvar\r\n i: integer;\r\n el: TJSHTMLElement;\r\n cr,gr: TJSDOMRect;\r\nbegin\r\n i := LeftCol;\r\n\r\n gr := ElementHandle.getBoundingClientRect;\r\n\r\n while i < ColCount do\r\n begin\r\n el := CellElements[i,FixedRows];\r\n cr := el.getBoundingClientRect;\r\n if cr.Right > gr.Right then\r\n break;\r\n inc(i);\r\n end;\r\n\r\n Result := i - LeftCol;\r\nend;\r\n\r\nfunction TCustomStringGrid.GetVisibleRowCount: integer;\r\nvar\r\n i: integer;\r\n el: TJSHTMLElement;\r\n cr,gr: TJSDOMRect;\r\nbegin\r\n i := TopRow;\r\n\r\n gr := ElementHandle.getBoundingClientRect;\r\n\r\n while i < RowCount do\r\n begin\r\n el := CellElements[FixedCols,i];\r\n cr := el.getBoundingClientRect;\r\n if cr.Bottom > gr.Bottom then\r\n break;\r\n inc(i);\r\n end;\r\n\r\n Result := i - TopRow;\r\nend;\r\n\r\nprocedure TCustomStringGrid.GridChanged;\r\nbegin\r\n inherited;\r\n FSelectedCell := nil;\r\n UpdateGridSize;\r\nend;\r\n\r\n{$HINTS OFF}\r\nfunction TCustomStringGrid.HandleCheckBoxClick(Event: TJSEvent): Boolean;\r\nvar\r\n rindex, cindex: integer;\r\n chk: boolean;\r\nbegin\r\n rindex := -1;\r\n cindex := -1;\r\n\r\n asm\r\n var el = Event.target;\r\n chk = el.checked;\r\n var d = el.parentElement;\r\n if (d.tagName.toLowerCase() == 'td')\r\n {\r\n cindex = d.cellIndex;\r\n var tr = d.parentElement;\r\n rindex = tr.rowIndex;\r\n }\r\n end;\r\n\r\n if (rindex <> -1) and (cindex <> -1) then\r\n begin\r\n DoCheckClick(cindex + FixedCols, rindex + FixedRows, chk);\r\n end;\r\nend;\r\n\r\nfunction TCustomStringGrid.HandleFixedClick(Event: TJSEvent): Boolean;\r\nvar\r\n rindex,cindex: integer;\r\n rselect: boolean;\r\n tbl: TJSHTMLElement;\r\n ACol,ARow: integer;\r\n\r\nbegin\r\n Result := true;\r\n\r\n rselect := (goRowSelect in Options);\r\n rindex := -1;\r\n cindex := -1;\r\n\r\n asm\r\n if (Event.target.tagName.toLowerCase() == 'td')\r\n {\r\n cindex = Event.target.cellIndex;\r\n var tr = Event.target.parentElement;\r\n rindex = tr.rowIndex;\r\n tbl = tr.parentElement;\r\n tbl = tbl.parentElement;\r\n }\r\n end;\r\n\r\n if (cindex = -1) or (rindex = -1) then\r\n Exit;\r\n\r\n ACol := cindex;\r\n ARow := rindex;\r\n\r\n if tbl = FFixedCol then\r\n begin\r\n ARow := rindex + FixedRows;\r\n end;\r\n\r\n if tbl = FFixedRow then\r\n begin\r\n ACol := cindex + FixedCols;\r\n end;\r\n\r\n if Assigned(OnFixedCellClick) then\r\n OnFixedCellClick(Self, ACol, ARow);\r\nend;\r\n\r\nfunction TCustomStringGrid.HandleClick(Event: TJSEvent): Boolean;\r\nvar\r\n rindex,cindex: integer;\r\n rselect: boolean;\r\n tr: TJSElement;\r\n tgt: TJSHTMLElement;\r\n tag: string;\r\nbegin\r\n Result := true;\r\n\r\n if not Enabled then\r\n Exit;\r\n\r\n rselect := (goRowSelect in Options);\r\n rindex := -1;\r\n cindex := -1;\r\n\r\n asm\r\n tgt = Event.target;\r\n tag = Event.target.tagName.toLowerCase();\r\n end;\r\n\r\n asm\r\n if (tag == 'td')\r\n {\r\n cindex = Event.target.cellIndex;\r\n var tr = Event.target.parentElement;\r\n rindex = tr.rowIndex;\r\n }\r\n end;\r\n\r\n if (cindex = -1) or (rindex = -1) then\r\n Exit;\r\n\r\n// if not CanSelect(cindex + FixedCols, rindex + FixedRows) then\r\n// begin\r\n// Exit;\r\n// end;\r\n if Assigned(OnClickCell) then\r\n begin\r\n OnClickCell(Self, cindex + FixedCols, rindex + FixedRows);\r\n end;\r\n\r\n SelectCell(cindex + FixedCols, rindex + FixedRows);\r\n\r\n if Assigned(FSelectedCell) then\r\n begin\r\n if FSelMouseDown then\r\n begin\r\n if (goEditing in Options) and CanEditCell(Col,Row) then\r\n begin\r\n ShowEdit;\r\n Exit;\r\n end;\r\n end\r\n else\r\n begin\r\n if rselect then\r\n begin\r\n tr := FSelectedCell.parentElement;\r\n RemoveSelection(tr);\r\n end\r\n else\r\n RemoveSelection(FSelectedCell);\r\n end;\r\n end;\r\n\r\n\r\n if (tag = 'td') then\r\n begin\r\n tr := tgt.parentElement;\r\n FSelectedCell := tgt;\r\n\r\n if (rselect) then\r\n AddSelection(tr)\r\n else\r\n AddSelection(tgt);\r\n end;\r\nend;\r\n\r\nprocedure TCustomStringGrid.HandleComboExit(Sender: TObject);\r\nbegin\r\n if EditMode then\r\n HideEdit;\r\nend;\r\n\r\nprocedure TCustomStringGrid.HandleComboKeyPress(Sender: TObject; var Key: Char);\r\nbegin\r\n if Assigned(OnKeyPress) then\r\n OnKeyPress(Self, Key);\r\n\r\n if (Ord(Key) = 27) then\r\n CancelEdit;\r\n if (Ord(Key) = 13) then\r\n HideEdit;\r\nend;\r\n\r\nfunction TCustomStringGrid.HandleDoMouseMove(Event: TJSMouseEvent): Boolean;\r\nvar\r\n CtrlName: string;\r\n IsAutoWidth: Boolean;\r\nbegin\r\n inherited;\r\n\r\n CtrlName := GetID;\r\n IsAutoWidth := (WidthStyle in [ssAuto]);\r\n asm\r\n TMSStringGridID = CtrlName;\r\n TMSStringGridautoWidth = IsAutoWidth;\r\n GridNormalCells = this.FNormalCells;\r\n GridFixedCells = this.FFixedRow;\r\n GridFixedColCells = this.FFixedCol;\r\n GridFixedColRows = this.FFixedColRow;\r\n GridColWidths = this.FColWidths;\r\n GridFixedCols = this.FFixedCols;\r\n TMSStringGridresizeColumn(Event);\r\n end;\r\n\r\n Result := True;\r\nend;\r\n\r\nfunction TCustomStringGrid.HandleDoMouseUp(Event: TJSMouseEvent): Boolean;\r\nvar\r\n res: integer;\r\nbegin\r\n inherited;\r\n\r\n asm\r\n res = TMSStringGridisSizing();\r\n TMSStringGridresetResize();\r\n end;\r\n\r\n if res >= 0 then\r\n DoColumnSized(res);\r\n\r\n Result := True;\r\nend;\r\n\r\n{$HINTS ON}\r\n\r\nfunction TCustomStringGrid.HandleEditBlur(Event: TJSEvent): Boolean;\r\nbegin\r\n if FEditMode then\r\n begin\r\n HideEdit;\r\n end;\r\n Result := true;\r\nend;\r\n\r\nfunction TCustomStringGrid.HandleEditKeyPress(Event: TJSKeyboardEvent): boolean;\r\nvar\r\n c: char;\r\nbegin\r\n Event.cancelBubble := true;\r\n Event.stopPropagation;\r\n Result := true;\r\n\r\n if IsKeyCharacter(Event.Key) then\r\n begin\r\n c := Chr(GetKeyCode(Event.Key, false));\r\n if Assigned(OnKeyPress) then\r\n OnKeyPress(Self, c);\r\n end;\r\nend;\r\n\r\nfunction TCustomStringGrid.HandleKeyDown(Event: TJSKeyboardEvent): boolean;\r\nvar\r\n k: Word;\r\n newcol,newrow: integer;\r\n ss: TShiftState;\r\n undef: boolean;\r\nbegin\r\n Result := true;\r\n if not Enabled then\r\n Exit;\r\n\r\n Event.cancelBubble := true;\r\n\r\n Event.StopPropagation;\r\n\r\n k := 0;\r\n\r\n asm\r\n undef = (Event.key == undefined);\r\n end;\r\n\r\n if (Uppercase(Event.key) = 'UNIDENTIFIED') then\r\n Exit;\r\n\r\n if not undef then\r\n begin\r\n k := GetKeyCode(Event.Key);\r\n\r\n ss := GetKeyboardEventShiftState(Event);\r\n\r\n if Assigned(OnKeyDown) then\r\n OnKeyDown(Self, k, ss);\r\n end;\r\n\r\n newrow := Row;\r\n newcol := Col;\r\n\r\n if (newrow = -1) and (newcol = -1) and (ColCount > FixedCols) and (RowCount > FixedRows) then\r\n begin\r\n newcol := FixedCols;\r\n newrow := FixedRows;\r\n Col := FixedCols;\r\n Row := FixedRows;\r\n TJSHTMLElement(FNormalCells).focus;\r\n end;\r\n\r\n //ss := GetKeyboardEventShiftState(Event);\r\n\r\n // Up, Down, PageUp, PageDn\r\n if (k in [38, 40, 33, 34]) then\r\n begin\r\n Event.preventDefault;\r\n HideEdit;\r\n ChangeRow;\r\n end;\r\n\r\n // Home, End, Left, Right should only work when not in edit mode\r\n if not EditMode and (k in [35, 36, 37, 39]) then\r\n begin\r\n Event.preventDefault;\r\n HideEdit;\r\n end;\r\n\r\n // ESC\r\n if (k = 27) then\r\n begin\r\n CancelEdit;\r\n end;\r\n\r\n if not EditMode and Event.shiftKey and not ((k >= 48) and (k <= 122)) and (goRangeSelect in Options) then\r\n begin\r\n // End\r\n if (k = 35) then\r\n begin\r\n Row := RowCount - 1;\r\n Selection := GridRect(Col, newrow, Col, Row);\r\n\r\n if Row >= TopRow + VisibleRowCount then\r\n TopRow := Row - VisibleRowCount;\r\n end;\r\n\r\n // Home\r\n if (k = 36) then\r\n begin\r\n Row := FixedRows;\r\n Selection := GridRect(Col, newrow, Col, Row);\r\n\r\n if Row < TopRow then\r\n TopRow := FixedRows;\r\n end;\r\n\r\n // arrow Up\r\n if (k = 38) and (Row > FixedRows) then\r\n begin\r\n if Row = min(Selection.Top, Selection.Bottom) then\r\n newrow := max(Selection.Top, Selection.Bottom)\r\n else\r\n newrow := min(Selection.Top, Selection.Bottom);\r\n\r\n Row := Row - 1;\r\n Selection := GridRect(Selection.Left, newrow, Selection.Right, Row);\r\n\r\n if Row < TopRow then\r\n TopRow := TopRow - 1;\r\n end;\r\n\r\n // arrow Down\r\n if (k = 40) and (Row < RowCount - 1) then\r\n begin\r\n if Row = max(Selection.Top, Selection.Bottom) then\r\n newrow := min(Selection.Top, Selection.Bottom)\r\n else\r\n newrow := max(Selection.Top, Selection.Bottom);\r\n\r\n Row := Row + 1;\r\n Selection := GridRect(Selection.Left, newrow, Selection.Right, Row);\r\n\r\n if Row > TopRow + VisibleRowCount then\r\n TopRow := TopRow + 1;\r\n end;\r\n\r\n // arrow Left\r\n if (k = 37) and (Col > FixedCols) then\r\n begin\r\n if Col = min(Selection.Left, Selection.Right) then\r\n newcol := max(Selection.Left, Selection.Right)\r\n else\r\n newcol := min(Selection.Left, Selection.Right);\r\n\r\n Col := Col - 1;\r\n Selection := GridRect(newcol, Selection.Top, Col, Selection.Bottom);\r\n\r\n if Col < LeftCol then\r\n LeftCol := LeftCol - 1;\r\n end;\r\n\r\n // arrow Right\r\n if (k = 39) and (Col < ColCount - 1) then\r\n begin\r\n if Col = max(Selection.Left, Selection.Right) then\r\n newcol := min(Selection.Left, Selection.Right)\r\n else\r\n newcol := max(Selection.Left, Selection.Right);\r\n\r\n Col := Col + 1;\r\n\r\n Selection := GridRect(newcol, Selection.Top, Col, Selection.Bottom);\r\n\r\n if Col >= LeftCol + VisibleColCount then\r\n LeftCol := LeftCol + 1;\r\n end;\r\n end\r\n else\r\n begin\r\n // End\r\n if (k = 35) then\r\n begin\r\n newrow := RowCount - 1;\r\n end;\r\n\r\n // Home\r\n if (k = 36) then\r\n begin\r\n newrow := FixedRows;\r\n end;\r\n\r\n // PgUp\r\n if (k = 34) then\r\n begin\r\n if (Row + 4 <= RowCount - 1) then\r\n begin\r\n newrow := Row + 4;\r\n end\r\n else\r\n begin\r\n newrow := RowCount - 1;\r\n end;\r\n end;\r\n\r\n // PgDn\r\n if (k = 33) then\r\n begin\r\n if Row - 4 > FixedRows then\r\n begin\r\n newrow := Row - 4\r\n end\r\n else\r\n begin\r\n newrow := FixedRows;\r\n end;\r\n end;\r\n\r\n // arrow Up\r\n if not EditMode and (k = 38) and (Row > FixedRows) then\r\n begin\r\n newrow := Row - 1;\r\n end;\r\n\r\n // arrow Down\r\n if not EditMode and (k = 40) and (Row < RowCount - 1) then\r\n begin\r\n newrow := Row + 1;\r\n end;\r\n\r\n // arrow Left\r\n if not EditMode and (k = 37) and (Col > FixedCols) then\r\n begin\r\n newcol := Col - 1;\r\n end;\r\n\r\n // arrow Right\r\n if not EditMode and (k = 39) and (Col < ColCount - 1) then\r\n begin\r\n newcol := Col + 1;\r\n end;\r\n\r\n if not EditMode and CanSelect(newcol,newrow) then\r\n begin\r\n SelectCell(newcol,newrow);\r\n\r\n if (k = 38) and (Row < TopRow) then\r\n TopRow := TopRow - 1;\r\n\r\n if (k = 33) and (Row < TopRow) then\r\n TopRow := Row;\r\n\r\n if (k = 34) and (Row >= TopRow + VisibleRowCount) then\r\n TopRow := Row;\r\n\r\n if (k = 40) and (Row >= TopRow + VisibleRowCount) then\r\n TopRow := TopRow + 1;\r\n\r\n if (k = 37) and (Col < LeftCol) then\r\n LeftCol := LeftCol - 1;\r\n\r\n if (k = 39) and (Col >= LeftCol + VisibleColCount) then\r\n LeftCol := LeftCol + 1;\r\n\r\n if (k = 35) then\r\n TopRow := Row - VisibleRowCount;\r\n\r\n if (k = 36) then\r\n TopRow := FixedRows;\r\n end;\r\n\r\n // F2\r\n if (k = 113) and not EditMode and (goEditing in Options) and CanEditCell(Col,Row) then\r\n begin\r\n ShowEdit;\r\n end;\r\n\r\n if ((k >= 48) and (k <= 112)) and not EditMode and (goEditing in Options) and CanEditCell(Col,Row) then\r\n StartEdit(Event.Key);\r\n\r\n if (k = 13) and (goEditing in Options) and CanEditCell(Col,Row) then\r\n begin\r\n if EditMode then\r\n begin\r\n HideEdit;\r\n end\r\n else\r\n ShowEdit;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TCustomStringGrid.HandleMaskExit(Sender: TObject);\r\nbegin\r\n if EditMode then\r\n HideEdit;\r\nend;\r\n\r\nprocedure TCustomStringGrid.HandleMaskKeyPress(Sender: TObject; var Key: Char);\r\nbegin\r\n if Assigned(OnKeyPress) then\r\n OnKeyPress(Self, Key);\r\n\r\n if (Ord(Key) = 27) then\r\n CancelEdit;\r\n\r\n if (Ord(Key) = 13) then\r\n HideEdit;\r\nend;\r\n\r\nfunction TCustomStringGrid.HandleMouseDown(Event: TJSMouseEvent): Boolean;\r\nvar\r\n rindex, cindex: integer;\r\n l, t: Single;\r\n ss: TShiftState;\r\n mb: TMouseButton;\r\nbegin\r\n Result := true;\r\n\r\n if not Enabled then\r\n Exit;\r\n\r\n rindex := -1;\r\n cindex := -1;\r\n\r\n asm\r\n if (Event.target.tagName.toLowerCase() == 'td')\r\n {\r\n cindex = Event.target.cellIndex;\r\n var tr = Event.target.parentElement;\r\n rindex = tr.rowIndex;\r\n }\r\n end;\r\n\r\n FSelMouseDown := Event.target = FSelectedCell;\r\n\r\n if Assigned(FSelectedCell) and not FSelMouseDown and (cindex <> -1) and (rindex <> -1) then\r\n begin\r\n HideEdit;\r\n end;\r\n\r\n if not CanSelect(cindex + FixedCols, rindex + FixedRows) then\r\n Exit;\r\n\r\n if (cindex >= 0) and (rindex >= 0) then\r\n begin\r\n if (goRowSelect in Options) then\r\n Selection := GridRect(FixedCols, rindex + FixedRows, ColCount - 1, rindex + FixedRows)\r\n else\r\n Selection := GridRect(cindex + FixedCols, rindex + FixedRows, cindex + FixedCols, rindex + FixedRows);\r\n\r\n if (goRangeSelect in Options) then\r\n begin\r\n FStartCell.X := cindex + FixedCols;\r\n FStartCell.Y := rindex + FixedRows;\r\n end\r\n else\r\n begin\r\n FStartCell.X := -1;\r\n FStartCell.Y := -1;\r\n end;\r\n end;\r\n\r\n XYToClient(Event.clientX, Event.clientY, l, t);\r\n\r\n ss := GetMouseEventShiftState(Event);\r\n mb := GetMouseEventButton(Event);\r\n\r\n MouseDown(mb, ss, Trunc(l), Trunc(t));\r\n\r\nend;\r\n\r\nfunction TCustomStringGrid.HandleScroll(Event: TJSEvent): Boolean;\r\nbegin\r\n if FixedCols > 0 then\r\n FFixedCol.parentElement.scrollTop := FNormalCells.parentElement.parentElement.scrollTop;\r\n\r\n if FixedRows > 0 then\r\n FFixedRow.parentElement.parentElement.scrollLeft := FNormalCells.parentElement.parentElement.scrollLeft;\r\n\r\n TopLeftChanged;\r\n\r\n Result := true;\r\nend;\r\n\r\nfunction TCustomStringGrid.HandleTableFocus(Event: TJSEvent): Boolean;\r\nbegin\r\n Result := true;\r\n if not Enabled then\r\n Exit;\r\n\r\n if (Col = -1) and (Row = -1) and (FixedCols < ColCount) and (FixedRows < RowCount) and CanSelect(FixedCols, FixedRows) then\r\n begin\r\n SelectCell(FixedCols, FixedRows);\r\n end;\r\nend;\r\n\r\nfunction TCustomStringGrid.HasCheckBox(const ACol, ARow: integer): boolean;\r\nvar\r\n el: TJSElement;\r\nbegin\r\n Result := false;\r\n if (ACol < ColCount) and (ARow < RowCount) then\r\n begin\r\n el := GetCheckElement(ACol,ARow);\r\n Result := Assigned(el);\r\n end;\r\nend;\r\n\r\nfunction TCustomStringGrid.HasHorzScrollBar: boolean;\r\nbegin\r\n Result := false;\r\n if Assigned(FNormalCells.parentElement) then\r\n begin\r\n Result := FNormalCells.parentElement.parentElement.clientWidth < FNormalCells.parentElement.scrollWidth;\r\n end;\r\nend;\r\n\r\nfunction TCustomStringGrid.HasVertScrollBar: boolean;\r\nbegin\r\n Result := false;\r\n if Assigned(FNormalCells.parentElement) then\r\n begin\r\n Result := FNormalCells.parentElement.parentElement.clientHeight < FNormalCells.parentElement.scrollHeight;\r\n end;\r\nend;\r\n\r\nprocedure TCustomStringGrid.HideEdit;\r\nvar\r\n val: string;\r\n eh: TJSHTMLElement;\r\nbegin\r\n if EditMode then\r\n begin\r\n FEditMode := false;\r\n\r\n if FEditType = geCombo then\r\n begin\r\n val := FCombo.Text;\r\n eh := FCombo.ElementHandle;\r\n end\r\n else\r\n if FEditType = geMask then\r\n begin\r\n val := FMask.Text;\r\n eh := FMask.ElementHandle;\r\n end\r\n else\r\n begin\r\n val := (FEdit as TJSHTMLInputElement).value;\r\n eh := FEdit;\r\n end;\r\n\r\n ValidateCell(FEditCol, FEditRow, val);\r\n\r\n FSelectedCell.removeChild(eh);\r\n FSelectedCell.innerHTML := val;\r\n\r\n UpdateCell(FEditCol, FEditRow, val);\r\n\r\n AddSelection(FSelectedCell);\r\n\r\n SetEditText(FEditCol, FEditRow, val);\r\n\r\n TJSHTMLElement(FNormalCells).focus();\r\n end;\r\nend;\r\n\r\nprocedure TCustomStringGrid.InitSample(AInitMethod: TInitMethod);\r\nvar\r\n i,j: integer;\r\nbegin\r\n for i := 0 to RowCount - 1 do\r\n begin\r\n for j := 0 to ColCount - 1 do\r\n begin\r\n case AInitMethod of\r\n imRandom:\r\n Cells[j,i] := IntToStr(Random(100));\r\n imLinear:\r\n Cells[j,i] := IntToStr(j)+':'+IntToStr(i);\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\n{$HINTS OFF}\r\nprocedure TCustomStringGrid.InsertColumn(const Index: integer);\r\nvar\r\n tr,td: TJSHTMLElement;\r\n i,fc: integer;\r\n fixcol,fixtxtcol: string;\r\nbegin\r\n fixcol := ColorToHTML(FFixedColor);\r\n fixtxtcol := ColorToHTML(FFixedTextColor);\r\n fc := FixedCols;\r\n\r\n if Index < FixedCols then\r\n begin\r\n if FixedRows > 0 then\r\n begin\r\n for i := 0 to FixedRows - 1 do\r\n begin\r\n asm\r\n tr = this.FFixedColRow.rows[i];\r\n td = tr.insertCell(Index);\r\n td.style.setProperty('background-color',fixcol);\r\n td.style.setProperty('color',fixtxtcol);\r\n end;\r\n end;\r\n end;\r\n\r\n for i := 0 to RowCount - 1 - FixedRows do\r\n begin\r\n asm\r\n tr = this.FFixedCol.rows[i];\r\n td = tr.insertCell(Index);\r\n td.style.setProperty('background-color',fixcol);\r\n td.style.setProperty('color',fixtxtcol);\r\n end;\r\n end;\r\n\r\n FFixedCols := FixedCols + 1;\r\n end\r\n else\r\n begin\r\n if FixedRows > 0 then\r\n begin\r\n for i := 0 to FixedRows - 1 do\r\n begin\r\n asm\r\n tr = this.FFixedRow.rows[i];\r\n td = tr.insertCell(Index - fc);\r\n td.style.setProperty('background-color',fixcol);\r\n td.style.setProperty('color',fixtxtcol);\r\n end;\r\n end;\r\n end;\r\n\r\n for i := 0 to RowCount - 1 - FixedRows do\r\n begin\r\n asm\r\n tr = this.FNormalCells.rows[i];\r\n td = tr.insertCell(Index - fc);\r\n end;\r\n end;\r\n end;\r\n\r\n FColCount := FColCount + 1;\r\n\r\n for i := ColCount - 1 downto Index do\r\n begin\r\n if Index > 0 then\r\n ColWidths[i] := ColWidths[i - 1];\r\n end;\r\n\r\n ColWidths[Index] := DefaultColWidth;\r\nend;\r\n\r\nprocedure TCustomStringGrid.InsertRow(const Index: integer);\r\nvar\r\n tr,td: TJSHTMLElement;\r\n i,fr: integer;\r\n fixcol,fixtxtcol: string;\r\nbegin\r\n fr := FixedRows;\r\n\r\n fixcol := ColorToHTML(FFixedColor);\r\n fixtxtcol := ColorToHTML(FFixedTextColor);\r\n\r\n if Index < FixedRows then\r\n begin\r\n if FixedCols > 0 then\r\n begin\r\n asm\r\n tr = this.FFixedColRow.insertRow(Index-fr);\r\n td = tr.insertCell(i-1);\r\n td.style.setProperty('background-color',fixcol);\r\n td.style.setProperty('color',fixtxtcol);\r\n end;\r\n\r\n for i := 0 to FixedCols - 1 do\r\n begin\r\n asm\r\n td = tr.insertCell(i-1);\r\n td.style.setProperty('background-color',fixcol);\r\n td.style.setProperty('color',fixtxtcol);\r\n\r\n end;\r\n end;\r\n end;\r\n\r\n asm\r\n tr = this.FFixedRow.insertRow(Index);\r\n end;\r\n for i := FixedCols to ColCount - 1 do\r\n begin\r\n asm\r\n tr.insertCell(i-1);\r\n end;\r\n end;\r\n FFixedRows := FFixedRows + 1;\r\n end\r\n else\r\n if Index >= FixedRows then\r\n begin\r\n if FixedCols > 0 then\r\n begin\r\n asm\r\n tr = this.FFixedCol.insertRow(Index-fr);\r\n end;\r\n\r\n for i := 0 to FixedCols - 1 do\r\n begin\r\n asm\r\n td = tr.insertCell(i-1);\r\n td.style.setProperty('background-color',fixcol);\r\n td.style.setProperty('color',fixtxtcol);\r\n end;\r\n end;\r\n end;\r\n\r\n asm\r\n tr = this.FNormalCells.insertRow(Index-fr);\r\n end;\r\n\r\n for i := FixedCols to ColCount - 1 do\r\n begin\r\n asm\r\n tr.insertCell(i-1);\r\n end;\r\n end;\r\n end;\r\n\r\n FRowCount := FRowCount + 1;\r\n RowHeights[Index] := DefaultRowHeight;\r\n\r\n UpdateGridSize;\r\nend;\r\n\r\nfunction TCustomStringGrid.IsMergedCell(const ACol, ARow: integer; var NumCol,\r\n NumRow: integer): boolean;\r\nbegin\r\n NumCol := CellColSpan(ACol,ARow);\r\n NumRow := CellRowSpan(ACol,ARow);\r\n\r\n Result := (NumCol > 1) or (NumRow > 1);\r\nend;\r\n\r\n{$HINTS ON}\r\n\r\nprocedure TCustomStringGrid.MouseToCell(X,Y: integer; var C, R: integer);\r\nvar\r\n DocX,DocY: single;\r\n el: TJSHTMLElement;\r\n cindex,rindex: integer;\r\nbegin\r\n cindex := -1;\r\n rindex := -1;\r\n\r\n ClientToXY(X,Y,DocX,DocY);\r\n\r\n el := TJSHTMLElement(document.elementFromPoint(Round(DocX),Round(DocY)));\r\n\r\n if Assigned(el) then\r\n begin\r\n asm\r\n if (el.tagName.toLowerCase() == 'td')\r\n {\r\n cindex = el.cellIndex;\r\n var tr = el.parentElement;\r\n rindex = tr.rowIndex;\r\n\r\n if (tr.parentElement.parentElement == this.FNormalCells)\r\n {\r\n rindex = rindex + this.FFixedRows;\r\n cindex = cindex + this.FFixedCols;\r\n }\r\n if (tr.parentElement.parentElement == this.FFixedCol)\r\n {\r\n rindex = rindex + this.FFixedRows;\r\n }\r\n if (tr.parentElement.parentElement == this.FFixedRow)\r\n {\r\n cindex = cindex + this.FFixedCols;\r\n }\r\n }\r\n end;\r\n\r\n end;\r\n R := rindex;\r\n C := cindex;\r\nend;\r\n\r\nprocedure TCustomStringGrid.SaveToStrings(AStrings: TStrings; Delimiter: char = ';'; SaveFixed: boolean = false);\r\nvar\r\n r,c: integer;\r\n fr,fc: integer;\r\n s,rowstr: string;\r\nbegin\r\n fr := 0;\r\n fc := 0;\r\n if not SaveFixed then\r\n fc := FixedCols;\r\n\r\n if not SaveFixed then\r\n fr := FixedRows;\r\n\r\n for r := fr to RowCount - 1 do\r\n begin\r\n rowstr := '';\r\n for c := fc to ColCount - 1 do\r\n begin\r\n s := Cells[c,r];\r\n s := stringreplace(s,'\"','\"\"',[rfReplaceAll]);\r\n\r\n if (pos(Delimiter,s) > 0) or (pos(#13, s) > 0) then\r\n begin\r\n s := '\"' + s + '\"';\r\n end;\r\n\r\n if s = '' then\r\n s := '\"\"';\r\n\r\n if rowstr = '' then\r\n rowstr := s\r\n else\r\n rowstr := rowstr + Delimiter + s;\r\n end;\r\n AStrings.Add(rowstr);\r\n end;\r\nend;\r\n\r\nprocedure TCustomStringGrid.SaveToCSV(const AFileName: string; Delimiter: char = ';'; SaveFixed: boolean = false);\r\nvar\r\n sl: TStringList;\r\nbegin\r\n sl := TStringList.Create;\r\n try\r\n SaveToStrings(sl, Delimiter, SaveFixed);\r\n sl.SaveToFile(AFileName);\r\n finally\r\n sl.Free;\r\n end;\r\nend;\r\n\r\n\r\nprocedure TCustomStringGrid.LoadFromCSV(const AURL: string; Delimiter: char = ';'; LoadFixed: boolean = false);\r\nbegin\r\n FDelimiter := Delimiter;\r\n FLoadFixed := LoadFixed;\r\n\r\n FReq := TJSXMLHttpRequest.new;\r\n FReq.addEventListener('load',@DoHttpLoadCsv);\r\n FReq.addEventListener('abort',@DoHttpAbort);\r\n FReq.open('GET', AURL);\r\n DoHttpRequest(FReq);\r\n FReq.send;\r\nend;\r\n\r\nprocedure TCustomStringGrid.LoadFromJSON(const AURL: string; ADataNode: string = '');\r\nbegin\r\n FDataNode := ADataNode;\r\n FReq := TJSXMLHttpRequest.new;\r\n FReq.addEventListener('load',@DoHttpLoadJson);\r\n FReq.addEventListener('abort',@DoHttpAbort);\r\n FReq.open('GET', AURL);\r\n DoHttpRequest(FReq);\r\n FReq.send;\r\nend;\r\n\r\nprocedure TCustomStringGrid.MergeCells(const ACol, ARow, NumCol,\r\n NumRow: integer);\r\nvar\r\n i: integer;\r\n j: integer;\r\n el: TJSHTMLElement;\r\n cw: integer;\r\nbegin\r\n el := CellElements[ACol,ARow];\r\n\r\n if NumCol > 1 then\r\n el['colspan'] := NumCol.ToString;\r\n if NumRow > 1 then\r\n el['rowspan'] := NumRow.ToString;\r\n\r\n if ARow = 0 then\r\n begin\r\n cw := 0;\r\n for i := ACol to ACol + NumCol - 1 do\r\n cw := cw + ColWidths[i];\r\n\r\n el.style.setProperty('width', cw.ToString+'px');\r\n el.style.setProperty('max-width', cw.ToString+'px');\r\n end;\r\n\r\n for i := NumCol downto 1 do\r\n begin\r\n for j := NumRow downto 1 do\r\n begin\r\n if (i>1) or (j>1) then\r\n begin\r\n el := GetDirectCellElements(ACol + i -1,ARow + j - 1);\r\n asm\r\n el.remove();\r\n end;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TCustomStringGrid.SplitCells(const ACol, ARow: integer);\r\nvar\r\n el,td,split: TJSElement;\r\n i,j,NumRow,NumCol: integer;\r\nbegin\r\n if IsMergedCell(ACol,ARow, NumCol,NumRow) then\r\n begin\r\n split := CellRealElement(ACol,ARow);\r\n\r\n for i := 1 to Max(1,NumRow) do\r\n begin\r\n el := CellRealElement(ACol + NumCol,ARow + i - 1);\r\n\r\n for j := 1 to Max(1,NumCol) do\r\n begin\r\n if (j = 1) and (i = 1) then\r\n Continue;\r\n td := document.createElement('TD');\r\n el.parentNode.InsertBefore(td,el);\r\n end;\r\n end;\r\n\r\n split['colspan'] := '';\r\n split['rowspan'] := '';\r\n\r\n if ARow = 0 then\r\n begin\r\n for i := ACol to ACol + NumCol - 1 do\r\n ColWidths[i] := ColWidths[i];\r\n end;\r\n\r\n\r\n end;\r\nend;\r\n\r\n\r\nprocedure TCustomStringGrid.MouseMove(Shift: TShiftState; X, Y: Integer);\r\nbegin\r\n inherited;\r\n if (FStartCell.X <> -1) and (FStartCell.Y <> -1) then\r\n begin\r\n if (Y > Height - 10) then\r\n begin\r\n TopRow := TopRow + 1;\r\n Selection := GridRect(Selection.Left, min(Selection.Top, Selection.Bottom), Selection.Right, max(Selection.Top, Selection.Bottom) + 1);\r\n end;\r\n\r\n if (FixedRows > 0) and (Y < RowHeights[0]) and (TopRow > FixedRows) then\r\n begin\r\n TopRow := TopRow - 1;\r\n Selection := GridRect(Selection.Left, min(Selection.Top, Selection.Bottom) - 1, Selection.Right, max(Selection.Top, Selection.Bottom));\r\n end;\r\n\r\n if (X > Width - 10) then\r\n begin\r\n LeftCol := LeftCol + 1;\r\n Selection := GridRect(min(Selection.Left, Selection.Right), Selection.Top, max(Selection.Left, Selection.Right) + 1, Selection.Bottom);\r\n end;\r\n\r\n if (FixedCols > 0) and (X < ColWidths[0]) and (LeftCol > FixedCols) then\r\n begin\r\n LeftCol := LeftCol - 1;\r\n Selection := GridRect(min(Selection.Left, Selection.Right) - 1, Selection.Top, max(Selection.Left, Selection.Right), Selection.Bottom);\r\n end;\r\n\r\n end;\r\nend;\r\n\r\nfunction TCustomStringGrid.NormalColWidth: integer;\r\nvar\r\n i: integer;\r\nbegin\r\n Result := 1;\r\n\r\n for i := FixedCols to ColCount - 1 do\r\n Result := Result + ColWidths[i] + 1;\r\nend;\r\n\r\nfunction TCustomStringGrid.NormalRowHeight: integer;\r\nvar\r\n i: integer;\r\nbegin\r\n Result := 0;\r\n\r\n for i := FixedRows to RowCount - 1 do\r\n Result := Result + RowHeights[i];\r\nend;\r\n\r\n\r\n{$HINTS OFF}\r\nprocedure TCustomStringGrid.RemoveCheckBox(const ACol, ARow: integer);\r\nvar\r\n el: TJSElement;\r\nbegin\r\n if (ACol < ColCount) and (ARow < RowCount) then\r\n begin\r\n el := GetCheckElement(ACol,ARow);\r\n if Assigned(el) then\r\n begin\r\n el.removeEventListener('click',FHandleCheckClickPtr);\r\n asm\r\n el.remove();\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TCustomStringGrid.RemoveColumn(const Index: integer);\r\nvar\r\n tr,td: TJSHTMLElement;\r\n i,fc: integer;\r\nbegin\r\n fc := FixedCols;\r\n\r\n if Index < FixedCols then\r\n begin\r\n if FixedRows > 0 then\r\n begin\r\n for i := 0 to FixedRows - 1 do\r\n begin\r\n asm\r\n tr = this.FFixedColRow.rows[i];\r\n td = tr.deleteCell(Index);\r\n end;\r\n end;\r\n end;\r\n\r\n for i := 0 to RowCount - 1 - FixedRows do\r\n begin\r\n asm\r\n tr = this.FFixedCol.rows[i];\r\n td = tr.deleteCell(Index);\r\n end;\r\n end;\r\n\r\n FFixedCols := FixedCols - 1;\r\n end\r\n else\r\n begin\r\n if FixedRows > 0 then\r\n begin\r\n for i := 0 to FixedRows - 1 do\r\n begin\r\n asm\r\n tr = this.FFixedRow.rows[i];\r\n td = tr.deleteCell(Index - fc);\r\n end;\r\n end;\r\n end;\r\n\r\n for i := 0 to RowCount - 1 - FixedRows do\r\n begin\r\n asm\r\n tr = this.FNormalCells.rows[i];\r\n td = tr.deleteCell(Index - fc);\r\n end;\r\n end;\r\n end;\r\n\r\n FColCount := FColCount - 1;\r\n\r\n for i := Index to ColCount - 1 do\r\n begin\r\n ColWidths[i] := ColWidths[i + 1];\r\n end;\r\nend;\r\n\r\nprocedure TCustomStringGrid.RemoveRow(const Index: integer);\r\nvar\r\n td,tr: TJSHTMLElement;\r\n fr: integer;\r\n i: integer;\r\nbegin\r\n if Index >= RowCount then\r\n raise Exception.Create('Invalid row index');\r\n\r\n fr := FFixedRows;\r\n\r\n if Index < FixedRows then\r\n begin\r\n if FixedCols > 0 then\r\n begin\r\n asm\r\n this.FFixedColRow.deleteRow(Index);\r\n end;\r\n end;\r\n\r\n asm\r\n this.FFixedRow.deleteRow(Index);\r\n end;\r\n\r\n end\r\n else\r\n begin\r\n if FixedCols > 0 then\r\n begin\r\n asm\r\n this.FFixedCol.deleteRow(Index -fr);\r\n end;\r\n end;\r\n\r\n asm\r\n this.FNormalCells.deleteRow(Index - fr);\r\n end;\r\n end;\r\n\r\n if FRowHeights.Count = RowCount then\r\n FRowHeights.Delete(Index);\r\n\r\n FRowCount := FRowCount - 1;\r\n\r\n RowHeights[0] := RowHeights[0];\r\n\r\n UpdateGridSize;\r\nend;\r\n\r\nprocedure TCustomStringGrid.RemoveSelection(ACell: TJSElement);\r\nbegin\r\n if ShowSelection then\r\n ACell.classlist.remove('selected');\r\nend;\r\n\r\nprocedure TCustomStringGrid.RenderGrid;\r\nvar\r\n res: TJSHTMLElement;\r\n i,j,k,fw,fh,nw,nh,nwvis,nhvis,nwvisnoscroll,nhvisnoscroll: integer;\r\n tr, td, span, cellspan: TJSElement;\r\n fixcol,fixtxtcol: string;\r\n dynstyle: string;\r\n vscroll,hscroll: boolean;\r\n LAutoSizeW: boolean;\r\n ControlName,id: string;\r\nbegin\r\n while FColWidths.Count <= ColCount do\r\n FColWidths.Add(DefaultColWidth);\r\n\r\n if not Assigned(FGrid) then\r\n begin\r\n if IsLinked and Assigned(ElementHandle.firstChild) then\r\n res := TJSHTMLElement(ElementHandle.firstChild)\r\n else\r\n res := TJSHTMLElement(document.createElement('TABLE'));\r\n\r\n id := GetID;\r\n if id = '' then\r\n id := Name;\r\n\r\n res.setAttribute('id', id);\r\n\r\n if ElementTableClassName = '' then\r\n begin\r\n res.setAttribute('class','table.'+Name);\r\n res.style.setProperty('border-collapse','collapse');\r\n res.style.setProperty('border-spacing','0px');\r\n res.style.setProperty('border','0px');\r\n end\r\n else\r\n res.setAttribute('class',ElementTableClassName);\r\n\r\n FGrid := res;\r\n\r\n SetHTMLElementFont(res, Font, not ((ElementClassName = '') and (ElementFont = efProperty)) );\r\n\r\n AddInstanceStyle(GetGridCSS(id));\r\n end\r\n else\r\n Exit;\r\n\r\n LAutoSizeW := WidthStyle = ssAuto;\r\n ControlName := GetID;\r\n\r\n asm\r\n var td = undefined;\r\n var tr = undefined;\r\n var span = undefined;\r\n var cellspan = undefined;\r\n this.FFixedColRow = document.createElement('TABLE');\r\n this.FFixedColRow.setAttribute('id', ControlName + 'ResizeFixedRowTable');\r\n this.FFixedColRow.style.setProperty('border-collapse','collapse');\r\n this.FFixedColRow.style.setProperty('border-spacing','0px');\r\n\r\n this.FFixedCol = document.createElement('TABLE');\r\n this.FFixedCol.setAttribute('id', ControlName + 'ResizeFixedColTable');\r\n this.FFixedCol.style.setProperty('border-collapse','collapse');\r\n this.FFixedCol.style.setProperty('border-spacing','0px');\r\n\r\n this.FFixedRow = document.createElement('TABLE');\r\n this.FFixedRow.setAttribute('id', ControlName + 'ResizeRowTable');\r\n this.FFixedRow.style.setProperty('border-collapse','collapse');\r\n this.FFixedRow.style.setProperty('border-spacing','0px');\r\n this.FFixedRow.style.setProperty('border','0px');\r\n\r\n this.FNormalCells = document.createElement('TABLE');\r\n this.FNormalCells.setAttribute('id', ControlName + 'NormalCellTable');\r\n this.FNormalCells.style.setProperty('border-collapse','collapse');\r\n this.FNormalCells.style.setProperty('border-spacing','0px');\r\n end;\r\n\r\n // make normal grid cells focusable\r\n FNormalCells.setAttribute('tabindex',IntToStr(TabOrder));\r\n TJSHTMLElement(FNormalCells).style.setProperty('outline','none');\r\n FNormalCells.addEventListener('click',@HandleClick);\r\n FNormalCells.addEventListener('mousedown',@HandleMouseDown);\r\n FNormalCells.addEventListener('mousemove',@HandleMouseMove);\r\n FNormalCells.addEventListener('mouseup',@HandleMouseUp);\r\n\r\n FFixedCol.addEventListener('click',@HandleFixedClick);\r\n FFixedRow.addEventListener('click',@HandleFixedClick);\r\n FFixedColRow.addEventListener('click',@HandleFixedClick);\r\n\r\n ElementHandle.appendChild(res);\r\n\r\n fw := FixedColWidth;\r\n fh := FixedRowHeight;\r\n\r\n nw := NormalColWidth;\r\n nh := NormalRowHeight;\r\n\r\n nwvis := Width - FixedColWidth;\r\n nhvis := Height - FixedRowHeight;\r\n\r\n if BorderStyle = bsSingle then\r\n begin\r\n nwvis := nwvis - 2;\r\n nhvis := nhvis - 2;\r\n end;\r\n\r\n nwvisnoscroll := nwvis - GetScrollBarWidth;\r\n nhvisnoscroll := nhvis - GetScrollBarHeight;\r\n\r\n fixcol := ColorToHTML(FFixedColor);\r\n fixtxtcol := ColorToHTML(FFixedTextColor);\r\n\r\n // insert the main four grid cells\r\n asm\r\n tr = res.insertRow(0);\r\n td = tr.insertCell(0);\r\n td.style.border = \"0px\";\r\n td = tr.insertCell(1);\r\n td.style.border = \"0px\";\r\n tr = res.insertRow(1);\r\n td = tr.insertCell(0);\r\n td.style.border = \"0px\";\r\n td = tr.insertCell(1);\r\n td.style.border = \"0px\";\r\n end;\r\n\r\n // fill fixedrow cells\r\n if FixedRows > 0 then\r\n begin\r\n k := 0;\r\n\r\n // fixedcol/fixedrow\r\n if FixedCols > 0 then\r\n begin\r\n k := 1;\r\n asm\r\n td = res.rows[0].cells[0];\r\n span = document.createElement('DIV');\r\n// span.style.width = fw + \"px\";\r\n span.style.height = fh + \"px\";\r\n span.style.overflow = \"hidden\";\r\n span.style.backgroundColor = fixcol;\r\n span.style.color = fixtxtcol;\r\n td.appendChild(span);\r\n span.appendChild(this.FFixedColRow);\r\n end;\r\n end\r\n else\r\n begin\r\n asm\r\n td = res.rows[0].cells[0];\r\n td.style.border = \"0px\";\r\n td = res.rows[1].cells[0];\r\n td.style.border = \"0px\";\r\n end;\r\n\r\n end;\r\n\r\n //\r\n asm\r\n td = res.rows[0].cells[1];\r\n td.style.backgroundColor = fixcol;\r\n td.style.color = fixtxtcol;\r\n\r\n span = document.createElement('DIV');\r\n span.style.height = fh + \"px\";\r\n if (!LAutoSizeW) {\r\n span.style.width = nwvis + \"px\";\r\n }\r\n\r\n span.style.overflow = \"hidden\";\r\n span.style.backgroundColor = fixcol;\r\n span.style.color = fixtxtcol;\r\n\r\n td.appendChild(span);\r\n\r\n cellspan = document.createElement('DIV');\r\n cellspan.style.height = fh + \"px\";\r\n if (!LAutoSizeW) {\r\n cellspan.style.width = nw + \"px\";\r\n }\r\n\r\n span.appendChild(cellspan);\r\n cellspan.appendChild(this.FFixedRow);\r\n end;\r\n\r\n if (FixedCols > 0) then\r\n begin\r\n for i := 0 to FixedRows - 1 do\r\n begin\r\n asm\r\n tr = this.FFixedColRow.insertRow(i);\r\n end;\r\n\r\n for j := 0 to FixedCols - 1 do\r\n begin\r\n asm\r\n td = tr.insertCell(j);\r\n td.style.setProperty('background-color',fixcol);\r\n td.style.setProperty('color',fixtxtcol);\r\n end;\r\n //TJSHTMLElement(td).innerHTML := inttostr(j)+':'+inttostr(i);\r\n end;\r\n end;\r\n end;\r\n\r\n // fill top cell\r\n for i := 0 to FixedRows - 1 do\r\n begin\r\n asm\r\n tr = this.FFixedRow.insertRow(i);\r\n end;\r\n\r\n for j := FixedCols to ColCount - 1 do\r\n begin\r\n k := j - FixedCols;\r\n asm\r\n td = tr.insertCell(k);\r\n td.style.setProperty('background-color',fixcol);\r\n td.style.setProperty('color',fixtxtcol);\r\n end;\r\n\r\n //TJSHTMLElement(td).innerHTML := inttostr(j)+':'+inttostr(i);\r\n end;\r\n end;\r\n end;\r\n\r\n k := 0;\r\n\r\n // fill left cell\r\n if FixedCols > 0 then\r\n begin\r\n k := 1;\r\n asm\r\n //tr = res.insertRow(res.rows.length);\r\n //td = tr.insertCell(0);\r\n\r\n td = res.rows[1].cells[0];\r\n\r\n td.style.backgroundColor = fixcol;\r\n td.style.color = fixtxtcol;\r\n\r\n span = document.createElement('DIV');\r\n if (!LAutoSizeW) {\r\n //span.style.width = fw + \"px\";\r\n }\r\n span.style.height = nhvisnoscroll + \"px\";\r\n span.style.overflow = \"hidden\";\r\n span.style.backgroundColor = fixcol;\r\n span.style.color = fixtxtcol;\r\n\r\n td.setAttribute('valign','top');\r\n td.appendChild(span);\r\n span.appendChild(this.FFixedCol);\r\n end;\r\n\r\n for i := FixedRows to RowCount - 1 do\r\n begin\r\n j := i - FixedRows;\r\n asm\r\n tr = this.FFixedCol.insertRow(j);\r\n end;\r\n\r\n for j := 0 to FixedCols - 1 do\r\n begin\r\n asm\r\n td = tr.insertCell(j);\r\n td.style.setProperty('background-color',fixcol);\r\n td.style.setProperty('color',fixtxtcol);\r\n end;\r\n\r\n //TJSHTMLElement(td).innerHTML := inttostr(j)+':'+inttostr(i);\r\n end;\r\n end;\r\n end;\r\n\r\n if FixedCols = 0 then\r\n begin\r\n asm\r\n //tr = res.insertRow(res.rows.length);\r\n //td = tr.insertCell(0);\r\n td = res.rows[1].cells[1];\r\n end\r\n end\r\n else\r\n begin\r\n asm\r\n //tr = res.rows[1];\r\n //td = tr.insertCell(1);\r\n td = res.rows[1].cells[1];\r\n end;\r\n end;\r\n\r\n vscroll := (ssVertical = ScrollBars) or (ssBoth = ScrollBars);\r\n hscroll := (ssHorizontal = ScrollBars) or (ssBoth = ScrollBars);\r\n\r\n asm\r\n span = document.createElement('DIV');\r\n // span.style.backgroundColor = \"#FFFFFF\";\r\n if (vscroll) {\r\n span.style.overflowY = \"auto\";\r\n }\r\n else\r\n {\r\n span.style.overflowY = \"hidden\";\r\n }\r\n\r\n if (hscroll) {\r\n span.style.overflowX = \"auto\";\r\n }\r\n else {\r\n span.style.overflowX = \"hidden\";\r\n }\r\n if (!LAutoSizeW) {\r\n span.style.width = nwvis + \"px\";\r\n }\r\n span.style.height = nhvis + \"px\";\r\n td.appendChild(span);\r\n\r\n cellspan = document.createElement('DIV');\r\n if (!LAutoSizeW) {\r\n cellspan.style.width = nw + \"px\"; }\r\n cellspan.style.height = nh + \"px\";\r\n span.parentElement.style.verticalAlign = \"top\";\r\n span.appendChild(cellspan);\r\n cellspan.appendChild(this.FNormalCells);\r\n end;\r\n\r\n span.addEventListener('scroll',@HandleScroll);\r\n\r\n for i := FixedRows to RowCount - 1 do\r\n begin\r\n k := i - FixedRows;\r\n asm\r\n tr = this.FNormalCells.insertRow(k);\r\n end;\r\n\r\n for j := FixedCols to ColCount - 1 do\r\n begin\r\n k := j - FixedCols;\r\n\r\n asm\r\n td = tr.insertCell(k);\r\n end;\r\n end;\r\n end;\r\n\r\n FNormalCells.parentElement.parentElement.addEventListener('keydown',@HandleKeydown);\r\n FNormalCells.addEventListener('focus',@HandleTableFocus);\r\n\r\n EnableColResize;\r\n\r\n if DragMode = dmAutomatic then\r\n EnableDrag;\r\nend;\r\n\r\nprocedure TCustomStringGrid.RenderGridScript;\r\nbegin\r\n AddControlScriptSource(\r\n 'var TMSStringGridpageX,TMSStringGridcurCol,TMSStringGridnxtCol,TMSStringGridcurColWidth,TMSStringGridnxtColWidth,TMSStringGridautoWidth,GridNormalCells,GridFixedCells,GridFixedColCells,GridFixedColRows,GridColWidths,GridFixedCols,TMSStringGridCurID;'+\r\n 'var TMSStringGridTable,TMSStringGridcurTableWidth,TMSStringGridID,TMSStringGridFullWidth;'+\r\n 'TMSStringGridautoWidth = false;'+\r\n 'TMSStringGridCurID = \"\";'+\r\n 'ResizeMainGrid = true;'+\r\n\r\n 'function TMSStringGridupdateColSize(Cells, Col) {'+\r\n ' if (Cells){'+\r\n ' for (i = 0; i < Cells.rows.length; i++){'+\r\n ' td = Cells.rows[i].cells[Col.cellIndex];'+\r\n ' td.style.position = \"relative\";'+\r\n ' td.style.width = Col.style.width;'+\r\n ' td.style.maxWidth = Col.style.width;'+\r\n ' }'+\r\n ' }'+\r\n '}'+\r\n\r\n 'function TMSStringGridresizeColumn(e) {'+\r\n ' if ((TMSStringGridcurCol) && (TMSStringGridCurID.indexOf(TMSStringGridID) == 0)) {'+\r\n\r\n ' var diffX = e.pageX - TMSStringGridpageX;'+\r\n\r\n ' newColWidth = (TMSStringGridcurColWidth + diffX);'+\r\n ' if (newColWidth < 10)'+\r\n ' newColWidth = 10;'+\r\n\r\n ' if (TMSStringGridCurID.indexOf(\"ResizeRow\") > 0) {'+\r\n //resize normal columns\r\n '\t TMSStringGridcurCol.style.width = newColWidth + \"px\";'+\r\n '\t TMSStringGridcurCol.style.maxWidth = TMSStringGridcurCol.style.width;'+\r\n ' GridColWidths.Put(TMSStringGridcurCol.cellIndex + GridFixedCols, parseInt(TMSStringGridcurCol.style.width));'+\r\n ' TMSStringGridupdateColSize(GridFixedCells, TMSStringGridcurCol);'+\r\n ' TMSStringGridupdateColSize(GridNormalCells, TMSStringGridcurCol);'+\r\n\r\n ' TMSStringGridcurTable.style.width = (TMSStringGridcurTableWidth + diffX) + \"px\";'+\r\n ' GridNormalCells.style.width = (TMSStringGridcurTableWidth + diffX) + \"px\";'+\r\n ' } else {'+\r\n //resize fixed columns\r\n ' TMSStringGridfullWidth = document.getElementById(TMSStringGridID).offsetWidth;'+\r\n ' newCellsWidth = (TMSStringGridfullWidth - (TMSStringGridcurTableWidth + diffX));'+\r\n\r\n ' if ((newCellsWidth > 10) && (newColWidth > 10)) {'+\r\n '\t TMSStringGridcurCol.style.width = newColWidth + \"px\";'+\r\n '\t TMSStringGridcurCol.style.maxWidth = TMSStringGridcurCol.style.width;'+\r\n ' TMSStringGridupdateColSize(GridFixedColRows, TMSStringGridcurCol);'+\r\n ' TMSStringGridupdateColSize(GridFixedColCells, TMSStringGridcurCol);'+\r\n ' GridColWidths.Put(TMSStringGridcurCol.cellIndex, parseInt(TMSStringGridcurCol.style.width));'+\r\n ' TMSStringGridcurTable.style.width = (TMSStringGridcurTableWidth + diffX) + \"px\";'+\r\n ' GridFixedColCells.style.width = (TMSStringGridcurTableWidth + diffX) + \"px\";'+\r\n\r\n ' if ((!TMSStringGridautoWidth) && (newColWidth > 10)){' +\r\n ' GridFixedCells.parentElement.style.width = newCellsWidth + \"px\";'+\r\n ' GridFixedCells.parentElement.parentElement.style.width = newCellsWidth + \"px\";'+\r\n\r\n ' GridNormalCells.parentElement.style.width = newCellsWidth + \"px\";'+\r\n ' GridNormalCells.parentElement.parentElement.style.width = newCellsWidth + \"px\";'+\r\n ' }'+\r\n ' }'+\r\n ' }'+\r\n ' }'+\r\n ' }'+\r\n\r\n 'function TMSStringGridisSizing() {'+\r\n ' if ((TMSStringGridcurCol) && (TMSStringGridCurID.indexOf(TMSStringGridID) == 0))'+\r\n ' {' +\r\n ' if (TMSStringGridCurID.indexOf(\"ResizeRow\") > 0)'+\r\n ' {' +\r\n ' return(TMSStringGridcurCol.cellIndex + GridFixedCols)'+\r\n ' }' +\r\n ' else'+\r\n ' {' +\r\n ' return(TMSStringGridcurCol.cellIndex)'+\r\n ' }' +\r\n ' }'+\r\n ' else { return -1; }'+\r\n ' }' +\r\n\r\n 'function TMSStringGridresetResize() {'+\r\n ' TMSStringGridID = \"\";'+\r\n ' TMSStringGridFullWidth = undefined;'+\r\n ' TMSStringGridCurID = \"\";'+\r\n ' TMSStringGridcurCol = undefined;'+\r\n ' TMSStringGridnxtCol = undefined;'+\r\n ' TMSStringGridpageX = undefined;'+\r\n ' TMSStringGridnxtColWidth = undefined;'+\r\n ' TMSStringGridcurColWidth = undefined;'+\r\n ' TMSStringGridautoWidth = false;'+\r\n ' GridFixedCells = undefined;'+\r\n ' GridFixedColCells = undefined;'+\r\n ' GridFixedColRows = undefined;'+\r\n ' GridNormalCells = undefined;'+\r\n ' GridColWidths = undefined;'+\r\n ' GridFixedCols = undefined;'+\r\n ' }'+\r\n\r\n 'function TMSStringGridresizableGrid(tablename, enabled) {'+\r\n ' var table = document.getElementById(tablename + \"Table\");'+\r\n ' if (!table) return;' +\r\n ' var row = table.getElementsByTagName(\"tr\")[0],'+\r\n ' cols = row ? row.children : undefined;'+\r\n ' if (!cols) return;'+\r\n\r\n ' for (var i=0;i 0) and (WidthStyle = ssAbsolute) then\r\n begin\r\n asm\r\n var td = this.FGrid.rows[0].cells[1];\r\n if (td!=null) {\r\n var span = td.firstChild;\r\n span.style.width = nwvisnoscroll + \"px\";\r\n span.style.overflow = \"hidden\";\r\n }\r\n end;\r\n end;\r\n\r\n if (FixedCols > 0) and (HeightStyle = ssAbsolute) then\r\n begin\r\n asm\r\n var td = this.FGrid.rows[1].cells[0];\r\n if (td!=null) {\r\n var span = td.firstChild;\r\n span.style.height = nhvisnoscroll + \"px\";\r\n span.style.overflow = \"hidden\";\r\n }\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TCustomStringGrid.Resize;\r\nbegin\r\n inherited;\r\n RenderGridSize;\r\nend;\r\n\r\nprocedure TCustomStringGrid.RowCountChanged(delta: integer);\r\nvar\r\n r: integer;\r\n fr,fc: integer;\r\n fixcol,fixtxtcol: string;\r\nbegin\r\n if IsUpdating then\r\n Exit;\r\n\r\n fr := FixedRows;\r\n fc := FixedCols;\r\n\r\n if delta > 0 then\r\n begin\r\n fixcol := ColorToHTML(FFixedColor);\r\n fixtxtcol := ColorToHTML(FFixedTextColor);\r\n\r\n asm\r\n var i = 0;\r\n var j = 0;\r\n var tr = undefined;\r\n var td = undefined;\r\n var l = this.FNormalCells.rows.length;\r\n\r\n for(i = 0;i < delta; i++)\r\n {\r\n tr = this.FNormalCells.insertRow(l);\r\n for(j = this.FFixedCols; j < this.FColCount; j++)\r\n {\r\n td = tr.insertCell(0);\r\n }\r\n\r\n if (fc > 0) {\r\n tr = this.FFixedCol.insertRow(l);\r\n for(j = 0; j < this.FFixedCols; j++)\r\n {\r\n td = tr.insertCell(0);\r\n td.style.setProperty('background-color',fixcol);\r\n td.style.setProperty('color',fixtxtcol);\r\n }\r\n }\r\n }\r\n end;\r\n\r\n BeginUpdate;\r\n\r\n for r := 1 to delta do\r\n begin\r\n RowHeights[RowCount - r] := DefaultRowHeight;\r\n end;\r\n\r\n if DragMode = dmAutomatic then\r\n EnableDrag;\r\n\r\n EndUpdate;\r\n end;\r\n\r\n if delta < 0 then\r\n begin\r\n asm\r\n var i = 0;\r\n var l = this.FNormalCells.rows.length;\r\n\r\n for(i = 0;i < -delta; i++)\r\n {\r\n this.FNormalCells.deleteRow(l - i - 1);\r\n\r\n if (fc > 0) {\r\n this.FFixedCol.deleteRow(l - i - 1);\r\n }\r\n }\r\n end;\r\n\r\n if RowCount > 0 then\r\n RowHeights[RowCount - 1] := RowHeights[RowCount - 1];\r\n end;\r\nend;\r\n\r\nfunction TCustomStringGrid.RowOffset: integer;\r\nbegin\r\n Result := FixedRows;\r\nend;\r\n\r\nprocedure TCustomStringGrid.RowsChanged(Sender: TObject);\r\nbegin\r\n SetRows(FRowsIndex, FRows);\r\nend;\r\n\r\nprocedure TCustomStringGrid.SelectCell(ACol, ARow: integer);\r\nvar\r\n rc,rr: integer;\r\nbegin\r\n Selection := GridRect(ACol, ARow, ACol, ARow);\r\n\r\n rc := ACol - FixedCols;\r\n rr := ARow - FixedRows;\r\n\r\n asm\r\n this.FSelectedCell = this.FNormalCells.rows[rr].cells[rc];\r\n end;\r\n\r\nend;\r\n\r\nprocedure TCustomStringGrid.SetCells(ACol, ARow: integer; const Value: string);\r\nvar\r\n rc,rr: integer;\r\n StrVal: string;\r\nbegin\r\n StrVal := Value;\r\n if pos(#13, Value) > 0 then\r\n begin\r\n StrVal := StringReplace(StrVal, #13, '
', [rfReplaceAll]);\r\n StrVal := StringReplace(StrVal, #10, '
', [rfReplaceAll]);\r\n end\r\n else\r\n if pos(#10, Value) > 0 then\r\n begin\r\n StrVal := StringReplace(StrVal, #10, '
', [rfReplaceAll]);\r\n end;\r\n\r\n if (ACol < FixedCols) and (ARow >= FixedRows) then\r\n begin\r\n rr := ARow - FixedRows;\r\n rc := ACol;\r\n\r\n asm\r\n var td = this.FFixedCol.rows[rr].cells[rc];\r\n td.innerHTML = StrVal;\r\n end;\r\n end;\r\n\r\n if (ARow < FixedRows) and (ACol >= FixedCols) then\r\n begin\r\n rc := ACol - FixedCols;\r\n rr := ARow;\r\n\r\n if Assigned(FFixedRow) then\r\n begin\r\n asm\r\n var tr = this.FFixedRow.rows[rr];\r\n if (tr != undefined) {\r\n var td = tr.cells[rc];\r\n td.innerHTML = StrVal;\r\n }\r\n end;\r\n end;\r\n end;\r\n\r\n if (ACol < FixedCols) and (ARow < FixedRows) then\r\n begin\r\n rc := ACol;\r\n rr := ARow;\r\n\r\n asm\r\n var td = this.FFixedColRow.rows[rr].cells[rc];\r\n td.innerHTML = StrVal;\r\n end;\r\n end;\r\n\r\n if (ACol >= FixedCols) and (ARow >= FixedRows) then\r\n begin\r\n rc := ACol - FixedCols;\r\n rr := ARow - FixedRows;\r\n asm\r\n var td = this.FNormalCells.rows[rr].cells[rc];\r\n td.innerHTML = StrVal;\r\n end;\r\n end;\r\n\r\n if ARow = 0 then\r\n EnableColResize;\r\nend;\r\n\r\nprocedure TCustomStringGrid.SetCheckState(ACol, ARow: integer;\r\n const Value: boolean);\r\nvar\r\n el: TJSHTMLElement;\r\nbegin\r\n if (ACol < ColCount) and (ARow < RowCount) then\r\n begin\r\n el := GetCheckElement(ACol,ARow);\r\n asm\r\n el.checked = Value;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TCustomStringGrid.SetCol(const Value: integer);\r\nvar\r\n r,c: integer;\r\n td: TJSElement;\r\nbegin\r\n if (Value < ColCount) and (Value >= FixedCols) then\r\n begin\r\n if Assigned(FSelectedCell) then\r\n begin\r\n RemoveSelection(FSelectedCell);\r\n end;\r\n\r\n c := Value - FixedCols;\r\n r := Row - FixedRows;\r\n if r < 0 then\r\n r := 0;\r\n\r\n asm\r\n var tr = this.FNormalCells.rows[r];\r\n td = tr.cells[c];\r\n end;\r\n\r\n AddSelection(td);\r\n FSelectedCell := td;\r\n\r\n asm\r\n var pardiv = this.FNormalCells.parentElement.parentElement;\r\n\r\n if (td.offsetLeft < pardiv.scrollLeft) {\r\n pardiv.scrollLeft = td.offsetLeft;\r\n }\r\n\r\n if (td.offsetLeft + td.offsetWidth - pardiv.scrollLeft > pardiv.offsetWidth) {\r\n pardiv.scrollLeft = pardiv.scrollLeft + td.offsetWidth;\r\n }\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TCustomStringGrid.SetColWidths(ACol: integer; const Value: integer);\r\nvar\r\n fcw: integer;\r\n nw, nwvis, nwvisnoscroll: integer;\r\n LAutoSizeW: boolean;\r\nbegin\r\n while FColWidths.Count <= ACol do\r\n FColWidths.Add(DefaultColWidth);\r\n\r\n FColWidths[ACol] := Value;\r\n\r\n if IsUpdating then\r\n Exit;\r\n\r\n if not Assigned(FGrid) then\r\n Exit;\r\n\r\n LAutoSizeW := WidthStyle = ssAuto;\r\n nw := NormalColWidth;\r\n nwvis := Width - FixedColWidth;\r\n nwvisnoscroll := nwvis - GetScrollBarWidth;\r\n\r\n if ACol < FixedCols then\r\n begin\r\n fcw := FixedColWidth;\r\n asm\r\n var tr = this.FGrid.rows[0];\r\n if (tr != undefined) {\r\n var td = tr.cells[0];\r\n if (td != undefined) {\r\n td.style.width = fcw + \"px\";\r\n if (td.firstChild != undefined) {\r\n td.firstChild.style.width = fcw + \"px\"; }\r\n }\r\n }\r\n\r\n tr = this.FGrid.rows[1];\r\n if (tr != undefined) {\r\n td = tr.cells[0];\r\n if (td != undefined) {\r\n td.style.width = fcw + \"px\";\r\n if (td.firstChild != undefined) {\r\n td.firstChild.style.width = fcw + \"px\"; }\r\n }\r\n\r\n tr = this.FFixedColRow.rows[0];\r\n if (tr != undefined) {\r\n\r\n td = tr.cells[0];\r\n if (td != undefined) {\r\n td.style.width = fcw + \"px\";\r\n }\r\n }\r\n }\r\n tr = this.FFixedCol.rows[0];\r\n if (tr != undefined) {\r\n\r\n td = tr.cells[0];\r\n if (td != undefined) {\r\n td.style.width = fcw + \"px\";\r\n }\r\n }\r\n end;\r\n end;\r\n\r\n if ACol >= FixedCols then\r\n begin\r\n ACol := ACol - FixedCols;\r\n\r\n asm\r\n var tr = this.FFixedRow.rows[0];\r\n if (tr != undefined) {\r\n var td = tr.cells[ACol];\r\n td.style.width = Value + \"px\";\r\n td.style.maxwidth = Value + \"px\";\r\n\r\n if (this.FNormalCells.rows.length > 0)\r\n {\r\n var td = this.FNormalCells.rows[0].cells[ACol];\r\n td.style.width = Value + \"px\";\r\n td.style.maxwidth = Value + \"px\";\r\n }\r\n }\r\n end;\r\n end;\r\n\r\n asm\r\n var tr = this.FGrid.rows[0];\r\n if (tr != undefined) {\r\n var td = tr.cells[1];\r\n if ((td.firstChild != undefined) && (!LAutoSizeW)) {\r\n td.firstChild.style.width = nwvisnoscroll + \"px\";\r\n td.firstChild.firstChild.style.width = nw + \"px\";\r\n }\r\n }\r\n tr = this.FGrid.rows[1];\r\n if (tr != undefined) {\r\n td = tr.cells[1];\r\n if ((td.firstChild != undefined) && (!LAutoSizeW)) {\r\n td.firstChild.style.width = nwvis + \"px\";\r\n td.firstChild.firstChild.style.width = nw + \"px\";\r\n }\r\n }\r\n end;\r\n\r\n UpdateGridSize;\r\nend;\r\n{$HINTS ON}\r\n\r\n\r\nprocedure TCustomStringGrid.SetDataColumnCount(AValue: Integer);\r\nbegin\r\n ColCount := FixedCols + AValue;\r\nend;\r\n\r\nprocedure TCustomStringGrid.SetDataHeader(AColumn: Integer; AValue: string);\r\nbegin\r\n if FixedRows > 0 then\r\n Cells[AColumn + FixedCols, FixedRows - 1] := AValue;\r\nend;\r\n\r\nprocedure TCustomStringGrid.SetDataRowCount(AValue: Integer);\r\nbegin\r\n RowCount := FixedRows + AValue;\r\nend;\r\n\r\nprocedure TCustomStringGrid.SetDataValue(AColumn, ARow: Integer;\r\n AValue: string);\r\nbegin\r\n Cells[AColumn + FixedCols, ARow + FixedRows] := AValue;\r\nend;\r\n\r\nprocedure TCustomStringGrid.SetDefaultColWidth(const Value: integer);\r\nvar\r\n i: integer;\r\nbegin\r\n FDefaultColWidth := Value;\r\n\r\n for i := 0 to ColCount - 1 do\r\n ColWidths[i] := Value;\r\nend;\r\n\r\nprocedure TCustomStringGrid.SetDefaultRowHeight(const Value: integer);\r\nvar\r\n i: integer;\r\nbegin\r\n FDefaultRowHeight := Value;\r\n for i := 0 to RowCount - 1 do\r\n RowHeights[i] := Value;\r\nend;\r\n\r\nprocedure TCustomStringGrid.SetEditText(ACol, ARow: Longint;\r\n const AValue: string);\r\nbegin\r\n if Assigned(OnSetEditText) then\r\n OnSetEditText(Self, ACol, ARow, AValue);\r\nend;\r\n\r\nprocedure TCustomStringGrid.SetElementTableClassName(const Value: string);\r\nbegin\r\n if (FElementTableClassName <> Value) then\r\n begin\r\n FElementTableClassName := Value;\r\n\r\n if not IsUpdating then\r\n ReRenderGrid;\r\n end;\r\nend;\r\n\r\nprocedure TCustomStringGrid.SetFixedColor(const Value: TColor);\r\nbegin\r\n if (FFixedColor <> Value) then\r\n begin\r\n FFixedColor := Value;\r\n UpdateElementVisual;\r\n end;\r\nend;\r\n\r\nprocedure TCustomStringGrid.ReRenderGrid;\r\nbegin\r\n FGrid.removeChild(FGrid.firstChild);\r\n FGrid := nil;\r\n RenderGrid;\r\n UpdateGridSize;\r\nend;\r\n\r\nprocedure TCustomStringGrid.SetFixedCols(const Value: integer);\r\nbegin\r\n if (FFixedCols <> Value) then\r\n begin\r\n FFixedCols := Value;\r\n\r\n if not IsUpdating then\r\n ReRenderGrid;\r\n end;\r\nend;\r\n\r\nprocedure TCustomStringGrid.SetFixedRows(const Value: integer);\r\nbegin\r\n if (FFixedRows <> Value) then\r\n begin\r\n FFixedRows := Value;\r\n\r\n if not IsUpdating then\r\n ReRenderGrid;\r\n end;\r\nend;\r\n\r\nprocedure TCustomStringGrid.SetFixedTextColor(const Value: TColor);\r\nbegin\r\n if (FFixedTextColor <> Value) then\r\n begin\r\n FFixedTextColor := Value;\r\n UpdateElementVisual;\r\n end;\r\n\r\nend;\r\n\r\nprocedure TCustomStringGrid.SetFocus;\r\nbegin\r\n if Assigned(FNormalCells) then\r\n TJSHTMLElement(FNormalCells).focus();\r\nend;\r\n\r\nprocedure TCustomStringGrid.SetGridLineColor(const Value: TColor);\r\nbegin\r\n if (FGridLineColor <> Value) then\r\n begin\r\n FGridLineColor := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomStringGrid.SetLeftCol(const Value: integer);\r\nvar\r\n i,w: integer;\r\nbegin\r\n w := 0;\r\n for i := FixedCols to Value - 1 do\r\n w := w + ColWidths[i]+1;\r\n\r\n if Assigned(FNormalCells) then\r\n begin\r\n FNormalCells.parentElement.parentElement.scrollLeft := w;\r\n if FixedCols > 0 then\r\n FFixedCol.parentElement.parentElement.scrollLeft := w;\r\n end;\r\nend;\r\n\r\n{$HINTS OFF}\r\n\r\nprocedure TCustomStringGrid.SetRange(const Value: TGridRange);\r\nbegin\r\n FRange.Assign(Value);\r\nend;\r\n\r\nprocedure TCustomStringGrid.SetRow(const Value: integer);\r\nvar\r\n r,c,sh: integer;\r\n rselect: boolean;\r\n tr,td: TJSElement;\r\nbegin\r\n if (Value < RowCount) and (Value >= FixedRows) then\r\n begin\r\n rselect := (goRowSelect in Options);\r\n\r\n if Assigned(FSelectedCell) and rselect then\r\n begin\r\n tr := FSelectedCell.parentElement;\r\n RemoveSelection(tr);\r\n end;\r\n\r\n if Assigned(FSelectedCell) then\r\n begin\r\n RemoveSelection(FSelectedCell);\r\n end;\r\n\r\n c := Col - FixedCols;\r\n if c < 0 then\r\n c := 0;\r\n\r\n r := Value - FixedRows;\r\n\r\n sh := GetScrollBarHeight;\r\n\r\n asm\r\n tr = this.FNormalCells.rows[r];\r\n td = tr.cells[c];\r\n end;\r\n\r\n if (rselect) then\r\n begin\r\n if not isUndefined(FSelectedCell) then\r\n RemoveSelection(FSelectedCell);\r\n\r\n AddSelection(tr);\r\n FSelectedCell := td;\r\n end\r\n else\r\n begin\r\n FSelectedCell := td;\r\n AddSelection(FSelectedCell);\r\n end;\r\n\r\n asm\r\n var pardiv = this.FNormalCells.parentElement.parentElement;\r\n\r\n if (td.offsetTop < pardiv.scrollTop) {\r\n pardiv.scrollTop = td.offsetTop;\r\n }\r\n\r\n while (td.offsetTop + td.offsetHeight - pardiv.scrollTop > pardiv.offsetHeight - sh) {\r\n pardiv.scrollTop = pardiv.scrollTop + td.offsetHeight;\r\n }\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TCustomStringGrid.SetRowHeights(ARow: integer; const Value: integer);\r\nvar\r\n frh: integer;\r\n fh, nh, nhvis, nhvisnoscroll: integer;\r\nbegin\r\n while FRowHeights.Count <= ARow do\r\n FRowHeights.Add(DefaultRowHeight);\r\n\r\n FRowHeights[ARow] := Value;\r\n\r\n if IsUpdating then\r\n Exit;\r\n\r\n if not Assigned(FGrid) then\r\n Exit;\r\n\r\n fh := FixedRowHeight;\r\n\r\n nh := NormalRowHeight;\r\n\r\n nhvis := Height - FixedRowHeight;\r\n\r\n nhvisnoscroll := nhvis - GetScrollBarHeight;\r\n\r\n if ARow < FixedRows then\r\n begin\r\n frh := FixedRowHeight;\r\n asm\r\n var tr = this.FGrid.rows[0];\r\n if (tr != undefined) {\r\n tr.style.height = frh + \"px\";\r\n var td = tr.cells[0];\r\n if (td != undefined) {\r\n var fc = td.firstChild;\r\n if (fc != undefined) {\r\n fc.style.height = frh + \"px\";\r\n }\r\n td = tr.cells[1];\r\n fc = td.firstChild;\r\n if (fc != undefined) {\r\n fc.style.height = frh + \"px\";\r\n }\r\n }\r\n }\r\n\r\n tr = this.FFixedColRow.rows[0];\r\n if (tr != undefined) {\r\n tr = tr.cells[0];\r\n if (tr != undefined) {\r\n tr.style.height = Value + \"px\";\r\n tr = this.FFixedRow.rows[ARow].cells[0];\r\n if (tr != undefined) {\r\n tr.style.height = Value + \"px\"; }\r\n }\r\n }\r\n end;\r\n end;\r\n\r\n\r\n if ARow >= FixedRows then\r\n begin\r\n ARow := ARow - FixedRows;\r\n\r\n asm\r\n var tr = this.FFixedCol.rows[ARow];\r\n if (tr != undefined) {\r\n tr.style.height = Value + \"px\";\r\n var tr = this.FNormalCells.rows[ARow];\r\n\r\n if (tr != undefined) {\r\n tr.style.height = Value + \"px\"; }\r\n }\r\n end;\r\n end;\r\n\r\n asm\r\n var td = this.FGrid.rows[1].cells[0];\r\n if (td.firstChild) {\r\n td.firstChild.style.height = nhvisnoscroll + \"px\";\r\n td.firstChild.firstChild.style.height = nh + \"px\";\r\n }\r\n\r\n td = this.FGrid.rows[1].cells[1];\r\n if (td.firstChild) {\r\n td.firstChild.style.height = nhvis + \"px\";\r\n td.firstChild.firstChild.style.height = nh + \"px\";\r\n }\r\n end;\r\nend;\r\n\r\nprocedure TCustomStringGrid.SetRows(Index: integer; const Value: TStrings);\r\nvar\r\n i: integer;\r\nbegin\r\n if (Index >= 0) and (Index < RowCount) then\r\n begin\r\n for i := 0 to ColCount - 1 do\r\n begin\r\n if i < Value.Count then\r\n Cells[i,Index] := Value[i];\r\n end;\r\n end\r\n else\r\n raise Exception.Create('Invalid row index');\r\nend;\r\n\r\nprocedure TCustomStringGrid.SetSelection(const Value: TGridRect);\r\nvar\r\n c,r,rc,rr: integer;\r\n sel: boolean;\r\n left,right,top,bottom: integer;\r\n tr,td: TJSElement;\r\n\r\nbegin\r\n FSelection := Value;\r\n\r\n left := Value.Left;\r\n right := Value.Right;\r\n\r\n if Value.Left > Value.Right then\r\n begin\r\n left := Value.Right;\r\n right := Value.Left;\r\n end;\r\n\r\n top := Value.Top;\r\n bottom := Value.Bottom;\r\n\r\n if Value.Top > Value.Bottom then\r\n begin\r\n top := Value.Bottom;\r\n bottom := Value.Top;\r\n end;\r\n\r\n for r := FixedRows to RowCount - 1 do\r\n begin\r\n if goRowSelect in Options then\r\n begin\r\n rr := r - FixedRows;\r\n sel := (r >= top) and (r <= bottom);\r\n\r\n if sel then\r\n begin\r\n asm\r\n tr = this.FNormalCells.rows[rr];\r\n end;\r\n AddSelection(tr);\r\n end\r\n else\r\n begin\r\n asm\r\n tr = this.FNormalCells.rows[rr];\r\n end;\r\n RemoveSelection(tr);\r\n end;\r\n end\r\n else\r\n for c := FixedCols to ColCount - 1 do\r\n begin\r\n rc := c - FixedCols;\r\n rr := r - FixedRows;\r\n\r\n sel := (c >= left) and (c <= right) and (r >= top) and (r <= bottom);\r\n\r\n if sel then\r\n begin\r\n asm\r\n td = this.FNormalCells.rows[rr].cells[rc];\r\n end;\r\n if Assigned(td) then\r\n AddSelection(td);\r\n end\r\n else\r\n begin\r\n asm\r\n td = this.FNormalCells.rows[rr].cells[rc];\r\n end;\r\n if Assigned(td) then\r\n RemoveSelection(td);\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TCustomStringGrid.SetSelectionColor(const Value: TColor);\r\nbegin\r\n if (FSelectionColor <> Value) then\r\n begin\r\n FSelectionColor := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomStringGrid.SetSelectionTextColor(const Value: TColor);\r\nbegin\r\n if (FSelectionTextColor <> Value) then\r\n begin\r\n FSelectionTextColor := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomStringGrid.SetTopRow(const Value: integer);\r\nvar\r\n pixVal: integer;\r\nbegin\r\n pixVal := (Value - FixedRows) * DefaultRowHeight;\r\n if Assigned(FNormalCells) and (pixVal >= 0) then\r\n begin\r\n FNormalCells.parentElement.parentElement.scrollTop := pixVal;\r\n if FixedCols > 0 then\r\n FFixedCol.parentElement.parentElement.scrollTop := pixVal;\r\n end;\r\nend;\r\n\r\nprocedure TCustomStringGrid.ShowEdit;\r\nbegin\r\n StartEdit('');\r\nend;\r\n\r\n\r\nprocedure TCustomStringGrid.StartEdit(ch: string);\r\nvar\r\n created: boolean;\r\n eh: TJSHTMLElement;\r\n s: string;\r\nbegin\r\n // https://developer.mozilla.org/en-US/docs/Learn/Forms/HTML5_input_types\r\n eh := ElementHandle;\r\n\r\n FEditRow := Row;\r\n FEditCol := Col;\r\n\r\n\r\n FEditMode := true;\r\n FEditType := geText;\r\n\r\n s := GetEditText(Col,Row);\r\n GetCellEditor(Col,Row, FEditType);\r\n\r\n FOrigVal := s;\r\n\r\n if FEditType = geCombo then\r\n begin\r\n if not Assigned(FCombo) then\r\n begin\r\n FCombo := TWebComboBox.Create(Self);\r\n FCombo.ElementPosition := epRelative;\r\n FCombo.WidthStyle := ssPercent;\r\n FCombo.WidthPercent := 100;\r\n FCombo.HeightStyle := ssPercent;\r\n FCombo.HeightPercent := 100;\r\n FCombo.Parent := Self;\r\n FCombo.OnExit := HandleComboExit;\r\n FCombo.OnKeyPress := HandleComboKeyPress;\r\n end;\r\n\r\n FCombo.Items.Assign(FComboBoxItems);\r\n FCombo.Text := s;\r\n FSelectedCell.innerHTML := '';\r\n FSelectedCell.appendChild(FCombo.ElementHandle);\r\n FCombo.SetFocus;\r\n RemoveSelection(FSelectedCell);\r\n Exit;\r\n end;\r\n\r\n if FEditType = geMask then\r\n begin\r\n if not Assigned(FMask) then\r\n begin\r\n FMask := TWebMaskEdit.Create(Self);\r\n FMask.ElementPosition := epRelative;\r\n FMask.WidthStyle := ssPercent;\r\n FMask.WidthPercent := 100;\r\n FMask.HeightStyle := ssPercent;\r\n FMask.HeightPercent := 100;\r\n FMask.Parent := Self;\r\n FMask.OnExit := HandleMaskExit;\r\n FMask.OnKeyPress := HandleMaskKeyPress;\r\n end;\r\n\r\n FMask.EditMask := EditMask;\r\n FMask.Text := s;\r\n FSelectedCell.innerHTML := '';\r\n FSelectedCell.appendChild(FMask.ElementHandle);\r\n FMask.SetFocus;\r\n FMask.SetSelection(0,Length(s));\r\n RemoveSelection(FSelectedCell);\r\n Exit;\r\n end;\r\n\r\n created := false;\r\n\r\n asm\r\n if (this.FEdit == undefined) {\r\n this.FEdit = document.createElement('INPUT');\r\n this.FEdit.style.setProperty('box-sizing','border-box');\r\n this.FEdit.style.setProperty('-webkit-box-sizing','border-box');\r\n this.FEdit.style.setProperty('-moz-box-sizing','border-box');\r\n this.FEdit.style.setProperty('outline', 'none');\r\n this.FEdit.style.setProperty('border-style', 'none');\r\n\r\n created = true;\r\n }\r\n this.FEdit.removeAttribute(\"type\");\r\n this.FEdit.removeAttribute(\"min\");\r\n this.FEdit.removeAttribute(\"max\");\r\n this.FEdit.removeAttribute(\"step\");\r\n\r\n if (ch == '') {\r\n this.FEdit.value = s;\r\n }\r\n else {\r\n this.FEdit.value = ch;\r\n }\r\n\r\n this.FEdit.style.width = \"100%\";\r\n this.FEdit.style.height = \"100%\";\r\n this.FEdit.style.fontFamily = eh.style.fontFamily;\r\n this.FEdit.style.fontSize = eh.style.fontSize;\r\n this.FEdit.setSelectionRange(0, this.FEdit.value.length)\r\n\r\n this.FSelectedCell.innerHTML = \"\";\r\n this.FSelectedCell.appendChild(this.FEdit);\r\n end;\r\n\r\n case FEditType of\r\n geURL: FEdit['type'] := 'URL';\r\n geDate: FEdit['type'] := 'DATE';\r\n geTime: FEdit['type'] := 'TIME';\r\n geRange:\r\n begin\r\n FEdit['type'] := 'RANGE';\r\n FEdit['min'] := NumAttribute(RangeEdit.min);\r\n FEdit['max'] := NumAttribute(RangeEdit.max);\r\n FEdit['step'] := NumAttribute(RangeEdit.step);\r\n end;\r\n geEMail: FEdit['type'] := 'EMAIL';\r\n geNumber: FEdit['type'] := 'NUMBER';\r\n geTel: FEdit['type'] := 'TEL';\r\n geColor: FEdit['type'] := 'COLOR';\r\n end;\r\n\r\n asm\r\n this.FEdit.focus();\r\n end;\r\n RemoveSelection(FSelectedCell);\r\n\r\n if created then\r\n begin\r\n FEdit.addEventListener('blur', FHandleEditBlurPtr);\r\n FEdit.addEventListener('keypress', FHandleEditKeypressPtr);\r\n end;\r\nend;\r\n\r\nfunction TCustomStringGrid.StopEdit: string;\r\nvar\r\n val: string;\r\n eh: TJSHTMLElement;\r\nbegin\r\n Result := '';\r\n\r\n if FEditMode then\r\n begin\r\n FEditMode := false;\r\n\r\n if FEditType = geCombo then\r\n begin\r\n val := FCombo.Text;\r\n eh := FCombo.ElementHandle;\r\n end\r\n else\r\n if FEditType = geMask then\r\n begin\r\n val := FMask.Text;\r\n eh := FMask.ElementHandle;\r\n end\r\n else\r\n begin\r\n val := (FEdit as TJSHTMLInputElement).value;\r\n eh := FEdit;\r\n end;\r\n\r\n ValidateCell(FEditCol, FEditRow, val);\r\n\r\n FSelectedCell.removeChild(eh);\r\n FSelectedCell.innerHTML := val;\r\n Result := val;\r\n\r\n UpdateCell(FEditCol, FEditRow, val);\r\n AddSelection(FSelectedCell);\r\n end;\r\nend;\r\n\r\nprocedure TCustomStringGrid.TopLeftChanged;\r\nbegin\r\n if Assigned(OnTopLeftChanged) then\r\n OnTopLeftChanged(Self);\r\nend;\r\n\r\nprocedure TCustomStringGrid.UpdateCell(ACol, ARow: integer; var AValue: string);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TCustomStringGrid.UpdateElement;\r\nvar\r\n clr: string;\r\n id: string;\r\nbegin\r\n inherited;\r\n\r\n if IsUpdating then\r\n Exit;\r\n\r\n if Assigned(ElementHandle) then\r\n begin\r\n if (Color <> clWindow) and (Color <> clNone) then\r\n ElementHandle.style.setProperty('background-color', ColorToHTML(Color));\r\n\r\n ElementHandle.style.setProperty('overflow', 'hidden');\r\n\r\n if (BorderStyle = bsSingle) and not (BorderColor = clNone) and (ElementClassName = '') and not IsLinked then\r\n begin\r\n ElementHandle.style.setProperty('border', '1px solid '+ ColorToHTML(BorderColor));\r\n// BorderWidth := 1;\r\n end\r\n else\r\n begin\r\n ElementHandle.style.setProperty('border', '');\r\n// BorderWidth := 0;\r\n end;\r\n\r\n RenderGrid;\r\n\r\n clr := ColorToHTML(Color);\r\n\r\n if Color <> clWindow then\r\n begin\r\n // background color stringgrid (DIV & TBODY)\r\n asm\r\n var bd = this.FNormalCells.tBodies[0];\r\n if (bd != undefined) {\r\n this.FNormalCells.tBodies[0].style.setProperty('background-color', clr);\r\n }\r\n this.FNormalCells.parentElement.parentElement.style.setProperty('background-color', clr);\r\n end;\r\n end;\r\n\r\n id := GetID;\r\n if id = '' then\r\n id := Name;\r\n\r\n AddInstanceStyle(GetGridCSS(id));\r\n\r\n UpdateGridSize;\r\n end;\r\nend;\r\n\r\nprocedure TCustomStringGrid.UpdateElementVisual;\r\nvar\r\n fixcol,fixtxtcol: string;\r\nbegin\r\n inherited;\r\n\r\n if IsUpdating then\r\n Exit;\r\n\r\n if Assigned(ElementHandle) and Assigned(FGrid) then\r\n begin\r\n fixcol := ColorToHTML(FFixedColor);\r\n fixtxtcol := ColorToHTML(FFixedTextColor);\r\n\r\n if (FixedCols > 0) and (FixedRows > 0) then\r\n begin\r\n asm\r\n this.FFixedColRow.parentElement.style.setProperty('background-color',fixcol);\r\n this.FFixedColRow.parentElement.style.setProperty('color',fixtxtcol);\r\n end;\r\n end;\r\n\r\n if (FixedCols > 0) then\r\n begin\r\n asm\r\n this.FFixedCol.parentElement.style.setProperty('background-color',fixcol);\r\n this.FFixedCol.parentElement.style.setProperty('color',fixtxtcol);\r\n end;\r\n end;\r\n\r\n if (FixedRows > 0) then\r\n begin\r\n asm\r\n this.FFixedRow.parentElement.style.setProperty('background-color',fixcol);\r\n this.FFixedRow.parentElement.style.setProperty('color',fixtxtcol);\r\n this.FFixedRow.parentElement.parentElement.style.setProperty('background-color',fixcol);\r\n this.FFixedRow.parentElement.parentElement.style.setProperty('color',fixtxtcol);\r\n end;\r\n end;\r\n end;\r\n\r\nend;\r\n\r\nprocedure TCustomStringGrid.UpdateGridSize;\r\nvar\r\n i,j,k,l,cw,rh: integer;\r\n\r\nbegin\r\n if not Assigned(ElementHandle) then\r\n Exit;\r\n\r\n if IsUpdating then\r\n Exit;\r\n\r\n if (RowCount = 0) or (ColCount = 0) then\r\n Exit;\r\n\r\n for i := 0 to FixedCols - 1 do\r\n begin\r\n cw := ColWidths[i];\r\n\r\n if (FixedRows > 0) and (FixedCols > 0) then\r\n begin\r\n asm\r\n for (j = 0; j < this.FFixedColRow.rows.length; j ++){\r\n var tr = this.FFixedColRow.rows[j];\r\n var td = tr.cells[i];\r\n td.style.width = cw + \"px\";\r\n td.style.maxWidth = cw + \"px\";\r\n }\r\n end;\r\n end;\r\n\r\n if (FixedCols > 0) then\r\n begin\r\n asm\r\n for (j = 0; j < this.FFixedCol.rows.length; j ++){\r\n var tr = this.FFixedCol.rows[j];\r\n var td = tr.cells[i];\r\n td.style.width = cw + \"px\";\r\n td.style.maxWidth = cw + \"px\";\r\n }\r\n end;\r\n end;\r\n end;\r\n\r\n for i := 0 to FixedRows - 1 do\r\n begin\r\n rh := RowHeights[i];\r\n\r\n if FixedCols > 0 then\r\n begin\r\n asm\r\n var tr = this.FFixedColRow.rows[i];\r\n tr.style.height = rh + \"px\";\r\n end;\r\n end;\r\n\r\n asm\r\n var tr = this.FFixedRow.rows[i];\r\n tr.style.height = rh + \"px\";\r\n end;\r\n end;\r\n\r\n for i := FixedCols to ColCount - 1 do\r\n begin\r\n cw := ColWidths[i];\r\n\r\n k := i - FixedCols;\r\n\r\n if (FixedRows > 0) then\r\n begin\r\n asm\r\n //if (this.FFixedRow.rows.length > 0) {\r\n for (i = 0; i < this.FFixedRow.rows.length; i++) {\r\n var tr = this.FFixedRow.rows[i];\r\n var td = tr.cells[k];\r\n td.style.width = cw + \"px\";\r\n td.style.maxWidth = cw + \"px\";\r\n }\r\n end;\r\n end;\r\n\r\n asm\r\n if (this.FNormalCells.rows.length > 0) {\r\n var tr = this.FNormalCells.rows[0];\r\n var td = tr.cells[k];\r\n td.style.width = cw + \"px\";\r\n td.style.maxWidth = cw + \"px\";\r\n }\r\n end;\r\n end;\r\n\r\n for i := FixedRows to RowCount - 1 do\r\n begin\r\n k := i - FixedRows;\r\n rh := RowHeights[i];\r\n\r\n for j := FixedCols to ColCount - 1 do\r\n begin\r\n l := j - FixedCols;\r\n cw := ColWidths[j];\r\n\r\n if FixedCols > 0 then\r\n begin\r\n asm\r\n var tr = this.FFixedCol.rows[k];\r\n tr.style.height = rh + \"px\";\r\n end;\r\n end;\r\n\r\n asm\r\n var tr = this.FNormalCells.rows[k];\r\n tr.style.height = rh + \"px\";\r\n\r\n td = tr.cells[l];\r\n td.style.maxWidth = cw + \"px\";\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\n\r\nprocedure TCustomStringGrid.ValidateCell(ACol, ARow: integer;\r\n var AValue: string);\r\nbegin\r\n if Assigned(OnValidateEdit) then\r\n OnValidateEdit(Self, ACol, ARow, AValue);\r\nend;\r\n\r\n{$HINTS ON}\r\n\r\n\r\nfunction TCustomStringGrid.HandleMouseMove(Event: TJSMouseEvent): Boolean;\r\nvar\r\n rindex, cindex: integer;\r\n l, t: Single;\r\n ss: TShiftState;\r\nbegin\r\n rindex := -1;\r\n cindex := -1;\r\n\r\n asm\r\n if (Event.target.tagName.toLowerCase() == 'td')\r\n {\r\n cindex = Event.target.cellIndex;\r\n var tr = Event.target.parentElement;\r\n rindex = tr.rowIndex;\r\n }\r\n end;\r\n\r\n\r\n if (cindex >= 0) and (rindex >= 0) and (FStartCell.X >= 0) and (FStartCell.Y >= 0) then\r\n Selection := GridRect(FStartCell.X, FStartCell.Y, cindex + FixedCols, rindex + FixedRows);\r\n\r\n Result := true;\r\n\r\n XYToClient(Event.clientX, Event.clientY, l, t);\r\n\r\n ss := GetMouseEventShiftState(Event);\r\n\r\n MouseMove(ss, Trunc(l), Trunc(t));\r\nend;\r\n\r\nfunction TCustomStringGrid.HandleMouseUp(Event: TJSMouseEvent): Boolean;\r\nvar\r\n l, t: Single;\r\n ss: TShiftState;\r\n mb: TMouseButton;\r\nbegin\r\n asm\r\n TMSStringGridresetResize();\r\n end;\r\n\r\n FStartCell.X := -1;\r\n FStartCell.Y := -1;\r\n Result := false;\r\n\r\n Event.stopPropagation;\r\n Event.cancelBubble := true;\r\n\r\n XYToClient(Event.clientX, Event.clientY, l, t);\r\n\r\n ss := GetMouseEventShiftState(Event);\r\n mb := GetMouseEventButton(Event);\r\n\r\n MouseUp(mb, ss, Trunc(l), Trunc(t));\r\n\r\nend;\r\n\r\n{ TCustomGrid }\r\n\r\nprocedure TCustomGrid.Clear;\r\nbegin\r\n//\r\nend;\r\n\r\nprocedure TCustomGrid.ColCountChanged(delta: integer);\r\nbegin\r\nend;\r\n\r\nfunction TCustomGrid.ColOffset: integer;\r\nbegin\r\n Result := 0;\r\nend;\r\n\r\nfunction TCustomGrid.GetCells(ACol, ARow: integer): string;\r\nbegin\r\n Result := '';\r\nend;\r\n\r\nfunction TCustomGrid.GetCellsArray: TJSArray;\r\nvar\r\n i,j: integer;\r\n row: TJSArray;\r\n s:string;\r\nbegin\r\n Result := TJSArray.new;\r\n\r\n for i := RowOffset to RowCount - 1 do\r\n begin\r\n row := TJSArray.new;\r\n\r\n for j := ColOffset to ColCount - 1 do\r\n begin\r\n s := Cells[j,i];\r\n row.push(s);\r\n end;\r\n Result.push(row);\r\n end;\r\nend;\r\n\r\nprocedure TCustomGrid.GridChanged;\r\nbegin\r\n //\r\nend;\r\n\r\nprocedure TCustomGrid.RowCountChanged(delta: integer);\r\nbegin\r\nend;\r\n\r\nfunction TCustomGrid.RowOffset: integer;\r\nbegin\r\n Result := 0;\r\nend;\r\n\r\nprocedure TCustomGrid.SetCells(ACol, ARow: integer; const Value: string);\r\nbegin\r\n//\r\nend;\r\n\r\nprocedure TCustomGrid.SetColCount(const Value: integer);\r\nvar\r\n delta: integer;\r\nbegin\r\n if (FColCount <> Value) and (Value >= 0) then\r\n begin\r\n delta := Value - FColCount;\r\n FColCount := Value;\r\n if Assigned(ElementHandle) then\r\n begin\r\n ColCountChanged(delta);\r\n GridChanged;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TCustomGrid.SetRowCount(const Value: integer);\r\nvar\r\n delta: integer;\r\nbegin\r\n if (FRowCount <> Value) and (Value >= 0) then\r\n begin\r\n delta := Value - FRowCount;\r\n FRowCount := Value;\r\n if Assigned(ElementHandle) then\r\n begin\r\n RowCountChanged(delta);\r\n GridChanged;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TCustomGrid.SetCellsArray(const Value: TJSArray);\r\nvar\r\n i,j: integer;\r\n ja: TJSArray;\r\n jv: JSValue;\r\nbegin\r\n if Value.length + RowOffset > RowCount then\r\n RowCount := Value.length + RowOffset;\r\n\r\n for i := 0 to Value.length - 1 do\r\n begin\r\n ja := TJSArray(Value.elements[i]);\r\n if (ja is TJSArray) then\r\n begin\r\n if ja.length + ColOffset > ColCount then\r\n ColCount := ja.length + ColOffset;\r\n\r\n for j := 0 to ja.length - 1 do\r\n begin\r\n jv := ja.Elements[j];\r\n Cells[j + ColOffset,i + RowOffset] := js.toString(jv);\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\n{ TCustomTableControl }\r\n\r\n{$HINTS OFF}\r\nprocedure TCustomTableControl.AddCheckBox(ACol, ARow: integer;\r\n Checked: boolean);\r\nvar\r\n s: string;\r\n el: TJSHTMLElement;\r\nbegin\r\n s := '';\r\n Cells[ACol,ARow] := s;\r\n\r\n el := CellElements[ACol, ARow];\r\n BindCellChildren(ACol, ARow, el);\r\nend;\r\n\r\nprocedure TCustomTableControl.BindCellChildren(ACol, ARow: integer;\r\n AElement: TJSHTMLElement);\r\nvar\r\n el: TJSHTMLElement;\r\nbegin\r\n el := TJSHTMLElement(AElement.firstChild);\r\n\r\n if Assigned(el) and (el.tagName = 'INPUT') then\r\n begin\r\n if (lowercase(el.getAttribute('TYPE'))= 'checkbox') then\r\n begin\r\n el.addEventListener('click', @HandleCheckBoxClick);\r\n end;\r\n end;\r\n\r\nend;\r\n\r\nprocedure TCustomTableControl.BindEvents;\r\nbegin\r\n inherited;\r\n RenderGridScript;\r\nend;\r\n\r\nprocedure TCustomTableControl.Clear;\r\nvar\r\n i,j: integer;\r\nbegin\r\n for i := 0 to RowCount - 1 do\r\n for j := 0 to ColCount - 1 do\r\n begin\r\n Cells[j,i] := '';\r\n end;\r\nend;\r\n\r\nprocedure TCustomTableControl.ClearData;\r\nbegin\r\n Clear;\r\nend;\r\n\r\nprocedure TCustomTableControl.ColCountChanged(delta: integer);\r\nvar\r\n c: integer;\r\n dtb,cc: string;\r\nbegin\r\n if IsUpdating or not Assigned(FTable) then\r\n Exit;\r\n\r\n cc := '';\r\n dtb := '';\r\n if (csDesigning in ComponentState) then\r\n begin\r\n dtb := '1px dashed gray';\r\n cc := ' ';\r\n end;\r\n\r\n if delta > 0 then\r\n begin\r\n asm\r\n var i = 0;\r\n var j = 0;\r\n var k = 0;\r\n var tr = undefined;\r\n var td = undefined;\r\n\r\n var l = this.FTable.rows.length;\r\n\r\n for(j = 0; j < l; j++)\r\n {\r\n tr = this.FTable.rows[j];\r\n\r\n k = tr.cells.length;\r\n\r\n for(i = 0; i < delta; i++)\r\n {\r\n if ((j == 0) && (this.FRowHeader))\r\n {\r\n var th = document.createElement('th');\r\n th.setAttribute('scope','col');\r\n tr.appendChild(th);\r\n th.innerHTML = cc;\r\n th.style.borderRight = dtb;\r\n }\r\n else\r\n {\r\n td = tr.insertCell(k);\r\n td = tr.cells[k];\r\n td.style.borderRight = dtb;\r\n td.innerHTML = cc;\r\n }\r\n }\r\n }\r\n end;\r\n\r\n if DragMode = dmAutomatic then\r\n EnableDrag;\r\n end;\r\n\r\n if delta < 0 then\r\n begin\r\n\r\n asm\r\n var i = 0;\r\n var j = 0;\r\n var k = 0;\r\n var tr = undefined;\r\n\r\n var l = this.FTable.rows.length;\r\n\r\n for(j = 0; j < l; j++)\r\n {\r\n tr = this.FTable.rows[j];\r\n\r\n k = tr.cells.length;\r\n\r\n for(i = 0; i < -delta; i++)\r\n {\r\n tr.deleteCell(k - i - 1);\r\n }\r\n }\r\n end;\r\n end;\r\nend;\r\n{$HINTS ON}\r\n\r\nfunction TCustomTableControl.ColOffset: integer;\r\nbegin\r\n if ColHeader then\r\n Result := 1\r\n else\r\n Result := 0;\r\nend;\r\n\r\nconstructor TCustomTableControl.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n TabStop := false;\r\nend;\r\n\r\nfunction TCustomTableControl.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('DIV');\r\n FTable := nil;\r\nend;\r\n\r\nprocedure TCustomTableControl.CreateInitialize;\r\nbegin\r\n inherited;\r\n FOptions := TTableControlOptions.Create(Self);\r\n// Color := clWindow;\r\n // TabStop := false;\r\n FColCount := 5;\r\n FRowCount := 10;\r\n FRowHeader := true;\r\n FColHeader := true;\r\n if (csDesigning in ComponentState) then\r\n begin\r\n Width := 400;\r\n Height := 300;\r\n end;\r\nend;\r\n\r\nprocedure TCustomTableControl.DataBeginUpdate;\r\nbegin\r\n //\r\nend;\r\n\r\nprocedure TCustomTableControl.DataEndUpdate;\r\nbegin\r\n //\r\nend;\r\n\r\nprocedure TCustomTableControl.DataInsertRow(AInsertPosition: Integer);\r\nbegin\r\n InsertRow(AInsertPosition);\r\nend;\r\n\r\ndestructor TCustomTableControl.Destroy;\r\nbegin\r\n FOptions.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TCustomTableControl.DisableDrag;\r\n procedure RemoveDraggableAttribute(AElement: TJSElement);\r\n var\r\n I: Integer;\r\n begin\r\n for I := 0 to AElement.children.length - 1 do\r\n begin\r\n if TJSElement(AElement.children[I]).tagName = 'TD' then\r\n begin\r\n TJSElement(AElement.children[I]).removeAttribute('draggable');\r\n RemoveDraggableAttribute(TJSElement(AElement.children[I]));\r\n end\r\n else\r\n RemoveDraggableAttribute(TJSElement(AElement.children[I]));\r\n end;\r\n end;\r\nbegin\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n RemoveDraggableAttribute(Container);\r\nend;\r\n\r\nprocedure TCustomTableControl.DoCheckClick(ACol, ARow: Longint;\r\n Checked: boolean);\r\nbegin\r\n if Assigned(OnCheckClick) then\r\n OnCheckClick(Self, ACol, ARow, Checked);\r\nend;\r\n\r\nfunction TCustomTableControl.DoHttpAbort(Event: TEventListenerEvent): boolean;\r\nbegin\r\n if Assigned(OnHttpRequestError) then\r\n OnHttpRequestError(Self);\r\n\r\n Result := true;\r\nend;\r\n\r\nfunction TCustomTableControl.DoHttpLoadCsv(Event: TEventListenerEvent): boolean;\r\nvar\r\n sl: TStringList;\r\n req: TJSXMLHttpRequest;\r\nbegin\r\n req := TJSXMLHttpRequest(Event.target);\r\n\r\n if (req.status >= 200) and (req.status <= 208) then\r\n begin\r\n sl := TStringList.Create;\r\n sl.Text := req.responseText;\r\n\r\n try\r\n LoadFromStringList(sl);\r\n finally\r\n sl.Free;\r\n end;\r\n\r\n if Assigned(OnHttpRequestSuccess) then\r\n OnHttpRequestSuccess(Self);\r\n end;\r\n\r\n Result := true;\r\nend;\r\n\r\n{$HINTS OFF}\r\nfunction TCustomTableControl.DoHttpLoadJson(Event: TEventListenerEvent): boolean;\r\nvar\r\n J: TJSObject;\r\n JO: JSValue;\r\n JA: TJSArray;\r\n r,c,firstrow: integer;\r\n arow: string;\r\n sl: TStringList;\r\n cd,cn: string;\r\n ce: TJSHTMLElement;\r\n req: TJSXMLHttpRequest;\r\n\r\nbegin\r\n req := TJSXMLHttpRequest(Event.target);\r\n\r\n if (req.status >= 200) and (req.status <= 208) then\r\n begin\r\n J := TJSJSON.parseObject(req.responseText);\r\n\r\n if FDataNode <> '' then\r\n JA := TJSArray(J.Properties[FDataNode])\r\n else\r\n JA := TJSArray(J);\r\n\r\n\r\n if Assigned(JA) then\r\n begin\r\n sl := TStringList.Create;\r\n\r\n if RowHeader then\r\n firstrow := 1\r\n else\r\n firstrow := 0;\r\n\r\n RowCount := JA.length + firstrow;\r\n\r\n for r := 0 to JA.length - 1 do\r\n begin\r\n JO := JA.Elements[r];\r\n\r\n c := 0;\r\n arow := '';\r\n\r\n asm\r\n var x = undefined;\r\n for (x in JO) {\r\n arow += \"|\" + JO[x];\r\n c++;\r\n }\r\n end;\r\n\r\n Delete(arow, 1, 1);\r\n sl.StrictDelimiter := true;\r\n sl.Delimiter := '|';\r\n sl.DelimitedText := arow;\r\n if ColCount < sl.Count then\r\n ColCount := sl.Count;\r\n\r\n\r\n for c := 0 to sl.Count - 1 do\r\n begin\r\n cd := sl.Strings[c];\r\n GetCellData(c, r + firstrow, nil, cd);\r\n Cells[c, r + firstrow] := cd;\r\n\r\n ce := CellElements[c, r + firstrow];\r\n\r\n GetCellChildren(c, r + firstrow, nil, cd, ce);\r\n\r\n cn := '';\r\n GetCellClassName(c, r + firstrow, nil, cd, cn);\r\n if cn <> '' then\r\n ce.setAttribute('class',cn);\r\n end;\r\n end;\r\n\r\n sl.Free;\r\n end;\r\n\r\n if Assigned(OnHttpRequestSuccess) then\r\n OnHttpRequestSuccess(Self);\r\n end;\r\n\r\n Result := true;\r\nend;\r\nprocedure TCustomTableControl.DoHttpRequest(ARequest: TJSXMLHttpRequest);\r\nvar\r\n LRequestRec: TJSXMLHttpRequestRecord;\r\nbegin\r\n if Assigned(OnHttpRequest) then\r\n begin\r\n LRequestRec.req := ARequest;\r\n OnHttpRequest(Self, LRequestRec);\r\n end;\r\nend;\r\n\r\nprocedure TCustomTableControl.EnableColResize;\r\nvar\r\n TableName: string;\r\n ResizeEnabled: Boolean;\r\nbegin\r\n TableName := Name;\r\n ResizeEnabled := Options.ResizeColumns;\r\n\r\n if not (csDesigning in ComponentState) then\r\n begin\r\n asm\r\n resizableGrid(TableName, ResizeEnabled);\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TCustomTableControl.EnableDrag;\r\n procedure AddDraggableAttribute(AElement: TJSElement);\r\n var\r\n I: Integer;\r\n begin\r\n for I := 0 to AElement.children.length - 1 do\r\n begin\r\n if TJSElement(AElement.children[I]).tagName = 'TD' then\r\n begin\r\n TJSElement(AElement.children[I]).Attrs['draggable'] := 'true';\r\n AddDraggableAttribute(TJSElement(AElement.children[I]));\r\n end\r\n else\r\n AddDraggableAttribute(TJSElement(AElement.children[I]));\r\n end;\r\n end;\r\nbegin\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n AddDraggableAttribute(Container);\r\nend;\r\n\r\n{$HINTS ON}\r\n\r\nprocedure TCustomTableControl.GetCellChildren(ACol, ARow: integer;\r\n AField: TField; AValue: string; AElement: TJSHTMLElement);\r\nvar\r\n LElementRec: TJSHTMLElementRecord;\r\nbegin\r\n if Assigned(OnGetCellChildren) then\r\n begin\r\n LElementRec.element := AElement;\r\n OnGetCellChildren(Self, ACol, ARow, AField, AValue, LElementRec);\r\n end;\r\nend;\r\n\r\nprocedure TCustomTableControl.GetCellClassName(ACol, ARow: integer;\r\n AField: TField; AValue: string; var AClassName: string);\r\nbegin\r\n if Assigned(OnGetCellClass) then\r\n OnGetCellClass(Self, ACol, ARow, AField, AValue, AClassName);\r\nend;\r\n\r\nprocedure TCustomTableControl.GetCellData(ACol, ARow: integer; AField: TField;\r\n var AValue: string);\r\nbegin\r\n if Assigned(OnGetCellData) then\r\n OnGetCellData(Self, ACol, ARow, AField, AValue);\r\nend;\r\n\r\nfunction TCustomTableControl.GetCellElement(col, row: integer): TJSHTMLElement;\r\nvar\r\n res: TJSHTMLElement;\r\nbegin\r\n res := nil;\r\n\r\n if (col >= 0) and (row >= 0) and (col < ColCount) and (row < RowCount) then\r\n begin\r\n asm\r\n res = this.FTable.rows[row].cells[col];\r\n end;\r\n end;\r\n\r\n Result := res;\r\nend;\r\n\r\nfunction TCustomTableControl.GetCells(col, row: integer): string;\r\nvar\r\n res: string;\r\n\r\nbegin\r\n Result := '';\r\n\r\n if (col >= 0) and (row >= 0) and (col < ColCount) and (row < RowCount) then\r\n begin\r\n asm\r\n var td = this.FTable.rows[row].cells[col];\r\n res = td.innerHTML;\r\n end;\r\n\r\n Result := res;\r\n end;\r\nend;\r\n\r\nfunction TCustomTableControl.GetDataRowCount: Integer;\r\nbegin\r\n if ColHeader then\r\n Result := RowCount - 1\r\n else\r\n Result := RowCount;\r\nend;\r\n\r\nfunction TCustomTableControl.GetRowClassName(row: integer): TElementClassName;\r\nvar\r\n res: string;\r\nbegin\r\n res := '';\r\n\r\n if (row >= 0) and (row < RowCount) then\r\n begin\r\n asm\r\n var tr = this.FTable.rows[row];\r\n res = tr.getAttribute('class');\r\n end;\r\n end;\r\n\r\n Result := res;\r\nend;\r\n\r\nfunction TCustomTableControl.HandleCheckBoxClick(Event: TJSEvent): Boolean;\r\nvar\r\n rindex, cindex: integer;\r\n chk: boolean;\r\nbegin\r\n Result := true;\r\n rindex := -1;\r\n cindex := -1;\r\n\r\n asm\r\n var el = Event.target;\r\n chk = el.checked;\r\n var d = el.parentElement;\r\n if (d.tagName.toLowerCase() == 'td')\r\n {\r\n cindex = d.cellIndex;\r\n var tr = d.parentElement;\r\n rindex = tr.rowIndex;\r\n }\r\n end;\r\n\r\n if (rindex <> -1) and (cindex <> -1) then\r\n begin\r\n DoCheckClick(cindex, rindex, chk);\r\n end;\r\nend;\r\n\r\nfunction TCustomTableControl.HandleDoClick(Event: TJSMouseEvent): Boolean;\r\nvar\r\n c,r: integer;\r\n el: TJSElement;\r\nbegin\r\n el := Event.targetElement;\r\n\r\n if (el.tagName = 'TD') or (el.tagName = 'TH') then\r\n begin\r\n asm\r\n c = el.cellIndex;\r\n var tr = el.parentElement;\r\n r = tr.rowIndex;\r\n end;\r\n\r\n if Assigned(OnClickCell) then\r\n OnClickCell(Self, c, r);\r\n end;\r\n\r\n if Assigned(OnClick) then\r\n OnClick(Self);\r\n\r\n Result := true;\r\nend;\r\n\r\nfunction TCustomTableControl.HandleDoDblClick(Event: TJSMouseEvent): Boolean;\r\nvar\r\n c,r: integer;\r\n el: TJSElement;\r\nbegin\r\n el := Event.targetElement;\r\n\r\n if (el.tagName = 'TD') or (el.tagName = 'TH') then\r\n begin\r\n asm\r\n c = el.cellIndex;\r\n var tr = el.parentElement;\r\n r = tr.rowIndex;\r\n end;\r\n\r\n if Assigned(OnDblClickCell) then\r\n OnDblClickCell(Self, c, r);\r\n end;\r\n Result := true;\r\nend;\r\n\r\n{$HINTS OFF}\r\nfunction TCustomTableControl.HandleDoMouseMove(Event: TJSMouseEvent): Boolean;\r\nvar\r\n IsAutoWidth: Boolean;\r\nbegin\r\n inherited;\r\n\r\n IsAutoWidth := (WidthStyle in [ssAuto]);\r\n asm\r\n autoWidth = IsAutoWidth;\r\n resizeColumn(Event);\r\n end;\r\n\r\n Result := True;\r\nend;\r\n{$HINTS ON}\r\n\r\nfunction TCustomTableControl.HandleDoMouseUp(Event: TJSMouseEvent): Boolean;\r\nbegin\r\n inherited;\r\n\r\n asm\r\n resetResize();\r\n end;\r\n\r\n Result := True;\r\nend;\r\n\r\nprocedure TCustomTableControl.InitSample(AInitMethod: TInitMethod);\r\nvar\r\n i,j: integer;\r\nbegin\r\n for i := 0 to RowCount - 1 do\r\n begin\r\n for j := 0 to ColCount - 1 do\r\n begin\r\n case AInitMethod of\r\n imRandom:\r\n Cells[j,i] := IntToStr(Random(100));\r\n imLinear:\r\n Cells[j,i] := IntToStr(j)+':'+IntToStr(i);\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\n{$HINTS OFF}\r\nprocedure TCustomTableControl.InsertRow(Index: integer);\r\nvar\r\n cnt: integer;\r\n ch: boolean;\r\nbegin\r\n if (Index <0) or (Index > RowCount) then\r\n Exit;\r\n\r\n cnt := ColCount;\r\n ch := ColHeader;\r\n\r\n asm\r\n var tr = this.FTable.insertRow(Index);\r\n\r\n for(i = 0; i < cnt; i++)\r\n {\r\n if ((i == 0) && (ch)) {\r\n var th = document.createElement('th');\r\n th.setAttribute('scope','row');\r\n tr.appendChild(th);\r\n }\r\n else\r\n {\r\n tr.insertCell();\r\n }\r\n }\r\n end;\r\nend;\r\n{$HINTS ON}\r\n\r\nprocedure TCustomTableControl.LoadFromStringList(AStrings: TStrings);\r\nvar\r\n firstrow: integer;\r\n arow: TStringList;\r\n i,j: integer;\r\n cd, cn: string;\r\n ce: TJSHTMLElement;\r\n\r\nbegin\r\n if RowHeader and not FLoadFixed then\r\n firstrow := 1\r\n else\r\n firstrow := 0;\r\n\r\n RowCount := AStrings.Count + firstrow;\r\n\r\n arow := TStringList.Create;\r\n\r\n try\r\n for i := 0 to AStrings.Count - 1 do\r\n begin\r\n arow.StrictDelimiter := true;\r\n arow.Delimiter := FDelimiter;\r\n arow.DelimitedText := AStrings.Strings[i];\r\n\r\n if arow.Count > ColCount then\r\n ColCount := arow.Count;\r\n\r\n for j := 0 to arow.Count - 1 do\r\n begin\r\n cd := arow.Strings[j];\r\n GetCellData(j, i + firstrow, nil, cd);\r\n\r\n Cells[j, i + firstrow] := cd;\r\n\r\n ce := CellElements[j, i + firstrow];\r\n\r\n GetCellChildren(j, i + firstrow, nil, cd, ce);\r\n\r\n cn := '';\r\n GetCellClassName(j, i + firstrow, nil, cd, cn);\r\n if cn <> '' then\r\n ce.setAttribute('class',cn);\r\n end;\r\n end;\r\n finally\r\n arow.Free;\r\n end;\r\n\r\nend;\r\n\r\nprocedure TCustomTableControl.LoadFromStrings(AStrings: TStrings; Delimiter: char = ';'; LoadFixed: boolean = false);\r\nbegin\r\n FDelimiter := Delimiter;\r\n FLoadFixed := LoadFixed;\r\n\r\n LoadFromStringList(AStrings);\r\nend;\r\n\r\nprocedure TCustomTableControl.LoadFromCSV(const AURL: string; Delimiter: char = ';'; LoadFixed: boolean = false);\r\nbegin\r\n FDelimiter := Delimiter;\r\n FLoadFixed := LoadFixed;\r\n\r\n FReq := TJSXMLHttpRequest.new;\r\n FReq.addEventListener('load',@DoHttpLoadCsv);\r\n FReq.addEventListener('abort',@DoHttpAbort);\r\n FReq.open('GET', AURL);\r\n DoHttpRequest(FReq);\r\n FReq.send;\r\nend;\r\n\r\nprocedure TCustomTableControl.LoadFromJSON(const AURL: string; ADataNode: string);\r\nbegin\r\n FDataNode := ADataNode;\r\n FReq := TJSXMLHttpRequest.new;\r\n FReq.addEventListener('load',@DoHttpLoadJson);\r\n FReq.addEventListener('abort',@DoHttpAbort);\r\n FReq.open('GET', AURL);\r\n DoHttpRequest(FReq);\r\n FReq.send;\r\nend;\r\n\r\n{$HINTS OFF}\r\n\r\nprocedure TCustomTableControl.RemoveRow(Index: integer);\r\nbegin\r\n if (Index <0) or (Index >= RowCount) then\r\n Exit;\r\n\r\n asm\r\n var tr = this.FTable.deleteRow(Index);\r\n end;\r\n\r\nend;\r\n\r\nprocedure TCustomTableControl.RenderGrid;\r\nvar\r\n i: integer;\r\n table,tbody: TJSHTMLElement;\r\n frows, fcols: integer;\r\n rh,ch: boolean;\r\n headclass,tds,dtb,cc: string;\r\n\r\nbegin\r\n if not Assigned(FTable) then\r\n begin\r\n FTable := document.createElement('TABLE');\r\n ElementHandle.appendChild(FTable);\r\n\r\n SetHTMLElementFont(TJSHTMLElement(FTable), Font, not ((ElementClassName = '') and (ElementFont = efProperty)) );\r\n\r\n table := TJSHTMLElement(FTable);\r\n table.setAttribute('id', Name + 'Table');\r\n\r\n if RowHeader then\r\n frows := RowCount - 1\r\n else\r\n frows := RowCount;\r\n\r\n fcols := ColCount;\r\n rh := RowHeader;\r\n ch := ColHeader;\r\n\r\n dtb := '';\r\n cc := '';\r\n\r\n if (csDesigning in ComponentState) then\r\n begin\r\n dtb := '1px dashed gray';\r\n cc := ' ';\r\n end;\r\n\r\n if (ElementTableClassName = '') then\r\n begin\r\n table.style.setProperty('border-collapse','collapse');\r\n table.setAttribute('border','0');\r\n table.setAttribute('cellpadding','0');\r\n table.setAttribute('cellspacing','0');\r\n table.setAttribute('width','100%');\r\n table.setAttribute('table-layout','fixed');\r\n table.setAttribute('height','100%');\r\n tds := '1px solid black';\r\n end\r\n else\r\n begin\r\n tds := '';\r\n table.setAttribute('class',ElementTableClassName);\r\n end;\r\n\r\n headclass := ElementHeaderClassName;\r\n\r\n asm\r\n while (table.firstChild) {\r\n table.removeChild(table.firstChild);\r\n }\r\n\r\n var i = 0;\r\n var j = 0;\r\n if (rh)\r\n {\r\n var theader = table.createTHead();\r\n\r\n if (headclass != \"\")\r\n {\r\n theader.setAttribute(\"class\", headclass);\r\n }\r\n\r\n var tr = theader.insertRow(0);\r\n\r\n for(i=0; i < fcols; i++)\r\n {\r\n var th = document.createElement('th');\r\n th.setAttribute('scope','col');\r\n tr.appendChild(th);\r\n th.style.borderRight = dtb;\r\n }\r\n }\r\n\r\n tbody = table.appendChild(document.createElement('tbody'));\r\n\r\n for(i=0; i < frows; i++)\r\n {\r\n var tr = tbody.insertRow(0);\r\n\r\n for(j=0; j < fcols; j++)\r\n {\r\n if ((j == 0) && (ch))\r\n {\r\n var th = document.createElement('th');\r\n th.setAttribute('scope','row');\r\n tr.appendChild(th);\r\n th.innerHTML = cc;\r\n th.style.borderRight = dtb;\r\n }\r\n else\r\n {\r\n tr.insertCell(j);\r\n var td = tr.cells[j];\r\n td.innerHTML = cc;\r\n\r\n if (tds != \"\") {\r\n //td.style.borderBottom = tds;\r\n }\r\n if (dtb != \"\")\r\n {\r\n td.style.borderRight = dtb;\r\n if (j == 1)\r\n td.innerHTML = frows - i;\r\n }\r\n }\r\n }\r\n }\r\n end;\r\n\r\n FBody := tbody;\r\n\r\n if DragMode = dmAutomatic then\r\n EnableDrag;\r\n end;\r\n\r\n EnableColResize;\r\nend;\r\n\r\nprocedure TCustomTableControl.RenderGridData;\r\nvar\r\n i,j: integer;\r\nbegin\r\n for i := 0 to ColCount - 1 do\r\n for j := 0 to RowCount - 1 do\r\n Cells[i,j] := Cells[i,j];\r\nend;\r\n\r\nprocedure TCustomTableControl.RenderGridScript;\r\nbegin\r\n AddControlScriptSource(\r\n 'var pageX,curCol,nxtCol,curColWidth,nxtColWidth,autoWidth,curTable,curTableWidth;'+\r\n 'autoWidth = false;'+\r\n\r\n 'function resizeColumn(e) {'+\r\n ' if (curCol) {'+\r\n ' var diffX = e.pageX - pageX;'+\r\n '\t\tif ((nxtCol) && (!autoWidth)){'+\r\n '\t\t nxtCol.style.width = (nxtColWidth - diffX)+\"px\";'+\r\n ' } else {'+\r\n// ' curTable.style.width = (curTableWidth + diffX) + \"px\";'+\r\n ' }'+\r\n ' newColWidth = (curColWidth + diffX);'+\r\n ' if (newColWidth < 10)'+\r\n ' newColWidth = 10;'+\r\n '\t curCol.style.width = newColWidth + \"px\";'+\r\n ' }'+\r\n ' }'+\r\n\r\n 'function resetResize() {'+\r\n ' curCol = undefined;'+\r\n ' nxtCol = undefined;'+\r\n ' pageX = undefined;'+\r\n ' nxtColWidth = undefined;'+\r\n ' curColWidth = undefined;'+\r\n ' curTable = undefined;'+\r\n ' curTableWidth = undefined;'+\r\n ' }'+\r\n\r\n 'function resizableGrid(tablename, enabled) {'+\r\n ' var table = document.getElementById(tablename + \"Table\");'+\r\n ' if (!table) return;' +\r\n ' var row = table.getElementsByTagName(\"tr\")[0],'+\r\n ' cols = row ? row.children : undefined;'+\r\n ' if (!cols) return;'+\r\n\r\n ' for (var i=0;i 0) then\r\n begin\r\n\r\n asm\r\n var i = 0;\r\n var j = 0;\r\n var tr = undefined;\r\n var l = tbody.rows.length;\r\n\r\n for(i = 0;i < delta; i++)\r\n {\r\n tr = tbody.insertRow(l);\r\n for(j = 0; j < this.FColCount; j++)\r\n {\r\n\r\n if ((j == 0) && (this.FColHeader))\r\n {\r\n var th = document.createElement('th');\r\n th.setAttribute('scope','row');\r\n tr.appendChild(th);\r\n }\r\n else\r\n tr.insertCell(j);\r\n }\r\n }\r\n end;\r\n\r\n if DragMode = dmAutomatic then\r\n EnableDrag;\r\n end;\r\n\r\n if delta < 0 then\r\n begin\r\n asm\r\n var i = 0;\r\n var l = this.FBody.rows.length;\r\n for(i = 0;i < -delta; i++) {\r\n this.FBody.deleteRow(l - i - 1);\r\n }\r\n end;\r\n end;\r\nend;\r\n{$HINTS ON}\r\n\r\nfunction TCustomTableControl.RowOffset: integer;\r\nbegin\r\n if RowHeader then\r\n Result := 1\r\n else\r\n Result := 0;\r\nend;\r\n\r\nprocedure TCustomTableControl.SaveToCSV(const AFileName: string;\r\n Delimiter: char; SaveFixed: boolean);\r\nvar\r\n sl: TStringList;\r\nbegin\r\n sl := TStringList.Create;\r\n try\r\n SaveToStrings(sl, Delimiter, SaveFixed);\r\n sl.SaveToFile(AFileName);\r\n finally\r\n sl.Free;\r\n end;\r\nend;\r\n\r\nprocedure TCustomTableControl.SaveToStrings(AStrings: TStrings; Delimiter: char;\r\n SaveFixed: boolean);\r\nvar\r\n r,c: integer;\r\n fr,fc: integer;\r\n s,rowstr: string;\r\nbegin\r\n fr := 0;\r\n fc := 0;\r\n\r\n if not SaveFixed and ColHeader then\r\n fc := 1;\r\n\r\n if not SaveFixed and RowHeader then\r\n fr := 1;\r\n\r\n for r := fr to RowCount - 1 do\r\n begin\r\n rowstr := '';\r\n for c := fc to ColCount - 1 do\r\n begin\r\n s := Cells[c,r];\r\n s := stringreplace(s,'\"','\"\"',[rfReplaceAll]);\r\n\r\n if (pos(Delimiter,s) > 0) or (pos(#13, s) > 0) then\r\n begin\r\n s := '\"' + s + '\"';\r\n end;\r\n\r\n if s = '' then\r\n s := '\"\"';\r\n\r\n if rowstr = '' then\r\n rowstr := s\r\n else\r\n rowstr := rowstr + Delimiter + s;\r\n end;\r\n AStrings.Add(rowstr);\r\n end;\r\nend;\r\n\r\nprocedure TCustomTableControl.SetCells(col, row: integer; const Value: string);\r\nbegin\r\n if (col >= 0) and (row >= 0) and (col < ColCount) and (row < RowCount) then\r\n begin\r\n asm\r\n var td = this.FTable.rows[row].cells[col];\r\n td.innerHTML = Value;\r\n end;\r\n\r\n if (row = 0) then\r\n EnableColResize;\r\n end;\r\nend;\r\n\r\nprocedure TCustomTableControl.SetDataColumnCount(AValue: Integer);\r\nbegin\r\n if RowHeader then\r\n ColCount := AValue + 1\r\n else\r\n ColCount := AValue;\r\nend;\r\n\r\nprocedure TCustomTableControl.SetDataHeader(AColumn: Integer; AValue: string);\r\nvar\r\n d: integer;\r\nbegin\r\n if not ColHeader then\r\n Exit;\r\n\r\n d := 0;\r\n if RowHeader then\r\n d := 1;\r\n\r\n Cells[AColumn + d, 0] := AValue;\r\nend;\r\n\r\nprocedure TCustomTableControl.SetDataRowCount(AValue: Integer);\r\nbegin\r\n if ColHeader then\r\n RowCount := AValue + 1\r\n else\r\n RowCount := AValue;\r\nend;\r\n\r\nprocedure TCustomTableControl.SetDataValue(AColumn, ARow: Integer;\r\n AValue: string);\r\nvar\r\n dc,dr: integer;\r\nbegin\r\n dc := 0;\r\n dr := 0;\r\n\r\n if RowHeader then\r\n dc := 1;\r\n if ColHeader then\r\n dr := 1;\r\n\r\n Cells[AColumn + dc, ARow + dr] := AValue;\r\nend;\r\n\r\nprocedure TCustomTableControl.SetElementHeaderClassName(\r\n const Value: TElementClassName);\r\nvar\r\n head: TJSHTMLElement;\r\nbegin\r\n if (FElementHeaderClassName <> Value) then\r\n begin\r\n FElementHeaderClassName := Value;\r\n if Assigned(FTable) then\r\n begin\r\n head := TJSHTMLElement(FTable.firstChild);\r\n if Assigned(head) and (head.tagName = 'THEAD') then\r\n head.setAttribute('class',ElementHeaderClassName);\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TCustomTableControl.SetElementTableClassName(\r\n const Value: TElementClassName);\r\nbegin\r\n if (FElementTableClassName <> Value) then\r\n begin\r\n FElementTableClassName := Value;\r\n if Assigned(FTable) then\r\n FTable.setAttribute('class',ElementTableClassName);\r\n end;\r\nend;\r\n\r\nprocedure TCustomTableControl.SetOptions(const Value: TTableControlOptions);\r\nbegin\r\n FOptions.Assign(Value);\r\nend;\r\n\r\nprocedure TCustomTableControl.SetRowClassName(row: integer; const Value: TElementClassName);\r\nbegin\r\n if (row >= 0) and (row < RowCount) then\r\n begin\r\n asm\r\n var tr = this.FTable.rows[row];\r\n tr.setAttribute('class',Value);\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TCustomTableControl.SetRowCount(const Value: integer);\r\nvar\r\n delta: integer;\r\nbegin\r\n if (FRowCount <> Value) and (Value >= 0) then\r\n begin\r\n delta := Value - FRowCount;\r\n\r\n if (FRowcount = 0) and RowHeader then\r\n delta := Value - 1;\r\n\r\n FRowCount := Value;\r\n RowCountChanged(delta);\r\n GridChanged;\r\n end;\r\n\r\nend;\r\n\r\nprocedure TCustomTableControl.UpdateElement;\r\nbegin\r\n inherited;\r\n\r\n if IsUpdating then\r\n Exit;\r\n\r\n if Assigned(ElementHandle) then\r\n begin\r\n if Options.ScrollVertical then\r\n ElementHandle.style.setProperty('overflow-y','scroll')\r\n else\r\n ElementHandle.style.setProperty('height','');\r\n\r\n if (csDesigning in ComponentState) then\r\n begin\r\n ElementHandle.style.setProperty('width', IntToStr(Width) + 'px');\r\n ElementHandle.style.setProperty('height', IntToStr(Height) + 'px');\r\n end;\r\n\r\n // allow selection in labels\r\n ElementHandle.style.setProperty('user-select', '');\r\n\r\n // allow default caret on text\r\n if Cursor = crDefault then\r\n ElementHandle.style.setProperty('cursor', '');\r\n\r\n if (BorderStyle = bsSingle) and (BorderColor <> clNone) and (ElementClassName = '') and (ElementTableClassName = '') and not IsLinked then\r\n ElementHandle.style.setProperty('border', '1px ' + ColorToHTML(BorderColor)+' solid')\r\n else\r\n ElementHandle.style.setProperty('border', '');\r\n\r\n if (Color <> clNone) and (Color <> clWindow) then\r\n ElementHandle.style.setProperty('background-color', ColorToHTML(Color))\r\n else\r\n ElementHandle.style.setProperty('background-color', '');\r\n\r\n RenderGrid;\r\n end;\r\nend;\r\n\r\n\r\n{ TResponsiveGridItem }\r\n\r\nconstructor TResponsiveGridItem.Create(ACollection: TCollection);\r\nbegin\r\n inherited;\r\n FVisible := true;\r\nend;\r\n\r\ndestructor TResponsiveGridItem.Destroy;\r\nbegin\r\n (Collection as TResponsiveGridItems).DoItemDelete(Index);\r\n inherited;\r\nend;\r\n\r\n{$HINTS OFF}\r\nfunction TResponsiveGridItem.GetJSONElementValue(id: string): string;\r\nvar\r\n res: string;\r\n JO: JSValue;\r\nbegin\r\n JO := FJSONObject;\r\n asm\r\n res = JO[id];\r\n end;\r\n Result := res;\r\nend;\r\n{$HINTS ON}\r\n\r\nprocedure TResponsiveGridItem.SetHTML(const Value: string);\r\nbegin\r\n FHTML := Value;\r\n Changed(false);\r\nend;\r\n\r\nprocedure TResponsiveGridItem.SetVisible(const Value: boolean);\r\nbegin\r\n if FVisible <> Value then\r\n begin\r\n FVisible := Value;\r\n if Assigned(ElementHandle) then\r\n begin\r\n if FVisible then\r\n ElementHandle.style.removeProperty('display')\r\n else\r\n ElementHandle.style.setProperty('display','none');\r\n end;\r\n end;\r\nend;\r\n\r\n{ TResponsiveGridItems }\r\n\r\nfunction TResponsiveGridItems.Add: TResponsiveGridItem;\r\nbegin\r\n Result := TResponsiveGridItem(inherited Add);\r\n DoItemAdd(Result.Index);\r\nend;\r\n\r\nfunction TResponsiveGridItems.Add(HTML: string): TResponsiveGridItem;\r\nbegin\r\n Result := TResponsiveGridItem(inherited Add);\r\n Result.FHTML := HTML;\r\n DoItemAdd(Result.Index);\r\nend;\r\n\r\nprocedure TResponsiveGridItems.Clear;\r\nbegin\r\n inherited Clear;\r\n DoItemClear;\r\nend;\r\n\r\nconstructor TResponsiveGridItems.Create(AOwner: TComponent);\r\nbegin\r\n inherited Create(AOwner, TResponsiveGridItem);\r\nend;\r\n\r\nprocedure TResponsiveGridItems.Delete(Index: integer);\r\nbegin\r\n inherited Delete(Index);\r\nend;\r\n\r\nprocedure TResponsiveGridItems.DoItemAdd(Index: integer);\r\nbegin\r\n if Assigned(OnItemAdd) then\r\n OnItemAdd(Self, Index);\r\nend;\r\n\r\nprocedure TResponsiveGridItems.DoItemClear;\r\nbegin\r\n if Assigned(OnItemClear) then\r\n OnItemClear(Self);\r\nend;\r\n\r\nprocedure TResponsiveGridItems.DoItemDelete(Index: integer);\r\nbegin\r\n if Assigned(OnItemDelete) then\r\n OnItemDelete(Self, Index);\r\nend;\r\n\r\nprocedure TResponsiveGridItems.DoItemInsert(Index: integer);\r\nbegin\r\n if Assigned(OnItemInsert) then\r\n OnItemInsert(Self, Index);\r\nend;\r\n\r\nprocedure TResponsiveGridItems.DoItemUpdate(Index: integer);\r\nbegin\r\n if Assigned(OnItemUpdate) then\r\n OnItemUpdate(Self, Index);\r\nend;\r\n\r\nfunction TResponsiveGridItems.GetItem(Index: integer): TResponsiveGridItem;\r\nbegin\r\n Result := TResponsiveGridItem(inherited Items[Index]);\r\nend;\r\n\r\nfunction TResponsiveGridItems.Insert(Index: integer): TResponsiveGridItem;\r\nbegin\r\n Result := TResponsiveGridItem(inherited Insert(Index));\r\n DoItemInsert(Result.Index);\r\nend;\r\n\r\nprocedure TResponsiveGridItems.SetItem(Index: integer;\r\n const Value: TResponsiveGridItem);\r\nbegin\r\n inherited Items[Index] := Value;\r\nend;\r\n\r\nprocedure TResponsiveGridItems.Update(Item: TCollectionItem);\r\nbegin\r\n inherited;\r\n if Assigned(Item) then\r\n DoItemUpdate(Item.Index);\r\nend;\r\n\r\n{ TResponsiveGrid }\r\n\r\nprocedure TResponsiveGrid.BindElement;\r\nbegin\r\n inherited;\r\nend;\r\n\r\nconstructor TResponsiveGrid.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\nend;\r\n\r\nfunction TResponsiveGrid.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('DIV');\r\nend;\r\n\r\nprocedure TResponsiveGrid.CreateInitialize;\r\nbegin\r\n inherited;\r\n\r\n FDesignTime := (csDesigning in ComponentState) and not\r\n ((csReading in Owner.ComponentState) or (csLoading in Owner.ComponentState));\r\n\r\n FListElement := nil;\r\n\r\n FOptions := TResponsiveGridOptions.Create;\r\n FOptions.OnChange := OptionsChanged;\r\n FItems := TResponsiveGridItems.Create(Self);\r\n FItems.PropName := 'Items';\r\n\r\n if FDesignTime then\r\n begin\r\n Items.Clear;\r\n Items.Add;\r\n Items.Add;\r\n Items.Add;\r\n end;\r\n\r\n FItems.OnItemAdd := HandleItemAdd;\r\n FItems.OnItemUpdate := HandleItemUpdate;\r\n FItems.OnItemDelete := HandleItemDelete;\r\n FItems.OnItemInsert := HandleItemInsert;\r\n FItems.OnItemClear := HandleItemClear;\r\n\r\n if (csDesigning in ComponentState) then\r\n begin\r\n Width := 400;\r\n Height := 300;\r\n end;\r\n\r\nend;\r\n\r\nprocedure TResponsiveGrid.CreateControl;\r\nbegin\r\n inherited;\r\nend;\r\n\r\ndestructor TResponsiveGrid.Destroy;\r\nbegin\r\n FOptions.Free;\r\n FItems.Free;\r\n inherited;\r\nend;\r\n\r\nfunction TResponsiveGrid.DoHttpAbort(Event: TEventListenerEvent): boolean;\r\nbegin\r\n if Assigned(OnHttpRequestError) then\r\n OnHttpRequestError(Self);\r\n Result := true;\r\nend;\r\n\r\nfunction TResponsiveGrid.DoHttpLoadCsv(Event: TEventListenerEvent): boolean;\r\nvar\r\n sl,arow,columns: TStringList;\r\n i,c: integer;\r\n itm: TResponsiveGridItem;\r\n ident,html, htmlvalue: string;\r\n req: TJSXMLHttpRequest;\r\n\r\nbegin\r\n req := TJSXMLHttpRequest(Event.target);\r\n\r\n if (req.status >= 200) and (req.status <= 208) then\r\n begin\r\n sl := TStringList.Create;\r\n sl.Text := req.responseText;\r\n\r\n arow := TStringList.Create;\r\n arow.StrictDelimiter := true;\r\n arow.Delimiter := FDelimiter;\r\n\r\n if sl.Count > 0 then\r\n begin\r\n columns := TStringList.Create;\r\n columns.StrictDelimiter := true;\r\n columns.Delimiter := FDelimiter;\r\n columns.DelimitedText := sl.Strings[0];\r\n\r\n for i := 0 to sl.Count - 1 do\r\n begin\r\n arow.DelimitedText := sl.Strings[i];\r\n\r\n if Options.ItemTemplate = '' then\r\n begin\r\n Items.Add.HTML := arow.CommaText;\r\n end\r\n else\r\n begin\r\n itm := Items.Add(' ');\r\n\r\n html := Options.ItemTemplate;\r\n\r\n ident := '(%ITEMINDEX%)';\r\n if pos(ident, html) > 0 then\r\n begin\r\n html := StringReplace(html, ident, inttostr(itm.Index), [rfReplaceAll]);\r\n end;\r\n\r\n for c := 0 to arow.Count - 1 do\r\n begin\r\n ident := '(%' + columns.Strings[c] + '%)';\r\n if Pos(ident, html) > 0 then\r\n begin\r\n htmlvalue := '';\r\n if c < arow.Count then\r\n htmlvalue := arow.Strings[c];\r\n\r\n DoItemGetFieldValue(itm.Index, columns.Strings[c], htmlvalue);\r\n html := StringReplace(html, ident, htmlvalue, [rfReplaceAll]);\r\n end;\r\n end;\r\n\r\n itm.HTML := html;\r\n\r\n DoItemCreated(itm.Index);\r\n end;\r\n end;\r\n\r\n columns.Free;\r\n end;\r\n\r\n arow.Free;\r\n sl.Free;\r\n end;\r\n\r\n Result := true;\r\nend;\r\n\r\n{$HINTS OFF}\r\nfunction TResponsiveGrid.DoHttpLoadJson(Event: TEventListenerEvent): boolean;\r\nvar\r\n J: TJSObject;\r\n JO: JSValue;\r\n JA: TJSArray;\r\n r,c: integer;\r\n arow,ident,html, htmlvalue: string;\r\n sl: TStringList;\r\n itm: TResponsiveGridItem;\r\n req: TJSXMLHttpRequest;\r\n\r\nbegin\r\n req := TJSXMLHttpRequest(Event.target);\r\n\r\n if (req.status >= 200) and (req.status <= 208) then\r\n begin\r\n Items.Clear;\r\n\r\n J := TJSJSON.parseObject(req.responseText);\r\n\r\n if FDataNode <> '' then\r\n JA := TJSArray(J.Properties[FDataNode])\r\n else\r\n JA := TJSArray(J);\r\n\r\n\r\n if Assigned(JA) then\r\n begin\r\n sl := TStringList.Create;\r\n\r\n //RowCount := JA.length + FixedRows;\r\n\r\n for r := 0 to JA.length - 1 do\r\n begin\r\n // array element\r\n JO := JA.Elements[r];\r\n\r\n c := 0;\r\n arow := '';\r\n\r\n asm\r\n var x = undefined;\r\n for (x in JO) {\r\n arow += \"|\" + x + \"=\" + JO[x];\r\n c++;\r\n }\r\n end;\r\n\r\n Delete(arow, 1, 1);\r\n sl.StrictDelimiter := true;\r\n sl.Delimiter := '|';\r\n sl.DelimitedText := arow;\r\n\r\n itm := Items.Add;\r\n itm.JSONElement := JO;\r\n\r\n if Options.ItemTemplate = '' then\r\n begin\r\n itm.HTML := sl.CommaText;\r\n end\r\n else\r\n begin\r\n html := Options.ItemTemplate;\r\n\r\n ident := '(%ITEMINDEX%)';\r\n if pos(ident, html) > 0 then\r\n begin\r\n html := StringReplace(html, ident, inttostr(itm.Index), [rfReplaceAll]);\r\n end;\r\n\r\n for c := 0 to sl.Count - 1 do\r\n begin\r\n ident := '(%' + sl.Names[c] + '%)';\r\n\r\n if Pos(ident, html) > 0 then\r\n begin\r\n htmlvalue := sl.Values[sl.Names[c]];\r\n DoItemGetFieldValue(itm.Index, sl.Names[c], htmlvalue);\r\n html := StringReplace(html, ident, htmlvalue, [rfReplaceAll]);\r\n end;\r\n end;\r\n\r\n itm.HTML := html;\r\n\r\n DoItemCreated(itm.Index);\r\n end;\r\n end;\r\n\r\n sl.Free;\r\n end;\r\n\r\n if Assigned(OnHttpRequestSuccess) then\r\n OnHttpRequestSuccess(Self);\r\n end;\r\n\r\n Result := true;\r\nend;\r\n\r\nprocedure TResponsiveGrid.DoHttpRequest(ARequest: TJSXMLHttpRequest);\r\nvar\r\n LRequestRec: TJSXMLHttpRequestRecord;\r\nbegin\r\n if Assigned(OnHttpRequest) then\r\n begin\r\n LRequestRec.req := ARequest;\r\n OnHttpRequest(Self, LRequestRec);\r\n end;\r\nend;\r\n\r\n{$HINTS ON}\r\n\r\nprocedure TResponsiveGrid.DoItemCreated(Index: integer);\r\nbegin\r\n if Assigned(OnItemCreated) then\r\n OnItemCreated(Self, Index);\r\nend;\r\n\r\nprocedure TResponsiveGrid.DoItemGetFieldValue(Index: integer;\r\n AFieldName: string; var AValue: string);\r\nbegin\r\n if Assigned(OnItemGetFieldValue) then\r\n OnItemGetFieldValue(Self, Index, AFieldName, AValue);\r\nend;\r\n\r\nprocedure TResponsiveGrid.FontChanged;\r\nbegin\r\n inherited;\r\n UpdateElement;\r\nend;\r\n\r\nfunction TResponsiveGrid.TargetIsParent(tgt,el: TJSElement): boolean;\r\nvar\r\n pe: TJSElement;\r\nbegin\r\n Result := false;\r\n pe := tgt;\r\n repeat\r\n if el = pe then\r\n begin\r\n Result := true;\r\n break;\r\n end;\r\n pe := pe.parentElement;\r\n\r\n until not Assigned(pe);\r\nend;\r\n\r\nfunction TResponsiveGrid.HandleDoClick(Event: TJSMouseEvent): Boolean;\r\nvar\r\n i: integer;\r\n el: TJSHTMLElement;\r\n LStyleName: string;\r\nbegin\r\n Result := inherited HandleDoClick(Event);\r\n\r\n if Assigned(Parent) then\r\n LStyleName := Parent.Name + '_' + Name\r\n else\r\n LStyleName := Name;\r\n\r\n for i := 0 to Items.Count - 1 do\r\n begin\r\n el := TJSHTMLElement(ListElementHandle.children.Items[i]);\r\n if Assigned(el) then\r\n begin\r\n // search HTML DIV element in list that is clicked\r\n if TargetIsParent(Event.targetElement, el) then\r\n begin\r\n FItemIndex := i;\r\n el.classList.add(LStyleName+'_Selected');\r\n HandleDoItemClick(i);\r\n end\r\n else\r\n el.classList.remove(LStyleName+'_Selected');\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TResponsiveGrid.HandleDoDblClick(Event: TJSMouseEvent): Boolean;\r\nvar\r\n i: integer;\r\n el: TJSHTMLElement;\r\nbegin\r\n Result := inherited HandleDoClick(Event);\r\n\r\n for i := 0 to Items.Count - 1 do\r\n begin\r\n el := TJSHTMLElement(ListElementHandle.children.Items[i]);\r\n\r\n if TargetIsParent(Event.targetElement, el) then\r\n begin\r\n HandleDoItemDblClick(i);\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TResponsiveGrid.HandleDoItemClick(Index: integer);\r\nbegin\r\n if Assigned(OnItemClick) then\r\n OnItemClick(Self, Index);\r\nend;\r\n\r\nprocedure TResponsiveGrid.HandleDoItemDblClick(Index: integer);\r\nbegin\r\n if Assigned(OnItemDblClick) then\r\n OnItemDblClick(Self, Index);\r\nend;\r\n\r\nfunction TResponsiveGrid.HandleDoMouseEnter(Event: TJSMouseEvent): Boolean;\r\nbegin\r\n Result := inherited HandleDoMouseEnter(Event);\r\nend;\r\n\r\nprocedure TResponsiveGrid.HandleItemAdd(Sender: TObject; Index: integer);\r\nvar\r\n el: TJSHTMLElement;\r\nbegin\r\n if Items.Items[Index].FHTML = '' then\r\n Items.Items[Index].FHTML := Options.ItemTemplate;\r\n\r\n el := TJSHTMLElement(document.createElement('DIV'));\r\n Items.Items[Index].FElementHandle := el;\r\n\r\n ListElementHandle.appendChild(el);\r\n el.innerHTML := Items.Items[Index].HTML;\r\n if Options.ItemClassName <> '' then\r\n el.setAttribute('class',Options.ItemClassName);\r\nend;\r\n\r\nprocedure TResponsiveGrid.HandleItemClear(Sender: TObject);\r\nvar\r\n i: integer;\r\nbegin\r\n for i := ListElementHandle.childElementCount - 1 downto 0 do\r\n begin\r\n ListElementHandle.removeChild(ListElementHandle.children.items[0]);\r\n end;\r\nend;\r\n\r\nprocedure TResponsiveGrid.HandleItemDelete(Sender: TObject; Index: integer);\r\nbegin\r\n if Assigned(ListElementHandle) then\r\n begin\r\n ListElementHandle.removeChild(ListElementHandle.children.Items[Index]);\r\n end;\r\nend;\r\n\r\nprocedure TResponsiveGrid.HandleItemInsert(Sender: TObject; Index: integer);\r\nvar\r\n el: TJSHTMLElement;\r\nbegin\r\n Items.Items[Index].FHTML := Options.ItemTemplate;\r\n\r\n el := TJSHTMLElement(document.createElement('DIV'));\r\n Items.Items[Index].FElementHandle := el;\r\n\r\n if Items.Count <= 1 then\r\n ListElementHandle.appendChild(el)\r\n else\r\n ListElementHandle.insertBefore(el, ListElementHandle.children.Items[Index]);\r\n\r\n el.innerHTML := Items.Items[Index].HTML;\r\n if Options.ItemClassName <> '' then\r\n el.setAttribute('class',Options.ItemClassName);\r\nend;\r\n\r\nprocedure TResponsiveGrid.HandleItemUpdate(Sender: TObject; Index: integer);\r\nvar\r\n el: TJSHTMLElement;\r\nbegin\r\n if Assigned(ListElementHandle) then\r\n begin\r\n el := TJSHTMLElement(ListElementHandle.children.Items[Index]);\r\n if not Assigned(el) then\r\n begin\r\n HandleItemInsert(Self, Index);\r\n end\r\n else\r\n el.innerHTML := Items.Items[Index].HTML;\r\n end;\r\nend;\r\n\r\nfunction TResponsiveGrid.ItemByTag(ATag: integer): TResponsiveGridItem;\r\nvar\r\n i: integer;\r\nbegin\r\n Result := nil;\r\n\r\n for I := 0 to Items.Count - 1 do\r\n begin\r\n if Items[I].Tag = ATag then\r\n begin\r\n Result := Items[I];\r\n Break;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TResponsiveGrid.ListElementHandle: TJSElement;\r\nbegin\r\n if not Assigned(FListElement) then\r\n begin\r\n FListElement := TJSHTMLElement(document.createElement('DIV'));\r\n FListElement['width'] := '100%';\r\n ElementHandle.appendChild(FListElement);\r\n Result := FListElement;\r\n end\r\n else\r\n Result := FListElement;\r\nend;\r\n\r\nprocedure TResponsiveGrid.Loaded;\r\nbegin\r\n inherited;\r\n RenderGrid;\r\nend;\r\n\r\nprocedure TResponsiveGrid.LoadFromCSV(const AURL: string; Delimiter: char = ';');\r\nbegin\r\n FDelimiter := Delimiter;\r\n\r\n FReq := TJSXMLHttpRequest.new;\r\n FReq.addEventListener('load',@DoHttpLoadCsv);\r\n FReq.addEventListener('abort',@DoHttpAbort);\r\n FReq.open('GET', AURL);\r\n DoHttpRequest(FReq);\r\n FReq.send;\r\nend;\r\n\r\nprocedure TResponsiveGrid.LoadFromJSON(const AURL: string; ADataNode: string);\r\nbegin\r\n FDataNode := ADataNode;\r\n FReq := TJSXMLHttpRequest.new;\r\n FReq.addEventListener('load',@DoHttpLoadJson);\r\n FReq.addEventListener('abort',@DoHttpAbort);\r\n FReq.open('GET', AURL);\r\n DoHttpRequest(FReq);\r\n FReq.send;\r\nend;\r\n\r\nprocedure TResponsiveGrid.OptionsChanged(Sender: TObject);\r\nbegin\r\n UpdateElement;\r\nend;\r\n\r\nprocedure TResponsiveGrid.RenderGrid;\r\nvar\r\n i: integer;\r\n el: TJSHTMLElement;\r\nbegin\r\n if (csDestroying in ComponentState) then\r\n Exit;\r\n\r\n if not Assigned(ListElementHandle) then\r\n Exit;\r\n\r\n // clear previous items\r\n while ListElementHandle.childElementCount > 0 do\r\n begin\r\n ListElementHandle.removeChild(ListElementHandle.firstChild);\r\n end;\r\n\r\n // refresh items\r\n for i := 0 to Items.Count - 1 do\r\n begin\r\n el := TJSHTMLElement(document.createElement('DIV'));\r\n Items[i].FElementHandle := el;\r\n ListElementHandle.appendChild(el);\r\n el.innerHTML := Items[i].HTML;\r\n if Options.ItemClassName <> '' then\r\n el.setAttribute('class',Options.ItemClassName);\r\n end;\r\nend;\r\n\r\nprocedure TResponsiveGrid.SetItemIndex(const Value: integer);\r\nvar\r\n el: TJSHTMLElement;\r\n i: integer;\r\n LStyleName: string;\r\nbegin\r\n FItemIndex := Value;\r\n\r\n if (csLoading in ComponentState) then\r\n Exit;\r\n\r\n if Assigned(Parent) then\r\n LStyleName := Parent.Name + '_' + Name\r\n else\r\n LStyleName := Name;\r\n\r\n for i := 0 to Items.Count - 1 do\r\n begin\r\n el := TJSHTMLElement(ListElementHandle.children.Items[i]);\r\n if (i = FItemIndex) then\r\n begin\r\n el.setAttribute('class',Options.ItemClassName + ' ' + LStyleName+'_Selected');\r\n end\r\n else\r\n el.setAttribute('class',Options.ItemClassName);\r\n end;\r\nend;\r\n\r\nprocedure TResponsiveGrid.SetItems(const Value: TResponsiveGridItems);\r\nbegin\r\n FItems.Assign(Value);\r\nend;\r\n\r\nprocedure TResponsiveGrid.SetOptions(const Value: TResponsiveGridOptions);\r\nbegin\r\n FOptions.Assign(Value);\r\nend;\r\n\r\nprocedure TResponsiveGrid.UpdateElement;\r\nconst\r\n cssimportant = ' !important; ';\r\nvar\r\n s, fs: string;\r\n ITMWIDTHMIN: string;\r\n ITMGAP: string;\r\n ITMHEIGHT: string;\r\n itemstyle, itemstylehover, itemstyleselected: string;\r\n LStyleName: string;\r\n\r\nbegin\r\n inherited;\r\n\r\n if IsUpdating then\r\n Exit;\r\n\r\n if (csLoading in ComponentState) then\r\n Exit;\r\n\r\n if Assigned(ElementHandle) then\r\n begin\r\n ITMWIDTHMIN := IntToStr(Options.ItemWidthMin);\r\n ITMHEIGHT := IntToStr(Options.ItemHeight);\r\n ITMGAP := IntToStr(Options.ItemGap);\r\n\r\n if Assigned(Parent) then\r\n LStyleName := Parent.Name + '_' + Name\r\n else\r\n LStyleName := Name;\r\n\r\n ListElementHandle.setAttribute('class', LStyleName);\r\n\r\n fs := '';\r\n\r\n if (ElementClassName = '') and (ElementFont = efProperty) then\r\n fs := CSSFont(Self.Font);\r\n\r\n itemstyle := '';\r\n itemstylehover := '';\r\n itemstyleselected := '';\r\n\r\n if Options.ItemColor <> clNone then\r\n begin\r\n itemstyle := 'background-color:'+ColorToHTML(Options.ItemColor)+';';\r\n end;\r\n\r\n if (csDesigning in ComponentState) and (Options.ItemBorderColor = clNone) then\r\n itemstyle := itemstyle + 'border: 1px dotted silver;'\r\n else if (Options.ItemBorderColor <> clNone) then\r\n itemstyle := itemstyle + 'border: 1px solid ' + ColorToHTML(Options.ItemBorderColor)+';';\r\n\r\n if Options.ItemPadding <> 0 then\r\n itemstyle := itemstyle + 'padding:' + IntToStr(Options.ItemPadding)+'px;';\r\n\r\n if Options.ItemHoverColor <> clNone then\r\n itemstylehover := 'background-color:' + ColorToHTML(Options.ItemHoverColor) + cssimportant;\r\n\r\n if Options.ItemHoverBorderColor <> clNone then\r\n itemstylehover := itemstylehover + 'border: 1px solid '+ColorToHTML(Options.ItemHoverBorderColor) + cssimportant;\r\n\r\n if Options.ItemSelectedColor <> clNone then\r\n itemstyleselected := 'background-color:' + ColorToHTML(Options.ItemSelectedColor) + cssimportant;\r\n\r\n if Options.ItemSelectedBorderColor <> clNone then\r\n itemstyleselected := itemstyleselected + 'border: 1px solid '+ColorToHTML(Options.ItemSelectedBorderColor)+';';\r\n\r\n if Options.ItemSelectedTextColor <> clNone then\r\n itemstyleselected := itemstyleselected + 'color:'+ColorToHTML(Options.ItemSelectedTextColor)+';';\r\n\r\n if Options.ScrollVertical then\r\n ElementHandle.style.removeProperty('overflow-y')\r\n else\r\n ElementHandle.style.setProperty('overflow-y','hidden');\r\n\r\n s := '.'+LStyleName+' {'+\r\n 'display: grid; grid-template-columns: repeat(auto-fill, minmax('+ ITMWIDTHMIN +'px, 1fr));'+\r\n ' grid-gap: '+ ITMGAP + 'px;'+\r\n '}' + #13\r\n + '.'+LStyleName+' > div { ' + itemstyle +'height: '+ ITMHEIGHT + 'px; ' + fs +' }'+#13\r\n + '.'+LStyleName+' > div:hover {' + itemstylehover + ' '+ fs + ' }'+#13\r\n + '.'+LStyleName+'_Selected {' + itemstyleselected + 'height: '+ ITMHEIGHT + 'px;' + fs + '}'+#13;\r\n\r\n AddInstanceStyle(LStyleName+'_style', s);\r\n end;\r\n\r\n RenderGrid;\r\nend;\r\n\r\n{ TResponsiveGridOptions }\r\n\r\nprocedure TResponsiveGridOptions.Assign(Source: TPersistent);\r\nbegin\r\n if (Source is TResponsiveGridOptions) then\r\n begin\r\n FItemWidthMin := (Source as TResponsiveGridOptions).ItemWidthMin;\r\n FItemHeight := (Source as TResponsiveGridOptions).ItemHeight;\r\n end;\r\nend;\r\n\r\nprocedure TResponsiveGridOptions.Changed;\r\nbegin\r\n if Assigned(OnChange) then\r\n OnChange(Self);\r\nend;\r\n\r\nconstructor TResponsiveGridOptions.Create;\r\nbegin\r\n inherited;\r\n FItemWidthMin := 100;\r\n FItemHeight := 100;\r\n FItemGap := 10;\r\n FScrollVertical := true;\r\n FItemColor := clNone;\r\n FItemBorderColor := clNone;\r\n FItemHoverColor := clNone;\r\n FItemHoverBorderColor := clNone;\r\n FItemSelectedColor := clNone;\r\n FItemSelectedBorderColor := clNone;\r\n FItemSelectedTextColor := clNone;\r\nend;\r\n\r\nprocedure TResponsiveGridOptions.SetItemBorderColor(const Value: TColor);\r\nbegin\r\n if (FItemBorderColor <> Value) then\r\n begin\r\n FItemBorderColor := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TResponsiveGridOptions.SetItemColor(const Value: TColor);\r\nbegin\r\n if (FItemColor <> Value) then\r\n begin\r\n FItemColor := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TResponsiveGridOptions.SetItemGap(const Value: integer);\r\nbegin\r\n if (FItemGap <> Value) then\r\n begin\r\n FItemGap := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TResponsiveGridOptions.SetItemHeight(const Value: integer);\r\nbegin\r\n if (FItemHeight <> Value) then\r\n begin\r\n FItemHeight := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TResponsiveGridOptions.SetItemHoverBorderColor(const Value: TColor);\r\nbegin\r\n if (FItemHoverBorderColor <> Value) then\r\n begin\r\n FItemHoverBorderColor := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TResponsiveGridOptions.SetItemHoverColor(const Value: TColor);\r\nbegin\r\n if (FItemHoverColor <> Value) then\r\n begin\r\n FItemHoverColor := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TResponsiveGridOptions.SetItemPadding(const Value: integer);\r\nbegin\r\n if (FItemPadding <> Value) then\r\n begin\r\n FItemPadding := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TResponsiveGridOptions.SetItemSelectedBorderColor(\r\n const Value: TColor);\r\nbegin\r\n if FItemSelectedBorderColor <> Value then\r\n begin\r\n FItemSelectedBorderColor := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TResponsiveGridOptions.SetItemSelectedColor(const Value: TColor);\r\nbegin\r\n if (FItemSelectedColor <> Value) then\r\n begin\r\n FItemSelectedColor := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TResponsiveGridOptions.SetItemSelectedTextColor(const Value: TColor);\r\nbegin\r\n if (FItemSelectedTextColor <> Value) then\r\n begin\r\n FItemSelectedTextColor := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TResponsiveGridOptions.SetItemTemplate(const Value: string);\r\nbegin\r\n if (FItemTemplate <> Value) then\r\n begin\r\n FItemTemplate := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TResponsiveGridOptions.SetItemWidthMin(const Value: integer);\r\nbegin\r\n if (FItemWidthMin <> Value) then\r\n begin\r\n FItemWidthMin := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TResponsiveGridOptions.SetScrollVertical(const Value: boolean);\r\nbegin\r\n if (FScrollVertical <> Value) then\r\n begin\r\n FScrollVertical := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\n{$HINTS ON}\r\n\r\n{ TTableControlOptions }\r\n\r\nprocedure TTableControlOptions.Assign(Source: TPersistent);\r\nbegin\r\n if (Source is TTableControlOptions) then\r\n begin\r\n FScrollVertical := (Source as TTableControlOptions).ScrollVertical;\r\n FResizeColumns := (Source as TTableControlOptions).ResizeColumns;\r\n end;\r\n\r\nend;\r\n\r\nconstructor TTableControlOptions.Create(AOwner: TCustomTableControl);\r\nbegin\r\n inherited;\r\n FOwner := AOwner;\r\nend;\r\n\r\nprocedure TTableControlOptions.SetResizeColumns(const Value: boolean);\r\nbegin\r\n FResizeColumns := Value;\r\n FOwner.EnableColResize;\r\nend;\r\n\r\n{ TStringGridHelper }\r\n\r\nprocedure TStringGridHelper.Fill(AFillType: TGridFillType; Fixed: boolean);\r\nvar\r\n r,c: integer;\r\n sr,sc: integer;\r\nbegin\r\n sr := 0;\r\n sc := 0;\r\n\r\n if not Fixed then\r\n begin\r\n sr := FixedRows;\r\n sc := FixedCols;\r\n end;\r\n\r\n\r\n for c := sc to ColCount - 1 do\r\n begin\r\n for r := sr to RowCount - 1 do\r\n begin\r\n case AFillType of\r\n gfLinear: Cells[c,r] := c.ToString+':'+r.ToString;\r\n gfRandom: Cells[c,r] := Random(100).ToString;\r\n end;\r\n\r\n end;\r\n end;\r\nend;\r\n\r\n{ TGridRange }\r\n\r\nprocedure TGridRange.Assign(Source: TPersistent);\r\nbegin\r\n if (Source is TGridRange) then\r\n begin\r\n FMax := (Source as TGridRange).Max;\r\n FMin := (Source as TGridRange).Min;\r\n FStep := (Source as TGridRange).Step;\r\n end;\r\nend;\r\n\r\nconstructor TGridRange.Create;\r\nbegin\r\n inherited;\r\n FMin := 0;\r\n FMax := 100;\r\n FStep := 1;\r\nend;\r\n\r\nend.\r\n","unit entData;\r\n\r\ninterface\r\n\r\ntype\r\n\tROCC = record\r\n \tCITYIDENT,\r\n CITYNAME: string;\r\n TAXRATE: double;\r\n end;\r\n\r\n TOCCList = class\r\n private\r\n arr: array[1..1000] of ROCC;\r\n narr, curr: integer;\r\n function gData(ndx: integer): ROCC;\r\n function gID: string;\r\n \t function gName: string;\r\n\t function gRate: double;\r\n public\r\n procedure Clear;\r\n procedure Add(id, nm: string; rat: double);\r\n procedure SetCurrentByName(nm: string);\r\n procedure SetCurrentByID(id: string);\r\n property Count: integer read narr write narr;\r\n property Data[ndx: integer]: ROCC read gData; default;\r\n property CurrentID: string read gID;\r\n property CurrentName: string read gName;\r\n property CurrentRate: double read gRate;\r\n end;\r\n\r\nvar\r\n\tOCCList: TOCCList;\r\n\r\nimplementation\r\n\r\n{ TOCCList }\r\n\r\nprocedure TOCCList.Add(id, nm: string; rat: double);\r\nbegin\r\n\tinc(narr);\r\n arr[narr].CITYIDENT := id;\r\n arr[narr].CITYNAME := nm;\r\n arr[narr].TAXRATE := rat;\r\nend;\r\n\r\nprocedure TOCCList.Clear;\r\nbegin\r\n\tnarr := 0;\r\n curr := 0;\r\nend;\r\n\r\nfunction TOCCList.gData(ndx: integer): ROCC;\r\nbegin\r\n result := arr[ndx];\r\nend;\r\n\r\nfunction TOCCList.gID: string;\r\nbegin\r\n\tresult := '';\r\n if curr > 0 then\r\n \tresult := arr[curr].CITYIDENT;\r\nend;\r\n\r\nfunction TOCCList.gName: string;\r\nbegin\r\n\tresult := '';\r\n if curr > 0 then\r\n \tresult := arr[curr].CITYNAME;\r\nend;\r\n\r\nfunction TOCCList.gRate: double;\r\nbegin\r\n\tresult := 0;\r\n if curr > 0 then\r\n \tresult := arr[curr].TAXRATE;\r\nend;\r\n\r\nprocedure TOCCList.SetCurrentByID(id: string);\r\nvar i: integer;\r\nbegin\r\n\tcurr := 0;\r\n\tfor i := 1 to narr do\r\n \tif arr[i].CITYIDENT = id then\r\n \tcurr := i;\r\nend;\r\n\r\nprocedure TOCCList.SetCurrentByName(nm: string);\r\nvar i: integer;\r\nbegin\r\n\tcurr := 0;\r\n\tfor i := 1 to narr do\r\n \tif arr[i].CITYNAME = nm then\r\n \tcurr := i;\r\nend;\r\n\r\n\r\nend.\r\n","unit TaxpayerDM;\r\n\r\ninterface\r\n\r\nuses\r\n SysUtils, Classes, JS, Web, WEBLib.Modules, Parameters;\r\n\r\ntype\r\n TTP = class\r\n private\r\n arr: TStringParams;\r\n function gAsString: string;\r\n procedure sAsString(const Value: string);\r\n function gAsCodedString: string;\r\n procedure sAsCodedString(const Value: string);\r\n function gADDR1: string;\r\n function gADDR2: string;\r\n function gAPARTMENT: string;\r\n function gCITY: string;\r\n function gEMAIL: string;\r\n function gFNAME: string;\r\n function gLASTFOUR: string;\r\n function gLNAME: string;\r\n function gMIDLI: string;\r\n function gPHONE: string;\r\n function gRESCODE: string;\r\n function gSTATE: string;\r\n function gSTNO: string;\r\n function gTPID: integer;\r\n function gZIPCODE: string;\r\n procedure setADDR1(const Value: string);\r\n procedure setADDR2(const Value: string);\r\n procedure setAPARTMENT(const Value: string);\r\n procedure setCITY(const Value: string);\r\n procedure setEMAIL(const Value: string);\r\n procedure setFNAME(const Value: string);\r\n procedure setLASTFOUR(const Value: string);\r\n procedure setLNAME(const Value: string);\r\n procedure setMIDLI(const Value: string);\r\n procedure setPHONE(const Value: string);\r\n procedure setRESCODE(const Value: string);\r\n procedure setSTATE(const Value: string);\r\n procedure setSTNO(const Value: string);\r\n procedure setTPID(const Value: integer);\r\n procedure setZIPCODE(const Value: string);\r\n function gFieldList(ndx: integer): string;\r\n function gSLASTFOUR: string;\r\n function gSFNAME: string;\r\n function gSLNAME: string;\r\n function gSMIDLI: string;\r\n function gSSSHASH: string;\r\n function gSTPID: integer;\r\n procedure setSLASTFOUR(const Value: string);\r\n procedure setSFNAME(const Value: string);\r\n procedure setSLNAME(const Value: string);\r\n procedure setSMIDLI(const Value: string);\r\n procedure setSSSHASH(const Value: string);\r\n procedure setSTPID(const Value: integer);\r\n public\r\n property TPID: integer read gTPID write setTPID;\r\n property LASTFOUR: string read gLASTFOUR write setLASTFOUR;\r\n property LNAME: string read gLNAME write setLNAME;\r\n property FNAME: string read gFNAME write setFNAME;\r\n property MIDLI: string read gMIDLI write setMIDLI;\r\n property EMAIL: string read gEMAIL write setEMAIL;\r\n property PHONE: string read gPHONE write setPHONE;\r\n property STNO: string read gSTNO write setSTNO;\r\n property ADDR1: string read gADDR1 write setADDR1;\r\n property ADDR2: string read gADDR2 write setADDR2;\r\n property CITY: string read gCITY write setCITY;\r\n property STATE: string read gSTATE write setSTATE;\r\n property ZIPCODE: string read gZIPCODE write setZIPCODE;\r\n\t property RESCODE: string read gRESCODE write setRESCODE;\r\n\t property APARTMENT: string read gAPARTMENT write setAPARTMENT;\r\n property STPID: integer read gSTPID write setSTPID;\r\n property SLASTFOUR: string read gSLASTFOUR write setSLASTFOUR;\r\n property SLNAME: string read gSLNAME write setSLNAME;\r\n property SFNAME: string read gSFNAME write setSFNAME;\r\n property SMIDLI: string read gSMIDLI write setSMIDLI;\r\n property SSSHASH: string read gSSSHASH write setSSSHASH;\r\n\r\n property FieldList[ndx: integer]: string read gFieldList; default;\r\n procedure Init;\r\n procedure ToFieldValues;\r\n procedure FromFieldValues;\r\n\t property AsString: string read gAsString write sAsString;\r\n\t property AsCodedString: string read gAsCodedString write sAsCodedString;\r\n constructor create;\r\n destructor Destroy; override;\r\n end;\r\n\r\n TdmTaxpayer = class(TDataModule)\r\n procedure WebDataModuleDestroy(Sender: TObject);\r\n procedure WebDataModuleCreate(Sender: TObject);\r\n private\r\n { Private declarations }\r\n public\r\n { Public declarations }\r\n TP: TTP;\r\n protected procedure LoadDFMValues; override; end;\r\n\r\nvar\r\n dmTaxpayer: TdmTaxpayer;\r\n\r\nimplementation\r\n\r\n{%CLASSGROUP 'Vcl.Controls.TControl'}\r\n\r\n{$R *.dfm}\r\n\r\nuses entFieldValues, ClientCurrent, ClientConnectionsDM;\r\n\r\nconst\r\n\tnumFields = 22;\r\n{\tTPFields: array[1..numFields] of string =\r\n ('TPID', 'LASTFOUR', 'LNAME', 'FNAME', 'MIDLI', 'EMAIL', 'PHONE', 'STNO',\r\n 'ADDR1', 'ADDR2', 'CITY', 'STATE', 'ZIPCODE', 'APARTMENT', 'RESCODE', 'SSHASH',\r\n 'STPID', 'SLASTFOUR', 'SLNAME', 'SFNAME', 'SMIDLI', 'SSSHASH');\r\n}\r\n\tTPLCodes: array[1..numFields] of string =\r\n ('TPID', 'TPLAST4', 'TPLNAME', 'TPFNAME', 'TPMNAME', 'TPEMAIL', 'TPPHONE', 'TPSTNO',\r\n 'TPSTRT', 'TPADDR2', 'TPCITY', 'TPSTATE', 'TPZIP', 'TPAPART', 'TPRESCODE', 'SSHASH',\r\n 'STPID', 'TSLASTFOUR', 'TSLNAME', 'TSFNAME', 'TSMNAME', 'SSSHASH');\r\n\r\n\r\nfunction TTP.gAsCodedString: string;\r\nvar i: integer;\r\nbegin\r\n\tresult := 'T|';\r\n\tfor i := 1 to numFields do begin\r\n \tif arr[i] > '' then\r\n \tresult := result + TPLCodes[i] + '=' + arr[i] + '|';\r\n end;\r\nend;\r\n\r\nfunction TTP.gAsString: string;\r\nbegin\r\n\tresult := 'T|' + arr.AsString;\r\nend;\r\n\r\nprocedure TTP.sAsCodedString(const Value: string);\r\nvar i, a: integer;\r\n\t dp: TDataPairParams;\r\n cod: string;\r\nbegin\r\n\tdp := TDataPairParams.Create(25, '|', 0, '=');\r\n dp.AsString := Value;\r\n for i := 1 to dp.nParams do begin\r\n \tcod := dp.CodeString[i];\r\n// \tdmClientConnections.SendConsoleMessage(cod + '/' + dp.Values[i]);\r\n if copy(cod, 1, 1) < 'A' then\r\n \tcod := FieldValues.LineCodeFromDesig(cod);\r\n \tif cod > '' then begin\r\n \t\tfor a := 1 to numFields do begin\r\n \tif TPLCodes[a] = cod then\r\n \t\tarr[a] := dp.Values[i];\r\n end;\r\n end;\r\n end;\r\n dp.Free;\r\nend;\r\n\r\nprocedure TTP.sAsString(const Value: string);\r\nbegin\r\n arr.AsString := copy(Value, 3, length(Value)-2);\r\nend;\r\n\r\n\r\n\r\nconstructor TTP.create;\r\nbegin\r\n\tarr := TStringParams.create(numFields+1);\r\nend;\r\n\r\ndestructor TTP.destroy;\r\nbegin\r\n arr.free;\r\n inherited;\r\nend;\r\n\r\n\r\nfunction TTP.gFieldList(ndx: integer): string;\r\nbegin\r\n\tresult := arr[ndx];\r\nend;\r\n\r\nfunction TTP.gADDR1: string; \t\tbegin\t\tresult := arr[9]; end;\r\nfunction TTP.gADDR2: string;\t\t\tbegin\t\tresult := arr[10]; end;\r\nfunction TTP.gAPARTMENT: string; \tbegin\t\tresult := arr[14]; end;\r\nfunction TTP.gCITY: string;\t\t\tbegin\t\tresult := arr[11]; end;\r\nfunction TTP.gEMAIL: string;\t\t\tbegin\t\tresult := arr[6]; end;\r\nfunction TTP.gFNAME: string;\t\t\tbegin\t\tresult := arr[4]; end;\r\nfunction TTP.gLASTFOUR: string;\r\nbegin\r\n\tresult := arr[2];\r\nend;\r\n\r\nfunction TTP.gLNAME: string;\r\nbegin\r\n\tresult := arr[3];\r\nend;\r\n\r\nfunction TTP.gMIDLI: string;\r\nbegin\r\n\tresult := arr[5];\r\nend;\r\n\r\nfunction TTP.gPHONE: string;\r\nbegin\r\n\tresult := arr[7];\r\nend;\r\n\r\nfunction TTP.gRESCODE: string;\r\nbegin\r\n\tresult := arr[15];\r\nend;\r\n\r\nfunction TTP.gSLASTFOUR: string;\r\nbegin\r\n\tresult := arr[18];\r\nend;\r\n\r\nfunction TTP.gSFNAME: string;\r\nbegin\r\n\tresult := arr[20];\r\nend;\r\n\r\nfunction TTP.gSLNAME: string;\r\nbegin\r\n\tresult := arr[19];\r\nend;\r\n\r\nfunction TTP.gSMIDLI: string;\r\nbegin\r\n\tresult := arr[21];\r\nend;\r\n\r\nfunction TTP.gSSSHASH: string;\r\nbegin\r\n\tresult := arr[22];\r\nend;\r\n\r\nfunction TTP.gSTATE: string;\r\nbegin\r\n\tresult := arr[12];\r\nend;\r\n\r\nfunction TTP.gSTNO: string;\r\nbegin\r\n\tresult := arr[8];\r\nend;\r\n\r\nfunction TTP.gSTPID: integer;\r\nbegin\r\n\tresult := arr.asInteger[17];\r\nend;\r\n\r\nfunction TTP.gTPID: integer;\r\nbegin\r\n\tresult := arr.AsInteger[1];\r\nend;\r\n\r\nfunction TTP.gZIPCODE: string;\r\nbegin\r\n\tresult := arr[13];\r\nend;\r\n\r\nprocedure TTP.Init;\r\nbegin\r\n\tarr.Clear;\r\n arr.nParams := numFields;\r\nend;\r\n\r\nprocedure TTP.setADDR1(const Value: string);\r\nbegin\r\n\tarr[9] := Value;\r\nend;\r\n\r\nprocedure TTP.setADDR2(const Value: string);\r\nbegin\r\n\tarr[10] := Value;\r\nend;\r\n\r\nprocedure TTP.setAPARTMENT(const Value: string);\r\nbegin\r\n\tarr[14] := Value;\r\nend;\r\n\r\nprocedure TTP.setCITY(const Value: string);\r\nbegin\r\n\tarr[11] := Value;\r\nend;\r\n\r\nprocedure TTP.setEMAIL(const Value: string);\r\nbegin\r\n\tarr[6] := Value;\r\nend;\r\n\r\nprocedure TTP.setFNAME(const Value: string);\r\nbegin\r\n\tarr[4] := Value;\r\nend;\r\n\r\nprocedure TTP.setLASTFOUR(const Value: string);\r\nbegin\r\n\tarr[2] := Value;\r\nend;\r\n\r\nprocedure TTP.setLNAME(const Value: string);\r\nbegin\r\n\tarr[3] := Value;\r\nend;\r\n\r\nprocedure TTP.setPHONE(const Value: string);\r\nbegin\r\n\tarr[7] := Value;\r\nend;\r\n\r\nprocedure TTP.setMIDLI(const Value: string);\r\nbegin\r\n\tarr[5] := Value;\r\nend;\r\n\r\nprocedure TTP.setRESCODE(const Value: string);\r\nbegin\r\n\tarr[15] := Value;\r\nend;\r\n\r\nprocedure TTP.setSLASTFOUR(const Value: string);\r\nbegin\r\n\tarr[18] := Value;\r\nend;\r\n\r\nprocedure TTP.setSFNAME(const Value: string);\r\nbegin\r\n\tarr[20] := Value;\r\nend;\r\n\r\nprocedure TTP.setSLNAME(const Value: string);\r\nbegin\r\n\tarr[19] := Value;\r\nend;\r\n\r\nprocedure TTP.setSMIDLI(const Value: string);\r\nbegin\r\n\tarr[21] := Value;\r\nend;\r\n\r\nprocedure TTP.setSSSHASH(const Value: string);\r\nbegin\r\n\tarr[22] := Value;\r\nend;\r\n\r\nprocedure TTP.setSTATE(const Value: string);\r\nbegin\r\n\tarr[12] := Value;\r\nend;\r\n\r\nprocedure TTP.setSTNO(const Value: string);\r\nbegin\r\n\tarr[8] := Value;\r\nend;\r\n\r\nprocedure TTP.setSTPID(const Value: integer);\r\nbegin\r\n\tarr.asInteger[17] := Value;\r\nend;\r\n\r\nprocedure TTP.setTPID(const Value: integer);\r\nbegin\r\n\tarr.asInteger[1] := Value;\r\nend;\r\n\r\nprocedure TTP.setZIPCODE(const Value: string);\r\nbegin\r\n\tarr[13] := Value;\r\nend;\r\n\r\nprocedure TTP.FromFieldValues;\r\nvar i: integer;\r\nbegin\r\n\tfor i := 1 to numFields do\r\n \tarr[i] := FieldValues.GetByLineCodeS(TPLCodes[i]);\r\n if Rescode = '' then\r\n \tRescode := BResCode\r\n else\r\n \tBResCode := Rescode;\r\n(* with FieldValues do begin\r\n \tTPID := GetByLineCodeS('TPID');\r\n \tLastFour := GetByLineCodeS('TPLAST4');\r\n \tFName := GetByLineCodeS('TPFNAME');\r\n \tMidlI := GetByLineCodeS('TPMNAME');\r\n \tLName := GetByLineCodeS('TPLNAME');\r\n \tEMail := GetByLineCodeS('TPEMAIL');\r\n \tPhone := GetByLineCodeS('TPPHONE');\r\n \tStNo := GetByLineCodeS('TPSTNO');\r\n \tAddr1 := GetByLineCodeS('TPSTRT');\r\n \tAddr2 := GetByLineCodeS('TPADDR2');\r\n \tCity := GetByLineCodeS('TPCITY');\r\n \tState := GetByLineCodeS('TPSTATE');\r\n \tZipCode := GetByLineCodeS('TPZIP');\r\n Plus4 := GetByLineCodeS('TPPLUS4');\r\n \tRescode := GetByLineCodeS('TPRESCODE');\r\n \tApartment := GetByLineCodeS('TPAPART');\r\n \tSSHash := GetByLineCodeS('SSHASH');\r\n \tSTPID := GetByLineCodeS('STPID');\r\n \tSLastFour := GetByLineCodeS('TSLAST4');\r\n \tSFName := GetByLineCodeS('TSFNAME');\r\n \tSMidlI := GetByLineCodeS('TSMNAME');\r\n \tSLName := GetByLineCodeS('TSLNAME');\r\n \tSSSHash := GetByLineCodeS('SSSHASH');\r\n*)\r\n// end;\r\nend;\r\n\r\nprocedure TTP.ToFieldValues;\r\nvar i: integer;\r\nbegin\r\n if Rescode = '' then\r\n \tRescode := BResCode\r\n else\r\n \tBResCode := Rescode;\r\n\tfor i := 1 to numFields do begin\r\n//dmClientConnections.SendConsoleMessage(TPLCodes[i] + '/' + arr[i]);\r\n \tFieldValues.SetByLineCodeS(TPLCodes[i], arr[i]);\r\n end;\r\n(* with FieldValues do begin\r\n BResCode := Rescode;\r\n \tSetByLineCodeS('TPRESCODE', Rescode);\r\n \tSetByLineCodeS('TPFNAME', FName);\r\n \tSetByLineCodeS('TPMNAME', MidlI);\r\n \tSetByLineCodeS('TPLNAME', LName);\r\n \tSetByLineCodeS('TSFNAME', SFName);\r\n \tSetByLineCodeS('TSMNAME', SMidlI);\r\n \tSetByLineCodeS('TSLNAME', SLName);\r\n \tSetByLineCodeS('TPSTNO', StNo);\r\n \tSetByLineCodeS('TPSTRT', Addr1);\r\n \tSetByLineCodeS('TPAPART', Apartment);\r\n \tSetByLineCodeS('TPADDR2', Addr2);\r\n \tSetByLineCodeS('TPCITY', City);\r\n \tSetByLineCodeS('TPSTATE', State);\r\n \tSetByLineCodeS('TPZIP', ZipCode);\r\n \tSetByLineCodeS('TPEMAIL', EMail);\r\n \tSetByLineCodeS('TPPHONE', Phone);\r\n end;\r\n*)\r\nend;\r\n\r\n{ TdmTaxpayer }\r\n\r\nprocedure TdmTaxpayer.WebDataModuleCreate(Sender: TObject);\r\nbegin\r\n\tTP := TTP.create;\r\nend;\r\n\r\nprocedure TdmTaxpayer.WebDataModuleDestroy(Sender: TObject);\r\nbegin\r\n\tTP.Free;\r\nend;\r\n\r\nprocedure TdmTaxpayer.LoadDFMValues;\r\nbegin\r\n inherited LoadDFMValues;\r\n\r\n\r\n try\r\n Name := 'dmTaxpayer';\r\n SetEvent(Self, 'OnCreate', 'WebDataModuleCreate');\r\n SetEvent(Self, 'OnDestroy', 'WebDataModuleDestroy');\r\n Height := 150;\r\n Width := 215;\r\n finally\r\n end;\r\nend;\r\n\r\nend.\r\n","unit entFieldValues;\r\n\r\ninterface\r\n\r\nuses SysUtils, Parameters, WEBLib.Dialogs;\r\n\r\nconst\r\n MAXVARS = 50;\r\n\r\ntype\r\n TFLDVALUE = class\r\n\tprivate\r\n function gBoolean: Boolean;\r\n function gCurrency: currency;\r\n function gDate: TDate;\r\n function gDateTime: TDateTime;\r\n function gFloat: double;\r\n function gInteger: integer;\r\n procedure sBoolean(const Value: Boolean);\r\n procedure sCurrency(const Value: currency);\r\n procedure sDate(const Value: TDate);\r\n procedure sDateTime(const Value: TDateTime);\r\n procedure sFloat(const Value: double);\r\n procedure sInteger(const Value: integer);\r\n function gFormatted: string;\r\n procedure sFormatted(const Value: string);\r\n public\r\n fFLDVALUE, fFormat: string;\r\n function FormattedStored: string;\r\n function AnyValue: boolean;\r\n procedure ClearValue;\r\n\r\n\t property AsString: string read fFldValue write fFldValue;\r\n property AsInteger: integer read gInteger write sInteger;\r\n property AsFloat: double read gFloat write sFloat;\r\n property AsCurrency: currency read gCurrency write sCurrency;\r\n property AsDate: TDate read gDate write sDate;\r\n property AsDateTime: TDateTime read gDateTime write sDateTime;\r\n property AsBoolean: Boolean read gBoolean write sBoolean;\r\n property Formatted: string read gFormatted write sFormatted;\r\n end;\r\n\r\n TFIELDVALUE = class\r\n private\r\n public\r\n WEBFIELDID: integer;\r\n WEBFORMID: integer;\r\n WEBGROUPID: integer;\r\n LINETYPE: string;\r\n GROUPINDEX: integer;\r\n SUBINDEX: integer;\r\n ControlIndex: integer;\r\n GroupEditControl: integer;\r\n TAGCODE: string;\r\n LINECODE: string;\r\n VERIFY: string;\r\n CALCED: boolean;\r\n WRITEOUT: Boolean;\r\n FIELDVALUE: TFldValue;\r\n function DataPair(indexes: boolean=true): string;\r\n function AsString: string;\r\n function AsShortString: string;\r\n constructor Create;\toverload;\r\n constructor Create(pWEBFIELDID, pWEBFORMID, pWEBGROUPID, pGROUPINDEX, pSUBINDEX, pControlIndex: integer; pLINETYPE, pLINECODE, pTAGCODE, pFieldValue: string; pCalced, pWriteOut: boolean); overload;\r\n destructor Destroy; override;\r\n end;\r\n\r\n TFIELDVALUES = class\r\n private\r\n \tarr: array of TFieldValue;\r\n nValues, nMaxValues: integer;\r\n function gValue(index: integer): TFieldValue;\r\n procedure sMaxValues(const Value: integer);\r\n procedure sValue(index: integer; const Value: TFieldValue);\r\n function gFldValue(index: integer): TFLDVALUE;\r\n procedure sFldValue(index: integer; const Value: TFLDVALUE);\r\n public\r\n function FindIndex(fm, gpndx, subndx, fld: integer): integer;\r\n function FindOrAdd(fm, gpndx, subndx, fldndx: integer): integer;\r\n function FindReplaceOrAdd(fm, gpndx, subndx, fldndx: integer; val: string): integer;\r\n function GetValue(fm, gpndx, subndx, fld: integer): String;\r\n\t\tfunction GetValueByDesig(myfld: string): string;\r\n function LineCodeFromDesig(desig: string): string;\r\n function IndexOfDesig(desig: string): integer;\r\n function GetTotal(fm, gpndx, fld: integer): string;\r\n\t\tprocedure ClearControlTags;\r\n\t\tprocedure ClearEntryTags;\r\n procedure ClearData;\r\n function Add(pWEBFIELDID, pWEBFORMID, pWEBGROUPID, pGROUPINDEX, pSUBINDEX, pControlIndex: integer;\r\n \t pLINETYPE, pLINECODE, pTAGCODE, pFieldValue: string; pCalced, pWriteOut: boolean): integer;\r\n function GetLineData(linetype: string; gpndx, subndx: integer): string;\r\n function GroupCount(fm, gp: integer): integer;\r\n function MaxGroupIndex(gp: integer): integer;\r\n function MaxGroupIndexByCode(sLineCode: string): integer;\r\n function MaxSubIndex(gp, gpndx: integer): integer;\r\n function GetAllLineTypes(exc: string): string;\r\n\r\n procedure DeleteOneMultGroup(gp, gpndx: integer);\r\n function FindIndexByLineCode(sLineCode: string; gpndx, subndx: integer; CreateNewIndex: boolean=true): integer;\r\n function FindGroupIndexByLineCode(sLineCode: string; val: string): integer;\r\n procedure SetByLineCodeS(sLineCode, Value: string; gpndx: integer=0; subndx: integer=0);\r\n function SetByLineCodeV(sLineCode: string; Value: double; gpndx: integer=0; subndx: integer=0): integer;\r\n procedure SetByLineCodeI(sLineCode: string; Value: integer; gpndx: integer=0; subndx: integer=0);\r\n function GetByLineCodeS(sLineCode: string; gpndx: integer=0; subndx: integer=0): string;\r\n function GetByLineCodeV(sLineCode: string; gpndx: integer=0; subndx: integer=0): double;\r\n function GetByLineCodeI(sLineCode: string; gpndx: integer=0; subndx: integer=0): integer;\r\n function LineCodeExists(sLineCode: string): boolean;\r\n property MaxCount: integer read nMaxValues write sMaxValues;\r\n property Count: integer read nValues;\r\n\t property FldValues[index: integer]: TFieldValue read gValue write sValue; default;\r\n property FieldValue[index: integer]: TFLDVALUE read gFldValue write sFldValue;\r\n procedure DebugShowAll(title: string='');\r\n\r\n procedure SetToControls;\r\n procedure SetEntryControls;\r\n\r\n \t constructor Create(mx: integer=50);\t\toverload;\r\n destructor Destroy; override;\r\n end;\r\n\r\n TLINECODEVARS = class\r\n \tprivate\r\n \tfvars: array[1..MAXVARS] of TFLDVALUE;\r\n fflds, ftyps: array[1..MAXVARS] of string;\r\n nvars: integer;\r\n// function gVars(index: integer): TFldValue;\r\n// procedure sVars(index: integer; const Value: TFldValue);\r\n public\r\n{ TaxYear,\r\n \t FileType,\r\n ResCode,\r\n PayCode,\r\n PayType,\r\n BalanceDueStatus\r\n \t\t\t\t: string;\r\n PYCredit,\r\n EstSum,\r\n BalanceDue\r\n \t: currency;\r\n}\r\n\t\tprocedure AddVar(nm, typ, val: string);\r\n procedure SetByLineCode(lcode, val: string);\t\t\toverload;\r\n procedure SetByLineCode(lcode: string; val: double);\t\t\toverload;\r\n// procedure SetByLineCodeList(lclist: string);\r\n procedure SetAllByLineCode;\t\t// from FieldValues\r\n procedure AllToFieldValues;\r\n function LineCodeString(lcode: string): string;\r\n function LineCodeAmount(lcode: string): currency;\r\n function AllToDataPairString(linetype: string): string;\r\n procedure LoadDataPairString(dps: string);\r\n procedure LoadDataPairParams(dpparms: TDataPairParams);\r\n// property Vars[index: integer]: TFldValue read gVars write sVars;\t\tdefault;\r\n property Count: integer read nVars;\r\n constructor Create;\r\n destructor Destroy; override;\r\n end;\r\n\r\nvar\r\n FieldValues: TFieldValues;\r\n LineCodeVars: TLineCodeVars;\r\n\r\nimplementation\r\n\r\nuses entForms, OptionsDM, SectionPanels, Formulas, ClientCurrent,\r\n\tVerification, FieldPanelFactory, ClientConnectionsDM;\r\n\r\n{ TWEBFIELDVALUE }\r\n\r\nfunction TFIELDVALUE.AsShortString: string;\r\nbegin\r\n\tresult := format('%d:%d:%d:%d|%d:%d|%s|%s',\r\n \t[WebFormID, WebGroupID, GroupIndex, WebFieldID,\r\n ControlIndex, GroupEditControl, TAGCODE, FIELDVALUE.asString]);\r\nend;\r\n\r\nfunction TFIELDVALUE.AsString: string;\r\nbegin\r\n\tresult := format('%d:%d:%d:%d:%d|%d:%d|%s:%s:%s|%s',\r\n \t[WebFormID, WebGroupID, GroupIndex, SubIndex, WebFieldID,\r\n ControlIndex, GroupEditControl, LINETYPE, TAGCODE, LINECODE, FIELDVALUE.asString]);\r\nend;\r\n\r\nconstructor TFIELDVALUE.Create(pWEBFIELDID, pWEBFORMID, pWEBGROUPID,\r\n pGROUPINDEX, pSUBINDEX, pControlIndex: integer; pLINETYPE, pLINECODE, pTAGCODE, pFieldValue: string;\r\n pCalced, pWriteOut: boolean);\r\nbegin\r\n\tinherited create;\r\n FieldValue := TFldValue.create;\r\n\r\n WEBFORMID := pWEBFORMID;\r\n WEBFIELDID := pWEBFIELDID;\r\n WEBGROUPID := pWEBGROUPID;\r\n GROUPINDEX := pGROUPINDEX;\r\n SUBINDEX := pSUBINDEX;\r\n LINETYPE := pLINETYPE;\r\n TAGCODE := pTAGCODE;\r\n LINECODE := pLINECODE;\r\n ControlIndex := pControlIndex;\r\n GroupEditControl := -1;\r\n\tCALCED := pCalced;\r\n WRITEOUT := pWriteOut;\r\n FIELDVALUE.AsString := pFieldValue;\r\n FIELDVALUE.fFormat := GetFieldFormat(WEBFORMID, WEBFIELDID);\r\nend;\r\n\r\nfunction TFIELDVALUE.DataPair(indexes: boolean=true): string;\r\n\r\n\tfunction Translate(val: string): string;\r\n begin\r\n \tresult := val;\r\n if uppercase(val) = '1ST QTR ESTIMATE' then result := 'EST Q1'\r\n else if uppercase(val) = '2ND QTR ESTIMATE' then result := 'EST Q2'\r\n else if uppercase(val) = '3RD QTR ESTIMATE' then result := 'EST Q3'\r\n else if uppercase(val) = '4TH QTR ESTIMATE' then result := 'EST Q4';\r\n end;\r\n\r\nbegin\r\n\tif not indexes and (LineCode > '') then\r\n \tresult := LineCode // dont want linecodes for multgroups\r\n else\r\n\t\tresult := inttostr(WebFormID) + '.' + inttostr(WebFieldID);\r\n if indexes and (GroupIndex > 0) then begin\r\n result := result + '.' + inttostr(GroupIndex);\r\n\t if SubIndex > 0 then\r\n \t result := result + '.' + inttostr(SubIndex);\r\n end;\r\n result := result + '=' + Translate(FieldValue.fFldValue);\r\nend;\r\n\r\ndestructor TFIELDVALUE.Destroy;\r\nbegin\r\n\tFieldValue.free;\r\n inherited;\r\nend;\r\n\r\nconstructor TFIELDVALUE.Create;\r\nbegin\r\n\tinherited create;\r\n FieldValue := TFldValue.create;\r\n WEBFORMID := 0;\r\n WEBFIELDID := 0;\r\n WEBGROUPID := 0;\r\n GROUPINDEX := 0;\r\n SUBINDEX := 0;\r\n TAGCODE := '';\r\n LINECODE := '';\r\n ControlIndex := -1;\r\n GroupEditControl := -1;\r\n CALCED := false;\r\n WRITEOUT := false;\r\n FIELDVALUE.AsString := '';\r\nend;\r\n\r\nfunction TFLDVALUE.AnyValue: boolean;\r\nvar i: integer;\r\n\t zero: boolean;\r\n v: string;\r\nbegin\r\n\tresult := (fFLDVALUE > '');\r\n if result then begin\r\n \t// result false if equal to zero\r\n zero := true;\r\n for i := 1 to length(fFldValue) do begin\r\n \tv := copy(fFldValue, i, 1);\r\n \tif pos(v, '0.,$') = 0 then zero := false;\r\n end;\r\n if zero then\r\n \tresult := false;\r\n end;\r\nend;\r\n\r\nprocedure TFLDVALUE.ClearValue;\r\nbegin\r\n\tfFLDVALUE := '';\r\nend;\r\n\r\nfunction TFLDVALUE.FormattedStored: string;\r\nvar s: string;\r\nbegin\r\n\ts := gFormatted;\r\n sFormatted(s);\r\n result := fFldValue;\r\nend;\r\n\r\nfunction TFldValue.gBoolean: Boolean;\r\nbegin\r\n\tresult := (fFldValue = '') or (fFldValue = 'Y') or (fFldValue = 'T');\r\nend;\r\n\r\nfunction TFldValue.gCurrency: currency;\r\nvar s: string;\r\nbegin\r\n\tif fFldValue = '' then result := 0\r\n else if pos(copy(fFldValue, 1, 1), '0123456789.-') = 0 then result := 0\r\n\telse begin\r\n \ts := fFldValue;\r\n if pos('.', s) = 0 then s := s + '.00';\r\n \tresult := strtofloat(s);\r\n end;\r\nend;\r\n\r\nfunction TFldValue.gDate: TDate;\r\nbegin\r\n\tif fFldValue = '' then result := 0\r\n\telse result := strtodate(fFldValue);\r\nend;\r\n\r\nfunction TFldValue.gDateTime: TDateTime;\r\nbegin\r\n\tif fFldValue = '' then result := 0\r\n\telse result := strtodatetime(fFldValue);\r\nend;\r\n\r\nfunction TFldValue.gFloat: double;\r\nbegin\r\n\tif fFldValue = '' then result := 0\r\n\telse result := strtofloat(fFldValue);\r\nend;\r\n\r\nfunction TFLDVALUE.gFormatted: string;\r\nvar s, f1: string;\r\n\r\n\tfunction LFormatDate: string;\r\n begin\r\n \ttry\r\n\t \tresult := formatdatetime(fFormat, strtodate(s));\r\n except\r\n \tresult := '';\r\n end;\r\n end;\r\n\r\n function LFormatString: string;\r\n var digits: integer;\r\n\r\n \tfunction ClearStr(str: string): string;\r\n var i: integer;\r\n begin\r\n \tresult := '';\r\n \tfor i := 1 to length(str) do\r\n \tif (str[i] >= '0') and (str[i] <= '9') then\r\n \tresult := result + str[i];\r\n end;\r\n\r\n begin\r\n \t// SF: FEIN format\r\n // SS: SSN format\r\n if (fFormat = 'SF') then begin\r\n \ts := ClearStr(s);\r\n if length(s) > 2 then\r\n \ts := copy(s, 1, 2) + '-' + copy(s, 3, length(s)-2);\r\n end\r\n else if (fFormat = 'SS') then begin\r\n \ts := ClearStr(s);\r\n if length(s) > 5 then\r\n \ts := copy(s, 1, 3) + '-' + copy(s, 3, 2) + '-' + copy(s, 6, length(s)-5);\r\n end\r\n else if fFormat = 'SP' then begin\t// Phone\r\n \ts := ClearStr(s);\r\n if length(s) > 7 then\r\n \ts := '(' + copy(s, 1, 3) + ')' + copy(s, 4, 3) + '-' + copy(s, 7, length(s)-6)\r\n else if s > '' then\r\n \ts := copy(s, 1, 3) + '-' + copy(s, 4, length(s)-3);\r\n end\r\n else if copy(fFormat, 1, 2) = 'ZF' then begin\t// Zero-Fill\r\n \tdigits := strtointdef(copy(fFormat, 3, length(fFormat)-2), 0);\r\n if digits > 0 then begin\r\n \tif length(s) < digits then\r\n \ts := copy('0000000000', 1, digits-length(s)) + s;\r\n end;\r\n end;\r\n result := s;\r\n end;\r\n\r\n\tfunction LFormatNumber: string;\r\n var sfmt, fmt, decs, sign: string;\r\n \t val: double;\r\n i: integer;\r\n begin\r\n \ttry\r\n \tval := strtofloatdef(fFldValue, 0);\r\n sfmt := 'f';\r\n decs := '2';\r\n sign := '';\r\n for i := 1 to length(fFormat) do begin\r\n \tif fFormat[i] = 'C' then\r\n \t\tsfmt := 'n'\r\n else if fFormat[i] = '$' then\r\n \tsign := '$'\r\n else if fFormat[i] = 'Z' then begin\r\n \tval := round(val);\r\n decs := '2';\r\n end\r\n else if fFormat[i] = 'W' then begin\t// whole dollar\r\n \tval := round(val);\r\n decs := '0';\r\n end\r\n else\r\n \tdecs := fFormat[i];\r\n end;\r\n fmt := sign + '%.' + decs + sfmt;\r\n result := format(fmt, [val]);\r\n except\r\n \tresult := s;\r\n end;\r\n end;\r\n\r\nbegin\r\n\ts := fFldValue;\r\n if (fFormat > '') and (copy(fFormat, 1, 1) <> 'P') then begin // Print Form Only\r\n // Numbers: 0 or 2, $, C(ommas):\r\n // Dates: MM/DD/YYYY, etc\r\n f1 := copy(fFormat, 1, 1);\r\n if pos(f1, 'YMDH') > 0 then result := LFormatDate\r\n else if f1 = 'S' then result := LFormatString\r\n else result := LFormatNumber;\r\n end\r\n else\r\n \tresult := s;\r\nend;\r\n\r\nfunction TFldValue.gInteger: integer;\r\nbegin\r\n\tif fFldValue = '' then result := 0\r\n\telse result := strtoint(fFldValue);\r\nend;\r\n\r\nprocedure TFldValue.sBoolean(const Value: Boolean);\r\nbegin\r\n\tfFldValue := 'N';\r\n if Value then\r\n \tfFldValue := 'Y';\r\nend;\r\n\r\nprocedure TFldValue.sCurrency(const Value: currency);\r\nvar p: integer;\r\nbegin\r\n\tfFldValue := currtostr(value);\r\n p := pos('.', fFldValue);\r\n if p = 0 then fFldValue := fFldValue + '.00'\r\n else if p = length(fFldValue) then fFldValue := fFldValue + '00'\r\n else if p = length(fFldValue)-1 then fFldValue := fFldValue + '0'\r\n else if p < length(fFldValue)-2 then fFldValue := copy(fFldValue, 1, p+2);\r\nend;\r\n\r\nprocedure TFldValue.sDate(const Value: TDate);\r\nbegin\r\n\ttry\r\n\t\tfFldValue := datetostr(value);\r\n except\r\n \tfFldValue := '';\r\n end;\r\nend;\r\n\r\nprocedure TFldValue.sDateTime(const Value: TDateTime);\r\nbegin\r\n\tfFldValue := datetimetostr(value);\r\nend;\r\n\r\nprocedure TFldValue.sFloat(const Value: double);\r\nbegin\r\n\tfFldValue := floattostr(value);\r\nend;\r\n\r\nprocedure TFLDVALUE.sFormatted(const Value: string);\r\nvar s, f1: string;\r\n\r\n\tfunction LFormatDate: string;\r\n var dt: TDate;\r\n begin\r\n \tif value = '' then result := ''\r\n else\r\n try\r\n \tdt := strtodate(value);\r\n result := datetostr(dt);\r\n except\r\n \tresult := '';\r\n if copy(Value, 5, 1) = '-' then\r\n result := copy(value, 6, 2) + '/' + copy(value, 9, 2) + '/' + copy(value, 1, 4);\r\n end;\r\n end;\r\n\r\n function LFormatString: string;\r\n var str: string;\r\n \t \r\n function NumsOnly: string;\r\n var i: integer;\r\n begin\r\n result := '';\r\n for i := 1 to length(s) do\r\n \tif (s[i] >= '0') and (s[i] <= '9') then\r\n \tresult := result + s[i];\r\n end;\r\n\r\n begin\r\n \t// SF: FEIN format\r\n // SS: SSN format\r\n if (fFormat = 'SF') or (fFormat = 'SS') then begin\r\n \t// store internal as number only\r\n result := NumsOnly;\r\n end\r\n else if (fFormat = 'SP') then begin\r\n \tstr := NumsOnly;\r\n if length(str) = 7 then\r\n \tstr := copy(str, 1, 3) + '-' + copy(str, 4, 4)\r\n else if length(str) = 10 then\r\n \tstr := '(' + copy(str, 1, 3) + ')' + copy(str, 4, 3) + '-' + copy(str, 7, 4);\r\n result := str;\r\n end;\r\n end;\r\n\r\n\tfunction LFormatNumber: string;\r\n var i: integer;\r\n begin\r\n \t// just strip everything but number, period, negative sign\r\n result := '';\r\n for i := 1 to length(s) do begin\r\n if pos(s[i], '0123456789.-') > 0 then\r\n result := result + s[i];\r\n end;\r\n end;\r\n\r\nbegin\r\n\ts := Value;\r\n if fFormat > '' then begin\r\n // Numbers: 0 or 2, $, C(ommas):\r\n // Dates: MM/DD/YYYY, etc\r\n f1 := copy(fFormat, 1, 1);\r\n if pos(f1, 'YMDH') > 0 then s := LFormatDate\r\n else if f1 = 'S' then s := LFormatString\r\n else s := LFormatNumber;\r\n end;\r\n fFldValue := s;\r\nend;\r\n\r\nprocedure TFldValue.sInteger(const Value: integer);\r\nbegin\r\n\tfFldValue := inttostr(value);\r\nend;\r\n\r\n\r\nfunction TFIELDVALUES.Add(pWEBFIELDID, pWEBFORMID, pWEBGROUPID, pGROUPINDEX,\r\n pSUBINDEX, pControlIndex: integer; pLINETYPE, pLINECODE, pTAGCODE, pFieldValue: string; pCalced, pWriteOut: boolean): integer;\r\nvar fv: TFieldValue;\r\nbegin\r\n fv := TFieldValue.create(pWEBFIELDID, pWEBFORMID, pWEBGROUPID, pGROUPINDEX, pSUBINDEX, pCONTROLINDEX,\r\n \t pLINETYPE, pLINECODE, pTAGCODE, pFieldValue, pCalced, pWriteOut);\r\n if nValues >= nMaxValues then begin\r\n \tnMaxValues := nMaxValues + 10;\r\n \tSetLength(arr, nMaxValues);\r\n end;\r\n FieldValues[nValues] := fv;\r\n result := nValues;\r\n inc(nValues);\r\nend;\r\n\r\nprocedure TFIELDVALUES.ClearControlTags;\r\nvar i: integer;\r\nbegin\r\n\tfor i := 0 to nValues-1 do begin\r\n \tFieldValues[i].ControlIndex := -1;\r\n \tFieldValues[i].GroupEditControl := -1;\r\n end;\r\nend;\r\n\r\nprocedure TFIELDVALUES.ClearData;\r\nvar i: integer;\r\nbegin\r\n//\tShowMessage('ClearData');\r\n\tfor i := 0 to nValues-1 do begin\r\n \tFieldValues[i].FieldValue.ClearValue;\r\n end;\r\nend;\r\n\r\nprocedure TFIELDVALUES.ClearEntryTags;\r\nvar i: integer;\r\nbegin\r\n\tfor i := 0 to nValues-1 do begin\r\n \tFieldValues[i].GroupEditControl := -1;\r\n end;\r\nend;\r\n\r\nconstructor TFIELDVALUES.Create(mx: integer=50);\r\nbegin\r\n\tnMaxValues := mx;\r\n\tSetLength(arr, nMaxValues);\r\n\r\n inherited Create;\r\nend;\r\n\r\nprocedure TFIELDVALUES.DebugShowAll(title: string='');\r\nvar i: integer;\r\n\t s, msg: string;\r\n\r\n function IncludeIt: boolean;\r\n// var lc: string;\r\n begin\r\n \tresult := false;\r\n// lc := arr[i].LineCode;\r\n// if (copy(lc, 1, 2) = 'TP') then\r\n\t\tif (arr[i].WebGroupID = 1) and\t\t// W2 information\r\n \t\t(arr[i].FieldValue.asString > '') then\r\n \tresult := true;\r\n end;\r\n\r\nbegin\r\n\tif title = '' then title := 'Field Values';\r\n\tmsg := '_=============' + title + '===============_';\r\n\tfor i := 0 to nValues-1 do begin\r\n \tif IncludeIt then begin\r\n\t \ts := arr[i].AsString;\r\n \t if s > '' then\r\n \t\tmsg := msg + inttostr(i) + ': ' + s + '_';\r\n end;\r\n end;\r\n\tif msg = '' then msg := 'None Found';\r\n\tmsg := msg + '============================_';\r\n{ for i := 0 to nValues-1 do begin\r\n \tif (arr[i].ControlIndex >= 0) then\r\n \tmsg := msg + inttostr(i) + ' ' + inttostr(arr[i].WebFieldID) + ' ' +\r\n \t inttostr(FieldControls[arr[i].ControlIndex].CtrlType) + ':' + arr[i].asString + '_';\r\n end;\r\n\tmsg := msg + '============================_';\r\n}\r\n dmClientConnections.SendConsoleMessage(msg);\r\nend;\r\n\r\nprocedure TFIELDVALUES.DeleteOneMultGroup(gp, gpndx: integer);\r\nvar i, mxndx, cnt, newnum, nxt: integer;\r\nbegin\r\n\tmxndx := -1;\r\n cnt := 0;\r\n\tfor i := 0 to nValues-1 do begin\r\n \tif gp = arr[i].WebGroupID then begin\r\n \tif gpndx = arr[i].GroupIndex then begin\r\n \t// wipe it out\r\n inc(cnt);\r\n arr[i].GroupIndex := -99;\r\n end\r\n else if gpndx < arr[i].GroupIndex then begin\r\n \t// set index one lower\r\n if arr[i].GroupIndex > mxndx then\r\n \tmxndx := arr[i].GroupIndex;\r\n end;\r\n end;\r\n end;\r\n newnum := nValues - cnt;\r\n nxt := 0;\r\n\tfor i := 0 to nValues-1 do begin\r\n \tif (gp = arr[i].WebGroupID) and (arr[i].GroupIndex = -99) then begin\r\n \t// skip it\r\n end\r\n else begin\r\n \tif nxt <> i then begin\r\n \t//copydown to nxt\r\n arr[nxt].WEBFIELDID := arr[i].WEBFIELDID;\r\n arr[nxt].WEBGROUPID := arr[i].WEBGROUPID;\r\n arr[nxt].LINETYPE := arr[i].LINETYPE;\r\n arr[nxt].GROUPINDEX := arr[i].GROUPINDEX-1;\r\n arr[nxt].SUBINDEX := arr[i].SUBINDEX;\r\n arr[nxt].ControlIndex := arr[i].ControlIndex;\r\n arr[nxt].GroupEditControl := arr[i].GroupEditControl;\r\n arr[nxt].TAGCODE := arr[i].TAGCODE;\r\n arr[nxt].LINECODE := arr[i].LINECODE;\r\n arr[nxt].CALCED := arr[i].CALCED;\r\n arr[nxt].FIELDVALUE.asString := arr[i].FIELDVALUE.asString;\r\n end;\r\n \tinc(nxt);\r\n end;\r\n\tend;\r\n nValues := newnum;\r\n // Redraw?\r\n{ // ?? DeletePanelAndControls;\r\n for i := 0 to nWebGroups-1 do\r\n \tif (WebGroups[i].WebGroupID) and\r\n RemoveGroupPanel(gpndx);\r\n}\r\nend;\r\n\r\ndestructor TFIELDVALUES.Destroy;\r\nbegin\r\n\tSetLength(arr, 0);\r\n inherited;\r\nend;\r\n\r\nfunction TFIELDVALUES.FindGroupIndexByLineCode(sLineCode, val: string): integer;\r\nvar i, mx: integer;\r\n\t s: string;\r\nbegin\r\n\tresult := 0;\r\n mx := MaxGroupIndexByCode(sLineCode);\r\n i := 0;\r\n repeat\r\n inc(i);\r\n \ts := GetByLineCodeS(sLineCode, i);\r\n \tif (s = val) then\r\n \tresult := i;\r\n until (result > 0) or (i >= mx);\r\nend;\r\n\r\nfunction TFieldValues.FindIndex(fm, gpndx, subndx, fld: integer): integer;\r\nvar i, mx, f, fl, gn, sn: integer;\r\nbegin\r\n\tresult := -1;\r\n mx := nValues;\r\n i := 0;\r\n while (result < 0) and (i < mx) do with arr[i] do begin\r\n \tf := WebFormID;\r\n fl := WebFieldID;\r\n gn := GroupIndex;\r\n sn := SubIndex;\r\n \tif (f = fm) and (fl = fld) then begin\r\n \t// deal with group index and sub index\r\n if (result < 0) and (gpndx = gn) and (subndx = sn) then\r\n \t\tresult := i;\r\n end;\r\n inc(i);\r\n end;\r\nend;\r\n\r\nfunction TFieldValues.FindIndexByLineCode(sLineCode: string; gpndx, subndx: integer; CreateNewIndex: boolean=true): integer;\r\nvar i, mx, {f, fl,} gn, sn, hold: integer;\r\n\t lc: string;\r\nbegin\r\n\tresult := -1;\r\n mx := nValues;\r\n i := 0;\r\n hold := -1;\r\n while (result < 0) and (i < mx) do with arr[i] do begin\r\n// \tf := WebFormID;\r\n// fl := WebFieldID;\r\n gn := GroupIndex;\r\n sn := SubIndex;\r\n lc := LineCode;\r\n \tif (lc = sLineCode) then begin\r\n \t// deal with group index and sub index\r\n \tif (gn = 0) then hold := i;\r\n if (result < 0) and (gpndx = gn) and (subndx = sn) then\r\n \t\tresult := i;\r\n end;\r\n inc(i);\r\n end;\r\n if CreateNewIndex and (result < 0) and (hold >= 0) then begin\r\n//\t\tdmClientConnections.SendConsoleMessage('Adding ' + sLineCode + inttostr(gpndx));\r\n \twith arr[hold] do\r\n \tresult := self.Add(WEBFIELDID, WEBFORMID, WEBGROUPID, gpndx, subndx, -1, LINETYPE, LINECODE, TAGCODE, '', CALCED, WRITEOUT);\r\n end;\r\nend;\r\n\r\nfunction TFIELDVALUES.FindReplaceOrAdd(fm, gpndx, subndx, fldndx: integer; val: string): integer;\r\nvar fv: integer;\r\nbegin\r\n fv := FindOrAdd(fm, gpndx, subndx, fldndx);\r\n if fv >= 0 then\r\n \tFieldValues[fv].FieldValue.AsString := val;\r\n result := fv;\r\nend;\r\n\r\nfunction TFIELDVALUES.FindOrAdd(fm, gpndx, subndx, fldndx: integer): integer;\r\nvar fv: integer;\r\nbegin\r\n fv := FindIndex(fm, gpndx, subndx, WebFields[fldndx].WebFieldID);\r\n if fv < 0 then with WebFields[fldndx] do begin\r\n fv := Add(WEBFIELDID, WEBFORMID, WEBGROUPID, gpndx, subndx, -1, LINETYPE, LINECODE, TAGCODE, '', (RETURNCALC='Y'), WRITEOUT);\r\n end;\r\n result := fv;\r\nend;\r\n\r\nfunction TFieldValues.GroupCount(fm, gp: integer): integer;\r\nvar i: integer;\r\nbegin\r\n\tresult := 0;\r\n for i := 0 to Count-1 do with arr[i] do begin\r\n \tif (WebFormID = fm) and (WebGroupID = gp) then begin\r\n \t// deal with group index?? All??\r\n if (result < GroupIndex) then\r\n \t\tresult := GroupIndex;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TFIELDVALUES.gValue(index: integer): TFieldValue;\r\nbegin\r\n\tresult := arr[index];\r\nend;\r\n\r\nfunction TFIELDVALUES.IndexOfDesig(desig: string): integer;\r\nvar fm, fld, fldndx: integer;\r\n parm: TStringParams;\r\nbegin\r\n // expecting fm.Fld or fm.fld.G where G says sum all for any groupindex\r\n // or fm.fld.S where S says suma all for any SubIndex for current GroupIndex\r\n // or LINECODE\r\n parm := TStringParams.create(10, '.');\r\n parm.asString := desig;\r\n fm := parm.asInteger[1];\r\n fld := parm.asInteger[2];\r\n fldndx := FindFieldsIndex(fm, fld);\r\n result := fldndx;\r\n parm.free;\r\nend;\r\n\r\nfunction TFIELDVALUES.MaxGroupIndex(gp: integer): integer;\r\nvar fv: integer;\r\nbegin\r\n\tresult := 0;\r\n for fv := 0 to nValues-1 do with arr[fv] do begin\r\n \tif (WEBGROUPID = gp) and (GROUPINDEX > result) then\r\n \tresult := GROUPINDEX;\r\n end;\r\nend;\r\n\r\nfunction TFIELDVALUES.MaxGroupIndexByCode(sLineCode: string): integer;\r\nvar fv: integer;\r\nbegin\r\n\tresult := 0;\r\n for fv := 0 to nValues-1 do with arr[fv] do begin\r\n \tif (sLineCode = LineCode) and (GROUPINDEX > result) then\r\n \tresult := GROUPINDEX;\r\n end;\r\nend;\r\n\r\nfunction TFIELDVALUES.MaxSubIndex(gp, gpndx: integer): integer;\r\nvar fv: integer;\r\nbegin\r\n\tresult := 0;\r\n for fv := 0 to nValues-1 do with arr[fv] do begin\r\n \tif (WEBGROUPID = gp) and (GROUPINDEX = gpndx) and (SUBINDEX > result) then\r\n \tresult := SUBINDEX;\r\n end;\r\nend;\r\n\r\nprocedure TFIELDVALUES.SetByLineCodeI(sLineCode: string; Value: integer; gpndx: integer=0; subndx: integer=0);\r\nvar fv: integer;\r\nbegin\r\n\tfv := FindIndexByLineCode(sLineCode, gpndx, subndx);\r\n if fv >= 0 then\r\n \tarr[fv].FieldValue.asInteger := value;\r\n{ for fv := 0 to nValues-1 do begin\r\n \tif arr[fv].LineCode = sLineCode then\r\n \tarr[fv].FieldValue.asInteger := value;\r\n end;\r\n}\r\nend;\r\n\r\nprocedure TFIELDVALUES.SetByLineCodeS(sLineCode, Value: string; gpndx: integer=0; subndx: integer=0);\r\nvar fv: integer;\r\nbegin\r\n\tfv := FindIndexByLineCode(sLineCode, gpndx, subndx);\r\n if fv >= 0 then\r\n \tarr[fv].FieldValue.asString := value;\r\n{ for fv := 0 to nValues-1 do begin\r\n \tif (arr[fv].LineCode = sLineCode) and (gpndx = 0) or then\r\n \tarr[fv].FieldValue.asString := value;\r\n end;\r\n}\r\nend;\r\n\r\nfunction TFIELDVALUES.SetByLineCodeV(sLineCode: string; Value: double; gpndx: integer=0; subndx: integer=0): integer;\r\nvar fv: integer;\r\nbegin\r\n\tfv := FindIndexByLineCode(sLineCode, gpndx, subndx);\r\n if fv >= 0 then\r\n \tarr[fv].FieldValue.asFloat := value;\r\n result := fv;\r\n{ for fv := 0 to nValues-1 do begin\r\n \tif arr[fv].LineCode = sLineCode then\r\n \tarr[fv].FieldValue.asFloat := value;\r\n end;\r\n}\r\nend;\r\n\r\nfunction TFIELDVALUES.LineCodeExists(sLineCode: string): boolean;\r\nvar fv: integer;\r\nbegin\r\n\tresult := false;\r\n for fv := 0 to nValues-1 do begin\r\n \tif arr[fv].LineCode = sLineCode then\r\n \tresult := true;\r\n end;\r\nend;\r\n\r\nfunction TFIELDVALUES.LineCodeFromDesig(desig: string): string;\r\nvar fldndx: integer;\r\nbegin\r\n // expecting fm.Fld or fm.fld.G where G says sum all for any groupindex\r\n // or fm.fld.S where S says suma all for any SubIndex for current GroupIndex\r\n // or LINECODE\r\n result := '';\r\n fldndx := IndexOfDesig(desig);\r\n if fldndx >= 0 then\r\n \tresult := arr[fldndx].linecode;\r\nend;\r\n\r\nprocedure TFIELDVALUES.SetEntryControls;\r\nvar fv, nControl: integer;\r\n\t CurrControl: TWPanelControl;\r\nbegin\r\n for fv := 0 to nValues-1 do begin\r\n \tnControl := arr[fv].GroupEditControl;\r\n \tif (nControl >= 0) then begin\r\n \tCurrControl := GroupHandlers.CurrentHandler.EntryControls[nControl];\r\n CurrControl.FieldValueToControl(fv);\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TFIELDVALUES.SetToControls;\r\nvar fv: integer;\r\nbegin\r\n for fv := 0 to nValues-1 do begin\r\n \tif (arr[fv].ControlIndex >= 0) then\r\n \tFieldControls[arr[fv].ControlIndex].FieldValueToControl(fv);\r\n end;\r\nend;\r\n\r\nprocedure TFIELDVALUES.sFldValue(index: integer; const Value: TFLDVALUE);\r\nbegin\r\n\tarr[index].FieldValue := Value;\r\nend;\r\n\r\nprocedure TFIELDVALUES.sMaxValues(const Value: integer);\r\nbegin\r\n\tnMaxValues := value;\r\n SetLength(arr, nMaxValues);\r\nend;\r\n\r\nprocedure TFIELDVALUES.sValue(index: integer; const Value: TFieldValue);\r\nbegin\r\n\tarr[index] := Value;\r\nend;\r\n\r\nfunction TFieldValues.GetTotal(fm, gpndx, fld: integer): string;\r\nvar i: integer;\r\n\t lfv: TFldValue;\r\nbegin\r\n\t// gpndx = -1 -> add all of this field\r\n // gpndx > 0 -> add all subindex but this gpndx\r\n // otherwise, just get the one value\t: this is value for gpindex 0 so still works by matching groupindex\r\n\tlfv := TFldValue.create;\r\n lfv.AsCurrency := 0;\r\n for i := 0 to FieldValues.Count-1 do with arr[i] do begin\r\n \tif (WebFormID = fm) and (WebFieldID = fld) then begin\r\n \t// deal with group index?? All??\r\n if (gpndx = GroupIndex) or ((gpndx < 0) and (GroupIndex > 0)) then// dont include any 0 index in a multgroup\r\n \t\tlfv.AsCurrency := lfv.AsCurrency + FieldValue.AsCurrency;\r\n end;\r\n end;\r\n result := lfv.AsString;\r\n lfv.free;\r\nend;\r\n\r\nfunction TFIELDVALUES.GetValue(fm, gpndx, subndx, fld: integer): String;\r\nvar ndx: integer;\r\nbegin\r\n result := '';\r\n\tndx := FindIndex(fm, gpndx, subndx, fld);\r\n if ndx >= 0 then\r\n\t\tresult := arr[ndx].FieldValue.AsString;\r\nend;\r\n\r\nfunction TFIELDVALUES.GetValueByDesig(myfld: string): string;\r\nvar fm, gpndx, subndx, fld, fldndx: integer;\r\n parm: TStringParams;\r\nbegin\r\n // expecting fm.Fld or fm.fld.G where G says sum all for any groupindex\r\n // or fm.fld.S where S says suma all for any SubIndex for current GroupIndex\r\n // or LINECODE\r\n result := '';\r\n gpndx := 0;\r\n subndx := 0;\r\n parm := TStringParams.create(10, '.');\r\n parm.asString := myfld;\r\n fm := parm.asInteger[1];\r\n fld := parm.asInteger[2];\r\n fldndx := FindFieldsIndex(fm, fld);\r\n if (parm.nParams = 2) and (WebFields[fldndx].WebGroupID > 0) then begin\r\n\t gpndx := CurrentGroupIndex;\r\n \tsubndx := CurrentSubIndex;\r\n end;\r\n result := GetValue(fm, gpndx, subndx, fld);\r\n parm.free;\r\nend;\r\n\r\nfunction TFIELDVALUES.gFldValue(index: integer): TFLDVALUE;\r\nbegin\r\n\tresult := arr[index].FieldValue;\r\nend;\r\n\r\nfunction TFIELDVALUES.GetAllLineTypes(exc: string): string;\r\nvar i: integer;\r\n ltyp: string;\r\nbegin\r\n result := '';\r\n for i := 0 to FieldValues.Count-1 do begin\r\n ltyp := FieldValues[i].LineType;\r\n if (pos(ltyp, exc) = 0) and (pos(ltyp, result) = 0) then\r\n result := result + ltyp;\r\n end;\r\nend;\r\n\r\nfunction TFIELDVALUES.GetByLineCodeS(sLineCode: string; gpndx: integer=0; subndx: integer=0): string;\r\nvar fv: integer;\r\nbegin\r\n\tresult := '';\r\n\tfv := FindIndexByLineCode(sLineCode, gpndx, subndx);\r\n if fv >= 0 then\r\n \tresult := arr[fv].FieldValue.asString;\r\n{ for fv := 0 to nValues-1 do begin\r\n \tif arr[fv].LineCode = sLineCode then\r\n \tresult := arr[fv].FieldValue.asString;\r\n end;\r\n}\r\nend;\r\n\r\nfunction TFIELDVALUES.GetByLineCodeI(sLineCode: string; gpndx: integer=0; subndx: integer=0): integer;\r\nvar fv: integer;\r\nbegin\r\n\tresult := 0;\r\n\tfv := FindIndexByLineCode(sLineCode, gpndx, subndx);\r\n if fv >= 0 then\r\n \tresult := arr[fv].FieldValue.asInteger;\r\n{ for fv := 0 to nValues-1 do begin\r\n \tif arr[fv].LineCode = sLineCode then\r\n \tresult := arr[fv].FieldValue.asInteger;\r\n end;\r\n}\r\nend;\r\n\r\nfunction TFIELDVALUES.GetByLineCodeV(sLineCode: string; gpndx: integer=0; subndx: integer=0): double;\r\nvar fv: integer;\r\nbegin\r\n\tresult := 0;\r\n\tfv := FindIndexByLineCode(sLineCode, gpndx, subndx);\r\n if fv >= 0 then\r\n \tresult := arr[fv].FieldValue.asFloat;\r\n{ for fv := 0 to nValues-1 do begin\r\n \tif arr[fv].LineCode = sLineCode then\r\n \tresult := arr[fv].FieldValue.asFloat;\r\n end;\r\n}\r\nend;\r\n\r\nfunction TFIELDVALUES.GetLineData(linetype: string; gpndx, subndx: integer): string;\r\nvar fv: integer;\r\n\r\n\tfunction IncludeIt: boolean;\r\n var ltype: string;\r\n begin\r\n \twith arr[fv] do begin\r\n ltype := GetFieldLineType(WebFormID, WebFieldID, WebGroupID);\r\n result := (ltype = linetype) and (gpndx = GroupIndex) and (subndx = SUBINDEX);\r\n end;\r\n end;\r\n\r\n function FVDataPair: string;\r\n begin\r\n \twith arr[fv] do begin\r\n\t\t\tresult := inttostr(WebFormID) + '.' + inttostr(WebFieldID);\r\n if gpndx > 0 then result := result + '.' + inttostr(gpndx);\r\n if subndx > 0 then result := result + '.' + inttostr(subndx);\r\n result := result + '=' + arr[fv].FieldValue.asString;\r\n end;\r\n end;\r\n\r\nbegin\r\n\tresult := '';\r\n\tfor fv := 0 to nValues-1 do begin\r\n \tif (arr[fv].FieldValue.asString > '') and IncludeIt then begin\r\n \tresult := result + FVDataPair + '|';\r\n end;\r\n end;\r\nend;\r\n\r\n\r\n{ TLINECODEVARS }\r\n\r\nprocedure TLINECODEVARS.AddVar(nm, typ, val: string);\r\nbegin\r\n\tinc(nvars);\r\n fflds[nvars] := nm;\r\n fvars[nvars].asString := val;\r\n ftyps[nvars] := typ;\r\nend;\r\n\r\nfunction TLINECODEVARS.AllToDataPairString(linetype: string): string;\r\nvar i: integer;\r\nbegin\r\n\tresult := '';\r\n for i := 1 to nvars do begin\r\n if (ftyps[i] = linetype) and (fvars[i].AnyValue) then\r\n result := result + fflds[i] + '=' + fvars[i].asString + '|';\r\n end;\r\n{ AddToResult('TYEAR', TaxYear);\r\n AddToResult('FILETYPE', FileType);\r\n AddToResult('RESCODE', ResCode);\r\n AddToResult('PAYCODE', PayCode);\r\n AddToResult('PAYTYPE', PayType);\r\n}\r\nend;\r\n\r\nprocedure TLINECODEVARS.AllToFieldValues;\r\nvar i: integer;\r\n lcod: string;\r\nbegin\r\n for i := 0 to FieldValues.Count-1 do begin\r\n lCod := FieldValues[i].LineCode;\r\n if lCod > ' ' then\r\n\t FieldValues[i].FieldValue.asString := LineCodeVars.LineCodeString(lcod);\r\n end;\r\nend;\r\n\r\nconstructor TLINECODEVARS.Create;\r\nvar i: integer;\r\n\t //m, d, y: word;\r\nbegin\r\n\tfor i := 1 to MAXVARS do\r\n \tfvars[i] := TFldValue.create;\r\n\tnvars := 0;\r\n{ decodedate(date, y, m, d);\r\n AddVar('YEAR', 'R', inttostr(y-1));\r\n AddVar('FILETYPE', 'R', '');\r\n AddVar('RESCODE', 'R', '');\r\n AddVar('PAYCODE', 'P', '');\r\n AddVar('PAYTYPE', 'P', '');\r\n AddVar('BALDUESTAT', 'R', '');\r\n AddVar('CPYCRED', 'R', '');\r\n AddVar('CESTSUM', 'R', '');\r\n AddVar('CBALDUE', 'R', '');\r\n\r\n AddVar('PSSN', 'T', '');\r\n AddVar('PACCOUNT', 'T', '');\r\n AddVar('PLAST', 'T', '');\r\n AddVar('PFIRST', 'T', '');\r\n AddVar('PMIDDLE', 'T', '');\r\n AddVar('PFULL', 'T', '');\r\n AddVar('PDOB', 'T', '');\r\n AddVar('EMAIL', 'T', '');\r\n AddVar('PHONE', 'T', '');\r\n AddVar('SSSN', 'T', '');\r\n AddVar('SACCOUNT', 'T', '');\r\n AddVar('SLAST', 'T', '');\r\n AddVar('SFIRST', 'T', '');\r\n AddVar('SMIDDLE', 'T', '');\r\n AddVar('SFULL', 'T', '');\r\n AddVar('SDOB', 'T', '');\r\n AddVar('STNO', 'T', '');\r\n AddVar('ADDR1', 'T', '');\r\n AddVar('ADDR2', 'T', '');\r\n AddVar('APART', 'T', '');\r\n AddVar('CITY', 'T', '');\r\n AddVar('STATE', 'T', '');\r\n AddVar('ZIP', 'T', '');\r\n AddVar('FORNCOUNTRY', 'T', '');\r\n AddVar('FORNPROVINCE', 'T', '');\r\n AddVar('FORNZIP', 'T', '');\r\n}\r\nend;\r\n\r\ndestructor TLINECODEVARS.Destroy;\r\nvar i: integer;\r\nbegin\r\n\tfor i := 1 to MAXVARS do\r\n \tfvars[i].free;\r\n\r\n inherited;\r\nend;\r\n\r\n{\r\nfunction TLINECODEVARS.gVars(index: integer): TFldValue;\r\nbegin\r\n\r\nend;\r\n}\r\n\r\nprocedure TLINECODEVARS.SetAllByLineCode;\r\nvar i: integer;\r\n lcod: string;\r\nbegin\r\n for i := 0 to FieldValues.Count-1 do begin\r\n lCod := FieldValues[i].LineCode;\r\n if lCod > ' ' then\r\n\t LineCodeVars.SetByLineCode(lcod, FieldValues[i].FieldValue.asString);\r\n end;\r\nend;\r\n\r\nfunction TLINECODEVARS.LineCodeAmount(lcode: string): currency;\r\nvar uplcode: string;\r\n\t i: integer;\r\n c: currency;\r\nbegin\r\n\tuplcode := uppercase(lcode);\r\n result := 0;\r\n if uplcode = 'TAXRATE' then\r\n \tresult := dmOptions.TaxRate\r\n else for i := 1 to nvars do begin\r\n if fflds[i] = uplcode then begin\r\n \tresult := fvars[i].asCurrency;\r\n end;\r\n end;\r\n if FieldValues <> nil then begin\r\n\t for i := 0 to FieldValues.Count-1 do\r\n \t\tif FieldValues[i].Linecode = uplcode then begin\r\n \tc := FieldValues[i].FieldValue.asCurrency;\r\n \t\tResult := c;\r\n end;\r\n end;\r\n if uplcode = 'FORWARD' then\r\n \tresult := BPrevYrCr\r\n else if uplcode = 'ESTSUM' then\r\n \tresult := BEstSum;\r\n{ if uplcode = 'CBALDUE' then\r\n \tresult := BalanceDue;\r\n}\r\nend;\r\n\r\nfunction TLINECODEVARS.LineCodeString(lcode: string): string;\r\nvar uplcode: string;\r\n\t i: integer;\r\n\r\n function StatusDesc: string;\r\n begin\r\n if CurrentStatus = 'SS' then result := 'Return Submitted'\r\n else if CurrentStatus = 'SV' then result := 'Resume: Return Not Submitted'\r\n else if CurrentStatus = 'AA' then result := 'Resume: Return Not Submitted'\r\n else if CurrentStatus = 'SM' then result := 'Paper Mail-In'\r\n else if CurrentStatus = 'SP' then result := 'Return Processed'\r\n else if CurrentStatus = 'SR' then result := 'Return under Review'\r\n else if CurrentStatus = 'PF' then result := 'Filed by Preparer'\r\n else if CurrentStatus = 'PC' then result := 'Preparer In Process'\r\n else if CurrentStatus = 'PD' then result := 'Preparer In Process'\r\n else if CurrentStatus = 'PP' then result := 'Processed'\r\n else if CurrentStatus = 'OF' then result := 'Filed Online'\r\n else if CurrentStatus = 'OC' then result := 'Submitted and In Process'\r\n else if CurrentStatus = 'OD' then result := 'Submitted and In Process'\r\n else if CurrentStatus = 'OP' then result := 'Processed'\r\n \telse if CurrentStatus = 'AF' then result := 'Not Yet Submitted'\r\n else if CurrentStatus = 'WY' then result := 'End of Year Submitted'\r\n else if CurrentStatus = '3C' then result := 'End of Year In Process'\r\n else if CurrentStatus = 'YS' then result := 'End of Year In Process'\r\n else if CurrentStatus = 'W3' then result := 'End of Year Processed'\r\n else if CurrentStatus = 'WP' then result := 'Periods Submitted'\r\n else if CurrentStatus = '4C' then result := 'Periods In Process'\r\n else if CurrentStatus = 'W4' then result := 'Periods In Process'\r\n \telse result := 'Not Yet Submitted (' + CurrentStatus + ')';\r\n end;\r\n\r\nbegin\r\n\tuplcode := uppercase(lcode);\r\n result := '';\r\n if uplcode = 'TRANSNO' then\r\n \tresult := inttostr(CurrentTransaction)\r\n else if uplcode = 'RETID' then\r\n \tresult := inttostr(CurrentReturnID)\r\n else if uplcode = 'TPID' then\r\n \tresult := inttostr(CurrentTaxpayerID)\r\n else if uplcode = 'ACCESSSTATUS' then\r\n \tresult := CurrentStatus\r\n else if uplcode = 'STATUSDESC' then\r\n \tresult := StatusDesc\r\n else if uplcode = 'TAXYEAR' then begin\r\n \tif CurrentTPType <> 'W' then result := CurrentTaxYear\r\n else result := CurrentWHYear;\r\n\tend\r\n else if uplcode = 'TAXRATE' then\r\n \tresult := floattostr(dmOptions.TaxRate)\r\n else if uplcode = 'RESCODE' then begin\r\n \tresult := BResCode;\r\n if result = '' then result := 'R';\r\n end\r\n else if uplcode = 'FILETYPE' then begin\r\n \tresult := BFileType;\r\n if result = '' then result := 'I';\r\n end\r\n else if uplcode = 'FORWARD' then\r\n \tresult := format('%.2f', [BPrevYrCr])\r\n else if uplcode = 'ESTSUM' then\r\n \tresult := format('%.2f', [BEstSum])\r\n else for i := 1 to nvars do begin\r\n if fflds[i] = uplcode then begin\r\n \tresult := fvars[i].asString;\r\n end;\r\n end;\r\n if FieldValues <> nil then begin\r\n for i := 0 to FieldValues.Count-1 do\r\n if FieldValues[i].Linecode = uplcode then\r\n Result := FieldValues[i].FieldValue.asString;\r\n end;\r\nend;\r\n\r\nprocedure TLINECODEVARS.LoadDataPairString(dps: string);\r\nvar dpparms: TDataPairParams;\r\n\t i: integer;\r\nbegin\r\n\tdpparms := TDataPairParams.create(500, '|', 0, '=');\r\n dpparms.asString := dps;\r\n for i := 1 to dpparms.nParams do begin\r\n\t\tSetByLineCode(dpparms.CodeString[i], dpparms.Values[i]);\r\n end;\r\n dpparms.free;\r\nend;\r\n\r\nprocedure TLINECODEVARS.LoadDataPairParams(dpparms: TDataPairParams);\r\nvar i: integer;\r\nbegin\r\n for i := 1 to dpparms.nParams do begin\r\n\t\tSetByLineCode(dpparms.CodeString[i], dpparms.Values[i]);\r\n end;\r\nend;\r\n\r\nprocedure TLINECODEVARS.SetByLineCode(lcode: string; val: double);\r\nvar uplcode: string;\r\n\t i: integer;\r\nbegin\r\n\tuplcode := uppercase(lcode);\r\n for i := 1 to nvars do begin\r\n if fflds[i] = uplcode then begin\r\n \tfvars[i].asCurrency := val;\r\n end;\r\n end;\r\n if FieldValues <> nil then begin\r\n for i := 0 to FieldValues.Count-1 do\r\n if FieldValues[i].Linecode = uplcode then\r\n FieldValues[i].FieldValue.asFloat := val;\r\n end;\r\nend;\r\n\r\nprocedure TLINECODEVARS.SetByLineCode(lcode, val: string);\r\nvar uplcode: string;\r\n\t i: integer;\r\nbegin\r\n\tif lcode > '' then begin\r\n uplcode := uppercase(lcode);\r\n if uplcode = 'TRANSNO' then\r\n CurrentTransaction := strtointdef(val, 0)\r\n else if uplcode = 'RETID' then\r\n CurrentReturnID := strtointdef(val, 0)\r\n else if uplcode = 'TPID' then\r\n CurrentTaxpayerID := strtointdef(val, 0)\r\n else if uplcode = 'ACCESSTOKEN' then\r\n CurrentToken := val\r\n else if uplcode = 'ACCESSSTATUS' then\r\n CurrentStatus := val\r\n else for i := 1 to nvars do begin\r\n if fflds[i] = uplcode then begin\r\n fvars[i].asString := val;\r\n end;\r\n end;\r\n\t if FieldValues <> nil then begin\r\n\t\t for i := 0 to FieldValues.Count-1 do\r\n \t\t\tif FieldValues[i].Linecode = uplcode then\r\n \t\t\tFieldValues[i].FieldValue.asString := val;\r\n end;\r\n end;\r\nend;\r\n\r\n\r\nend.\r\n","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright (c) 2018 - 2020 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.EditAutocomplete;\r\n\r\n{$modeswitch externalclass}\r\n\r\n{$DEFINE NOPP}\r\n\r\ninterface\r\n\r\nuses\r\n Classes, SysUtils, Types, WEBLib.Controls, WEBLib.StdCtrls, WEBLib.Graphics,\r\n Web, JS;\r\n\r\ntype\r\n TEditAutoCompleteLookupType = (ltFirstCharacter, ltAnywhere);\r\n\r\n TEditAutoCompleteRenderItemEventArgs = class(TPersistent)\r\n private\r\n FItemElement: TJSHTMLElement;\r\n FItemIndex: Integer;\r\n public\r\n property ItemIndex: Integer read FItemIndex write FItemIndex;\r\n property ItemElement: TJSHTMLElement read FItemElement write FItemElement;\r\n end;\r\n\r\n TEditAutoCompleteRenderItemEvent = procedure(Sender: TObject; Args: TEditAutoCompleteRenderItemEventArgs) of object;\r\n\r\n TEditAutoCompleteSelectEventArgs = class(TPersistent)\r\n private\r\n FItemIndex: Integer;\r\n public\r\n property ItemIndex: Integer read FItemIndex write FItemIndex;\r\n end;\r\n\r\n TEditAutoCompleteSelectEvent = procedure(Sender: TObject; Args: TEditAutoCompleteSelectEventArgs) of object;\r\n\r\n TEditAutoComplete = class(TCustomInput)\r\n private\r\n FText: string;\r\n FItemIndex: Integer;\r\n FItems: TStringList;\r\n FPopupHeight: Integer;\r\n FActiveItemClassName: string;\r\n FPopupClassName: string;\r\n FItemClassName: string;\r\n FOnRenderItem: TEditAutoCompleteRenderItemEvent;\r\n FOnSelect: TEditAutoCompleteSelectEvent;\r\n FTextHint: string;\r\n FReadOnly: boolean;\r\n FCharCase: TEditCharCase;\r\n FOnChange: TNotifyEvent;\r\n FLookupCaseSensitive: Boolean;\r\n FlookupMinLength: Integer;\r\n FLookupType: TEditAutoCompleteLookupType;\r\n procedure AddScript(Script: string);\r\n function GetText: string;\r\n procedure SetText(const Value: string);\r\n procedure SetItems(const Value: TStringList);\r\n function GetItemIndex: Integer;\r\n procedure SetItemIndex(const Value: Integer);\r\n procedure SetPopupHeight(const Value: Integer);\r\n procedure SetActiveItemClassName(const Value: string);\r\n procedure SetItemClassName(const Value: string);\r\n procedure SetPopupClassName(const Value: string);\r\n procedure SetTextHint(const Value: string);\r\n procedure SetReadOnly(const Value: boolean);\r\n procedure SetCharcase(const Value: TEditCharCase);\r\n function GetElementInputHandle: TJSHTMLInputElement;\r\n procedure SetLookupCaseSensitive(const Value: Boolean);\r\n procedure SetLookupMinLength(const Value: Integer);\r\n procedure SetLookupType(const Value: TEditAutoCompleteLookupType);\r\n protected\r\n function CreateElement: TJSElement; override;\r\n procedure UpdateElement; override;\r\n procedure BindEvents; override;\r\n function HandleRenderItem(Item: TJSHTMLElement; Index: Integer): TJSHTMLElement;\r\n function HandleSelect(Index: Integer): Boolean;\r\n function HandleDoChange(Event: TJSMouseEvent): Boolean; virtual;\r\n public\r\n procedure CreateInitialize; override;\r\n destructor Destroy; override;\r\n procedure SetFocus; override;\r\n property ElementInputHandle: TJSHTMLInputElement read GetElementInputHandle;\r\n procedure Change; virtual;\r\n procedure Refresh; virtual;\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property BorderStyle;\r\n property Color;\r\n property CharCase: TEditCharCase read FCharCase write SetCharcase default wecNormal;\r\n property ElementClassName;\r\n property ElementID;\r\n property ElementFont;\r\n property ElementPosition;\r\n property Enabled;\r\n property Font;\r\n property Height;\r\n property HeightPercent;\r\n property HeightStyle;\r\n property Hint;\r\n property Left;\r\n property Margins;\r\n property ReadOnly: boolean read FReadOnly write SetReadOnly default False;\r\n property ShowFocus;\r\n property ShowHint;\r\n property TextHint: string read FTextHint write SetTextHint;\r\n property TabStop;\r\n property TabOrder;\r\n property Visible;\r\n property Width;\r\n property WidthPercent;\r\n property WidthStyle;\r\n property OnChange: TNotifyEvent read FOnChange write FOnChange;\r\n property OnClick;\r\n property OnDblClick;\r\n property OnKeyDown;\r\n property OnKeyPress;\r\n property OnKeyUp;\r\n property OnMouseDown;\r\n property OnMouseUp;\r\n property OnMouseMove;\r\n property OnMouseLeave;\r\n property OnMouseEnter;\r\n property OnEnter;\r\n property OnExit;\r\n\r\n property Items: TStringList read FItems write SetItems;\r\n property ItemIndex: Integer read GetItemIndex write SetItemIndex default -1;\r\n property Text: string read GetText write SetText;\r\n property PopupHeight: Integer read FPopupHeight write SetPopupHeight default 0;\r\n property PopupClassName: string read FPopupClassName write SetPopupClassName;\r\n property ItemClassName: string read FItemClassName write SetItemClassName;\r\n property ActiveItemClassName: string read FActiveItemClassName write SetActiveItemClassName;\r\n property LookupType: TEditAutoCompleteLookupType read FLookupType write SetLookupType default ltFirstCharacter;\r\n property LookupCaseSensitive: Boolean read FLookupCaseSensitive write SetLookupCaseSensitive default False;\r\n property LookupMinLength: Integer read FlookupMinLength write SetLookupMinLength default 1;\r\n\r\n property OnRenderItem: TEditAutoCompleteRenderItemEvent read FOnRenderItem write FOnRenderItem;\r\n property OnSelect: TEditAutoCompleteSelectEvent read FOnSelect write FOnSelect;\r\n end;\r\n\r\n TWebEditAutoComplete = class(TEditAutoComplete);\r\n\r\nimplementation\r\n\r\n\r\n{ TEditAutoComplete }\r\n\r\nprocedure TEditAutoComplete.BindEvents;\r\nvar\r\n eh: TJSEventTarget;\r\nbegin\r\n if Assigned(ElementInputHandle) then\r\n begin\r\n eh := ElementInputHandle;\r\n\r\n eh.addEventListener('change',@HandleDoChange);\r\n eh.addEventListener('click',@HandleDoClick);\r\n eh.addEventListener('dblclick',@HandleDoDblClick);\r\n eh.addEventListener('mousedown',@HandleDoMouseDown);\r\n eh.addEventListener('mouseup',@HandleDoMouseUp);\r\n eh.addEventListener('mousemove',@HandleDoMouseMove);\r\n eh.addEventListener('mouseleave',@HandleDoMouseLeave);\r\n eh.addEventListener('mouseenter',@HandleDoMouseEnter);\r\n eh.addEventListener('keydown',@HandleDoKeyDown);\r\n eh.addEventListener('keyup',@HandleDoKeyUp);\r\n eh.addEventListener('keypress',@HandleDoKeyPress);\r\n eh.addEventListener('focus',@HandleDoEnter);\r\n eh.addEventListener('blur',@HandleDoExit);\r\n end;\r\nend;\r\n\r\nprocedure TEditAutoComplete.Change;\r\nbegin\r\n if Assigned(ElementHandle) then\r\n FText := ElementInputHandle.value;\r\n\r\n if Assigned(OnChange) then\r\n OnChange(Self);\r\nend;\r\n\r\nfunction TEditAutoComplete.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('DIV');\r\nend;\r\n\r\nprocedure TEditAutoComplete.CreateInitialize;\r\nbegin\r\n FItems := TStringList.Create;\r\n FText := '';\r\n FItemIndex := -1;\r\n FPopupHeight := 0;\r\n FPopupClassName := '';\r\n FItemClassName := '';\r\n FActiveItemClassName := '';\r\n FLookupType := ltFirstCharacter;\r\n FLookupMinLength := 1;\r\n FLookupCaseSensitive := False;\r\n\r\n inherited;\r\n\r\n TabStop := True;\r\n ReadOnly := False;\r\n ElementFont := efProperty;\r\n CharCase := wecNormal;\r\n Width := 121;\r\n Height := 25;\r\nend;\r\n\r\ndestructor TEditAutoComplete.Destroy;\r\nbegin\r\n FItems.Free;\r\n inherited;\r\nend;\r\n\r\nfunction TEditAutoComplete.GetElementInputHandle: TJSHTMLInputElement;\r\nbegin\r\n Result := TJSHTMLInputElement(ElementHandle.childNodes[0]);\r\nend;\r\n\r\nfunction TEditAutoComplete.GetItemIndex: Integer;\r\nbegin\r\n Result := FItemIndex;\r\n\r\n if not Assigned(ElementHandle) then\r\n Exit;\r\n\r\n Result := Items.IndexOf(Text);\r\nend;\r\n\r\nfunction TEditAutoComplete.GetText: string;\r\nvar\r\n input: TJSHTMLInputElement;\r\nbegin\r\n Result := FText;\r\n\r\n if not Assigned(ElementHandle) then\r\n Exit;\r\n\r\n input := TJSHTMLInputElement(ElementHandle.childNodes[0]);\r\n if Assigned(input) then\r\n Result := input.value;\r\nend;\r\n\r\nfunction TEditAutoComplete.HandleDoChange(Event: TJSMouseEvent): Boolean;\r\nbegin\r\n Change;\r\n Result := True;\r\nend;\r\n\r\nfunction TEditAutoComplete.HandleRenderItem(Item: TJSHTMLElement; Index: Integer): TJSHTMLElement;\r\nvar\r\n Args: TEditAutoCompleteRenderItemEventArgs;\r\nbegin\r\n if Assigned(OnRenderItem) then\r\n begin\r\n Args := TEditAutoCompleteRenderItemEventArgs.Create;\r\n Args.ItemElement := Item;\r\n Args.ItemIndex := Index;\r\n OnRenderItem(Self, Args);\r\n Args.Free;\r\n end;\r\n Result := Item;\r\nend;\r\n\r\nfunction TEditAutoComplete.HandleSelect(Index: Integer): Boolean;\r\nvar\r\n Args: TEditAutoCompleteSelectEventArgs;\r\nbegin\r\n if Assigned(OnSelect) then\r\n begin\r\n Args := TEditAutoCompleteSelectEventArgs.Create;\r\n Args.ItemIndex := Index;\r\n OnSelect(Self, Args);\r\n Args.Free;\r\n end;\r\n\r\n Result := True;\r\nend;\r\n\r\nprocedure TEditAutoComplete.Refresh;\r\nbegin\r\n //\r\nend;\r\n\r\nprocedure TEditAutoComplete.SetActiveItemClassName(const Value: string);\r\nbegin\r\n if FActiveItemClassName <> Value then\r\n begin\r\n FActiveItemClassName := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TEditAutoComplete.SetCharcase(const Value: TEditCharCase);\r\nbegin\r\n if FCharCase <> Value then\r\n begin\r\n FCharCase := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TEditAutoComplete.SetFocus;\r\nvar\r\n input: TJSHTMLInputElement;\r\nbegin\r\n input := TJSHTMLInputElement(ElementHandle.childNodes[0]);\r\n if Assigned(input) then\r\n begin\r\n input.focus();\r\n end\r\n else\r\n inherited;\r\nend;\r\n\r\nprocedure TEditAutoComplete.SetItemClassName(const Value: string);\r\nbegin\r\n if FItemClassName <> Value then\r\n begin\r\n FItemClassName := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TEditAutoComplete.SetItemIndex(const Value: Integer);\r\nbegin\r\n if (FItemIndex <> Value) and (Value < Items.Count) then\r\n begin\r\n FItemIndex := Value;\r\n if FItemIndex >= 0 then\r\n Text := Items[FItemIndex]\r\n else\r\n Text := '';\r\n UpdateElement;\r\n end;\r\n\r\n if Value = -100 then\r\n begin\r\n HandleRenderItem(nil,-100);\r\n HandleSelect(-100);\r\n end;\r\n\r\nend;\r\n\r\nprocedure TEditAutoComplete.SetItems(const Value: TStringList);\r\nbegin\r\n FItems.Assign(Value);\r\nend;\r\n\r\nprocedure TEditAutoComplete.SetLookupCaseSensitive(const Value: Boolean);\r\nbegin\r\n if FlookupCaseSensitive <> Value then\r\n begin\r\n FLookupCaseSensitive := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TEditAutoComplete.SetLookupMinLength(const Value: Integer);\r\nbegin\r\n if (FLookupMinLength <> Value) and (Value > 0) then\r\n begin\r\n FlookupMinLength := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TEditAutoComplete.SetLookupType(\r\n const Value: TEditAutoCompleteLookupType);\r\nbegin\r\n if FLookupType <> Value then\r\n begin\r\n FLookupType := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TEditAutoComplete.SetPopupClassName(const Value: string);\r\nbegin\r\n if FPopupClassName <> Value then\r\n begin\r\n FPopupClassName := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TEditAutoComplete.SetPopupHeight(const Value: Integer);\r\nbegin\r\n if FPopupHeight <> Value then\r\n begin\r\n FPopupHeight := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TEditAutoComplete.SetReadOnly(const Value: boolean);\r\nbegin\r\n if FReadOnly <> Value then\r\n begin\r\n FReadOnly := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TEditAutoComplete.SetText(const Value: string);\r\nbegin\r\n if FText <> Value then\r\n begin\r\n FText := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TEditAutoComplete.SetTextHint(const Value: string);\r\nbegin\r\n if FTextHint <> Value then\r\n begin\r\n FTextHint := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TEditAutoComplete.AddScript(Script: string);\r\nbegin\r\n asm\r\n var scrObj = document.createElement('script');\r\n scrObj.innerHTML = Script;\r\n document.head.appendChild(scrObj);\r\n end;\r\nend;\r\n\r\n{$HINTS OFF}\r\nprocedure TEditAutoComplete.UpdateElement;\r\nvar\r\n elid, sstyle: string;\r\n classpopup, classitem, classactive: string;\r\n newel: TJSHTMLElement;\r\n itemdata: TJSArray;\r\n I: Integer;\r\n spopup, tabindex: string;\r\n cl: TObject;\r\nbegin\r\n inherited;\r\n\r\n if IsUpdating then\r\n Exit;\r\n\r\n if not Assigned(ElementHandle) then\r\n Exit;\r\n\r\n elid := ElementID + '_input';\r\n\r\n if PopupClassName = '' then\r\n classpopup := ElementID + '_autocomplete-items'\r\n else\r\n classpopup := PopupClassName;\r\n\r\n if ItemClassName = '' then\r\n classitem := ElementID + '_autocomplete-item'\r\n else\r\n classitem := ItemClassName;\r\n\r\n if ActiveItemClassName = '' then\r\n classactive := ElementID + '_active-item'\r\n else\r\n classactive := ActiveItemClassName;\r\n\r\n ElementHandle.style.setProperty('overflow', 'visible');\r\n ElementHandle.setAttribute('tabindex', '-1');\r\n ElementHandle.removeAttribute('class');\r\n while ElementHandle.hasChildNodes do\r\n ElementHandle.removeChild(ElementHandle.firstChild);\r\n\r\n newel := TJSHTMLElement(document.createElement('input'));\r\n if ElementClassName <> '' then\r\n newel.setAttribute('class', ElementClassName);\r\n newel.setAttribute('type', 'text');\r\n newel.setAttribute('id', elid);\r\n newel.setAttribute('autocomplete','off');\r\n newel.style.setProperty('width', '100%');\r\n newel.style.setProperty('height', '100%');\r\n\r\n if Enabled then\r\n newel.removeAttribute('disabled')\r\n else\r\n newel.setAttribute('disabled', 'true');\r\n\r\n if ReadOnly then\r\n newel.setAttribute('readonly', 'true')\r\n else\r\n newel.removeAttribute('readonly');\r\n\r\n if TabStop then\r\n tabindex := IntToStr(TabOrder)\r\n else\r\n tabindex := '-1';\r\n newel.setAttribute('tabindex', tabindex);\r\n\r\n newel.setAttribute('placeholder', TextHint);\r\n\r\n newel.style.setProperty('background-color', ColorToHtml(color));\r\n\r\n if ElementClassName = '' then\r\n begin\r\n if Enabled and (ElementFont = efProperty) then\r\n newel.style.setProperty('color', ColorToHtml(Font.Color));\r\n end;\r\n\r\n SetHTMLElementFont(newel, Font, not ((ElementClassName = '') and (ElementFont = efProperty)));\r\n\r\n case CharCase of\r\n wecUpperCase: newel.style.setProperty('text-transform', 'uppercase');\r\n wecLowerCase: newel.style.setProperty('text-transform', 'lowercase');\r\n wecMixedCase: newel.style.setProperty('text-transform', 'capitalize');\r\n wecNormal: newel.style.setProperty('text-transform', 'initial');\r\n end;\r\n\r\n// newel.style.setProperty('width', IntToStr(Width) + 'px');\r\n// newel.style.setProperty('height', IntToStr(Height) + 'px');\r\n newel.style.setProperty('box-sizing', 'border-box');\r\n newel.setAttribute('value', Text);\r\n ElementHandle.appendChild(newel);\r\n\r\n newel := TJSHTMLElement(document.createElement('input'));\r\n newel.setAttribute('type', 'hidden');\r\n newel.setAttribute('id', elid + 'index');\r\n ElementHandle.appendChild(newel);\r\n\r\n BindEvents;\r\n\r\n if PopupHeight > 0 then\r\n begin\r\n spopup :=\r\n ' max-height: ' + IntToStr(PopupHeight) + 'px;' + #13 +\r\n ' overflow: auto;' + #13;\r\n end;\r\n\r\n sstyle :=\r\n '#' + ElementID + ' input[type=text] {' + #13 +\r\n ' width: 100%;' + #13 +\r\n '}' + #13 +\r\n\r\n '.' + classpopup + ' {' + #13 +\r\n ' position: absolute;' + #13 +\r\n ' z-index: 99;' + #13 +\r\n ' top: 100%;' + #13 +\r\n ' min-width: 100%;' + #13 +\r\n// ' width: 100%;' + #13 +\r\n ' left: 0;' + #13 +\r\n// ' right: 0;' + #13 +\r\n spopup;\r\n\r\n if PopupClassName = '' then\r\n begin\r\n sstyle := sstyle +\r\n ' background-color: #fff;' + #13 +\r\n ' border: 1px solid #d4d4d4;'\r\n end;\r\n\r\n sstyle := sstyle +\r\n '}' + #13;\r\n\r\n if ItemClassName = '' then\r\n begin\r\n sstyle := sstyle +\r\n '.' + classitem + ' {' + #13 +\r\n ' padding: 10px;' + #13 +\r\n ' cursor: pointer;' + #13 +\r\n ' border-bottom: 1px solid #d4d4d4;' + #13 +\r\n '}' + #13 +\r\n\r\n '.' + classitem + ':hover {' + #13 +\r\n ' background-color: #e9e9e9 !important;' + #13 +\r\n '}' + #13;\r\n end;\r\n\r\n if ActiveItemClassName = '' then\r\n begin\r\n sstyle := sstyle +\r\n '.' + classactive + ' {' + #13 +\r\n ' background-color: #e9e9e9 !important;' + #13 +\r\n ' color: #000;' + #13 +\r\n '}';\r\n end;\r\n\r\n AddInstanceStyle(sstyle);\r\n\r\n AddScript(\r\n 'function doautocomplete(inp, hinp, arr, myclass) {' + #13 +\r\n ' var currentFocus;' + #13 +\r\n ' inp.addEventListener(\"input\", function(e) {' + #13 +\r\n ' var a, b, i, h, lookup, minlength, cs, found, val = this.value;' + #13 +\r\n ' lookup = ' + IntToStr(Ord(LookupType)) + ';' + #13 +\r\n ' minlength = ' + IntToStr(LookupMinLength) + ';' + #13 +\r\n ' cs = ' + BoolToStr(LookupCaseSensitive) + ';' + #13 +\r\n\r\n ' ' + elid + 'closeAllLists();' + #13 +\r\n\r\n ' if (!val) { return false;}' + #13 +\r\n ' if (val.length < minlength) { return false;}' + #13 +\r\n\r\n ' currentFocus = -1;' + #13 +\r\n ' a = document.createElement(\"DIV\");' + #13 +\r\n ' a.setAttribute(\"id\", this.id + \"autocomplete-list\");' + #13 +\r\n ' a.setAttribute(\"class\", \"' + classpopup + '\");' + #13 +\r\n ' a.addEventListener(\"mousedown\", function (e) {' + #13 +\r\n ' e.preventDefault();' + #13 +\r\n ' });' + #13 +\r\n ' this.parentNode.appendChild(a);' + #13 +\r\n ' for (i = 0; i < arr.length; i++) {' + #13 +\r\n ' var q = val;' + #13 +\r\n ' var l = arr[i];' + #13 +\r\n ' var s = l;' + #13 +\r\n ' if (!cs) {' + #13 +\r\n ' q = q.toUpperCase();' + #13 +\r\n ' l = l.toUpperCase();' + #13 +\r\n ' }' + #13 +\r\n\r\n ' found = false;' + #13 +\r\n ' if ((lookup == 0) && (l.substr(0, q.length) == q)) {' + #13 +\r\n ' found = true;' + #13 +\r\n ' s = \"\" + arr[i].substr(0, val.length) + \"\";' + #13 +\r\n ' s += arr[i].substr(val.length);' + #13 +\r\n ' }' + #13 +\r\n ' else if ((lookup == 1) && (l.indexOf(q) >= 0)) {' + #13 +\r\n ' found = true;' + #13 +\r\n ' s = arr[i].substr(0, l.indexOf(q));' + #13 +\r\n ' s += \"\" + arr[i].substr(l.indexOf(q), val.length) + \"\";' + #13 +\r\n ' s += arr[i].substr(l.indexOf(q) + val.length);' + #13 +\r\n ' }' + #13 +\r\n\r\n ' if (found) {' + #13 +\r\n ' b = document.createElement(\"DIV\");' + #13 +\r\n ' b.setAttribute(\"id\", this.id + \"|\" + i);' + #13 +\r\n ' b.setAttribute(\"class\", \"' + classitem + '\");' + #13 +\r\n ' b.innerHTML = s;' + #13 +\r\n ' b = myclass.HandleRenderItem(b, i);'+\r\n ' b.addEventListener(\"click\", function(e) {' + #13 +\r\n ' var selindex = this.id.substring(this.id.indexOf(\"|\") + 1, this.id.length);' + #13 +\r\n ' inp.value = arr[selindex]' + #13 +\r\n ' inp.focus();' + #13 +\r\n ' hinp.value = selindex;' + #13 +\r\n ' myclass.HandleSelect(selindex);'+\r\n ' ' + elid + 'closeAllLists();' + #13 +\r\n ' });' + #13 +\r\n ' a.appendChild(b);' + #13 +\r\n ' }' + #13 +\r\n ' }' + #13 +\r\n ' if (a.childNodes.length <= 0) ' + elid + 'closeAllLists();'+\r\n ' });' + #13 +\r\n\r\n ' inp.addEventListener(\"blur\", function(e) {' + #13 +\r\n ' ' + elid + 'closeAllLists(e.target, true);' + #13 +\r\n ' });' + #13 +\r\n\r\n ' inp.addEventListener(\"keydown\", function(e) {' + #13 +\r\n ' var popup = document.getElementById(this.id + \"autocomplete-list\");' + #13 +\r\n ' var x;' + #13 +\r\n ' if (popup) x = popup.getElementsByTagName(\"div\");' + #13 +\r\n ' if (x) {' + #13 +\r\n ' if (e.keyCode == 27) {' + #13 +\r\n ' ' + elid + 'closeAllLists(e.target, true);' + #13 +\r\n ' } else if (e.keyCode == 40) {' + #13 +\r\n ' currentFocus++;' + #13 +\r\n ' ' + elid + 'addActive(x);' + #13 +\r\n ' if ((x[currentFocus].offsetTop + x[currentFocus].offsetHeight) > (popup.offsetHeight + popup.scrollTop))' +\r\n ' popup.scrollTop = ((x[currentFocus].offsetTop + x[currentFocus].offsetHeight) - popup.offsetHeight);' + #13 +\r\n ' } else if (e.keyCode == 38) { ' + #13 +\r\n ' currentFocus--;' + #13 +\r\n ' ' + elid + 'addActive(x);' + #13 +\r\n ' if ((x[currentFocus].offsetTop) < (popup.scrollTop))' +\r\n ' popup.scrollTop = (x[currentFocus].offsetTop);' + #13 +\r\n ' } else if (e.keyCode == 13) {' + #13 +\r\n ' e.preventDefault();' + #13 +\r\n ' if (currentFocus > -1) {' + #13 +\r\n ' if (x) x[currentFocus].click();' + #13 +\r\n ' } else { '+elid +'closeAllLists(e.target,true);}' + #13 +\r\n ' }' + #13 +\r\n ' }' + #13 +\r\n ' });' + #13 +\r\n ' function ' + elid + 'addActive(x) {' + #13 +\r\n ' if (!x) return false;' + #13 +\r\n ' ' + elid + 'removeActive(x);' + #13 +\r\n ' if (currentFocus >= x.length) currentFocus = x.length - 1;' + #13 +\r\n ' if (currentFocus < 0) currentFocus = 0;' + #13 +\r\n ' x[currentFocus].classList.add(\"' + classactive + '\");' + #13 +\r\n ' }' + #13 +\r\n ' function ' + elid + 'removeActive(x) {' + #13 +\r\n ' for (var i = 0; i < x.length; i++) {' + #13 +\r\n ' x[i].classList.remove(\"' + classactive + '\");' + #13 +\r\n ' }' + #13 +\r\n ' }' + #13 +\r\n ' function ' + elid + 'closeAllLists(elmnt, doblur) {' + #13 +\r\n ' var x = document.getElementsByClassName(\"' + classpopup + '\");' + #13 +\r\n ' var isinput = (elmnt != inp);' + #13 +\r\n ' if (doblur) isinput = (elmnt == inp);' + #13 +\r\n ' for (var i = 0; i < x.length; i++) {' + #13 +\r\n ' if (elmnt != x[i] && isinput) {' + #13 +\r\n ' x[i].parentNode.removeChild(x[i]);' + #13 +\r\n ' }' + #13 +\r\n ' }' + #13 +\r\n ' }' + #13 +\r\n ' document.addEventListener(\"click\", function (e) {' + #13 +\r\n ' ' + elid + 'closeAllLists(e.target);' + #13 +\r\n ' });' + #13 +\r\n '}'\r\n );\r\n\r\n itemdata := TJSArray.new;\r\n for I := 0 to Items.Count - 1 do\r\n begin\r\n itemdata.push(Items[I]);\r\n end;\r\n\r\n cl := Self;\r\n asm\r\n //cl = this;\r\n var el = document.getElementById(elid);\r\n var elindex = document.getElementById(elid + 'index');\r\n if (el && elindex)\r\n doautocomplete(el, elindex, itemdata, cl);\r\n end;\r\nend;\r\n{$HINTS ON}\r\n\r\nend.\r\n","unit UploadFiles;\r\n\r\ninterface\r\n\r\nuses\r\n SysUtils, Classes, JS, Web, WEBLib.Graphics, WEBLib.Controls,\r\n WEBLib.Forms, WEBLib.Dialogs, WEBLib.Imaging.GIFImg, WEBLib.WebCtrls,\r\n JSDelphiSystem,\r\n WEBLib.ComCtrls, WEBLib.StdCtrls, \r\nWEBLib.EditAutocomplete, WEBLib.ExtCtrls;\r\n\r\nprocedure ShowUploadScreen;\r\n\r\n\r\ntype\r\n TfUploadFiles = class(TForm)\r\n lbUploadStatus: TLabel;\r\n btUpload: TButton;\r\n memLog: TMemo;\r\n Progress: TProgressBar;\r\n wfpUpload: TFilePicker;\r\n WaitMessage: TWaitMessage;\r\n cmbDocType: TComboBox;\r\n cmbYear: TComboBox;\r\n btDone: TButton;\r\n WebLabel1: TLabel;\r\n WebLabel2: TLabel;\r\n pnLogo: TPanel;\r\n imgLogo: TImageControl;\r\n edconn: TSpinEdit;\r\n WebPanel1: TPanel;\r\n WebLabel3: TLabel;\r\n edPassword: TEdit;\r\n lbPassword: TLabel;\r\n function _progress(Event: TJSProgressEvent): boolean;\r\n function _loadend(Event: TJSProgressEvent): boolean;\r\n function _error(Event: TJSProgressEvent): boolean;\r\n function _abort(Event: TJSProgressEvent): boolean;\r\n function _timeout(Event: TJSProgressEvent): boolean;\r\n function _final(Event: TJSProgressEvent): boolean;\r\n\r\n procedure WebFormShow(Sender: TObject);\r\n\r\n procedure btUploadClick(Sender: TObject);\r\n procedure wfpUploadGetFileAsBase64(Sender: TObject; AFileIndex: Integer;\r\n ABase64: string);\r\n procedure wfpUploadChange(Sender: TObject);\r\n procedure btDoneClick(Sender: TObject);\r\n private\r\n { Private declarations }\r\n procedure FillDescs;\r\n public\r\n { Public declarations }\r\n procedure UploadFile(ABase64, fn, doctype: string; sz: integer; connstring: string='');\r\n protected procedure LoadDFMValues; override; end;\r\n\r\nvar\r\n fUploadFiles: TfUploadFiles;\r\n xhr: TJSXMLHttpRequest;\r\n progressCounter: Integer;\r\n maxfsize: LongInt;\r\n\r\nimplementation\r\n\r\n{$R *.dfm}\r\n\r\nuses Main, ClientCurrent, SectionPanels, TransferWeb, ClientConnectionsDM;\r\n\r\nprocedure ShowUploadScreen;\r\nvar lfUploadFiles: TfUploadFiles;\r\n\r\n\tprocedure AfterShowModal(AValue: TModalResult);\r\n begin\r\n \tlfUploadFiles.free;\r\n end;\r\n\r\n procedure AfterCreate(AForm: TObject);\r\n begin\r\n end;\r\n\r\nbegin\r\n lfUploadFiles := TfUploadFiles.CreateNew(@AfterCreate);\r\n fUploadFiles := lfUploadFiles;\r\n lfUploadFiles.ShowModal(@AfterShowModal);\r\nend;\r\n\r\n//upload events you may want to capture\r\nfunction TfUploadFiles._error(Event: TJSProgressEvent): boolean;\r\nbegin\r\n lbUploadStatus.Caption:= 'Upload Error!!';\r\n memLog.Lines.Add('Upload Error');\r\n\t result := true;\r\nend;\r\n\r\n\r\nfunction TfUploadFiles._abort(Event: TJSProgressEvent): boolean;\r\nbegin\r\n\t result := true;\r\n lbUploadStatus.Caption:= 'Upload Aborted!';\r\n memLog.Lines.Add('Upload Aborted');\r\nend;\r\n\r\n\r\nfunction TfUploadFiles._timeout(Event: TJSProgressEvent): boolean;\r\nbegin\r\n \t result := true;\r\n lbUploadStatus.Caption:= 'Upload Timed Out!';\r\n memLog.Lines.Add('TimedOut');\r\nend;\r\n\r\n\r\nfunction TfUploadFiles._final(Event: TJSProgressEvent): boolean;\r\nbegin\r\n\tresult := true;\r\n\ttry\r\n// btUpload.Caption := IntToStr(xhr.Status);\r\n\t\tmemLog.Lines.Add('Error uploading File: ' + inttostr(xhr.Status));\r\n except\r\n end;\r\n try\r\n \t//memLog.Lines.Add(copy(xhr.responseText, 1, 100));\r\n except\r\n end;\r\nend;\r\n\r\n\r\nfunction TfUploadFiles._progress(Event: TJSProgressEvent): boolean;\r\nbegin\r\n// some debug data to illustrate the events\r\n\tresult := true;\r\n\ttry\r\n progressCounter:= progressCounter + 1;\r\n// memLog.Lines.Add('Event Loaded: ' + IntToStr(Event.Loaded));\r\n// memLog.Lines.Add('Event Total: ' + IntToStr(Round(( Event.loaded / maxfsize ) * 100)));\r\n// memLog.Lines.Add('Event maxsize: ' + IntToStr(maxfsize));\r\n Progress.Position:= (Round(( Event.loaded / maxfsize ) * 100));\r\n except\r\n end;\r\nend;\r\n\r\n\r\nfunction TfUploadFiles._loadend(Event: TJSProgressEvent): boolean;\r\nbegin\r\ntry\r\n// memLog.Lines.Add('Progress: ' + IntToStr(progressCounter));\r\n\tresult := true;\r\n memLog.Lines.Add('Complete');\r\n WaitMessage.Hide;\r\n lbUploadStatus.Caption:= 'Upload Complete';\r\nexcept\r\nend;\r\n Result:= True;\r\nend;\r\n\r\nprocedure TfUploadFiles.UploadFile(ABase64, fn, doctype: string; sz: integer; connstring: string='');\r\nvar\r\n fData: TJSFormData;\r\n lmaxfsize: LongInt;\r\n\r\n function MessageHeader: string;\r\n begin\r\n // Token, Transaction, Type?, TPID, STPID\r\n result := format('%s|%d|%s|%d|%d|',\r\n [CurrentToken, CurrentTransaction, 'UF', CurrentTaxpayerID, CurrentSecondaryID]);\r\n end;\r\n\r\nbegin\r\n WaitMessage.Show;\r\n if ConnString = '' then ConnString := CTFILEUPLOADCONNSTRING;\r\n Progress.Position := 0;\r\n \tmemLog.Lines.Add(fn);\r\n xhr := TJSXMLHttpRequest.new;\r\n xhr.open('POST', ConnString);\t//'http://localhost:2001/tms/CTService/Touch');\r\n\r\n //add the upload event listeners needed to monirot the uploads\r\n xhr.upload.addEventListener('loadend', @_loadend);\r\n xhr.upload.addEventListener('progress',@_progress);\r\n xhr.upload.addEventListener('error', @_error);\r\n xhr.upload.addEventListener('timeout', @_timeout);\r\n xhr.upload.addEventListener('abort', @_abort);\r\n\r\n //Notice this loadend is NOT applied to the upload method\r\n //Only calls after everything ic complete\r\n xhr.addEventListener('loadend', @_final);\r\n\r\n\tfData := TJSFormData.new;\r\n fData.append('hdr', MessageHeader);\t//CurrentToken);\r\n fData.append('fn', fn);\r\n fData.append('desc', DocType);\r\n fData.append('year', cmbYear.text);\r\n fData.append('comm', edPassword.text);\r\n fData.append('data', ABase64);\r\n lmaxfsize := length(ABase64);\r\n\r\n //since lmaxfsize scope is limited to this procedure, assign it to a glogal\r\n //to make it easy.\r\n maxfsize:= lmaxfsize;\r\n\r\n //debug to show haw many times the progress event is called\r\n ProgressCounter:= 0;\r\n\r\n //init our progress bar\r\n Progress.Max:= 100;\r\n Progress.Min:= 0;\r\n //this is an option but not needed.\r\n\r\n xhr.send(fData);\r\nend;\r\n\r\nprocedure TfUploadFiles.WebFormShow(Sender: TObject);\r\nvar yr: integer;\r\n\t y, m, d: word;\r\nbegin\r\n\t// fill cmbYear\r\n SetLogoPanel(pnLogo, imgLogo);\r\n cmbYear.Items.Clear;\r\n decodedate(date, y, m, d);\r\n for yr := y downto y-9 do\r\n \tcmbYear.Items.Add(inttostr(yr));\r\n FillDescs;\r\n lbUploadStatus.caption := '';\r\nend;\r\n\r\nprocedure TfUploadFiles.btDoneClick(Sender: TObject);\r\nbegin\r\n\tShowMain;\r\nend;\r\n\r\nprocedure TfUploadFiles.btUploadClick(Sender: TObject);\r\nbegin\r\n Progress.Position := 0;\r\n\twfpUpload.Files[0].GetFileAsBase64;\r\n//\twfpUpload.Files[0].GetFileAsStream;\r\nend;\r\n\r\nprocedure TfUploadFiles.FillDescs;\r\nbegin\r\n\tcmbDocType.Items.Clear;\r\n if CurrentTPType = 'W' then begin\r\n \tcmbDocType.Items.Add('W2 Data in EF-W2 format');\r\n \tcmbDocType.Items.Add('Withholding Recon Form');\r\n \tcmbDocType.Items.Add('City Tax Form');\r\n \tcmbDocType.Items.Add('Federal Tax Form');\r\n \tcmbDocType.Items.Add('Correspondence');\r\n \tcmbDocType.Items.Add('Other Document');\r\n WebLabel3.caption := 'Upload your supporting documents. You may send the EF-W2 format file of W2''s. If a Password-Protected ZIP file, enter the Password.';\r\n lbPassword.visible := true;\r\n edPassword.visible := true;\r\n end\r\n else begin\r\n \tif CurrentTPType = 'I' then\r\n\t \tcmbDocType.Items.Add('W2');\r\n \tcmbDocType.Items.Add('City Tax Form');\r\n \tcmbDocType.Items.Add('Federal Tax Form');\r\n \tcmbDocType.Items.Add('Correspondence');\r\n \tcmbDocType.Items.Add('Other Document');\r\n WebLabel3.caption := 'Upload your supporting documents including images of your W-2s. Do not send ZIP files or any file using a Password.';\r\n\tend;\r\n\r\nend;\r\n\r\nprocedure TfUploadFiles.wfpUploadChange(Sender: TObject);\r\nbegin\r\n\tProgress.Position := 0;\r\nend;\r\n\r\nprocedure TfUploadFiles.wfpUploadGetFileAsBase64(Sender: TObject;\r\n AFileIndex: Integer; ABase64: string);\r\nvar fname, ufname: string;\r\nbegin\r\n(*memLog.Lines.Clear;\r\nif edconn.text = '1' then begin\r\n memLog.Lines.Add('Try 1: ' + CTFILEUPLOADCONNSTRING);\r\n\tUploadFile(ABase64, wfpUpload.Files[AFileIndex].Name, cmbDocType.Text, wfpUpload.Files[AFileIndex].Size);\r\nend\r\nelse if edconn.text = '2' then begin\r\n memLog.Lines.Add('Try 2: ' + CTFILEUPLOADCONNSTRINGA);\r\n\tUploadFile(ABase64, wfpUpload.Files[AFileIndex].Name, cmbDocType.Text, wfpUpload.Files[AFileIndex].Size, CTFILEUPLOADCONNSTRINGA);\r\nend\r\nelse if edconn.text = '3' then begin\r\n memLog.Lines.Add('Try 3: ' + CTFILEUPLOADCONNSTRINGB);\r\n\tUploadFile(ABase64, wfpUpload.Files[AFileIndex].Name, cmbDocType.Text, wfpUpload.Files[AFileIndex].Size, CTFILEUPLOADCONNSTRINGB);\r\nend\r\nelse if edconn.text = '4' then begin\r\n memLog.Lines.Add('Try 4: ' + CTFILEUPLOADCONNSTRINGC);\r\n\tUploadFile(ABase64, wfpUpload.Files[AFileIndex].Name, cmbDocType.Text, wfpUpload.Files[AFileIndex].Size, CTFILEUPLOADCONNSTRINGC);\r\nend\r\nelse if edconn.text = '5' then begin\r\n memLog.Lines.Add('Try 5: ' + CTFILEUPLOADCONNSTRINGD);\r\n\tUploadFile(ABase64, wfpUpload.Files[AFileIndex].Name, cmbDocType.Text, wfpUpload.Files[AFileIndex].Size, CTFILEUPLOADCONNSTRINGD);\r\nend\r\nelse if edconn.text = '6' then begin\r\n memLog.Lines.Add('Try 6: Touch');\r\n\tSendFileByHTTPPost;\r\nend\r\nelse begin\r\n*)\r\n\tfname := wfpUpload.Files[AFileIndex].Name;\r\n ufname := uppercase(fname);\r\n if (pos('.EXE', ufname) > 0) {or (pos('.ZIP', ufname) > 0)} then\r\n \tShowMessage('This file type is not accepted')\r\n else begin\r\n memLog.Lines.Add(fname);\r\n DoSendDoc(fName, cmbDocType.Text, cmbYear.text, edPassword.text, ABase64);\r\n memLog.Lines.Add('Complete');\r\n lbUploadStatus.Caption:= 'Upload Complete';\r\n\tend;\r\nend;\r\n\r\nprocedure TfUploadFiles.LoadDFMValues;\r\nbegin\r\n inherited LoadDFMValues;\r\n\r\n lbUploadStatus := TLabel.Create(Self);\r\n WebLabel1 := TLabel.Create(Self);\r\n WebLabel2 := TLabel.Create(Self);\r\n lbPassword := TLabel.Create(Self);\r\n btUpload := TButton.Create(Self);\r\n memLog := TMemo.Create(Self);\r\n Progress := TProgressBar.Create(Self);\r\n wfpUpload := TFilePicker.Create(Self);\r\n WaitMessage := TWaitMessage.Create(Self);\r\n cmbDocType := TComboBox.Create(Self);\r\n cmbYear := TComboBox.Create(Self);\r\n btDone := TButton.Create(Self);\r\n pnLogo := TPanel.Create(Self);\r\n imgLogo := TImageControl.Create(Self);\r\n edconn := TSpinEdit.Create(Self);\r\n WebPanel1 := TPanel.Create(Self);\r\n WebLabel3 := TLabel.Create(Self);\r\n edPassword := TEdit.Create(Self);\r\n\r\n lbUploadStatus.BeforeLoadDFMValues;\r\n WebLabel1.BeforeLoadDFMValues;\r\n WebLabel2.BeforeLoadDFMValues;\r\n lbPassword.BeforeLoadDFMValues;\r\n btUpload.BeforeLoadDFMValues;\r\n memLog.BeforeLoadDFMValues;\r\n Progress.BeforeLoadDFMValues;\r\n wfpUpload.BeforeLoadDFMValues;\r\n WaitMessage.BeforeLoadDFMValues;\r\n cmbDocType.BeforeLoadDFMValues;\r\n cmbYear.BeforeLoadDFMValues;\r\n btDone.BeforeLoadDFMValues;\r\n pnLogo.BeforeLoadDFMValues;\r\n imgLogo.BeforeLoadDFMValues;\r\n edconn.BeforeLoadDFMValues;\r\n WebPanel1.BeforeLoadDFMValues;\r\n WebLabel3.BeforeLoadDFMValues;\r\n edPassword.BeforeLoadDFMValues;\r\n try\r\n Name := 'fUploadFiles';\r\n Width := 640;\r\n Height := 512;\r\n Caption := 'CityTax Online Filing';\r\n SetEvent(Self, 'OnShow', 'WebFormShow');\r\n lbUploadStatus.SetParentComponent(Self);\r\n lbUploadStatus.Name := 'lbUploadStatus';\r\n lbUploadStatus.Left := 39;\r\n lbUploadStatus.Top := 251;\r\n lbUploadStatus.Width := 72;\r\n lbUploadStatus.Height := 13;\r\n lbUploadStatus.Caption := 'lbUploadStatus';\r\n lbUploadStatus.HeightPercent := 100.000000000000000000;\r\n lbUploadStatus.WidthPercent := 100.000000000000000000;\r\n WebLabel1.SetParentComponent(Self);\r\n WebLabel1.Name := 'WebLabel1';\r\n WebLabel1.Left := 41;\r\n WebLabel1.Top := 177;\r\n WebLabel1.Width := 115;\r\n WebLabel1.Height := 13;\r\n WebLabel1.Caption := 'Pick the Document Type';\r\n WebLabel1.HeightPercent := 100.000000000000000000;\r\n WebLabel1.WidthPercent := 100.000000000000000000;\r\n WebLabel2.SetParentComponent(Self);\r\n WebLabel2.Name := 'WebLabel2';\r\n WebLabel2.Left := 276;\r\n WebLabel2.Top := 177;\r\n WebLabel2.Width := 43;\r\n WebLabel2.Height := 13;\r\n WebLabel2.Caption := 'Tax Year';\r\n WebLabel2.HeightPercent := 100.000000000000000000;\r\n WebLabel2.WidthPercent := 100.000000000000000000;\r\n lbPassword.SetParentComponent(Self);\r\n lbPassword.Name := 'lbPassword';\r\n lbPassword.Left := 41;\r\n lbPassword.Top := 213;\r\n lbPassword.Width := 46;\r\n lbPassword.Height := 13;\r\n lbPassword.Caption := 'Password';\r\n lbPassword.HeightPercent := 100.000000000000000000;\r\n lbPassword.Visible := False;\r\n lbPassword.WidthPercent := 100.000000000000000000;\r\n btUpload.SetParentComponent(Self);\r\n btUpload.Name := 'btUpload';\r\n btUpload.Left := 219;\r\n btUpload.Top := 224;\r\n btUpload.Width := 143;\r\n btUpload.Height := 25;\r\n btUpload.Caption := 'Upload File';\r\n btUpload.ChildOrder := 1;\r\n btUpload.HeightPercent := 100.000000000000000000;\r\n btUpload.WidthPercent := 100.000000000000000000;\r\n SetEvent(btUpload, Self, 'OnClick', 'btUploadClick');\r\n memLog.SetParentComponent(Self);\r\n memLog.Name := 'memLog';\r\n memLog.Left := 37;\r\n memLog.Top := 290;\r\n memLog.Width := 325;\r\n memLog.Height := 174;\r\n memLog.AutoSize := False;\r\n memLog.HeightPercent := 100.000000000000000000;\r\n memLog.SelLength := 0;\r\n memLog.SelStart := 0;\r\n memLog.WidthPercent := 100.000000000000000000;\r\n Progress.SetParentComponent(Self);\r\n Progress.Name := 'Progress';\r\n Progress.Left := 39;\r\n Progress.Top := 265;\r\n Progress.Width := 323;\r\n Progress.Height := 24;\r\n Progress.HeightPercent := 100.000000000000000000;\r\n Progress.WidthPercent := 100.000000000000000000;\r\n Progress.ChildOrder := 4;\r\n wfpUpload.SetParentComponent(Self);\r\n wfpUpload.Name := 'wfpUpload';\r\n wfpUpload.Left := 39;\r\n wfpUpload.Top := 147;\r\n wfpUpload.Width := 323;\r\n wfpUpload.Height := 25;\r\n wfpUpload.HeightPercent := 100.000000000000000000;\r\n wfpUpload.WidthPercent := 100.000000000000000000;\r\n wfpUpload.ChildOrder := 5;\r\n SetEvent(wfpUpload, Self, 'OnChange', 'wfpUploadChange');\r\n SetEvent(wfpUpload, Self, 'OnGetFileAsBase64', 'wfpUploadGetFileAsBase64');\r\n WaitMessage.SetParentComponent(Self);\r\n WaitMessage.Name := 'WaitMessage';\r\n WaitMessage.Left := 284;\r\n WaitMessage.Top := 179;\r\n WaitMessage.Width := 24;\r\n WaitMessage.Height := 24;\r\n WaitMessage.HeightPercent := 100.000000000000000000;\r\n WaitMessage.WidthPercent := 100.000000000000000000;\r\n WaitMessage.Opacity := 0.200000000000000000;\r\n WaitMessage.Picture.LoadFromFile('UploadFiles.WaitMessage.Picture.gif');\r\n cmbDocType.SetParentComponent(Self);\r\n cmbDocType.Name := 'cmbDocType';\r\n cmbDocType.Left := 40;\r\n cmbDocType.Top := 190;\r\n cmbDocType.Width := 219;\r\n cmbDocType.Height := 21;\r\n cmbDocType.HeightPercent := 100.000000000000000000;\r\n cmbDocType.WidthPercent := 100.000000000000000000;\r\n cmbDocType.ItemIndex := -1;\r\n cmbDocType.Items.BeginUpdate;\r\n try\r\n cmbDocType.Items.Clear;\r\n cmbDocType.Items.Add('W2');\r\n cmbDocType.Items.Add('City Tax Form');\r\n cmbDocType.Items.Add('Federal Tax Form');\r\n cmbDocType.Items.Add('Correspondence');\r\n cmbDocType.Items.Add('Other Document');\r\n cmbDocType.Items.Add('Withholding Recon Data');\r\n cmbDocType.Items.Add('Withholding Recon Form');\r\n finally\r\n cmbDocType.Items.EndUpdate;\r\n end;\r\n cmbYear.SetParentComponent(Self);\r\n cmbYear.Name := 'cmbYear';\r\n cmbYear.Left := 275;\r\n cmbYear.Top := 190;\r\n cmbYear.Width := 87;\r\n cmbYear.Height := 21;\r\n cmbYear.HeightPercent := 100.000000000000000000;\r\n cmbYear.WidthPercent := 100.000000000000000000;\r\n cmbYear.ItemIndex := -1;\r\n cmbYear.Items.BeginUpdate;\r\n try\r\n cmbYear.Items.Clear;\r\n cmbYear.Items.Add('2022');\r\n cmbYear.Items.Add('2021');\r\n cmbYear.Items.Add('2020');\r\n cmbYear.Items.Add('2019');\r\n cmbYear.Items.Add('2018');\r\n cmbYear.Items.Add('2017');\r\n cmbYear.Items.Add('2016');\r\n cmbYear.Items.Add('2015');\r\n cmbYear.Items.Add('2014');\r\n cmbYear.Items.Add('2013');\r\n cmbYear.Items.Add('');\r\n finally\r\n cmbYear.Items.EndUpdate;\r\n end;\r\n btDone.SetParentComponent(Self);\r\n btDone.Name := 'btDone';\r\n btDone.Left := 266;\r\n btDone.Top := 475;\r\n btDone.Width := 96;\r\n btDone.Height := 25;\r\n btDone.Caption := 'Main Screen';\r\n btDone.ChildOrder := 8;\r\n btDone.HeightPercent := 100.000000000000000000;\r\n btDone.WidthPercent := 100.000000000000000000;\r\n SetEvent(btDone, Self, 'OnClick', 'btDoneClick');\r\n pnLogo.SetParentComponent(Self);\r\n pnLogo.Name := 'pnLogo';\r\n pnLogo.Left := 0;\r\n pnLogo.Top := 0;\r\n pnLogo.Width := 640;\r\n pnLogo.Height := 78;\r\n pnLogo.HeightPercent := 100.000000000000000000;\r\n pnLogo.WidthPercent := 100.000000000000000000;\r\n pnLogo.Align := alTop;\r\n pnLogo.BorderColor := clSilver;\r\n pnLogo.BorderStyle := bsSingle;\r\n pnLogo.ChildOrder := 2;\r\n imgLogo.SetParentComponent(pnLogo);\r\n imgLogo.Name := 'imgLogo';\r\n imgLogo.Left := 0;\r\n imgLogo.Top := 0;\r\n imgLogo.Width := 640;\r\n imgLogo.Height := 78;\r\n imgLogo.WidthStyle := ssAuto;\r\n imgLogo.HeightPercent := 100.000000000000000000;\r\n imgLogo.WidthPercent := 100.000000000000000000;\r\n imgLogo.Align := alClient;\r\n edconn.SetParentComponent(Self);\r\n edconn.Name := 'edconn';\r\n edconn.Left := 37;\r\n edconn.Top := 476;\r\n edconn.Width := 39;\r\n edconn.Height := 22;\r\n edconn.HeightPercent := 100.000000000000000000;\r\n edconn.WidthPercent := 100.000000000000000000;\r\n edconn.AutoSize := False;\r\n edconn.BorderStyle := bsSingle;\r\n edconn.ChildOrder := 12;\r\n edconn.Color := clWhite;\r\n edconn.Increment := 1;\r\n edconn.MaxValue := 7;\r\n edconn.MinValue := 1;\r\n edconn.Role := '';\r\n edconn.Value := 1;\r\n edconn.Visible := False;\r\n WebPanel1.SetParentComponent(Self);\r\n WebPanel1.Name := 'WebPanel1';\r\n WebPanel1.Left := 40;\r\n WebPanel1.Top := 81;\r\n WebPanel1.Width := 322;\r\n WebPanel1.Height := 60;\r\n WebPanel1.HeightPercent := 100.000000000000000000;\r\n WebPanel1.WidthPercent := 100.000000000000000000;\r\n WebPanel1.BorderColor := clWhite;\r\n WebPanel1.BorderStyle := bsNone;\r\n WebPanel1.ChildOrder := 13;\r\n WebPanel1.Color := clWhite;\r\n WebLabel3.SetParentComponent(WebPanel1);\r\n WebLabel3.Name := 'WebLabel3';\r\n WebLabel3.AlignWithMargins := True;\r\n WebLabel3.Left := 3;\r\n WebLabel3.Top := 3;\r\n WebLabel3.Width := 288;\r\n WebLabel3.Height := 26;\r\n WebLabel3.Align := alClient;\r\n WebLabel3.Alignment := taCenter;\r\n WebLabel3.Caption := 'Upload your supporting documents including images of your W-2s. Do not send ZIP files or any file using a Password.';\r\n WebLabel3.HeightPercent := 100.000000000000000000;\r\n WebLabel3.Layout := tlCenter;\r\n WebLabel3.WordWrap := True;\r\n WebLabel3.WidthPercent := 100.000000000000000000;\r\n edPassword.SetParentComponent(Self);\r\n edPassword.Name := 'edPassword';\r\n edPassword.Left := 40;\r\n edPassword.Top := 226;\r\n edPassword.Width := 121;\r\n edPassword.Height := 22;\r\n edPassword.ChildOrder := 14;\r\n edPassword.HeightPercent := 100.000000000000000000;\r\n edPassword.Visible := False;\r\n edPassword.WidthPercent := 100.000000000000000000;\r\n finally\r\n lbUploadStatus.AfterLoadDFMValues;\r\n WebLabel1.AfterLoadDFMValues;\r\n WebLabel2.AfterLoadDFMValues;\r\n lbPassword.AfterLoadDFMValues;\r\n btUpload.AfterLoadDFMValues;\r\n memLog.AfterLoadDFMValues;\r\n Progress.AfterLoadDFMValues;\r\n wfpUpload.AfterLoadDFMValues;\r\n WaitMessage.AfterLoadDFMValues;\r\n cmbDocType.AfterLoadDFMValues;\r\n cmbYear.AfterLoadDFMValues;\r\n btDone.AfterLoadDFMValues;\r\n pnLogo.AfterLoadDFMValues;\r\n imgLogo.AfterLoadDFMValues;\r\n edconn.AfterLoadDFMValues;\r\n WebPanel1.AfterLoadDFMValues;\r\n WebLabel3.AfterLoadDFMValues;\r\n edPassword.AfterLoadDFMValues;\r\n end;\r\nend;\r\n\r\nend.\r\n","unit TransferWeb;\r\n\r\ninterface\r\n\r\nuses\r\n SysUtils, Classes, JS, Web,\r\n XData.Web.Connection, XData.Web.Client, BCL.Utils,\r\n WEBLib.Modules, WEBLib.Forms, WEBLib.Dialogs, Parameters;\r\n\r\n procedure DoSavePDF;\r\n\r\n function DataToSendToServer: string;\r\n [async]\r\n procedure DoGetData(cmd: string); async;\r\n [async]\r\n function DoSendData(cmd, purp, data: string): string; async;\r\n [async]\r\n procedure DoSendDoc(fn, desc, yr, comm: string; data: string); async;\r\n [async]\r\n procedure DoGetPDF(saveit, useexisting: boolean); async;\r\n [async]\r\n function DoSendServicePayment(cmd, data: string): string; async;\r\n [async]\r\n function DoGetRequestID: string; async;\r\n\r\ntype\r\n TTransPackage = class\r\n \t// package up a string to get/send info to Server\r\n // PackageHeader: string; Package ID, Type/Purpose, Source, Statuses\r\n // Appropriate Lines\r\n // PackageTrailer: show we're done\r\n private\r\n protected\r\n spa: TStringParamArray;\r\n FPackageID, FLineSeq: integer;\r\n FPurpose, FSource, FStatus1, FStatus2: string;\r\n function PackageHeader: string; virtual;\r\n function PackageTrailer: string; virtual;\r\n function LineHeader(const typ: string; const ndx: integer=0; const sub: integer=0): string;\t\tvirtual;\r\n function LineData(const typ: string; const gp: integer=0; const ndx: integer=0; const sub: integer=0): string;\r\n function PackageLine(const typ: string; const gp: integer=0; const ndx: integer=0; const sub: integer=0): string;\r\n procedure AddLineToArray(const s: string);\r\n procedure TaxpayerUpdates;\r\n procedure SetLineTypes(const typ: string);\r\n procedure Init;\r\n public\r\n LineTypes: string;\r\n function ExportPackage(const cmd, typ: string): string;\t\tvirtual;\r\n function ImportPackage(const data: string): string;\t\tvirtual;\r\n constructor Create(const sz: integer=25; const psz: integer=50; const del: string=#13#10; const pdel: string='|');\r\n destructor Destroy; override;\r\n end;\r\n\r\n TTransfer = class\r\n \tprivate\r\n protected\r\n public\r\n \tTransType: string;\r\n\r\n \t [async]\r\n function CallGetData(const cmd: string): string; async;\r\n \t [async]\r\n function CallSendData(const cmd, data: string): string; async;\r\n\t [async]\r\n \t function CallSendDoc(const fn, desc, yr, comm, data: string): string; async;\r\n \t [async]\r\n function CallSendServicePayment(const cmd, data: string): string; async;\r\n \t [async]\r\n function CallServicePaymentCompleted(const cmd, data: string): string; async;\r\n [async]\r\n function CallGetRequestID: string; async;\r\n\r\n function MessageHeader: string;\r\n end;\r\n\r\nvar TransPkg: TTransPackage;\r\n Transfer: TTransfer;\r\n\r\nimplementation\r\n\r\n{%CLASSGROUP 'Vcl.Controls.TControl'}\r\n\r\nuses Return, ClientConnectionsDM, ClientCurrent, entFieldValues, entForms,\r\n\tentReturns, entData, TaxpayerDM, Utilities, Main, UploadFiles;\r\n\r\n// call this to send in the Server Put Command\r\nfunction DataToSendToServer: string;\r\nbegin\r\n\tTransPkg := TTransPackage.create(50, 500, '__', '|');\r\n result := TransPkg.ExportPackage('', '');\r\n TransPkg.free;\r\nend;\r\n\r\nprocedure DoGetData(cmd: string);\r\nvar s: string;\r\nbegin\r\n\tRecons := TRecons.create;\r\n PayInfo := TPayInfo.create;\r\n\tTransfer := TTransfer.create;\r\n s := await(Transfer.CallGetData(cmd));\r\n\tif pos('__', s) > 0 then\r\n \t TransPkg := TTransPackage.create(1000, 500, '__', '|')\r\n else\r\n\t TransPkg := TTransPackage.create(1000, 500, '_', '|');\r\n TransPkg.ImportPackage(s);\r\n TransPkg.free;\r\n Transfer.free;\r\nend;\r\n\r\nfunction DoSendData(cmd, purp, data: string): string;\r\nvar s, resp {, request}: string;\r\n\t lBytes: TBytes;\r\n//\t promise2: TJSXMLHttpRequest;\r\nbegin\r\n if data = '' then begin\r\n\t\tTransPkg := TTransPackage.create(50, 500, '__', '|');\r\n \ts := TransPkg.ExportPackage(cmd, purp);\t// types\r\n\t TransPkg.free;\r\n end\r\n else\r\n \ts := data;\r\n\r\n\tTransfer := TTransfer.create;\r\n Transfer.TransType := purp;\r\n resp := await(Transfer.CallSendData(cmd, s));\r\n if trim(resp) > '' then begin\r\n if (copy(resp, 1, 3) = 'Err') then\r\n \t\tShowMessage('Unable to Save Data: ' + resp)\r\n else if (copy(resp, 1, 7) = 'Session') then\r\n \t\tShowMessage(resp + ' - Log back in for access')\r\n else if {(cmd = 'SUBM') or} (cmd = 'PDF') then begin\r\n \tlBytes := TBclUtils.DecodeBase64(resp);\r\n Application.DownloadPDFFile(lBytes, 'TaxForm', true);\r\n end;\r\n\tend;\r\n\r\n result := resp;\r\n Transfer.free;\r\nend;\r\n\r\nprocedure DoSendDoc(fn, desc, yr, comm: string; data: string);\r\nvar resp: String;\r\nbegin\r\n\tTransfer := TTransfer.create;\r\n try\r\n \tresp := await(Transfer.CallSendDoc(fn, desc, yr, comm, data));\r\n except\r\n end;\r\n Transfer.free;\r\n if trim(resp) > '' then begin\r\n \tShowMessage(resp + ': ' + fn);\r\n end;\r\nend;\r\n\r\nprocedure DoGetPDF(saveit, useexisting: boolean);\r\nvar resp, request, cmd: string;\r\n\t lBytes: TBytes;\r\n\t promise: TJSXMLHttpRequest;\r\nbegin\r\n\tTransfer := TTransfer.create;\r\n if saveit then\t\t\t\t\tcmd := 'PDFS'\r\n else if useexisting then \tcmd := 'LAST'\r\n else \t\t\t\t\t\t\t\tcmd := 'PDF';\r\n request := 'GetPDF?Cmd=' + cmd + '&hdr4=' + Transfer.MessageHeader;\r\n// dmClientConnections.HttpRequest.URL := CTSERVICECONNSTRING + request;\r\n dmClientConnections.HttpRequest.URL := CTFILEUPLOADCONNSTRING + request;\r\n\tIncCallCounter(ccGetPDF);\r\n promise := await(TJSXMLHttpRequest, dmClientConnections.HttpRequest.Perform);\r\n resp := XMLSplitValue(promise.ResponseText);\r\n wReturn.PDFFileName := resp;\r\n dmClientConnections.SendConsoleMessage(resp, 0);\r\n lBytes := TBclUtils.DecodeBase64(resp);\r\n if length(lBytes) < 2500 then\r\n \tShowMessage('Unable to download PDF. Try again in a few minutes')\r\n else\r\n \tApplication.DownloadPDFFile(lBytes, 'TaxForm', true);\r\n Transfer.free;\r\nend;\r\n\r\nprocedure DoSavePDF;\r\nvar request: string;\r\nbegin\r\n\tTransfer := TTransfer.create;\r\n request := 'SavePDF?Cmd=PDF&hdr4=' + Transfer.MessageHeader;\r\n// dmClientConnections.HttpRequest.URL := CTSERVICECONNSTRING + request;\r\n dmClientConnections.HttpRequest.URL := CTFILEUPLOADCONNSTRING + request;\r\n\tIncCallCounter(ccGetPDF);\r\n dmClientConnections.HttpRequest.Perform;\r\n// promise := await(TJSXMLHttpRequest, dmClientConnections.HttpRequest.Perform);\r\n Transfer.free;\r\nend;\r\n\r\nfunction DoSendServicePayment(cmd, data: string): string;\r\nvar resp: String;\r\nbegin\r\n\tTransfer := TTransfer.create;\r\n try\r\n \tresp := await(Transfer.CallSendServicePayment(cmd, data));\r\n except\r\n \tresp := '';\r\n end;\r\n result := resp;\r\n Transfer.free;\r\nend;\r\n\r\nfunction DoGetRequestID: string;\r\nvar resp: String;\r\nbegin\r\n\tTransfer := TTransfer.create;\r\n try\r\n \tresp := await(Transfer.CallGetRequestID);\r\n except\r\n \tresp := '';\r\n end;\r\n result := resp;\r\n Transfer.free;\r\nend;\r\n\r\n\r\n{ TTransPackage }\r\n\r\nprocedure TTransPackage.AddLineToArray(const s: string);\r\nbegin\r\n\tif s > '' then\r\n \tspa.Add(s);\r\nend;\r\n\r\nconstructor TTransPackage.Create(const sz, psz: integer; const del, pdel: string);\r\nbegin\r\n\tspa := TStringParamArray.create(sz, psz, del, pdel);\t\t// default #13#10, '|'\r\nend;\r\n\r\ndestructor TTransPackage.Destroy;\r\nbegin\r\n\tspa.free;\r\n inherited;\r\nend;\r\n\r\nfunction TTransPackage.ExportPackage(const cmd, typ: string): string;\r\nvar i: integer;\r\n\t hdr: string;\r\n\t //OtherLineTypes: string;\r\n\r\n procedure HandleMultGroups(ltyp: string);\r\n var gp: integer;\r\n\r\n procedure GroupLines(gp: integer);\r\n var ln: string;\r\n \t g {, l}: integer;\r\n\r\n{ procedure OCLine(ndx: integer); \t//, sub: integer);\r\n begin\r\n \tln := LineData('L', gp, ndx, 0);\r\n if ln > '' then\r\n AddLineToArray(LineHeader('L', ndx, 0) + ln);\r\n end;\r\n}\r\n \tbegin\r\n \t\tfor g := 1 to FieldValues.MaxGroupIndex(gp) do begin\r\n \tln := LineData(ltyp, gp, g);\r\n if ln > '' then begin\r\n \tAddLineToArray(LineHeader(ltyp, g) + ln);\r\n if ltyp = 'W' then begin\r\n//\t for l := 1 to FieldValues.MaxSubIndex(gp, g) do\t// only when other city used\r\n// \t \tOCLine(g, l);\r\n// \t \tOCLine(g);\r\n end;\r\n end;\r\n end;\r\n end;\r\n\r\n begin\r\n for gp := 0 to nWebGroups-1 do begin\r\n if (WebGroups[gp].MultAllowed = 'Y') and (WebGroups[gp].LineID = ltyp) then begin\r\n GroupLines(WebGroups[gp].WebGroupID);\r\n// if pos(WebGroups[gp].LineID, LineTypes) = 0 then\r\n// \tLineTypes := LineTypes + WebGroups[gp].LineID;\r\n end;\r\n end;\r\n end;\r\n\r\n{ procedure ImageLine;\r\n var ln: string;\r\n begin\r\n\r\n end;\r\n}\r\n\r\n procedure OneLineType(ltyp: string);\r\n var ln: string;\r\n begin\r\n \tif ltyp = '4' then begin\r\n \tRecons.StoreData;\r\n end;\r\n if ltyp = 'W' then\r\n\t \tHandleMultGroups(ltyp)\r\n else begin\r\n\t ln := PackageLine(ltyp);\r\n \t\tif ln > '' then\r\n \t\tAddLineToArray(ln)\r\n\t else\r\n\t\t \tHandleMultGroups(ltyp);\r\n \tend;\r\n end;\r\n\r\nbegin\r\n\tInit;\r\n spa.reset;\r\n\tSetLineTypes(typ);\r\n hdr := PackageHeader;\r\n if hdr > '' then begin\r\n \tAddLineToArray(hdr);\r\n// ShowMessage(hdr);\r\n end;\r\n TaxpayerUpdates;\r\n // get appropriate forms/sections/groups for typ\r\n for i := 1 to length(LineTypes) do\r\n \tOneLineType(copy(LineTypes, i, 1));\r\n\tPackageTrailer;\r\n result := spa.AsString;\r\nend;\r\n\r\nfunction TTransPackage.ImportPackage(const data: string): string;\r\nvar ln, ccnt: integer;\r\n\t ltyp: string;\r\n\t pair: TDataPairParams;\r\n\r\n\tprocedure HandleOneLine(s: string);\r\n var p, fndx: integer;\r\n \t spls: array[1..4] of integer;\r\n \t desig: string;\r\n\r\n procedure SplitDesignator;\r\n var i, p: integer;\r\n \t s: string;\r\n begin\r\n \tfor i := 1 to 4 do\r\n \tspls[i] := 0;\r\n i := 0;\r\n s := desig;\r\n repeat\r\n \tp := pos('.', s);\r\n if p > 0 then begin\r\n \tinc(i);\r\n spls[i] := strtointdef(copy(s, 1, p-1), 0);\r\n s := copy(s, p+1, length(s)-p);\r\n end\r\n else begin\r\n \tinc(i);\r\n spls[i] := strtointdef(s, 0);\r\n \ts := ''\r\n end;\r\n until s = '';\r\n end;\r\n\r\n begin\r\n \tpair.AsString := s;\r\n \tfor p := 1 to pair.nParams do begin\r\n \tdesig := pair.CodeString[p];\r\n if desig > '' then begin\r\n\t\t\t\tif desig >= 'A' then\r\n \t \tLineCodeVars.SetByLineCode(desig, pair.Values[p])\r\n \t else begin\r\n\t \t SplitDesignator;\r\n\t\t\t\t\tfndx := FindFieldsIndex(spls[1], spls[2]);\r\n if fndx >= 0 then\r\n\t \t \tFieldValues.FindReplaceOrAdd(spls[1], spls[3], spls[4], fndx, pair.Values[p]);\r\n \t end;\r\n end;\r\n end;\r\n end;\r\n\r\n procedure HandleTP(s: string);\r\n begin\r\n \twith dmTaxpayer, TP do begin\r\n AsCodedString := s;\r\n ToFieldValues;\r\n end;\r\n end;\r\n\r\n procedure HandleBasicInfo(s: string);\r\n begin\r\n \tSetCurrentFromBData(s);\r\n LineCodeVars.AllToFieldValues;\r\n end;\r\n\r\n procedure HandleHistory(s: string);\r\n var p, fm, ndx: integer;\r\n \t desig: string;\r\n\r\n \tprocedure LocalSetByLineCode(desig, val: string);\r\n var uplcode: string;\r\n \t i, fldndx: integer;\r\n begin\r\n if FieldValues <> nil then begin\r\n \tuplcode := uppercase(desig);\r\n for i := 0 to FieldValues.Count-1 do\r\n if FieldValues[i].Linecode = uplcode then begin\r\n fldndx := FindFieldsIndex(FieldValues.FldValues[i].WebFormID, FieldValues.FldValues[i].WebFieldID);\r\n\t \t \tFieldValues.FindReplaceOrAdd(fm, ndx, 0, fldndx, val);\r\n end;\r\n end;\r\n end;\r\n\r\n begin\r\n \t// H|fm|gp|ndx|HYEAR=%s|RETID=%d|TPID=%d|STPID=%d|HRES=%s|HFTYPE=%s|HSTAT=%s|HBALANCE=%.2f|HREFUND=%.2f|HTAX=%.2f|HPIO=%.2f|',\r\n \tpair.AsString := s;\r\n fm := pair.Values.AsInteger[2];\r\n //gp := pair.Values.AsInteger[3];\r\n ndx := pair.Values.AsInteger[4];\r\n \tfor p := 5 to pair.nParams do begin\r\n \tdesig := pair.CodeString[p];\r\n\t\t\tif desig >= 'A' then\r\n \t \tLocalSetByLineCode(desig, pair.Values[p]);\r\n end;\r\n end;\r\n\r\n procedure HandlePayData(s: string);\r\n var p, fm, {gp,} ndx: integer;\r\n \t desig: string;\r\n\r\n \tprocedure LocalSetByLineCode(desig, val: string);\r\n var uplcode: string;\r\n \t i, fldndx: integer;\r\n begin\r\n if FieldValues <> nil then begin\r\n \tuplcode := uppercase(desig);\r\n for i := 0 to FieldValues.Count-1 do\r\n if FieldValues[i].Linecode = uplcode then begin\r\n fldndx := FindFieldsIndex(FieldValues.FldValues[i].WebFormID, FieldValues.FldValues[i].WebFieldID);\r\n\t \t \tFieldValues.FindReplaceOrAdd(fm, ndx, 0, fldndx, val);\r\n end;\r\n end;\r\n end;\r\n\r\n begin\r\n \t// P|fm|ndx|PAYR=%s|PATYP=%s|PAYBALANCE=0.00|PAYAMOUNT=0.00|\r\n \tpair.AsString := s;\r\n fm := pair.Values.AsInteger[2];\r\n //gp := pair.Values.AsInteger[3];\r\n ndx := pair.Values.AsInteger[4];\r\n \tfor p := 5 to pair.nParams do begin\r\n \tdesig := pair.CodeString[p];\r\n\t\t\tif desig >= 'A' then\r\n \t \tLocalSetByLineCode(desig, pair.Values[p]);\r\n end;\r\n end;\r\n\r\n procedure HandleWS(s: string);\r\n begin\r\n \ttry\r\n \t\tRecons.Add(s);\r\n except\r\n \tdmClientConnections.SendConsoleMessage('Error adding WS records: ' + s);\r\n end;\r\n end;\r\n\r\n{ procedure ShowReconsDbg;\r\n var i: integer;\r\n \t s: string;\r\n begin\r\n \twith Recons do begin\r\n \ts := '';\r\n \tfor i := 1 to nRecons do with ReconArr[i] do begin\r\n \ts := inttostr(i) + ': ' + Frequency + '-' + Year + ':' + AsString;\r\n \tdmClientConnections.SendConsoleMessage(s);\r\n end;\r\n end;\r\n end;\r\n}\r\n\r\nbegin\r\n\tpair := TDataPairParams.create(150, '|', 0, '=');\r\n result := '';\r\n OCCList.Clear;\r\n ccnt := 0;\r\n\twith spa do begin\r\n \tAsString := data;\r\n \tfor ln := 1 to spa.nParams do begin\r\n \tif length(spa[ln]) > 4 then begin\r\n \tSetIndex(ln);\r\n ltyp := spa.parm[1];\t//copy(spa[ln], 1, 1);\r\n if ltyp = 'B' then HandleBasicInfo(spa[ln])\r\n else if ltyp = 'H' then HandleHistory(spa[ln])\r\n else if ltyp = 'Y' then HandleHistory(spa[ln])\r\n else if ltyp = 'P' then HandlePayData(spa[ln])\r\n else if ltyp = 'T' then HandleTP(spa[ln])\r\n else if ltyp = '4' then HandleWS(spa[ln])\r\n else if ltyp = 'C' then begin\r\n \tinc(ccnt);\r\n \tOCCList.Add(spa.parm[2], spa.parm[3], spa.parm.asFloat[4]);\r\n end\r\n \telse HandleOneLine(spa[ln]);\r\n end;\r\n end;\r\n end;\r\n// ShowMessage(inttostr(spa.Count) + '/' + inttostr(OCCList.Count) + '/' + inttostr(ccnt));\r\n pair.free;\r\n //ShowReconsDbg;\r\nend;\r\n\r\nprocedure TTransPackage.Init;\r\nbegin\r\n\tFPackageID := CurrentTransaction;\r\n FLineSeq := 0;\r\n sBalance := LineCodeVars.LineCodeString('XTOTALBAL');\r\n sRefund := LineCodeVars.LineCodeString('XTOTALOVER');\r\nend;\r\n\r\nfunction TTransPackage.LineData(const typ: string; const gp, ndx, sub: integer): string;\r\nvar i: integer;\r\n\t pair, msg: string;\r\n\r\n\tfunction ShouldExport: boolean;\r\n //var fndx: integer;\r\n begin\r\n// \tresult := true;\r\n with FieldValues[i] do begin\r\n \t// Is it correct group\r\n// if ndx > 0 then begin\r\n\t\t\t// do not export if type is a multiple, and not asking for it\r\n result := true;\t//WriteOut; this needs to be implemented later: right now need all in order to print to tax form\r\n \tif ((ndx > 0) and (ndx <> GroupIndex)) or\r\n \t\t((sub > 0) and (sub <> SubIndex)) then\r\n \tresult := false;\r\n// end;\r\n{bch\r\n\t\t\tif result then then result := WriteOut;\r\n\t\t\tif result then begin\r\n\t // Should it be exported\r\n fndx := WebFieldsFindIndex(WebFormID, WebFieldID);\r\n // change: send all including totals, exclude readonly (History info/captions/etc)\r\n if fndx < 0 then result := false\r\n else result := (pos(WebFields[fndx].Store, 'RN') = 0);\t\t// allow for Y or S\r\n end;\r\n}\r\n end;\r\n end;\r\n\r\n function MatchingLineType: boolean;\r\n var ltype: string;\r\n begin\r\n \tltype := FieldValues[i].LineType;\r\n \tresult := (ltype = typ);\r\n end;\r\n\r\nbegin\r\n\tresult := '';\r\n for i := 0 to FieldValues.Count-1 do with FieldValues[i] do begin\r\n\t\tpair := '';\r\n msg := inttostr(ndx) + ':' + inttostr(sub) + ':' + LineType + ':';\r\n \tif MatchingLineType then begin\r\n \tmsg := msg + 'Matching/';\r\n if (FieldValue.AnyValue) then begin\r\n \tmsg := msg + 'Value/';\r\n if ShouldExport then begin\r\n\t\t \tpair := DataPair;\r\n \t\t\tresult := result + Pair + '|';\r\n end;\r\n end;\r\n end;\r\n if LineCode = 'XTOTALBAL' then\r\n dmClientConnections.SendConsoleMessage('XTOTALBAL:' + msg + pair);\r\n end;\r\nend;\r\n\r\nfunction TTransPackage.LineHeader(const typ: string; const ndx, sub: integer): string;\r\nbegin\r\n\tinc(FLineSeq);\r\n \tresult := typ + '|' + inttostr(FPackageID) + '|' + inttostr(FLineSeq) + '|' +\r\n \t inttostr(CurrentTaxpayerID) + '|' + CurrentTaxYear + '|';\r\n if ndx > 0 then result := result + inttostr(ndx);\r\n result := result + '|';\r\n if sub > 0 then result := result + inttostr(sub);\r\n result := result + '|';\r\nend;\r\n\r\nfunction TTransPackage.PackageHeader: string;\r\nbegin\r\n // Z|TPID|STPID|RETURNID|TAXYEAR|BALANCE|REFUND|FILETYPE|RESCODE\r\n// result := format('Z|%d|%d|%d|%s|%s|%s|%s|%s|',\r\n// \t[CurrentTaxpayerID, CurrentSecondaryID, FPackageID, CurrentTaxYear, sBalance, sRefund, BFileType, BResCode]);\r\n result := LineHeader('Z', 0, 0) + format('%s|%s|%s|%s|', [sBalance, sRefund, BFileType, BResCode]);\r\nend;\r\n\r\nfunction TTransPackage.PackageLine(const typ: string; const gp, ndx, sub: integer): string;\r\nvar s: string;\r\nbegin\r\n\tresult := '';\r\n\ts := LineData(typ, gp, ndx, sub);\r\n if s > '' then\r\n\t\tresult := LineHeader(typ, ndx, sub) + s;\r\nend;\r\n\r\nfunction TTransPackage.PackageTrailer: string;\r\nbegin\r\n result := '';\r\nend;\r\n\r\nprocedure TTransPackage.SetLineTypes(const typ: string);\r\nbegin\r\n\t// Taxpayer will always go, so leave out here\r\n\tLineTypes := '';\r\n\tif (typ = 'I') or (typ = 'R') then LineTypes := 'RTW' \t\t// Return\r\n\telse if typ = 'C' then LineTypes := 'X' \t\t// Return\r\n else if typ = 'W' then LineTypes := '4X'\r\n else if typ = '3' then LineTypes := '34X'\r\n else if typ = '4' then LineTypes := '4X'\r\n else if typ = 'T' then LineTypes := 'T' // Taxpayer\r\n else if typ = 'P' then LineTypes := 'P' // Payment\r\n else LineTypes := typ;\r\n// Images will be separate: else if typ = 'D' then LineTypes := 'D' // Documents\r\nend;\r\n\r\nprocedure TTransPackage.TaxpayerUpdates;\r\nvar ln: string;\r\nbegin\r\n ln := PackageLine('T');\r\n if ln > '' then\r\n AddLineToArray(ln);\r\nend;\r\n\r\n\r\n{ TTransfer }\r\n\r\nfunction TTransfer.CallGetData(const cmd: string): string;\r\nvar promise: TJSXMLHttpRequest;\r\n request, s: string;\r\nbegin\r\n\trequest := 'GetData?hdr3=' + MessageHeader;\t// + '&Cmd=' + cmd;\r\n dmClientConnections.HttpRequest.URL := CTSERVICECONNSTRING + request;\r\n\tIncCallCounter(ccGetData);\r\n promise := await(TJSXMLHttpRequest, dmClientConnections.HttpRequest.Perform);\r\n s := XMLSplitValue(promise.ResponseText);\r\n result := s;\r\n try\r\n \tif wReturn <> nil then wReturn.CounterTimer.enabled := true;\r\n except\r\n end;\r\nend;\r\n\r\nfunction TTransfer.CallGetRequestID: string;\r\nvar promise: TJSXMLHttpRequest;\r\n request, s: string;\r\nbegin\r\n\trequest := 'GetRequest';\t// + '&Cmd=' + cmd;\r\n dmClientConnections.HttpRequest.URL := CTSERVICECONNSTRING + request;\r\n promise := await(TJSXMLHttpRequest, dmClientConnections.HttpRequest.Perform);\r\n s := XMLSplitValue(promise.ResponseText);\r\n result := s;\r\nend;\r\n\r\nfunction TTransfer.CallSendData(const cmd, data: string): string;\r\nvar promise: TJSXMLHttpRequest;\r\n request, s: string;\r\nbegin\r\n\tresult := '';\r\n\trequest := 'SendData?Cmd='+cmd + '&hdr5=' + MessageHeader + '&data='+data;\r\n dmClientConnections.HttpRequest.URL := CTSERVICECONNSTRING + request;\r\n\tIncCallCounter(ccSendData, cmd);\r\n promise := await(TJSXMLHttpRequest, dmClientConnections.HttpRequest.Perform);\r\n s := XMLSplitValue(promise.ResponseText);\r\n// dmClientConnections.SendConsoleMessage('Received: ' +formatdatetime('nn:ss.zzz', now) + ' ' + copy(s, 1, 50));\r\n result := s;\r\n try\r\n \tif wReturn <> nil then wReturn.CounterTimer.enabled := true;\r\n except\r\n end;\r\nend;\r\n\r\nfunction TTransfer.CallSendDoc(const fn, desc, yr, comm, data: string): string;\r\nvar resp, request: string;\r\n\t promise: TJSXMLHttpRequest;\r\nbegin\r\n\tresult := '';\r\n with dmClientConnections.PostHttpReq do begin\r\n \tPostData := MessageHeader + fn + '|' + desc + '|' + yr + '|' + comm + '|' + data;\t// 5 pipes in messageheader\r\n\t\trequest := 'UploadDocument';\r\n \tURL := CTFILEUPLOADCONNSTRING + request;\r\n\t\tIncCallCounter(ccUploadDoc);\r\n\t promise := await(TJSXMLHttpRequest, Perform);\r\n\tend;\r\n resp := XMLSplitValue(promise.ResponseText);\r\n dmClientConnections.SendConsoleMessage('Received: ' +formatdatetime('hh:nn:ss.zzz', now) + ' ' + copy(resp, 1, 50));\r\n\r\n result := resp;\r\nend;\r\n\r\nfunction TTransfer.CallSendServicePayment(const cmd, data: string): string;\r\nvar promise: TJSXMLHttpRequest;\r\n request, s: string;\r\nbegin\r\n dmClientConnections.SendConsoleMessage('Start CallSendSP');\r\n\tresult := '';\r\n\trequest := 'PaymentService?Cmd='+cmd + '&hdr6=' + MessageHeader + '&data='+data;\r\n dmClientConnections.HttpRequest.URL := CTSERVICECONNSTRING + request;\r\n dmClientConnections.SendConsoleMessage('Before CallSendSP Perform ' + request);\r\n\tIncCallCounter(ccPayService);\r\n promise := await(TJSXMLHttpRequest, dmClientConnections.HttpRequest.Perform);\r\n s := XMLSplitValue(promise.ResponseText);\r\n dmClientConnections.SendConsoleMessage('After CallSendSP Perform');\r\n dmClientConnections.SendConsoleMessage('Received: ' +formatdatetime('hh:nn:ss.zzz', now) + ' ' + copy(s, 1, 50));\r\n result := s;\r\nend;\r\n\r\nfunction TTransfer.CallServicePaymentCompleted(const cmd, data: string): string;\r\nvar promise: TJSXMLHttpRequest;\r\n request, s: string;\r\nbegin\r\n\tresult := '';\r\n\trequest := 'PaymentServiceComplete?Cmd='+cmd + '&hdr7=' + MessageHeader;\r\n dmClientConnections.HttpRequest.URL := CTSERVICECONNSTRING + request;\r\n\tIncCallCounter(ccPayServiceComplete);\r\n promise := await(TJSXMLHttpRequest, dmClientConnections.HttpRequest.Perform);\r\n s := XMLSplitValue(promise.ResponseText);\r\n dmClientConnections.SendConsoleMessage('Received: ' +formatdatetime('hh:nn:ss.zzz', now) + ' ' + copy(s, 1, 50));\r\n result := s;\r\nend;\r\n\r\nfunction TTransfer.MessageHeader: string;\r\nbegin\r\n\t// Token, Transaction, Type?, TPID, STPID\r\n\tresult := format('%s|%d|%s|%d|%d|',\r\n \t[CurrentToken, CurrentTransaction, TransType, CurrentTaxpayerID, CurrentSecondaryID]);\r\nend;\r\n\r\nend.\r\n","unit ClientConnectionsDM;\r\n\r\ninterface\r\n\r\nuses\r\n SysUtils, Classes, JS, Web, WEBLib.Modules, WebLib.Controls,\r\n WEBLib.Dialogs, XData.Web.Connection, XData.Web.Client, WEBLib.REST, WEBLib.ExtCtrls;\r\n\r\n(*const\r\n\tSERVICE_GETSTATUS = 'ICTService.GetStatus';\r\n SERVICE_LOGIN = 'ICTService.Login';\r\n*)\r\n\r\ntype\r\n TdmClientConnections = class(TDataModule)\r\n XDataClient: TXDataWebClient;\r\n XDataConnection: TXDataWebConnection;\r\n HttpRequest: THttpRequest;\r\n PostHTTPReq: THttpRequest;\r\n WebRESTClient1: TRESTClient;\r\n PayTimer: TTimer;\r\n HttpRequestFile: THttpRequest;\r\n WebHttpRequest2: THttpRequest;\r\n procedure XDataClientError(Error: TXDataClientError);\r\n procedure XDataClientLoad(Response: TXDataClientResponse);\r\n procedure XDataConnectionError(Error: TXDataWebConnectionError);\r\n procedure XDataConnectionRequest(Args: TXDataWebConnectionRequest);\r\n procedure XDataConnectionResponse(Args: TXDataWebConnectionResponse);\r\n procedure XDataConnectionConnect(Sender: TObject);\r\n procedure PostHTTPReqAbort(Sender: TObject);\r\n procedure PostHTTPReqError(Sender: TObject;\r\n ARequest: TJSXMLHttpRequestRecord; Event: TJSEventRecord;\r\n var Handled: Boolean);\r\n procedure PayTimerTimer(Sender: TObject);\r\n function MessageToParm(msg: string): string;\r\n private\r\n { Private declarations }\r\n public\r\n { Public declarations }\r\n\r\n\r\n [async]\r\n procedure OpenDataConnection; async;\r\n\r\n procedure SendConsoleMessage(msg: string; svc: integer=2);\r\n\r\n protected procedure LoadDFMValues; override; end;\r\n\r\nvar\r\n dmClientConnections: TdmClientConnections;\r\n\r\nimplementation\r\n\r\n{%CLASSGROUP 'Vcl.Controls.TControl'}\r\n\r\n{$R *.dfm}\r\n\r\nuses Utilities, ClientCurrent, PayServiceClient, Return;\r\n\r\nfunction TdmClientConnections.MessageToParm(msg: string): string;\r\nvar i: integer;\r\nbegin\r\n\tresult := '';\r\n for i := 1 to length(msg) do begin\r\n if msg[i] = ' ' then result := result + '%20'\r\n else result := result + msg[i];\r\n end;\r\nend;\r\n\r\nprocedure TdmClientConnections.OpenDataConnection;\r\n\r\n{ procedure OnConnect;\r\n begin\r\n WriteLn('XData server connected succesfully!');\r\n PerformSomeRequest;\r\n end;\r\n procedure OnError(Error: TXDataWebConnectionError);\r\n begin\r\n WriteLn('XData server connection failed with error: ' + Error.ErrorMessage);\r\n end;\r\n begin\r\n XDataWebConnection1.URL := 'http://localhost:2001/tms/music';\r\n XDataWebConnection1.Open(@OnConnect, @OnError);\r\n end;\r\n}\r\n\r\nbegin\r\n try\r\n\t await(XDataConnection.OpenAsync);\r\n\t ShowMessage('XData server connected succesfully!');\r\n \t//PerformSomeRequest;\r\n except\r\n\t on Error: Exception do\r\n \t\tShowMessage('XData server connection failed with error: ' +\r\n\t\t\t Error.Message);\r\n end;\r\nend;\r\n\r\nprocedure TdmClientConnections.XDataClientError(Error: TXDataClientError);\r\nbegin\r\n LogMessage('Connection Error');\r\nend;\r\n\r\nprocedure TdmClientConnections.XDataClientLoad(Response: TXDataClientResponse);\r\nbegin\r\n(*\tif Response.StatusCode = 200 then begin\r\n \tif Response.RequestID = SERVICE_GETSTATUS then\r\n \tLogMessage('Received Status: ' +'');\r\n end;\r\n*)\r\nend;\r\n\r\nprocedure TdmClientConnections.XDataConnectionConnect(Sender: TObject);\r\nbegin\r\n//\r\nend;\r\n\r\nprocedure TdmClientConnections.XDataConnectionError(\r\n Error: TXDataWebConnectionError);\r\nbegin\r\n\tXDataConnection.Connected := false;\r\nend;\r\n\r\nprocedure TdmClientConnections.XDataConnectionRequest(\r\n Args: TXDataWebConnectionRequest);\r\nbegin\r\n//\r\nend;\r\n\r\nprocedure TdmClientConnections.XDataConnectionResponse(\r\n Args: TXDataWebConnectionResponse);\r\nbegin\r\n//\r\nend;\r\n\r\nprocedure TdmClientConnections.PayTimerTimer(Sender: TObject);\r\nbegin\r\n\tPayTimerTimer;\r\nend;\r\n\r\nprocedure TdmClientConnections.PostHTTPReqAbort(Sender: TObject);\r\nbegin\r\n\tShowMessage('Error Posting Document');\r\nend;\r\n\r\nprocedure TdmClientConnections.PostHTTPReqError(Sender: TObject;\r\n ARequest: TJSXMLHttpRequestRecord; Event: TJSEventRecord;\r\n var Handled: Boolean);\r\nbegin\r\n\tSendConsoleMessage('Error Posting ' + ARequest.req.ResponseURL);\r\nend;\r\n\r\nprocedure TdmClientConnections.SendConsoleMessage(msg: string; svc: integer=2);\r\nvar request: string;\r\nbegin\r\n\trequest := 'SendMessage?hdr1=' + CurrentToken + '&Value=' + MessageToParm(msg);\r\n if wReturn <> nil then begin\r\n \twReturn.DebugMessage(msg);\r\n \twReturn.DebugMessage('*----*' + MessageToParm(msg));\r\n end;\r\n\tIncCallCounter(ccMessage);\r\n{$IFNDEF LOCALHOST}\r\n\tCTFILEUPLOADCONNSTRINGB := CTFILEUPLOADCONNSTRING;\r\n{$ELSE}\r\n\tCTFILEUPLOADCONNSTRINGB := CTSERVICECONNSTRING;\r\n{$ENDIF}\r\n// \tCTFILEUPLOADCONNSTRINGB := 'https://Findlay.OhioCityTax.com/API/CTF/CTFileSvc/';\r\n\tcase svc of\r\n\t\t0: HttpRequestFile.URL := CTSERVICECONNSTRING + request;\r\n 3: HttpRequestFile.URL := CTUPLOADCONNSTRING + request;\r\n else HttpRequestFile.URL := CTFILEUPLOADCONNSTRING + request;\r\n end;\r\n HttpRequestFile.Perform;\r\nend;\r\n\r\n\r\nprocedure TdmClientConnections.LoadDFMValues;\r\nbegin\r\n inherited LoadDFMValues;\r\n\r\n XDataClient := TXDataWebClient.Create(Self);\r\n XDataConnection := TXDataWebConnection.Create(Self);\r\n HttpRequest := THttpRequest.Create(Self);\r\n PostHTTPReq := THttpRequest.Create(Self);\r\n WebRESTClient1 := TRESTClient.Create(Self);\r\n PayTimer := TTimer.Create(Self);\r\n HttpRequestFile := THttpRequest.Create(Self);\r\n WebHttpRequest2 := THttpRequest.Create(Self);\r\n\r\n XDataClient.BeforeLoadDFMValues;\r\n XDataConnection.BeforeLoadDFMValues;\r\n HttpRequest.BeforeLoadDFMValues;\r\n PostHTTPReq.BeforeLoadDFMValues;\r\n WebRESTClient1.BeforeLoadDFMValues;\r\n PayTimer.BeforeLoadDFMValues;\r\n HttpRequestFile.BeforeLoadDFMValues;\r\n WebHttpRequest2.BeforeLoadDFMValues;\r\n try\r\n Name := 'dmClientConnections';\r\n Height := 286;\r\n Width := 399;\r\n XDataClient.SetParentComponent(Self);\r\n XDataClient.Name := 'XDataClient';\r\n XDataClient.Connection := XDataConnection;\r\n SetEvent(XDataClient, Self, 'OnLoad', 'XDataClientLoad');\r\n SetEvent(XDataClient, Self, 'OnError', 'XDataClientError');\r\n XDataClient.Left := 58;\r\n XDataClient.Top := 107;\r\n XDataConnection.SetParentComponent(Self);\r\n XDataConnection.Name := 'XDataConnection';\r\n XDataConnection.URL := 'localhost:2001/tms/xdata';\r\n SetEvent(XDataConnection, Self, 'OnConnect', 'XDataConnectionConnect');\r\n SetEvent(XDataConnection, Self, 'OnError', 'XDataConnectionError');\r\n SetEvent(XDataConnection, Self, 'OnRequest', 'XDataConnectionRequest');\r\n SetEvent(XDataConnection, Self, 'OnResponse', 'XDataConnectionResponse');\r\n XDataConnection.Left := 58;\r\n XDataConnection.Top := 24;\r\n HttpRequest.SetParentComponent(Self);\r\n HttpRequest.Name := 'HttpRequest';\r\n HttpRequest.Headers.BeginUpdate;\r\n try\r\n HttpRequest.Headers.Clear;\r\n HttpRequest.Headers.Add('Cache-Control=no-cache, no-store, must-revalidate');\r\n finally\r\n HttpRequest.Headers.EndUpdate;\r\n end;\r\n HttpRequest.URL := 'http://localhost:2001/CTS/CTService/Echostring?Value=TestEcho';\r\n HttpRequest.Left := 174;\r\n HttpRequest.Top := 43;\r\n PostHTTPReq.SetParentComponent(Self);\r\n PostHTTPReq.Name := 'PostHTTPReq';\r\n PostHTTPReq.Command := httpPOST;\r\n PostHTTPReq.Headers.BeginUpdate;\r\n try\r\n PostHTTPReq.Headers.Clear;\r\n PostHTTPReq.Headers.Add('Cache-Control=no-cache, no-store, must-revalidate');\r\n finally\r\n PostHTTPReq.Headers.EndUpdate;\r\n end;\r\n SetEvent(PostHTTPReq, Self, 'OnAbort', 'PostHTTPReqAbort');\r\n SetEvent(PostHTTPReq, Self, 'OnError', 'PostHTTPReqError');\r\n PostHTTPReq.Left := 170;\r\n PostHTTPReq.Top := 105;\r\n WebRESTClient1.SetParentComponent(Self);\r\n WebRESTClient1.Name := 'WebRESTClient1';\r\n WebRESTClient1.Left := 285;\r\n WebRESTClient1.Top := 48;\r\n PayTimer.SetParentComponent(Self);\r\n PayTimer.Name := 'PayTimer';\r\n PayTimer.Enabled := False;\r\n SetEvent(PayTimer, Self, 'OnTimer', 'PayTimerTimer');\r\n PayTimer.Left := 237;\r\n PayTimer.Top := 138;\r\n HttpRequestFile.SetParentComponent(Self);\r\n HttpRequestFile.Name := 'HttpRequestFile';\r\n HttpRequestFile.Headers.BeginUpdate;\r\n try\r\n HttpRequestFile.Headers.Clear;\r\n HttpRequestFile.Headers.Add('Cache-Control=no-cache, no-store, must-revalidate');\r\n finally\r\n HttpRequestFile.Headers.EndUpdate;\r\n end;\r\n HttpRequestFile.URL := 'http://localhost:2001/CTS/CTService/Echostring?Value=TestEcho1';\r\n HttpRequestFile.Left := 72;\r\n HttpRequestFile.Top := 184;\r\n WebHttpRequest2.SetParentComponent(Self);\r\n WebHttpRequest2.Name := 'WebHttpRequest2';\r\n WebHttpRequest2.Headers.BeginUpdate;\r\n try\r\n WebHttpRequest2.Headers.Clear;\r\n WebHttpRequest2.Headers.Add('Cache-Control=no-cache, no-store, must-revalidate');\r\n finally\r\n WebHttpRequest2.Headers.EndUpdate;\r\n end;\r\n WebHttpRequest2.URL := 'http://demo.michigancitytax.com:2001/CTS/CTService/Echostring?Value=TestEcho2';\r\n WebHttpRequest2.Left := 173;\r\n WebHttpRequest2.Top := 212;\r\n finally\r\n XDataClient.AfterLoadDFMValues;\r\n XDataConnection.AfterLoadDFMValues;\r\n HttpRequest.AfterLoadDFMValues;\r\n PostHTTPReq.AfterLoadDFMValues;\r\n WebRESTClient1.AfterLoadDFMValues;\r\n PayTimer.AfterLoadDFMValues;\r\n HttpRequestFile.AfterLoadDFMValues;\r\n WebHttpRequest2.AfterLoadDFMValues;\r\n end;\r\nend;\r\n\r\nend.\r\n","unit Formulas;\r\n\r\ninterface\r\n\r\nuses SysUtils, WEBLib.Dialogs, Math;\r\n\r\nfunction CalcFormula(curr, fm: string; currgpndx: integer; conditiononly: boolean=false; numeric: boolean=true): string;\r\nfunction CalcCondition(fm: string; currgpndx: integer): boolean;\r\nfunction CalcFormulaAndFill(curr, fm: string; fvndx: integer; numeric: boolean): boolean;\t// changed\r\nfunction CalcAllFormulas: boolean;\t\t\t\t// changed\r\nfunction CalcOCCredit(othwage, othwith, occrate: double): double;\r\n\r\nvar AffectsFormButtons, AffectsSectButtons, AffectsSection: boolean;\r\n//\t hmsg: string;\r\n\r\nimplementation\r\n\r\nuses entForms, entFieldValues, ClientCurrent, OptionsDM;\r\n\r\n//var msg: string;\r\n\r\nfunction CalcFormula(curr, fm: string; currgpndx: integer; conditiononly: boolean=false; numeric: boolean=true): string;\r\nvar newval: string;\r\n Tokens: array[1..50] of string;\r\n nTokens, maxparens: integer;\r\n\r\n(*\tfunction MatchingParentheses(s: string; pst: integer): integer;\r\n var i, stk: integer;\r\n begin\r\n \tresult := 0;\r\n \ti := pst+1;\r\n stk := 1;\r\n // stop when stk is zero or end of clause\r\n while (i <= length(s)) and (stk <> 0) do begin\r\n if s[i] = ')' then dec(stk)\r\n else if s[i] = '(' then inc(stk);\r\n inc(i);\r\n end;\r\n if stk = 0 then\r\n \tresult := i - 1;\r\n end;\r\n*)\r\n\r\n\tfunction Matching(tkn: string; pst: integer): integer;\r\n var i, ln: integer;\r\n begin\r\n \tresult := 0;\r\n \ti := pst+1;\r\n ln := length(tkn);\r\n // stop when stk is zero or end of clause\r\n while (i <= length(fm)) and (result = 0) do begin\r\n if copy(fm, i, ln) = tkn then result := i;\r\n inc(i);\r\n end;\r\n end;\r\n\r\n\tfunction GetTheValue(myfld: string): string;\r\n var p, fid, fld, gpndx: integer;\r\n \t s, sumoper: string;\r\n begin\r\n \t// expecting fm.Fld or fm.fld.G where G says sum all for any groupindex\r\n // or fm.fld.S where S says suma all for any SubIndex for current GroupIndex\r\n // or LINECODE\r\n result := '';\r\n fid := 0;\r\n fld := 0;\r\n gpndx := 0;\r\n sumoper := '';\r\n s := myfld;\r\n p := pos('.', s);\r\n if p > 0 then begin\r\n fid := strtointdef(copy(s, 1, p-1), 0);\r\n s := copy(s, p+1, length(s)-p);\r\n p := pos('.', s);\r\n if p > 0 then begin\r\n \tfld := strtointdef(copy(s, 1, p-1), 0);\r\n sumoper := copy(s, p+1, length(s)-p);\r\n end\r\n else\r\n \tfld := strtointdef(s, 0);\r\n //gpndx := strtointdef(copy(s, 1, p-1), 0); // should be 0:current gpndx or -1: sum all gpndx\r\n\r\n if (fid > 0) and (fld > 0) then begin\r\n if sumoper = 'G' then\r\n gpndx := -1\r\n else if sumoper = 'S' then\r\n gpndx := currgpndx\r\n else\r\n gpndx := 0;\r\n result := FieldValues.GetTotal(fid, gpndx, fld);\r\n end;\r\n{ if result <> '0.00' then\r\n \tmsg := msg + myfld+':'+result+' | ';\r\n}\r\n end\r\n else\r\n \tresult := LineCodeVars.LineCodeString(s);\r\n end;\r\n\r\n procedure Tokenize;\r\n var i, st, en, pcntr: integer;\r\n \t fch: string;\r\n RFnd: boolean;\r\n\r\n procedure AddTokenValue(tkn: string);\r\n begin\r\n \tinc(nTokens);\r\n Tokens[nTokens] := tkn;\r\n end;\r\n\r\n procedure AddToken(start, len: integer);\r\n var tkn: string;\r\n begin\r\n \ttkn := copy(fm, start, len);\r\n AddTokenValue(tkn);\r\n end;\r\n\r\n procedure OneItem(tkn: string);\r\n begin\r\n st := i;\r\n en := Matching(tkn, st);\r\n AddToken(st, en-st+1);\r\n i := en;\r\n end;\r\n\r\n procedure FillItem;\r\n var s, tkn: string;\r\n begin\r\n \ttkn := '}';\r\n st := i;\r\n en := Matching(tkn, st);\r\n s := copy(fm, st+1, en-st-1);\r\n// fm := copy(fm, 1, st-1) + '[' + GetTheValue(s) + ']' + copy(fm, en+1, length(fm)-en);\r\n AddTokenValue('['+GetTheValue(s)+']');\r\n i := en;\r\n end;\r\n\r\n function FindMatchingLeft: string;\r\n var p: integer;\r\n \t ch: string;\r\n begin\r\n \tch := '(' + inttostr(pcntr);\r\n p := nTokens;\r\n while (p > 1) and (pos(ch, Tokens[p]) = 0) do dec(p);\r\n result := Tokens[p];\r\n end;\r\n\r\n procedure AddLeftParen(s: string);\r\n begin\r\n \tinc(pcntr);\r\n if pcntr > MaxParens then MaxParens := pcntr;\r\n AddTokenValue(s+'('+inttostr(pcntr));\r\n end;\r\n\r\n procedure AddRightParen(isend: boolean=false);\r\n var s: string;\r\n\r\n \tprocedure AddParen;\r\n begin\r\n \t AddTokenValue(')'+inttostr(pcntr));\r\n\t \tdec(pcntr);\r\n end;\r\n\r\n begin\r\n \tAddParen;\r\n \t// could be end of IF function and need extra\r\n if isend then begin\r\n s := FindMatchingLeft;\r\n \t if (pos('(', s) > 0) and (copy(s, 1, 1) <> '(') then begin // function IF, M, X\r\n\t AddTokenValue(')'+inttostr(pcntr));\r\n \t \tdec(pcntr);\r\n end;\r\n end;\r\n end;\r\n\r\n procedure AddLogicToken;\r\n begin\r\n \tAddRightParen;\r\n AddToken(i, 1);\r\n AddLeftParen('');\r\n end;\r\n\r\n\r\n begin\r\n \tnTokens := 0;\r\n i := 1;\r\n pcntr := 0;\r\n RFnd := false;\r\n while (i <= length(fm)) do begin\r\n \tfch := fm[i];\r\n if fch = '(' then AddLeftParen('')\r\n else if fch = ')' then AddRightParen(true)\r\n \telse if pos(fch, '&^=!<>') > 0 then AddLogicToken\r\n else if pos(fch, '*%/') > 0 then AddTokenValue(fch)//HigherPrecedence(fch)\r\n \telse if pos(fch, '+-@PB') > 0 then AddTokenValue(fch)\r\n \telse if fm[i] = '{' then FillItem\r\n else if fm[i] = '[' then OneItem(']')\r\n\r\n // Functions: M,X,ITE,R,P,B\r\n else if copy(fm, i, 3) = 'IF(' then begin\r\n \tAddLeftParen('IF');\r\n AddLeftParen('');\r\n// AddLeftParen('');\r\n inc(i, 2);\r\n end\r\n else if pos(copy(fm, i, 2), 'M(X(') > 0 then begin\r\n \tAddLeftParen(copy(fm, i, 1));\r\n AddLeftParen('');\r\n inc(i);\r\n // parameters\r\n end\r\n else if fm[i] = 'R' then begin\r\n if (i < length(fm)) and (fm[i+1] < 'A') then begin\r\n \tAddToken(i, 2);\r\n inc(i);\r\n end\r\n else\r\n \tAddTokenValue('R');\r\n RFnd := true;\r\n end\r\n else if pos(fm[i], ',') > 0 then begin\r\n \tAddRightParen();\r\n AddTokenValue(',');\r\n \tAddLeftParen('');\r\n end\r\n else if pos(fm[i], ':') > 0 then begin\r\n \tif copy(Tokens[nTokens], 1, 1) = '(' then \t//final else condition\r\n \tAddTokenValue('[T]');\r\n //AddRightParen();\r\n \tAddRightParen(); // end of logic op\r\n AddTokenValue(':');\r\n \tAddLeftParen('');\r\n end;\r\n inc(i);\r\n end;\r\n if not RFnd and not conditiononly and numeric then AddTokenValue('R2');\r\n// HigherPrecedence;\r\n end;\r\n\r\n procedure CalculateClause(clause: string);\t// blank clausetype means unknown, can be blank or String or Number or Boolean\r\n var lvl: integer;\r\n\r\n procedure DoOperators(lst: string);\r\n var ndx, lft, rt, opndx: integer;\r\n fnd: boolean;\r\n\r\n function FindOne: boolean;\r\n begin\r\n \twhile not fnd and (ndx <= nTokens) do begin\r\n \tif Tokens[ndx] > ' ' then begin\r\n if copy(Tokens[ndx], 1, 1) = '[' then begin\r\n if (lft > 0) and (opndx > 0) then begin\r\n rt := ndx;\r\n fnd := true;\r\n end\r\n else begin\r\n lft := ndx;\r\n opndx := 0;\r\n end;\r\n end\r\n else if pos(Tokens[ndx], lst) > 0 then begin\r\n opndx := ndx;\r\n end\r\n else if Tokens[ndx] > '' then begin\r\n // clear\r\n lft := 0;\r\n opndx := 0;\r\n rt := 0;\r\n end;\r\n end;\r\n if not fnd then\r\n \tinc(ndx);\r\n end;\r\n result := fnd;\r\n end;\r\n\r\n procedure CalcIt;\r\n var op, term1, term2, res: string;\r\n \t amt1, amt2: double;\r\n\r\n \tprocedure PutResult(val: string);\r\n begin\r\n \tTokens[lft] := '';\r\n \tTokens[rt] := '';\r\n \tTokens[opndx] := '[' + val + ']';\r\n end;\r\n\r\n function Amount(term: string): double;\r\n begin\r\n if term = '' then result := 0\r\n else result := strtofloatdef(term, -1024);\r\n end;\r\n\r\n \tprocedure CalcLogic;\r\n var res: boolean;\r\n begin\r\n \tamt1 := Amount(term1);\r\n \tamt2 := Amount(term2);\r\n // deal with possible storing of value as blank for number\r\n if (amt2 <> -1024) and (amt1 = -1024) and (trim(term1) = '') then\r\n \tamt1 := 0;\r\n if (amt1 <> -1024) and (amt2 = -1024) and (trim(term2) = '') then\r\n \tamt2 := 0;\r\n res := false;\r\n if (amt1 = -1024) or (amt2 = -1024) then begin\r\n \t// string comparison\r\n if op = '=' then\r\n \tres := (term1 = term2)\r\n else if op = '!' then\r\n \tres := (term1 <> term2)\r\n else if op = '>' then\r\n \tres := (term1 >= term2)\r\n else if op = '<' then\r\n \tres := (term1 <= term2);\r\n end\r\n else begin\r\n \t// number comparison\r\n if op = '=' then\r\n \tres := ((abs(amt1)-abs(amt2)) < 0.001)\r\n else if op = '!' then\r\n \tres := ((abs(amt1)-abs(amt2)) > 0.001)\r\n else if op = '>' then\r\n \tres := ((amt1-amt2) > -0.001)\r\n else if op = '<' then\r\n \tres := ((amt2-amt1) > -0.001);\r\n end;\r\n if res then PutResult('T')\r\n else PutResult('F');\r\n end;\r\n\r\n \tprocedure CalcAndOr;\r\n begin\r\n \t// must be [T] or [F] left and right\r\n res := 'F';\r\n if (op = '&') and (term1 = '[T]') and (term2 = '[T]') then res := 'T'\r\n else if (op = '^') and ((term1 = '[T]') or (term2 = '[T]')) then res := 'T';\r\n PutResult(res);\r\n end;\r\n\r\n procedure CalcMath;\r\n var amt: double;\r\n begin\r\n \tamt1 := Amount(term1);\r\n \tamt2 := Amount(term2);\r\n amt := 0;\r\n if amt1 = -1024 then amt1 := 0;\r\n if amt2 = -1024 then amt2 := 0;\r\n if op = '*' then amt := amt1 * amt2\r\n else if op = '%' then begin\r\n \tif amt2 = 0 then amt := amt1\r\n \telse amt := amt1 * amt2 / 100.0;\r\n end\r\n else if op = '/' then begin\r\n \tif amt2 = 0 then amt := 0\r\n \telse amt := amt1 / amt2;\r\n end\r\n else if op = '+' then amt := amt1 + amt2\r\n else if op = '-' then amt := amt1 - amt2;\r\n PutResult(floattostr(amt));\r\n end;\r\n\r\n begin\r\n\t\t\t\top := Tokens[opndx];\r\n term1 := copy(Tokens[lft], 2, length(Tokens[lft])-2);\r\n term2 := copy(Tokens[rt], 2, length(Tokens[rt])-2);\r\n \tif pos(op, '!=<>') > 0 then CalcLogic\r\n \telse if pos(op, '&^') > 0 then CalcAndOr\r\n else CalcMath;\r\n end;\r\n\r\n begin\r\n repeat\r\n \tfnd := false;\r\n\t\t\t\tndx := 1;\r\n\t lft := 0;\r\n \t rt := 0;\r\n opndx := 0;\r\n if FindOne then\r\n \tCalcIt;\r\n until not fnd;\r\n end;\r\n\r\n\t\tprocedure ClearOneTermParens;\r\n var i, j: integer;\r\n \t s, prt, tkn: string;\r\n valid: boolean;\r\n begin\r\n for i := 1 to nTokens do begin\r\n \tif copy(Tokens[i], 1, 1) = '(' then begin\r\n \tprt := ')' + copy(Tokens[i], 2, length(Tokens[i])-1);\r\n j := i + 1;\r\n s := '';\r\n valid := true;\r\n while (j <= nTokens) and (Tokens[j] <> prt) and valid do begin\r\n \ttkn := Tokens[j];\r\n if tkn > '' then begin\r\n\t \tif (s > '') then valid := false\r\n \telse if (copy(tkn, 1, 1) <> '[') or (copy(tkn, length(tkn), 1) <> ']') then valid := false\r\n else s := trim(s + tkn);\r\n end;\r\n \tinc(j);\r\n end;\r\n if valid then begin\r\n \tTokens[i] := '';\r\n Tokens[j] := '';\r\n end;\r\n end;\r\n end;\r\n end;\r\n\r\n\t\tprocedure AllOperators;\r\n begin\r\n \tClearOneTermParens;\r\n \tDoOperators('*%/');\r\n \tDoOperators('&^');\r\n \tDoOperators('+-');\r\n \tDoOperators('=!<>');\r\n \tClearOneTermParens;\r\n end;\r\n\r\n procedure CalcParenClauses(lv: integer);\r\n var ndx: integer;\r\n \t lparen, rparen: string;\r\n\r\n procedure PutResult(lft, rt: integer; val: string);\r\n var i: integer;\r\n begin\r\n \tfor i := lft to rt do Tokens[i] := '';\r\n if copy(val, 1, 1)= '[' then\r\n\t Tokens[lft] := val\r\n else\r\n\t Tokens[lft] := '[' + val + ']';\r\n end;\r\n\r\n procedure ParenClause(n: integer);\r\n var i, j, r: integer;\r\n \t func: string;\r\n res: string;\r\n amt, tot: double;\r\n\r\n \tfunction RightParenIndex: integer;\r\n var i: integer;\r\n begin\r\n i := n + 1;\r\n while (i <= nTokens) and (rparen <> Tokens[i]) do inc(i);\r\n if i > nTokens then result := 0\r\n else result := i;\r\n end;\r\n\r\n function Amount(index: integer): double;\r\n var s: string;\r\n begin\r\n \tresult := 0;\r\n if Tokens[index] > '' then begin\r\n\t \ts := copy(Tokens[index], 2, length(Tokens[index])-2);\r\n \t try\r\n \t \t\tresult := strtofloat(s);\r\n \t except\r\n \t \tresult := 0;\r\n \tend;\r\n end;\r\n end;\r\n\r\n begin\r\n \tr := RightParenIndex;\r\n // should only be functions\r\n func := copy(Tokens[ndx], 1, 2);\r\n if func = 'IF' then begin\r\n \t// should be {IF(lvl} {[T] or [F]} {:} {[val]} {,} repeat ... {)lvl}\r\n res := '';\r\n for i := ndx+1 to r-1 do begin\r\n \tif (res = '') and (Tokens[i] = '[T]') then begin\r\n \tj := i + 1;\r\n while ((Tokens[j] = '') or (Tokens[j] = ':')) and (j < r) do inc(j);\r\n if j < r THen res := Tokens[j];\r\n end;\r\n end;\r\n PutResult(ndx, r, res);\r\n end\r\n else if func = 'M(' then begin\r\n \t// should be {M(lvl} {[val1]} {,} {[val2]} {,} ... {)lvl}\r\n tot := 999999999;\r\n for i := ndx+1 to r-1 do begin\r\n \tif (Tokens[i] <> '') and (Tokens[i] <> ',') then begin\r\n \tamt := Amount(i);\r\n if amt < tot then tot := amt;\r\n end;\r\n end;\r\n if tot = 999999999 then tot := 0;\r\n PutResult(ndx, r, floattostr(tot));\r\n end\r\n else if func = 'X(' then begin\r\n \t// should be {X(lvl} {[val1]} {,} {[val2]} {,} ... {)lvl}\r\n tot := -999999999;\r\n for i := ndx+1 to r-1 do begin\r\n \tif (Tokens[i] <> '') and (Tokens[i] <> ',') then begin\r\n \tamt := Amount(i);\r\n if amt > tot then tot := amt;\r\n end;\r\n end;\r\n if tot = -999999999 then tot := 0;\r\n PutResult(ndx, r, floattostr(tot));\r\n end;\r\n end;\r\n\r\n begin\r\n \t// functions: IF, MAX, MIN\r\n lparen := '(' + inttostr(lv);\r\n rparen := ')' + inttostr(lv);\r\n for ndx := 1 to nTokens do begin\r\n \tif pos(lparen, Tokens[ndx]) > 0 then begin\r\n \tParenClause(ndx);\r\n end;\r\n end;\r\n end;\r\n\r\n procedure EndFuncs;\r\n var frst: string;\r\n \t efarr: array[1..5] of string;\r\n i, narr, dec: integer;\r\n val, mult: double;\r\n begin\r\n \t// Round, Positive\r\n narr := 0;\r\n newval := '';\r\n\t for i := 1 to nTokens do begin\r\n \tfrst := copy(Tokens[i], 1, 1);\r\n \tif (frst <> 'P') and (frst <> 'R') and (frst <> 'B') then\r\n \t \t\tnewval := trim(newval + Tokens[i])\r\n else begin\r\n \tinc(narr);\r\n efarr[narr] := Tokens[i];\r\n end;\r\n end;\r\n\t newval := copy(newval, 2, length(newval)-2);\r\n if not conditiononly and numeric and (newval < 'A') then begin\r\n try\r\n \tif newval = '' then val := 0\r\n else val := strtofloat(newval);\r\n for i := 1 to narr do begin\r\n if (efarr[i] = 'P') then begin\r\n if val < 0 then val := 0;\r\n end\r\n else if (copy(efarr[i], 1, 1) = 'R') then begin\r\n if length(efarr[i]) > 1 then\r\n dec := strtointdef(copy(efarr[i], 2, 1), 0)\r\n else\r\n dec := 0;\r\n mult := strtofloatdef(copy('100000000', 1, dec+1), 0);\r\n val := round(mult*val) / mult;\r\n end\r\n else if (efarr[i] = 'B') then begin\r\n //??\r\n end;\r\n end;\r\n newval := floattostr(val);\r\n except\r\n // then a string, so leave alone\r\n end;\r\n end;\r\n end;\r\n\r\n begin\r\n for lvl := MaxParens downto 1 do begin\r\n \tAllOperators;\r\n CalcParenClauses(lvl);\r\n end;\r\n AllOperators;\r\n EndFuncs;\r\n end;\r\n\r\nbegin\r\n\t// handle same group vs all group records\r\n newval := curr;\r\n if fm > ' ' then begin\r\n \tMaxParens := 0;\r\n \tTokenize;\r\n CalculateClause(fm);\r\n end;\r\n result := newval;\r\nend;\r\n\r\nfunction CalcCondition(fm: string; currgpndx: integer): boolean;\r\nvar newval: string;\r\nbegin\r\n\tresult := true;\r\n if (fm > ' !') and (copy(fm, 1, 1) <> 'T') then begin\r\n \tif copy(fm, 1, 1) <> '(' then begin\r\n \tfm := '(' + fm + ')';\r\n end;\r\n\t\tnewval := CalcFormula('', fm, currgpndx, true, false);\r\n \tresult := (newval = 'T');\r\n end;\r\nend;\r\n\r\nfunction CalcFormulaAndFill(curr, fm: string; fvndx: integer; numeric: boolean): boolean;\t// changed\r\nvar newval: string;\r\n\t fldval: TFldValue;\r\nbegin\r\n\tfldval := TFldValue.create;\r\n fldval.fFormat := FieldValues[fvndx].FieldValue.fFormat;\r\n fldval.asString := CalcFormula(curr, fm, FieldValues[fvndx].GroupIndex, false, numeric);\r\n newval := fldval.FormattedStored;\r\n result := curr <> newval;\r\n if result then\r\n FieldValues[fvndx].FieldValue.AsString := newval;\r\nend;\r\n\r\nfunction CalcAllFormulas: boolean;\t\t\t\t// changed\r\nvar tries: integer;\r\n\t chgd: boolean;\r\n\r\n\tfunction LoopCalcFields: boolean;\r\n var fv: integer;\r\n\r\n \tfunction OneField(fld: TFieldValue): boolean;\r\n var ndx: integer;\r\n holdval: string;\r\n\r\n procedure FillAffects;\r\n var i: integer;\r\n begin\r\n with WebFields[ndx].Affects do begin\r\n if FormButtons then AffectsFormButtons := true;\r\n for i := 1 to 10 do\r\n \t\t\t\tif SectButtons[i] = CurrentFormID then AffectsSectButtons := true;\r\n for i := 1 to 10 do\r\n \t\t\t\tif (Sections[i, 1] = CurrentFormID) and (Sections[i, 2] = CurrentSectionID) then AffectsSection := true;\r\n end;\r\n end;\r\n\r\n begin\r\n \tresult := false;\r\n \twith fld do begin\r\n \t\tndx := FindFieldsIndex(WebFormID, WebFieldID);\r\n if ndx >= 0 then begin\r\n holdval := fld.FieldValue.AsString;\r\n \t\t\tresult := CalcFormulaAndFill(holdval, WebFields[ndx].Calculation, fv, (WebFields[ndx].DataType = '1'));\r\n if result and WebFields[ndx].Affects.Any then FillAffects;\r\n end;\r\n end;\r\n chgd := chgd or result;\r\n end;\r\n\r\n begin\r\n \tresult := false;\r\n for fv := 0 to FieldValues.Count-1 do begin\r\n \tif FieldValues[fv].Calced then\r\n \tresult := result or OneField(FieldValues[fv]);\r\n end;\r\n end;\r\n\r\nbegin\r\n\ttries := 0;\r\n\tAffectsFormButtons := false;\r\n AffectsSectButtons := false;\r\n AffectsSection := false;\r\n chgd := false;\r\n//hmsg := msg;\r\n//msg := '';\r\n\twhile (tries < 15) and LoopCalcFields do\r\n \tinc(tries);\r\n result := chgd;\r\n{if hmsg <> msg then\r\n\tShowMessage(msg);\r\n}\r\nend;\r\n\r\nfunction CalcOCCredit(othwage, othwith, occrate: double): double;\r\n//function TdmOCCredits.SetCreditAmount(redmth: string; reswage, othwage, othwith, redamt: currency; tyear, othcity: string; var gross: currency): currency;\r\nvar {tmp, gross, hold, } amt: currency;\r\n\t occreduction: double;\r\n\r\n\tfunction CheckRange(rate: double): double;\r\n begin\r\n \tresult := rate;\r\n if rate > 0.4 then result := rate / 100.0;\r\n end;\r\n\r\n\tfunction CheckDifRange(rate: double): double;\r\n begin\r\n \tresult := rate;\r\n if rate > 0.03001 then result := rate / 100.0;\r\n end;\r\n\r\n procedure SetReduction;\r\n var ndx: integer;\r\n \t crate, orate, tbrate, perc, minrates, holdrate: double;\r\n begin\r\n (*\r\n OR = Other City Tax Rate\r\n DR = Designated Rate on Method\r\n DP = Designated Percent on Method\r\n CR = Local City Tax Rate\r\n\r\n \tOC Credit Method\r\n\t\t0: None (Michigan)\r\n\t\t1: By Table - use current method\r\n\t\t2: Percent of City Rate\t\t\tCR*%\r\n\t\t3: Percent of Lower Rate\t\tMin(CR, OR) * %\r\n\t\t4: Up to Design Rate \t\t\tMin(OR, DR)\r\n\t\t5: All except Rate \t\t\t\tMin(CR, OR) - DR\r\n\t\t6: All except Rate \t\t\t\tMin(OR - DR, CR)\r\n\t\t7: All except Rate \t\t\t\tMin(CR - DR, OR)\r\n\t\t8: % of Lower OC & Des Rate\tMin(DR, OR) * %\r\n\t\t9: Up to City Rate \t\t\t\tMin(OR, CR)\r\n\r\n\tOC Credit Percent\r\n\tOC Credit Rate\r\n *)\r\n\r\n \tOCCReduction := 0;\r\n if SiteOpts.OCMeth > '0' then begin\r\n if SiteOpts.OCMeth >= 'A' then\r\n ndx := ord(SiteOpts.OCMeth[1]) - 55\r\n else\r\n ndx := strtointdef(SiteOpts.OCMeth, 0);\r\n crate := CheckRange(SiteOpts.ResTaxRate); // local city tax rate\r\n orate := CheckDifRange(OCCRate);\t // designated rate\r\n tbrate := CheckRange(OCCRate);\t // other city table rate\r\n perc := SiteOpts.OCPerc/100.0;\r\n minrates := min(crate, tbRate);\r\n case ndx of\r\n 1: holdrate := occrate;\t//qryCityRatesReduction.AsFloat;\r\n 2: holdrate := crate * perc;\r\n 3: holdrate := minrates * perc;\r\n 4: holdrate := min(orate, tbrate);\r\n 5: holdrate := max(minrates - orate, 0);\r\n 6: holdrate := min(tbrate - orate, crate);\r\n 7: holdrate := min(crate - orate, tbrate);\r\n 8: holdrate := min(orate, tbrate) * perc;\r\n 9: holdrate := min(crate, tbrate);\r\n 10: holdrate := 0.38904 * min(0.01, tbrate) + 0.61096 * min(0.02, tbrate);\r\n else holdrate := 0;\r\n end;\r\n OCCReduction := CheckRange(holdrate);\r\n end;\r\n end;\r\n\r\n{ procedure AdjustGrossByRefund;\r\n var tmp: currency;\r\n begin\r\n tmp := redamt / OCCRate;\r\n if tmp < gross then gross := gross - tmp\r\n else gross := 0;\r\n if gross < 0 then gross := 0;\r\n end;\r\n}\r\n\r\nbegin\r\n // using the correct method, set credit amount\r\n // using the reduction method on this W2 (redmth)\r\n // if underwithheld, then calc that first, before applying reductions\r\n// amt := othwith;\r\n// gross := othwage;\r\n\tSetReduction;\r\n amt := othwage * OCCReduction;\r\n if amt > othwith then\r\n \tamt := othwith;\r\n Result := amt;\r\nend;\r\n\r\nend.\r\n","unit Main;\r\n\r\ninterface\r\n\r\nuses\r\n SysUtils, Classes, JS, Web, WEBLib.Graphics, WEBLib.Controls,\r\n WEBLib.Forms, WEBLib.Dialogs, WEBLib.ExtCtrls, WEBLib.StdCtrls,\r\n SectionPanels, WEBLib.WebCtrls, WEBLib.Imaging.GIFImg;\r\n\r\nprocedure ShowMain;\r\n\r\ntype\r\n TwMain = class(TForm)\r\n pnMain: TPanel;\r\n pnSection: TPanel;\r\n pnSectionHeading: TPanel;\r\n lbSectionHeading: TLabel;\r\n WebPanel1: TPanel;\r\n btMainReturn: TButton;\r\n btMainPayment: TButton;\r\n btMainUpload: TButton;\r\n btMainTaxpayer: TButton;\r\n btCurrRecon: TButton;\r\n btPrevRecon: TButton;\r\n timPDF: TTimer;\r\n WebOpenDialog1: TOpenDialog;\r\n pnHeader: TPanel;\r\n lbTaxYear: TLabel;\r\n lbCurrentStatus: TLabel;\r\n pnLogo: TPanel;\r\n imgLogo: TImageControl;\r\n WebLinkLabel1: TLinkLabel;\r\n WebWaitMessage1: TWaitMessage;\r\n procedure WebFormShow(Sender: TObject);\r\n procedure btMainReturnClick(Sender: TObject);\r\n procedure btMainTaxpayerClick(Sender: TObject);\r\n procedure btMainPaymentClick(Sender: TObject);\r\n procedure btCurrReconClick(Sender: TObject);\r\n procedure btPrevReconClick(Sender: TObject);\r\n procedure timPDFTimer(Sender: TObject);\r\n procedure btMainUploadClick(Sender: TObject);\r\n procedure WebFormCreate(Sender: TObject);\r\n procedure WebFormDestroy(Sender: TObject);\r\n private\r\n procedure SetupSection;\r\n procedure ShowScreen;\r\n procedure StartWHYear(cap, msg: string);\r\n { Private declarations }\r\n public\r\n { Public declarations }\r\n protected procedure LoadDFMValues; override; end;\r\n\r\nvar\r\n wMain: TwMain;\r\n TimerFlag: boolean;\r\n\r\nimplementation\r\n\r\n{$R *.dfm}\r\nuses Login, OptionsDM, Return, ClientCurrent, entForms, TransferWeb, \r\nFieldPanelFactory, Formulas, ClientConnectionsDM, UploadFiles, entFieldValues,\r\n Utilities;\r\n\r\nprocedure ShowMain;\r\nvar lMain: TwMain;\r\n\r\n\tprocedure AfterShowModal(AValue: TModalResult);\r\n begin\r\n end;\r\n\r\n procedure AfterCreate(AForm: TObject);\r\n begin\r\n end;\r\n\r\nbegin\r\n lMain := TwMain.CreateNew(@AfterCreate);\r\n wMain := lMain;\r\n lMain.ShowModal(@AfterShowModal);\r\nend;\r\n\r\nprocedure TwMain.btMainPaymentClick(Sender: TObject);\r\nbegin\r\n\tShowReturnScreen('P');\r\nend;\r\n\r\nprocedure TwMain.btMainReturnClick(Sender: TObject);\r\nbegin\r\n\tif btMainReturn.Caption = 'Current Period' then\r\n\t\tShowReturnScreen(LoginPurposes('Y', ''))\t//'!WXP')\t\t// ! is current WH Year and Period\r\n else\r\n\t\tShowReturnScreen(LoginPurposes('H', ''));\r\nend;\r\n\r\nprocedure TwMain.btMainTaxpayerClick(Sender: TObject);\r\nbegin\r\n if CurrentTPType = 'I' then\t// I, J\r\n ShowReturnScreen('T')\r\n else\r\n ShowReturnScreen('X');\r\nend;\r\n\r\nprocedure TwMain.btMainUploadClick(Sender: TObject);\r\nbegin\r\n// pick and upload file\r\n\tShowUploadScreen;\r\nend;\r\n\r\nprocedure TwMain.StartWHYear(cap, msg: string);\r\nbegin\r\n\tActiveWHYear := cap;\r\n CurrentTaxyear := ActiveWHYear;\r\n CurrentTransaction := 100 * CurrentTaxpayerID + (strtoint(ActiveWHYear) - 1980);\r\n// dmClientConnections.SendConsoleMessage(msg + ActiveWHYear);\r\n\tShowReturnScreen(LoginPurposes('Y', ''), ActiveWHYear);\t// need to add which year\r\nend;\r\n\r\nprocedure TwMain.btPrevReconClick(Sender: TObject);\r\nbegin\r\n\tStartWHYear(btPrevRecon.caption, 'Prev Year Btn ');\r\nend;\r\n\r\nprocedure TwMain.btCurrReconClick(Sender: TObject);\r\nbegin\r\n\tStartWHYear(btCurrRecon.caption, 'Curr Year Btn ');\r\nend;\r\n\r\nprocedure TwMain.WebFormCreate(Sender: TObject);\r\nbegin\r\n\tEventActions := TEventActions.create;\r\nend;\r\n\r\nprocedure TwMain.WebFormDestroy(Sender: TObject);\r\nbegin\r\n\tEventActions.free;\r\nend;\r\n\r\nprocedure TwMain.WebFormShow(Sender: TObject);\r\n\r\n function CaptionByStatus: string;\r\n var stcap: string;\r\n begin\r\n \tif CurrentTPType = 'I' then begin\r\n stcap := 'Enter ' + CurrentTaxYear + ' Return';\r\n with wLogin do begin\r\n// \tstcap := LineCodeVars.LineCodeString('STATUSDESC');\r\n if CurrentStatus = 'SS' then stcap := 'Return Submitted'\r\n else if CurrentStatus = 'SV' then stcap := 'Resume Return'\r\n else if CurrentStatus = 'AA' then stcap := 'Resume Return'\r\n else if CurrentStatus = 'SM' then stcap := 'Paper Mail-In'\r\n else if CurrentStatus = 'SP' then stcap := 'Return Processed'\r\n else if CurrentStatus = 'SR' then stcap := 'Return under Review'\r\n else if CurrentStatus = 'PF' then stcap := 'Filed by Preparer'\r\n else if CurrentStatus = 'PC' then stcap := 'Preparer In Process'\r\n else if CurrentStatus = 'PD' then stcap := 'Preparer In Process'\r\n\t\t else if CurrentStatus = 'PP' then result := 'Preparer Processed'\r\n else if CurrentStatus = 'OF' then stcap := 'Filed Online'\r\n else if CurrentStatus = 'OC' then stcap := 'Submitted and In Process'\r\n else if CurrentStatus = 'OD' then stcap := 'Submitted and In Process'\r\n\t\t else if CurrentStatus = 'OP' then result := 'Processed'\r\n else if CurrentStatus = 'WY' then stcap := 'End of Year Submitted'\r\n else if CurrentStatus = '3C' then stcap := 'End of Year In Process'\r\n\t\t else if CurrentStatus = 'YS' then stcap := 'End of Year In Process'\r\n \t\telse if CurrentStatus = 'W3' then stcap := 'End of Year Processed'\r\n else if CurrentStatus = 'WP' then stcap := 'Periods Submitted'\r\n else if CurrentStatus = '4C' then stcap := 'Periods In Process'\r\n else if CurrentStatus = 'W4' then stcap := 'Periods In Process';\r\n if (stcap <> stcap) and (stcap <> 'Resume Return') then\r\n btMainReturn.enabled := false;\r\n end;\r\n end\r\n else begin\r\n \tstcap := '';\r\n end;\r\n result := stcap;\r\n end;\r\n\r\n procedure SetMainButtons;\r\n var cap: string;\r\n \t wid: integer;\r\n\t\t enab: boolean;\r\n begin\r\n// \tdmClientConnections.SendConsoleMessage(CurrentTPType + '/' + BFileType + '/' + );\r\n \tif CurrentTPType = 'I' then begin\r\n \tcap := CaptionByStatus;\t// sets enabled\r\n enab := (pos(CurrentStatus, '|SS|SP|SR|PF|PC|PD|OF|OC|OD|') = 0);\r\n wid := 0;\r\n if length(cap) > 20 then wid := 20;\r\n\t\t btMainReturn.Caption := cap;\r\n btMainReturn.visible := true;\r\n btMainReturn.enabled := enab;\r\n btMainReturn.width := 106 + wid;\r\n\r\n btMainPayment.Left := 120 + wid;\r\n btMainTaxpayer.Left := 228 + wid;\r\n \tbtMainUpload.Left := 336 + wid;\r\n btPrevRecon.Visible := false;\r\n btCurrRecon.Visible := false;\r\n end\r\n \telse if CurrentTPType = 'C' then begin\r\n btMainReturn.visible := false;\r\n btMainPayment.Left := 12;\r\n btMainTaxpayer.Left := 120;\r\n \tbtMainUpload.Left := 228;\r\n btPrevRecon.Visible := false;\r\n btCurrRecon.Visible := false;\r\n end\r\n else begin\r\n\t\t btMainReturn.Caption := 'Current Period';\r\n btMainReturn.visible := false;\r\n// \tbtMainUpload.Left := 444;\r\n// btMainTaxpayer.Left := 336;\r\n// btMainPayment.Left := 228;\r\n btPrevRecon.Top := 10;\r\n btCurrRecon.Top := 10;\r\n btPrevRecon.Visible := true;\r\n btCurrRecon.Visible := true;\r\n btPrevRecon.Caption := PreviousWHYear;\r\n\t\t btCurrRecon.Caption := CurrentWHYear;\r\n end;\r\n end;\r\n\r\nbegin\r\nWebWaitMessage1.Show;\r\n\tSetMainButtons;\r\n WebPanel1.Color := SafeColor(SiteOpts.FormButtonsPanelColor, clBtnFace);\r\n ScreenButtons := nil;\r\n ShowScreen;\r\nend;\r\n\r\nprocedure TwMain.ShowScreen;\r\n\r\n procedure SetFormAndSection;\r\n var i: integer;\r\n \t purp: string;\r\n begin\r\n //SetupForm;\r\n lbSectionHeading.caption := '';\r\n CurrentFormID := 0;\r\n\t for i := 0 to nWebForms-1 do if CurrentFormID = 0 then begin\r\n \tpurp := WebForms[i].Purpose;\r\n if (purp = 'H') or (purp = 'Y') then begin\r\n CurrentFormID := WebForms[i].WebFormID;\r\n CurrentFormIndex := i;\r\n end;\r\n\t\tend;\r\n for i := 0 to nWebSections-1 do if WebSections[i].WebFormID = CurrentFormID then begin\r\n\t CurrentSectionID := WebSections[i].SectionID;\r\n \t CurrentSectionIndex := FindSectionIndex(CurrentSectionID);\r\n end;\r\n//dmClientConnections.SendConsoleMessage(\r\n//\t format('History Page: %d/%d %d/%d', [CurrentFormID, CurrentFormIndex, CurrentSectionID, CurrentSectionIndex]));\r\n end;\r\n\r\nbegin\r\n //SetupForm;\r\n SetLogoPanel(pnLogo, imgLogo);\r\n SetHeaderPanel(pnHeader, lbTaxyear, lbCurrentStatus);\r\n lbSectionHeading.caption := '';\r\n SetFormAndSection;\r\n if CurrentFormID = 0 then\r\n \tpnSection.visible := false\r\n else begin\r\n \tpnSection.visible := true;\r\n \tSetupSection;\r\n end;\r\n CalcAllFormulas;\r\n EventActions.LoadData;\r\nWebWaitMessage1.Hide;\r\nend;\r\n\r\nprocedure TwMain.timPDFTimer(Sender: TObject);\r\nbegin\r\n\ttimPDF.Enabled := false;\r\n\tTimerFlag := true;\r\nend;\r\n\r\nprocedure TwMain.SetupSection;\r\nvar hdg: integer;\r\n\r\n\tprocedure SectionHeader;\r\n begin\r\n \tlbSectionHeading.caption := '';\r\n \tif CurrentSectionIndex >= 0 then begin\r\n \t\tlbSectionHeading.caption := WebSections[CurrentSectionIndex].Question;\r\n lbSectionHeading.Color := SafeColor(WebSections[CurrentSectionIndex].HeadingColor, clBtnFace);\r\n pnSectionHeading.Color := lbSectionHeading.Color;\r\n \tlbSectionHeading.Font.Color := WebSections[CurrentSectionIndex].FontColor;\r\n end;\r\n if lbSectionHeading.caption <= ' ' then begin\r\n \thdg := 0;\r\n pnSectionHeading.visible := false;\r\n end\r\n else begin\r\n \thdg := pnSectionHeading.height;\r\n pnSectionHeading.visible := true;\r\n end;\r\n end;\r\n\r\nbegin\r\n\tResetPanelFactory;\r\n if CurrentSectionID > 0 then begin\r\n pnSection.Align := alTop;\r\n SectionHeader;\r\n CurrSectionColor := SafeColor(WebSections[CurrentSectionIndex].Color, SiteOpts.DefPanelColor);\r\n\t MainPanel.AssignSectionPanel(pnMain, 0, 0, 0);\r\n\t MainSectionPanel.AssignSectionPanel(pnSection, hdg, 0, 0);\r\n SetupSectionParts(self, pnMain, MainSectionPanel, CurrentFormID, CurrentSectionID, hdg, 1000);\r\n ReorderPanels;\r\n CalcAllFormulas;\r\n end;\r\nend;\r\n\r\n\r\n{procedure TForm1.WebButton1Click(Sender: TObject);\r\nvar\r\n newform: TForm2;\r\n mr: TModalResult;\r\nbegin\r\n newform := TForm2.Create(Self);\r\n newform.Caption := 'Child form';\r\n // load file HTML template + controls\r\n await(TForm2, newform.Load());\r\n\r\n // init control after loading\r\n newform.frm2Edit.Text := WebEdit1.Text;\r\n\r\n try\r\n // excute form and wait for close\r\n mr := await(TModalResult, newform.Execute);\r\n ShowMessage('Form 2 closed with new value:\"'+newform.frm2Edit.Text+'\"');\r\n WebEdit1.Text := newform.frm2Edit.Text;\r\n finally\r\n newform.Free;\r\n end;\r\nend;\r\n}\r\n\r\nprocedure TwMain.LoadDFMValues;\r\nbegin\r\n inherited LoadDFMValues;\r\n\r\n pnMain := TPanel.Create(Self);\r\n pnSection := TPanel.Create(Self);\r\n WebLinkLabel1 := TLinkLabel.Create(Self);\r\n pnSectionHeading := TPanel.Create(Self);\r\n lbSectionHeading := TLabel.Create(Self);\r\n WebWaitMessage1 := TWaitMessage.Create(Self);\r\n WebPanel1 := TPanel.Create(Self);\r\n btMainReturn := TButton.Create(Self);\r\n btMainPayment := TButton.Create(Self);\r\n btMainUpload := TButton.Create(Self);\r\n btMainTaxpayer := TButton.Create(Self);\r\n btCurrRecon := TButton.Create(Self);\r\n btPrevRecon := TButton.Create(Self);\r\n pnHeader := TPanel.Create(Self);\r\n lbTaxYear := TLabel.Create(Self);\r\n lbCurrentStatus := TLabel.Create(Self);\r\n pnLogo := TPanel.Create(Self);\r\n imgLogo := TImageControl.Create(Self);\r\n timPDF := TTimer.Create(Self);\r\n WebOpenDialog1 := TOpenDialog.Create(Self);\r\n\r\n pnMain.BeforeLoadDFMValues;\r\n pnSection.BeforeLoadDFMValues;\r\n WebLinkLabel1.BeforeLoadDFMValues;\r\n pnSectionHeading.BeforeLoadDFMValues;\r\n lbSectionHeading.BeforeLoadDFMValues;\r\n WebWaitMessage1.BeforeLoadDFMValues;\r\n WebPanel1.BeforeLoadDFMValues;\r\n btMainReturn.BeforeLoadDFMValues;\r\n btMainPayment.BeforeLoadDFMValues;\r\n btMainUpload.BeforeLoadDFMValues;\r\n btMainTaxpayer.BeforeLoadDFMValues;\r\n btCurrRecon.BeforeLoadDFMValues;\r\n btPrevRecon.BeforeLoadDFMValues;\r\n pnHeader.BeforeLoadDFMValues;\r\n lbTaxYear.BeforeLoadDFMValues;\r\n lbCurrentStatus.BeforeLoadDFMValues;\r\n pnLogo.BeforeLoadDFMValues;\r\n imgLogo.BeforeLoadDFMValues;\r\n timPDF.BeforeLoadDFMValues;\r\n WebOpenDialog1.BeforeLoadDFMValues;\r\n try\r\n Name := 'wMain';\r\n Width := 571;\r\n Height := 526;\r\n Caption := 'CityTax Online Filing';\r\n SetEvent(Self, 'OnCreate', 'WebFormCreate');\r\n SetEvent(Self, 'OnDestroy', 'WebFormDestroy');\r\n SetEvent(Self, 'OnShow', 'WebFormShow');\r\n pnMain.SetParentComponent(Self);\r\n pnMain.Name := 'pnMain';\r\n pnMain.Left := 0;\r\n pnMain.Top := 0;\r\n pnMain.Width := 571;\r\n pnMain.Height := 526;\r\n pnMain.HeightPercent := 100.000000000000000000;\r\n pnMain.WidthPercent := 100.000000000000000000;\r\n pnMain.Align := alClient;\r\n pnMain.BorderColor := clSilver;\r\n pnMain.BorderStyle := bsSingle;\r\n pnMain.ChildOrder := 1;\r\n pnSection.SetParentComponent(pnMain);\r\n pnSection.Name := 'pnSection';\r\n pnSection.Left := 0;\r\n pnSection.Top := 151;\r\n pnSection.Width := 571;\r\n pnSection.Height := 375;\r\n pnSection.HeightPercent := 100.000000000000000000;\r\n pnSection.WidthPercent := 100.000000000000000000;\r\n pnSection.Align := alClient;\r\n pnSection.BorderColor := clSilver;\r\n pnSection.BorderStyle := bsSingle;\r\n pnSection.ChildOrder := 2;\r\n WebLinkLabel1.SetParentComponent(pnSection);\r\n WebLinkLabel1.Name := 'WebLinkLabel1';\r\n WebLinkLabel1.Left := 469;\r\n WebLinkLabel1.Top := 109;\r\n WebLinkLabel1.Width := 71;\r\n WebLinkLabel1.Height := 13;\r\n WebLinkLabel1.Font.Charset := DEFAULT_CHARSET;\r\n WebLinkLabel1.Font.Color := clWindowText;\r\n WebLinkLabel1.Font.Height := -11;\r\n WebLinkLabel1.Font.Name := 'Tahoma';\r\n WebLinkLabel1.Font.Style := [fsUnderline];\r\n WebLinkLabel1.ParentFont := False;\r\n WebLinkLabel1.HeightPercent := 100.000000000000000000;\r\n WebLinkLabel1.WidthPercent := 100.000000000000000000;\r\n WebLinkLabel1.Caption := 'WebLinkLabel1';\r\n pnSectionHeading.SetParentComponent(pnSection);\r\n pnSectionHeading.Name := 'pnSectionHeading';\r\n pnSectionHeading.Left := 0;\r\n pnSectionHeading.Top := 0;\r\n pnSectionHeading.Width := 571;\r\n pnSectionHeading.Height := 40;\r\n pnSectionHeading.HeightPercent := 100.000000000000000000;\r\n pnSectionHeading.WidthPercent := 100.000000000000000000;\r\n pnSectionHeading.Align := alTop;\r\n pnSectionHeading.BorderColor := clBtnFace;\r\n pnSectionHeading.BorderStyle := bsNone;\r\n pnSectionHeading.ChildOrder := 1;\r\n pnSectionHeading.Visible := False;\r\n lbSectionHeading.SetParentComponent(pnSectionHeading);\r\n lbSectionHeading.Name := 'lbSectionHeading';\r\n lbSectionHeading.Left := 0;\r\n lbSectionHeading.Top := 0;\r\n lbSectionHeading.Width := 571;\r\n lbSectionHeading.Height := 40;\r\n lbSectionHeading.Align := alClient;\r\n lbSectionHeading.Alignment := taCenter;\r\n lbSectionHeading.AutoSize := False;\r\n lbSectionHeading.Caption := 'Section Heading';\r\n lbSectionHeading.Font.Charset := DEFAULT_CHARSET;\r\n lbSectionHeading.Font.Color := clWindowText;\r\n lbSectionHeading.Font.Height := -13;\r\n lbSectionHeading.Font.Name := 'Tahoma';\r\n lbSectionHeading.Font.Style := [];\r\n lbSectionHeading.HeightPercent := 100.000000000000000000;\r\n lbSectionHeading.Layout := tlCenter;\r\n lbSectionHeading.ParentFont := False;\r\n lbSectionHeading.WordWrap := True;\r\n lbSectionHeading.WidthPercent := 100.000000000000000000;\r\n WebWaitMessage1.SetParentComponent(pnSection);\r\n WebWaitMessage1.Name := 'WebWaitMessage1';\r\n WebWaitMessage1.Left := 154;\r\n WebWaitMessage1.Top := 104;\r\n WebWaitMessage1.Width := 24;\r\n WebWaitMessage1.Height := 24;\r\n WebWaitMessage1.HeightPercent := 100.000000000000000000;\r\n WebWaitMessage1.WidthPercent := 100.000000000000000000;\r\n WebWaitMessage1.Opacity := 0.200000000000000000;\r\n WebWaitMessage1.Picture.LoadFromFile('Main.pnSection.WebWaitMessage1.Picture.gif');\r\n WebPanel1.SetParentComponent(pnMain);\r\n WebPanel1.Name := 'WebPanel1';\r\n WebPanel1.Left := 0;\r\n WebPanel1.Top := 107;\r\n WebPanel1.Width := 571;\r\n WebPanel1.Height := 44;\r\n WebPanel1.HeightPercent := 100.000000000000000000;\r\n WebPanel1.WidthPercent := 100.000000000000000000;\r\n WebPanel1.Align := alTop;\r\n WebPanel1.BorderColor := clSilver;\r\n WebPanel1.BorderStyle := bsSingle;\r\n WebPanel1.ChildOrder := 1;\r\n WebPanel1.Color := 7908469;\r\n btMainReturn.SetParentComponent(WebPanel1);\r\n btMainReturn.Name := 'btMainReturn';\r\n btMainReturn.Left := 12;\r\n btMainReturn.Top := 10;\r\n btMainReturn.Width := 106;\r\n btMainReturn.Height := 25;\r\n btMainReturn.Caption := 'Enter 2020 Return';\r\n btMainReturn.HeightPercent := 100.000000000000000000;\r\n btMainReturn.WidthPercent := 100.000000000000000000;\r\n SetEvent(btMainReturn, Self, 'OnClick', 'btMainReturnClick');\r\n btMainPayment.SetParentComponent(WebPanel1);\r\n btMainPayment.Name := 'btMainPayment';\r\n btMainPayment.Left := 120;\r\n btMainPayment.Top := 10;\r\n btMainPayment.Width := 106;\r\n btMainPayment.Height := 25;\r\n btMainPayment.Caption := 'Make Payment';\r\n btMainPayment.ChildOrder := 1;\r\n btMainPayment.HeightPercent := 100.000000000000000000;\r\n btMainPayment.WidthPercent := 100.000000000000000000;\r\n SetEvent(btMainPayment, Self, 'OnClick', 'btMainPaymentClick');\r\n btMainUpload.SetParentComponent(WebPanel1);\r\n btMainUpload.Name := 'btMainUpload';\r\n btMainUpload.Left := 336;\r\n btMainUpload.Top := 10;\r\n btMainUpload.Width := 106;\r\n btMainUpload.Height := 25;\r\n btMainUpload.Caption := 'Upload File';\r\n btMainUpload.ChildOrder := 2;\r\n btMainUpload.HeightPercent := 100.000000000000000000;\r\n btMainUpload.WidthPercent := 100.000000000000000000;\r\n SetEvent(btMainUpload, Self, 'OnClick', 'btMainUploadClick');\r\n btMainTaxpayer.SetParentComponent(WebPanel1);\r\n btMainTaxpayer.Name := 'btMainTaxpayer';\r\n btMainTaxpayer.Left := 228;\r\n btMainTaxpayer.Top := 10;\r\n btMainTaxpayer.Width := 106;\r\n btMainTaxpayer.Height := 25;\r\n btMainTaxpayer.Caption := 'Name and Address';\r\n btMainTaxpayer.ChildOrder := 3;\r\n btMainTaxpayer.HeightPercent := 100.000000000000000000;\r\n btMainTaxpayer.WidthPercent := 100.000000000000000000;\r\n SetEvent(btMainTaxpayer, Self, 'OnClick', 'btMainTaxpayerClick');\r\n btCurrRecon.SetParentComponent(WebPanel1);\r\n btCurrRecon.Name := 'btCurrRecon';\r\n btCurrRecon.Left := 12;\r\n btCurrRecon.Top := 10;\r\n btCurrRecon.Width := 52;\r\n btCurrRecon.Height := 25;\r\n btCurrRecon.Caption := '2022';\r\n btCurrRecon.ChildOrder := 4;\r\n btCurrRecon.HeightPercent := 100.000000000000000000;\r\n btCurrRecon.Visible := False;\r\n btCurrRecon.WidthPercent := 100.000000000000000000;\r\n SetEvent(btCurrRecon, Self, 'OnClick', 'btCurrReconClick');\r\n btPrevRecon.SetParentComponent(WebPanel1);\r\n btPrevRecon.Name := 'btPrevRecon';\r\n btPrevRecon.Left := 66;\r\n btPrevRecon.Top := 10;\r\n btPrevRecon.Width := 52;\r\n btPrevRecon.Height := 25;\r\n btPrevRecon.Caption := '2021';\r\n btPrevRecon.ChildOrder := 4;\r\n btPrevRecon.HeightPercent := 100.000000000000000000;\r\n btPrevRecon.Visible := False;\r\n btPrevRecon.WidthPercent := 100.000000000000000000;\r\n SetEvent(btPrevRecon, Self, 'OnClick', 'btPrevReconClick');\r\n pnHeader.SetParentComponent(pnMain);\r\n pnHeader.Name := 'pnHeader';\r\n pnHeader.Left := 0;\r\n pnHeader.Top := 78;\r\n pnHeader.Width := 571;\r\n pnHeader.Height := 29;\r\n pnHeader.HeightPercent := 100.000000000000000000;\r\n pnHeader.WidthPercent := 100.000000000000000000;\r\n pnHeader.Align := alTop;\r\n pnHeader.BorderColor := clSilver;\r\n pnHeader.BorderStyle := bsSingle;\r\n pnHeader.ChildOrder := 2;\r\n pnHeader.Visible := False;\r\n lbTaxYear.SetParentComponent(pnHeader);\r\n lbTaxYear.Name := 'lbTaxYear';\r\n lbTaxYear.Left := 11;\r\n lbTaxYear.Top := 7;\r\n lbTaxYear.Width := 57;\r\n lbTaxYear.Height := 16;\r\n lbTaxYear.Caption := 'lbTaxYear';\r\n lbTaxYear.Font.Charset := DEFAULT_CHARSET;\r\n lbTaxYear.Font.Color := clWindowText;\r\n lbTaxYear.Font.Height := -13;\r\n lbTaxYear.Font.Name := 'Tahoma';\r\n lbTaxYear.Font.Style := [];\r\n lbTaxYear.HeightPercent := 100.000000000000000000;\r\n lbTaxYear.ParentFont := False;\r\n lbTaxYear.WidthPercent := 100.000000000000000000;\r\n lbCurrentStatus.SetParentComponent(pnHeader);\r\n lbCurrentStatus.Name := 'lbCurrentStatus';\r\n lbCurrentStatus.Left := 88;\r\n lbCurrentStatus.Top := 1;\r\n lbCurrentStatus.Width := 397;\r\n lbCurrentStatus.Height := 26;\r\n lbCurrentStatus.Alignment := taCenter;\r\n lbCurrentStatus.AutoSize := False;\r\n lbCurrentStatus.Caption := 'lbCurrentStatus';\r\n lbCurrentStatus.Font.Charset := DEFAULT_CHARSET;\r\n lbCurrentStatus.Font.Color := clWindowText;\r\n lbCurrentStatus.Font.Height := -13;\r\n lbCurrentStatus.Font.Name := 'Tahoma';\r\n lbCurrentStatus.Font.Style := [];\r\n lbCurrentStatus.HeightPercent := 100.000000000000000000;\r\n lbCurrentStatus.Layout := tlCenter;\r\n lbCurrentStatus.ParentFont := False;\r\n lbCurrentStatus.WidthPercent := 100.000000000000000000;\r\n pnLogo.SetParentComponent(pnMain);\r\n pnLogo.Name := 'pnLogo';\r\n pnLogo.Left := 0;\r\n pnLogo.Top := 0;\r\n pnLogo.Width := 571;\r\n pnLogo.Height := 78;\r\n pnLogo.HeightPercent := 100.000000000000000000;\r\n pnLogo.WidthPercent := 100.000000000000000000;\r\n pnLogo.Align := alTop;\r\n pnLogo.BorderColor := clSilver;\r\n pnLogo.BorderStyle := bsSingle;\r\n pnLogo.ChildOrder := 2;\r\n imgLogo.SetParentComponent(pnLogo);\r\n imgLogo.Name := 'imgLogo';\r\n imgLogo.Left := 0;\r\n imgLogo.Top := 0;\r\n imgLogo.Width := 571;\r\n imgLogo.Height := 78;\r\n imgLogo.WidthStyle := ssAuto;\r\n imgLogo.HeightPercent := 100.000000000000000000;\r\n imgLogo.WidthPercent := 100.000000000000000000;\r\n imgLogo.Align := alClient;\r\n timPDF.SetParentComponent(Self);\r\n timPDF.Name := 'timPDF';\r\n timPDF.Enabled := False;\r\n timPDF.Interval := 2000;\r\n SetEvent(timPDF, Self, 'OnTimer', 'timPDFTimer');\r\n timPDF.Left := 473;\r\n timPDF.Top := 118;\r\n WebOpenDialog1.SetParentComponent(Self);\r\n WebOpenDialog1.Name := 'WebOpenDialog1';\r\n WebOpenDialog1.Left := 480;\r\n WebOpenDialog1.Top := 34;\r\n finally\r\n pnMain.AfterLoadDFMValues;\r\n pnSection.AfterLoadDFMValues;\r\n WebLinkLabel1.AfterLoadDFMValues;\r\n pnSectionHeading.AfterLoadDFMValues;\r\n lbSectionHeading.AfterLoadDFMValues;\r\n WebWaitMessage1.AfterLoadDFMValues;\r\n WebPanel1.AfterLoadDFMValues;\r\n btMainReturn.AfterLoadDFMValues;\r\n btMainPayment.AfterLoadDFMValues;\r\n btMainUpload.AfterLoadDFMValues;\r\n btMainTaxpayer.AfterLoadDFMValues;\r\n btCurrRecon.AfterLoadDFMValues;\r\n btPrevRecon.AfterLoadDFMValues;\r\n pnHeader.AfterLoadDFMValues;\r\n lbTaxYear.AfterLoadDFMValues;\r\n lbCurrentStatus.AfterLoadDFMValues;\r\n pnLogo.AfterLoadDFMValues;\r\n imgLogo.AfterLoadDFMValues;\r\n timPDF.AfterLoadDFMValues;\r\n WebOpenDialog1.AfterLoadDFMValues;\r\n end;\r\nend;\r\n\r\nend.","unit Return;\r\n\r\ninterface\r\n\r\nuses\r\n SysUtils, Classes, JS, Web, WEBLib.Graphics, WEBLib.Controls,\r\n WEBLib.Forms, WEBLib.Dialogs, WEBLib.StdCtrls, \r\nWEBLib.ExtCtrls, WEBLib.Grids, WEBLib.Buttons, SectionPanels,\r\n WEBLib.Imaging.GIFImg, BCL.Utils;\r\n\r\nprocedure ShowReturnScreen(purps: string; rparams: string='');\r\nprocedure ShowControlData;\r\n\r\ntype\r\n TwReturn = class(TForm)\r\n pnReturn: TPanel;\r\n pnButtons: TPanel;\r\n WebButton1: TSpeedButton;\r\n WebButton2: TSpeedButton;\r\n WebButton3: TSpeedButton;\r\n WebButton4: TSpeedButton;\r\n WebButton5: TSpeedButton;\r\n WebButton6: TSpeedButton;\r\n WebButton7: TSpeedButton;\r\n WebButton8: TSpeedButton;\r\n WebButton9: TSpeedButton;\r\n WebButton10: TSpeedButton;\r\n WebButton11: TSpeedButton;\r\n WebButton12: TSpeedButton;\r\n pnFormHeading: TPanel;\r\n pnFormButtons: TPanel;\r\n btForm1: TSpeedButton;\r\n btForm2: TSpeedButton;\r\n btForm3: TSpeedButton;\r\n btForm4: TSpeedButton;\r\n btForm5: TSpeedButton;\r\n pnMainButtons: TPanel;\r\n btMain: TSpeedButton;\r\n btSubmit: TSpeedButton;\r\n btSaveReturn: TSpeedButton;\r\n pnSection: TPanel;\r\n pnTotals: TPanel;\r\n pnNext: TPanel;\r\n btNext: TButton;\r\n pnTotalsSection: TPanel;\r\n lbTotalsSection: TLabel;\r\n WebMemo1: TMemo;\r\n pnSectionHeading: TPanel;\r\n lbSectionHeading: TLabel;\r\n WebScrollBox1: TScrollBox;\r\n WebMessageDlg1: TMessageDlg;\r\n btValidate: TSpeedButton;\r\n btForm6: TSpeedButton;\r\n WaitMessage: TWaitMessage;\r\n WaitTimers: TTimer;\r\n btMailIn: TSpeedButton;\r\n btShowTaxForm: TSpeedButton;\r\n PDFTimer: TTimer;\r\n btReload: TSpeedButton;\r\n pnHeader: TPanel;\r\n lbTaxYear: TLabel;\r\n lbCurrentStatus: TLabel;\r\n pnLogo: TPanel;\r\n imgLogo: TImageControl;\r\n CounterTimer: TTimer;\r\n procedure WebFormShow(Sender: TObject);\r\n procedure WebFormCreate(Sender: TObject);\r\n procedure WebFormDestroy(Sender: TObject);\r\n\r\n procedure WebFormBeforeUnload(Sender: TObject; var AMessage: string);\r\n\r\n procedure FormClick(Sender: TObject);\r\n procedure SectionClick(Sender: TObject);\r\n procedure btMainClick(Sender: TObject);\r\n procedure ClearClick(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);\r\n procedure btNextClick(Sender: TObject);\r\n procedure btSaveReturnClick(Sender: TObject);\r\n procedure btSubmitClick(Sender: TObject);\r\n procedure btValidateClick(Sender: TObject);\r\n procedure btShowTaxFormClick(Sender: TObject);\r\n procedure btMailInClick(Sender: TObject);\r\n procedure btReloadClick(Sender: TObject);\r\n\r\n procedure WaitTimersTimer(Sender: TObject);\r\n procedure PDFTimerTimer(Sender: TObject);\r\n procedure CounterTimerTimer(Sender: TObject);\r\n\r\n procedure WebFormMouseDown(Sender: TObject; Button: TMouseButton;\r\n Shift: TShiftState; X, Y: Integer);\r\n procedure WebFormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);\r\n private\r\n { Private declarations }\r\n //msg: string;\r\n holdenabled: array[1..7] of boolean;\r\n procedure ResetScreen(includebuttons: boolean);\r\n procedure SetupSection;\r\n{ procedure SetUpForm;}\r\n procedure SetupTotals;\r\n procedure SetNextButton;\r\n procedure InitButtons;\r\n procedure LeaveForm(mr: TModalResult);\r\n function VerifyReturn: boolean;\r\n procedure SetTPNextButton;\r\n procedure SaveReturn(sys: boolean);\r\n procedure SaveFirst;\r\n procedure SubmitIt(typ, submsg, stat: string);\r\n procedure EnableAllButtons(onoff: boolean);\r\n procedure SaveHoldProcButtons;\r\n procedure ResetHoldProcButtons;\r\n public\r\n { Public declarations }\r\n purposes, runparams, PDFFileName, LastMove: string;\r\n procedure ShowDbgMsg(cap: string);\r\n procedure ShowScreen;\r\n procedure RecalcIt;\r\n procedure ChangeFormByPurpose(purp: string);\r\n procedure ChangeForm(Sender: TObject);\r\n procedure DebugMessage(msg: string);\r\n\r\n\t [async]\r\n procedure ReloadData; async;\r\n\r\n protected procedure LoadDFMValues; override; end;\r\n\r\nvar\r\n wReturn: TwReturn;\r\n\r\nimplementation\r\n\r\n{$R *.dfm}\r\n\r\nuses ClientCurrent, Main, UploadFiles, Formulas, OptionsDM, entForms, entReturns,\r\n entFieldValues, FieldPanelFactory, Utilities, TransferWeb, TaxpayerDM,\r\n Verification, ClientConnectionsDM;\r\n\r\n{var\r\n i: integer;\r\n edt: TWebEdit;\r\nbegin\r\n WebResponsiveGridPanel1.BeginUpdate;\r\n for i := 0 to 9 do\r\n begin\r\n edt := TWebEdit.Create(Self);\r\n WebResponsiveGridPanel1.AddControl(edt);\r\n end;\r\n WebResponsiveGridPanel1.EndUpdate;\r\nend;\r\n\r\n}\r\n\r\nprocedure ShowReturnScreen(purps: string; rparams: string='');\r\nvar lReturn: TwReturn;\r\n\r\n\tprocedure AfterShowModal(AValue: TModalResult);\r\n begin\r\n \tlReturn.free;\r\n end;\r\n\r\n procedure AfterCreate(AForm: TObject);\r\n begin\r\n end;\r\n\r\nbegin\r\n lReturn := TwReturn.CreateNew(@AfterCreate);\r\n wReturn := lReturn;\r\n lReturn.Purposes := purps;\r\n lReturn.RunParams := rparams;\r\n lReturn.ShowModal(@AfterShowModal);\r\nend;\r\n\r\n{ TwReturn }\r\n\r\nprocedure TwReturn.SaveFirst;\r\nbegin\r\n\tWebMessageDlg1.ShowDialog('Save Data?', WEBLib.Dialogs.mtConfirmation, [mbYes, mbNo],\r\n \tprocedure(res: TModalResult)\r\n begin\r\n\t\t\tSaveReturn(false);\r\n end);\r\nend;\r\n\r\nprocedure TwReturn.btMainClick(Sender: TObject);\r\n//var prc: TDialogResultProc;\r\nbegin\r\n//\tRecalcIt;\r\n// ask if save or submit\r\n//\tprc := @LeaveForm;\r\n//\tWebMessageDlg1.ShowDialog('If you continue, you will lose all work not saved. Continue?', mtWarning, [mbNo, mbYes], prc);\r\n\tSaveFirst;\r\n\tLeaveForm(mrYes);\r\nend;\r\n\r\nprocedure TwReturn.FormClick(Sender: TObject);\r\nbegin\r\n// use Tag to set correct form\r\n\tLastMove := TButton(Sender).caption;\r\n\tif VerifyReturn then begin\r\n \tif TButton(Sender).caption = 'Upload File' then\r\n \tShowUploadScreen\r\n else\r\n \t\tChangeForm(Sender);\r\n end;\r\nend;\r\n\r\nprocedure TwReturn.ChangeForm(Sender: TObject);\r\nbegin\r\n EventActions.Init(100, btNext, @RecalcIt);\r\n EventActions.StoreData;\r\n EventActions.Touched := true;\r\n ScreenButtons.SetOthersUp(Sender as TSpeedButton);\r\n CurrentFormID := TButton(Sender).tag - 100000;\r\n CurrentFormIndex := FindFormIndex(CurrentFormID);\r\n ScreenButtons.SetCurrentByIndex(-2, -1); // pick first section without changing form\r\n ShowScreen;\r\nend;\r\n\r\nprocedure TwReturn.RecalcIt;\r\nbegin\r\n if AffectsFormButtons then begin\r\n \tScreenButtons.SetAllButtons;\r\n pnFormButtons.Top := 0;\r\n pnFormButtons.Visible := true;\r\n end\r\n else if AffectsSectButtons then\r\n\t ScreenButtons.SetSideButtons;\r\nend;\r\n\r\nprocedure TwReturn.ResetScreen(includebuttons: boolean);\r\nbegin\r\n\tResetPanelFactory;\r\n pnNext.visible := false;\r\n\r\n // SetButtons: Form and Section buttons\r\n if includebuttons then begin\r\n \tScreenButtons.SetSideButtons;\r\n end;\r\nend;\r\n\r\nprocedure TwReturn.SetNextButton;\r\nvar cbtn: integer;\r\n\r\n\tfunction Clean(s: string): string;\r\n var i: integer;\r\n begin\r\n \t// Issue with ampersand\r\n result := '';\r\n for i := 1 to length(s) do begin\r\n \tif s[i] = '&' then result := result + '&&'\r\n else result := result + s[i];\r\n end;\r\n end;\r\n\r\nbegin\r\n\tpnNext.visible := false;\r\n pnNext.align := alBottom;\r\n pnNext.Height := 48;\r\n pnNext.Color := SiteOpts.SectionNextPanelColor;\r\n\tbtNext.tag := 0;\r\n cbtn := ScreenButtons.currbtnndx;\r\n\tif (cbtn > 0) and (ScreenButtons.SectButtons[cbtn].visible) and (cbtn < 12) and ScreenButtons.SectButtons[cbtn+1].visible then begin\r\n pnSection.Height := pnSection.Height + pnNext.Height;\r\n MainSectionPanel.PanelHeight := pnSection.Height;\r\n\t\tpnNext.visible := true;\r\n pnNext.align := alBottom;\r\n //pnNext.Top := pnSection.Height-pnNext.Height;\r\n\t btNext.Color := SiteOpts.SectionNextButtonColor;\r\n btNext.caption := 'Next: ' + Clean(ScreenButtons.SectButtons[cbtn+1].caption);\r\n btNext.tag := cbtn+1;\r\n\t\tSetMainPanelHeight;\r\n end;\r\nend;\r\n\r\nprocedure TwReturn.SetTPNextButton;\r\nbegin\r\n\tpnNext.visible := false;\r\n pnNext.align := alBottom;\r\n pnNext.Height := 48;\r\n pnNext.Color := SiteOpts.SectionNextPanelColor;\r\n\tbtNext.tag := 0;\r\n pnSection.Height := pnSection.Height + pnNext.Height;\r\n MainSectionPanel.PanelHeight := pnSection.Height;\r\n pnNext.visible := true;\r\n pnNext.align := alBottom;\r\n //pnNext.Top := pnSection.Height-pnNext.Height;\r\n btNext.Color := SiteOpts.SectionNextButtonColor;\r\n btNext.caption := 'Next: Return';\r\n btNext.tag := 999;\r\n SetMainPanelHeight;\r\nend;\r\n\r\nprocedure TwReturn.btNextClick(Sender: TObject);\r\nbegin\r\n\tSaveReturn(true);\r\n\tif btNext.caption = 'Next: Return' then begin\r\n \tif (pos(CurrentStatus, '|SS|SP|SR|PF|PC|PD|OF|OC|OD|') > 0) then\r\n \tLeaveForm(mrYes)\r\n else begin\r\n if ScreenButtons.FormPurpose[2] <> 'R' then begin\r\n Purposes := 'TRP';\r\n ScreenButtons.ScreenPurposes := Purposes;\r\n ScreenButtons.SetTopButtons;\r\n end;\r\n ChangeForm(btForm2);\t// Return\r\n end;\r\n end\r\n else\r\n\t\tScreenButtons.ClickSideButton((Sender as TButton).tag);\r\nend;\r\n\r\nprocedure TwReturn.btReloadClick(Sender: TObject);\r\nbegin\r\n\tReloadData;\r\nend;\r\n\r\nprocedure TwReturn.ReloadData;\r\nbegin\r\n\t// Reload data\r\n FieldValues.ClearData;\r\n await(DoGetData('REL'));\r\n ShowMain;\r\nend;\r\n\r\nprocedure TwReturn.btSaveReturnClick(Sender: TObject);\r\nbegin\r\n\tSaveReturn(false);\r\n CurrentStatus := 'SV';\r\n UpdateHeaderPanel(pnHeader, lbTaxYear, lbCurrentStatus);\r\n LeaveForm(mrYes);\r\nend;\r\n\r\nprocedure TwReturn.btShowTaxFormClick(Sender: TObject);\r\nbegin\r\n\tif btSubmit.enabled then\r\n \tSaveReturn(true);\r\n btShowTaxForm.enabled := false;\r\n// EnableAllButtons(false);\r\n //btShowTaxForm.enabled := false;\r\n try\r\n \t\tDoGetPDF(false, LastMove='Submit');\r\n finally\r\n\t btShowTaxForm.enabled := true;\r\n// \tEnableAllButtons(true);\r\n end;\r\n WaitMessage.Show;\r\n WaitTimers.enabled := true;\r\n btShowTaxForm.caption := 'Wait . . . ';\r\n btShowTaxForm.enabled := false;\r\n//\tPDFTimer.enabled := true;\r\nend;\r\n\r\nprocedure TwReturn.SaveReturn(sys: boolean);\r\nbegin\r\n\t// ?? VerifyReturn;\r\n if not ScreenButtons.TPButtonOnly then begin\r\n \tif CurrentTPType <> 'W' then begin\r\n \tif sys then\r\n\t\t\t\tDoSendData('SYSSAVE', 'R', '')\r\n else\r\n\t\t\t\tDoSendData('SAVE', 'R', '');\r\n end\r\n else\r\n\t\t\tDoSendData('SAVEWH', 'W', '');\r\n end\r\n else begin\r\n \tDoSendData('SAVETP', 'T', '');\r\n//\t\tFieldValues.DebugShowAll;\t//BCH\r\n end;\r\nend;\r\n\r\nprocedure TwReturn.SubmitIt(typ, submsg, stat: string);\r\nbegin\r\n\tself.enabled := false;\r\n WaitMessage.Show;\r\n WaitTimers.Interval := 18000;\r\n btShowTaxForm.caption := 'Wait . . . ';\r\n btShowTaxForm.enabled := false;\r\n WaitTimers.enabled := true;\r\n// EnableAllButtons(false);\r\n try\r\n\t DoSendData(submsg, typ, '');\r\n \t// already called on server in SENDDATA\r\n DoSavePDF;\r\n\t \tCurrentStatus := stat;\r\n\t UpdateHeaderPanel(pnHeader, lbTaxYear, lbCurrentStatus);\r\n\t dmClientConnections.SendConsoleMessage('End Submit: ' + PDFFileName, 0);\r\n\t //PDFTimer.enabled := true;\r\n finally\r\n//\t EnableAllButtons(true);\r\n end;\r\nend;\r\n\r\nprocedure TwReturn.btMailInClick(Sender: TObject);\r\nbegin\r\n if CurrentTPType = 'W' then begin\r\n \tSubmitIt('3', 'SUBMW3', 'WY');\r\n\tend\r\n\telse if VerifyReturn then begin\r\n \tSubmitIt('R', 'MAIL', 'SM');\r\n{ \tWaitMessage.Show;\r\n WaitTimers.enabled := true;\r\n\t\tDoSendData('MAIL', 'R', '');\r\n btSubmit.enabled := false;\r\n btSaveReturn.enabled := false;\r\n btMailIn.enabled := false;\r\n btValidate.enabled := false;\r\n\t\tPDFTimer.enabled := true;\r\n CurrentStatus := 'SM';\r\n UpdateHeaderPanel(pnHeader, lbTaxYear, lbCurrentStatus);\r\n \t//LeaveForm(mrYes);\r\n}\r\n end;\r\nend;\r\n\r\nprocedure TwReturn.btSubmitClick(Sender: TObject);\r\nbegin\r\n\tLastMove := 'Submit';\r\n if CurrentTPType = 'W' then begin\r\n \tSubmitIt('4', 'SUBMWH', 'WP');\r\n\tend\r\n\telse if VerifyReturn then begin\r\n \tSubmitIt('R', 'SUBM', 'SS');\r\n{ \tWaitMessage.Show;\r\n WaitTimers.enabled := true;\r\n\t\tDoSendData('SUBM', 'R', '');\r\n}\r\n btSubmit.enabled := false;\r\n btSaveReturn.enabled := false;\r\n btMailIn.enabled := false;\r\n btValidate.enabled := false;\r\n\t\t// already called on server in SENDDATA\r\n //PDFTimer.enabled := true;\r\n CurrentStatus := 'SS';\r\n UpdateHeaderPanel(pnHeader, lbTaxYear, lbCurrentStatus);\r\n \t//LeaveForm(mrYes);\r\n end;\r\nend;\r\n\r\nprocedure TwReturn.btValidateClick(Sender: TObject);\r\nbegin\r\n\t// Return Validate\r\n VerifyReturn;\r\nend;\r\n\r\nprocedure TwReturn.SectionClick(Sender: TObject);\r\nvar verstr: string;\r\nbegin\r\n\tSaveReturn(true);\r\n\tLastMove := TButton(Sender).caption;\r\n// use tag to set Section\r\n\tverstr := WebSections[CurrentSectionIndex].PageVerify;\r\n\tif (verstr = '') or VerifyTool.VerifyPage(verstr, false) then\r\n \tScreenButtons.SectionClick(TSpeedButton(Sender));\r\nend;\r\n\r\nprocedure TwReturn.SaveHoldProcButtons;\r\nvar i: integer;\r\nbegin\r\n\tfor i := 1 to 7 do begin\r\n\t\tholdenabled[i] := ScreenButtons.ProcButtons[i].enabled;\r\n ScreenButtons.ProcButtons[i].enabled := false;\r\n end;\r\nend;\r\n\r\nprocedure TwReturn.ResetHoldProcButtons;\r\nvar i: integer;\r\nbegin\r\n\tfor i := 1 to 7 do\r\n\t\tScreenButtons.ProcButtons[i].enabled := holdenabled[i];\r\nend;\r\n\r\nprocedure TwReturn.EnableAllButtons(onoff: boolean);\r\nvar i: integer;\r\nbegin\r\n\tif ScreenButtons.FormButtons[1].enabled <> onoff then begin\r\n for i := 1 to 6 do ScreenButtons.FormButtons[i].enabled := onoff;\r\n for i := 1 to 12 do ScreenButtons.SectButtons[i].enabled := onoff;\r\n if not onoff then SaveHoldProcButtons\r\n else ResetHoldProcButtons;\r\n end;\r\nend;\r\n\r\nprocedure TwReturn.InitButtons;\r\nvar i: integer;\r\nbegin\r\n\twith ScreenButtons do begin\r\n \tShowThisScreen := ShowScreen;\r\n FormButtons[1] := btForm1;\r\n FormButtons[2] := btForm2;\r\n FormButtons[3] := btForm3;\r\n FormButtons[4] := btForm4;\r\n FormButtons[5] := btForm5;\r\n FormButtons[6] := btForm6;\r\n SectButtons[1] := WebButton1;\r\n SectButtons[2] := WebButton2;\r\n SectButtons[3] := WebButton3;\r\n SectButtons[4] := WebButton4;\r\n SectButtons[5] := WebButton5;\r\n SectButtons[6] := WebButton6;\r\n SectButtons[7] := WebButton7;\r\n SectButtons[8] := WebButton8;\r\n SectButtons[9] := WebButton9;\r\n SectButtons[10] := WebButton10;\r\n SectButtons[11] := WebButton11;\r\n SectButtons[12] := WebButton12;\r\n ProcButtons[1] := btMain;\r\n ProcButtons[2] := btSubmit;\r\n ProcButtons[3] := btSaveReturn;\r\n ProcButtons[4] := btValidate;\r\n ProcButtons[5] := btMailIn;\r\n ProcButtons[6] := btShowTaxForm;\r\n ProcButtons[7] := btReload;\r\n for i := 1 to 6 do begin\r\n FormButtons[i].visible := false;\r\n FormButtons[i].Down := false;\r\n FormButtons[i].color := SiteOpts.FormButtonsButtonColor;\r\n FormButtons[i].Font.color := clBlack;\r\n end;\r\n for i := 1 to 12 do begin\r\n SectButtons[i].color := SiteOpts.SectionButtonsButtonColor;\r\n SectButtons[i].Font.color := clBlack;\r\n end;\r\n for i := 1 to 7 do\r\n ProcButtons[i].color := SiteOpts.SectionButtonsButtonColor;\r\n end;\r\nend;\r\n\r\nprocedure TwReturn.LeaveForm(mr: TModalResult);\r\nbegin\r\n//\tRecalcIt;\r\n// ask if save or submit\r\n if mr = mrYes then begin\r\n PayInfo.DebugCurrentData('To Main Form: (ToHistory)');\r\n PayInfo.ToHistory;\r\n\t ShowMain;\r\n end;\r\nend;\r\n\r\nprocedure TwReturn.PDFTimerTimer(Sender: TObject);\r\n{var lBytes: TBytes;\r\n\t s: string;\r\n i: integer;\r\n}\r\nbegin\r\n\tPDFTimer.enabled := false;\r\n// \tDoGetPDF;\r\n\r\nend;\r\n\r\nprocedure TwReturn.SetupSection;\r\nvar hdg: integer;\r\n\r\n\tprocedure SectionHeader;\r\n begin\r\n \tlbSectionHeading.caption := '';\r\n \tif CurrentSectionIndex >= 0 then begin\r\n \t\tlbSectionHeading.caption := WebSections[CurrentSectionIndex].Question;\r\n lbSectionHeading.Color := SafeColor(WebSections[CurrentSectionIndex].HeadingColor, clBtnFace);\r\n pnSectionHeading.Color := lbSectionHeading.Color;\r\n \tlbSectionHeading.Font.Color := WebSections[CurrentSectionIndex].FontColor;\r\n end;\r\n if lbSectionHeading.caption <= ' ' then begin\r\n \thdg := 0;\r\n pnSectionHeading.visible := false;\r\n end\r\n else begin\r\n \thdg := pnSectionHeading.height;\r\n pnSectionHeading.visible := true;\r\n end;\r\n end;\r\n\r\nbegin\r\n\tResetScreen(false);\r\n if CurrentSectionID > 0 then begin\r\n pnSection.Align := alTop;\r\n SectionHeader;\r\n CurrSectionColor := SafeColor(WebSections[CurrentSectionIndex].Color, SiteOpts.DefPanelColor);\r\n\t MainPanel.AssignSectionPanel(pnReturn, 0, 0, 0);\r\n\t MainSectionPanel.AssignSectionPanel(pnSection, hdg, 0, 0);\r\n SetupSectionParts(self, pnReturn, MainSectionPanel, CurrentFormID, CurrentSectionID, hdg, 1000);\r\n ReorderPanels;\r\n if CurrentFormIndex < 0 then CurrentFormIndex := 0;\r\n \tif WebForms[CurrentFormIndex].purpose = 'T' then\r\n\t\t SetTPNextButton\r\n else\r\n\t\t SetNextButton;\r\n if pnNext.visible then MainSectionPanel.BottomHeight := pnNext.height;\r\n end;\r\nend;\r\n\r\nprocedure TwReturn.SetupTotals;\r\nvar hdg, ordstart: integer;\r\n\r\n\tprocedure SectionHeader;\r\n begin\r\n\t\thdg := 0;\r\n if WebSections[TotalsSectionIndex].Question > ' ' then begin\r\n\t pnTotalsSection.visible := true;\r\n lbTotalsSection.caption := WebSections[TotalsSectionIndex].Question;\r\n lbTotalsSection.Color := SafeColor(WebSections[TotalsSectionIndex].HeadingColor, clBtnFace);\r\n pnTotalsSection.Color := lbTotalsSection.Color;\r\n lbTotalsSection.Font.Color := WebSections[TotalsSectionIndex].FontColor;\r\n hdg := pnTotalsSection.height;\r\n end\r\n else\r\n\t pnTotalsSection.visible := false;\r\n end;\r\n\r\n\tfunction AnyTotalsSection: boolean;\r\n var i: integer;\r\n begin\r\n \tresult := false;\r\n TotalsSectionIndex := -1;\r\n for i := 0 to nWebSections-1 do begin\r\n \tif (WebSections[i].WebFormID = CurrentFormID) and (WebSections[i].LineID = 'FT') then begin\t// FormTotals\r\n \tresult := true;\r\n TotalsSectionIndex := i;\r\n end;\r\n end;\r\n end;\r\n\r\nbegin\r\n\t// Totals goes at bottom\r\n pnTotals.visible := AnyTotalsSection;\r\n if pnTotals.visible then begin\r\n SectionHeader;\r\n pnTotals.Height := hdg;\r\n \tif WebSections[TotalsSectionIndex].DisplayOrder <= 1 then begin\r\n\t\t\tpnSection.Align := alBottom;\r\n pnTotals.Top := 0;\r\n\t\t\tpnSection.Align := alTop;\r\n pnTotals.Top := 0;\r\n pnSection.Top := pnTotals.Top + 100;\r\n ordstart := 100;\r\n end\r\n else begin\r\n pnTotals.Align := alBottom;\r\n\t \tpnSection.Top := 0;\r\n pnTotals.Align := alTop;\r\n\t \tpnSection.Top := 0;\r\n pnTotals.Top := pnSection.Top + 100;\r\n ordstart := 600;\r\n end;\r\n CurrSectionColor := SafeColor(WebSections[TotalsSectionIndex].Color, SiteOpts.DefPanelColor);\r\n\t MainTotalsPanel.AssignSectionPanel(pnTotals, hdg, 0, 0);\r\n SetupSectionParts(self, pnReturn, MainTotalsPanel, CurrentFormID, 0, hdg, ordstart);\r\n \tMainTotalsPanel.PanelHeight := MainTotalsPanel.pnl.Height;\r\n end\r\n else begin\r\n \tpnSection.Align := alClient;\r\n \tMainTotalsPanel.PanelHeight := 0\r\n end;\r\nend;\r\n\r\n{\r\nprocedure TwReturn.SetUpForm;\r\n\r\n\tprocedure FormHeader;\r\n begin\r\n\t SetupFields(pnFormHeading, 0, 0, 0);\r\n end;\r\n\r\nbegin\r\n\tResetScreen(false);\r\n FormHeader;\r\n SetupGroup(0);\r\n // only display one section plus totals section\r\n SetupSection;\r\n SetupTotals;\r\nend;\r\n}\r\n\r\nprocedure ShowControlData;\r\nvar i: integer;\r\ns, t: string;\r\nbegin\r\n// wReturn.WebMemo1.Lines.Clear;\r\n for i := 0 to FieldValues.Count-1 do\r\n if FieldValues[i].ControlIndex >= 0 then with FieldValues[i] do begin\r\n \tt := '';\r\n if (FieldControls[ControlIndex].PanControl <> nil) and (FieldControls[ControlIndex].PanControl is TEdit) then begin\r\n \tt := TEdit(FieldControls[ControlIndex].PanControl).text;\r\n\t if t <> FieldValues[i].FieldValue.Formatted then\r\n \t\ts := s + format('C: %3d %3d %2d/%2d/%2d/%3d %s:%s/%s'#13,\r\n\t\t \t[i, ControlIndex, WebFormID, WebGroupID, GroupIndex, WebFieldId, FieldControls[ControlIndex].PanControl.name, FieldValues[i].FieldValue.asString, t]);\r\n end;\r\n end;\r\n for i := 0 to FieldValues.Count-1 do\r\n if FieldValues[i].GroupEditControl >= 0 then begin\r\n s := s + format('E: %3d %3d', [i, FieldValues[i].GroupEditControl]);\r\n end;\r\n ShowMessage(s);\r\nend;\r\n\r\nprocedure TwReturn.ShowDbgMsg(cap: string);\r\nbegin\r\nend;\r\n\r\nprocedure TwReturn.ShowScreen;\r\n\r\n\tprocedure SetupPurposeSpecial;\r\n begin\r\n if CurrentFormIndex < 0 then CurrentFormIndex := 0;\r\n \tif WebForms[CurrentFormIndex].purpose = 'P' then begin\r\n\t PayInfo.DebugCurrentData('Open Payment Screen: (ToFieldValues)');\r\n \tPayInfo.ToFieldValues;\r\n end;\r\n end;\r\n\r\n procedure SetByType;\r\n begin\r\n\t if CurrentTPType = 'W' then begin\r\n \tbtMailIn.caption := 'Submit End of Year';\r\n btSubmit.caption := 'Submit this Period';\r\n btShowTaxForm.enabled := false;\r\n btValidate.enabled := false;\r\n end;\r\n end;\r\n\r\nbegin\r\n //SetupForm;\r\n SetByType;\r\n SetLogoPanel(pnLogo, imgLogo);\r\n SetHeaderPanel(pnHeader, lbTaxyear, lbCurrentStatus);\r\n lbSectionHeading.caption := '';\r\n SetupPurposeSpecial;\r\n CalcAllFormulas;\r\n SetupSection;\r\n SetupTotals;\r\n//BCH\r\n//\tFieldValues.DebugShowAll;\r\n\tSetMainPanelHeight;\r\n\r\n RecalcIt;\r\n EventActions.InGoTo := 1;\r\n EventActions.GoToOrder;\r\n EventActions.InGoTo := 0;\r\nend;\r\n\r\nfunction TwReturn.VerifyReturn: boolean;\r\nvar i: integer;\r\n\t ftype, phone: string;\r\n //TPProblem: boolean;\r\n\r\n function TestPrimaryInfo: boolean;\r\n var s, lname, fname, {ssn,} addr1, cty, st, zip: string;\r\n begin\r\n \tresult := true;\r\n \tlname := FieldValues.GetByLineCodeS('TPLNAME');\r\n \tfname := FieldValues.GetByLineCodeS('TPFNAME');\r\n// ssn := FieldValues.GetByLineCodeS('SSHASH');\r\n addr1 := FieldValues.GetByLineCodeS('TPSTRT');\r\n cty := FieldValues.GetByLineCodeS('TPCITY');\r\n st := FieldValues.GetByLineCodeS('TPSTATE');\r\n zip := FieldValues.GetByLineCodeS('TPZIP');\r\n s := '';\r\n if lname = '' then s := s + 'Last Name, ';\r\n if (CurrentTPType = 'I') and (fname = '') then s := s + 'First Name, ';\r\n if addr1 = '' then s := s + 'Address, ';\r\n if cty = '' then s := s + 'City, ';\r\n if st = '' then s := s + 'State, ';\r\n if zip = '' then s := s + 'Zip code, ';\r\n if s > '' then begin\r\n \ts := copy(s, 1, length(s)-2);\r\n\t VerifyMessages.Add('For the Taxpayer: ' + s + ' are required fields');\r\n result := false;\r\n end;\r\n end;\r\n\r\n procedure TestSecondaryInfo;\r\n var lname, fname, ssn: string;\r\n begin\r\n \tlname := FieldValues.GetByLineCodeS('TSLNAME');\r\n \tfname := FieldValues.GetByLineCodeS('TSFNAME');\r\n ssn := FieldValues.GetByLineCodeS('SSSHASH');\r\n if (dmTaxpayer.TP.STPID < 1) and (length(ssn) < 9) then\r\n \tVerifyMessages.Add('For Joint Return, Secondary SSN is required')\r\n else if (lname = '') or (fname = '') then\r\n \tVerifyMessages.Add('For Joint Return, Secondary Name is required');\r\n end;\r\n\r\nbegin\r\nresult := true;\r\n//\tTPProblem := false;\r\n VerifyMessages.Reset;\r\n// only if already in Return/\r\n// if WebForms[\r\n\t// check Secondary vs FileType\r\n ftype := BResCode;\t//FieldValues.GetByLineCodeS('TPFILESTAT');\r\n if ftype = 'J' then TestSecondaryInfo;\r\n // EMail, phone?\r\n //TPProblem := not\r\n VerifyTool.VerifyFieldByCode(0, 0, 'EMAIL', '*', false);\r\n phone := FieldValues.GetByLineCodeS('TPPHONE');\r\n if phone = '' then begin\r\n \tVerifyMessages.Add('Phone Number is required');\r\n// TPProblem := true;\r\n end;\r\n // Name, Address\r\n //if not TestPrimaryInfo then TPProblem := true;\r\n TestPrimaryInfo;\r\n // Loop through all sections, calling VerifyPage\r\n for i := 0 to nWebSections-1 do begin\r\n if (WebSections[i].WebFormID = CurrentFormID) and (WebSections[i].PageVerify > '') then\r\n\t\t\tVerifyTool.VerifyPage(WebSections[i].PageVerify, false);\r\n end;\r\n\r\n result := not VerifyMessages.AnyMessages;\r\n if not result then begin\r\n \tVerifyMessages.ShowMessages;\r\n\t\tif CurrentTPType = 'I' then\r\n \t\tChangeFormByPurpose('T')\r\n else\r\n \t\tChangeFormByPurpose('X');\r\n end;\r\nend;\r\n\r\nprocedure TwReturn.WaitTimersTimer(Sender: TObject);\r\nbegin\r\n\tWaitTimers.Enabled := false;\r\n WaitMessage.Hide;\r\n btShowTaxForm.caption := 'Show Tax Form';\r\n btShowTaxForm.enabled := true;\r\nend;\r\n\r\nprocedure TwReturn.ChangeFormByPurpose(purp: string);\r\nvar i, btn: integer;\r\nbegin\r\n\tbtn := 0;\r\n\tfor i := 1 to 6 do\r\n \tif ScreenButtons.FormPurpose[i] = purp then\r\n \tbtn := i;\r\n if btn > 0 then\r\n \tChangeForm(ScreenButtons.FormButtons[btn]);\r\nend;\r\n\r\nprocedure TwReturn.ClearClick(Sender: TObject; Button: TMouseButton;\r\n Shift: TShiftState; X, Y: Integer);\r\nbegin\r\n\tEventActions.holdorder := -1;\r\nend;\r\n\r\nprocedure TwReturn.CounterTimerTimer(Sender: TObject);\r\nbegin\r\n\tCounterTimer.Enabled := false;\r\n\tdmClientConnections.SendConsoleMessage('Counters: ' + CallCounterList);\r\nend;\r\n\r\nprocedure TwReturn.DebugMessage(msg: string);\r\nbegin\r\n\tif pnFormHeading.visible and WebMemo1.visible then\r\n \tWebMemo1.Lines.Add(msg);\r\nend;\r\n\r\nprocedure TwReturn.WebFormBeforeUnload(Sender: TObject; var AMessage: string);\r\nbegin\r\n // Show Message???\r\nend;\r\n\r\nprocedure TwReturn.WebFormCreate(Sender: TObject);\r\nbegin\r\n ScreenButtons := TScreenButtons.create;\r\n InitButtons;\r\n CounterTimer.enabled := false;\r\n LastMove := '';\r\nend;\r\n\r\nprocedure TwReturn.WebFormDestroy(Sender: TObject);\r\nbegin\r\n\tScreenButtons.free;\r\nend;\r\n\r\nprocedure TwReturn.WebFormKeyUp(Sender: TObject; var Key: Word;\r\n Shift: TShiftState);\r\nbegin\r\n if (Key = VK_TAB) and (ssShift in Shift) then\r\n \tEventActions.Holdorder := -2;\r\nend;\r\n\r\nprocedure TwReturn.WebFormMouseDown(Sender: TObject; Button: TMouseButton;\r\n Shift: TShiftState; X, Y: Integer);\r\nbegin\r\n\tEventActions.holdorder := -1;\r\nend;\r\n\r\nprocedure TwReturn.WebFormShow(Sender: TObject);\r\nbegin\r\n ScreenButtons.ScreenPurposes := purposes;\r\n\tCurrentFormID := 0;\r\n CurrentSectionID := 0;\r\n ScreenButtons.SetAllButtons;\r\n pnFormButtons.visible := true;\r\n pnFormButtons.Color := SiteOpts.FormButtonsPanelColor;\r\n pnButtons.Color := SiteOpts.SectionButtonsPanelColor;\r\n pnMainButtons.Color := SiteOpts.SectionButtonsPanelColor;\r\n pnNext.Color := SiteOpts.SectionNextPanelColor;\r\n btNext.Color := SiteOpts.SectionNextButtonColor;\r\n ScreenButtons.SetCurrentByIndex(-1, -1);\r\n\tEventActions.holdorder := 100;\r\n LastMove := 'Show';\r\n\tShowScreen;\r\nend;\r\n\r\n\r\nprocedure TwReturn.LoadDFMValues;\r\nbegin\r\n inherited LoadDFMValues;\r\n\r\n WebScrollBox1 := TScrollBox.Create(Self);\r\n pnReturn := TPanel.Create(Self);\r\n pnSection := TPanel.Create(Self);\r\n pnNext := TPanel.Create(Self);\r\n btNext := TButton.Create(Self);\r\n pnSectionHeading := TPanel.Create(Self);\r\n lbSectionHeading := TLabel.Create(Self);\r\n WaitMessage := TWaitMessage.Create(Self);\r\n pnTotals := TPanel.Create(Self);\r\n pnTotalsSection := TPanel.Create(Self);\r\n lbTotalsSection := TLabel.Create(Self);\r\n WebMessageDlg1 := TMessageDlg.Create(Self);\r\n pnButtons := TPanel.Create(Self);\r\n WebButton1 := TSpeedButton.Create(Self);\r\n WebButton2 := TSpeedButton.Create(Self);\r\n WebButton3 := TSpeedButton.Create(Self);\r\n WebButton4 := TSpeedButton.Create(Self);\r\n WebButton5 := TSpeedButton.Create(Self);\r\n WebButton6 := TSpeedButton.Create(Self);\r\n WebButton7 := TSpeedButton.Create(Self);\r\n WebButton8 := TSpeedButton.Create(Self);\r\n WebButton9 := TSpeedButton.Create(Self);\r\n WebButton10 := TSpeedButton.Create(Self);\r\n WebButton11 := TSpeedButton.Create(Self);\r\n WebButton12 := TSpeedButton.Create(Self);\r\n pnMainButtons := TPanel.Create(Self);\r\n btMain := TSpeedButton.Create(Self);\r\n btSubmit := TSpeedButton.Create(Self);\r\n btSaveReturn := TSpeedButton.Create(Self);\r\n btValidate := TSpeedButton.Create(Self);\r\n btMailIn := TSpeedButton.Create(Self);\r\n btShowTaxForm := TSpeedButton.Create(Self);\r\n btReload := TSpeedButton.Create(Self);\r\n pnFormHeading := TPanel.Create(Self);\r\n WebMemo1 := TMemo.Create(Self);\r\n pnFormButtons := TPanel.Create(Self);\r\n btForm1 := TSpeedButton.Create(Self);\r\n btForm2 := TSpeedButton.Create(Self);\r\n btForm3 := TSpeedButton.Create(Self);\r\n btForm4 := TSpeedButton.Create(Self);\r\n btForm5 := TSpeedButton.Create(Self);\r\n btForm6 := TSpeedButton.Create(Self);\r\n pnHeader := TPanel.Create(Self);\r\n lbTaxYear := TLabel.Create(Self);\r\n lbCurrentStatus := TLabel.Create(Self);\r\n pnLogo := TPanel.Create(Self);\r\n imgLogo := TImageControl.Create(Self);\r\n WaitTimers := TTimer.Create(Self);\r\n PDFTimer := TTimer.Create(Self);\r\n CounterTimer := TTimer.Create(Self);\r\n\r\n WebScrollBox1.BeforeLoadDFMValues;\r\n pnReturn.BeforeLoadDFMValues;\r\n pnSection.BeforeLoadDFMValues;\r\n pnNext.BeforeLoadDFMValues;\r\n btNext.BeforeLoadDFMValues;\r\n pnSectionHeading.BeforeLoadDFMValues;\r\n lbSectionHeading.BeforeLoadDFMValues;\r\n WaitMessage.BeforeLoadDFMValues;\r\n pnTotals.BeforeLoadDFMValues;\r\n pnTotalsSection.BeforeLoadDFMValues;\r\n lbTotalsSection.BeforeLoadDFMValues;\r\n WebMessageDlg1.BeforeLoadDFMValues;\r\n pnButtons.BeforeLoadDFMValues;\r\n WebButton1.BeforeLoadDFMValues;\r\n WebButton2.BeforeLoadDFMValues;\r\n WebButton3.BeforeLoadDFMValues;\r\n WebButton4.BeforeLoadDFMValues;\r\n WebButton5.BeforeLoadDFMValues;\r\n WebButton6.BeforeLoadDFMValues;\r\n WebButton7.BeforeLoadDFMValues;\r\n WebButton8.BeforeLoadDFMValues;\r\n WebButton9.BeforeLoadDFMValues;\r\n WebButton10.BeforeLoadDFMValues;\r\n WebButton11.BeforeLoadDFMValues;\r\n WebButton12.BeforeLoadDFMValues;\r\n pnMainButtons.BeforeLoadDFMValues;\r\n btMain.BeforeLoadDFMValues;\r\n btSubmit.BeforeLoadDFMValues;\r\n btSaveReturn.BeforeLoadDFMValues;\r\n btValidate.BeforeLoadDFMValues;\r\n btMailIn.BeforeLoadDFMValues;\r\n btShowTaxForm.BeforeLoadDFMValues;\r\n btReload.BeforeLoadDFMValues;\r\n pnFormHeading.BeforeLoadDFMValues;\r\n WebMemo1.BeforeLoadDFMValues;\r\n pnFormButtons.BeforeLoadDFMValues;\r\n btForm1.BeforeLoadDFMValues;\r\n btForm2.BeforeLoadDFMValues;\r\n btForm3.BeforeLoadDFMValues;\r\n btForm4.BeforeLoadDFMValues;\r\n btForm5.BeforeLoadDFMValues;\r\n btForm6.BeforeLoadDFMValues;\r\n pnHeader.BeforeLoadDFMValues;\r\n lbTaxYear.BeforeLoadDFMValues;\r\n lbCurrentStatus.BeforeLoadDFMValues;\r\n pnLogo.BeforeLoadDFMValues;\r\n imgLogo.BeforeLoadDFMValues;\r\n WaitTimers.BeforeLoadDFMValues;\r\n PDFTimer.BeforeLoadDFMValues;\r\n CounterTimer.BeforeLoadDFMValues;\r\n try\r\n Name := 'wReturn';\r\n Width := 790;\r\n Height := 902;\r\n Caption := 'CityTax Online Filing';\r\n SetEvent(Self, 'OnBeforeUnload', 'WebFormBeforeUnload');\r\n SetEvent(Self, 'OnCreate', 'WebFormCreate');\r\n SetEvent(Self, 'OnDestroy', 'WebFormDestroy');\r\n SetEvent(Self, 'OnKeyUp', 'WebFormKeyUp');\r\n SetEvent(Self, 'OnMouseDown', 'WebFormMouseDown');\r\n SetEvent(Self, 'OnShow', 'WebFormShow');\r\n WebScrollBox1.SetParentComponent(Self);\r\n WebScrollBox1.Name := 'WebScrollBox1';\r\n WebScrollBox1.Left := 162;\r\n WebScrollBox1.Top := 227;\r\n WebScrollBox1.Width := 628;\r\n WebScrollBox1.Height := 675;\r\n WebScrollBox1.HeightPercent := 100.000000000000000000;\r\n WebScrollBox1.WidthPercent := 100.000000000000000000;\r\n WebScrollBox1.Align := alClient;\r\n WebScrollBox1.BorderStyle := bsSingle;\r\n WebScrollBox1.ChildOrder := 13;\r\n pnReturn.SetParentComponent(WebScrollBox1);\r\n pnReturn.Name := 'pnReturn';\r\n pnReturn.Left := 0;\r\n pnReturn.Top := 0;\r\n pnReturn.Width := 627;\r\n pnReturn.Height := 597;\r\n pnReturn.HeightPercent := 100.000000000000000000;\r\n pnReturn.WidthPercent := 100.000000000000000000;\r\n pnReturn.BorderColor := clSilver;\r\n pnReturn.BorderStyle := bsSingle;\r\n pnReturn.ChildOrder := 1;\r\n pnSection.SetParentComponent(pnReturn);\r\n pnSection.Name := 'pnSection';\r\n pnSection.Left := 0;\r\n pnSection.Top := 0;\r\n pnSection.Width := 627;\r\n pnSection.Height := 400;\r\n pnSection.HeightPercent := 100.000000000000000000;\r\n pnSection.WidthPercent := 100.000000000000000000;\r\n pnSection.Align := alTop;\r\n pnSection.BorderColor := clSilver;\r\n pnSection.BorderStyle := bsSingle;\r\n pnSection.ChildOrder := 2;\r\n SetEvent(pnSection, Self, 'OnMouseDown', 'ClearClick');\r\n pnNext.SetParentComponent(pnSection);\r\n pnNext.Name := 'pnNext';\r\n pnNext.Left := 0;\r\n pnNext.Top := 354;\r\n pnNext.Width := 627;\r\n pnNext.Height := 46;\r\n pnNext.HeightPercent := 100.000000000000000000;\r\n pnNext.WidthPercent := 100.000000000000000000;\r\n pnNext.Align := alBottom;\r\n pnNext.BorderColor := clSilver;\r\n pnNext.BorderStyle := bsNone;\r\n pnNext.ChildOrder := 1;\r\n pnNext.Visible := False;\r\n SetEvent(pnNext, Self, 'OnMouseDown', 'ClearClick');\r\n btNext.SetParentComponent(pnNext);\r\n btNext.Name := 'btNext';\r\n btNext.Left := 252;\r\n btNext.Top := 10;\r\n btNext.Width := 216;\r\n btNext.Height := 29;\r\n btNext.Color := 11127499;\r\n btNext.Caption := 'Next';\r\n btNext.Font.Charset := DEFAULT_CHARSET;\r\n btNext.Font.Color := clWindowText;\r\n btNext.Font.Height := -12;\r\n btNext.Font.Name := 'Tahoma';\r\n btNext.Font.Style := [];\r\n btNext.HeightPercent := 100.000000000000000000;\r\n btNext.ParentFont := False;\r\n btNext.WidthPercent := 100.000000000000000000;\r\n SetEvent(btNext, Self, 'OnClick', 'btNextClick');\r\n SetEvent(btNext, Self, 'OnMouseDown', 'ClearClick');\r\n pnSectionHeading.SetParentComponent(pnSection);\r\n pnSectionHeading.Name := 'pnSectionHeading';\r\n pnSectionHeading.Left := 0;\r\n pnSectionHeading.Top := 0;\r\n pnSectionHeading.Width := 627;\r\n pnSectionHeading.Height := 40;\r\n pnSectionHeading.HeightPercent := 100.000000000000000000;\r\n pnSectionHeading.WidthPercent := 100.000000000000000000;\r\n pnSectionHeading.Align := alTop;\r\n pnSectionHeading.BorderColor := clBtnFace;\r\n pnSectionHeading.BorderStyle := bsNone;\r\n pnSectionHeading.ChildOrder := 1;\r\n lbSectionHeading.SetParentComponent(pnSectionHeading);\r\n lbSectionHeading.Name := 'lbSectionHeading';\r\n lbSectionHeading.Left := 0;\r\n lbSectionHeading.Top := 0;\r\n lbSectionHeading.Width := 627;\r\n lbSectionHeading.Height := 40;\r\n lbSectionHeading.Align := alClient;\r\n lbSectionHeading.Alignment := taCenter;\r\n lbSectionHeading.AutoSize := False;\r\n lbSectionHeading.Caption := 'Section Heading';\r\n lbSectionHeading.Font.Charset := DEFAULT_CHARSET;\r\n lbSectionHeading.Font.Color := clWindowText;\r\n lbSectionHeading.Font.Height := -13;\r\n lbSectionHeading.Font.Name := 'Tahoma';\r\n lbSectionHeading.Font.Style := [];\r\n lbSectionHeading.HeightPercent := 100.000000000000000000;\r\n lbSectionHeading.Layout := tlCenter;\r\n lbSectionHeading.ParentFont := False;\r\n lbSectionHeading.WordWrap := True;\r\n lbSectionHeading.WidthPercent := 100.000000000000000000;\r\n SetEvent(lbSectionHeading, Self, 'OnMouseDown', 'ClearClick');\r\n WaitMessage.SetParentComponent(pnSection);\r\n WaitMessage.Name := 'WaitMessage';\r\n WaitMessage.Left := 285;\r\n WaitMessage.Top := 35;\r\n WaitMessage.Width := 24;\r\n WaitMessage.Height := 24;\r\n WaitMessage.Cursor := crHourGlass;\r\n WaitMessage.HeightPercent := 100.000000000000000000;\r\n WaitMessage.WidthPercent := 100.000000000000000000;\r\n WaitMessage.Opacity := 0.500000000000000000;\r\n WaitMessage.Picture.LoadFromFile('Return.pnSection.WaitMessage.Picture.gif');\r\n pnTotals.SetParentComponent(pnReturn);\r\n pnTotals.Name := 'pnTotals';\r\n pnTotals.Left := 0;\r\n pnTotals.Top := 400;\r\n pnTotals.Width := 627;\r\n pnTotals.Height := 200;\r\n pnTotals.HeightPercent := 100.000000000000000000;\r\n pnTotals.WidthPercent := 100.000000000000000000;\r\n pnTotals.Align := alTop;\r\n pnTotals.BorderColor := clSilver;\r\n pnTotals.BorderStyle := bsSingle;\r\n pnTotals.ChildOrder := 3;\r\n pnTotals.Color := clWindow;\r\n SetEvent(pnTotals, Self, 'OnMouseDown', 'ClearClick');\r\n pnTotalsSection.SetParentComponent(pnTotals);\r\n pnTotalsSection.Name := 'pnTotalsSection';\r\n pnTotalsSection.Left := 0;\r\n pnTotalsSection.Top := 0;\r\n pnTotalsSection.Width := 627;\r\n pnTotalsSection.Height := 28;\r\n pnTotalsSection.HeightPercent := 100.000000000000000000;\r\n pnTotalsSection.WidthPercent := 100.000000000000000000;\r\n pnTotalsSection.Align := alTop;\r\n pnTotalsSection.BorderColor := clBtnFace;\r\n pnTotalsSection.BorderStyle := bsNone;\r\n pnTotalsSection.ChildOrder := 1;\r\n lbTotalsSection.SetParentComponent(pnTotalsSection);\r\n lbTotalsSection.Name := 'lbTotalsSection';\r\n lbTotalsSection.Left := 0;\r\n lbTotalsSection.Top := 0;\r\n lbTotalsSection.Width := 627;\r\n lbTotalsSection.Height := 28;\r\n lbTotalsSection.Align := alClient;\r\n lbTotalsSection.Alignment := taCenter;\r\n lbTotalsSection.AutoSize := False;\r\n lbTotalsSection.Caption := 'Totals';\r\n lbTotalsSection.Font.Charset := DEFAULT_CHARSET;\r\n lbTotalsSection.Font.Color := clWindowText;\r\n lbTotalsSection.Font.Height := -13;\r\n lbTotalsSection.Font.Name := 'Tahoma';\r\n lbTotalsSection.Font.Style := [];\r\n lbTotalsSection.HeightPercent := 100.000000000000000000;\r\n lbTotalsSection.Layout := tlCenter;\r\n lbTotalsSection.ParentFont := False;\r\n lbTotalsSection.WordWrap := True;\r\n lbTotalsSection.WidthPercent := 100.000000000000000000;\r\n SetEvent(lbTotalsSection, Self, 'OnMouseDown', 'ClearClick');\r\n WebMessageDlg1.SetParentComponent(pnReturn);\r\n WebMessageDlg1.Name := 'WebMessageDlg1';\r\n WebMessageDlg1.Left := 431;\r\n WebMessageDlg1.Top := 448;\r\n WebMessageDlg1.Width := 24;\r\n WebMessageDlg1.Height := 24;\r\n WebMessageDlg1.HeightPercent := 100.000000000000000000;\r\n WebMessageDlg1.WidthPercent := 100.000000000000000000;\r\n WebMessageDlg1.Buttons := [];\r\n WebMessageDlg1.DialogText.BeginUpdate;\r\n try\r\n WebMessageDlg1.DialogText.Clear;\r\n WebMessageDlg1.DialogText.Add('Warning');\r\n WebMessageDlg1.DialogText.Add('Error');\r\n WebMessageDlg1.DialogText.Add('Information');\r\n WebMessageDlg1.DialogText.Add('Confirm');\r\n WebMessageDlg1.DialogText.Add('Custom');\r\n WebMessageDlg1.DialogText.Add('OK');\r\n WebMessageDlg1.DialogText.Add('Cancel');\r\n WebMessageDlg1.DialogText.Add('Yes');\r\n WebMessageDlg1.DialogText.Add('No');\r\n WebMessageDlg1.DialogText.Add('Abort');\r\n WebMessageDlg1.DialogText.Add('Retry');\r\n WebMessageDlg1.DialogText.Add('Ignore');\r\n WebMessageDlg1.DialogText.Add('All');\r\n WebMessageDlg1.DialogText.Add('Yes to All');\r\n WebMessageDlg1.DialogText.Add('No to All');\r\n WebMessageDlg1.DialogText.Add('Help');\r\n WebMessageDlg1.DialogText.Add('Close');\r\n finally\r\n WebMessageDlg1.DialogText.EndUpdate;\r\n end;\r\n WebMessageDlg1.Opacity := 0.200000000000000000;\r\n pnButtons.SetParentComponent(Self);\r\n pnButtons.Name := 'pnButtons';\r\n pnButtons.Left := 0;\r\n pnButtons.Top := 227;\r\n pnButtons.Width := 162;\r\n pnButtons.Height := 675;\r\n pnButtons.HeightPercent := 100.000000000000000000;\r\n pnButtons.WidthPercent := 100.000000000000000000;\r\n pnButtons.Align := alLeft;\r\n pnButtons.BorderColor := clSilver;\r\n pnButtons.BorderStyle := bsSingle;\r\n pnButtons.ChildOrder := 3;\r\n SetEvent(pnButtons, Self, 'OnMouseDown', 'ClearClick');\r\n WebButton1.SetParentComponent(pnButtons);\r\n WebButton1.Name := 'WebButton1';\r\n WebButton1.Left := 12;\r\n WebButton1.Top := 8;\r\n WebButton1.Width := 140;\r\n WebButton1.Height := 23;\r\n WebButton1.Caption := 'WebButton1';\r\n WebButton1.Down := True;\r\n WebButton1.GroupIndex := 12;\r\n WebButton1.Visible := False;\r\n SetEvent(WebButton1, Self, 'OnClick', 'SectionClick');\r\n SetEvent(WebButton1, Self, 'OnMouseDown', 'ClearClick');\r\n WebButton2.SetParentComponent(pnButtons);\r\n WebButton2.Name := 'WebButton2';\r\n WebButton2.Left := 12;\r\n WebButton2.Top := 34;\r\n WebButton2.Width := 140;\r\n WebButton2.Height := 23;\r\n WebButton2.Caption := 'WebButton2';\r\n WebButton2.ChildOrder := 1;\r\n WebButton2.GroupIndex := 12;\r\n WebButton2.Visible := False;\r\n SetEvent(WebButton2, Self, 'OnClick', 'SectionClick');\r\n SetEvent(WebButton2, Self, 'OnMouseDown', 'ClearClick');\r\n WebButton3.SetParentComponent(pnButtons);\r\n WebButton3.Name := 'WebButton3';\r\n WebButton3.Left := 12;\r\n WebButton3.Top := 60;\r\n WebButton3.Width := 140;\r\n WebButton3.Height := 23;\r\n WebButton3.Caption := 'WebButton3';\r\n WebButton3.ChildOrder := 2;\r\n WebButton3.GroupIndex := 12;\r\n WebButton3.Visible := False;\r\n SetEvent(WebButton3, Self, 'OnClick', 'SectionClick');\r\n SetEvent(WebButton3, Self, 'OnMouseDown', 'ClearClick');\r\n WebButton4.SetParentComponent(pnButtons);\r\n WebButton4.Name := 'WebButton4';\r\n WebButton4.Left := 12;\r\n WebButton4.Top := 86;\r\n WebButton4.Width := 140;\r\n WebButton4.Height := 23;\r\n WebButton4.Caption := 'WebButton4';\r\n WebButton4.ChildOrder := 3;\r\n WebButton4.GroupIndex := 12;\r\n WebButton4.Visible := False;\r\n SetEvent(WebButton4, Self, 'OnClick', 'SectionClick');\r\n SetEvent(WebButton4, Self, 'OnMouseDown', 'ClearClick');\r\n WebButton5.SetParentComponent(pnButtons);\r\n WebButton5.Name := 'WebButton5';\r\n WebButton5.Left := 12;\r\n WebButton5.Top := 112;\r\n WebButton5.Width := 140;\r\n WebButton5.Height := 23;\r\n WebButton5.Caption := 'WebButton5';\r\n WebButton5.ChildOrder := 4;\r\n WebButton5.GroupIndex := 12;\r\n WebButton5.Visible := False;\r\n SetEvent(WebButton5, Self, 'OnClick', 'SectionClick');\r\n SetEvent(WebButton5, Self, 'OnMouseDown', 'ClearClick');\r\n WebButton6.SetParentComponent(pnButtons);\r\n WebButton6.Name := 'WebButton6';\r\n WebButton6.Left := 12;\r\n WebButton6.Top := 138;\r\n WebButton6.Width := 140;\r\n WebButton6.Height := 23;\r\n WebButton6.Caption := 'WebButton6';\r\n WebButton6.ChildOrder := 5;\r\n WebButton6.GroupIndex := 12;\r\n WebButton6.Visible := False;\r\n SetEvent(WebButton6, Self, 'OnClick', 'SectionClick');\r\n SetEvent(WebButton6, Self, 'OnMouseDown', 'ClearClick');\r\n WebButton7.SetParentComponent(pnButtons);\r\n WebButton7.Name := 'WebButton7';\r\n WebButton7.Left := 12;\r\n WebButton7.Top := 164;\r\n WebButton7.Width := 140;\r\n WebButton7.Height := 23;\r\n WebButton7.Caption := 'WebButton7';\r\n WebButton7.ChildOrder := 6;\r\n WebButton7.GroupIndex := 12;\r\n WebButton7.Visible := False;\r\n SetEvent(WebButton7, Self, 'OnClick', 'SectionClick');\r\n SetEvent(WebButton7, Self, 'OnMouseDown', 'ClearClick');\r\n WebButton8.SetParentComponent(pnButtons);\r\n WebButton8.Name := 'WebButton8';\r\n WebButton8.Left := 12;\r\n WebButton8.Top := 190;\r\n WebButton8.Width := 140;\r\n WebButton8.Height := 23;\r\n WebButton8.Caption := 'WebButton8';\r\n WebButton8.ChildOrder := 7;\r\n WebButton8.GroupIndex := 12;\r\n WebButton8.Visible := False;\r\n SetEvent(WebButton8, Self, 'OnClick', 'SectionClick');\r\n SetEvent(WebButton8, Self, 'OnMouseDown', 'ClearClick');\r\n WebButton9.SetParentComponent(pnButtons);\r\n WebButton9.Name := 'WebButton9';\r\n WebButton9.Left := 12;\r\n WebButton9.Top := 216;\r\n WebButton9.Width := 140;\r\n WebButton9.Height := 23;\r\n WebButton9.Caption := 'WebButton9';\r\n WebButton9.ChildOrder := 8;\r\n WebButton9.GroupIndex := 12;\r\n WebButton9.Visible := False;\r\n SetEvent(WebButton9, Self, 'OnClick', 'SectionClick');\r\n SetEvent(WebButton9, Self, 'OnMouseDown', 'ClearClick');\r\n WebButton10.SetParentComponent(pnButtons);\r\n WebButton10.Name := 'WebButton10';\r\n WebButton10.Left := 12;\r\n WebButton10.Top := 242;\r\n WebButton10.Width := 140;\r\n WebButton10.Height := 23;\r\n WebButton10.Caption := 'WebButton10';\r\n WebButton10.ChildOrder := 9;\r\n WebButton10.GroupIndex := 12;\r\n WebButton10.Visible := False;\r\n SetEvent(WebButton10, Self, 'OnClick', 'SectionClick');\r\n SetEvent(WebButton10, Self, 'OnMouseDown', 'ClearClick');\r\n WebButton11.SetParentComponent(pnButtons);\r\n WebButton11.Name := 'WebButton11';\r\n WebButton11.Left := 12;\r\n WebButton11.Top := 268;\r\n WebButton11.Width := 140;\r\n WebButton11.Height := 23;\r\n WebButton11.Caption := 'WebButton11';\r\n WebButton11.ChildOrder := 10;\r\n WebButton11.GroupIndex := 12;\r\n WebButton11.Visible := False;\r\n SetEvent(WebButton11, Self, 'OnClick', 'SectionClick');\r\n SetEvent(WebButton11, Self, 'OnMouseDown', 'ClearClick');\r\n WebButton12.SetParentComponent(pnButtons);\r\n WebButton12.Name := 'WebButton12';\r\n WebButton12.Left := 12;\r\n WebButton12.Top := 294;\r\n WebButton12.Width := 140;\r\n WebButton12.Height := 23;\r\n WebButton12.Caption := 'WebButton12';\r\n WebButton12.ChildOrder := 11;\r\n WebButton12.GroupIndex := 12;\r\n WebButton12.Visible := False;\r\n SetEvent(WebButton12, Self, 'OnClick', 'SectionClick');\r\n SetEvent(WebButton12, Self, 'OnMouseDown', 'ClearClick');\r\n pnMainButtons.SetParentComponent(pnButtons);\r\n pnMainButtons.Name := 'pnMainButtons';\r\n pnMainButtons.Left := 0;\r\n pnMainButtons.Top := 329;\r\n pnMainButtons.Width := 162;\r\n pnMainButtons.Height := 197;\r\n pnMainButtons.HeightPercent := 100.000000000000000000;\r\n pnMainButtons.WidthPercent := 100.000000000000000000;\r\n pnMainButtons.BorderColor := clSilver;\r\n pnMainButtons.BorderStyle := bsSingle;\r\n pnMainButtons.Caption := 'pnMainButtons';\r\n pnMainButtons.ChildOrder := 15;\r\n pnMainButtons.ShowCaption := False;\r\n SetEvent(pnMainButtons, Self, 'OnMouseDown', 'ClearClick');\r\n btMain.SetParentComponent(pnMainButtons);\r\n btMain.Name := 'btMain';\r\n btMain.Left := 12;\r\n btMain.Top := 3;\r\n btMain.Width := 140;\r\n btMain.Height := 25;\r\n btMain.Caption := 'Back To Main Screen';\r\n btMain.ChildOrder := 11;\r\n SetEvent(btMain, Self, 'OnClick', 'btMainClick');\r\n btSubmit.SetParentComponent(pnMainButtons);\r\n btSubmit.Name := 'btSubmit';\r\n btSubmit.Left := 12;\r\n btSubmit.Top := 30;\r\n btSubmit.Width := 140;\r\n btSubmit.Height := 25;\r\n btSubmit.Caption := 'Submit Return';\r\n btSubmit.ChildOrder := 11;\r\n SetEvent(btSubmit, Self, 'OnClick', 'btSubmitClick');\r\n btSaveReturn.SetParentComponent(pnMainButtons);\r\n btSaveReturn.Name := 'btSaveReturn';\r\n btSaveReturn.Left := 12;\r\n btSaveReturn.Top := 84;\r\n btSaveReturn.Width := 140;\r\n btSaveReturn.Height := 25;\r\n btSaveReturn.Caption := 'Save for Later';\r\n btSaveReturn.ChildOrder := 11;\r\n SetEvent(btSaveReturn, Self, 'OnClick', 'btSaveReturnClick');\r\n btValidate.SetParentComponent(pnMainButtons);\r\n btValidate.Name := 'btValidate';\r\n btValidate.Left := 12;\r\n btValidate.Top := 138;\r\n btValidate.Width := 140;\r\n btValidate.Height := 25;\r\n btValidate.Caption := 'Review Return';\r\n btValidate.ChildOrder := 11;\r\n SetEvent(btValidate, Self, 'OnClick', 'btValidateClick');\r\n btMailIn.SetParentComponent(pnMainButtons);\r\n btMailIn.Name := 'btMailIn';\r\n btMailIn.Left := 12;\r\n btMailIn.Top := 57;\r\n btMailIn.Width := 140;\r\n btMailIn.Height := 25;\r\n btMailIn.Caption := 'Mail In Paper';\r\n btMailIn.ChildOrder := 11;\r\n SetEvent(btMailIn, Self, 'OnClick', 'btMailInClick');\r\n btShowTaxForm.SetParentComponent(pnMainButtons);\r\n btShowTaxForm.Name := 'btShowTaxForm';\r\n btShowTaxForm.Left := 12;\r\n btShowTaxForm.Top := 111;\r\n btShowTaxForm.Width := 140;\r\n btShowTaxForm.Height := 25;\r\n btShowTaxForm.Caption := 'Show Tax Form';\r\n btShowTaxForm.ChildOrder := 11;\r\n SetEvent(btShowTaxForm, Self, 'OnClick', 'btShowTaxFormClick');\r\n btReload.SetParentComponent(pnMainButtons);\r\n btReload.Name := 'btReload';\r\n btReload.Left := 12;\r\n btReload.Top := 165;\r\n btReload.Width := 140;\r\n btReload.Height := 25;\r\n btReload.Caption := 'Re-Load Data';\r\n btReload.ChildOrder := 11;\r\n SetEvent(btReload, Self, 'OnClick', 'btReloadClick');\r\n pnFormHeading.SetParentComponent(Self);\r\n pnFormHeading.Name := 'pnFormHeading';\r\n pnFormHeading.Left := 0;\r\n pnFormHeading.Top := 141;\r\n pnFormHeading.Width := 790;\r\n pnFormHeading.Height := 86;\r\n pnFormHeading.HeightPercent := 100.000000000000000000;\r\n pnFormHeading.WidthPercent := 100.000000000000000000;\r\n pnFormHeading.Align := alTop;\r\n pnFormHeading.BorderColor := clSilver;\r\n pnFormHeading.BorderStyle := bsSingle;\r\n pnFormHeading.ChildOrder := 3;\r\n pnFormHeading.Visible := False;\r\n WebMemo1.SetParentComponent(pnFormHeading);\r\n WebMemo1.Name := 'WebMemo1';\r\n WebMemo1.Left := 0;\r\n WebMemo1.Top := 0;\r\n WebMemo1.Width := 790;\r\n WebMemo1.Height := 86;\r\n WebMemo1.Align := alClient;\r\n WebMemo1.AutoSize := False;\r\n WebMemo1.HeightPercent := 100.000000000000000000;\r\n WebMemo1.SelLength := 0;\r\n WebMemo1.SelStart := 0;\r\n WebMemo1.WidthPercent := 100.000000000000000000;\r\n pnFormButtons.SetParentComponent(Self);\r\n pnFormButtons.Name := 'pnFormButtons';\r\n pnFormButtons.Left := 0;\r\n pnFormButtons.Top := 109;\r\n pnFormButtons.Width := 790;\r\n pnFormButtons.Height := 32;\r\n pnFormButtons.HeightPercent := 100.000000000000000000;\r\n pnFormButtons.WidthPercent := 100.000000000000000000;\r\n pnFormButtons.Align := alTop;\r\n pnFormButtons.BorderColor := clSilver;\r\n pnFormButtons.BorderStyle := bsSingle;\r\n pnFormButtons.ChildOrder := 4;\r\n btForm1.SetParentComponent(pnFormButtons);\r\n btForm1.Name := 'btForm1';\r\n btForm1.Left := 2;\r\n btForm1.Top := 0;\r\n btForm1.Width := 126;\r\n btForm1.Height := 29;\r\n btForm1.Hint := 'Main City Tax Form';\r\n btForm1.Anchors := [];\r\n btForm1.AllowAllUp := True;\r\n btForm1.Caption := 'Tax Form';\r\n btForm1.GroupIndex := 11;\r\n btForm1.ShowHint := True;\r\n SetEvent(btForm1, Self, 'OnClick', 'FormClick');\r\n SetEvent(btForm1, Self, 'OnMouseDown', 'ClearClick');\r\n btForm2.SetParentComponent(pnFormButtons);\r\n btForm2.Name := 'btForm2';\r\n btForm2.Left := 134;\r\n btForm2.Top := 0;\r\n btForm2.Width := 126;\r\n btForm2.Height := 29;\r\n btForm2.Anchors := [];\r\n btForm2.AllowAllUp := True;\r\n btForm2.Caption := 'Tax Form';\r\n btForm2.ChildOrder := 1;\r\n btForm2.GroupIndex := 11;\r\n SetEvent(btForm2, Self, 'OnClick', 'FormClick');\r\n SetEvent(btForm2, Self, 'OnMouseDown', 'ClearClick');\r\n btForm3.SetParentComponent(pnFormButtons);\r\n btForm3.Name := 'btForm3';\r\n btForm3.Left := 266;\r\n btForm3.Top := 0;\r\n btForm3.Width := 126;\r\n btForm3.Height := 29;\r\n btForm3.Anchors := [];\r\n btForm3.AllowAllUp := True;\r\n btForm3.Caption := 'Tax Form';\r\n btForm3.ChildOrder := 2;\r\n btForm3.GroupIndex := 11;\r\n SetEvent(btForm3, Self, 'OnClick', 'FormClick');\r\n SetEvent(btForm3, Self, 'OnMouseDown', 'ClearClick');\r\n btForm4.SetParentComponent(pnFormButtons);\r\n btForm4.Name := 'btForm4';\r\n btForm4.Left := 398;\r\n btForm4.Top := 0;\r\n btForm4.Width := 126;\r\n btForm4.Height := 29;\r\n btForm4.Anchors := [];\r\n btForm4.AllowAllUp := True;\r\n btForm4.Caption := 'Tax Form';\r\n btForm4.ChildOrder := 3;\r\n btForm4.GroupIndex := 11;\r\n SetEvent(btForm4, Self, 'OnClick', 'FormClick');\r\n SetEvent(btForm4, Self, 'OnMouseDown', 'ClearClick');\r\n btForm5.SetParentComponent(pnFormButtons);\r\n btForm5.Name := 'btForm5';\r\n btForm5.Left := 530;\r\n btForm5.Top := 0;\r\n btForm5.Width := 126;\r\n btForm5.Height := 29;\r\n btForm5.Anchors := [];\r\n btForm5.AllowAllUp := True;\r\n btForm5.Caption := 'Tax Form';\r\n btForm5.ChildOrder := 3;\r\n btForm5.GroupIndex := 11;\r\n SetEvent(btForm5, Self, 'OnClick', 'FormClick');\r\n SetEvent(btForm5, Self, 'OnMouseDown', 'ClearClick');\r\n btForm6.SetParentComponent(pnFormButtons);\r\n btForm6.Name := 'btForm6';\r\n btForm6.Left := 662;\r\n btForm6.Top := 0;\r\n btForm6.Width := 126;\r\n btForm6.Height := 29;\r\n btForm6.Anchors := [];\r\n btForm6.AllowAllUp := True;\r\n btForm6.Caption := 'Tax Form';\r\n btForm6.ChildOrder := 3;\r\n btForm6.GroupIndex := 11;\r\n SetEvent(btForm6, Self, 'OnClick', 'FormClick');\r\n SetEvent(btForm6, Self, 'OnMouseDown', 'ClearClick');\r\n pnHeader.SetParentComponent(Self);\r\n pnHeader.Name := 'pnHeader';\r\n pnHeader.Left := 0;\r\n pnHeader.Top := 78;\r\n pnHeader.Width := 790;\r\n pnHeader.Height := 31;\r\n pnHeader.HeightPercent := 100.000000000000000000;\r\n pnHeader.WidthPercent := 100.000000000000000000;\r\n pnHeader.Align := alTop;\r\n pnHeader.BorderColor := clSilver;\r\n pnHeader.BorderStyle := bsSingle;\r\n pnHeader.ChildOrder := 2;\r\n pnHeader.Visible := False;\r\n lbTaxYear.SetParentComponent(pnHeader);\r\n lbTaxYear.Name := 'lbTaxYear';\r\n lbTaxYear.Left := 17;\r\n lbTaxYear.Top := 6;\r\n lbTaxYear.Width := 57;\r\n lbTaxYear.Height := 16;\r\n lbTaxYear.Caption := 'lbTaxYear';\r\n lbTaxYear.Font.Charset := DEFAULT_CHARSET;\r\n lbTaxYear.Font.Color := clWindowText;\r\n lbTaxYear.Font.Height := -13;\r\n lbTaxYear.Font.Name := 'Tahoma';\r\n lbTaxYear.Font.Style := [];\r\n lbTaxYear.HeightPercent := 100.000000000000000000;\r\n lbTaxYear.ParentFont := False;\r\n lbTaxYear.WidthPercent := 100.000000000000000000;\r\n lbCurrentStatus.SetParentComponent(pnHeader);\r\n lbCurrentStatus.Name := 'lbCurrentStatus';\r\n lbCurrentStatus.Left := 164;\r\n lbCurrentStatus.Top := 1;\r\n lbCurrentStatus.Width := 437;\r\n lbCurrentStatus.Height := 26;\r\n lbCurrentStatus.Alignment := taCenter;\r\n lbCurrentStatus.AutoSize := False;\r\n lbCurrentStatus.Caption := 'lbCurrentStatus';\r\n lbCurrentStatus.Font.Charset := DEFAULT_CHARSET;\r\n lbCurrentStatus.Font.Color := clWindowText;\r\n lbCurrentStatus.Font.Height := -13;\r\n lbCurrentStatus.Font.Name := 'Tahoma';\r\n lbCurrentStatus.Font.Style := [];\r\n lbCurrentStatus.HeightPercent := 100.000000000000000000;\r\n lbCurrentStatus.Layout := tlCenter;\r\n lbCurrentStatus.ParentFont := False;\r\n lbCurrentStatus.WidthPercent := 100.000000000000000000;\r\n pnLogo.SetParentComponent(Self);\r\n pnLogo.Name := 'pnLogo';\r\n pnLogo.Left := 0;\r\n pnLogo.Top := 0;\r\n pnLogo.Width := 790;\r\n pnLogo.Height := 78;\r\n pnLogo.HeightPercent := 100.000000000000000000;\r\n pnLogo.WidthPercent := 100.000000000000000000;\r\n pnLogo.Align := alTop;\r\n pnLogo.BorderColor := clSilver;\r\n pnLogo.BorderStyle := bsSingle;\r\n pnLogo.ChildOrder := 2;\r\n imgLogo.SetParentComponent(pnLogo);\r\n imgLogo.Name := 'imgLogo';\r\n imgLogo.Left := 0;\r\n imgLogo.Top := 0;\r\n imgLogo.Width := 790;\r\n imgLogo.Height := 78;\r\n imgLogo.WidthStyle := ssAuto;\r\n imgLogo.HeightPercent := 100.000000000000000000;\r\n imgLogo.WidthPercent := 100.000000000000000000;\r\n imgLogo.Align := alClient;\r\n imgLogo.URL := 'FindlayLogo.jpg';\r\n WaitTimers.SetParentComponent(Self);\r\n WaitTimers.Name := 'WaitTimers';\r\n WaitTimers.Enabled := False;\r\n WaitTimers.Interval := 5000;\r\n SetEvent(WaitTimers, Self, 'OnTimer', 'WaitTimersTimer');\r\n WaitTimers.Left := 633;\r\n WaitTimers.Top := 738;\r\n PDFTimer.SetParentComponent(Self);\r\n PDFTimer.Name := 'PDFTimer';\r\n PDFTimer.Enabled := False;\r\n PDFTimer.Interval := 4000;\r\n SetEvent(PDFTimer, Self, 'OnTimer', 'PDFTimerTimer');\r\n PDFTimer.Left := 699;\r\n PDFTimer.Top := 712;\r\n CounterTimer.SetParentComponent(Self);\r\n CounterTimer.Name := 'CounterTimer';\r\n CounterTimer.Enabled := False;\r\n CounterTimer.Interval := 10000;\r\n SetEvent(CounterTimer, Self, 'OnTimer', 'CounterTimerTimer');\r\n CounterTimer.Left := 562;\r\n CounterTimer.Top := 752;\r\n finally\r\n WebScrollBox1.AfterLoadDFMValues;\r\n pnReturn.AfterLoadDFMValues;\r\n pnSection.AfterLoadDFMValues;\r\n pnNext.AfterLoadDFMValues;\r\n btNext.AfterLoadDFMValues;\r\n pnSectionHeading.AfterLoadDFMValues;\r\n lbSectionHeading.AfterLoadDFMValues;\r\n WaitMessage.AfterLoadDFMValues;\r\n pnTotals.AfterLoadDFMValues;\r\n pnTotalsSection.AfterLoadDFMValues;\r\n lbTotalsSection.AfterLoadDFMValues;\r\n WebMessageDlg1.AfterLoadDFMValues;\r\n pnButtons.AfterLoadDFMValues;\r\n WebButton1.AfterLoadDFMValues;\r\n WebButton2.AfterLoadDFMValues;\r\n WebButton3.AfterLoadDFMValues;\r\n WebButton4.AfterLoadDFMValues;\r\n WebButton5.AfterLoadDFMValues;\r\n WebButton6.AfterLoadDFMValues;\r\n WebButton7.AfterLoadDFMValues;\r\n WebButton8.AfterLoadDFMValues;\r\n WebButton9.AfterLoadDFMValues;\r\n WebButton10.AfterLoadDFMValues;\r\n WebButton11.AfterLoadDFMValues;\r\n WebButton12.AfterLoadDFMValues;\r\n pnMainButtons.AfterLoadDFMValues;\r\n btMain.AfterLoadDFMValues;\r\n btSubmit.AfterLoadDFMValues;\r\n btSaveReturn.AfterLoadDFMValues;\r\n btValidate.AfterLoadDFMValues;\r\n btMailIn.AfterLoadDFMValues;\r\n btShowTaxForm.AfterLoadDFMValues;\r\n btReload.AfterLoadDFMValues;\r\n pnFormHeading.AfterLoadDFMValues;\r\n WebMemo1.AfterLoadDFMValues;\r\n pnFormButtons.AfterLoadDFMValues;\r\n btForm1.AfterLoadDFMValues;\r\n btForm2.AfterLoadDFMValues;\r\n btForm3.AfterLoadDFMValues;\r\n btForm4.AfterLoadDFMValues;\r\n btForm5.AfterLoadDFMValues;\r\n btForm6.AfterLoadDFMValues;\r\n pnHeader.AfterLoadDFMValues;\r\n lbTaxYear.AfterLoadDFMValues;\r\n lbCurrentStatus.AfterLoadDFMValues;\r\n pnLogo.AfterLoadDFMValues;\r\n imgLogo.AfterLoadDFMValues;\r\n WaitTimers.AfterLoadDFMValues;\r\n PDFTimer.AfterLoadDFMValues;\r\n CounterTimer.AfterLoadDFMValues;\r\n end;\r\nend;\r\n\r\nend.\r\n\r\n","unit Verification;\r\n\r\ninterface\r\nuses WEBLib.Dialogs, SysUtils, Math, Parameters;\r\n\r\n(*// Do I need a VerifyReturn?? = VerifyPage for each Page?\r\nfunction VerifyPage(verifystr: string; ShowMsgs: boolean): boolean;\r\nfunction VerifyEntryPage(verifystr: string): boolean;\r\nfunction VerifyFieldByCode(fldndx, gpndx: integer; verifystr, txt: string; ClearMsgs: boolean): boolean;\r\nfunction HandleFailure(act, msg: string): boolean;\r\n*)\r\n\r\ntype\r\n TVerifyMessages = class(TStringParams)\r\n public\r\n \tprocedure ShowMessages;\r\n function AnyMessages: boolean;\r\n end;\r\n\r\n TVerification = class\r\n private\r\n function IfConfirmExistsThenMustMatch(cod, match, msg, matchmsg, act: string): boolean;\r\n function IfFieldExistsThenRequired(cod, msg, act: string): boolean;\r\n function HandleFailure(act, msg: string): boolean;\r\n function TestRequired(fld: string): boolean;\r\n function IsFunction(tst: string): boolean;\r\n function TestFormula(tst: string): boolean;\r\n function TestFunction(tst, txt, act: string): boolean;\r\n// function TestSecondary(act: string): boolean;\r\n function TestACH(act: string): boolean;\r\n function TestEMail(txt, act: string): boolean;\r\n function TestRouting(testreq: boolean; txt, act: string): boolean;\r\n public\r\n function VerifyEntryPage(verifystr: string): boolean;\r\n function VerifyFieldByCode(fldndx, gpndx: integer; verifystr, txt: string;\r\n ClearMsgs: boolean): boolean;\r\n function VerifyPage(verifystr: string; ShowMsgs: boolean): boolean;\r\n constructor create;\r\n destructor Destroy; override;\r\n end;\r\n\r\nvar\r\n VerifyTool: TVerification;\r\n VerifyMessages: TVerifyMessages;\r\n\r\n\r\nimplementation\r\n\r\nuses entForms, entFieldValues, Formulas, ClientCurrent;\r\n\r\n{ TVerifyMessages }\r\n\r\nfunction TVerifyMessages.AnyMessages: boolean;\r\nvar i: integer;\r\nbegin\r\n result := false;\r\n for i := 1 to nParams do\r\n \tif trim(arr[i]) > '' then result := true;\r\nend;\r\n\r\nprocedure TVerifyMessages.ShowMessages;\r\nvar s: string;\r\n\t i: integer;\r\nbegin\r\n\tif nParams > 0 then begin\r\n\t\ts := '';\r\n\t\tfor i := 1 to nParams do\r\n \t\ts := s + ParamArr[i] + #13;\r\n\t ShowMessage(s);\r\n end;\r\nend;\r\n\r\nconstructor TVerification.create;\r\nbegin\r\n VerifyMessages := TVerifyMessages.Create(25);\r\nend;\r\n\r\ndestructor TVerification.Destroy;\r\nbegin\r\n\tVerifyMessages.free;\r\n inherited;\r\nend;\r\n\r\nfunction TVerification.HandleFailure(act, msg: string): boolean;\r\nvar addmsg: string;\r\n\t p: integer;\r\nbegin\r\n\tresult := true;\r\n addmsg := '';\r\n p := pos('/', act);\r\n if p > 0 then begin\r\n \taddmsg := ': ' + copy(act, p+1, length(act)-p);\r\n \tact := copy(act, 1, p-1);\r\n end;\r\n if pos('M', act) = 0 then // Add to Messages: M = No Message\r\n VerifyMessages.Add(msg + AddMsg);\r\n if pos('W', act) > 0 then\t// Warning only\r\n result := false;\r\n if pos('G', act) > 0 then begin\r\n // set focus to designated\r\n end;\r\nend;\r\n\r\nfunction TVerification.TestRequired(fld: string): boolean;\r\n//var fm, fld, ndx, sub: integer\r\nvar s: string;\r\nbegin\r\n // test other fields: get FieldValue\r\n if copy(fld, 1, 1) ='{' then\r\n \ts := FieldValues.GetValueByDesig(fld)\r\n else\r\n \ts := FieldValues.GetByLineCodeS(fld);\r\n result := (s > '');\r\nend;\r\n\r\nfunction TVerification.TestFormula(tst: string): boolean;\r\nvar failed: boolean;\r\nbegin\r\n\t// use standard formula\r\n failed := CalcCondition(tst, CurrentGroupIndex);\r\n result := failed;\r\n(* if copy(tst, 1, 2) = 'IF' then begin\r\n // IF(condition,Fields)\r\n // condition: FldID means that field is not blank\r\n // FldID! Means field is blank\r\n // FldID=val\r\n // Fields: separated listed using tilde?\r\n // FldID field is required\r\n // FldID! field must be blank\r\n // FldID=val field must be that value\r\n // ex: IF(27,28~29~30):W\r\n end\r\n*)\r\nend;\r\n\r\nconst\r\n\tnVFUNCS: integer=3;\r\n\tVFUNCS: array of string =\r\n\t\t('ROUTING', 'EMAIL', 'ACH');\r\nfunction TVerification.IsFunction(tst: string): boolean;\r\nvar ntst: integer;\r\nbegin\r\n\tresult := false;\r\n tst := uppercase(tst);\r\n for ntst := 0 to nVFUNCS-1 do\r\n \tif copy(tst, 1, length(VFUNCS[ntst])) = VFUNCS[ntst] then\r\n\t\t\tresult := true;\r\nend;\r\n\r\nfunction TVerification.IfFieldExistsThenRequired(cod, msg, act: string): boolean;\r\nvar txt: string;\r\nbegin\r\n result := false;\r\n if FieldValues.LineCodeExists(cod) then begin\r\n txt := FieldValues.GetByLineCodeS(cod);\r\n if txt = '' then begin\r\n HandleFailure(act, msg);\t//VerifyMessages.Add(msg);\r\n result := true;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TVerification.IfConfirmExistsThenMustMatch(cod, match, msg, matchmsg, act: string): boolean;\r\nvar s: string;\r\nbegin\r\n result := false;\r\n if FieldValues.LineCodeExists(cod) then begin\r\n s := FieldValues.GetByLineCodeS(cod);\r\n if s = '' then begin\r\n HandleFailure(act, msg);\t//VerifyMessages.Add(msg);\r\n result := true;\r\n end\r\n else if s <> match then begin\r\n HandleFailure(act, matchmsg);\t//VerifyMessages.Add(msg);\r\n result := true;\r\n end\r\n end;\r\nend;\r\n\r\nfunction TVerification.TestRouting(testreq: boolean; txt, act: string): boolean;\r\nvar i, tot, tround, digit: integer;\r\n x: double;\r\n\r\n procedure AddMult(off: integer);\r\n var num, mult: integer;\r\n begin\r\n case off mod 3 of\r\n 0: mult := 1;\r\n 1: mult := 3;\r\n 2: mult := 7;\r\n end;\r\n num := strtointdef(copy(txt, off, 1), 0) * mult;\r\n tot := tot + num;\r\n end;\r\n\r\nbegin\r\n if length(txt) = 0 then begin\r\n if testreq then\r\n result := HandleFailure(act, 'Routing Number is required')\r\n end\t// don't trigger if blank\r\n else if length(txt) < 9 then\r\n result := HandleFailure(act, 'Invalid Routing Number')\r\n else begin\r\n tot := 0;\r\n for i := 1 to 8 do\r\n AddMult(i);\r\n x := 1.0*tot/10.0;\r\n tround := 10*ceil(x);\r\n digit := tround - tot;\r\n if inttostr(digit) <> copy(txt, 9, 1) then\r\n result := HandleFailure(act, 'Invalid Routing Number');\r\n end;\r\nend;\r\n\r\nfunction TVerification.TestEMail(txt, act: string): boolean;\r\nvar at, per: integer;\r\nbegin\r\n if txt = '*' then\r\n txt := FieldValues.GetByLineCodeS('TPEMAIL');\r\n result := (txt > '');\r\n if result then begin\r\n at := pos('@', txt);\r\n per := length(txt);\r\n if at > 0 then\r\n \t while (per > at) and (txt[per] <> '.') do dec(per);\r\n\t result := (at > 0) and (per > 0) and (at < per-1) and (per < length(txt)-1);\r\n if not result then\r\n result := HandleFailure(act, 'Invalid EMail');\r\n end\r\n else\r\n result := HandleFailure(act, 'EMail is Required')\r\nend;\r\n\r\nfunction TVerification.TestACH(act: string): boolean;\r\nvar amt: currency;\r\n\t txt, bankacct: string;\r\nbegin\r\n // ACH Payment button only\r\n // Find Routing, Bank Account, Confirm, Account Type,\r\n txt := FieldValues.GetByLineCodeS('BKRT');\r\n TestRouting(true, txt, act);\t// check required\r\n bankacct := FieldValues.GetByLineCodeS('BKAC');\r\n IfFieldExistsThenRequired('BKAC', 'Bank Account is required', act);\r\n IfConfirmExistsThenMustMatch('BKACC', bankacct, 'Confirm Bank Account is required', 'Confirm Bank Account Must Match', act);\r\n IfFieldExistsThenRequired('BATY', 'Bank Account Type is required', act);\r\n IfFieldExistsThenRequired('BKNM', 'Name on Account is required', act);\r\n amt := FieldValues.GetByLineCodeV('PATOT');\r\n if amt < 1.0 then\r\n HandleFailure(act, 'Amount is not filled in');\r\n result := (VerifyMessages.Count > 0);\r\nend;\r\n\r\nfunction TVerification.TestFunction(tst, txt, act: string): boolean;\r\nvar ntst, ln: integer;\r\n\t fld: string;\r\nbegin\r\n\tresult := false;\r\n tst := uppercase(tst);\r\n fld := '';\r\n for ntst := 0 to nVFUNCS-1 do begin\r\n \tln := length(VFUNCS[ntst]);\r\n \tif copy(tst, 1, ln) = VFUNCS[ntst] then begin\r\n\t\t if (txt = '') and (length(tst) > ln) then begin\r\n \tfld := copy(tst, ln+1, length(tst)-ln);\r\n txt := FieldValues.GetValueByDesig(fld);\r\n end;\r\n \tcase ntst of\r\n \t0:\tresult := TestRouting(false, txt, act);\r\n 1: result := TestEMail(txt, act);\r\n 2: result := TestACH(act);\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TVerification.VerifyFieldByCode(fldndx, gpndx: integer; verifystr, txt: string; ClearMsgs: boolean): boolean;\r\n// verifystr: StringParams format: test1|test2|\r\n// blank does no testing\r\n// teststr: verifycode with optional HandleCode (M no message, W warning but don't stop, T Taxpayer Info-so go there)\r\n//\t\t\t\t format: test;action/message\t message is optional\r\n// test: CODE or\t\t\t\t\t\t\t\t for current field\r\n//\t\t\t\t CODE{Field}\t\t\t\t\t\t\t for Page with designate field\r\n//\t\t\t\t Formula or Conditional formula same as other formula\r\n// * Current Field is required Not on Page Test-only Field exit\r\n// *{Field}\t\t\t\t \t\t\t\t Field is required\r\n// Still Handle: if field is not blank, then other fields are required\r\n// if routing is filled in, then bank account is required, and confirm matches account\r\n// if joint return, and new TP, then Sec SSN is required, 9 numbers\r\n// if joint return, then secondary last and first name are required\r\n// *{8.1}\r\n// examples:\r\n// ROUTING;W/message|\r\n// *;M|\r\n// (({8.2}![])&({8.3}=[]));/Bank Account Required for ACH|(({8.2}![])&({8.4}!{8.3}));/Confirm Account does not match|\r\n//\t\t\t\t *{8.2}/\r\n// Error Messages are added to VerifyMessages to be handled by calling routine\r\nvar parm: TStringParams;\r\n\t i: integer;\r\n failed: boolean;\r\n\r\n\tprocedure VerifyOneTest(tst: string);\r\n var act, msg: string;\r\n \t p: integer;\r\n begin\r\n \tp := pos(';', tst);\r\n act := '';\r\n if p > 0 then begin\r\n \tact := copy(tst, p+1, length(tst)-p);\r\n tst := copy(tst, 1, p-1);\r\n end;\r\n \tp := pos('/', act);\r\n if p > 0 then begin\r\n \tmsg := copy(act, p+1, length(act)-p);\r\n act := copy(act, 1, p-1);\r\n end;\r\n \tif tst = '*' then begin\t\t// Required\r\n \tif txt = '' then\r\n \tfailed := not HandleFailure(act, 'Field is Required: ' + WebFields[fldndx].Question);\r\n end\r\n \telse if copy(tst, 1, 1) = '*' then begin\t\t// Required\r\n \tif TestRequired(copy(tst, 2, length(tst)-1)) then\r\n \tfailed := not HandleFailure(act, msg + ' is Required');\r\n end\r\n else if IsFunction(tst) then\r\n \tfailed := TestFunction(tst, txt, act)\r\n{ else if IsFunction(tst) then\r\n \tfailed := TestFormula(tst, txt, act)\r\n}\r\n else begin\r\n \tfailed := TestFormula(tst);\r\n if failed then\r\n \tfailed := not HandleFailure(act, WebFields[fldndx].Question);\r\n end;\r\n end;\r\n\r\nbegin\r\n failed := false;\r\n if ClearMsgs then\r\n \tVerifyMessages.Reset;\r\n if pos('|', verifystr) = 0 then\r\n \tVerifyOneTest(verifystr)\r\n else begin\r\n\t\tparm := TStringParams.create;\r\n \tparm.AsString := verifystr;\r\n for i := 1 to parm.nParams do\r\n \tif result then\r\n \t\tVerifyOneTest(parm[i]);\r\n\t parm.free;\r\n end;\r\n result := not failed;\r\nend;\r\n\r\nfunction TVerification.VerifyPage(verifystr: string; ShowMsgs: boolean): boolean;\r\nbegin\r\n\tresult := VerifyFieldByCode(0, 0, verifystr, '', ShowMsgs);\r\n if not result and ShowMsgs then\r\n \tVerifyMessages.ShowMessages;\r\nend;\r\n\r\n(*function TVerification.TestSecondary(act: string): boolean;\r\nbegin\r\n\t// see if secondary needed, is it new, is everything required filled in\r\n\tresult := true;\r\nend;\r\n*)\r\n\r\nfunction TVerification.VerifyEntryPage(verifystr: string): boolean;\r\nbegin\r\n\tresult := VerifyFieldByCode(0, 0, verifystr, '', false);\r\n if not result then\r\n \tVerifyMessages.ShowMessages;\r\nend;\r\n\r\nend.\r\n","unit SectionPanels;\r\n\r\ninterface\r\n\r\nuses SysUtils, JS, Web, WEBLib.Graphics, WEBLib.Controls, WEBLib.Forms, WEBLib.Dialogs,\r\n WEBLib.StdCtrls, WEBLib.ExtCtrls, Classes, WEBLib.Buttons,\r\n \tFieldPanelFactory, ClientCurrent;\r\n\r\n\r\nprocedure SetupSectionParts(Sender: TForm; parentpnl: TPanel; sectpnl: TSectionPanel; fm, sect, hdght, ordstart: integer);\r\nprocedure DrawOneMultGroup(Sender: TForm; sectpnl: TSectionPanel; fm, sect, webgpndx: integer; var ctop: integer);\r\nprocedure RedrawGroup(Sender: TForm; sectpnl: TSectionPanel; webgpndx: integer);\r\nfunction MatchingControl(tg: integer; out contype: integer): TWinControl;\r\nfunction MatchingFieldIndex(cont: TWinControl): integer;\r\nfunction SafeColor(newcolor, defcolor: integer): integer;\r\nprocedure SetHeaderPanel(HeaderPanel: TPanel; lbYear, lbStat: TLabel);\r\nprocedure UpdateHeaderPanel(HeaderPanel: TPanel; lbYear, lbStat: TLabel);\r\nprocedure SetLogoPanel(LogoPanel: TPanel; img: TImageControl);\r\n\r\ntype\r\n\tTProc = procedure of object;\r\n\r\n\tTScreenButtons = class\r\n public\r\n currbtnndx: integer;\r\n nSectButtons, nFormButtons, nProcButtons: integer;\r\n SectButtons: array[1..12] of TSpeedButton;\r\n FormButtons: array[1..6] of TSpeedButton;\r\n ProcButtons: array[1..7] of TSpeedButton;\r\n FormPurpose: array[1..6] of string;\r\n ShowThisScreen: TProc;\r\n ScreenPurposes: string;\r\n procedure SetTopButtons;\r\n procedure SetSideButtons;\r\n procedure SetProcButtons;\r\n procedure SetAllButtons;\r\n function TPButtonOnly: boolean;\r\n procedure ClickSideButton(btn: integer);\r\n\t\tprocedure SetCurrentByIndex(fmndx, sectndx: integer);\r\n\t procedure SectionClick(Sender: TSpeedButton);\r\n\t\tprocedure SetOthersUp(Sender: TSpeedButton);\r\n end;\r\n\r\n TEventActions = class\r\n \t procedure WebEditEnter(Sender: TObject);\r\n \t procedure WebEditExit(Sender: TObject);\r\n\t procedure WebEditKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);\r\n \t procedure WebEditMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);\r\n procedure WebEditChange(Sender: TObject);\r\n \t procedure EntryEditEnter(Sender: TObject);\r\n \t procedure EntryEditExit(Sender: TObject);\r\n\t procedure EntryEditKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);\r\n \t procedure EntryEditMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);\r\n procedure TouchTimerTimer(Sender: TObject);\r\n function VerifyField(Sender: TObject): boolean;\r\n function VerifyEntryField(Sender: TObject): boolean;\r\n function GetControlValue(cntrl: TWinControl): string;\r\n\t private\r\n public\r\n \t\t HoldOrder, InGoTo: integer;\r\n RecalcIt: TProc;\r\n Touched: boolean;\r\n TouchTimer: TTimer;\r\n FollowingControl: TWinControl;\r\n procedure Init(ord: integer; fctrl: TWinControl; RecalcProc: TProc);\r\n \t procedure GoToOrder(order: integer=-1);\r\n procedure StoreEntry;\r\n\t procedure StoreData;\r\n procedure LoadEntry;\r\n procedure LoadData;\r\n procedure Touch;\r\n function VerifyPage(sectid: integer): boolean;\r\n function VerifyEntryPage: boolean;\r\n constructor Create;\r\n destructor Destroy; override;\r\n end;\r\n\r\n\r\nvar EventActions: TEventActions;\r\n\t ScreenButtons: TScreenButtons;\r\n\r\nimplementation\r\n\r\nuses entForms, entReturns, entFieldValues, OptionsDM, Formulas, Return, Parameters,\r\n\t Verification, ClientConnectionsDM, Utilities;\r\n\r\nvar ord, multord: integer;\r\n\r\n{ TScreenButtons }\r\n\r\nprocedure TScreenButtons.SetTopButtons;\r\nvar i, j, btn: integer;\r\n\t //s: string;\r\n\r\n function FillTokens(cap: string): string;\r\n var s, tkn: string;\r\n \t p, p2: integer;\r\n\r\n function GetToken(tokn: string): string;\r\n begin\r\n \tresult := '';\r\n if tokn = 'YEAR' then result := ActiveWHYear\r\n else if tokn = 'PERIOD' then begin\r\n \tif CurrentFreq = 'M' then result := 'Month'\r\n else if CurrentFreq = 'Q' then result := 'Quarter'\r\n else if CurrentFreq = 'A' then result := 'Year'\r\n else result := 'Period';\r\n end;\r\n end;\r\n\r\n begin\r\n \ts := cap;\r\n\t p := pos('[', cap);\r\n if p > 0 then begin\r\n \tp2 := pos(']', cap);\r\n if p2 > 0 then begin\r\n\t\t\t\ttkn := copy(s, p+1, p2-p-1);\r\n \ts := copy(s, 1, p-1) + GetToken(tkn) + copy(s, p2+1, length(s)-p2);\r\n end;\r\n end;\r\n result := s;\r\n end;\r\n\r\nbegin\r\n try\r\n \tbtn := 0;\r\n for j := 1 to length(ScreenPurposes) do\r\n for i := 0 to nWebForms-1 do if (WebForms[i].Purpose = ScreenPurposes[j]) and (ScreenPurposes[j] <> 'Z') then begin\r\n inc(btn);\r\n if CurrentFormID = 0 then begin\r\n CurrentFormID := WebForms[i].WebFormID;\r\n CurrentFormIndex := i;\r\n end;\r\n FormButtons[btn].Caption := FillTokens(WebForms[i].Caption);\r\n FormButtons[btn].Hint := WebForms[i].Description;\r\n FormButtons[btn].Tag := 100000 + WebForms[i].WebFormID;\r\n FormButtons[btn].Visible := CalcCondition(WebForms[i].Condition, 0);\r\n FormButtons[btn].ShowHint := true;\r\n FormPurpose[btn] := WebForms[i].Purpose;\r\n end;\r\n inc(btn);\r\n FormButtons[btn].Caption := 'Upload File';\r\n FormButtons[btn].Hint := 'Upload any Files needed';\r\n FormButtons[btn].Tag := 100999;\r\n FormButtons[btn].Visible := true;\r\n FormButtons[btn].ShowHint := true;\r\n FormPurpose[btn] := 'U';\r\n except\r\n on e: exception do\r\n ShowMessage(e.message);\r\n end;\r\n nSectButtons := btn;\r\n if FormButtons[1].visible then FormButtons[1].Down := true;\r\nend;\r\n\r\nfunction TScreenButtons.TPButtonOnly: boolean;\r\nbegin\r\n\tresult := (nSectButtons = 1) and ((FormPurpose[1] = 'T') or (FormPurpose[1] = 'X'));\r\nend;\r\n\r\nprocedure TScreenButtons.SetSideButtons;\r\n\r\n\tprocedure InitButtons;\r\n var i: integer;\r\n begin\r\n for i := 1 to 12 do begin\r\n \tSectButtons[i].visible := false;\r\n SectButtons[i].Down := false;\r\n end;\r\n end;\r\n\r\n procedure SetButtons;\r\n var i, ndx, tp: integer;\r\n begin\r\n \tndx := 0;\r\n for i := 0 to nWebSections-1 do with WebSections[i] do if (WebFormID = CurrentFormID) and (SectionID > 0) and CalcCondition(Condition, 0) then begin\r\n \tinc(ndx);\r\n \tSectButtons[ndx].Caption := Caption;\r\n \tSectButtons[ndx].Hint := Description;\r\n \tSectButtons[ndx].Tag := 100000 + SectionID;\r\n \tSectButtons[ndx].Visible := true;\r\n \tSectButtons[ndx].ShowHint := true;\r\n end;\r\n tp := 17 + 26*(ndx+1);\r\n if tp < 200 then tp := 200\r\n else if tp > 329 then tp := 329;\r\n wReturn.pnMainButtons.Top := tp;\r\n end;\r\n\r\nbegin\r\n\tInitButtons;\r\n if CurrentFormID > 0 then\r\n \tSetButtons;\r\n{ if CurrentTPType = 'W' then begin\r\n \twReturn.btSubmit.Caption := 'Submit Withholding';\r\n wReturn.btValidate.Caption := 'Review Reconciliation';\r\n end;\r\n}\r\nend;\r\n\r\nprocedure TScreenButtons.ClickSideButton(btn: integer);\r\nvar i: integer;\r\nbegin\r\n\tfor i := 1 to 12 do begin\r\n \tif btn <> i then\r\n \t\tSectButtons[i].down := false\r\n else\r\n\t \tSectButtons[i].down := true;\r\n end;\r\n SectionClick(SectButtons[btn]);\r\nend;\r\n\r\nprocedure TScreenButtons.SectionClick(Sender: TSpeedButton);\r\nvar i: integer;\r\n\t cont: boolean;\r\n s: string;\r\nbegin\r\n// use tag to set Section\r\n\tEventActions.StoreData;\r\n\tCurrentSectionID := Sender.tag - 100000;\r\n CurrentSectionIndex := FindSectionIndex(CurrentSectionID);\r\n cont := true;\r\n s := WebSections[CurrentSectionIndex].LineID;\r\n if copy(s, 1, 2) = 'BT' then begin\r\n \tcont := false;\r\n \twReturn.ChangeFormByPurpose(copy(s, 3, 1));\r\n end;\r\n if cont then begin\r\n currbtnndx := -1;\r\n for i := 1 to 12 do begin\r\n if (SectButtons[i] = TSpeedButton(Sender)) then begin\r\n currbtnndx := i;\r\n SectButtons[i].Font.Color := clWhite;\r\n end\r\n else\r\n SectButtons[i].Font.Color := clBlack;\r\n end;\r\n EventActions.holdorder := 100;\r\n EventActions.Touched := true;\r\n if ShowThisScreen <> nil then\r\n ShowThisScreen;\r\n{ end\r\n else begin\r\n if bt > 0 then\r\n \tFormButtons[bt]Click;\r\n}\r\n end;\r\nend;\r\n\r\nprocedure TScreenButtons.SetAllButtons;\r\nbegin\r\n\tSetTopButtons;\r\n SetSideButtons;\r\n SetProcButtons;\r\nend;\r\n\r\nprocedure TScreenButtons.SetCurrentByIndex(fmndx, sectndx: integer);\r\nvar i, j: integer;\r\nbegin\r\n if fmndx >= 0 then begin\r\n \tCurrentFormID := WebForms[fmndx].WebFormID;\r\n CurrentFormIndex := fmndx;\r\n end;\r\n if CurrentFormID >= -1 then begin\r\n\t for i := 1 to 6 do\r\n \t\tif FormButtons[i].visible then begin\r\n \tFormButtons[i].Font.Color := clBlack;\r\n \tif (fmndx = -1) then begin\r\n \tCurrentFormID := FormButtons[i].Tag - 100000;\r\n for j := 0 to nWebForms-1 do\r\n \tif CurrentFormID = WebForms[j].WebFormID then\r\n \tfmndx := j;\r\n if fmndx >= 0 then begin\r\n\t \t\tFormButtons[i].Down := true;\r\n\t\t \tFormButtons[i].Font.Color := clWhite;\r\n end;\r\n end\r\n else if (FormButtons[i].Tag = 100000+CurrentFormID) then begin\r\n \tCurrentFormID := FormButtons[i].Tag - 100000;\r\n end;\r\n end;\r\n CurrentFormIndex := FindFormIndex(CurrentFormID);\r\n end;\r\n SetSideButtons;\r\n if sectndx < 0 then begin\r\n \tif SectButtons[1].visible then begin\r\n \tSectButtons[1].down := true;\r\n SectButtons[1].Font.Color := clWhite;\r\n //WebButton1.click;\r\n\t\t\tCurrentSectionID := SectButtons[1].tag - 100000;\r\n\t\t CurrentSectionIndex := FindSectionIndex(CurrentSectionID);\r\n\t\t\tcurrbtnndx := 1;\r\n end\r\n else begin\r\n \tCurrentSectionIndex := -1;\r\n CurrentSectionID := 0;\r\n end;\r\n{ \tfor i := 0 to nWebSections-1 do\r\n \tif (sectndx < -1) and (WebSections[i].WebFormID = CurrentFormID) then\r\n \tsectndx := i;\r\n}\r\n end\r\n else begin\r\n CurrentSectionIndex := sectndx;\r\n if sectndx >= 0 then CurrentSectionID := WebSections[sectndx].SectionID\r\n else if sectndx < -1 then CurrentSectionID := 0;\r\n if CurrentSectionID >= 0 then begin\r\n for i := 1 to 12 do\r\n if SectButtons[i].visible and (SectButtons[i].Tag = 100000+CurrentSectionID) then begin\r\n \tSectButtons[i].Down := true;\r\n\t \tSectButtons[i].Font.Color := clWhite;\r\n end\r\n else\r\n\t \tSectButtons[i].Font.Color := clBlack;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TScreenButtons.SetOthersUp(Sender: TSpeedButton);\r\nvar i: integer;\r\nbegin\r\n\tfor i := 1 to 6 do\r\n \tif FormButtons[i] <> Sender then begin\r\n \tFormButtons[i].down := false;\r\n FormButtons[i].Font.Color := clBlack;\r\n end\r\n else\r\n FormButtons[i].Font.Color := clWhite;\r\nend;\r\n\r\nprocedure TScreenButtons.SetProcButtons;\r\nbegin\r\n\t// Anything to set for Save/Submit/Etc??\r\nend;\r\n\r\nfunction NextOrd: integer;\r\nbegin\r\n inc(ord);\r\n result := ord;\r\nend;\r\n\r\nfunction FindFieldValue(fm, fndx, gpndx, subndx: integer): integer;\r\nbegin\r\n result := FieldValues.FindOrAdd(fm, gpndx, subndx, fndx);\r\nend;\r\n\r\nfunction OneGroupField(Sender: TForm; fm, fndx, pndx, gpndx, webgpndx: integer; MultMode: boolean): integer;;\r\nvar fv, dcol: integer;\r\n\r\n function LocGroupColumn(fndx, webgpndx: integer; MultMode: boolean): integer;\r\n var locord: integer;\r\n begin\r\n \twith WebFields[fndx] do begin\r\n locord := DisplayOrder;\r\n if MultMode then begin\r\n \t// skip when visible = 'E'\r\n if (Visible = 'E') and (locord > 0) then inc(MultOrd);\t\t// keeping track of skipped Entry only fields, don't count a header line in order 0\r\n locord := locord - MultOrd;\t\t\t\t// subtract off that many\r\n end;\r\n if locord < 1 then locord := 1\r\n else if locord > WebGroups[webgpndx].nColumns then locord := 2;\r\n end;\r\n result := locord;\r\n end;\r\n\r\n procedure AddFieldPanelControl(etype: string);\r\n var ctrl: TWinControl;\r\n \t cndx: integer;\r\n begin\r\n \twith WebFields[fndx] do begin\r\n FieldPanels[pndx].lft := WebGroups[webgpndx].ColumnLefts[dcol];\r\n AddPanelControl(sender, fndx, FieldValues[fv].FieldValue.Formatted, webgpndx, WebGroups[webgpndx].ColumnWidths[dcol], false);\r\n cndx := nFieldControls-1;\r\n if (pos(EType, '3478') = 0) and (cndx >= 0) then begin\t\t// not message, calculated, caption or gpheader\r\n\t ctrl := FieldControls[cndx].PanControl;\r\n if (ctrl <> nil) then\r\n ctrl.TabOrder := NextOrd;\r\n if WebFields[fndx].EntryType = '9' then\r\n ctrl.Tag := ctrl.Tag + 10*gpndx;\r\n if (WebFields[fndx].EntryType = '0') and WebFields[fndx].ReadOnly then with TEdit(ctrl) do begin\r\n ReadOnly := true;\r\n Color := clBtnFace;\r\n end;\r\n end;\r\n if (pos(EType, '378') = 0) then \t\t// not message, caption or gphdr\r\n FieldValues[fv].ControlIndex := cndx\r\n else\r\n FieldValues[fv].ControlIndex := -1;\r\n \tend;\r\n end;\r\n\r\nbegin\r\n with WebFields[fndx] do begin\r\n fv := FindFieldValue(fm, fndx, gpndx, 0);\r\n dcol := LocGroupColumn(fndx, webgpndx, MultMode);\r\n if Visible <> 'E' then begin\t\t// not for Entry Only\r\n \tAddFieldPanelControl(EntryType);\r\n end;\r\n end;\r\n result := fv;\r\nend;\r\n\r\nprocedure SetupSectionParts(Sender: TForm; parentpnl: TPanel; sectpnl: TSectionPanel; fm, sect, hdght, ordstart: integer);\r\nvar i, fv, tp, gp, part, nparts, wid: integer;\r\n\t wpn {, epn}: TPanel;\r\n parts: array[1..50, 1..3] of integer;\t\t// Index/DispOrder/Type:0=field/1=group\r\n edit: TEdit;\r\n\r\n procedure AddFieldPanel(fndx: integer);\r\n var pndx, ncontrols: integer;\r\n begin\r\n\t\tncontrols := nFieldControls;\r\n pndx := PanelByField(Sender, fndx, FieldValues[fv]);\r\n if pndx >= 0 then begin\r\n wpn := FieldPanels[pndx].pnl;\r\n wpn.parent := sectpnl.pnl;\r\n wpn.Top := tp;\r\n tp := tp + wpn.height;\r\n end;\r\n if (ncontrols < nFieldControls) then begin // if a control was added\r\n\t FieldValues[fv].ControlIndex := nFieldControls-1;\r\n if (pos(WebFields[fndx].EntryType, '3478') = 0) then begin\t\t// not message, calculated, caption, gpheader\r\n if (FieldControls[nFieldControls-1].PanControl <> nil) then\r\n FieldControls[nFieldControls-1].PanControl.TabOrder := NextOrd;\r\n end;\r\n end;\r\n end;\r\n\r\n procedure FillPartsList;\r\n var i: integer;\r\n\r\n \tprocedure InsertPart(ndx, order, typ: integer);\r\n var p: integer;\r\n begin\r\n \tinc(nParts);\r\n p := nParts;\r\n while (p > 1) and (order < parts[p-1, 2]) do begin\r\n parts[p, 1] := parts[p-1, 1];\r\n parts[p, 2] := parts[p-1, 2];\r\n parts[p, 3] := parts[p-1, 3];\r\n dec(p);\r\n end;\r\n parts[p, 1] := ndx;\r\n parts[p, 2] := order;\r\n parts[p, 3] := typ;\r\n end;\r\n\r\n begin\r\n \tnparts := 0;\r\n\t for i := 0 to nWebFields-1 do with WebFields[i] do begin\r\n\t\t\tif (WebFormID = fm) and (SectionID = sect) and (WebGroupID = 0) then\r\n \tInsertPart(i, DisplayOrder, 0);\r\n end;\r\n\t for i := 0 to nWebGroups-1 do with WebGroups[i] do begin\r\n\t\t\tif (WebFormID = fm) and (SectionID = sect) then begin\r\n \tif WebGroups[i].MultAllowed = 'Y' then\r\n \t\tInsertPart(i, DisplayOrder, 2)\r\n else\r\n \t\tInsertPart(i, DisplayOrder, 1);\r\n end;\r\n end;\r\n end;\r\n\r\n procedure HandleField(fndx: integer);\r\n begin\r\n CurrGroupColor := 0;\r\n CurrEntryColor := 0;\r\n \twith WebFields[fndx] do begin\r\n if (Visible = 'Y') then begin\r\n// if (EntryType = '8') or CalcCondition(Condition, 0) then begin\r\n\t\t\t\t\tfv := FindFieldValue(fm, fndx, 0, 0);\r\n\t\t AddFieldPanel(fndx);\r\n// end;\r\n end;\r\n end;\r\n end;\r\n\r\n procedure HandleSingleGroup(webgpndx: integer);\r\n var i, pndx: integer;\r\n\r\n procedure GroupPanel;\r\n begin\r\n pndx := StartingGroupPanel(sender, WebGroups[webgpndx].Question, WebGroups[webgpndx].DisplayOrder, 0, 0, 0);\t\t//cap: string): integer;PanelByField(Sender, WebFields[f], FieldValues[fv]);\r\n if pndx >= 0 then begin\r\n wpn := FieldPanels[pndx].pnl;\r\n wpn.parent := sectpnl.pnl;\r\n wpn.Top := tp;\r\n tp := tp + wpn.height;\r\n \t\tif WebGroups[webgpndx].Condition > ' ' then FieldPanels[pndx].Condition := WebGroups[webgpndx].Condition;\r\n end;\r\n end;\r\n\r\n procedure GroupHeader;\r\n begin\r\n \t// Top question if filled in, and caption\r\n\r\n // Headings???\r\n\r\n end;\r\n\r\n procedure HandleGroupField(fndx, gp: integer);\r\n begin\r\n with WebFields[fndx] do begin\r\n if (Visible = 'Y') then begin\r\n if CalcCondition(Condition, 0) then begin\r\n\t\t\t\t\t\tOneGroupField(Sender, fm, fndx, pndx, 0, webgpndx, false);\r\n end;\r\n end;\r\n end;\r\n end;\r\n\r\n begin\r\n \tgp := WebGroups[webgpndx].WebGroupID;\r\n CurrGroupColor := SafeColor(WebGroups[webgpndx].Color, SiteOpts.DefPanelColor);\r\n CurrEntryColor := 0;\r\n GroupPanel;\r\n GroupHeader;\r\n for i := 0 to nWebFields-1 do with WebFields[i] do begin\r\n if (WebFormID = fm) and (SectionID = sect) and (WebGroupID = gp) then\r\n HandleGroupField(i, WebGroupID);\r\n end;\r\n gp := 0;\r\n end;\r\n\r\n procedure HandleMultGroup(webgpndx: integer);\r\n\r\n procedure CreateEntryPanel;\r\n\t\tvar fndx: integer;\r\n fldval: TFldValue;\r\n Handler: TMultGroupHandler;\r\n\r\n \tprocedure OneEntryField(etype: string);\r\n var lctrl: TWinControl;\r\n \t edt: TEdit;\r\n cndx: integer;\r\n begin\r\n//\t with WebFields[fndx] do begin\r\n // Add To Group Handler, and EntryPanel\r\n EntryPanelByField(sender, fndx, fldval, webgpndx, 0, 0);\r\n cndx := Handler.nEntryControls-1;\r\n if (pos(eType, '3478') = 0) and (cndx >= 0) then begin\t\t// not message, calculated of\r\n\t lctrl := Handler.EntryControls[cndx].PanControl;\r\n if (lctrl <> nil) then\r\n lctrl.TabOrder := GroupHandlers.NextOrder;\t// get order from handler\r\n if (eType = '0') and not Handler.EntryControls[cndx].Enterable then begin\r\n lctrl := Handler.EntryControls[cndx].PanControl;\r\n edt := TEdit(lctrl);\r\n edt.ReadOnly := true;\r\n edt.Color := clBtnFace;\r\n end;\r\n end;\r\n// end;\r\n end;\r\n\r\n begin\r\n \tHandler := GroupHandlers.CurrentHandler;\r\n \tfldval := TFldValue.create;\r\n fldval.asString := '';\r\n for fndx := 0 to nWebFields-1 do with WebFields[fndx] do begin\r\n if (WebFormID = fm) and (SectionID = sect) and (WebGroupID = gp) then begin\r\n if (pos(Visible, 'GN') = 0) and (pos(EntryType, '8') = 0) {and CalcCondition(Condition, 0)} then begin\r\n \tOneEntryField(EntryType);\r\n end;\r\n end;\r\n end;\r\n fldval.free;\r\n end;\r\n\r\n begin\r\n \tgp := WebGroups[webgpndx].WebGroupID;\r\n// dmClientConnections.SendConsoleMessage('HandleMultGroup:' + inttostr(gp));\r\n CurrGroupColor := SafeColor(WebGroups[webgpndx].Color, SiteOpts.DefPanelColor);\r\n CurrEntryColor := dmOptions.LightenColor(CurrGroupColor);\r\n GroupHandlers.AddHandler(sender, parentpnl, sectpnl.pnl, gp, WebGroups[webgpndx].MaxInitCount);\r\n // from fieldvalues, get each\r\n \tDrawOneMultGroup(Sender, sectpnl, fm, sect, Parts[part, 1], tp);\r\n CreateEntryPanel;\r\n GroupHandlers.AssignEvents;\r\n gp := 0;\r\n end;\r\n\r\nbegin\r\n\t// create panel?, caption, edit control by type, assign tagcontrolnumber & tag on control\r\n tp := hdght;\r\n gp := 0;\r\n wid := 480;\r\n\r\n ord := ordstart;\r\n FillPartsList;\r\n for part := 1 to nParts do begin\r\n \tcase Parts[part, 3] of\r\n \t\t0: HandleField(Parts[part, 1]);\r\n \t1: HandleSingleGroup(Parts[part, 1]);\r\n 2: HandleMultGroup(Parts[part, 1]);\r\n end;\r\n end;\r\n\r\n{ for i := 0 to nFieldPanels-1 do\r\n\t if FieldPanels[i].lft > wid then\r\n \t wid := FieldPanels[i].lft + 16;\r\n}\r\n wid := GetPageWidth;\r\n if wid < 500 then wid := 500;\r\n\r\n sectpnl.pnl.height := FieldPanels[nFieldPanels-1].pnl.Top + FieldPanels[nFieldPanels-1].pnl.height + 12; //tp + 12;\r\n\tif (wReturn <> nil) and (sectpnl.pnl = wReturn.pnSection) then begin\r\n \tif wReturn.pnNext.visible then\r\n \tsectpnl.pnl.height := sectpnl.pnl.height + wReturn.pnNext.height;\r\n end;\r\n for i := 0 to nFieldControls-1 do begin\r\n // not if a button???\r\n \tFieldControls[i].PanControl.OnEnter := EventActions.WebEditEnter;\r\n \tFieldControls[i].PanControl.OnExit := EventActions.WebEditExit;\r\n \tFieldControls[i].PanControl.OnMouseDown := EventActions.WebEditMouseDown;\r\n if FieldControls[i].PanControl is TEdit then begin\r\n \tedit := TEdit(FieldControls[i].PanControl);\r\n if not edit.ShowHint then begin // would already be set if ShortHelpText is filled in\r\n\t \t\tedit.OnMouseEnter := EventActions.WebEditChange;\r\n \t \tedit.ShowHint := true;\r\n// edit.Hint := 'XXXXXXXX';\r\n end;\r\n end;\r\n end;\r\n if (wReturn <> nil) and (sectpnl.pnl = wReturn.pnSection) then\r\n \twReturn.pnReturn.Width := wid + 16\r\n else\r\n\t sectpnl.pnl.Width := wid;\r\n SetMainPanelHeight;\r\nend;\r\n\r\nprocedure DrawOneMultGroup(Sender: TForm; sectpnl: TSectionPanel; fm, sect, webgpndx: integer; var ctop: integer);\r\nvar i, pndx, gp, gpndx, gpcount: integer;\r\n\t wpn: TPanel;\r\n\r\n procedure MGroupPanel;\r\n begin\r\n pndx := StartingGroupPanel(sender, WebGroups[webgpndx].Question, WebGroups[webgpndx].DisplayOrder, webgpndx, 0, SiteOpts.PanelHeight-4); //bch\r\n if pndx >= 0 then begin\r\n \tFieldPanels[pndx].pntype := 'M';\r\n wpn := FieldPanels[pndx].pnl;\r\n wpn.parent := sectpnl.pnl;\r\n wpn.Top := ctop;\r\n ctop := ctop + wpn.height;\r\n if WebGroups[webgpndx].Condition > ' ' then FieldPanels[pndx].Condition := WebGroups[webgpndx].Condition;\r\n end;\r\n end;\r\n\r\n procedure MGroupHeader;\r\n begin\r\n // Top question if filled in, and caption\r\n\r\n // Headings???\r\n\r\n end;\r\n\r\n procedure MHandleGroupField(fndx, gp: integer);\r\n begin\r\n with WebFields[fndx] do begin\r\n if (Visible <> 'N') {and (Visible <> 'E')} then begin\r\n if CalcCondition(Condition, gpndx) then begin\r\n OneGroupField(Sender, fm, fndx, pndx, gpndx, webgpndx, true);\r\n end;\r\n end;\r\n end;\r\n end;\r\n\r\n function ByFrequency: integer;\r\n var ndx: integer;\r\n// \t freq: string;\r\n begin\r\n\t\tRecons.DataToConsole;\r\n \tndx := Recons.Find(ActiveWHYear);\r\n// freq := Recons.ReconArr[ndx].Frequency;\r\n result := Recons.ReconArr[ndx].NumPeriods;\r\n Recons.StoreData;\t//ReconArr[ndx].SetToFieldValues;\r\n\t\tRecons.DataToConsole;\r\n CalcAllFormulas;\r\n// dmClientConnections.SendConsoleMessage(ActiveWHYear + ':' + inttostr(ndx) + '/' + inttostr(result));\r\n end;\r\n\r\nbegin\r\n gp := WebGroups[webgpndx].WebGroupID;\r\n// dmClientConnections.SendConsoleMessage('DrawMultGroup:' + inttostr(gp));\r\n CurrGroupColor := SafeColor(WebGroups[webgpndx].Color, SiteOpts.DefPanelColor);\r\n CurrEntryColor := dmOptions.LightenColor(CurrGroupColor);\r\n // from fieldvalues, get each\r\n// dmClientConnections.SendConsoleMessage('Draw:' + inttostr(gp) + '/' + inttostr(webgpndx));\r\n if (CurrentTPType = 'W') and (WebGroups[webgpndx].MaxInitCount > 20) then\r\n \tgpcount := ByFrequency\r\n else\r\n \tgpcount := FieldValues.GroupCount(fm, gp);\r\n\r\n MGroupHeader;\r\n for gpndx := 1 to gpcount do begin\r\n MGroupPanel;\r\n multord := 0;\r\n for i := 0 to nWebFields-1 do with WebFields[i] do begin\r\n if (WebFormID = fm) and (SectionID = sect) and (WebGroupID = gp) then\r\n MHandleGroupField(i, WebGroupID);\r\n end;\r\n end;\r\n// GroupHandlers.AssignEvents;\r\nend;\r\n\r\nprocedure RedrawGroup(Sender: TForm; sectpnl: TSectionPanel; webgpndx: integer);\r\nvar tp: integer;\r\nbegin\r\n\tRemoveGroupPanel(webgpndx);\r\n tp := 0;\r\n \tDrawOneMultGroup(Sender, sectpnl, WebGroups[webgpndx].WebFormID, WebGroups[webgpndx].SectionID, webgpndx, tp);\r\n ReorderPanels;\r\nend;\r\n\r\nfunction MatchingControl(tg: integer; out contype: integer): TWinControl;\r\n//var i, p: integer;\r\nbegin\r\n\t// tg is controls index, but type is only stored in the webpanel\r\n result := nil;\r\n if tg >= 0 then begin\r\n \tresult := FieldControls[tg].PanControl;\r\n contype := FieldControls[tg].ctrltype;\r\n{ for p := 0 to nFieldPanels-1 do begin\r\n \tfor i := 0 to 2 do with FieldPanels[p] do begin\r\n\t \tif (ctrl[i] <> nil) and (ctrl[i].Tag = tg) then begin\r\n \tresult := ctrl[i];\r\n contype := ctrltype;\r\n end;\r\n end;\r\n}\r\n end;\r\nend;\r\n\r\nfunction MatchingFieldIndex(cont: TWinControl): integer;\r\nvar i: integer;\r\nbegin\r\n\tresult := -1;\r\n for i := 0 to nFieldControls-1 do with FieldControls[i] do\r\n \tif PanControl = cont then\r\n \t\tresult := wpfldndx;\r\nend;\r\n\r\nprocedure TEventActions.WebEditExit(Sender: TObject);\r\nbegin\r\n\tif (InGoTo < 2) and (holdorder = (Sender as TWinControl).TabOrder) then\r\n\t\tholdorder := holdorder + 1;\r\n\tTouched := true;\r\n\tif EventActions.InGoTo <> 1 then begin\t// 2 came from KeyDown Return, so don't goto again\r\n EventActions.StoreData;\r\n CalcAllFormulas;\r\n if not VerifyField(Sender) then begin\r\n VerifyMessages.ShowMessages;\r\n end;\r\n //RecalcIt;\r\n if ScreenButtons <> nil then\r\n ScreenButtons.SetAllButtons;\r\n LoadData;\r\n ReorderPanels;\r\n //ShowControlData;\r\n\t\tif EventActions.InGoTo <> 2 then begin\r\n \t EventActions.InGoTo := 1;\r\n \tEventActions.GoToOrder;\r\n end;\r\n EventActions.InGoTo := 0;\r\n end;\r\nend;\r\n\r\nprocedure TEventActions.WebEditChange(Sender: TObject);\r\nbegin\r\n\t(Sender as TEdit).Hint := (Sender as TEdit).text;\r\n (Sender as TEdit).ShowHint := true;\r\nend;\r\n\r\nprocedure TEventActions.WebEditEnter(Sender: TObject);\r\nbegin\r\n\tholdorder := (Sender as TWinControl).TabOrder;\r\n if Sender is TEdit then\r\n \t(Sender as TEdit).SelectAll;\r\nend;\r\n\r\nprocedure TEventActions.WebEditKeyDown(Sender: TObject; var Key: Word;\r\n Shift: TShiftState);\r\nbegin\r\n\tif Key = VK_RETURN then begin\r\n\t\tif holdorder = (Sender as TWinControl).TabOrder then\r\n\t\t\tholdorder := holdorder + 1;\r\n\t\t//holdorder := (Sender as TWinControl).TabOrder;\r\n// WebEditExit(Sender);\r\n\t\tEventActions.InGoTo := 2;\r\n\t\tEventActions.GoToOrder;\r\n Key := 0;\r\n end;\r\nend;\r\n\r\nprocedure TEventActions.WebEditMouseDown(Sender: TObject; Button: TMouseButton;\r\n Shift: TShiftState; X, Y: Integer);\r\nbegin\r\n\tholdorder := (Sender as TWinControl).TabOrder;\r\n//\tShowEData('');\r\nend;\r\n\r\ndestructor TEventActions.Destroy;\r\nbegin\r\n\tTouchTimer.free;\r\n inherited;\r\nend;\r\n\r\nprocedure TEventActions.EntryEditEnter(Sender: TObject);\r\nbegin\r\n\tholdorder := (Sender as TWinControl).TabOrder;\r\n if Sender is TEdit then\r\n \t(Sender as TEdit).SelectAll;\r\nend;\r\n\r\nprocedure TEventActions.EntryEditExit(Sender: TObject);\r\n\r\n procedure ShowField(when: string);\r\n//\tvar fv, nControl: integer;\r\n \t //s: string;\r\n begin\r\n{ for fv := 0 to FieldValues.Count-1 do begin\r\n nControl := FieldValues[fv].GroupEditControl;\r\n// if nControl >= 0 then\r\n// s := ' << ' + when + inttostr(fv) + ':' + inttostr(nControl) + ' | ' + FieldValues[fv].FieldValue.asString + ' >> ';\r\n end;\r\n wReturn.DebugMessage('(' + s + ')');\r\n}\r\n end;\r\n\r\nbegin\r\nShowField('[WebEditExit: ToField] ');\r\n\tif (InGoTo < 2) and (holdorder = (Sender as TWinControl).TabOrder) then\r\n\t\tholdorder := holdorder + 1;\r\n\tTouched := true;\r\n\tif EventActions.InGoTo <> 1 then begin\t// 2 came from KeyDown Return, so don't goto again\r\n GroupHandlers.CurrentHandler.EntryToFieldValues;\r\n ShowField('[WebEditExit: Recalc] ');\r\n CalcAllFormulas;\r\n if not VerifyEntryField(Sender) then\r\n VerifyMessages.ShowMessages;\r\n //RecalcIt;\r\n ScreenButtons.SetAllButtons;\r\n ShowField('[WebEditExit: ToEntry] ');\r\n GroupHandlers.CurrentHandler.FieldValuesToEntry;\r\n ShowField('[WebEditExit: LoadData] ');\r\n LoadData;\r\n ShowField('[WebEditExit: End] ');\r\n\t\tif EventActions.InGoTo <> 2 then begin\r\n \t EventActions.InGoTo := 1;\r\n \tEventActions.GoToOrder;\r\n end;\r\n EventActions.InGoTo := 0\r\n end;\r\nend;\r\n\r\nprocedure TEventActions.EntryEditKeyDown(Sender: TObject; var Key: Word;\r\n Shift: TShiftState);\r\nbegin\r\n\tif Key = VK_RETURN then begin\r\n\t\tif holdorder = (Sender as TWinControl).TabOrder then\r\n\t\t\tholdorder := holdorder + 1;\r\n// EntryEditExit(Sender);\r\n\t\tEventActions.InGoTo := 2;\r\n\t\tEventActions.GoToOrder;\r\n Key := 0;\r\n end;\r\nend;\r\n\r\nprocedure TEventActions.EntryEditMouseDown(Sender: TObject;\r\n Button: TMouseButton; Shift: TShiftState; X, Y: Integer);\r\nbegin\r\n\tholdorder := (Sender as TWinControl).TabOrder;\r\nend;\r\n\r\nconstructor TEventActions.Create;\r\nbegin\r\n\tFollowingControl := nil;\r\n Touched := false;\r\n TouchTimer := TTimer.create;\r\n TouchTimer.Interval := 300000;\r\n TouchTimer.OnTimer := TouchTimerTimer;\r\n TouchTimer.enabled := true;\r\n InGoTo := 0\r\nend;\r\n\r\nfunction TEventActions.GetControlValue(cntrl: TWinControl): string;\r\nvar cmb: TComboBox;\r\n\t s: string;\r\n p: integer;\r\nbegin\r\n\tresult := '';\r\n if cntrl is TEdit then\r\n\t\tresult := TEdit(cntrl).text\r\n else if cntrl is TComboBox then begin\r\n cmb := TComboBox(cntrl);\r\n if cmb.ItemIndex >= 0 then begin\r\n s := cmb.Items[cmb.ItemIndex];\r\n p := pos('=', s);\r\n if p > 0 then\r\n result := copy(s, 1, p-1)\r\n else\r\n result := s;\r\n end;\r\n end\r\n else if cntrl is TCheckBox then begin\r\n \tif TCheckBox(cntrl).checked then result := 'Y'\r\n\t\telse result := 'N';\r\n end\r\n else if cntrl is TDateTimePicker then begin\r\n\t\tif TDateTimePicker(cntrl).date < 1 then result := ''\r\n \telse result := datetostr(TDateTimePicker(cntrl).date);\r\n end;\r\nend;\r\n\r\nprocedure TEventActions.GoToOrder(order: integer=-1);\r\nvar i, n, mino, minf, o, frst: integer;\r\nbegin\r\n// form.SelectNext()\r\n\tif order = -1 then order := holdorder;\r\n\ti := 1;\r\n mino := 999999;\r\n minf := 999999;\r\n o := 0;\r\n frst := 0;\r\n if order >= 0 then\r\n try\r\n if (order >= 500) and (order < 1000) then begin\r\n\t\t\t GroupHandlers.InEGoTo := true;\r\n GroupHandlers.GotoOrder(order);\r\n\t\t\t GroupHandlers.InEGoTo := false;\r\n \tend\r\n else begin\r\n for i := 0 to nFieldControls-1 do begin\r\n n := FieldControls[i].PanControl.TabOrder;\r\n \tif FieldControls[i].Enterable then begin\r\n if (n >= order) and (n < mino) then begin\r\n mino := n;\r\n o := i;\r\n end;\r\n end;\r\n if (n >= 100) and (n < frst) then begin\r\n minf := n;\r\n frst := i;\r\n end;\r\n end;\r\n if mino > 99999 then begin\r\n if (FollowingControl <> nil) and (FollowingControl.visible) then\t// In pnSection with btNext visible\r\n TCustomControl(FollowingControl).SetFocus\r\n else if minf < 9999 then\r\n TCustomControl(FieldControls[frst].PanControl).setFocus;\r\n end\r\n else\r\n TCustomControl(FieldControls[o].PanControl).setFocus;\r\n end;\r\n except\r\n end;\r\nend;\r\n\r\nprocedure TEventActions.Init(ord: integer; fctrl: TWinControl; RecalcProc: TProc);\r\nbegin\r\n HoldOrder := ord;\r\n RecalcIt := RecalcProc;\r\n FollowingControl := fctrl;\r\nend;\r\n\r\nprocedure TEventActions.StoreData;\r\nvar fv{, c}: integer;\r\n\t control: TWinControl;\r\n ctype: integer;\r\n\r\n\tprocedure SaveValue;\r\n var p, enttyp: integer;\r\n \t s: string;\r\n cmb: TComboBox;\r\n begin\r\n \tenttyp := ctype;\r\n \tcase enttyp of\r\n 0:\tFieldValues[fv].FieldValue.Formatted := TEdit(control).text;\r\n 1: begin\r\n \t\tFieldValues[fv].FieldValue.asString := '';\r\n cmb := TComboBox(control);\r\n if cmb.ItemIndex >= 0 then begin\r\n \ts := cmb.Items[cmb.ItemIndex];\r\n p := pos('=', s);\r\n if p > 0 then\r\n \t\t\t\tFieldValues[fv].FieldValue.asString := copy(s, 1, p-1)\r\n else\r\n \t\t\t\tFieldValues[fv].FieldValue.asString := s;\r\n end;\r\n \tend;\r\n 2: begin end;\t//\tOtherCities\r\n 3: begin end;\t// Message\r\n 4: FieldValues[fv].FieldValue.Formatted := TEdit(control).text;\r\n 5: FieldValues[fv].FieldValue.asBoolean := TCheckBox(control).checked;\r\n 6: if FieldValues[fv].FieldValue.AsString = '' then TDateTimePicker(Control).date := 0\r\n \telse TDateTimePicker(Control).date := FieldValues[fv].FieldValue.asDate;\r\n 7: FieldValues[fv].FieldValue.asString := TEdit(control).text;\r\n end;\r\n\tend;\r\n\r\nbegin\r\n\tfor fv := 0 to FieldValues.Count-1 do begin\r\n \tif FieldValues[fv].ControlIndex >= 0 then begin\r\n \tcontrol := MatchingControl(FieldValues[fv].ControlIndex, ctype);\r\n if control <> nil then\r\n \tSaveValue;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TEventActions.StoreEntry;\r\nbegin\r\n\tGroupHandlers.StoreData;\r\nend;\r\n\r\nprocedure TEventActions.Touch;\r\nvar request: string;\r\nbegin\r\n\trequest := 'Touch?hdr2=' + CurrentToken;\r\n\tIncCallCounter(ccTouch);\r\n dmClientConnections.HttpRequest.URL := CTSERVICECONNSTRING + request;\r\n dmClientConnections.HttpRequest.Perform;\r\nend;\r\n\r\nprocedure TEventActions.TouchTimerTimer(Sender: TObject);\r\nbegin\r\n\tTouchTimer.Enabled := false;\r\n if Touched then\r\n \tTouch;\r\n Touched := false;\r\n\tTouchTimer.Enabled := true;\r\nend;\r\n\r\nfunction TEventActions.VerifyEntryField(Sender: TObject): boolean;\r\nvar cont: TWinControl;\r\n\t fldndx: integer;\r\n txt, verifycode: string;\r\nbegin\r\n\tresult := true;\r\n\ttry\r\n \tif Sender is TWinControl then begin\r\n\t \tcont := (Sender as TWinControl);\r\n fldndx := GroupHandlers.MatchingFieldIndex(cont);\r\n if fldndx >= 0 then begin\r\n \ttxt := GetControlValue(cont);\r\n \tverifycode := WebFields[fldndx].Verify;\r\n if verifycode > '' then\r\n \tresult := VerifyTool.VerifyFieldByCode(fldndx, 0, verifycode, txt, true);\r\n end;\r\n end;\r\n except\r\n end;\r\nend;\r\n\r\nfunction TEventActions.VerifyField(Sender: TObject): boolean;\r\nvar cont: TWinControl;\r\n\t fldndx: integer;\r\n txt, verifycode: string;\r\nbegin\r\n\tresult := true;\r\n\ttry\r\n \tif Sender is TWinControl then begin\r\n\t \tcont := (Sender as TWinControl);\r\n fldndx := MatchingFieldIndex(cont);\r\n if fldndx >= 0 then begin\r\n \ttxt := GetControlValue(cont);\r\n \tverifycode := WebFields[fldndx].Verify;\r\n if verifycode > '' then\r\n \tresult := VerifyTool.VerifyFieldByCode(fldndx, 0, verifycode, txt, true);\r\n end;\r\n end;\r\n except\r\n end;\r\nend;\r\n\r\nfunction TEventActions.VerifyEntryPage: boolean;\r\nvar gpndx: integer;\r\nbegin\r\n\t// get verify codes for sectid\r\n result := true;\r\n with GroupHandlers.CurrentHandler do begin\r\n \tgpndx := MatchingGroup(CurrGroup);\r\n\t if WebGroups[gpndx].EntryVerify > '' then\r\n\t \tresult := VerifyTool.VerifyEntryPage(WebGroups[gpndx].EntryVerify);\r\n end;\r\nend;\r\n\r\nfunction TEventActions.VerifyPage(sectid: integer): boolean;\r\nbegin\r\n\t// get verify codes for sectid\r\n result := true;\r\n CurrentSectionID := sectid;\r\n CurrentSectionIndex := FindSectionIndex(sectid);\r\n if WebSections[CurrentSectionIndex].PageVerify > '' then\r\n \tresult := VerifyTool.VerifyPage(WebSections[CurrentSectionIndex].PageVerify, true);\r\nend;\r\n\r\nprocedure TEventActions.LoadData;\r\n//var i, fv: integer;\r\nbegin\r\n\tFieldValues.SetToControls;\r\n{\tfor i := 0 to nFieldControls-1 do begin\r\n\t\tfv := FieldValues.FindIndex(CurrentFormID, CurrentGroupIndex, 0, WebFields[FieldControls[i].fldndx].WebFieldID);\r\n \tif fv >= 0 then\r\n\t\t\tFieldControls[i].SetControlValue(fv);\r\n end;\r\n}\r\nend;\r\n\r\nprocedure TEventActions.LoadEntry;\r\nbegin\r\n\tGroupHandlers.FillEntryControls;\r\nend;\r\n\r\nfunction SafeColor(newcolor, defcolor: integer): integer;\r\nbegin\r\n\tif newColor > 0 then\r\n \tresult := newcolor\r\n else\r\n \tresult := defcolor;\r\nend;\r\n\r\nprocedure SetHeaderPanel(HeaderPanel: TPanel; lbYear, lbStat: TLabel);\r\nvar i, {HeaderFormID,} HeaderFormIndex {, HeaderSectionID, HeaderSectionIndex}: integer;\r\nbegin\r\n HeaderFormIndex := -1;\r\n for i := 0 to nWebForms-1 do begin\r\n if WebForms[i].Purpose = 'Z' then begin\r\n// HeaderFormID := WebForms[i].WebFormID;\r\n HeaderFormIndex := i;\r\n{ for var j: integer := 0 to nWebSections-1 do if WebSections[j].WebFormID = HeaderFormID then begin\r\n HeaderSectionID := WebSections[j].SectionID;\r\n HeaderSectionIndex := FindSectionIndex(HeaderSectionID);\r\n end;\r\n}\r\n end;\r\n end;\r\n HeaderPanel.visible := (HeaderFormIndex >= 0);\r\n if HeaderPanel.visible then\r\n UpdateHeaderPanel(HeaderPanel, lbYear, lbStat);\r\nend;\r\n\r\nprocedure UpdateHeaderPanel(HeaderPanel: TPanel; lbYear, lbStat: TLabel);\r\n//var f: integer;\r\nbegin\r\n\tif HeaderPanel.visible then begin\r\n \tif CurrentTPType = 'W' then\r\n \tlbYear.caption := ActiveWHYear\r\n else\r\n\t \t\tlbYear.caption := LineCodeVars.LineCodeString('TAXYEAR');\r\n \t\tlbStat.caption := 'Current Status: ' + LineCodeVars.LineCodeString('STATUSDESC');\r\n end;\r\n{ for f := 0 to nWebFields-1 do with WebFields[f] do begin\r\n if (WebFormID = HeaderFormID) and (WebSectionID = HeaderSectionID) then begin\r\n // use order to determine start location\r\n // fill fields\r\n if\r\n stcap := FieldValues.LineCodeString('STATUSDESC');\r\n if (arr[fv].ControlIndex >= 0) then\r\n \tFieldControls[arr[fv].ControlIndex].FieldValueToControl(fv);\r\n\r\n end;\r\n end;\r\n}\r\nend;\r\n\r\nprocedure SetLogoPanel(LogoPanel: TPanel; img: TImageControl);\r\nbegin\r\n\tLogoPanel.visible := (SiteOpts.LogoLink > '');\r\n if LogoPanel.visible then begin\r\n \tLogoPanel.color := SiteOpts.LogoColor;\r\n img.URL := SiteOpts.LogoLink;\r\n end;\r\nend;\r\n\r\nend.\r\n","unit OCCForm;\r\n\r\ninterface\r\n\r\nuses\r\n SysUtils, Classes, JS, Web, WEBLib.Graphics, WEBLib.Controls,\r\n WEBLib.Forms, WEBLib.Dialogs, WEBLib.StdCtrls, \r\nentData, WEBLib.ExtCtrls;\r\n\r\nprocedure ShowOCC(W2ndx: integer);\r\n\r\ntype\r\n TfOCC = class(TForm)\r\n lbx: TListBox;\r\n edCity1: TEdit;\r\n btDone: TButton;\r\n WebLabel1: TLabel;\r\n edWages1: TEdit;\r\n WebLabel2: TLabel;\r\n edWH1: TEdit;\r\n WebLabel3: TLabel;\r\n edCred1: TEdit;\r\n WebLabel4: TLabel;\r\n edTotalWages: TEdit;\r\n edTotalWH: TEdit;\r\n edTotalCredit: TEdit;\r\n WebLabel5: TLabel;\r\n edCity2: TEdit;\r\n edWages2: TEdit;\r\n edWH2: TEdit;\r\n edCred2: TEdit;\r\n edCity3: TEdit;\r\n edWages3: TEdit;\r\n edWH3: TEdit;\r\n edCred3: TEdit;\r\n edCity4: TEdit;\r\n edWages4: TEdit;\r\n edWH4: TEdit;\r\n edCred4: TEdit;\r\n edCity5: TEdit;\r\n edWages5: TEdit;\r\n edWH5: TEdit;\r\n edCred5: TEdit;\r\n edCity6: TEdit;\r\n edWages6: TEdit;\r\n edWH6: TEdit;\r\n edCred6: TEdit;\r\n edCity7: TEdit;\r\n edWages7: TEdit;\r\n edWH7: TEdit;\r\n edCred7: TEdit;\r\n edCity8: TEdit;\r\n edWages8: TEdit;\r\n edWH8: TEdit;\r\n edCred8: TEdit;\r\n edCity9: TEdit;\r\n edWages9: TEdit;\r\n edWH9: TEdit;\r\n edCred9: TEdit;\r\n edCity10: TEdit;\r\n edWages10: TEdit;\r\n edWH10: TEdit;\r\n edCred10: TEdit;\r\n edCity11: TEdit;\r\n edWages11: TEdit;\r\n edWH11: TEdit;\r\n edCred11: TEdit;\r\n edCity12: TEdit;\r\n edWages12: TEdit;\r\n edWH12: TEdit;\r\n edCred12: TEdit;\r\n pnLogo: TPanel;\r\n imgLogo: TImageControl;\r\n procedure WebFormShow(Sender: TObject);\r\n procedure WebFormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);\r\n\r\n procedure edCityChange(Sender: TObject);\r\n procedure edCityEnter(Sender: TObject);\r\n procedure lbxClick(Sender: TObject);\r\n procedure edWages1Exit(Sender: TObject);\r\n procedure edWH1Exit(Sender: TObject);\r\n procedure edCity1Exit(Sender: TObject);\r\n procedure btDoneClick(Sender: TObject);\r\n private\r\n \t HoldEdit: integer;\r\n edCities, edWages, edWH, edCreds: array[1..12] of TEdit;\r\n wagearr, wharr, credarr: array[1..12] of double;\r\n cityarr: array[1..12] of ROCC;\r\n procedure InitScreen;\r\n procedure ClearAll;\r\n procedure EditsToArrays;\r\n procedure ArraysToEdits;\r\n procedure LoadFromFV;\r\n procedure SaveToFV;\r\n procedure RefillBox(s: string);\r\n function TestTotals: boolean;\r\n procedure RecalcAllFields;\r\n procedure RecalcCredits;\r\n procedure SetCity(ndx: integer; citynm: string; id: string='');\r\n { Private declarations }\r\n public\r\n { Public declarations }\r\n W2Index: integer;\r\n W2Wages: double;\r\n function GetCityID: string;\r\n protected procedure LoadDFMValues; override; end;\r\n\r\nvar\r\n fOCC: TfOCC;\r\n\r\nimplementation\r\n\r\n{$R *.dfm}\r\n\r\nuses OptionsDM, Parameters, Formulas, entFieldValues, ClientConnectionsDM,\r\n SectionPanels;\r\n\r\nprocedure ShowOCC(W2ndx: integer);\r\nvar lOCC: TfOCC;\r\n\r\n\tprocedure AfterShowModal(AValue: TModalResult);\r\n begin\r\n lOCC.free;\r\n end;\r\n\r\n procedure AfterCreate(AForm: TObject);\r\n begin\r\n end;\r\n\r\nbegin\r\n lOCC := TfOCC.CreateNew(@AfterCreate);\r\n fOCC := lOCC;\r\n lOCC.W2Index := W2ndx;\r\n lOCC.ShowModal(@AfterShowModal);\r\nend;\r\n\r\nprocedure TfOCC.edCityEnter(Sender: TObject);\r\nbegin\r\n\tHoldEdit := (Sender as TEdit).tag;\r\n if HoldEdit > 0 then\r\n \tRefillBox(edCities[HoldEdit].text)\r\n else\r\n \tRefillBox('');\r\n\tlbx.ItemIndex := 0;\r\nend;\r\n\r\nfunction TfOCC.GetCityID: string;\r\nbegin\r\n\tresult := OCCList.CurrentID;\r\nend;\r\n\r\nprocedure TfOCC.InitScreen;\r\nvar i: integer;\r\n\r\n procedure AssignFields;\r\n begin\r\n edCities[1] := edCity1;\r\n edWages[1] := edWages1;\r\n edWH[1] := edWH1;\r\n edCreds[1] := edCred1;\r\n edCities[2] := edCity2;\r\n edWages[2] := edWages2;\r\n edWH[2] := edWH2;\r\n edCreds[2] := edCred2;\r\n edCities[3] := edCity3;\r\n edWages[3] := edWages3;\r\n edWH[3] := edWH3;\r\n edCreds[3] := edCred3;\r\n edCities[4] := edCity4;\r\n edWages[4] := edWages4;\r\n edWH[4] := edWH4;\r\n edCreds[4] := edCred4;\r\n edCities[5] := edCity5;\r\n edWages[5] := edWages5;\r\n edWH[5] := edWH5;\r\n edCreds[5] := edCred5;\r\n edCities[6] := edCity6;\r\n edWages[6] := edWages6;\r\n edWH[6] := edWH6;\r\n edCreds[6] := edCred6;\r\n edCities[7] := edCity7;\r\n edWages[7] := edWages7;\r\n edWH[7] := edWH7;\r\n edCreds[7] := edCred7;\r\n edCities[8] := edCity8;\r\n edWages[8] := edWages8;\r\n edWH[8] := edWH8;\r\n edCreds[8] := edCred8;\r\n edCities[9] := edCity9;\r\n edWages[9] := edWages9;\r\n edWH[9] := edWH9;\r\n edCreds[9] := edCred9;\r\n edCities[10] := edCity10;\r\n edWages[10] := edWages10;\r\n edWH[10] := edWH10;\r\n edCreds[10] := edCred10;\r\n edCities[11] := edCity11;\r\n edWages[11] := edWages11;\r\n edWH[11] := edWH11;\r\n edCreds[11] := edCred11;\r\n edCities[12] := edCity12;\r\n edWages[12] := edWages12;\r\n edWH[12] := edWH12;\r\n edCreds[12] := edCred12;\r\n end;\r\n\r\nbegin\r\n\tAssignFields;\r\n ClearAll;\r\n for i := 1 to 12 do begin\r\n edCities[i].text := '';\r\n edWages[i].text := '';\r\n edWH[i].text := '';\r\n edCreds[i].text := '';\r\n edCreds[i].TabStop := false;\r\n edCities[i].TabOrder := (i-1)*3;\r\n edWages[i].TabOrder := (i-1)*3+1;\r\n edWH[i].TabOrder := (i-1)*3+2;\r\n end;\r\n holdEdit := 1;\r\nend;\r\n\r\nprocedure TfOCC.lbxClick(Sender: TObject);\r\nvar s: string;\r\nbegin\r\n\tif lbx.ItemIndex >= 0 then begin\r\n \ts := lbx.Items[lbx.ItemIndex];\r\n SetCity(HoldEdit, s);\r\n edWages[HoldEdit].SetFocus;\r\n end;\r\nend;\r\n\r\nprocedure TfOCC.btDoneClick(Sender: TObject);\r\nbegin\r\n\tRecalcAllFields;\r\n\tIf TestTotals then begin\r\n\t\tSaveToFV;\r\n FieldValues.SetEntryControls;\r\n \tClose;\r\n end\r\n else\r\n \tShowMessage('Wages exceed total');\r\nend;\r\n\r\nprocedure TfOCC.edWages1Exit(Sender: TObject);\r\nbegin\r\n\tRecalcAllFields;\r\nend;\r\n\r\nprocedure TfOCC.edWH1Exit(Sender: TObject);\r\nbegin\r\n\tRecalcAllFields;\r\nend;\r\n\r\nprocedure TfOCC.WebFormKeyUp(Sender: TObject; var Key: Word;\r\n Shift: TShiftState);\r\nvar s: string;\r\nbegin\r\n\tif (Key = VK_UP) then begin\r\n \tif lbx.ItemIndex > 0 then lbx.ItemIndex := lbx.ItemIndex - 1;\r\n Key := 0;\r\n end\r\n else if (Key = VK_DOWN) then begin\r\n \tif lbx.ItemIndex < lbx.Items.Count-1 then lbx.ItemIndex := lbx.ItemIndex + 1;\r\n Key := 0;\r\n end\r\n else if (Key = VK_RETURN) then begin\r\n if lbx.ItemIndex >= 0 then begin\r\n s := lbx.Items[lbx.ItemIndex];\r\n SetCity(HoldEdit, s);\r\n edWages[HoldEdit].SetFocus;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TfOCC.WebFormShow(Sender: TObject);\r\nbegin\r\n\tInitScreen;\r\n SetLogoPanel(pnLogo, imgLogo);\r\n LoadFromFV;\r\n\tRefillBox('');\r\n edCity1.SetFocus;\r\nend;\r\n\r\nprocedure TfOCC.RecalcAllFields;\r\nbegin\r\n\tEditsToArrays;\r\n RecalcCredits;\r\n ArraysToEdits;\r\nend;\r\n\r\nprocedure TfOCC.RecalcCredits;\r\nvar wages, wh, creds: double;\r\n\t i: integer;\r\n\r\n\tprocedure RecalcLine(ndx: integer);\r\n begin\r\n\t\tcredarr[ndx] := CalcOCCredit(wagearr[ndx], wharr[ndx], cityarr[ndx].taxrate);\r\n end;\r\n\r\nbegin\r\n\twages := 0;\r\n wh := 0;\r\n creds := 0;\r\n\tfor i := 1 to 12 do begin\r\n \twages := wages + wagearr[i];\r\n wh := wh + wharr[i];\r\n creds := creds + credarr[i];\r\n \tif CityArr[i].CityName > '' then\r\n \tRecalcLine(i);\r\n end;\r\n\tedTotalWages.Text := format('%.2f', [wages]);\r\n\tedTotalWH.Text := format('%.2f', [wh]);\r\n\tedTotalCredit.Text := format('%.2f', [creds]);\r\nend;\r\n\r\nprocedure TfOCC.RefillBox(s: string);\r\nvar i: integer;\r\nbegin\r\n\tlbx.beginupdate;\r\n\tlbx.Items.Clear;\r\n //lbx.Items.Add(inttostr(OCCList.Count));\r\n for i := 1 to OCCList.Count do begin\r\n if (s = '') or (pos(s, OCCList[i].CITYNAME) > 0) then\r\n \tlbx.Items.Add(OCCList[i].CITYNAME);\r\n end;\r\n\tlbx.endupdate;\r\nend;\r\n\r\nfunction TfOCC.TestTotals: boolean;\r\nbegin\r\n\tresult := true;\r\nend;\r\n\r\nprocedure TfOCC.EditsToArrays;\r\nvar i: integer;\r\n\t s: string;\r\nbegin\r\n\tfor i := 1 to 12 do begin\r\n \ts := edWages[i].text;\r\n if s = '' then s := '0';\r\n \twagearr[i] := strtofloat(s);\r\n \ts := edWH[i].text;\r\n if s = '' then s := '0';\r\n \twharr[i] := strtofloat(s);\r\n \ts := edCreds[i].text;\r\n if s = '' then s := '0';\r\n \tcredarr[i] := strtofloat(s);\r\n if Cityarr[i].CityName <> edCities[i].text then\r\n \tSetCity(i, edCities[i].text);\r\n end;\r\nend;\r\n\r\nprocedure TfOCC.ArraysToEdits;\r\nvar wages, wh, creds: double;\r\n\t i: integer;\r\nbegin\r\n\twages := 0;\r\n wh := 0;\r\n creds := 0;\r\n\tfor i := 1 to 12 do begin\r\n \twages := wages + wagearr[i];\r\n wh := wh + wharr[i];\r\n creds := creds + credarr[i];\r\n \tif wagearr[i] = 0 then edWages[i].text := ''\r\n else edWages[i].text := format('%.2f', [wagearr[i]]);\r\n \tif wharr[i] = 0 then edWH[i].text := ''\r\n else edWH[i].text := format('%.2f', [wharr[i]]);\r\n edCreds[i].text := format('%.2f', [credarr[i]]);\r\n end;\r\n\tedTotalWages.Text := format('%.2f', [wages]);\r\n\tedTotalWH.Text := format('%.2f', [wh]);\r\n\tedTotalCredit.Text := format('%.2f', [creds]);\r\nend;\r\n\r\nprocedure TfOCC.ClearAll;\r\nvar i: integer;\r\nbegin\r\n\tfor i := 1 to 12 do begin\r\n \twagearr[i] := 0;\r\n wharr[i] := 0;\r\n credarr[i] := 0;\r\n \tcityarr[i].TaxRate := 0;\r\n \tcityarr[i].CityIDent := '';\r\n \tcityarr[i].CityName := '';\r\n end;\r\nend;\r\n\r\nprocedure TfOCC.edCity1Exit(Sender: TObject);\r\nbegin\r\n\tRecalcAllFields;\r\nend;\r\n\r\nprocedure TfOCC.edCityChange(Sender: TObject);\r\nbegin\r\n\tlbx.ItemIndex := -1;\r\n RefillBox((Sender as TEdit).text);\r\nend;\r\n\r\nprocedure TfOCC.SaveToFV;\r\nvar sub, ndx: integer;\r\n lline: string;\r\n parms: TStringParams;\r\n tot: double;\r\nbegin\r\n parms := TStringParams.create(50, ',');\r\n ndx := 0;\r\n tot := 0;\r\n for sub := 1 to 12 do begin\r\n \tif cityarr[sub].CityIdent > '' then begin\r\n \tinc(ndx);\r\n parms[4*ndx-3] := cityarr[sub].CityIdent;\r\n parms.asFloat[4*ndx-2] := wagearr[sub];\r\n parms.asFloat[4*ndx-1] := wharr[sub];\r\n parms.asFloat[4*ndx] := credarr[sub];\r\n tot := tot + credarr[sub];\r\n end;\r\n end;\r\n parms.nParams := 4 * ndx;\r\n LLine := parms.asString;\r\n// dmClientConnections.SendConsoleMessage('OCLine Write: ' + LLine);\r\n parms.free;\r\n FieldValues.SetByLineCodeS('OCLINE', LLine, W2Index, 0);\r\n FieldValues.SetByLineCodeV('W2OCC', tot, W2Index, 0);\r\nend;\r\n\r\nprocedure TfOCC.SetCity(ndx: integer; citynm: string; id: string='');\r\nbegin\r\n\tif id > '' then\r\n\t OCCList.SetCurrentByID(id)\r\n else\r\n\t OCCList.SetCurrentByName(citynm);\r\n if ndx > 0 then begin\r\n edCities[ndx].text := OCCList.CurrentName;\r\n Cityarr[ndx].CityIdent := OCCList.CurrentID;\r\n Cityarr[ndx].CityName := OCCList.CurrentName;\r\n Cityarr[ndx].TaxRate := OCCList.CurrentRate;\r\n end;\r\nend;\r\n\r\nprocedure TfOCC.LoadFromFV;\r\nvar sub: integer;\r\n lline, lcty: string;\r\n parms: TStringParams;\r\nbegin\r\n\tW2Wages := FieldValues.GetByLineCodeV('LW2WAGES', W2Index, 0);\r\n\tLLine := FieldValues.GetByLineCodeS('OCLINE', W2Index, 0);\r\n// dmClientConnections.SendConsoleMessage('OCLine Read: ' + LLine);\r\n\tClearAll;\r\n if LLine > '' then begin\r\n parms := TStringParams.create(50, ',');\r\n parms.asString := LLine;\r\n for sub := 1 to 12 do begin\r\n if (4*sub) <= parms.nParams then begin\r\n lcty := parms[4*sub-3];\r\n SetCity(sub, '', lcty);\r\n wagearr[sub] := parms.asFloat[4*sub-2];\r\n wharr[sub] := parms.asFloat[4*sub-1];\r\n credarr[sub] := parms.asFloat[4*sub];\r\n end;\r\n end;\r\n parms.free;\r\n end;\r\n\tArraysToEdits;\r\nend;\r\n\r\n\r\nprocedure TfOCC.LoadDFMValues;\r\nbegin\r\n inherited LoadDFMValues;\r\n\r\n WebLabel1 := TLabel.Create(Self);\r\n WebLabel2 := TLabel.Create(Self);\r\n WebLabel3 := TLabel.Create(Self);\r\n WebLabel4 := TLabel.Create(Self);\r\n WebLabel5 := TLabel.Create(Self);\r\n lbx := TListBox.Create(Self);\r\n edCity1 := TEdit.Create(Self);\r\n btDone := TButton.Create(Self);\r\n edWages1 := TEdit.Create(Self);\r\n edWH1 := TEdit.Create(Self);\r\n edCred1 := TEdit.Create(Self);\r\n edTotalWages := TEdit.Create(Self);\r\n edTotalWH := TEdit.Create(Self);\r\n edTotalCredit := TEdit.Create(Self);\r\n edCity2 := TEdit.Create(Self);\r\n edWages2 := TEdit.Create(Self);\r\n edWH2 := TEdit.Create(Self);\r\n edCred2 := TEdit.Create(Self);\r\n edCity3 := TEdit.Create(Self);\r\n edWages3 := TEdit.Create(Self);\r\n edWH3 := TEdit.Create(Self);\r\n edCred3 := TEdit.Create(Self);\r\n edCity4 := TEdit.Create(Self);\r\n edWages4 := TEdit.Create(Self);\r\n edWH4 := TEdit.Create(Self);\r\n edCred4 := TEdit.Create(Self);\r\n edCity5 := TEdit.Create(Self);\r\n edWages5 := TEdit.Create(Self);\r\n edWH5 := TEdit.Create(Self);\r\n edCred5 := TEdit.Create(Self);\r\n edCity6 := TEdit.Create(Self);\r\n edWages6 := TEdit.Create(Self);\r\n edWH6 := TEdit.Create(Self);\r\n edCred6 := TEdit.Create(Self);\r\n edCity7 := TEdit.Create(Self);\r\n edWages7 := TEdit.Create(Self);\r\n edWH7 := TEdit.Create(Self);\r\n edCred7 := TEdit.Create(Self);\r\n edCity8 := TEdit.Create(Self);\r\n edWages8 := TEdit.Create(Self);\r\n edWH8 := TEdit.Create(Self);\r\n edCred8 := TEdit.Create(Self);\r\n edCity9 := TEdit.Create(Self);\r\n edWages9 := TEdit.Create(Self);\r\n edWH9 := TEdit.Create(Self);\r\n edCred9 := TEdit.Create(Self);\r\n edCity10 := TEdit.Create(Self);\r\n edWages10 := TEdit.Create(Self);\r\n edWH10 := TEdit.Create(Self);\r\n edCred10 := TEdit.Create(Self);\r\n edCity11 := TEdit.Create(Self);\r\n edWages11 := TEdit.Create(Self);\r\n edWH11 := TEdit.Create(Self);\r\n edCred11 := TEdit.Create(Self);\r\n edCity12 := TEdit.Create(Self);\r\n edWages12 := TEdit.Create(Self);\r\n edWH12 := TEdit.Create(Self);\r\n edCred12 := TEdit.Create(Self);\r\n pnLogo := TPanel.Create(Self);\r\n imgLogo := TImageControl.Create(Self);\r\n\r\n WebLabel1.BeforeLoadDFMValues;\r\n WebLabel2.BeforeLoadDFMValues;\r\n WebLabel3.BeforeLoadDFMValues;\r\n WebLabel4.BeforeLoadDFMValues;\r\n WebLabel5.BeforeLoadDFMValues;\r\n lbx.BeforeLoadDFMValues;\r\n edCity1.BeforeLoadDFMValues;\r\n btDone.BeforeLoadDFMValues;\r\n edWages1.BeforeLoadDFMValues;\r\n edWH1.BeforeLoadDFMValues;\r\n edCred1.BeforeLoadDFMValues;\r\n edTotalWages.BeforeLoadDFMValues;\r\n edTotalWH.BeforeLoadDFMValues;\r\n edTotalCredit.BeforeLoadDFMValues;\r\n edCity2.BeforeLoadDFMValues;\r\n edWages2.BeforeLoadDFMValues;\r\n edWH2.BeforeLoadDFMValues;\r\n edCred2.BeforeLoadDFMValues;\r\n edCity3.BeforeLoadDFMValues;\r\n edWages3.BeforeLoadDFMValues;\r\n edWH3.BeforeLoadDFMValues;\r\n edCred3.BeforeLoadDFMValues;\r\n edCity4.BeforeLoadDFMValues;\r\n edWages4.BeforeLoadDFMValues;\r\n edWH4.BeforeLoadDFMValues;\r\n edCred4.BeforeLoadDFMValues;\r\n edCity5.BeforeLoadDFMValues;\r\n edWages5.BeforeLoadDFMValues;\r\n edWH5.BeforeLoadDFMValues;\r\n edCred5.BeforeLoadDFMValues;\r\n edCity6.BeforeLoadDFMValues;\r\n edWages6.BeforeLoadDFMValues;\r\n edWH6.BeforeLoadDFMValues;\r\n edCred6.BeforeLoadDFMValues;\r\n edCity7.BeforeLoadDFMValues;\r\n edWages7.BeforeLoadDFMValues;\r\n edWH7.BeforeLoadDFMValues;\r\n edCred7.BeforeLoadDFMValues;\r\n edCity8.BeforeLoadDFMValues;\r\n edWages8.BeforeLoadDFMValues;\r\n edWH8.BeforeLoadDFMValues;\r\n edCred8.BeforeLoadDFMValues;\r\n edCity9.BeforeLoadDFMValues;\r\n edWages9.BeforeLoadDFMValues;\r\n edWH9.BeforeLoadDFMValues;\r\n edCred9.BeforeLoadDFMValues;\r\n edCity10.BeforeLoadDFMValues;\r\n edWages10.BeforeLoadDFMValues;\r\n edWH10.BeforeLoadDFMValues;\r\n edCred10.BeforeLoadDFMValues;\r\n edCity11.BeforeLoadDFMValues;\r\n edWages11.BeforeLoadDFMValues;\r\n edWH11.BeforeLoadDFMValues;\r\n edCred11.BeforeLoadDFMValues;\r\n edCity12.BeforeLoadDFMValues;\r\n edWages12.BeforeLoadDFMValues;\r\n edWH12.BeforeLoadDFMValues;\r\n edCred12.BeforeLoadDFMValues;\r\n pnLogo.BeforeLoadDFMValues;\r\n imgLogo.BeforeLoadDFMValues;\r\n try\r\n Name := 'fOCC';\r\n Width := 640;\r\n Height := 508;\r\n Caption := 'CityTax Online Filing';\r\n SetEvent(Self, 'OnKeyUp', 'WebFormKeyUp');\r\n SetEvent(Self, 'OnShow', 'WebFormShow');\r\n WebLabel1.SetParentComponent(Self);\r\n WebLabel1.Name := 'WebLabel1';\r\n WebLabel1.Left := 230;\r\n WebLabel1.Top := 84;\r\n WebLabel1.Width := 50;\r\n WebLabel1.Height := 13;\r\n WebLabel1.Caption := 'Worked In';\r\n WebLabel1.HeightPercent := 100.000000000000000000;\r\n WebLabel1.WidthPercent := 100.000000000000000000;\r\n WebLabel2.SetParentComponent(Self);\r\n WebLabel2.Name := 'WebLabel2';\r\n WebLabel2.Left := 361;\r\n WebLabel2.Top := 84;\r\n WebLabel2.Width := 46;\r\n WebLabel2.Height := 13;\r\n WebLabel2.Caption := 'Wages In';\r\n WebLabel2.HeightPercent := 100.000000000000000000;\r\n WebLabel2.WidthPercent := 100.000000000000000000;\r\n WebLabel3.SetParentComponent(Self);\r\n WebLabel3.Name := 'WebLabel3';\r\n WebLabel3.Left := 475;\r\n WebLabel3.Top := 84;\r\n WebLabel3.Width := 55;\r\n WebLabel3.Height := 13;\r\n WebLabel3.Caption := 'Withheld In';\r\n WebLabel3.HeightPercent := 100.000000000000000000;\r\n WebLabel3.WidthPercent := 100.000000000000000000;\r\n WebLabel4.SetParentComponent(Self);\r\n WebLabel4.Name := 'WebLabel4';\r\n WebLabel4.Left := 568;\r\n WebLabel4.Top := 84;\r\n WebLabel4.Width := 29;\r\n WebLabel4.Height := 13;\r\n WebLabel4.Caption := 'Credit';\r\n WebLabel4.HeightPercent := 100.000000000000000000;\r\n WebLabel4.WidthPercent := 100.000000000000000000;\r\n WebLabel5.SetParentComponent(Self);\r\n WebLabel5.Name := 'WebLabel5';\r\n WebLabel5.Left := 325;\r\n WebLabel5.Top := 436;\r\n WebLabel5.Width := 29;\r\n WebLabel5.Height := 13;\r\n WebLabel5.Caption := 'Totals';\r\n WebLabel5.HeightPercent := 100.000000000000000000;\r\n WebLabel5.WidthPercent := 100.000000000000000000;\r\n lbx.SetParentComponent(Self);\r\n lbx.Name := 'lbx';\r\n lbx.Left := 20;\r\n lbx.Top := 87;\r\n lbx.Width := 191;\r\n lbx.Height := 420;\r\n lbx.TabStop := False;\r\n lbx.HeightPercent := 100.000000000000000000;\r\n lbx.ItemHeight := 13;\r\n lbx.ItemIndex := -1;\r\n lbx.TabOrder := 54;\r\n lbx.WidthPercent := 100.000000000000000000;\r\n SetEvent(lbx, Self, 'OnClick', 'lbxClick');\r\n SetEvent(lbx, Self, 'OnKeyUp', 'WebFormKeyUp');\r\n edCity1.SetParentComponent(Self);\r\n edCity1.Name := 'edCity1';\r\n edCity1.Tag := 1;\r\n edCity1.Left := 223;\r\n edCity1.Top := 100;\r\n edCity1.Width := 132;\r\n edCity1.Height := 22;\r\n edCity1.CharCase := wecUpperCase;\r\n edCity1.ChildOrder := 1;\r\n edCity1.HeightPercent := 100.000000000000000000;\r\n edCity1.WidthPercent := 100.000000000000000000;\r\n SetEvent(edCity1, Self, 'OnChange', 'edCityChange');\r\n SetEvent(edCity1, Self, 'OnEnter', 'edCityEnter');\r\n SetEvent(edCity1, Self, 'OnExit', 'edCity1Exit');\r\n SetEvent(edCity1, Self, 'OnKeyUp', 'WebFormKeyUp');\r\n btDone.SetParentComponent(Self);\r\n btDone.Name := 'btDone';\r\n btDone.Left := 536;\r\n btDone.Top := 432;\r\n btDone.Width := 96;\r\n btDone.Height := 25;\r\n btDone.Caption := 'Done';\r\n btDone.ChildOrder := 2;\r\n btDone.HeightPercent := 100.000000000000000000;\r\n btDone.TabOrder := 53;\r\n btDone.TabStop := False;\r\n btDone.WidthPercent := 100.000000000000000000;\r\n SetEvent(btDone, Self, 'OnClick', 'btDoneClick');\r\n edWages1.SetParentComponent(Self);\r\n edWages1.Name := 'edWages1';\r\n edWages1.Left := 360;\r\n edWages1.Top := 100;\r\n edWages1.Width := 107;\r\n edWages1.Height := 22;\r\n edWages1.Alignment := taRightJustify;\r\n edWages1.CharCase := wecUpperCase;\r\n edWages1.ChildOrder := 1;\r\n edWages1.HeightPercent := 100.000000000000000000;\r\n edWages1.TabOrder := 1;\r\n edWages1.WidthPercent := 100.000000000000000000;\r\n SetEvent(edWages1, Self, 'OnExit', 'edWages1Exit');\r\n edWH1.SetParentComponent(Self);\r\n edWH1.Name := 'edWH1';\r\n edWH1.Left := 472;\r\n edWH1.Top := 100;\r\n edWH1.Width := 87;\r\n edWH1.Height := 22;\r\n edWH1.Alignment := taRightJustify;\r\n edWH1.CharCase := wecUpperCase;\r\n edWH1.ChildOrder := 1;\r\n edWH1.HeightPercent := 100.000000000000000000;\r\n edWH1.TabOrder := 2;\r\n edWH1.WidthPercent := 100.000000000000000000;\r\n SetEvent(edWH1, Self, 'OnExit', 'edWH1Exit');\r\n edCred1.SetParentComponent(Self);\r\n edCred1.Name := 'edCred1';\r\n edCred1.Left := 564;\r\n edCred1.Top := 100;\r\n edCred1.Width := 65;\r\n edCred1.Height := 22;\r\n edCred1.TabStop := False;\r\n edCred1.Alignment := taRightJustify;\r\n edCred1.CharCase := wecUpperCase;\r\n edCred1.ChildOrder := 1;\r\n edCred1.Color := clBtnFace;\r\n edCred1.HeightPercent := 100.000000000000000000;\r\n edCred1.ReadOnly := True;\r\n edCred1.TabOrder := 3;\r\n edCred1.WidthPercent := 100.000000000000000000;\r\n edTotalWages.SetParentComponent(Self);\r\n edTotalWages.Name := 'edTotalWages';\r\n edTotalWages.Left := 359;\r\n edTotalWages.Top := 396;\r\n edTotalWages.Width := 107;\r\n edTotalWages.Height := 22;\r\n edTotalWages.TabStop := False;\r\n edTotalWages.Alignment := taRightJustify;\r\n edTotalWages.CharCase := wecUpperCase;\r\n edTotalWages.ChildOrder := 1;\r\n edTotalWages.Color := clBtnFace;\r\n edTotalWages.HeightPercent := 100.000000000000000000;\r\n edTotalWages.ReadOnly := True;\r\n edTotalWages.TabOrder := 65;\r\n edTotalWages.WidthPercent := 100.000000000000000000;\r\n edTotalWH.SetParentComponent(Self);\r\n edTotalWH.Name := 'edTotalWH';\r\n edTotalWH.Left := 472;\r\n edTotalWH.Top := 396;\r\n edTotalWH.Width := 87;\r\n edTotalWH.Height := 22;\r\n edTotalWH.TabStop := False;\r\n edTotalWH.Alignment := taRightJustify;\r\n edTotalWH.CharCase := wecUpperCase;\r\n edTotalWH.ChildOrder := 1;\r\n edTotalWH.Color := clBtnFace;\r\n edTotalWH.HeightPercent := 100.000000000000000000;\r\n edTotalWH.ReadOnly := True;\r\n edTotalWH.TabOrder := 66;\r\n edTotalWH.WidthPercent := 100.000000000000000000;\r\n edTotalCredit.SetParentComponent(Self);\r\n edTotalCredit.Name := 'edTotalCredit';\r\n edTotalCredit.Left := 564;\r\n edTotalCredit.Top := 396;\r\n edTotalCredit.Width := 65;\r\n edTotalCredit.Height := 22;\r\n edTotalCredit.TabStop := False;\r\n edTotalCredit.Alignment := taRightJustify;\r\n edTotalCredit.CharCase := wecUpperCase;\r\n edTotalCredit.ChildOrder := 1;\r\n edTotalCredit.Color := clBtnFace;\r\n edTotalCredit.HeightPercent := 100.000000000000000000;\r\n edTotalCredit.ReadOnly := True;\r\n edTotalCredit.TabOrder := 67;\r\n edTotalCredit.WidthPercent := 100.000000000000000000;\r\n edCity2.SetParentComponent(Self);\r\n edCity2.Name := 'edCity2';\r\n edCity2.Tag := 2;\r\n edCity2.Left := 223;\r\n edCity2.Top := 128;\r\n edCity2.Width := 132;\r\n edCity2.Height := 22;\r\n edCity2.CharCase := wecUpperCase;\r\n edCity2.ChildOrder := 1;\r\n edCity2.HeightPercent := 100.000000000000000000;\r\n edCity2.TabOrder := 4;\r\n edCity2.WidthPercent := 100.000000000000000000;\r\n SetEvent(edCity2, Self, 'OnChange', 'edCityChange');\r\n SetEvent(edCity2, Self, 'OnEnter', 'edCityEnter');\r\n SetEvent(edCity2, Self, 'OnKeyUp', 'WebFormKeyUp');\r\n edWages2.SetParentComponent(Self);\r\n edWages2.Name := 'edWages2';\r\n edWages2.Left := 360;\r\n edWages2.Top := 128;\r\n edWages2.Width := 107;\r\n edWages2.Height := 22;\r\n edWages2.Alignment := taRightJustify;\r\n edWages2.CharCase := wecUpperCase;\r\n edWages2.ChildOrder := 1;\r\n edWages2.HeightPercent := 100.000000000000000000;\r\n edWages2.TabOrder := 5;\r\n edWages2.WidthPercent := 100.000000000000000000;\r\n SetEvent(edWages2, Self, 'OnExit', 'edWages1Exit');\r\n edWH2.SetParentComponent(Self);\r\n edWH2.Name := 'edWH2';\r\n edWH2.Left := 472;\r\n edWH2.Top := 128;\r\n edWH2.Width := 87;\r\n edWH2.Height := 22;\r\n edWH2.Alignment := taRightJustify;\r\n edWH2.CharCase := wecUpperCase;\r\n edWH2.ChildOrder := 1;\r\n edWH2.HeightPercent := 100.000000000000000000;\r\n edWH2.TabOrder := 6;\r\n edWH2.WidthPercent := 100.000000000000000000;\r\n SetEvent(edWH2, Self, 'OnExit', 'edWH1Exit');\r\n edCred2.SetParentComponent(Self);\r\n edCred2.Name := 'edCred2';\r\n edCred2.Left := 564;\r\n edCred2.Top := 128;\r\n edCred2.Width := 65;\r\n edCred2.Height := 22;\r\n edCred2.TabStop := False;\r\n edCred2.Alignment := taRightJustify;\r\n edCred2.CharCase := wecUpperCase;\r\n edCred2.ChildOrder := 1;\r\n edCred2.Color := clBtnFace;\r\n edCred2.HeightPercent := 100.000000000000000000;\r\n edCred2.ReadOnly := True;\r\n edCred2.WidthPercent := 100.000000000000000000;\r\n edCity3.SetParentComponent(Self);\r\n edCity3.Name := 'edCity3';\r\n edCity3.Tag := 3;\r\n edCity3.Left := 223;\r\n edCity3.Top := 156;\r\n edCity3.Width := 132;\r\n edCity3.Height := 22;\r\n edCity3.CharCase := wecUpperCase;\r\n edCity3.ChildOrder := 1;\r\n edCity3.HeightPercent := 100.000000000000000000;\r\n edCity3.TabOrder := 7;\r\n edCity3.WidthPercent := 100.000000000000000000;\r\n SetEvent(edCity3, Self, 'OnChange', 'edCityChange');\r\n SetEvent(edCity3, Self, 'OnEnter', 'edCityEnter');\r\n SetEvent(edCity3, Self, 'OnKeyUp', 'WebFormKeyUp');\r\n edWages3.SetParentComponent(Self);\r\n edWages3.Name := 'edWages3';\r\n edWages3.Left := 361;\r\n edWages3.Top := 156;\r\n edWages3.Width := 107;\r\n edWages3.Height := 22;\r\n edWages3.Alignment := taRightJustify;\r\n edWages3.CharCase := wecUpperCase;\r\n edWages3.ChildOrder := 1;\r\n edWages3.HeightPercent := 100.000000000000000000;\r\n edWages3.TabOrder := 8;\r\n edWages3.WidthPercent := 100.000000000000000000;\r\n SetEvent(edWages3, Self, 'OnExit', 'edWages1Exit');\r\n edWH3.SetParentComponent(Self);\r\n edWH3.Name := 'edWH3';\r\n edWH3.Left := 472;\r\n edWH3.Top := 156;\r\n edWH3.Width := 87;\r\n edWH3.Height := 22;\r\n edWH3.Alignment := taRightJustify;\r\n edWH3.CharCase := wecUpperCase;\r\n edWH3.ChildOrder := 1;\r\n edWH3.HeightPercent := 100.000000000000000000;\r\n edWH3.TabOrder := 9;\r\n edWH3.WidthPercent := 100.000000000000000000;\r\n SetEvent(edWH3, Self, 'OnExit', 'edWH1Exit');\r\n edCred3.SetParentComponent(Self);\r\n edCred3.Name := 'edCred3';\r\n edCred3.Left := 564;\r\n edCred3.Top := 156;\r\n edCred3.Width := 65;\r\n edCred3.Height := 22;\r\n edCred3.TabStop := False;\r\n edCred3.Alignment := taRightJustify;\r\n edCred3.CharCase := wecUpperCase;\r\n edCred3.ChildOrder := 1;\r\n edCred3.Color := clBtnFace;\r\n edCred3.HeightPercent := 100.000000000000000000;\r\n edCred3.ReadOnly := True;\r\n edCred3.WidthPercent := 100.000000000000000000;\r\n edCity4.SetParentComponent(Self);\r\n edCity4.Name := 'edCity4';\r\n edCity4.Tag := 4;\r\n edCity4.Left := 222;\r\n edCity4.Top := 184;\r\n edCity4.Width := 132;\r\n edCity4.Height := 22;\r\n edCity4.CharCase := wecUpperCase;\r\n edCity4.ChildOrder := 1;\r\n edCity4.HeightPercent := 100.000000000000000000;\r\n edCity4.TabOrder := 10;\r\n edCity4.WidthPercent := 100.000000000000000000;\r\n SetEvent(edCity4, Self, 'OnChange', 'edCityChange');\r\n SetEvent(edCity4, Self, 'OnEnter', 'edCityEnter');\r\n SetEvent(edCity4, Self, 'OnKeyUp', 'WebFormKeyUp');\r\n edWages4.SetParentComponent(Self);\r\n edWages4.Name := 'edWages4';\r\n edWages4.Left := 360;\r\n edWages4.Top := 184;\r\n edWages4.Width := 107;\r\n edWages4.Height := 22;\r\n edWages4.Alignment := taRightJustify;\r\n edWages4.CharCase := wecUpperCase;\r\n edWages4.ChildOrder := 1;\r\n edWages4.HeightPercent := 100.000000000000000000;\r\n edWages4.TabOrder := 11;\r\n edWages4.WidthPercent := 100.000000000000000000;\r\n SetEvent(edWages4, Self, 'OnExit', 'edWages1Exit');\r\n edWH4.SetParentComponent(Self);\r\n edWH4.Name := 'edWH4';\r\n edWH4.Left := 472;\r\n edWH4.Top := 184;\r\n edWH4.Width := 87;\r\n edWH4.Height := 22;\r\n edWH4.Alignment := taRightJustify;\r\n edWH4.CharCase := wecUpperCase;\r\n edWH4.ChildOrder := 1;\r\n edWH4.HeightPercent := 100.000000000000000000;\r\n edWH4.TabOrder := 12;\r\n edWH4.WidthPercent := 100.000000000000000000;\r\n SetEvent(edWH4, Self, 'OnExit', 'edWH1Exit');\r\n edCred4.SetParentComponent(Self);\r\n edCred4.Name := 'edCred4';\r\n edCred4.Left := 565;\r\n edCred4.Top := 184;\r\n edCred4.Width := 65;\r\n edCred4.Height := 22;\r\n edCred4.TabStop := False;\r\n edCred4.Alignment := taRightJustify;\r\n edCred4.CharCase := wecUpperCase;\r\n edCred4.ChildOrder := 1;\r\n edCred4.Color := clBtnFace;\r\n edCred4.HeightPercent := 100.000000000000000000;\r\n edCred4.ReadOnly := True;\r\n edCred4.WidthPercent := 100.000000000000000000;\r\n edCity5.SetParentComponent(Self);\r\n edCity5.Name := 'edCity5';\r\n edCity5.Tag := 5;\r\n edCity5.Left := 223;\r\n edCity5.Top := 212;\r\n edCity5.Width := 132;\r\n edCity5.Height := 22;\r\n edCity5.CharCase := wecUpperCase;\r\n edCity5.ChildOrder := 1;\r\n edCity5.HeightPercent := 100.000000000000000000;\r\n edCity5.TabOrder := 13;\r\n edCity5.WidthPercent := 100.000000000000000000;\r\n SetEvent(edCity5, Self, 'OnChange', 'edCityChange');\r\n SetEvent(edCity5, Self, 'OnEnter', 'edCityEnter');\r\n SetEvent(edCity5, Self, 'OnKeyUp', 'WebFormKeyUp');\r\n edWages5.SetParentComponent(Self);\r\n edWages5.Name := 'edWages5';\r\n edWages5.Left := 360;\r\n edWages5.Top := 212;\r\n edWages5.Width := 107;\r\n edWages5.Height := 22;\r\n edWages5.Alignment := taRightJustify;\r\n edWages5.CharCase := wecUpperCase;\r\n edWages5.ChildOrder := 1;\r\n edWages5.HeightPercent := 100.000000000000000000;\r\n edWages5.TabOrder := 14;\r\n edWages5.WidthPercent := 100.000000000000000000;\r\n SetEvent(edWages5, Self, 'OnExit', 'edWages1Exit');\r\n edWH5.SetParentComponent(Self);\r\n edWH5.Name := 'edWH5';\r\n edWH5.Left := 471;\r\n edWH5.Top := 212;\r\n edWH5.Width := 87;\r\n edWH5.Height := 22;\r\n edWH5.Alignment := taRightJustify;\r\n edWH5.CharCase := wecUpperCase;\r\n edWH5.ChildOrder := 1;\r\n edWH5.HeightPercent := 100.000000000000000000;\r\n edWH5.TabOrder := 15;\r\n edWH5.WidthPercent := 100.000000000000000000;\r\n SetEvent(edWH5, Self, 'OnExit', 'edWH1Exit');\r\n edCred5.SetParentComponent(Self);\r\n edCred5.Name := 'edCred5';\r\n edCred5.Left := 564;\r\n edCred5.Top := 212;\r\n edCred5.Width := 65;\r\n edCred5.Height := 22;\r\n edCred5.TabStop := False;\r\n edCred5.Alignment := taRightJustify;\r\n edCred5.CharCase := wecUpperCase;\r\n edCred5.ChildOrder := 1;\r\n edCred5.Color := clBtnFace;\r\n edCred5.HeightPercent := 100.000000000000000000;\r\n edCred5.ReadOnly := True;\r\n edCred5.WidthPercent := 100.000000000000000000;\r\n edCity6.SetParentComponent(Self);\r\n edCity6.Name := 'edCity6';\r\n edCity6.Tag := 6;\r\n edCity6.Left := 223;\r\n edCity6.Top := 240;\r\n edCity6.Width := 132;\r\n edCity6.Height := 22;\r\n edCity6.CharCase := wecUpperCase;\r\n edCity6.ChildOrder := 1;\r\n edCity6.HeightPercent := 100.000000000000000000;\r\n edCity6.TabOrder := 16;\r\n edCity6.WidthPercent := 100.000000000000000000;\r\n SetEvent(edCity6, Self, 'OnChange', 'edCityChange');\r\n SetEvent(edCity6, Self, 'OnEnter', 'edCityEnter');\r\n SetEvent(edCity6, Self, 'OnKeyUp', 'WebFormKeyUp');\r\n edWages6.SetParentComponent(Self);\r\n edWages6.Name := 'edWages6';\r\n edWages6.Left := 360;\r\n edWages6.Top := 240;\r\n edWages6.Width := 107;\r\n edWages6.Height := 22;\r\n edWages6.Alignment := taRightJustify;\r\n edWages6.CharCase := wecUpperCase;\r\n edWages6.ChildOrder := 1;\r\n edWages6.HeightPercent := 100.000000000000000000;\r\n edWages6.TabOrder := 17;\r\n edWages6.WidthPercent := 100.000000000000000000;\r\n SetEvent(edWages6, Self, 'OnExit', 'edWages1Exit');\r\n edWH6.SetParentComponent(Self);\r\n edWH6.Name := 'edWH6';\r\n edWH6.Left := 472;\r\n edWH6.Top := 240;\r\n edWH6.Width := 87;\r\n edWH6.Height := 22;\r\n edWH6.Alignment := taRightJustify;\r\n edWH6.CharCase := wecUpperCase;\r\n edWH6.ChildOrder := 1;\r\n edWH6.HeightPercent := 100.000000000000000000;\r\n edWH6.TabOrder := 18;\r\n edWH6.WidthPercent := 100.000000000000000000;\r\n SetEvent(edWH6, Self, 'OnExit', 'edWH1Exit');\r\n edCred6.SetParentComponent(Self);\r\n edCred6.Name := 'edCred6';\r\n edCred6.Left := 564;\r\n edCred6.Top := 240;\r\n edCred6.Width := 65;\r\n edCred6.Height := 22;\r\n edCred6.TabStop := False;\r\n edCred6.Alignment := taRightJustify;\r\n edCred6.CharCase := wecUpperCase;\r\n edCred6.ChildOrder := 1;\r\n edCred6.Color := clBtnFace;\r\n edCred6.HeightPercent := 100.000000000000000000;\r\n edCred6.ReadOnly := True;\r\n edCred6.WidthPercent := 100.000000000000000000;\r\n edCity7.SetParentComponent(Self);\r\n edCity7.Name := 'edCity7';\r\n edCity7.Tag := 7;\r\n edCity7.Left := 223;\r\n edCity7.Top := 268;\r\n edCity7.Width := 132;\r\n edCity7.Height := 22;\r\n edCity7.CharCase := wecUpperCase;\r\n edCity7.ChildOrder := 1;\r\n edCity7.HeightPercent := 100.000000000000000000;\r\n edCity7.TabOrder := 19;\r\n edCity7.WidthPercent := 100.000000000000000000;\r\n SetEvent(edCity7, Self, 'OnChange', 'edCityChange');\r\n SetEvent(edCity7, Self, 'OnEnter', 'edCityEnter');\r\n SetEvent(edCity7, Self, 'OnKeyUp', 'WebFormKeyUp');\r\n edWages7.SetParentComponent(Self);\r\n edWages7.Name := 'edWages7';\r\n edWages7.Left := 359;\r\n edWages7.Top := 268;\r\n edWages7.Width := 107;\r\n edWages7.Height := 22;\r\n edWages7.Alignment := taRightJustify;\r\n edWages7.CharCase := wecUpperCase;\r\n edWages7.ChildOrder := 1;\r\n edWages7.HeightPercent := 100.000000000000000000;\r\n edWages7.TabOrder := 20;\r\n edWages7.WidthPercent := 100.000000000000000000;\r\n SetEvent(edWages7, Self, 'OnExit', 'edWages1Exit');\r\n edWH7.SetParentComponent(Self);\r\n edWH7.Name := 'edWH7';\r\n edWH7.Left := 472;\r\n edWH7.Top := 268;\r\n edWH7.Width := 87;\r\n edWH7.Height := 22;\r\n edWH7.Alignment := taRightJustify;\r\n edWH7.CharCase := wecUpperCase;\r\n edWH7.ChildOrder := 1;\r\n edWH7.HeightPercent := 100.000000000000000000;\r\n edWH7.WidthPercent := 100.000000000000000000;\r\n SetEvent(edWH7, Self, 'OnExit', 'edWH1Exit');\r\n edCred7.SetParentComponent(Self);\r\n edCred7.Name := 'edCred7';\r\n edCred7.Left := 564;\r\n edCred7.Top := 268;\r\n edCred7.Width := 65;\r\n edCred7.Height := 22;\r\n edCred7.TabStop := False;\r\n edCred7.Alignment := taRightJustify;\r\n edCred7.CharCase := wecUpperCase;\r\n edCred7.ChildOrder := 1;\r\n edCred7.Color := clBtnFace;\r\n edCred7.HeightPercent := 100.000000000000000000;\r\n edCred7.ReadOnly := True;\r\n edCred7.WidthPercent := 100.000000000000000000;\r\n edCity8.SetParentComponent(Self);\r\n edCity8.Name := 'edCity8';\r\n edCity8.Tag := 8;\r\n edCity8.Left := 222;\r\n edCity8.Top := 296;\r\n edCity8.Width := 132;\r\n edCity8.Height := 22;\r\n edCity8.CharCase := wecUpperCase;\r\n edCity8.ChildOrder := 1;\r\n edCity8.HeightPercent := 100.000000000000000000;\r\n edCity8.WidthPercent := 100.000000000000000000;\r\n SetEvent(edCity8, Self, 'OnChange', 'edCityChange');\r\n SetEvent(edCity8, Self, 'OnEnter', 'edCityEnter');\r\n SetEvent(edCity8, Self, 'OnKeyUp', 'WebFormKeyUp');\r\n edWages8.SetParentComponent(Self);\r\n edWages8.Name := 'edWages8';\r\n edWages8.Left := 360;\r\n edWages8.Top := 296;\r\n edWages8.Width := 107;\r\n edWages8.Height := 22;\r\n edWages8.Alignment := taRightJustify;\r\n edWages8.CharCase := wecUpperCase;\r\n edWages8.ChildOrder := 1;\r\n edWages8.HeightPercent := 100.000000000000000000;\r\n edWages8.WidthPercent := 100.000000000000000000;\r\n SetEvent(edWages8, Self, 'OnExit', 'edWages1Exit');\r\n edWH8.SetParentComponent(Self);\r\n edWH8.Name := 'edWH8';\r\n edWH8.Left := 472;\r\n edWH8.Top := 296;\r\n edWH8.Width := 87;\r\n edWH8.Height := 22;\r\n edWH8.Alignment := taRightJustify;\r\n edWH8.CharCase := wecUpperCase;\r\n edWH8.ChildOrder := 1;\r\n edWH8.HeightPercent := 100.000000000000000000;\r\n edWH8.WidthPercent := 100.000000000000000000;\r\n SetEvent(edWH8, Self, 'OnExit', 'edWH1Exit');\r\n edCred8.SetParentComponent(Self);\r\n edCred8.Name := 'edCred8';\r\n edCred8.Left := 564;\r\n edCred8.Top := 296;\r\n edCred8.Width := 65;\r\n edCred8.Height := 22;\r\n edCred8.TabStop := False;\r\n edCred8.Alignment := taRightJustify;\r\n edCred8.CharCase := wecUpperCase;\r\n edCred8.ChildOrder := 1;\r\n edCred8.Color := clBtnFace;\r\n edCred8.HeightPercent := 100.000000000000000000;\r\n edCred8.ReadOnly := True;\r\n edCred8.WidthPercent := 100.000000000000000000;\r\n edCity9.SetParentComponent(Self);\r\n edCity9.Name := 'edCity9';\r\n edCity9.Tag := 9;\r\n edCity9.Left := 223;\r\n edCity9.Top := 324;\r\n edCity9.Width := 132;\r\n edCity9.Height := 22;\r\n edCity9.CharCase := wecUpperCase;\r\n edCity9.ChildOrder := 1;\r\n edCity9.HeightPercent := 100.000000000000000000;\r\n edCity9.WidthPercent := 100.000000000000000000;\r\n SetEvent(edCity9, Self, 'OnChange', 'edCityChange');\r\n SetEvent(edCity9, Self, 'OnEnter', 'edCityEnter');\r\n SetEvent(edCity9, Self, 'OnKeyUp', 'WebFormKeyUp');\r\n edWages9.SetParentComponent(Self);\r\n edWages9.Name := 'edWages9';\r\n edWages9.Left := 360;\r\n edWages9.Top := 324;\r\n edWages9.Width := 107;\r\n edWages9.Height := 22;\r\n edWages9.Alignment := taRightJustify;\r\n edWages9.CharCase := wecUpperCase;\r\n edWages9.ChildOrder := 1;\r\n edWages9.HeightPercent := 100.000000000000000000;\r\n edWages9.WidthPercent := 100.000000000000000000;\r\n SetEvent(edWages9, Self, 'OnExit', 'edWages1Exit');\r\n edWH9.SetParentComponent(Self);\r\n edWH9.Name := 'edWH9';\r\n edWH9.Left := 472;\r\n edWH9.Top := 324;\r\n edWH9.Width := 87;\r\n edWH9.Height := 22;\r\n edWH9.Alignment := taRightJustify;\r\n edWH9.CharCase := wecUpperCase;\r\n edWH9.ChildOrder := 1;\r\n edWH9.HeightPercent := 100.000000000000000000;\r\n edWH9.WidthPercent := 100.000000000000000000;\r\n SetEvent(edWH9, Self, 'OnExit', 'edWH1Exit');\r\n edCred9.SetParentComponent(Self);\r\n edCred9.Name := 'edCred9';\r\n edCred9.Left := 564;\r\n edCred9.Top := 324;\r\n edCred9.Width := 65;\r\n edCred9.Height := 22;\r\n edCred9.TabStop := False;\r\n edCred9.Alignment := taRightJustify;\r\n edCred9.CharCase := wecUpperCase;\r\n edCred9.ChildOrder := 1;\r\n edCred9.Color := clBtnFace;\r\n edCred9.HeightPercent := 100.000000000000000000;\r\n edCred9.ReadOnly := True;\r\n edCred9.WidthPercent := 100.000000000000000000;\r\n edCity10.SetParentComponent(Self);\r\n edCity10.Name := 'edCity10';\r\n edCity10.Tag := 10;\r\n edCity10.Left := 223;\r\n edCity10.Top := 352;\r\n edCity10.Width := 132;\r\n edCity10.Height := 22;\r\n edCity10.CharCase := wecUpperCase;\r\n edCity10.ChildOrder := 1;\r\n edCity10.HeightPercent := 100.000000000000000000;\r\n edCity10.WidthPercent := 100.000000000000000000;\r\n SetEvent(edCity10, Self, 'OnChange', 'edCityChange');\r\n SetEvent(edCity10, Self, 'OnEnter', 'edCityEnter');\r\n SetEvent(edCity10, Self, 'OnKeyUp', 'WebFormKeyUp');\r\n edWages10.SetParentComponent(Self);\r\n edWages10.Name := 'edWages10';\r\n edWages10.Left := 360;\r\n edWages10.Top := 352;\r\n edWages10.Width := 107;\r\n edWages10.Height := 22;\r\n edWages10.Alignment := taRightJustify;\r\n edWages10.CharCase := wecUpperCase;\r\n edWages10.ChildOrder := 1;\r\n edWages10.HeightPercent := 100.000000000000000000;\r\n edWages10.WidthPercent := 100.000000000000000000;\r\n SetEvent(edWages10, Self, 'OnExit', 'edWages1Exit');\r\n edWH10.SetParentComponent(Self);\r\n edWH10.Name := 'edWH10';\r\n edWH10.Left := 472;\r\n edWH10.Top := 352;\r\n edWH10.Width := 87;\r\n edWH10.Height := 22;\r\n edWH10.Alignment := taRightJustify;\r\n edWH10.CharCase := wecUpperCase;\r\n edWH10.ChildOrder := 1;\r\n edWH10.HeightPercent := 100.000000000000000000;\r\n edWH10.WidthPercent := 100.000000000000000000;\r\n SetEvent(edWH10, Self, 'OnExit', 'edWH1Exit');\r\n edCred10.SetParentComponent(Self);\r\n edCred10.Name := 'edCred10';\r\n edCred10.Left := 564;\r\n edCred10.Top := 352;\r\n edCred10.Width := 65;\r\n edCred10.Height := 22;\r\n edCred10.TabStop := False;\r\n edCred10.Alignment := taRightJustify;\r\n edCred10.CharCase := wecUpperCase;\r\n edCred10.ChildOrder := 1;\r\n edCred10.Color := clBtnFace;\r\n edCred10.HeightPercent := 100.000000000000000000;\r\n edCred10.ReadOnly := True;\r\n edCred10.WidthPercent := 100.000000000000000000;\r\n edCity11.SetParentComponent(Self);\r\n edCity11.Name := 'edCity11';\r\n edCity11.Tag := 11;\r\n edCity11.Left := 222;\r\n edCity11.Top := 380;\r\n edCity11.Width := 132;\r\n edCity11.Height := 22;\r\n edCity11.CharCase := wecUpperCase;\r\n edCity11.ChildOrder := 1;\r\n edCity11.HeightPercent := 100.000000000000000000;\r\n edCity11.Visible := False;\r\n edCity11.WidthPercent := 100.000000000000000000;\r\n SetEvent(edCity11, Self, 'OnChange', 'edCityChange');\r\n SetEvent(edCity11, Self, 'OnEnter', 'edCityEnter');\r\n SetEvent(edCity11, Self, 'OnKeyUp', 'WebFormKeyUp');\r\n edWages11.SetParentComponent(Self);\r\n edWages11.Name := 'edWages11';\r\n edWages11.Left := 360;\r\n edWages11.Top := 380;\r\n edWages11.Width := 107;\r\n edWages11.Height := 22;\r\n edWages11.Alignment := taRightJustify;\r\n edWages11.CharCase := wecUpperCase;\r\n edWages11.ChildOrder := 1;\r\n edWages11.HeightPercent := 100.000000000000000000;\r\n edWages11.Visible := False;\r\n edWages11.WidthPercent := 100.000000000000000000;\r\n SetEvent(edWages11, Self, 'OnExit', 'edWages1Exit');\r\n edWH11.SetParentComponent(Self);\r\n edWH11.Name := 'edWH11';\r\n edWH11.Left := 472;\r\n edWH11.Top := 380;\r\n edWH11.Width := 87;\r\n edWH11.Height := 22;\r\n edWH11.Alignment := taRightJustify;\r\n edWH11.CharCase := wecUpperCase;\r\n edWH11.ChildOrder := 1;\r\n edWH11.HeightPercent := 100.000000000000000000;\r\n edWH11.Visible := False;\r\n edWH11.WidthPercent := 100.000000000000000000;\r\n SetEvent(edWH11, Self, 'OnExit', 'edWH1Exit');\r\n edCred11.SetParentComponent(Self);\r\n edCred11.Name := 'edCred11';\r\n edCred11.Left := 564;\r\n edCred11.Top := 380;\r\n edCred11.Width := 65;\r\n edCred11.Height := 22;\r\n edCred11.TabStop := False;\r\n edCred11.Alignment := taRightJustify;\r\n edCred11.CharCase := wecUpperCase;\r\n edCred11.ChildOrder := 1;\r\n edCred11.Color := clBtnFace;\r\n edCred11.HeightPercent := 100.000000000000000000;\r\n edCred11.ReadOnly := True;\r\n edCred11.Visible := False;\r\n edCred11.WidthPercent := 100.000000000000000000;\r\n edCity12.SetParentComponent(Self);\r\n edCity12.Name := 'edCity12';\r\n edCity12.Tag := 12;\r\n edCity12.Left := 223;\r\n edCity12.Top := 408;\r\n edCity12.Width := 132;\r\n edCity12.Height := 22;\r\n edCity12.CharCase := wecUpperCase;\r\n edCity12.ChildOrder := 1;\r\n edCity12.HeightPercent := 100.000000000000000000;\r\n edCity12.Visible := False;\r\n edCity12.WidthPercent := 100.000000000000000000;\r\n SetEvent(edCity12, Self, 'OnChange', 'edCityChange');\r\n SetEvent(edCity12, Self, 'OnEnter', 'edCityEnter');\r\n SetEvent(edCity12, Self, 'OnKeyUp', 'WebFormKeyUp');\r\n edWages12.SetParentComponent(Self);\r\n edWages12.Name := 'edWages12';\r\n edWages12.Left := 360;\r\n edWages12.Top := 408;\r\n edWages12.Width := 107;\r\n edWages12.Height := 22;\r\n edWages12.Alignment := taRightJustify;\r\n edWages12.CharCase := wecUpperCase;\r\n edWages12.ChildOrder := 1;\r\n edWages12.HeightPercent := 100.000000000000000000;\r\n edWages12.Visible := False;\r\n edWages12.WidthPercent := 100.000000000000000000;\r\n SetEvent(edWages12, Self, 'OnExit', 'edWages1Exit');\r\n edWH12.SetParentComponent(Self);\r\n edWH12.Name := 'edWH12';\r\n edWH12.Left := 472;\r\n edWH12.Top := 408;\r\n edWH12.Width := 87;\r\n edWH12.Height := 22;\r\n edWH12.Alignment := taRightJustify;\r\n edWH12.CharCase := wecUpperCase;\r\n edWH12.ChildOrder := 1;\r\n edWH12.HeightPercent := 100.000000000000000000;\r\n edWH12.Visible := False;\r\n edWH12.WidthPercent := 100.000000000000000000;\r\n SetEvent(edWH12, Self, 'OnExit', 'edWH1Exit');\r\n edCred12.SetParentComponent(Self);\r\n edCred12.Name := 'edCred12';\r\n edCred12.Left := 564;\r\n edCred12.Top := 408;\r\n edCred12.Width := 65;\r\n edCred12.Height := 22;\r\n edCred12.TabStop := False;\r\n edCred12.Alignment := taRightJustify;\r\n edCred12.CharCase := wecUpperCase;\r\n edCred12.ChildOrder := 1;\r\n edCred12.Color := clBtnFace;\r\n edCred12.HeightPercent := 100.000000000000000000;\r\n edCred12.ReadOnly := True;\r\n edCred12.Visible := False;\r\n edCred12.WidthPercent := 100.000000000000000000;\r\n pnLogo.SetParentComponent(Self);\r\n pnLogo.Name := 'pnLogo';\r\n pnLogo.Left := 0;\r\n pnLogo.Top := 0;\r\n pnLogo.Width := 640;\r\n pnLogo.Height := 78;\r\n pnLogo.HeightPercent := 100.000000000000000000;\r\n pnLogo.WidthPercent := 100.000000000000000000;\r\n pnLogo.Align := alTop;\r\n pnLogo.BorderColor := clSilver;\r\n pnLogo.BorderStyle := bsSingle;\r\n pnLogo.ChildOrder := 2;\r\n imgLogo.SetParentComponent(pnLogo);\r\n imgLogo.Name := 'imgLogo';\r\n imgLogo.Left := 0;\r\n imgLogo.Top := 0;\r\n imgLogo.Width := 640;\r\n imgLogo.Height := 78;\r\n imgLogo.WidthStyle := ssAuto;\r\n imgLogo.HeightPercent := 100.000000000000000000;\r\n imgLogo.WidthPercent := 100.000000000000000000;\r\n imgLogo.Align := alClient;\r\n finally\r\n WebLabel1.AfterLoadDFMValues;\r\n WebLabel2.AfterLoadDFMValues;\r\n WebLabel3.AfterLoadDFMValues;\r\n WebLabel4.AfterLoadDFMValues;\r\n WebLabel5.AfterLoadDFMValues;\r\n lbx.AfterLoadDFMValues;\r\n edCity1.AfterLoadDFMValues;\r\n btDone.AfterLoadDFMValues;\r\n edWages1.AfterLoadDFMValues;\r\n edWH1.AfterLoadDFMValues;\r\n edCred1.AfterLoadDFMValues;\r\n edTotalWages.AfterLoadDFMValues;\r\n edTotalWH.AfterLoadDFMValues;\r\n edTotalCredit.AfterLoadDFMValues;\r\n edCity2.AfterLoadDFMValues;\r\n edWages2.AfterLoadDFMValues;\r\n edWH2.AfterLoadDFMValues;\r\n edCred2.AfterLoadDFMValues;\r\n edCity3.AfterLoadDFMValues;\r\n edWages3.AfterLoadDFMValues;\r\n edWH3.AfterLoadDFMValues;\r\n edCred3.AfterLoadDFMValues;\r\n edCity4.AfterLoadDFMValues;\r\n edWages4.AfterLoadDFMValues;\r\n edWH4.AfterLoadDFMValues;\r\n edCred4.AfterLoadDFMValues;\r\n edCity5.AfterLoadDFMValues;\r\n edWages5.AfterLoadDFMValues;\r\n edWH5.AfterLoadDFMValues;\r\n edCred5.AfterLoadDFMValues;\r\n edCity6.AfterLoadDFMValues;\r\n edWages6.AfterLoadDFMValues;\r\n edWH6.AfterLoadDFMValues;\r\n edCred6.AfterLoadDFMValues;\r\n edCity7.AfterLoadDFMValues;\r\n edWages7.AfterLoadDFMValues;\r\n edWH7.AfterLoadDFMValues;\r\n edCred7.AfterLoadDFMValues;\r\n edCity8.AfterLoadDFMValues;\r\n edWages8.AfterLoadDFMValues;\r\n edWH8.AfterLoadDFMValues;\r\n edCred8.AfterLoadDFMValues;\r\n edCity9.AfterLoadDFMValues;\r\n edWages9.AfterLoadDFMValues;\r\n edWH9.AfterLoadDFMValues;\r\n edCred9.AfterLoadDFMValues;\r\n edCity10.AfterLoadDFMValues;\r\n edWages10.AfterLoadDFMValues;\r\n edWH10.AfterLoadDFMValues;\r\n edCred10.AfterLoadDFMValues;\r\n edCity11.AfterLoadDFMValues;\r\n edWages11.AfterLoadDFMValues;\r\n edWH11.AfterLoadDFMValues;\r\n edCred11.AfterLoadDFMValues;\r\n edCity12.AfterLoadDFMValues;\r\n edWages12.AfterLoadDFMValues;\r\n edWH12.AfterLoadDFMValues;\r\n edCred12.AfterLoadDFMValues;\r\n pnLogo.AfterLoadDFMValues;\r\n imgLogo.AfterLoadDFMValues;\r\n end;\r\nend;\r\n\r\nend.","unit PayServiceClient;\r\n\r\ninterface\r\nuses\r\n SysUtils, Classes, JS, Web, WEBLib.Graphics, WEBLib.Controls,\r\n WEBLib.Forms, WEBLib.Dialogs, WEBLib.StdCtrls,\r\n WEBLib.ExtCtrls, XData.Web.Connection, XData.Web.Client,\r\n entForms, entFieldValues, Parameters;\r\n\r\n procedure PayTimerTimer;\r\n procedure DoPayServicePayment;\r\n function FillPayTokens(s: string; reqid: integer; tot: double): string;\r\n\r\n [async]\r\n procedure IsPayServiceComplete; async;\r\n\r\n [async]\r\n function CallSendXData(const req: string): string; async;\t\t// External Call\r\n\r\n [async]\r\n procedure TimedService(paydata: string); async;\r\n\r\n [async]\r\n procedure DoSendPayment(paydata: string; tot: double); async;\r\n [async]\r\n procedure DirectService(paydata: string; tot: double); async;\r\n\r\nimplementation\r\n\r\nuses TransferWeb, ClientConnectionsDM, OptionsDM, ClientCurrent, Utilities;\r\n\r\nvar PayStatus {, HoldPayData}: string;\r\n\t //payparms: TStringParams;\r\n\r\nprocedure DoPayServicePayment;\r\nbegin\r\nend;\r\n\r\nprocedure IsPayServiceComplete;\r\nbegin\r\ndmClientConnections.SendConsoleMessage('Payment Complete');\r\n PayStatus := await(Transfer.CallServicePaymentCompleted('PAYST', Transfer.MessageHeader));\r\nend;\r\n\r\nprocedure PayTimerTimer;\r\nbegin\r\n dmClientConnections.PayTimer.Enabled := false;\r\n // get status, set PayStatus\r\n IsPayServiceComplete;\r\n dmClientConnections.PayTimer.Enabled := true;\r\nend;\r\n\r\nfunction FillPayTokens(s: string; reqid: integer; tot: double): string;\r\n\r\n\tprocedure ReplToken(tkn, val: string);\r\n var p, ln: integer;\r\n begin\r\n \tp := pos(tkn, uppercase(s));\r\n if p > 0 then begin\r\n \tln := length(tkn);\r\n s := copy(s, 1, p-1) + val + copy(s, p+ln, length(s)-p-ln+1);\r\n end;\r\n end;\r\n\r\nbegin\r\n//https://massillonincometax.recoanywhere.io:/url/income-tax?billPayorId=[VENDOR]&productCode=[ServiceCode]&amountDue=[AMOUNT]&PAYERID=[TPID]\r\n\twith PayOpts do begin\r\n ReplToken('[TPID]', inttostr(CurrentTaxpayerID));\r\n ReplToken('[REQUESTID]', inttostr(ReqID));\r\n ReplToken('[AMOUNT]', format('%.2f', [tot]));\r\n ReplToken('[VENDOR]', VendorID);\r\n ReplToken('[CITYACCT]', CityID);\r\n ReplToken('[SVCCODE]', SvcCode);\r\n ReplToken('[SVCNAME]', SvcName);\r\n ReplToken('[KEY]', SKey);\r\n ReplToken('[ALTKEY]', AKey);\r\n ReplToken('[CHKALLOWED]', Allowed);\r\n ReplToken('[SVCINDEX]', SvcIndex);\r\n end;\r\n\tresult := s;\r\nend;\r\n\r\nfunction CallSendXData(const req: string): string;\r\nvar promise: TJSXMLHttpRequest;\r\n s: string;\r\nbegin\r\n\tresult := '';\r\n dmClientConnections.HttpRequest.URL := req;\r\n promise := await(TJSXMLHttpRequest, dmClientConnections.HttpRequest.Perform);\r\n s := XMLSplitValue(promise.ResponseText);\r\n dmClientConnections.SendConsoleMessage('Send External Pay ' +formatdatetime('nn:ss.zzz', now) + ' ' + copy(s, 1, 50));\r\n result := s;\r\nend;\r\n\r\nprocedure TimedService(paydata: string);\r\nvar p, cntr: integer;\r\n\t req, reqid: string;\r\n\r\n procedure OpenPayService;\r\n begin\r\n end;\r\n\r\nbegin\r\n//\tHoldPayData := PayData;\r\ndmClientConnections.SendConsoleMessage('Do Send Payment');\r\n Transfer := TTransfer.create;\r\n req := await(Transfer.CallSendServicePayment('PAYSC', paydata));\r\n p := pos('::', req);\r\n reqid := copy(req, 1, p-1);\r\n req := copy(req, p+2, length(req)-p-1);\r\n // open URL to Pay Service\r\n OpenPayService;\r\n PayStatus := 'S';\r\n dmClientConnections.PayTimer.enabled := false;\r\n dmClientConnections.PayTimer.Interval := 30000;\r\n dmClientConnections.PayTimer.enabled := true;\r\n while PayStatus = 'S' do begin\r\n inc(cntr);\r\n if cntr > 999999999 then\r\n cntr := 0;\r\n end;\r\n dmClientConnections.PayTimer.Enabled := false;\r\n Transfer.free;\r\nend;\r\n\r\nprocedure CCPay(reqid: integer; tot: double);\r\n\r\n procedure GoToCityPort;\r\n var FilledConnStr: string;\r\n begin\r\n // show startmsg\r\n if PayOpts.StartMsg {SiteOpts.PayStartMsg} > '' then\r\n ShowMessage(PayOpts.StartMsg);\t//SiteOpts.PayStartMsg);\r\n // open link\r\n if PayOpts.ConnStr > '' then begin\r\n FilledConnStr := FillPayTokens(PayOpts.ConnStr, reqid, tot);\r\n// ShowMessage('Conn String: ' + FilledConnStr);\r\n Application.Navigate(FilledConnStr, ntBlank);\r\n end;\r\n // show aftermsg\r\n if PayOpts.AfterMsg {SiteOpts.PayAfterMsg} > '' then\r\n ShowMessage(PayOpts.AfterMsg);\t\t//SiteOpts.PayAfterMsg);\r\n end;\r\n\r\n procedure CallServiceAndWait;\r\n begin\r\n // tell Server - already done in CreatePayment\r\n\r\n // call Service WebPage\r\n\r\n // set up polling\r\n\r\n end;\r\n\r\nbegin\r\n case IndexInList(PayOpts.SvcMethod, 'CP|DP|SC|') of\r\n 1: GoToCityPort;\r\n 2: GoToCityPort;\r\n 3: CallServiceAndWait;\r\n end;\r\nend;\r\n\r\nprocedure DirectService(paydata: string; tot: double);\r\nvar s: string;\r\n reqid: integer;\r\n req, res: string;\r\nbegin\r\n // Test: for OhioDemo:\r\n // https://demo.ohiocitytax.com/PayServiceTest.html?O&PTPID=12345&PREQ=98765&PAMT=55.00\r\n with PayOpts do begin\r\n // Send to server to create ServicePayment and PayData\r\n s := await(DoSendData('PAYDP', 'P', paydata));\r\n//ShowMessage('Request: ' + s);\r\n reqid := strtointdef(s, 0);\r\n // Then call Service\r\n req := FillPayTokens(ConnStr, reqid, tot);\r\n//ShowMessage(req + ' ' + inttostr(reqid));\r\n res := await(CallSendXData(req));\r\n CCPay(reqid, tot);\r\n end;\r\nend;\r\n\r\nprocedure DoSendPayment(paydata: string; tot: double);\r\nvar req, meth: string;\r\n\r\n procedure PortalService;\r\n var s, res: string;\r\n begin\r\n \t// City Portal: just redirect\r\n \twith PayOpts do begin\r\n \t\treq := FillPayTokens(ConnStr, 0, tot);\r\n// bch\t res := CallSendXData(req);\r\n\t\t\tCCPay(0, tot);\r\n end;\r\n end;\r\n\r\nbegin\r\n//\tpayparms := TStringParamArray.create(20, 15, '__', '|');\t\t// default #13#10, '|'\r\n// payparms.asString := paydata;\r\n meth := PayOpts.SvcMethod;\r\n\tif meth = 'SC' then\r\n \tTimedService(paydata)\r\n else if meth = 'CP' then\r\n \tPortalService\r\n else if meth = 'DP' then\r\n \tDirectService(paydata, tot);\r\n// payparms.free;\r\nend;\r\n\r\nend.\r\n","unit FieldPanelFactory;\r\n\r\ninterface\r\nuses\r\n SysUtils, Classes, JS, Web, WEBLib.Graphics, WEBLib.Controls,\r\n WEBLib.Forms, WEBLib.Dialogs, WEBLib.StdCtrls,\r\n WEBLib.ExtCtrls, XData.Web.Connection, XData.Web.Client,\r\n entForms, entFieldValues, Parameters;\r\n\r\nprocedure ShowEData(msg: string);\r\n\r\ntype\r\n TWFieldPanel = class\r\n pntype, condition: string;\r\n panelorder, groupindex, lft, spc: integer;\r\n pnl: TPanel;\r\n end;\r\n\r\n TWPanelControl = class\r\n private\r\n public\r\n PanControl: TWinControl;\r\n wpfldndx, wppnlndx, ctrltype: integer;\r\n Enterable: boolean;\r\n procedure FieldValueToControl(fv: integer);\r\n\t procedure ControlToFieldValue(fv: integer);\r\n end;\r\n\r\n TMultGroupHandler = class\r\n//\t\t procedure GroupButtonClick(Sender: TObject);\r\n\t\t procedure SaveBtnClick(Sender: TObject);\r\n\t\t procedure AnotherBtnClick(Sender: TObject);\r\n\t\t procedure CancelBtnClick(Sender: TObject);\r\n private\r\n procedure EntryDone;\r\n procedure SaveEntryData;\r\n public\r\n EntryFields: array[0..20] of TFields;\r\n\t EntryPanels: array[0..25] of TWFieldPanel;\r\n \t EntryControls: array[0..20] of TWPanelControl;\r\n CurrGroup, CurrIndex, MaxIndex, nEntryFields, nEntryControls: integer;\r\n Own: TForm;\r\n ParentPanel, HidePanel, EntryPanel: TPanel;\r\n SaveBtn, AnotherBtn, CancelBtn: TButton;\r\n Ctrl: TWinControl;\r\n HoldHeight: integer;\r\n FixedSize: boolean;\r\n procedure Clear;\r\n procedure InitHandler(Sender: TForm; pnl, pnHide: TPanel; gp, mx: integer);\r\n \t procedure ShowGroupPanelEntry;\r\n procedure HideGroupPanelEntry;\r\n procedure AddGroup;\r\n procedure EditGroup;\r\n function MatchingGroup(gp: integer): integer;\r\n procedure DeleteGroup;\r\n procedure CreatePayment(tg: integer);\r\n procedure SetEntryTags;\r\n procedure FieldValuesToEntry;\r\n procedure EntryToFieldValues;\r\n procedure AddControl(cntrl: TWinControl; fieldndx, pnndx, enttype: integer);\r\n\t\t function MatchingControl(tg: integer; out contype: integer): TWinControl;\r\n function MatchingFieldIndex(cont: TWinControl): integer;\r\n constructor Create;\r\n destructor Destroy; override;\r\n end;\r\n\r\n TMultGroupHandlers = class\r\n\t\tprocedure GroupButtonClick(Sender: TObject);\r\n\t\tprocedure OCCButtonClick(Sender: TObject);\r\n private\r\n fHandlers: array[1..3] of TMultGroupHandler;\r\n nHandlers, fTOrder: integer;\r\n function gCurrHandler: TMultGroupHandler;\r\n function gHandler(index: integer): TMultGroupHandler;\r\n public\r\n \tCurrent: integer;\r\n InEGoTo: boolean;\r\n \tproperty CurrentHandler: TMultGroupHandler read gCurrHandler;\r\n \tproperty Count: integer read nHandlers write nHandlers;\r\n property Handlers[index: integer]: TMultGroupHandler read gHandler; default;\r\n procedure AddHandler(Sender: TForm; pnl, pnHide: TPanel; gp, mx: integer);\r\n procedure GoToOrder(order: integer);\r\n procedure StoreData;\r\n procedure FillEntryControls;\r\n function MatchingControl(tg: integer; out contype: integer): TWinControl;\r\n function MatchingFieldIndex(cont: TWinControl): integer;\r\n function NextOrder: integer;\r\n procedure Reset;\r\n procedure AssignEvents;\r\n procedure Recalc;\r\n\t\tprocedure PayClick(Sender: TObject);\r\n procedure HandleOCC;\r\n constructor Create;\r\n destructor Destroy; override;\r\n end;\r\n\r\nprocedure ResetPanelFactory;\r\nfunction StartingPanel(Sender: TForm; cap: string; ord: integer; fontsz: integer): integer;\r\nfunction StartingGroupPanel(Sender: TForm; cap: string; ord, gndx, fontsz, pht: integer): integer;\r\nfunction StartingEntryPanel(Sender: TForm; cap: string; ord, gndx, fontsz, pht: integer): integer;\r\nfunction PanelByField(Sender: TForm; fldndx: integer; val: TFieldValue): integer;\r\nfunction EntryPanelByField(Sender: TForm; fldndx: integer; val: TFldValue; gndx, fontsz, pht: integer): integer;\r\nprocedure AddPanelControl(Sender: TForm; fldndx: integer; stval: string; gpndx: integer=0; wid: integer=0; EntryMode: boolean=false);\r\nprocedure DeleteFieldPanel(pnlndx: integer);\r\nfunction RemoveGroupPanel(wgndx: integer): integer;\r\nprocedure ReOrderPanels;\r\n\r\nprocedure AddEditControl(Sender: TForm; pnndx, fldndx: integer; startval: string; dtype: string; EntryMode: boolean; fontsz: integer; elem: string; wid: integer);\r\nprocedure AddCalcControl(Sender: TForm; pnndx, fldndx: integer; startval: string; dtype: string; EntryMode: boolean; fontsz: integer; elem: string; wid: integer);\r\nprocedure AddCheckBoxControl(Sender: TForm; pnndx, fldndx: integer; startval: string; EntryMode: boolean; fontsz: integer; elem: string; wid: integer);\r\nprocedure AddRadioGroupControl(Sender: TForm; pnndx, fldndx: integer; startval: string; Choices: string; EntryMode: boolean; fontsz: integer; elem: string; wid: integer);\r\nprocedure AddComboBoxControl(Sender: TForm; pnndx, fldndx: integer; startval: string; Choices: string; EntryMode: boolean; fontsz: integer; elem: string; wid: integer);\r\nprocedure AddDateControl(Sender: TForm; pnndx, fldndx: integer; startval: string; EntryMode: boolean; fontsz: integer; elem: string; wid: integer);\r\nprocedure MessageControl(Sender: TForm; pnndx, fldndx: integer; EntryMode: boolean; fontsz: integer; elem: string; wid: integer);\r\nprocedure CaptionOnly(Sender: TForm; pnndx, fldndx: integer; cap: string; EntryMode: boolean; fontsz: integer; elem: string; wid: integer);\r\nprocedure AddButtonControl(Sender: TForm; pnndx, fldndx: integer; EntryMode: boolean; elem: string; wid: integer);\r\nprocedure AddLinkControl(Sender: TForm; pnndx, fldndx: integer; cap: string; EntryMode: boolean; fontsz: integer; elem: string; wid: integer);\r\n\r\nprocedure SetGroupHeadingPanel(Sender: TForm; pnndx, fldndx: integer; gp: integer; elem: string);\r\nprocedure AddFieldPanelControl(cntrl: TWinControl; pnndx, fieldndx: integer; enttype: integer; EntryMode: boolean);\r\nfunction GetPageWidth: integer;\r\n\r\nprocedure DisplayLoaded;\r\n\r\nvar\r\n FieldPanels: array[0..50] of TWFieldPanel;\r\n FieldControls: array[0..100] of TWPanelControl;\r\n nFieldPanels, nFieldControls, nMultGroups, CurrSectionColor, CurrGroupColor, CurrEntryColor: integer;\r\n GroupHandlers: TMultGroupHandlers;\r\n\r\nimplementation\r\n\r\nuses entReturns, Return, OCCForm, OptionsDM, ClientCurrent, Formulas, SectionPanels, ClientConnectionsDM,\r\n\tMain, Verification, TransferWeb, PayServiceClient, Utilities;\r\n\r\nvar number: integer;\r\n lbl: TLabel;\r\n// cntrl: TWinControl;\r\n{\r\nDataType\r\n0\tString\r\n1\tCurrency\r\n2\tInteger\r\n3\tDate\r\n4\tBlank?\r\n5 ShortString\r\n6 DecimalFloat\r\n7 MediumString\r\n for buttons only:\r\nA Add\r\nD Delete\r\nE Edit\r\n\r\nEntry Type\r\n0\tEdit\r\n1\tCombo\r\n2\tOtherCities\r\n3\tMessage\r\n4\tCalculated Currency\r\n5\tCheckbox\r\n6 Date Picker\r\n7 3-Field\r\n8 Group Heading\r\n9 Button\r\nL Link\r\n\r\nRequired\r\nY\r\nN\r\n\r\n}\r\n\r\n procedure ShowField(when: string);\r\n\tbegin\r\n{\tvar fv, nControl: integer;\r\n \t s: string;\r\n begin\r\n for fv := 0 to FieldValues.Count-1 do begin\r\n nControl := FieldValues[fv].GroupEditControl;\r\n if (nControl >= 0) then begin\r\n s := ' << ' + when + inttostr(fv) + ':' + inttostr(nControl) + ' | ' + FieldValues[fv].FieldValue.asString;\r\n s := s + GroupHandlers.CurrentHandler.EntryControls[nControl].PanControl.name;\r\n\t nControl := FieldValues[fv].ControlIndex;\r\n \t if nControl >= 0 then\r\n\t s := s + ' | ' + FieldControls[nControl].PanControl.name;\r\n s := s + ' >> ';\r\n end;\r\n end;\r\n wReturn.DebugMessage('(' + s + ')');\r\n}\r\n end;\r\n\r\nprocedure TMultGroupHandler.AddControl(cntrl: TWinControl; fieldndx, pnndx, enttype: integer);\r\nbegin\r\n EntryControls[nEntryControls] := TWPanelControl.create;\r\n EntryControls[nEntryControls].PanControl := cntrl;\r\n EntryControls[nEntryControls].wpfldndx := fieldndx;\r\n EntryControls[nEntryControls].wppnlndx := pnndx;\r\n EntryControls[nEntryControls].ctrltype := enttype;\r\n EntryControls[nEntryControls].Enterable :=\r\n \t not (enttype in [3,4,7,8]) and (WebFields[fieldndx].Entryable);\r\n\tinc(nEntryControls);\r\nend;\r\n\r\nprocedure TMultGroupHandler.AddGroup;\r\nbegin\r\n CurrIndex := AddMGroupFieldsToFieldValues(CurrGroup);\r\n // Now tie FieldValues to Controls in Entry\r\n SetEntryTags;\r\n\tFieldValuesToEntry;\r\n ShowGroupPanelEntry;\r\nend;\r\n\r\nprocedure TMultGroupHandler.CancelBtnClick(Sender: TObject);\r\nbegin\r\n//\r\nend;\r\n\r\nconstructor TMultGroupHandler.Create;\r\nbegin\r\n\tnEntryFields := 0;\r\n\tnEntryControls := 0;\r\nend;\r\n\r\nprocedure TMultGroupHandler.CreatePayment(tg: integer);\r\nvar spa: TStringParamArray;\r\n\t s, EFTStr, meth, rout, acct, aname, atype: string;\r\n g, gp, ln: integer;\r\n fnd: boolean;\r\n tot: currency;\r\n\r\n procedure AddLineData(ndx: integer);\r\n var i, fndx, cnt: integer;\r\n \t amt: currency;\r\n res: string;\r\n arr: array[0..24] of string;\r\n\r\n procedure AddToSPA(dat: string);\r\n begin\r\n \tinc(ln);\r\n spa[ln] := EFTStr + dat;\r\n end;\r\n\r\n begin\r\n res := '';\r\n amt := 0;\r\n for i := 0 to FieldValues.Count-1 do with FieldValues[i] do begin\r\n if (LineType = 'P') and (FieldValue.AnyValue) and (ndx = GroupIndex) then begin\r\n fndx := FindFieldsIndex(WebFormID, WebFieldID);\r\n if (fndx >= 0) and (WebFields[fndx].WriteOut) then begin\r\n \tif LineCode = 'PAAMT' then begin\r\n \tamt := FieldValue.AsCurrency;\r\n end;\r\n \tres := res + DataPair(false) + '|';\r\n end;\r\n end;\r\n end;\r\n if amt > 0 then begin\r\n \ttot := tot + amt;\r\n \tfnd := true;\r\n if (Recons <> nil) and Recons.Active then begin\r\n \tRecons.FillPaymentDetail(arr, cnt, res);\r\n for i := 0 to cnt-1 do begin\r\n \tAddToSPA(arr[i]);\r\n end;\r\n end\r\n else\r\n \tAddToSPA(res);\r\n end;\r\n end;\r\n\r\n procedure ClearPayment;\r\n var i: integer;\r\n begin\r\n if (Recons <> nil) and Recons.Active then begin\r\n \tRecons.ClearPayments;\r\n DoSendData('SAVEWH', 'XH4', '');\t\t//Taxpayer, Recon, Lines\r\n end;\r\n for i := 0 to FieldValues.Count-1 do with FieldValues[i] do begin\r\n if (LineType = 'P') and (FieldValue.AnyValue) then begin\r\n if LineCode = 'PAAMT' then\r\n FieldValue.AsCurrency := 0;\r\n end;\r\n end;\r\n end;\r\n\r\nbegin\r\n\tfnd := false;\r\n\tspa := TStringParamArray.create(20, 15, '__', '|');\t\t// default #13#10, '|'\r\n\tif tg = 10 then meth := 'EF'\r\n else meth := 'CR';\t//PayOpts.SvcMethod;\t\t// CP/DP/SC\r\n// else if PayOpts.SvcMethod {SiteOpts.PayMeth} = 'CP' then meth := 'CP'\t// City Portal\r\n// else meth := 'CR';\r\ndmClientConnections.SendConsoleMessage('Create Payment: ' + meth);\r\n// loop thru fldvalues writing any lines with amount > 0\r\n EFTStr := 'TRANSNO=' + inttostr(CurrentTransaction) + '|METHOD=' + meth + '|';\r\n if meth = 'EF' then begin\r\n rout := FieldValues.GetByLineCodeS('BKRT');\r\n acct := FieldValues.GetByLineCodeS('BKAC');\r\n atype := FieldValues.GetByLineCodeS('BATY');\r\n aname := FieldValues.GetByLineCodeS('BKNM');\r\n EFTStr := EFTStr + 'BKRT=' + rout + '|' + 'BKAC=' + acct + '|' +\r\n 'BATY=' + atype + '|' + 'BKNM=' + aname + '|';\r\n end\r\n else\r\n \tmeth := PayOpts.SvcMethod;\t\t// CP/DP/SC\r\n\r\n ln := 0;\r\n tot := 0;\r\n for gp := 0 to nWebGroups-1 do begin\r\n if (WebGroups[gp].MultAllowed = 'Y') and (WebGroups[gp].LineID = 'P') then begin\r\n for g := 1 to FieldValues.MaxGroupIndex(WebGroups[gp].WebGroupID) do\r\n AddLineData(g);\r\n end;\r\n end;\r\n if fnd then begin\r\n\t spa.nParams := ln;\r\n \ts := spa.asString;\r\n if meth = 'EF' then begin\r\n\t\t DoSendData('PAYEF', 'P', s);\r\n \t \tShowMessage('ACH Payment Accepted for ' + format('%m', [FieldValues.GetByLineCodeV('PATOT')]) +\r\n\t\t\t '. Thank you for your payment. Your balance due will be updated once the transaction is successfully processed, ' +\r\n 'which may take up to 3-5 business days.');\r\n end\r\n else begin\r\n \tDoSendPayment(s, tot)\r\n end;\r\n \tClearPayment;\r\n end;\r\n spa.free;\r\nend;\r\n\r\nprocedure TMultGroupHandler.DeleteGroup;\r\n//var s: array[1..2, 1..10] of string;\r\n\r\n{ procedure WriteOutGroupInfo(ndx: integer);\r\n\tvar fv, i: integer;\r\n \t outstr: string;\r\n begin\r\n for i := 1 to 10 do s[ndx, i] := '';\r\n for fv := 0 to FieldValues.Count-1 do with FieldValues[fv] do begin\r\n \tif (WebGroupID = 1) and (GroupIndex <> 0) then\r\n \ts[ndx, GroupIndex] := s[ndx, GroupIndex] + inttostr(fv)+'|'+ FieldValues[fv].asShortString + '/';\r\n end;\r\n \toutstr := '';\r\n \tfor i := 1 to 10 do if s[ndx, i] > '' then\r\n \toutstr := outstr + inttostr(ndx) + '-' + s[ndx, i] + '[CRLF]';\r\n// dmClientConnections.SendConsoleMessage(outstr);\r\n end;\r\n\r\n procedure WriteDifferences;\r\n var i: integer;\r\n outstr: string;\r\n begin\r\n\t\toutstr := '';\r\n \tfor i := 1 to 10 do\r\n \tif s[1, i] <> s[2, i] then\r\n \toutstr := outstr + s[1, i] + '[CRLF]' + s[2, i] + '[CRLF]';\r\n// dmClientConnections.SendConsoleMessage(outstr);\r\n end;\r\n}\r\nbegin\r\n // Delete this index, move following ones up in FieldValues\r\n// WriteOutGroupInfo(1);\r\n\tFieldValues.DeleteOneMultGroup(CurrGroup, CurrIndex);\r\n// WriteOutGroupInfo(2);\r\n// WriteDifferences;\r\n // clear controls or redraw\r\n RedrawGroup(Own, MainSectionPanel, MatchingGroup(CurrGroup));\r\n // update CurrIndex\r\n CurrIndex := 0;\r\nend;\r\n\r\ndestructor TMultGroupHandler.Destroy;\r\nbegin\r\n\tClear;\r\n\r\n inherited;\r\nend;\r\n\r\nprocedure TMultGroupHandler.EditGroup;\r\n//var gh: TMultGroupHandlers;\r\nbegin\r\n\t// fill fields from current index\r\n//gh := GroupHandlers;\r\n//dmClientConnections.SendConsoleMessage(format('B: %d/%d/%d/%d', [gh.Current, gh[gh.Current].CurrIndex, gh.CurrentHandler.CurrIndex, CurrIndex]));\r\n ShowField('Before');\r\n SetEntryTags;\r\n//dmClientConnections.SendConsoleMessage(format('C: %d/%d/%d/%d', [gh.Current, gh[gh.Current].CurrIndex, gh.CurrentHandler.CurrIndex, CurrIndex]));\r\n ShowField('After Tags');\r\n\tFieldValuesToEntry;\r\n//dmClientConnections.SendConsoleMessage(format('D: %d/%d/%d/%d', [gh.Current, gh[gh.Current].CurrIndex, gh.CurrentHandler.CurrIndex, CurrIndex]));\r\n ShowField('After ToEntry');\r\n ShowGroupPanelEntry;\r\n//dmClientConnections.SendConsoleMessage(format('E: %d/%d/%d/%d', [gh.Current, gh[gh.Current].CurrIndex, gh.CurrentHandler.CurrIndex, CurrIndex]));\r\n ShowField('After ShowEntry');\r\nend;\r\n\r\nprocedure TMultGroupHandler.EntryToFieldValues;\r\nvar ec, fv, cndx: integer;\r\n wctrl: TWPanelControl;\r\nbegin\r\n\tfor ec := 0 to nEntryControls-1 do begin\r\n for fv := 0 to FieldValues.Count-1 do with FieldValues[fv] do begin\r\n if (WebFormID = CurrentFormID) and (WebFieldID = WebFields[EntryControls[ec].wpfldndx].WebFieldID) and\r\n \t (WebGroupID = CurrGroup) and (GroupIndex = CurrIndex) then begin\r\n \tEntryControls[ec].ControlToFieldValue(fv);\r\n//ShowField('After Each');\r\n cndx := FieldValues[fv].ControlIndex;\r\n if (cndx >= 0) and (cndx < nFieldControls) then begin\r\n wctrl := FieldControls[cndx];\r\n wctrl.FieldValueToControl(fv);\r\n end;\r\n end;\r\n\t\tend;\r\n end;\r\nShowField('After EntryToFV');\r\nend;\r\n\r\nprocedure TMultGroupHandler.HideGroupPanelEntry;\r\nbegin\r\n EntryPanel.Visible := false;\r\n HidePanel.Visible := true;\r\n EntryPanel.Parent.height := HoldHeight;\r\nend;\r\n\r\nprocedure TMultGroupHandlers.GroupButtonClick(Sender: TObject);\r\n//procedure TMultGroupHandler.GroupButtonClick(Sender: TObject);\r\nvar gp, hand, typ, tg: integer;\r\n\t btn: TButton;\r\nbegin\r\n\t// {gp:2}{handler:1}{gpindex:2}{btntyp:1}\r\n\tbtn := Sender as TButton;\r\n tg := btn.tag;\r\n gp := tg div 10000;\r\n tg := tg mod 10000;\r\n hand := tg div 1000;\r\n tg := tg mod 1000;\r\n typ := tg mod 10;\r\n with GroupHandlers[hand] do begin\r\n CurrIndex := tg div 10;\r\n CurrGroup := gp;\r\n//dmClientConnections.SendConsoleMessage(format('A:%d/%d/%d', [hand, GroupHandlers[hand].CurrIndex, CurrentHandler.CurrIndex]));\r\n case typ of\r\n 1: AddGroup;\r\n 2: EditGroup;\r\n 3: DeleteGroup;\r\n 9: //if ActiveForm = wReturn then\r\n \tShowReturnScreen(btn.hint);\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TMultGroupHandlers.HandleOCC;\r\nvar lw2wages: double;\r\nbegin\r\n\t//(GroupIndex) or CurrIndex\r\n GroupHandlers.CurrentHandler.EntryToFieldValues;\r\n//dmClientConnections.SendConsoleMessage(format('B:%d/%d/%d', [GroupHandlers.Current, GroupHandlers[GroupHandlers.Current].CurrIndex, CurrentHandler.CurrIndex]));\r\n\tlW2Wages := FieldValues.GetByLineCodeV('LW2WAGES', CurrentHandler.CurrIndex, 0);\r\n if lW2Wages > 1 then begin\r\n \tShowOCC(CurrentHandler.CurrIndex);\r\n // refresh occredit\r\n end\r\n else\r\n \tShowMessage('Wages are required before Other City Detail');\r\nend;\r\n\r\nprocedure TMultGroupHandler.InitHandler(Sender: TForm; pnl, pnHide: TPanel; gp, mx: integer);\r\nvar pn: TPanel;\r\n\r\n procedure SetButton(btn: TButton; lft: integer; cap: string; click: TNotifyEvent; tb: integer);\r\n begin\r\n Btn := TButton.create(Sender);\r\n Btn.Parent := pn;\r\n btn.Top := 2;\r\n btn.Width := 100;\r\n btn.Left := lft;\t//275;\r\n btn.Caption := cap;\r\n btn.TabStop := true;\r\n btn.TabOrder := 400 + 100*GroupHandlers.Current + 90 + tb;\r\n btn.OnClick := click;\r\n\t inc(number);\r\n btn.Name := 'entbtn' + inttostr(number);\r\n end;\r\n\r\nbegin\r\n CurrGroup := gp;\r\n CurrIndex := 0;\r\n MaxIndex := mx;\r\n FixedSize := (mx > 20);\r\n nEntryFields := 0;\r\n nEntryControls := 0;\r\n Own := Sender;\r\n ParentPanel := pnl;\r\n HidePanel := pnHide;\r\n \tEntryPanel := TPanel.create(Sender);\r\n EntryPanel.visible := false;\r\n EntryPanel.Parent := ParentPanel;\r\n EntryPanel.Height := 32;\r\n EntryPanel.Align := alTop;\r\n EntryPanel.BorderStyle := bsSingle;\r\n EntryPanel.ShowCaption := false;\r\n EntryPanel.Tag := nMultGroups;\r\n EntryPanel.Visible := false;\r\n\tMainEntryPanel.AssignSectionPanel(EntryPanel, 0, 0, 500);\r\n \tpn := TPanel.create(Sender);\r\n pn.Parent := EntryPanel;\r\n pn.Height := 30;\r\n pn.Align := alBottom;\r\n pn.BorderStyle := bsNone;\r\n pn.ShowCaption := false;\r\n if CurrEntryColor > 0 then pn.Color := CurrEntryColor;\r\n SetButton(SaveBtn, 20, 'Done', @SaveBtnClick, 1);\r\n if not FixedSize then\r\n \t\tSetButton(AnotherBtn, 124, 'Add Another', @AnotherBtnClick, 2);\r\n// SetButton(CancelBtn, 24, 'Cancel', @CancelBtnClick);\r\nend;\r\n\r\nfunction TMultGroupHandler.MatchingGroup(gp: integer): integer;\r\nvar i: integer;\r\nbegin\r\n result := -1;\r\n for i := 0 to nWebGroups-1 do\r\n if gp = WebGroups[i].WebGroupID then\r\n result := i;\r\nend;\r\n\r\nfunction TMultGroupHandler.MatchingControl(tg: integer; out contype: integer): TWinControl;\r\nbegin\r\n\t// tg is controls index, but type is only stored in the webpanel\r\n result := nil;\r\n if tg >= 0 then begin\r\n \tresult := EntryControls[tg].PanControl;\r\n contype := EntryControls[tg].ctrltype;\r\n end;\r\nend;\r\n\r\nfunction TMultGroupHandler.MatchingFieldIndex(cont: TWinControl): integer;\r\nvar i: integer;\r\nbegin\r\n\tresult := -1;\r\n for i := 0 to nEntryControls-1 do with EntryControls[i] do\r\n \tif PanControl = cont then\r\n \t\tresult := wpfldndx;\r\nend;\r\n\r\nprocedure TMultGroupHandler.Clear;\r\nvar i: integer;\r\nbegin\r\n\tfor i := 0 to nEntryFields-1 do begin\r\n EntryFields[i].free;\r\n// EntryValues[i].free;\r\n end;\r\n if HidePanel <> nil then HidePanel.visible := true;\r\n CurrGroup := 0;\r\n CurrIndex := 0;\r\n MaxIndex := 0;\r\n nEntryFields := 0;\r\n Own := nil;\r\n SaveBtn.free;\r\n CancelBtn.free;\r\n if Assigned(EntryPanel) then begin\r\n \tEntryPanel.free;\r\n EntryPanel := nil;\r\n end;\r\nend;\r\n\r\nprocedure ShowEData(msg: string);\r\nvar fndx, {i,} ctrl: integer;\r\n\t ShowVal: string;\r\nbegin\r\n showval := '';\r\n for fndx := 0 to FieldValues.Count-1 do with FieldValues[fndx] do begin\r\n \tif webfieldid = 56 then begin\r\n \tShowVal := ShowVal + format('%d/%d/%d/%d:%d/%d:%s / ', [fndx, webfieldid, webgroupid, groupindex, ControlIndex, GroupEditControl, FieldValue.asString]);\r\n ctrl := ControlIndex;\r\n showval := showval + #13 + inttostr(FieldControls[ctrl].wpfldndx) + #13;\r\n end;\r\n// \tif GroupIndex > 0 then\r\n// \tShowVal := ShowVal + format('%d/%d/%d/%d:%d/%d:%s / ', [fndx, webfieldid, webgroupid, groupindex, ControlIndex, GroupEditControl, FieldValue.asString]);\r\n end;\r\n if showval > '' then\r\n \tShowMessage(msg + ': ' + showval);\r\nend;\r\n\r\n\r\nprocedure TMultGroupHandler.AnotherBtnClick(Sender: TObject);\r\nbegin\r\n\tif EventActions.VerifyPage(0) then begin\r\n\t\tSaveEntryData;\r\n \tAddGroup;\r\n end;\r\nend;\r\n\r\nprocedure TMultGroupHandler.SaveBtnClick(Sender: TObject);\r\n//var ndx: integer;\r\nbegin\r\n\tif EventActions.VerifyEntryPage then begin\r\nShowField('Save');\r\n\t\tSaveEntryData;\r\n if (Recons <> nil) and Recons.Active then begin\r\n\t \t//ndx := Recons.Find(ActiveWHYear);\r\n \t Recons.LoadData;\t//ReconArr[ndx].ReadFromFieldValues;\r\n DoSendData('SAVEWH', 'XH4', '');\r\n end;\r\nShowField('Before Done');\r\n \tEntryDone;\r\nShowField('After Done');\r\n\tend;\r\nend;\r\n\r\nprocedure TMultGroupHandler.SaveEntryData;\r\nbegin\r\nShowField('Save Entry');\r\n\tEntryToFieldValues;\r\nShowField('After EntryTo');\r\n HideGroupPanelEntry;\r\nShowField('After Hide');\r\n GroupHandlers.Recalc;\r\nShowField('After GH Recalc');\r\nend;\r\n\r\nprocedure TMultGroupHandler.EntryDone;\r\nbegin\r\n RedrawGroup(Own, MainSectionPanel{HidePanel}, MatchingGroup(CurrGroup));\r\n CalcAllFormulas;\r\n EventActions.LoadData;\r\n EventActions.InGoTo := 1;\r\n EventActions.GoToOrder;\r\n EventActions.InGoTo := 0;\r\nend;\r\n\r\nprocedure TMultGroupHandler.SetEntryTags;\r\nvar i, ndx, fn, fld, cndx: integer;\r\n\t c: TWPanelControl;\r\nbegin\r\n// for FieldValues for Current Group Index and matching FieldID set control\r\n\tFieldValues.ClearEntryTags;\r\n\tfor i := 0 to nEntryControls-1 do begin\r\n \tc := EntryControls[i];\r\n fn := c.wpfldndx;\r\n fld := WebFields[fn].WebFieldID;\r\n cndx := CurrIndex;\r\n\t\tndx := FieldValues.FindIndex(CurrentFormID, cndx, 0, fld);\r\n \tif ndx >= 0 then\r\n \tFieldValues[ndx].GroupEditControl := i;\r\n end;\r\nend;\r\n\r\nprocedure TMultGroupHandler.FieldValuesToEntry;\r\nbegin\r\n\tFieldValues.SetEntryControls;\r\nend;\r\n\r\nprocedure TMultGroupHandler.ShowGroupPanelEntry;\r\nbegin\r\n\tHoldHeight := EntryPanel.Parent.Height;\r\n HidePanel.Visible := false;\r\n EntryPanel.Visible := true;\r\n EntryPanel.Parent.height := EntryPanel.Top + EntryPanel.height + 4; //tp + 12;\r\n MainEntryPanel.PanelHeight := EntryPanel.Height;\r\n\tSetMainPanelHeight;\r\nend;\r\n\r\nprocedure ResetPanelFactory;\r\nvar i: integer;\r\nbegin\r\n\t// remove all Field Panels\r\n for i := 0 to nFieldPanels-1 do with FieldPanels[i] do begin\r\n \t// Fill FieldValues\r\n\t\t // set ControlIndex to -1 for all fieldvalues\r\n\r\n if Assigned(FieldPanels[i]) then begin\t// should never get here as nil, but somehow did\r\n\t // Free;\r\n \t if Assigned(FieldPanels[i].pnl) then\r\n \t\tFieldPanels[i].pnl.free;\r\n\t FieldPanels[i].free;\r\n end;\r\n FieldPanels[i] := nil;\r\n end;\r\n nFieldPanels := 0;\r\n nFieldControls := 0;\r\n CurrSectionColor := 0;\r\n CurrGroupColor := 0;\r\n CurrEntryColor := 0;\r\n FieldValues.ClearControlTags;\r\n GroupHandlers.Reset;\r\n\tnumber := 0;\r\nend;\r\n\r\nprocedure AddPanelControl(Sender: TForm; fldndx: integer; stval: string; gpndx: integer=0; wid: integer=0; EntryMode: boolean=false);\r\nvar enttyp: char;\r\n \t pnndx: integer;\r\n fld: TFields;\r\nbegin\r\n fld := WebFields[fldndx];\r\n\tif EntryMode then pnndx := GroupHandlers.CurrentHandler.nEntryFields-1\r\n else pnndx := nFieldPanels-1;\r\n\twith fld do begin\r\n \tenttyp := EntryType[1];\r\n if (enttyp = '0') and (DataType = '3') then enttyp := '6';\r\n \tcase enttyp of\r\n '0':\tAddEditControl(Sender, pnndx, fldndx, stval, DataType, EntryMode, fld.FontSize, fld.Element, wid);\r\n '1': AddComboBoxControl(Sender, pnndx, fldndx, stval, ValidValues, EntryMode, fld.FontSize, fld.Element, wid);\r\n '2': begin end;\t//\tOtherCities\r\n '3': MessageControl(Sender, pnndx, fldndx, EntryMode, fld.FontSize, fld.Element, wid);\r\n '4': AddCalcControl(Sender, pnndx, fldndx, stval, DataType, EntryMode, fld.FontSize, fld.Element, wid);\r\n '5': AddCheckBoxControl(Sender, pnndx, fldndx, stval, EntryMode, fld.FontSize, fld.Element, wid);\r\n '6': AddDateControl(Sender, pnndx, fldndx, stval, EntryMode, fld.FontSize, fld.Element, wid);\r\n '7': CaptionOnly(Sender, pnndx, fldndx, fld.Question, EntryMode, fld.FontSize, fld.Element, WebGroups[gpndx].ColumnWidths[1]);\r\n '8': SetGroupHeadingPanel(Sender, pnndx, fldndx, strtointdef(fld.Condition, 0), fld.Element);\r\n '9': AddButtonControl(Sender, pnndx, fldndx, EntryMode, fld.Element, wid);\r\n 'L': AddLinkControl(Sender, pnndx, fldndx, fld.Question, EntryMode, fld.FontSize, fld.Element, wid);\r\n end;\r\n if (enttyp <> '3') and (enttyp <>'7') and (ShortHelpText > ' ') then begin\r\n \tif not EntryMode then begin\r\n\t FieldControls[nFieldControls-1].PanControl.Hint := ShortHelpText;\r\n \t FieldControls[nFieldControls-1].PanControl.ShowHint := true;\r\n end\r\n else with GroupHandlers.CurrentHandler do begin \t// pnndx still valid from above\r\n\t EntryControls[pnndx-1].PanControl.Hint := ShortHelpText;\r\n \t EntryControls[pnndx-1].PanControl.ShowHint := true;\r\n end;\r\n end;\r\n{\t\tif not (enttyp in [3,7,8,9]) then begin\r\n \tif not EntryMode then begin\r\n\t FieldControls[nFieldControls-1].PanControl.Hint :=\r\n \t format('%d:%d:%d:%d:%s',\r\n [nFieldControls-1, pnndx-1, fldndx, WebFieldID, FieldValues.GetValue(WebFormID, gpndx, 0, WebFieldID)]);\r\n \t FieldControls[nFieldControls-1].PanControl.ShowHint := true;\r\n end\r\n else with GroupHandlers.CurrentHandler do begin \t// pnndx still valid from above\r\n\t EntryControls[pnndx-1].PanControl.Hint :=\r\n \t format('%d:%d:%d:%d:%s',\r\n [nFieldControls-1, pnndx-1, fldndx, WebFieldID, FieldValues.GetValue(WebFormID, gpndx, 0, WebFieldID)]);\r\n \t EntryControls[pnndx-1].PanControl.ShowHint := true;\r\n end;\r\n end;\r\n}\r\n\tend;\r\nend;\r\n\r\nprocedure AddCaptionLabel(Sender: TForm; pn: TPanel; cap: string; fontsz: integer=0; wid: integer=0; fbold: string='N'; fitalics: string='N'; stlft: integer=8);\r\nbegin\r\n lbl := TLabel.create(sender);\r\n lbl.Parent := pn;\r\n lbl.AutoSize := false;\r\n //lbl.Align := alLeft;\r\n lbl.Layout := tlCenter;\r\n lbl.Top := 0;\r\n lbl.Height := pn.height;\r\n if wid = 0 then\r\n \tlbl.Width := SiteOpts.CapWidth - 15\r\n else\r\n \tlbl.Width := wid;\r\n lbl.Left := stlft;\r\n if fontsz > 0 then lbl.Font.Size := fontsz;\r\n if fBold = 'Y' then lbl.Font.Style := lbl.Font.Style + [fsBold];\r\n if fItalics = 'Y' then lbl.Font.Style := lbl.Font.Style + [fsItalic];\r\n lbl.Alignment := taLeftJustify;\r\n lbl.WordWrap := true;\r\n lbl.caption := cap;\r\n inc(number);\r\n lbl.name := 'lbl'+inttostr(number);\r\nend;\r\n\r\n// Still need to handle tags, and maybe names?\r\n// Required, Bold, Italics, FontSize, edt.edittype\r\n// Keep array to be able to dereference??\r\nfunction PanelByField(Sender: TForm; fldndx: integer; val: TFieldValue): integer;\r\nvar pndx: integer;\r\n\t pn: TWFieldPanel;\r\n fld: TFields;\r\nbegin\r\n result := -1;\r\n fld := WebFields[fldndx];\r\n if fld.EntryType = '8' then\r\n \tpndx := StartingGroupPanel(Sender, fld.Question, fld.DisplayOrder, 0, 0, 24)\r\n else if fld.EntryType = '7' then\r\n\t\tpndx := StartingPanel(Sender, '', fld.DisplayOrder, 0)\r\n else\r\n\t\tpndx := StartingPanel(Sender, fld.Question, fld.DisplayOrder, 0);\r\n if pndx >= 0 then with fld do begin\r\n \tpn := FieldPanels[pndx];\r\n if fld.Condition > ' ' then pn.Condition := fld.Condition;\r\n if fld.EntryType = '9' then\t// button\r\n \tFieldPanels[pndx].lft := 24\r\n else if fld.EntryType = '7' then\t// creating caption full width\r\n \tAddCaptionLabel(Sender, pn.pnl, fld.Question, pn.pnl.width-20, fld.FontSize, fld.Bold, fld.Italics);\r\n\r\n AddPanelControl(Sender, fldndx, val.FieldValue.Formatted);\r\n end;\r\n // Add Control to List?\r\n // Set Tag?\r\n if pn <> nil then begin\r\n if fld.FontSize > 0 then lbl.Font.Size := fld.FontSize;\r\n if fld.Bold = 'Y' then lbl.Font.Style := lbl.Font.Style + [fsBold];\r\n if fld.Italics = 'Y' then lbl.Font.Style := lbl.Font.Style + [fsItalic];\r\n \tresult := pndx;\r\n end;\r\nend;\r\n\r\nfunction StartingPanel(Sender: TForm; cap: string; ord, fontsz: integer): integer;\r\nvar pn: TPanel;\r\nbegin\r\n pn := TPanel.create(Sender);\r\n pn.Height := SiteOpts.PanelHeight;\r\n pn.Align := alTop;\r\n pn.BorderStyle := bsNone;\r\n pn.ShowCaption := false;\r\n \tpn.Color := CurrSectionColor;\r\n\r\n result := nFieldPanels;\r\n\tFieldPanels[nFieldPanels] := TWFieldPanel.create;\r\n FieldPanels[nFieldPanels].pnl := pn;\r\n FieldPanels[nFieldPanels].lft := 8 + SiteOpts.CapWidth + 4;\r\n FieldPanels[nFieldPanels].spc := 4;\r\n FieldPanels[nFieldPanels].PanelOrder := ord;\r\n FieldPanels[nFieldPanels].GroupIndex := 0;\r\n FieldPanels[nFieldPanels].pntype := 'S';\r\n FieldPanels[nFieldPanels].condition := '';\r\n\r\n if cap > '' then\r\n \tAddCaptionLabel(Sender, pn, cap, fontsz);\r\n inc(number);\r\n FieldPanels[nFieldPanels].pnl.name := 'Panel'+inttostr(number);\r\n\tinc(nFieldPanels);\r\nend;\r\n\r\nfunction StartingGroupPanel(Sender: TForm; cap: string; ord, gndx, fontsz, pht: integer): integer;\r\nvar pn: TPanel;\r\nbegin\r\n pn := TPanel.create(Sender);\r\n if pht > 0 then\r\n\t pn.Height := pht\r\n else\r\n \tpn.Height := SiteOpts.PanelHeight;\r\n pn.Align := alTop;\r\n pn.BorderStyle := bsNone;\r\n pn.ShowCaption := false;\r\n if CurrGroupColor > 0 then\r\n \tpn.Color := CurrGroupColor\t//$00A9CACB;\r\n else\r\n \tpn.Color := CurrSectionColor;\r\n\r\n\tFieldPanels[nFieldPanels] := TWFieldPanel.create;\r\n FieldPanels[nFieldPanels].pnl := pn;\r\n FieldPanels[nFieldPanels].lft := 8;\r\n FieldPanels[nFieldPanels].spc := 4;\r\n FieldPanels[nFieldPanels].PanelOrder := ord;\r\n FieldPanels[nFieldPanels].GroupIndex := gndx;\r\n FieldPanels[nFieldPanels].pntype := 'G';\r\n FieldPanels[nFieldPanels].condition := '';\r\n\r\n result := nFieldPanels;\r\n\tinc(nFieldPanels);\r\nend;\r\n\r\nprocedure DeleteFieldControl(ndx: integer);\r\nvar ctrl: TWinControl;\r\n\r\n\tprocedure ClearFieldValues(ndx: integer);\r\n var fv: integer;\r\n begin\r\n\t\tfor fv := 0 to FieldValues.Count-1 do\r\n \tif FieldValues[fv].ControlIndex = ndx then\r\n \tFieldValues[fv].ControlIndex := -1;\r\n end;\r\n\r\nbegin\r\n ctrl := FieldControls[ndx].PanControl;\r\n if Assigned(ctrl) then\r\n try ctrl.free; except end;\r\n FieldControls[ndx].PanControl := nil;\r\n ClearFieldValues(ndx);\r\nend;\r\n\r\nprocedure RemoveNilFieldControls;\r\nvar i, nils: integer;\r\n\t newndxs: array[0..50] of integer;\r\n\r\n\tprocedure AdjustFieldValues(oldndx, newndx: integer);\r\n var fv: integer;\r\n begin\r\n\t\tfor fv := 0 to FieldValues.Count-1 do\r\n \tif FieldValues[fv].ControlIndex = oldndx then\r\n \tFieldValues[fv].ControlIndex := newndx;\r\n end;\r\n\r\n\tprocedure MoveFieldControl(oldndx, newndx: integer);\r\n\tbegin\r\n \tif oldndx <> newndx then begin\r\n FieldControls[newndx].PanControl := FieldControls[oldndx].PanControl;\r\n FieldControls[newndx].wpfldndx := FieldControls[oldndx].wpfldndx;\r\n FieldControls[newndx].wppnlndx := FieldControls[oldndx].wppnlndx;\r\n FieldControls[newndx].ctrltype := FieldControls[oldndx].ctrltype;\r\n AdjustFieldValues(oldndx, newndx);\r\n end;\r\n end;\r\n\r\nbegin\r\n\tfor i := 0 to 50 do newndxs[i] := -1;\r\n nils := 0;\r\n for i := 0 to nFieldControls-1 do begin\r\n \tif FieldControls[i].PanControl = nil then begin\r\n \tinc(nils);\r\n end\r\n else\r\n \tnewndxs[i] := i - nils;\r\n end;\r\n for i := 0 to nFieldControls-1 do\r\n \tif newndxs[i] >= 0 then\r\n \t\tMoveFieldControl(i, newndxs[i]);\r\n\r\n nFieldControls := nFieldControls - nils;\r\nend;\r\n\r\nprocedure DeleteFieldPanel(pnlndx: integer);\r\nvar i: integer;\r\n\t pn: TPanel;\r\nbegin\r\n\t// destroy all controls on this panel\r\n for i := 0 to nFieldControls-1 do\r\n \tif (FieldControls[i].wppnlndx = pnlndx) then\r\n \tDeleteFieldControl(i);\r\n\r\n // destroy panel\r\n\tpn := FieldPanels[pnlndx].pnl;\r\n if assigned(pn) then\r\n try pn.free; except end;\r\n // remove from FieldControls\r\n\tdec(nFieldPanels);\r\n\tfor i := pnlndx to nFieldPanels-1 do begin\r\n \tFieldPanels[i].pnl := FieldPanels[i+1].pnl;\r\n \tFieldPanels[i].lft := FieldPanels[i+1].lft;\r\n \tFieldPanels[i].spc := FieldPanels[i+1].spc;\r\n \tFieldPanels[i].PanelOrder := FieldPanels[i+1].PanelOrder;\r\n \tFieldPanels[i].groupindex := FieldPanels[i+1].groupindex;\r\n \tFieldPanels[i].pntype := FieldPanels[i+1].pntype;\r\n \tFieldPanels[i].condition := FieldPanels[i+1].condition;\r\n end;\r\nend;\r\n\r\nfunction RemoveGroupPanel(wgndx: integer): integer;\r\nvar i: integer;\r\nbegin\r\n\tresult := 9999;\r\n // cannot use for loop, because nFieldPanels is changing, and i must stay the same when successful\r\n i := 0;\r\n while i < nFieldPanels do begin\r\n \tif (FieldPanels[i].GroupIndex = wgndx) and (FieldPanels[i].pntype = 'M') then begin\r\n \tif FieldPanels[i].pnl.Top < result then\r\n \tResult := FieldPanels[i].pnl.Top;\r\n \tDeleteFieldPanel(i);\r\n end\r\n else\r\n \tinc(i);\r\n end;\r\n RemoveNilFieldControls;\r\n if result > 9000 then result := 0;\r\nend;\r\n\r\nprocedure ReOrderPanels;\r\nvar panelordarr: array[0..1, 0..35] of integer; // 1: disporder+gpindexorder, 2: index\r\n\t i, npanels, tp, mgp, btm: integer;\r\n vis: boolean;\r\n\r\n procedure AddNewPanel(ord, ndx, pnndx: integer);\r\n var ord1, i: integer;\r\n begin\r\n \ti := nPanels-1;\r\n inc(nPanels);\r\n ord1 := 100*ord+ndx;\r\n while (i > 0) and (ord1 < panelordarr[0, i]) do begin\r\n \tpanelordarr[0, i+1] := panelordarr[0, i];\r\n \tpanelordarr[1, i+1] := panelordarr[1, i];\r\n \tdec(i);\r\n end;\r\n panelordarr[0, i+1] := ord1;\r\n panelordarr[1, i+1] := pnndx;\r\n end;\r\n\r\nbegin\r\n\t// reset top of each panel in defined order, then set height of parent panel\r\n // MainSectionPanel\r\n // list of panels in order\r\n nPanels := 0;\r\n for i := 0 to nFieldPanels-1 do begin\r\n \tif FieldPanels[i].pnl.Parent = MainSectionPanel.pnl then with FieldPanels[i] do begin\r\n \tmgp := 0;\r\n if FieldPanels[i].pntype = 'M' then mgp := 25\r\n else if FieldPanels[i].pntype = 'H' then mgp := -1;\r\n \tAddNewPanel(PanelOrder, mgp+GroupIndex, i);\r\n end;\r\n end;\r\n // now sorted\r\n tp := MainSectionPanel.TopStart;\r\n\tfor i := 0 to npanels-1 do begin\r\n \tvis := true;\r\n if length(FieldPanels[panelordarr[1, i]].Condition) > 3 then\t// allow Header to have webgroupid in it, not a condition\r\n \t\tVis := CalcCondition(FieldPanels[panelordarr[1, i]].Condition, 0);\r\n FieldPanels[panelordarr[1, i]].pnl.Visible := vis;\r\n \tFieldPanels[panelordarr[1, i]].pnl.Top := tp;\r\n if vis then\r\n \ttp := tp + FieldPanels[panelordarr[1, i]].pnl.height;\r\n end;\r\n btm := MainSectionPanel.BottomHeight;\r\n MainSectionPanel.PanelHeight := tp + btm + 6;\r\n MainSectionPanel.pnl.Height := MainSectionPanel.PanelHeight;\r\n\tSetMainPanelHeight;\r\nend;\r\n\r\nfunction StartingEntryPanel(Sender: TForm; cap: string; ord, gndx, fontsz, pht: integer): integer;\r\nvar pn: TPanel;\r\nbegin\r\n pn := TPanel.create(Sender);\r\n if pht > 0 then\r\n\t pn.Height := pht\r\n else\r\n \tpn.Height := SiteOpts.PanelHeight;\r\n pn.Align := alTop;\r\n pn.BorderStyle := bsNone;\r\n pn.ShowCaption := false;\r\n if CurrEntryColor > 0 then\r\n \tpn.Color := CurrEntryColor\t//$00A9CACB;\r\n else\r\n \tpn.Color := CurrSectionColor;\r\n\r\n if cap > '' then\r\n \tAddCaptionLabel(Sender, pn, cap, fontsz, 0, 'N', 'N', 32);\r\n\r\n with GroupHandlers.CurrentHandler do begin\r\n result := nEntryFields;\r\n EntryPanels[nEntryFields] := TWFieldPanel.create;\r\n EntryPanels[nEntryFields].pnl := pn;\r\n EntryPanels[nEntryFields].lft := 32 + SiteOpts.CapWidth + 4;\r\n EntryPanels[nEntryFields].spc := 4;\r\n\t EntryPanels[nEntryFields].PanelOrder := ord;\r\n\t EntryPanels[nEntryFields].GroupIndex := gndx;\r\n EntryPanels[nEntryFields].pntype := 'E';\r\n EntryPanels[nEntryFields].condition := '';\r\n inc(nEntryFields);\r\n end;\r\nend;\r\n\r\nfunction EntryPanelByField(Sender: TForm; fldndx: integer; val: TFldValue; gndx, fontsz, pht: integer): integer;\r\nvar endx, etp: integer;\r\n\t epn: TPanel;\r\n fld: TFields;\r\nbegin\r\n result := 0;\r\n fld := WebFields[fldndx];\r\n if fld.EntryType = '7' then\t// creating caption full width\r\n\t endx := StartingEntryPanel(Sender, '', fld.DisplayOrder, gndx, fontsz, pht)\r\n else\r\n\t endx := StartingEntryPanel(Sender, fld.Question, fld.DisplayOrder, gndx, fontsz, pht);\r\n if endx >= 0 then with GroupHandlers.CurrentHandler do begin\r\n if fld.Condition > ' ' then EntryPanels[endx].Condition := fld.Condition;\r\n \tepn := EntryPanels[endx].pnl;\r\n epn.parent := EntryPanel;\r\n etp := EntryPanel.Height;\r\n EntryPanel.Height := EntryPanel.Height + epn.Height;\r\n epn.Top := etp;\r\n if fld.EntryType = '7' then\t// creating caption full width\r\n \tAddCaptionLabel(Sender, epn, fld.Question, fld.FontSize, epn.width-20, fld.Bold, fld.Italics)\r\n else\r\n \tAddPanelControl(Sender, fldndx, val.Formatted, gndx, 0, true);\r\n end;\r\n // Add Control to List?\r\n // Set Tag?\r\n if epn <> nil then begin\r\n if fld.FontSize > 0 then lbl.Font.Size := fld.FontSize;\r\n if fld.Bold = 'Y' then lbl.Font.Style := lbl.Font.Style + [fsBold];\r\n if fld.Italics = 'Y' then lbl.Font.Style := lbl.Font.Style + [fsItalic];\r\n \tresult := endx;\r\n end;\r\nend;\r\n\r\nfunction GetWebPanel(pnndx: integer; EntryMode: boolean): TWFieldPanel;\r\nbegin\r\n\tif not EntryMode then\r\n\t result := FieldPanels[pnndx]\r\n else\r\n \tresult := GroupHandlers.CurrentHandler.EntryPanels[pnndx];\r\nend;\r\n\r\nfunction GetPanelLeft(pnndx, wid: integer; EntryMode: boolean): integer;\r\nvar wpnl: TWFieldPanel;\r\nbegin\r\n\twpnl := GetWebPanel(pnndx, EntryMode);\r\n result := wpnl.lft;\t//275;\r\n wpnl.lft := wpnl.lft + wid + 4;\r\nend;\r\n\r\nprocedure AddEditControl(Sender: TForm; pnndx, fldndx: integer; startval: string; dtype: string; EntryMode: boolean; fontsz: integer; elem: string; wid: integer);\r\nvar edt: TEdit;\r\nbegin\r\n edt := TEdit.create(sender);\r\n edt.Parent := GetWebPanel(pnndx, EntryMode).pnl;\r\n if (dtype = '1') or (dtype = '2') or (dtype='6') then begin\r\n \tedt.Alignment := taRightJustify;\r\n edt.EditType := weSignedFloat;\r\n{ if dtype = '2' then\r\n\t edt.Pattern := '[0-9\\-]*'\r\n else\r\n \t edt.Pattern := '[0-9.\\-\\.]*';\r\n}\r\n end\r\n else begin\r\n \tedt.Alignment := taLeftJustify;\r\n edt.EditType := weString;\r\n end;\r\n edt.ElementClassName := elem;\r\n edt.Top := SiteOpts.ControlTop;\r\n if wid = 0 then begin\r\n wid := 50;\r\n if dtype = '0' then wid := 200\r\n else if dtype = '1' then wid := 100\r\n else if dtype = '2' then wid := 50\r\n else if dtype = '5' then wid := 50\r\n else if dtype = '6' then wid := 100\r\n else if dtype = '7' then wid := 100;\r\n end;\r\n edt.Left := getpanelleft(pnndx, wid, EntryMode);\r\n edt.Width := wid;\r\n if not WebFields[fldndx].ReadOnly then\r\n \tedt.CharCase := wecUpperCase\r\n else\r\n \tedt.CharCase := wecNormal;\r\n edt.text := startval;\r\n if fontsz > 0 then edt.Font.Size := fontsz;\r\n inc(number);\r\n edt.name := 'Edit'+inttostr(number);\r\n edt.AutoCompletion := acNone;\r\n\tAddFieldPanelControl(edt, pnndx, fldndx, 0, EntryMode);\r\n// cntrl := edt;\r\nend;\r\n\r\nprocedure AddCalcControl(Sender: TForm; pnndx, fldndx: integer; startval: string; dtype: string; EntryMode: boolean; fontsz: integer; elem: string; wid: integer);\r\nvar edt: TEdit;\r\nbegin\r\n\tif wid = 0 then wid := 100;\r\n edt := TEdit.create(sender);\r\n edt.Parent := GetWebPanel(pnndx, EntryMode).pnl;\r\n// edt.Parent.TabStop := false;\r\n if (dtype = '1') or (dtype = '2') then begin\r\n \tedt.Alignment := taRightJustify;\r\n edt.EditType := weNumeric;\r\n end\r\n else begin\r\n \tedt.Alignment := taLeftJustify;\r\n edt.EditType := weString;\r\n end;\r\n edt.ElementClassName := elem;\r\n edt.TabStop := false;\r\n edt.Top := SiteOpts.ControlTop;\r\n edt.Width := wid;\r\n edt.Height := GetWebPanel(pnndx, EntryMode).pnl.height - edt.Top - 1;\r\n edt.Left := getpanelleft(pnndx, wid, EntryMode);\r\n edt.text := startval;\r\n edt.ReadOnly := true;\r\n edt.Color := clBtnFace;\r\n if fontsz > 0 then edt.Font.Size := fontsz;\r\n inc(number);\r\n edt.name := 'Edit'+inttostr(number);\r\n\tAddFieldPanelControl(edt, pnndx, fldndx, 4, EntryMode);\r\n// cntrl := edt;\r\nend;\r\n\r\nprocedure AddCheckBoxControl(Sender: TForm; pnndx, fldndx: integer; startval: string; EntryMode: boolean; fontsz: integer; elem: string; wid: integer);\r\nvar chb: TCheckBox;\r\nbegin\r\n\tif wid = 0 then wid := 50;\r\n chb := TCheckBox.create(sender);\r\n chb.Parent := GetWebPanel(pnndx, EntryMode).pnl;\r\n chb.ElementClassName := elem;\r\n chb.Top := SiteOpts.ControlTop;\r\n chb.Width := wid;\r\n chb.Left := getpanelleft(pnndx, wid, EntryMode);\r\n chb.Checked := (startval = 'Y');\r\n chb.Caption := '';\r\n inc(number);\r\n chb.name := 'chb'+inttostr(number);\r\n\tAddFieldPanelControl(chb, pnndx, fldndx, 5, EntryMode);\r\n// cntrl := chb;\r\nend;\r\n\r\nprocedure AddComboBoxControl(Sender: TForm; pnndx, fldndx: integer; startval: string; Choices: string; EntryMode: boolean; fontsz: integer; elem: string; wid: integer);\r\nvar cmb: TComboBox;\r\n\t parm: TStringParams;\r\n i, ndx: integer;\r\n\r\n procedure FillWHPeriods;\r\n var frq: string;\r\n \t y, m, d, p: word;\r\n i: integer;\r\n\r\n \tfunction eom(mon: integer): integer;\r\n begin\r\n \tif mon = 2 then begin\r\n \tif y mod 4 = 0 then result := 29\r\n else result := 28;\r\n end\r\n else if mon in [4, 6, 9, 11] then result := 30\r\n else result := 31;\r\n end;\r\n\r\n begin\r\n \t// based on current filetype (A/S/M/Q) fill in Parm\r\n // ex: (Q) parm[1] := ' 1=1: 1/1-3/31'; parm[2] := ' 2=2: 4/1-6/30';\r\n // can also set startval to match current date\r\n frq := CurrentFreq;\r\n decodedate(date, y, m, d);\r\n if frq = 'A' then begin\r\n \tparm[1] := '1=1: 1/1-12/31';\r\n startval := '1';\r\n parm.nParams := 1;\r\n end\r\n else if frq = 'M' then begin\r\n \tfor i := 1 to 12 do\r\n \tparm[i] := format('%2d=%d: %d/1-%d/%d', [i, i, i, i, eom(i)]);\r\n{ \tparm[1] := ' 1=1: 1/1-1/31';\r\n \tparm[2] := ' 2=2: 2/1-2/28';\r\n \tparm[3] := ' 3=3: 3/1-3/31';\r\n \tparm[4] := ' 4=4: 4/1-4/30';\r\n \tparm[5] := ' 5=5: 5/1-5/31';\r\n \tparm[6] := ' 6=6: 6/1-6/30';\r\n \tparm[7] := ' 7=7: 7/1-7/31';\r\n \tparm[8] := ' 8=8: 8/1-8/31';\r\n \tparm[9] := ' 9=9: 9/1-9/30';\r\n \tparm[10] := '10=10: 10/1-10/31';\r\n \tparm[11] := '11=11: 11/1-11/30';\r\n \tparm[12] := '12=12: 12/1-12/31';\r\n}\r\n parm.nParams := 12;\r\n if m = 1 then startval := '12'\r\n else if m >= 11 then startval := inttostr(m-1)\r\n else startval := ' ' + inttostr(m-1);\r\n end\r\n else if frq = 'S' then begin\r\n \tfor i := 1 to 12 do begin\r\n \tndx := 2 * i - 1;\r\n \tparm[ndx] := format('%2d=%d: %d/1-%d/%d', [ndx, ndx, i, i, 15]);\r\n ndx := ndx + 1;\r\n \tparm[ndx] := format('%2d=%d: %d/16-%d/%d', [ndx, ndx, i, i, eom(i)]);\r\n end;\r\n{ \tparm[1] := ' 1=1: 1/1-1/15';\r\n \tparm[2] := ' 2=2: 1/16-1/31';\r\n \tparm[3] := ' 3=3: 2/1-2/15';\r\n \tparm[4] := ' 4=4: 2/16-2/28';\r\n \tparm[5] := ' 5=5: 3/1-3/15';\r\n \tparm[6] := ' 6=6: 3/16-3/31';\r\n \tparm[7] := ' 7=7: 4/1-4/15';\r\n \tparm[8] := ' 8=8: 4/16-4/30';\r\n \tparm[9] := ' 9=9: 5/1-5/15';\r\n \tparm[10] := '10=10: 5/16-5/31';\r\n \tparm[11] := '11=11: 6/1-6/15';\r\n \tparm[12] := '12=12: 6/16-6/30';\r\n \tparm[13] := '13=13: 7/1-7/15';\r\n \tparm[14] := '14=14: 7/16-7/31';\r\n \tparm[15] := '15=15: 8/1-8/15';\r\n \tparm[16] := '16=16: 8/16-8/31';\r\n \tparm[17] := '17=17: 9/1-9/15';\r\n \tparm[18] := '18=18: 9/16-9/30';\r\n \tparm[19] := '19=19: 10/1-10/15';\r\n \tparm[20] := '20=20: 10/16-10/31';\r\n \tparm[21] := '21=21: 11/1-11/15';\r\n \tparm[22] := '22=22: 11/16-11/30';\r\n \tparm[23] := '23=23: 12/1-12/15';\r\n \tparm[24] := '24=24: 12/16-12/31';\r\n}\r\n parm.nParams := 24;\r\n p := 2 * m - 2;\r\n if d >= 15 then p := p + 1;\r\n if p = 0 then startval := '24'\r\n else if p >= 10 then startval := inttostr(p)\r\n else startval := ' ' + inttostr(p);\r\n end\r\n else begin\t\t// Q\r\n \tparm[1] := '1=1: 1/1-3/31';\r\n \tparm[2] := '2=2: 4/1-6/30';\r\n \tparm[3] := '3=3: 7/1-9/30';\r\n \tparm[4] := '4=4: 10/1-12/31';\r\n parm.nParams := 4;\r\n if m < 4 then startval := '4'\r\n else if m < 7 then startval := '1'\r\n else if m < 10 then startval := '2'\r\n else startval := '3';\r\n end;\r\n end;\r\n\r\nbegin\r\n\tif wid = 0 then wid := 150;\r\n cmb := TComboBox.create(sender);\r\n cmb.Parent := GetWebPanel(pnndx, EntryMode).pnl;\r\n cmb.ElementClassName := elem;\r\n cmb.Top := SiteOpts.ControlTop;\r\n cmb.Width := wid;\r\n cmb.Left := getpanelleft(pnndx, wid, EntryMode);\r\n parm := TStringParams.create(30, '/');\r\n if Choices = 'WHPERIODS' then FillWHPeriods\r\n else parm.asString := Choices;\r\n cmb.ItemIndex := -1;\r\n for i := 1 to parm.nParams do\r\n \tif parm[i] > '' then begin\r\n \tcmb.Items.Add(parm[i]);\r\n if startval > '' then begin\r\n \tif startval = copy(parm[i], 1, length(startval)) then\r\n \tcmb.ItemIndex := cmb.Items.Count-1;\r\n end;\r\n end;\r\n cmb.text := startval;\r\n if fontsz > 0 then cmb.Font.Size := fontsz;\r\n parm.free;\r\n inc(number);\r\n cmb.name := 'cmb'+inttostr(number);\r\n\tAddFieldPanelControl(cmb, pnndx, fldndx, 1, EntryMode);\r\n// cntrl := cmb;\r\nend;\r\n\r\nprocedure AddRadioGroupControl(Sender: TForm; pnndx, fldndx: integer; startval: string; Choices: string; EntryMode: boolean; fontsz: integer; elem: string; wid: integer);\r\nvar rgp: TRadioGroup;\r\n\t parm: TStringParams;\r\n i: integer;\r\nbegin\r\n\tif wid = 0 then wid := 300;\r\n rgp := TRadioGroup.create(sender);\r\n rgp.Parent := GetWebPanel(pnndx, EntryMode).pnl;\r\n rgp.ElementClassName := elem;\r\n rgp.Top := SiteOpts.ControlTop;\r\n rgp.Width := wid;\r\n rgp.Left := getpanelleft(pnndx, wid, EntryMode);\r\n parm := TStringParams.create(25, '/');\r\n parm.asString := Choices;\r\n for i := 1 to parm.nParams do\r\n \tif parm[i] > '' then\r\n \trgp.Items.Add(parm[i]);\r\n parm.free;\r\n if fontsz > 0 then rgp.Font.Size := fontsz;\r\n inc(number);\r\n rgp.name := 'rgp'+inttostr(number);\r\n\tAddFieldPanelControl(rgp, pnndx, fldndx, 9, EntryMode);\r\n// cntrl := rgp;\r\nend;\r\n\r\nprocedure AddDateControl(Sender: TForm; pnndx, fldndx: integer; startval: string; EntryMode: boolean; fontsz: integer; elem: string; wid: integer);\r\nvar dtp: TDateTimePicker;\r\nbegin\r\n\tif wid = 0 then wid := 150;\r\n dtp := TDateTimePicker.create(sender);\r\n dtp.Parent := GetWebPanel(pnndx, EntryMode).pnl;\r\n dtp.ElementClassName := elem;\r\n dtp.Top := SiteOpts.ControlTop;\r\n dtp.Width := wid;\r\n dtp.Left := getpanelleft(pnndx, wid, EntryMode);\r\n dtp.text := startval;\r\n if fontsz > 0 then dtp.Font.Size := fontsz;\r\n inc(number);\r\n dtp.name := 'dtp'+inttostr(number);\r\n\tAddFieldPanelControl(dtp, pnndx, fldndx, 6, EntryMode);\r\n// cntrl := dtp;\r\nend;\r\n\r\nprocedure MessageControl(Sender: TForm; pnndx, fldndx: integer; EntryMode: boolean; fontsz: integer; elem: string; wid: integer);\r\nbegin\r\n\tif wid = 0 then wid := 150;\r\n lbl.Alignment := taCenter;\r\n if fontsz > 0 then lbl.Font.Size := fontsz;\r\n lbl.ElementClassName := elem;\r\n// cntrl := nil;\r\nend;\r\n\r\nprocedure CaptionOnly(Sender: TForm; pnndx, fldndx: integer; cap: string; EntryMode: boolean; fontsz: integer; elem: string; wid: integer);\r\nbegin\r\n if wid = 0 then wid := SiteOpts.CapWidth-15;\r\n lbl := TLabel.create(sender);\r\n lbl.Parent := GetWebPanel(pnndx, EntryMode).pnl;\r\n lbl.AutoSize := false;\r\n //lbl.Align := alLeft;\r\n lbl.Layout := tlCenter;\r\n lbl.ElementClassName := elem;\r\n lbl.Top := 0;\r\n lbl.Height := GetWebPanel(pnndx, EntryMode).pnl.height;\r\n lbl.Left := getpanelleft(pnndx, wid, EntryMode);\t\t//8\r\n lbl.Width := wid;\r\n if fontsz > 0 then lbl.Font.Size := fontsz;\r\n lbl.Alignment := taLeftJustify;\r\n if WebFields[fldndx].Format = 'F' then begin\r\n\t lbl.Left := 16;\t\t//8\r\n \twid := 450;\t//GetWebPanel(pnndx, EntryMode).pnl.Width - 2*lbl.Left;\r\n\t lbl.Width := wid;\r\n\t lbl.Alignment := taCenter;\r\n end;\r\n lbl.WordWrap := true;\r\n lbl.caption := cap;\r\n inc(number);\r\n lbl.name := 'lbl'+inttostr(number);\r\nend;\r\n\r\nprocedure SetGroupHeadingPanel(Sender: TForm; pnndx, fldndx: integer; gp: integer; elem: string);\r\n// generic: need column widths and spacing\r\nvar s, {s1,} cap: string;\r\n i, p, w, gpndx: integer;\r\n fld: TFields;\r\n\r\n\tprocedure SetLabel;\r\n var llbl: TLabel;\r\n begin\r\n \tinc(i);\r\n if gpndx < 0 then w := 100\r\n else w := WebGroups[gpndx].ColumnWidths[i];\r\n \tllbl := TLabel.create(sender);\r\n llbl.Parent := FieldPanels[pnndx].pnl;\r\n llbl.AutoSize := false;\r\n llbl.Height := 24;\r\n llbl.Width := w;\r\n llbl.WordWrap := false;\r\n\t llbl.Align := alNone;\r\n llbl.Top := 0;\r\n llbl.Caption := cap;\r\n llbl.Left := WebGroups[gpndx].ColumnLefts[i];\t//FieldPanels[pnndx].lft;\r\n FieldPanels[pnndx].lft := FieldPanels[pnndx].lft + w + 4;\r\n llbl.Alignment := taCenter;\r\n\t llbl.Layout := tlBottom;\r\n inc(number);\r\n llbl.name := 'lbl'+inttostr(number);\r\n end;\r\n\r\nbegin\r\n fld := WebFields[fldndx];\r\n\tFieldPanels[pnndx].pnl.Height := 24;\r\n FieldPanels[pnndx].pntype := 'H';\r\n\tFieldPanels[pnndx].pnl.ElementClassName := elem;\r\n s := trim(fld.ValidValues);\r\n if s > '' then begin\r\n \tgpndx := -1;\r\n \tif gp > 0 then begin\r\n \tfor i := 0 to nWebGroups-1 do\r\n \tif WebGroups[i].WebGroupID = gp then begin\r\n \tgpndx := i;\r\n if WebGroups[i].Color > 0 then\r\n \tFieldPanels[pnndx].pnl.Color := WebGroups[i].Color;\r\n end;\r\n end;\r\n\t i := 0;\r\n \tif copy(s, length(s), 1) <> '/' then s := s + '/';\r\n repeat\r\n p := pos('/', s);\r\n cap := copy(s, 1, p-1);\r\n s := copy(s, p+1, length(s)-p);\r\n SetLabel;\r\n until s = '';\r\n end;\r\nend;\r\n\r\nprocedure AddButtonControl(Sender: TForm; pnndx, fldndx: integer; EntryMode: boolean; elem: string; wid: integer);\r\nvar btn: TButton;\r\n fld: TFields;\r\n grp, hand: integer;\r\nbegin\r\n\t// allow Add, Edit, Delete\r\n fld := WebFields[fldndx];\r\n grp := fld.WebGroupID;\r\n hand := GroupHandlers.Current;\r\n if fld.DataType = 'A' then begin\r\n \tgrp := strtointdef(fld.Calculation, 0);\r\n hand := hand + 1;\t// usually 1\r\n end;\r\n btn := TButton.create(sender);\r\n btn.Parent := GetWebPanel(pnndx, EntryMode).pnl;\r\n btn.Top := SiteOpts.ControlTop + 1;\r\n btn.Caption := fld.ValidValues;\t//Question;\r\n if wid = 0 then begin\r\n \twid := 100;\r\n if length(btn.Caption) > 12 then\r\n \twid := length(btn.Caption) * 8;\r\n\tend;\r\n btn.Width := wid;\r\n btn.Height := GetWebPanel(pnndx, EntryMode).pnl.height-btn.Top-2;\r\n btn.Left := getpanelleft(pnndx, wid, EntryMode);\r\n\r\n if fld.Fontsize > 0 then btn.Font.Size := fld.fontsize;\r\n inc(number);\r\n btn.name := 'btn'+inttostr(number);\r\n btn.Hint := fld.ShortHelpText;\r\n if btn.Hint > '' then btn.ShowHint := true;\r\n if fld.DataType = 'P' then begin\t\t\t// ACH\r\n \tbtn.Tag := 10;\t// Pay Button\r\n btn.OnClick := GroupHandlers.PayClick;\r\n end\r\n else if fld.DataType = 'C' then begin\t// Credit Card\r\n \tbtn.Tag := 11;\t// Pay Button\r\n btn.OnClick := GroupHandlers.PayClick;\r\n end\r\n else begin\r\n btn.OnClick := GroupHandlers.{CurrentHandler.}GroupButtonClick;\r\n if fld.DataType = 'A' then btn.Tag := 1\t\t// Add\r\n else if fld.DataType = 'D' then btn.Tag := 3\t\t// Delete\r\n else if fld.DataType = 'O' then begin\r\n \tbtn.Tag := 5;\t\t// OCC\r\n\t btn.OnClick := GroupHandlers.OCCButtonClick;\r\n end\r\n else if fld.DataType = 'Y' then begin\r\n \tbtn.Tag := 9;\t\t// Go Somewhere by Purpose\r\n btn.Hint := fld.ValidValues;\r\n end\r\n else btn.Tag := 2;\t// Edit\r\n\t btn.Tag := btn.Tag + 1000*hand + 10000*grp;\r\n end;\r\n //dbg only: btn.Caption := btn.Caption + ' ' + inttostr(btn.Tag);\r\n // do not add Buttons to FieldControls\r\n\tAddFieldPanelControl(btn, pnndx, fldndx, 9, EntryMode);\r\nend;\r\n\r\nprocedure AddLinkControl(Sender: TForm; pnndx, fldndx: integer; cap: string; EntryMode: boolean; fontsz: integer; elem: string; wid: integer);\r\nvar lnk: TLinkLabel;\r\nbegin\r\n if wid = 0 then wid := SiteOpts.CapWidth-15;\r\n lnk := TLinkLabel.create(sender);\r\n lnk.Parent := GetWebPanel(pnndx, EntryMode).pnl;\r\n lnk.AutoSize := false;\r\n //lnk.Align := alLeft;\r\n lnk.Layout := tlCenter;\r\n lnk.ElementClassName := elem;\r\n lnk.Top := 0;\r\n// lnk.Height := GetWebPanel(pnndx, EntryMode).pnl.height;\r\n lnk.Left := getpanelleft(pnndx, wid, EntryMode);\t\t//8\r\n if WebFields[fldndx].Format = 'F' then\r\n \twid := GetWebPanel(pnndx, EntryMode).pnl.Width - 2*lnk.Left;\r\n lnk.Width := wid;\r\n if fontsz > 0 then lnk.Font.Size := fontsz;\r\n lnk.Alignment := taLeftJustify;\r\n lnk.Height := GetWebPanel(pnndx, EntryMode).pnl.height * 2;\r\n lnk.WordWrap := true;\r\n //lnk.Font.Style := [fsUnderline];\r\n lnk.caption := cap;\r\n inc(number);\r\n lnk.name := 'lnk'+inttostr(number);\r\nend;\r\n\r\nprocedure AddFieldPanelControl(cntrl: TWinControl; pnndx, fieldndx, enttype: integer; EntryMode: boolean);\r\nbegin\r\n if not EntryMode then begin\r\n \tFieldControls[nFieldControls] := TWPanelControl.create;\r\n\t FieldControls[nFieldControls].PanControl := cntrl;\r\n \tFieldControls[nFieldControls].wpfldndx := fieldndx;\r\n \tFieldControls[nFieldControls].wppnlndx := pnndx;\r\n\t FieldControls[nFieldControls].ctrltype := enttype;\r\n FieldControls[nFieldControls].Enterable := not WebFields[fieldndx].ReadOnly;\r\n inc(nFieldControls);\r\n end\r\n else\r\n \tGroupHandlers.CurrentHandler.AddControl(cntrl, fieldndx, pnndx, enttype);\r\nend;\r\n\r\nprocedure DisplayLoaded;\r\nvar i {, j}: integer;\r\n\t s: string;\r\nbegin\r\n\ts := '';\r\n{\tfor i := 0 to nFieldPanels-1 do with FieldPanels[i] do\r\n \ts := s + format('%d: %s %d/%d', [i, pntype, lft, spc]) + #13;\r\n s := s + #13;\r\n}\r\n\tfor i := 0 to nFieldControls-1 do with FieldControls[i] do\r\n \tif (FieldControls[i].PanControl <> nil) then\r\n \t\ts := s + format('%d: %s %d/%d/%d', [i, PanControl.name, PanControl.taborder, ctrltype, wppnlndx]) + #13;\r\n ShowMessage(s);\r\n{ s := '';\r\n with FieldValues do begin\r\n \tfor j := 0 to Count-1 do with FieldValues[j] do\r\n s := s + format(' %d/%d: %d %d %s', [j, ControlIndex, WebFormID, WebFieldID, FieldValue.asString]) + #13;\r\n ShowMessage(s);\r\n}\r\nend;\r\n\r\n{ TMultGroupHandlers }\r\n\r\nprocedure TMultGroupHandlers.AddHandler(Sender: TForm; pnl, pnHide: TPanel; gp, mx: integer);\r\nbegin\r\n\tinc(nHandlers);\r\n current := nHandlers;\r\n fHandlers[current] := TMultGroupHandler.create;\r\n fHandlers[current].InitHandler(Sender, pnl, pnHide, gp, mx);\r\nend;\r\n\r\nprocedure TMultGroupHandlers.AssignEvents;\r\nvar h, i: integer;\r\nbegin\r\n\tfor h := 1 to nHandlers do with fHandlers[h] do begin\r\n for i := 0 to nEntryControls-1 do begin\r\n EntryControls[i].PanControl.OnEnter := EventActions.EntryEditEnter;\r\n EntryControls[i].PanControl.OnExit := EventActions.EntryEditExit;\r\n EntryControls[i].PanControl.OnMouseDown := EventActions.EntryEditMouseDown;\r\n EntryControls[i].PanControl.OnKeyDown := EventActions.EntryEditKeyDown;\r\n end;\r\n\tend;\r\nend;\r\n\r\nconstructor TMultGroupHandlers.Create;\r\nbegin\r\n\tnHandlers := 0;\r\n Current := 0;\r\n fTOrder := 0;\r\n InEGoTo := false;\r\nend;\r\n\r\ndestructor TMultGroupHandlers.Destroy;\r\nbegin\r\n\tReset;\r\n\r\n inherited;\r\nend;\r\n\r\nprocedure TMultGroupHandlers.FillEntryControls;\r\nbegin\r\n\tCurrentHandler.FieldValuesToEntry;\r\nend;\r\n\r\nfunction TMultGroupHandlers.gCurrHandler: TMultGroupHandler;\r\nbegin\r\n\tresult := nil;\r\n if current = 0 then current := nHandlers;\r\n if current > 0 then\r\n \tresult := fHandlers[current];\r\nend;\r\n\r\nfunction TMultGroupHandlers.gHandler(index: integer): TMultGroupHandler;\r\nbegin\r\n\tresult := nil;\r\n if index = 0 then index := current;\r\n if index > 0 then\r\n \tresult := fHandlers[index];\r\nend;\r\n\r\nprocedure TMultGroupHandlers.GoToOrder(order: integer);\r\nvar i, n, o, mino, minf, frst, h: integer;\r\nbegin\r\n\th := (order-400) div 100;\t//500-599-> handler 1, 600->handler 2, etc\r\n\ti := 1;\r\n mino := 999999;\r\n minf := 999999;\r\n o := 0;\r\n frst := 0;\r\n with fHandlers[h] do begin\r\n for i := 0 to nEntryControls-1 do begin\r\n n := EntryControls[i].PanControl.TabOrder;\r\n \tif EntryControls[i].Enterable then begin\r\n if (n >= order) and (n < mino) then begin\r\n mino := n;\r\n o := i;\r\n end;\r\n end;\r\n if (n >= 100) and (n < frst) then begin\r\n minf := n;\r\n frst := i;\r\n end;\r\n end;\r\n if mino > 99999 then begin\r\n if minf < 9999 then\r\n TCustomControl(EntryControls[frst].PanControl).setFocus;\r\n end\r\n else\r\n TCustomControl(EntryControls[o].PanControl).setFocus;\r\n end;\r\nend;\r\n\r\nfunction TMultGroupHandlers.NextOrder: integer;\r\nbegin\r\n\tinc(fTOrder);\r\n result := 400 + 100*current + fTOrder;\r\nend;\r\n\r\nprocedure TMultGroupHandlers.OCCButtonClick(Sender: TObject);\r\nbegin\r\n\tHandleOCC;\r\nend;\r\n\r\nprocedure TMultGroupHandlers.Recalc;\r\nbegin\r\n\tEventActions.StoreData;\r\n\tCalcAllFormulas;\r\nend;\r\n\r\nprocedure TMultGroupHandlers.Reset;\r\nvar i: integer;\r\nbegin\r\n for i := 1 to nHandlers do begin\r\n \tfHandlers[i].Clear;\r\n \tfHandlers[i].free;\r\n end;\r\n\tnHandlers := 0;\r\n Current := 0;\r\n fTOrder := 0;\r\nend;\r\n\r\nprocedure TMultGroupHandlers.StoreData;\r\nbegin\r\n\tCurrentHandler.EntryToFieldValues;\r\nend;\r\n\r\nfunction TMultGroupHandlers.MatchingControl(tg: integer; out contype: integer): TWinControl;\r\nbegin\r\n\t// tg is controls index, but type is only stored in the webpanel\r\n result := nil;\r\n if tg >= 0 then begin\r\n \tresult := CurrentHandler.EntryControls[tg].PanControl;\r\n contype := CurrentHandler.EntryControls[tg].ctrltype;\r\n end;\r\nend;\r\n\r\n\r\nfunction TMultGroupHandlers.MatchingFieldIndex(cont: TWinControl): integer;\r\nbegin\r\n\tresult := CurrentHandler.MatchingFieldIndex(cont);\r\nend;\r\n\r\n{ TWebPanelControl }\r\n\r\nprocedure TWPanelControl.ControlToFieldValue(fv: integer);\r\nvar p, enttyp: integer;\r\n s: string;\r\n cmb: TComboBox;\r\nbegin\r\n\tenttyp := ctrltype;\r\n if PanControl <> nil then begin\r\n case enttyp of\r\n 0:\tFieldValues[fv].FieldValue.Formatted := TEdit(PanControl).text;\r\n 1: begin\r\n FieldValues[fv].FieldValue.asString := '';\r\n cmb := TComboBox(PanControl);\r\n if cmb.ItemIndex >= 0 then begin\r\n s := cmb.Items[cmb.ItemIndex];\r\n p := pos('=', s);\r\n if p > 0 then\r\n FieldValues[fv].FieldValue.asString := copy(s, 1, p-1)\r\n else\r\n FieldValues[fv].FieldValue.asString := s;\r\n end;\r\n end;\r\n 2: begin end;\t//\tOtherCities\r\n 3: begin end;\t// Message\r\n 4: FieldValues[fv].FieldValue.Formatted := TEdit(PanControl).text;\r\n 5: FieldValues[fv].FieldValue.asBoolean := TCheckBox(PanControl).checked;\r\n 6: if TDateTimePicker(PanControl).date < 1 then FieldValues[fv].FieldValue.AsString := ''\r\n \telse FieldValues[fv].FieldValue.asDate := TDateTimePicker(PanControl).date;\r\n 7: FieldValues[fv].FieldValue.asString := TEdit(PanControl).text;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TWPanelControl.FieldValueToControl(fv: integer);\r\nvar p, ln, enttyp: integer;\r\n s: string;\r\n cmb: TComboBox;\r\n fValue: TFldValue;\r\nbegin\r\n\tfValue := FieldValues[fv].FieldValue;\r\n enttyp := ctrltype;\r\n if PanControl <> nil then begin\r\n case enttyp of\r\n 0:\tTEdit(PanControl).text := fValue.Formatted;\r\n 1: begin\r\n cmb := TComboBox(PanControl);\r\n cmb.ItemIndex := -1;\r\n ln := length(fValue.AsString);\r\n if ln > 0 then begin\r\n for p := 0 to cmb.Items.Count-1 do begin\r\n s := cmb.Items[p];\r\n if uppercase(copy(s, 1, ln)) = uppercase(copy(fValue.AsString, 1, ln)) then begin\r\n cmb.ItemIndex:= p;\r\n cmb.text := s;\r\n end;\r\n end;\r\n end;\r\n end;\r\n 2: begin end;\t//\tOtherCities\r\n 3: begin end;\t// Message\r\n 4: TEdit(PanControl).text := fValue.Formatted;\r\n 5: TCheckBox(PanControl).checked := fValue.asBoolean;\r\n 6: if fValue.AsString = '' then TDateTimePicker(PanControl).date := 0\r\n \telse TDateTimePicker(PanControl).date := fValue.asDate;\r\n 7: TEdit(PanControl).text := fValue.asString;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TMultGroupHandlers.PayClick(Sender: TObject);\r\nvar tg: integer;\r\n\t cont: boolean;\r\nbegin\r\n\ttg := (Sender as TButton).Tag;\r\n\tif (tg <> 10) then cont := true\r\n else begin\r\n \tcont := VerifyTool.VerifyFieldByCode(0, 0, 'ACH', '', true);\r\n if not cont then\r\n \tVerifyMessages.ShowMessages;\r\n end;\r\n if cont then begin\r\n\t CurrentHandler.CreatePayment(tg);\r\n PayInfo.FromFieldValues;\r\n PayInfo.DebugCurrentData('PayClick: (FromFieldValues)');\r\n PayInfo.ToHistory;\r\n \tShowMain;\r\n end;\r\nend;\r\n\r\nfunction GetPageWidth: integer;\r\nvar i, right: integer;\r\nbegin\r\n\tresult := 0;\r\n for i := 0 to nFieldPanels-1 do with FieldPanels[i] do begin\r\n \tright := pnl.left + pnl.width;\r\n if right > result then\r\n \tresult := right;\r\n end;\r\nend;\r\n\r\nend.\r\n\r\n","unit entForms;\r\n\r\ninterface\r\n\r\nuses SysUtils, JS, Web, WEBLib.Dialogs;\r\n\r\nprocedure SetAffects;\r\nfunction GetFieldFormat(fm, fld: integer): string;\r\nfunction GetFieldLineType(fm, fld, grp: integer): string;\r\nfunction FindFormIndex(id: integer): integer;\r\nfunction FindSectionIndex(sect: integer): integer;\r\nfunction FindFieldsIndex(fm, fld: integer): integer;\r\n\r\n\r\ntype\r\n TFORMS = class\r\n private\r\n FWEBFORMID: integer;\r\n FDESCRIPTION: string;\r\n FSTARTYEAR: string;\r\n FENDYEAR: string;\r\n FTAG: string;\r\n FCONDITION: string;\r\n FCAPTION: string;\r\n FPURPOSE: string;\r\n function gString: string;\r\n procedure sString(const Value: string);\r\n public\r\n property WEBFORMID: integer read FWEBFORMID write FWEBFORMID;\r\n property DESCRIPTION: string read FDESCRIPTION write FDESCRIPTION;\r\n property STARTYEAR: string read FSTARTYEAR write FSTARTYEAR;\r\n property ENDYEAR: string read FENDYEAR write FENDYEAR;\r\n property TAG: string read FTAG write FTAG;\r\n property CONDITION: string read FCONDITION write FCONDITION;\r\n property CAPTION: string read FCAPTION write FCAPTION;\r\n property PURPOSE: string read FPURPOSE write FPURPOSE;\r\n constructor Create(pWEBFORMID: integer; pDESCRIPTION, pSTARTYEAR, pENDYEAR, pTAG, pCONDITION, pCAPTION, pPURPOSE: string);\r\n property AsString: string read gString write sString;\r\n end;\r\n\r\n TAFFECTS = class\r\n \tFormButtons: boolean;\r\n SectButtons: // list of forms\r\n \t\t\t\tarray[1..10] of integer;\r\n Sections: array[1..10, 1..2] of integer; // list of form, sections\r\n procedure Reset;\r\n procedure AffectsForm;\r\n procedure AffectsSection(fm: integer);\r\n procedure AffectsField(fm, sect: integer);\r\n function Any: boolean;\r\n end;\r\n\r\n TFIELDS = class\r\n private\r\n FWEBFIELDID: integer;\r\n FWEBFORMID: integer;\r\n FTAGCODE: string;\r\n FLINECODE: string;\r\n FSECTIONID: integer;\r\n FWEBGROUPID: integer;\r\n FLINETYPE: string;\r\n FTAG: string;\r\n FDATATYPE: string;\r\n FENTRYTYPE: string;\r\n FDESCRIPTION: string;\r\n FQUESTION: string;\r\n FBOLD: string;\r\n FITALICS: string;\r\n FFONTSIZE: integer;\r\n FDISPLAYORDER: integer;\r\n FRETURNCALC: string;\r\n FREQUIRED: string;\r\n FVALIDVALUES: string;\r\n FSHORTHELPTEXT: string;\r\n FHELPDOCUMENT: string;\r\n FVISIBLE: string;\r\n FCONDITION: string;\r\n FCALCULATION: string;\r\n FAFFECTS: TAffects;\r\n FSTORE: string;\r\n FFORMAT: string;\t\t\t// FormButtons, SectButtons, FormTotals, Section\r\n \t\t\t\t\t\t\t\t\t// Numbers: 0 or 2, $, C(ommas), Z=Round and show with zeros, like 123.45 => 123.00\r\n // Dates: MM/DD/YYYY, etc\r\n FVERIFY: string;\r\n FELEMENT: string;\r\n function gString: string;\r\n procedure sString(const Value: string);\r\n procedure SetAFFECTS(const Value: TAffects);\r\n public\r\n property WEBFIELDID: integer read FWEBFIELDID write FWEBFIELDID;\r\n property WEBFORMID: integer read FWEBFORMID write FWEBFORMID;\r\n property TAGCODE: string read FTAGCODE write FTAGCODE;\r\n property LINECODE: string read FLINECODE write FLINECODE;\r\n property SECTIONID: integer read FSECTIONID write FSECTIONID;\r\n property WEBGROUPID: integer read FWEBGROUPID write FWEBGROUPID;\r\n property LINETYPE: string read FLINETYPE write FLINETYPE;\r\n property TAG: string read FTAG write FTAG;\r\n property DATATYPE: string read FDATATYPE write FDATATYPE;\r\n property ENTRYTYPE: string read FENTRYTYPE write FENTRYTYPE;\r\n property DESCRIPTION: string read FDESCRIPTION write FDESCRIPTION;\r\n property QUESTION: string read FQUESTION write FQUESTION;\r\n property BOLD: string read FBOLD write FBOLD;\r\n property ITALICS: string read FITALICS write FITALICS;\r\n property FONTSIZE: integer read FFONTSIZE write FFONTSIZE;\r\n property DISPLAYORDER: integer read FDISPLAYORDER write FDISPLAYORDER;\r\n property RETURNCALC: string read FRETURNCALC write FRETURNCALC;\r\n property REQUIRED: string read FREQUIRED write FREQUIRED;\r\n property VALIDVALUES: string read FVALIDVALUES write FVALIDVALUES;\r\n property SHORTHELPTEXT: string read FSHORTHELPTEXT write FSHORTHELPTEXT;\r\n property HELPDOCUMENT: string read FHELPDOCUMENT write FHELPDOCUMENT;\r\n property VISIBLE: string read FVISIBLE write FVISIBLE;\r\n property CONDITION: string read FCONDITION write FCONDITION;\r\n property CALCULATION: string read FCALCULATION write FCALCULATION;\r\n property FORMAT: string read FFORMAT write FFORMAT;\r\n property STORE: string read FSTORE write FSTORE;\r\n property VERIFY: string read FVERIFY write FVERIFY;\r\n property AFFECTS: TAffects read FAFFECTS write SetAFFECTS;\r\n property ELEMENT: string read FELEMENT write FELEMENT;\r\n\r\n function READONLY: boolean;\r\n function WRITEOUT: boolean;\r\n function ENTRYABLE: boolean;\r\n constructor Create;\toverload;\r\n constructor Create(pWEBFIELDID, pWEBFORMID, pSECTIONID, pWEBGROUPID, pFONTSIZE, pDISPLAYORDER: integer;\r\n \t\tpTAGCODE, pTAG, pDATATYPE, pENTRYTYPE, pDESCRIPTION, pQUESTION, pBOLD, pITALICS, pRETURNCALC,\r\n pREQUIRED, pVALIDVALUES, pSHORTHELPTEXT, pHELPDOCUMENT, pVISIBLE, pCONDITION, pCALCULATION,\r\n pFORMAT, pLINECODE, pSTORE, pVERIFY, pELEMENT: string); overload;\r\n destructor Destroy; override;\r\n property AsString: string read gString write sString;\r\n end;\r\n\r\n TSECTIONS = class\r\n private\r\n FWEBFORMID: integer;\r\n FSECTIONID: integer;\r\n FTAGCODE: string;\r\n FTAG: string;\r\n FDESCRIPTION: string;\r\n FDISPLAYORDER: integer;\r\n FQUESTION: string;\r\n FLINEID: string;\r\n FCONDITION: string;\r\n FCAPTION: string;\r\n FCOLOR: Integer;\r\n FHEADINGCOLOR: Integer;\r\n FFONTCOLOR: Integer;\r\n FPAGEVERIFY: string;\r\n function gString: string;\r\n procedure sString(const Value: string);\r\n public\r\n property WEBFORMID: integer read FWEBFORMID write FWEBFORMID;\r\n property SECTIONID: integer read FSECTIONID write FSECTIONID;\r\n property TAGCODE: string read FTAGCODE write FTAGCODE;\r\n property TAG: string read FTAG write FTAG;\r\n property DESCRIPTION: string read FDESCRIPTION write FDESCRIPTION;\r\n property DISPLAYORDER: integer read FDISPLAYORDER write FDISPLAYORDER;\r\n property QUESTION: string read FQUESTION write FQUESTION;\r\n property LINEID: string read FLINEID write FLINEID;\r\n property CONDITION: string read FCONDITION write FCONDITION;\r\n property CAPTION: string read FCAPTION write FCAPTION;\r\n property PAGEVERIFY: string read FPAGEVERIFY write FPAGEVERIFY;\r\n property COLOR: Integer read FCOLOR write FCOLOR;\r\n property HEADINGCOLOR: Integer read FHEADINGCOLOR write FHEADINGCOLOR;\r\n property FONTCOLOR: Integer read FFONTCOLOR write FFONTCOLOR;\r\n constructor Create(pWEBFORMID, pSECTIONID, pDISPLAYORDER, pCOLOR, pHEADINGCOLOR, pFONTCOLOR: integer;\r\n \t\tpTAGCODE, pTAG, pDESCRIPTION, pQUESTION, pLINEID, pCONDITION, pCAPTION, pPAGEVERIFY: string);\r\n property AsString: string read gString write sString;\r\n end;\r\n\r\n TGROUPS = class\r\n private\r\n FWEBFORMID: integer;\r\n FWEBGROUPID: integer;\r\n FTAGCODE: string;\r\n FSECTIONID: integer;\r\n FTAG: string;\r\n FDESCRIPTION: string;\r\n FDISPLAYORDER: integer;\r\n FMULTALLOWED: string;\r\n FQUESTION: string;\r\n FLINEID: string;\r\n FHORIZVERT: string;\r\n FCONDITION: string;\r\n FCAPTION: string;\r\n FSHOWFIELDCAPTIONS: string;\r\n FQUESTIONPOSITION: string;\r\n FCOLUMNWIDTHS: string;\r\n FCOLOR: Integer;\r\n FHEADINGCOLOR: Integer;\r\n FFONTCOLOR: Integer;\r\n FMAXINITCOUNT: integer;\r\n FENTRYVERIFY: string;\r\n function gString: string;\r\n procedure sString(const Value: string);\r\n procedure SetWidths;\r\n public\r\n nColumns: integer;\r\n ColumnWidths, ColumnLefts: array[1..10] of integer;\r\n property WEBFORMID: integer read FWEBFORMID write FWEBFORMID;\r\n property WEBGROUPID: integer read FWEBGROUPID write FWEBGROUPID;\r\n property TAGCODE: string read FTAGCODE write FTAGCODE;\r\n property SECTIONID: integer read FSECTIONID write FSECTIONID;\r\n property TAG: string read FTAG write FTAG;\r\n property DESCRIPTION: string read FDESCRIPTION write FDESCRIPTION;\r\n property DISPLAYORDER: integer read FDISPLAYORDER write FDISPLAYORDER;\r\n property MULTALLOWED: string read FMULTALLOWED write FMULTALLOWED;\r\n property QUESTION: string read FQUESTION write FQUESTION;\r\n property LINEID: string read FLINEID write FLINEID;\r\n property HORIZVERT: string read FHORIZVERT write FHORIZVERT;\r\n property CONDITION: string read FCONDITION write FCONDITION;\r\n property CAPTION: string read FCAPTION write FCAPTION;\r\n property SHOWFIELDCAPTIONS: string read FSHOWFIELDCAPTIONS write FSHOWFIELDCAPTIONS;\r\n property QUESTIONPOSITION: string read FQUESTIONPOSITION write FQUESTIONPOSITION;\r\n property COLOR: Integer read FCOLOR write FCOLOR;\r\n property HEADINGCOLOR: Integer read FHEADINGCOLOR write FHEADINGCOLOR;\r\n property FONTCOLOR: Integer read FFONTCOLOR write FFONTCOLOR;\r\n property MAXINITCOUNT: Integer read FMAXINITCOUNT write FMAXINITCOUNT;\r\n property ENTRYVERIFY: string read FENTRYVERIFY write FENTRYVERIFY;\r\n constructor Create(pWEBFORMID, pWEBGROUPID, pSECTIONID, pDISPLAYORDER, pCOLOR, pHEADINGCOLOR, pFONTCOLOR, pMAXINITCOUNT: integer;\r\n \t \t pTAGCODE, pTAG, pDESCRIPTION, pMULTALLOWED, pQUESTION, pLINEID, pHORIZVERT, pCONDITION, pCAPTION, pSHOWFIELDCAPTIONS, pQUESTIONPOSITION, pCOLUMNWIDTHS, pENTRYVERIFY: string);\r\n property AsString: string read gString write sString;\r\n end;\r\n\r\n TLOGINFORM = class\r\n private\r\n function gString: string;\r\n procedure sString(const Value: string);\r\n public\r\n \tLOGINTYPE,\r\n PURPOSES,\r\n FILETYPES,\r\n METHOD,\r\n VERIFY,\r\n CAPTION,\r\n CAPMESSAGE,\r\n INSTRUCTION1,\r\n INSTRUCTION2,\r\n INSTRUCTION3: string;\r\n property AsString: string read gString write sString;\r\n end;\r\n\r\n[async]\r\nfunction GetForms: boolean; async;\r\n\r\nfunction AddMGroupFieldsToFieldValues(gp: integer): integer;\r\n\r\nvar\r\n WebForms: array of TForms;\r\n WebFields: array of TFields;\r\n WebSections: array of TSections;\r\n WebGroups: array of TGroups;\r\n LoginForm: TLoginForm;\r\n nWebForms, nWebFields, nWebSections, nWebGroups: integer;\r\n\r\nimplementation\r\n\r\nuses ClientConnectionsDM, ClientCurrent, Utilities, Parameters, FieldPanelFactory,\r\n\tVerification, OptionsDM, entFieldValues;\r\n\r\nconstructor TFORMS.Create(pWEBFORMID: integer; pDESCRIPTION, pSTARTYEAR, pENDYEAR, pTAG, pCONDITION, pCAPTION, pPURPOSE: string);\r\nbegin\r\n\tinherited create;\r\n\r\n FWEBFORMID := pWEBFORMID;\r\n FDESCRIPTION := pDESCRIPTION;\r\n FSTARTYEAR := pSTARTYEAR;\r\n FENDYEAR := pENDYEAR;\r\n FTAG := pTAG;\r\n FCONDITION := pCONDITION;\r\n FCAPTION := pCAPTION;\r\n FPURPOSE := pPURPOSE;\r\nend;\r\n\r\nfunction TFORMS.gString: string;\r\nvar parm: TStringParams;\r\nbegin\r\n\tparm := TStringParams.create(10);\r\n parm.AsInteger[1] := FWebFormID;\r\n parm[2] := FTag;\r\n parm[3] := FDescription;\r\n parm[4] := FStartYear;\r\n parm[5] := FEndYear;\r\n parm[6] := FCondition;\r\n parm[7] := FCaption;\r\n parm[8] := FPurpose;\r\n parm.nParams := 8;\r\n result := parm.asString;\r\n parm.free;\r\nend;\r\n\r\nprocedure TFORMS.sString(const Value: string);\r\nvar parm: TStringParams;\r\nbegin\r\n\tparm := TStringParams.create(10);\r\n parm.asString := value;\r\n FWebFormID := parm.AsInteger[1];\r\n FTag := parm[2];\r\n FDescription := parm[3];\r\n FStartYear := parm[4];\r\n FEndYear := parm[5];\r\n FCondition := parm[6];\r\n FCaption := parm[7];\r\n FPurpose := parm[8];\r\n parm.free;\r\nend;\r\n\r\nconstructor TFIELDS.Create(pWEBFIELDID, pWEBFORMID, pSECTIONID, pWEBGROUPID, pFONTSIZE, pDISPLAYORDER: integer;\r\n pTAGCODE, pTAG, pDATATYPE, pENTRYTYPE, pDESCRIPTION, pQUESTION, pBOLD, pITALICS, pRETURNCALC,\r\n pREQUIRED, pVALIDVALUES, pSHORTHELPTEXT, pHELPDOCUMENT, pVISIBLE, pCONDITION, pCALCULATION,\r\n pFORMAT, pLINECODE, pSTORE, pVERIFY, pELEMENT: string); overload;\r\nbegin\r\n\tinherited create;\r\n\tFAFFECTS := TAFFECTS.create;\r\n FAFFECTS.reset;\r\n FWEBFIELDID := pWEBFIELDID;\r\n FWEBFORMID := pWEBFORMID;\r\n FTAGCODE := pTAGCODE;\r\n FSECTIONID := pSECTIONID;\r\n FWEBGROUPID := pWEBGROUPID;\r\n FLINETYPE := GetFieldLineType(pWebFormID, pWebFieldID, pWebGroupID);\r\n FTAG := pTAG;\r\n FDATATYPE := pDATATYPE;\r\n FENTRYTYPE := pENTRYTYPE;\r\n FDESCRIPTION := pDESCRIPTION;\r\n FQUESTION := pQUESTION;\r\n FBOLD := pBOLD;\r\n FITALICS := pITALICS;\r\n FFONTSIZE := pFONTSIZE;\r\n FDISPLAYORDER := pDISPLAYORDER;\r\n FRETURNCALC := pRETURNCALC;\r\n FREQUIRED := pREQUIRED;\r\n FVALIDVALUES := pVALIDVALUES;\r\n FSHORTHELPTEXT := pSHORTHELPTEXT;\r\n FHELPDOCUMENT := pHELPDOCUMENT;\r\n FVISIBLE := pVISIBLE;\r\n FCONDITION := pCONDITION;\r\n FCALCULATION := pCALCULATION;\r\n FFORMAT := pFORMAT;\r\n FLINECODE := pLINECODE;\r\n FSTORE := pSTORE;\r\n FVERIFY := pVERIFY;\r\n FELEMENT := pELEMENT;\r\nend;\r\n\r\nfunction FindFieldsIndex(fm, fld: integer): integer;\r\nvar i: integer;\r\nbegin\r\n\tresult := -1;\r\n for i := 0 to nWebFields-1 do with WebFields[i] do begin\r\n \tif (WebFormID = fm) and (WebFieldID = fld) then\r\n \tresult := i;\r\n end;\r\nend;\r\n\r\nfunction FindFormIndex(id: integer): integer;\r\nvar i: integer;\r\nbegin\r\n\tresult := -1;\r\n for i := 0 to nWebForms-1 do if WebForms[i].WebFormID = id then\r\n \tresult := i;\r\nend;\r\n\r\nconstructor TFIELDS.Create;\r\nbegin\r\n\tinherited create;\r\n\tFAFFECTS := TAFFECTS.create;\r\n FAFFECTS.reset;\r\nend;\r\n\r\ndestructor TFIELDS.Destroy;\r\nbegin\r\n\tFAFFECTS.free;\r\n\r\n inherited;\r\nend;\r\n\r\nfunction TFIELDS.ENTRYABLE: boolean;\r\nbegin\r\n\tresult := (pos(STORE, 'RND') = 0);\r\nend;\r\n\r\nfunction TFIELDS.READONLY: boolean;\r\nbegin\r\n\tresult := (pos(STORE, 'RSD') > 0);\r\nend;\r\n\r\nfunction TFIELDS.WRITEOUT: boolean;\r\nbegin\r\n\tresult := true;\t// write everything so available for printing form - (pos(STORE, 'YSD') > 0);\r\nend;\r\n\r\nfunction TFIELDS.gString: string;\r\nvar parm: TStringParams;\r\nbegin\r\n\tparm := TStringParams.create(28);\r\n parm.AsInteger[1] := FWebFIELDID;\r\n parm.AsInteger[2] := FWebFormID;\r\n parm[3] := FTAGCODE;\r\n parm.AsInteger[4] := FSECTIONID;\r\n parm.AsInteger[5] := FWEBGROUPID;\r\n parm[6] := FTAG;\r\n parm[7] := FDATATYPE;\r\n parm[8] := FENTRYTYPE;\r\n parm[9] := FDESCRIPTION;\r\n parm[10] := FQUESTION;\r\n parm[11] := FBOLD;\r\n parm[12] := FITALICS;\r\n parm.AsInteger[13] := FFONTSIZE;\r\n parm.AsInteger[14] := FDISPLAYORDER;\r\n parm[15] := FRETURNCALC;\r\n parm[16] := FREQUIRED;\r\n parm[17] := FVALIDVALUES;\r\n parm[18] := FSHORTHELPTEXT;\r\n parm[19] := FHELPDOCUMENT;\r\n parm[20] := FVISIBLE;\r\n parm[21] := FCONDITION;\r\n parm[22] := FCALCULATION;\r\n parm[23] := FFORMAT;\r\n parm[24] := FLINECODE;\r\n parm[25] := FSTORE;\r\n parm[26] := FVERIFY;\r\n parm[27] := FELEMENT;\r\n result := parm.asString;\r\n parm.free;\r\nend;\r\n\r\nprocedure TFIELDS.SetAFFECTS(const Value: TAffects);\r\nbegin\r\n FAFFECTS := Value;\r\nend;\r\n\r\nprocedure TFIELDS.sString(const Value: string);\r\nvar parm: TStringParams;\r\nbegin\r\n\tparm := TStringParams.create(28);\r\n parm.asString := value;\r\n FWebFIELDID := parm.AsInteger[1];\r\n FWebFormID := parm.AsInteger[2];\r\n\tFAFFECTS := TAFFECTS.create;\r\n FAFFECTS.reset;\r\n FTAGCODE := parm[3];\r\n FSECTIONID := parm.AsInteger[4];\r\n FWEBGROUPID := parm.AsInteger[5];\r\n FLINETYPE := GetFieldLineType(FWebFormID, FWebFieldID, FWebGroupID);\r\n FTAG := parm[6];\r\n FDATATYPE := parm[7];\r\n FENTRYTYPE := parm[8];\r\n FDESCRIPTION := parm[9];\r\n FQUESTION := parm[10];\r\n FBOLD := parm[11];\r\n FITALICS := parm[12];\r\n FFONTSIZE := parm.AsInteger[13];\r\n FDISPLAYORDER := parm.AsInteger[14];\r\n FRETURNCALC := parm[15];\r\n FREQUIRED := parm[16];\r\n FVALIDVALUES := parm[17];\r\n FSHORTHELPTEXT := parm[18];\r\n FHELPDOCUMENT := parm[19];\r\n FVISIBLE := parm[20];\r\n FCONDITION := parm[21];\r\n FCALCULATION := parm[22];\r\n FFORMAT := parm[23];\r\n FLINECODE := parm[24];\r\n FSTORE := parm[25];\r\n FVERIFY := parm[26];\r\n FELEMENT := parm[26];\r\n parm.free;\r\nend;\r\n\r\nconstructor TSECTIONS.Create(pWEBFORMID, pSECTIONID, pDISPLAYORDER, pCOLOR, pHEADINGCOLOR, pFONTCOLOR: integer;\r\n\t pTAGCODE, pTAG, pDESCRIPTION, pQUESTION, pLINEID, pCONDITION, pCAPTION, pPAGEVERIFY: string);\r\nbegin\r\n\tinherited create;\r\n\r\n FWEBFORMID := pWEBFORMID;\r\n FSECTIONID := pSECTIONID;\r\n FTAGCODE := pTAGCODE;\r\n FTAG := pTAG;\r\n FDESCRIPTION := pDESCRIPTION;\r\n FDISPLAYORDER := pDISPLAYORDER;\r\n FQUESTION := pQUESTION;\r\n FLINEID := pLINEID;\r\n FCONDITION := pCONDITION;\r\n FCAPTION := pCAPTION;\r\n FCOLOR := pCOLOR;\r\n FHEADINGCOLOR := pHEADINGCOLOR;\r\n FFONTCOLOR := pFONTCOLOR;\r\n FPAGEVERIFY := pPAGEVERIFY;\r\nend;\r\n\r\nfunction TSECTIONS.gString: string;\r\nvar parm: TStringParams;\r\nbegin\r\n\tparm := TStringParams.create(15);\r\n parm.AsInteger[1] := FWebFormID;\r\n parm.AsInteger[2] := FSECTIONID;\r\n parm[3] := FTAGCODE;\r\n parm[4] := FTAG;\r\n parm[5] := FDESCRIPTION;\r\n parm.AsInteger[6] := FDISPLAYORDER;\r\n parm[7] := FQUESTION;\r\n parm[8] := FLINEID;\r\n parm[9] := FCONDITION;\r\n parm[10] := FCAPTION;\r\n parm.AsInteger[11] := FCOLOR;\r\n parm.AsInteger[12] := FHEADINGCOLOR;\r\n parm.AsInteger[13] := FFONTCOLOR;\r\n parm[14] := FPAGEVERIFY;\r\n parm.nParams := 14;\r\n result := parm.asString;\r\n parm.free;\r\nend;\r\n\r\nprocedure TSECTIONS.sString(const Value: string);\r\nvar parm: TStringParams;\r\nbegin\r\n\tparm := TStringParams.create(15);\r\n parm.asString := value;\r\n FWebFormID := parm.AsInteger[1];\r\n FSECTIONID := parm.AsInteger[2];\r\n FTAGCODE := parm[3];\r\n FTAG := parm[4];\r\n FDESCRIPTION := parm[5];\r\n FDISPLAYORDER := parm.AsInteger[6];\r\n FQUESTION := parm[7];\r\n FLINEID := parm[8];\r\n FCONDITION := parm[9];\r\n FCAPTION := parm[10];\r\n FCOLOR := parm.AsInteger[11];\r\n FHEADINGCOLOR := parm.asInteger[12];\r\n FFONTCOLOR := parm.asInteger[13];\r\n FPAGEVERIFY := parm[14];\r\n parm.free;\r\nend;\r\n\r\nconstructor TGROUPS.Create(pWEBFORMID, pWEBGROUPID, pSECTIONID, pDISPLAYORDER, pCOLOR, pHEADINGCOLOR, pFONTCOLOR, pMAXINITCOUNT: integer;\r\n\t pTAGCODE, pTAG, pDESCRIPTION, pMULTALLOWED, pQUESTION, pLINEID, pHORIZVERT, pCONDITION, pCAPTION, pSHOWFIELDCAPTIONS, pQUESTIONPOSITION, pCOLUMNWIDTHS, pENTRYVERIFY: string);\r\nbegin\r\n\tinherited create;\r\n\r\n FWEBFORMID := pWEBFORMID;\r\n FWEBGROUPID := pWEBGROUPID;\r\n FTAGCODE := pTAGCODE;\r\n FSECTIONID := pSECTIONID;\r\n FTAG := pTAG;\r\n FDESCRIPTION := pDESCRIPTION;\r\n FDISPLAYORDER := pDISPLAYORDER;\r\n FMULTALLOWED := pMULTALLOWED;\r\n FQUESTION := pQUESTION;\r\n FLINEID := pLINEID;\r\n FHORIZVERT := pHORIZVERT;\r\n FCONDITION := pCONDITION;\r\n FCAPTION := pCAPTION;\r\n FSHOWFIELDCAPTIONS := pSHOWFIELDCAPTIONS;\r\n FQUESTIONPOSITION := pQUESTIONPOSITION;\r\n FCOLUMNWIDTHS := pCOLUMNWIDTHS;\r\n FCOLOR := pCOLOR;\r\n FHEADINGCOLOR := pHEADINGCOLOR;\r\n FFONTCOLOR := pFONTCOLOR;\r\n FMAXINITCOUNT := pMAXINITCOUNT;\r\n FENTRYVERIFY := pENTRYVERIFY;\r\n SetWidths;\r\nend;\r\n\r\nfunction TGROUPS.gString: string;\r\nvar parm: TStringParams;\r\nbegin\r\n\tparm := TStringParams.create(21);\r\n parm.AsInteger[1] := FWebFormID;\r\n parm.AsInteger[2] := FWEBGROUPID;\r\n parm[3] := FTAGCODE;\r\n parm.AsInteger[4] := FSECTIONID;\r\n parm[5] := FTAG;\r\n parm[6] := FDESCRIPTION;\r\n parm.AsInteger[7] := FDISPLAYORDER;\r\n parm[8] := FMULTALLOWED;\r\n parm[9] := FQUESTION;\r\n parm[10] := FLINEID;\r\n parm[11] := FHORIZVERT;\r\n parm[12] := FCONDITION;\r\n parm[13] := FCAPTION;\r\n parm[14] := FSHOWFIELDCAPTIONS;\r\n parm[15] := FQUESTIONPOSITION;\r\n parm.AsInteger[17] := FCOLOR;\r\n parm.AsInteger[18] := FHEADINGCOLOR;\r\n parm.AsInteger[19] := FFONTCOLOR;\r\n parm.AsInteger[20] := FMAXINITCOUNT;\r\n parm[21] := FENTRYVERIFY;\r\n parm.nParams := 21;\r\n result := parm.asString;\r\n parm.free;\r\nend;\r\n\r\nprocedure TGROUPS.SetWidths;\r\nvar i, p: integer;\r\n\t s: string;\r\nbegin\r\n // FCOLUMNWIDTHS\r\n if FColumnWidths > ' ' then begin\r\n \tnColumns := 0;\r\n ColumnLefts[1] := 8;\r\n s := FColumnWidths;\r\n i := 1;\r\n repeat\r\n \tp := pos(':', s);\r\n inc(nColumns);\r\n if p = 1 then begin\r\n\t\t ColumnWidths[nColumns] := SiteOpts.CapWidth;\r\n \ts := copy(s, p+1, length(s)-p);\r\n end\r\n else if p = 0 then begin\r\n\t\t ColumnWidths[nColumns] := strtointdef(s, 100);\r\n end\r\n else begin\r\n\t\t ColumnWidths[nColumns] := strtointdef(copy(s, 1, p-1), 100);\r\n \ts := copy(s, p+1, length(s)-p);\r\n end;\r\n ColumnLefts[nColumns+1] := ColumnLefts[nColumns] + ColumnWidths[nColumns] + 4;\r\n until p = 0;\r\n end\r\n else begin\r\n \tnColumns := 5;\r\n ColumnLefts[1] := 8;\r\n ColumnWidths[1] := SiteOpts.CapWidth;\r\n for i := 2 to 5 do begin\r\n \tColumnLefts[i] := ColumnLefts[i-1] + ColumnWidths[i-1] + 4;\r\n ColumnWidths[i] := 100;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TGROUPS.sString(const Value: string);\r\nvar parm: TStringParams;\r\nbegin\r\n\tparm := TStringParams.create(21);\r\n parm.asString := value;\r\n FWebFormID := parm.AsInteger[1];\r\n FWEBGROUPID := parm.AsInteger[2];\r\n FTAGCODE := parm[3];\r\n FSECTIONID := parm.AsInteger[4];\r\n FTAG := parm[5];\r\n FDESCRIPTION := parm[6];\r\n FDISPLAYORDER := parm.AsInteger[7];\r\n FMULTALLOWED := parm[8];\r\n FQUESTION := parm[9];\r\n FLINEID := parm[10];\r\n FHORIZVERT := parm[11];\r\n FCONDITION := parm[12];\r\n FCAPTION := parm[13];\r\n FSHOWFIELDCAPTIONS := parm[14];\r\n FQUESTIONPOSITION := parm[15];\r\n FCOLUMNWIDTHS := parm[16];\r\n FCOLOR := parm.AsInteger[17];\r\n FHEADINGCOLOR := parm.AsInteger[18];\r\n FFONTCOLOR := parm.AsInteger[19];\r\n FMAXINITCOUNT := parm.AsInteger[20];\r\n FENTRYVERIFY := parm[21];\r\n SetWidths;\r\n parm.free;\r\nend;\r\n\r\nfunction GetForms: boolean;\r\nvar i, ntyp, extraflds, mult {, cntr}: integer;\r\n promise: TJSXMLHttpRequest;\r\n request, s: string;\r\n formarr: TStringParams;\r\n wf: TFORMS;\r\n wfld: TFIELDS;\r\n ws: TSECTIONS;\r\n wg: TGROUPS;\r\n {dbgmode: boolean;}\r\n\r\n{ function GiveList: string;\r\n var i: integer;\r\n begin\r\n s := '';\r\n for i := 1 to nWebForms do\r\n \ts := s + 'F'+inttostr(WebForms[i].WebFormID) + ':' + WebForms[i].Description;\r\n for i := 1 to nWebSections do\r\n \ts := s + 'S'+WebSections[i].Description;\r\n for i := 1 to nWebGroups do\r\n \ts := s + 'G'+WebGroups[i].Description;\r\n for i := 1 to nWebFields do\r\n \ts := s + ' ' + WebFields[i].Description;\r\n result := s;\r\n end;\r\n}\r\n{\r\n procedure DbgMessage(s: string);\r\n begin\r\n \tif dbgmode then\r\n \tShowMessage(s);\r\n inc(cntr);\r\n if cntr > 10 then dbgmode := false;\r\n end;\r\n}\r\n\r\nbegin\r\n\tif CurrentTaxYear > '2000' then\r\n\t\trequest := 'FormLayouts?Year=' + CurrentTaxYear\r\n else\r\n\t\trequest := 'FormLayouts?Year=' + SiteOpts.TaxYear;\r\n dmClientConnections.HttpRequest.URL := CTSERVICECONNSTRING + request;\r\n\tIncCallCounter(ccFormLayouts);\r\n promise := await(TJSXMLHttpRequest, dmClientConnections.HttpRequest.Perform);\r\n s := XMLSplitValue(promise.ResponseText);\r\n //ShowMessage(s);\r\n result := true;\r\n {dbgmode := true;}\r\n {cntr := 0};\r\n formarr := TStringParams.Create(500, '~');\t//#13#10);\r\n formarr.AsString := s;\r\n// showmessage(inttostr(formarr.nParams)+'/'+inttostr(length(formarr[1])) + '/' + copy(formarr[1], 1, 10) + '=====' + copy(formarr[2], 1, 10));\r\n \tnWebForms := 0;\r\n nWebFields := 0;\r\n nWebSections := 0;\r\n nWebGroups := 0;\r\n extraflds := 5;\r\n wg := TGroups.create;\r\n for i := 1 to formarr.nParams do begin\r\n \tntyp := pos(copy(formarr[i], 1, 1), 'WSGF');\r\n// \tdbgmessage(inttostr(ntyp) + ' ' + formarr[i]);\r\n if ntyp > 0 then begin\r\n \tcase ntyp of\r\n \t1: inc(nWebForms);\r\n \t2: inc(nWebSections);\r\n \t3: begin\r\n \t\tinc(nWebGroups);\r\n\t\t\t\t\t wg.AsString := formarr[i];\r\n if wg.MultAllowed = 'Y' then begin\r\n\t mult := 16;\r\n if wg.MaxInitCount > 10 then mult := wg.MaxInitCount + 5;\t// plan for 5 rows beyond initial\r\n \t extraflds := extraflds + 6 * mult;\t\t// up to 6 fields each row\r\n end;\r\n \tend;\r\n \t4: inc(nWebFields);\r\n end;\r\n end;\r\n end;\r\n wg.free;\r\n//showmessage('GetForms(1): ' +inttostr(nWebForms) + '/' +inttostr(nWebSections) + '/' +inttostr(nWebGroups) + '/' +inttostr(nWebFields));\r\n SetLength(WebForms, nWebForms);\r\n SetLength(WebSections, nWebSections);\r\n SetLength(WebGroups, nWebGroups);\r\n SetLength(WebFields, nWebFields);\r\n \tnWebForms := 0;\r\n nWebFields := 0;\r\n nWebSections := 0;\r\n nWebGroups := 0;\r\n FieldValues := TFieldValues.Create(nWebFields+nWebGroups+extraflds);\r\n// VerifyTool := TVerification.create;\r\n {dbgmode := true;\r\n cntr := 0;}\r\n for i := 1 to formarr.nParams do begin\r\n \tntyp := pos(copy(formarr[i], 1, 1), 'WSGF');\r\n s := copy(formarr[i], 3, length(formarr[i])-2);\r\n// \tdbgmessage('->'+inttostr(ntyp) + ' ' + s);\r\n if ntyp > 0 then begin\r\n \tcase ntyp of\r\n \t1: begin\r\n\t\t\t wf := TForms.create;\r\n wf.AsString := s;\r\n \t\t\tWebForms[nWebForms] := wf;\r\n \t\tinc(nWebForms);\r\n \tend;\r\n \t2: begin\r\n\t\t\t ws := TSections.create;\r\n ws.AsString := s;\r\n \t\t\tWebSections[nWebSections] := ws;\r\n \t\tinc(nWebSections);\r\n \tend;\r\n \t3: begin\r\n\t\t\t wg := TGroups.create;\r\n wg.AsString := s;\r\n \t\t\tWebGroups[nWebGroups] := wg;\r\n \t\tinc(nWebGroups);\r\n \tend;\r\n \t4: begin\r\n\t\t\t wfld := TFields.create;\r\n wfld.AsString := s;\r\n \t\t\tWebFields[nWebFields] := wfld;\r\n \t\tinc(nWebFields);\r\n FieldValues.Add(wfld.WEBFIELDID, wfld.WEBFORMID, wfld.WEBGROUPID, 0, 0, 0,\r\n wfld.LINETYPE, wfld.LINECODE, wfld.TAGCODE, '', (wfld.RETURNCALC='Y'), wfld.WRITEOUT);\r\n \tend;\r\n end;\r\n end;\r\n end;\r\n SetAffects;\r\n GroupHandlers := TMultGroupHandlers.create;\r\n// ShowMessage(GiveList);\r\n//showmessage('GetForms: ' +inttostr(nWebForms) + '/' +inttostr(nWebSections) + '/' +inttostr(nWebGroups) + '/' +inttostr(nWebFields));\r\nend;\r\n\r\nfunction AddMGroupFieldsToFieldValues(gp: integer): integer;\r\nvar f, nextndx: integer;\r\nbegin\r\n\tnextndx := FieldValues.MaxGroupIndex(gp) + 1;\r\n\tfor f := 0 to nWebFields-1 do with WebFields[f] do begin\r\n \tif (WebGroupID = gp) then\r\n FieldValues.Add(WEBFIELDID, WEBFORMID, WEBGROUPID, nextndx, 0, 0,\r\n LINETYPE, LINECODE, TAGCODE, '', (RETURNCALC='Y'), WRITEOUT);\r\n end;\r\n result := nextndx;\r\nend;\r\n\r\nfunction GetFieldFormat(fm, fld: integer): string;\r\nvar i: integer;\r\nbegin\r\n\tresult := '';\r\n for i := 0 to nWebFields-1 do with WebFields[i] do begin\r\n \tif (WebFormID = fm) and (WebFieldID = fld) then begin\r\n \tresult := Format;\r\n if (result = '') and (DataType = '1') then\r\n \tresult := SiteOpts.NumberFormatting;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction GetFieldLineType(fm, fld, grp: integer): string;\r\nvar i, {sect,} gp: integer;\r\nbegin\r\n\tresult := '';\r\n for i := 0 to nWebForms-1 do with WebForms[i] do\r\n \tif WebFormID = fm then\r\n \tresult := purpose;\r\n if grp > 0 then begin\r\n for gp := 0 to nWebGroups-1 do\r\n if (WebGroups[gp].WebGroupID = grp) and (WebGroups[gp].LineID > ' ') then\r\n result := WebGroups[gp].LineID;\r\n end;\r\n{ for i := 0 to nWebFields-1 do with WebFields[i] do begin\r\n \tif (WebFormID = fm) and (WebFieldID = fld) then begin\r\n \tif WebGroupID > 0 then begin\r\n for gp := 0 to nWebGroups-1 do\r\n \tif (WebGroups[gp].WebGroupID = WebGroupID) and (WebGroups[gp].LineID > ' ') then\r\n \tresult := WebGroups[gp].LineID;\r\n end\r\n else begin\r\n for sect := 0 to nWebSections-1 do\r\n \tif WebSections[sect].SectionID = SectionID then\r\n \tresult := WebSections[sect].LineID;\r\n end;\r\n end;\r\n end;\r\n}\r\nend;\r\n\r\nfunction FindSectionIndex(sect: integer): integer;\r\nvar i: integer;\r\nbegin\r\n result := -1;\r\n for i := 0 to nWebSections-1 do begin\r\n \tif (CurrentFormID = WebSections[i].WebFormID) and (sect = WebSections[i].SectionID) then\r\n \tresult := i;\r\n end;\r\nend;\r\n\r\n{ TAFFECTS }\r\n\r\nprocedure TAFFECTS.AffectsSection(fm: integer);\r\nvar i: integer;\r\n\t fnd, already: boolean;\r\nbegin\r\n\ti := 0;\r\n fnd := false;\r\n already := false;\r\n repeat\r\n \tinc(i);\r\n\t\tif SectButtons[i] = 0 then\r\n \tfnd := true\r\n\t\telse if (SectButtons[i] = fm) then\r\n \talready := true;\r\n until fnd or already or (i > 10);\r\n if fnd then\r\n \tSectButtons[i] := fm;\r\nend;\r\n\r\nfunction TAFFECTS.Any: boolean;\r\nbegin\r\n\tresult := false;\r\n if FormButtons then result := true\r\n else if SectButtons[1] > 0 then result := true\r\n else if Sections[1, 1] > 0 then result := true;\r\nend;\r\n\r\nprocedure TAFFECTS.AffectsField(fm, sect: integer);\r\nvar i: integer;\r\n\t fnd, already: boolean;\r\nbegin\r\n\ti := 0;\r\n fnd := false;\r\n already := false;\r\n repeat\r\n \tinc(i);\r\n\t\tif Sections[i, 1] = 0 then\r\n \tfnd := true\r\n\t\telse if (Sections[i, 1] = fm) and (Sections[i, 2] = sect) then\r\n \talready := true;\r\n until fnd or already or (i > 10);\r\n if fnd then begin\r\n \tSections[i, 1] := fm;\r\n \tSections[i, 2] := sect;\r\n end;\r\nend;\r\n\r\nprocedure TAFFECTS.AffectsForm;\r\nbegin\r\n\tFormButtons := true;\r\nend;\r\n\r\n\r\nprocedure TAFFECTS.Reset;\r\nvar i: integer;\r\nbegin\r\n\tFormButtons := false;\r\n for i := 1 to 10 do begin\r\n \tSectButtons[i] := 0;\t\t// list of forms\r\n Sections[i, 1] := 0;\r\n Sections[i, 2] := -1;\r\n end;\r\nend;\r\n\r\nprocedure SetAffects;\r\nvar i, j, nfnd: integer;\r\n\t fnd: array[1..10] of integer;\r\n\r\n function FindField(fm, fld: integer): integer;\r\n var i: integer;\r\n begin\r\n result := -1;\r\n \tfor i := 0 to nWebFields-1 do with WebFields[i] do begin\r\n \tif (WebFormID = fm) and (WebFieldID = fld) then result := i;\r\n end;\r\n end;\r\n\r\n procedure AnalyzeCondition(cond: string);\r\n var i, st, st2, ndx, en, fm, fld, h: integer;\r\n g: boolean;\r\n begin\r\n \tnfnd := 0;\r\n en := 0;\r\n st := 0;\r\n fm := 0;\r\n fld := 0;\r\n g := false;\r\n for i := i to length(cond) do begin\r\n \tif cond[i] = '{' then begin\r\n st := i + 1;\r\n st2 := st;\r\n end\r\n else if (cond[i] = '.') and (st > 0) and (en = 0) then begin\r\n \th := strtointdef(copy(cond, st2, i-st2), 0);\r\n \tif fm = 0 then fm := h\r\n else if not g then g := true;\r\n st2 := i + 1;\r\n end\r\n else if cond[i] = '}' then begin\r\n \tfld := strtointdef(copy(cond, st2, i-st2), 0);\r\n ndx := FindField(fm, fld);\r\n if ndx >= 0 then begin\r\n \tinc(nfnd);\r\n \tfnd[nfnd] := ndx;\r\n end;\r\n en := 0;\r\n st := 0;\r\n fm := 0;\r\n fld := 0;\r\n g := false;\r\n end;\r\n end;\r\n end;\r\n\r\nbegin\r\n\tfor i := 0 to nWebForms-1 do begin\r\n \tif WebForms[i].Condition > ' !' then begin\r\n \tAnalyzeCondition(WebForms[i].Condition);\r\n \tfor j := 1 to nfnd do\r\n \tWebFields[fnd[j]].Affects.AffectsForm;\r\n end;\r\n end;\r\n\tfor i := 0 to nWebSections-1 do begin\r\n \tif WebSections[i].Condition > ' !' then begin\r\n \tAnalyzeCondition(WebSections[i].Condition);\r\n \tfor j := 1 to nfnd do\r\n \tWebFields[fnd[j]].Affects.AffectsSection(WebSections[i].WebFormID);\r\n end;\r\n end;\r\n\tfor i := 0 to nWebGroups-1 do begin\r\n \tif WebGroups[i].Condition > ' !' then begin\r\n \tAnalyzeCondition(WebGroups[i].Condition);\r\n \tfor j := 1 to nfnd do\r\n \tWebFields[fnd[j]].Affects.AffectsField(WebGroups[i].WebFormID, WebGroups[i].SectionID);\r\n end;\r\n end;\r\n\tfor i := 0 to nWebFields-1 do begin\r\n \tif WebFields[i].Condition > ' !' then begin\r\n \tAnalyzeCondition(WebFields[i].Condition);\r\n \tfor j := 1 to nfnd do\r\n \tWebFields[fnd[j]].Affects.AffectsField(WebFields[i].WebFormID, WebFields[i].SectionID);\r\n end;\r\n end;\r\nend;\r\n\r\n{ TLOGINFORM }\r\n\r\nfunction TLOGINFORM.gString: string;\r\nbegin\r\n\tresult := LOGINTYPE + '|' + PURPOSES + '|' + FILETYPES + '|' +\r\n METHOD + '|' + VERIFY + '|' + CAPTION + '|' + CAPMESSAGE + '|' +\r\n INSTRUCTION1 + '|' + INSTRUCTION2 + '|' + INSTRUCTION3 + '|';\r\nend;\r\n\r\nprocedure TLOGINFORM.sString(const Value: string);\r\nvar parm: TStringParams;\r\nbegin\r\n parm := TStringParams.create(10);\r\n parm.AsString := Value;\r\n LOGINTYPE := parm[1];\r\n PURPOSES := parm[2];\r\n FILETYPES := parm[3];\r\n METHOD := parm[4];\r\n VERIFY := parm[5];\r\n CAPTION := parm[6];\r\n CAPMESSAGE := parm[7];\r\n INSTRUCTION1 := parm[8];\r\n INSTRUCTION2 := parm[9];\r\n INSTRUCTION3 := parm[10];\r\n parm.free;\r\nend;\r\n\r\nend.\r\n\r\n","unit entReturns;\r\n\r\ninterface\r\n\r\n uses SysUtils;\r\n\r\ntype\r\n TReturns = class\r\n private\r\n public\r\n end;\r\n\r\n RAssess = record\r\n\t \tDueDate: TDate;\r\n \tWages, WH, Paid, ToPay: double;\r\n end;\r\n\r\n TRecon = class\r\n private\r\n mFreq, mYear: string;\r\n mCount, mPers: integer;\r\n mPeriods: array[1..25] of RAssess;\r\n function gPeriods(ndx: integer): RAssess;\r\n function gAsString: string;\r\n procedure sAsString(const Value: string);\r\n function gDueDate(ndx: integer): TDate;\r\n function gPaid(ndx: integer): double;\r\n function gWages(ndx: integer): double;\r\n function gWH(ndx: integer): double;\r\n procedure sDueDate(ndx: integer; const Value: TDate);\r\n procedure sPaid(ndx: integer; const Value: double);\r\n procedure sWages(ndx: integer; const Value: double);\r\n procedure sWH(ndx: integer; const Value: double);\r\n procedure sFreq(const Value: string);\r\n function gPay(ndx: integer): double;\r\n procedure sPay(ndx: integer; const Value: double);\r\n public\r\n procedure Clear;\r\n property Frequency: string read mFreq write sFreq;\r\n property NumPeriods: integer read mPers;\r\n property Year: string read mYear write mYear;\r\n property Count: integer read mCount write mCount;\r\n property Periods[ndx: integer]: RAssess read gPeriods; default;\r\n property PeriodWages[ndx: integer]: double read gWages write sWages;\r\n property PeriodWH[ndx: integer]: double read gWH write sWH;\r\n property PeriodPaid[ndx: integer]: double read gPaid write sPaid;\r\n property PeriodToPay[ndx: integer]: double read gPay write sPay;\r\n property DueDates[ndx: integer]: TDate read gDueDate write sDueDate;\r\n property AsString: string read gAsString write sAsString;\r\n procedure SetToFieldValues;\r\n procedure ReadFromFieldValues;\r\n end;\r\n\r\n TRecons = class\r\n public\r\n\t \tnRecons: integer;\r\n \t\tReconArr: array[1..10] of TRecon;\r\n TotPays: array[1..10] of double;\r\n function Active: boolean;\r\n procedure Clear;\r\n procedure Add(s: string);\r\n function Find(yr: string): integer;\r\n procedure SetTotalPays;\r\n procedure StoreData;\r\n procedure LoadData;\r\n procedure ClearPayments;\r\n\t\tprocedure FillPaymentDetail(var arr: array of string; var cnt: integer; s: string);\r\n procedure DataToConsole;\r\n constructor Create;\r\n destructor Destroy; override;\r\n end;\r\n\r\n RPayInfo = record\r\n \t PYear: string;\r\n PPaid: double;\r\n end;\r\n\r\n TPayInfo = class\r\n\t HoldPays: array[1..20] of RPayInfo;\r\n nHoldPays: integer;\r\n procedure DebugCurrentData(cap: string);\r\n function CurrPaid: double;\r\n\t procedure Clear;\r\n procedure ToFieldValues;\r\n procedure FromFieldValues;\r\n procedure ToHistory;\r\n end;\r\n\r\nvar Recons: TRecons;\r\n\t PayInfo: TPayInfo;\r\n\r\nimplementation\r\n\r\nuses entFieldValues, Parameters, ClientCurrent, OptionsDM,\r\n\tClientConnectionsDM;\r\n\r\n{ TWebRecon }\r\n\r\nprocedure TRecon.Clear;\r\nbegin\r\n\tmCount := 0;\r\nend;\r\n\r\nprocedure TRecons.DataToConsole;\r\nvar i: integer;\r\n\t s: string;\r\nbegin\r\n\ts := inttostr(nRecons);\r\n\tfor i := 1 to nRecons do\r\n \ts := s + '/' + ReconArr[i].AsString + #13;\r\n\tdmClientConnections.SendConsoleMessage('Recons: ' + s);\r\nend;\r\n\r\nfunction TRecon.gAsString: string;\r\nvar parm: TStringParams;\r\n\t per, ndx: integer;\r\nbegin\r\n\tparm := TStringParams.create(125);\r\n parm[1] := '4';\r\n parm.asInteger[2] := CurrentReturnID;\r\n parm.asInteger[3] := CurrentTaxpayerID;\r\n parm[4] := mYear;\r\n for per := 1 to mCount do begin\r\n \tndx := 4*per;\r\n parm.AsFloat[ndx+1] := mPeriods[per].WH;\r\n parm.AsFloat[ndx+2] := mPeriods[per].Paid;\r\n parm.AsFloat[ndx+3] := mPeriods[per].Wages;\r\n parm.AsDate[ndx+4] := mPeriods[per].DueDate;\r\n end;\r\n result := parm.AsString;\r\n parm.free;\r\nend;\r\n\r\nfunction TRecon.gDueDate(ndx: integer): TDate;\r\nbegin\r\n\tresult := mPeriods[ndx].DueDate;\r\nend;\r\n\r\nfunction TRecon.gPaid(ndx: integer): double;\r\nbegin\r\n\tresult := mPeriods[ndx].Paid;\r\nend;\r\n\r\nfunction TRecon.gPay(ndx: integer): double;\r\nbegin\r\n\tresult := mPeriods[ndx].ToPay;\r\nend;\r\n\r\nfunction TRecon.gPeriods(ndx: integer): RAssess;\r\nbegin\r\n\tresult := mPeriods[ndx];\r\nend;\r\n\r\nfunction TRecon.gWages(ndx: integer): double;\r\nbegin\r\n\tresult := mPeriods[ndx].Wages;\r\nend;\r\n\r\nfunction TRecon.gWH(ndx: integer): double;\r\nbegin\r\n\tresult := mPeriods[ndx].WH;\r\nend;\r\n\r\nprocedure TRecon.sAsString(const Value: string);\r\nvar parm: TStringParams;\r\n\t cnt, per, ndx: integer;\r\nbegin\r\n\tparm := TStringParams.create(125);\r\n\tparm.asString := Value;\r\n cnt := parm.nParams;\r\n if cnt > 80 then begin\r\n \tmCount := 24;\r\n mFreq := 'S';\r\n end\r\n else if cnt > 50 then begin\r\n \tmCount := 12;\r\n mFreq := 'M';\r\n end\r\n else if cnt > 5 then begin\r\n \tmCount := 4;\r\n mFreq := 'Q';\r\n end\r\n else begin\r\n \tmCount := 1;\r\n mFreq := 'A';\r\n end;\r\n mPers := mCount;\r\n\tmYear := parm[6];\r\n for per := 1 to mCount do begin\r\n \tndx := 4*per + 2;\r\n mPeriods[per].WH := parm.AsFloat[ndx+1];\r\n mPeriods[per].Paid := parm.AsFloat[ndx+2];\r\n mPeriods[per].Wages := parm.AsFloat[ndx+3];\r\n mPeriods[per].DueDate := parm.AsDate[ndx+4];\r\n end;\r\nend;\r\n\r\nprocedure TRecon.sDueDate(ndx: integer; const Value: TDate);\r\nbegin\r\n\tmPeriods[ndx].DueDate := value;\r\nend;\r\n\r\nprocedure TRecon.ReadFromFieldValues;\r\nvar p: integer;\r\nbegin\r\n\tfor p := 1 to mPers do begin\r\n \tmPeriods[p].WH := FieldValues.GetByLineCodeV('WPWH', p);\r\n \tmPeriods[p].Paid := FieldValues.GetByLineCodeV('WPPAYS', p);\r\n \tmPeriods[p].Wages := FieldValues.GetByLineCodeV('WPWAGES', p);\r\n \tmPeriods[p].ToPay := FieldValues.GetByLineCodeV('WPPAY', p);\r\n end;\r\nend;\r\n\r\nprocedure TRecon.SetToFieldValues;\r\nvar p: integer;\r\nbegin\r\n// dmClientConnections.SendConsoleMessage('Set WP Field Values: ' + inttostr(mPers));\r\n// FieldValues.DebugShowAll;\r\n\tfor p := 1 to mPers do begin\r\n \tFieldValues.SetByLineCodeI('WPPER', p, p);\r\n \tFieldValues.SetByLineCodeV('WPWAGES', mPeriods[p].Wages, p);\r\n \tFieldValues.SetByLineCodeV('WPWH', mPeriods[p].WH, p);\r\n \tFieldValues.SetByLineCodeV('WPPAYS', mPeriods[p].Paid, p);\r\n \tFieldValues.SetByLineCodeV('WPPAY', mPeriods[p].ToPay, p);\r\n \tFieldValues.SetByLineCodeS('WPDUE', FormatDateTime('m/d/yyyy', mPeriods[p].DueDate), p);\r\n end;\r\n// FieldValues.DebugShowAll;\r\nend;\r\n\r\nprocedure TRecon.sFreq(const Value: string);\r\nbegin\r\n\tmFreq := Value;\r\n if mfreq = 'A' then mPers := 1\r\n else if mfreq = 'M' then mPers := 12\r\n else if mfreq = 'S' then mPers := 24\r\n else mPers := 4;\r\nend;\r\n\r\nprocedure TRecon.sPaid(ndx: integer; const Value: double);\r\nbegin\r\n\tmPeriods[ndx].Paid := value;\r\nend;\r\n\r\nprocedure TRecon.sPay(ndx: integer; const Value: double);\r\nbegin\r\n\tmPeriods[ndx].ToPay := value;\r\nend;\r\n\r\nprocedure TRecon.sWages(ndx: integer; const Value: double);\r\nbegin\r\n\tmPeriods[ndx].Wages := value;\r\nend;\r\n\r\nprocedure TRecon.sWH(ndx: integer; const Value: double);\r\nbegin\r\n\tmPeriods[ndx].WH := value;\r\nend;\r\n\r\n{ TWebRecons }\r\n\r\nfunction TRecons.Active: boolean;\r\nbegin\r\n\tresult := (CurrentTPType = 'W') and (nRecons > 0);\r\nend;\r\n\r\nprocedure TRecons.Add(s: string);\r\nbegin\r\n\tinc(nRecons);\r\n ReconArr[nRecons].AsString := s;\r\nend;\r\n\r\nprocedure TRecons.Clear;\r\nvar i: integer;\r\nbegin\r\n\tnRecons := 0;\r\n\tfor i := 1 to 10 do ReconArr[i].Clear;\r\nend;\r\n\r\nprocedure TRecons.ClearPayments;\r\nvar y, i: integer;\r\n\t topay: double;\r\nbegin\r\n{\r\n\t\tif WH then add0 payto to paid, zero payto\r\n\r\n Update FieldValues\r\n}\r\n\tfor y := 1 to nRecons do begin\r\n for i := 1 to ReconArr[y].NumPeriods do begin\r\n \ttopay := ReconArr[y].PeriodToPay[i];\r\n if (topay > 0) then begin\r\n ReconArr[y].PeriodPaid[i] := ReconArr[y].PeriodPaid[i] + topay;\r\n ReconArr[y].PeriodToPay[i] := 0;\r\n end;\r\n end;\r\n end;\r\n StoreData;\r\nend;\r\n\r\nconstructor TRecons.Create;\r\nvar i: integer;\r\nbegin\r\n\tnRecons := 0;\r\n\tfor i := 1 to 10 do ReconArr[i] := TRecon.create;\r\nend;\r\n\r\ndestructor TRecons.Destroy;\r\nvar i: integer;\r\nbegin\r\n\tfor i := 1 to 10 do ReconArr[i].free;\r\n\r\n inherited;\r\nend;\r\n\r\nprocedure TRecons.FillPaymentDetail(var arr: array of string; var cnt: integer; s: string);\r\nvar parm: TStringParams;\r\n\t i, ndx: integer;\r\n tmp: string;\r\n amt, peramt, topay: double;\r\n yr: string;\r\n\r\n function PayType(per: integer): string;\r\n begin\r\n \tif per = 0 then\r\n\t\t\tresult := '941 941'\r\n else\r\n\t \tresult := format('941 %s%.2d', [ReconArr[ndx].Frequency, per]);\r\n end;\r\n\r\n procedure AddToArray(per: integer; detamt: double);\r\n var newstr: string;\r\n begin\r\n newstr := format('PAYR=%s|PATYP=%s|PAAMT=%.2f|', [yr, PayType(per), detamt]);\r\n arr[cnt] := newstr;\r\n inc(cnt);\r\n end;\r\n\r\nbegin\r\n// get year and amount and match to ToPay\r\n// if remainder then 941941\r\n// if less pay earlier first\r\n// Adjust PayTo if appropriate\r\n\tcnt := 0;\r\n\tparm := TStringParams.create(20);\r\n parm.asString := s;\r\n yr := '';\r\n amt := 0;\r\n for i := 1 to parm.nParams do begin\r\n // PAYR, PATYP, PAAMT\r\n if copy(parm[i], 1, 4) = 'PAYR' then\r\n \tyr := copy(parm[i], 6, length(parm[i])-5)\r\n else if copy(parm[i], 1, 5) = 'PAAMT' then begin\r\n \ttmp := copy(parm[i], 7, length(parm[i]) - 6);\r\n if tmp > '' then\r\n \tamt := strtofloat(tmp);\r\n end;\r\n end;\r\n if (yr > '') and (amt > 0) then begin\r\n \tndx := Find(yr);\r\n if ndx > 0 then for i := 1 to ReconArr[ndx].NumPeriods do begin\r\n \ttopay := ReconArr[ndx].PeriodToPay[i];\r\n if (topay > 0) and (amt > 0) then begin\r\n \tperamt := topay;\r\n if peramt > amt then peramt := amt;\r\n amt := amt - peramt;\r\n if peramt < topay then\r\n \tReconArr[ndx].PeriodToPay[i] := peramt;\r\n\t \tAddToArray(i, peramt);\r\n end;\r\n end;\r\n if amt > 0 then\r\n \tAddToArray(0, amt);\r\n end;\r\n parm.free;\r\nend;\r\n\r\nfunction TRecons.Find(yr: string): integer;\r\nvar i: integer;\r\nbegin\r\n\tresult := 0;\r\n for i := 1 to nRecons do\r\n \tif ReconArr[i].Year = yr then\r\n \tresult := i;\r\nend;\r\n\r\nprocedure TRecons.LoadData;\r\nvar i: integer;\r\nbegin\r\n// FieldValues.DebugShowAll('Before Load Data');\r\n\tfor i := 1 to nRecons do begin\r\n if ReconArr[i].Year = ActiveWHYear then\r\n\t \tReconArr[i].ReadFromFieldValues;\r\n end;\r\n SetTotalPays;\r\n// FieldValues.DebugShowAll('Load Data');\r\nend;\r\n\r\nprocedure TRecons.SetTotalPays;\r\nvar i, j: integer;\r\nbegin\r\n\tfor i := 1 to nRecons do begin\r\n\t\tTotPays[i] := 0;\r\n for j := 1 to ReconArr[i].Count do\r\n \tTotPays[i] := TotPays[i] + ReconArr[i].mPeriods[j].ToPay;\r\n FieldValues.SetByLineCodeV('PAAMT', TotPays[i], i);\r\n end;\r\nend;\r\n\r\nprocedure TRecons.StoreData;\r\nvar i: integer;\r\n\t s: string;\r\nbegin\r\n// FieldValues.DebugShowAll('Before Store Data ' + inttostr(nRecons));\r\n s := '';\r\n\tfor i := 1 to nRecons do begin\r\n \ts := s + ReconArr[i].Year + '|';\r\n if ReconArr[i].Year = ActiveWHYear then\r\n\t \tReconArr[i].SetToFieldValues;\r\n end;\r\n SetTotalPays;\r\n// FieldValues.DebugShowAll('Store Data: ' + s);\r\nend;\r\n\r\n{ TPayInfo }\r\n\r\nprocedure TPayInfo.Clear;\r\nvar i: integer;\r\nbegin\r\n\tfor i := 1 to 20 do begin\r\n HoldPays[i].PPaid := 0;\r\n HoldPays[i].PYear := '';\r\n end;\r\n nHoldPays := 0;\r\nend;\r\n\r\nfunction TPayInfo.CurrPaid: double;\r\nvar i: integer;\r\nbegin\r\n\tresult := 0;\r\n for i := 1 to nHoldPays do\r\n \tif HoldPays[i].PYear = SiteOpts.TaxYear then\r\n \tresult := HoldPays[i].PPaid;\r\nend;\r\n\r\nprocedure TPayInfo.DebugCurrentData(cap: string);\r\nvar i: integer;\r\n CurrBal: double;\r\n parm: TStringParams;\r\nbegin\r\n\tparm := TStringParams.create(100, '_');\r\n\tparm[1] := cap;\r\n\tfor i := 1 to nHoldPays do begin\r\n parm[i+1] := HoldPays[i].PYear + '=' + floattostr(HoldPays[i].PPaid);\r\n// if HoldPays[i].PYear = SiteOpts.TaxYear then begin\r\n// end;\r\n end;\r\n CurrBal := FieldValues.GetByLineCodeV('XTOTALBAL');\r\n parm[nHoldPays+2] := ' Balance: ' + floattostr(CurrBal);\r\n dmClientConnections.SendConsoleMessage('_' + parm.asString);\r\n parm.free;\r\nend;\r\n\r\nprocedure TPayInfo.FromFieldValues;\r\nvar i, mx: integer;\r\n\t s: string;\r\nbegin\r\n\tnHoldPays := 0;\r\n Clear;\r\n mx := FieldValues.MaxGroupIndexByCode('PAYR');\r\n\tfor i := 1 to mx do begin\r\n \ts := FieldValues.GetByLineCodeS('PAYR', i);\r\n if s > '' then begin\r\n HoldPays[i].PPaid := FieldValues.GetByLineCodeV('PAAMT', i) + FieldValues.GetByLineCodeV('PPAID', i);\r\n if i > nHoldPays then nHoldPays := i;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TPayInfo.ToFieldValues;\r\nvar i, ndx, mx: integer;\r\n CurrBal, pend: double;\r\n yr: string;\r\nbegin\r\n\tif nHoldPays = 0 then begin\r\n\t CurrBal := FieldValues.GetByLineCodeV('XTOTALBAL');\r\n \ti := FieldValues.FindGroupIndexByLineCode('PAYR', SiteOpts.TaxYear);\r\n FieldValues.SetByLineCodeV('PABAL', CurrBal, i);\r\n // Fill Pending from History\r\n\t mx := FieldValues.MaxGroupIndexByCode('HYEAR');\r\n for i := 1 to mx do begin\r\n \tpend := FieldValues.GetByLineCodeV('HPENDING', i);\r\n if pend > 0 then begin\r\n \tyr := FieldValues.GetByLineCodeS('HYEAR', i);\r\n\t\t \tndx := FieldValues.FindGroupIndexByLineCode('PAYR', yr);\r\n\t\t \tFieldValues.SetByLineCodeV('PPAID', pend, ndx);\r\n end;\r\n end;\r\n end\r\n\telse for i := 1 to nHoldPays do begin\r\n \tFieldValues.SetByLineCodeV('PPAID', HoldPays[i].PPaid, i);\r\n if HoldPays[i].PYear = SiteOpts.TaxYear then begin\r\n\t\t CurrBal := FieldValues.GetByLineCodeV('XTOTALBAL');\r\n\t \tFieldValues.SetByLineCodeV('PABAL', CurrBal, i);\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TPayInfo.ToHistory;\r\nvar i, ndx: integer;\r\n CurrBal: double;\r\nbegin\r\n\tif nHoldPays = 0 then begin\r\n\t CurrBal := FieldValues.GetByLineCodeV('XTOTALBAL');\r\n \tndx := FieldValues.FindGroupIndexByLineCode('HYEAR', SiteOpts.TaxYear);\r\n FieldValues.SetByLineCodeV('HTAX', CurrBal, ndx);\r\n FieldValues.SetByLineCodeV('HBALANCE', CurrBal, ndx);\r\n FieldValues.SetByLineCodeV('HPIO', 0, ndx);\r\n end\r\n\telse for i := 1 to nHoldPays do begin\r\n \tndx := FieldValues.FindGroupIndexByLineCode('HYEAR', HoldPays[i].PYear);\r\n if ndx > 0 then begin\r\n \t\tFieldValues.SetByLineCodeV('HPENDING', HoldPays[i].PPaid, ndx);\r\n if HoldPays[i].PYear = SiteOpts.TaxYear then begin\r\n\t \t\tFieldValues.SetByLineCodeV('HTAX', CurrBal, ndx);\r\n\t \t\tFieldValues.SetByLineCodeV('HBALANCE', CurrBal, ndx);\r\n\t \t\tFieldValues.SetByLineCodeV('HPIO', 0, ndx);\r\n end;\r\n end;\r\n end;\r\n\r\nend;\r\n\r\nend.\r\n","unit ClientCurrent;\r\n\r\ninterface\r\n\r\nuses WEBLib.ExtCtrls, SysUtils;\r\n\r\ntype\r\n\tTSectionPanel = class\r\n \tpnl: TPanel;\r\n TopStart, BottomHeight, PanelWidth, PanelHeight: integer;\r\n\t\tprocedure AssignSectionPanel(panel: TPanel; hdght, bottomht, wid: integer);\r\n constructor create;\r\n end;\r\n\r\nprocedure InitCurrent;\r\nprocedure SetMainPanelHeight;\r\nprocedure SetCurrentFromBData(bdata: string);\r\n\r\nvar\r\n\tCTSERVICECONNSTRING,\r\n CTUPLOADCONNSTRING,\r\n CTFILEUPLOADCONNSTRING,\r\n CTFILEUPLOADCONNSTRINGA,\r\n CTFILEUPLOADCONNSTRINGB,\r\n CTFILEUPLOADCONNSTRINGC,\r\n CTFILEUPLOADCONNSTRINGD,\r\n CurrentStatus,\r\n\tCurrentToken,\r\n BResCode,\r\n BFileType,\r\n CurrentTaxYear,\r\n ActiveWHYear,\r\n CurrentWHYear,\r\n PreviousWHYear,\r\n CurrentTPType,\r\n CurrentFreq,\r\n sBalance,\r\n sRefund\r\n \t\t\t\t\t\t\t: string;\r\n CurrentFormID,\r\n CurrentSectionID,\r\n CurrentGroupID,\r\n CurrentReturnID,\r\n CurrentTaxpayerID,\r\n CurrentSecondaryID,\r\n CurrentTransaction,\r\n CurrentFormIndex,\r\n CurrentSectionIndex,\r\n TotalsSectionIndex,\r\n CurrentGroupIndex,\r\n CurrentSubIndex\r\n \t\t\t\t\t\t\t: integer;\r\n\r\n BPrevYrCr,\r\n BEstSum\r\n \t\t\t\t\t\t\t: double;\r\n MainPanel,\r\n MainEntryPanel,\r\n MainSectionPanel,\r\n MainTotalsPanel\r\n : TSectionPanel;\r\nconst\r\n CRLF = #13#10;\r\n\r\n\r\nimplementation\r\n\r\nuses parameters, OptionsDM, entReturns;\r\n\r\nprocedure InitCurrent;\r\nvar m, y, d: word;\r\nbegin\r\n\tCurrentToken := '';\r\n CurrentTPType := LoginOpts.TPType;\r\n CurrentFreq := '';\r\n CurrentStatus := '';\r\n CurrentFormID := 0;\r\n CurrentSectionID := 0;\r\n CurrentGroupID := 0;\r\n CurrentReturnID := 0;\r\n CurrentTaxpayerID := 0;\r\n CurrentSecondaryID := 0;\r\n CurrentTransaction := 0;\r\n CurrentFormIndex := 0;\r\n CurrentSectionIndex := 0;\r\n TotalsSectionIndex := 0;\r\n CurrentGroupIndex := 0;\r\n CurrentSubIndex := 0;\r\n BResCode := 'R';\r\n BFileType := 'I';\r\n BPrevYrCr := 0;\r\n BEstSum := 0;\r\n decodedate(date, y, m, d);\r\n CurrentWHYear := inttostr(y);\r\n PreviousWHYear := inttostr(y-1);\r\n ActiveWHYear := CurrentWHYear;\r\n MainPanel := TSectionPanel.create;\r\n MainEntryPanel := TSectionPanel.create;\r\n MainSectionPanel := TSectionPanel.create;\r\n MainTotalsPanel := TSectionPanel.create;\r\nend;\r\n\r\nprocedure SetCurrentFromBData(bdata: string);\r\nvar parm: TStringParams;\r\n\t id: integer;\r\nbegin\r\n\tparm := TStringParams.Create(10);\r\n\tparm.asString := bdata;\r\n id := parm.asInteger[2];\r\n if id = CurrentTaxpayerID then\r\n\t CurrentSecondaryID := parm.asInteger[3]\r\n else\r\n\t CurrentSecondaryID := id;\r\n BResCode := parm[4];\r\n BFileType := parm[5];\r\n if BResCode = '' then BResCode := 'R';\r\n if BFileType = '' then begin\r\n \tif CurrentSecondaryID = 0 then BFileType := 'I'\r\n else BFileType := 'J';\r\n end;\r\n BPrevYrCr := parm.asFloat[6];\r\n BEstSum := parm.asFloat[7];\r\n parm.Free;\r\nend;\r\n\r\n{ TSectionPanel }\r\n\r\nprocedure TSectionPanel.AssignSectionPanel(panel: TPanel; hdght,\r\n bottomht, wid: integer);\r\nbegin\r\n\tpnl := panel;\r\n TopStart := hdght;\r\n BottomHeight := bottomht;\r\n PanelWidth := wid;\r\nend;\r\n\r\nconstructor TSectionPanel.create;\r\nbegin\r\n\tAssignSectionPanel(nil, 0, 0, 0);\r\nend;\r\n\r\nprocedure SetMainPanelHeight;\r\nvar ht: integer;\r\n\r\n\tprocedure AddHeight(p: TSectionPanel);\r\n begin\r\n \tif (p.pnl <> nil) and p.pnl.visible then\r\n \tht := ht + p.PanelHeight;\r\n end;\r\n\r\nbegin\r\n\tht := 0;\r\n AddHeight(MainSectionPanel);\r\n AddHeight(MainTotalsPanel);\r\n AddHeight(MainEntryPanel);\r\n\r\n MainPanel.pnl.Height := ht;\r\nend;\r\n\r\nend.\r\n","unit OptionsDM;\r\n\r\ninterface\r\n\r\nuses\r\n SysUtils, Classes, JS, Web, WEBLib.Modules, WEBLib.Dialogs, WebLib.Forms;\r\n\r\nconst\r\n\tvers = '3 ';\r\n\r\n//PayMeth, PayStartMsg, PayAfterMsg, PayLink,\r\ntype\r\n TPayOpts = class\r\n private\r\n function gAsString: string;\r\n procedure sAsString(const Value: string);\r\n public\r\n SvcCode, SvcName, CityID, ConnStr, Allowed, VendorID,\r\n SvcIndex, SvcMethod, StartMsg, AfterMsg, SKey, AKey: string;\r\n procedure Clear;\r\n property AsString: string read gAsString write sAsString;\r\n end;\r\n\r\n TSiteOpts = class\r\n function gAsString: string;\r\n procedure sAsString(const Value: string);\r\n public\r\n TaxYear,\r\n PreviousYear,\r\n LoginTypes,\r\n VerifyTypes,\r\n NumberFormatting,\r\n InState,\r\n OCMeth: string;\r\n CapWidth,\r\n ControlTop,\r\n PanelHeight: integer;\r\n LoginPanelColor, LoginMsgPanelColor, LoginMsgFontColor,\r\n DefButtonColor, DefPanelColor,\r\n FormButtonsPanelColor, FormButtonsButtonColor,\r\n SectionButtonsPanelColor, SectionButtonsButtonColor,\r\n SectionNextPanelColor, SectionNextButtonColor,\r\n LogoColor: integer;\r\n Loaded: boolean;\r\n ResTaxRate,\r\n NonResTaxRate,\r\n RefundLimit,\r\n OCRate,\r\n OCPerc: double;\r\n LogoLink: string;\r\n property AsString: string read gAsString write sAsString;\r\n constructor create;\r\n end;\r\n\r\n\r\n TLoginOpts = class\r\n LoginID: string;\t\t\t\t\t\t\t\t\t\t// A: Account\r\n \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// 1: AltID1\r\n \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// 2: AltID2\r\n // S: SSN\r\n PasswordType: string;\t\t\t\t\t\t\t\t// X: Not Used\r\n \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// W: Web Site Created\r\n \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// 1: AltID1\r\n \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// 2: AltID2\r\n \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// I: Initial=AltID2, then W\r\n\t NoTP: String;\t\t\t\t\t\t\t\t\t\t\t// M: Message\r\n \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// G: Guest to Suspense\r\n // P: Guest to Print\r\n ForgotID: string; // X: Not Used;\r\n \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// 1: Last Four/Last Name/StNo\r\n \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// 2: Last Four/Last Name/Street\r\n // 3: EMail Code-TBD\r\n // 4: Text Code-TBD\r\n NoAcctNoID, NoAcctKnowID: string; // X: Not Used\r\n \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// = Account not yet set up, & they know or don't know ID\r\n \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// 1: Last Four/Last Name/StNo\r\n \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// 2: Last Four/Last Name/Street\r\n // or List including following\r\n Verification: string;\t\t\t\t\t\t\t\t// X: Not Used;\r\n \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// List of following: only give one but depends on whether that info exists for taxpayer\r\n \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// Ex: EHQ would ask for email if we have email, if not then Phone if we have it else Security Question\r\n \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// A: AltID2\r\n \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// L: Last Four\r\n // N: Last Name\r\n // E: EMail\r\n // H: Phone\r\n // D: Tax Due\r\n // Q: Security Question, up to 2 tries = two of three questions given\r\n ForgotPassword: string;\t\t\t\t\t\t\t// X: Not Used;\r\n \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// List of following: only give one but depends on whether that info exists for taxpayer\r\n \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// Ex: EHQ would ask for email if we have email, if not then Phone if we have it else Security Question\r\n \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// A: AltID2\r\n \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// L: Last Four\r\n // N: Last Name\r\n // E: EMail\r\n // H: Phone\r\n // D: Tax Due\r\n // Q: Security Question, up to 2 tries = two of three questions given\r\n PasswordReqs: string;\t\t\t\t\t\t\t\t// X: Not Used\r\n \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// List of following\r\n \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// numbers for min length\r\n // U: Uppercase\r\n // L: Lowercase\r\n // N: Number\r\n // S: Special Chars\r\n NewAccountActions: string;\t\t\t\t\t\t// X: Not Used\r\n \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// P: Create Password\r\n \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// Q: Create Security Questions\r\n // E: Get EMail\r\n // H: Get Phone\r\n // A: Address\r\n // N: Name\r\n // F: Filing Status\r\n // S: Add/Delete Secondary\r\n EditAccountActions: string;\t\t\t\t\t\t// X: Not Used\r\n \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// P: Create Password\r\n \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// Q: Create Security Questions\r\n // E: Get EMail\r\n // H: Get Phone\r\n // A: Address\r\n // N: Name\r\n // F: Filing Status\r\n // S: Add/Delete Secondary\r\n TPType, HLoginPass: string;\r\n end;\r\n\r\n TdmOptions = class(TDataModule)\r\n procedure dmOptionsCreate(Sender: TObject);\r\n procedure dmOptionsDestroy(Sender: TObject);\r\n private\r\n { Private declarations }\r\n public\r\n { Public declarations }\r\n AdmControl: boolean;\r\n\r\n [async]\r\n procedure LoadSiteOptions; async;\r\n\r\n function LightenColor(clr: integer): integer;\r\n\r\n function TestPassword(pw: string): boolean;\r\n function PasswordReqEng: string;\r\n function TaxRate: double;\r\n protected procedure LoadDFMValues; override; end;\r\n\r\nvar\r\n dmOptions: TdmOptions;\r\n LoginOpts: TLoginOpts;\r\n SiteOpts: TSiteOpts;\r\n PayOpts: TPayOpts;\r\n\r\nimplementation\r\n\r\n{%CLASSGROUP 'Vcl.Controls.TControl'}\r\n\r\n{$R *.dfm}\r\n\r\nuses Parameters, entForms, entFieldValues, ClientConnectionsDM, ClientCurrent,\r\n\tUtilities;\r\n\r\n{ TdmOptions }\r\n\r\nconst chars = 'DI{Zh0P]BVf;tv1Uc|L)igJzrCO2o@sYkG3djN(bwSQ4Am[5M6TqyK7aXEuR8p9FleW}nxH';\r\nconst chlen = 71;\r\n\r\nprocedure TdmOptions.LoadSiteOptions;\r\nvar promise: TJSXMLHttpRequest;\r\n MyResponse, resp, request, appParam, lochold: string;\r\n// p: integer;\r\n msg2: string;\r\n appparams: TStringParams;\r\n spa: TStringParamArray;\r\n\r\n\tprocedure SetLoginOpts;\r\n begin\r\n \twith LoginOpts do begin\r\n LoginID := '1';\r\n PasswordType := 'W';\r\n NoTP := 'M';\r\n ForgotID := '1';\r\n NoAcctNoID := '1';\r\n NoAcctKnowID := 'EHQ2';\r\n ForgotPassword := 'QEL';\r\n PasswordReqs := '8ULN';\r\n NewAccountActions := 'PQEH';\r\n end;\r\n end;\r\n\r\n procedure DecodeParams;\r\n var nparm: integer;\r\n \t msg, host, hardport,\r\n \tCTSERVICECONNSTRING2, CTUPLOADCONNSTRING2, CTFILEUPLOADCONNSTRING2: string;\r\n\r\n procedure AssignAdminControl(par: string);\r\n// var par: string;\r\n begin\r\n // URL := 'http://localhost:8000/WebClient.html?A&Par='+EncryptText('<'+GetAccount(mdsCurrentTPID.asInteger)+'><'+Name+'>');\r\n// par := Application.Parameters[1];\r\n// if copy(par, 1, 4)= 'Par=' then par := copy(par, 5, length(par)-4);\r\n LoginOpts.HLoginPass := par;\r\n AdmControl := true;\r\n {\r\n frst: boolean;\r\n i: integer;\r\n\r\n s := decrypttext(par);\r\n frst := true;\r\n for i := 2 to length(s)-1 do begin\r\n if (s[i] = '<') or (s[i] = '>') then frst := false\r\n else if frst then HLogAccount := HLogAccount + s[i]\r\n else HLogName := HLogName + s[i];\r\n end;\r\n }\r\n end;\r\n\r\n procedure SetParms(pcod, pval: string);\r\n var s: string;\r\n p: integer;\r\n begin\r\n if pcod = 'PAR' then\r\n AssignAdminControl(pval)\r\n else if pcod = 'HST' then\r\n host := {'http://' +} pval //+ ':'\r\n else if pcod = 'HPRT' then begin\r\n \thardport := pval;\r\n end\r\n else if pcod = 'HCTY' then begin\r\n // demo.m or demo.o\r\n s := pval;\r\n p := pos('.', s);\r\n if (p = length(s)-1) then begin\r\n if (pos('.O', s)+pos('.o', s)) > 0 then s := s + 'hioCityTax.com'\r\n else s := s + 'ichiganCityTax.com';\r\n end;\r\n host := s;// + ':';\r\n end;\r\n end;\r\n\r\n function SlideBy(ch: char; slide: integer): char;\r\n // slide can be negative\r\n var p: integer;\r\n begin\r\n p := pos(ch, chars);\r\n if p = 0 then result := ch\r\n else begin\r\n p := p + slide;\r\n if p < 1 then p := p + chlen\r\n else if p > chlen then p := p - chlen;\r\n result := copy(chars, p, 1)[1];\r\n end;\r\n end;\r\n\r\n function DecodeAddress(v: string): string;\r\n var s1, s2, s3: string;\r\n c: char;\r\n i, p, ln: integer;\r\n begin\r\n ln := 999;\r\n if (copy(v, 1, 1) = '!') then begin\r\n ln := strtointdef(copy(v, 2, 1), 999);\r\n v := copy(v, 3, length(v)-2);\r\n end\r\n else if (copy(v, 1, 1) = '+') then begin\r\n ln := strtointdef(copy(v, 2, 2), 999);\r\n v := copy(v, 4, length(v)-3);\r\n end;\r\n p := pos('+', v);\r\n if p > 0 then v := copy(v, 1, p-1);\r\n // throw away every other char\r\n s1 := '';\r\n for i := 1 to length(v) do begin\r\n if v[i] = '=' then s1 := s1 + '.'\r\n else if v[i] = '!' then begin\r\n c := v[i+1];\r\n v[i+1] := SlideBy(c, -10);\r\n end\r\n else s1 := s1 + v[i];\r\n end;\r\n s2 := '';\r\n for i := 1 to length(s1) do\r\n if i mod 2 = 1 then\r\n s2 := s2 + s1[i];\r\n if ln < length(s2) then s2 := copy(s2, 1, ln);\r\n // add 1 to chars SlideBy\r\n s3 := '';\r\n for i := 1 to length(s2) do begin\r\n c := s2[i];\r\n s3 := s3 + SlideBy(c, 1);\r\n end;\r\n result := s3;\r\n end;\r\n\r\n\t\tprocedure HandleParm(aparm: string);\r\n var p: integer;\r\n \t cod, val, uval: string;\r\n begin\r\n p := pos('=', aparm);\r\n cod := uppercase(copy(aparm, 1, p-1));\r\n val := copy(aparm, p+1, length(aparm)-p);\r\n uval := DecodeAddress(val);\r\n msg2 := msg2 + cod + ' ' + uval + ' ' + val + #13;\r\n if copy(cod, 1, 1) = 'D' then SetParms(copy(cod, 2, length(cod)-1), val)\r\n else SetParms(cod, uval);\r\n end;\r\n\r\n procedure DecodeFirst;\r\n var parm: string;\r\n begin\r\n \twith LoginOpts do begin\r\n parm := appParams[1];\t//Application.Parameters[0];\r\n if copy(parm, 1, 1) = 'A' then begin\r\n TPType := copy(parm, 2, 1);\r\n parm := copy(parm, 3, length(parm)-2);\r\n if TPType = '' then TPType := 'I';\r\n //AssignAdminControl;\r\n end\r\n else begin\r\n \tTPType := copy(parm, 1, 1);\r\n parm := copy(parm, 2, length(parm)-1);\r\n end;\r\n //if length(TPType) > 1 then TPType := 'I';\r\n appParam := '?LoginType='+TPType;\r\n\r\n HandleParm(parm);\r\n end;\r\n end;\r\n\r\n(* begin\r\n \tresult := v;\r\n end;\r\n*)\r\n(* function DecodeAddress(v: string): string;\r\n var s1, s2, s3: string;\r\n \t c: char;\r\n \t i, p, o, ln: integer;\r\n begin\r\n // terminate char is '+', dot is =, flip char is #\r\n // pass 1\r\n \t// trim to +\r\n \t// flip all with #: remove # and next char flip between number and letter\r\n // change = to .\r\n ln := 999;\r\n if (copy(v, 1, 1) = '!') then begin\r\n \tln := strtointdef(copy(v, 2, 1), 999);\r\n v := copy(v, 3, length(v)-2);\r\n end\r\n else if (copy(v, 1, 1) = '+') then begin\r\n \tln := strtointdef(copy(v, 2, 2), 999);\r\n v := copy(v, 4, length(v)-3);\r\n end;\r\n p := pos('+', v);\r\n if p > 0 then v := copy(v, 1, p-1);\r\n // pass 2\r\n \t// uppercase\r\n// v := uppercase(v); done earlier\r\n // pass 3\r\n \t// throw away every other char\r\n s1 := '';\r\n for i := 1 to length(v) do begin\r\n \tif v[i] = '=' then s1 := s1 + '.'\r\n else if v[i] = '!' then begin\r\n c := v[i+1];\r\n o := ord(c);\r\n if o < 65 then begin\r\n o := o + 16;\r\n if o < 64 then o := o + 10;\r\n end\r\n else begin\r\n \to := o - 16;\r\n while o > 57 do o := o - 10;\r\n end;\r\n v[i+1] := chr(o);\r\n end\r\n else s1 := s1 + v[i];\r\n end;\r\n s2 := '';\r\n for i := 1 to length(s1) do\r\n \tif i mod 2 = 1 then\r\n \ts2 := s2 + s1[i];\r\n if ln < length(s2) then s2 := copy(s2, 1, ln);\r\n // pass 4\r\n \t// add 1 to ord, wraparound on 9, and Z\r\n s3 := '';\r\n for i := 1 to length(s2) do begin\r\n c := s2[i];\r\n o := ord(c);\r\n if o = 57 then o := 48\r\n else if o = 90 then o := 65\r\n else if (o >= 48) and (o <= 56) then o := o + 1\r\n else if (o >= 65) and (o <= 89) then o := o + 1;\r\n s3 := s3 + chr(o);\r\n end;\r\n\t msg := msg + inttostr(ndx) + ': ' + s3 + '[CRLF]';\r\n result := s3;\r\n end;\r\n*)\r\n\r\n \tprocedure DecodeParam(ndx: integer);\r\n var sparm: string;\r\n begin\r\n sparm := appParams[ndx];\t\t//Application.Parameters[ndx];\r\n // &SVC=, &UPL=, &FIL= &PAR=\r\n msg := msg + inttostr(ndx) + ': ' + sparm + '[CRLF]';\r\n //p := pos('=', sparm);\r\n if ndx = 1 then\r\n \tDecodeFirst\r\n else //if p > 0 then begin\r\n \tHandleParm(sparm);\r\n{ \t\t\t\tcod := uppercase(copy(sparm, 1, p-1));\r\n \t\t\t\tval := copy(sparm, p+1, length(sparm)-p);\r\n uval := DecodeAddress(val);\r\n\t\t\t\tmsg2 := msg2 + cod + ' ' + uval + ' ' + val + #13;\r\n if copy(cod, 1, 1) = 'D' then SetParms(copy(cod, 2, length(cod)-1), val)\r\n else SetParms(cod, uval);\r\n}\r\n //end;\r\n end;\r\n\r\n function WrapIt(prt, addr: string): string;\r\n begin\r\n// \tif copy(addr, 1, 1) <> '/' then\r\n\t\t\tif hardport > '' then\r\n \t\tresult := 'https://' + host + ':' + hardport + addr\r\n\t\t\telse if prt > '' then\r\n \t\tresult := 'https://' + host + ':' + prt + '/API' + addr\r\n else\r\n \t\tresult := 'https://' + host + '/API' + addr;\r\n{$IFDEF LOCALHOST}\r\n\t\t\tresult := 'http://localhost:2001' + addr;\r\n{$ENDIF}\r\n end;\r\n\r\n begin\r\n \tappParams := TStringParams.create(10, '?');\r\n CTSERVICECONNSTRING2 := '/CTS/CTService/';\r\n CTUPLOADCONNSTRING2 := '/CTU/CTUploadSvc/';\r\n CTFILEUPLOADCONNSTRING2 := '/CTF/CTFileSvc/';\r\n host := 'localhost:';\r\n hardport := '';\r\n\t\tCTSERVICECONNSTRING := WrapIt('2001', CTSERVICECONNSTRING2);\r\n \tCTUPLOADCONNSTRING := WrapIt('2001', CTUPLOADCONNSTRING2);\r\n\t CTFILEUPLOADCONNSTRING := WrapIt('2001', CTFILEUPLOADCONNSTRING2);\r\n msg2 := vers + #13;\r\n appParam := '?LoginType=I';\r\n LoginOpts.HLoginPass := '';\r\n LoginOpts.TPType := 'I';\r\n AdmControl := false;\r\n CurrentFreq := '';\r\n host := '';\r\n if Application.Parameters.Count = 1 then begin\r\n \tappParams.asString := Application.Parameters[0];\r\n end\r\n else begin\r\n\t for nparm := 0 to Application.Parameters.Count-1 do\r\n\t\t\t\tappParams.Add(Application.Parameters[nparm]);\r\n end;\r\n msg := inttostr(appParams.nParams) + '[CRLF]';\r\n for nparm := 1 to appParams.nParams do\r\n\t\t\tDecodeParam(nparm);\r\n if (CTSERVICECONNSTRING2 > '') and (host > '') then begin\r\n\t\t\tCTSERVICECONNSTRING := WrapIt('', CTSERVICECONNSTRING2);\r\n \t\tCTUPLOADCONNSTRING := WrapIt('', CTUPLOADCONNSTRING2);\r\n\t \tCTFILEUPLOADCONNSTRING := WrapIt('', CTFILEUPLOADCONNSTRING2);\r\n end;\r\n msg := msg + host + ' ' + CTSERVICECONNSTRING2 + '[CRLF]';\r\n msg := msg + host + ' ' + CTUPLOADCONNSTRING2 + '[CRLF]';\r\n msg := msg + host + ' ' + CTFILEUPLOADCONNSTRING2 + '[CRLF]';\r\n\t BFileType := LoginOpts.TPType;\r\n \tCurrentTPType := LoginOpts.TPType;\r\n// dmClientConnections.SendConsoleMessage(msg);\r\n// dmClientConnections.SendConsoleMessage(msg2);\r\n\t\tappParams.free;\r\n end;\r\n\r\nbegin\r\n\tSetLoginOpts;\r\n DecodeParams;\r\n lochold := CTSERVICECONNSTRING + '||' + CTFILEUPLOADCONNSTRING;\r\n\trequest := 'SetupOptions' + appParam;\r\n dmClientConnections.HttpRequest.Headers.Clear;\r\n dmClientConnections.HttpRequest.Headers.AddPair('Access-Control-Allow-Origin', '*,*.ohiocitytax.com:2010,*.ohiocitytax.com');\r\n dmClientConnections.HttpRequest.URL := CTSERVICECONNSTRING + request;\r\n lochold := dmClientConnections.HttpRequest.URL;\r\n try\r\n\t\tIncCallCounter(ccSetupOptions);\r\n \tpromise := await(TJSXMLHttpRequest, dmClientConnections.HttpRequest.Perform);\r\n except\r\n \tShowMessage('Unable to Connect to CTWeb Service: ' + CTSERVICECONNSTRING);\r\n//\t dmClientConnections.HttpRequest.URL := 'http://localhost:2001/CTS/CTService/' + request;\r\n// \tpromise := await(TJSXMLHttpRequest, dmClientConnections.HttpRequest.Perform);\r\n end;\r\n resp := promise.ResponseText;\r\n MyResponse := XMLSplitValue(resp);\r\n\tspa := TStringParamArray.create(3, 35, '__', '|');\t\t// default #13#10, '|'\r\n spa.AsString := MyResponse;\r\n SiteOpts.AsString := spa[1];\r\n PayOpts.asString := spa[2];\r\n LoginForm.AsString := spa[3];\r\n{ p := pos('!!!', MyResponse);\r\n// dmClientConnections.SendConsoleMessage(MyResponse);\r\n SiteOpts.AsString := copy(MyResponse, 1, p-1);\r\n MyResponse := copy(MyResponse, p+3, length(MyResponse)-2);\r\n LoginForm := TLoginForm.create;\r\n p := pos('!!!', MyResponse);\r\n if p > 0 then begin\r\n\t LoginForm.AsString := copy(MyResponse, 1, p-1);\r\n MyResponse := copy(MyResponse, p+3, length(MyResponse)-2);\r\n end;\r\n PayOpts.AsString := copy(MyResponse, p+3, length(MyResponse)-2);\r\n// dmClientConnections.SendConsoleMessage(LoginForm.asString);\r\n}\r\n\tspa.Free;\r\nend;\r\n\r\nfunction TdmOptions.PasswordReqEng: string;\r\nvar i, ln: integer;\r\n\t s, sln: string;\r\nbegin\r\n\tresult := '';\r\n s := LoginOpts.PasswordReqs;\r\n sln := '';\r\n for i := 1 to 2 do\r\n \tif (copy(s, i, 1) >= '0') and (copy(s, i, 1) <= '9') then begin\r\n \tsln := sln + copy(s, i, 1);\r\n end;\r\n ln := strtointdef(sln, 0);\r\n if ln > 0 then\r\n \tresult := result + 'Minimum Length: ' + sln + ', ';\r\n if pos('U', s) > 0 then result := result + ' At least 1 uppercase letter, ';\r\n if pos('L', s) > 0 then result := result + ' At least 1 lowercase letter, ';\r\n if pos('N', s) > 0 then result := result + ' At least 1 number, ';\r\n if pos('S', s) > 0 then result := result + ' At least 1 special character ($!#^&*(){}\\), ';\r\nend;\r\n\r\nfunction TdmOptions.TaxRate: double;\r\nbegin\r\n\tif LineCodeVars.LineCodeString('RESCODE') = 'N' then result := SiteOpts.NonResTaxRate\r\n else result := SiteOpts.ResTaxRate;\r\nend;\r\n\r\nfunction TdmOptions.TestPassword(pw: string): boolean;\r\nvar i, ln, up, lw, num, spec: integer;\r\n\t s, sln: string;\r\n ch: char;\r\nbegin\r\n\tresult := true;\r\n up := 0;\r\n lw := 0;\r\n num := 0;\r\n spec := 0;\r\n for i := 1 to length(pw) do begin\r\n \tch := pw[i];\r\n if (ch >= '0') and (ch <= '9') then inc(num)\r\n else if (ch >= 'A') and (ch <= 'Z') then inc(up)\r\n else if (ch >= 'a') and (ch <= 'z') then inc(lw)\r\n else if (pos(ch, '$!#^&*(){}\\') > 0) then inc(spec);\r\n end;\r\n s := LoginOpts.PasswordReqs;\r\n sln := '';\r\n for i := 1 to 2 do\r\n \tif (copy(s, i, 1) >= '0') and (copy(s, i, 1) <= '9') then begin\r\n \tsln := sln + copy(s, i, 1);\r\n end;\r\n ln := strtointdef(sln, 0);\r\n if ln > 0 then\r\n \tresult := result and (ln <= length(pw));\r\n if pos('U', s) > 0 then\r\n \tresult := result and (up > 0);\r\n if pos('L', s) > 0 then\r\n \tresult := result and (lw > 0);\r\n if pos('N', s) > 0 then\r\n \tresult := result and (num > 0);\r\n if pos('S', s) > 0 then\r\n \tresult := result and (spec > 0);;\r\nend;\r\n\r\nprocedure TdmOptions.dmOptionsCreate(Sender: TObject);\r\nbegin\r\n\tLoginOpts := TLoginOpts.create;\r\n\tSiteOpts := TSiteOpts.create;\r\n LoginForm := TLoginForm.create;\r\n PayOpts := TPayOpts.create;\r\n ZeroCallCounters;\r\n LoadSiteOptions;\r\nend;\r\n\r\nprocedure TdmOptions.dmOptionsDestroy(Sender: TObject);\r\nbegin\r\n\tPayOpts.free;\r\n LoginForm.free;\r\n\tSiteOpts.free;\r\n\tLoginOpts.free;\r\nend;\r\n\r\n{ TSiteOpts }\r\n\r\nconstructor TSiteOpts.create;\r\nbegin\r\n\tLoaded := false;\r\nend;\r\n\r\nfunction TSiteOpts.gAsString: string;\r\nvar parms: TStringParams;\r\nbegin\r\n parms := TStringParams.create(35);\r\n parms[1] := LoginTypes;\r\n parms[2] := VerifyTypes;\r\n parms[3] := TaxYear;\r\n parms[4] := PreviousYear;\r\n parms.AsInteger[5] := CapWidth;\r\n parms.AsInteger[6] := ControlTop;\r\n parms.AsInteger[7] := PanelHeight;\r\n parms[8] := NumberFormatting;\r\n parms.asInteger[9] := LoginPanelColor;\r\n parms.asInteger[10] := LoginMsgPanelColor;\r\n parms.asInteger[11] := LoginMsgFontColor;\r\n parms.asInteger[12] := DefButtonColor;\r\n parms.asInteger[13] := FormButtonsPanelColor;\r\n parms.asInteger[14] := FormButtonsButtonColor;\r\n parms.asInteger[15] := SectionButtonsPanelColor;\r\n parms.asInteger[16] := SectionButtonsButtonColor;\r\n parms.asInteger[17] := SectionNextPanelColor;\r\n parms.asInteger[18] := SectionNextButtonColor;\r\n parms.asInteger[19] := DefPanelColor;\r\n parms.asFloat[20] := ResTaxRate;\r\n parms.asFloat[21] := NonResTaxRate;\r\n parms[22] := InState;\r\n parms.asFloat[23] := RefundLimit;\r\n parms[25] := OCMeth;\r\n parms.asFloat[26] := OCRate;\r\n parms.asFloat[27] := OCPerc;\r\n{ parms[28] := PayMeth;\r\n parms[29] := PayStartMsg;\r\n parms[30] := PayAfterMsg;\r\n parms[31] := PayLink;\r\n}\r\n parms.asInteger[28] := LogoColor;\r\n parms[29] := LogoLink;\r\n parms.nParams := 29;\r\n result := parms.asString;\r\n parms.free;\r\nend;\r\n\r\nprocedure TSiteOpts.sAsString(const Value: string);\r\nvar parms: TStringParams;\r\n\r\n\tfunction DefColor(clr: integer): integer;\r\n begin\r\n \tif clr = 0 then result := 15790320\t\t// clBtnFace\r\n else result := clr;\r\n end;\r\n\r\nbegin\r\n parms := TStringParams.create(35);\r\n parms.AsString := value;\r\n LoginTypes := parms[1];\r\n VerifyTypes := parms[2];\r\n TaxYear := parms[3];\r\n CurrentTaxYear := TaxYear;\r\n PreviousYear := parms[4];\r\n CapWidth := parms.AsInteger[5];\r\n ControlTop := parms.AsInteger[6];\r\n PanelHeight := parms.AsInteger[7];\r\n NumberFormatting := parms[8];\r\n if NumberFormatting = '' then NumberFormatting := '2';\r\n LoginPanelColor := DefColor(parms.asInteger[9]);\r\n LoginMsgPanelColor := DefColor(parms.asInteger[10]);\r\n LoginMsgFontColor := parms.asInteger[11];\r\n DefButtonColor := DefColor(parms.asInteger[12]);\r\n FormButtonsPanelColor := DefColor(parms.asInteger[13]);\r\n FormButtonsButtonColor := DefColor(parms.asInteger[14]);\r\n SectionButtonsPanelColor := DefColor(parms.asInteger[15]);\r\n SectionButtonsButtonColor := DefColor(parms.asInteger[16]);\r\n SectionNextPanelColor := DefColor(parms.asInteger[17]);\r\n SectionNextButtonColor := DefColor(parms.asInteger[18]);\r\n DefPanelColor := DefColor(parms.asInteger[19]);\r\n ResTaxRate := parms.asFloat[20];\r\n NonResTaxRate := parms.asFloat[21];\r\n InState := parms[22];\r\n RefundLimit := parms.asFloat[23];\r\n\tOCMeth := parms[25];\r\n OCRate := parms.asFloat[26];\r\n OCPerc := parms.asFloat[27];\r\n{ PayMeth := parms[28];\r\n PayStartMsg := parms[29];\r\n PayAfterMsg := parms[30];\r\n PayLink := parms[31];\r\n}\r\n LogoColor := parms.asInteger[28];\r\n LogoLink := parms[29];\r\n parms.free;\r\n if ControlTop = 0 then ControlTop := 2;\r\n If PanelHeight = 0 then PanelHeight := 32;\r\n if CapWidth = 0 then CapWidth := 220;\r\n Loaded := true;\r\nend;\r\n\r\nfunction TdmOptions.LightenColor(clr: integer): integer;\r\nvar r, g, b: integer;\r\nbegin\r\n\tb := clr div 65536;\r\n clr := clr mod 65536;\r\n g := clr div 256;\r\n r := clr mod 256;\r\n b := b + 25;\r\n g := g + 25;\r\n r := r + 25;\r\n if b > 255 then b := 255;\r\n if g > 255 then g := 255;\r\n if r > 255 then r := 255;\r\n result := b*65536 + g * 256 + r;\r\nend;\r\n\r\n{ TPayOpts }\r\n\r\nprocedure TPayOpts.Clear;\r\nbegin\r\n with PayOpts do begin\r\n SvcCode := '';\r\n SvcName := '';\r\n CityID := '';\r\n ConnStr := '';\r\n Allowed := '';\r\n VendorID := '';\r\n SvcIndex := '';\r\n SvcMethod := '';\r\n StartMsg := '';\r\n AfterMsg := '';\r\n SKey := '';\r\n AKey := '';\r\n end;\r\nend;\r\n\r\nfunction TPayOpts.gAsString: string;\r\nvar parms: TStringParams;\r\nbegin\r\n parms := TStringParams.create(15);\r\n with PayOpts do begin\r\n parms[1] := SvcCode;\r\n parms[2] := SvcName;\r\n parms[3] := CityID;\r\n parms[4] := ConnStr;\r\n parms[5] := Allowed;\r\n parms[6] := VendorID;\r\n parms[7] := SvcIndex;\r\n parms[8] := SvcMethod;\r\n parms[9] := StartMsg;\r\n parms[10] := AfterMsg;\r\n parms[11] := SKey;\r\n parms[12] := AKey;\r\n end;\r\n result := parms.asString;\r\n parms.free;\r\nend;\r\n\r\nprocedure TPayOpts.sAsString(const Value: string);\r\nvar parms: TStringParams;\r\nbegin\r\n parms := TStringParams.create(15);\r\n parms.asString := Value;\r\n with PayOpts do begin\r\n SvcCode := parms[1];\r\n SvcName := parms[2];\r\n CityID := parms[3];\r\n ConnStr := parms[4];\r\n Allowed := parms[5];\r\n VendorID := parms[6];\r\n SvcIndex := parms[7];\r\n SvcMethod := parms[8];\r\n StartMsg := parms[9];\r\n AfterMsg := parms[10];\r\n SKey := parms[11];\r\n AKey := parms[12];\r\n end;\r\n parms.free;\r\nend;\r\n\r\n\r\nprocedure TdmOptions.LoadDFMValues;\r\nbegin\r\n inherited LoadDFMValues;\r\n\r\n\r\n try\r\n Name := 'dmOptions';\r\n SetEvent(Self, 'OnCreate', 'dmOptionsCreate');\r\n SetEvent(Self, 'OnDestroy', 'dmOptionsDestroy');\r\n Height := 150;\r\n Width := 215;\r\n finally\r\n end;\r\nend;\r\n\r\nend.\r\n","unit Login;\r\n\r\ninterface\r\n\r\nuses\r\n SysUtils, Classes, JS, Web, WEBLib.Graphics, WEBLib.Controls,\r\n WEBLib.Forms, WEBLib.Dialogs, WEBLib.StdCtrls,\r\n WEBLib.ExtCtrls, XData.Web.Connection, XData.Web.Client,\r\n Parameters, WEBLib.Imaging.GIFImg;\r\n\r\ntype\r\n TLoginStep = (lsNull, lsLoggedIn, lsFoundAccount, lsNoAccount, lsNewAccount, lsForgotAccount, lsPassword, lsForgotPassword,\r\n \t lsQuestion1, lsQuestion2);\r\n\r\n TwLogin = class(TForm)\r\n pnVerification: TPanel;\r\n WebPanel1: TPanel;\r\n WebLabel1: TLabel;\r\n edAccount: TEdit;\r\n btAccount: TButton;\r\n pnPassword: TPanel;\r\n WebLabel2: TLabel;\r\n WebEdit2: TEdit;\r\n btPass: TButton;\r\n pnPhone: TPanel;\r\n WebLabel3: TLabel;\r\n WebEdit3: TEdit;\r\n btPhone: TButton;\r\n pnL4Name: TPanel;\r\n WebLabel4: TLabel;\r\n WebEdit4: TEdit;\r\n btL4Name: TButton;\r\n WebLabel5: TLabel;\r\n WebEdit5: TEdit;\r\n pnQuestion: TPanel;\r\n WebLabel6: TLabel;\r\n WebEdit6: TEdit;\r\n btQuestion: TButton;\r\n pnEMail: TPanel;\r\n WebLabel7: TLabel;\r\n WebEdit7: TEdit;\r\n btEMail: TButton;\r\n WebLabel8: TLabel;\r\n pnL4NameNo: TPanel;\r\n WebLabel9: TLabel;\r\n WebLabel10: TLabel;\r\n WebEdit8: TEdit;\r\n btL4NameNo: TButton;\r\n WebEdit9: TEdit;\r\n WebLabel11: TLabel;\r\n WebEdit10: TEdit;\r\n WebLabel12: TLabel;\r\n pnNew: TPanel;\r\n pnNewPass: TPanel;\r\n WebLabel13: TLabel;\r\n WebEdit11: TEdit;\r\n WebLabel14: TLabel;\r\n WebEdit12: TEdit;\r\n pnNewEMail: TPanel;\r\n WebLabel15: TLabel;\r\n WebEdit13: TEdit;\r\n pnNewPhone: TPanel;\r\n WebLabel16: TLabel;\r\n WebEdit14: TEdit;\r\n pnNewQuestions: TPanel;\r\n WebLabel17: TLabel;\r\n WebEdit15: TEdit;\r\n pnNewGo: TPanel;\r\n btNewGo: TButton;\r\n WebEdit16: TEdit;\r\n WebEdit17: TEdit;\r\n WebLabel18: TLabel;\r\n WebLabel19: TLabel;\r\n WebLabel20: TLabel;\r\n WebComboBox1: TComboBox;\r\n WebLabel21: TLabel;\r\n WebLabel22: TLabel;\r\n WebLabel23: TLabel;\r\n WebComboBox2: TComboBox;\r\n WebComboBox3: TComboBox;\r\n WebLabel24: TLabel;\r\n WebEdit18: TEdit;\r\n Timer1: TTimer;\r\n pnHeading: TPanel;\r\n pnVerify: TPanel;\r\n lbVerify: TLabel;\r\n edVerify: TEdit;\r\n btVerify: TButton;\r\n WebLabel27: TLabel;\r\n edSSN: TEdit;\r\n WebLabel28: TLabel;\r\n Timer2: TTimer;\r\n lbHeading: TLabel;\r\n WebPanel3: TPanel;\r\n WebLabel29: TLabel;\r\n WebLabel30: TLabel;\r\n WebLabel31: TLabel;\r\n WebLabel32: TLabel;\r\n edWHAccount: TEdit;\r\n btWHAccount: TButton;\r\n edWHFEIN: TEdit;\r\n WebPanel4: TPanel;\r\n lbWMessage: TLabel;\r\n lbWHeading: TLabel;\r\n pnLogo: TPanel;\r\n imgLogo: TImageControl;\r\n pnInstructions: TPanel;\r\n lbInstruction3: TLabel;\r\n lbInstruction2: TLabel;\r\n lbInstruction1: TLabel;\r\n lbMessage: TLabel;\r\n WebWaitMessage1: TWaitMessage;\r\n procedure WebFormShow(Sender: TObject);\r\n procedure WebFormCreate(Sender: TObject);\r\n\r\n procedure btAccountClick(Sender: TObject);\r\n procedure btPassClick(Sender: TObject);\r\n procedure btL4NameClick(Sender: TObject);\r\n procedure btEMailClick(Sender: TObject);\r\n procedure btPhoneClick(Sender: TObject);\r\n procedure btQuestionClick(Sender: TObject);\r\n procedure WebLabel8Click(Sender: TObject);\r\n procedure btL4NameNoClick(Sender: TObject);\r\n procedure btNewGoClick(Sender: TObject);\r\n procedure Timer1Timer(Sender: TObject);\r\n procedure edAccountKeyUp(Sender: TObject; var Key: Word;\r\n Shift: TShiftState);\r\n procedure pnPasswordKeyUp(Sender: TObject; var Key: Word;\r\n Shift: TShiftState);\r\n procedure pnL4NameNoKeyUp(Sender: TObject; var Key: Word;\r\n Shift: TShiftState);\r\n procedure WebEdit11KeyUp(Sender: TObject; var Key: Word;\r\n Shift: TShiftState);\r\n procedure btVerifyClick(Sender: TObject);\r\n procedure edVerifyKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);\r\n procedure edWHFEINKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);\r\n procedure edWHAccountKeyUp(Sender: TObject; var Key: Word;\r\n Shift: TShiftState);\r\n procedure btWHAccountClick(Sender: TObject);\r\n private\r\n { Private declarations }\r\n LoginStep: TLoginStep;\r\n Verified: boolean;\r\n procedure SetQuestion;\r\n procedure SetOnePanel(pnl, ndx: integer);\r\n procedure SetLoginPanel;\r\n procedure SetupNew;\r\n procedure HandleVerification;\r\n{ procedure TestLogin;}\r\n\r\n{ [async]\r\n procedure MakeCTSvcRequest(request: string);\r\n}\r\n [async]\r\n procedure DoCallLogin(cwh: boolean=false); async;\r\n [async]\r\n function CallLogin(typ, loginval, verifyval: string): boolean; async;\r\n procedure SetColors;\r\n public\r\n { Public declarations }\r\n MyResponse: string;\r\n MyLoginParams: TDataPairParams;\r\n protected procedure LoadDFMValues; override; end;\r\n\r\nvar\r\n wLogin: TwLogin;\r\n\r\nimplementation\r\n\r\n{$R *.dfm}\r\n\r\nuses OptionsDM, Main, Utilities, entForms, entFieldValues, ClientConnectionsDM, ClientCurrent,\r\n\tTransferWeb, Verification, SectionPanels, entData;\r\n\r\nprocedure TwLogin.SetupNew;\r\nbegin\r\n \tSetOnePanel(1, 0);\r\nend;\r\n\r\nprocedure TwLogin.edAccountKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);\r\nbegin\r\n\tLogMessage(inttostr(Key) + ' ' + inttostr(VK_RETURN));\r\n\tif Key = VK_RETURN then begin\r\n \tif (edAccount.text > '') or (edSSN.text > '') then\r\n \tbtAccount.click\r\n else if Sender = edAccount then edSSN.SetFocus\r\n else edAccount.SetFocus;\r\n end;\r\nend;\r\n\r\nprocedure TwLogin.edVerifyKeyUp(Sender: TObject; var Key: Word;\r\n Shift: TShiftState);\r\nbegin\r\n\tLogMessage(inttostr(Key) + '_' + inttostr(VK_RETURN));\r\n\tif Key = VK_RETURN then begin\r\n btVerify.click;\r\n end;\r\nend;\r\n\r\nprocedure TwLogin.edWHAccountKeyUp(Sender: TObject; var Key: Word;\r\n Shift: TShiftState);\r\nbegin\r\n\tLogMessage(inttostr(Key) + ' ' + inttostr(VK_RETURN));\r\n\tif Key = VK_RETURN then begin\r\n \tedWHFEIN.SetFocus;\r\n Key := 0;\r\n end;\r\nend;\r\n\r\nprocedure TwLogin.edWHFEINKeyUp(Sender: TObject; var Key: Word;\r\n Shift: TShiftState);\r\nbegin\r\n\tLogMessage(inttostr(Key) + ' ' + inttostr(VK_RETURN));\r\n\tif Key = VK_RETURN then begin\r\n btWHAccount.click;\r\n end;\r\nend;\r\n\r\nprocedure TwLogin.pnPasswordKeyUp(Sender: TObject; var Key: Word;\r\n Shift: TShiftState);\r\nbegin\r\n\tLogMessage(inttostr(Key) + '_' + inttostr(VK_RETURN));\r\n\tif Key = VK_RETURN then begin\r\n btPass.click;\r\n end;\r\nend;\r\n\r\nprocedure TwLogin.pnL4NameNoKeyUp(Sender: TObject; var Key: Word;\r\n Shift: TShiftState);\r\nbegin\r\n\tLogMessage(inttostr(Key) + ' ' + inttostr(VK_RETURN));\r\n\tif Key = VK_RETURN then begin\r\n btL4NameNo.click;\r\n end;\r\nend;\r\n\r\nprocedure TwLogin.WebEdit11KeyUp(Sender: TObject; var Key: Word;\r\n Shift: TShiftState);\r\nbegin\r\n\tbtNewGo.click;\r\nend;\r\n\r\nprocedure TwLogin.Timer1Timer(Sender: TObject);\r\nbegin\r\n\tLogMessage('Timer: SetFocus');\r\n \tTimer1.Enabled := false;\r\n if SiteOpts.Loaded then begin\r\n\t SetLoginPanel;\r\n if LoginOpts.HLoginPass > '' then begin\r\n \tif CurrentTPType <> 'I' then\r\n \tbtWHAccountclick(btWHAccount)\r\n \telse\r\n \tbtVerifyclick(btVerify);\r\n end\r\n else\r\n\t\t\tedAccount.SetFocus;\r\n end\r\n else begin\r\n \tTimer1.Enabled := true;\r\n end;\r\nend;\r\n\r\nprocedure TwLogin.btAccountClick(Sender: TObject);\r\n\r\n procedure ShowVerification;\r\n begin\r\n \tSetOnePanel(2, 6); // ask for password?\r\n end;\r\n\r\nbegin\r\n LogMessage('btAccount click');\r\n ShowVerification;\r\nend;\r\n\r\nprocedure TwLogin.SetOnePanel(pnl, ndx: integer);\r\nvar ptp: integer;\r\n\r\n function SetPanel(pnl: TPanel; ctrl: TControl): integer;\r\n begin\r\n result := pnl.height;\r\n pnl.visible := true;\r\n pnl.Top := 0;\r\n if ctrl <> nil then\r\n \tctrl.setfocus;\r\n\t LogMessage(pnl.name + ': ' +inttostr(pnl.top));\r\n end;\r\n\r\n\tfunction PickPanel: integer;\r\n var opt: string;\r\n begin\r\n \tLogMessage('PickPanel: ', ndx);\r\n \t// still need to set for options\r\n if ndx = -1 then begin\t// Site Option for Verify\r\n \topt := LoginOpts.NoAcctKnowID;\r\n if opt = '1' then ndx := 1\r\n else if opt = '2' then ndx := 5\r\n else ndx := 0;//dmTaxpayer.FirstApplies(opt);\r\n LogMessage('PickPanel Chgd: ', opt, ndx);\r\n end;\r\n pnPassword.visible := false;\r\n pnL4Name.visible := false;\r\n pnPhone.visible := false;\r\n pnQuestion.visible := false;\r\n pnEMail.visible := false;\r\n pnL4NameNo.visible := false;\r\n pnVerify.visible := false;\r\n case ndx of\r\n 0: result := SetPanel(pnPassword, WebEdit2);\r\n 1: result := SetPanel(pnL4Name, WebEdit4);\r\n 2: result := SetPanel(pnPhone, WebEdit3);\r\n 3: begin\r\n \t\tresult := SetPanel(pnQuestion, WebEdit6);\r\n SetQuestion;\r\n \tend;\r\n 4: result := SetPanel(pnEMail, WebEdit7);\r\n 5: result := SetPanel(pnL4NameNo, WebEdit8);\r\n 6: result := SetPanel(pnVerify, edVerify);\r\n end;\r\n end;\r\n\r\n\tfunction PickPanel1: integer;\r\n // new account, so password and extra info\r\n var ht: integer;\r\n\r\n \tprocedure AddPanel(pn: TPanel);\r\n begin\r\n \tpn.Top := ht;\r\n \tht := ht + pn.height;\r\n pn.Visible := true;\r\n end;\r\n\r\n begin\r\n \t// ndx can be 0 for new account\r\n // 1 for Phone & Email\r\n // 2 for Change Security Questions\r\n // 3 for Change Password\r\n // 4 for Change Phone, EMail & Security Questions\r\n\r\n pnNewPass.visible := false;\r\n pnNewEMail.visible := false;\r\n pnNewPhone.visible := false;\r\n pnNewQuestions.visible := false;\r\n pnNewGo.visible := false;\r\n case ndx of\r\n 0: begin\r\n \t\tht := 0;\r\n AddPanel(pnNewPass);\r\n if pos('E', LoginOpts.NewAccountActions) > 0 then begin // := 'PQEH';\r\n \tAddPanel(pnNewEMail);\r\n end;\r\n if pos('H', LoginOpts.NewAccountActions) > 0 then begin // := 'PQEH';\r\n \tAddPanel(pnNewPhone);\r\n end;\r\n if pos('Q', LoginOpts.NewAccountActions) > 0 then begin // := 'PQEH';\r\n\t //dmTaxpayer.FillQuestions;\r\n \tAddPanel(pnNewQuestions);\r\n end;\r\n\t\t\t AddPanel(pnNewGo);\r\n result := ht;\r\n WebEdit11.SetFocus;\r\n \tend;\r\n 1: begin\r\n ht := 0;\r\n if pos('E', LoginOpts.NewAccountActions) > 0 then begin // := 'PQEH';\r\n \tAddPanel(pnNewEMail);\r\n end;\r\n if pos('H', LoginOpts.NewAccountActions) > 0 then begin // := 'PQEH';\r\n \tAddPanel(pnNewPhone);\r\n end;\r\n\t\t\t AddPanel(pnNewGo);\r\n result := ht;\r\n btNewGo.SetFocus;\r\n \tend;\r\n 2: begin\t// security questions\r\n \t\tht := 0;\r\n //dmTaxpayer.FillQuestions;\r\n AddPanel(pnNewQuestions);\r\n\t\t\t AddPanel(pnNewGo);\r\n result := ht;\r\n WebComboBox1.SetFocus;\r\n \tend;\r\n 3: begin\r\n \t\tht := 0;\r\n AddPanel(pnNewPass);\r\n\t\t\t AddPanel(pnNewGo);\r\n result := ht;\r\n WebEdit11.SetFocus;\r\n \tend;\r\n 4: begin\r\n \t\tht := 0;\r\n if pos('E', LoginOpts.NewAccountActions) > 0 then begin // := 'PQEH';\r\n \tAddPanel(pnNewEMail);\r\n end;\r\n if pos('H', LoginOpts.NewAccountActions) > 0 then begin // := 'PQEH';\r\n \tAddPanel(pnNewPhone);\r\n end;\r\n if pos('Q', LoginOpts.NewAccountActions) > 0 then begin // := 'PQEH';\r\n\t //dmTaxpayer.FillQuestions;\r\n \tAddPanel(pnNewQuestions);\r\n end;\r\n\t\t\t AddPanel(pnNewGo);\r\n result := ht;\r\n btNewGo.SetFocus;\r\n \tend;\r\n end;\r\n end;\r\n\r\n\tfunction PickPanelVerify: integer;\r\n var opt: string;\r\n \t ndx: integer;\r\n begin\r\n \tLogMessage('PickPanel: ', ndx);\r\n \t// still need to set for options\r\n if ndx = -1 then begin\t// Site Option for Verify\r\n \topt := LoginOpts.NoAcctKnowID;\r\n if opt = '1' then ndx := 1\r\n else if opt = '2' then ndx := 5\r\n else ndx := 0;//dmTaxpayer.FirstApplies(opt);\r\n LogMessage('PickPanel Chgd: ', opt, ndx);\r\n end;\r\n pnPassword.visible := false;\r\n pnL4Name.visible := false;\r\n pnPhone.visible := false;\r\n pnQuestion.visible := false;\r\n pnEMail.visible := false;\r\n pnL4NameNo.visible := false;\r\n pnVerify.visible := false;\r\n result := SetPanel(pnVerify, edVerify);\r\n ndx := pos(SiteOpts.VerifyTypes, 'DLSA');\r\n case ndx of\r\n 1: begin\t// tax due\r\n \t\tlbVerify.caption := 'Previous Year Tax';\r\n \tend;\r\n 2: begin\t// Last Name\r\n \t\tlbVerify.caption := 'Primary Last Name';\r\n \tend;\r\n 3: begin\t// Street Number\r\n \t\tlbVerify.caption := 'Street Number';\r\n \tend;\r\n 4: begin\t// Street Name\r\n \t\tlbVerify.caption := 'Street Name';\r\n \tend;\r\n end;\r\n end;\r\n\r\nbegin\r\n\tptp := WebPanel1.Top + WebPanel1.Height + 8;\r\n case pnl of\r\n 0: begin\r\n pnNew.visible := false;\r\n pnVerification.BeginUpdate;\r\n pnVerification.Top := ptp;\r\n pnVerification.Height := 500;\r\n pnVerification.visible := true;\r\n pnVerification.Height := PickPanel+2;\r\n pnVerification.EndUpdate;\r\n end;\r\n 1: begin\r\n pnVerification.visible := false;\r\n pnNew.BeginUpdate;\r\n pnNew.Top := ptp;\r\n pnNew.Height := 500;\r\n pnNew.left := pnVerification.Left;\r\n pnNew.visible := true;\r\n pnNew.Height := PickPanel1+2;\r\n pnNew.EndUpdate;\r\n end;\r\n 2: begin\r\n pnNew.visible := false;\r\n pnVerification.BeginUpdate;\r\n pnVerification.Top := ptp;\r\n pnVerification.Height := 500;\r\n pnVerification.visible := true;\r\n pnVerification.Height := PickPanelVerify+2;\r\n pnVerification.EndUpdate;\r\n end;\r\n end;\r\n //SetColors;\r\nend;\r\n\r\nprocedure TwLogin.SetColors;\r\nvar clr: integer;\r\nbegin\r\n\tclr := SafeColor(SiteOpts.LoginPanelColor, clBtnFace);\r\n pnVerify.color := clr;\r\n WebPanel1.color := clr;\r\n pnHeading.color := clr;\r\n WebPanel3.color := clr;\r\n WebPanel4.color := clr;\r\n lbHeading.color := clr;\r\n lbMessage.color := clr;\r\n pnInstructions.color := clr;\r\n lbInstruction1.color := clr;\r\n lbInstruction2.color := clr;\r\n lbInstruction3.color := clr;\r\n WebLabel8.color := clr; // forgot your account\r\n \tlbHeading.Font.color := SiteOpts.LoginMsgFontColor;\r\n \tlbMessage.Font.color := SiteOpts.LoginMsgFontColor;\r\n\tclr := SafeColor(SiteOpts.DefButtonColor, clBtnFace);\r\n btVerify.color := SiteOpts.DefButtonColor;\r\n btAccount.color := SiteOpts.DefButtonColor;\r\n // any other verify panels must also be set\r\nend;\r\n\r\nprocedure TwLogin.SetLoginPanel;\r\nvar ltypes, cap, ins1, ins2, ins3: string;\r\n\t tht, worktop, workht: integer;\r\n\r\n function LengthToHeight(s: string): integer;\r\n var lns: integer;\r\n begin\r\n\t lns := length(s);\r\n \tlns := (lns div 45 + 1) * 16;\r\n result := lns + 6;\r\n end;\r\n\r\n procedure AddOneInstruction(lb: TLabel; ins: string);\r\n var ht: integer;\r\n begin\r\n \tif ins > '' then begin\r\n \tht := LengthToHeight(ins);\r\n lb.Height := ht;\r\n lb.Caption := ins;\r\n WorkHt := WorkHt + ht + 8;\t// Margin top & bottom each one\r\n end;\r\n end;\r\n\r\nbegin\r\n\tltypes := SiteOpts.LoginTypes;\r\n SetLogoPanel(pnLogo, imgLogo);\r\n if LoginForm.Method > '' then ltypes := LoginForm.Method;\r\n // can only be A(Account: meaning Account or Alt1 or ALt2 based on site)\r\n // with or without S(SSN)\r\n if ltypes = '' then ltypes := 'AS';\r\n if length(ltypes) < 2 then begin\t\t// if both Acct and SSN, then nothing to do\r\n \tWebLabel27.visible := false;\r\n WebLabel28.visible := false;\r\n edSSN.visible := false;\r\n if ltypes = 'S' then begin\r\n \tWebLabel1.caption := 'SSN';\r\n end;\r\n WebPanel1.Height := 59;\r\n btAccount.Top := edAccount.Top;\r\n end;\r\n pnHeading.visible := true;\r\n lbHeading.caption := LoginForm.Caption;\r\n cap := LoginForm.CapMessage;\r\n ins1 := LoginForm.Instruction1;\r\n ins2 := LoginForm.Instruction2;\r\n ins3 := LoginForm.Instruction3;\r\n lbMessage.caption := cap;\r\n tht := LengthToHeight(cap);\r\n pnHeading.Height := tht + 28;\r\n lbMessage.Height := tht;\r\n WorkTop := pnHeading.Top + pnHeading.Height;\r\n if ins1 > '' then begin\r\n \tpnInstructions.visible := true;\r\n pnInstructions.Top := WorkTop;\r\n WorkHt := 0;\r\n AddOneInstruction(lbInstruction1, ins1);\r\n AddOneInstruction(lbInstruction2, ins2);\r\n AddOneInstruction(lbInstruction3, ins3);\r\n WorkHt := WorkHt + 8;\r\n pnInstructions.Height := WorkHt;\r\n WorkTop := WorkTop + WorkHt;\r\n end;\r\n if LoginForm.LoginType = 'I' then begin\r\n\t WebPanel3.visible := false;\r\n\t WebPanel1.visible := true;\r\n WebPanel1.Top := WorkTop;\r\n if LoginOpts.HLoginPass > '' then begin\r\n \tedAccount.text := LoginOpts.HLoginPass;\r\n end;\r\n end\r\n else begin\r\n\t WebPanel1.visible := false;\r\n\t WebPanel3.visible := true;\r\n WebPanel3.Top := WorkTop;\r\n WebPanel3.Left := WebPanel1.left;\r\n if LoginOpts.HLoginPass > '' then begin\r\n \tedWHAccount.text := LoginOpts.HLoginPass;\r\n end;\r\n end;\r\n WebPanel4.visible := false;\t//true;\r\n\tSetColors;\r\nend;\r\n\r\nprocedure TwLogin.btPassClick(Sender: TObject);\r\nbegin\r\n\tbtPass.enabled := false;\r\n\tVerified := true;//dmTaxpayer.TP.VerifyData(0, WebEdit2.text);\r\n LoginStep := lsLoggedIn;\r\n if Verified then ShowMain;\r\n\tbtPass.enabled := true;\r\nend;\r\n\r\nprocedure TwLogin.btPhoneClick(Sender: TObject);\r\nbegin\r\n\tif LoginStep = lsForgotAccount then\r\n\t\tVerified := true//dmTaxpayer.TP.FindData(2, WebEdit3.text)\r\n else\r\n\t\tVerified := true;\t//dmTaxpayer.TP.VerifyData(2, WebEdit3.text);\r\n HandleVerification;\r\nend;\r\n\r\nprocedure TwLogin.btL4NameClick(Sender: TObject);\r\nbegin\r\n\tif LoginStep = lsForgotAccount then\r\n\t\tVerified := true//dmTaxpayer.TP.FindData(1, WebEdit4.text, WebEdit5.text, WebEdit18.text)\r\n else\r\n\t\tVerified := true;//dmTaxpayer.TP.VerifyData(1, WebEdit4.text, WebEdit5.text, WebEdit18.text);\r\n HandleVerification;\r\nend;\r\n\r\nprocedure TwLogin.btL4NameNoClick(Sender: TObject);\r\nbegin\r\n\tif LoginStep = lsForgotAccount then\r\n\t\tVerified := true//dmTaxpayer.TP.FindData(5, WebEdit8.text, WebEdit9.text, WebEdit10.text)\r\n else\r\n\t\tVerified := true;//dmTaxpayer.TP.VerifyData(5, WebEdit8.text, WebEdit9.text, WebEdit10.text);\r\n HandleVerification;\r\nend;\r\n\r\nprocedure TwLogin.btNewGoClick(Sender: TObject);\r\nvar parm: string;\r\n\r\n\tfunction DoneWithEntry: boolean;\r\n begin\r\n \tresult := true;\r\n if pnNewPass.visible then begin\r\n\t // Test Password\r\n \t if WebEdit11.text <> WebEdit12.text then begin\r\n \tShowMessage('Passwords do not match');\r\n result := false;\r\n end\r\n else if not dmOptions.TestPassword(WebEdit11.text) then begin\r\n \tShowMessage('Password does not meet requirements: ' + #13 + dmOptions.PasswordReqEng);\r\n result := false;\r\n end;\r\n \tend;\r\n \t// Mark incorrect fields?\r\n end;\r\n\r\n procedure AddToParm(pn: TPanel; ed: TEdit);\r\n begin\r\n \tif pn.visible then parm := parm + ed.text;\r\n parm := parm + '|';\r\n end;\r\n\r\n procedure AddQToParm(pn: TPanel; cmb: TComboBox; ed: TEdit);\r\n var q: integer;\r\n begin\r\n \tq := 1;//dmTaxpayer.GetMatchingQuestion(cmb);\r\n \tif pn.visible then parm := parm + inttostr(q) + '/' + ed.text;\r\n parm := parm + '|';\r\n end;\r\n\r\nbegin\r\n\t// Check all Required data is filled in\r\n if DoneWithEntry then begin\r\n \tparm := '';\r\n AddToParm(pnNewPass, WebEdit11);\r\n AddToParm(pnNewPass, WebEdit12);\r\n AddToParm(pnNewEMail, WebEdit13);\r\n AddToParm(pnNewPhone, WebEdit14);\r\n AddQToParm(pnNewQuestions, WebComboBox1, WebEdit15);\r\n AddQToParm(pnNewQuestions, WebComboBox2, WebEdit16);\r\n AddQToParm(pnNewQuestions, WebComboBox3, WebEdit17);\r\n \t//dmTaxpayer.WriteData(parm);\r\n LoginStep := lsFoundAccount;\r\n \tShowMain;\r\n end\r\n else\r\n \tShowMessage('Complete all Required data');\r\nend;\r\n\r\nprocedure TwLogin.HandleVerification;\r\nbegin\r\n\tLogMessage('HandleVerification: ', LoginStep, Verified);\r\n\tif Verified then begin\r\n\t\tif (LoginStep = lsNewAccount) then\r\n \t\tSetupNew\r\n\t else if (LoginStep = lsForgotAccount) then begin\r\n edAccount.text := '';//dmTaxpayer.TP.Account;\r\n\t\t\tLogMessage('ForgotAcct: '+ edAccount.text);\r\n{ if dmTaxpayer.TPI.Pass > '' then begin\r\n LoginStep := lsFoundAccount;\r\n ShowMain;\r\n end\r\n else begin\r\n LoginStep := lsNewAccount;\r\n SetupNew;\r\n end;\r\n}\r\n end\r\n else if (LoginStep = lsForgotPassword) then begin\r\n \t// GetNewPassword??\r\n \tSetOnePanel(1, 3);\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TwLogin.btVerifyClick(Sender: TObject);\r\nbegin\r\n\t// testing\r\n DoCallLogin;\r\nend;\r\n\r\nprocedure TwLogin.btWHAccountClick(Sender: TObject);\r\nbegin\r\n\tDoCallLogin(true);\r\nend;\r\n\r\nprocedure TwLogin.btQuestionClick(Sender: TObject);\r\nbegin\r\n\tVerified := true;//dmTaxpayer.TP.VerifyData(3);\r\n HandleVerification;\r\nend;\r\n\r\nprocedure TwLogin.btEMailClick(Sender: TObject);\r\nbegin\r\n\tif LoginStep = lsForgotAccount then\r\n\t\tVerified := true//dmTaxpayer.TP.FindData(4, WebEdit7.text)\r\n else\r\n\t\tVerified := true;//dmTaxpayer.TP.VerifyData(4, WebEdit7.text);\r\n HandleVerification;\r\nend;\r\n\r\nprocedure TwLogin.WebFormCreate(Sender: TObject);\r\nbegin\r\n Timer1.Enabled := true;\r\n // get opts to set screen\r\nend;\r\n\r\nprocedure TwLogin.WebFormShow(Sender: TObject);\r\nbegin\r\n\tLoginStep := lsNull;\r\nend;\r\n\r\nprocedure TwLogin.WebLabel8Click(Sender: TObject);\r\nbegin\r\n// forgot account\r\n\t// could be email or text if available\r\n // else Last Four/Last Name/Street or Stno\r\n // or Security Question Combination if available\r\n LoginStep := lsForgotAccount;\r\n SetOnePanel(0, 5);\r\nend;\r\n\r\nprocedure TwLogin.SetQuestion;\r\nbegin\r\n // pick random of nQuestions, make sure not already asked\r\nend;\r\n\r\nprocedure TwLogin.DoCallLogin(cwh: boolean=false);\r\nvar res: boolean;\r\nbegin\r\n// dmClientConnections.SendConsoleMessage('Startup: AAA');\r\n\t// Login\r\n if not cwh then begin\r\n \tif LoginOpts.HLoginPass > '' then\r\n res := await(CallLogin('A', edAccount.text, 'ZZ'))\r\n else if (edAccount.text > '') then begin\r\n if (WebLabel1.caption <> 'SSN') then\r\n res := await(CallLogin('A', edAccount.text, edVerify.text))\r\n else\r\n res := await(CallLogin('S', edAccount.text, edVerify.text));\r\n end\r\n else\r\n res := await(CallLogin('S', edSSN.text, edVerify.text));\r\n end\r\n else begin\r\n \tif LoginOpts.HLoginPass > '' then\r\n res := await(CallLogin(LoginForm.LoginType, edWHAccount.text, 'ZCW'))\r\n else if (edWHAccount.text > '') and (edWHFEIN.text > '') then\r\n res := await(CallLogin(LoginForm.LoginType, edWHAccount.text, edWHFEIN.text))\r\n else\r\n \tres := false;\r\n end;\r\n if res then begin\r\n \t// open main screen\r\n\t VerifyTool := TVerification.create;\r\n\t\tOCCList := TOCCList.create;\r\n await(GetForms);\r\n await(DoGetData('LOG'));\r\n ShowMain;\r\n end;\r\nend;\r\n\r\nfunction TwLogin.CallLogin(typ, loginval, verifyval: string): boolean;\r\nvar stat: integer;\r\n promise: TJSXMLHttpRequest;\r\n request: string;\r\nbegin\r\n InitCurrent;\r\n\trequest := 'Login?LoginType=' + typ + '&LoginName=' + loginval + '&VerifyValue=' + verifyval;\r\n dmClientConnections.HttpRequest.URL := CTSERVICECONNSTRING + request;\r\n\tIncCallCounter(ccLogin);\r\n promise := await(TJSXMLHttpRequest, dmClientConnections.HttpRequest.Perform);\r\n MyResponse := promise.ResponseText;\r\n MyLoginParams := XMLSplitPairParams(MyResponse);\r\n LineCodeVars := TLineCodeVars.create;\r\n LineCodeVars.LoadDataPairParams(MyLoginParams);\r\n result := false;\r\n // AT: Temp AF: Full Access NN: None Current TO: Timed Out SV: Saved SS: Submitted SP: Submitted Posted SR: Sub Review RF: Refund\r\n stat := pos(CurrentStatus, '||AT|AF|NN|TO|SV|SS|SP|SR|SF|PF|PC|PD|WL|OD|OC|OP|PP|ZZ|SM|AA|WY|3C|YS|W3|WP|4C|W4|') div 3;\r\n case stat of\r\n \t1: begin\t\t//AT: for New or Guest entry\r\n\t\t result := true;\r\n// \t\tCurrentToken := MyLoginParams.GetByCode('ACCESSTOKEN');\r\n end;\r\n 2: begin\t\t//AF: full access\r\n\t\t result := true;\r\n// \t\tCurrentToken := MyLoginParams.GetByCode('ACCESSTOKEN');\r\n\t\t end;\r\n 4: begin\t\t//TO: Timed out\r\n \t\tShowMessage('Your Session has timed out');\r\n\t\t end;\r\n 5, 20: begin //SV/AA\r\n \t\t//ShowMessage('Ready to Continue');\r\n //bch Get data\r\n result := true;\r\n end;\r\n 6: begin //SS\r\n \t\tShowMessage('Return is already submitted. Amended Returns cannot be done online.');\r\n result := true;\r\n end;\r\n 7: begin //SP\r\n \t\tShowMessage('Return is already submitted and processed. Amended Returns cannot be done online.');\r\n result := true;\r\n end;\r\n 8: begin //SR\r\n \t\tShowMessage('Return is already submitted and under review. Amended Returns cannot be done online.');\r\n result := true;\r\n end;\r\n 9: begin //SF\r\n \t\tShowMessage('Return is already submitted and a Refund is being processed. Amended Returns cannot be done online.');\r\n result := true;\r\n end;\r\n 10..12: begin\r\n \t\tShowMessage('Return is already submitted through a Tax Preparer.');\r\n result := true;\r\n \tend;\r\n 13: begin\t// Withholding login\r\n \t\tresult := true;\r\n \tend;\r\n 14..15: begin // OD/OC\r\n \t\tShowMessage('Return is already submitted. Amended Returns cannot be done online.');\r\n result := true;\r\n end;\r\n 16..17: begin // OP/PP\r\n \t\tShowMessage('Return is already Processed. Amended Returns cannot be done online.');\r\n result := true;\r\n end;\r\n 18: begin // ZZ\r\n// \t\tShowMessage('Administrative Login');\r\n result := true;\r\n end;\r\n 19: begin // SM\r\n \t\tShowMessage('Return is marked for Paper Mail-In');\r\n result := true;\r\n end;\r\n 21..23: begin // WY/3C/YS\r\n \t\tShowMessage('End of Year Submitted');\r\n result := true;\r\n end;\r\n 24: begin //\r\n \t\tShowMessage('End of Year Processed');\r\n result := true;\r\n end;\r\n 25..27: begin //\r\n \t\tShowMessage('Periods Submitted');\r\n result := true;\r\n end;\r\n\t else begin\t//NN or other\r\n \t\t// Not Found\r\n \tShowMessage('Unable to verify an account matching your information: ' +\r\n dmClientConnections.HttpRequest.URL);\r\n end;\r\n end;\r\n if not result then CurrentToken := '';\r\nend;\r\n\r\n\r\nprocedure TwLogin.LoadDFMValues;\r\nbegin\r\n inherited LoadDFMValues;\r\n\r\n pnVerification := TPanel.Create(Self);\r\n pnPassword := TPanel.Create(Self);\r\n WebLabel2 := TLabel.Create(Self);\r\n WebLabel12 := TLabel.Create(Self);\r\n WebEdit2 := TEdit.Create(Self);\r\n btPass := TButton.Create(Self);\r\n pnPhone := TPanel.Create(Self);\r\n WebLabel3 := TLabel.Create(Self);\r\n WebEdit3 := TEdit.Create(Self);\r\n btPhone := TButton.Create(Self);\r\n pnL4Name := TPanel.Create(Self);\r\n WebLabel4 := TLabel.Create(Self);\r\n WebLabel5 := TLabel.Create(Self);\r\n WebLabel24 := TLabel.Create(Self);\r\n WebEdit4 := TEdit.Create(Self);\r\n btL4Name := TButton.Create(Self);\r\n WebEdit5 := TEdit.Create(Self);\r\n WebEdit18 := TEdit.Create(Self);\r\n pnQuestion := TPanel.Create(Self);\r\n WebLabel6 := TLabel.Create(Self);\r\n WebEdit6 := TEdit.Create(Self);\r\n btQuestion := TButton.Create(Self);\r\n pnEMail := TPanel.Create(Self);\r\n WebLabel7 := TLabel.Create(Self);\r\n WebEdit7 := TEdit.Create(Self);\r\n btEMail := TButton.Create(Self);\r\n pnL4NameNo := TPanel.Create(Self);\r\n WebLabel9 := TLabel.Create(Self);\r\n WebLabel10 := TLabel.Create(Self);\r\n WebLabel11 := TLabel.Create(Self);\r\n WebEdit8 := TEdit.Create(Self);\r\n btL4NameNo := TButton.Create(Self);\r\n WebEdit9 := TEdit.Create(Self);\r\n WebEdit10 := TEdit.Create(Self);\r\n pnVerify := TPanel.Create(Self);\r\n lbVerify := TLabel.Create(Self);\r\n edVerify := TEdit.Create(Self);\r\n btVerify := TButton.Create(Self);\r\n WebPanel1 := TPanel.Create(Self);\r\n WebLabel1 := TLabel.Create(Self);\r\n WebLabel8 := TLabel.Create(Self);\r\n WebLabel27 := TLabel.Create(Self);\r\n WebLabel28 := TLabel.Create(Self);\r\n edAccount := TEdit.Create(Self);\r\n btAccount := TButton.Create(Self);\r\n edSSN := TEdit.Create(Self);\r\n pnNew := TPanel.Create(Self);\r\n pnNewPass := TPanel.Create(Self);\r\n WebLabel13 := TLabel.Create(Self);\r\n WebLabel14 := TLabel.Create(Self);\r\n WebEdit11 := TEdit.Create(Self);\r\n WebEdit12 := TEdit.Create(Self);\r\n pnNewEMail := TPanel.Create(Self);\r\n WebLabel15 := TLabel.Create(Self);\r\n WebEdit13 := TEdit.Create(Self);\r\n pnNewPhone := TPanel.Create(Self);\r\n WebLabel16 := TLabel.Create(Self);\r\n WebEdit14 := TEdit.Create(Self);\r\n pnNewQuestions := TPanel.Create(Self);\r\n WebLabel17 := TLabel.Create(Self);\r\n WebLabel18 := TLabel.Create(Self);\r\n WebLabel19 := TLabel.Create(Self);\r\n WebLabel20 := TLabel.Create(Self);\r\n WebLabel21 := TLabel.Create(Self);\r\n WebLabel22 := TLabel.Create(Self);\r\n WebLabel23 := TLabel.Create(Self);\r\n WebEdit15 := TEdit.Create(Self);\r\n WebEdit16 := TEdit.Create(Self);\r\n WebEdit17 := TEdit.Create(Self);\r\n WebComboBox1 := TComboBox.Create(Self);\r\n WebComboBox2 := TComboBox.Create(Self);\r\n WebComboBox3 := TComboBox.Create(Self);\r\n pnNewGo := TPanel.Create(Self);\r\n btNewGo := TButton.Create(Self);\r\n pnHeading := TPanel.Create(Self);\r\n lbHeading := TLabel.Create(Self);\r\n lbMessage := TLabel.Create(Self);\r\n WebPanel3 := TPanel.Create(Self);\r\n WebLabel29 := TLabel.Create(Self);\r\n WebLabel30 := TLabel.Create(Self);\r\n WebLabel31 := TLabel.Create(Self);\r\n WebLabel32 := TLabel.Create(Self);\r\n edWHAccount := TEdit.Create(Self);\r\n btWHAccount := TButton.Create(Self);\r\n edWHFEIN := TEdit.Create(Self);\r\n WebPanel4 := TPanel.Create(Self);\r\n lbWMessage := TLabel.Create(Self);\r\n lbWHeading := TLabel.Create(Self);\r\n pnLogo := TPanel.Create(Self);\r\n imgLogo := TImageControl.Create(Self);\r\n pnInstructions := TPanel.Create(Self);\r\n lbInstruction3 := TLabel.Create(Self);\r\n lbInstruction2 := TLabel.Create(Self);\r\n lbInstruction1 := TLabel.Create(Self);\r\n WebWaitMessage1 := TWaitMessage.Create(Self);\r\n Timer1 := TTimer.Create(Self);\r\n Timer2 := TTimer.Create(Self);\r\n\r\n pnVerification.BeforeLoadDFMValues;\r\n pnPassword.BeforeLoadDFMValues;\r\n WebLabel2.BeforeLoadDFMValues;\r\n WebLabel12.BeforeLoadDFMValues;\r\n WebEdit2.BeforeLoadDFMValues;\r\n btPass.BeforeLoadDFMValues;\r\n pnPhone.BeforeLoadDFMValues;\r\n WebLabel3.BeforeLoadDFMValues;\r\n WebEdit3.BeforeLoadDFMValues;\r\n btPhone.BeforeLoadDFMValues;\r\n pnL4Name.BeforeLoadDFMValues;\r\n WebLabel4.BeforeLoadDFMValues;\r\n WebLabel5.BeforeLoadDFMValues;\r\n WebLabel24.BeforeLoadDFMValues;\r\n WebEdit4.BeforeLoadDFMValues;\r\n btL4Name.BeforeLoadDFMValues;\r\n WebEdit5.BeforeLoadDFMValues;\r\n WebEdit18.BeforeLoadDFMValues;\r\n pnQuestion.BeforeLoadDFMValues;\r\n WebLabel6.BeforeLoadDFMValues;\r\n WebEdit6.BeforeLoadDFMValues;\r\n btQuestion.BeforeLoadDFMValues;\r\n pnEMail.BeforeLoadDFMValues;\r\n WebLabel7.BeforeLoadDFMValues;\r\n WebEdit7.BeforeLoadDFMValues;\r\n btEMail.BeforeLoadDFMValues;\r\n pnL4NameNo.BeforeLoadDFMValues;\r\n WebLabel9.BeforeLoadDFMValues;\r\n WebLabel10.BeforeLoadDFMValues;\r\n WebLabel11.BeforeLoadDFMValues;\r\n WebEdit8.BeforeLoadDFMValues;\r\n btL4NameNo.BeforeLoadDFMValues;\r\n WebEdit9.BeforeLoadDFMValues;\r\n WebEdit10.BeforeLoadDFMValues;\r\n pnVerify.BeforeLoadDFMValues;\r\n lbVerify.BeforeLoadDFMValues;\r\n edVerify.BeforeLoadDFMValues;\r\n btVerify.BeforeLoadDFMValues;\r\n WebPanel1.BeforeLoadDFMValues;\r\n WebLabel1.BeforeLoadDFMValues;\r\n WebLabel8.BeforeLoadDFMValues;\r\n WebLabel27.BeforeLoadDFMValues;\r\n WebLabel28.BeforeLoadDFMValues;\r\n edAccount.BeforeLoadDFMValues;\r\n btAccount.BeforeLoadDFMValues;\r\n edSSN.BeforeLoadDFMValues;\r\n pnNew.BeforeLoadDFMValues;\r\n pnNewPass.BeforeLoadDFMValues;\r\n WebLabel13.BeforeLoadDFMValues;\r\n WebLabel14.BeforeLoadDFMValues;\r\n WebEdit11.BeforeLoadDFMValues;\r\n WebEdit12.BeforeLoadDFMValues;\r\n pnNewEMail.BeforeLoadDFMValues;\r\n WebLabel15.BeforeLoadDFMValues;\r\n WebEdit13.BeforeLoadDFMValues;\r\n pnNewPhone.BeforeLoadDFMValues;\r\n WebLabel16.BeforeLoadDFMValues;\r\n WebEdit14.BeforeLoadDFMValues;\r\n pnNewQuestions.BeforeLoadDFMValues;\r\n WebLabel17.BeforeLoadDFMValues;\r\n WebLabel18.BeforeLoadDFMValues;\r\n WebLabel19.BeforeLoadDFMValues;\r\n WebLabel20.BeforeLoadDFMValues;\r\n WebLabel21.BeforeLoadDFMValues;\r\n WebLabel22.BeforeLoadDFMValues;\r\n WebLabel23.BeforeLoadDFMValues;\r\n WebEdit15.BeforeLoadDFMValues;\r\n WebEdit16.BeforeLoadDFMValues;\r\n WebEdit17.BeforeLoadDFMValues;\r\n WebComboBox1.BeforeLoadDFMValues;\r\n WebComboBox2.BeforeLoadDFMValues;\r\n WebComboBox3.BeforeLoadDFMValues;\r\n pnNewGo.BeforeLoadDFMValues;\r\n btNewGo.BeforeLoadDFMValues;\r\n pnHeading.BeforeLoadDFMValues;\r\n lbHeading.BeforeLoadDFMValues;\r\n lbMessage.BeforeLoadDFMValues;\r\n WebPanel3.BeforeLoadDFMValues;\r\n WebLabel29.BeforeLoadDFMValues;\r\n WebLabel30.BeforeLoadDFMValues;\r\n WebLabel31.BeforeLoadDFMValues;\r\n WebLabel32.BeforeLoadDFMValues;\r\n edWHAccount.BeforeLoadDFMValues;\r\n btWHAccount.BeforeLoadDFMValues;\r\n edWHFEIN.BeforeLoadDFMValues;\r\n WebPanel4.BeforeLoadDFMValues;\r\n lbWMessage.BeforeLoadDFMValues;\r\n lbWHeading.BeforeLoadDFMValues;\r\n pnLogo.BeforeLoadDFMValues;\r\n imgLogo.BeforeLoadDFMValues;\r\n pnInstructions.BeforeLoadDFMValues;\r\n lbInstruction3.BeforeLoadDFMValues;\r\n lbInstruction2.BeforeLoadDFMValues;\r\n lbInstruction1.BeforeLoadDFMValues;\r\n WebWaitMessage1.BeforeLoadDFMValues;\r\n Timer1.BeforeLoadDFMValues;\r\n Timer2.BeforeLoadDFMValues;\r\n try\r\n Name := 'wLogin';\r\n Width := 923;\r\n Height := 886;\r\n Caption := 'CityTax Online Filing';\r\n SetEvent(Self, 'OnCreate', 'WebFormCreate');\r\n SetEvent(Self, 'OnShow', 'WebFormShow');\r\n pnVerification.SetParentComponent(Self);\r\n pnVerification.Name := 'pnVerification';\r\n pnVerification.Left := 40;\r\n pnVerification.Top := 412;\r\n pnVerification.Width := 323;\r\n pnVerification.Height := 591;\r\n pnVerification.HeightPercent := 100.000000000000000000;\r\n pnVerification.WidthPercent := 100.000000000000000000;\r\n pnVerification.BorderColor := clSilver;\r\n pnVerification.BorderStyle := bsSingle;\r\n pnVerification.ChildOrder := 1;\r\n pnVerification.Color := 13232111;\r\n pnVerification.Visible := False;\r\n pnPassword.SetParentComponent(pnVerification);\r\n pnPassword.Name := 'pnPassword';\r\n pnPassword.Left := 0;\r\n pnPassword.Top := 0;\r\n pnPassword.Width := 323;\r\n pnPassword.Height := 71;\r\n pnPassword.HeightPercent := 100.000000000000000000;\r\n pnPassword.WidthPercent := 100.000000000000000000;\r\n pnPassword.Align := alTop;\r\n pnPassword.BorderColor := clSilver;\r\n pnPassword.BorderStyle := bsSingle;\r\n pnPassword.ChildOrder := 1;\r\n pnPassword.Color := 13232111;\r\n pnPassword.Visible := False;\r\n SetEvent(pnPassword, Self, 'OnKeyUp', 'pnPasswordKeyUp');\r\n WebLabel2.SetParentComponent(pnPassword);\r\n WebLabel2.Name := 'WebLabel2';\r\n WebLabel2.Left := 35;\r\n WebLabel2.Top := 22;\r\n WebLabel2.Width := 46;\r\n WebLabel2.Height := 13;\r\n WebLabel2.Alignment := taRightJustify;\r\n WebLabel2.Caption := 'Password';\r\n WebLabel2.HeightPercent := 100.000000000000000000;\r\n WebLabel2.WidthPercent := 100.000000000000000000;\r\n WebLabel12.SetParentComponent(pnPassword);\r\n WebLabel12.Name := 'WebLabel12';\r\n WebLabel12.Left := 53;\r\n WebLabel12.Top := 47;\r\n WebLabel12.Width := 111;\r\n WebLabel12.Height := 13;\r\n WebLabel12.Caption := 'Forgot your Password?';\r\n WebLabel12.Color := 13232111;\r\n WebLabel12.Font.Charset := DEFAULT_CHARSET;\r\n WebLabel12.Font.Color := clBlue;\r\n WebLabel12.Font.Height := -11;\r\n WebLabel12.Font.Name := 'Tahoma';\r\n WebLabel12.Font.Style := [fsItalic];\r\n WebLabel12.HeightPercent := 100.000000000000000000;\r\n WebLabel12.ParentFont := False;\r\n WebLabel12.Transparent := False;\r\n WebLabel12.WidthPercent := 100.000000000000000000;\r\n SetEvent(WebLabel12, Self, 'OnClick', 'WebLabel8Click');\r\n WebEdit2.SetParentComponent(pnPassword);\r\n WebEdit2.Name := 'WebEdit2';\r\n WebEdit2.Left := 90;\r\n WebEdit2.Top := 19;\r\n WebEdit2.Width := 121;\r\n WebEdit2.Height := 22;\r\n WebEdit2.AutoCompletion := acNone;\r\n WebEdit2.ChildOrder := 1;\r\n WebEdit2.HeightPercent := 100.000000000000000000;\r\n WebEdit2.WidthPercent := 100.000000000000000000;\r\n SetEvent(WebEdit2, Self, 'OnKeyUp', 'pnPasswordKeyUp');\r\n btPass.SetParentComponent(pnPassword);\r\n btPass.Name := 'btPass';\r\n btPass.Left := 235;\r\n btPass.Top := 17;\r\n btPass.Width := 55;\r\n btPass.Height := 25;\r\n btPass.Color := clFuchsia;\r\n btPass.Caption := 'Go';\r\n btPass.ChildOrder := 2;\r\n btPass.HeightPercent := 100.000000000000000000;\r\n btPass.WidthPercent := 100.000000000000000000;\r\n SetEvent(btPass, Self, 'OnClick', 'btPassClick');\r\n pnPhone.SetParentComponent(pnVerification);\r\n pnPhone.Name := 'pnPhone';\r\n pnPhone.Left := 0;\r\n pnPhone.Top := 403;\r\n pnPhone.Width := 323;\r\n pnPhone.Height := 59;\r\n pnPhone.HeightPercent := 100.000000000000000000;\r\n pnPhone.WidthPercent := 100.000000000000000000;\r\n pnPhone.Align := alTop;\r\n pnPhone.BorderColor := clSilver;\r\n pnPhone.BorderStyle := bsSingle;\r\n pnPhone.ChildOrder := 1;\r\n pnPhone.Color := 13232111;\r\n pnPhone.Visible := False;\r\n WebLabel3.SetParentComponent(pnPhone);\r\n WebLabel3.Name := 'WebLabel3';\r\n WebLabel3.Left := 51;\r\n WebLabel3.Top := 22;\r\n WebLabel3.Width := 30;\r\n WebLabel3.Height := 13;\r\n WebLabel3.Alignment := taRightJustify;\r\n WebLabel3.Caption := 'Phone';\r\n WebLabel3.HeightPercent := 100.000000000000000000;\r\n WebLabel3.WidthPercent := 100.000000000000000000;\r\n WebEdit3.SetParentComponent(pnPhone);\r\n WebEdit3.Name := 'WebEdit3';\r\n WebEdit3.Left := 90;\r\n WebEdit3.Top := 19;\r\n WebEdit3.Width := 121;\r\n WebEdit3.Height := 22;\r\n WebEdit3.AutoCompletion := acTelephone;\r\n WebEdit3.ChildOrder := 1;\r\n WebEdit3.HeightPercent := 100.000000000000000000;\r\n WebEdit3.WidthPercent := 100.000000000000000000;\r\n btPhone.SetParentComponent(pnPhone);\r\n btPhone.Name := 'btPhone';\r\n btPhone.Left := 235;\r\n btPhone.Top := 17;\r\n btPhone.Width := 55;\r\n btPhone.Height := 25;\r\n btPhone.Caption := 'Go';\r\n btPhone.ChildOrder := 2;\r\n btPhone.HeightPercent := 100.000000000000000000;\r\n btPhone.WidthPercent := 100.000000000000000000;\r\n SetEvent(btPhone, Self, 'OnClick', 'btPhoneClick');\r\n pnL4Name.SetParentComponent(pnVerification);\r\n pnL4Name.Name := 'pnL4Name';\r\n pnL4Name.Left := 0;\r\n pnL4Name.Top := 71;\r\n pnL4Name.Width := 323;\r\n pnL4Name.Height := 100;\r\n pnL4Name.HeightPercent := 100.000000000000000000;\r\n pnL4Name.WidthPercent := 100.000000000000000000;\r\n pnL4Name.Align := alTop;\r\n pnL4Name.BorderColor := clSilver;\r\n pnL4Name.BorderStyle := bsSingle;\r\n pnL4Name.ChildOrder := 1;\r\n pnL4Name.Color := 13232111;\r\n pnL4Name.Visible := False;\r\n WebLabel4.SetParentComponent(pnL4Name);\r\n WebLabel4.Name := 'WebLabel4';\r\n WebLabel4.Left := 36;\r\n WebLabel4.Top := 15;\r\n WebLabel4.Width := 45;\r\n WebLabel4.Height := 13;\r\n WebLabel4.Caption := 'Last Four';\r\n WebLabel4.HeightPercent := 100.000000000000000000;\r\n WebLabel4.WidthPercent := 100.000000000000000000;\r\n WebLabel5.SetParentComponent(pnL4Name);\r\n WebLabel5.Name := 'WebLabel5';\r\n WebLabel5.Left := 31;\r\n WebLabel5.Top := 43;\r\n WebLabel5.Width := 50;\r\n WebLabel5.Height := 13;\r\n WebLabel5.Caption := 'Last Name';\r\n WebLabel5.HeightPercent := 100.000000000000000000;\r\n WebLabel5.WidthPercent := 100.000000000000000000;\r\n WebLabel24.SetParentComponent(pnL4Name);\r\n WebLabel24.Name := 'WebLabel24';\r\n WebLabel24.Left := 51;\r\n WebLabel24.Top := 71;\r\n WebLabel24.Width := 30;\r\n WebLabel24.Height := 13;\r\n WebLabel24.Caption := 'Street';\r\n WebLabel24.HeightPercent := 100.000000000000000000;\r\n WebLabel24.WidthPercent := 100.000000000000000000;\r\n WebEdit4.SetParentComponent(pnL4Name);\r\n WebEdit4.Name := 'WebEdit4';\r\n WebEdit4.Left := 90;\r\n WebEdit4.Top := 12;\r\n WebEdit4.Width := 121;\r\n WebEdit4.Height := 22;\r\n WebEdit4.ChildOrder := 1;\r\n WebEdit4.HeightPercent := 100.000000000000000000;\r\n WebEdit4.WidthPercent := 100.000000000000000000;\r\n btL4Name.SetParentComponent(pnL4Name);\r\n btL4Name.Name := 'btL4Name';\r\n btL4Name.Left := 235;\r\n btL4Name.Top := 68;\r\n btL4Name.Width := 55;\r\n btL4Name.Height := 25;\r\n btL4Name.Caption := 'Go';\r\n btL4Name.ChildOrder := 2;\r\n btL4Name.HeightPercent := 100.000000000000000000;\r\n btL4Name.WidthPercent := 100.000000000000000000;\r\n SetEvent(btL4Name, Self, 'OnClick', 'btL4NameClick');\r\n WebEdit5.SetParentComponent(pnL4Name);\r\n WebEdit5.Name := 'WebEdit5';\r\n WebEdit5.Left := 90;\r\n WebEdit5.Top := 40;\r\n WebEdit5.Width := 121;\r\n WebEdit5.Height := 22;\r\n WebEdit5.CharCase := wecUpperCase;\r\n WebEdit5.ChildOrder := 1;\r\n WebEdit5.HeightPercent := 100.000000000000000000;\r\n WebEdit5.WidthPercent := 100.000000000000000000;\r\n WebEdit18.SetParentComponent(pnL4Name);\r\n WebEdit18.Name := 'WebEdit18';\r\n WebEdit18.Left := 90;\r\n WebEdit18.Top := 68;\r\n WebEdit18.Width := 121;\r\n WebEdit18.Height := 22;\r\n WebEdit18.CharCase := wecUpperCase;\r\n WebEdit18.ChildOrder := 1;\r\n WebEdit18.HeightPercent := 100.000000000000000000;\r\n WebEdit18.WidthPercent := 100.000000000000000000;\r\n pnQuestion.SetParentComponent(pnVerification);\r\n pnQuestion.Name := 'pnQuestion';\r\n pnQuestion.Left := 0;\r\n pnQuestion.Top := 462;\r\n pnQuestion.Width := 323;\r\n pnQuestion.Height := 77;\r\n pnQuestion.HeightPercent := 100.000000000000000000;\r\n pnQuestion.WidthPercent := 100.000000000000000000;\r\n pnQuestion.Align := alTop;\r\n pnQuestion.BorderColor := clSilver;\r\n pnQuestion.BorderStyle := bsSingle;\r\n pnQuestion.ChildOrder := 1;\r\n pnQuestion.Color := 13232111;\r\n pnQuestion.Visible := False;\r\n WebLabel6.SetParentComponent(pnQuestion);\r\n WebLabel6.Name := 'WebLabel6';\r\n WebLabel6.Left := 13;\r\n WebLabel6.Top := 6;\r\n WebLabel6.Width := 296;\r\n WebLabel6.Height := 27;\r\n WebLabel6.Alignment := taCenter;\r\n WebLabel6.AutoSize := False;\r\n WebLabel6.Caption := 'Security Question: What was your Mother'#39's Maiden Name?';\r\n WebLabel6.HeightPercent := 100.000000000000000000;\r\n WebLabel6.WordWrap := True;\r\n WebLabel6.WidthPercent := 100.000000000000000000;\r\n WebEdit6.SetParentComponent(pnQuestion);\r\n WebEdit6.Name := 'WebEdit6';\r\n WebEdit6.Left := 90;\r\n WebEdit6.Top := 39;\r\n WebEdit6.Width := 121;\r\n WebEdit6.Height := 22;\r\n WebEdit6.ChildOrder := 1;\r\n WebEdit6.HeightPercent := 100.000000000000000000;\r\n WebEdit6.WidthPercent := 100.000000000000000000;\r\n btQuestion.SetParentComponent(pnQuestion);\r\n btQuestion.Name := 'btQuestion';\r\n btQuestion.Left := 235;\r\n btQuestion.Top := 38;\r\n btQuestion.Width := 55;\r\n btQuestion.Height := 25;\r\n btQuestion.Caption := 'Go';\r\n btQuestion.ChildOrder := 2;\r\n btQuestion.HeightPercent := 100.000000000000000000;\r\n btQuestion.WidthPercent := 100.000000000000000000;\r\n SetEvent(btQuestion, Self, 'OnClick', 'btQuestionClick');\r\n pnEMail.SetParentComponent(pnVerification);\r\n pnEMail.Name := 'pnEMail';\r\n pnEMail.Left := 0;\r\n pnEMail.Top := 230;\r\n pnEMail.Width := 323;\r\n pnEMail.Height := 71;\r\n pnEMail.HeightPercent := 100.000000000000000000;\r\n pnEMail.WidthPercent := 100.000000000000000000;\r\n pnEMail.Align := alTop;\r\n pnEMail.BorderColor := clSilver;\r\n pnEMail.BorderStyle := bsSingle;\r\n pnEMail.ChildOrder := 1;\r\n pnEMail.Color := 13232111;\r\n WebLabel7.SetParentComponent(pnEMail);\r\n WebLabel7.Name := 'WebLabel7';\r\n WebLabel7.Left := 13;\r\n WebLabel7.Top := 6;\r\n WebLabel7.Width := 28;\r\n WebLabel7.Height := 13;\r\n WebLabel7.Alignment := taRightJustify;\r\n WebLabel7.Caption := 'E-Mail';\r\n WebLabel7.HeightPercent := 100.000000000000000000;\r\n WebLabel7.WidthPercent := 100.000000000000000000;\r\n WebEdit7.SetParentComponent(pnEMail);\r\n WebEdit7.Name := 'WebEdit7';\r\n WebEdit7.Left := 13;\r\n WebEdit7.Top := 19;\r\n WebEdit7.Width := 297;\r\n WebEdit7.Height := 22;\r\n WebEdit7.AutoCompletion := acEmail;\r\n WebEdit7.ChildOrder := 1;\r\n WebEdit7.HeightPercent := 100.000000000000000000;\r\n WebEdit7.WidthPercent := 100.000000000000000000;\r\n btEMail.SetParentComponent(pnEMail);\r\n btEMail.Name := 'btEMail';\r\n btEMail.Left := 235;\r\n btEMail.Top := 43;\r\n btEMail.Width := 55;\r\n btEMail.Height := 25;\r\n btEMail.Caption := 'Go';\r\n btEMail.ChildOrder := 2;\r\n btEMail.HeightPercent := 100.000000000000000000;\r\n btEMail.WidthPercent := 100.000000000000000000;\r\n SetEvent(btEMail, Self, 'OnClick', 'btEMailClick');\r\n pnL4NameNo.SetParentComponent(pnVerification);\r\n pnL4NameNo.Name := 'pnL4NameNo';\r\n pnL4NameNo.Left := 0;\r\n pnL4NameNo.Top := 301;\r\n pnL4NameNo.Width := 323;\r\n pnL4NameNo.Height := 102;\r\n pnL4NameNo.HeightPercent := 100.000000000000000000;\r\n pnL4NameNo.WidthPercent := 100.000000000000000000;\r\n pnL4NameNo.Align := alTop;\r\n pnL4NameNo.BorderColor := clSilver;\r\n pnL4NameNo.BorderStyle := bsSingle;\r\n pnL4NameNo.ChildOrder := 1;\r\n pnL4NameNo.Color := 13232111;\r\n pnL4NameNo.Visible := False;\r\n SetEvent(pnL4NameNo, Self, 'OnKeyUp', 'pnL4NameNoKeyUp');\r\n WebLabel9.SetParentComponent(pnL4NameNo);\r\n WebLabel9.Name := 'WebLabel9';\r\n WebLabel9.Left := 36;\r\n WebLabel9.Top := 15;\r\n WebLabel9.Width := 45;\r\n WebLabel9.Height := 13;\r\n WebLabel9.Caption := 'Last Four';\r\n WebLabel9.HeightPercent := 100.000000000000000000;\r\n WebLabel9.WidthPercent := 100.000000000000000000;\r\n WebLabel10.SetParentComponent(pnL4NameNo);\r\n WebLabel10.Name := 'WebLabel10';\r\n WebLabel10.Left := 31;\r\n WebLabel10.Top := 43;\r\n WebLabel10.Width := 50;\r\n WebLabel10.Height := 13;\r\n WebLabel10.Caption := 'Last Name';\r\n WebLabel10.HeightPercent := 100.000000000000000000;\r\n WebLabel10.WidthPercent := 100.000000000000000000;\r\n WebLabel11.SetParentComponent(pnL4NameNo);\r\n WebLabel11.Name := 'WebLabel11';\r\n WebLabel11.Left := 14;\r\n WebLabel11.Top := 71;\r\n WebLabel11.Width := 70;\r\n WebLabel11.Height := 13;\r\n WebLabel11.Caption := 'Street Number';\r\n WebLabel11.HeightPercent := 100.000000000000000000;\r\n WebLabel11.WidthPercent := 100.000000000000000000;\r\n WebEdit8.SetParentComponent(pnL4NameNo);\r\n WebEdit8.Name := 'WebEdit8';\r\n WebEdit8.Left := 90;\r\n WebEdit8.Top := 12;\r\n WebEdit8.Width := 121;\r\n WebEdit8.Height := 22;\r\n WebEdit8.ChildOrder := 1;\r\n WebEdit8.HeightPercent := 100.000000000000000000;\r\n WebEdit8.WidthPercent := 100.000000000000000000;\r\n SetEvent(WebEdit8, Self, 'OnKeyUp', 'pnL4NameNoKeyUp');\r\n btL4NameNo.SetParentComponent(pnL4NameNo);\r\n btL4NameNo.Name := 'btL4NameNo';\r\n btL4NameNo.Left := 234;\r\n btL4NameNo.Top := 68;\r\n btL4NameNo.Width := 55;\r\n btL4NameNo.Height := 25;\r\n btL4NameNo.Caption := 'Go';\r\n btL4NameNo.ChildOrder := 3;\r\n btL4NameNo.HeightPercent := 100.000000000000000000;\r\n btL4NameNo.WidthPercent := 100.000000000000000000;\r\n SetEvent(btL4NameNo, Self, 'OnClick', 'btL4NameNoClick');\r\n WebEdit9.SetParentComponent(pnL4NameNo);\r\n WebEdit9.Name := 'WebEdit9';\r\n WebEdit9.Left := 90;\r\n WebEdit9.Top := 40;\r\n WebEdit9.Width := 121;\r\n WebEdit9.Height := 22;\r\n WebEdit9.AutoCompletion := acCCFamilyName;\r\n WebEdit9.CharCase := wecUpperCase;\r\n WebEdit9.ChildOrder := 1;\r\n WebEdit9.HeightPercent := 100.000000000000000000;\r\n WebEdit9.WidthPercent := 100.000000000000000000;\r\n SetEvent(WebEdit9, Self, 'OnKeyUp', 'pnL4NameNoKeyUp');\r\n WebEdit10.SetParentComponent(pnL4NameNo);\r\n WebEdit10.Name := 'WebEdit10';\r\n WebEdit10.Left := 90;\r\n WebEdit10.Top := 68;\r\n WebEdit10.Width := 121;\r\n WebEdit10.Height := 22;\r\n WebEdit10.AutoCompletion := acNone;\r\n WebEdit10.ChildOrder := 1;\r\n WebEdit10.HeightPercent := 100.000000000000000000;\r\n WebEdit10.WidthPercent := 100.000000000000000000;\r\n SetEvent(WebEdit10, Self, 'OnKeyUp', 'pnL4NameNoKeyUp');\r\n pnVerify.SetParentComponent(pnVerification);\r\n pnVerify.Name := 'pnVerify';\r\n pnVerify.Left := 0;\r\n pnVerify.Top := 171;\r\n pnVerify.Width := 323;\r\n pnVerify.Height := 59;\r\n pnVerify.HeightPercent := 100.000000000000000000;\r\n pnVerify.WidthPercent := 100.000000000000000000;\r\n pnVerify.Align := alTop;\r\n pnVerify.BorderColor := clSilver;\r\n pnVerify.BorderStyle := bsSingle;\r\n pnVerify.ChildOrder := 1;\r\n pnVerify.Color := 13232111;\r\n lbVerify.SetParentComponent(pnVerify);\r\n lbVerify.Name := 'lbVerify';\r\n lbVerify.Left := 0;\r\n lbVerify.Top := 0;\r\n lbVerify.Width := 84;\r\n lbVerify.Height := 59;\r\n lbVerify.Align := alLeft;\r\n lbVerify.Alignment := taCenter;\r\n lbVerify.AutoSize := False;\r\n lbVerify.Caption := '2019 Tax Due';\r\n lbVerify.HeightPercent := 100.000000000000000000;\r\n lbVerify.Layout := tlCenter;\r\n lbVerify.WordWrap := True;\r\n lbVerify.WidthPercent := 100.000000000000000000;\r\n edVerify.SetParentComponent(pnVerify);\r\n edVerify.Name := 'edVerify';\r\n edVerify.Left := 90;\r\n edVerify.Top := 19;\r\n edVerify.Width := 121;\r\n edVerify.Height := 22;\r\n edVerify.AutoCompletion := acNone;\r\n edVerify.CharCase := wecUpperCase;\r\n edVerify.ChildOrder := 1;\r\n edVerify.HeightPercent := 100.000000000000000000;\r\n edVerify.WidthPercent := 100.000000000000000000;\r\n SetEvent(edVerify, Self, 'OnKeyUp', 'edVerifyKeyUp');\r\n btVerify.SetParentComponent(pnVerify);\r\n btVerify.Name := 'btVerify';\r\n btVerify.Left := 235;\r\n btVerify.Top := 16;\r\n btVerify.Width := 55;\r\n btVerify.Height := 25;\r\n btVerify.Caption := 'Go';\r\n btVerify.ChildOrder := 2;\r\n btVerify.HeightPercent := 100.000000000000000000;\r\n btVerify.WidthPercent := 100.000000000000000000;\r\n SetEvent(btVerify, Self, 'OnClick', 'btVerifyClick');\r\n WebPanel1.SetParentComponent(Self);\r\n WebPanel1.Name := 'WebPanel1';\r\n WebPanel1.Left := 40;\r\n WebPanel1.Top := 312;\r\n WebPanel1.Width := 323;\r\n WebPanel1.Height := 92;\r\n WebPanel1.HeightPercent := 100.000000000000000000;\r\n WebPanel1.WidthPercent := 100.000000000000000000;\r\n WebPanel1.BorderColor := clSilver;\r\n WebPanel1.BorderStyle := bsSingle;\r\n WebPanel1.ChildOrder := 1;\r\n WebPanel1.Color := 13232111;\r\n WebPanel1.Visible := False;\r\n WebLabel1.SetParentComponent(WebPanel1);\r\n WebLabel1.Name := 'WebLabel1';\r\n WebLabel1.Left := 45;\r\n WebLabel1.Top := 22;\r\n WebLabel1.Width := 39;\r\n WebLabel1.Height := 13;\r\n WebLabel1.Caption := 'Account';\r\n WebLabel1.HeightPercent := 100.000000000000000000;\r\n WebLabel1.WidthPercent := 100.000000000000000000;\r\n WebLabel8.SetParentComponent(WebPanel1);\r\n WebLabel8.Name := 'WebLabel8';\r\n WebLabel8.Left := 216;\r\n WebLabel8.Top := 22;\r\n WebLabel8.Width := 104;\r\n WebLabel8.Height := 13;\r\n WebLabel8.Caption := 'Forgot your Account?';\r\n WebLabel8.Color := 13232111;\r\n WebLabel8.Font.Charset := DEFAULT_CHARSET;\r\n WebLabel8.Font.Color := clBlue;\r\n WebLabel8.Font.Height := -11;\r\n WebLabel8.Font.Name := 'Tahoma';\r\n WebLabel8.Font.Style := [fsItalic];\r\n WebLabel8.HeightPercent := 100.000000000000000000;\r\n WebLabel8.ParentFont := False;\r\n WebLabel8.Transparent := False;\r\n WebLabel8.Visible := False;\r\n WebLabel8.WidthPercent := 100.000000000000000000;\r\n SetEvent(WebLabel8, Self, 'OnClick', 'WebLabel8Click');\r\n WebLabel27.SetParentComponent(WebPanel1);\r\n WebLabel27.Name := 'WebLabel27';\r\n WebLabel27.Left := 70;\r\n WebLabel27.Top := 40;\r\n WebLabel27.Width := 10;\r\n WebLabel27.Height := 13;\r\n WebLabel27.Caption := 'or';\r\n WebLabel27.HeightPercent := 100.000000000000000000;\r\n WebLabel27.WidthPercent := 100.000000000000000000;\r\n WebLabel28.SetParentComponent(WebPanel1);\r\n WebLabel28.Name := 'WebLabel28';\r\n WebLabel28.Left := 63;\r\n WebLabel28.Top := 60;\r\n WebLabel28.Width := 19;\r\n WebLabel28.Height := 13;\r\n WebLabel28.Caption := 'SSN';\r\n WebLabel28.HeightPercent := 100.000000000000000000;\r\n WebLabel28.WidthPercent := 100.000000000000000000;\r\n edAccount.SetParentComponent(WebPanel1);\r\n edAccount.Name := 'edAccount';\r\n edAccount.Left := 90;\r\n edAccount.Top := 18;\r\n edAccount.Width := 121;\r\n edAccount.Height := 22;\r\n edAccount.AutoCompletion := acNone;\r\n edAccount.ChildOrder := 1;\r\n edAccount.HeightPercent := 100.000000000000000000;\r\n edAccount.WidthPercent := 100.000000000000000000;\r\n SetEvent(edAccount, Self, 'OnKeyUp', 'edAccountKeyUp');\r\n btAccount.SetParentComponent(WebPanel1);\r\n btAccount.Name := 'btAccount';\r\n btAccount.Left := 235;\r\n btAccount.Top := 41;\r\n btAccount.Width := 55;\r\n btAccount.Height := 25;\r\n btAccount.Color := clBtnFace;\r\n btAccount.Caption := 'Go';\r\n btAccount.ChildOrder := 2;\r\n btAccount.HeightPercent := 100.000000000000000000;\r\n btAccount.TabOrder := 2;\r\n btAccount.WidthPercent := 100.000000000000000000;\r\n SetEvent(btAccount, Self, 'OnClick', 'btAccountClick');\r\n edSSN.SetParentComponent(WebPanel1);\r\n edSSN.Name := 'edSSN';\r\n edSSN.Left := 90;\r\n edSSN.Top := 57;\r\n edSSN.Width := 121;\r\n edSSN.Height := 22;\r\n edSSN.AutoCompletion := acNone;\r\n edSSN.ChildOrder := 1;\r\n edSSN.HeightPercent := 100.000000000000000000;\r\n edSSN.WidthPercent := 100.000000000000000000;\r\n SetEvent(edSSN, Self, 'OnKeyUp', 'edAccountKeyUp');\r\n pnNew.SetParentComponent(Self);\r\n pnNew.Name := 'pnNew';\r\n pnNew.Left := 388;\r\n pnNew.Top := 427;\r\n pnNew.Width := 323;\r\n pnNew.Height := 454;\r\n pnNew.HeightPercent := 100.000000000000000000;\r\n pnNew.WidthPercent := 100.000000000000000000;\r\n pnNew.BorderColor := clSilver;\r\n pnNew.BorderStyle := bsSingle;\r\n pnNew.ChildOrder := 2;\r\n pnNew.Color := 13232111;\r\n pnNew.Visible := False;\r\n pnNewPass.SetParentComponent(pnNew);\r\n pnNewPass.Name := 'pnNewPass';\r\n pnNewPass.Left := 0;\r\n pnNewPass.Top := 0;\r\n pnNewPass.Width := 323;\r\n pnNewPass.Height := 85;\r\n pnNewPass.HeightPercent := 100.000000000000000000;\r\n pnNewPass.WidthPercent := 100.000000000000000000;\r\n pnNewPass.Align := alTop;\r\n pnNewPass.BorderColor := clSilver;\r\n pnNewPass.BorderStyle := bsSingle;\r\n pnNewPass.ChildOrder := 1;\r\n pnNewPass.Color := 13232111;\r\n pnNewPass.Visible := False;\r\n WebLabel13.SetParentComponent(pnNewPass);\r\n WebLabel13.Name := 'WebLabel13';\r\n WebLabel13.Left := 42;\r\n WebLabel13.Top := 22;\r\n WebLabel13.Width := 70;\r\n WebLabel13.Height := 13;\r\n WebLabel13.Alignment := taRightJustify;\r\n WebLabel13.Caption := 'New Password';\r\n WebLabel13.HeightPercent := 100.000000000000000000;\r\n WebLabel13.WidthPercent := 100.000000000000000000;\r\n WebLabel14.SetParentComponent(pnNewPass);\r\n WebLabel14.Name := 'WebLabel14';\r\n WebLabel14.Left := 73;\r\n WebLabel14.Top := 50;\r\n WebLabel14.Width := 40;\r\n WebLabel14.Height := 13;\r\n WebLabel14.Alignment := taRightJustify;\r\n WebLabel14.Caption := 'ReType ';\r\n WebLabel14.HeightPercent := 100.000000000000000000;\r\n WebLabel14.WidthPercent := 100.000000000000000000;\r\n WebEdit11.SetParentComponent(pnNewPass);\r\n WebEdit11.Name := 'WebEdit11';\r\n WebEdit11.Left := 118;\r\n WebEdit11.Top := 19;\r\n WebEdit11.Width := 121;\r\n WebEdit11.Height := 22;\r\n WebEdit11.AutoCompletion := acNone;\r\n WebEdit11.ChildOrder := 1;\r\n WebEdit11.HeightPercent := 100.000000000000000000;\r\n WebEdit11.WidthPercent := 100.000000000000000000;\r\n SetEvent(WebEdit11, Self, 'OnKeyUp', 'WebEdit11KeyUp');\r\n WebEdit12.SetParentComponent(pnNewPass);\r\n WebEdit12.Name := 'WebEdit12';\r\n WebEdit12.Left := 118;\r\n WebEdit12.Top := 47;\r\n WebEdit12.Width := 121;\r\n WebEdit12.Height := 22;\r\n WebEdit12.AutoCompletion := acNone;\r\n WebEdit12.ChildOrder := 1;\r\n WebEdit12.HeightPercent := 100.000000000000000000;\r\n WebEdit12.WidthPercent := 100.000000000000000000;\r\n SetEvent(WebEdit12, Self, 'OnKeyUp', 'WebEdit11KeyUp');\r\n pnNewEMail.SetParentComponent(pnNew);\r\n pnNewEMail.Name := 'pnNewEMail';\r\n pnNewEMail.Left := 0;\r\n pnNewEMail.Top := 85;\r\n pnNewEMail.Width := 323;\r\n pnNewEMail.Height := 35;\r\n pnNewEMail.HeightPercent := 100.000000000000000000;\r\n pnNewEMail.WidthPercent := 100.000000000000000000;\r\n pnNewEMail.Align := alTop;\r\n pnNewEMail.BorderColor := clSilver;\r\n pnNewEMail.BorderStyle := bsSingle;\r\n pnNewEMail.ChildOrder := 1;\r\n pnNewEMail.Color := 13232111;\r\n WebLabel15.SetParentComponent(pnNewEMail);\r\n WebLabel15.Name := 'WebLabel15';\r\n WebLabel15.Left := 10;\r\n WebLabel15.Top := 11;\r\n WebLabel15.Width := 28;\r\n WebLabel15.Height := 13;\r\n WebLabel15.Alignment := taRightJustify;\r\n WebLabel15.Caption := 'E-Mail';\r\n WebLabel15.HeightPercent := 100.000000000000000000;\r\n WebLabel15.WidthPercent := 100.000000000000000000;\r\n WebEdit13.SetParentComponent(pnNewEMail);\r\n WebEdit13.Name := 'WebEdit13';\r\n WebEdit13.Left := 44;\r\n WebEdit13.Top := 7;\r\n WebEdit13.Width := 263;\r\n WebEdit13.Height := 22;\r\n WebEdit13.AutoCompletion := acEmail;\r\n WebEdit13.ChildOrder := 1;\r\n WebEdit13.HeightPercent := 100.000000000000000000;\r\n WebEdit13.WidthPercent := 100.000000000000000000;\r\n SetEvent(WebEdit13, Self, 'OnKeyUp', 'WebEdit11KeyUp');\r\n pnNewPhone.SetParentComponent(pnNew);\r\n pnNewPhone.Name := 'pnNewPhone';\r\n pnNewPhone.Left := 0;\r\n pnNewPhone.Top := 120;\r\n pnNewPhone.Width := 323;\r\n pnNewPhone.Height := 34;\r\n pnNewPhone.HeightPercent := 100.000000000000000000;\r\n pnNewPhone.WidthPercent := 100.000000000000000000;\r\n pnNewPhone.Align := alTop;\r\n pnNewPhone.BorderColor := clSilver;\r\n pnNewPhone.BorderStyle := bsSingle;\r\n pnNewPhone.ChildOrder := 1;\r\n pnNewPhone.Color := 13232111;\r\n pnNewPhone.Visible := False;\r\n WebLabel16.SetParentComponent(pnNewPhone);\r\n WebLabel16.Name := 'WebLabel16';\r\n WebLabel16.Left := 81;\r\n WebLabel16.Top := 9;\r\n WebLabel16.Width := 30;\r\n WebLabel16.Height := 13;\r\n WebLabel16.Alignment := taRightJustify;\r\n WebLabel16.Caption := 'Phone';\r\n WebLabel16.HeightPercent := 100.000000000000000000;\r\n WebLabel16.WidthPercent := 100.000000000000000000;\r\n WebEdit14.SetParentComponent(pnNewPhone);\r\n WebEdit14.Name := 'WebEdit14';\r\n WebEdit14.Left := 118;\r\n WebEdit14.Top := 6;\r\n WebEdit14.Width := 121;\r\n WebEdit14.Height := 22;\r\n WebEdit14.AutoCompletion := acTelephone;\r\n WebEdit14.ChildOrder := 1;\r\n WebEdit14.HeightPercent := 100.000000000000000000;\r\n WebEdit14.WidthPercent := 100.000000000000000000;\r\n SetEvent(WebEdit14, Self, 'OnKeyUp', 'WebEdit11KeyUp');\r\n pnNewQuestions.SetParentComponent(pnNew);\r\n pnNewQuestions.Name := 'pnNewQuestions';\r\n pnNewQuestions.Left := 0;\r\n pnNewQuestions.Top := 154;\r\n pnNewQuestions.Width := 323;\r\n pnNewQuestions.Height := 222;\r\n pnNewQuestions.HeightPercent := 100.000000000000000000;\r\n pnNewQuestions.WidthPercent := 100.000000000000000000;\r\n pnNewQuestions.Align := alTop;\r\n pnNewQuestions.BorderColor := clSilver;\r\n pnNewQuestions.BorderStyle := bsSingle;\r\n pnNewQuestions.ChildOrder := 1;\r\n pnNewQuestions.Color := 13232111;\r\n pnNewQuestions.Visible := False;\r\n WebLabel17.SetParentComponent(pnNewQuestions);\r\n WebLabel17.Name := 'WebLabel17';\r\n WebLabel17.Left := 13;\r\n WebLabel17.Top := 6;\r\n WebLabel17.Width := 296;\r\n WebLabel17.Height := 13;\r\n WebLabel17.Alignment := taCenter;\r\n WebLabel17.AutoSize := False;\r\n WebLabel17.Caption := 'Security Questions: Pick your security questions';\r\n WebLabel17.HeightPercent := 100.000000000000000000;\r\n WebLabel17.WordWrap := True;\r\n WebLabel17.WidthPercent := 100.000000000000000000;\r\n WebLabel18.SetParentComponent(pnNewQuestions);\r\n WebLabel18.Name := 'WebLabel18';\r\n WebLabel18.Left := 17;\r\n WebLabel18.Top := 35;\r\n WebLabel18.Width := 52;\r\n WebLabel18.Height := 13;\r\n WebLabel18.Alignment := taCenter;\r\n WebLabel18.Caption := 'Question 1';\r\n WebLabel18.HeightPercent := 100.000000000000000000;\r\n WebLabel18.WidthPercent := 100.000000000000000000;\r\n WebLabel19.SetParentComponent(pnNewQuestions);\r\n WebLabel19.Name := 'WebLabel19';\r\n WebLabel19.Left := 18;\r\n WebLabel19.Top := 100;\r\n WebLabel19.Width := 52;\r\n WebLabel19.Height := 13;\r\n WebLabel19.Alignment := taCenter;\r\n WebLabel19.Caption := 'Question 2';\r\n WebLabel19.HeightPercent := 100.000000000000000000;\r\n WebLabel19.WidthPercent := 100.000000000000000000;\r\n WebLabel20.SetParentComponent(pnNewQuestions);\r\n WebLabel20.Name := 'WebLabel20';\r\n WebLabel20.Left := 17;\r\n WebLabel20.Top := 164;\r\n WebLabel20.Width := 52;\r\n WebLabel20.Height := 13;\r\n WebLabel20.Alignment := taCenter;\r\n WebLabel20.Caption := 'Question 3';\r\n WebLabel20.HeightPercent := 100.000000000000000000;\r\n WebLabel20.WidthPercent := 100.000000000000000000;\r\n WebLabel21.SetParentComponent(pnNewQuestions);\r\n WebLabel21.Name := 'WebLabel21';\r\n WebLabel21.Left := 76;\r\n WebLabel21.Top := 60;\r\n WebLabel21.Width := 36;\r\n WebLabel21.Height := 13;\r\n WebLabel21.Alignment := taCenter;\r\n WebLabel21.Caption := 'Answer';\r\n WebLabel21.HeightPercent := 100.000000000000000000;\r\n WebLabel21.WordWrap := True;\r\n WebLabel21.WidthPercent := 100.000000000000000000;\r\n WebLabel22.SetParentComponent(pnNewQuestions);\r\n WebLabel22.Name := 'WebLabel22';\r\n WebLabel22.Left := 76;\r\n WebLabel22.Top := 121;\r\n WebLabel22.Width := 36;\r\n WebLabel22.Height := 13;\r\n WebLabel22.Alignment := taCenter;\r\n WebLabel22.Caption := 'Answer';\r\n WebLabel22.HeightPercent := 100.000000000000000000;\r\n WebLabel22.WordWrap := True;\r\n WebLabel22.WidthPercent := 100.000000000000000000;\r\n WebLabel23.SetParentComponent(pnNewQuestions);\r\n WebLabel23.Name := 'WebLabel23';\r\n WebLabel23.Left := 76;\r\n WebLabel23.Top := 189;\r\n WebLabel23.Width := 36;\r\n WebLabel23.Height := 13;\r\n WebLabel23.Alignment := taCenter;\r\n WebLabel23.Caption := 'Answer';\r\n WebLabel23.HeightPercent := 100.000000000000000000;\r\n WebLabel23.WordWrap := True;\r\n WebLabel23.WidthPercent := 100.000000000000000000;\r\n WebEdit15.SetParentComponent(pnNewQuestions);\r\n WebEdit15.Name := 'WebEdit15';\r\n WebEdit15.Left := 118;\r\n WebEdit15.Top := 57;\r\n WebEdit15.Width := 121;\r\n WebEdit15.Height := 22;\r\n WebEdit15.AutoCompletion := acNone;\r\n WebEdit15.ChildOrder := 1;\r\n WebEdit15.HeightPercent := 100.000000000000000000;\r\n WebEdit15.WidthPercent := 100.000000000000000000;\r\n SetEvent(WebEdit15, Self, 'OnKeyUp', 'WebEdit11KeyUp');\r\n WebEdit16.SetParentComponent(pnNewQuestions);\r\n WebEdit16.Name := 'WebEdit16';\r\n WebEdit16.Left := 118;\r\n WebEdit16.Top := 119;\r\n WebEdit16.Width := 121;\r\n WebEdit16.Height := 22;\r\n WebEdit16.AutoCompletion := acNone;\r\n WebEdit16.ChildOrder := 1;\r\n WebEdit16.HeightPercent := 100.000000000000000000;\r\n WebEdit16.WidthPercent := 100.000000000000000000;\r\n SetEvent(WebEdit16, Self, 'OnKeyUp', 'WebEdit11KeyUp');\r\n WebEdit17.SetParentComponent(pnNewQuestions);\r\n WebEdit17.Name := 'WebEdit17';\r\n WebEdit17.Left := 118;\r\n WebEdit17.Top := 185;\r\n WebEdit17.Width := 121;\r\n WebEdit17.Height := 22;\r\n WebEdit17.AutoCompletion := acNone;\r\n WebEdit17.ChildOrder := 1;\r\n WebEdit17.HeightPercent := 100.000000000000000000;\r\n WebEdit17.WidthPercent := 100.000000000000000000;\r\n SetEvent(WebEdit17, Self, 'OnKeyUp', 'WebEdit11KeyUp');\r\n WebComboBox1.SetParentComponent(pnNewQuestions);\r\n WebComboBox1.Name := 'WebComboBox1';\r\n WebComboBox1.Left := 80;\r\n WebComboBox1.Top := 32;\r\n WebComboBox1.Width := 209;\r\n WebComboBox1.Height := 21;\r\n WebComboBox1.HeightPercent := 100.000000000000000000;\r\n WebComboBox1.WidthPercent := 100.000000000000000000;\r\n WebComboBox1.ItemIndex := -1;\r\n WebComboBox1.Items.BeginUpdate;\r\n try\r\n WebComboBox1.Items.Clear;\r\n WebComboBox1.Items.Add('What Grade School did you attend?');\r\n WebComboBox1.Items.Add('What was your mother'#39's maiden last name?');\r\n WebComboBox1.Items.Add('Where did you meet your spouse?');\r\n WebComboBox1.Items.Add('What is your favorite Vacation spot?');\r\n WebComboBox1.Items.Add('What was the name of your first pet?');\r\n finally\r\n WebComboBox1.Items.EndUpdate;\r\n end;\r\n WebComboBox2.SetParentComponent(pnNewQuestions);\r\n WebComboBox2.Name := 'WebComboBox2';\r\n WebComboBox2.Left := 81;\r\n WebComboBox2.Top := 94;\r\n WebComboBox2.Width := 209;\r\n WebComboBox2.Height := 21;\r\n WebComboBox2.HeightPercent := 100.000000000000000000;\r\n WebComboBox2.WidthPercent := 100.000000000000000000;\r\n WebComboBox2.ItemIndex := -1;\r\n WebComboBox2.Items.BeginUpdate;\r\n try\r\n WebComboBox2.Items.Clear;\r\n WebComboBox2.Items.Add('What Grade School did you attend?');\r\n WebComboBox2.Items.Add('What was your mother'#39's maiden last name?');\r\n WebComboBox2.Items.Add('Where did you meet your spouse?');\r\n WebComboBox2.Items.Add('What is your favorite Vacation spot?');\r\n WebComboBox2.Items.Add('What was the name of your first pet?');\r\n finally\r\n WebComboBox2.Items.EndUpdate;\r\n end;\r\n WebComboBox3.SetParentComponent(pnNewQuestions);\r\n WebComboBox3.Name := 'WebComboBox3';\r\n WebComboBox3.Left := 81;\r\n WebComboBox3.Top := 160;\r\n WebComboBox3.Width := 209;\r\n WebComboBox3.Height := 21;\r\n WebComboBox3.HeightPercent := 100.000000000000000000;\r\n WebComboBox3.WidthPercent := 100.000000000000000000;\r\n WebComboBox3.ItemIndex := -1;\r\n WebComboBox3.Items.BeginUpdate;\r\n try\r\n WebComboBox3.Items.Clear;\r\n WebComboBox3.Items.Add('What Grade School did you attend?');\r\n WebComboBox3.Items.Add('What was your mother'#39's maiden last name?');\r\n WebComboBox3.Items.Add('Where did you meet your spouse?');\r\n WebComboBox3.Items.Add('What is your favorite Vacation spot?');\r\n WebComboBox3.Items.Add('What was the name of your first pet?');\r\n finally\r\n WebComboBox3.Items.EndUpdate;\r\n end;\r\n pnNewGo.SetParentComponent(pnNew);\r\n pnNewGo.Name := 'pnNewGo';\r\n pnNewGo.Left := 0;\r\n pnNewGo.Top := 376;\r\n pnNewGo.Width := 323;\r\n pnNewGo.Height := 44;\r\n pnNewGo.HeightPercent := 100.000000000000000000;\r\n pnNewGo.WidthPercent := 100.000000000000000000;\r\n pnNewGo.Align := alTop;\r\n pnNewGo.BorderColor := clSilver;\r\n pnNewGo.BorderStyle := bsSingle;\r\n pnNewGo.ChildOrder := 1;\r\n pnNewGo.Color := 13232111;\r\n pnNewGo.Visible := False;\r\n btNewGo.SetParentComponent(pnNewGo);\r\n btNewGo.Name := 'btNewGo';\r\n btNewGo.Left := 131;\r\n btNewGo.Top := 6;\r\n btNewGo.Width := 55;\r\n btNewGo.Height := 25;\r\n btNewGo.Caption := 'Go';\r\n btNewGo.ChildOrder := 2;\r\n btNewGo.HeightPercent := 100.000000000000000000;\r\n btNewGo.WidthPercent := 100.000000000000000000;\r\n SetEvent(btNewGo, Self, 'OnClick', 'btNewGoClick');\r\n pnHeading.SetParentComponent(Self);\r\n pnHeading.Name := 'pnHeading';\r\n pnHeading.Left := 40;\r\n pnHeading.Top := 82;\r\n pnHeading.Width := 323;\r\n pnHeading.Height := 90;\r\n pnHeading.HeightPercent := 100.000000000000000000;\r\n pnHeading.WidthPercent := 100.000000000000000000;\r\n pnHeading.BorderColor := clSilver;\r\n pnHeading.BorderStyle := bsSingle;\r\n pnHeading.ChildOrder := 1;\r\n pnHeading.Color := 13232111;\r\n pnHeading.Visible := False;\r\n lbHeading.SetParentComponent(pnHeading);\r\n lbHeading.Name := 'lbHeading';\r\n lbHeading.Left := 10;\r\n lbHeading.Top := 7;\r\n lbHeading.Width := 133;\r\n lbHeading.Height := 16;\r\n lbHeading.Caption := 'Individual Taxpayers';\r\n lbHeading.Font.Charset := DEFAULT_CHARSET;\r\n lbHeading.Font.Color := clWindowText;\r\n lbHeading.Font.Height := -13;\r\n lbHeading.Font.Name := 'Tahoma';\r\n lbHeading.Font.Style := [fsBold];\r\n lbHeading.HeightPercent := 100.000000000000000000;\r\n lbHeading.ParentFont := False;\r\n lbHeading.WidthPercent := 100.000000000000000000;\r\n lbMessage.SetParentComponent(pnHeading);\r\n lbMessage.Name := 'lbMessage';\r\n lbMessage.AlignWithMargins := True;\r\n lbMessage.Left := 20;\r\n lbMessage.Top := 26;\r\n lbMessage.Width := 291;\r\n lbMessage.Height := 40;\r\n lbMessage.Margins.Left := 16;\r\n lbMessage.Margins.Top := 4;\r\n lbMessage.Margins.Right := 16;\r\n lbMessage.Margins.Bottom := 4;\r\n lbMessage.Alignment := taCenter;\r\n lbMessage.AutoSize := False;\r\n lbMessage.Caption := 'To file your 2021 Tax Return enter your Account or Social Security Number, and you will then be asked for verification';\r\n lbMessage.Color := 13232111;\r\n lbMessage.Font.Charset := DEFAULT_CHARSET;\r\n lbMessage.Font.Color := 8660992;\r\n lbMessage.Font.Height := -11;\r\n lbMessage.Font.Name := 'Tahoma';\r\n lbMessage.Font.Style := [fsBold];\r\n lbMessage.HeightPercent := 100.000000000000000000;\r\n lbMessage.Layout := tlCenter;\r\n lbMessage.ParentFont := False;\r\n lbMessage.WordWrap := True;\r\n lbMessage.WidthPercent := 100.000000000000000000;\r\n WebPanel3.SetParentComponent(Self);\r\n WebPanel3.Name := 'WebPanel3';\r\n WebPanel3.Left := 391;\r\n WebPanel3.Top := 172;\r\n WebPanel3.Width := 323;\r\n WebPanel3.Height := 92;\r\n WebPanel3.HeightPercent := 100.000000000000000000;\r\n WebPanel3.WidthPercent := 100.000000000000000000;\r\n WebPanel3.BorderColor := clSilver;\r\n WebPanel3.BorderStyle := bsSingle;\r\n WebPanel3.ChildOrder := 1;\r\n WebPanel3.Color := 13232111;\r\n WebPanel3.Visible := False;\r\n WebLabel29.SetParentComponent(WebPanel3);\r\n WebLabel29.Name := 'WebLabel29';\r\n WebLabel29.Left := 45;\r\n WebLabel29.Top := 22;\r\n WebLabel29.Width := 39;\r\n WebLabel29.Height := 13;\r\n WebLabel29.Caption := 'Account';\r\n WebLabel29.HeightPercent := 100.000000000000000000;\r\n WebLabel29.WidthPercent := 100.000000000000000000;\r\n WebLabel30.SetParentComponent(WebPanel3);\r\n WebLabel30.Name := 'WebLabel30';\r\n WebLabel30.Left := 216;\r\n WebLabel30.Top := 22;\r\n WebLabel30.Width := 104;\r\n WebLabel30.Height := 13;\r\n WebLabel30.Caption := 'Forgot your Account?';\r\n WebLabel30.Color := 13232111;\r\n WebLabel30.Font.Charset := DEFAULT_CHARSET;\r\n WebLabel30.Font.Color := clBlue;\r\n WebLabel30.Font.Height := -11;\r\n WebLabel30.Font.Name := 'Tahoma';\r\n WebLabel30.Font.Style := [fsItalic];\r\n WebLabel30.HeightPercent := 100.000000000000000000;\r\n WebLabel30.ParentFont := False;\r\n WebLabel30.Transparent := False;\r\n WebLabel30.Visible := False;\r\n WebLabel30.WidthPercent := 100.000000000000000000;\r\n SetEvent(WebLabel30, Self, 'OnClick', 'WebLabel8Click');\r\n WebLabel31.SetParentComponent(WebPanel3);\r\n WebLabel31.Name := 'WebLabel31';\r\n WebLabel31.Left := 64;\r\n WebLabel31.Top := 40;\r\n WebLabel31.Width := 18;\r\n WebLabel31.Height := 13;\r\n WebLabel31.Caption := 'and';\r\n WebLabel31.HeightPercent := 100.000000000000000000;\r\n WebLabel31.WidthPercent := 100.000000000000000000;\r\n WebLabel32.SetParentComponent(WebPanel3);\r\n WebLabel32.Name := 'WebLabel32';\r\n WebLabel32.Left := 61;\r\n WebLabel32.Top := 60;\r\n WebLabel32.Width := 23;\r\n WebLabel32.Height := 13;\r\n WebLabel32.Caption := 'FEIN';\r\n WebLabel32.HeightPercent := 100.000000000000000000;\r\n WebLabel32.WidthPercent := 100.000000000000000000;\r\n edWHAccount.SetParentComponent(WebPanel3);\r\n edWHAccount.Name := 'edWHAccount';\r\n edWHAccount.Left := 90;\r\n edWHAccount.Top := 18;\r\n edWHAccount.Width := 121;\r\n edWHAccount.Height := 22;\r\n edWHAccount.AutoCompletion := acNone;\r\n edWHAccount.ChildOrder := 1;\r\n edWHAccount.HeightPercent := 100.000000000000000000;\r\n edWHAccount.WidthPercent := 100.000000000000000000;\r\n SetEvent(edWHAccount, Self, 'OnKeyUp', 'edWHAccountKeyUp');\r\n btWHAccount.SetParentComponent(WebPanel3);\r\n btWHAccount.Name := 'btWHAccount';\r\n btWHAccount.Left := 236;\r\n btWHAccount.Top := 56;\r\n btWHAccount.Width := 55;\r\n btWHAccount.Height := 25;\r\n btWHAccount.Color := clBtnFace;\r\n btWHAccount.Caption := 'Go';\r\n btWHAccount.ChildOrder := 2;\r\n btWHAccount.HeightPercent := 100.000000000000000000;\r\n btWHAccount.TabOrder := 2;\r\n btWHAccount.WidthPercent := 100.000000000000000000;\r\n SetEvent(btWHAccount, Self, 'OnClick', 'btWHAccountClick');\r\n edWHFEIN.SetParentComponent(WebPanel3);\r\n edWHFEIN.Name := 'edWHFEIN';\r\n edWHFEIN.Left := 90;\r\n edWHFEIN.Top := 57;\r\n edWHFEIN.Width := 121;\r\n edWHFEIN.Height := 22;\r\n edWHFEIN.AutoCompletion := acNone;\r\n edWHFEIN.ChildOrder := 1;\r\n edWHFEIN.HeightPercent := 100.000000000000000000;\r\n edWHFEIN.WidthPercent := 100.000000000000000000;\r\n SetEvent(edWHFEIN, Self, 'OnKeyUp', 'edWHFEINKeyUp');\r\n WebPanel4.SetParentComponent(Self);\r\n WebPanel4.Name := 'WebPanel4';\r\n WebPanel4.Left := 391;\r\n WebPanel4.Top := 82;\r\n WebPanel4.Width := 323;\r\n WebPanel4.Height := 90;\r\n WebPanel4.HeightPercent := 100.000000000000000000;\r\n WebPanel4.WidthPercent := 100.000000000000000000;\r\n WebPanel4.BorderColor := clSilver;\r\n WebPanel4.BorderStyle := bsSingle;\r\n WebPanel4.ChildOrder := 1;\r\n WebPanel4.Color := 13232111;\r\n WebPanel4.Visible := False;\r\n lbWMessage.SetParentComponent(WebPanel4);\r\n lbWMessage.Name := 'lbWMessage';\r\n lbWMessage.Left := 36;\r\n lbWMessage.Top := 24;\r\n lbWMessage.Width := 265;\r\n lbWMessage.Height := 62;\r\n lbWMessage.Alignment := taCenter;\r\n lbWMessage.AutoSize := False;\r\n lbWMessage.Caption := 'Enter your Account and Federal EIN';\r\n lbWMessage.Color := 13232111;\r\n lbWMessage.Font.Charset := DEFAULT_CHARSET;\r\n lbWMessage.Font.Color := 8660992;\r\n lbWMessage.Font.Height := -11;\r\n lbWMessage.Font.Name := 'Tahoma';\r\n lbWMessage.Font.Style := [fsBold];\r\n lbWMessage.HeightPercent := 100.000000000000000000;\r\n lbWMessage.Layout := tlCenter;\r\n lbWMessage.ParentFont := False;\r\n lbWMessage.Transparent := False;\r\n lbWMessage.WordWrap := True;\r\n lbWMessage.WidthPercent := 100.000000000000000000;\r\n lbWHeading.SetParentComponent(WebPanel4);\r\n lbWHeading.Name := 'lbWHeading';\r\n lbWHeading.Left := 10;\r\n lbWHeading.Top := 7;\r\n lbWHeading.Width := 78;\r\n lbWHeading.Height := 16;\r\n lbWHeading.Caption := 'Withholders';\r\n lbWHeading.Font.Charset := DEFAULT_CHARSET;\r\n lbWHeading.Font.Color := clWindowText;\r\n lbWHeading.Font.Height := -13;\r\n lbWHeading.Font.Name := 'Tahoma';\r\n lbWHeading.Font.Style := [fsBold];\r\n lbWHeading.HeightPercent := 100.000000000000000000;\r\n lbWHeading.ParentFont := False;\r\n lbWHeading.WidthPercent := 100.000000000000000000;\r\n pnLogo.SetParentComponent(Self);\r\n pnLogo.Name := 'pnLogo';\r\n pnLogo.Left := 0;\r\n pnLogo.Top := 0;\r\n pnLogo.Width := 923;\r\n pnLogo.Height := 78;\r\n pnLogo.HeightPercent := 100.000000000000000000;\r\n pnLogo.WidthPercent := 100.000000000000000000;\r\n pnLogo.Align := alTop;\r\n pnLogo.BorderColor := clSilver;\r\n pnLogo.BorderStyle := bsSingle;\r\n pnLogo.ChildOrder := 2;\r\n imgLogo.SetParentComponent(pnLogo);\r\n imgLogo.Name := 'imgLogo';\r\n imgLogo.Left := 0;\r\n imgLogo.Top := 0;\r\n imgLogo.Width := 923;\r\n imgLogo.Height := 78;\r\n imgLogo.WidthStyle := ssAuto;\r\n imgLogo.HeightPercent := 100.000000000000000000;\r\n imgLogo.WidthPercent := 100.000000000000000000;\r\n imgLogo.Align := alClient;\r\n pnInstructions.SetParentComponent(Self);\r\n pnInstructions.Name := 'pnInstructions';\r\n pnInstructions.Left := 40;\r\n pnInstructions.Top := 172;\r\n pnInstructions.Width := 323;\r\n pnInstructions.Height := 140;\r\n pnInstructions.HeightPercent := 100.000000000000000000;\r\n pnInstructions.WidthPercent := 100.000000000000000000;\r\n pnInstructions.BorderColor := clSilver;\r\n pnInstructions.BorderStyle := bsNone;\r\n pnInstructions.ChildOrder := 1;\r\n pnInstructions.Color := 13232111;\r\n pnInstructions.Visible := False;\r\n lbInstruction3.SetParentComponent(pnInstructions);\r\n lbInstruction3.Name := 'lbInstruction3';\r\n lbInstruction3.AlignWithMargins := True;\r\n lbInstruction3.Left := 16;\r\n lbInstruction3.Top := 104;\r\n lbInstruction3.Width := 291;\r\n lbInstruction3.Height := 40;\r\n lbInstruction3.Margins.Left := 16;\r\n lbInstruction3.Margins.Top := 8;\r\n lbInstruction3.Margins.Right := 16;\r\n lbInstruction3.Margins.Bottom := 0;\r\n lbInstruction3.Align := alTop;\r\n lbInstruction3.Alignment := taCenter;\r\n lbInstruction3.AutoSize := False;\r\n lbInstruction3.Caption := 'To file your 2021 Tax Return enter your Account or Social Security Number, and you will then be asked for verification';\r\n lbInstruction3.Color := 13232111;\r\n lbInstruction3.Font.Charset := DEFAULT_CHARSET;\r\n lbInstruction3.Font.Color := 8660992;\r\n lbInstruction3.Font.Height := -11;\r\n lbInstruction3.Font.Name := 'Tahoma';\r\n lbInstruction3.Font.Style := [fsBold];\r\n lbInstruction3.HeightPercent := 100.000000000000000000;\r\n lbInstruction3.Layout := tlCenter;\r\n lbInstruction3.ParentFont := False;\r\n lbInstruction3.WordWrap := True;\r\n lbInstruction3.WidthPercent := 100.000000000000000000;\r\n lbInstruction2.SetParentComponent(pnInstructions);\r\n lbInstruction2.Name := 'lbInstruction2';\r\n lbInstruction2.AlignWithMargins := True;\r\n lbInstruction2.Left := 16;\r\n lbInstruction2.Top := 56;\r\n lbInstruction2.Width := 291;\r\n lbInstruction2.Height := 40;\r\n lbInstruction2.Margins.Left := 16;\r\n lbInstruction2.Margins.Top := 8;\r\n lbInstruction2.Margins.Right := 16;\r\n lbInstruction2.Margins.Bottom := 0;\r\n lbInstruction2.Align := alTop;\r\n lbInstruction2.Alignment := taCenter;\r\n lbInstruction2.AutoSize := False;\r\n lbInstruction2.Caption := 'To file your 2021 Tax Return enter your Account or Social Security Number, and you will then be asked for verification';\r\n lbInstruction2.Color := 13232111;\r\n lbInstruction2.Font.Charset := DEFAULT_CHARSET;\r\n lbInstruction2.Font.Color := 8660992;\r\n lbInstruction2.Font.Height := -11;\r\n lbInstruction2.Font.Name := 'Tahoma';\r\n lbInstruction2.Font.Style := [fsBold];\r\n lbInstruction2.HeightPercent := 100.000000000000000000;\r\n lbInstruction2.Layout := tlCenter;\r\n lbInstruction2.ParentFont := False;\r\n lbInstruction2.WordWrap := True;\r\n lbInstruction2.WidthPercent := 100.000000000000000000;\r\n lbInstruction1.SetParentComponent(pnInstructions);\r\n lbInstruction1.Name := 'lbInstruction1';\r\n lbInstruction1.AlignWithMargins := True;\r\n lbInstruction1.Left := 16;\r\n lbInstruction1.Top := 8;\r\n lbInstruction1.Width := 291;\r\n lbInstruction1.Height := 40;\r\n lbInstruction1.Margins.Left := 16;\r\n lbInstruction1.Margins.Top := 8;\r\n lbInstruction1.Margins.Right := 16;\r\n lbInstruction1.Margins.Bottom := 0;\r\n lbInstruction1.Align := alTop;\r\n lbInstruction1.Alignment := taCenter;\r\n lbInstruction1.AutoSize := False;\r\n lbInstruction1.Caption := 'To file your 2021 Tax Return enter your Account or Social Security Number, and you will then be asked for verification';\r\n lbInstruction1.Color := 13232111;\r\n lbInstruction1.Font.Charset := DEFAULT_CHARSET;\r\n lbInstruction1.Font.Color := 8660992;\r\n lbInstruction1.Font.Height := -11;\r\n lbInstruction1.Font.Name := 'Tahoma';\r\n lbInstruction1.Font.Style := [fsBold];\r\n lbInstruction1.HeightPercent := 100.000000000000000000;\r\n lbInstruction1.Layout := tlCenter;\r\n lbInstruction1.ParentFont := False;\r\n lbInstruction1.WordWrap := True;\r\n lbInstruction1.WidthPercent := 100.000000000000000000;\r\n WebWaitMessage1.SetParentComponent(Self);\r\n WebWaitMessage1.Name := 'WebWaitMessage1';\r\n WebWaitMessage1.Left := 421;\r\n WebWaitMessage1.Top := 356;\r\n WebWaitMessage1.Width := 24;\r\n WebWaitMessage1.Height := 24;\r\n WebWaitMessage1.HeightPercent := 100.000000000000000000;\r\n WebWaitMessage1.WidthPercent := 100.000000000000000000;\r\n WebWaitMessage1.Opacity := 0.200000000000000000;\r\n WebWaitMessage1.Picture.LoadFromFile('Login.WebWaitMessage1.Picture.gif');\r\n Timer1.SetParentComponent(Self);\r\n Timer1.Name := 'Timer1';\r\n Timer1.Enabled := False;\r\n Timer1.Interval := 250;\r\n SetEvent(Timer1, Self, 'OnTimer', 'Timer1Timer');\r\n Timer1.Left := 413;\r\n Timer1.Top := 5;\r\n Timer2.SetParentComponent(Self);\r\n Timer2.Name := 'Timer2';\r\n Timer2.Enabled := False;\r\n Timer2.Interval := 250;\r\n Timer2.Left := 404;\r\n Timer2.Top := 159;\r\n finally\r\n pnVerification.AfterLoadDFMValues;\r\n pnPassword.AfterLoadDFMValues;\r\n WebLabel2.AfterLoadDFMValues;\r\n WebLabel12.AfterLoadDFMValues;\r\n WebEdit2.AfterLoadDFMValues;\r\n btPass.AfterLoadDFMValues;\r\n pnPhone.AfterLoadDFMValues;\r\n WebLabel3.AfterLoadDFMValues;\r\n WebEdit3.AfterLoadDFMValues;\r\n btPhone.AfterLoadDFMValues;\r\n pnL4Name.AfterLoadDFMValues;\r\n WebLabel4.AfterLoadDFMValues;\r\n WebLabel5.AfterLoadDFMValues;\r\n WebLabel24.AfterLoadDFMValues;\r\n WebEdit4.AfterLoadDFMValues;\r\n btL4Name.AfterLoadDFMValues;\r\n WebEdit5.AfterLoadDFMValues;\r\n WebEdit18.AfterLoadDFMValues;\r\n pnQuestion.AfterLoadDFMValues;\r\n WebLabel6.AfterLoadDFMValues;\r\n WebEdit6.AfterLoadDFMValues;\r\n btQuestion.AfterLoadDFMValues;\r\n pnEMail.AfterLoadDFMValues;\r\n WebLabel7.AfterLoadDFMValues;\r\n WebEdit7.AfterLoadDFMValues;\r\n btEMail.AfterLoadDFMValues;\r\n pnL4NameNo.AfterLoadDFMValues;\r\n WebLabel9.AfterLoadDFMValues;\r\n WebLabel10.AfterLoadDFMValues;\r\n WebLabel11.AfterLoadDFMValues;\r\n WebEdit8.AfterLoadDFMValues;\r\n btL4NameNo.AfterLoadDFMValues;\r\n WebEdit9.AfterLoadDFMValues;\r\n WebEdit10.AfterLoadDFMValues;\r\n pnVerify.AfterLoadDFMValues;\r\n lbVerify.AfterLoadDFMValues;\r\n edVerify.AfterLoadDFMValues;\r\n btVerify.AfterLoadDFMValues;\r\n WebPanel1.AfterLoadDFMValues;\r\n WebLabel1.AfterLoadDFMValues;\r\n WebLabel8.AfterLoadDFMValues;\r\n WebLabel27.AfterLoadDFMValues;\r\n WebLabel28.AfterLoadDFMValues;\r\n edAccount.AfterLoadDFMValues;\r\n btAccount.AfterLoadDFMValues;\r\n edSSN.AfterLoadDFMValues;\r\n pnNew.AfterLoadDFMValues;\r\n pnNewPass.AfterLoadDFMValues;\r\n WebLabel13.AfterLoadDFMValues;\r\n WebLabel14.AfterLoadDFMValues;\r\n WebEdit11.AfterLoadDFMValues;\r\n WebEdit12.AfterLoadDFMValues;\r\n pnNewEMail.AfterLoadDFMValues;\r\n WebLabel15.AfterLoadDFMValues;\r\n WebEdit13.AfterLoadDFMValues;\r\n pnNewPhone.AfterLoadDFMValues;\r\n WebLabel16.AfterLoadDFMValues;\r\n WebEdit14.AfterLoadDFMValues;\r\n pnNewQuestions.AfterLoadDFMValues;\r\n WebLabel17.AfterLoadDFMValues;\r\n WebLabel18.AfterLoadDFMValues;\r\n WebLabel19.AfterLoadDFMValues;\r\n WebLabel20.AfterLoadDFMValues;\r\n WebLabel21.AfterLoadDFMValues;\r\n WebLabel22.AfterLoadDFMValues;\r\n WebLabel23.AfterLoadDFMValues;\r\n WebEdit15.AfterLoadDFMValues;\r\n WebEdit16.AfterLoadDFMValues;\r\n WebEdit17.AfterLoadDFMValues;\r\n WebComboBox1.AfterLoadDFMValues;\r\n WebComboBox2.AfterLoadDFMValues;\r\n WebComboBox3.AfterLoadDFMValues;\r\n pnNewGo.AfterLoadDFMValues;\r\n btNewGo.AfterLoadDFMValues;\r\n pnHeading.AfterLoadDFMValues;\r\n lbHeading.AfterLoadDFMValues;\r\n lbMessage.AfterLoadDFMValues;\r\n WebPanel3.AfterLoadDFMValues;\r\n WebLabel29.AfterLoadDFMValues;\r\n WebLabel30.AfterLoadDFMValues;\r\n WebLabel31.AfterLoadDFMValues;\r\n WebLabel32.AfterLoadDFMValues;\r\n edWHAccount.AfterLoadDFMValues;\r\n btWHAccount.AfterLoadDFMValues;\r\n edWHFEIN.AfterLoadDFMValues;\r\n WebPanel4.AfterLoadDFMValues;\r\n lbWMessage.AfterLoadDFMValues;\r\n lbWHeading.AfterLoadDFMValues;\r\n pnLogo.AfterLoadDFMValues;\r\n imgLogo.AfterLoadDFMValues;\r\n pnInstructions.AfterLoadDFMValues;\r\n lbInstruction3.AfterLoadDFMValues;\r\n lbInstruction2.AfterLoadDFMValues;\r\n lbInstruction1.AfterLoadDFMValues;\r\n WebWaitMessage1.AfterLoadDFMValues;\r\n Timer1.AfterLoadDFMValues;\r\n Timer2.AfterLoadDFMValues;\r\n end;\r\nend;\r\n\r\nend.\r\n","program WebClient;\r\n\r\nuses\r\n WEBLib.Forms,\r\n \r\nLogin in 'Login.pas',\r\n OptionsDM in 'OptionsDM.pas',\r\n Parameters in 'Parameters.pas',\r\n Main in 'Main.pas'{*.html},\r\n ClientConnectionsDM in 'ClientConnectionsDM.pas',\r\n Utilities in 'Utilities.pas',\r\n Return in 'Return.pas'{*.html},\r\n entForms in 'entForms.pas',\r\n FieldPanelFactory in 'FieldPanelFactory.pas',\r\n Formulas in 'Formulas.pas',\r\n SectionPanels in 'SectionPanels.pas',\r\n entFieldValues in 'entFieldValues.pas',\r\n TransferWeb in 'TransferWeb.pas',\r\n ClientCurrent in 'ClientCurrent.pas',\r\n TaxpayerDM in 'TaxpayerDM.pas',\r\n Verification in 'Verification.pas',\r\n entReturns in 'entReturns.pas',\r\n UploadFiles in 'UploadFiles.pas',\r\n OCCForm in 'OCCForm.pas'{*.html},\r\n entData in 'entData.pas',\r\n PayServiceClient in 'PayServiceClient.pas';\r\n\r\n{$R *.res}\r\n\r\nbegin\r\n Application.Initialize;\r\n Application.MainFormOnTaskbar := True;\r\n Application.CreateForm(TdmClientConnections, dmClientConnections);\r\n Application.CreateForm(TdmOptions, dmOptions);\r\n Application.CreateForm(TdmTaxpayer, dmTaxpayer);\r\n Application.CreateForm(TwLogin, wLogin);\r\n Application.Run;\r\nend.\r\n"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACv8CA;;;;AAaE,oBAAqB;AACrB,oBAAqB;AAIrB,mBAAmB;AACW;AAA9B,kCAAyC,cAAC,EAAD;AACf;AAA1B,8BAAqC,cAAC,EAAD;AACrC,4BAA4B;AAGjB,qBAAG;AACH,qBAAG,CAAC;AACJ,qBAAG;AACH,qBAAG,CAAC;AACR,iBAAG;AACH,iBAAG;AACA,oBAAI;AACH,qBAAY;AAEjB,gBAAG;AACI,uBAAG;AAyBZ;AACI;AAEC;AACJ,gCADI,wBACJ;AACA,gCAFI,wBAEJ;AAIC;AACD;AAED;AAKM;AAKS;;AAEL;;AAGC,qCAHD,sCAGC;AAQV;AACH;AACA;AACA;AAHG;;aAIH;AAJG;;;aACH,kBACA,IAAA,kBACA,IAAA,kBACA,6BAFA;AAFG;;AACH;AACA;AACA;AACA;AAJG;;;AACH;AACA;AACA;AACS,iDAAE,CAAF;AAAT,qBAAS,wBAAT;AAJG;AAMM;AAEJ,mCACA,+BADA;AACA;AACL;AACA;AAFK;aACL,sBACA;AAFK;;AACL;AACA;AAFK;;;AACL;AACA;AAFK;AAWA;AAND,iCAMC,mCAND;AAMC;;;;;AAsvBiB;AAAC;AAAD;AAKA;;AAKJ;AAEpB;AAFoB;AAKU;AAEhC;AAFgC;AAKE;AAAX;AAErB,eAAQ,cAAQ,CAAC,KAAK,eAAN;AAFK;AAAW;AAKC;AAEnC;AAFmC;AAMF;AAAV;AAGrB,eAAQ;AACR,UAAG,KAAK,KAAC,IAAT,EACE,aADF;AAGF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAzBuB;AAAU;AA6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9EtC,2BA8EsC,CAA/B;AACA,8EAA+B,UA9X3C,sBA8X2C,CAA/B;AACF,4EAAgC,UA8mFlC,8BA9mFkC,CAAhC;AACC,6EAAgC,UAnFvC,0BAmFuC,CAAhC;AACG,gFAA+B,UA47EtC,6BA57EsC,CAA/B;AACL,2EAA+B,UA62EtC,wBA72EsC,CAA/B;AACM,iFAA+B,UAzDtC,8BAyDsC,CAA/B;AACD,gFAA+B,UAnDtC,6BAmDsC,CAA/B;AACC,iFAAgC,UAnCvC,8BAmCuC,CAAhC;AACH,8EAA+B,UAy7EtC,2BAz7EsC,CAA/B;AAET,sCA7uBJ,iCA6uBI;AA+LD,qCJz8BD,qCIy8BC;AAqRE;AAkBG;AA5PN;AACP;AADO;aACP;AADO;;AACP;AADO;;;AACP;AADO;AAQG;AACV;AADU;aACV;AADU;;AACV;AADU;;;AACV,qBJlmBa,+BIkmBb;AADU;AAQA;AACV;AADU;aACV,4BACA;AAFU;;AACV;AACA;AAFU;;;AACV,0BJ1mBa,+BI0mBb;AACA;AAFU;AASA;AACV;AACA;AACA;AAHU;aACV,kBACA,IAAA,0CACA,oCADA;AAFU;;AACV;AACA;AACA;AAHU;;;AACV,qBJnnBa,+BImnBb;AACA,iCJpnBa,+BIonBb;AACA;AAHU;AAUI;AACd;AADc;aACd;AADc;;AACd;AADc;;;AACd;AADc;AAQJ;AACV;AACA;AACA;AAHU;aACV,sBACA,IAAA,kCACA,0BADA;AAFU;;AACV;AACA;AACA;AAHU;;;AACV,uBJroBa,+BIqoBb;AACA;AACA;AAHU;AAUS;AACnB;AADmB;aACnB;AADmB;;AACnB;AADmB;;;AACnB;AADmB;AAQN;;aACb;AADa;;AACb;AADa;;;AACb;AADa;AAQC;AACd;AADc;aACd,sBACA;AAFc;;AACd;AACA;AAFc;;;AACd;AACA;AAFc;AASK;AACnB;AACA;AACA;AAHmB;aACnB,wCACA,IAAA,0CACA,0BADA;AAFmB;;AACnB;AACA;AACA;AAHmB;;;AACnB;AACA,iCJxjBW,6BIwjBX;AACA;AAHmB;AAUR;;aACX;AADW;;AACX;AADW;;;AACX,wBJlrBa,+BIkrBb;AADW;AAQD;AACV;AADU;aACV;AADU;;AACV;AADU;;;AACV;AADU;AAQE;AACZ;AACA;AAFY;aACZ,wBACA;AAFY;;AACZ;AACA;AAFY;;;AACZ,wBJjlBW,6BIilBX;AACA,4BJllBW,6BIklBX;AAFY;AASA;;aACZ;AADY;;AACZ;AADY;;;AACZ;AADY;AAQK;;aACjB;AADiB;;AACjB;AADiB;;;AACjB;AADiB;AAQC;;aAClB;AADkB;;AAClB;AADkB;;;AAClB;AADkB;AAQD;;aACjB;AADiB;;AACjB;AADiB;;;AACjB,yBAgGU,0BAhGV;AADiB;AAQF;;aACf;AADe;;AACf;AADe;;;AACf,yBAwFU,0BAxFV;AADe;AAQA;AACf;AACA;AAFe;aACf,wBACA;AAFe;;AACf;AACA;AAFe;;;AACf,wBJloBW,6BIkoBX;AACA,4BJnoBW,6BImoBX;AAFe;AASN;AACT;AADS;aACT;AADS;;AACT;AADS;;;AACT;AADS;AAQM;;aACf;AADe;;AACf;AADe;;;AACf;AADe;AAQP;AACR;AACA;AACA;AAHQ;aACR,sBACA,IAAA,sBACA,0BADA;AAFQ;;AACR;AACA;AACA;AAHQ;;;AACR;AACA,uBJ7wBa,+BI6wBb;AACA,uBJ9wBa,+BI8wBb;AAHQ;AAUQ;AAChB;AACA;AACA;AAHgB;aAChB,gBACA,IAAA,gBACA,oBADA;AAFgB;;AAChB;AACA;AACA;AAHgB;;;AAChB;AACA;AACA;AAHgB;AAUS,sDAVT,wCAUS;AACjB;AACR;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAlBQ;;kBAGR;AAHQ,cAiBR;AAjBQ;;;aACR,oBACA,IAAA,oBACA,IAAA,4BACA,IAAA,oBACA,IAAA,oBACA,IAAA,oBACA,IAAA,gBACA,IAAA,gBACA,IAAA,gBACA,IAAA,gBACA,IAAA,gBACA,IAAA,gBACA,IAAA,gBACA,IAAA,kBACA,IAAA,kBACA,IAAA,kBACA,IAAA,oBACA,oBAhBA;AAFQ;;AACR;AACA;AACA;AACA;AACA;AACA;AACA;A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AAd,CAAsB,GAA2B,gCAAR,CAAV,qCAAP;;;;eAAkB,MAAX,GAAU;;;;YAAQ,CAA3B;;AAIxC,YAAU,mCAAP;;;;YAAO,CAAQ,KAAE,CAApB,EACE,UAAW,OAAgB,GAAN,KAAF,GAAiB,gCAAP;;;;YAAO,CADtC;;AAKJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;OAGO,UAAc,CAAV,cAAU,KAAE,8BAAF,CAAa,IAAsB,CAAjB,iBAAW,WAAC,EAAK,KAAG,EAAH,CAAjD;AAEH,iBAAU,iBAAW,WAAC;AACtB;AACE,mBAAmB,cAAC,IAAO,MAAM,CAAC,MAAD,CAAd;AAEzB;AAHI;;;AAYJ;;AApMwC;AAhCO;AAE7C,UAAG,qBAAiB,KAAG,KAAvB;AAEE,gCAAoB;AACpB,mBAAM;AACN,mBAAM,MAAM,CAAC,sBAAiB,sBAAlB;OAJd;AAF6C;AAUC;AAE9C,UAAG,sBAAkB,KAAG,KAAxB;AAEE,iCAAqB;AACrB,mBAAM;AACN,mBAAM,MAAM,CAAC,sBAAiB,sBAAlB;OAJd;AAF8C;AAUA;AAE9C,UAAsB,CAAlB,sBAAkB,KAAG,KAAH,CAA2B,IAAN,CAAN,KAAM,IAAG,CAAH,CAAX,IAA4B,CAAN,KAAM,IAAG,EAAH,CAA5D;AAEE,iCAAqB;AACrB,mBAAM;AACN,mBAAM,QAAQ,CAAC,KAAD;OAJhB;AAF8C;AA1CX;AAEzB;AACV,0BAAgB,uBAAW,QAAC;AAC5B,uBAAa;AACb,8BAAoB,CAAC;AACrB,+BAA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F;AAEE,aAAU;AAPH;AAAO;AAzThB,mBAgMc;AAMH,sBAAG;AAED,wBACT,qLAiDqL,GAhDrL,qLADqL,GAErL,qLADqL,GAErL,qLADqL,GAErL,qLADqL,GAErL,qLADqL,GAErL,qLADqL,GAErL,qLADqL,GAErL,qLADqL,GAErL,qLADqL,GAErL,qLADqL,GAErL,qLADqL,GAErL,qLADqL,GAErL,qLADqL,GAErL,qLADqL,GAErL,qLADqL,GAErL,qLADqL,GAErL,qLADqL,GAErL,qLADqL,GAErL,qLADqL,GAErL,qLADqL,GAErL,qLADqL,GAErL,qLADqL,GAErL,qLADqL,GAErL,qLADqL,GAErL,qLADqL,GAErL,qLADqL,GAErL,qLADqL,GAErL,qLADqL,GAErL,qLADqL,GAErL,qLADqL,GAErL,qLADqL,GAErL,qLADqL,GAErL,qLADqL,GAErL,qLADqL,GAErL,qLADqL,GAErL,qLADqL,GAErL,qLADqL,GAErL,qLADqL,GAErL,qLADqL,GAErL,qLADqL,GAErL,qLADqL,GAErL,qLADqL,GAErL,qLADqL,GAErL,qLADqL,GAErL,qLADqL,GAErL,qLADqL,GAErL,qLADqL,GAErL,qLADqL,GAErL,qLADqL,GAErL,+EADqL;AAIvL;AAEmB;AAAZ;AAEP,eAAU,0BAAa,CAAC,OAAO,KAAI,OAAO,cAAC,4CAAD,CAAnB;AACvB,eAAU,0BAAa,CAAC,OAAO,KAAI,GAAG,cAAC,4CAAD,CAAf;AAHhB;AAAY;AAhEP;AAy9Bd;AACE,sBAAa;AADf;AAzpCA,GAgMc,+BAhMd;ADAA,8BAES,oEAFT;;;;AAQW,mBAAG;AACL,iBAAG;AACJ,gBAAG;AACA,mBAAG;AACJ,kBAAG;AACD,oBAAG;AACN,iBAAG;AACF,kBAAG;AACD,oBAAG;AACJ,mBAAG;AACJ,kBAAG;AACH,kBAAG;AACJ,iBAAG;AACJ,gBAAG;AACF,iBAAG;AACH,iBAAG;AACL,eAAG;AACA,kBAAG;AACJ,iBAAG;AACF,kBAAG;AACA,qBAAG;AACL,mBAAG;AACH,mBAAG;AACL,iBAAG;AACH,iBAAG;AACH,i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AAY;AAC9B,oBAAgB,OAAP,OAAU,aAAH,CAAY;AAC5B,uBAAmB,OAAP,OAAU,aAAH,CAAY;OALjC;AAFuB;AA37Kf;AAeO;AACD;AACE;AACC;AAlBT;AAwBA;;;AAEN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAe;AACf;AACA;AACA;AACA;AAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAlIM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoyJwB;AAAhB;AAEhB,eAAgB,WAAC,cAAD;AAFA;AAAgB;AAmDL;AAAX;AAEhB,eAAU,cAAS,CAAC,KAAD;AAFH;AAAW;AAn4FA;AAE3B,UAAI,aAAS,KAAG,MAAhB;AAEE;AACA,wBAAY;AACZ;AACA;AACA,yBAAY,CAAC,IAAD;AACZ;OAPF;AAF2B;AA+NH;AAExB,UAAG,UAAM,KAAG,MAAZ;AAEE,qBAAS;AACT;OAHF;AAFwB;AATI;AAE5B,UAAG,cAAU,KAAG,MAAhB;AAEE,yBAAa;AACb;OAHF;AAF4B;AAiIA;AAE5B,UAAG,cAAU,KAAG,MAAhB;AAEE,yBAAa;AACb;OAHF;AAF4B;A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1JN,6CwC0JM;AACI,mCxC1JX,4CwC0JW;AACF,iCxC3JT,4CwC2JS;AACE,mCxCxJP,gDwCwJO;AACC,oCxC9JX,6CwC8JW;AACA,oCxC/JX,6CwC+JW;AACL,+BxChKN,6CwCgKM;AACD,8BxCjKL,6CwCiKK;AACI,kCxCtJP,+CwCsJO;AACA,kCxCxJP,+CwCwJO;AACD,iCxCtJP,8CwCsJO;AACE,mCxCxJP,gDwCwJO;AAtCT;AAyCG;;;AAjWlB,mBAoWc;AASM;;;AATN;AApWd,GAoWc,kBApWd;ACCA,sBAES,UAFT;;;AAES,2BAGO,6EACI,gEACG,8DACX,4EACM,kDACE,gEACC,0DACD,sFACA,qDACG,wDACE,+EACL,oFACG,oEACN,iDACO,6DACH,mDACG,wFACE,gGACA,uEACD,qEACF,8DACL,0DACD,oFACH,+EACE,iDACE,iFACK,0EACJ,wDACD,6CACC,qDACK,4EACZ,8DACI,6CACJ,4DACU,kEACT,gEACE,8DACW,0EACT,wEACH,oDACF,gDACG,qDACA,mFACF,8FACO,uDACP,0DACG,wEACQ,wEACP,sFACF,uEACI,qDACK,wEACF,yFACN,iDACA,+CACU,2EACH,sFACL,yDACA,8EACF,oDACH,+DACK,4EACK,+DACC,wEACU,+FACT,mFACV,8CACD,0CACE,uFACO,+FACP,+HACC,qIACF,6EACM,uEACR,gEACA,0DACG,kEAEE,qDACE,6DACH,qDACD,2EACU,iEACF,oFACF,yEACI,+GACiB,qGAC9B,8CACC,iDACI,6DACE,iEACC,6GACM,+EACZ,+EACgB,wGACP,wFACG,yFACE,8HACR,sFACK,qFACD,iFACD,4EACQ,mGACE,6EAClB,sDACK,+DACD,gEACU,iFACA,8EA/GrB;AAFT;ACDA,iBAKS,wDALT;;;;AAWkB,0BAAU,UAAP,UAAO,GAAI,CAAJ;AACX,yBAAG;AAIN,iDAAO,CAAP;AAAF,qBAA6B,IAAK,GAAlC;AAEY,gCAAG,cAAC,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,CAA7B;AAMZ;;AAIH;;AAKG;;AACG,sCADH,qCACG;AAEF;;AACG,uCADH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AGA,UAAG,CAAY,CAAC,UAAD,SAAf,EACE,MADF;AAGA,mBAAc,gBAAW,KAAE,wCAAF;AACzB,WAAM;AACN,cAAS,eAAM,GAAE,oBAAF;AACf,sBAAiB,KAAM,GAAE,0CAAF;AAEvB,UAAG,IAAK,GAAE,eAAV;AAEE,cAAO;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;OAvCE;AA2CA,UAAG,IAAK,IAAG,eAAX;AAEE,eAAQ,IAAK,GAAE,eAAF;AAGjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;OAjBE;AAsBF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGE;AAzGsC;AA8TC;AAEvC;AACA;AAAI;AAAI;AAAO;AAEf,aAAM,gBAAW,SAAC,EAAM,IAAG,IAA3B,EACE,gBAAW,IAAI,CAAC,sBAAD;AAEjB,sBAAW,KAAC,KAAS,KAAV;AAEX,UAAG,iBAAH,EACE,MADF;AAGA,UAAG,CAAY,CAAC,UAAD,SAAf,EACE,MADF;AAGA,WAAM;AAEN,WAAM;AAEN,cAAS,gBAAO,GAAE,qBAAF;AAEhB,sBAAiB,KAAM,GAAE,2CAAF;AAEvB,UAAG,IAAK,GAAE,eAAV;AAEE,cAAO;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;OA9BE;AAmCA,UAAG,IAAK,IAAG,eAAX;AAEE,eAAQ,IAAK,GAAE,eAAF;AAGjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;OAZE;AAiBF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAtFyC;AA1LK;AAE5C;AAEA,8BAAoB;AAEp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2CejEV;AACA,6BfgEU,2CehEV;AACA,6Bf+DU,2Ce/DV;AACA,6Bf8DU,2Ce9DV;AACA,6Bf6DU,2Ce7DV;AACA,6Bf4DU,2Ce5DV;AACA,6Bf2DU,2Ce3DV;AACA,6Bf0DU,2Ce1DV;AACA,8BfyDU,2CezDV;AACA,8BfwDU,2CexDV;AACA,8BfuDU,2CevDV;AACA,gC9CqYI,sC8CrYJ;AACA,gC9CoYI,sC8CpYJ;AACA,0BfoDU,2CepDV;AACA,0BfmDU,2CenDV;AACA,0BfkDU,2CelDV;AACA,0BfiDU,2CejDV;AACA,0BfgDU,2CehDV;AACA,gC9C8XI,sC8C9XJ;AACA,yBf8CU,2Ce9CV;AACA,2Bf6CU,2Ce7CV;AACA,+Bf4CU,2Ce5CV;AACA,4B9C0XI,sC8C1XJ;AACA,2B9CyXI,sC8CzXJ;AACA,yB9CwXI,sC8CxXJ;AACA,yB/C+fK,uC+C/fL;AACA,kC9CsXI,sC8CtXJ;AACA,kC/CkEI,sC+ClEJ;AACA,2B/CgqCG,qC+ChqCH;AACA,mC9CmXI,sC8CnXJ;AACA,mC/C+DI,sC+C/DJ;AACA,gC9C4cQ,0C8C5cR;AACA,iCtDKS,0CsDLT;AACA,6BfgCU,2CehCV;AACA,0Bf+BU,2Ce/BV;AACA,8BtDoEU,2CsDpEV;AACA,6B9C6GI,sC8C7GJ;AACA,2Bf4BU,2Ce5BV;AACA,gCf2BU,2Ce3BV;AACA,2B9C0GI,sC8C1GJ;AACA,2BfyBU,2CezBV;AACA,2B9CuWI,sC8CvWJ;AACA,4B/CmDI,sC+CnDJ;AACA,kC/CkDI,sC+ClDJ;AACA,yB9CoWI,sC8CpWJ;AACA,0B9C6PW,6C8C7PX;AACA,+B9CmGI,sC8CnGJ;AACqB,kCAAO,UvE6DvB,2BuE7DuB,CAAP;AACE,oCAAO,UvE4DzB,2BuE5DyB,CAAP;AACC,qCAAO,UvE2D1B,2BuE3D0B,CAAP;AAEK,0CAAO,UvEyD/B,2BuEzD+B,EAAuB,yBAA9B;AAEV,gCAAO,UvEuDrB,2BuEvDqB,CAAP;AACG,mCAAO,UvEsDxB,2BuEtDwB,CAAP;AACD,kCAAO,UvEqDvB,2BuErDuB,CAAP;AACD,iCAAO,UvEoDtB,2BuEpDsB,EAAiB,UvD2DlC,4CuD3DkC,EAAqB,SvD+ExD,2CuD/EwD,EAAgB,kBAAG,iBAAhE;AACC,kCAAO,UvEmDvB,2BuEnDuB,CAAP;AACM,wCAAO,UvEkD7B,2BuElD6B,CAAP;AACJ,oCAAO,UvEiDzB,2BuEjDyB,CAAP;AACE,sCAAO,UvEgD3B,2BuEhD2B,CAAP;AACG,yCAAO,UvE+C9B,2BuE/C8B,CAAP;AACL,oCAAO,UvE8CzB,2BuE9CyB,CAAP;AACA,oCAAO,UvE6CzB,2BuE7CyB,CAAP;AAEE,sCAAO,UvE2C3B,2BuE3C2B,CAAP;AACF,oCAAO,UvE0CzB,2BuE1CyB,CAAP;AACI,wCAAO,UvEyC7B,2BuEzC6B,CAAP;AAED,uCAAO,UvEuC5B,2BuEvC4B,EAAiB,UvD8CxC,4CuD9CwC,EAC3C,SvDiEE,2CuDjEF,EAAgB,kBAAG,iBADA;AAEJ,mCAAO,UvEqCxB,2BuErCwB,EAAkB,mBAAa,SvDgEnD,2CuDhEmD,CAAtC;AAIJ,6DAAE,CAAF;AA/EZ;AA+GR;AA7HF,GA+Hc,qMA/Hd;AGAA,sBAES,4JAFT;;;AAqHiB;AACb;AAEqB;AAEnB,UAAK,eAAL,IAAK;AAFc;AAKD;;AAKrB,WAAQ,UAAK,QAAC,eAAS,aAAT;AACd,gBAAQ;AACR,QAAI,QAAJ,GAAgB;AAChB,QAAI,YAAU;AAhBA;AAzGV;AA2EW;;0BAAE,EAAF;;;AA3EX;;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAYA;AACA;AAAU;AAAS;AAAM;AACzB;AAAS;AAAO;AAChB;AAeA;AACA;AA3FG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuQoB;AAE1B;AACE,oCAAY,CAAC,YAAQ,YAAT;AACZ;AACF,oBAAS,CAAC,EAAD;AACP,kBAAO;AANiB;AArBC;AAExB;AAEH,UAAI,SAAI,KAAE,EAAV;AACK,YAAG,QAAG,aAAC,EAAU,GAAE,CAAnB,EAA0B,QAAG,aAAC,CAAa,QAAG,aAAC,EAAU,GAAE,CAA7B,CAA9B;AACA,gBAAO,CAAP;OAEE,UAAI,SAAI,KAAE,EAAV;AACF,YAAG,QAAG,aAAC,EAAU,GAAiB,CAAf,QAAG,OAAM,SAAC,EAAK,GAAC,CAAD,CAAlC,EAA0C,QAAG,aAAC,CAAa,QAAG,aAAC,EAAU,GAAE,CAA7B,CAA9C;AACA,gBAAO,CAAP;OAEE,UAAI,SAAI,KAAE,EAAV;AACF,YAAG,QAAG,aAAC,EAAU,IAAG,CAApB;AACG,cAAK,QAAG,OAAM,KAAC,QAAG,aAAC,EAAL;AACd,sBAAO,CAAC,cAAU,EA3KoC,EA2K/C;AACP,sBAAO,CAAC,iBAAD,CAAU;SAHpB;OADE;AAZoB;AA2IA;AAE3B,cAAG,aAAC,CAAa,CAAC,CAAd;AACF,oBAAS,CAAS,OAAP,OAAU,4BAAH,CAAS,QAAC,EAAnB;AAHgB;AAjQD;AAE1B,sBAAoB,OAAP,OAAU,4BAAH,CAAS;AAC3B,UAAG,aAAS,GAAE,CAAd;AACC,sBAAS,CAAC,aAAQ,CAAC,iBAAD,CAAU,QAAC,EAApB;AAET,YAAA,cAAS,CAAC,EAAD;AACZ,cAAG,aAAC,CAAa,CAAb;AAPsB;AAsFH;AACpB;AAEH,UAAG,QAAG,aAAC,EAAU,IAAG,CAApB;AACG,YAAK,QAAG,OAAM,KAAC,QAAG,aAAC,EAAL;AACZ,oBAAO,CAAC,cAAU,EAjIuC,EAiIlD;AACP,oBAAO,CAAC,iBAAD,CAAU;OAHtB;AAHuB;AAsBI;AAE3B;AAF2B;AAKH;AAExB;AAFwB;AA2IE;AAE1B;AAF0B;AA5JA;AAE1B;AACA,UAAG,iBAAH;AACC;AACI,sCAAW;AACb;OAGA,MAAA,iCAAW,CAAC,oBAAD;AATY;AAjFD;;AACtB;AAEqB;AAEnB,sBAAQ,CAAC,CAAD,CAAR,GAAe;AACf,qBAAO,CAAC,CAAD,CAAP,GAAc;AACd,kBAAI,CAAC,CAAD,CAAJ,GAAW;AACX,qBAAO,CAAC,CAAD,CAAP,GAAc;AACd,sBAAQ,CAAC,CAAD,CAAR,GAAe;AACf,qBAAO,CAAC,CAAD,CAAP,GAAc;AACd,kBAAI,CAAC,CAAD,CAAJ,GAAW;AACX,qBAAO,CAAC,CAAD,CAAP,GAAc;AACd,sBAAQ,CAAC,CAAD,CAAR,GAAe;AACf,qBAAO,CAAC,CAAD,CAAP,GAAc;AACd,kBAAI,CAAC,CAAD,CAAJ,GAAW;AACX,qBAAO,CAAC,CAAD,CAAP,GAAc;AACd,sBAAQ,CAAC,CAAD,CAAR,GAAe;AACf,qBAAO,CAAC,CAAD,CAAP,GAAc;AACd,kBAAI,CAAC,CAAD,CAAJ,GAAW;AACX,qBAAO,CAAC,CAAD,CAAP,GAAc;AACd,sBAAQ,CAAC,CAAD,CAAR,GAAe;AACf,qBAAO,CAAC,CAAD,CAAP,GAAc;AACd,kBAAI,CAAC,CAAD,CAAJ,GAAW;AACX,qBAAO,CAAC,CAAD,CAAP,GAAc;AACd,sBAAQ,CAAC,CAAD,CAAR,GAAe;AACf,qBAAO,CAAC,CAAD,CAAP,GAAc;AACd,kBAAI,CAAC,CAAD,CAAJ,GAAW;AACX,qBAAO,CAAC,CAAD,CAAP,GAAc;AACd,sBAAQ,CAAC,CAAD,CAAR,GAAe;AACf,qBAAO,CAAC,CAAD,CAAP,GAAc;AACd,kBAAI,CAAC,CAAD,CAAJ,GAAW;AACX,qBAAO,CAAC,CAAD,CAAP,GAAc;AACd,sBAAQ,CAAC,CAAD,CAAR,GAAe;AACf,qBAAO,CAAC,CAAD,CAAP,GAAc;AACd,kBAAI,CAAC,CAAD,CAAJ,GAAW;AACX,qBAAO,CAAC,CAAD,CAAP,GAAc;AACd,sBAAQ,CAAC,CAAD,CAAR,GAAe;AACf,qBAAO,CAAC,CAAD,CAAP,GAAc;AACd,kBAAI,CAAC,CAAD,CAAJ,GAAW;AACX,qBAAO,CAAC,CAAD,CAAP,GAAc;AACd,sBAAQ,CAAC,CAAD,CAAR,GAAgB;AAChB,qBAAO,CAAC,CAAD,CAAP,GAAe;AACf,kBAAI,CAAC,CAAD,CAAJ,GAAY;AACZ,qBAAO,CAAC,CAAD,CAAP,GAAe;AACf,sBAAQ,CAAC,EAAD,CAAR,GAAgB;AAChB,qBAAO,CAAC,EAAD,CAAP,GAAe;AACf,kBAAI,CAAC,EAAD,CAAJ,GAAY;AACZ,qBAAO,CAAC,EAAD,CAAP,GAAe;AACf,sBAAQ,CAAC,EAAD,CAAR,GAAgB;AAChB,qBAAO,CAAC,EAAD,CAAP,GAAe;AACf,kBAAI,CAAC,EAAD,CAAJ,GAAY;AACZ,qBAAO,CAAC,EAAD,CAAP,GAAe;AAjDI;AAqDxB;AACE;AACA,WAAI,IAAK,GAAL,CAAU,QAAV,CAAU,EAAd;AACG,qBAAQ,CAAC,KAAD,CAAG,QAAC,CAAQ,EAAR;AACZ,oBAAO,CAAC,KAAD,CAAG,QAAC,CAAQ,EAAR;AACX,iBAAI,CAAC,KAAD,CAAG,QAAC,CAAQ,EAAR;AACR,oBAAO,CAAC,KAAD,CAAG,QAAC,CAAQ,EAAR;AACX,oBAAO,CAAC,KAAD,CAAG,WAAC,CAAW,KAAX;AACX,qBAAQ,CAAC,KAAD,CAAG,YAAC,CAAc,CAAD,CAAC,GAAC,CAAD,CAAG,GAAC,CAAlB;AACZ,oBAAO,CAAC,KAAD,CAAG,YAAC,CAAiB,CAAH,CAAD,CAAC,GAAC,CAAD,CAAG,GAAC,CAAD,CAAE,GAAC,CAApB;AACX,iBAAI,CAAC,KAAD,CAAG,YAAC,CAAiB,CAAH,CAAD,CAAC,GAAC,CAAD,CAAG,GAAC,CAAD,CAAE,GAAC,CAApB;;AAEX,sBAAY;AApEW;AAgOF;AACpB;AAEH,WAAI,IAAK,GAAL,CAAU,QAAV,CAAU,EAAd;AACI,oBAAO,CAAC,KAAD,CAAP,GAAc;AACb,kBAAK,CAAC,KAAD,CAAL,GAAY;AACZ,oBAAO,CAAC,KAAD,CAAP,GAAc;AACf,oBAAO,CAAC,KAAD,CAAG,QAAV,GAAsB;AACtB,oBAAO,CAAC,KAAD,CAAG,UAAV,GAAwB;AACxB,oBAAO,CAAC,KAAD,CAAG,SAAV,GAAuB;;AATJ;AAzCK;AACzB;AACF;AAED,WAAI,IAAK,GAAL,CAAU,QAAV,CAAU,EAAd;AACG,YAAK,YAAO,CAAC,KAAD,CAAG,QAAC;AACd,YAAG,CAAE,KAAE,EAAP,EAAe,IAAK,GAApB;AACF,oBAAO,CAAC,KAAD,CAAP,GAAc,uBAAU,CAAC,CAAD;AACxB,YAAK,SAAI,CAAC,KAAD,CAAG,QAAC;AACX,YAAG,CAAE,KAAE,EAAP,EAAe,IAAK,GAApB;AACF,kBAAK,CAAC,KAAD,CAAL,GAAY,uBAAU,CAAC,CAAD;AACtB,YAAK,YAAO,CAAC,KAAD,CAAG,QAAC;AACd,YAAG,CAAE,KAAE,EAAP,EAAe,IAAK,GAApB;AACF,oBAAO,CAAC,KAAD,CAAP,GAAc,uBAAU,CAAC,CAAD;AACtB,YAAG,YAAO,CAAC,KAAD,CAAG,SAAU,KAAG,aAAQ,CAAC,KAAD,CAAG,QAAC,EAAtC,EACC,YAAO,CAAC,EAAG,aAAQ,CAAC,KAAD,CAAG,QAAC,GA3PiC,EA2PjD,CADR;;AAduB;AAmBA;AACzB;AAAO;AAAI;AACb;AAED,cAAS;AACP,WAAM;AACN,cAAS;AACX,WAAI,IAAK,GAAL,CAAU,QAAV,CAAU,EAAd;AACG,gBAAS,KAAM,GAAE,YAAO,CAAC,KAAD,CAAT;AACb,aAAM,EAAG,GAAE,UAAK,CAAC,KAAD,CAAP;AACT,gBAAS,KAAM,GAAE,YAAO,CAAC,KAAD,CAAT;AACjB,YAAG,YAAO,CAAC,KAAD,CAAI,KAAE,CAAhB;AAAuB,sBAAO,CAAC,KAAD,CAAG,QAAC,CAAQ,EAAR;AAChB,cAAX,YAAO,CAAC,KAAD,CAAG,QAAC,CAAQ,mBAAM,CAAC,OAAQ,CAAC,YAAO,CAAC,KAAD,CAAR,CAAT,CAAd;AAClB,YAAG,UAAK,CAAC,KAAD,CAAI,KAAE,CAAd;AAAqB,mBAAI,CAAC,KAAD,CAAG,QAAC,CAAQ,EAAR;AACd,cAAR,SAAI,CAAC,KAAD,CAAG,QAAC,CAAQ,mBAAM,CAAC,OAAQ,CAAC,UAAK,CAAC,KAAD,CAAN,CAAT,CAAd;AACb,oBAAO,CAAC,KAAD,CAAG,QAAC,CAAQ,mBAAM,CAAC,OAAQ,CAAC,YAAO,CAAC,KAAD,CAAR,CAAT,CAAd;;AAEhB,uBAAY,QAAC,CAAQ,mBAAM,CAAC,OAAQ,CAAC,KAAD,CAAT,CAAd;AACb,oBAAS,QAAC,CAAQ,mBAAM,CAAC,OAAQ,CAAC,EAAD,CAAT,CAAd;AACV,wBAAa,QAAC,CAAQ,mBAAM,CAAC,OAAQ,CAAC,KAAD,CAAT,CAAd;AAnBc;AAuFH;AACtB;AACA;AAAO;AACP;AAEH,qBAAW,8BAAW,eAAe,CAAC,WAAY,aAAS,CAAtB;AACrC,cAAS,8BAAW,eAAe,CAAC,SAAU,aAAS,CAApB;AAEnC;AACE,UAAG,KAAM,GAAE,EAAX;AACG,gBAAS,4BAAa,QAAC,YAAM,CAAC,GAAI,GAAL,CAAN;AACvB,aAAK,UAAC,CAAY,KAAZ;AACN,aAAI,MAAO,GAAP,GAAY,QAAZ,GAAY,EAAhB;AACG,cAAK,CAAD,CAAC,GAAC,GAAD,CAAM,IAAG,KAAK,QAAnB;AACG,mBAAQ,KAAK,WAAE,CAAD,CAAC,GAAC,GAAD,CAAI,GAAC,CAAP;AACb,wBAAO,CAAC,IAAK,GAAI,IAAV;AACP,wBAAO,CAAC,OAAD,CAAP,GAAgB,KAAK,SAAQ,CAAE,CAAD,CAAC,GAAC,GAAD,CAAI,GAAC,CAAP;AAC7B,sBAAK,CAAC,OAAD,CAAL,GAAc,KAAK,SAAQ,CAAE,CAAD,CAAC,GAAC,GAAD,CAAI,GAAC,CAAP;AAC3B,wBAAO,CAAC,OAAD,CAAP,GAAgB,KAAK,SAAQ,CAAC,CAAC,GAAC,GAAH;WALhC;;AAQH,aAAM,eAAN,KAAM;OAZT;AAcF;AAvByB;AAzCF;AACpB;AAAK;AACL;AACA;AACA;AAED,cAAS,4BAAa,QAAC,YAAM,CAAC,GAAI,GAAL,CAAN;AACvB,YAAO;AACP,YAAO;AACP,WAAI,MAAO,GAAP,GAAY,QAAZ,GAAY,EAAhB;AACC,YAAG,YAAO,CAAC,OAAD,CAAK,UAAW,GAAE,EAA5B;AACO,aAAJ,IAAG;AACD,eAAK,WAAE,CAAD,CAAC,GAAC,GAAD,CAAI,GAAC,CAAD,CAAO,YAAO,CAAC,OAAD,CAAK,UAAzB;AACL,eAAK,SAAQ,CAAE,CAAD,CAAC,GAAC,GAAD,CAAI,GAAC,CAAD,CAAO,YAAO,CAAC,OAAD,CAApB;AACb,eAAK,SAAQ,CAAE,CAAD,CAAC,GAAC,GAAD,CAAI,GAAC,CAAD,CAAO,UAAK,CAAC,OAAD,CAAlB;AACb,eAAK,SAAQ,CAAC,CAAC,GAAC,GAAD,CAAS,YAAO,CAAC,OAAD,CAAlB;AACb,gBAAO,GAAI,GAAE,YAAO,CAAC,OAAD,CAAT;SANhB;;AASD,WAAK,QAAL,GAAiB,CAAE,GAAE,GAAF;AACnB,cAAS,KAAK,UAAC;AAEf,WAAM,eAAN,KAAM;AACN,oCAAW,eAAe,CAAC,SAAU,MAAO,aAAS,CAA3B;AAC1B,oCAAW,eAAe,CAAC,QAAS,IAAK,aAAS,CAAxB;AAxBL;AAnFC;AACrB;AAEH,cAAG;AACH,cAAG,OAAM;AAEP,eAAS,QAAY,OAAP,mBAAO,uBAArB;AAAI;AACD,YAAM,CAAF,CAAE,KAAE,EAAF,CAAM,IAAgC,CAA5B,cAAG,CAAC,EAAG,mBAAO,OAAC,CAAD,CAAG,SAAd,CAAyB,GAAE,CAAF,CAA5C,EACC,QAAG,OAAM,IAAI,CAAC,mBAAO,OAAC,CAAD,CAAG,SAAX,CADd;;AAGL,cAAG;AAVqB;AAaA;AAAV;AAEd,eAAU;AAFI;AAAU;AA7CM;AAE9B;AACE;AACA;AAJ4B;AAOF;;AACzB;AAAO;AAAI;AACb;AAEmB;AAEnB,qBAAO,CAAC,OAAD,CAAP,GAAgB,yBAAY,CAAC,aAAO,CAAC,OAAD,EAAO,WAAK,CAAC,OAAD,EAAO,aAAO,CAAC,OAAD,CAAK,QAAvC;AAFT;AAMpB,cAAS;AACP,WAAM;AACN,cAAS;AACX,WAAI,IAAK,GAAL,CAAU,QAAV,CAAU,EAAd;AACG,gBAAS,KAAM,GAAE,YAAO,CAAC,KAAD,CAAT;AACb,aAAM,EAAG,GAAE,UAAK,CAAC,KAAD,CAAP;AACT,gBAAS,KAAM,GAAE,YAAO,CAAC,KAAD,CAAT;AACjB,YAAG,YAAO,CAAC,KAAD,CAAG,SAAU,GAAE,EAAzB,EACG,UAAU,CAAC,CAAD,CADb;;AAGH,uBAAY,QAAC,CAAQ,mBAAM,CAAC,OAAQ,CAAC,KAAD,CAAT,CAAd;AACb,oBAAS,QAAC,CAAQ,mBAAM,CAAC,OAAQ,CAAC,EAAD,CAAT,CAAd;AACV,wBAAa,QAAC,CAAQ,mBAAM,CAAC,OAAQ,CAAC,KAAD,CAAT,CAAd;AAtBc;AAuIN;AAEtB,UAAG,EAAG,GAAE,EAAR;AACG,2BAAO,eAAe,CAAC,EAAD;AAEtB,YAAA,mBAAO,iBAAiB,CAAC,MAAD;AACzB,UAAG,GAAI,GAAE,CAAT;AACG,qBAAQ,CAAC,OAAD,CAAK,QAAC,CAAQ,mBAAO,MAAC,EAAhB;AACd,oBAAO,CAAC,OAAD,CAAK,UAAZ,GAA0B,mBAAO,IAAC;AAClC,oBAAO,CAAC,OAAD,CAAK,SAAZ,GAAyB,mBAAO,MAAC;AACjC,oBAAO,CAAC,OAAD,CAAK,QAAZ,GAAwB,mBAAO,MAAC;OAJnC;AANoB;AAxRC;AAAT;AAEd,eAAU,mBAAO,IAAC;AAFJ;AAAS;AAiUK;AAEjB;AAEV,uBAAa,6BAAM,QAAC,YAAM,CAAC,IAAD,CAAN;AACpB,uBAAa,6BAAM,QAAC,YAAM,CAAC,IAAD,CAAN;AACpB,uBAAa,6BAAM,QAAC,YAAM,CAAC,IAAD,CAAN;AACpB,uBAAa,6BAAM,QAAC,YAAM,CAAC,IAAD,CAAN;AACpB,uBAAa,6BAAM,QAAC,YAAM,CAAC,IAAD,CAAN;AACpB,iBAAO,+BAAQ,QAAC,YAAM,CAAC,IAAD,CAAN;AAChB,qBAAW,4BAAK,QAAC,YAAM,CAAC,IAAD,CAAN;AACjB,oBAAU,8BAAO,QAAC,YAAM,CAAC,IAAD,CAAN;AAClB,sBAAY,4BAAK,QAAC,YAAM,CAAC,IAAD,CAAN;AAClB,mBAAS,4BAAK,QAAC,YAAM,CAAC,IAAD,CAAN;AACf,qBAAW,4BAAK,QAAC,YAAM,CAAC,IAAD,CAAN;AACjB,0BAAgB,4BAAK,QAAC,YAAM,CAAC,IAAD,CAAN;AACtB,uBAAa,4BAAK,QAAC,YAAM,CAAC,IAAD,CAAN;AACnB,2BAAiB,4BAAK,QAAC,YAAM,CAAC,IAAD,CAAN;AACvB,qBAAW,4BAAK,QAAC,YAAM,CAAC,IAAD,CAAN;AACjB,sBAAY,4BAAK,QAAC,YAAM,CAAC,IAAD,CAAN;AAClB,mBAAS,4BAAK,QAAC,YAAM,CAAC,IAAD,CAAN;AACf,qBAAW,4BAAK,QAAC,YAAM,CAAC,IAAD,CAAN;AACjB,qBAAW,4BAAK,QAAC,YAAM,CAAC,IAAD,CAAN;AACjB,sBAAY,4BAAK,QAAC,YAAM,CAAC,IAAD,CAAN;AAClB,mBAAS,4BAAK,QAAC,YAAM,CAAC,IAAD,CAAN;AACf,qBAAW,4BAAK,QAAC,YAAM,CAAC,IAAD,CAAN;AACjB,qBAAW,4BAAK,QAAC,YAAM,CAAC,IAAD,CAAN;AACjB,sBAAY,4BAAK,QAAC,YAAM,CAAC,IAAD,CAAN;AAClB,mBAAS,4BAAK,QAAC,YAAM,CAAC,IAAD,CAAN;AACf,qBAAW,4BAAK,QAAC,YAAM,CAAC,IAAD,CAAN;AACjB,qBAAW,4BAAK,QAAC,YAAM,CAAC,IAAD,CAAN;AACjB,sBAAY,4BAAK,QAAC,YAAM,CAAC,IAAD,CAAN;AAClB,mBAAS,4BAAK,QAAC,YAAM,CAAC,IAAD,CAAN;AACf,qBAAW,4BAAK,QAAC,YAAM,CAAC,IAAD,CAAN;AACjB,qBAAW,4BAAK,QAAC,YAAM,CAAC,IAAD,CAAN;AACjB,sBAAY,4BAAK,QAAC,YAAM,CAAC,IAAD,CAAN;AAClB,mBAAS,4BAAK,QAAC,YAAM,CAAC,IAAD,CAAN;AACf,qBAAW,4BAAK,QAAC,YAAM,CAAC,IAAD,CAAN;AACjB,qBAAW,4BAAK,QAAC,YAAM,CAAC,IAAD,CAAN;AACjB,sBAAY,4BAAK,QAAC,YAAM,CAAC,IAAD,CAAN;AAClB,mBAAS,4BAAK,QAAC,YAAM,CAAC,IAAD,CAAN;AACf,qBAAW,4BAAK,QAAC,YAAM,CAAC,IAAD,CAAN;AACjB,qBAAW,4BAAK,QAAC,YAAM,CAAC,IAAD,CAAN;AACjB,sBAAY,4BAAK,QAAC,YAAM,CAAC,IAAD,CAAN;AAClB,mBAAS,4BAAK,QAAC,YAAM,CAAC,IAAD,CAAN;AACf,qBAAW,4BAAK,QAAC,YAAM,CAAC,IAAD,CAAN;AACjB,qBAAW,4BAAK,QAAC,YAAM,CAAC,IAAD,CAAN;AACjB,sBAAY,4BAAK,QAAC,YAAM,CAAC,IAAD,CAAN;AAClB,mBAAS,4BAAK,QAAC,YAAM,CAAC,IAAD,CAAN;AACf,qBAAW,4BAAK,QAAC,YAAM,CAAC,IAAD,CAAN;AACjB,sBAAY,4BAAK,QAAC,YAAM,CAAC,IAAD,CAAN;AAClB,uBAAa,4BAAK,QAAC,YAAM,CAAC,IAAD,CAAN;AACnB,oBAAU,4BAAK,QAAC,YAAM,CAAC,IAAD,CAAN;AAChB,sBAAY,4BAAK,QAAC,YAAM,CAAC,IAAD,CAAN;AAClB,sBAAY,4BAAK,QAAC,YAAM,CAAC,IAAD,CAAN;AAClB,uBAAa,4BAAK,QAAC,YAAM,CAAC,IAAD,CAAN;AACnB,oBAAU,4BAAK,QAAC,YAAM,CAAC,IAAD,CAAN;AAChB,sBAAY,4BAAK,QAAC,YAAM,CAAC,IAAD,CAAN;AAClB,sBAAY,4BAAK,QAAC,YAAM,CAAC,IAAD,CAAN;AAClB,uBAAa,4BAAK,QAAC,YAAM,CAAC,IAAD,CAAN;AACnB,oBAAU,4BAAK,QAAC,YAAM,CAAC,IAAD,CAAN;AAChB,sBAAY,4BAAK,QAAC,YAAM,CAAC,IAAD,CAAN;AAClB,oBAAU,6BAAM,QAAC,YAAM,CAAC,IAAD,CAAN;AACjB,qBAAW,oCAAa,QAAC,YAAM,CAAC,IAAD,CAAN;AAEzB,oBAAS;AACT,oBAAS;AACT,oBAAS;AACT,oBAAS;AACT,oBAAS;AACT,cAAG;AACH,kBAAO;AACP,iBAAM;AACN,mBAAQ;AACR,gBAAK;AACL,kBAAO;AACP,uBAAY;AACZ,oBAAS;AACT,wBAAa;AACb,kBAAO;AACP,mBAAQ;AACR,gBAAK;AACL,kBAAO;AACP,kBAAO;AACP,mBAAQ;AACR,gBAAK;AACL,kBAAO;AACP,kBAAO;AACP,mBAAQ;AACR,gBAAK;AACL,kBAAO;AACP,kBAAO;AACP,mBAAQ;AACR,gBAAK;AACL,kBAAO;AACP,kBAAO;AACP,mBAAQ;AACR,gBAAK;AACL,kBAAO;AACP,kBAAO;AACP,mBAAQ;AACR,gBAAK;AACL,kBAAO;AACP,kBAAO;AACP,mBAAQ;AACR,gBAAK;AACL,kBAAO;AACP,kBAAO;AACP,mBAAQ;AACR,gBAAK;AACL,kBAAO;AACP,mBAAQ;AACR,oBAAS;AACT,iBAAM;AACN,mBAAQ;AACR,mBAAQ;AACR,oBAAS;AACT,iBAAM;AACN,mBAAQ;AACR,mBAAQ;AACR,oBAAS;AACT,iBAAM;AACN,mBAAQ;AACR,iBAAM;AACN,kBAAO;AACP;AACE,qBAAQ,MAAR;AACA,sBAAS,GAAT;AACA,uBAAU,GAAV;AACA,wBAAW,uBAAX;AACA,qBAAQ,CAAC,KAAM,UAAW,cAAlB;AACR,qBAAQ,CAAC,KAAM,SAAU,aAAjB;AACR,sBAAS,mBAAmB,CAAC,IAAD;AAC5B,sBAAS,QAAC,CAAQ,WAAR;AACV,sBAAS,QAAC,CAAQ,GAAR;AACV,sBAAS,OAAC,CAAO,EAAP;AACV,sBAAS,SAAC,CAAS,EAAT;AACV,sBAAS,UAAC,CAAU,EAAV;AACV,sBAAS,WAAC,CAAW,WAAX;AACV,sBAAS,iBAAC,CAAiB,sBAAjB;AACV,sBAAS,gBAAC,CAAgB,sBAAhB;AACV,sBAAS,mBAAmB,CAAC,IAAD;AAC5B,sBAAS,QAAC,CAAQ,WAAR;AACV,sBAAS,QAAC,CAAQ,GAAR;AACV,sBAAS,OAAC,CAAO,EAAP;AACV,sBAAS,SAAC,CAAS,EAAT;AACV,sBAAS,UAAC,CAAU,EAAV;AACV,sBAAS,WAAC,CAAW,UAAX;AACV,sBAAS,iBAAC,CAAiB,sBAAjB;AACV,sBAAS,gBAAC,CAAgB,sBAAhB;AACV,sBAAS,mBAAmB,CAAC,IAAD;AAC5B,sBAAS,QAAC,CAAQ,WAAR;AACV,sBAAS,QAAC,CAAQ,GAAR;AACV,sBAAS,OAAC,CAAO,EAAP;AACV,sBAAS,SAAC,CAAS,EAAT;AACV,sBAAS,UAAC,CAAU,EAAV;AACV,sBAAS,WAAC,CAAW,aAAX;AACV,sBAAS,iBAAC,CAAiB,sBAAjB;AACV,sBAAS,gBAAC,CAAgB,sBAAhB;AACV,sBAAS,mBAAmB,CAAC,IAAD;AAC5B,sBAAS,QAAC,CAAQ,WAAR;AACV,sBAAS,QAAC,CAAQ,GAAR;AACV,sBAAS,OAAC,CAAO,EAAP;AACV,sBAAS,SAAC,CAAS,EAAT;AACV,sBAAS,UAAC,CAAU,EAAV;AACV,sBAAS,WAAC,CAAW,QAAX;AACV,sBAAS,iBAAC,CAAiB,sBAAjB;AACV,sBAAS,gBAAC,CAAgB,sBAAhB;AACV,sBAAS,mBAAmB,CAAC,IAAD;AAC5B,sBAAS,QAAC,CAAQ,WAAR;AACV,sBAAS,QAAC,CAAQ,GAAR;AACV,sBAAS,OAAC,CAAO,GAAP;AACV,sBAAS,SAAC,CAAS,EAAT;AACV,sBAAS,UAAC,CAAU,EAAV;AACV,sBAAS,WAAC,CAAW,QAAX;AACV,sBAAS,iBAAC,CAAiB,sBAAjB;AACV,sBAAS,gBAAC,CAAgB,sBAAhB;AACV,gBAAG,mBAAmB,CAAC,IAAD;AACtB,gBAAG,QAAC,CAAQ,KAAR;AACJ,gBAAG,QAAC,CAAQ,EAAR;AACJ,gBAAG,OAAC,CAAO,EAAP;AACJ,gBAAG,SAAC,CAAS,GAAT;AACJ,gBAAG,UAAC,CAAU,GAAV;AACJ,gBAAG,WAAC,CAAW,KAAX;AACJ,gBAAG,iBAAC,CAAiB,sBAAjB;AACJ,gBAAG,cAAC,CAAc,EAAd;AACJ,gBAAG,aAAC,CAAa,CAAC,CAAd;AACJ,gBAAG,YAAC,CAAY,EAAZ;AACJ,gBAAG,gBAAC,CAAgB,sBAAhB;AACJ,uBAAQ,CAAC,SAAK,KAAM,UAAW,UAAvB;AACR,uBAAQ,CAAC,SAAK,KAAM,UAAW,cAAvB;AACR,oBAAO,mBAAmB,CAAC,IAAD;AAC1B,oBAAO,QAAC,CAAQ,SAAR;AACR,oBAAO,OAAP,GAAe;AACf,oBAAO,QAAC,CAAQ,GAAR;AACR,oBAAO,OAAC,CAAO,GAAP;AACR,oBAAO,SAAC,CAAS,GAAT;AACR,oBAAO,UAAC,CAAU,EAAV;AACR,oBAAO,YAAC,CAAY,iDAAZ;AACR,oBAAO,gBAAC,CAAc,CAAd;AACR,oBAAO,iBAAC,CAAiB,sBAAjB;AACR,oBAAO,gBAAC,CAAgB,sBAAhB;AACR,uBAAQ,CAAC,aAAS,KAAM,WAAY,cAA5B;AACR,uBAAQ,CAAC,aAAS,KAAM,UAAW,aAA3B;AACR,uBAAQ,CAAC,aAAS,KAAM,SAAU,aAA1B;AACR,uBAAQ,CAAC,aAAS,KAAM,UAAW,cAA3B;AACR,mBAAM,mBAAmB,CAAC,IAAD;AACzB,mBAAM,QAAC,CAAQ,QAAR;AACP,mBAAM,QAAC,CAAQ,GAAR;AACP,mBAAM,OAAC,CAAO,GAAP;AACP,mBAAM,SAAC,CAAS,EAAT;AACP,mBAAM,UAAC,CAAU,EAAV;AACP,mBAAM,WAAC,CAAW,MAAX;AACP,mBAAM,gBAAC,CAAc,CAAd;AACP,mBAAM,iBAAC,CAAiB,sBAAjB;AACP,mBAAM,YAAC,CAAY,EAAZ;AACP,mBAAM,WAAC,CAAW,KAAX;AACP,mBAAM,gBAAC,CAAgB,sBAAhB;AACP,uBAAQ,CAAC,YAAQ,KAAM,UAAW,aAA1B;AACR,qBAAQ,mBAAmB,CAAC,IAAD;AAC3B,qBAAQ,QAAC,CAAQ,UAAR;AACT,qBAAQ,QAAC,CAAQ,GAAR;AACT,qBAAQ,OAAC,CAAO,GAAP;AACT,qBAAQ,SAAC,CAAS,GAAT;AACT,qBAAQ,UAAC,CAAU,EAAV;AACT,qBAAQ,aAAC,CAAa,qCAAb;AACT,qBAAQ,YAAC,CAAY,iDAAZ;AACT,qBAAQ,gBAAC,CAAc,CAAd;AACT,qBAAQ,iBAAC,CAAiB,sBAAjB;AACT,qBAAQ,YAAC,CAAY,CAAZ;AACT,qBAAQ,gBAAC,CAAgB,sBAAhB;AACT,uBAAQ,CAAC,cAAU,KAAM,SAAU,cAA3B;AACR,kBAAK,mBAAmB,CAAC,IAAD;AACxB,kBAAK,QAAC,CAAQ,OAAR;AACN,kBAAK,QAAC,CAAQ,GAAR;AACN,kBAAK,OAAC,CAAO,GAAP;AACN,kBAAK,SAAC,CAAS,EAAT;AACN,kBAAK,UAAC,CAAU,EAAV;AACN,kBAAK,aAAC,CAAa,qCAAb;AACN,kBAAK,YAAC,CAAY,iDAAZ;AACN,kBAAK,gBAAC,CAAc,CAAd;AACN,kBAAK,iBAAC,CAAiB,sBAAjB;AACN,kBAAK,YAAC,CAAY,CAAZ;AACN,kBAAK,gBAAC,CAAgB,sBAAhB;AACN,uBAAQ,CAAC,WAAO,KAAM,SAAU,WAAxB;AACR,oBAAO,mBAAmB,CAAC,IAAD;AAC1B,oBAAO,QAAC,CAAQ,SAAR;AACR,oBAAO,QAAC,CAAQ,GAAR;AACR,oBAAO,OAAC,CAAO,GAAP;AACR,oBAAO,SAAC,CAAS,EAAT;AACR,oBAAO,UAAC,CAAU,EAAV;AACR,oBAAO,WAAC,CAAW,KAAX;AACR,oBAAO,aAAC,CAAa,qCAAb;AACR,oBAAO,YAAC,CAAY,iDAAZ;AACR,oBAAO,gBAAC,CAAc,CAAd;AACR,oBAAO,SAAC,CAAS,QAAT;AACR,oBAAO,iBAAC,CAAiB,sBAAjB;AACR,oBAAO,YAAC,CAAY,IAAZ;AACR,oBAAO,YAAC,CAAY,CAAZ;AACR,oBAAO,gBAAC,CAAgB,sBAAhB;AACR,yBAAY,mBAAmB,CAAC,IAAD;AAC/B,yBAAY,QAAC,CAAQ,cAAR;AACb,yBAAY,QAAC,CAAQ,GAAR;AACb,yBAAY,OAAC,CAAO,GAAP;AACb,yBAAY,SAAC,CAAS,GAAT;AACb,yBAAY,UAAC,CAAU,EAAV;AACb,yBAAY,WAAC,CAAW,KAAX;AACb,yBAAY,aAAC,CAAa,qCAAb;AACb,yBAAY,YAAC,CAAY,iDAAZ;AACb,yBAAY,gBAAC,CAAc,CAAd;AACb,yBAAY,SAAC,CAAS,QAAT;AACb,yBAAY,iBAAC,CAAiB,sBAAjB;AACb,yBAAY,YAAC,CAAY,IAAZ;AACb,yBAAY,YAAC,CAAY,EAAZ;AACb,yBAAY,gBAAC,CAAgB,sBAAhB;AACb,sBAAS,mBAAmB,CAAC,IAAD;AAC5B,sBAAS,QAAC,CAAQ,WAAR;AACV,sBAAS,QAAC,CAAQ,GAAR;AACV,sBAAS,OAAC,CAAO,GAAP;AACV,sBAAS,SAAC,CAAS,EAAT;AACV,sBAAS,UAAC,CAAU,EAAV;AACV,sBAAS,WAAC,CAAW,KAAX;AACV,sBAAS,aAAC,CAAa,qCAAb;AACV,sBAAS,YAAC,CAAY,iDAAZ;AACV,sBAAS,gBAAC,CAAc,CAAd;AACV,sBAAS,SAAC,CAAS,QAAT;AACV,sBAAS,iBAAC,CAAiB,sBAAjB;AACV,sBAAS,YAAC,CAAY,IAAZ;AACV,sBAAS,YAAC,CAAY,EAAZ;AACV,sBAAS,gBAAC,CAAgB,sBAAhB;AACV,0BAAa,mBAAmB,CAAC,IAAD;AAChC,0BAAa,QAAC,CAAQ,eAAR;AACd,0BAAa,QAAC,CAAQ,GAAR;AACd,0BAAa,OAAC,CAAO,GAAP;AACd,0BAAa,SAAC,CAAS,EAAT;AACd,0BAAa,UAAC,CAAU,EAAV;AACd,0BAAa,WAAC,CAAW,KAAX;AACd,0BAAa,aAAC,CAAa,qCAAb;AACd,0BAAa,YAAC,CAAY,iDAAZ;AACd,0BAAa,gBAAC,CAAc,CAAd;AACd,0BAAa,SAAC,CAAS,QAAT;AACd,0BAAa,iBAAC,CAAiB,sBAAjB;AACd,0BAAa,YAAC,CAAY,IAAZ;AACd,0BAAa,YAAC,CAAY,EAAZ;AACd,0BAAa,gBAAC,CAAgB,sBAAhB;AACd,oBAAO,mBAAmB,CAAC,IAAD;AAC1B,oBAAO,QAAC,CAAQ,SAAR;AACR,oBAAO,OAAP,GAAe;AACf,oBAAO,QAAC,CAAQ,GAAR;AACR,oBAAO,OAAC,CAAO,GAAP;AACR,oBAAO,SAAC,CAAS,GAAT;AACR,oBAAO,UAAC,CAAU,EAAV;AACR,oBAAO,YAAC,CAAY,iDAAZ;AACR,oBAAO,gBAAC,CAAc,CAAd;AACR,oBAAO,iBAAC,CAAiB,sBAAjB;AACR,oBAAO,YAAC,CAAY,CAAZ;AACR,oBAAO,gBAAC,CAAgB,sBAAhB;AACR,uBAAQ,CAAC,aAAS,KAAM,WAAY,cAA5B;AACR,uBAAQ,CAAC,aAAS,KAAM,UAAW,aAA3B;AACR,uBAAQ,CAAC,aAAS,KAAM,UAAW,cAA3B;AACR,qBAAQ,mBAAmB,CAAC,IAAD;AAC3B,qBAAQ,QAAC,CAAQ,UAAR;AACT,qBAAQ,QAAC,CAAQ,GAAR;AACT,qBAAQ,OAAC,CAAO,GAAP;AACT,qBAAQ,SAAC,CAAS,GAAT;AACT,qBAAQ,UAAC,CAAU,EAAV;AACT,qBAAQ,aAAC,CAAa,qCAAb;AACT,qBAAQ,YAAC,CAAY,iDAAZ;AACT,qBAAQ,gBAAC,CAAc,CAAd;AACT,qBAAQ,iBAAC,CAAiB,sBAAjB;AACT,qBAAQ,YAAC,CAAY,CAAZ;AACT,qBAAQ,gBAAC,CAAgB,sBAAhB;AACT,uBAAQ,CAAC,cAAU,KAAM,SAAU,cAA3B;AACR,kBAAK,mBAAmB,CAAC,IAAD;AACxB,kBAAK,QAAC,CAAQ,OAAR;AACN,kBAAK,QAAC,CAAQ,GAAR;AACN,kBAAK,OAAC,CAAO,GAAP;AACN,kBAAK,SAAC,CAAS,EAAT;AACN,kBAAK,UAAC,CAAU,EAAV;AACN,kBAAK,aAAC,CAAa,qCAAb;AACN,kBAAK,YAAC,CAAY,iDAAZ;AACN,kBAAK,gBAAC,CAAc,CAAd;AACN,kBAAK,iBAAC,CAAiB,sBAAjB;AACN,kBAAK,YAAC,CAAY,CAAZ;AACN,kBAAK,gBAAC,CAAgB,sBAAhB;AACN,uBAAQ,CAAC,WAAO,KAAM,SAAU,WAAxB;AACR,oBAAO,mBAAmB,CAAC,IAAD;AAC1B,oBAAO,QAAC,CAAQ,SAAR;AACR,oBAAO,QAAC,CAAQ,GAAR;AACR,oBAAO,OAAC,CAAO,GAAP;AACR,oBAAO,SAAC,CAAS,EAAT;AACR,oBAAO,UAAC,CAAU,EAAV;AACR,oBAAO,WAAC,CAAW,KAAX;AACR,oBAAO,aAAC,CAAa,qCAAb;AACR,oBAAO,YAAC,CAAY,iDAAZ;AACR,oBAAO,gBAAC,CAAc,CAAd;AACR,oBAAO,SAAC,CAAS,QAAT;AACR,oBAAO,iBAAC,CAAiB,sBAAjB;AACR,oBAAO,YAAC,CAAY,IAAZ;AACR,oBAAO,gBAAC,CAAgB,sBAAhB;AACR,oBAAO,mBAAmB,CAAC,IAAD;AAC1B,oBAAO,QAAC,CAAQ,SAAR;AACR,oBAAO,OAAP,GAAe;AACf,oBAAO,QAAC,CAAQ,GAAR;AACR,oBAAO,OAAC,CAAO,GAAP;AACR,oBAAO,SAAC,CAAS,GAAT;AACR,oBAAO,UAAC,CAAU,EAAV;AACR,oBAAO,YAAC,CAAY,iDAAZ;AACR,oBAAO,gBAAC,CAAc,CAAd;AACR,oBAAO,iBAAC,CAAiB,sBAAjB;AACR,oBAAO,YAAC,CAAY,CAAZ;AACR,oBAAO,gBAAC,CAAgB,sBAAhB;AACR,uBAAQ,CAAC,aAAS,KAAM,WAAY,cAA5B;AACR,uBAAQ,CAAC,aAAS,KAAM,UAAW,aAA3B;AACR,uBAAQ,CAAC,aAAS,KAAM,UAAW,cAA3B;AACR,qBAAQ,mBAAmB,CAAC,IAAD;AAC3B,qBAAQ,QAAC,CAAQ,UAAR;AACT,qBAAQ,QAAC,CAAQ,GAAR;AACT,qBAAQ,OAAC,CAAO,GAAP;AACT,qBAAQ,SAAC,CAAS,GAAT;AACT,qBAAQ,UAAC,CAAU,EAAV;AACT,qBAAQ,aAAC,CAAa,qCAAb;AACT,qBAAQ,YAAC,CAAY,iDAAZ;AACT,qBAAQ,gBAAC,CAAc,CAAd;AACT,qBAAQ,iBAAC,CAAiB,sBAAjB;AACT,qBAAQ,YAAC,CAAY,CAAZ;AACT,qBAAQ,gBAAC,CAAgB,sBAAhB;AACT,uBAAQ,CAAC,cAAU,KAAM,SAAU,cAA3B;AACR,kBAAK,mBAAmB,CAAC,IAAD;AACxB,kBAAK,QAAC,CAAQ,OAAR;AACN,kBAAK,QAAC,CAAQ,GAAR;AACN,kBAAK,OAAC,CAAO,GAAP;AACN,kBAAK,SAAC,CAAS,EAAT;AACN,kBAAK,UAAC,CAAU,EAAV;AACN,kBAAK,aAAC,CAAa,qCAAb;AACN,kBAAK,YAAC,CAAY,iDAAZ;AACN,kBAAK,gBAAC,CAAc,CAAd;AACN,kBAAK,iBAAC,CAAiB,sBAAjB;AACN,kBAAK,YAAC,CAAY,CAAZ;AACN,kBAAK,gBAAC,CAAgB,sBAAhB;AACN,uBAAQ,CAAC,WAAO,KAAM,SAAU,WAAxB;AACR,oBAAO,mBAAmB,CAAC,IAAD;AAC1B,oBAAO,QAAC,CAAQ,SAAR;AACR,oBAAO,QAAC,CAAQ,GAAR;AACR,oBAAO,OAAC,CAAO,GAAP;AACR,oBAAO,SAAC,CAAS,EAAT;AACR,oBAAO,UAAC,CAAU,EAAV;AACR,oBAAO,WAAC,CAAW,KAAX;AACR,oBAAO,aAAC,CAAa,qCAAb;AACR,oBAAO,YAAC,CAAY,iDAAZ;AACR,oBAAO,gBAAC,CAAc,CAAd;AACR,oBAAO,SAAC,CAAS,QAAT;AACR,oBAAO,iBAAC,CAAiB,sBAAjB;AACR,oBAAO,YAAC,CAAY,IAAZ;AACR,oBAAO,gBAAC,CAAgB,sBAAhB;AACR,oBAAO,mBAAmB,CAAC,IAAD;AAC1B,oBAAO,QAAC,CAAQ,SAAR;AACR,oBAAO,OAAP,GAAe;AACf,oBAAO,QAAC,CAAQ,GAAR;AACR,oBAAO,OAAC,CAAO,GAAP;AACR,oBAAO,SAAC,CAAS,GAAT;AACR,oBAAO,UAAC,CAAU,EAAV;AACR,oBAAO,YAAC,CAAY,iDAAZ;AACR,oBAAO,gBAAC,CAAc,CAAd;AACR,oBAAO,iBAAC,CAAiB,sBAAjB;AACR,oBAAO,YAAC,CAAY,EAAZ;AACR,oBAAO,gBAAC,CAAgB,sBAAhB;AACR,uBAAQ,CAAC,aAAS,KAAM,WAAY,cAA5B;AACR,uBAAQ,CAAC,aAAS,KAAM,UAAW,aAA3B;AACR,uBAAQ,CAAC,aAAS,KAAM,UAAW,cAA3B;AACR,qBAAQ,mBAAmB,CAAC,IAAD;AAC3B,qBAAQ,QAAC,CAAQ,UAAR;AACT,qBAAQ,QAAC,CAAQ,GAAR;AACT,qBAAQ,OAAC,CAAO,GAAP;AACT,qBAAQ,SAAC,CAAS,GAAT;AACT,qBAAQ,UAAC,CAAU,EAAV;AACT,qBAAQ,aAAC,CAAa,qCAAb;AACT,qBAAQ,YAAC,CAAY,iDAAZ;AACT,qBAAQ,gBAAC,CAAc,CAAd;AACT,qBAAQ,iBAAC,CAAiB,sBAAjB;AACT,qBAAQ,YAAC,CAAY,EAAZ;AACT,qBAAQ,gBAAC,CAAgB,sBAAhB;AACT,uBAAQ,CAAC,cAAU,KAAM,SAAU,cAA3B;AACR,kBAAK,mBAAmB,CAAC,IAAD;AACxB,kBAAK,QAAC,CAAQ,OAAR;AACN,kBAAK,QAAC,CAAQ,GAAR;AACN,kBAAK,OAAC,CAAO,GAAP;AACN,kBAAK,SAAC,CAAS,EAAT;AACN,kBAAK,UAAC,CAAU,EAAV;AACN,kBAAK,aAAC,CAAa,qCAAb;AACN,kBAAK,YAAC,CAAY,iDAAZ;AACN,kBAAK,gBAAC,CAAc,CAAd;AACN,kBAAK,iBAAC,CAAiB,sBAAjB;AACN,kBAAK,YAAC,CAAY,EAAZ;AACN,kBAAK,gBAAC,CAAgB,sBAAhB;AACN,uBAAQ,CAAC,WAAO,KAAM,SAAU,WAAxB;AACR,oBAAO,mBAAmB,CAAC,IAAD;AAC1B,oBAAO,QAAC,CAAQ,SAAR;AACR,oBAAO,QAAC,CAAQ,GAAR;AACR,oBAAO,OAAC,CAAO,GAAP;AACR,oBAAO,SAAC,CAAS,EAAT;AACR,oBAAO,UAAC,CAAU,EAAV;AACR,oBAAO,WAAC,CAAW,KAAX;AACR,oBAAO,aAAC,CAAa,qCAAb;AACR,oBAAO,YAAC,CAAY,iDAAZ;AACR,oBAAO,gBAAC,CAAc,CAAd;AACR,oBAAO,SAAC,CAAS,QAAT;AACR,oBAAO,iBAAC,CAAiB,sBAAjB;AACR,oBAAO,YAAC,CAAY,IAAZ;AACR,oBAAO,gBAAC,CAAgB,sBAAhB;AACR,oBAAO,mBAAmB,CAAC,IAAD;AAC1B,oBAAO,QAAC,CAAQ,SAAR;AACR,oBAAO,OAAP,GAAe;AACf,oBAAO,QAAC,CAAQ,GAAR;AACR,oBAAO,OAAC,CAAO,GAAP;AACR,oBAAO,SAAC,CAAS,GAAT;AACR,oBAAO,UAAC,CAAU,EAAV;AACR,oBAAO,YAAC,CAAY,iDAAZ;AACR,oBAAO,gBAAC,CAAc,CAAd;AACR,oBAAO,iBAAC,CAAiB,sBAAjB;AACR,oBAAO,YAAC,CAAY,EAAZ;AACR,oBAAO,gBAAC,CAAgB,sBAAhB;AACR,uBAAQ,CAAC,aAAS,KAAM,WAAY,cAA5B;AACR,uBAAQ,CAAC,aAAS,KAAM,UAAW,aAA3B;AACR,uBAAQ,CAAC,aAAS,KAAM,UAAW,cAA3B;AACR,qBAAQ,mBAAmB,CAAC,IAAD;AAC3B,qBAAQ,QAAC,CAAQ,UAAR;AACT,qBAAQ,QAAC,CAAQ,GAAR;AACT,qBAAQ,OAAC,CAAO,GAAP;AACT,qBAAQ,SAAC,CAAS,GAAT;AACT,qBAAQ,UAAC,CAAU,EAAV;AACT,qBAAQ,aAAC,CAAa,qCAAb;AACT,qBAAQ,YAAC,CAAY,iDAAZ;AACT,qBAAQ,gBAAC,CAAc,CAAd;AACT,qBAAQ,iBAAC,CAAiB,sBAAjB;AACT,qBAAQ,YAAC,CAAY,EAAZ;AACT,qBAAQ,gBAAC,CAAgB,sBAAhB;AACT,uBAAQ,CAAC,cAAU,KAAM,SAAU,cAA3B;AACR,kBAAK,mBAAmB,CAAC,IAAD;AACxB,kBAAK,QAAC,CAAQ,OAAR;AACN,kBAAK,QAAC,CAAQ,GAAR;AACN,kBAAK,OAAC,CAAO,GAAP;AACN,kBAAK,SAAC,CAAS,EAAT;AACN,kBAAK,UAAC,CAAU,EAAV;AACN,kBAAK,aAAC,CAAa,qCAAb;AACN,kBAAK,YAAC,CAAY,iDAAZ;AACN,kBAAK,gBAAC,CAAc,CAAd;AACN,kBAAK,iBAAC,CAAiB,sBAAjB;AACN,kBAAK,YAAC,CAAY,EAAZ;AACN,kBAAK,gBAAC,CAAgB,sBAAhB;AACN,uBAAQ,CAAC,WAAO,KAAM,SAAU,WAAxB;AACR,oBAAO,mBAAmB,CAAC,IAAD;AAC1B,oBAAO,QAAC,CAAQ,SAAR;AACR,oBAAO,QAAC,CAAQ,GAAR;AACR,oBAAO,OAAC,CAAO,GAAP;AACR,oBAAO,SAAC,CAAS,EAAT;AACR,oBAAO,UAAC,CAAU,EAAV;AACR,oBAAO,WAAC,CAAW,KAAX;AACR,oBAAO,aAAC,CAAa,qCAAb;AACR,oBAAO,YAAC,CAAY,iDAAZ;AACR,oBAAO,gBAAC,CAAc,CAAd;AACR,oBAAO,SAAC,CAAS,QAAT;AACR,oBAAO,iBAAC,CAAiB,sBAAjB;AACR,oBAAO,YAAC,CAAY,IAAZ;AACR,oBAAO,gBAAC,CAAgB,sBAAhB;AACR,oBAAO,mBAAmB,CAAC,IAAD;AAC1B,oBAAO,QAAC,CAAQ,SAAR;AACR,oBAAO,OAAP,GAAe;AACf,oBAAO,QAAC,CAAQ,GAAR;AACR,oBAAO,OAAC,CAAO,GAAP;AACR,oBAAO,SAAC,CAAS,GAAT;AACR,oBAAO,UAAC,CAAU,EAAV;AACR,oBAAO,YAAC,CAAY,iDAAZ;AACR,oBAAO,gBAAC,CAAc,CAAd;AACR,oBAAO,iBAAC,CAAiB,sBAAjB;AACR,oBAAO,YAAC,CAAY,EAAZ;AACR,oBAAO,gBAAC,CAAgB,sBAAhB;AACR,uBAAQ,CAAC,aAAS,KAAM,WAAY,cAA5B;AACR,uBAAQ,CAAC,aAAS,KAAM,UAAW,aAA3B;AACR,uBAAQ,CAAC,aAAS,KAAM,UAAW,cAA3B;AACR,qBAAQ,mBAAmB,CAAC,IAAD;AAC3B,qBAAQ,QAAC,CAAQ,UAAR;AACT,qBAAQ,QAAC,CAAQ,GAAR;AACT,qBAAQ,OAAC,CAAO,GAAP;AACT,qBAAQ,SAAC,CAAS,GAAT;AACT,qBAAQ,UAAC,CAAU,EAAV;AACT,qBAAQ,aAAC,CAAa,qCAAb;AACT,qBAAQ,YAAC,CAAY,iDAAZ;AACT,qBAAQ,gBAAC,CAAc,CAAd;AACT,qBAAQ,iBAAC,CAAiB,sBAAjB;AACT,qBAAQ,YAAC,CAAY,EAAZ;AACT,qBAAQ,gBAAC,CAAgB,sBAAhB;AACT,uBAAQ,CAAC,cAAU,KAAM,SAAU,cAA3B;AACR,kBAAK,mBAAmB,CAAC,IAAD;AACxB,kBAAK,QAAC,CAAQ,OAAR;AACN,kBAAK,QAAC,CAAQ,GAAR;AACN,kBAAK,OAAC,CAAO,GAAP;AACN,kBAAK,SAAC,CAAS,EAAT;AACN,kBAAK,UAAC,CAAU,EAAV;AACN,kBAAK,aAAC,CAAa,qCAAb;AACN,kBAAK,YAAC,CAAY,iDAAZ;AACN,kBAAK,gBAAC,CAAc,CAAd;AACN,kBAAK,iBAAC,CAAiB,sBAAjB;AACN,kBAAK,YAAC,CAAY,EAAZ;AACN,kBAAK,gBAAC,CAAgB,sBAAhB;AACN,uBAAQ,CAAC,WAAO,KAAM,SAAU,WAAxB;AACR,oBAAO,mBAAmB,CAAC,IAAD;AAC1B,oBAAO,QAAC,CAAQ,SAAR;AACR,oBAAO,QAAC,CAAQ,GAAR;AACR,oBAAO,OAAC,CAAO,GAAP;AACR,oBAAO,SAAC,CAAS,EAAT;AACR,oBAAO,UAAC,CAAU,EAAV;AACR,oBAAO,WAAC,CAAW,KAAX;AACR,oBAAO,aAAC,CAAa,qCAAb;AACR,oBAAO,YAAC,CAAY,iDAAZ;AACR,oBAAO,gBAAC,CAAc,CAAd;AACR,oBAAO,SAAC,CAAS,QAAT;AACR,oBAAO,iBAAC,CAAiB,sBAAjB;AACR,oBAAO,YAAC,CAAY,IAAZ;AACR,oBAAO,gBAAC,CAAgB,sBAAhB;AACR,oBAAO,mBAAmB,CAAC,IAAD;AAC1B,oBAAO,QAAC,CAAQ,SAAR;AACR,oBAAO,OAAP,GAAe;AACf,oBAAO,QAAC,CAAQ,GAAR;AACR,oBAAO,OAAC,CAAO,GAAP;AACR,oBAAO,SAAC,CAAS,GAAT;AACR,oBAAO,UAAC,CAAU,EAAV;AACR,oBAAO,YAAC,CAAY,iDAAZ;AACR,oBAAO,gBAAC,CAAc,CAAd;AACR,oBAAO,iBAAC,CAAiB,sBAAjB;AACR,oBAAO,YAAC,CAAY,EAAZ;AACR,oBAAO,gBAAC,CAAgB,sBAAhB;AACR,uBAAQ,CAAC,aAAS,KAAM,WAAY,cAA5B;AACR,uBAAQ,CAAC,aAAS,KAAM,UAAW,aAA3B;AACR,uBAAQ,CAAC,aAAS,KAAM,UAAW,cAA3B;AACR,qBAAQ,mBAAmB,CAAC,IAAD;AAC3B,qBAAQ,QAAC,CAAQ,UAAR;AACT,qBAAQ,QAAC,CAAQ,GAAR;AACT,qBAAQ,OAAC,CAAO,GAAP;AACT,qBAAQ,SAAC,CAAS,GAAT;AACT,qBAAQ,UAAC,CAAU,EAAV;AACT,qBAAQ,aAAC,CAAa,qCAAb;AACT,qBAAQ,YAAC,CAAY,iDAAZ;AACT,qBAAQ,gBAAC,CAAc,CAAd;AACT,qBAAQ,iBAAC,CAAiB,sBAAjB;AACT,qBAAQ,YAAC,CAAY,EAAZ;AACT,qBAAQ,gBAAC,CAAgB,sBAAhB;AACT,uBAAQ,CAAC,cAAU,KAAM,SAAU,cAA3B;AACR,kBAAK,mBAAmB,CAAC,IAAD;AACxB,kBAAK,QAAC,CAAQ,OAAR;AACN,kBAAK,QAAC,CAAQ,GAAR;AACN,kBAAK,OAAC,CAAO,GAAP;AACN,kBAAK,SAAC,CAAS,EAAT;AACN,kBAAK,UAAC,CAAU,EAAV;AACN,kBAAK,aAAC,CAAa,qCAAb;AACN,kBAAK,YAAC,CAAY,iDAAZ;AACN,kBAAK,gBAAC,CAAc,CAAd;AACN,kBAAK,iBAAC,CAAiB,sBAAjB;AACN,kBAAK,gBAAC,CAAgB,sBAAhB;AACN,uBAAQ,CAAC,WAAO,KAAM,SAAU,WAAxB;AACR,oBAAO,mBAAmB,CAAC,IAAD;AAC1B,oBAAO,QAAC,CAAQ,SAAR;AACR,oBAAO,QAAC,CAAQ,GAAR;AACR,oBAAO,OAAC,CAAO,GAAP;AACR,oBAAO,SAAC,CAAS,EAAT;AACR,oBAAO,UAAC,CAAU,EAAV;AACR,oBAAO,WAAC,CAAW,KAAX;AACR,oBAAO,aAAC,CAAa,qCAAb;AACR,oBAAO,YAAC,CAAY,iDAAZ;AACR,oBAAO,gBAAC,CAAc,CAAd;AACR,oBAAO,SAAC,CAAS,QAAT;AACR,oBAAO,iBAAC,CAAiB,sBAAjB;AACR,oBAAO,YAAC,CAAY,IAAZ;AACR,oBAAO,gBAAC,CAAgB,sBAAhB;AACR,oBAAO,mBAAmB,CAAC,IAAD;AAC1B,oBAAO,QAAC,CAAQ,SAAR;AACR,oBAAO,OAAP,GAAe;AACf,oBAAO,QAAC,CAAQ,GAAR;AACR,oBAAO,OAAC,CAAO,GAAP;AACR,oBAAO,SAAC,CAAS,GAAT;AACR,oBAAO,UAAC,CAAU,EAAV;AACR,oBAAO,YAAC,CAAY,iDAAZ;AACR,oBAAO,gBAAC,CAAc,CAAd;AACR,oBAAO,iBAAC,CAAiB,sBAAjB;AACR,oBAAO,gBAAC,CAAgB,sBAAhB;AACR,uBAAQ,CAAC,aAAS,KAAM,WAAY,cAA5B;AACR,uBAAQ,CAAC,aAAS,KAAM,UAAW,aAA3B;AACR,uBAAQ,CAAC,aAAS,KAAM,UAAW,cAA3B;AACR,qBAAQ,mBAAmB,CAAC,IAAD;AAC3B,qBAAQ,QAAC,CAAQ,UAAR;AACT,qBAAQ,QAAC,CAAQ,GAAR;AACT,qBAAQ,OAAC,CAAO,GAAP;AACT,qBAAQ,SAAC,CAAS,GAAT;AACT,qBAAQ,UAAC,CAAU,EAAV;AACT,qBAAQ,aAAC,CAAa,qCAAb;AACT,qBAAQ,YAAC,CAAY,iDAAZ;AACT,qBAAQ,gBAAC,CAAc,CAAd;AACT,qBAAQ,iBAAC,CAAiB,sBAAjB;AACT,qBAAQ,gBAAC,CAAgB,sBAAhB;AACT,uBAAQ,CAAC,cAAU,KAAM,SAAU,cAA3B;AACR,kBAAK,mBAAmB,CAAC,IAAD;AACxB,kBAAK,QAAC,CAAQ,OAAR;AACN,kBAAK,QAAC,CAAQ,GAAR;AACN,kBAAK,OAAC,CAAO,GAAP;AACN,kBAAK,SAAC,CAAS,EAAT;AACN,kBAAK,UAAC,CAAU,EAAV;AACN,kBAAK,aAAC,CAAa,qCAAb;AACN,kBAAK,YAAC,CAAY,iDAAZ;AACN,kBAAK,gBAAC,CAAc,CAAd;AACN,kBAAK,iBAAC,CAAiB,sBAAjB;AACN,kBAAK,gBAAC,CAAgB,sBAAhB;AACN,uBAAQ,CAAC,WAAO,KAAM,SAAU,WAAxB;AACR,oBAAO,mBAAmB,CAAC,IAAD;AAC1B,oBAAO,QAAC,CAAQ,SAAR;AACR,oBAAO,QAAC,CAAQ,GAAR;AACR,oBAAO,OAAC,CAAO,GAAP;AACR,oBAAO,SAAC,CAAS,EAAT;AACR,oBAAO,UAAC,CAAU,EAAV;AACR,oBAAO,WAAC,CAAW,KAAX;AACR,oBAAO,aAAC,CAAa,qCAAb;AACR,oBAAO,YAAC,CAAY,iDAAZ;AACR,oBAAO,gBAAC,CAAc,CAAd;AACR,oBAAO,SAAC,CAAS,QAAT;AACR,oBAAO,iBAAC,CAAiB,sBAAjB;AACR,oBAAO,YAAC,CAAY,IAAZ;AACR,oBAAO,gBAAC,CAAgB,sBAAhB;AACR,oBAAO,mBAAmB,CAAC,IAAD;AAC1B,oBAAO,QAAC,CAAQ,SAAR;AACR,oBAAO,OAAP,GAAe;AACf,oBAAO,QAAC,CAAQ,GAAR;AACR,oBAAO,OAAC,CAAO,GAAP;AACR,oBAAO,SAAC,CAAS,GAAT;AACR,oBAAO,UAAC,CAAU,EAAV;AACR,oBAAO,YAAC,CAAY,iDAAZ;AACR,oBAAO,gBAAC,CAAc,CAAd;AACR,oBAAO,iBAAC,CAAiB,sBAAjB;AACR,oBAAO,gBAAC,CAAgB,sBAAhB;AACR,uBAAQ,CAAC,aAAS,KAAM,WAAY,cAA5B;AACR,uBAAQ,CAAC,aAAS,KAAM,UAAW,aAA3B;AACR,uBAAQ,CAAC,aAAS,KAAM,UAAW,cAA3B;AACR,qBAAQ,mBAAmB,CAAC,IAAD;AAC3B,qBAAQ,QAAC,CAAQ,UAAR;AACT,qBAAQ,QAAC,CAAQ,GAAR;AACT,qBAAQ,OAAC,CAAO,GAAP;AACT,qBAAQ,SAAC,CAAS,GAAT;AACT,qBAAQ,UAAC,CAAU,EAAV;AACT,qBAAQ,aAAC,CAAa,qCAAb;AACT,qBAAQ,YAAC,CAAY,iDAAZ;AACT,qBAAQ,gBAAC,CAAc,CAAd;AACT,qBAAQ,iBAAC,CAAiB,sBAAjB;AACT,qBAAQ,gBAAC,CAAgB,sBAAhB;AACT,uBAAQ,CAAC,cAAU,KAAM,SAAU,cAA3B;AACR,kBAAK,mBAAmB,CAAC,IAAD;AACxB,kBAAK,QAAC,CAAQ,OAAR;AACN,kBAAK,QAAC,CAAQ,GAAR;AACN,kBAAK,OAAC,CAAO,GAAP;AACN,kBAAK,SAAC,CAAS,EAAT;AACN,kBAAK,UAAC,CAAU,EAAV;AACN,kBAAK,aAAC,CAAa,qCAAb;AACN,kBAAK,YAAC,CAAY,iDAAZ;AACN,kBAAK,gBAAC,CAAc,CAAd;AACN,kBAAK,iBAAC,CAAiB,sBAAjB;AACN,kBAAK,gBAAC,CAAgB,sBAAhB;AACN,uBAAQ,CAAC,WAAO,KAAM,SAAU,WAAxB;AACR,oBAAO,mBAAmB,CAAC,IAAD;AAC1B,oBAAO,QAAC,CAAQ,SAAR;AACR,oBAAO,QAAC,CAAQ,GAAR;AACR,oBAAO,OAAC,CAAO,GAAP;AACR,oBAAO,SAAC,CAAS,EAAT;AACR,oBAAO,UAAC,CAAU,EAAV;AACR,oBAAO,WAAC,CAAW,KAAX;AACR,oBAAO,aAAC,CAAa,qCAAb;AACR,oBAAO,YAAC,CAAY,iDAAZ;AACR,oBAAO,gBAAC,CAAc,CAAd;AACR,oBAAO,SAAC,CAAS,QAAT;AACR,oBAAO,iBAAC,CAAiB,sBAAjB;AACR,oBAAO,YAAC,CAAY,IAAZ;AACR,oBAAO,gBAAC,CAAgB,sBAAhB;AACR,qBAAQ,mBAAmB,CAAC,IAAD;AAC3B,qBAAQ,QAAC,CAAQ,UAAR;AACT,qBAAQ,OAAR,GAAgB;AAChB,qBAAQ,QAAC,CAAQ,GAAR;AACT,qBAAQ,OAAC,CAAO,GAAP;AACT,qBAAQ,SAAC,CAAS,GAAT;AACT,qBAAQ,UAAC,CAAU,EAAV;AACT,qBAAQ,YAAC,CAAY,iDAAZ;AACT,qBAAQ,gBAAC,CAAc,CAAd;AACT,qBAAQ,iBAAC,CAAiB,sBAAjB;AACT,qBAAQ,gBAAC,CAAgB,sBAAhB;AACT,uBAAQ,CAAC,cAAU,KAAM,WAAY,cAA7B;AACR,uBAAQ,CAAC,cAAU,KAAM,UAAW,aAA5B;AACR,uBAAQ,CAAC,cAAU,KAAM,UAAW,cAA5B;AACR,sBAAS,mBAAmB,CAAC,IAAD;AAC5B,sBAAS,QAAC,CAAQ,WAAR;AACV,sBAAS,QAAC,CAAQ,GAAR;AACV,sBAAS,OAAC,CAAO,GAAP;AACV,sBAAS,SAAC,CAAS,GAAT;AACV,sBAAS,UAAC,CAAU,EAAV;AACV,sBAAS,aAAC,CAAa,qCAAb;AACV,sBAAS,YAAC,CAAY,iDAAZ;AACV,sBAAS,gBAAC,CAAc,CAAd;AACV,sBAAS,iBAAC,CAAiB,sBAAjB;AACV,sBAAS,gBAAC,CAAgB,sBAAhB;AACV,uBAAQ,CAAC,eAAW,KAAM,SAAU,cAA5B;AACR,mBAAM,mBAAmB,CAAC,IAAD;AACzB,mBAAM,QAAC,CAAQ,QAAR;AACP,mBAAM,QAAC,CAAQ,GAAR;AACP,mBAAM,OAAC,CAAO,GAAP;AACP,mBAAM,SAAC,CAAS,EAAT;AACP,mBAAM,UAAC,CAAU,EAAV;AACP,mBAAM,aAAC,CAAa,qCAAb;AACP,mBAAM,YAAC,CAAY,iDAAZ;AACP,mBAAM,gBAAC,CAAc,CAAd;AACP,mBAAM,iBAAC,CAAiB,sBAAjB;AACP,mBAAM,gBAAC,CAAgB,sBAAhB;AACP,uBAAQ,CAAC,YAAQ,KAAM,SAAU,WAAzB;AACR,qBAAQ,mBAAmB,CAAC,IAAD;AAC3B,qBAAQ,QAAC,CAAQ,UAAR;AACT,qBAAQ,QAAC,CAAQ,GAAR;AACT,qBAAQ,OAAC,CAAO,GAAP;AACT,qBAAQ,SAAC,CAAS,EAAT;AACT,qBAAQ,UAAC,CAAU,EAAV;AACT,qBAAQ,WAAC,CAAW,KAAX;AACT,qBAAQ,aAAC,CAAa,qCAAb;AACT,qBAAQ,YAAC,CAAY,iDAAZ;AACT,qBAAQ,gBAAC,CAAc,CAAd;AACT,qBAAQ,SAAC,CAAS,QAAT;AACT,qBAAQ,iBAAC,CAAiB,sBAAjB;AACT,qBAAQ,YAAC,CAAY,IAAZ;AACT,qBAAQ,gBAAC,CAAgB,sBAAhB;AACT,qBAAQ,mBAAmB,CAAC,IAAD;AAC3B,qBAAQ,QAAC,CAAQ,UAAR;AACT,qBAAQ,OAAR,GAAgB;AAChB,qBAAQ,QAAC,CAAQ,GAAR;AACT,qBAAQ,OAAC,CAAO,GAAP;AACT,qBAAQ,SAAC,CAAS,GAAT;AACT,qBAAQ,UAAC,CAAU,EAAV;AACT,qBAAQ,YAAC,CAAY,iDAAZ;AACT,qBAAQ,gBAAC,CAAc,CAAd;AACT,qBAAQ,iBAAC,CAAiB,sBAAjB;AACT,qBAAQ,WAAC,CAAW,KAAX;AACT,qBAAQ,gBAAC,CAAgB,sBAAhB;AACT,uBAAQ,CAAC,cAAU,KAAM,WAAY,cAA7B;AACR,uBAAQ,CAAC,cAAU,KAAM,UAAW,aAA5B;AACR,uBAAQ,CAAC,cAAU,KAAM,UAAW,cAA5B;AACR,sBAAS,mBAAmB,CAAC,IAAD;AAC5B,sBAAS,QAAC,CAAQ,WAAR;AACV,sBAAS,QAAC,CAAQ,GAAR;AACV,sBAAS,OAAC,CAAO,GAAP;AACV,sBAAS,SAAC,CAAS,GAAT;AACV,sBAAS,UAAC,CAAU,EAAV;AACV,sBAAS,aAAC,CAAa,qCAAb;AACV,sBAAS,YAAC,CAAY,iDAAZ;AACV,sBAAS,gBAAC,CAAc,CAAd;AACV,sBAAS,iBAAC,CAAiB,sBAAjB;AACV,sBAAS,WAAC,CAAW,KAAX;AACV,sBAAS,gBAAC,CAAgB,sBAAhB;AACV,uBAAQ,CAAC,eAAW,KAAM,SAAU,cAA5B;AACR,mBAAM,mBAAmB,CAAC,IAAD;AACzB,mBAAM,QAAC,CAAQ,QAAR;AACP,mBAAM,QAAC,CAAQ,GAAR;AACP,mBAAM,OAAC,CAAO,GAAP;AACP,mBAAM,SAAC,CAAS,EAAT;AACP,mBAAM,UAAC,CAAU,EAAV;AACP,mBAAM,aAAC,CAAa,qCAAb;AACP,mBAAM,YAAC,CAAY,iDAAZ;AACP,mBAAM,gBAAC,CAAc,CAAd;AACP,mBAAM,iBAAC,CAAiB,sBAAjB;AACP,mBAAM,WAAC,CAAW,KAAX;AACP,mBAAM,gBAAC,CAAgB,sBAAhB;AACP,uBAAQ,CAAC,YAAQ,KAAM,SAAU,WAAzB;AACR,qBAAQ,mBAAmB,CAAC,IAAD;AAC3B,qBAAQ,QAAC,CAAQ,UAAR;AACT,qBAAQ,QAAC,CAAQ,GAAR;AACT,qBAAQ,OAAC,CAAO,GAAP;AACT,qBAAQ,SAAC,CAAS,EAAT;AACT,qBAAQ,UAAC,CAAU,EAAV;AACT,qBAAQ,WAAC,CAAW,KAAX;AACT,qBAAQ,aAAC,CAAa,qCAAb;AACT,qBAAQ,YAAC,CAAY,iDAAZ;AACT,qBAAQ,gBAAC,CAAc,CAAd;AACT,qBAAQ,SAAC,CAAS,QAAT;AACT,qBAAQ,iBAAC,CAAiB,sBAAjB;AACT,qBAAQ,YAAC,CAAY,IAAZ;AACT,qBAAQ,WAAC,CAAW,KAAX;AACT,qBAAQ,gBAAC,CAAgB,sBAAhB;AACT,qBAAQ,mBAAmB,CAAC,IAAD;AAC3B,qBAAQ,QAAC,CAAQ,UAAR;AACT,qBAAQ,OAAR,GAAgB;AAChB,qBAAQ,QAAC,CAAQ,GAAR;AACT,qBAAQ,OAAC,CAAO,GAAP;AACT,qBAAQ,SAAC,CAAS,GAAT;AACT,qBAAQ,UAAC,CAAU,EAAV;AACT,qBAAQ,YAAC,CAAY,iDAAZ;AACT,qBAAQ,gBAAC,CAAc,CAAd;AACT,qBAAQ,iBAAC,CAAiB,sBAAjB;AACT,qBAAQ,WAAC,CAAW,KAAX;AACT,qBAAQ,gBAAC,CAAgB,sBAAhB;AACT,uBAAQ,CAAC,cAAU,KAAM,WAAY,cAA7B;AACR,uBAAQ,CAAC,cAAU,KAAM,UAAW,aAA5B;AACR,uBAAQ,CAAC,cAAU,KAAM,UAAW,cAA5B;AACR,sBAAS,mBAAmB,CAAC,IAAD;AAC5B,sBAAS,QAAC,CAAQ,WAAR;AACV,sBAAS,QAAC,CAAQ,GAAR;AACV,sBAAS,OAAC,CAAO,GAAP;AACV,sBAAS,SAAC,CAAS,GAAT;AACV,sBAAS,UAAC,CAAU,EAAV;AACV,sBAAS,aAAC,CAAa,qCAAb;AACV,sBAAS,YAAC,CAAY,iDAAZ;AACV,sBAAS,gBAAC,CAAc,CAAd;AACV,sBAAS,iBAAC,CAAiB,sBAAjB;AACV,sBAAS,WAAC,CAAW,KAAX;AACV,sBAAS,gBAAC,CAAgB,sBAAhB;AACV,uBAAQ,CAAC,eAAW,KAAM,SAAU,cAA5B;AACR,mBAAM,mBAAmB,CAAC,IAAD;AACzB,mBAAM,QAAC,CAAQ,QAAR;AACP,mBAAM,QAAC,CAAQ,GAAR;AACP,mBAAM,OAAC,CAAO,GAAP;AACP,mBAAM,SAAC,CAAS,EAAT;AACP,mBAAM,UAAC,CAAU,EAAV;AACP,mBAAM,aAAC,CAAa,qCAAb;AACP,mBAAM,YAAC,CAAY,iDAAZ;AACP,mBAAM,gBAAC,CAAc,CAAd;AACP,mBAAM,iBAAC,CAAiB,sBAAjB;AACP,mBAAM,WAAC,CAAW,KAAX;AACP,mBAAM,gBAAC,CAAgB,sBAAhB;AACP,uBAAQ,CAAC,YAAQ,KAAM,SAAU,WAAzB;AACR,qBAAQ,mBAAmB,CAAC,IAAD;AAC3B,qBAAQ,QAAC,CAAQ,UAAR;AACT,qBAAQ,QAAC,CAAQ,GAAR;AACT,qBAAQ,OAAC,CAAO,GAAP;AACT,qBAAQ,SAAC,CAAS,EAAT;AACT,qBAAQ,UAAC,CAAU,EAAV;AACT,qBAAQ,WAAC,CAAW,KAAX;AACT,qBAAQ,aAAC,CAAa,qCAAb;AACT,qBAAQ,YAAC,CAAY,iDAAZ;AACT,qBAAQ,gBAAC,CAAc,CAAd;AACT,qBAAQ,SAAC,CAAS,QAAT;AACT,qBAAQ,iBAAC,CAAiB,sBAAjB;AACT,qBAAQ,YAAC,CAAY,IAAZ;AACT,qBAAQ,WAAC,CAAW,KAAX;AACT,qBAAQ,gBAAC,CAAgB,sBAAhB;AACT,mBAAM,mBAAmB,CAAC,IAAD;AACzB,mBAAM,QAAC,CAAQ,QAAR;AACP,mBAAM,QAAC,CAAQ,CAAR;AACP,mBAAM,OAAC,CAAO,CAAP;AACP,mBAAM,SAAC,CAAS,GAAT;AACP,mBAAM,UAAC,CAAU,EAAV;AACP,mBAAM,iBAAC,CAAiB,sBAAjB;AACP,mBAAM,gBAAC,CAAgB,sBAAhB;AACP,mBAAM,SAAC,CAAS,mCAAT;AACP,mBAAM,eAAC,CAAe,QAAf;AACP,mBAAM,eAAC,CAAe,4CAAf;AACP,mBAAM,gBAAC,CAAc,CAAd;AACP,oBAAO,mBAAmB,CAAC,WAAD;AAC1B,oBAAO,QAAC,CAAQ,SAAR;AACR,oBAAO,QAAC,CAAQ,CAAR;AACR,oBAAO,OAAC,CAAO,CAAP;AACR,oBAAO,SAAC,CAAS,GAAT;AACR,oBAAO,UAAC,CAAU,EAAV;AACR,oBAAO,cAAC,CAAc,wCAAd;AACR,oBAAO,iBAAC,CAAiB,sBAAjB;AACR,oBAAO,gBAAC,CAAgB,sBAAhB;AACR,oBAAO,SAAC,CAAS,sCAAT;AA9xBV;AAgyBE,sBAAS;AACT,sBAAS;AACT,sBAAS;AACT,sBAAS;AACT,sBAAS;AACT,gBAAG;AACH,oBAAO;AACP,mBAAM;AACN,qBAAQ;AACR,kBAAK;AACL,oBAAO;AACP,yBAAY;AACZ,sBAAS;AACT,0BAAa;AACb,oBAAO;AACP,qBAAQ;AACR,kBAAK;AACL,oBAAO;AACP,oBAAO;AACP,qBAAQ;AACR,kBAAK;AACL,oBAAO;AACP,oBAAO;AACP,qBAAQ;AACR,kBAAK;AACL,oBAAO;AACP,oBAAO;AACP,qBAAQ;AACR,kBAAK;AACL,oBAAO;AACP,oBAAO;AACP,qBAAQ;AACR,kBAAK;AACL,oBAAO;AACP,oBAAO;AACP,qBAAQ;AACR,kBAAK;AACL,oBAAO;AACP,oBAAO;AACP,qBAAQ;AACR,kBAAK;AACL,oBAAO;AACP,oBAAO;AACP,qBAAQ;AACR,kBAAK;AACL,oBAAO;AACP,qBAAQ;AACR,sBAAS;AACT,mBAAM;AACN,qBAAQ;AACR,qBAAQ;AACR,sBAAS;AACT,mBAAM;AACN,qBAAQ;AACR,qBAAQ;AACR,sBAAS;AACT,mBAAM;AACN,qBAAQ;AACR,mBAAM;AACN,oBAAO;AA31BT;AA7H2B;AAvctB;;AACH,sBlD0wBM,wCkD1wBN;AACA,0BlDyQG,qCkDzQH;AACA,yBlD2hBK,uCkD3hBL;AACA,4BlD+FI,sCkD/FJ;AACA,2BlDsQG,qCkDtQH;AACA,4BlD6FI,sCkD7FJ;AACA,wBlDoQG,qCkDpQH;AACA,4BlD2FI,sCkD3FJ;AACA,0BlDkQG,qCkDlQH;AACA,4BlDyFI,sCkDzFJ;AACA,+BlDgQG,qCkDhQH;AACA,4BlD+PG,qCkD/PH;AACA,gClD8PG,qCkD9PH;AACA,4BlDqFI,sCkDrFJ;AACA,0BlD4PG,qCkD5PH;AACA,2BlD2PG,qCkD3PH;AACA,wBlD0PG,qCkD1PH;AACA,0BlDyPG,qCkDzPH;AACA,0BlDwPG,qCkDxPH;AACA,2BlDuPG,qCkDvPH;AACA,wBlDsPG,qCkDtPH;AACA,0BlDqPG,qCkDrPH;AACA,0BlDoPG,qCkDpPH;AACA,2BlDmPG,qCkDnPH;AACA,wBlDkPG,qCkDlPH;AACA,0BlDiPG,qCkDjPH;AACA,0BlDgPG,qCkDhPH;AACA,2BlD+OG,qCkD/OH;AACA,wBlD8OG,qCkD9OH;AACA,0BlD6OG,qCkD7OH;AACA,0BlD4OG,qCkD5OH;AACA,2BlD2OG,qCkD3OH;AACA,wBlD0OG,qCkD1OH;AACA,0BlDyOG,qCkDzOH;AACA,0BlDwOG,qCkDxOH;AACA,2BlDuOG,qCkDvOH;AACA,wBlDsOG,qCkDtOH;AACA,0BlDqOG,qCkDrOH;AACA,0BlDoOG,qCkDpOH;AACA,2BlDmOG,qCkDnOH;AACA,wBlDkOG,qCkDlOH;AACA,0BlDiOG,qCkDjOH;AACA,0BlDgOG,qCkDhOH;AACA,2BlD+NG,qCkD/NH;AACA,wBlD8NG,qCkD9NH;AACA,0BlD6NG,qCkD7NH;AACA,2BlD4NG,qCkD5NH;AACA,4BlD2NG,qCkD3NH;AACA,yBlD0NG,qCkD1NH;AACA,2BlDyNG,qCkDzNH;AACA,2BlDwNG,qCkDxNH;AACA,4BlDuNG,qCkDvNH;AACA,yBlDsNG,qCkDtNH;AACA,2BlDqNG,qCkDrNH;AACA,2BlDoNG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AwB,SAAU,MAAO,GAAE,gCAA3C;AACA,UAAG,cAAG,CAAC,IAAK,CAAN,CAAS,GAAE,CAAjB,EAAwB,SAAU,MAAO,GAAE,sBAA3C;AACA,UAAG,cAAG,CAAC,IAAK,CAAN,CAAS,GAAE,CAAjB,EAAwB,SAAU,MAAO,GAAE,gDAA3C;AAjBiB;AAAc;AAoBP;AAAP;AAEnB,UAAG,+BAAY,eAAe,CAAC,SAAD,CAAY,KAAE,GAA5C;AAAqD,iBAAU,aAAQ;AAChE,qBAAU,aAAQ;AAHN;AAAO;AAoPO;AAEtB;AAGV;AACE,qBAAQ,WAAR;AACA,qBAAQ,CAAC,KAAM,WAAY,iBAAnB;AACR,qBAAQ,CAAC,KAAM,YAAa,kBAApB;AACR,uBAAU;AACV,sBAAS;AALX;;AALgC;AA5oBtB;;AACiB,sCAAO,UhFD3B,2BgFC2B,CAAP;AACC,uCAAO,UhFF5B,2BgFE4B,CAAP;AAFlB;AAoBV;AACA;AACA;AACA;AArJF,mBAuJc;AAWH,kBAAG;AACH,kBAAG;AAZA;AAvJd,GAuJc,2FAvJd;ACAA,oBAES,iOAFT;;;AAWY;;AAGH;;;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AA8BA;AACA;AAkBA;AACA;AAnJK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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sCwD7WJ;AACA,6BzDyDI,sCyDzDJ;AACA,4BzDgOG,qCyDhOH;AACA,6BzDuDI,sCyDvDJ;AACA,4BzD8NG,qCyD9NH;AACA,6BxDwWI,sCwDxWJ;AACA,6BzDoDI,sCyDpDJ;AACA,4BzD2NG,qCyD3NH;AACA,6BxDqWI,sCwDrWJ;AACA,6BzDiDI,sCyDjDJ;AACA,4BzDwNG,qCyDxNH;AACA,iCxDkWI,sCwDlWJ;AACA,6BzD8CI,sCyD9CJ;AACA,4BzDqNG,qCyDrNH;AACA,0BxD+VI,sCwD/VJ;AACA,0BzDseK,uCyDteL;AACA,4BzDkNG,qCyDlNH;AACA,4BzDiNG,qCyDjNH;AACA,6BzDwCI,sCyDxCJ;AACA,6BzDuCI,sCyDvCJ;AACA,6BzDsCI,sCyDtCJ;AACA,+BzDu5BO,yCyDv5BP;AACA,6BzDoCI,sCyDpCJ;AACA,6BzDmCI,sCyDnCJ;AACA,6BzDkCI,sCyDlCJ;AACA,+BzDm5BO,yCyDn5BP;AACA,+BzDk5BO,yCyDl5BP;AACA,6BzD+BI,sCyD/BJ;AACA,4BzDsMG,qCyDtMH;AACA,yBxDiFI,sCwDjFJ;AACA,4BxD+UI,sCwD/UJ;AACA,2BxD8UI,sCwD9UJ;AACA,2BzD0BI,sCyD1BJ;AACA,2BzDiMG,qCyDjMH;AACA,2BzDmdK,uCyDndL;AACA,6BzDuBI,sCyDvBJ;AACA,wBzD8LG,qCyD9LH;AACA,6BzDqBI,sCyDrBJ;AACA,yBxDwEI,sCwDxEJ;AACA,4BzDmBI,sCyDnBJ;AACA,4BxDqUI,sCwDrUJ;AACA,6BzDiBI,sCyDjBJ;AACA,6BzDgBI,sCyDhBJ;AACA,6BzDeI,sCyDfJ;AACA,6BzDcI,sCyDdJ;AACA,8BzDqLG,qCyDrLH;AACA,8BzDucK,uCyDvcL;AACA,2BzDmLG,qCyDnLH;AACA,4BxD6TI,sCwD7TJ;AACA,6BzDSI,sCyDTJ;AACA,6BzDQI,sCyDRJ;AACA,yBxD0TI,sCwD1TJ;AACA,0BxDmNW,6CwDnNX;AACA,iCxDwTI,sCwDxTJ;AACA,iCzDII,sCyDJJ;AACA,iCzDGI,sCyDHJ;AACA,iCzDEI,sCyDFJ;AACA,4BzDCI,sCyDDJ;AACA,kChEUU,2CgEVV;AACqB,kCAAO,UjFcvB,2BiFduB,CAAP;AACE,oCAAO,UjFazB,2BiFbyB,CAAP;AAEC,qCAAO,UjFW1B,2BiFX0B,CAAP;AACH,kCAAO,UjFUvB,2BiFVuB,CAAP;AACE,oCAAO,UjFSzB,2BiFTyB,CAAP;AACD,mCAAO,UjFQxB,2BiFRwB,CAAP;AACA,mCAAO,UjFOxB,2BiFPwB,CAAP;AACG,sCAAO,UjFM3B,2BiFN2B,CAAP;AACD,qCAAO,UjFK1B,2BiFL0B,CAAP;AACC,sCAAO,UjFI3B,2BiFJ2B,CAAP;AACH,mCAAO,UjFGxB,2BiFHwB,CAAP;AACD,kCAAO,UjFEvB,2BiFFuB,CAAP;AACG,qCAAO,UjFC1B,2BiFD0B,EAAkB,mBAC1C,SjE2BE,2CiE3BF,CADiB;AAEC,sCAAO,UjFD3B,2BiFC2B,EAAkB,mBAC3C,SjEyBE,2CiEzBF,CADkB;AAEA,sCAAO,UjFH3B,2BiFG2B,EAAkB,mBAC3C,SjEuBE,2CiEvBF,CADkB;AAED,qCAAO,UjFL1B,2BiFK0B,EAAkB,mBAC1C,SjEqBE,2CiErBF,CADiB;AAED,oCAAO,UjFPzB,2BiFOyB,CAAP;AACA,oCAAO,UjFRzB,2BiFQyB,EAAkB,mBAAa,SjEmBpD,2CiEnBoD,CAAtC;AACA,oCAAO,UjFTzB,2BiFSyB,EAAkB,mBAAa,SjEkBpD,2CiElBoD,CAAtC;AACG,uCAAO,UjFV5B,2BiFU4B,EAAkB,mBAC5C,SjEgBE,2CiEhBF,CADmB;AAEA,uCAAO,UjFZ5B,2BiFY4B,CAAP;AA5HrB;AAuJP;AArKF,GAuKc,wJAvKd;ACAA,sBAAkB,mTAAlB;;;;AlFoGgB,kEQkHE;ARlHF,mJkC0PT;AlC1PS,+JkC0PT;AgD9VP;AA6BA;AACE,mCAAW;AACX,mCAAW,mBAAX,GAAiC;AACjC,mCAAW,aAAW,CAAC,6CAAsB;;;;QAAvB;AACtB,mCAAW,aAAW,CAAC,yBAAY;;;;QAAb;AACtB,mCAAW,aAAW,CAAC,2BAAa;;;;QAAd;AACtB,mCAAW,WAAW,CAAC,kBAAS;;;;QAAV;AACtB,mCAAW;AAPb;AA7BA"}