diff --git a/gaia/upload.js b/gaia/upload.js index 7a99f7b..46cddd1 100644 --- a/gaia/upload.js +++ b/gaia/upload.js @@ -1,12 +1,13 @@ // ==UserScript== -// @name GaiaGps Uploader +// @name GaiaGps Uploader // @namespace https://greasyfork.org/users/583371 // @description Allow the user to upload multiple files at once and more than 1000 waypoints -// @grant none -// @version 3.1 +// @grant none +// @version 3.1.1 // @author Franzz -// @match https://www.gaiagps.com/map/* -// @require https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js +// @license GNU GPLv3 +// @match https://www.gaiagps.com/map/* +// @require https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js // ==/UserScript== /* jshint esversion: 6 */ @@ -22,11 +23,11 @@ * @constructor */ let gpxParser = function () { - this.xmlSource = ""; - this.metadata = {}; - this.waypoints = []; - this.tracks = []; - this.routes = []; + this.xmlSource = ""; + this.metadata = {}; + this.waypoints = []; + this.tracks = []; + this.routes = []; }; /** @@ -37,391 +38,392 @@ * @return {gpxParser} A GPXParser object */ gpxParser.prototype.parse = function (gpxstring) { - let keepThis = this; + let keepThis = this; - let domParser = new window.DOMParser(); - this.xmlSource = domParser.parseFromString(gpxstring, 'text/xml'); + let domParser = new window.DOMParser(); + this.xmlSource = domParser.parseFromString(gpxstring, 'text/xml'); - let metadata = this.xmlSource.querySelector('metadata'); - if(metadata != null){ - this.metadata.name = this.getElementValue(metadata, "name"); - this.metadata.desc = this.getElementValue(metadata, "desc"); - this.metadata.time = this.getElementValue(metadata, "time"); + let metadata = this.xmlSource.querySelector('metadata'); + if(metadata != null){ + this.metadata.name = this.getElementValue(metadata, "name"); + this.metadata.desc = this.getElementValue(metadata, "desc"); + this.metadata.time = this.getElementValue(metadata, "time"); - let author = {}; - let authorElem = metadata.querySelector('author'); - if(authorElem != null){ - author.name = this.getElementValue(authorElem, "name"); - author.email = {}; - let emailElem = authorElem.querySelector('email'); - if(emailElem != null){ - author.email.id = emailElem.getAttribute("id"); - author.email.domain = emailElem.getAttribute("domain"); - } + let author = {}; + let authorElem = metadata.querySelector('author'); + if(authorElem != null){ + author.name = this.getElementValue(authorElem, "name"); + author.email = {}; + let emailElem = authorElem.querySelector('email'); + if(emailElem != null){ + author.email.id = emailElem.getAttribute("id"); + author.email.domain = emailElem.getAttribute("domain"); + } - let link = {}; - let linkElem = authorElem.querySelector('link'); - if(linkElem != null){ - link.href = linkElem.getAttribute('href'); - link.text = this.getElementValue(linkElem, "text"); - link.type = this.getElementValue(linkElem, "type"); - } - author.link = link; - } - this.metadata.author = author; + let link = {}; + let linkElem = authorElem.querySelector('link'); + if(linkElem != null){ + link.href = linkElem.getAttribute('href'); + link.text = this.getElementValue(linkElem, "text"); + link.type = this.getElementValue(linkElem, "type"); + } + author.link = link; + } + this.metadata.author = author; - let link = {}; - let linkElem = this.queryDirectSelector(metadata, 'link'); - if(linkElem != null){ - link.href = linkElem.getAttribute('href'); - link.text = this.getElementValue(linkElem, "text"); - link.type = this.getElementValue(linkElem, "type"); - this.metadata.link = link; - } - } + let link = {}; + let linkElem = this.queryDirectSelector(metadata, 'link'); + if(linkElem != null){ + link.href = linkElem.getAttribute('href'); + link.text = this.getElementValue(linkElem, "text"); + link.type = this.getElementValue(linkElem, "type"); + this.metadata.link = link; + } + } - var wpts = [].slice.call(this.xmlSource.querySelectorAll('wpt')); - for (let idx in wpts){ - var wpt = wpts[idx]; - let pt = {}; - pt.name = keepThis.getElementValue(wpt, "name"); - pt.lat = parseFloat(wpt.getAttribute("lat")); - pt.lon = parseFloat(wpt.getAttribute("lon")); - //let floatValue = parseFloat(keepThis.getElementValue(wpt, "ele")); - //pt.ele = isNaN(floatValue) ? null : floatValue; - pt.ele = parseFloat(keepThis.getElementValue(wpt, "ele")) || null; - pt.cmt = keepThis.getElementValue(wpt, "cmt"); - pt.desc = keepThis.getElementValue(wpt, "desc"); - pt.sym = keepThis.getElementValue(wpt, "sym"); + var wpts = [].slice.call(this.xmlSource.querySelectorAll('wpt')); + for (let idx in wpts){ + var wpt = wpts[idx]; + let pt = {}; + pt.name = keepThis.getElementValue(wpt, "name"); + pt.lat = parseFloat(wpt.getAttribute("lat")); + pt.lon = parseFloat(wpt.getAttribute("lon")); + //let floatValue = parseFloat(keepThis.getElementValue(wpt, "ele")); + //pt.ele = isNaN(floatValue) ? null : floatValue; + pt.ele = parseFloat(keepThis.getElementValue(wpt, "ele")) || null; + pt.cmt = keepThis.getElementValue(wpt, "cmt"); + pt.desc = keepThis.getElementValue(wpt, "desc"); + pt.sym = keepThis.getElementValue(wpt, "sym"); - //let time = keepThis.getElementValue(wpt, "time"); - //pt.time = time == null ? null : new Date(time); - pt.time = (keepThis.getElementValue(wpt, "time") || keepThis.metadata.time) || null; + //let time = keepThis.getElementValue(wpt, "time"); + //pt.time = time == null ? null : new Date(time); + pt.time = (keepThis.getElementValue(wpt, "time") || keepThis.metadata.time) || null; - keepThis.waypoints.push(pt); - } + keepThis.waypoints.push(pt); + } - var rtes = [].slice.call(this.xmlSource.querySelectorAll('rte')); - for (let idx in rtes){ - let rte = rtes[idx]; - let route = {}; - route.name = keepThis.getElementValue(rte, "name"); - route.cmt = keepThis.getElementValue(rte, "cmt"); - route.desc = keepThis.getElementValue(rte, "desc"); - route.src = keepThis.getElementValue(rte, "src"); - route.number = keepThis.getElementValue(rte, "number"); + var rtes = [].slice.call(this.xmlSource.querySelectorAll('rte')); + for (let idx in rtes){ + let rte = rtes[idx]; + let route = {}; + route.name = keepThis.getElementValue(rte, "name"); + route.cmt = keepThis.getElementValue(rte, "cmt"); + route.desc = keepThis.getElementValue(rte, "desc"); + route.src = keepThis.getElementValue(rte, "src"); + route.number= keepThis.getElementValue(rte, "number"); - let type = keepThis.queryDirectSelector(rte, "type"); - route.type = type != null ? type.innerHTML : null; + let type = keepThis.queryDirectSelector(rte, "type"); + route.type = type != null ? type.innerHTML : null; - let link = {}; - let linkElem = rte.querySelector('link'); - if(linkElem != null){ - link.href = linkElem.getAttribute('href'); - link.text = keepThis.getElementValue(linkElem, "text"); - link.type = keepThis.getElementValue(linkElem, "type"); - } - route.link = link; + let link = {}; + let linkElem= rte.querySelector('link'); + if(linkElem != null){ + link.href = linkElem.getAttribute('href'); + link.text = keepThis.getElementValue(linkElem, "text"); + link.type = keepThis.getElementValue(linkElem, "type"); + } + route.link = link; - let routepoints = []; - var rtepts = [].slice.call(rte.querySelectorAll('rtept')); + let routepoints = []; + var rtepts = [].slice.call(rte.querySelectorAll('rtept')); - for (let idxIn in rtepts){ - let rtept = rtepts[idxIn]; - let pt = {}; - pt.lat = parseFloat(rtept.getAttribute("lat")); - pt.lon = parseFloat(rtept.getAttribute("lon")); - //let floatValue = parseFloat(keepThis.getElementValue(rtept, "ele")); - //pt.ele = isNaN(floatValue) ? null : floatValue; - pt.ele = parseFloat(keepThis.getElementValue(rtept, "ele")) || null; + for (let idxIn in rtepts){ + let rtept = rtepts[idxIn]; + let pt = {}; + pt.lat = parseFloat(rtept.getAttribute("lat")); + pt.lon = parseFloat(rtept.getAttribute("lon")); + //let floatValue = parseFloat(keepThis.getElementValue(rtept, "ele")); + //pt.ele = isNaN(floatValue) ? null : floatValue; + pt.ele = parseFloat(keepThis.getElementValue(rtept, "ele")) || null; - //let time = keepThis.getElementValue(rtept, "time"); - //pt.time = time == null ? null : new Date(time); - pt.time = (keepThis.getElementValue(rtept, "time") || keepThis.metadata.time) || null; + //let time = keepThis.getElementValue(rtept, "time"); + //pt.time = time == null ? null : new Date(time); + pt.time = (keepThis.getElementValue(rtept, "time") || keepThis.metadata.time) || null; - routepoints.push(pt); - } + routepoints.push(pt); + } - //route.distance = keepThis.calculDistance(routepoints); - //route.elevation = keepThis.calcElevation(routepoints); - //route.slopes = keepThis.calculSlope(routepoints, route.distance.cumul); - route.points = routepoints; + //route.distance = keepThis.calculDistance(routepoints); + //route.elevation = keepThis.calcElevation(routepoints); + //route.slopes = keepThis.calculSlope(routepoints, route.distance.cumul); + route.points = routepoints; - keepThis.routes.push(route); - } + keepThis.routes.push(route); + } - var trks = [].slice.call(this.xmlSource.querySelectorAll('trk')); - for (let idx in trks){ - let trk = trks[idx]; - let track = {}; + var trks = [].slice.call(this.xmlSource.querySelectorAll('trk')); + for (let idx in trks){ + let trk = trks[idx]; + let track = {}; - track.name = keepThis.getElementValue(trk, "name"); - track.cmt = keepThis.getElementValue(trk, "cmt"); - track.desc = keepThis.getElementValue(trk, "desc"); - track.src = keepThis.getElementValue(trk, "src"); - track.number = keepThis.getElementValue(trk, "number"); - track.color = keepThis.getElementValue(trk, "DisplayColor"); - track.time = keepThis.metadata.time; + track.name = keepThis.getElementValue(trk, "name"); + track.cmt = keepThis.getElementValue(trk, "cmt"); + track.desc = keepThis.getElementValue(trk, "desc"); + track.src = keepThis.getElementValue(trk, "src"); + track.number= keepThis.getElementValue(trk, "number"); + track.color = keepThis.getElementValue(trk, "DisplayColor"); + track.time = keepThis.metadata.time; - let type = keepThis.queryDirectSelector(trk, "type"); - track.type = type != null ? type.innerHTML : null; + let type = keepThis.queryDirectSelector(trk, "type"); + track.type = type != null ? type.innerHTML : null; - let link = {}; - let linkElem = trk.querySelector('link'); - if(linkElem != null){ - link.href = linkElem.getAttribute('href'); - link.text = keepThis.getElementValue(linkElem, "text"); - link.type = keepThis.getElementValue(linkElem, "type"); - } - track.link = link; + let link = {}; + let linkElem= trk.querySelector('link'); + if(linkElem != null){ + link.href = linkElem.getAttribute('href'); + link.text = keepThis.getElementValue(linkElem, "text"); + link.type = keepThis.getElementValue(linkElem, "type"); + } + track.link = link; - let trackpoints = []; - let trkpts = [].slice.call(trk.querySelectorAll('trkpt')); - for (let idxIn in trkpts){ - var trkpt = trkpts[idxIn]; - let pt = {}; - pt.lat = parseFloat(trkpt.getAttribute("lat")); - pt.lon = parseFloat(trkpt.getAttribute("lon")); - //let floatValue = parseFloat(keepThis.getElementValue(trkpt, "ele")); - //pt.ele = isNaN(floatValue) ? null : floatValue; - pt.ele = parseFloat(keepThis.getElementValue(trkpt, "ele")) || null; + let trackpoints = []; + let trkpts = [].slice.call(trk.querySelectorAll('trkpt')); + for (let idxIn in trkpts){ + var trkpt = trkpts[idxIn]; + let pt = {}; + pt.lat = parseFloat(trkpt.getAttribute("lat")); + pt.lon = parseFloat(trkpt.getAttribute("lon")); + //let floatValue = parseFloat(keepThis.getElementValue(trkpt, "ele")); + //pt.ele = isNaN(floatValue) ? null : floatValue; + pt.ele = parseFloat(keepThis.getElementValue(trkpt, "ele")) || null; - //let time = keepThis.getElementValue(trkpt, "time"); - //pt.time = time == null ? null : new Date(time); - pt.time = (keepThis.getElementValue(trkpt, "time") || keepThis.metadata.time) || null; + //let time = keepThis.getElementValue(trkpt, "time"); + //pt.time = time == null ? null : new Date(time); + pt.time = (keepThis.getElementValue(trkpt, "time") || keepThis.metadata.time) || null; - trackpoints.push(pt); - } - //track.distance = keepThis.calculDistance(trackpoints); - //track.elevation = keepThis.calcElevation(trackpoints); - //track.slopes = keepThis.calculSlope(trackpoints, track.distance.cumul); - track.points = trackpoints; + trackpoints.push(pt); + } + //track.distance = keepThis.calculDistance(trackpoints); + //track.elevation = keepThis.calcElevation(trackpoints); + //track.slopes = keepThis.calculSlope(trackpoints, track.distance.cumul); + track.points = trackpoints; - keepThis.tracks.push(track); - } + keepThis.tracks.push(track); + } }; /** * Get value from a XML DOM element * - * @param {Element} parent - Parent DOM Element - * @param {string} needle - Name of the searched element + * @param {Element} parent - Parent DOM Element + * @param {string} needle - Name of the searched element * * @return {} The element value */ gpxParser.prototype.getElementValue = function(parent, needle){ - let elem = parent.querySelector(needle); - if(elem != null){ - return elem.innerHTML != undefined ? elem.innerHTML : elem.childNodes[0].data; - } - return elem; + let elem = parent.querySelector(needle); + if(elem != null){ + return elem.innerHTML != undefined ? elem.innerHTML : elem.childNodes[0].data; + } + return elem; }; /** * Search the value of a direct child XML DOM element * - * @param {Element} parent - Parent DOM Element - * @param {string} needle - Name of the searched element + * @param {Element} parent - Parent DOM Element + * @param {string} needle - Name of the searched element * * @return {} The element value */ gpxParser.prototype.queryDirectSelector = function(parent, needle) { - let elements = parent.querySelectorAll(needle); - let finalElem = elements[0]; + let elements = parent.querySelectorAll(needle); + let finalElem = elements[0]; - if(elements.length > 1) { - let directChilds = parent.childNodes; + if(elements.length > 1) { + let directChilds = parent.childNodes; - for(idx in directChilds) { - elem = directChilds[idx]; - if(elem.tagName === needle) { - finalElem = elem; - } - } - } + for(idx in directChilds) { + elem = directChilds[idx]; + if(elem.tagName === needle) { + finalElem = elem; + } + } + } - return finalElem; + return finalElem; }; class Gaia { - static get URL() { return 'https://www.gaiagps.com'; } - static get API() { return Gaia.URL+'/api/objects'; } + static get URL() { return 'https://www.gaiagps.com'; } + static get API() { return Gaia.URL+'/api/objects'; } - constructor() { - this.asFiles = []; - this.aoWaypoints = []; - this.aoTracks = []; - this.asFolders = {}; - this.progress = {current:0, total:0}; - } + constructor() { + this.asFiles = []; + this.aoWaypoints = []; + this.aoTracks = []; + this.asFolders = {}; + this.progress = {current:0, total:0}; + } - setLayout() { - - /* FIXME: adapts on GaiaGPS upgrade */ - let $InputButton = $('a[href="https://help.gaiagps.com/hc/en-us/articles/360052763513"]').parent().find('button'); + setLayout() { + + /* FIXME: adapts on GaiaGPS upgrade */ + let $InputButton = $('a[href="https://help.gaiagps.com/hc/en-us/articles/360052763513"]').parent().find('button'); - //If the button is found (=displayed) - if($InputButton.length > 0) { - this.$InputBox = $InputButton.parent(); + //If the button is found (=displayed) + if($InputButton.length > 0) { + this.$InputBox = $InputButton.parent(); - //Add Feedback box - this.$Feedback = ($('#ggu-feedback').length > 0)?$('#ggu-feedback'):($('
', {'style': 'color: '+sColor+';'}).text(sFormattedMsg)); + var sFormattedMsg = sIcon+' '+sMsg+(sMsg.slice(-1)=='.'?'':'.'); + console.log(sFormattedMsg); + + this.$Feedback.append($('
', {'style': 'color: '+sColor+';'}).text(sFormattedMsg)); + this.$Feedback.scrollTop(this.$Feedback.prop("scrollHeight")); + } - this.$Feedback.scrollTop(this.$Feedback.prop("scrollHeight")); - } + incProgress() { + if(!this.progress.current) { + this.progress.$Done = $('