diff --git a/static/css/.base.min.css b/static/css/.base.min.css index 7347b4b..38718d5 100644 --- a/static/css/.base.min.css +++ b/static/css/.base.min.css @@ -1 +1 @@ -.container,.container:after,.container:before,.fa,div,footer{box-sizing:border-box}body,input,textarea{padding:0;margin:0;font-family:'Open Sans',sans-serif;font-size:18px;color:#eee}body{background-color:#080808}::-webkit-scrollbar{width:5vw;min-width:10px;max-width:40px}::-webkit-scrollbar-track{background-color:#080808;background-color:rgba(8,8,8,0)}::-webkit-scrollbar-thumb{border-radius:.2vw;background:#333}::selection{background:#999}::-moz-selection{background:#999}main{top:59px;position:absolute;left:0;right:0;bottom:0;overflow-y:auto}.container{padding-right:5%;padding-left:5%;width:100%;margin:0 auto}.container:after{content:"";display:block;clear:both}section{padding:10vh 0 5vh}h1,h2,h3{margin:0 0 5% 0;position:relative;z-index:6}h1,h2,h3,h4{font-weight:600}h1{font-size:48px;line-height:46px}h2{font-size:40px;line-height:36px}h3{font-size:28px}h4{font-size:20px}main ul,p{margin-top:0;margin-bottom:5vh}hr{width:90%;margin:10% auto}img{max-width:100%}p img{display:block;margin:auto}pre{white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word}a{color:#fbc93d;text-decoration:none}main a:hover:not(.btn){color:#fbc93d;text-decoration:underline}a.underline{text-decoration:underline}a.underline:hover:not(.btn){text-decoration:none}.hide{display:none!important}.red,.red:hover{color:#fb6e3d!important}.yellow,.yellow:hover{color:#fbc93d!important}.green,.green:hover{color:#8ae137!important}.inline{display:inline}.inline-block{display:inline-block}.shadow{-moz-box-shadow:.18vw .18vw .36vw #000;-webkit-box-shadow:.18vw .18vw .36vw #000;box-shadow:.18vw .18vw .36vw #000}.shadow:active{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none}.inline{display:inline-block}.flex{width:100%;display:flex;justify-content:space-around}.flex.stretch{justify-content:space-between}.left{float:left}.right{float:right}.btn{font-weight:600;display:inline-block;padding:15px 30px;background:rgba(255,255,255,.1);color:#eee;border-radius:.5vw}.btn:not(:disabled){border:1px solid #666;transition:.1s;cursor:pointer;-moz-box-shadow:inset .11vw .18vw .52vw rgba(255,255,255,.2),inset -.11vw -.18vw .52vw rgba(0,0,0,.4),.1vw .1vw .52vw #000;-webkit-box-shadow:inset .11vw .18vw .52vw rgba(255,255,255,.2),inset -.11vw -.18vw .52vw rgba(0,0,0,.4),.1vw .1vw .36vw #000;box-shadow:inset .11vw .18vw .52vw rgba(255,255,255,.2),inset -.11vw -.18vw .52vw rgba(0,0,0,.4),.1vw .1vw .36vw #000}.btn:disabled{color:#aaa;border:1px solid #444}.btn:hover:not(:disabled){text-decoration:none;background:rgba(255,255,255,.2)}.btn:active:not(:disabled){-moz-box-shadow:inset .11vw .18vw .52vw rgba(0,0,0,.4),inset -.11vw -.18vw .52vw rgba(255,255,255,.2);-webkit-box-shadow:inset .11vw .18vw .52vw rgba(0,0,0,.4),inset -.11vw -.18vw .52vw rgba(255,255,255,.2);box-shadow:inset .11vw .18vw .52vw rgba(0,0,0,.4),inset -.11vw -.18vw .52vw rgba(255,255,255,.2)}.btn:focus:not(:disabled){border:1px solid #fbc93d}.btn.main:not(:disabled){color:#fbc93d}.btn .fa{margin-left:10px}.popup{background:#111;padding:4vh 4vw;border-radius:3vh;z-index:1000;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);-moz-box-shadow:.5vh .4vh 1vh .1vh #000;-webkit-box-shadow:.5vh .4vh 1vh .1vh #000;box-shadow:.5vh .4vh 1vh .1vh #000}.popup .topbar,.popup p{margin:0 0 6vh 0}.popup .topbar{display:flex;justify-content:space-between;margin:0 0 3vh 0}.popup p{margin:0 0 3vh 0}.popup .close{cursor:pointer}.popup .buttons{display:flex;justify-content:space-around}.page-mask{z-index:950;background:rgba(0,0,0,.5);position:fixed;top:0;right:0;bottom:0;left:0} \ No newline at end of file +.container,.container:after,.container:before,.fa,div,footer{box-sizing:border-box}body,input,textarea{padding:0;margin:0;font-family:'Open Sans',sans-serif;font-size:18px;color:#eee}body{background-color:#080808}::-webkit-scrollbar{width:5vw;min-width:10px;max-width:40px}::-webkit-scrollbar-track{background-color:#080808;background-color:rgba(8,8,8,0)}::-webkit-scrollbar-thumb{border-radius:.2vw;background:#333}::selection{background:#999}::-moz-selection{background:#999}main{top:59px;position:absolute;left:0;right:0;bottom:0;overflow-y:auto}.container{padding-right:5%;padding-left:5%;width:100%;margin:0 auto}.container:after{content:"";display:block;clear:both}section{padding:10vh 0 5vh}h1,h2,h3{margin:0 0 5% 0;position:relative;z-index:6}h1,h2,h3,h4{font-weight:600}h1{font-size:48px;line-height:46px}h2{font-size:40px;line-height:36px}h3{font-size:28px}h4{font-size:20px}main ul,p{margin-top:0;margin-bottom:5vh}hr{width:90%;margin:10% auto}img{max-width:100%}p img{display:block;margin:auto}pre{white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word}a{color:#fbc93d;text-decoration:none}main a:hover:not(.btn){color:#fbc93d;text-decoration:underline}a.underline{text-decoration:underline}a.underline:hover:not(.btn){text-decoration:none}.hide{display:none!important}.red,.red:hover{color:#fb6e3d!important}.yellow,.yellow:hover{color:#fbc93d!important}.green,.green:hover{color:#8ae137!important}.inline{display:inline}.inline-block{display:inline-block}.shadow{-moz-box-shadow:.18vw .18vw .36vw #000;-webkit-box-shadow:.18vw .18vw .36vw #000;box-shadow:.18vw .18vw .36vw #000}.shadow:active{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none}.inline{display:inline-block}.flex{width:100%;display:flex;justify-content:space-around}.flex.stretch{justify-content:space-between}.left{float:left}.right{float:right}.btn{font-weight:600;display:inline-block;padding:15px 30px;background:rgba(255,255,255,.1);color:#eee;border-radius:.5vw}.btn:not(:disabled){border:1px solid #666;transition:.1s;cursor:pointer;-moz-box-shadow:inset .11vw .18vw .52vw rgba(255,255,255,.2),inset -.11vw -.18vw .52vw rgba(0,0,0,.4),.1vw .1vw .52vw #000;-webkit-box-shadow:inset .11vw .18vw .52vw rgba(255,255,255,.2),inset -.11vw -.18vw .52vw rgba(0,0,0,.4),.1vw .1vw .36vw #000;box-shadow:inset .11vw .18vw .52vw rgba(255,255,255,.2),inset -.11vw -.18vw .52vw rgba(0,0,0,.4),.1vw .1vw .36vw #000}.btn:disabled{color:#aaa;border:1px solid #444}.btn:hover:not(:disabled){text-decoration:none;background:rgba(255,255,255,.2)}.btn:active:not(:disabled){-moz-box-shadow:inset .11vw .18vw .52vw rgba(0,0,0,.4),inset -.11vw -.18vw .52vw rgba(255,255,255,.2);-webkit-box-shadow:inset .11vw .18vw .52vw rgba(0,0,0,.4),inset -.11vw -.18vw .52vw rgba(255,255,255,.2);box-shadow:inset .11vw .18vw .52vw rgba(0,0,0,.4),inset -.11vw -.18vw .52vw rgba(255,255,255,.2)}.btn:focus:not(:disabled){border:1px solid #fbc93d}.btn.main:not(:disabled){color:#fbc93d}.btn .fa{margin-left:10px}.popup{background:#111;padding:4vh 4vw;border-radius:3vh;z-index:1000;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);-moz-box-shadow:.5vh .4vh 1vh .1vh #000;-webkit-box-shadow:.5vh .4vh 1vh .1vh #000;box-shadow:.5vh .4vh 1vh .1vh #000}.popup .topbar,.popup p{margin:0 0 6vh 0}.popup .topbar{display:flex;justify-content:space-between;margin:0 0 3vh 0}.popup p{margin:0 0 3vh 0}.popup .close{cursor:pointer}.popup .buttons{display:flex;justify-content:space-around}.page-mask{display:none;z-index:950;background:rgba(0,0,0,.5);position:fixed;top:0;right:0;bottom:0;left:0} \ No newline at end of file diff --git a/static/css/base.css b/static/css/base.css index 9beeee8..d22a249 100755 --- a/static/css/base.css +++ b/static/css/base.css @@ -221,6 +221,7 @@ a.underline:hover:not(.btn) { justify-content: space-around; } .page-mask { + display: none; z-index: 950; background: rgba(0, 0, 0, 0.5); position: fixed; diff --git a/static/js/.map.min.js b/static/js/.map.min.js index 89c9127..e1248d7 100644 --- a/static/js/.map.min.js +++ b/static/js/.map.min.js @@ -1 +1 @@ -"use strict";let map,marker,elevator,newLoc;const mapElem=document.getElementById("map"),socket=io("//"+window.location.hostname),IDLE_TIMEOUT=300;let _idleSecondsCounter=0;function resetIdleSecondsCounter(){_idleSecondsCounter=0}function metersToFeet(e){return"standard"===mapuser.settings.units?(3.28084*e).toFixed():e.toFixed()}function toggleMaps(e){0===e.lat&&0===e.lon?($("#map").hide(),$("#view").hide(),$("#notset").show()):($("#map").show(),$("#view").show(),$("#notset").hide())}function initMap(){if("1"!==disp){if(map=new google.maps.Map(mapElem,{center:{lat:mapuser.last.lat,lng:mapuser.last.lon},panControl:!1,scrollwheel:!0,scaleControl:!!mapuser.settings.showScale,draggable:!1,zoom:mapuser.settings.defaultZoom,streetViewControl:!1,zoomControlOptions:{position:google.maps.ControlPosition.LEFT_TOP},mapTypeId:"road"===mapuser.settings.defaultMap?google.maps.MapTypeId.ROADMAP:google.maps.MapTypeId.HYBRID}),marker=new google.maps.Marker({position:{lat:mapuser.last.lat,lng:mapuser.last.lon},title:mapuser.name,icon:mapuser.settings.marker?"/static/img/marker/"+mapuser.settings.marker+".png":"/static/img/marker/red.png",map:map,draggable:!1}),map.addListener("zoom_changed",function(){map.setCenter(marker.getPosition())}),"0"!==noHeader&&"demo"!==mapuser._id){const e=document.createElement("div");e.id="map-logo",e.innerHTML='[]Tracman',map.controls[google.maps.ControlPosition.BOTTOM_LEFT].push(e)}const t=document.createElement("div");if(t.id="timestamp",mapuser.last.time&&(t.innerHTML="location updated "+new Date(mapuser.last.time).toLocaleString()),map.controls[google.maps.ControlPosition.RIGHT_BOTTOM].push(t),mapuser.settings.showSpeed){const e=document.createElement("div"),t=document.createElement("div"),o=document.createElement("div"),n=document.createElement("div");t.id="spd-label",t.innerHTML="SPEED",o.id="spd",o.innerHTML="standard"===mapuser.settings.units?(2.23694*parseFloat(mapuser.last.spd)).toFixed():mapuser.last.spd.toFixed(),n.id="spd-unit",n.innerHTML="standard"===mapuser.settings.units?"m.p.h.":"k.p.h.",e.id="spd-sign",e.appendChild(t),e.appendChild(o),e.appendChild(n),map.controls[google.maps.ControlPosition.TOP_RIGHT].push(e)}if(mapuser.settings.showAlt){elevator=new google.maps.ElevationService;const t=document.createElement("div"),o=document.createElement("div"),n=document.createElement("div"),a=document.createElement("div");o.id="alt-label",n.id="alt",a.id="alt-unit",t.id="alt-sign",n.innerHTML="",o.innerHTML="ALTITUDE",e(mapuser.last).then(function(e){n.innerHTML=metersToFeet(e)}).catch(function(e){console.error("Could not load altitude from last known location: ",e)}),a.innerHTML="standard"===mapuser.settings.units?"feet":"meters",t.appendChild(o),t.appendChild(n),t.appendChild(a),map.controls[google.maps.ControlPosition.TOP_RIGHT].push(t)}}function e(e){return new Promise(function(t,o){"number"==typeof e.alt?(console.log("Altitude was provided in loc as ",e.alt,"m"),t(e.alt)):(console.log("No altitude was provided in loc"),function(e){return new Promise(function(t,o){return(elevator=elevator||new google.maps.ElevationService).getElevationForLocations({locations:[{lat:e.lat,lng:e.lon}]},function(e,n,a){n===google.maps.ElevationStatus.OK&&e[0]?(console.log("Altitude was retrieved from Google Elevations API as",e[0].elevation,"m"),t(e[0].elevation)):o(Error(a))})})}(e).then(function(e){t(e)}).catch(function(e){o(e)}))})}function t(e){return e.spd="standard"===mapuser.settings.units?2.23694*parseFloat(e.spd):parseFloat(e.spd),e.dir=parseFloat(e.dir),e.lat=parseFloat(e.lat),e.lon=parseFloat(e.lon),e.tim=new Date(e.tim).toLocaleString(),e}function o(e){!function e(t,o,n){if(null==newLoc||t.tim===newLoc.tim){if(!a)var a=new google.maps.StreetViewService;a.getPanorama({location:{lat:t.lat,lng:t.lon},radius:o},function(a,s){switch(s){case google.maps.StreetViewStatus.OK:n(a);break;case google.maps.StreetViewStatus.ZERO_RESULTS:e(t,2*o,n);break;default:console.error(new Error("Street view not available: "+s).message)}})}}(e,2,function(t){var o,n,a;$("#viewImg").attr("src","https://maps.googleapis.com/maps/api/streetview?size="+((a=$("#view")).width()<640&&a.height()<640?a.width().toFixed()+"x"+a.height().toFixed():a.width()>a.height()?"640x"+(640*a.height()/a.width()).toFixed():(640*a.width()/a.height()).toFixed()+"x640")+"&location="+t.location.latLng.lat()+","+t.location.latLng.lng()+"&fov=90&heading="+(e.spd>2?e.dir:String((o=e,n=t.location,90-Math.atan2(o.lat-n.latLng.lat(),o.lon-n.latLng.lng())*(180/Math.PI)%360)))+"&key="+mapKey)})}"0"!==disp&&mapuser.settings.showStreetview&&o(t(mapuser.last)),socket.on("get",function(n){console.log("Got location:",n.lat+", "+n.lon),newLoc=t(n),"1"!==disp&&($("#timestamp").text("location updated "+newLoc.tim),google.maps.event.trigger(map,"resize"),map.setCenter({lat:newLoc.lat,lng:newLoc.lon}),marker.setPosition({lat:newLoc.lat,lng:newLoc.lon}),mapuser.settings.showSpeed&&$("#spd").text(newLoc.spd.toFixed()),mapuser.settings.showAlt&&e(n).then(function(e){$("#alt").text(metersToFeet(e))}).catch(function(e){$("#alt").text("????"),console.error(e.stack)})),"0"!==disp&&mapuser.settings.showStreetview&&o(newLoc)})}document.onclick=resetIdleSecondsCounter,document.onmousemove=resetIdleSecondsCounter,document.onkeypress=resetIdleSecondsCounter,window.setInterval(function(){++_idleSecondsCounter>=300?socket.connected&&(console.log("Disconnecting because idle for more than",300,"seconds."),socket.disconnect()):socket.connected||(console.log("Reconnecting the user because they are no longer idle."),socket.connect())},1e3),socket.on("connect",function(){console.log("Connected!"),socket.emit("can-get",mapuser._id),mapuser._id===userid&&socket.emit("can-set",userid)}).on("disconnect",function(){console.log("Disconnected!")}).on("error",function(e){console.error(e.stack)}),$(function(){let e,t;toggleMaps(mapuser.last),$("#set-loc").click(function(){!userid===mapuser._id?alert("You are not logged in! "):navigator.geolocation?navigator.geolocation.getCurrentPosition(function(e){let t={ts:Date.now(),tok:token,usr:userid,alt:e.coords.altitude,lat:e.coords.latitude,lon:e.coords.longitude,spd:e.coords.speed||0};socket.emit("set",t),toggleMaps(t),console.log("Set location:",t.lat+", "+t.lon)},function(e){alert("Unable to set location."),console.error(e.stack)},{enableHighAccuracy:!0}):alert("Geolocation not enabled. ")}),$("#track-loc").click(function(){!userid===mapuser._id?alert("You are not logged in! "):e?($("#track-loc").html('Track').prop("title","Click here to track your location. "),navigator.geolocation.clearWatch(e),e=void 0):navigator.geolocation?($("#track-loc").html('Stop').prop("title","Click here to stop tracking your location. "),e=navigator.geolocation.watchPosition(function(e){t={ts:Date.now(),tok:token,usr:userid,lat:e.coords.latitude,lon:e.coords.longitude,alt:e.coords.altitude,spd:e.coords.speed||0},socket.emit("set",t),toggleMaps(t),console.log("Set location:",t.lat+", "+t.lon)},function(e){alert("Unable to track location."),console.error(e.stack)},{enableHighAccuracy:!0})):alert("Unable to track location. ")}),$("#clear-loc").click(function(){!userid===mapuser._id?alert("You are not logged in! "):(e&&($("#track-loc").html('Track'),navigator.geolocation.clearWatch(e),e=void 0),t={ts:Date.now(),tok:token,usr:userid,lat:0,lon:0,spd:0},socket.emit("set",t),toggleMaps(t),console.log("Cleared location"))})}); \ No newline at end of file +"use strict";let map,marker,elevator,newLoc;const mapElem=document.getElementById("map"),socket=io("//"+window.location.hostname),IDLE_TIMEOUT=300;let _idleSecondsCounter=0;function resetIdleSecondsCounter(){_idleSecondsCounter=0}function metersToFeet(e){return"standard"===mapuser.settings.units?(3.28084*e).toFixed():e.toFixed()}function toggleMaps(e){0===e.lat&&0===e.lon?($("#map").hide(),$("#view").hide(),$("#notset").show()):($("#map").show(),$("#view").show(),$("#notset").hide())}function initMap(){if("1"!==disp){if(map=new google.maps.Map(mapElem,{center:{lat:mapuser.last.lat,lng:mapuser.last.lon},panControl:!1,scrollwheel:!0,scaleControl:!!mapuser.settings.showScale,draggable:!1,zoom:mapuser.settings.defaultZoom,streetViewControl:!1,zoomControlOptions:{position:google.maps.ControlPosition.LEFT_TOP},mapTypeId:"road"===mapuser.settings.defaultMap?google.maps.MapTypeId.ROADMAP:google.maps.MapTypeId.HYBRID}),marker=new google.maps.Marker({position:{lat:mapuser.last.lat,lng:mapuser.last.lon},title:mapuser.name,icon:mapuser.settings.marker?"/static/img/marker/"+mapuser.settings.marker+".png":"/static/img/marker/red.png",map:map,draggable:!1}),map.addListener("zoom_changed",function(){map.setCenter(marker.getPosition())}),"0"!==noHeader&&"demo"!==mapuser._id){const e=document.createElement("div");e.id="map-logo",e.innerHTML='[]Tracman',map.controls[google.maps.ControlPosition.BOTTOM_LEFT].push(e)}const t=document.createElement("div");if(t.id="timestamp",mapuser.last.time&&(t.innerHTML="location updated "+new Date(mapuser.last.time).toLocaleString()),map.controls[google.maps.ControlPosition.RIGHT_BOTTOM].push(t),mapuser.settings.showSpeed){const e=document.createElement("div"),t=document.createElement("div"),o=document.createElement("div"),n=document.createElement("div");t.id="spd-label",t.innerHTML="SPEED",o.id="spd",o.innerHTML="standard"===mapuser.settings.units?(2.23694*parseFloat(mapuser.last.spd)).toFixed():mapuser.last.spd.toFixed(),n.id="spd-unit",n.innerHTML="standard"===mapuser.settings.units?"m.p.h.":"k.p.h.",e.id="spd-sign",e.appendChild(t),e.appendChild(o),e.appendChild(n),map.controls[google.maps.ControlPosition.TOP_RIGHT].push(e)}if(mapuser.settings.showAlt){elevator=new google.maps.ElevationService;const t=document.createElement("div"),o=document.createElement("div"),n=document.createElement("div"),a=document.createElement("div");o.id="alt-label",n.id="alt",a.id="alt-unit",t.id="alt-sign",n.innerHTML="",o.innerHTML="ALTITUDE",e(mapuser.last).then(function(e){n.innerHTML=metersToFeet(e)}).catch(function(e){console.error("Could not load altitude from last known location: ",e)}),a.innerHTML="standard"===mapuser.settings.units?"feet":"meters",t.appendChild(o),t.appendChild(n),t.appendChild(a),map.controls[google.maps.ControlPosition.TOP_RIGHT].push(t)}}function e(e){return new Promise(function(t,o){"number"==typeof e.alt?(console.log("Altitude was provided in loc as ",e.alt,"m"),t(e.alt)):(console.log("No altitude was provided in loc"),function(e){return new Promise(function(t,o){return(elevator=elevator||new google.maps.ElevationService).getElevationForLocations({locations:[{lat:e.lat,lng:e.lon}]},function(e,n,a){n===google.maps.ElevationStatus.OK&&e[0]?(console.log("Altitude was retrieved from Google Elevations API as",e[0].elevation,"m"),t(e[0].elevation)):o(Error(a))})})}(e).then(function(e){t(e)}).catch(function(e){o(e)}))})}function t(e){return e.spd="standard"===mapuser.settings.units?2.23694*parseFloat(e.spd):parseFloat(e.spd),e.dir=parseFloat(e.dir),e.lat=parseFloat(e.lat),e.lon=parseFloat(e.lon),e.tim=new Date(e.tim).toLocaleString(),e}function o(e){!function e(t,o,n){if(null==newLoc||t.tim===newLoc.tim){if(!a)var a=new google.maps.StreetViewService;a.getPanorama({location:{lat:t.lat,lng:t.lon},radius:o},function(a,s){switch(s){case google.maps.StreetViewStatus.OK:n(a);break;case google.maps.StreetViewStatus.ZERO_RESULTS:e(t,2*o,n);break;default:console.error(new Error("Street view not available: "+s).message)}})}}(e,2,function(t){var o,n,a;$("#viewImg").attr("src","https://maps.googleapis.com/maps/api/streetview?size="+((a=$("#view")).width()<640&&a.height()<640?a.width().toFixed()+"x"+a.height().toFixed():a.width()>a.height()?"640x"+(640*a.height()/a.width()).toFixed():(640*a.width()/a.height()).toFixed()+"x640")+"&location="+t.location.latLng.lat()+","+t.location.latLng.lng()+"&fov=90&heading="+(e.spd>2?e.dir:String((o=e,n=t.location,90-Math.atan2(o.lat-n.latLng.lat(),o.lon-n.latLng.lng())*(180/Math.PI)%360)))+"&key="+mapKey)})}"0"!==disp&&mapuser.settings.showStreetview&&o(t(mapuser.last)),socket.on("get",function(n){console.log("Got location:",n.lat+", "+n.lon),newLoc=t(n),"1"!==disp&&($("#timestamp").text("location updated "+newLoc.tim),google.maps.event.trigger(map,"resize"),map.setCenter({lat:newLoc.lat,lng:newLoc.lon}),marker.setPosition({lat:newLoc.lat,lng:newLoc.lon}),mapuser.settings.showSpeed&&$("#spd").text(newLoc.spd.toFixed()),mapuser.settings.showAlt&&e(n).then(function(e){$("#alt").text(metersToFeet(e))}).catch(function(e){$("#alt").text("????"),console.error(e.stack)})),"0"!==disp&&mapuser.settings.showStreetview&&o(newLoc)})}document.onclick=resetIdleSecondsCounter,document.onmousemove=resetIdleSecondsCounter,document.onkeypress=resetIdleSecondsCounter,window.setInterval(function(){++_idleSecondsCounter>=300?socket.connected&&(console.log("Disconnecting because idle for more than",300,"seconds."),$("#inactive-mask").show(),$("#inactive-message").show(),socket.disconnect()):socket.connected||(console.log("Reconnecting the user because they are no longer idle."),$("#inactive-mask").hide(),$("#inactive-message").hide(),socket.connect())},1e3),socket.on("connect",function(){console.log("Connected!"),socket.emit("can-get",mapuser._id),mapuser._id===userid&&socket.emit("can-set",userid)}).on("disconnect",function(){console.log("Disconnected!")}).on("error",function(e){console.error(e.stack)}),$(function(){let e,t;toggleMaps(mapuser.last),$("#set-loc").click(function(){!userid===mapuser._id?alert("You are not logged in! "):navigator.geolocation?navigator.geolocation.getCurrentPosition(function(e){let t={ts:Date.now(),tok:token,usr:userid,alt:e.coords.altitude,lat:e.coords.latitude,lon:e.coords.longitude,spd:e.coords.speed||0};socket.emit("set",t),toggleMaps(t),console.log("Set location:",t.lat+", "+t.lon)},function(e){alert("Unable to set location."),console.error(e.stack)},{enableHighAccuracy:!0}):alert("Geolocation not enabled. ")}),$("#track-loc").click(function(){!userid===mapuser._id?alert("You are not logged in! "):e?($("#track-loc").html('Track').prop("title","Click here to track your location. "),navigator.geolocation.clearWatch(e),e=void 0):navigator.geolocation?($("#track-loc").html('Stop').prop("title","Click here to stop tracking your location. "),e=navigator.geolocation.watchPosition(function(e){t={ts:Date.now(),tok:token,usr:userid,lat:e.coords.latitude,lon:e.coords.longitude,alt:e.coords.altitude,spd:e.coords.speed||0},socket.emit("set",t),toggleMaps(t),console.log("Set location:",t.lat+", "+t.lon)},function(e){alert("Unable to track location."),console.error(e.stack)},{enableHighAccuracy:!0})):alert("Unable to track location. ")}),$("#clear-loc").click(function(){!userid===mapuser._id?alert("You are not logged in! "):(e&&($("#track-loc").html('Track'),navigator.geolocation.clearWatch(e),e=void 0),t={ts:Date.now(),tok:token,usr:userid,lat:0,lon:0,spd:0},socket.emit("set",t),toggleMaps(t),console.log("Cleared location"))})}); \ No newline at end of file diff --git a/static/js/.respond.min.js b/static/js/.respond.min.js index fca4e20..806a70e 100644 --- a/static/js/.respond.min.js +++ b/static/js/.respond.min.js @@ -1 +1 @@ -window.matchMedia=window.matchMedia||function(e){"use strict";var t,n=e.documentElement,a=n.firstElementChild||n.firstChild,s=e.createElement("body"),i=e.createElement("div");return i.id="mq-test-1",i.style.cssText="position:absolute;top:-100em",s.style.background="none",s.appendChild(i),function(e){return i.innerHTML='­',n.insertBefore(s,a),t=42===i.offsetWidth,n.removeChild(s),{matches:t,media:e}}}(document),function(e){"use strict";function t(){E(!0)}var n={};if(e.respond=n,n.update=function(){},n.mediaQueriesSupported=e.matchMedia&&e.matchMedia("only all").matches,!n.mediaQueriesSupported){var a,s,i,r=e.document,o=r.documentElement,l=[],d=[],m=[],h={},u=r.getElementsByTagName("head")[0]||o,c=r.getElementsByTagName("base")[0],p=u.getElementsByTagName("link"),f=[],y=function(){for(var t=0;p.length>t;t++){var n=p[t],a=n.href,s=n.media,i=n.rel&&"stylesheet"===n.rel.toLowerCase();a&&i&&!h[a]&&(n.styleSheet&&n.styleSheet.rawCssText?(g(n.styleSheet.rawCssText,a,s),h[a]=!0):(!/^([a-zA-Z:]*\/\/)/.test(a)&&!c||a.replace(RegExp.$1,"").split("/")[0]===e.location.host)&&f.push({href:a,media:s}))}v()},v=function(){if(f.length){var t=f.shift();w(t.href,function(n){g(n,t.href,t.media),h[t.href]=!0,e.setTimeout(function(){v()},0)})}},g=function(e,t,n){var a=e.match(/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi),s=a&&a.length||0;t=t.substring(0,t.lastIndexOf("/"));var i=function(e){return e.replace(/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,"$1"+t+"$2$3")},r=!s&&n;t.length&&(t+="/"),r&&(s=1);for(var o=0;s>o;o++){var m,h,u,c;r?(m=n,d.push(i(e))):(m=a[o].match(/@media *([^\{]+)\{([\S\s]+?)$/)&&RegExp.$1,d.push(RegExp.$2&&i(RegExp.$2))),c=(u=m.split(",")).length;for(var p=0;c>p;p++)h=u[p],l.push({media:h.split("(")[0].match(/(only\s+)?([a-zA-Z]+)\s?/)&&RegExp.$2||"all",rules:d.length-1,hasquery:h.indexOf("(")>-1,minw:h.match(/\(\s*min\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:h.match(/\(\s*max\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}E()},x=function(){var e,t=r.createElement("div"),n=r.body,a=!1;return t.style.cssText="position:absolute;font-size:1em;width:1em",n||((n=a=r.createElement("body")).style.background="none"),n.appendChild(t),o.insertBefore(n,o.firstChild),e=t.offsetWidth,a?o.removeChild(n):n.removeChild(t),i=parseFloat(e)},E=function(t){var n="clientWidth",h=o[n],c="CSS1Compat"===r.compatMode&&h||r.body[n]||h,f={},y=p[p.length-1],v=(new Date).getTime();if(t&&a&&30>v-a)return e.clearTimeout(s),void(s=e.setTimeout(E,30));for(var g in a=v,l)if(l.hasOwnProperty(g)){var w=l[g],T=w.minw,C=w.maxw,S=null===T,$=null===C;T&&(T=parseFloat(T)*(T.indexOf("em")>-1?i||x():1)),C&&(C=parseFloat(C)*(C.indexOf("em")>-1?i||x():1)),w.hasquery&&(S&&$||!(S||c>=T)||!($||C>=c))||(f[w.media]||(f[w.media]=[]),f[w.media].push(d[w.rules]))}for(var b in m)m.hasOwnProperty(b)&&m[b]&&m[b].parentNode===u&&u.removeChild(m[b]);for(var R in f)if(f.hasOwnProperty(R)){var M=r.createElement("style"),O=f[R].join("\n");M.type="text/css",M.media=R,u.insertBefore(M,y.nextSibling),M.styleSheet?M.styleSheet.cssText=O:M.appendChild(r.createTextNode(O)),m.push(M)}},w=function(e,t){var n=T();n&&(n.open("GET",e,!0),n.onreadystatechange=function(){4!==n.readyState||200!==n.status&&304!==n.status||t(n.responseText)},4!==n.readyState&&n.send(null))},T=function(){var t=!1;try{t=new e.XMLHttpRequest}catch(n){t=new e.ActiveXObject("Microsoft.XMLHTTP")}return function(){return t}}();y(),n.update=y,e.addEventListener?e.addEventListener("resize",t,!1):e.attachEvent&&e.attachEvent("onresize",t)}}(this); \ No newline at end of file +window.matchMedia=window.matchMedia||function(e){"use strict";var t,n=e.documentElement,a=n.firstElementChild||n.firstChild,s=e.createElement("body"),i=e.createElement("div");return i.id="mq-test-1",i.style.cssText="position:absolute;top:-100em",s.style.background="none",s.appendChild(i),function(e){return i.innerHTML='­',n.insertBefore(s,a),t=42===i.offsetWidth,n.removeChild(s),{matches:t,media:e}}}(document),function(e){"use strict";function t(){E(!0)}var n={};if(e.respond=n,n.update=function(){},n.mediaQueriesSupported=e.matchMedia&&e.matchMedia("only all").matches,!n.mediaQueriesSupported){var a,s,i,r=e.document,o=r.documentElement,l=[],d=[],m=[],h={},u=r.getElementsByTagName("head")[0]||o,c=r.getElementsByTagName("base")[0],p=u.getElementsByTagName("link"),f=[],y=function(){for(var t=0;p.length>t;t++){var n=p[t],a=n.href,s=n.media,i=n.rel&&"stylesheet"===n.rel.toLowerCase();a&&i&&!h[a]&&(n.styleSheet&&n.styleSheet.rawCssText?(g(n.styleSheet.rawCssText,a,s),h[a]=!0):(!/^([a-zA-Z:]*\/\/)/.test(a)&&!c||a.replace(RegExp.$1,"").split("/")[0]===e.location.host)&&f.push({href:a,media:s}))}v()},v=function(){if(f.length){var t=f.shift();w(t.href,function(n){g(n,t.href,t.media),h[t.href]=!0,e.setTimeout(function(){v()},0)})}},g=function(e,t,n){var a=e.match(/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi),s=a&&a.length||0,i=function(e){return e.replace(/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,"$1"+t+"$2$3")},r=!s&&n;(t=t.substring(0,t.lastIndexOf("/"))).length&&(t+="/"),r&&(s=1);for(var o=0;s>o;o++){var m,h,u,c;r?(m=n,d.push(i(e))):(m=a[o].match(/@media *([^\{]+)\{([\S\s]+?)$/)&&RegExp.$1,d.push(RegExp.$2&&i(RegExp.$2))),c=(u=m.split(",")).length;for(var p=0;c>p;p++)h=u[p],l.push({media:h.split("(")[0].match(/(only\s+)?([a-zA-Z]+)\s?/)&&RegExp.$2||"all",rules:d.length-1,hasquery:h.indexOf("(")>-1,minw:h.match(/\(\s*min\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:h.match(/\(\s*max\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}E()},x=function(){var e,t=r.createElement("div"),n=r.body,a=!1;return t.style.cssText="position:absolute;font-size:1em;width:1em",n||((n=a=r.createElement("body")).style.background="none"),n.appendChild(t),o.insertBefore(n,o.firstChild),e=t.offsetWidth,a?o.removeChild(n):n.removeChild(t),i=parseFloat(e)},E=function(t){var n="clientWidth",h=o[n],c="CSS1Compat"===r.compatMode&&h||r.body[n]||h,f={},y=p[p.length-1],v=(new Date).getTime();if(t&&a&&30>v-a)return e.clearTimeout(s),void(s=e.setTimeout(E,30));for(var g in a=v,l)if(l.hasOwnProperty(g)){var w=l[g],T=w.minw,C=w.maxw,S=null===T,$=null===C;T&&(T=parseFloat(T)*(T.indexOf("em")>-1?i||x():1)),C&&(C=parseFloat(C)*(C.indexOf("em")>-1?i||x():1)),w.hasquery&&(S&&$||!(S||c>=T)||!($||C>=c))||(f[w.media]||(f[w.media]=[]),f[w.media].push(d[w.rules]))}for(var b in m)m.hasOwnProperty(b)&&m[b]&&m[b].parentNode===u&&u.removeChild(m[b]);for(var R in f)if(f.hasOwnProperty(R)){var M=r.createElement("style"),O=f[R].join("\n");M.type="text/css",M.media=R,u.insertBefore(M,y.nextSibling),M.styleSheet?M.styleSheet.cssText=O:M.appendChild(r.createTextNode(O)),m.push(M)}},w=function(e,t){var n=T();n&&(n.open("GET",e,!0),n.onreadystatechange=function(){4!==n.readyState||200!==n.status&&304!==n.status||t(n.responseText)},4!==n.readyState&&n.send(null))},T=function(){var t=!1;try{t=new e.XMLHttpRequest}catch(n){t=new e.ActiveXObject("Microsoft.XMLHTTP")}return function(){return t}}();y(),n.update=y,e.addEventListener?e.addEventListener("resize",t,!1):e.attachEvent&&e.attachEvent("onresize",t)}}(this); \ No newline at end of file diff --git a/static/js/map.js b/static/js/map.js index 90f6635..6a72c33 100755 --- a/static/js/map.js +++ b/static/js/map.js @@ -24,12 +24,16 @@ window.setInterval( function CheckIdleTime () { if (_idleSecondsCounter >= IDLE_TIMEOUT) { if (socket.connected) { console.log('Disconnecting because idle for more than',IDLE_TIMEOUT,'seconds.') + $('#inactive-mask').show() + $('#inactive-message').show() socket.disconnect() } // Connect user if disconnected } else { if (!socket.connected) { console.log('Reconnecting the user because they are no longer idle.') + $('#inactive-mask').hide() + $('#inactive-message').hide() socket.connect() } } @@ -382,6 +386,7 @@ function initMap() { console.error(err.stack) }) } + } // Update street view @@ -421,6 +426,7 @@ function initMap() { // Update streetview function updateStreetView (loc) { + // Calculate bearing between user and position of streetview image // https://stackoverflow.com/a/26609687/3006854 function getBearing (userLoc, imageLoc) { @@ -454,6 +460,7 @@ function initMap() { '&key=' + mapKey ) }) + } // Error loading gmaps API diff --git a/views/map.html b/views/map.html index 1af2df3..c27973c 100755 --- a/views/map.html +++ b/views/map.html @@ -43,20 +43,24 @@ {% endblock %} {% block main %} +
+ {% if user and user.isNewUser %} -
+