/* phpTrackme * * Copyright(C) 2013 Bartek Fabiszewski (www.fabiszewski.net) * * This is free software; you can redistribute it and/or modify it under * the terms of the GNU Library General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ // google maps function displayTrack(xml,update) { altitudes.length = 0; var totalMeters = 0; var totalSeconds = 0; // init polyline var poly = new google.maps.Polyline(polyOptions); poly.setMap(map); var path = poly.getPath(); var latlngbounds = new google.maps.LatLngBounds( ); var positions = xml.getElementsByTagName('position'); var posLen = positions.length; for (var i=0; i'+lang_user+': '+p.username.toUpperCase()+'
'+lang_track+': '+p.trackname.toUpperCase()+ ''+ '
'+ '
'+lang_time+': '+p.dateoccured+'
'+ ((p.speed != null)?''+lang_speed+': '+(p.speed.toKmH()*factor_kmh)+' '+unit_kmh+'
':'')+ ((p.altitude != null)?''+lang_altitude+': '+(p.altitude*factor_m).toFixed()+' '+unit_m+'
':'')+'
'+ ((latest==0)? ('
'+lang_ttime+': '+p.totalSeconds.toHMS()+'
'+ ''+lang_aspeed+': '+((p.totalSeconds>0)?((p.totalMeters/p.totalSeconds).toKmH()*factor_kmh).toFixed():0)+' '+unit_kmh+'
'+ ''+lang_tdistance+': '+(p.totalMeters.toKm()*factor_km).toFixed(2)+' '+unit_km+'
'+'
'):'')+ '
'+lang_point+' '+(i+1)+' '+lang_of+' '+(posLen)+'
'+ '
'; popup = new google.maps.InfoWindow(); popup.listener = google.maps.event.addListener(marker, 'click', (function(marker,content) { return function() { popup.setContent(content); popup.open(map, marker); if (document.getElementById('bottom').style.display=='block') { chart.setSelection([{row:i,column:null}]); } } })(marker,content)); markers.push(marker); popups.push(popup); } // openstreetmaps // TODO // general stuff if (units=='imperial') { factor_kmh = 0.62; //to mph unit_kmh = 'mph'; factor_m = 3.28; // to feet unit_m = 'ft'; factor_km = 0.62; // to miles unit_km = 'mi'; } else { factor_kmh = 1; unit_kmh = 'km/h'; factor_m = 1; unit_m = 'm'; factor_km = 1; unit_km = 'km'; } var latest = 0; var latestTime = 0; var live = 0; var chart; var altitudes = new Array(); var altTimeout; function displayChart() { if (chart) { google.visualization.events.removeAllListeners(chart); } var data = new google.visualization.DataTable(); data.addColumn('number', 'id'); data.addColumn('number', 'altitude'); var altLen = altitudes.length; for (var i=0; i'; popup = new google.maps.InfoWindow({ content: contentString }); popup.open(map,markers[id]); altTimeout = setTimeout(function() { if (popup) {popup.close();} },2000); } }); } function toggleChart(i) { var altLen = altitudes.length; if (altLen<=1) { return; } var e = document.getElementById('bottom'); if (arguments.length < 1) { if (e.style.display == 'block') { i = 0 } else { i = 1; } } if (i==0) { chart.clearChart(); e.style.display = 'none'; } else { e.style.display = 'block'; displayChart(); } } function getXHR() { var xmlhttp = null; if (window.XMLHttpRequest) { xmlhttp=new XMLHttpRequest(); } else { xmlhttp=new ActiveXObject('Microsoft.XMLHTTP'); } return xmlhttp; } function loadTrack(userid,trackid,update) { if (latest==1) { trackid=0; } var xhr = getXHR(); xhr.onreadystatechange = function() { if (xhr.readyState==4 && xhr.status==200) { var xml = xhr.responseXML; var positions = xml.getElementsByTagName('position'); if (positions.length>0) { clearMap(); displayTrack(xml,update); } xhr = null; } } xhr.open('GET','getpositions.php?trackid='+trackid+'&userid='+userid,true); xhr.send(); } function parsePosition(p) { // read data var latitude = getNode(p,'latitude'); var longitude = getNode(p,'longitude'); var altitude = getNode(p,'altitude'); // may be null if (altitude != null) { altitude = parseInt(altitude); } var speed = getNode(p,'speed'); // may be null if (speed != null) { speed = parseInt(speed); } var angle = getNode(p,'angle'); // may be null if (angle != null) { angle = parseInt(angle); } var username = getNode(p,'username'); var trackname = getNode(p,'trackname'); var tid = getNode(p,'trackid'); var dateoccured = getNode(p,'dateoccured'); var distance = parseInt(getNode(p,'distance')); var seconds = parseInt(getNode(p,'seconds')); return { 'latitude': latitude, 'longitude': longitude, 'altitude': altitude, 'speed': speed, 'angle': angle, 'username': username, 'trackname': trackname, 'tid': tid, 'dateoccured': dateoccured, 'distance': distance, 'seconds': seconds }; } function load(type,userid,trackid) { var url = 'download.php?type='+type+'&userid='+userid+'&trackid='+trackid; window.location.assign(url); } function updateSummary(l,d,s) { var t = document.getElementById('summary'); if (latest==0){ t.innerHTML = ''+lang_summary+'
'+ lang_tdistance+': '+(d.toKm()*factor_km).toFixed(2)+' '+unit_km+'
'+ lang_ttime+': '+s.toHMS(); } else { t.innerHTML = ''+lang_latest+':
'+l; } } function getNode(p,name) { return ((p.getElementsByTagName(name)[0].childNodes[0]) ? p.getElementsByTagName(name)[0].childNodes[0].nodeValue : null); } // seconds to (d) H:M:S Number.prototype.toHMS = function(){ var s = this; var d = Math.floor(s / 86400); var h = Math.floor((s % 86400) / 3600); var m = Math.floor(((s % 86400) % 3600) / 60); s = ((s % 86400) % 3600) % 60; return ((d>0)?(d + ' d '):'') + (('00'+h).slice(-2)) + ':' + (('00'+m).slice(-2)) + ':' + (('00'+s).slice(-2)) + ''; } // meters to km Number.prototype.toKm = function() { return Math.round(this/10)/100; } // m/s to km/h Number.prototype.toKmH = function() { return Math.round(this*3600/10)/100; } // negate value function toggleLatest() { if (latest==0) { latest = 1; loadTrack(userid,0,1); } else { latest = 0; loadTrack(userid,trackid,1); } } function setTrack(t) { document.getElementsByName('track')[0].value = t; } function selectTrack(f) { trackid=f.options[f.selectedIndex].value; document.getElementById('latest').checked = false; if (latest==1) { toggleLatest(); } loadTrack(userid,trackid,1); } function selectUser(f) { userid=f.options[f.selectedIndex].value; if (f.options[0].disabled==false) { f.options[0].disabled = true; } document.getElementById('latest').checked = false; if (latest==1) { toggleLatest(); } getTrips(userid); } function getTrips(userid) { var xhr = getXHR(); xhr.onreadystatechange = function() { if (xhr.readyState==4 && xhr.status==200) { var xml = xhr.responseXML; var trips = xml.getElementsByTagName('trip'); if (trips.length>0) { fillOptions(xml); } xhr = null; } } xhr.open('GET','gettrips.php?userid='+userid,true); xhr.send(); } function fillOptions(xml) { var trackSelect = document.getElementsByName('track')[0]; clearOptions(trackSelect); var trips = xml.getElementsByTagName('trip'); var trpLen = trips.length; for (var i=0; i