var running = false;
var watchId = undefined;
var sep = "
************
";
var _ = undefined;
var locations = undefined;
function successWatch(position) {
var debug = document.getElementById('geoloc-debug').checked;
var s = document.querySelector('#log');
if (!debug) {
s.innerHTML = "";
}
if (keep()) {
locations.push(position);
}
s.innerHTML = sep + s.innerHTML;
for (var i in position.coords) {
var e = position.coords[i];
if (typeof e == 'number') {
s.innerHTML = i + ":" + position.coords[i] + "
" + s.innerHTML;
}
}
var link = 'Show on map
';
s.innerHTML = link + s.innerHTML;
var nbfixes = document.getElementById('nbr-gps-fixes');
nbfixes.value = parseInt(nbfixes.value) + 1;
var datefix = document.getElementById('date-last-fix');
var cdate = new Date();
var localeFormat = cdate.toLocaleString(navigator.languages, {
month: 'numeric',
day: 'numeric',
year: 'numeric'
});
datefix.value = localeFormat;
}
function errorWatch(msg) {
var s = document.querySelector('#log');
if (typeof msg == "object") {
if (msg.code == 1) {
msg = "Permission denied";
}
if (msg.code == 2) {
msg = "Position unavailable";
}
if (msg.code == 3) {
msg = "Timed out";
}
}
s.innerHTML = sep + msg + sep + s.innerHTML;
}
function successGet(position) {
successWatch(position);
enable('btnGet');
enable('btnStart');
enable('btnClear');
enable('btnSave');
}
function errorGet(msg) {
errorWatch(msg);
enable('btnGet');
enable('btnStart');
enable('btnClear');
}
function getOptions() {
if (navigator.geolocation) {
locations = new Array();
document.getElementById('nbr-gps-fixes').value = "0";
document.getElementById('date-last-fix').value = "";
show('status');
if (document.getElementById('geoloc-debug').checked) {
show('debuglog');
}
running = true;
return {
enableHighAccuracy: document.getElementById('geoloc-highaccuracy').checked ? true : false,
timeout: parseInt(document.getElementById('geoloc-timeout').value),
maximumAge: parseInt(document.getElementById('geoloc-maxage').value)
};
}
errorWatch('not supported');
return null;
}
function getGeoloc() {
errorWatch("getting current position");
options = getOptions();
if (options) {
navigator.geolocation.getCurrentPosition(successGet, errorGet, options);
disable('btnGet');
disable('btnStart');
disable('btnStop');
disable('btnClear');
disable('btnSave');
}
}
function startGeoloc() {
errorWatch("Starting watchPosition");
options = getOptions();
if (options) {
watchId = navigator.geolocation.watchPosition(successWatch, errorWatch, options);
enable('btnStop');
enable('btnClear');
disable('btnGet');
disable('btnStart');
disable('btnSave');
}
}
function stopGeoloc() {
if (watchId != undefined) {
errorWatch("Stopping watchPosition");
navigator.geolocation.clearWatch(watchId);
disable('btnStop');
enable('btnGet');
enable('btnClear');
enable('btnStart');
if (keep()) {
enable('btnSave');
}
running = false;
}
}
function clearGeoloc() {
var s = document.querySelector('#log');
s.innerHTML = "";
}
function locationsToGPX() {
var xmldoc = document.implementation.createDocument("", "", null);
var doc = xmldoc.createElementNS('http://www.topografix.com/GPX/1/1', 'gpx');
doc.setAttribute('creator', 'FirefoxOS geotracker');
doc.setAttribute('version', '1.1');
xmldoc.appendChild(doc);
var time = xmldoc.createElement('time');
var dtf = Intl.DateTimeFormat(navigator.languages, {
year: 'numeric',
moth: 'numeric',
day: 'numeric',
hour: 'numeric',
minute: 'numeric',
second: 'numeric',
timeZoneName: 'short'
});
var ts = xmldoc.createTextNode(dtf.format(new Date()));
time.appendChild(ts);
doc.appendChild(time);
var createSimpleNode = function(name, value) {
var e = xmldoc.createElement(name);
e.appendChild(xmldoc.createTextNode(value));
return e;
};
for (var ei in locations) {
var e = locations[ei];
var x = xmldoc.createElement('wpt');
x.setAttribute('lat', e.coords.latitude);
x.setAttribute('lon', e.coords.longitude);
var ele = createSimpleNode('ele', e.coords.altitude);
x.appendChild(ele);
var time = createSimpleNode('time', dtf.format(new Date(e.timestamp)));
x.appendChild(time);
var ext = xmldoc.createElement('extensions');
x.appendChild(ext);
var accuracy = createSimpleNode('accuracy', e.coords.accuracy);
ext.appendChild(accuracy);
var altitudeAccuracy = createSimpleNode('altitudeAccuracy', e.coords.altitudeAccuracy);
ext.appendChild(altitudeAccuracy);
if (!isNaN(e.coords.speed)) {
var speed = createSimpleNode('speed', e.coords.speed);
ext.appendChild(speed);
}
if (!isNaN(e.coords.heading)) {
var heading = createSimpleNode('heading', e.coords.heading);
ext.appendChild(heading);
}
doc.appendChild(x);
}
return xmldoc;
}
function locationsToFile(format) {
var xmldoc = undefined;
if (format == "gpx") {
xmldoc = locationsToGPX();
}
var oSerializer = new XMLSerializer();
return ''
+ oSerializer.serializeToString(xmldoc);
}
function saveGeoloc() {
var date = (new Date()).toLocaleFormat("%Y%m%d%H%M%S");
var file = locationsToFile("gpx");
var blob = new Blob([file], {type: 'application/gpx+xml'});
var fname = "geoloc/geoloc-" + date + ".gpx";
var storage = navigator.getDeviceStorage('sdcard');
if (!storage) {
console.log("No storage available!");
console.log(file);
return;
}
var save = storage.addNamed(blob, fname);
save.onsuccess = function() {
alert("Successfully saved " + fname);
};
save.onerror = function() {
alert("Error while saving to " + fname + ": " + this.error.name);
};
}
function enable(id) {
var e = document.getElementById(id);
if (e) {
e.disabled = false;
}
}
function disable(id) {
var e = document.getElementById(id);
if (e) {
e.disabled = true;
}
}
function show(id) {
var e = document.getElementById(id);
if (e) {
e.style.display = "block";
}
}
function hide(id) {
var e = document.getElementById(id);
if (e) {
e.style.display = "none";
}
}
function keep() {
var e = document.getElementById('geoloc-keep');
if (e) {
return e.checked;
}
return false;
}
window.addEventListener('DOMContentLoaded', function() {
_ = navigator.mozL10n.get;
disable('btnStop');
disable('btnClear');
disable('btnSave');
hide('parameters');
hide('status');
hide('debuglog');
var keep = document.getElementById('geoloc-keep');
keep.addEventListener('change', function(ev) {
if (running) {
return;
}
if (ev.target.checked) {
enable('btnSave');
} else {
disable('btnSave');
}
});
document.getElementById('geoloc-debug').addEventListener('change', function(ev) {
if (ev.target.checked) {
show('debuglog');
} else {
hide('debuglog');
}
});
var showHideDiv = function(ev, tgt) {
var clicktarget = document.getElementById(tgt);
clicktarget.addEventListener(ev, function(ev) {
var target = ev.target.dataset['hide'];
var el = document.getElementById(target);
if (el) {
if (el.style.display == "" || el.style.display == "block") {
hide(target);
} else {
show(target);
}
}
});
};
showHideDiv('click', 'h1-parameters');
showHideDiv('click', 'h1-status');
showHideDiv('click', 'h1-debuglog');
document.getElementById('btnGet').addEventListener('click', getGeoloc);
document.getElementById('btnStart').addEventListener('click', startGeoloc);
document.getElementById('btnStop').addEventListener('click', stopGeoloc);
document.getElementById('btnClear').addEventListener('click', clearGeoloc);
document.getElementById('btnSave').addEventListener('click', saveGeoloc);
});