| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881 | "use strict";// Copyright 2012 United States Government, as represented by the Secretary of Defense, Under// Secretary of Defense (Personnel & Readiness).// // Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except// in compliance with the License. You may obtain a copy of the License at// //   http://www.apache.org/licenses/LICENSE-2.0// // Unless required by applicable law or agreed to in writing, software distributed under the License// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express// or implied. See the License for the specific language governing permissions and limitations under// the License./// vwf/view/editor creates a view interface for editor functions. /// /// @module vwf/view/editor/// @requires version/// @requires vwf/view/// @requires vwf/utilitydefine([    "module",    "version",    "vwf/view",    "vwf/utility",    "vwf/view/lib/ace/ace",    "vwf/view/lib/colorpicker/colorpicker.min",    "vwf/view/widgets"], function (module, version, view, utility, ace, colorpicker, widgets) {    var self;    return view.load(module, {        // == Module Definition ====================================================================        initialize: function () {            self = this;            this.ace = window.ace;            this.widgets = widgets;            this.nodes = {};            this.scenes = {};            this.allScripts = {};            //$(document.head).append('<style type="text/css" media="screen"> #editorlive { height: 500px; width: 800px; } </style>');            document.querySelector('head').innerHTML += '<style type="text/css" media="screen"> #editorlive { height: 500px; width: 800px; } </style>';            document.querySelector('head').innerHTML += '<link rel="stylesheet" href="vwf/view/lib/editorLive.css">';            //document.querySelector('head').innerHTML += '<script type="text/javascript" src="vwf/view/lib/colorpicker/colorpicker.min.js">';            document.querySelector('head').innerHTML += '<link rel="stylesheet" href="vwf/view/lib/colorpicker/themes.css">';            //$(document.head).append('<meta name="viewport" content="width=device-width, initial-scale=1">');            document.querySelector('head').innerHTML += '<meta name="viewport" content="width=device-width, initial-scale=1">';            // $('body').append('<script>mdc.autoInit()</script>');            this.removeProps = (obj) => {                Object.keys(obj).forEach(key =>                    (key === 'id' || key === 'patches' || key === 'random' || key === 'sequence') && delete obj[key] ||                    (obj[key] && typeof obj[key] === 'object') && this.removeProps(obj[key])                );                return obj;            };            this.getNodeDef = function (nodeID) {                let node = vwf.getNode(nodeID, true);                let nodeDef = self.removeProps(node);                return nodeDef            }            this.GUID = function () {                var S4 = function () {                    return Math.floor(                        Math.random() * 0x10000 /* 65536 */                    ).toString(16);                };                return (                    S4() + S4() + "-" +                    S4() + "-" +                    S4() + "-" +                    S4() + "-" +                    S4() + S4() + S4()                );            }            this.getRoot = function () {                var app = window.location.pathname;                var pathSplit = app.split('/');                if (pathSplit[0] == "") {                    pathSplit.shift();                }                if (pathSplit[pathSplit.length - 1] == "") {                    pathSplit.pop();                }                var instIndex = pathSplit.length - 1;                if (pathSplit.length > 2) {                    if (pathSplit[pathSplit.length - 2] == "load") {                        instIndex = pathSplit.length - 3;                    }                }                if (pathSplit.length > 3) {                    if (pathSplit[pathSplit.length - 3] == "load") {                        instIndex = pathSplit.length - 4;                    }                }                var root = "";                for (var i = 0; i < instIndex; i++) {                    if (root != "") {                        root = root + "/";                    }                    root = root + pathSplit[i];                }                if (root.indexOf('.vwf') != -1) root = root.substring(0, root.lastIndexOf('/'));                return root            };            this.getRandomInt = function (min, max) {                min = Math.ceil(min);                max = Math.floor(max);                return Math.floor(Math.random() * (max - min)) + min; //The maximum is exclusive and the minimum is inclusive            };            ["drawer", "toolbar", "sideBar", "propWindow", "clientsWindow", "codeEditorWindow", "propEditorWindow", "viewSceneProps"].forEach(item => {                let el = document.createElement("div");                el.setAttribute("id", item);                document.body.appendChild(el);            }            );            this.avatarCardDef = function (src, desc, onclickfunc) {                return {                    $cell: true,                    $type: "div",                    class: "mdc-card avatar-card",                    $init: function () {                        this.style.backgroundImage = 'linear-gradient(0deg, rgba(0, 0, 0, 0.0), rgba(0, 0, 0, 0.0) ), url(' + src + ')'                    },                    onclick: onclickfunc,                    $components: [                        {                            $type: "section",                            class: "mdc-card__primary",                            $components: [                                {                                    $type: "h1",                                    class: "mdc-card__title mdc-card__title--large",                                    $text: desc.subtitle                                },                                {                                    $type: "h2",                                    class: "mdc-card__subtitle",                                    $text: desc.title                                }                            ]                        },                        {                            $type: "section",                            class: "mdc-card__actions",                            $components: [                                {                                    $type: "button",                                    class: "mdc-button mdc-button--compact mdc-card__action",                                    //$text: "Use it",                                    onclick: onclickfunc                                }                            ]                        }                    ]                }            }            let createSettings =            {                $cell: true,                $type: "div",                class: "propGrid max-width mdc-layout-grid mdc-layout-grid--align-left",                $components: [                    {                        $cell: true,                        $type: "section",                        $components: [                            {                                $cell: true,                                $type: "h3",                                $text:"Create"                            },                            {                                $cell: true,                                $type: "div",                                class: "mdc-list-group",                                $components: [                                    {                                        $cell: true,                                        $type: "h3",                                        class: "mdc-list-group__subheader",                                        $text:"3D Primitives"                                                                          },                                    {                                        $cell: true,                                        $type: "ul",                                        class: "mdc-list mdc-list--two-line",                                        $components: make3DPrimitiveList()                                      },                                    self.widgets.listDivider(),                                    {                                        $cell: true,                                        $type: "h3",                                        class: "mdc-list-group__subheader",                                        $text:"Light"                                                                          },                                    {                                        $cell: true,                                        $type: "ul",                                        class: "mdc-list mdc-list--two-line",                                        $components: makeLightsList()                                    },                                    self.widgets.listDivider(),                                    {                                        $cell: true,                                        $type: "h3",                                        class: "mdc-list-group__subheader",                                        $text:"Assets"                                                                          },                                    {                                        $cell: true,                                        $type: "ul",                                        class: "mdc-list mdc-list--two-line",                                        $components: [                                            self.widgets.createListItem({                                                imgSrc: "vwf/view/lib/images/ui/icons/3ditem.png",                                                title: '3D Model'                                            }),                                            self.widgets.createListItem({                                                imgSrc: "vwf/view/lib/images/ui/icons/image.png",                                                title: 'Image',                                                onclickfunc: function(){                                                    //let cubeName = self.GUID();                                                    vwf_view.kernel.callMethod(vwf.application(), "createAssetItemImg")                                                }                                            }),                                            self.widgets.createListItem({                                                imgSrc: "vwf/view/lib/images/ui/icons/video.png",                                                title: 'Video'                                            }),                                            self.widgets.createListItem({                                                imgSrc: "vwf/view/lib/images/ui/icons/sound.png",                                                title: 'Sound'                                            })                                                                                ]                                    }                                ]                            }                                                       ]                    }                ]            }            function make3DPrimitiveList() {                let nodeNames = ['Plane', 'Cube', 'Sphere', 'Cylinder', 'Cone'];                return nodeNames.map(el => {                   return  self.widgets.createListItem({                        imgSrc: "vwf/view/lib/images/ui/icons/" + el.toLowerCase()+".png",                        title: el,                        onclickfunc: function(){                            let avatarID = 'avatar-' + vwf.moniker_;                            //let cubeName = self.GUID();                            vwf_view.kernel.callMethod(vwf.application(), "createPrimitive", [el.toLowerCase(), avatarID])                        }                })                })            }            function makeLightsList() {                let nodeNames = ['Ambient', 'Directional', 'Hemisphere', 'Point', 'Spot'];                return nodeNames.map(el => {                   return self.widgets.createListItem({                        imgSrc: "vwf/view/lib/images/ui/icons/light_"+el.toLowerCase()+".png",                        title: el,                        onclickfunc: function(){                            let avatarID = 'avatar-' + vwf.moniker_;                            //let cubeName = self.GUID();                            vwf_view.kernel.callMethod(vwf.application(), "createPrimitive", ["light", avatarID, el.toLowerCase()])                        }                    })                })            }            let avatarSettings =                {                    $cell: true,                    $type: "div",                    class: "propGrid max-width mdc-layout-grid mdc-layout-grid--align-left",                    $components: [                        {                            $cell: true,                            $type: "div",                            class: "mdc-layout-grid__inner",                            $components: [                                {                                    $cell: true,                                    $type: "div",                                    class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-12",                                    $components: [                                        widgets.buttonStroked(                                            {                                                "label": "Go forward",                                                "onclick": function (e) {                                                    function getMovementVector(el) {                                                        var directionVector = new THREE.Vector3(0, 0, 0);                                                        var rotationEuler = new THREE.Euler(0, 0, 0, 'YXZ');                                                            var rotation = el.getAttribute('rotation');                                                        var velocity = new THREE.Vector3(0, 0, -0.5);                                                        var xRotation;                                                            directionVector.copy(velocity);                                                        directionVector.multiplyScalar(1.0);                                                            // Absolute.                                                        if (!rotation) { return directionVector; }                                                            xRotation = 0;                                                            // Transform direction relative to heading.                                                        rotationEuler.set(THREE.Math.degToRad(xRotation), THREE.Math.degToRad(rotation.y), 0);                                                        directionVector.applyEuler(rotationEuler);                                                        return directionVector;                                                        }                                                        let el = document.querySelector('#avatarControl');                                                        let currentPosition = el.getAttribute('position');                                                    let movementVector = getMovementVector(el);                                                    let position = {};                                                        position.x = currentPosition.x + movementVector.x;                                                    position.y = currentPosition.y + movementVector.y;                                                    position.z = currentPosition.z + movementVector.z;                                                    el.setAttribute('position', position);                                                    }                                            })                                                                            ]                                },                                {                                    $cell: true,                                    $type: "div",                                    class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-12",                                    $components: [                                        widgets.buttonStroked(                                            {                                                "label": "Reset camera view",                                                "onclick": function (e) {                                                    //document.querySelector('#' + 'viewSettings').style.visibility = 'hidden';                                                    let controlEl = document.querySelector('#avatarControl');                                                    controlEl.setAttribute('camera', 'active', true);                                                }                                            }),                                            widgets.buttonStroked(                                                {                                                    "label": "Hide cursor",                                                    "onclick": function (e) {                                                        //document.querySelector('#' + 'viewSettings').style.visibility = 'hidden';                                                        let avatarID = 'avatar-' + self.kernel.moniker();                                                        let cursorID = 'myCursor-' + avatarID;                                                        let controlEl = document.querySelector("[id='" + cursorID + "']");                                                        let vis = controlEl.getAttribute('visible');                                                        this.$text = vis ? 'Show cursor' : 'Hide cursor';                                                                vwf_view.kernel.callMethod(avatarID, "showHideCursor", [!vis]);                                                        //controlEl.setAttribute('visible', !vis);                                                    }                                                }),                                                widgets.buttonStroked(                                                    {                                                        "label": "Hide Avatar",                                                        "onclick": function (e) {                                                            //document.querySelector('#' + 'viewSettings').style.visibility = 'hidden';                                                            let avatarID = 'avatar-' + self.kernel.moniker();                                                            //let cursorID = 'myCursor-' + avatarID;                                                            let controlEl = document.querySelector("[id='" + avatarID + "']");                                                            let vis = controlEl.getAttribute('visible');                                                            this.$text = vis ? 'Show Avatar' : 'Show Avatar';                                                            vwf_view.kernel.callMethod(avatarID, "showHideAvatar", [!vis]);                                                            //controlEl.setAttribute('visible', !vis);                                                        }                                                    }                                                )                                                                                                                    ]                                },                                {                                    $cell: true,                                    $type: "div",                                    class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-12",                                    $components: [                                        {                                            $type: "div",                                            class: "mdc-layout-grid",                                            $components: [                                                {                                                    $type: "div",                                                    class: "mdc-layout-grid__inner",                                                    $components: [                                                        {                                                            $cell: true,                                                            $type: "div",                                                            class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-12",                                                            $components: [                                                                self.avatarCardDef("/../assets/avatars/ico/simple.jpg", { title: "Simple", subtitle: "Cube" },                                                                    function (e) {                                                                        let avatarID = 'avatar-' + self.kernel.moniker();                                                                        vwf_view.kernel.callMethod(avatarID, "createSimpleAvatar");                                                                    }                                                                )                                                            ]                                                        },                                                        {                                                            $cell: true,                                                            $type: "div",                                                            class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-12",                                                            $components: [                                                                self.avatarCardDef("/assets/avatars/ico/female.jpg", { title: "Human", subtitle: "Female" },                                                                    function (e) {                                                                        let avatarID = 'avatar-' + self.kernel.moniker();                                                                        vwf_view.kernel.callMethod(avatarID, "createAvatarFromGLTF", ["/assets/avatars/female/avatar1.gltf"]);                                                                    }                                                                )]                                                        },                                                        {                                                            $cell: true,                                                            $type: "div",                                                            class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-12",                                                            $components: [                                                                self.avatarCardDef("/assets/avatars/ico/male.jpg", { title: "Human", subtitle: "Male" },                                                                    function (e) {                                                                        let avatarID = 'avatar-' + self.kernel.moniker();                                                                        vwf_view.kernel.callMethod(avatarID, "createAvatarFromGLTF", ["/assets/avatars/male/avatar1.gltf"]);                                                                    }                                                                )]                                                        }                                                    ]                                                }                                            ]                                        }                                    ]                                },                                {                                    $cell: true,                                    $type: "div",                                    class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-12",                                    $components: [                                        widgets.buttonStroked(                                            {                                                "label": "Wide",                                                "onclick": function (e) {                                                    let avatarID = 'avatar-'+vwf.moniker_;                                                    vwf_view.kernel.callMethod(avatarID, "setBigVideoHead", []);                                                                                                   }                                            }),                                            widgets.buttonStroked(                                                {                                                    "label": "Small",                                                    "onclick": function (e) {                                                        let avatarID = 'avatar-'+vwf.moniker_;                                                        vwf_view.kernel.callMethod(avatarID, "setSmallVideoHead", []);                                                                                                           }                                                })                                                                          ]                                }                            ]                        }                    ]                }            let viewSettings =                {                    $cell: true,                    $type: "div",                    class: "propGrid max-width mdc-layout-grid mdc-layout-grid--align-left",                    $components: [                        {                            $cell: true,                            $type: "div",                            class: "mdc-layout-grid__inner",                            $components: [                                {                                    $cell: true,                                    $type: "div",                                    class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-12",                                    $components: [                                        widgets.buttonStroked(                                            {                                                "label": "OSC Settings",                                                "onclick": function (e) {                                                    let sideBar = document.querySelector('#sideBar');                                                    sideBar._sideBarComponent = oscSettings;                                                    //document.querySelector('#' + 'viewSettings').style.visibility = 'hidden';                                                }                                            })                                    ]                                }                            ]                        }                    ]                }            let savedStateEl = function (item) {                return {                    $type: "li",                    class: "mdc-list-item",                    role: "option",                    $components: [                        {                            $text: "Saved world"                        }                    ]                }            }            let stateListElement = function (item) {                let liEl = {                    $type: "li",                    class: "mdc-list-item",                    role: "option",                    id: "",                    tabindex: "0",                    applicationpath: "",                    $components: [                        {                            $text: "no saves"                        }                    ]                }                let applicationName = item.applicationpath.split("/");                if (applicationName == "") {                    return liEl                }                if (applicationName.length > 0) {                    applicationName = applicationName[applicationName.length - 1];                }                if (applicationName.length > 0) {                    applicationName = applicationName.charAt(0).toUpperCase() + applicationName.slice(1);                }                if (item.latestsave) {                    liEl = {                        $type: "li",                        class: "mdc-list-item",                        role: "option",                        tabindex: "0",                        id: item.savename,                        applicationpath: item.applicationpath,                        $components: [                            {                                $text: applicationName + ": " + item.savename                            }                        ]                    }                }                else {                    liEl = {                        $type: "li",                        class: "mdc-list-item",                        role: "option",                        tabindex: "0",                        id: item.savename,                        revision: item.revision,                        applicationpath: item.applicationpath,                        $components: [                            {                                $text: applicationName + ": " + item.savename + " Rev(" + item.revision + ")"                            }                        ]                    }                }                return liEl            }            let oscSettings =                {                    $cell: true,                    $type: "div",                    id: "oscSettings",                    class: "propGrid max-width mdc-layout-grid mdc-layout-grid--align-left",                    _oscHost: '',                    _oscPort: '',                    _oscStatus: '',                    _updateStatus: function () {                        this._oscStatus = window._OSCManager.getStatus()                    },                    $init: function () {                        if (window._OSCManager) {                            this._oscHost = window._OSCManager.hostValue;                            this._oscPort = window._OSCManager.portValue;                            this._oscStatus = window._OSCManager.getStatus();                            // var t = this;                            // setInterval(function () {                            //     t._updateStatus();                            // }, 1000);                        }                    },                    $update: function () {                        let that = this                        var buttonText = "Connect";                        var buttonFunc = function (e) {                        }                        if (this._oscStatus == 1) {                            buttonText = "Disconnect";                            buttonFunc = function (e) {                                window._OSCManager.disconnect();                            }                        } else {                            var buttonFunc = function (e) {                                window._OSCManager.connect();                                window._OSCManager.port.on("open", function () {                                    that._oscStatus = window._OSCManager.getStatus();                                    console.log("connected");                                });                                window._OSCManager.port.on("close", function () {                                    that._oscStatus = window._OSCManager.getStatus();                                    console.log("disconnected");                                });                            }                        }                        this.$components = [                            {                                $cell: true,                                $type: "div",                                class: "mdc-layout-grid__inner",                                $components: [                                    {                                        $cell: true,                                        $type: "div",                                        class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-12",                                        $components: [                                            {                                                $type: "span",                                                $text: "Host: "                                            },                                            {                                                class: "mdc-text-field",                                                $cell: true,                                                $type: "span",                                                $components: [                                                    {                                                        class: "mdc-text-field__input prop-text-field-input",                                                        id: "oscHost",                                                        $cell: true,                                                        $type: "input",                                                        type: "text",                                                        value: this._oscHost,                                                        onchange: function (e) {                                                            this._oscHost = this.value;                                                            window._OSCManager.setOSCHostAndPort(this._oscHost, this._oscPort);                                                        }                                                    }                                                ]                                            }                                        ]                                    },                                    {                                        $cell: true,                                        $type: "div",                                        class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-12",                                        $components: [                                            {                                                $type: "span",                                                $text: "Port: "                                            },                                            {                                                class: "mdc-text-field",                                                $cell: true,                                                $type: "span",                                                $components: [                                                    {                                                        class: "mdc-text-field__input prop-text-field-input",                                                        id: "oscPort",                                                        $cell: true,                                                        $type: "input",                                                        type: "text",                                                        value: this._oscPort,                                                        onchange: function (e) {                                                            this._oscPort = this.value;                                                            window._OSCManager.setOSCHostAndPort(this._oscHost, this._oscPort);                                                        }                                                    }                                                ]                                            }                                        ]                                    },                                    {                                        $cell: true,                                        $type: "div",                                        class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-12",                                        $components: [                                            widgets.buttonStroked(                                                {                                                    "label": buttonText,                                                    "onclick": buttonFunc                                                })                                                                                   ]                                    }                                ]                            }                        ]                    }                }            let loadSaveSettings =                {                    $cell: true,                    $type: "div",                    id: "loadSaveSettings",                    class: "propGrid max-width mdc-layout-grid mdc-layout-grid--align-left",                    _saveStates: [],                    _getStates: async function () {                        let response = await fetch("/" + self.getRoot() + "/listallsaves");                        let data = await response.json();                        //this._saveStates = data;                        //let appName = self.getRoot();                        //console.log(data.filter(item => item.applicationpath.split("/")[1] == appName));                        let filterData = data.filter(item => item.applicationpath.split("/")[1] == self.getRoot());                        if (filterData.length !== 0) {                            this._saveStates = filterData                            //return filterData                        } else {                            this._saveStates = [{                                savename: "",                                latestsave: "",                                revision: "",                                applicationpath: "",                                url: ""                            }]                        }                        // this._saveStates.filter(item => item.applicationpath.split("/")[1] == self.getRoot()).map(stateListElement)                        //return data                        //console.log(data);                        return this._saveStates                    },                    $init: function () {                        this._getStates();                    },                    $update: function () {                        this.$components =                            [                                {                                    $cell: true,                                    $type: "div",                                    class: "mdc-layout-grid__inner",                                    $components: [                                        {                                            $cell: true,                                            $type: "div",                                            class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-12",                                            $components: [                                                {                                                    class: "mdc-text-field",                                                    $cell: true,                                                    $type: "span",                                                    $components: [                                                        {                                                            class: "mdc-text-field__input prop-text-field-input",                                                            id: "fileName",                                                            $cell: true,                                                            $type: "input",                                                            type: "text",                                                            value: self.getRoot()                                                        }]                                                }                                            ]                                        },                                        {                                            $cell: true,                                            $type: "div",                                            class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-12",                                            $components: [                                                widgets.buttonStroked(                                                    {                                                        "label": "Save",                                                        "onclick": function (e) {                                                            let fileName = document.querySelector('#fileName')                                                            saveStateAsFile.call(self, fileName.value);                                                            document.querySelector("#fileName").value = '';                                                            //document.querySelector('#' + 'viewSettings').style.visibility = 'hidden';                                                        }                                                    })                                                                                            ]                                        },                                        {                                            $cell: true,                                            $type: "div",                                            class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-12",                                            $components: [                                                {                                                    $cell: true,                                                    $type: "div",                                                    class: "mdc-select",                                                    tabindex: "0",                                                    role: "listbox",                                                    id: "loadselect",                                                    $init: function () {                                                        setTimeout(function() {                                                                                                                   var MDCSelect = mdc.select.MDCSelect;                                                        let selector = document.querySelector('#loadselect');                                                        let select = new MDCSelect(selector);                                                        selector.addEventListener('MDCSelect:change', () => {                                                            //this._selectedState = select.value;                                                            document.querySelector('#loadStateButton')._selectedState = select.selectedOptions[0];                                                            //console.log(select.value);                                                            //.selectedOptions[0]                                                        });                                                          }, 300);                                                                                                            },                                                    $components: [                                                        {                                                               $type: "div",                                                            class: "mdc-select__surface mdc-ripple-upgraded",                                                            $components: [                                                                {                                                                    $type: "div",                                                                    class: "mdc-select__label",                                                                    $text: "Select..."                                                                },                                                                {                                                                    $type: "div",                                                                    class: "mdc-select__selected-text"                                                                },                                                                {                                                                    $type: "div",                                                                    class: "mdc-select__bottom-line"                                                                }                                                            ]                                                        },                                                                                                               {                                                            $type: "div",                                                            class: "mdc-simple-menu mdc-select__menu",                                                            $components: [                                                                {                                                                    $type: "ul",                                                                    class: "mdc-list mdc-simple-menu__items",                                                                    $components: this._saveStates.map(stateListElement)                                                                }                                                            ]                                                        }                                                    ]                                                }                                            ]                                        },                                        {                                            $cell: true,                                            $type: "div",                                            class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-12",                                            $components: [                                                {                                                    $cell: true,                                                    $type: "button",                                                    _selectedState: {},                                                    id: "loadStateButton",                                                    class: "mdc-button mdc-button--raised",                                                    $text: "Load",                                                    onclick: function (e) {                                                        loadSavedState.call(self, this._selectedState.getAttribute('id'), this._selectedState.getAttribute('applicationpath'), this._selectedState.getAttribute('revision'));                                                        //document.querySelector('#' + 'viewSettings').style.visibility = 'hidden';                                                    }                                                }                                            ]                                        }                                    ]                                }                            ]                    }                }            let protoPropertiesCell = function (m) {                return {                    $type: "div",                    class: "mdc-layout-grid__inner",                    _prop: {},                    $init: function () {                        let prop = m[1].prop;                        if (prop.value == undefined && this._currentNode !== undefined) {                            prop.value = JSON.stringify(utility.transform(vwf.getProperty(this._currentNode, prop.name, []), utility.transforms.transit));                        }                        this._prop = prop                    },                    $update: function () {                        this.$components = [                            // {                            //     $type: "div",                            //     class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-10",                            //     $components: [                            //         { $text: this._prop.name }                            //     ]                            // },                            // {                            //     $type: "div",                            //     class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-2",                            // },                            {                                $type: "div",                                class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-12",                                $components: [                                    {                                           $type: "span",                                        class: "mdc-typography--body2 mdc-typography--adjust-margin protoPropLabel",                                        $text: this._prop.name + ': '                                     },                                    {                                        class: "mdc-text-field",                                        $cell: true,                                        $type: "div",                                        $components: [{                                            class: "mdc-text-field__input prop-text-field-input",                                            $cell: true,                                            $type: "input",                                            type: "text",                                            value: this._prop.getValue(),                                            onchange: function (e) {                                                let propValue = this.value;                                                try {                                                    propValue = JSON.parse(propValue);                                                    self.kernel.setProperty(this._currentNode, this._prop.name, propValue);                                                } catch (e) {                                                    // restore the original value on error                                                    this.value = propValue;                                                }                                            }                                        }]                                    }                                ]                            }                        ]                    }                }            }            let propertiesCell = function (m) {                var editComponents = [{}, {}];                // fullWidth:                // fullHeight:                // xoffset:                // yoffset:                // width:                // height:                let sliderPropNames = ['width', 'height', 'depth', 'fullWidth', 'fullHeight', 'xoffset', 'yoffset', 'subcamWidth', 'subcamHeight'];                let sliderProps = {                    'width': {                        min: 0,                        max: 30                    },                    'height': {                        min: 0,                        max: 30                    },                    'depth': {                        min: 0,                        max: 30                    },                    'fullWidth': {                        min: 0,                        max: 5000,                        step:10                    },                    'fullHeight': {                        min: 0,                        max: 5000,                        step:10                    },                    'xoffset': {                        min: -10000,                        max: 10000,                        step: 10                    },                    'yoffset': {                        min: -10000,                        max: 10000,                        step: 10                    },                    'subcamWidth': {                        min: 0,                        max: 5000,                        step:10                    },                    'subcamHeight': {                        min: 0,                        max: 5000,                        step:10                    }                }                if (sliderPropNames.includes(m.name)){                   let currenValue = JSON.parse(m.getValue());                    var sliderComponent =  widgets.sliderContinuous({                        'id': 'prop-slider-' + m.name,                        'label': 'Slider',                        'min': sliderProps[m.name].min,                        'max': sliderProps[m.name].max,                        'step': sliderProps[m.name].step ? sliderProps[m.name].step: 0.1,                        'value': currenValue,                        'init': function(){        const myEl = this;        var continuousSlider = new mdc.slider.MDCSlider(myEl);        this._comp = continuousSlider;        continuousSlider.listen('MDCSlider:input', function(e) {            console.log(continuousSlider.value)            let myEl = e.currentTarget;           // let prop = myEl._prop.body;            //document.querySelector('#propAceEditor').env.editor.setValue(prop);            self.kernel.setProperty(myEl._currentNode, m.name, continuousSlider.value);          //continuousValue.textContent = continuousSlider.value;                 });        continuousSlider.listen('MDCSlider:change', function(e) {          console.log(continuousSlider.value);          let myEl = e.currentTarget;         // let prop = myEl._prop.body;          //document.querySelector('#propAceEditor').env.editor.setValue(prop);          self.kernel.setProperty(myEl._currentNode, m.name, continuousSlider.value);          //continuousCommittedValue.textContent = continuousSlider.value;        })    }})                } else {                    sliderComponent = {}                }                if (m.name.indexOf("semantics") > -1) { }                else if (m.name.indexOf("grammar") > -1) { }                else if (m.name.indexOf("ohm") > -1) {                    editComponents = [                        {                            $type: "div",                            $cell: true,                            class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-6",                            $components: [                                {                                    $cell: true,                                    $type: "button",                                    class: "mdc-button",                                    $text: "Edit", //edit grammar                                    onclick: function (e) {                                        var currentNode = document.querySelector('#currentNode')._currentNode;                                        if (currentNode == '') {                                            currentNode = vwf_view.kernel.find("", "/")[0];                                        }                                        let editor = document.querySelector('#livePropEditor');                                        editor._setNode(currentNode);                                        editor._propName = m.name;                                        editor._prop = { body: m.rawValue, type: 'complex' }                                        document.querySelector('#propEditorWindow').style.visibility = 'visible';                                    }                                }                            ]                        },                        {                            $type: "div",                            $cell: true,                            class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-1",                            $components: []                        }                    ]                } else {                    editComponents = [                        {                            $type: "div",                            class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-6",                            $components: [                                                                   sliderComponent,                                                               {                                    class: "mdc-text-field prop-mdc-text-field mdc-ripple-upgraded",                                    $cell: true,                                    $type: "div",                                    $components: [                                        {                                            class: "mdc-text-field__input prop-text-field-input",                                            id: "prop-" + m.name,                                            $cell: true,                                            $type: "input",                                            type: "text",                                            value: m.getValue(),                                            onchange: function (e) {                                                let propValue = this.value;                                                try {                                                    propValue = JSON.parse(propValue);                                                    self.kernel.setProperty(this._currentNode, m.name, propValue);                                                } catch (e) {                                                    // restore the original value on error                                                    this.value = propValue;                                                }                                            }                                        }                                    ]                                }                            ]                        },                        {                            $type: "div",                            class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-1",                            $components: [                                {                                    $cell: true,                                    $type: "button",                                    class: "mdc-button mdc-button--compact",                                    $text: "^", //edit grammar                                    onclick: function (e) {                                        var currentNode = document.querySelector('#currentNode')._currentNode;                                        if (currentNode == '') {                                            currentNode = vwf_view.kernel.find("", "/")[0];                                        }                                        let editor = document.querySelector('#livePropEditor');                                        editor._setNode(currentNode);                                        editor._propName = m.name;                                        editor._prop = { body: m.getValue(), type: 'simple' }                                        document.querySelector('#propEditorWindow').style.visibility = 'visible';                                    }                                }                            ]                        }                    ];                }                return {                    $type: "div",                    class: "mdc-layout-grid__inner",                    $components: [                        {                            $type: "div",                            class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-3",                            $components: [                                { $text: m.name }                            ]                        },                        {                            $type: "div",                            class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-2",                        },                        editComponents[0],                        editComponents[1]                    ]                }            }            let nodeLink = function (m) {                var myClass = "nodeItem";                let myAvatarName = 'avatar-' + self.kernel.moniker();                (myAvatarName == m.name) ? (myClass = "avatarName mdc-typography--subheading2") :                    myClass = "nodeItem"                                var nodeName = m.name;                        let displayName = vwf.getProperty(m.ID, 'displayName');                        if (displayName)                         {                            nodeName = displayName                        }                                     return {                    $type: "li",                    class: "mdc-list-item",                    $components: [{                        $type: "a",                        class: "mdc-list-item",                        $href: "#",                        $components: [{                            $type: 'span',                            class: myClass,                            $text: nodeName                        }                        ],                        onclick: function (e) {                            //self.currentNodeID = m.ID;                            document.querySelector('#currentNode')._setNode(m.ID);                            // document.querySelector('#liveCodeEditor')._editorNode = m.ID;                            // createAceEditor(self, m.ID);                        }                    }]                }            };            let listDivider = {                $cell: true,                $type: "hr",                class: "mdc-list-divider",            }            let webrtcGUI = {                $type: "div",                class: "propGrid mdc-layout-grid max-width mdc-layout-grid--align-left",                $components: [                    {                        $type: "div",                        class: "mdc-layout-grid__inner",                        $components: [                            {                                $type: "div",                                class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-3",                                $components: [                                    {                                    $type: "span",                                    $text: "Chat"                                }                                ]                            },                            {                                $type: "div",                                class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-3",                                $components: [                                    widgets.icontoggle({                                        'id': "webrtcswitch",                                        'label': 'visibility',                                        'on': JSON.stringify({"content": "visibility", "label": "Turn On Mic"}),                                        'off': JSON.stringify({"content": "visibility_off", "label": "Turn Off Mic"}),                                        'state': false,                                        'init': function(){                                            this._driver = vwf.views["vwf/view/webrtc"];                                            if (!this._driver) {                                                this.classList.add('mdc-icon-toggle--disabled');                                            }                                            this.addEventListener('MDCIconToggle:change', (e) => {                                                                                                let driver = e.target._driver;                                                let chkAttr = e.detail.isOn;                                                let avatarID = 'avatar-' + self.kernel.moniker();                                                let micToggle = document.querySelector('#webrtcaudio');                                                let camToggle = document.querySelector('#webrtcvideo');                                                if (chkAttr) {                                                    driver.startWebRTC(avatarID);                                                    micToggle.classList.remove('mdc-icon-toggle--disabled');                                                    camToggle.classList.remove('mdc-icon-toggle--disabled');                                                    console.log("on")                                                            } else {                                                    driver.stopWebRTC(avatarID);                                                    micToggle.classList.add('mdc-icon-toggle--disabled');                                                    camToggle.classList.add('mdc-icon-toggle--disabled');                                                    console.log("off")                                                }                                               //console.log(e, detail)                                                //status.textContent = `Icon Toggle is ${detail.isOn ? 'on' : 'off'}`;                                              });                                                                                    }                                    })                                ]                            },                            {                                $type: "div",                                class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-3",                                $components: [                                    widgets.icontoggle({                                        'id': "webrtcaudio",                                        'label': 'mic',                                        'on': JSON.stringify({"content": "mic", "label": "Turn On Mic"}),                                        'off': JSON.stringify({"content": "mic_off", "label": "Turn Off Mic"}),                                        'state': false,                                        'init': function(){                                            this._driver = vwf.views["vwf/view/webrtc"];                                            let webrtcswitch = document.querySelector('#webrtcswitch');                                            if (!this._driver) {                                                this.classList.add('mdc-icon-toggle--disabled');                                            }                                            this.classList.add('mdc-icon-toggle--disabled');                                            this.addEventListener('MDCIconToggle:change', (e) => {                                                                                                let driver = e.target._driver;                                                let chkAttr = e.detail.isOn;                                                if (chkAttr) {                                                    driver.muteAudio(chkAttr);                                                    console.log("on")                                                            } else {                                                    driver.muteAudio(chkAttr);                                                    console.log("off")                                                }                                               //console.log(e, detail)                                                //status.textContent = `Icon Toggle is ${detail.isOn ? 'on' : 'off'}`;                                              });                                                                                    }                                    })                                ]                            },                            {                                $type: "div",                                class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-3",                                $components: [                                    widgets.icontoggle({                                        'id': "webrtcvideo",                                        'label': 'videocam',                                        'on': JSON.stringify({"content": "videocam", "label": "Turn On Video"}),                                        'off': JSON.stringify({"content": "videocam_off", "label": "Turn Off Video"}),                                        'state': false,                                        'init': function(){                                            this._driver = vwf.views["vwf/view/webrtc"];                                            if (!this._driver) {                                                this.classList.add('mdc-icon-toggle--disabled');                                            }                                            this.classList.add('mdc-icon-toggle--disabled');                                            this.addEventListener('MDCIconToggle:change', (e) => {                                                                                                let driver = e.target._driver;                                                let chkAttr = e.detail.isOn;                                                if (chkAttr) {                                                    driver.muteVideo(chkAttr);                                                    console.log("on")                                                            } else {                                                    driver.muteVideo(chkAttr);                                                    console.log("off")                                                }                                               //console.log(e, detail)                                                //status.textContent = `Icon Toggle is ${detail.isOn ? 'on' : 'off'}`;                                              });                                                                                    }                                    })                                ]                            }                                                   ]                    }                ]            }            let gizmoEdit = {                $type: "div",                class: "propGrid mdc-layout-grid max-width mdc-layout-grid--align-left",                $components: [                    {                        $type: "div",                        class: "mdc-layout-grid__inner",                        $components: [                            {                                $type: "div",                                class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-2",                                $components: [                                    {                                        $cell: true,                                        $type: "span",                                        $text: "Edit: ",                                    }                                ]                            },                            {                                $type: "div",                                class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-3",                                $components: [                                    widgets.switch({                                    'id': 'editnode',                                     'init': function(){                                        vwf_view.kernel.getProperty(this._currentNode, 'edit');                                    },                                    'onchange': function(e){                                        var nodeID = document.querySelector('#currentNode')._currentNode;                                        let chkAttr = this.getAttribute('checked');                                        if (chkAttr == "") {                                            self.kernel.setProperty(this._currentNode, 'edit', false);                                            } else {                                            self.kernel.setProperty(this._currentNode, 'edit', true);                                        }                                            vwf_view.kernel.callMethod(nodeID, "showCloseGizmo");                                    }                                }                                )                                ]                            },                            {                                $type: "div",                                class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-2",                                $components: [                                    self.widgets.imageButton({                                        imgSrc: "vwf/view/lib/images/ui/icons/translate.png",                                        styleClass: "editButton",                                        onclickfunc: function (e) {                                                            vwf_view.kernel.callMethod(this._currentNode, "setGizmoMode", ['translate'])                                                        }                                    })                                ]                            },                            {                                $type: "div",                                class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-2",                                $components: [                                    self.widgets.imageButton({                                        imgSrc: "vwf/view/lib/images/ui/icons/rotate.png",                                        styleClass: "editButton",                                        onclickfunc: function (e) {                                                            vwf_view.kernel.callMethod(this._currentNode, "setGizmoMode", ['rotate'])                                                        }                                    })                                ]                            },                            {                                $type: "div",                                class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-2",                                $components: [                                    self.widgets.imageButton({                                        imgSrc: "vwf/view/lib/images/ui/icons/scale.png",                                        styleClass: "editButton",                                        onclickfunc: function (e) {                                                            vwf_view.kernel.callMethod(this._currentNode, "setGizmoMode", ['scale'])                                                        }                                    })                                ]                            },                            {                                $type: "div",                                class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-12",                                $components: [                                    // self.widgets.floatActionButton({                                    //     label: "content_copy",                                    //     styleClass: "mdc-fab--mini"                                    // }),                                    // {                                    //     $type: "span",                                    //     $text: " "                                    // },                                    self.widgets.floatActionButton({                                        label: "delete_forever",                                        styleClass: "mdc-fab--mini",                                        onclickfunc: function(){                                        var nodeID = document.querySelector('#currentNode')._currentNode;                                        let node = self.nodes[nodeID];                                         //vwf_view.kernel.deleteChild(node.parentID, node.name);                                        vwf_view.kernel.deleteNode(nodeID);                                        //vwf_view.kernel.callMethod(node.parentID, "deleteNode", [node.name])                                        }                                    })                                                                    ]                            },                        ]                    }                ]            }            let nodesCell = {                $cell: true,                $type: "div",                id: "currentNode",                _childNodes: [],                _currentNode: '',                _displayedProperties: {},                _setNode: function (aNode) {                    this._currentNode = aNode;                    document.querySelector('#sideBar')._sideCurrentNode = this._currentNode                },                $init: function () {                    this._currentNode = document.querySelector('#sideBar')._sideCurrentNode                    //this._currentNode = vwf_view.kernel.find("", "/")[0];                    //this._currentNode = '3333';                },                _getChildNodes: function () {                    this._childNodes = self.nodes[this._currentNode];                    if (this._childNodes !== undefined) {                        return this._childNodes.children                    } else {                        return []                    }                    //let nodeIDAlpha = he.encode(this._currentNode);                },                // _getNodeComplexProperties: function () {                //     let node = self.nodes[this._currentNode];                //     let props = this._getNodeProperties();                //     let filterFunction = function (prop) {                //         return (prop.name == 'ohmLang')                 //     };                //     let complexProps = props.filter(filterFunction.bind(this));                //     return complexProps                // },                _getNodeProperties: function () {                    let node = self.nodes[this._currentNode];                    this._displayedProperties = {};                    let filterFunction = function (prop) {                        return (!this._displayedProperties[prop.name] && prop.name.indexOf('$') === -1) ? (this._displayedProperties[prop.name] = "instance", true) : (false);                    };                    let props = node.properties.filter(filterFunction.bind(this));                    return props                },                _getNodeProtoProperties: function () {                    let node = self.nodes[this._currentNode];                    let filterFunction = function (prop) {                        return (!this._displayedProperties[prop[1].prop.name]) ? (this._displayedProperties[prop[1].prop.name] = prop[1].prototype, true) : (false);                    };                    let props = Object.entries(getProperties.call(self, self.kernel, node.extendsID)).filter(filterFunction.bind(this));                    return props                },                $update: function () {                    //this.$text = this._currentNode;                    let node = self.nodes[this._currentNode];                    let nodeProtos = getPrototypes(self.kernel, node.extendsID);                    var viewerProps = {};                    var viewerPropsCell = {};                    var gizmoCell = {};                    if (this._currentNode !== self.kernel.application()) {                        if (nodeProtos.includes('http://vwf.example.com/aframe/componentNode.vwf')) {                            //gizmoCell = {};                        } else {                            gizmoCell = gizmoEdit                        }                    }                    if (node !== undefined) {                        if (node.extendsID == "http://vwf.example.com/aframe/acamera.vwf") {                            viewerProps = {                                $type: "li",                                class: "mdc-list-item",                                $components: [                                    {                                        $text: "Viewer properties",                                        $type: "span",                                        class: "mdc-list-item__text mdc-typography--button"                                    }                                ]                            }                            viewerPropsCell = {                                $cell: true,                                $type: "div",                                class: "propGrid mdc-layout-grid max-width mdc-layout-grid--align-left",                                $components: [                                    {                                        $cell: true,                                        $type: "div",                                        class: "mdc-layout-grid__inner",                                        $components: [                                            {                                                $cell: true,                                                $type: "div",                                                class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-12",                                                $components: [                                                    widgets.buttonStroked(                                                        {                                                            "label": "Active",                                                            "onclick": function (e) {                                                                //let camera = document.querySelector('#' + this._currentNode);                                                                vwf_view.kernel.callMethod(this._currentNode, "setCameraToActive", [vwf.moniker_]);                                                                //camera.setAttribute('camera', 'active', true);                                                            }                                                        })                                                                                                   ]                                            }                                        ]                                    }                                ]                                //$components: this._getNodeProtoProperties().map(protoPropertiesCell)                            }                        } else {                            viewerProps = {};                            viewerPropsCell = {};                        }                    }                    this.$components = [                        {                            $cell: true,                            $type: "ul",                            class: "mdc-list",                            $components: [                                widgets.buttonStroked(                                    {                                        "label": "<--",                                        "onclick": function (e) {                                            let node = self.nodes[this._currentNode];                                            if (node.parentID !== 0) {                                                //self.currentNodeID = node.parentID,                                                document.querySelector('#currentNode')._setNode(node.parentID)                                            }                                            }                                    }),                                                               {                                    $type: "li",                                    class: "mdc-list-item",                                    $components: [                                        {                                            $text: "name",                                            $type: "span",                                            $init: function () {                                                let node = self.nodes[this._currentNode];                                                                                               if (node) {                                                    let displayName = vwf.getProperty(node.ID, 'displayName');                                                    if (displayName)                                                     {                                                        this.$text = displayName                                                    } else {                                                        this.$text = node.name;                                                    }                                                }                                                                                                                                                                                                                                               //console.log(node.properties.displayName)                                            },                                            class: "mdc-list-item__text mdc-typography--headline"                                            //<h1 class="mdc-typography--display4">Big header</h1>                                        }]                                }, listDivider,                                {                                    // $cell: true,                                    // $type: "ul",                                    // class: "mdc-list",                                    $type: "div",                                    class: "propGrid mdc-layout-grid max-width mdc-layout-grid--align-left",                                    $components: [                                        {                                            $type: "div",                                            class: "mdc-layout-grid__inner",                                            $components: [                                                {                                                    $type: "div",                                                    class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-12",                                                    $components: [                                                        widgets.buttonStroked(                                                            {                                                                "label": "Methods browser",                                                                "onclick": function (e) {                                                                    var currentNode = document.querySelector('#currentNode')._currentNode;                                                                    if (currentNode == '') {                                                                        currentNode = vwf_view.kernel.find("", "/")[0];                                                                    }                                                                    document.querySelector('#liveCodeEditor')._setNode(currentNode);                                                                    //createAceEditor(self, currentNode);                                                                    document.querySelector('#codeEditorWindow').style.visibility = 'visible';                                                                }                                                            })                                                                                                            ]                                                }                                            ]                                        }                                    ]                                },                                gizmoCell,                                listDivider,                                {                                    $type: "li",                                    class: "mdc-list-item",                                    $components: [                                        {                                            $text: "Children",                                            $type: "span",                                            class: "mdc-list-item__text mdc-typography--button"                                        }]                                },                                {                                    $cell: true,                                    $type: "ul",                                    class: "mdc-list",                                    $components: this._getChildNodes().map(nodeLink)                                }, listDivider, {                                    $type: "li",                                    class: "mdc-list-item",                                    $components: [                                        {                                            $text: "Properties",                                            $type: "span",                                            class: "mdc-list-item__text mdc-typography--button"                                            //<h1 class="mdc-typography--display4">Big header</h1>                                        }]                                },                                {                                    // $cell: true,                                    // $type: "ul",                                    // class: "mdc-list",                                    $type: "div",                                    class: "propGrid mdc-layout-grid max-width mdc-layout-grid--align-left",                                    $components: this._getNodeProperties().map(propertiesCell)                                },                                listDivider,                                {                                    $type: "li",                                    class: "mdc-list-item",                                    $components: [                                        {                                            $text: "Proto properties",                                            $type: "span",                                            class: "mdc-list-item__text mdc-typography--button"                                        }]                                },                                {                                    $cell: true,                                    $type: "div",                                    class: "propGrid mdc-layout-grid max-width mdc-layout-grid--align-left",                                    $components: this._getNodeProtoProperties().map(protoPropertiesCell)                                }, listDivider,                                viewerProps,                                viewerPropsCell                            ]                        }                    ]                }            }            let numberSliderComponent = {                $cell: true,                $type: "div",                class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-4",                $init: function () {                                    },                $components: [                    {                        $cell: true,                        $type: "div",                        style: "padding: 0 16px;",                         $components:[                            {}                        ]                    }                                                                                ]            }            let colorPickerComponent = {                $cell: true,                $type: "div",                class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-4",                $init: function () {                    let myEl = this;                    let cp = ColorPicker(                        document.getElementById('slide'),                        document.getElementById('picker'),                        function (hex, hsv, rgb, mousePicker, mouseSlide) {                            ColorPicker.positionIndicators(                                document.getElementById('slide-indicator'),                                document.getElementById('picker-indicator'),                                mouseSlide, mousePicker                            );                            if (myEl._propName.toLowerCase().includes('color')) {                                                               // console.log(hex);                                    document.querySelector('#propAceEditor').env.editor.setValue(JSON.stringify(hex));                                self.kernel.setProperty(myEl._editorNode, myEl._propName, hex);                            }                        });                    if (myEl._propName.toLowerCase().includes('color')) {                        cp.setHex(JSON.parse(myEl._prop.body));                    }                },                $components: [                    {                        $cell: true,                        $type: "div",                        id: "color-picker",                        class: "cp-default",                        $components: [                            {                                $cell: true,                                $type: "div",                                class: "picker-wrapper",                                $components: [                                    {                                        $cell: true,                                        $type: "div",                                        id: "picker",                                        class: "picker",                                        style: "width: 130px; height: 130px"                                    },                                    {                                        $cell: true,                                        $type: "div",                                        id: "picker-indicator",                                        class: "picker-indicator"                                    }                                ]                            },                            {                                $cell: true,                                $type: "div",                                class: "slide-wrapper",                                $components: [                                    {                                        $cell: true,                                        $type: "div",                                        id: "slide",                                        class: "slide",                                        style: "width: 30px; height: 130px"                                    },                                    {                                        $cell: true,                                        $type: "div",                                        id: "slide-indicator",                                        class: "slide-indicator"                                    }                                ]                            }                        ]                    }                    // {                    //     $cell: true,                    //     $type: "div",                    //     id: "color-picker",                    //     $init: function () {                    //     }                    // }                ]            }            let propEditorWindow = {                $cell: true,                $type: "div",                _editorNode: '',                _prop: { body: '', type: 'simple' },                _propName: '',                id: "livePropEditor",                _setNode: function (node) {                    this._editorNode = node;                    this._prop.body = ''                },                class: "propEditorGrid mdc-layout-grid max-width mdc-layout-grid--align-left",                $update: function () {                    var editorClass = "mdc-layout-grid__cell mdc-layout-grid__cell--span-8"                    var livePropertyComponent = {}                    if (this._prop.type == 'simple') {                        if (this._propName.toLowerCase().includes('color')) {                            livePropertyComponent = colorPickerComponent                        }                                            } else {                        editorClass = "mdc-layout-grid__cell mdc-layout-grid__cell--span-12"                    }                    this.$components = [                        {                            $cell: true,                            $type: "div",                            class: "mdc-layout-grid__inner",                            $components: [                                {                                    $cell: true,                                    $type: "div",                                    class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-2",                                    $components: [                                        widgets.buttonStroked(                                            {                                                "label": "Update",                                                "onclick": function (e) {                                                    let editor = document.querySelector("#propAceEditor").env.editor;                                                    let value = editor.getValue();                                                        try {                                                        let propValue = (this._prop.type == 'simple') ? (JSON.parse(value)) : (value)                                                        //propValue = JSON.parse(value);                                                        self.kernel.setProperty(this._editorNode, this._propName, propValue);                                                        } catch (e) {                                                        // restore the original value on error                                                        this.value = propValue;                                                    }                                                    }                                            }                                        )]                                },                                {                                    $cell: true,                                    $type: "div",                                    class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-5",                                    $components: [                                        {                                            $type: "h3",                                            class: "mdc-list-group__subheader mdc-list-item__text mdc-typography--subheading1",                                            $text: this._editorNode                                        }                                    ]                                },                                {                                    $cell: true,                                    $type: "div",                                    class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-5",                                    $components: [                                        {                                            $type: "h3",                                            class: "mdc-list-group__subheader mdc-list-item__text mdc-typography--subheading1",                                            $text: this._propName                                        }                                    ]                                }                            ]                        },                        {                            $cell: true,                            $type: "div",                            class: "mdc-layout-grid__inner",                            $components: [                                {                                    $cell: true,                                    $type: "div",                                    class: editorClass,                                    $components: [                                        {                                            $cell: true,                                            class: "aceEditor",                                            id: "propAceEditor",                                            $type: "div",                                            $text: this._prop.body,                                            $init: function () {                                                createAceEditor(self, this._editorNode, "propAceEditor");                                                this.env.editor.$blockScrolling = Infinity                                            }                                        }                                    ]                                }, livePropertyComponent                                // {                                //     $cell: true,                                //     $type: "div",                                //     class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-2",                                //     $components: []                                // },                            ]                        }                    ]                    //$components:                 }            }            let codeEditorWindow = {                $cell: true,                $type: "div",                _editorNode: '',                _method: { body: '' },                _methodName: '',                _getNodeMethods: function () {                    let node = self.nodes[this._editorNode];                    return node.methods                },                _getProtoNodeMethods: function () {                    let node = self.nodes[this._editorNode];                    let prototypeMethods = getMethods.call(self, self.kernel, node.extendsID);                    return prototypeMethods                },                id: "liveCodeEditor",                _setNode: function (node) {                    this._editorNode = node;                    this._method.body = ''                },                class: "codeEditorGrid mdc-layout-grid max-width mdc-layout-grid--align-left",                // _getComplexProps: function(){                //     let node = self.nodes[this._editorNode];                //     let currentNode = document.querySelector('#currentNode');                //     var props = {}                //     if (currentNode !== null) {                //         props = currentNode._getNodeComplexProperties();                //     }                //     return props                // },                // _listPropertyElement: function (m) {                //     return {                //         $type: "li",                //         class: "mdc-list-item",                //         $components: [{                //             $type: "a",                //             class: "mdc-list-item",                //             $href: "#",                //             $text: m[1].name,                //             onclick: function (e) {                //                 this._method = {};                //                 this._methodName = m[1].name;                //                 this._method.body = m[1].rawValue                //                 this._method.type = "complexProperty"                //             }                //         }]                //     }                // },                _listElement: function (m) {                    return {                        $type: "li",                        class: "mdc-list-item",                        $components: [{                            $type: "a",                            class: "mdc-list-item",                            $href: "#",                            $text: m[0],                            onclick: function (e) {                                let method = vwf.getMethod(this._editorNode, m[0]);                                //document.querySelector('#aceEditor').                                this._method = method;                                this._methodName = m[0];                                //self.currentNodeID = m.ID;                                //document.querySelector('#currentNode')._setNode(m.ID);                            }                        }]                    }                },                $update: function () {                    this.$components = [                        {                            $cell: true,                            $type: "div",                            class: "mdc-layout-grid__inner",                            $components: [                                {                                    $cell: true,                                    $type: "div",                                    class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-3",                                    $components: [                                        {                                            $type: "h3",                                            class: "mdc-list-group__subheader mdc-list-item__text mdc-typography--subheading1",                                            $text: this._editorNode                                        }                                    ]                                },                                {                                    $cell: true,                                    $type: "div",                                    class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-2",                                    $components: [                                        widgets.buttonStroked(                                            {                                                "label": "Update",                                                "onclick": function (e) {                                                    let editor = document.querySelector("#aceEditor").env.editor;                                                    let evalText = editor.getValue();                                                        //    if (this._method.type == 'complexProperty') {                                                        //         let propValue = evalText;                                                    //         try {                                                    //             //propValue = JSON.parse(propValue);                                                    //             self.kernel.setProperty(this._editorNode, this._methodName, propValue);                                                        //         } catch (e) {                                                    //             // restore the original value on error                                                    //             this.value = propValue;                                                    //         }                                                    //     } else {                                                        //     }                                                    self.kernel.setMethod(this._editorNode, this._methodName,                                                        { body: evalText, type: "application/javascript", parameters: this._method.parameters });                                                }                                            }                                        )]                                },                                {                                    $cell: true,                                    $type: "div",                                    class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-2",                                    $components: [                                        widgets.buttonStroked(                                            {                                                "label": "Call",                                                "onclick": function (e) {                                                    var params = [];                                                        if (this._method.parameters) {                                                        let paramsLength = this._method.parameters.length                                                                if (paramsLength >= 1) {                                                            let paramsVal = document.querySelector("#methodParams").value;                                                            try {                                                                params = JSON.parse(paramsVal);                                                                //params.push(prmtr);                                                            } catch (e) {                                                                self.logger.error('Invalid Value');                                                            }                                                        }                                                    };                                                    self.kernel.callMethod(this._editorNode, this._methodName, params);                                                    }                                            })                                        ]                                },                                {                                    $cell: true,                                    $type: "div",                                    class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-2",                                    $components: [                                        widgets.buttonStroked(                                            {                                                "label": "Do It",                                                "onclick": function (e) {                                                    let editor = document.querySelector("#aceEditor").env.editor;                                                    codeEditorDoit.call(self, editor, this._editorNode);                                                }                                            })                                        ]                                },                                {                                    $cell: true,                                    $type: "div",                                    class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-3",                                    $components: [                                        widgets.buttonStroked(                                            {                                                "label": "Print It",                                                "onclick": function (e) {                                                    let editor = document.querySelector("#aceEditor").env.editor;                                                    codeEditorPrintit.call(self, editor, this._editorNode);                                                }                                            })                                       ]                                }                            ]                        },                        {                            $cell: true,                            $type: "div",                            class: "mdc-layout-grid__inner",                            $components: [                                {                                    $cell: true,                                    $type: "div",                                    class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-3",                                    style: "overflow-y: scroll; max-height: 400px;",                                    $components: [                                        {                                            $cell: true,                                            $type: "div",                                            class: "mdc-list-group",                                            $components: [                                                {                                                    $type: "h3",                                                    class: "mdc-list-group__subheader mdc-list-item__text mdc-typography--button",                                                    $text: "Node methods"                                                },                                                {                                                    $cell: true,                                                    $type: "ul",                                                    class: "mdc-list",                                                    $components: Object.entries(this._getNodeMethods()).map(this._listElement)                                                }, listDivider,                                                {                                                    $type: "h3",                                                    class: "mdc-list-group__subheader mdc-list-item__text mdc-typography--button",                                                    $text: "Proto methods"                                                },                                                {                                                    $cell: true,                                                    $type: "ul",                                                    class: "mdc-list",                                                    $components: Object.entries(this._getProtoNodeMethods()).map(this._listElement)                                                }, listDivider,                                                {                                                    $type: "h3",                                                    class: "mdc-list-group__subheader mdc-list-item__text mdc-typography--button",                                                    $text: "Events"                                                }                                                // {                                                //     $cell: true,                                                //     $type: "ul",                                                //     class: "mdc-list",                                                //     $components: Object.entries(this._getComplexProps()).map(this._listPropertyElement)                                                // }                                            ]                                        }                                    ]                                },                                {                                    $cell: true,                                    $type: "div",                                    class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-9",                                    $components: [                                        {                                            $cell: true,                                            class: "aceEditor",                                            id: "aceEditor",                                            $type: "div",                                            $text: this._method.body,                                            $init: function () {                                                createAceEditor(self, this._editorNode, "aceEditor");                                            }                                        }                                    ]                                }                            ]                        },                        {                            $cell: true,                            $type: "div",                            class: "mdc-layout-grid__inner",                            $components: [                                {                                    $cell: true,                                    $type: "div",                                    class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-12",                                    $components: [                                        {                                            $type: "span",                                            $text: "*"                                        }                                    ]                                }                            ]                        },                        { //params input                            $cell: true,                            $type: "div",                            class: "mdc-layout-grid__inner",                            $components: [                                {                                    $cell: true,                                    $type: "div",                                    class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-3",                                    $components: [                                        {                                            class: "mdc-text-field",                                            $cell: true,                                            $type: "div",                                            $components: [{                                                class: "mdc-text-field__input prop-text-field-input",                                                id: "methodName",                                                $cell: true,                                                $type: "input",                                                type: "text",                                                value: "newMethodName",                                                onchange: function (e) {                                                    let propValue = this.value;                                                    try {                                                    } catch (e) {                                                        // restore the original value on error                                                    }                                                }                                            }]                                        }                                    ]                                },                                {                                    $cell: true,                                    $type: "div",                                    class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-7",                                    $components: [                                        {                                            class: "mdc-text-field params-text-field-input",                                            $cell: true,                                            $type: "div",                                            $components: [{                                                class: "mdc-text-field__input prop-text-field-input",                                                id: "methodParams",                                                $cell: true,                                                $type: "input",                                                type: "text",                                                value: JSON.stringify(this._method.parameters),                                                onchange: function (e) {                                                    let propValue = this.value;                                                    try {                                                    } catch (e) {                                                        // restore the original value on error                                                    }                                                }                                            }]                                        }                                    ]                                },                                {                                    $cell: true,                                    $type: "div",                                    class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-2",                                    $components: [                                        widgets.buttonStroked(                                            {                                                "label": "Create",                                                "onclick": function (e) {                                                    let methodName = document.querySelector('#methodName').value;                                                    //let methodParams = document.querySelector('#methodParams');                                                    var params = [];                                                    let body = '';                                                    let paramsVal = document.querySelector("#methodParams").value;                                                    if (paramsVal !== '') {                                                        try {                                                            params = JSON.parse(paramsVal);                                                            //params.push(prmtr);                                                        } catch (e) {                                                            self.logger.error('Invalid Value');                                                        }                                                    }                                                            self.kernel.createMethod(this._editorNode, methodName, params, body);                                                    this._setNode(this._editorNode);                                                    // let editor = document.querySelector("#aceEditor").env.editor;                                                    // codeEditorDoit.call(self, editor, this._editorNode);                                                }                                            })                                                               ]                                }                            ]                        }                    ]                    //$components:                 }            }            let propWindow = {                $cell: true,                $type: "div",                class: "propGrid mdc-layout-grid max-width mdc-layout-grid--align-left",                style: "overflow-y: scroll; max-height: 800px;",                $components: [                    {                        $type: "div",                        class: "mdc-layout-grid__inner",                        $components: [                            {                                $cell: true,                                $type: "div",                                class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-12",                                $components: [                                    nodesCell                                ]                            }                        ]                    }                    //     <button class="mdc-button">                    //     Flat button                    //   </button>                ]            }            let clientListCell = {                $cell: true,                $type: "div",                class: "mdc-list",                id: "clientsList",                _watchNodes: [],                _listElement: function (m) {                    return {                        $type: "a",                        class: "mdc-list-item",                        $href: "#",                        $text: m.name,                        onclick: function (e) {                            //self.currentNodeID = m.ID;                            //document.querySelector('#currentNode')._setNode(m.ID);                        }                    }                },                $init: function () {                    var t = this;                    setInterval(function () {                        t._updateMe();                    }, 1000);                },                _updateMe: function () {                    this._watchNodes = self.nodes["http://vwf.example.com/clients.vwf"].children.slice()                },                $update: function () {                    //this._clientNodes                    this.$components = this._watchNodes.map(this._listElement)                }            }            //createCellWindow("clientsWindow", clientListCell, "Clients");            //createCellWindow("propWindow", propWindow, "Scene");            createCellWindow("codeEditorWindow", codeEditorWindow, "Code editor");            createCellWindow("propEditorWindow", propEditorWindow, "Prop editor");            let viewSceneProps = {                $cell: true,                $type: "div",                class: "propGrid mdc-layout-grid mdc-layout-grid--align-left",                //style: "overflow-y: scroll; max-height: 500px; overflow-x: hidden;",                $components: [                    {                        $type: "div",                        class: "mdc-layout-grid__inner",                        $components: [                            {                                $cell: true,                                $type: "div",                                class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-12",                                $components: [                                    nodesCell                                ]                            }                        ]                    }                ]            }            let sideBar = {                $cell: true,                $type: "div",                id: 'sideBar',                class: "sideBar mdc-toolbar-fixed-adjust",                _sideBarComponent: {},                _sideCurrentNode: '',                $init: function () {                    this.style.visibility = 'hidden';                    this._importScript("/" + self.getRoot() + "/appui.js");                },                _importScript: function (sSrc, fOnload) {                    var oScript = document.createElement("script");                    oScript.type = "text\/javascript";                    oScript.async = false;                    //oScript.onerror = loadError;                    if (fOnload) { oScript.onload = fOnload; }                    oScript.src = sSrc;                    //let sideBar = document.querySelector('#sideBar');                    this.appendChild(oScript);                },                _getAppDef: async function () {                    let response = await fetch("/" + self.getRoot() + "/appui.js");                    let data = await response.text();                    //console.log(data)                    return data                },                $update: function () {                    this.$components = [                        {                            $cell: true,                            $type: "button",                            class: "mdc-button mdc-button--compact",                            $text: "X",                            onclick: function (e) {                                document.querySelector('#sideBar').style.visibility = 'hidden';                            }                        },                        this._sideBarComponent                    ]                }                //$components: [this._sideComponents]            }            document.querySelector('#' + 'sideBar').$cell(sideBar)            let defaultApp = function () {                return {                    $cell: true,                    $type: "div",                    class: "propGrid max-width mdc-layout-grid mdc-layout-grid--align-left",                    $components: [                        {                            $cell: true,                            $type: "div",                            class: "mdc-layout-grid__inner",                            $components: [                                {                                    $cell: true,                                    $type: "div",                                    class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-12",                                    $components: [                                        {                                            $cell: true,                                            $type: "h3",                                            class: "mdc-typography--headline",                                            $text: "Application",                                        }                                    ]                                }                            ]                        }                    ]                }            }            let drawerCell = {                $cell: true,                $type: "nav",                class: "mdc-temporary-drawer__drawer",                $components: [                    {                        $cell: true,                        $type: "header",                        class: "mdc-temporary-drawer__header",                        $components: [                            {                                $cell: true,                                $type: "div",                                class: "mdc-temporary-drawer__header-content mdc-theme--primary-bg mdc-theme--text-primary-on-primary",                                $text: "Home"                            }                        ]                    },                    {                        $cell: true,                        $type: "nav",                        class: "mdc-temporary-drawer__content mdc-list-group",                        $components: [                            {                                $cell: true,                                $type: "div",                                class: "mdc-list",                                $components: [                                    {                                        $cell: true,                                        $type: "a",                                        class: "mdc-list-item",                                        $href: "#",                                        onclick: function (e) {                                            let sideBar = document.querySelector('#sideBar');                                            try {                                                sideBar._sideBarComponent = createApp.call(self);                                            } catch (e) {                                                sideBar._sideBarComponent = defaultApp();                                            }                                            drawer.open = !drawer.open                                            document.querySelector('#sideBar').style.visibility = 'visible';                                        },                                        $components: [{                                            $type: "i",                                            class: "material-icons mdc-list-item__start-detail",                                            'aria-hidden': "true",                                            $text: "play_arrow"                                        },                                        {                                            $text: "App"                                        }]                                    },                                    {                                        $cell: true,                                        $type: "a",                                        class: "mdc-list-item",                                        $href: "#",                                        onclick: function (e) {                                            let sideBar = document.querySelector('#sideBar');                                            sideBar._sideBarComponent = viewSceneProps;                                            let currentNode = document.querySelector('#sideBar')._sideCurrentNode;                                            currentNode == '' ? document.querySelector('#sideBar')._sideCurrentNode = (vwf_view.kernel.find("", "/")[0]) :                                                document.querySelector('#sideBar')._sideCurrentNode = currentNode;                                            document.querySelector('#sideBar').style.visibility = 'visible';                                            drawer.open = !drawer.open                                            // let currentNode = document.querySelector('#currentNode')._currentNode;                                            // currentNode == '' ? document.querySelector('#currentNode')._setNode(vwf_view.kernel.find("", "/")[0]) :                                            //     document.querySelector('#currentNode')._setNode(currentNode);                                        },                                        $components: [{                                            $cell: true,                                            $type: "i",                                            class: "material-icons mdc-list-item__start-detail",                                            $text: "description"                                        },                                        {                                            $text: "Scene"                                        }                                        ]                                    },                                    {                                        $cell: true,                                        $type: "a",                                        class: "mdc-list-item",                                        $href: "#",                                        onclick: function (e) {                                            //self.currentNodeID = m.ID;                                            // document.querySelector('#clientsList')._setClientNodes(self.nodes["http://vwf.example.com/clients.vwf"]);                                            // document.querySelector('#clientsWindow').style.visibility = 'visible';                                            let sideBar = document.querySelector('#sideBar');                                            sideBar._sideBarComponent = createSettings;                                            drawer.open = !drawer.open                                            document.querySelector('#sideBar').style.visibility = 'visible';                                        },                                        $components: [{                                            $type: "i",                                            class: "material-icons mdc-list-item__start-detail",                                            'aria-hidden': "true",                                            $text: "create"                                        },                                        {                                            $text: "Create"                                        }]                                    },                                    {                                        $cell: true,                                        $type: "a",                                        class: "mdc-list-item",                                        $href: "#",                                        onclick: function (e) {                                            // var currentNode = document.querySelector('#currentNode')._currentNode;                                            // if (currentNode == '') {                                            //     currentNode = vwf_view.kernel.find("", "/")[0];                                            // }                                            document.querySelector('#liveCodeEditor')._setNode(vwf_view.kernel.find("", "/")[0]);                                            //createAceEditor(self, currentNode);                                            document.querySelector('#codeEditorWindow').style.visibility = 'visible';                                        },                                        $components: [{                                            $type: "i",                                            class: "material-icons mdc-list-item__start-detail",                                            'aria-hidden': "true",                                            $text: "code"                                        },                                        {                                            $text: "Code editor"                                        }]                                    },                                    {                                        $cell: true,                                        $type: "a",                                        class: "mdc-list-item",                                        $href: "#",                                        onclick: function (e) {                                            //self.currentNodeID = m.ID;                                            // document.querySelector('#clientsList')._setClientNodes(self.nodes["http://vwf.example.com/clients.vwf"]);                                            // document.querySelector('#clientsWindow').style.visibility = 'visible';                                            let sideBar = document.querySelector('#sideBar');                                            sideBar._sideBarComponent = avatarSettings;                                            drawer.open = !drawer.open                                            document.querySelector('#sideBar').style.visibility = 'visible';                                        },                                        $components: [{                                            $type: "i",                                            class: "material-icons mdc-list-item__start-detail",                                            'aria-hidden': "true",                                            $text: "account_circle"                                        },                                        {                                            $text: "My Avatar"                                        }]                                    },                                    {                                        $cell: true,                                        $type: "a",                                        class: "mdc-list-item",                                        $href: "#",                                        onclick: function (e) {                                            //self.currentNodeID = m.ID;                                            // document.querySelector('#clientsList')._setClientNodes(self.nodes["http://vwf.example.com/clients.vwf"]);                                            let sideBar = document.querySelector('#sideBar');                                            sideBar._sideBarComponent = viewSettings;                                            drawer.open = !drawer.open                                            document.querySelector('#sideBar').style.visibility = 'visible';                                        },                                        $components: [{                                            $type: "i",                                            class: "material-icons mdc-list-item__start-detail",                                            'aria-hidden': "true",                                            $text: "settings"                                        },                                        {                                            $text: "Settings"                                        }]                                    },                                    {                                        $cell: true,                                        $type: "a",                                        class: "mdc-list-item",                                        $href: "#",                                        onclick: function (e) {                                            //self.currentNodeID = m.ID;                                            // document.querySelector('#clientsList')._setClientNodes(self.nodes["http://vwf.example.com/clients.vwf"]);                                            let sideBar = document.querySelector('#sideBar');                                            sideBar._sideBarComponent = loadSaveSettings;                                            if (document.querySelector('#loadSaveSettings')) {                                                document.querySelector('#loadSaveSettings')._getStates();                                            }                                            //sideBar._sideBarComponent._getStates();                                            drawer.open = !drawer.open                                            document.querySelector('#sideBar').style.visibility = 'visible';                                        },                                        $components: [{                                            $type: "i",                                            class: "material-icons mdc-list-item__start-detail",                                            'aria-hidden': "true",                                            $text: "save"                                        },                                        {                                            $text: "Load/Save"                                        }]                                    }                                ]                            },                            widgets.divider,                            webrtcGUI,                            widgets.divider,                            widgets.headerH3("h3", "Users online", "userList mdc-list-group__subheader"),                            clientListCell                            //widgets.headerH3("h3", "WebRTC", "userList mdc-list-group__subheader"),                                                    ]                    }                    // {                    //     $cell: true,                    //     $type: "div",                    //     class: "mdc-persistent-drawer__toolbar-spacer",                    // },                    // {                    //     $cell: true,                    //     $type: "div",                    //     class: "mdc-list-group",                    //     $components: [{                    //         $cell: true,                    //         $type: "nav",                    //         class: "mdc-list",                    //         $components: [                    //         ]                    //     }]                    // }                ]            };            //             <div class="mdc-form-field">            //   <input type="checkbox" id="input">            //   <label for="input">Input Label</label>            // </div>            document.querySelector("#drawer").$cell({                $cell: true,                $type: "aside",                class: "mdc-temporary-drawer",                $components: [drawerCell]            }            );            let toolbar = {                $cell: true,                $type: "div",                class: "mdc-toolbar__row",                $components: [{                    $type: "section",                    class: "mdc-toolbar__section mdc-toolbar__section--align-start",                    $components: [                        {                            $type: "button",                            class: "demo-menu material-icons mdc-toolbar__menu-icon",                            $text: "menu"                        },                        {                            $type: "span",                            class: "mdc-toolbar__title catalog-title",                            $text: "LiveCoding.space"                        },                        {                            $type: "a",                            href: "#",                            class: "material-icons mdc-toolbar__icon toggleCreate",                            $text: "apps",                            'aria-label': "More"                        },                        {                            $type: "div",                            class: "mdc-menu-anchor",                            $components: [                                {                                    $type: "div",                                    class: "mdc-simple-menu",                                    "tabindex": "-1",                                    id: "create-menu",                                    $init: function(){                                    //var menuEl = document.querySelector('#demo-menu');                                    var menu = new mdc.menu.MDCSimpleMenu(this);                                    var toggle = document.querySelector('.toggleCreate');                                    toggle.addEventListener('click', function() {                                        menu.open = !menu.open;                                    });                                                                        },                                    style: "transform-origin: right top 0px; right: 0px; top: 0px; transform: scale(0, 0);",                                    $components: [                                       {                                         $type: "ul",                                        class: "mdc-simple-menu__items mdc-list",                                        role: "menu",                                        'aria-hidden': "true",                                        style: "transform: scale(1, 1);",                                        $components: [                                            {                                                $type: "li",                                                class: "mdc-list-item",                                                role: "menuitem",                                                tabindex: "0",                                                $text: "Apps"                                            }                                        ]                                    }                                    ]                                }                            ]                        },                        widgets.icontoggle({                            'styleClass': "mdc-toolbar__icon",                            'id': "selectNodeSwitch",                            'label': 'select',                            'on': JSON.stringify({"content": "radio_button_checked", "label": "Select"}),                            'off': JSON.stringify({"content": "radio_button_unchecked", "label": "Unselect"}),                            'state': false,                            'init': function(){                                                        this.addEventListener('MDCIconToggle:change', (e) => {                                                                        let avatarID = 'avatar-'+ vwf.moniker_;                                    let avatarNode = self.nodes['avatar-'+ vwf.moniker_];                                    let mode = JSON.parse(avatarNode.properties.selectMode.getValue());                                    if (mode) {                                        console.log("unselect");                                        vwf_view.kernel.setProperty(avatarID, "selectMode", false);                                    } else {                                        console.log("select")                                        vwf_view.kernel.setProperty(avatarID, "selectMode", true);                                    }                                  });                                                            }                        })                                           ]                },                {                    $type: "section",                    class: "mdc-toolbar__section mdc-toolbar__section--align-end",                    $components: [                        {                            $type: "a",                            href: "#",                            class: "material-icons mdc-toolbar__icon toggle",                            $text: "help",                            'aria-label': "Help"                        }                    ]                }            ]            };            document.querySelector("#toolbar").$cell({                $cell: true,                $type: "div",                class: "mdc-toolbar mdc-toolbar--fixed",                $components: [toolbar]            }            );            // let drawer = new mdc.drawer.MDCTemporaryDrawer(document.querySelector('.mdc-temporary-drawer'));            // document.querySelector('.menu').addEventListener('click', () => drawer.open = true);        var toggleNodes = document.querySelectorAll('.mdc-icon-toggle');        toggleNodes.forEach( el => {            mdc.iconToggle.MDCIconToggle.attachTo(el);        });            var drawerEl = document.querySelector('.mdc-temporary-drawer');            var MDCTemporaryDrawer = mdc.drawer.MDCTemporaryDrawer;            var drawer = new MDCTemporaryDrawer(drawerEl);            document.querySelector('.demo-menu').addEventListener('click', function () {                //self.currentNodeID = (self.currentNodeID == '') ? (vwf_view.kernel.find("", "/")[0]) : self.currentNodeID;                 // let currentNode = document.querySelector('#currentNode')._currentNode;                // currentNode == '' ? document.querySelector('#currentNode')._setNode(vwf_view.kernel.find("", "/")[0]) :                // document.querySelector('#currentNode')._setNode(currentNode);                //document.querySelector('#currentNode')._setNode(self.currentNodeID);                drawer.open = !drawer.open;            });            drawerEl.addEventListener('MDCTemporaryDrawer:open', function () {                //console.log('Received MDCPersistentDrawer:open');            });            drawerEl.addEventListener('MDCTemporaryDrawer:close', function () {                //console.log('Received MDCPersistentDrawer:close');            });            //==============        },        createdNode: function (nodeID, childID, childExtendsID, childImplementsIDs,            childSource, childType, childIndex, childName, callback /* ( ready ) */) {            var nodeIDAttribute = $.encoder.encodeForHTMLAttribute("id", nodeID, true);            var childIDAttribute = $.encoder.encodeForHTMLAttribute("id", childID, true);            var childIDAlpha = $.encoder.encodeForAlphaNumeric(childID);            var kernel = this.kernel;            var self = this;            var parent = this.nodes[nodeID];            var node = this.nodes[childID] = {                children: [],                properties: [],                events: {},                methods: {},                parent: parent,                parentID: nodeID,                ID: childID,                extendsID: childExtendsID,                implementsIDs: childImplementsIDs,                source: childSource,                name: childName,            };            if (parent) {                parent.children.push(node);            }            if (childID == vwf_view.kernel.find("", "/")[0] && childExtendsID && this.kernel.test(childExtendsID,                "self::element(*,'http://vwf.example.com/aframe/ascene.vwf')", childExtendsID)) {                this.scenes[childID] = node;            }            let nodeCell = document.querySelector("#currentNode");            if (nodeCell !== null) {                if (nodeCell._currentNode === nodeID) {                    nodeCell._getChildNodes();                }            }            if (nodeID === this.kernel.application()) {                // document.querySelector('a-scene').classList.add("mdc-toolbar-fixed-adjust");                document.querySelector('body').classList.add("editor-body");            }        },        createdProperty: function (nodeID, propertyName, propertyValue) {            return this.initializedProperty(nodeID, propertyName, propertyValue);        },        initializedProperty: function (nodeID, propertyName, propertyValue) {            var node = this.nodes[nodeID];            if (!node) return;  // TODO: patch until full-graph sync is working; drivers should be able to assume that nodeIDs refer to valid objects            var property = node.properties[propertyName] = createProperty.call(this, node, propertyName, propertyValue);            node.properties.push(property);        },        deletedNode: function (nodeID) {            var node = this.nodes[nodeID];            node.parent.children.splice(node.parent.children.indexOf(node), 1);            delete this.nodes[nodeID];            let nodeCell = document.querySelector("#currentNode");            if (nodeCell) {                if (nodeCell._currentNode !== "") {                    if (nodeCell._currentNode !== nodeID) {                        //&& (this.nodes[nodeID] !== undefined)                        nodeCell._getChildNodes();                    } else {                        nodeCell._setNode(vwf_view.kernel.find("", "/")[0]);                        nodeCell._getChildNodes();                    }                }            }        },        //addedChild: [ /* nodeID, childID, childName */ ],        //removedChild: [ /* nodeID, childID */ ],        satProperty: function (nodeID, propertyName, propertyValue) {            var node = this.nodes[nodeID];            if (!node) return;  // TODO: patch until full-graph sync is working; drivers should be able to assume that nodeIDs refer to valid objects            // It is possible for a property to have satProperty called for it without ever getting an            // initializedProperty (if that property delegated to itself or another on replication)            // Catch that case here and create the property            if (!node.properties[propertyName]) {                var property = node.properties[propertyName] = createProperty.call(this, node, propertyName, propertyValue);                node.properties.push(property);            }            try {                propertyValue = utility.transform(propertyValue, utility.transforms.transit);                node.properties[propertyName].value = JSON.stringify(propertyValue);                node.properties[propertyName].rawValue = propertyValue;            } catch (e) {                this.logger.warnx("satProperty", nodeID, propertyName, propertyValue,                    "stringify error:", e.message);                node.properties[propertyName].value = propertyValue;            }            let nodeCell = document.querySelector('#currentNode');            if (nodeCell !== null) {                if (nodeCell._currentNode == nodeID && propertyName == 'edit') {                    console.log('EDIT !!!')                }            }            let propCell = document.querySelector("#currentNode #prop-" + propertyName);            let propSlider = document.querySelector("#currentNode #prop-slider-" + propertyName);                        if (propCell !== null) {                if (propCell._currentNode == nodeID) {                    propCell.value = node.properties[propertyName].getValue();                }            }            if (propSlider !== null) {                if (propSlider._currentNode == nodeID) {                    //const propSliderComp = new new mdc.slider.MDCSlider(propSlider);                    propSlider._comp.value = node.properties[propertyName].getValue();                }            }        },        //gotProperty: [ /* nodeID, propertyName, propertyValue */ ],        gotProperty: function (nodeID, propertyName, propertyValue) {            var node = this.nodes[nodeID];            if (!node) return;  // TODO: patch until full-graph sync is working; drivers should be able to assume that nodeIDs refer to valid objects            let nodeCell = document.querySelector('#currentNode');            if (nodeCell !== null) {                if (nodeCell._currentNode == nodeID && propertyName == 'edit') {                    let editCheckBox = document.querySelector("#currentNode #editnode");                    if (editCheckBox) {                        if (propertyValue) {                            editCheckBox.setAttribute('checked', '');                        } else {                            let checkAttr = editCheckBox.getAttribute('checked');                            if (checkAttr) editCheckBox.removeAttribute('checked');                        }                    }                    console.log('EDIT !!! is ' + propertyValue)                }            }        },        createdMethod: function (nodeID, methodName, methodParameters, methodBody) {            var node = this.nodes[nodeID];            if (node) {                node.methods[methodName] = methodParameters;            }        },        //calledMethod: function( nodeID, methodName, methodParameters, methodValue ) {        //},        createdEvent: function (nodeID, eventName, eventParameters) {            var node = this.nodes[nodeID];            if (node) {                node.events[eventName] = eventParameters;            }        },        firedEvent: function (nodeID, eventName, eventParameters) {        },        executed: function (nodeID, scriptText, scriptType) {            // var nodeScript = {            //     text: scriptText,            //     type: scriptType,            // };            // if ( !this.allScripts[ nodeID ] ) {            //     var nodeScripts = new Array();            //     nodeScripts.push(nodeScript);            //     this.allScripts[ nodeID ] = nodeScripts;            // }            // else {            //     this.allScripts[ nodeID ].push(nodeScript);            // }        },        //ticked: [ /* time */ ],    });    function createCellWindow(elementID, cellNode, title) {        document.querySelector('#' + elementID).$cell({            $cell: true,            $type: "div",            id: elementID,            class: 'draggable',            $init: function () {                // let draggie = new Draggabilly('.draggable', {                //     handle: '.handle',                //     containment: true                //   });                // get all draggie elements                var draggableElems = document.querySelectorAll('.draggable');                // array of Draggabillies                var draggies = []                // init Draggabillies                for (var i = 0, len = draggableElems.length; i < len; i++) {                    var draggableElem = draggableElems[i];                    var draggie = new Draggabilly(draggableElem, {                        handle: '.handle',                        containment: true                    });                    draggies.push(draggie);                }                this.style.visibility = 'hidden';            },            $components: [                {                    $cell: true,                    $type: "div",                    class: "handle"                },                                          {                            $cell: true,                            $type: "button",                            class: "mdc-button mdc-button--compact",                            $text: "X",                            onclick: function (e) {                                //self.currentNodeID = m.ID;                                document.querySelector('#' + elementID).style.visibility = 'hidden';                            }                        },                        {                            $cell: true,                            $type: "span",                            class: "mdc-typography--button",                            $text: title                        },                                                    cellNode,                {                    $cell: true,                    $type: "div",                    class: "handle",                    style: "height: 10px; width: inherit;",                    //$text: "sdfsdf"                }                // { $text: "23423"}            ]        }        );    }    // -- getChildByName --------------------------------------------------------------------    function getChildByName(node, childName) {        var childNode = undefined;        for (var i = 0; i < node.children.length && childNode === undefined; i++) {            if (node.children[i].name == childName) {                childNode = node.children[i];            }        }        return childNode;    };    // -- viewScript ------------------------------------------------------------------------    function createAceEditor(view, nodeID, elID) {        var editor = view.ace.edit(elID);        editor.setTheme("ace/theme/monokai");        editor.setFontSize(16);        editor.getSession().setMode("ace/mode/javascript");        editor.commands.addCommand({            name: "doit",            bindKey: { win: "Ctrl-e", mac: "Command-e" },            exec: function () {                codeEditorDoit(editor, nodeID);            }        });        editor.commands.addCommand({            name: "printit",            bindKey: { win: "Ctrl-b", mac: "Command-b" },            exec: function () {                codeEditorPrintit(editor, nodeID);            }        });        return editor;    }    function getPrototypes(kernel, extendsID) {        var prototypes = [];        var id = extendsID;        while (id !== undefined) {            prototypes.push(id);            id = kernel.prototype(id);        }        return prototypes;    }    function getPrototypes(kernel, extendsID) {        var prototypes = [];        var id = extendsID;        while (id !== undefined) {            prototypes.push(id);            id = kernel.prototype(id);        }        return prototypes;    }    function createProperty(node, propertyName, propertyValue) {        var property = {            name: propertyName,            rawValue: propertyValue,            value: undefined,            getValue: function () {                var propertyValue;                if (this.value == undefined) {                    try {                        propertyValue = utility.transform(this.rawValue, utility.transforms.transit);                        this.value = JSON.stringify(propertyValue);                    } catch (e) {                        this.logger.warnx("createdProperty", nodeID, this.propertyName, this.rawValue,                            "stringify error:", e.message);                        this.value = this.rawValue;                    }                }                return this.value;            }        };        return property;    }    function getProperties(kernel, extendsID) {        var pTypes = getPrototypes(kernel, extendsID);        var pProperties = {};        if (pTypes) {            for (var i = 0; i < pTypes.length; i++) {                var nd = this.nodes[pTypes[i]];                if (nd && nd.properties) {                    for (var key in nd.properties) {                        pProperties[key] = { "prop": nd.properties[key], "prototype": pTypes[i] };                    }                }            }        }        return pProperties;    }    function getChildren(kernel, extendsID) {        var pTypes = getPrototypes(kernel, extendsID);        var pChildren = {};        if (pTypes) {            for (var i = 0; i < pTypes.length; i++) {                var nd = this.nodes[pTypes[i]];                if (nd && nd.children) {                    for (var key in nd.children) {                        pChildren[key] = nd.children[key];                    }                }            }        }        return pChildren;    }    function getEvents(kernel, extendsID) {        var pTypes = getPrototypes(kernel, extendsID);        var events = {};        if (pTypes) {            for (var i = 0; i < pTypes.length; i++) {                var nd = this.nodes[pTypes[i]];                if (nd && nd.events) {                    for (var key in nd.events) {                        events[key] = nd.events[key];                    }                }            }        }        return events;    }    function getMethods(kernel, extendsID) {        var pTypes = getPrototypes(kernel, extendsID);        var methods = {};        if (pTypes) {            for (var i = 0; i < pTypes.length; i++) {                var nd = this.nodes[pTypes[i]];                if (nd && nd.methods) {                    for (var key in nd.methods) {                        methods[key] = nd.methods[key];                    }                }            }        }        return methods;    }    // -- Show Code Editor tab    function codeEditorDoit(editor, nodeID) {        var selectedText = editor.getSession().doc.getTextRange(editor.selection.getRange());        if (selectedText == "") {            var currline = editor.getSelectionRange().start.row;            var selectedText = editor.session.getLine(currline);        }        //console.log(selectedText);        //var sceneID = self.kernel.application();        vwf_view.kernel.execute(nodeID, selectedText);    }    function codeEditorPrintit(editor, nodeID) {        var selectedText = editor.getSession().doc.getTextRange(editor.selection.getRange());        if (selectedText == "") {            var currline = editor.getSelectionRange().start.row;            var selectedText = editor.session.getLine(currline);        }        //console.log(selectedText);        //var sceneID = self.kernel.application();        let scriptText = 'console.log(' + selectedText + ');'        self.kernel.execute(nodeID, scriptText);    }    function saveStateAsFile(filename) // invoke with the view as "this"    {        this.logger.info("Saving: " + filename);        var clients = this.nodes["http://vwf.example.com/clients.vwf"];        if (supportAjaxUploadWithProgress.call(this)) {            var xhr = new XMLHttpRequest();            // Save State Information            var state = vwf.getState();            state.nodes[0].children = {};            var timestamp = state["queue"].time;            timestamp = Math.round(timestamp * 1000);            var objectIsTypedArray = function (candidate) {                var typedArrayTypes = [                    Int8Array,                    Uint8Array,                    // Uint8ClampedArray,                    Int16Array,                    Uint16Array,                    Int32Array,                    Uint32Array,                    Float32Array,                    Float64Array                ];                var isTypedArray = false;                if (typeof candidate == "object" && candidate != null) {                    typedArrayTypes.forEach(function (typedArrayType) {                        isTypedArray = isTypedArray || candidate instanceof typedArrayType;                    });                }                return isTypedArray;            };            var transitTransformation = function (object) {                return objectIsTypedArray(object) ?                    Array.prototype.slice.call(object) : object;            };            var json = JSON.stringify(                require("vwf/utility").transform(                    state, transitTransformation                )            );            json = $.encoder.encodeForURL(json);            var path = window.location.pathname;            var pathSplit = path.split('/');            if (pathSplit[0] == "") {                pathSplit.shift();            }            if (pathSplit[pathSplit.length - 1] == "") {                pathSplit.pop();            }            var inst = undefined;            var instIndex = pathSplit.length - 1;            if (pathSplit.length > 2) {                if (pathSplit[pathSplit.length - 2] == "load") {                    instIndex = pathSplit.length - 3;                }            }            if (pathSplit.length > 3) {                if (pathSplit[pathSplit.length - 3] == "load") {                    instIndex = pathSplit.length - 4;                }            }            inst = pathSplit[instIndex];            var root = "";            for (var i = 0; i < instIndex; i++) {                if (root != "") {                    root = root + "/";                }                root = root + pathSplit[i];            }            if (filename == '') filename = inst;            if (root.indexOf('.vwf') != -1) root = root.substring(0, root.lastIndexOf('/'));            xhr.open("POST", "/" + root + "/save/" + filename, true);            xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");            xhr.send("root=" + root + "/" + filename + "&filename=saveState&inst=" + inst + "×tamp=" + timestamp + "&extension=.vwf.json" + "&jsonState=" + json);            // Save Config Information            var config = { "info": {}, "model": {}, "view": {} };            // Save browser title            config["info"]["title"] = document.title//$('title').html();            // Save model drivers            Object.keys(vwf_view.kernel.kernel.models).forEach(function (modelDriver) {                if (modelDriver.indexOf('vwf/model/') != -1) config["model"][modelDriver] = "";            });            // If neither glge or threejs model drivers are defined, specify nodriver            if (config["model"]["vwf/model/glge"] === undefined && config["model"]["vwf/model/threejs"] === undefined) config["model"]["nodriver"] = "";            // Save view drivers and associated parameters, if any            Object.keys(vwf_view.kernel.kernel.views).forEach(function (viewDriver) {                if (viewDriver.indexOf('vwf/view/') != -1) {                    if (vwf_view.kernel.kernel.views[viewDriver].parameters) {                        config["view"][viewDriver] = vwf_view.kernel.kernel.views[viewDriver].parameters;                    }                    else config["view"][viewDriver] = "";                }            });            var jsonConfig = $.encoder.encodeForURL(JSON.stringify(config));            // Save config file to server            var xhrConfig = new XMLHttpRequest();            xhrConfig.open("POST", "/" + root + "/save/" + filename, true);            xhrConfig.setRequestHeader("Content-type", "application/x-www-form-urlencoded");            xhrConfig.send("root=" + root + "/" + filename + "&filename=saveState&inst=" + inst + "×tamp=" + timestamp + "&extension=.vwf.config.json" + "&jsonState=" + jsonConfig);        }        else {            console.error("Unable to save state.");        }    }    // -- LoadSavedState --------------------------------------------------------------------------    function loadSavedState(filename, applicationpath, revision) {        this.logger.info("Loading: " + filename);        // Redirect until setState ID conflict is resolved        var path = window.location.pathname;        var inst = path.substring(path.length - 17, path.length - 1);        var pathSplit = path.split('/');        if (pathSplit[0] == "") {            pathSplit.shift();        }        if (pathSplit[pathSplit.length - 1] == "") {            pathSplit.pop();        }        var inst = undefined;        var instIndex = pathSplit.length - 1;        if (pathSplit.length > 2) {            if (pathSplit[pathSplit.length - 2] == "load") {                instIndex = pathSplit.length - 3;            }        }        if (pathSplit.length > 3) {            if (pathSplit[pathSplit.length - 3] == "load") {                instIndex = pathSplit.length - 4;            }        }        inst = pathSplit[instIndex];        if (revision) {            window.location.pathname = applicationpath + "/" + inst + '/load/' + filename + '/' + revision + '/';        }        else {            window.location.pathname = applicationpath + "/" + inst + '/load/' + filename + '/';        }        // $.get(filename,function(data,status){        //     vwf.setState(data);        // });    }    // -- SupportAjax -----------------------------------------------------------------------------    function supportAjaxUploadWithProgress() {        return supportAjaxUploadProgressEvents();        function supportAjaxUploadProgressEvents() {            var xhr = new XMLHttpRequest();            return !!(xhr && ('upload' in xhr) && ('onprogress' in xhr.upload));        }    }});
 |