const ADD = 'add'; const BODY = 'body'; const CU = 'cu'; const DIV = 'DIV'; const MOVE = 'move'; const OPAC = 100; const PLAN = '#plan'; const POST = 'POST'; const PROPS = 'props'; const SQUARE = 30; const SVG = 'svg'; var selected = null; var mode = null; var messageTimer = null; var messageOpacity = 0; var trainAwaitingDestination = null; function addClass(data){ parts = data.split(" "); $('#'+parts[0]).addClass(parts[1]); } function addMessage(txt){ $('#messages').html(txt); if (messageTimer != null) window.clearInterval(messageTimer); messageOpacity = 3000; messageTimer = setInterval(fadeMessage,100); } function addTile(x,y){ return request({realm:'plan',action:mode,tile:selected.id,x:x,y:y}); } function clickTile(x,y){ var id = x+"-"+y; var tiles = $('#'+id); if (tiles.length > 0) { if (trainAwaitingDestination != null && tiles.hasClass("Block")) { request({realm:'train',id:trainAwaitingDestination,action:MOVE,destination:id}); trainAwaitingDestination = null; $(PLAN).css('cursor',''); return false; } request({realm:'plan',action:'click',id:id}); } return false; } function closeMenu(ev){ if (selected != null) $(selected).css('border',''); $('.menu .list').css('display','') mode = null; selected = null; return false; } function closeWindows(){ $('.window').remove(); $('#plan').css('height','').css('width',''); } function connectCu(){ return request({realm:CU,action:"connect"}); } function dropClass(data){ var parts = data.split(" "); for (var i=1; iOPAC) o=OPAC; $('#messages').css('opacity',o/OPAC); } function getCookie(key) { var keyValue = document.cookie.match('(^|;) ?' + key + '=([^;]*)(;|$)'); return keyValue ? keyValue[2] : null; } function heartbeat(data){ $('#heartbeat').show().fadeOut(2000); return false; } function keypress(ev){ if (ev.code === 'Enter') request({realm:"cu",action:"emergency"}); } function moveTile(x,y){ var id = x+"-"+y; return request({realm:'plan',action:mode,direction:selected.id,id:id}); } function place(data){ var tag = $(data); $('#'+tag.attr('id')).remove(); $('#scroll').append(tag); return false; } function planClick(ev){ //console.log('planClick:',ev); var plan=$('#scroll').get(0); var x = Math.floor((plan.scrollLeft+ev.clientX)/SQUARE); var y = Math.floor((plan.scrollTop+ev.clientY)/SQUARE); switch (mode){ case undefined: case null: return clickTile(x,y); case ADD: return addTile(x,y); case MOVE: return moveTile(x,y); } console.log('unknown action "'+mode+'" @ ('+ev.clientX+','+ev.clientY+')'); } function remove(id){ $('#'+id).remove(); return false; } function request(data){ $.ajax({ url : 'plan', method : POST, data : data, success: function(resp){ if (data.realm != 'car' && data.realm != 'loco') closeWindows(); if (resp.startsWith(' div').click(closeMenu); $('.menu .addtile .list svg').click(enableAdding); $('.menu .move .list div').click(enableMove); $('.menu .actions .list > div').click(runAction); $('.menu .trains .list > div').click(runAction); $('.menu .hardware .list > div').click(runAction); $(PLAN).click(planClick); $(document).keyup(keypress); (new EventSource("stream")).onmessage = stream; $('#plan').click(function(){ document.documentElement.requestFullscreen(); }); }