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'; const MSG_TIME = 5000; var selected = null; var mode = null; var messageTimer = null; var messageOpacity = 0; var pendingAssignment = null; var clickHistory = []; var messages = []; var android = false; function addBlockDirections(){ $('.BlockH').each(function (){ let block = $(this); let width = block.attr('viewBox').split(" ")[2]; block.append(''); block.append(''); block.html(block.html()); }); $('.BlockV').each(function (){ let block = $(this); let height = block.attr('viewBox').split(" ")[3]; block.append(''); block.append(''); block.html(block.html()); }); } function addClass(data){ parts = data.split(" "); $('#'+parts[0]).addClass(parts[1]); } function addMessage(txt){ let delay = MSG_TIME; if (txt.includes('⌛')){ let parts = txt.split('⌛'); delay = parseInt(parts[0]); txt = parts[1]; } let mid = 'm'+Date.now(); $('#messages').append($('
').attr('id',mid).html(txt)); setTimeout(function(){ $('#'+mid).remove(); },delay); if (delay != MSG_TIME) countDown(mid,delay/1000,txt); } function addTile(x,y){ return request({realm:'plan',action:mode,tile:selected.id,x:x,y:y}); } function arrangeTabs(){ var id = 0; var tabs = $('
',{'class':'tabs'}); var winId = $('.window').attr('id')+"-"; tabs.insertAfter($('.error')); var target = null; var index = null; $('.window > fieldset > legend').each(function(){ var fs = this.parentNode; if (!fs.id) fs.id = winId+id; var i = clickHistory.indexOf(fs.id); if (i>-1 && (index == null || i 0) { $(fs).hide(); } else $(this).addClass('front'); id++; }); if (index != null) clickLegend({'data':clickHistory[index],'target':target,'no-update':true}); } function assign(context){ pendingAssignment = context; closeWindows(); $(PLAN).css('cursor','help'); if (context.assign == 'destination') addBlockDirections(); return false; } function changeSpeed(inputId){ let parts = inputId.split('_'); let val = $('#'+inputId).val(); let data = { realm : parts[0], id : parts[1], action : "setSpeed", speed : val}; let caption = $('#'+inputId+'_caption'); caption.text(caption.text().replace(/\d+/,val)); request(data); } function clickLegend(ev){ lastTab = ev.data; $('.window > .tabs > legend').removeClass('front'); $(ev.target).addClass('front'); $('.window > fieldset').hide(); $('#'+lastTab).show(); if (!android) $('#'+lastTab+" input:not([type=hidden])").first().focus().select(); if (!('no-update' in ev)) remember(lastTab); } function clickTile(x,y,shift){ console.log("clickTile("+x+","+y+")"); var id = x+"-"+y; var tiles = $('#'+id); if (tiles.length > 0) { if (pendingAssignment != null) { var key = pendingAssignment.assign; delete pendingAssignment.assign; pendingAssignment[key] = id; request(pendingAssignment); pendingAssignment = null; $(PLAN).css('cursor',''); $('.direction').remove(); return false; } var json = {realm:'plan',action:'click',id:id}; if (shift) json.shift=1; request(json); } 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(); $('.preview').removeClass('preview'); $('#plan').css('height','').css('width',''); } function connectCu(){ return request({realm:CU,action:"connect"}); } function copyCv(ev){ var td = ev.parentNode.previousSibling; $('input[name=cv]').val(td.previousSibling.innerText); $('input[name=val]').val(td.innerText); } function countDown(mid,time,msg){ time = parseInt(time); $('#'+mid).html(msg.replace('%secs%',time)); time = time -1; if (time>0) setTimeout(function(){ countDown(mid,time,msg); },1000); } function dropClass(data){ var parts = data.split(" "); for (var i=1; i -1) clickHistory.splice(index, 1); clickHistory.unshift(lastClickedId); } function remove(id){ $('#'+id).remove(); return false; } function request(data){ //console.log("request:",data); $.ajax({ url : 'plan', method : POST, data : data, success: function(resp){ var win = $('.window'); var scroll = win.scrollTop(); var winId = win.attr('id'); if (data.realm != 'car' && data.realm != 'loco') closeWindows(); if (resp.startsWith('0) { messageOpacity = 1000; $('#messages').html(messages.slice().reverse().join('
')).css('opacity',messageOpacity/OPAC); } else $('#messages').html(''); } window.onload = function () { android = navigator.userAgent.toLowerCase().includes('android') $('.menu > 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; }