var _ws = null; var _dfltParentId = "uiDivId"; function set_app_title( suffix, className ) { var ele = document.getElementById('appTitleId'); ele.innerHTML = "UI Test:" + suffix ele.className = className } function uiOnError( msg, r) { console.log("Error:" + msg); } function uiGetParent( r ) { parent_ele = document.getElementById(r.parent_id); if( parent_ele == null ) { uiOnError("Parent not found. parent_id:" + r.parent_id,r); } return parent_ele; } function uiCreateEle( r ) { var parent_ele; if((parent_ele = uiGetParent(r)) != null ) { ele = document.createElement(r.ele_type) ele.id = r.ele_id; ele.className = r.value; parent_ele.appendChild(ele) } } function uiRemoveChildren( r ) { ele = document.getElementById(r.ele_id) while (ele.firstChild) { ele.removeChild(ele.firstChild); } } function uiDivCreate( r ) { uiCreateEle(r) } function uiLabelCreate( r ) { var parent_ele; if((parent_ele = uiGetParent(r)) != null ) { ele = document.createElement("label") ele.htmlFor = r.ele_id ele.innerHTML = r.value; parent_ele.appendChild(ele) } } function uiSelectCreate( r ) { uiCreateEle(r) } function uiSelectClear( r ) { uiRemoveChildren(r) } function uiSelectInsert( r ) { var select_ele; if((select_ele = uiGetParent(r)) != null ) { var option = document.createElement('option'); option.id = r.ele_id; option.innerHTML = r.value; option.value = r.ele_id; option.onclick = function() { uiOnSelectClick(this) } select_ele.appendChild(option) } } function uiSelectChoose( r ) { var select_ele; if((select_ele = uiGetParent(r)) != null ) { if( select_ele.hasChildNodes()) { var children = select_ele.childNodes for(var i=0; i 0 ) p_ele.innerHTML = d.title div_ele.appendChild( p_ele ) } return div_ele } function ui_create_title( parent_ele, d ) { return ui_create_ele( parent_ele, "label", d ); } function ui_create_button( parent_ele, d ) { var ele = ui_create_ctl( parent_ele, "button", null, d ); if( ele != null ) { ele.innerHTML = d.title; ele.onclick = function() { _ws.send("value " + this.uuId + " i : 1"); } } return ele } function ui_create_check( parent_ele, d ) { var ele = ui_create_ctl( parent_ele, "input", d.title, d ) if( ele != null ) { ele.type = "checkbox"; dom_set_checkbox(ele.id, d.value ); ele.onclick = function() { _ws.send("value" + this.uuId + " b : " + dom_get_checkbox(this.id)); } } } function ui_on_select( ele ) { var s = "value " + ele.uuId + " i : " + ele.options[ ele.selectedIndex ].appId _ws.send( s ); } function ui_create_select( parent_ele, d ) { var sel_ele = ui_create_ctl( parent_ele, "select", d.title, d ); sel_ele.onchange = function() { ui_on_select(this) } return sel_ele; } function ui_create_option( parent_ele, d ) { var opt_ele = ui_create_ele( parent_ele, "option", d ); if( opt_ele != null ) { opt_ele.className = d.clas; opt_ele.innerHTML = d.title; } return opt_ele; } function ui_create_string( parent_ele, d ) { var ele = ui_create_ctl( parent_ele, "input", d.title, d ); if( ele != null ) { ele.value = d.value; ele.addEventListener('keyup', function(e) { if(e.keyCode===13){ _ws.send("value" + this.uuId + " s : " + this.value + "\0");} } ); } } function ui_number_keyup( e ) { console.log(e) if( e.keyCode===13 ) { var ele = dom_id_to_ele(e.target.id) console.log(ele.value) if( ele != null ) _ws.send("value" + ele.uuId + " i : " + ele.value); } } function ui_create_number( parent_ele, d ) { var ele = ui_create_ctl( parent_ele, "input", d.title, d ); if( ele != null ) { ele.value = d.value; ele.maxValue = d.max; ele.minValue = d.min; ele.stepValue = d.step; ele.decpl = d.decpl; ele.addEventListener('keyup', ui_number_keyup ); } } function ui_set_progress( ele_id, value ) { var ele = dom_id_to_ele(ele_id); ele.value = Math.round( ele.max * (value - ele.minValue) / (ele.maxValue - ele.minValue)); } function ui_create_progress( parent_ele, d ) { var ele = ui_create_ctl( parent_ele, "progress", d.title, d ); if( ele != null ) { ele.max = 100; ele.maxValue = d.max; ele.minValue = d.min; ui_set_progress( ele.id, d.value ); } } function ui_create( parentId, ele_type, d ) { var parent_ele = ui_get_parent(parentId); if( parent_ele != null ) { switch( ele_type ) { case "div": ui_create_div( parent_ele, d ) break; case "title": ui_create_title( parent_ele, d ) break; case "button": ui_create_button( parent_ele, d ) break; case "check": ui_create_check( parent_ele, d ) break; case "select": ui_create_select( parent_ele, d ); break; case "option": ui_create_option( parent_ele, d ); break; case "string": ui_create_string( parent_ele, d ); break; case "number": ui_create_number( parent_ele, d ); break; case "progress": ui_create_progress( parent_ele, d ); break; default: ui_error("Unknown UI element type: " + ele_type ) } } } function ws_send( d ) { s = JSON.stringify(d) //console.log(s) _ws.send(s) } function ws_on_msg( jsonMsg ) { //console.log(jsonMsg) d = JSON.parse(jsonMsg.data); switch( d.op ) { case 'create': for (const ele_type in d.children) { ui_create( d.parent, ele_type, d.value[ele_type] ) //console.log(`${ele_type}: ${d.value[ele_type]}`); } break; } } function ws_on_open() { set_app_title( "Connected", "title_connected" ); _ws.send("init") } function ws_on_close() { set_app_title( "Disconnected", "title_disconnected" ); } function main() { _ws = new WebSocket("ws://127.0.0.1:5687/","ui_protocol") _ws.onmessage = ws_on_msg _ws.onopen = ws_on_open _ws.onclose = ws_on_close; }