diff options
Diffstat (limited to 'dist/client.b.js.map')
| -rw-r--r-- | dist/client.b.js.map | 1 |
1 files changed, 0 insertions, 1 deletions
diff --git a/dist/client.b.js.map b/dist/client.b.js.map deleted file mode 100644 index 884fac0..0000000 --- a/dist/client.b.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./webAO/backgrounds.js","webpack:///./webAO/evidence.js","webpack:///./webAO/fingerprint.js","webpack:///./webAO/client.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","backgrounds","evidence","Fingerprint","options","nativeForEach","nativeMap","_classCallCheck","this","Array","forEach","map","each","obj","iterator","context","length","results","index","list","_typeof","hasher","screen_resolution","screen_orientation","canvas","ie_activex","keys","push","navigator","userAgent","language","screen","colorDepth","getScreenResolution","join","Date","getTimezoneOffset","hasSessionStorage","hasLocalStorage","window","indexedDB","document","body","addBehavior","openDatabase","cpuClass","platform","doNotTrack","getPluginsString","isCanvasSupported","getCanvasFingerprint","murmurhash3_32_gc","seed","remainder","bytes","h1","h1b","c1","c2","k1","charCodeAt","localStorage","e","sessionStorage","elem","createElement","getContext","isIE","appName","test","getIEPluginsString","getRegularPluginsString","plugins","mimeTypes","mt","type","suffixes","description","ActiveXObject","height","width","ctx","txt","textBaseline","font","fillStyle","fillRect","fillText","toDataURL","queryDict","location","search","substr","split","item","serverIP","ip","AO_HOST","asset","MUSIC_HOST","oldLoading","selectedEffect","selectedMenu","selectedShout","uid","console","log","lastICMessageTime","Client","address","_this","client_classCallCheck","serv","WebSocket","onopen","evt","onOpen","onclose","onClose","onmessage","onMessage","onerror","onError","flip","presentable","hp","playerID","charID","testimonyID","chars","emotes","evidences","resources","holdit","src","duration","objection","takethat","witnesstestimony","sfx","crossexamination","selectedEmote","selectedEvidence","checkUpdater","musicList","handlers","MS","args","handleMS","CT","handleCT","MC","handleMC","RMC","handleRMC","CI","handleCI","SC","handleSC","EI","handleEI","LE","handleLE","EM","handleEM","SM","handleSM","BD","handleBD","music","handlemusic","DONE","handleDONE","BN","handleBN","NBG","handleNBG","HP","handleHP","RT","handleRT","ZZ","handleZZ","ID","handleID","PN","handlePN","SI","handleSI","CharsCheck","handleCharsCheck","PV","handlePV","CHECK","_lastTimeICReceived","message","send","concat","escapeChat","encodeChat","getElementById","speaking","silent","side","ssfxname","zoom","ssfxdelay","flash","color","desc","img","id","msg","testimony","track","_this2","setInterval","sendCheck","evidence_select","add","Option","evidence_arr","background_select","background_arr","background","shouts","fileExists","toLowerCase","callbackLoadImageResources","callbackLoadSFXResources","result","resource","client","viewport","getAnimLength","callbackGetResourceLength","target","MutationObserver","mutations","mutation","children","addedNodes","node","tagName","style","getAttribute","hasAttribute","backgroundColor","observe","attributes","childList","character","song","display","joinServer","error","reason","code","textContent","cleanup","data","debug","header","handler","warn","close","clearInterval","unescapeChat","decodeChat","replace","chatmsg","content","innerHTML","preanim","escape","nameplate","prepChat","sound","snddelay","isnew","className","resetICParams","say","oocLog","scrollTop","scrollHeight","pause","play","musicname","appendICLog","Audio","totime","offset","getTime","addEventListener","currentTime","parseFloat","toFixed","chargs","icon","arg","filename","evidence_box","hmusiclist","newentry","text","flagAudio","newarea","onclick","area_click","appendChild","area_box","lastChild","startsWith","audio_title","insertBefore","firstChild","removeChild","bgname","bg_index","getIndexFromSelect","selectedIndex","updateBackgroundPreview","changeBackground","percent_hp","$","animate","initTestimonyUpdater","tr","td","icon_chosen","thispick","me","emotesList","xhr","XMLHttpRequest","withCredentials","open","responseType","onload","status","linifile","responseText","pinifile","INI","parse","Options","updateActionCommands","Emotions","number","emoteinfo","esfx","esfxd","SoundN","SoundT","sfxdelay","button_off","button_on","pickEmotion","Viewport","textnow","startpreanim","startspeaking","preanimdelay","blip","volume","blipChannels","currentBlipChannel","sfxaudio","sfxplayed","updater","testimonyUpdater","testimonyTimer","shoutTimer","textTimer","_animating","clearTimeout","initUpdater","animdelay","parseInt","setTimeout","updateText","_this3","testimonyOverlay","updateTestimony","callback","param","request","gifInfo","gify","getInfo","response","_this4","disposeTestimony","_this5","nameBox","chatBox","charSprite","eviBox","shoutSprite","chatBoxInner","transform","opacity","shout","1","2","3","effect","direction","backgroundImage","right","left","fontSize","offsetHeight","hasChildNodes","createTextNode","0","4","5","6","charAt","substring","regex","section","comment","lines","line","match","onOOCEnter","event","keyCode","sendOOC","onEnter","mychar","myemo","myEmote","myevi","myEvidence","myflip","mycolor","checked","sendIC","musiclist_click","playtrack","sendMusicChange","el","area","areaHr","changeMusicVolume","changeSFXVolume","changeBlipVolume","setBlipVolume","changeCharacter","sendLeaveRoom","imgError","image","demoError","url","xhttp","onreadystatechange","readyState","position","standname","bgfolder","bgFolder","callbackChangeBackground","ReconnectButton","RetryButton","toadd","arguments","undefined","time","entry","nameField","getMinutes","timeStamp","innerText","toLocaleTimeString","hour","minute","clientLog","pickChar","ccharacter","sendCharacter","emo","pickEvidence","icon_id","updateEvidenceIcon","cancelEvidence","addEvidence","sendPE","editEvidence","sendEE","deleteEvidence","sendDE","select_box","select_element","evidence_filename","evidence_iconbox","role_select","changeBackgroundOOC","bg_command","changeRoleOOC","role_command","randomCharacterOOC","callMod","dialog","initWT","sendRT","initCE","addHPD","sendHP","String","redHPD","addHPP","redHPP","background_filename","background_preview","toggleEffect","toggleFlip","togglePresent","toggleMenu","menu","toggleShout","estring","selectedEncoding","ch","toString","slice","buffer","ArrayBuffer","Uint16Array","strLen","selectedDecoding","group","fromCharCode","apply","trim","ready","initialObservBBCode","loadResources","autoOpen","resizable","show","hide","modal","buttons","Sure","prompt","sendZZ","Cancel"],"mappings":"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","file":"client.b.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 3);\n","export default [\r\n\t\"Anime\",\r\n\t\"birthday\",\r\n\t\"Christmas\",\r\n\t\"CountyCourt\",\r\n\t\"CruiseCourt\",\r\n\t\"default\",\r\n\t\"DGDEnglishCourt\",\r\n\t\"DGSJapanCourt\",\r\n\t\"DualDestinies\",\r\n\t\"EnglishCourt\",\r\n\t\"gs4\",\r\n\t\"GS4Night\",\r\n\t\"HD\",\r\n\t\"Khura'in\",\r\n\t\"mlp\",\r\n\t\"NewCourt\",\r\n\t\"RuinedCourt\",\r\n\t\"Sky\",\r\n\t\"SpaceCourt\",\r\n\t\"Themis\",\r\n\t\"TouhouCourt\",\r\n\t\"WitchTrialCourt\",\r\n\t\"Zetta\"\r\n];","export default [\r\n\t\"1.png\",\r\n\t\"2.png\",\r\n\t\"3.png\",\r\n\t\"4.png\",\r\n\t\"5.png\",\r\n\t\"6.png\",\r\n\t\"empty.png\",\r\n\t\"lawyerbadge.png\"\r\n];","/*\r\n***************************************************\r\n** http://davealger.info\r\n***************************************************\r\n\r\nThis is a javascript only way to fingerprint a user with better than 90% accuracy in as few bytes as possible and no cookie storage!\r\n\r\nSpecial thanks to Valentin Vasilyev for the original fingerprintjs slightly modified and to Open Source Device Fingerprinting by Dark Wave Tech for the various identity functions\r\n\r\n***************************************************\r\n*/\r\nexport default class Fingerprint {\r\n\tconstructor(options) {\r\n\t\tvar nativeForEach, nativeMap;\r\n\t\tnativeForEach = Array.prototype.forEach;\r\n\t\tnativeMap = Array.prototype.map;\r\n\t\tthis.each = function(obj, iterator, context) {\r\n\t\t\tif (obj === null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (nativeForEach && obj.forEach === nativeForEach) {\r\n\t\t\t\tobj.forEach(iterator, context);\r\n\t\t\t} else if (obj.length === +obj.length) {\r\n\t\t\t\tfor (var i = 0, l = obj.length; i < l; i++) {\r\n\t\t\t\t\tif (iterator.call(context, obj[i], i, obj) === {})\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tfor (var key in obj) {\r\n\t\t\t\t\tif (obj.hasOwnProperty(key)) {\r\n\t\t\t\t\t\tif (iterator.call(context, obj[key], key, obj) === {})\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\t\tthis.map = function(obj, iterator, context) {\r\n\t\t\tvar results = [];\r\n\t\t\tif (obj == null)\r\n\t\t\t\treturn results;\r\n\t\t\tif (nativeMap && obj.map === nativeMap)\r\n\t\t\t\treturn obj.map(iterator, context);\r\n\t\t\tthis.each(obj, function(value, index, list) {\r\n\t\t\t\tresults[results.length] = iterator.call(context, value, index, list);\r\n\t\t\t});\r\n\t\t\treturn results;\r\n\t\t};\r\n\t\tif (typeof options == \"object\") {\r\n\t\t\tthis.hasher = options.hasher;\r\n\t\t\tthis.screen_resolution = options.screen_resolution;\r\n\t\t\tthis.screen_orientation = options.screen_orientation;\r\n\t\t\tthis.canvas = options.canvas;\r\n\t\t\tthis.ie_activex = options.ie_activex;\r\n\t\t} else if (typeof options == \"function\") {\r\n\t\t\tthis.hasher = options;\r\n\t\t}\r\n\t}\r\n}\r\nFingerprint.prototype = {\r\n\tget: function() {\r\n\t\tvar keys = [];\r\n\t\tkeys.push(navigator.userAgent);\r\n\t\tkeys.push(navigator.language);\r\n\t\tkeys.push(screen.colorDepth);\r\n\t\tif (this.screen_resolution) {\r\n\t\t\tvar resolution = this.getScreenResolution();\r\n\t\t\tif (typeof resolution !== \"undefined\") {\r\n\t\t\t\tkeys.push(this.getScreenResolution().join(\"x\"));\r\n\t\t\t}\r\n\t\t}\r\n\t\tkeys.push(new Date().getTimezoneOffset());\r\n\t\tkeys.push(this.hasSessionStorage());\r\n\t\tkeys.push(this.hasLocalStorage());\r\n\t\tkeys.push(!!window.indexedDB);\r\n\t\tif (document.body) {\r\n\t\t\tkeys.push(typeof(document.body.addBehavior));\r\n\t\t} else {\r\n\t\t\tkeys.push(typeof undefined);\r\n\t\t}\r\n\t\tkeys.push(typeof(window.openDatabase));\r\n\t\tkeys.push(navigator.cpuClass);\r\n\t\tkeys.push(navigator.platform);\r\n\t\tkeys.push(navigator.doNotTrack);\r\n\t\tkeys.push(this.getPluginsString());\r\n\t\tif (this.canvas && this.isCanvasSupported()) {\r\n\t\t\tkeys.push(this.getCanvasFingerprint());\r\n\t\t}\r\n\t\tif (this.hasher) {\r\n\t\t\treturn this.hasher(keys.join(\"###\"), 31);\r\n\t\t} else {\r\n\t\t\treturn this.murmurhash3_32_gc(keys.join(\"###\"), 31);\r\n\t\t}\r\n\t},\r\n\tmurmurhash3_32_gc: function(key, seed) {\r\n\t\tvar remainder, bytes, h1, h1b, c1, c2, k1, i;\r\n\t\tremainder = key.length & 3;\r\n\t\tbytes = key.length - remainder;\r\n\t\th1 = seed;\r\n\t\tc1 = 0xcc9e2d51;\r\n\t\tc2 = 0x1b873593;\r\n\t\ti = 0;\r\n\t\twhile (i < bytes) {\r\n\t\t\tk1 = ((key.charCodeAt(i) & 0xff)) | ((key.charCodeAt(++i) & 0xff) << 8) | ((key.charCodeAt(++i) & 0xff) << 16) | ((key.charCodeAt(++i) & 0xff) << 24);\r\n\t\t\t++i;\r\n\t\t\tk1 = ((((k1 & 0xffff) * c1) + ((((k1 >>> 16) * c1) & 0xffff) << 16))) & 0xffffffff;\r\n\t\t\tk1 = (k1 << 15) | (k1 >>> 17);\r\n\t\t\tk1 = ((((k1 & 0xffff) * c2) + ((((k1 >>> 16) * c2) & 0xffff) << 16))) & 0xffffffff;\r\n\t\t\th1 ^= k1;\r\n\t\t\th1 = (h1 << 13) | (h1 >>> 19);\r\n\t\t\th1b = ((((h1 & 0xffff) * 5) + ((((h1 >>> 16) * 5) & 0xffff) << 16))) & 0xffffffff;\r\n\t\t\th1 = (((h1b & 0xffff) + 0x6b64) + ((((h1b >>> 16) + 0xe654) & 0xffff) << 16));\r\n\t\t}\r\n\t\tk1 = 0;\r\n\t\tswitch (remainder) {\r\n\t\t\tcase 3:\r\n\t\t\t\tk1 ^= (key.charCodeAt(i + 2) & 0xff) << 16;\r\n\t\t\tcase 2:\r\n\t\t\t\tk1 ^= (key.charCodeAt(i + 1) & 0xff) << 8;\r\n\t\t\tcase 1:\r\n\t\t\t\tk1 ^= (key.charCodeAt(i) & 0xff);\r\n\t\t\t\tk1 = (((k1 & 0xffff) * c1) + ((((k1 >>> 16) * c1) & 0xffff) << 16)) & 0xffffffff;\r\n\t\t\t\tk1 = (k1 << 15) | (k1 >>> 17);\r\n\t\t\t\tk1 = (((k1 & 0xffff) * c2) + ((((k1 >>> 16) * c2) & 0xffff) << 16)) & 0xffffffff;\r\n\t\t\t\th1 ^= k1;\r\n\t\t}\r\n\t\th1 ^= key.length;\r\n\t\th1 ^= h1 >>> 16;\r\n\t\th1 = (((h1 & 0xffff) * 0x85ebca6b) + ((((h1 >>> 16) * 0x85ebca6b) & 0xffff) << 16)) & 0xffffffff;\r\n\t\th1 ^= h1 >>> 13;\r\n\t\th1 = ((((h1 & 0xffff) * 0xc2b2ae35) + ((((h1 >>> 16) * 0xc2b2ae35) & 0xffff) << 16))) & 0xffffffff;\r\n\t\th1 ^= h1 >>> 16;\r\n\t\treturn h1 >>> 0;\r\n\t},\r\n\thasLocalStorage: function() {\r\n\t\ttry {\r\n\t\t\treturn !!window.localStorage;\r\n\t\t} catch (e) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t},\r\n\thasSessionStorage: function() {\r\n\t\ttry {\r\n\t\t\treturn !!window.sessionStorage;\r\n\t\t} catch (e) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t},\r\n\tisCanvasSupported: function() {\r\n\t\tvar elem = document.createElement(\"canvas\");\r\n\t\treturn !!(elem.getContext && elem.getContext(\"2d\"));\r\n\t},\r\n\tisIE: function() {\r\n\t\tif (navigator.appName === \"Microsoft Internet Explorer\") {\r\n\t\t\treturn true;\r\n\t\t} else if (navigator.appName === \"Netscape\" && /Trident/.test(navigator.userAgent)) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\treturn false;\r\n\t},\r\n\tgetPluginsString: function() {\r\n\t\tif (this.isIE() && this.ie_activex) {\r\n\t\t\treturn this.getIEPluginsString();\r\n\t\t} else {\r\n\t\t\treturn this.getRegularPluginsString();\r\n\t\t}\r\n\t},\r\n\tgetRegularPluginsString: function() {\r\n\t\treturn this.map(navigator.plugins, function(p) {\r\n\t\t\tvar mimeTypes = this.map(p, function(mt) {\r\n\t\t\t\treturn [mt.type, mt.suffixes].join(\"~\");\r\n\t\t\t}).join(\",\");\r\n\t\t\treturn [p.name, p.description, mimeTypes].join(\"::\");\r\n\t\t}, this).join(\";\");\r\n\t},\r\n\tgetIEPluginsString: function() {\r\n\t\tif (window.ActiveXObject) {\r\n\t\t\tvar names = [\"ShockwaveFlash.ShockwaveFlash\", \"AcroPDF.PDF\", \"PDF.PdfCtrl\", \"QuickTime.QuickTime\", \"rmocx.RealPlayer G2 Control\", \"rmocx.RealPlayer G2 Control.1\", \"RealPlayer.RealPlayer(tm) ActiveX Control (32-bit)\", \"RealVideo.RealVideo(tm) ActiveX Control (32-bit)\", \"RealPlayer\", \"SWCtl.SWCtl\", \"WMPlayer.OCX\", \"AgControl.AgControl\", \"Skype.Detection\"];\r\n\t\t\treturn this.map(names, function(name) {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tnew ActiveXObject(name);\r\n\t\t\t\t\treturn name;\r\n\t\t\t\t} catch (e) {\r\n\t\t\t\t\treturn null;\r\n\t\t\t\t}\r\n\t\t\t}).join(\";\");\r\n\t\t} else {\r\n\t\t\treturn \"\";\r\n\t\t}\r\n\t},\r\n\tgetScreenResolution: function() {\r\n\t\tvar resolution;\r\n\t\tif (this.screen_orientation) {\r\n\t\t\tresolution = (screen.height > screen.width) ? [screen.height, screen.width] : [screen.width, screen.height];\r\n\t\t} else {\r\n\t\t\tresolution = [screen.height, screen.width];\r\n\t\t}\r\n\t\treturn resolution;\r\n\t},\r\n\tgetCanvasFingerprint: function() {\r\n\t\tvar canvas = document.createElement(\"canvas\");\r\n\t\tvar ctx = canvas.getContext(\"2d\");\r\n\t\tvar txt = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!@#$%^&*()_+-={}|[]\\:\\\"<>?;,.\";\r\n\t\tctx.textBaseline = \"top\";\r\n\t\tctx.font = \"14px 'Arial'\";\r\n\t\tctx.textBaseline = \"alphabetic\";\r\n\t\tctx.fillStyle = \"#f60\";\r\n\t\tctx.fillRect(125, 1, 62, 20);\r\n\t\tctx.fillStyle = \"#069\";\r\n\t\tctx.fillText(txt, 2, 15);\r\n\t\tctx.fillStyle = \"rgba(102, 204, 0, 0.7)\";\r\n\t\tctx.fillText(txt, 4, 17);\r\n\t\treturn canvas.toDataURL();\r\n\t}\r\n};\r\n\r\n/**************************************************/\r\n\r\n/**\r\nhttp://www.darkwavetech.com/fingerprint/fingerprint_code.html\r\n**/\r\nfunction fingerprint_flash() {\r\n\t\"use strict\";\r\n\tvar strOnError, objPlayerVersion, strVersion, strOut;\r\n\r\n\tstrOnError = \"N/A\";\r\n\tobjPlayerVersion = null;\r\n\tstrVersion = null;\r\n\tstrOut = null;\r\n\r\n\ttry {\r\n\t\tobjPlayerVersion = swfobject.getFlashPlayerVersion();\r\n\t\tstrVersion = objPlayerVersion.major + \".\" + objPlayerVersion.minor + \".\" + objPlayerVersion.release;\r\n\t\tif (strVersion === \"0.0.0\") {\r\n\t\t\tstrVersion = \"N/A\";\r\n\t\t}\r\n\t\tstrOut = strVersion;\r\n\t\treturn strOut;\r\n\t} catch (err) {\r\n\t\treturn strOnError;\r\n\t}\r\n}\r\n\r\nfunction fingerprint_browser() {\r\n\t\"use strict\";\r\n\tvar strOnError, strUserAgent, numVersion, strBrowser, strOut;\r\n\r\n\tstrOnError = \"Error\";\r\n\tstrUserAgent = null;\r\n\tnumVersion = null;\r\n\tstrBrowser = null;\r\n\tstrOut = null;\r\n\r\n\ttry {\r\n\t\tstrUserAgent = navigator.userAgent.toLowerCase();\r\n\t\tif (/msie (\\d+\\.\\d+);/.test(strUserAgent)) { //test for MSIE x.x;\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tif (strUserAgent.indexOf(\"trident/6\") > -1) {\r\n\t\t\t\tnumVersion = 10;\r\n\t\t\t}\r\n\t\t\tif (strUserAgent.indexOf(\"trident/5\") > -1) {\r\n\t\t\t\tnumVersion = 9;\r\n\t\t\t}\r\n\t\t\tif (strUserAgent.indexOf(\"trident/4\") > -1) {\r\n\t\t\t\tnumVersion = 8;\r\n\t\t\t}\r\n\t\t\tstrBrowser = \"Internet Explorer \" + numVersion;\r\n\t\t} else if (strUserAgent.indexOf(\"trident/7\") > -1) { //IE 11+ gets rid of the legacy 'MSIE' in the user-agent string;\r\n\t\t\tnumVersion = 11;\r\n\t\t\tstrBrowser = \"Internet Explorer \" + numVersion;\r\n\t\t} else if (/firefox[\\/\\s](\\d+\\.\\d+)/.test(strUserAgent)) { //test for Firefox/x.x or Firefox x.x (ignoring remaining digits);\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tstrBrowser = \"Firefox \" + numVersion;\r\n\t\t} else if (/opera[\\/\\s](\\d+\\.\\d+)/.test(strUserAgent)) { //test for Opera/x.x or Opera x.x (ignoring remaining decimal places);\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tstrBrowser = \"Opera \" + numVersion;\r\n\t\t} else if (/chrome[\\/\\s](\\d+\\.\\d+)/.test(strUserAgent)) { //test for Chrome/x.x or Chrome x.x (ignoring remaining digits);\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tstrBrowser = \"Chrome \" + numVersion;\r\n\t\t} else if (/version[\\/\\s](\\d+\\.\\d+)/.test(strUserAgent)) { //test for Version/x.x or Version x.x (ignoring remaining digits);\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tstrBrowser = \"Safari \" + numVersion;\r\n\t\t} else if (/rv[\\/\\s](\\d+\\.\\d+)/.test(strUserAgent)) { //test for rv/x.x or rv x.x (ignoring remaining digits);\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tstrBrowser = \"Mozilla \" + numVersion;\r\n\t\t} else if (/mozilla[\\/\\s](\\d+\\.\\d+)/.test(strUserAgent)) { //test for Mozilla/x.x or Mozilla x.x (ignoring remaining digits);\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tstrBrowser = \"Mozilla \" + numVersion;\r\n\t\t} else if (/binget[\\/\\s](\\d+\\.\\d+)/.test(strUserAgent)) { //test for BinGet/x.x or BinGet x.x (ignoring remaining digits);\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tstrBrowser = \"Library (BinGet) \" + numVersion;\r\n\t\t} else if (/curl[\\/\\s](\\d+\\.\\d+)/.test(strUserAgent)) { //test for Curl/x.x or Curl x.x (ignoring remaining digits);\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tstrBrowser = \"Library (cURL) \" + numVersion;\r\n\t\t} else if (/java[\\/\\s](\\d+\\.\\d+)/.test(strUserAgent)) { //test for Java/x.x or Java x.x (ignoring remaining digits);\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tstrBrowser = \"Library (Java) \" + numVersion;\r\n\t\t} else if (/libwww-perl[\\/\\s](\\d+\\.\\d+)/.test(strUserAgent)) { //test for libwww-perl/x.x or libwww-perl x.x (ignoring remaining digits);\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tstrBrowser = \"Library (libwww-perl) \" + numVersion;\r\n\t\t} else if (/microsoft url control -[\\s](\\d+\\.\\d+)/.test(strUserAgent)) { //test for Microsoft URL Control - x.x (ignoring remaining digits);\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tstrBrowser = \"Library (Microsoft URL Control) \" + numVersion;\r\n\t\t} else if (/peach[\\/\\s](\\d+\\.\\d+)/.test(strUserAgent)) { //test for Peach/x.x or Peach x.x (ignoring remaining digits);\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tstrBrowser = \"Library (Peach) \" + numVersion;\r\n\t\t} else if (/php[\\/\\s](\\d+\\.\\d+)/.test(strUserAgent)) { //test for PHP/x.x or PHP x.x (ignoring remaining digits);\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tstrBrowser = \"Library (PHP) \" + numVersion;\r\n\t\t} else if (/pxyscand[\\/\\s](\\d+\\.\\d+)/.test(strUserAgent)) { //test for pxyscand/x.x or pxyscand x.x (ignoring remaining digits);\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tstrBrowser = \"Library (pxyscand) \" + numVersion;\r\n\t\t} else if (/pycurl[\\/\\s](\\d+\\.\\d+)/.test(strUserAgent)) { //test for pycurl/x.x or pycurl x.x (ignoring remaining digits);\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tstrBrowser = \"Library (PycURL) \" + numVersion;\r\n\t\t} else if (/python-urllib[\\/\\s](\\d+\\.\\d+)/.test(strUserAgent)) { //test for python-urllib/x.x or python-urllib x.x (ignoring remaining digits);\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tstrBrowser = \"Library (Python URLlib) \" + numVersion;\r\n\t\t} else if (/appengine-google/.test(strUserAgent)) { //test for AppEngine-Google;\r\n\t\t\tnumVersion = Number(RegExp.$1); // capture x.x portion and store as a number\r\n\t\t\tstrBrowser = \"Cloud (Google AppEngine) \" + numVersion;\r\n\t\t} else {\r\n\t\t\tstrBrowser = \"Unknown\";\r\n\t\t}\r\n\t\tstrOut = strBrowser;\r\n\t\treturn strOut;\r\n\t} catch (err) {\r\n\t\treturn strOnError;\r\n\t}\r\n}\r\n\r\nfunction fingerprint_canvas() {\r\n\t\"use strict\";\r\n\tvar strOnError, canvas, strCText, strText, strOut;\r\n\r\n\tstrOnError = \"Error\";\r\n\tcanvas = null;\r\n\tstrCText = null;\r\n\tstrText = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`~1!2@3#4$5%6^7&8*9(0)-_=+[{]}|;:',<.>/?\";\r\n\tstrOut = null;\r\n\r\n\ttry {\r\n\t\tcanvas = document.createElement(\"canvas\");\r\n\t\tstrCText = canvas.getContext(\"2d\");\r\n\t\tstrCText.textBaseline = \"top\";\r\n\t\tstrCText.font = \"14px 'Arial'\";\r\n\t\tstrCText.textBaseline = \"alphabetic\";\r\n\t\tstrCText.fillStyle = \"#f60\";\r\n\t\tstrCText.fillRect(125, 1, 62, 20);\r\n\t\tstrCText.fillStyle = \"#069\";\r\n\t\tstrCText.fillText(strText, 2, 15);\r\n\t\tstrCText.fillStyle = \"rgba(102, 204, 0, 0.7)\";\r\n\t\tstrCText.fillText(strText, 4, 17);\r\n\t\tstrOut = canvas.toDataURL();\r\n\t\treturn strOut;\r\n\t} catch (err) {\r\n\t\treturn strOnError;\r\n\t}\r\n}\r\n\r\nfunction fingerprint_connection() {\r\n\t\"use strict\";\r\n\tvar strOnError, strConnection, strOut;\r\n\r\n\tstrOnError = \"N/A\";\r\n\tstrConnection = null;\r\n\tstrOut = null;\r\n\r\n\ttry {\r\n\t\t// only on android\r\n\t\tstrConnection = navigator.connection.type;\r\n\t\tstrOut = strConnection;\r\n\t} catch (err) {\r\n\t\t// return N/A if navigator.connection object does not apply to this device\r\n\t\treturn strOnError;\r\n\t}\r\n\treturn strOut;\r\n}\r\n\r\nfunction fingerprint_cookie() {\r\n\t\"use strict\";\r\n\tvar strOnError, bolCookieEnabled, bolOut;\r\n\r\n\tstrOnError = \"Error\";\r\n\tbolCookieEnabled = null;\r\n\tbolOut = null;\r\n\r\n\ttry {\r\n\t\tbolCookieEnabled = (navigator.cookieEnabled) ? true : false;\r\n\r\n\t\t//if not IE4+ nor NS6+\r\n\t\tif (typeof navigator.cookieEnabled === \"undefined\" && !bolCookieEnabled) {\r\n\t\t\tdocument.cookie = \"testcookie\";\r\n\t\t\tbolCookieEnabled = (document.cookie.indexOf(\"testcookie\") !== -1) ? true : false;\r\n\t\t}\r\n\t\tbolOut = bolCookieEnabled;\r\n\t\treturn bolOut;\r\n\t} catch (err) {\r\n\t\treturn strOnError;\r\n\t}\r\n}\r\n\r\nfunction fingerprint_display() {\r\n\t\"use strict\";\r\n\tvar strSep, strPair, strOnError, strScreen, strDisplay, strOut;\r\n\r\n\tstrSep = \"|\";\r\n\tstrPair = \"=\";\r\n\tstrOnError = \"Error\";\r\n\tstrScreen = null;\r\n\tstrDisplay = null;\r\n\tstrOut = null;\r\n\r\n\ttry {\r\n\t\tstrScreen = window.screen;\r\n\t\tif (strScreen) {\r\n\t\t\tstrDisplay = strScreen.colorDepth + strSep + strScreen.width + strSep + strScreen.height + strSep + strScreen.availWidth + strSep + strScreen.availHeight;\r\n\t\t}\r\n\t\tstrOut = strDisplay;\r\n\t\treturn strOut;\r\n\t} catch (err) {\r\n\t\treturn strOnError;\r\n\t}\r\n}\r\n\r\nfunction fingerprint_fontsmoothing() {\r\n\t\"use strict\";\r\n\tvar strOnError, strFontSmoothing, canvasNode, ctx, i, j, imageData, alpha, strOut;\r\n\r\n\tstrOnError = \"Unknown\";\r\n\tstrFontSmoothing = null;\r\n\tcanvasNode = null;\r\n\tctx = null;\r\n\timageData = null;\r\n\talpha = null;\r\n\tstrOut = null;\r\n\r\n\tif (typeof(screen.fontSmoothingEnabled) !== \"undefined\") {\r\n\t\tstrFontSmoothing = screen.fontSmoothingEnabled;\r\n\t} else {\r\n\t\ttry {\r\n\t\t\tfontsmoothing = \"false\";\r\n\t\t\tcanvasNode = document.createElement(\"canvas\");\r\n\t\t\tcanvasNode.width = \"35\";\r\n\t\t\tcanvasNode.height = \"35\";\r\n\t\t\tcanvasNode.style.display = \"none\";\r\n\t\t\tdocument.body.appendChild(canvasNode);\r\n\t\t\tctx = canvasNode.getContext(\"2d\");\r\n\t\t\tctx.textBaseline = \"top\";\r\n\t\t\tctx.font = \"32px Arial\";\r\n\t\t\tctx.fillStyle = \"black\";\r\n\t\t\tctx.strokeStyle = \"black\";\r\n\t\t\tctx.fillText(\"O\", 0, 0);\r\n\t\t\tfor (j = 8; j <= 32; j = j + 1) {\r\n\t\t\t\tfor (i = 1; i <= 32; i = i + 1) {\r\n\t\t\t\t\timageData = ctx.getImageData(i, j, 1, 1).data;\r\n\t\t\t\t\talpha = imageData[3];\r\n\t\t\t\t\tif (alpha !== 255 && alpha !== 0) {\r\n\t\t\t\t\t\tstrFontSmoothing = \"true\"; // font-smoothing must be on.\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tstrOut = strFontSmoothing;\r\n\t\t} catch (err) {\r\n\t\t\treturn strOnError;\r\n\t\t}\r\n\t}\r\n\tstrOut = strFontSmoothing;\r\n\treturn strOut;\r\n}\r\n\r\nfunction fingerprint_fonts() {\r\n\t\"use strict\";\r\n\tvar strOnError, style, fonts, count, template, fragment, divs, i, font, div, body, result, e;\r\n\r\n\tstrOnError = \"Error\";\r\n\tstyle = null;\r\n\tfonts = null;\r\n\tfont = null;\r\n\tcount = 0;\r\n\ttemplate = null;\r\n\tdivs = null;\r\n\te = null;\r\n\tdiv = null;\r\n\tbody = null;\r\n\ti = 0;\r\n\r\n\ttry {\r\n\t\tstyle = \"position: absolute; visibility: hidden; display: block !important\";\r\n\t\tfonts = [\"8bitoperator\", \"Abadi MT Condensed Light\",\"Ace Attorney\", \"Adobe Fangsong Std\", \"Adobe Hebrew\", \"Adobe Ming Std\", \"Agency FB\", \"Aharoni\", \"Andalus\", \"Angsana New\", \"AngsanaUPC\", \"Aparajita\", \"Arab\", \"Arabic Transparent\", \"Arabic Typesetting\", \"Arial Baltic\", \"Arial Black\", \"Arial CE\", \"Arial CYR\", \"Arial Greek\", \"Arial TUR\", \"Arial\", \"Arimo\", \"Batang\", \"BatangChe\", \"Bauhaus 93\", \"Bell MT\", \"Berlin Sans FB\", \"Bitstream Vera Serif\", \"Bodoni MT\", \"Bookman Old Style\", \"Braggadocio\", \"Broadway\", \"Browallia New\", \"BrowalliaUPC\", \"Calibri Light\", \"Calibri\", \"Californian FB\", \"Cambria Math\", \"Cambria\", \"Candara\", \"Castellar\", \"Casual\", \"Centaur\", \"Century\", \"Century Gothic\", \"Chalkduster\", \"Colonna MT\", \"Comic Sans MS\", \"Consolas\", \"Constantia\", \"Copperplate Gothic Light\", \"Corbel\", \"Cordia New\", \"CordiaUPC\", \"Courier New Baltic\", \"Courier New CE\", \"Courier New CYR\", \"Courier New Greek\", \"Courier New TUR\", \"Courier New\", \"DejaVu Sans\", \"DFKai-SB\",\"DINEngschrift\", \"DaunPenh\", \"David\", \"DejaVu LGC Sans Mono\", \"Desdemona\", \"DilleniaUPC\", \"DokChampa\", \"Dotum\", \"DotumChe\", \"Dubai\", \"Ebrima\", \"Engravers MT\", \"Eras Bold ITC\", \"Estrangelo Edessa\", \"EucrosiaUPC\", \"Euphemia\", \"Eurostile\", \"FangSong\", \"Forte\", \"FrankRuehl\", \"Franklin Gothic Heavy\", \"Franklin Gothic Medium\", \"FreesiaUPC\", \"French Script MT\", \"Gabriola\", \"Gautami\", \"Georgia\", \"Gigi\", \"Gisha\", \"Goudy Old Style\", \"Gulim\", \"GulimChe\", \"GungSeo\", \"Gungsuh\", \"GungsuhChe\", \"Haettenschweiler\", \"Harrington\", \"Hei S\", \"HeiT\", \"Heisei Kaku Gothic\", \"Hiragino Sans GB\", \"Impact\", \"Informal Roman\", \"IrisUPC\", \"Iskoola Pota\", \"JasmineUPC\", \"KacstOne\", \"KaiTi\", \"Kalinga\", \"Kartika\", \"Khmer UI\", \"Kino MT\", \"KodchiangUPC\", \"Kokila\", \"Kozuka Gothic Pr6N\", \"Lao UI\", \"Latha\", \"Leelawadee\", \"Levenim MT\", \"LilyUPC\", \"Lohit Gujarati\", \"Loma\", \"Lucida Bright\", \"Lucida Console\", \"Lucida Fax\", \"Lucida Sans Unicode\", \"MS Gothic\", \"MS Mincho\", \"MS PGothic\", \"MS PMincho\", \"MS Reference Sans Serif\", \"MS UI Gothic\", \"MV Boli\", \"Magneto\", \"Malgun Gothic\", \"Mangal\", \"Marlett\", \"Matura MT Script Capitals\", \"Meiryo UI\", \"Meiryo\", \"Menlo\", \"Microsoft Himalaya\", \"Microsoft JhengHei\", \"Microsoft New Tai Lue\", \"Microsoft PhagsPa\", \"Microsoft Sans Serif\", \"Microsoft Tai Le\", \"Microsoft Uighur\", \"Microsoft YaHei\", \"Microsoft Yi Baiti\", \"MingLiU\", \"MingLiU-ExtB\", \"MingLiU_HKSCS\", \"MingLiU_HKSCS-ExtB\", \"Miriam Fixed\", \"Miriam\", \"Mongolian Baiti\", \"MoolBoran\", \"More Perfect DOS VGA\", \"MS Outlook\", \"NSimSun\", \"Narkisim\", \"News Gothic MT\", \"Niagara Solid\", \"Nyala\", \"OCR A\",\"Ocean Sans Std\", \"OpenSymbol\", \"PMingLiU\", \"PMingLiU-ExtB\", \"Palace Script MT\", \"Palatino Linotype\", \"Papyrus\", \"Perpetua\", \"Plantagenet Cherokee\", \"Playbill\", \"Prelude Bold\", \"Prelude Condensed Bold\", \"Prelude Condensed Medium\", \"Prelude Medium\", \"PreludeCompressedWGL Black\", \"PreludeCompressedWGL Bold\", \"PreludeCompressedWGL Light\", \"PreludeCompressedWGL Medium\", \"PreludeCondensedWGL Black\", \"PreludeCondensedWGL Bold\", \"PreludeCondensedWGL Light\", \"PreludeCondensedWGL Medium\", \"PreludeWGL Black\", \"PreludeWGL Bold\", \"PreludeWGL Light\", \"PreludeWGL Medium\", \"Raavi\", \"Rachana\", \"Rockwell\", \"Rod\", \"Sakkal Majalla\", \"Sawasdee\", \"Script MT Bold\", \"Segoe Print\", \"Segoe Script\", \"Segoe UI Emoji\", \"Segoe UI Historic\", \"Segoe UI Light\", \"Segoe UI Semibold\", \"Segoe UI Symbol\", \"Segoe UI\", \"Shonar Bangla\", \"Showcard Gothic\", \"Shruti\", \"SimHei\", \"SimSun\", \"SimSun-ExtB\", \"Simplified Arabic Fixed\", \"Simplified Arabic\", \"Snap ITC\", \"Sylfaen\", \"Symbol\", \"Tahoma\", \"TeamViewer13\", \"Times New Roman Baltic\", \"Times New Roman CE\", \"Times New Roman CYR\", \"Times New Roman Greek\", \"Times New Roman TUR\", \"Times New Roman\", \"TlwgMono\", \"Traditional Arabic\", \"Trebuchet MS\", \"Tunga\", \"Tw Cen MT Condensed Extra Bold\", \"Ubuntu\", \"Umpush\", \"Univers\", \"Utopia\", \"Utsaah\", \"Vani\", \"Verdana\", \"Vijaya\", \"Vladimir Script\", \"Vrinda\", \"Webdings\", \"Wide Latin\", \"Wingdings\", \"Yu Gothic\", \"Zrnic Rg\"];\r\n\t\tcount = fonts.length;\r\n\t\ttemplate = \"<b style=\\\"display:inline !important; width:auto !important; font:normal 10px/1 'X',sans-serif !important\\\">ww</b>\" + \"<b style=\\\"display:inline !important; width:auto !important; font:normal 10px/1 'X',monospace !important\\\">ww</b>\";\r\n\t\tfragment = document.createDocumentFragment();\r\n\t\tdivs = [];\r\n\t\tfor (i = 0; i < count; i = i + 1) {\r\n\t\t\tfont = fonts[i];\r\n\t\t\tdiv = document.createElement(\"div\");\r\n\t\t\tfont = font.replace(/['\"<>]/g, \"\");\r\n\t\t\tdiv.innerHTML = template.replace(/X/g, font);\r\n\t\t\tdiv.style.cssText = style;\r\n\t\t\tfragment.appendChild(div);\r\n\t\t\tdivs.push(div);\r\n\t\t}\r\n\t\tbody = document.body;\r\n\t\tbody.insertBefore(fragment, body.firstChild);\r\n\t\tresult = [];\r\n\t\tfor (i = 0; i < count; i = i + 1) {\r\n\t\t\te = divs[i].getElementsByTagName(\"b\");\r\n\t\t\tif (e[0].offsetWidth === e[1].offsetWidth) {\r\n\t\t\t\tresult.push(fonts[i]);\r\n\t\t\t}\r\n\t\t}\r\n\t\t// do not combine these two loops, remove child will cause reflow\r\n\t\t// and induce severe performance hit\r\n\t\tfor (i = 0; i < count; i = i + 1) {\r\n\t\t\tbody.removeChild(divs[i]);\r\n\t\t}\r\n\t\treturn result.join(\"|\");\r\n\t} catch (err) {\r\n\t\treturn strOnError;\r\n\t}\r\n}\r\n\r\nfunction fingerprint_formfields() {\r\n\t\"use strict\";\r\n\tvar i, j, numOfForms, numOfInputs, strFormsInPage, strFormsInputsData, strInputsInForm, strTmp, strOut;\r\n\r\n\ti = 0;\r\n\tj = 0;\r\n\tnumOfForms = 0;\r\n\tnumOfInputs = 0;\r\n\tstrFormsInPage = \"\";\r\n\tstrFormsInputsData = [];\r\n\tstrInputsInForm = \"\";\r\n\tstrTmp = \"\";\r\n\tstrOut = \"\";\r\n\r\n\tstrFormsInPage = document.getElementsByTagName(\"form\");\r\n\tnumOfForms = strFormsInPage.length;\r\n\tstrFormsInputsData.push(\"url=\" + window.location.href);\r\n\tfor (i = 0; i < numOfForms; i = i + 1) {\r\n\t\tstrFormsInputsData.push(\"FORM=\" + strFormsInPage[i].name);\r\n\t\tstrInputsInForm = strFormsInPage[i].getElementsByTagName(\"input\");\r\n\t\tnumOfInputs = strInputsInForm.length;\r\n\t\tfor (j = 0; j < numOfInputs; j = j + 1) {\r\n\t\t\tif (strInputsInForm[j].type !== \"hidden\") {\r\n\t\t\t\tstrFormsInputsData.push(\"Input=\" + strInputsInForm[j].name);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tstrTmp = strFormsInputsData.join(\"|\");\r\n\tstrOut = strTmp;\r\n\treturn strOut;\r\n}\r\n\r\nfunction fingerprint_java() {\r\n\t\"use strict\";\r\n\tvar strOnError, strJavaEnabled, strOut;\r\n\r\n\tstrOnError = \"Error\";\r\n\tstrJavaEnabled = null;\r\n\tstrOut = null;\r\n\r\n\ttry {\r\n\t\tif (navigator.javaEnabled()) {\r\n\t\t\tstrJavaEnabled = \"true\";\r\n\t\t} else {\r\n\t\t\tstrJavaEnabled = \"false\";\r\n\t\t}\r\n\t\tstrOut = strJavaEnabled;\r\n\t\treturn strOut;\r\n\t} catch (err) {\r\n\t\treturn strOnError;\r\n\t}\r\n}\r\n\r\nfunction fingerprint_language() {\r\n\t\"use strict\";\r\n\tvar strSep, strPair, strOnError, strLang, strTypeLng, strTypeBrLng, strTypeSysLng, strTypeUsrLng, strOut;\r\n\r\n\tstrSep = \"|\";\r\n\tstrPair = \"=\";\r\n\tstrOnError = \"Error\";\r\n\tstrLang = null;\r\n\tstrTypeLng = null;\r\n\tstrTypeBrLng = null;\r\n\tstrTypeSysLng = null;\r\n\tstrTypeUsrLng = null;\r\n\tstrOut = null;\r\n\r\n\ttry {\r\n\t\tstrTypeLng = typeof(navigator.language);\r\n\t\tstrTypeBrLng = typeof(navigator.browserLanguage);\r\n\t\tstrTypeSysLng = typeof(navigator.systemLanguage);\r\n\t\tstrTypeUsrLng = typeof(navigator.userLanguage);\r\n\r\n\t\tif (strTypeLng !== \"undefined\") {\r\n\t\t\tstrLang = \"lang\" + strPair + navigator.language + strSep;\r\n\t\t} else if (strTypeBrLng !== \"undefined\") {\r\n\t\t\tstrLang = \"lang\" + strPair + navigator.browserLanguage + strSep;\r\n\t\t} else {\r\n\t\t\tstrLang = \"lang\" + strPair + strSep;\r\n\t\t}\r\n\t\tif (strTypeSysLng !== \"undefined\") {\r\n\t\t\tstrLang += \"syslang\" + strPair + navigator.systemLanguage + strSep;\r\n\t\t} else {\r\n\t\t\tstrLang += \"syslang\" + strPair + strSep;\r\n\t\t}\r\n\t\tif (strTypeUsrLng !== \"undefined\") {\r\n\t\t\tstrLang += \"userlang\" + strPair + navigator.userLanguage;\r\n\t\t} else {\r\n\t\t\tstrLang += \"userlang\" + strPair;\r\n\t\t}\r\n\t\tstrOut = strLang;\r\n\t\treturn strOut;\r\n\t} catch (err) {\r\n\t\treturn strOnError;\r\n\t}\r\n}\r\n\r\nfunction fingerprint_silverlight() {\r\n\t\"use strict\";\r\n\tvar strOnError, objControl, objPlugin, strSilverlightVersion, strOut;\r\n\r\n\tstrOnError = \"Error\";\r\n\tobjControl = null;\r\n\tobjPlugin = null;\r\n\tstrSilverlightVersion = null;\r\n\tstrOut = null;\r\n\r\n\ttry {\r\n\t\ttry {\r\n\t\t\tobjControl = new ActiveXObject(\"AgControl.AgControl\");\r\n\t\t\tif (objControl.IsVersionSupported(\"5.0\")) {\r\n\t\t\t\tstrSilverlightVersion = \"5.x\";\r\n\t\t\t} else if (objControl.IsVersionSupported(\"4.0\")) {\r\n\t\t\t\tstrSilverlightVersion = \"4.x\";\r\n\t\t\t} else if (objControl.IsVersionSupported(\"3.0\")) {\r\n\t\t\t\tstrSilverlightVersion = \"3.x\";\r\n\t\t\t} else if (objControl.IsVersionSupported(\"2.0\")) {\r\n\t\t\t\tstrSilverlightVersion = \"2.x\";\r\n\t\t\t} else {\r\n\t\t\t\tstrSilverlightVersion = \"1.x\";\r\n\t\t\t}\r\n\t\t\tobjControl = null;\r\n\t\t} catch (e) {\r\n\t\t\tobjPlugin = navigator.plugins[\"Silverlight Plug-In\"];\r\n\t\t\tif (objPlugin) {\r\n\t\t\t\tif (objPlugin.description === \"1.0.30226.2\") {\r\n\t\t\t\t\tstrSilverlightVersion = \"2.x\";\r\n\t\t\t\t} else {\r\n\t\t\t\t\tstrSilverlightVersion = parseInt(objPlugin.description[0], 10);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tstrSilverlightVersion = \"N/A\";\r\n\t\t\t}\r\n\t\t}\r\n\t\tstrOut = strSilverlightVersion;\r\n\t\treturn strOut;\r\n\t} catch (err) {\r\n\t\treturn strOnError;\r\n\t}\r\n}\r\n\r\nfunction fingerprint_os() {\r\n\t\"use strict\";\r\n\tvar strSep, strOnError, strUserAgent, strPlatform, strOS, strOSBits, strOut;\r\n\r\n\tstrSep = \"|\";\r\n\tstrOnError = \"Error\";\r\n\tstrUserAgent = null;\r\n\tstrPlatform = null;\r\n\tstrOS = null;\r\n\tstrOSBits = null;\r\n\tstrOut = null;\r\n\r\n\ttry {\r\n\t\t/* navigator.userAgent is supported by all major browsers */\r\n\t\tstrUserAgent = navigator.userAgent.toLowerCase();\r\n\t\t/* navigator.platform is supported by all major browsers */\r\n\t\tstrPlatform = navigator.platform.toLowerCase();\r\n\t\tif (strUserAgent.indexOf(\"windows nt 6.3\") !== -1) {\r\n\t\t\tstrOS = \"Windows 8.1\";\r\n\t\t} else if (strUserAgent.indexOf(\"windows nt 6.2\") !== -1) {\r\n\t\t\tstrOS = \"Windows 8\";\r\n\t\t} else if (strUserAgent.indexOf(\"windows nt 6.1\") !== -1) {\r\n\t\t\tstrOS = \"Windows 7\";\r\n\t\t} else if (strUserAgent.indexOf(\"windows nt 10.0\") !== -1) {\r\n\t\t\tstrOS = \"Windows 10\";\r\n\t\t} else if (strUserAgent.indexOf(\"windows nt 6.0\") !== -1) {\r\n\t\t\tstrOS = \"Windows Vista/Windows Server 2008\";\r\n\t\t} else if (strUserAgent.indexOf(\"windows nt 5.2\") !== -1) {\r\n\t\t\tstrOS = \"Windows XP x64/Windows Server 2003\";\r\n\t\t} else if (strUserAgent.indexOf(\"windows nt 5.1\") !== -1) {\r\n\t\t\tstrOS = \"Windows XP\";\r\n\t\t} else if (strUserAgent.indexOf(\"windows nt 5.01\") !== -1) {\r\n\t\t\tstrOS = \"Windows 2000, Service Pack 1 (SP1)\";\r\n\t\t} else if (strUserAgent.indexOf(\"windows xp\") !== -1) {\r\n\t\t\tstrOS = \"Windows XP\";\r\n\t\t} else if (strUserAgent.indexOf(\"windows 2000\") !== -1) {\r\n\t\t\tstrOS = \"Windows 2000\";\r\n\t\t} else if (strUserAgent.indexOf(\"windows nt 5.0\") !== -1) {\r\n\t\t\tstrOS = \"Windows 2000\";\r\n\t\t} else if (strUserAgent.indexOf(\"iemobile\") !== -1) {\r\n\t\t\tstrOS = \"Windows Mobile\";\r\n\t\t} else if (strUserAgent.indexOf(\"wm5 pie\") !== -1) {\r\n\t\t\tstrOS = \"Windows Mobile\";\r\n\t\t} else if (strUserAgent.indexOf(\"windows\") !== -1) {\r\n\t\t\tstrOS = \"Windows (Unknown Version)\";\r\n\t\t} else if (strUserAgent.indexOf(\"openbsd\") !== -1) {\r\n\t\t\tstrOS = \"Open BSD\";\r\n\t\t} else if (strUserAgent.indexOf(\"sunos\") !== -1) {\r\n\t\t\tstrOS = \"Sun OS\";\r\n\t\t} else if (strUserAgent.indexOf(\"ubuntu\") !== -1) {\r\n\t\t\tstrOS = \"Ubuntu\";\r\n\t\t} else if (strUserAgent.indexOf(\"ipad\") !== -1) {\r\n\t\t\tstrOS = \"iOS (iPad)\";\r\n\t\t} else if (strUserAgent.indexOf(\"ipod\") !== -1) {\r\n\t\t\tstrOS = \"iOS (iTouch)\";\r\n\t\t} else if (strUserAgent.indexOf(\"iphone\") !== -1) {\r\n\t\t\tstrOS = \"iOS (iPhone)\";\r\n\t\t} else if (strUserAgent.indexOf(\"mac os x beta\") !== -1) {\r\n\t\t\tstrOS = \"Mac OSX Beta (Kodiak)\";\r\n\t\t} else if (strUserAgent.indexOf(\"mac os x 10.0\") !== -1) {\r\n\t\t\tstrOS = \"Mac OSX Cheetah\";\r\n\t\t} else if (strUserAgent.indexOf(\"mac os x 10.1\") !== -1) {\r\n\t\t\tstrOS = \"Mac OSX Puma\";\r\n\t\t} else if (strUserAgent.indexOf(\"mac os x 10.2\") !== -1) {\r\n\t\t\tstrOS = \"Mac OSX Jaguar\";\r\n\t\t} else if (strUserAgent.indexOf(\"mac os x 10.3\") !== -1) {\r\n\t\t\tstrOS = \"Mac OSX Panther\";\r\n\t\t} else if (strUserAgent.indexOf(\"mac os x 10.4\") !== -1) {\r\n\t\t\tstrOS = \"Mac OSX Tiger\";\r\n\t\t} else if (strUserAgent.indexOf(\"mac os x 10.5\") !== -1) {\r\n\t\t\tstrOS = \"Mac OSX Leopard\";\r\n\t\t} else if (strUserAgent.indexOf(\"mac os x 10.6\") !== -1) {\r\n\t\t\tstrOS = \"Mac OSX Snow Leopard\";\r\n\t\t} else if (strUserAgent.indexOf(\"mac os x 10.7\") !== -1) {\r\n\t\t\tstrOS = \"Mac OSX Lion\";\r\n\t\t} else if (strUserAgent.indexOf(\"mac os x\") !== -1) {\r\n\t\t\tstrOS = \"Mac OSX (Version Unknown)\";\r\n\t\t} else if (strUserAgent.indexOf(\"macintosh\") !== -1) {\r\n\t\t\tstrOS = \"Mac OS Classic\";\r\n\t\t} else if (strUserAgent.indexOf(\"googletv\") !== -1) {\r\n\t\t\tstrOS = \"Android (GoogleTV)\";\r\n\t\t} else if (strUserAgent.indexOf(\"android\") !== -1) {\r\n\t\t\tstrOS = \"Android\";\r\n\t\t} else if (strUserAgent.indexOf(\"x11\") !== -1) {\r\n\t\t\tstrOS = \"UNIX\";\r\n\t\t} else if (strUserAgent.indexOf(\"nix\") !== -1) {\r\n\t\t\tstrOS = \"UNIX\";\r\n\t\t} else if (strUserAgent.indexOf(\"linux\") !== -1) {\r\n\t\t\tstrOS = \"Linux\";\r\n\t\t} else if (strUserAgent.indexOf(\"qnx\") !== -1) {\r\n\t\t\tstrOS = \"QNX\";\r\n\t\t} else if (strUserAgent.indexOf(\"os/2\") !== -1) {\r\n\t\t\tstrOS = \"IBM OS/2\";\r\n\t\t} else if (strUserAgent.indexOf(\"beos\") !== -1) {\r\n\t\t\tstrOS = \"BeOS\";\r\n\t\t} else if (strUserAgent.indexOf(\"playbook\") !== -1) {\r\n\t\t\tstrOS = \"Blackberry (Playbook)\";\r\n\t\t} else if (strUserAgent.indexOf(\"wnd.rim\") !== -1) {\r\n\t\t\tstrOS = \"Blackberry (IE/FF Emulator)\";\r\n\t\t} else if (strUserAgent.indexOf(\"blackberry\") !== -1) {\r\n\t\t\tstrOS = \"Blackberry\";\r\n\t\t} else if (strUserAgent.indexOf(\"palm\") !== -1) {\r\n\t\t\tstrOS = \"Palm OS\";\r\n\t\t} else if (strUserAgent.indexOf(\"webos\") !== -1) {\r\n\t\t\tstrOS = \"WebOS\";\r\n\t\t} else if (strUserAgent.indexOf(\"hpwos\") !== -1) {\r\n\t\t\tstrOS = \"WebOS (HP)\";\r\n\t\t} else if (strUserAgent.indexOf(\"kindle\") !== -1) {\r\n\t\t\tstrOS = \"Kindle\";\r\n\t\t} else if (strUserAgent.indexOf(\"wii\") !== -1) {\r\n\t\t\tstrOS = \"Nintendo (Wii)\";\r\n\t\t} else if (strUserAgent.indexOf(\"nintendo ds\") !== -1) {\r\n\t\t\tstrOS = \"Nintendo (DS)\";\r\n\t\t} else if (strUserAgent.indexOf(\"playstation 3\") !== -1) {\r\n\t\t\tstrOS = \"Sony (Playstation Console)\";\r\n\t\t} else if (strUserAgent.indexOf(\"playstation portable\") !== -1) {\r\n\t\t\tstrOS = \"Sony (Playstation Portable)\";\r\n\t\t} else if (strUserAgent.indexOf(\"webtv\") !== -1) {\r\n\t\t\tstrOS = \"MSN TV (WebTV)\";\r\n\t\t} else if (strUserAgent.indexOf(\"inferno\") !== -1) {\r\n\t\t\tstrOS = \"Inferno\";\r\n\t\t} else {\r\n\t\t\tstrOS = \"Unknown\";\r\n\t\t}\r\n\t\tif (strPlatform.indexOf(\"x64\") !== -1) {\r\n\t\t\tstrOSBits = \"64 bits\";\r\n\t\t} else if (strPlatform.indexOf(\"wow64\") !== -1) {\r\n\t\t\tstrOSBits = \"64 bits\";\r\n\t\t} else if (strPlatform.indexOf(\"win64\") !== -1) {\r\n\t\t\tstrOSBits = \"64 bits\";\r\n\t\t} else if (strPlatform.indexOf(\"win32\") !== -1) {\r\n\t\t\tstrOSBits = \"32 bits\";\r\n\t\t} else if (strPlatform.indexOf(\"x64\") !== -1) {\r\n\t\t\tstrOSBits = \"64 bits\";\r\n\t\t} else if (strPlatform.indexOf(\"x32\") !== -1) {\r\n\t\t\tstrOSBits = \"32 bits\";\r\n\t\t} else if (strPlatform.indexOf(\"x86\") !== -1) {\r\n\t\t\tstrOSBits = \"32 bits*\";\r\n\t\t} else if (strPlatform.indexOf(\"ppc\") !== -1) {\r\n\t\t\tstrOSBits = \"64 bits\";\r\n\t\t} else if (strPlatform.indexOf(\"alpha\") !== -1) {\r\n\t\t\tstrOSBits = \"64 bits\";\r\n\t\t} else if (strPlatform.indexOf(\"68k\") !== -1) {\r\n\t\t\tstrOSBits = \"64 bits\";\r\n\t\t} else if (strPlatform.indexOf(\"iphone\") !== -1) {\r\n\t\t\tstrOSBits = \"32 bits\";\r\n\t\t} else if (strPlatform.indexOf(\"android\") !== -1) {\r\n\t\t\tstrOSBits = \"32 bits\";\r\n\t\t} else {\r\n\t\t\tstrOSBits = \"Unknown\";\r\n\t\t}\r\n\t\tstrOut = strOS + strSep + strOSBits;\r\n\t\treturn strOut;\r\n\t} catch (err) {\r\n\t\treturn strOnError;\r\n\t}\r\n}\r\n\r\nfunction fingerprint_useragent() {\r\n\t\"use strict\";\r\n\tvar strSep, strTmp, strUserAgent, strOut;\r\n\r\n\tstrSep = \"|\";\r\n\tstrTmp = null;\r\n\tstrUserAgent = null;\r\n\tstrOut = null;\r\n\r\n\t/* navigator.userAgent is supported by all major browsers */\r\n\tstrUserAgent = navigator.userAgent.toLowerCase();\r\n\t/* navigator.platform is supported by all major browsers */\r\n\tstrTmp = strUserAgent + strSep + navigator.platform;\r\n\t/* navigator.cpuClass only supported in IE */\r\n\tif (navigator.cpuClass) {\r\n\t\tstrTmp += strSep + navigator.cpuClass;\r\n\t}\r\n\t/* navigator.browserLanguage only supported in IE, Safari and Chrome */\r\n\tif (navigator.browserLanguage) {\r\n\t\tstrTmp += strSep + navigator.browserLanguage;\r\n\t} else {\r\n\t\tstrTmp += strSep + navigator.language;\r\n\t}\r\n\tstrOut = strTmp;\r\n\treturn strOut;\r\n}\r\n\r\nfunction fingerprint_timezone() {\r\n\t\"use strict\";\r\n\tvar strOnError, dtDate, numOffset, numGMTHours, numOut;\r\n\r\n\tstrOnError = \"Error\";\r\n\tdtDate = null;\r\n\tnumOffset = null;\r\n\tnumGMTHours = null;\r\n\tnumOut = null;\r\n\r\n\ttry {\r\n\t\tdtDate = new Date();\r\n\t\tnumOffset = dtDate.getTimezoneOffset();\r\n\t\tnumGMTHours = (numOffset / 60) * (-1);\r\n\t\tnumOut = numGMTHours;\r\n\t\treturn numOut;\r\n\t} catch (err) {\r\n\t\treturn strOnError;\r\n\t}\r\n}\r\n\r\nfunction fingerprint_touch() {\r\n\t\"use strict\";\r\n\tvar bolTouchEnabled, bolOut;\r\n\r\n\tbolTouchEnabled = false;\r\n\tbolOut = null;\r\n\r\n\ttry {\r\n\t\tif (document.createEvent(\"TouchEvent\")) {\r\n\t\t\tbolTouchEnabled = true;\r\n\t\t}\r\n\t\tbolOut = bolTouchEnabled;\r\n\t\treturn bolOut;\r\n\t} catch (ignore) {\r\n\t\tbolOut = bolTouchEnabled\r\n\t\treturn bolOut;\r\n\t}\r\n}\r\n\r\nfunction fingerprint_truebrowser() {\r\n\t\"use strict\";\r\n\tvar strBrowser, strUserAgent, strOut;\r\n\r\n\tstrBrowser = \"Unknown\";\r\n\tstrUserAgent = null;\r\n\tstrOut = null;\r\n\r\n\tstrUserAgent = navigator.userAgent.toLowerCase();\r\n\r\n\t/* Checks for different browsers, cannot use Try/Catch block */\r\n\tif (document.all && document.getElementById && navigator.savePreferences && (strUserAgent.indexOf(\"Netfront\") < 0) && navigator.appName !== \"Blazer\") {\r\n\t\tstrBrowser = \"Escape 5\";\r\n\t} else if (navigator.vendor === \"KDE\") {\r\n\t\tstrBrowser = \"Konqueror\";\r\n\t} else if (document.childNodes && !document.all && !navigator.taintEnabled && !navigator.accentColorName) {\r\n\t\tstrBrowser = \"Safari\";\r\n\t} else if (document.childNodes && !document.all && !navigator.taintEnabled && navigator.accentColorName) {\r\n\t\tstrBrowser = \"OmniWeb 4.5+\";\r\n\t} else if (navigator.__ice_version) {\r\n\t\tstrBrowser = \"ICEBrowser\";\r\n\t} else if (window.ScriptEngine && ScriptEngine().indexOf(\"InScript\") + 1 && document.createElement) {\r\n\t\tstrBrowser = \"iCab 3+\";\r\n\t} else if (window.ScriptEngine && ScriptEngine().indexOf(\"InScript\") + 1) {\r\n\t\tstrBrowser = \"iCab 2-\";\r\n\t} else if (strUserAgent.indexOf(\"hotjava\") + 1 && (navigator.accentColorName) === \"undefined\") {\r\n\t\tstrBrowser = \"HotJava\";\r\n\t} else if (document.layers && !document.classes) {\r\n\t\tstrBrowser = \"Omniweb 4.2-\";\r\n\t} else if (document.layers && !navigator.mimeTypes[\"*\"]) {\r\n\t\tstrBrowser = \"Escape 4\";\r\n\t} else if (document.layers) {\r\n\t\tstrBrowser = \"Netscape 4\";\r\n\t} else if (window.opera && document.getElementsByClassName) {\r\n\t\tstrBrowser = \"Opera 9.5+\";\r\n\t} else if (window.opera && window.getComputedStyle) {\r\n\t\tstrBrowser = \"Opera 8\";\r\n\t} else if (window.opera && document.childNodes) {\r\n\t\tstrBrowser = \"Opera 7\";\r\n\t} else if (window.opera) {\r\n\t\tstrBrowser = \"Opera \" + window.opera.version();\r\n\t} else if (navigator.appName.indexOf(\"WebTV\") + 1) {\r\n\t\tstrBrowser = \"WebTV\";\r\n\t} else if (strUserAgent.indexOf(\"netgem\") + 1) {\r\n\t\tstrBrowser = \"Netgem NetBox\";\r\n\t} else if (strUserAgent.indexOf(\"opentv\") + 1) {\r\n\t\tstrBrowser = \"OpenTV\";\r\n\t} else if (strUserAgent.indexOf(\"ipanel\") + 1) {\r\n\t\tstrBrowser = \"iPanel MicroBrowser\";\r\n\t} else if (document.getElementById && !document.childNodes) {\r\n\t\tstrBrowser = \"Clue browser\";\r\n\t} else if (navigator.product && navigator.product.indexOf(\"Hv\") === 0) {\r\n\t\tstrBrowser = \"Tkhtml Hv3+\";\r\n\t} else if (typeof InstallTrigger !== \"undefined\") {\r\n\t\tstrBrowser = \"Firefox\";\r\n\t} else if (window.atob) {\r\n\t\tstrBrowser = \"Internet Explorer 10+\";\r\n\t} else if (XDomainRequest && window.performance) {\r\n\t\tstrBrowser = \"Internet Explorer 9\";\r\n\t} else if (XDomainRequest) {\r\n\t\tstrBrowser = \"Internet Explorer 8\";\r\n\t} else if (document.documentElement && document.documentElement.style.maxHeight !== \"undefined\") {\r\n\t\tstrBrowser = \"Internet Explorer 7\"; //xxxxx\r\n\t} else if (document.compatMode && document.all) {\r\n\t\tstrBrowser = \"Internet Explorer 6\"; //xxxxx\r\n\t} else if (window.createPopup) {\r\n\t\tstrBrowser = \"Internet Explorer 5.5\";\r\n\t} else if (window.attachEvent) {\r\n\t\tstrBrowser = \"Internet Explorer 5\";\r\n\t} else if (document.all && navigator.appName !== \"Microsoft Pocket Internet Explorer\") {\r\n\t\tstrBrowser = \"Internet Explorer 4\";\r\n\t} else if ((strUserAgent.indexOf(\"msie\") + 1) && window.ActiveXObject) {\r\n\t\tstrBrowser = \"Pocket Internet Explorer\";\r\n\t} else if (document.getElementById && ((strUserAgent.indexOf(\"netfront\") + 1) || navigator.appName === \"Blazer\" || navigator.product === \"Gecko\" || (navigator.appName.indexOf(\"PSP\") + 1) || (navigator.appName.indexOf(\"PLAYSTATION 3\") + 1))) {\r\n\t\tstrBrowser = \"NetFront 3+\";\r\n\t} else if (navigator.product === \"Gecko\" && !navigator.savePreferences) {\r\n\t\tstrBrowser = \"Gecko engine (Mozilla, Netscape 6+ etc.)\";\r\n\t} else if (window.chrome) {\r\n\t\tstrBrowser = \"Chrome\";\r\n\t}\r\n\tstrOut = strBrowser;\r\n\treturn strOut;\r\n}\r\n\r\nvar glbOnError = \"N/A\"\r\nvar glbSep = \"|\";\r\n\r\nfunction activeXDetect(componentClassID) {\r\n\t\"use strict\";\r\n\tvar strComponentVersion, strOut;\r\n\r\n\tstrComponentVersion = \"\";\r\n\tstrOut = \"\";\r\n\r\n\ttry {\r\n\t\tstrComponentVersion = document.body.getComponentVersion(\"{\" + componentClassID + \"}\", \"ComponentID\");\r\n\t\tif (strComponentVersion !== null) {\r\n\t\t\tstrOut = strComponentVersion;\r\n\t\t} else {\r\n\t\t\tstrOut = false;\r\n\t\t}\r\n\t\treturn strOut;\r\n\t} catch (err) {\r\n\t\treturn glbOnError;\r\n\t}\r\n}\r\n\r\nfunction stripIllegalChars(strValue) {\r\n\t\"use strict\";\r\n\tvar iCounter, strOriginal, strOut;\r\n\r\n\tiCounter = 0;\r\n\tstrOriginal = \"\";\r\n\tstrOut = \"\";\r\n\r\n\ttry {\r\n\t\tstrOriginal = strValue.toLowerCase();\r\n\t\tfor (iCounter = 0; iCounter < strOriginal.length; iCounter = iCounter + 1) {\r\n\t\t\tif (strOriginal.charAt(iCounter) !== \"\\n\" && strOriginal.charAt(iCounter) !== \"/\" && strOriginal.charAt(iCounter) !== \"\\\\\") {\r\n\t\t\t\tstrOut = strOut + strOriginal.charAt(iCounter);\r\n\t\t\t} else if (strOriginal.charAt(iCounter) === \"\\n\") {\r\n\t\t\t\tstrOut = strOut + \"n\";\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn strOut;\r\n\t} catch (err) {\r\n\t\treturn glbOnError;\r\n\t}\r\n}\r\n\r\nfunction hashtable_containsKey(key) {\r\n\t\"use strict\";\r\n\tvar bolExists, iCounter;\r\n\r\n\tbolExists = false;\r\n\tiCounter = 0;\r\n\r\n\tfor (iCounter = 0; iCounter < this.hashtable.length; iCounter = iCounter + 1) {\r\n\t\tif (iCounter === key && this.hashtable[iCounter] !== null) {\r\n\t\t\tbolExists = true;\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\treturn bolExists;\r\n}\r\n\r\nfunction hashtable_get(key) {\r\n\t\"use strict\";\r\n\treturn this.hashtable[key];\r\n}\r\n\r\nfunction hashtable_keys() {\r\n\t\"use strict\";\r\n\tvar keys, iCounter;\r\n\r\n\tkeys = [];\r\n\tiCounter = 0;\r\n\r\n\tfor (iCounter in this.hashtable) {\r\n\t\tif (this.hashtable[iCounter] !== null) {\r\n\t\t\tkeys.push(iCounter);\r\n\t\t}\r\n\t}\r\n\treturn keys;\r\n}\r\n\r\nfunction hashtable_put(key, value) {\r\n\t\"use strict\";\r\n\tif (key === null || value === null) {\r\n\t\tthrow \"NullPointerException {\" + key + \"},{\" + value + \"}\";\r\n\t}\r\n\tthis.hashtable[key] = value;\r\n}\r\n\r\nfunction hashtable_size() {\r\n\t\"use strict\";\r\n\tvar iSize, iCounter, iOut;\r\n\r\n\tiSize = 0;\r\n\tiCounter = 0;\r\n\tiOut = 0;\r\n\r\n\tfor (iCounter in this.hashtable) {\r\n\t\tif (this.hashtable[iCounter] !== null) {\r\n\t\t\tiSize = iSize + 1;\r\n\t\t}\r\n\t}\r\n\tiOut = iSize;\r\n\treturn iOut;\r\n}\r\n\r\nfunction Hashtable() {\r\n\t\"use strict\";\r\n\tthis.containsKey = hashtable_containsKey;\r\n\tthis.get = hashtable_get;\r\n\tthis.keys = hashtable_keys;\r\n\tthis.put = hashtable_put;\r\n\tthis.size = hashtable_size;\r\n\tthis.hashtable = [];\r\n}\r\n\r\n/* Detect Plugins */\r\nfunction fingerprint_plugins() {\r\n\t\"use strict\";\r\n\tvar htIEComponents, strKey, strName, strVersion, strTemp, bolFirst, iCount, strMimeType, strOut;\r\n\r\n\ttry {\r\n\t\t/* Create hashtable of IE components */\r\n\t\thtIEComponents = new Hashtable();\r\n\t\thtIEComponents.put(\"7790769C-0471-11D2-AF11-00C04FA35D02\", \"AddressBook\"); // Address Book\r\n\t\thtIEComponents.put(\"47F67D00-9E55-11D1-BAEF-00C04FC2D130\", \"AolArtFormat\"); // AOL ART Image Format Support\r\n\t\thtIEComponents.put(\"76C19B38-F0C8-11CF-87CC-0020AFEECF20\", \"ArabicDS\"); // Arabic Text Display Support\r\n\t\thtIEComponents.put(\"76C19B34-F0C8-11CF-87CC-0020AFEECF20\", \"ChineseSDS\"); // Chinese (Simplified) Text Display Support\r\n\t\thtIEComponents.put(\"76C19B33-F0C8-11CF-87CC-0020AFEECF20\", \"ChineseTDS\"); // Chinese (traditional) Text Display Support\r\n\t\thtIEComponents.put(\"238F6F83-B8B4-11CF-8771-00A024541EE3\", \"CitrixICA\"); // Citrix ICA Client\r\n\t\thtIEComponents.put(\"283807B5-2C60-11D0-A31D-00AA00B92C03\", \"DirectAnim\"); // DirectAnimation\r\n\t\thtIEComponents.put(\"44BBA848-CC51-11CF-AAFA-00AA00B6015C\", \"DirectShow\"); // DirectShow\r\n\t\thtIEComponents.put(\"9381D8F2-0288-11D0-9501-00AA00B911A5\", \"DynHTML\"); // Dynamic HTML Data Binding\r\n\t\thtIEComponents.put(\"4F216970-C90C-11D1-B5C7-0000F8051515\", \"DynHTML4Java\"); // Dynamic HTML Data Binding for Java\r\n\t\thtIEComponents.put(\"D27CDB6E-AE6D-11CF-96B8-444553540000\", \"Flash\"); // Macromedia Flash\r\n\t\thtIEComponents.put(\"76C19B36-F0C8-11CF-87CC-0020AFEECF20\", \"HebrewDS\"); // Hebrew Text Display Support\r\n\t\thtIEComponents.put(\"630B1DA0-B465-11D1-9948-00C04F98BBC9\", \"IEBrwEnh\"); // Internet Explorer Browsing Enhancements\r\n\t\thtIEComponents.put(\"08B0E5C0-4FCB-11CF-AAA5-00401C608555\", \"IEClass4Java\"); // Internet Explorer Classes for Java\r\n\t\thtIEComponents.put(\"45EA75A0-A269-11D1-B5BF-0000F8051515\", \"IEHelp\"); // Internet Explorer Help\r\n\t\thtIEComponents.put(\"DE5AED00-A4BF-11D1-9948-00C04F98BBC9\", \"IEHelpEng\"); // Internet Explorer Help Engine\r\n\t\thtIEComponents.put(\"89820200-ECBD-11CF-8B85-00AA005B4383\", \"IE5WebBrw\"); // Internet Explorer 5/6 Web Browser\r\n\t\thtIEComponents.put(\"5A8D6EE0-3E18-11D0-821E-444553540000\", \"InetConnectionWiz\"); // Internet Connection Wizard\r\n\t\thtIEComponents.put(\"76C19B30-F0C8-11CF-87CC-0020AFEECF20\", \"JapaneseDS\"); // Japanese Text Display Support\r\n\t\thtIEComponents.put(\"76C19B31-F0C8-11CF-87CC-0020AFEECF20\", \"KoreanDS\"); // Korean Text Display Support\r\n\t\thtIEComponents.put(\"76C19B50-F0C8-11CF-87CC-0020AFEECF20\", \"LanguageAS\"); // Language Auto-Selection\r\n\t\thtIEComponents.put(\"08B0E5C0-4FCB-11CF-AAA5-00401C608500\", \"MsftVM\"); // Microsoft virtual machine\r\n\t\thtIEComponents.put(\"5945C046-LE7D-LLDL-BC44-00C04FD912BE\", \"MSNMessengerSrv\"); // MSN Messenger Service\r\n\t\thtIEComponents.put(\"44BBA842-CC51-11CF-AAFA-00AA00B6015B\", \"NetMeetingNT\"); // NetMeeting NT\r\n\t\thtIEComponents.put(\"3AF36230-A269-11D1-B5BF-0000F8051515\", \"OfflineBrwPack\"); // Offline Browsing Pack\r\n\t\thtIEComponents.put(\"44BBA840-CC51-11CF-AAFA-00AA00B6015C\", \"OutlookExpress\"); // Outlook Express\r\n\t\thtIEComponents.put(\"76C19B32-F0C8-11CF-87CC-0020AFEECF20\", \"PanEuropeanDS\"); // Pan-European Text Display Support\r\n\t\thtIEComponents.put(\"4063BE15-3B08-470D-A0D5-B37161CFFD69\", \"QuickTime\"); // Apple Quick Time\r\n\t\thtIEComponents.put(\"DE4AF3B0-F4D4-11D3-B41A-0050DA2E6C21\", \"QuickTimeCheck\"); // Apple Quick Time Check\r\n\t\thtIEComponents.put(\"3049C3E9-B461-4BC5-8870-4C09146192CA\", \"RealPlayer\"); // RealPlayer Download and Record Plugin for IE\r\n\t\thtIEComponents.put(\"2A202491-F00D-11CF-87CC-0020AFEECF20\", \"ShockwaveDir\"); // Macromedia Shockwave Director\r\n\t\thtIEComponents.put(\"3E01D8E0-A72B-4C9F-99BD-8A6E7B97A48D\", \"Skype\"); // Skype\r\n\t\thtIEComponents.put(\"CC2A9BA0-3BDD-11D0-821E-444553540000\", \"TaskScheduler\"); // Task Scheduler\r\n\t\thtIEComponents.put(\"76C19B35-F0C8-11CF-87CC-0020AFEECF20\", \"ThaiDS\"); // Thai Text Display Support\r\n\t\thtIEComponents.put(\"3BF42070-B3B1-11D1-B5C5-0000F8051515\", \"Uniscribe\"); // Uniscribe\r\n\t\thtIEComponents.put(\"4F645220-306D-11D2-995D-00C04F98BBC9\", \"VBScripting\"); // Visual Basic Scripting Support v5.6\r\n\t\thtIEComponents.put(\"76C19B37-F0C8-11CF-87CC-0020AFEECF20\", \"VietnameseDS\"); // Vietnamese Text Display Support\r\n\t\thtIEComponents.put(\"10072CEC-8CC1-11D1-986E-00A0C955B42F\", \"VML\"); // Vector Graphics Rendering (VML)\r\n\t\thtIEComponents.put(\"90E2BA2E-DD1B-4CDE-9134-7A8B86D33CA7\", \"WebEx\"); // WebEx Productivity Tools\r\n\t\thtIEComponents.put(\"73FA19D0-2D75-11D2-995D-00C04F98BBC9\", \"WebFolders\"); // Web Folders\r\n\t\thtIEComponents.put(\"89820200-ECBD-11CF-8B85-00AA005B4340\", \"WinDesktopUpdateNT\"); // Windows Desktop Update NT\r\n\t\thtIEComponents.put(\"9030D464-4C02-4ABF-8ECC-5164760863C6\", \"WinLive\"); // Windows Live ID Sign-in Helper\r\n\t\thtIEComponents.put(\"6BF52A52-394A-11D3-B153-00C04F79FAA6\", \"WinMediaPlayer\"); // Windows Media Player (Versions 7, 8 or 9)\r\n\t\thtIEComponents.put(\"22D6F312-B0F6-11D0-94AB-0080C74C7E95\", \"WinMediaPlayerTrad\"); // Windows Media Player (Traditional Versions)\r\n\r\n\t\tstrTemp = \"\";\r\n\t\tbolFirst = true;\r\n\r\n\t\t/* strOpera gives full path of the file, extract the filenames, ignoring description and length */\r\n\t\tif (navigator.plugins.length > 0) {\r\n\t\t\tfor (iCount = 0; iCount < navigator.plugins.length; iCount = iCount + 1) {\r\n\t\t\t\tif (bolFirst === true) {\r\n\t\t\t\t\tstrTemp += navigator.plugins[iCount].name;\r\n\t\t\t\t\tbolFirst = false;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tstrTemp += glbSep + navigator.plugins[iCount].name;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else if (navigator.mimeTypes.length > 0) {\r\n\t\t\tstrMimeType = navigator.mimeTypes;\r\n\t\t\tfor (iCount = 0; iCount < strMimeType.length; iCount = iCount + 1) {\r\n\t\t\t\tif (bolFirst === true) {\r\n\t\t\t\t\tstrTemp += strMimeType[iCount].description;\r\n\t\t\t\t\tbolFirst = false;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tstrTemp += glbSep + strMimeType[iCount].description;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tdocument.body.addBehavior(\"#default#clientCaps\");\r\n\t\t\tstrKey = htIEComponents.keys();\r\n\t\t\tfor (iCount = 0; iCount < htIEComponents.size(); iCount = iCount + 1) {\r\n\t\t\t\tstrVersion = activeXDetect(strKey[iCount]);\r\n\t\t\t\tstrName = htIEComponents.get(strKey[iCount]);\r\n\t\t\t\tif (strVersion) {\r\n\t\t\t\t\tif (bolFirst === true) {\r\n\t\t\t\t\t\tstrTemp = strName + glbPair + strVersion;\r\n\t\t\t\t\t\tbolFirst = false;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tstrTemp += glbSep + strName + glbPair + strVersion;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tstrTemp = strTemp.replace(/,/g, \".\");\r\n\t\t}\r\n\t\tstrTemp = stripIllegalChars(strTemp);\r\n\t\tif (strTemp === \"\") {\r\n\t\t\tstrTemp = \"None\";\r\n\t\t}\r\n\t\tstrOut = strTemp;\r\n\t\treturn strOut;\r\n\t} catch (err) {\r\n\t\treturn glbOnError;\r\n\t}\r\n}","/*\r\n * Glorious webAO\r\n * made by sD, refactored by oldmud0 and Qubrick\r\n * credits to aleks for original idea and source\r\n*/\r\n\r\n// Uses the Gify library:\r\n// https://github.com/rfrench/gify\r\n// The following comment is needed for ESLint:\r\n/* global gify */\r\n\r\nimport background_arr from \"./backgrounds.js\";\r\nimport evidence_arr from \"./evidence.js\";\r\nimport Fingerprint from \"./fingerprint.js\";\r\n\r\nlet queryDict = {};\r\nlocation.search.substr(1).split(\"&\").forEach(function (item) {\r\n\tqueryDict[item.split(\"=\")[0]] = item.split(\"=\")[1];\r\n});\r\n\r\n/* Server magic */\r\n\r\nconst serverIP = queryDict.ip;\r\nlet mode = queryDict.mode;\r\n\r\nconst AO_HOST = queryDict.asset || \"http://s3.wasabisys.com/webao/base/\";\r\nconst MUSIC_HOST = AO_HOST + \"sounds/music/\";\r\nconst CHAR_SELECT_WIDTH = 8;\r\nconst UPDATE_INTERVAL = 60;\r\n\r\nlet oldLoading = false;\r\nif (/Android|webOS|iPhone|iPad|iPod|BlackBerry|BB|PlayBook|IEMobile|Windows Phone|Kindle|Silk|Opera Mini/i.test(navigator.userAgent)) {\r\n\toldLoading = true;\r\n}\r\n\r\nlet selectedEffect = 0;\r\nlet selectedMenu = 1;\r\nlet selectedShout = 0;\r\nlet fp = new Fingerprint({\r\n\tcanvas: true,\r\n\tie_activex: true,\r\n\tscreen_resolution: true\r\n});\r\nlet uid = fp.get();\r\nconsole.log(uid);\r\nlet lastICMessageTime = new Date(0);\r\n\r\nclass Client {\r\n\tconstructor(address) {\r\n\t\tthis.serv = new WebSocket(\"ws://\" + address);\r\n\r\n\t\tthis.serv.onopen = (evt) => this.onOpen(evt);\r\n\t\tthis.serv.onclose = (evt) => this.onClose(evt);\r\n\t\tthis.serv.onmessage = (evt) => this.onMessage(evt);\r\n\t\tthis.serv.onerror = (evt) => this.onError(evt);\r\n\r\n\t\tthis.flip = false;\r\n\t\tthis.presentable = false;\r\n\r\n\t\tthis.hp = [0, 0];\r\n\r\n\t\tthis.playerID = 1;\r\n\t\tthis.charID = -1;\r\n\t\tthis.testimonyID = 0;\r\n\r\n\t\tthis.chars = [];\r\n\t\tthis.emotes = [];\r\n\t\tthis.evidences = [];\r\n\r\n\t\tthis.resources = {\r\n\t\t\t\"holdit\": {\r\n\t\t\t\t\"src\": \"misc/holdit.gif\",\r\n\t\t\t\t\"duration\": 720\r\n\t\t\t},\r\n\t\t\t\"objection\": {\r\n\t\t\t\t\"src\": \"misc/objection.gif\",\r\n\t\t\t\t\"duration\": 720\r\n\t\t\t},\r\n\t\t\t\"takethat\": {\r\n\t\t\t\t\"src\": \"misc/takethat.gif\",\r\n\t\t\t\t\"duration\": 840\r\n\t\t\t},\r\n\t\t\t\"witnesstestimony\": {\r\n\t\t\t\t\"src\": \"misc/witnesstestimony.gif\",\r\n\t\t\t\t\"duration\": 1560,\r\n\t\t\t\t\"sfx\": \"sounds/general/sfx-testimony.wav\"\r\n\t\t\t},\r\n\t\t\t\"crossexamination\": {\r\n\t\t\t\t\"src\": \"misc/crossexamination.gif\",\r\n\t\t\t\t\"duration\": 1600,\r\n\t\t\t\t\"sfx\": \"sounds/general/sfx-testimony2.wav\"\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tthis.selectedEmote = -1;\r\n\t\tthis.selectedEvidence = 0;\r\n\r\n\t\tthis.checkUpdater = null;\r\n\r\n\t\t// Only used for RMC/`music` packets, not EM/SM/MC packets.\r\n\t\tthis.musicList = Object();\r\n\r\n\t\tthis.handlers = {\r\n\t\t\t\"MS\": (args) => this.handleMS(args),\r\n\t\t\t\"CT\": (args) => this.handleCT(args),\r\n\t\t\t\"MC\": (args) => this.handleMC(args),\r\n\t\t\t\"RMC\": (args) => this.handleRMC(args),\r\n\t\t\t\"CI\": (args) => this.handleCI(args),\r\n\t\t\t\"SC\": (args) => this.handleSC(args),\r\n\t\t\t\"EI\": (args) => this.handleEI(args),\r\n\t\t\t\"LE\": (args) => this.handleLE(args),\r\n\t\t\t\"EM\": (args) => this.handleEM(args),\r\n\t\t\t\"SM\": (args) => this.handleSM(args),\r\n\t\t\t\"BD\": (args) => this.handleBD(args),\r\n\t\t\t\"music\": (args) => this.handlemusic(args),\r\n\t\t\t\"DONE\": (args) => this.handleDONE(args),\r\n\t\t\t\"BN\": (args) => this.handleBN(args),\r\n\t\t\t\"NBG\": (args) => this.handleNBG(args),\r\n\t\t\t\"HP\": (args) => this.handleHP(args),\r\n\t\t\t\"RT\": (args) => this.handleRT(args),\r\n\t\t\t\"ZZ\": (args) => this.handleZZ(args),\r\n\t\t\t\"ID\": (args) => this.handleID(args),\r\n\t\t\t\"PN\": (args) => this.handlePN(args),\r\n\t\t\t\"SI\": (args) => this.handleSI(args),\r\n\t\t\t\"CharsCheck\": (args) => this.handleCharsCheck(args),\r\n\t\t\t\"PV\": (args) => this.handlePV(args),\r\n\t\t\t\"CHECK\": (args) => {}\r\n\t\t};\r\n\r\n\t\tthis._lastTimeICReceived = new Date(0);\r\n\t}\r\n\r\n\t/**\r\n\t * Gets the current player's character.\r\n\t */\r\n\tme() {\r\n\t\treturn this.chars[this.charID];\r\n\t}\r\n\r\n\t/**\r\n\t * Gets the player's currently selected emote.\r\n\t */\r\n\tmyEmote() {\r\n\t\treturn this.emotes[this.selectedEmote];\r\n\t}\r\n\r\n\t/**\r\n\t * Gets the player's currently selected evidence if presentable.\r\n\t */\r\n\tmyEvidence() {\r\n\t\treturn this.presentable ? this.selectedEvidence : 0;\r\n\t}\r\n\r\n\t/**\r\n\t * Sends an out-of-character chat message.\r\n\t * @param {string} message the message to send\r\n\t */\r\n\tsendOOC(message) {\r\n\t\tthis.serv.send(`CT#${escapeChat(encodeChat(document.getElementById(\"OOC_name\").value))}#${escapeChat(encodeChat(message))}#%`);\r\n\t}\r\n\r\n\t/**\r\n\t * Sends an in-character chat message.\r\n\t * @param {string} speaking who is speaking\r\n\t * @param {string} name the name of the current character\r\n\t * @param {string} silent whether or not it's silent\r\n\t * @param {string} message the message to be sent\r\n\t * @param {string} side the name of the side in the background\r\n\t * @param {string} ssfxname the name of the sound effect\r\n\t * @param {string} zoom whether or not to zoom\r\n\t * @param {number} ssfxdelay the delay (in milliseconds) to play the sound effect\r\n\t * @param {string} objection the number of the shout to play\r\n\t * @param {string} evidence the filename of evidence to show\r\n\t * @param {number} flip change to 1 to reverse sprite for position changes\r\n\t * @param {string} flash screen flash effect\r\n\t * @param {string} color text color\r\n\t */\r\n\tsendIC(speaking, name, silent, message, side, ssfxname, zoom, ssfxdelay, objection, evidence, flip, flash, color) {\r\n\t\tthis.serv.send(\r\n\t\t\t`MS#chat#${speaking}#${name}#${silent}` +\r\n\t\t\t`#${escapeChat(encodeChat(message))}#${side}#${ssfxname}#${zoom}` +\r\n\t\t\t`#${this.charID}#${ssfxdelay}#${selectedShout}#${evidence}#${flip}#${flash}#${color}#%`\r\n\t\t);\r\n\t}\r\n\r\n\t/**\r\n\t * Sends add evidence command.\r\n\t * @param {string} evidence name\r\n\t * @param {string} evidence description\r\n\t * @param {string} evidence image filename\r\n\t */\r\n\tsendPE(name, desc, img) {\r\n\t\tthis.serv.send(`PE#${escapeChat(encodeChat(name))}#${escapeChat(encodeChat(desc))}#${img}#%`);\r\n\t}\r\n\r\n\t/**\r\n\t * Sends edit evidence command.\r\n\t * @param {number} evidence id\r\n\t * @param {string} evidence name\r\n\t * @param {string} evidence description\r\n\t * @param {string} evidence image filename\r\n\t */\r\n\tsendEE(id, name, desc, img) {\r\n\t\tthis.serv.send(`EE#${id}#${escapeChat(encodeChat(name))}#${escapeChat(encodeChat(desc))}#${img}#%`);\r\n\t}\r\n\r\n\t/**\r\n\t * Sends delete evidence command.\r\n\t * @param {number} evidence id\r\n\t */\r\n\tsendDE(id) {\r\n\t\tthis.serv.send(`DE#${id}#%`);\r\n\t}\r\n\r\n\t/**\r\n\t * Sends health point command.\r\n\t * @param {number} side the position\r\n\t * @param {number} hp the health point\r\n\t */\r\n\tsendHP(side, hp) {\r\n\t\tthis.serv.send(`HP#${side}#${hp}#%`);\r\n\t}\r\n\r\n\t/**\r\n\t * Sends call mod command.\r\n\t * @param {string} message to mod\r\n\t */\r\n\tsendZZ(msg) {\r\n\t\tthis.serv.send(`ZZ#${msg}#%`);\r\n\t}\r\n\r\n\t/**\r\n\t * Sends testimony command.\r\n\t * @param {string} testimony type\r\n\t */\r\n\tsendRT(testimony) {\r\n\t\tif (this.chars[this.charID].side == \"jud\") {\r\n\t\t\tthis.serv.send(`RT#${testimony}#%`);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Requests to change the music to the specified track.\r\n\t * @param {string} track the track ID\r\n\t */\r\n\tsendMusicChange(track) {\r\n\t\tthis.serv.send(`MC#${track}#${this.charID}#%`);\r\n\t}\r\n\r\n\t/**\r\n\t * Requests to leave the room and free the character slot.\r\n\t * \r\n\t * Note: This packet is undocumented. It is not implemented by\r\n\t * either the AO2 client or tsuserver.\r\n\t */\r\n\tsendLeaveRoom() {\r\n\t\tthis.serv.send(\"FC#%\");\r\n\t}\r\n\r\n\t/**\r\n\t * Begins the handshake process by sending an identifier\r\n\t * to the server.\r\n\t */\r\n\tjoinServer() {\r\n\t\tthis.serv.send(`HI#${hash6ode()}#%`);\r\n\t\tthis.serv.send(\"ID#webAO#2.3#%\");\r\n\t\tthis.checkUpdater = setInterval(() => this.sendCheck(), 5000);\r\n\t}\r\n\r\n\t/**\r\n\t * Load game resources.\r\n\t */\r\n\tloadResources() {\r\n\t\t// Set to playerID to server chat name\r\n\t\t// TODO: Make a text box for this!\r\n\t\tdocument.getElementById(\"OOC_name\").value = \"web\" + this.playerID;\r\n\r\n\t\t// Load evidence array to select\r\n\t\tconst evidence_select = document.getElementById(\"evi_select\");\r\n\t\tevidence_select.add(new Option(\"Custom\", 0));\r\n\t\tevidence_arr.forEach(evidence => {\r\n\t\t\tevidence_select.add(new Option(evidence));\r\n\t\t});\r\n\r\n\t\t// Load background array to select\r\n\t\tconst background_select = document.getElementById(\"bg_select\");\r\n\t\tbackground_select.add(new Option(\"Custom\", 0));\r\n\t\tbackground_arr.forEach(background => {\r\n\t\t\tbackground_select.add(new Option(background));\r\n\t\t});\r\n\t\t// Calculate gif duration of shouts\r\n\t\tconst shouts = [\"holdit\", \"objection\", \"takethat\"];\r\n\t\tfor (let i = 0; i < shouts.length; i++) {\r\n\t\t\tlet shout_src = AO_HOST + this.resources[shouts[i]][\"src\"].toLowerCase();\r\n\t\t\tfileExists(shout_src, this.callbackLoadImageResources, shouts[i]);\r\n\t\t}\r\n\r\n\t\t// Calculate gif duration of testimony\r\n\t\tconst testimony = [\"witnesstestimony\", \"crossexamination\"];\r\n\t\tfor (let i = 0; i < testimony.length; i++) {\r\n\t\t\tconst testimony_src = `${AO_HOST}themes/default/${testimony[i]}.gif`;\r\n\t\t\t// Check image existed\r\n\t\t\tfileExists(testimony_src, this.callbackLoadImageResources, testimony[i]);\r\n\t\t\t// Check sfx existed\r\n\t\t\tfileExists(AO_HOST + this.resources[testimony[i]][\"sfx\"].toLowerCase(), this.callbackLoadSFXResources, testimony[i]);\r\n\t\t}\r\n\t\t// TODO: Cache some resources\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Callback for image resources.\r\n\t * @param {boolean} result the image is existed or not\r\n\t * @param {string} resource the resource name\r\n\t * @param {string} src the url of resource\r\n\t */\r\n\tcallbackLoadImageResources(result, resource, src) {\r\n\t\tif (result) {\r\n\t\t\tclient.resources[resource][\"src\"] = src;\r\n\t\t\tviewport.getAnimLength(src, client.callbackGetResourceLength, resource);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Callback for animation duration resource\r\n\t * @param {integer} length the animation length\r\n\t * @param {string} resource the resource name\r\n\t */\r\n\tcallbackGetResourceLength(length, resource) {\r\n\t\tclient.resources[resource][\"duration\"] = length;\r\n\t}\r\n\r\n\t/**\r\n\t * Callback for sfx resources.\r\n\t * @param {boolean} result the audio is existed or not\r\n\t * @param {string} resource the resource name\r\n\t * @param {string} src the url of resource\r\n\t */\r\n\tcallbackLoadSFXResources(result, resource, src) {\r\n\t\tif (result) {\r\n\t\t\tclient.resources[resource][\"sfx\"] = src;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Create observer to detect BBCode elements\r\n\t * then manipulate them.\r\n\t */\r\n\tinitialObservBBCode() {\r\n\t\tconst target = document.getElementById(\"client_inner_chat\");\r\n\t\tconst observer = new MutationObserver(function (mutations) {\r\n\t\t\tmutations.forEach(function (mutation) {\r\n\t\t\t\tconst children = mutation.addedNodes;\r\n\t\t\t\tif (children !== null) {\r\n\t\t\t\t\tchildren.forEach(function (node) {\r\n\t\t\t\t\t\tif (node.tagName == \"C\") {\r\n\t\t\t\t\t\t\tnode.style.color = node.getAttribute(\"a\");\r\n\t\t\t\t\t\t} else if (node.tagName == \"M\") {\r\n\t\t\t\t\t\t\tif (node.hasAttribute(\"a\")) {\r\n\t\t\t\t\t\t\t\tnode.style.backgroundColor = node.getAttribute(\"a\");\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tnode.style.backgroundColor = \"yellow\";\r\n\t\t\t\t\t\t\t\tnode.style.color = \"black\";\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t});\r\n\t\tconst config = {\r\n\t\t\tattributes: true,\r\n\t\t\tchildList: true\r\n\t\t};\r\n\t\tobserver.observe(target, config);\r\n\t}\r\n\r\n\t/**\r\n\t * Requests to play as a specified character.\r\n\t * @param {number} character the character ID\r\n\t */\r\n\tsendCharacter(character) {\r\n\t\tthis.serv.send(`CC#${this.playerID}#${character}#web#%`);\r\n\t}\r\n\r\n\t/**\r\n\t * Requests to select a music track.\r\n\t * @param {number?} song the song to be played\r\n\t */\r\n\tsendMusic(song) {\r\n\t\tthis.serv.send(`MC#${song}`);\r\n\t}\r\n\r\n\t/**\r\n\t * Sends a keepalive packet.\r\n\t */\r\n\tsendCheck() {\r\n\t\tthis.serv.send(`CH#${this.charID}#%`);\r\n\t}\r\n\r\n\t/**\r\n\t * Triggered when a connection is established to the server.\r\n\t */\r\n\tonOpen(e) {\r\n\t\t// XXX: Why does watching mean just SITTING there and doing nothing?\r\n\t\tif (mode === \"watch\") {\r\n\t\t\tdocument.getElementById(\"client_loading\").style.display = \"none\";\r\n\t\t\tdocument.getElementById(\"client_charselect\").style.display = \"none\";\r\n\t\t} else {\r\n\t\t\tclient.joinServer();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Triggered when the connection to the server closes.\r\n\t * @param {CloseEvent} e\r\n\t */\r\n\tonClose(e) {\r\n\t\tconsole.error(`The connection was closed: ${e.reason} (${e.code})`);\r\n\t\tif (e.code !== 1001) {\r\n\t\t\tdocument.getElementById(\"client_error\").style.display = \"block\";\r\n\t\t\tdocument.getElementById(\"error_id\").textContent = e.code;\r\n\t\t\tthis.cleanup();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Triggered when a packet is received from the server.\r\n\t * @param {MessageEvent} e\r\n\t */\r\n\tonMessage(e) {\r\n\t\tlet msg = e.data;\r\n\t\tconsole.debug(msg);\r\n\t\tlet lines = msg.split(\"%\");\r\n\t\tlet args = lines[0].split(\"#\");\r\n\t\tlet header = args[0];\r\n\t\tlet handler = this.handlers[header];\r\n\t\tif (typeof handler !== \"undefined\") {\r\n\t\t\thandler(args);\r\n\t\t} else {\r\n\t\t\tconsole.warn(`Invalid packet header ${header}`);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Triggered when an network error occurs.\r\n\t * @param {ErrorEvent} e \r\n\t */\r\n\tonError(e) {\r\n\t\tconsole.error(`A network error occurred: ${e.reason} (${e.code})`);\r\n\t\tdocument.getElementById(\"client_error\").style.display = \"block\";\r\n\t\tdocument.getElementById(\"error_id\").textContent = e.code;\r\n\t\tthis.cleanup();\r\n\t}\r\n\r\n\tcleanup() {\r\n\t\ttry {\r\n\t\t\tthis.serv.close(1001);\r\n\t\t} catch (e) {\r\n\t\t\t// I don't care if this errors\r\n\t\t}\r\n\t\tclearInterval(this.checkUpdater);\r\n\t}\r\n\r\n\t/**\r\n\t * XXX: a nasty hack made by gameboyprinter.\r\n\t * @param {string} msg chat message to prepare for display \r\n\t */\r\n\tprepChat(msg){\r\n\t\t// TODO: make this less awful\r\n\t\treturn decodeBBCode(unescapeChat(decodeChat(msg)));\r\n\t}\r\n\r\n\t/**\r\n\t * Handles an in-character chat message.\r\n\t * @param {*} args packet arguments\r\n\t */\r\n\thandleMS(args) {\r\n\t\t// TODO: this if-statement might be a bug.\r\n\t\tif (args[4] != viewport.chatmsg.content) {\r\n\t\t\tdocument.getElementById(\"client_inner_chat\").innerHTML = \"\";\r\n\t\t\tconst chatmsg = {\r\n\t\t\t\t// pre: escape(args[2]),\r\n\t\t\t\tcharacter: -1, // Will do a linear search\r\n\t\t\t\tpreanim: escape(args[2]), // XXX: why again?\r\n\t\t\t\tnameplate: args[3], // TODO: parse INI to get this info\r\n\t\t\t\tname: args[3],\r\n\t\t\t\tspeaking: \"(b)\" + escape(args[4]),\r\n\t\t\t\tsilent: \"(a)\" + escape(args[4]),\r\n\t\t\t\tcontent: this.prepChat(args[5]), // Escape HTML tag, Use BBCode Only!\r\n\t\t\t\tside: args[6],\r\n\t\t\t\tsound: escape(args[7]),\r\n\t\t\t\ttype: args[8],\r\n\t\t\t\t// charid: args[9],\r\n\t\t\t\tsnddelay: args[10],\r\n\t\t\t\tobjection: args[11],\r\n\t\t\t\tevidence: args[12],\r\n\t\t\t\tflip: args[13],\r\n\t\t\t\tflash: args[14],\r\n\t\t\t\tcolor: args[15],\r\n\t\t\t\tisnew: true,\r\n\t\t\t};\r\n\r\n\t\t\t// The dreaded linear search...\r\n\t\t\tfor (let i = 0; i < this.chars.length; i++) {\r\n\t\t\t\tif (this.chars[i].name == args[3]) {\r\n\t\t\t\t\tchatmsg.character = i;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (chatmsg.character == this.charID) {\r\n\t\t\t\tresetICParams();\r\n\t\t\t}\r\n\r\n\t\t\tviewport.say(chatmsg);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Handles an out-of-character chat message.\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandleCT(args) {\r\n\t\tconst oocLog = document.getElementById(\"client_ooclog\");\r\n\t\toocLog.innerHTML += `${decodeChat(unescapeChat(args[1]))}: ${decodeChat(unescapeChat(args[2]))}\\r\\n`;\r\n\t\tif (oocLog.scrollTop > oocLog.scrollHeight - 600) {\r\n\t\t\toocLog.scrollTop = oocLog.scrollHeight;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Handles a music change to an arbitrary resource.\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandleMC(args) {\r\n\t\tconst music = viewport.music;\r\n\t\tmusic.pause();\r\n\t\tmusic.src = MUSIC_HOST + args[1].toLowerCase();\r\n\t\tmusic.play();\r\n\t\tif (args[2] >= 0) {\r\n\t\t\tlet musicname = this.chars[args[2]].name;\r\n\t\t\tappendICLog(`${musicname} changed music to ${args[1]}`);\r\n\t\t} else {\r\n\t\t\tappendICLog(`The music was changed to ${args[1]}`);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Handles a music change to an arbitrary resource, with an offset in seconds.\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandleRMC(args) {\r\n\t\tviewport.music.pause();\r\n\t\tviewport.music = new Audio(this.musicList[args[1]]);\r\n\t\tconst music = viewport.music;\r\n\t\t// Music offset + drift from song loading\r\n\t\tmusic.totime = args[1];\r\n\t\tmusic.offset = new Date().getTime() / 1000;\r\n\t\tmusic.addEventListener(\"loadedmetadata\", function () {\r\n\t\t\tmusic.currentTime += parseFloat(music.totime + (new Date().getTime() / 1000 - music.offset)).toFixed(3);\r\n\t\t\tmusic.play();\r\n\t\t}, false);\r\n\t}\r\n\r\n\t/**\r\n\t * Handles incoming character information, bundling multiple characters\r\n\t * per packet.\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandleCI(args) {\r\n\t\tdocument.getElementById(\"client_loadingtext\").innerHTML = \"Loading Character \" + args[1];\r\n\t\tthis.serv.send(\"AN#\" + ((args[1] / 10) + 1) + \"#%\");\r\n\t\tfor (let i = 2; i < args.length - 1; i++) {\r\n\t\t\tif (i % 2 == 0) {\r\n\t\t\t\tlet chargs = args[i].split(\"&\");\r\n\t\t\t\tthis.chars[args[i - 1]] = {\r\n\t\t\t\t\t\"name\": chargs[0],\r\n\t\t\t\t\t\"desc\": chargs[1],\r\n\t\t\t\t\t\"evidence\": chargs[3],\r\n\t\t\t\t\t\"icon\": AO_HOST + \"characters/\" + escape(chargs[0].toLowerCase()) + \"/char_icon.png\"\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Handles incoming character information, containing only one character\r\n\t * per packet.\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandleSC(args) {\r\n\t\tdocument.getElementById(\"client_loadingtext\").innerHTML = \"Loading Characters\";\r\n\t\tfor (let i = 1; i < args.length - 1; i++) {\r\n\t\t\tlet chargs = args[i].split(\"&\");\r\n\t\t\tthis.chars[i - 1] = {\r\n\t\t\t\t\"name\": chargs[0],\r\n\t\t\t\t\"desc\": chargs[1],\r\n\t\t\t\t\"evidence\": chargs[3],\r\n\t\t\t\t\"icon\": AO_HOST + \"characters/\" + escape(chargs[0].toLowerCase()) + \"/char_icon.png\"\r\n\t\t\t};\r\n\t\t}\r\n\t\tthis.serv.send(\"RM#%\");\r\n\t}\r\n\r\n\t/**\r\n\t * Handles incoming evidence information, containing only one evidence\r\n\t * item per packet.\r\n\t * \r\n\t * Mostly unimplemented in webAO.\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandleEI(args) {\r\n\t\tdocument.getElementById(\"client_loadingtext\").innerHTML = \"Loading Evidence \" + args[1];\r\n\t\t//serv.send(\"AE#\" + (args[1] + 1) + \"#%\");\r\n\t\tthis.serv.send(\"RM#%\");\r\n\t}\r\n\r\n\t/**\r\n\t * Handles incoming evidence list, all evidences at once\r\n\t * item per packet.\r\n\t * \r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandleLE(args) {\r\n\t\tthis.evidences = [];\r\n\t\tfor (let i = 1; i < args.length - 1; i++) {\r\n\t\t\tconst arg = args[i].split(\"&\");\r\n\t\t\tthis.evidences[i - 1] = {\r\n\t\t\t\t\"name\": decodeChat(unescapeChat(arg[0])),\r\n\t\t\t\t\"desc\": decodeChat(unescapeChat(arg[1])),\r\n\t\t\t\t\"filename\": escape(arg[2]),\r\n\t\t\t\t\"icon\": AO_HOST + \"evidence/\" + escape(arg[2].toLowerCase())\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tconst evidence_box = document.getElementById(\"evidences\");\r\n\t\tevidence_box.innerHTML = \"\";\r\n\t\tfor (let i = 1; i <= this.evidences.length; i++) {\r\n\t\t\tevidence_box.innerHTML += `<img src=\"${this.evidences[i - 1].icon}\" \r\n\t\t\t\tid=\"evi_${i}\" \r\n\t\t\t\talt=\"${this.evidences[i - 1].name}\"\r\n\t\t\t\tclass=\"client_button\"\r\n\t\t\t\tonclick=\"pickEvidence(${i})\">`;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Handles incoming music information, containing multiple entries\r\n\t * per packet.\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandleEM(args) {\r\n\t\tdocument.getElementById(\"client_loadingtext\").innerHTML = \"Loading Music \" + args[1];\r\n\t\tthis.serv.send(\"AM#\" + ((args[1] / 10) + 1) + \"#%\");\r\n\t\tlet hmusiclist = document.getElementById(\"client_musiclist\");\r\n\t\tfor (let i = 2; i < args.length - 1; i++) {\r\n\t\t\tif (i % 2 == 0) {\r\n\t\t\t\tlet newentry = document.createElement(\"OPTION\");\r\n\t\t\t\tnewentry.text = args[i];\r\n\t\t\t\thmusiclist.options.add(newentry);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Handles incoming music information, containing only one entry\r\n\t * per packet.\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandleSM(args) {\r\n\t\tdocument.getElementById(\"client_loadingtext\").innerHTML = \"Loading Music \";\r\n\t\tconst hmusiclist = document.getElementById(\"client_musiclist\");\r\n\t\tlet flagAudio = false;\r\n\r\n\t\tfor (let i = 1; i < args.length - 1; i++) {\r\n\t\t\t// Check when found the song for the first time\r\n\t\t\tif (/\\.(?:wav|mp3|mp4|ogg|opus)$/i.test(args[i]) && !flagAudio) {\r\n\t\t\t\tflagAudio = true;\r\n\t\t\t}\r\n\r\n\t\t\tif (flagAudio) {\r\n\t\t\t\t// After reached the audio put everything in the music list\r\n\t\t\t\tconst newentry = document.createElement(\"OPTION\");\r\n\t\t\t\tnewentry.text = args[i];\r\n\t\t\t\thmusiclist.options.add(newentry);\r\n\t\t\t} else {\r\n\t\t\t\t// Create area button\r\n\t\t\t\tconst newarea = document.createElement(\"SPAN\");\r\n\t\t\t\tnewarea.className = \"location-box\";\r\n\t\t\t\tnewarea.textContent = args[i];\r\n\t\t\t\tnewarea.onclick = function () {\r\n\t\t\t\t\tarea_click(this);\r\n\t\t\t\t};\r\n\t\t\t\tdocument.getElementById(\"areas\").appendChild(newarea);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// We need to check if the last area that we got was actually a category\r\n\t\t// header for music. If it was, then move it over to the music list.\r\n\t\tconst area_box = document.getElementById(\"areas\");\r\n\t\tif (area_box.lastChild.textContent.startsWith(\"=\")) {\r\n\t\t\tconst audio_title = document.createElement(\"OPTION\");\r\n\t\t\taudio_title.text = area_box.lastChild.textContent;\r\n\t\t\thmusiclist.insertBefore(audio_title, hmusiclist.firstChild);\r\n\t\t\tarea_box.removeChild(area_box.lastChild);\r\n\t\t}\r\n\r\n\t\tthis.serv.send(\"RD#%\");\r\n\t}\r\n\r\n\t/**\r\n\t * Handles the banned packet\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandleBD(args) {\r\n\t\tdocument.getElementById(\"client_loadingtext\").innerHTML = \"Banned: \" + args[1];\r\n\t}\r\n\r\n\t/**\r\n\t * Handles incoming music information, containing all entries\r\n\t * in the same packet.\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandlemusic(args) {\r\n\t\tfor (let i = 0; i < args.length / 2; i++) {\r\n\t\t\tthis.musicList[args[2 * i]] = args[2 * i + 1];\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Handles the handshake completion packet, meaning the player\r\n\t * is ready to select a character.\r\n\t * \r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandleDONE(args) {\r\n\t\tdocument.getElementById(\"client_loading\").style.display = \"none\";\r\n\t\tdocument.getElementById(\"client_charselect\").style.display = \"block\";\r\n\t}\r\n\r\n\t/**\r\n\t * Handles a background change.\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandleBN(args) {\r\n\t\tviewport.bgname = escape(args[1]);\r\n\t\tconst bg_index = getIndexFromSelect(\"bg_select\", escape(args[1]));\r\n\t\tdocument.getElementById(\"bg_select\").selectedIndex = bg_index;\r\n\t\tupdateBackgroundPreview();\r\n\t\tif (bg_index == 0) {\r\n\t\t\tdocument.getElementById(\"bg_filename\").value = args[1];\r\n\t\t}\r\n\t\tdocument.getElementById(\"bg_preview\").src = AO_HOST + \"background/\" + escape(args[1].toLowerCase()) + \"/defenseempty.png\";\r\n\t\tif (this.charID == -1) {\r\n\t\t\tchangeBackground(\"jud\");\r\n\t\t} else {\r\n\t\t\tchangeBackground(this.chars[this.charID].side);\r\n\t\t}\r\n\r\n\t}\r\n\r\n\thandleNBG(args) {\r\n\t\t// TODO (set by sD)\r\n\t}\r\n\r\n\t/**\r\n\t * Handles a change in the health bars' states.\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandleHP(args) {\r\n\t\tconst percent_hp = args[2] * 10;\r\n\t\tif (args[1] == 1) {\r\n\t\t\t// Def hp\r\n\t\t\tthis.hp[0] = args[2];\r\n\t\t\t$(\"#client_defense_hp > .health-bar\").animate({\r\n\t\t\t\t\"width\": percent_hp + \"%\"\r\n\t\t\t}, 500);\r\n\t\t} else {\r\n\t\t\t// Pro hp\r\n\t\t\tthis.hp[1] = args[2];\r\n\t\t\t$(\"#client_prosecutor_hp > .health-bar\").animate({\r\n\t\t\t\t\"width\": percent_hp + \"%\"\r\n\t\t\t}, 500);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Handles a testimony states.\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandleRT(args) {\r\n\t\tif (args[1] == \"testimony1\") {\r\n\t\t\t//Witness Testimony\r\n\t\t\tthis.testimonyID = 1;\r\n\t\t} else {\r\n\t\t\t//Cross Examination\r\n\t\t\tthis.testimonyID = 2;\r\n\t\t}\r\n\t\tviewport.initTestimonyUpdater();\r\n\t}\r\n\r\n\t/**\r\n\t * Handles a call mod message.\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandleZZ(args) {\r\n\t\tconst oocLog = document.getElementById(\"client_ooclog\");\r\n\t\toocLog.innerHTML += `$Alert: ${decodeChat(unescapeChat(args[1]))}\\r\\n`;\r\n\t\tif (oocLog.scrollTop > oocLog.scrollHeight - 60) {\r\n\t\t\toocLog.scrollTop = oocLog.scrollHeight;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Handles the issuance of a player ID by the server.\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandleID(args) {\r\n\t\tthis.playerID = args[1];\r\n\t}\r\n\r\n\thandlePN(args) {\r\n\t\tthis.serv.send(\"askchaa#%\");\r\n\t}\r\n\r\n\t/**\r\n\t * Received when the server announces its server info,\r\n\t * but we use it as a cue to begin retrieving characters.\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandleSI(args) {\r\n\t\tif (oldLoading) {\r\n\t\t\tthis.serv.send(\"askchar2#%\");\r\n\t\t} else {\r\n\t\t\tthis.serv.send(\"RC#%\");\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Handles the list of all used and vacant characters.\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandleCharsCheck(args) {\r\n\t\tdocument.getElementById(\"client_chartable\").innerHTML = \"\";\r\n\t\tlet tr;\r\n\t\tfor (let i = 0; i < this.chars.length; i++) {\r\n\t\t\tif (i % CHAR_SELECT_WIDTH == 0) {\r\n\t\t\t\ttr = document.createElement(\"TR\");\r\n\t\t\t}\r\n\t\t\tconst td = document.createElement(\"TD\");\r\n\t\t\tlet icon_chosen = \"\";\r\n\t\t\tconst thispick = this.chars[i].icon;\r\n\t\t\tif (args[i + 1] == \"-1\") {\r\n\t\t\t\ticon_chosen = \" dark\";\r\n\t\t\t}\r\n\t\t\ttd.innerHTML = `<img class='demothing${icon_chosen}' id='demo_${i}' ` +\r\n\t\t\t\t`src='${thispick}' alt='${this.chars[i].name}' onclick='pickChar(${i})' ` +\r\n\t\t\t\t\"onerror='demoError(this);'>\";\r\n\t\t\ttr.appendChild(td);\r\n\t\t\tif (i % CHAR_SELECT_WIDTH == 0) {\r\n\t\t\t\tdocument.getElementById(\"client_chartable\").appendChild(tr);\r\n\t\t\t}\r\n\t\t}\r\n\t\t//changeBackground(\"def\");\r\n\t}\r\n\r\n\t/**\r\n\t * Handles the server's assignment of a character for the player to use.\r\n\t * @param {Array} args packet arguments\r\n\t */\r\n\thandlePV(args) {\r\n\t\tthis.charID = args[3];\r\n\t\tdocument.getElementById(\"client_charselect\").style.display = \"none\";\r\n\t\tdocument.getElementById(\"client_inputbox\").style.display = \"\";\r\n\t\tconst me = this.me();\r\n\t\tconst emotes = this.emotes;\r\n\t\tconst emotesList = document.getElementById(\"client_emo\");\r\n\t\temotesList.innerHTML = \"\"; // Clear emote box\r\n\t\temotesList.style.display = \"\";\r\n\t\tconst xhr = new XMLHttpRequest();\r\n\t\txhr.withCredentials = false;\r\n\t\txhr.open(\"GET\", AO_HOST + \"characters/\" + escape(this.me().name.toLowerCase()) + \"/char.ini\", true);\r\n\t\txhr.responseType = \"text\";\r\n\t\txhr.onload = function (e) {\r\n\t\t\tif (this.status == 200) {\r\n\t\t\t\tconst linifile = this.responseText;\r\n\t\t\t\tconst pinifile = INI.parse(linifile);\r\n\t\t\t\tme.side = pinifile.Options.side;\r\n\t\t\t\tupdateActionCommands(me.side);\r\n\t\t\t\tfor (let i = 1; i <= pinifile.Emotions.number; i++) {\r\n\t\t\t\t\tconst emoteinfo = pinifile.Emotions[i].split(\"#\");\r\n\t\t\t\t\tlet esfx = \"0\";\r\n\t\t\t\t\tlet esfxd = \"0\";\r\n\t\t\t\t\tif (typeof pinifile.SoundN !== \"undefined\") {\r\n\t\t\t\t\t\tesfx = pinifile.SoundN[i];\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (typeof pinifile.SoundT !== \"undefined\") {\r\n\t\t\t\t\t\tesfxd = pinifile.SoundT[i];\r\n\t\t\t\t\t}\r\n\t\t\t\t\t// Make sure the asset server is case insensitive, or that everything on it is lowercase\r\n\t\t\t\t\temotes[i] = {\r\n\t\t\t\t\t\tdesc: emoteinfo[0].toLowerCase(),\r\n\t\t\t\t\t\tspeaking: emoteinfo[1].toLowerCase(),\r\n\t\t\t\t\t\tsilent: emoteinfo[2].toLowerCase(),\r\n\t\t\t\t\t\tzoom: emoteinfo[3],\r\n\t\t\t\t\t\tsfx: esfx.toLowerCase(),\r\n\t\t\t\t\t\tsfxdelay: esfxd,\r\n\t\t\t\t\t\tbutton_off: AO_HOST + `characters/${escape(me.name).toLowerCase()}/emotions/button${i}_off.png`,\r\n\t\t\t\t\t\tbutton_on: AO_HOST + `characters/${escape(me.name).toLowerCase()}/emotions/button${i}_on.png`\r\n\t\t\t\t\t};\r\n\t\t\t\t\temotesList.innerHTML += \r\n\t\t\t\t\t\t`<img src=${emotes[i].button_off}\r\n\t\t\t\t\t\t id=\"emo_${i}\"\r\n\t\t\t\t\t\t alt=\"${emotes[i].desc}\"\r\n\t\t\t\t\t\t class=\"client_button\"\r\n\t\t\t\t\t\t onclick=\"pickEmotion(${i})\">`;\r\n\t\t\t\t}\r\n\t\t\t\tpickEmotion(1);\r\n\t\t\t}\r\n\t\t};\r\n\t\txhr.send();\r\n\t}\r\n}\r\n\r\nclass Viewport {\r\n\tconstructor() {\r\n\t\tthis.textnow = \"\";\r\n\t\tthis.chatmsg = {\r\n\t\t\t\"isnew\": false,\r\n\t\t\t\"content\": \"\",\r\n\t\t\t\"objection\": \"0\",\r\n\t\t\t\"sound\": \"\",\r\n\t\t\t\"startpreanim\": false,\r\n\t\t\t\"startspeaking\": false,\r\n\t\t\t\"side\": null,\r\n\t\t\t\"color\": \"0\",\r\n\t\t\t\"snddelay\": 0,\r\n\t\t\t\"preanimdelay\": 0\r\n\t\t};\r\n\t\tthis.blip = new Audio(AO_HOST + \"sounds/general/sfx-blipmale.wav\");\r\n\t\tthis.blip.volume = 0.5;\r\n\r\n\t\t// Allocate multiple blip audio channels to make blips less jittery\r\n\r\n\t\t// TODO: read blip type (\"gender\") from ini\r\n\t\tthis.blipChannels = new Array(6);\r\n\t\tfor (let i = 0; i < this.blipChannels.length; i++) {\r\n\t\t\tthis.blipChannels[i] = new Audio(AO_HOST + \"sounds/general/sfx-blipmale.wav\");\r\n\t\t\tthis.blipChannels[i].volume = 0.5;\r\n\t\t}\r\n\t\tthis.currentBlipChannel = 0;\r\n\r\n\t\tthis.sfxaudio = new Audio(AO_HOST + \"sounds/general/sfx-blipmale.wav\");\r\n\t\tthis.sfxplayed = 0;\r\n\r\n\t\tthis.music = new Audio();\r\n\t\tthis.music.play();\r\n\r\n\t\tthis.updater = null;\r\n\t\tthis.testimonyUpdater = null;\r\n\r\n\t\tthis.bgname = \"gs4\";\r\n\r\n\t\tthis.testimonyTimer = 0;\r\n\t\tthis.shoutTimer = 0;\r\n\t\tthis.textTimer = 0;\r\n\r\n\t\tthis._animating = false;\r\n\t}\r\n\r\n\t/**\r\n\t * Returns whether or not the viewport is busy\r\n\t * performing a task (animating).\r\n\t */\r\n\tisAnimating() {\r\n\t\treturn this._animating;\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the volume of the blip sound.\r\n\t * @param {number} volume\r\n\t */\r\n\tsetBlipVolume(volume) {\r\n\t\tfor (let i = 0; i < this.blipChannels.length; i++) {\r\n\t\t\tthis.blipChannels[i].volume = volume;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the path which the background is located in.\r\n\t */\r\n\tbgFolder() {\r\n\t\treturn `${AO_HOST}background/${this.bgname.toLowerCase()}/`;\r\n\t}\r\n\r\n\t/**\r\n\t * Sets a new emote.\r\n\t * @param {object} chatmsg the new chat message\r\n\t */\r\n\tsay(chatmsg) {\r\n\t\tthis.chatmsg = chatmsg;\r\n\t\tappendICLog(chatmsg.content, chatmsg.nameplate);\r\n\t\tchangeBackground(chatmsg.side);\r\n\t\tthis.textnow = \"\";\r\n\t\tthis.sfxplayed = 0;\r\n\t\tthis.textTimer = 0;\r\n\t\tthis._animating = true;\r\n\t\tclearTimeout(this.updater);\r\n\t\t// If preanim existed then determine the length\r\n\t\tif (chatmsg.preanim != \"-\") {\r\n\t\t\tchatmsg.preanimdelay = this.getAnimLength(`${AO_HOST}characters/${escape(chatmsg.name.toLowerCase())}/${chatmsg.preanim.toLowerCase()}.gif`, this.initUpdater);\r\n\t\t} else {\r\n\t\t\tthis.initUpdater(0);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Intialize updater\r\n\t * @param {number} animdelay the length of pre-animation \r\n\t */\r\n\tinitUpdater(animdelay) {\r\n\t\tviewport.chatmsg.preanimdelay = parseInt(animdelay);\r\n\t\tviewport.updater = setTimeout(() => viewport.updateText(), UPDATE_INTERVAL);\r\n\t}\r\n\r\n\t/**\r\n\t * Intialize testimony updater \r\n\t */\r\n\tinitTestimonyUpdater() {\r\n\t\tif (client.testimonyID > 0) {\r\n\t\t\tlet testimony = \"\";\r\n\t\t\tif (client.testimonyID == 1) {\r\n\t\t\t\ttestimony = \"witnesstestimony\";\r\n\t\t\t} else if (client.testimonyID == 2) {\r\n\t\t\t\ttestimony = \"crossexamination\";\r\n\t\t\t}\r\n\t\t\t(new Audio(client.resources[testimony][\"sfx\"])).play();\r\n\t\t\tthis.testimonyTimer = 0;\r\n\t\t\tconst testimonyOverlay = document.getElementById(\"client_testimony\");\r\n\t\t\ttestimonyOverlay.src = client.resources[testimony][\"src\"];\r\n\t\t\ttestimonyOverlay.style.display = \"\";\r\n\t\t\tthis.testimonyUpdater = setTimeout(() => this.updateTestimony(), UPDATE_INTERVAL);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Gets animation length.\r\n\t * @param {string} filename the animation file name\r\n\t * @param {function} callback the callback function\r\n\t * @param {object} param \r\n\t */\r\n\tgetAnimLength(filename, callback, param) {\r\n\t\tconst request = new XMLHttpRequest();\r\n\t\trequest.open(\"GET\", filename, true);\r\n\t\trequest.responseType = \"arraybuffer\";\r\n\t\trequest.addEventListener(\"load\", function () {\r\n\t\t\tconst gifInfo = gify.getInfo(request.response);\r\n\t\t\tconsole.log(gifInfo[\"duration\"]);\r\n\t\t\t// Return animation length\r\n\t\t\tcallback(gifInfo[\"duration\"], param);\r\n\t\t});\r\n\t\trequest.send();\r\n\t}\r\n\r\n\t/**\r\n\t * Updates the testimony overaly\r\n\t */\r\n\tupdateTestimony() {\r\n\t\t//Update timer\r\n\t\tthis.testimonyTimer = this.testimonyTimer + UPDATE_INTERVAL;\r\n\r\n\t\tif (client.testimonyID == 1) {\r\n\t\t\t//Witness Testimony\r\n\t\t\tif (this.testimonyTimer >= client.resources[\"witnesstestimony\"][\"duration\"]) {\r\n\t\t\t\t//Finish\r\n\t\t\t\tthis.disposeTestimony();\r\n\t\t\t} else {\r\n\t\t\t\tthis.testimonyUpdater = setTimeout(() => this.updateTestimony(), UPDATE_INTERVAL);\r\n\t\t\t}\r\n\t\t} else if (client.testimonyID == 2) {\r\n\t\t\t//Cross Examination\r\n\t\t\tif (this.testimonyTimer >= client.resources[\"crossexamination\"][\"duration\"]) {\r\n\t\t\t\t//Finish\r\n\t\t\t\tthis.disposeTestimony();\r\n\t\t\t} else {\r\n\t\t\t\tthis.testimonyUpdater = setTimeout(() => this.updateTestimony(), UPDATE_INTERVAL);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tthis.disposeTestimony();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Dispose the testimony overlay\r\n\t */\r\n\tdisposeTestimony() {\r\n\t\tclient.testimonyID = 0;\r\n\t\tthis.testimonyTimer = 0;\r\n\t\tdocument.getElementById(\"client_testimony\").style.display = \"none\";\r\n\t\tclearTimeout(this.testimonyUpdater);\r\n\t}\r\n\r\n\t/**\r\n\t * Updates the chatbox based on the given text.\r\n\t * \r\n\t * XXX: This relies on a global variable `this.chatmsg`!\r\n\t */\r\n\tupdateText() {\r\n\t\tconst nameBox = document.getElementById(\"client_name\");\r\n\t\tconst chatBox = document.getElementById(\"client_chat\");\r\n\t\tconst charSprite = document.getElementById(\"client_char\");\r\n\t\tconst eviBox = document.getElementById(\"client_evi\");\r\n\t\tconst background = document.getElementById(\"client_background\");\r\n\t\tconst shoutSprite = document.getElementById(\"client_shout\");\r\n\t\tconst chatBoxInner = document.getElementById(\"client_inner_chat\");\r\n\r\n\t\t// Flip the character\r\n\t\tif (this.chatmsg.flip == 1) {\r\n\t\t\tcharSprite.style.transform = \"scaleX(-1)\";\r\n\t\t} else {\r\n\t\t\tcharSprite.style.transform = \"scaleX(1)\";\r\n\t\t}\r\n\r\n\t\tif (this._animating) {\r\n\t\t\tthis.updater = setTimeout(() => this.updateText(), UPDATE_INTERVAL);\r\n\t\t}\r\n\r\n\t\tif (this.chatmsg.isnew) {\r\n\t\t\t// Reset screen background\r\n\t\t\tbackground.style.backgroundColor = \"transparent\";\r\n\t\t\t// Hide message and evidence window\r\n\t\t\tnameBox.style.display = \"none\";\r\n\t\t\tchatBox.style.display = \"none\";\r\n\t\t\teviBox.style.opacity = \"0\";\r\n\t\t\teviBox.style.height = \"0%\";\r\n\t\t\tconst shouts = {\r\n\t\t\t\t\"1\": \"holdit\",\r\n\t\t\t\t\"2\": \"objection\",\r\n\t\t\t\t\"3\": \"takethat\"\r\n\t\t\t};\r\n\r\n\t\t\tlet shout = shouts[this.chatmsg.objection];\r\n\t\t\tif (typeof shout !== \"undefined\") {\r\n\t\t\t\tshoutSprite.src = client.resources[shout][\"src\"];\r\n\t\t\t\t(new Audio(`${AO_HOST}characters/${this.chatmsg.name.toLowerCase()}/${shout}.wav`)).play();\r\n\t\t\t\tthis.shoutTimer = 850;\r\n\t\t\t} else {\r\n\t\t\t\tthis.shoutTimer = 0;\r\n\t\t\t}\r\n\r\n\t\t\tthis.chatmsg.isnew = false;\r\n\t\t\tthis.chatmsg.startpreanim = true;\r\n\t\t}\r\n\r\n\t\tif (this.textTimer >= this.shoutTimer && this.chatmsg.startpreanim) {\r\n\t\t\t// Effect stuff\r\n\t\t\tif (this.chatmsg.flash == 2) {\r\n\t\t\t\t//Shake screen\r\n\t\t\t\tthis.sfxaudio.pause();\r\n\t\t\t\tthis.sfxplayed = 1;\r\n\t\t\t\tthis.sfxaudio.src = AO_HOST + \"sounds/general/sfx-stab.wav\";\r\n\t\t\t\tthis.sfxaudio.play();\r\n\t\t\t\t$(\"#client_gamewindow\").effect(\"shake\", {\r\n\t\t\t\t\t\"direction\": \"up\"\r\n\t\t\t\t});\r\n\t\t\t} else if (this.chatmsg.flash == 1) {\r\n\t\t\t\t//Flash screen\r\n\t\t\t\tbackground.style.backgroundColor = \"white\";\r\n\t\t\t\tthis.sfxaudio.pause();\r\n\t\t\t\tthis.sfxplayed = 1;\r\n\t\t\t\tthis.sfxaudio.src = AO_HOST + \"sounds/general/sfx-realization.wav\";\r\n\t\t\t\tthis.sfxaudio.play();\r\n\t\t\t\t$(\"#client_gamewindow\").effect(\"pulsate\");\r\n\t\t\t}\r\n\r\n\t\t\t//Pre-animation stuff\r\n\t\t\tif (this.chatmsg.preanimdelay > 0) {\r\n\t\t\t\tshoutSprite.src = \"misc/placeholder.gif\";\r\n\t\t\t\tchangeBackground(this.chatmsg.side);\r\n\t\t\t\tcharSprite.src = AO_HOST + \"characters/\" + escape(this.chatmsg.name.toLowerCase()) + \"/\" + this.chatmsg.preanim.toLowerCase() + \".gif\";\r\n\t\t\t}\r\n\t\t\tthis.chatmsg.startpreanim = false;\r\n\t\t\tthis.chatmsg.startspeaking = true;\r\n\t\t} else if (this.textTimer >= this.shoutTimer + this.chatmsg.preanimdelay && !this.chatmsg.startpreanim) {\r\n\t\t\tif (this.chatmsg.startspeaking) {\r\n\t\t\t\tif (this.chatmsg.evidence > 0) {\r\n\t\t\t\t\t// Prepare evidence\r\n\t\t\t\t\teviBox.style.backgroundImage = \"url('\" + client.evidences[this.chatmsg.evidence - 1].icon + \"')\";\r\n\r\n\t\t\t\t\tif (this.chatmsg.side == \"def\") {\r\n\t\t\t\t\t\t// Only def show evidence on right\r\n\t\t\t\t\t\teviBox.style.right = \"1.5em\";\r\n\t\t\t\t\t\teviBox.style.left = \"initial\";\r\n\t\t\t\t\t\t$(\"#client_evi\").animate({\r\n\t\t\t\t\t\t\theight: \"30%\",\r\n\t\t\t\t\t\t\topacity: 1\r\n\t\t\t\t\t\t}, 250);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\teviBox.style.right = \"initial\";\r\n\t\t\t\t\t\teviBox.style.left = \"1.5em\";\r\n\t\t\t\t\t\t$(\"#client_evi\").animate({\r\n\t\t\t\t\t\t\theight: \"30%\",\r\n\t\t\t\t\t\t\topacity: 1\r\n\t\t\t\t\t\t}, 250);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tnameBox.style.display = \"block\";\r\n\t\t\t\tnameBox.style.fontSize = (nameBox.offsetHeight * 0.7) + \"px\";\r\n\r\n\t\t\t\twhile (nameBox.hasChildNodes()) {\r\n\t\t\t\t\tnameBox.removeChild(nameBox.firstChild);\r\n\t\t\t\t}\r\n\t\t\t\tnameBox.appendChild(document.createTextNode(this.chatmsg.nameplate));\r\n\r\n\t\t\t\tchatBox.style.display = \"block\";\r\n\t\t\t\tchatBox.style.fontSize = (chatBox.offsetHeight * 0.25) + \"px\";\r\n\r\n\t\t\t\tconst colors = {\r\n\t\t\t\t\t\"0\": \"#ffffff\",\r\n\t\t\t\t\t\"1\": \"#00ff00\",\r\n\t\t\t\t\t\"2\": \"#ff0000\",\r\n\t\t\t\t\t\"3\": \"#ffaa00\",\r\n\t\t\t\t\t\"4\": \"#0000ff\",\r\n\t\t\t\t\t\"5\": \"#ffff00\",\r\n\t\t\t\t\t\"6\": \"#aa00aa\"\r\n\t\t\t\t};\r\n\t\t\t\tchatBoxInner.style.color = colors[this.chatmsg.color] || \"#ffffff\";\r\n\t\t\t\tthis.chatmsg.startspeaking = false;\r\n\r\n\t\t\t\tif (this.chatmsg.preanimdelay == 0) {\r\n\t\t\t\t\tshoutSprite.src = \"misc/placeholder.gif\";\r\n\t\t\t\t\tchangeBackground(this.chatmsg.side);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tcharSprite.src = AO_HOST + \"characters/\" + escape(this.chatmsg.name.toLowerCase()) + \"/\" + this.chatmsg.speaking.toLowerCase() + \".gif\";\r\n\r\n\t\t\t\tif (this.textnow == this.chatmsg.content) {\r\n\t\t\t\t\tcharSprite.src = AO_HOST + \"characters/\" + escape(this.chatmsg.name.toLowerCase()) + \"/\" + this.chatmsg.silent.toLowerCase() + \".gif\";\r\n\t\t\t\t\tthis._animating = false;\r\n\t\t\t\t\tclearTimeout(this.updater);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tif (this.textnow != this.chatmsg.content) {\r\n\t\t\t\t\tif (this.chatmsg.content.charAt(this.textnow.length) != \" \") {\r\n\t\t\t\t\t\tthis.blipChannels[this.currentBlipChannel].play();\r\n\t\t\t\t\t\tthis.currentBlipChannel++;\r\n\t\t\t\t\t\tthis.currentBlipChannel %= this.blipChannels.length;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tthis.textnow = this.chatmsg.content.substring(0, this.textnow.length + 1);\r\n\r\n\t\t\t\t\twhile (chatBoxInner.hasChildNodes()) {\r\n\t\t\t\t\t\tchatBoxInner.removeChild(chatBoxInner.firstChild);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tchatBoxInner.appendChild(document.createTextNode(this.textnow));\r\n\r\n\t\t\t\t\tif (this.textnow == this.chatmsg.content) {\r\n\t\t\t\t\t\tthis.textTimer = 0;\r\n\t\t\t\t\t\tthis._animating = false;\r\n\t\t\t\t\t\tcharSprite.src = AO_HOST + \"characters/\" + escape(this.chatmsg.name.toLowerCase()) + \"/\" + this.chatmsg.silent.toLowerCase() + \".gif\";\r\n\t\t\t\t\t\tclearTimeout(this.updater);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (!this.sfxplayed && this.chatmsg.snddelay + this.shoutTimer >= this.textTimer) {\r\n\t\t\tthis.sfxaudio.pause();\r\n\t\t\tthis.sfxplayed = 1;\r\n\t\t\tif (this.chatmsg.sound != \"0\" && this.chatmsg.sound != \"1\") {\r\n\t\t\t\tthis.sfxaudio.src = AO_HOST + \"sounds/general/\" + escape(this.chatmsg.sound.toLowerCase()) + \".wav\";\r\n\t\t\t\tthis.sfxaudio.play();\r\n\t\t\t}\r\n\t\t}\r\n\t\tthis.textTimer = this.textTimer + UPDATE_INTERVAL;\r\n\t}\r\n}\r\n\r\nclass INI {\r\n\tstatic parse(data) {\r\n\t\tlet regex = {\r\n\t\t\tsection: /^\\s*\\[\\s*([^\\]]*)\\s*\\]\\s*$/,\r\n\t\t\tparam: /^\\s*([\\w.\\-_]+)\\s*=\\s*(.*?)\\s*$/,\r\n\t\t\tcomment: /^\\s*;.*$/\r\n\t\t};\r\n\t\tlet value = {};\r\n\t\tlet lines = data.split(/\\r\\n|\\r|\\n/);\r\n\t\tlet section = null;\r\n\t\tlines.forEach(function (line) {\r\n\t\t\tif (regex.comment.test(line)) {\r\n\t\t\t\treturn;\r\n\t\t\t} else if (line.length == 0) {\r\n\t\t\t\treturn;\r\n\t\t\t} else if (regex.param.test(line)) {\r\n\t\t\t\tlet match = line.match(regex.param);\r\n\t\t\t\tif (section) {\r\n\t\t\t\t\tvalue[section][match[1]] = match[2];\r\n\t\t\t\t} else {\r\n\t\t\t\t\tvalue[match[1]] = match[2];\r\n\t\t\t\t}\r\n\t\t\t} else if (regex.section.test(line)) {\r\n\t\t\t\tlet match = line.match(regex.section);\r\n\t\t\t\tvalue[match[1]] = {};\r\n\t\t\t\tsection = match[1];\r\n\t\t\t}\r\n\t\t});\r\n\t\treturn value;\r\n\t}\r\n}\r\n\r\n/**\r\n * Triggered when the Return key is pressed on the out-of-character chat input box.\r\n * @param {KeyboardEvent} event\r\n */\r\nexport function onOOCEnter(event) {\r\n\tif (event.keyCode == 13) {\r\n\t\tclient.sendOOC(document.getElementById(\"client_oocinputbox\").value);\r\n\t\tdocument.getElementById(\"client_oocinputbox\").value = \"\";\r\n\t}\r\n}\r\nwindow.onOOCEnter = onOOCEnter;\r\n\r\n/**\r\n * Triggered when the Return key is pressed on the in-character chat input box.\r\n * @param {KeyboardEvent} event\r\n */\r\nexport function onEnter(event) {\r\n\tif (event.keyCode == 13) {\r\n\t\tlet mychar = client.me();\r\n\t\tlet myemo = client.myEmote();\r\n\t\tlet myevi = client.myEvidence();\r\n\t\tlet myflip = ((client.flip) ? 1 : 0);\r\n\t\tlet mycolor = document.getElementById(\"textcolor\").value;\r\n\t\tlet ssfxname = \"0\";\r\n\t\tlet ssfxdelay = \"0\";\r\n\t\tif (document.getElementById(\"sendsfx\").checked) {\r\n\t\t\tssfxname = myemo.sfx;\r\n\t\t\tssfxdelay = myemo.sfxdelay;\r\n\t\t}\r\n\t\tclient.sendIC(myemo.speaking, mychar.name, myemo.silent, document.getElementById(\"client_inputbox\").value, mychar.side, ssfxname, myemo.zoom, ssfxdelay, selectedShout, myevi, myflip, selectedEffect, mycolor);\r\n\t}\r\n}\r\nwindow.onEnter = onEnter;\r\n\r\n/**\r\n * Resets the IC parameters for the player to enter a new chat message.\r\n * This should only be called when the player's previous chat message\r\n * was successfully sent/presented.\r\n */\r\nfunction resetICParams() {\r\n\tdocument.getElementById(\"client_inputbox\").value = \"\";\r\n\tif (selectedEffect) {\r\n\t\tdocument.getElementById(\"button_effect_\" + selectedEffect).className = \"client_button\";\r\n\t\tselectedEffect = 0;\r\n\t}\r\n\tif (selectedShout) {\r\n\t\tdocument.getElementById(\"button_\" + selectedShout).className = \"client_button\";\r\n\t\tselectedShout = 0;\r\n\t}\r\n}\r\n\r\n/**\r\n * Triggered when an item on the music list is clicked.\r\n * @param {MouseEvent} event\r\n */\r\nexport function musiclist_click(event) {\r\n\tconst playtrack = document.getElementById(\"client_musiclist\").value;\r\n\tclient.sendMusicChange(playtrack);\r\n}\r\nwindow.musiclist_click = musiclist_click;\r\n\r\n/**\r\n * Triggered when an item on the area list is clicked.\r\n * @param {MouseEvent} event\r\n */\r\nexport function area_click(el) {\r\n\tconst area = el.textContent;\r\n\tclient.sendMusicChange(area);\r\n\r\n\tconst areaHr = document.createElement(\"div\");\r\n\tareaHr.className = \"hrtext\";\r\n\tareaHr.textContent = `switched to ${el.textContent}`;\r\n\tdocument.getElementById(\"client_log\").appendChild(areaHr);\r\n}\r\nwindow.area_click = area_click;\r\n\r\n/**\r\n * Triggered by the music volume slider.\r\n */\r\nexport function changeMusicVolume() {\r\n\tviewport.music.volume = document.getElementById(\"client_mvolume\").value / 100;\r\n}\r\nwindow.changeMusicVolume = changeMusicVolume;\r\n\r\n/**\r\n * Triggered by the sound effect volume slider.\r\n */\r\nexport function changeSFXVolume() {\r\n\tviewport.sfxaudio.volume = document.getElementById(\"client_svolume\").value / 100;\r\n}\r\nwindow.changeSFXVolume = changeSFXVolume;\r\n\r\n/**\r\n * Triggered by the blip volume slider.\r\n */\r\nexport function changeBlipVolume() {\r\n\tviewport.setBlipVolume(document.getElementById(\"client_bvolume\").value / 100);\r\n}\r\nwindow.changeBlipVolume = changeBlipVolume;\r\n\r\n/**\r\n * Triggered when a character icon is clicked in the character selection menu.\r\n * @param {MouseEvent} event\r\n */\r\nexport function changeCharacter(event) {\r\n\tclient.sendLeaveRoom();\r\n\tdocument.getElementById(\"client_charselect\").style.display = \"block\";\r\n\tdocument.getElementById(\"client_emo\").innerHTML = \"\";\r\n}\r\nwindow.changeCharacter = changeCharacter;\r\n\r\n/**\r\n * Triggered when there was an error loading a character sprite.\r\n * @param {HTMLImageElement} image the element containing the missing image\r\n */\r\nexport function imgError(image) {\r\n\timage.onerror = \"\";\r\n\timage.src = \"misc/placeholder.gif\";\r\n\treturn true;\r\n}\r\nwindow.imgError = imgError;\r\n\r\n/**\r\n * Triggered when there was an error loading a character icon.\r\n * @param {HTMLImageElement} image the element containing the missing image\r\n */\r\nexport function demoError(image) {\r\n\timage.onerror = \"\";\r\n\timage.src = \"/misc/placeholder.png\";\r\n\treturn true;\r\n}\r\nwindow.demoError = demoError;\r\n\r\n/**\r\n * Checks if a file exists at the specified URI.\r\n * @param {string} url the URI to be checked\r\n * @param {function} callback the function to be called when finished\r\n * @param {object} param \r\n */\r\nfunction fileExists(url, callback, param) {\r\n\tconst xhttp = new XMLHttpRequest();\r\n\txhttp.onreadystatechange = function () {\r\n\t\tif (this.readyState == 4 && this.status == 200) {\r\n\t\t\tcallback(true, param, url);\r\n\t\t} else {\r\n\t\t\tcallback(false, param, url);\r\n\t\t}\r\n\t};\r\n\txhttp.open(\"GET\", url, true);\r\n\txhttp.send();\r\n}\r\n\r\n/**\r\n * Changes the viewport background based on a given position.\r\n * \r\n * Valid positions: `def, pro, hld, hlp, wit, jud`\r\n * @param {string} position the position to change into\r\n */\r\nfunction changeBackground(position) {\r\n\tlet standname;\r\n\tconst bgfolder = viewport.bgFolder();\r\n\tdocument.getElementById(\"client_fg\").style.display = \"none\";\r\n\tdocument.getElementById(\"client_bench\").style.display = \"none\";\r\n\tswitch (position) {\r\n\tcase \"def\":\r\n\t\tdocument.getElementById(\"client_court\").src = bgfolder + \"defenseempty.png\";\r\n\t\tdocument.getElementById(\"client_bench\").style.display = \"block\";\r\n\t\tfileExists(bgfolder + \"defensedesk.png\", callbackChangeBackground, position);\r\n\t\tstandname = \"defense\";\r\n\t\tbreak;\r\n\tcase \"pro\":\r\n\t\tdocument.getElementById(\"client_court\").src = bgfolder + \"prosecutorempty.png\";\r\n\t\tdocument.getElementById(\"client_bench\").style.display = \"block\";\r\n\t\tfileExists(bgfolder + \"prosecutiondesk.png\", callbackChangeBackground, position);\r\n\t\tstandname = \"prosecution\";\r\n\t\tbreak;\r\n\tcase \"hld\":\r\n\t\tdocument.getElementById(\"client_court\").src = bgfolder + \"helperstand.png\";\r\n\t\tstandname = \"defense\";\r\n\t\tbreak;\r\n\tcase \"hlp\":\r\n\t\tdocument.getElementById(\"client_court\").src = bgfolder + \"prohelperstand.png\";\r\n\t\tstandname = \"prosecution\";\r\n\t\tbreak;\r\n\tcase \"wit\":\r\n\t\tdocument.getElementById(\"client_court\").src = bgfolder + \"witnessempty.png\";\r\n\t\tdocument.getElementById(\"client_bench\").style.display = \"block\";\r\n\t\tfileExists(bgfolder + \"stand.png\", callbackChangeBackground, position);\r\n\t\tstandname = \"prosecution\";\r\n\t\tbreak;\r\n\tcase \"jud\":\r\n\t\tdocument.getElementById(\"client_court\").src = bgfolder + \"judgestand.png\";\r\n\t\tstandname = \"prosecution\";\r\n\t\tbreak;\r\n\t}\r\n\tif (viewport.chatmsg.type == 5) {\r\n\t\tdocument.getElementById(\"client_bench\").style.display = \"none\";\r\n\t\tdocument.getElementById(\"client_court\").src = AO_HOST + \"themes/default/\" + standname + \"_speedlines.gif\";\r\n\t}\r\n}\r\n\r\n/**\r\n * Callback for desk resource\r\n * \r\n * Valid positions: `def, pro, hld, hlp, wit, jud`\r\n * @param {boolean} result the image is existed or not\r\n * @param {string} position the position to change into\r\n */\r\nfunction callbackChangeBackground(result, position) {\r\n\tlet bgfolder = viewport.bgFolder();\r\n\tif (position == \"def\") {\r\n\t\tif (result) {\r\n\t\t\tdocument.getElementById(\"client_bench\").src = bgfolder + \"defensedesk.png\";\r\n\t\t} else {\r\n\t\t\tdocument.getElementById(\"client_bench\").src = bgfolder + \"bancodefensa.png\";\r\n\t\t}\r\n\t} else if (position == \"pro\") {\r\n\t\tif (result) {\r\n\t\t\tdocument.getElementById(\"client_bench\").src = bgfolder + \"prosecutiondesk.png\";\r\n\t\t} else {\r\n\t\t\tdocument.getElementById(\"client_bench\").src = bgfolder + \"bancoacusacion.png\";\r\n\t\t}\r\n\t} else if (position == \"wit\") {\r\n\t\tif (result) {\r\n\t\t\tdocument.getElementById(\"client_bench\").src = bgfolder + \"stand.png\";\r\n\t\t} else {\r\n\t\t\tdocument.getElementById(\"client_bench\").src = bgfolder + \"estrado.png\";\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * Triggered when the reconnect button is pushed.\r\n */\r\nexport function ReconnectButton() {\r\n\tclient.cleanup();\r\n\tclient = new Client(serverIP);\r\n\tif (client) {\r\n\t\tmode = \"join\"; // HACK: see client.onOpen\r\n\t\tdocument.getElementById(\"client_error\").style.display = \"none\";\r\n\t}\r\n}\r\nwindow.ReconnectButton = ReconnectButton;\r\n\r\n/**\r\n * Triggered when the retry button is pushed (during the loading process).\r\n */\r\nexport function RetryButton() {\r\n\tclient.joinServer();\r\n}\r\nwindow.RetryButton = RetryButton;\r\n\r\n/**\r\n * Appends a message to the in-character chat log.\r\n * @param {string} toadd the string to be added\r\n * @param {string} name the name of the sender\r\n */\r\nfunction appendICLog(toadd, name = \"\", time = new Date()) {\r\n\tconst entry = document.createElement(\"p\");\r\n\tconst nameField = document.createElement(\"span\");\r\n\tnameField.id = \"iclog_name\";\r\n\tnameField.appendChild(document.createTextNode(name));\r\n\tentry.appendChild(nameField);\r\n\tentry.appendChild(document.createTextNode(toadd));\r\n\r\n\t// Only put a timestamp if the minute has changed.\r\n\tif (lastICMessageTime.getMinutes() !== time.getMinutes()) {\r\n\t\tconst timeStamp = document.createElement(\"span\");\r\n\t\ttimeStamp.id = \"iclog_time\";\r\n\t\ttimeStamp.innerText = time.toLocaleTimeString(undefined, {\r\n\t\t\thour: \"numeric\",\r\n\t\t\tminute: \"2-digit\"\r\n\t\t});\r\n\t\tentry.appendChild(timeStamp);\r\n\t}\r\n\r\n\tconst clientLog = document.getElementById(\"client_log\");\r\n\tclientLog.appendChild(entry);\r\n\r\n\tif (clientLog.scrollTop > clientLog.scrollHeight - 800) {\r\n\t\tclientLog.scrollTop = clientLog.scrollHeight;\r\n\t}\r\n\r\n\tlastICMessageTime = new Date();\r\n}\r\n\r\n/**\r\n * Requests to play as a character.\r\n * @param {number} ccharacter the character ID; if this is a large number, then spectator is chosen instead.\r\n */\r\nexport function pickChar(ccharacter) {\r\n\tif (ccharacter < 1000) {\r\n\t\tclient.sendCharacter(ccharacter);\r\n\t} else {\r\n\t\t// Spectator\r\n\t\tdocument.getElementById(\"client_charselect\").style.display = \"none\";\r\n\t\tdocument.getElementById(\"client_inputbox\").style.display = \"none\";\r\n\t\tdocument.getElementById(\"client_emo\").style.display = \"none\";\r\n\t}\r\n}\r\nwindow.pickChar = pickChar;\r\n\r\n/**\r\n * Highlights and selects an emotion for in-character chat.\r\n * @param {string} emo the new emotion to be selected\r\n */\r\nexport function pickEmotion(emo) {\r\n\tif (client.selectedEmote != -1) {\r\n\t\tdocument.getElementById(\"emo_\" + client.selectedEmote).src = client.myEmote().button_off;\r\n\t}\r\n\tclient.selectedEmote = emo;\r\n\tdocument.getElementById(\"emo_\" + emo).src = client.myEmote().button_on;\r\n}\r\nwindow.pickEmotion = pickEmotion;\r\n\r\n/**\r\n * Highlights and selects an evidence for in-character chat.\r\n * @param {string} evidence the evidence to be presented\r\n */\r\nexport function pickEvidence(evidence) {\r\n\tif (client.selectedEvidence !== evidence) {\r\n\t\t//Update selected evidence\t\t\r\n\t\tif (client.selectedEvidence > 0) {\r\n\t\t\tdocument.getElementById(\"evi_\" + client.selectedEvidence).className = \"client_button\";\r\n\t\t}\r\n\t\tdocument.getElementById(\"evi_\" + evidence).className = \"client_button dark\";\r\n\t\tclient.selectedEvidence = evidence;\r\n\r\n\t\t// Show evidence on information window\r\n\t\tdocument.getElementById(\"evi_name\").value = client.evidences[evidence - 1].name;\r\n\t\tdocument.getElementById(\"evi_desc\").value = client.evidences[evidence - 1].desc;\r\n\r\n\t\t//Update Icon\r\n\t\tlet icon_id = getIndexFromSelect(\"evi_select\", client.evidences[evidence - 1].filename);\r\n\t\tdocument.getElementById(\"evi_select\").selectedIndex = icon_id;\r\n\t\tif (icon_id == 0) {\r\n\t\t\tdocument.getElementById(\"evi_filename\").value = client.evidences[evidence - 1].filename;\r\n\t\t}\r\n\t\tupdateEvidenceIcon();\r\n\r\n\t\t// Update button\r\n\t\tdocument.getElementById(\"evi_add\").className = \"client_button hover_button inactive\";\r\n\t\tdocument.getElementById(\"evi_edit\").className = \"client_button hover_button\";\r\n\t\tdocument.getElementById(\"evi_cancel\").className = \"client_button hover_button\";\r\n\t\tdocument.getElementById(\"evi_del\").className = \"client_button hover_button\";\r\n\t} else {\r\n\t\tcancelEvidence();\r\n\t}\r\n}\r\nwindow.pickEvidence = pickEvidence;\r\n\r\n/**\r\n * Add evidence.\r\n */\r\nexport function addEvidence() {\r\n\tlet evidence_select = document.getElementById(\"evi_select\");\r\n\tclient.sendPE(document.getElementById(\"evi_name\").value,\r\n\t\tdocument.getElementById(\"evi_desc\").value,\r\n\t\tevidence_select.selectedIndex == 0 ?\r\n\t\t\tdocument.getElementById(\"evi_filename\").value :\r\n\t\t\tevidence_select.options[evidence_select.selectedIndex].text\r\n\t);\r\n\tcancelEvidence();\r\n}\r\nwindow.addEvidence = addEvidence;\r\n\r\n/**\r\n * Edit selected evidence.\r\n */\r\nexport function editEvidence() {\r\n\tlet evidence_select = document.getElementById(\"evi_select\");\r\n\tlet id = parseInt(client.selectedEvidence) - 1;\r\n\tclient.sendEE(id,\r\n\t\tdocument.getElementById(\"evi_name\").value,\r\n\t\tdocument.getElementById(\"evi_desc\").value,\r\n\t\tevidence_select.selectedIndex == 0 ?\r\n\t\t\tdocument.getElementById(\"evi_filename\").value :\r\n\t\t\tevidence_select.options[evidence_select.selectedIndex].text\r\n\t);\r\n\tcancelEvidence();\r\n}\r\nwindow.editEvidence = editEvidence;\r\n\r\n/**\r\n * Delete selected evidence.\r\n */\r\nexport function deleteEvidence() {\r\n\tlet id = parseInt(client.selectedEvidence) - 1;\r\n\tclient.sendDE(id);\r\n\tcancelEvidence();\r\n}\r\nwindow.deleteEvidence = deleteEvidence;\r\n\r\n/**\r\n * Cancel evidence selection.\r\n */\r\nexport function cancelEvidence() {\r\n\t//Clear evidence data\r\n\tif (client.selectedEvidence > 0) {\r\n\t\tdocument.getElementById(\"evi_\" + client.selectedEvidence).className = \"client_button\";\r\n\t}\r\n\tclient.selectedEvidence = 0;\r\n\r\n\t// Clear evidence on information window\r\n\tdocument.getElementById(\"evi_select\").selectedIndex = 0;\r\n\tupdateEvidenceIcon(); // Update icon widget\r\n\tdocument.getElementById(\"evi_filename\").value = \"\";\r\n\tdocument.getElementById(\"evi_name\").value = \"\";\r\n\tdocument.getElementById(\"evi_desc\").value = \"\";\r\n\tdocument.getElementById(\"evi_icon\").style.backgroundImage = \"url('misc/empty.png')\"; //Clear icon\r\n\r\n\t// Update button\r\n\tdocument.getElementById(\"evi_add\").className = \"client_button hover_button\";\r\n\tdocument.getElementById(\"evi_edit\").className = \"client_button hover_button inactive\";\r\n\tdocument.getElementById(\"evi_cancel\").className = \"client_button hover_button inactive\";\r\n\tdocument.getElementById(\"evi_del\").className = \"client_button hover_button inactive\";\r\n}\r\nwindow.cancelEvidence = cancelEvidence;\r\n\r\n/**\r\n * Find index of anything in select box.\r\n * @param {string} select_box the select element name\r\n * @param {string} value the value that need to be compared\r\n */\r\nexport function getIndexFromSelect(select_box, value) {\r\n\t//Find if icon alraedy existed in select box\r\n\tconst select_element = document.getElementById(select_box);\r\n\tfor (let i = 1; i < select_element.length; ++i) {\r\n\t\tif (select_element.options[i].value == value) {\r\n\t\t\treturn i;\r\n\t\t}\r\n\t}\r\n\treturn 0;\r\n}\r\nwindow.getIndexFromSelect = getIndexFromSelect;\r\n\r\n/**\r\n * Update evidence icon.\r\n */\r\nexport function updateEvidenceIcon() {\r\n\tlet evidence_select = document.getElementById(\"evi_select\");\r\n\tlet evidence_filename = document.getElementById(\"evi_filename\");\r\n\tlet evidence_iconbox = document.getElementById(\"evi_icon\");\r\n\r\n\tif (evidence_select.selectedIndex === 0) {\r\n\t\tevidence_filename.style.display = \"initial\";\r\n\t\tevidence_iconbox.style.backgroundImage = `url(${AO_HOST}evidence/${evidence_filename.value.toLowerCase()})`;\r\n\t} else {\r\n\t\tevidence_filename.style.display = \"none\";\r\n\t\tevidence_iconbox.style.backgroundImage = `url(${AO_HOST}evidence/${evidence_select.value.toLowerCase()})`;\r\n\t}\r\n}\r\nwindow.updateEvidenceIcon = updateEvidenceIcon;\r\n\r\n/**\r\n * Update evidence icon.\r\n */\r\nexport function updateActionCommands(side) {\r\n\tif (side == \"jud\") {\r\n\t\tdocument.getElementById(\"judge_action\").style.display = \"inline-table\";\r\n\t\tdocument.getElementById(\"no_action\").style.display = \"none\";\r\n\t} else {\r\n\t\tdocument.getElementById(\"no_action\").style.display = \"inline-table\";\r\n\t\tdocument.getElementById(\"judge_action\").style.display = \"none\";\r\n\t}\r\n\t//Update role selector\r\n\tfor (let i = 0, role_select = document.getElementById(\"role_select\").options; i < role_select.length; i++) {\r\n\t\tif (side == role_select[i].value) {\r\n\t\t\trole_select.selectedIndex = i;\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n}\r\nwindow.updateActionCommands = updateActionCommands;\r\n\r\n/**\r\n * Change background via OOC.\r\n */\r\nexport function changeBackgroundOOC() {\r\n\tlet filename = \"\",\r\n\t\tbackground_select = document.getElementById(\"bg_select\"),\r\n\t\tbg_command = document.getElementById(\"bg_command\").value;\r\n\tif (background_select.selectedIndex == 0) {\r\n\t\tfilename = document.getElementById(\"bg_filename\").value;\r\n\t} else {\r\n\t\tfilename = background_select.value;\r\n\t}\r\n\tclient.sendOOC(\"/\" + bg_command.replace(\"$1\", filename));\r\n}\r\nwindow.changeBackgroundOOC = changeBackgroundOOC;\r\n\r\n/**\r\n * Change role via OOC.\r\n */\r\nexport function changeRoleOOC() {\r\n\tlet role_select = document.getElementById(\"role_select\"),\r\n\t\trole_command = document.getElementById(\"role_command\").value;\r\n\r\n\tclient.sendOOC(\"/\" + role_command.replace(\"$1\", role_select.value));\r\n\tupdateActionCommands(role_select.value);\r\n}\r\nwindow.changeRoleOOC = changeRoleOOC;\r\n\r\n/**\r\n * Random character via OOC.\r\n */\r\nexport function randomCharacterOOC() {\r\n\tclient.sendOOC(\"/\" + document.getElementById(\"randomchar_command\").value);\r\n}\r\nwindow.randomCharacterOOC = randomCharacterOOC;\r\n\r\n/**\r\n * Call mod.\r\n */\r\nexport function callMod() {\r\n\t$(\"#callmod_dialog\").dialog(\"open\");\r\n}\r\nwindow.callMod = callMod;\r\n\r\n/**\r\n * Declare witness testimony.\r\n */\r\nexport function initWT() {\r\n\tclient.sendRT(\"testimony1\");\r\n}\r\nwindow.initWT = initWT;\r\n\r\n/**\r\n * Declare cross examination.\r\n */\r\nexport function initCE() {\r\n\tclient.sendRT(\"testimony2\");\r\n}\r\nwindow.initCE = initCE;\r\n\r\n/**\r\n * Increment defense health point.\r\n */\r\nexport function addHPD() {\r\n\tclient.sendHP(1, String(parseInt(client.hp[0]) + 1));\r\n}\r\nwindow.addHPD = addHPD;\r\n\r\n/**\r\n * Decrement defense health point.\r\n */\r\nexport function redHPD() {\r\n\tclient.sendHP(1, String(parseInt(client.hp[0]) - 1));\r\n}\r\nwindow.redHPD = redHPD;\r\n\r\n/**\r\n * Increment prosecution health point.\r\n */\r\nexport function addHPP() {\r\n\tclient.sendHP(2, String(parseInt(client.hp[1]) + 1));\r\n}\r\nwindow.addHPP = addHPP;\r\n\r\n/**\r\n * Decrement prosecution health point.\r\n */\r\nexport function redHPP() {\r\n\tclient.sendHP(2, String(parseInt(client.hp[1]) - 1));\r\n}\r\nwindow.redHPP = redHPP;\r\n\r\n/**\r\n * Update background preview.\r\n */\r\nexport function updateBackgroundPreview() {\r\n\tlet background_select = document.getElementById(\"bg_select\");\r\n\tlet background_filename = document.getElementById(\"bg_filename\");\r\n\tlet background_preview = document.getElementById(\"bg_preview\");\r\n\r\n\tif (background_select.selectedIndex == 0) {\r\n\t\tbackground_filename.style.display = \"initial\";\r\n\t\tbackground_preview.src = AO_HOST + \"background/\" + background_filename.value.toLowerCase() + \"/defenseempty.png\";\r\n\t} else {\r\n\t\tbackground_filename.style.display = \"none\";\r\n\t\tbackground_preview.src = AO_HOST + \"background/\" + background_select.value.toLowerCase() + \"/defenseempty.png\";\r\n\t}\r\n}\r\nwindow.updateBackgroundPreview = updateBackgroundPreview;\r\n\r\n/**\r\n * Highlights and selects an effect for in-character chat.\r\n * If the same effect button is selected, then the effect is canceled.\r\n * @param {string} effect the new effect to be selected\r\n */\r\nexport function toggleEffect(effect) {\r\n\tif (effect == selectedEffect) {\r\n\t\tdocument.getElementById(\"button_effect_\" + effect).className = \"client_button\";\r\n\t\tselectedEffect = 0;\r\n\t} else {\r\n\t\tdocument.getElementById(\"button_effect_\" + effect).className = \"client_button dark\";\r\n\t\tif (selectedEffect) {\r\n\t\t\tdocument.getElementById(\"button_effect_\" + selectedEffect).className = \"client_button\";\r\n\t\t}\r\n\t\tselectedEffect = effect;\r\n\t}\r\n}\r\nwindow.toggleEffect = toggleEffect;\r\n\r\n/**\r\n * Toggle flip for in-character chat.\r\n */\r\nexport function toggleFlip() {\r\n\tif (client.flip) {\r\n\t\tdocument.getElementById(\"button_flip\").className = \"client_button\";\r\n\t} else {\r\n\t\tdocument.getElementById(\"button_flip\").className = \"client_button dark\";\r\n\t}\r\n\tclient.flip = !client.flip;\r\n}\r\nwindow.toggleFlip = toggleFlip;\r\n\r\n/**\r\n * Toggle presentable for presenting evidence in-character chat.\r\n */\r\nexport function togglePresent() {\r\n\tif (client.presentable) {\r\n\t\tdocument.getElementById(\"button_present\").className = \"client_button\";\r\n\t} else {\r\n\t\tdocument.getElementById(\"button_present\").className = \"client_button dark\";\r\n\t}\r\n\tclient.presentable = !client.presentable;\r\n}\r\nwindow.togglePresent = togglePresent;\r\n\r\n/**\r\n * Highlights and selects a menu.\r\n * @param {string} menu the menu to be selected\r\n */\r\nexport function toggleMenu(menu) {\r\n\tif (menu != selectedMenu) {\r\n\t\tdocument.getElementById(\"menu_\" + menu).className = \"menu_icon active\";\r\n\t\tdocument.getElementById(\"content_\" + menu).className = \"menu_content active\";\r\n\t\tdocument.getElementById(\"menu_\" + selectedMenu).className = \"menu_icon\";\r\n\t\tdocument.getElementById(\"content_\" + selectedMenu).className = \"menu_content\";\r\n\t\tselectedMenu = menu;\r\n\t}\r\n}\r\nwindow.toggleMenu = toggleMenu;\r\n\r\n/**\r\n * Highlights and selects a shout for in-character chat.\r\n * If the same shout button is selected, then the shout is canceled.\r\n * @param {string} shout the new shout to be selected\r\n */\r\nexport function toggleShout(shout) {\r\n\tif (shout == selectedShout) {\r\n\t\tdocument.getElementById(\"button_\" + shout).className = \"client_button\";\r\n\t\tselectedShout = 0;\r\n\t} else {\r\n\t\tdocument.getElementById(\"button_\" + shout).className = \"client_button dark\";\r\n\t\tif (selectedShout) {\r\n\t\t\tdocument.getElementById(\"button_\" + selectedShout).className = \"client_button\";\r\n\t\t}\r\n\t\tselectedShout = shout;\r\n\t}\r\n}\r\nwindow.toggleShout = toggleShout;\r\n\r\n/**\r\n * Escapes a string to be HTML-safe.\r\n * \r\n * XXX: This is unnecessary if we use `createTextNode` instead!\r\n * @param {string} unsafe an unsanitized string\r\n */\r\nfunction escapeHtml(unsafe) {\r\n\treturn unsafe\r\n\t\t.replace(/&/g, \"&\")\r\n\t\t.replace(/</g, \"<\")\r\n\t\t.replace(/>/g, \">\")\r\n\t\t.replace(/\"/g, \""\")\r\n\t\t.replace(/'/g, \"'\");\r\n}\r\n\r\n/**\r\n * Escapes a string to AO1 escape codes.\r\n * @param {string} estring the string to be escaped\r\n */\r\nfunction escapeChat(estring) {\r\n\treturn estring\r\n\t\t.replace(/#/g, \"<pound>\")\r\n\t\t.replace(/&/g, \"<and>\")\r\n\t\t.replace(/%/g, \"<percent>\")\r\n\t\t.replace(/\\$/g, \"<dollar>\");\r\n}\r\n\r\n/**\r\n * Unescapes a string to AO1 escape codes.\r\n * @param {string} estring the string to be unescaped\r\n */\r\nfunction unescapeChat(estring) {\r\n\treturn estring\r\n\t\t.replace(/<pound>/g, \"#\")\r\n\t\t.replace(/<and>/g, \"&\")\r\n\t\t.replace(/<percent>/g, \"%\")\r\n\t\t.replace(/<dollar>/g, \"$\");\r\n}\r\n\r\n/**\r\n * Encode text on client side.\r\n * @param {string} estring the string to be encoded\r\n */\r\nfunction encodeChat(estring) {\r\n\tlet selectedEncoding = document.getElementById(\"client_encoding\").value;\r\n\tif (selectedEncoding == \"unicode\") {\r\n\t\t// This approach works by escaping all special characters to Unicode escape sequences.\r\n\t\t// Source: https://gist.github.com/mathiasbynens/1243213\r\n\t\treturn estring.replace(/[^\\0-~]/g, function (ch) {\r\n\t\t\treturn \"\\\\u\" + (\"000\" + ch.charCodeAt().toString(16)).slice(-4);\r\n\t\t});\r\n\t} else if (selectedEncoding == \"utf16\") {\r\n\t\t// Source: https://developers.google.com/web/updates/2012/06/How-to-convert-ArrayBuffer-to-and-from-String\r\n\t\tconst buffer = new ArrayBuffer(estring.length * 2);\r\n\t\tconst result = new Uint16Array(buffer);\r\n\t\tfor (let i = 0, strLen = estring.length; i < strLen; i++) {\r\n\t\t\tresult[i] = estring.charCodeAt(i);\r\n\t\t}\r\n\t\treturn String(result);\r\n\t} else {\r\n\t\treturn estring;\r\n\t}\r\n}\r\nfunction hash6ode() {\r\n\treturn uid;\r\n}\r\n\r\n/**\r\n * Decodes text on client side.\r\n * @param {string} estring the string to be decoded\r\n */\r\nfunction decodeChat(estring) {\r\n\tlet selectedDecoding = document.getElementById(\"client_decoding\").value;\r\n\tif (selectedDecoding == \"unicode\") {\r\n\t\t// Source: https://stackoverflow.com/questions/7885096/how-do-i-decode-a-string-with-escaped-unicode\r\n\t\treturn estring.replace(/\\\\u([\\d\\w]{1,})/gi, function (match, group) {\r\n\t\t\treturn String.fromCharCode(parseInt(group, 16));\r\n\t\t});\r\n\t} else if (selectedDecoding == \"utf16\") {\r\n\t\t// Source: https://developers.google.com/web/updates/2012/06/How-to-convert-ArrayBuffer-to-and-from-String\r\n\t\treturn String.fromCharCode.apply(null, new Uint16Array(estring.split(\",\")));\r\n\t} else {\r\n\t\treturn estring;\r\n\t}\r\n}\r\n\r\n/**\r\n * Decoding text on client side.\r\n * @param {string} estring the string to be decoded\r\n */\r\nfunction decodeBBCode(estring) {\r\n\treturn estring\r\n\t\t.replace(/\\\\n/g, \"<br>\") // Newline \\n\r\n\t\t.replace(/\\[(\\/?)b\\]/g, \"<$1b>\") // Bold [b][/b]\r\n\t\t.replace(/\\[(\\/?)i\\]/g, \"<$1i>\") // Italic [i][/i]\r\n\t\t.replace(/\\[(\\/?)s\\]/g, \"<$1del>\") // Strikethrough [s][/s]\r\n\t\t.replace(/\\[(\\/?)u\\]/g, \"<$1u>\") // Underline [u][/u]\r\n\t\t.replace(/\\[(\\/?)sub\\]/g, \"<$1sub>\") // Subscript [sub][/sub]\r\n\t\t.replace(/\\[(\\/?)sup\\]/g, \"<$1sup>\") // Superscript [sup][/sup]\r\n\t\t.replace(/\\[m=([#a-zA-Z0-9]+)\\]/g, \"<m a=\\\"$1\\\">\") // Markup [m=#0ff]\r\n\t\t.replace(/\\[(\\/?)m\\]/g, \"<$1m>\") // [m][/m]\r\n\t\t.replace(/\\[c=?([#a-zA-Z0-9]+)\\]/g, \"<c a=\\\"$1\\\">\") // Color [c=red]\r\n\t\t.replace(/\\[\\/c\\]/g, \"</c>\"); // [/c]\r\n}\r\n\r\n\r\n// TODO: Possibly safe to remove, since we are using a transpiler.\r\nif (typeof (String.prototype.trim) === \"undefined\") {\r\n\tString.prototype.trim = function () {\r\n\t\treturn String(this).replace(/^\\s+|\\s+$/g, \"\");\r\n\t};\r\n}\r\n\r\n// Used for HDID calculation.\r\nfunction hashCode() {\r\n\tlet hash = 0;\r\n\tlet hashString = navigator.userAgent;\r\n\tif (hashString.length === 0) return hash;\r\n\tfor (let i = 0; i < hashString.length; i++) {\r\n\t\tconst chr = hashString.charCodeAt(i);\r\n\t\thash = ((hash << 5) - hash) + chr;\r\n\t\thash |= 0; // Convert to 32bit integer\r\n\t}\r\n\treturn hash;\r\n};\r\n\r\n\r\n//\r\n// Client code\r\n//\r\n\r\nlet client = new Client(serverIP);\r\nlet viewport = new Viewport();\r\n\r\n$(document).ready(function () {\r\n\tclient.initialObservBBCode();\r\n\tclient.loadResources();\r\n});\r\n\r\n// Create dialog and link to button\t\r\n$(function () {\r\n\t$(\"#callmod_dialog\").dialog({\r\n\t\tautoOpen: false,\r\n\t\tresizable: false,\r\n\t\tshow: {\r\n\t\t\teffect: \"drop\",\r\n\t\t\tdirection: \"down\",\r\n\t\t\tduration: 500\r\n\t\t},\r\n\t\thide: {\r\n\t\t\teffect: \"drop\",\r\n\t\t\tdirection: \"down\",\r\n\t\t\tduration: 500\r\n\t\t},\r\n\t\theight: \"auto\",\r\n\t\twidth: 400,\r\n\t\tmodal: true,\r\n\t\tbuttons: {\r\n\t\t\tSure: function () {\r\n\t\t\t\tlet reason = prompt(\"Please enter the reason\", \"\");\r\n\t\t\t\tclient.sendZZ(reason);\r\n\t\t\t\t$(this).dialog(\"close\");\r\n\t\t\t},\r\n\t\t\tCancel: function () {\r\n\t\t\t\t$(this).dialog(\"close\");\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n});\r\n"],"sourceRoot":""}
\ No newline at end of file |
