// ==UserScript== // @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.2 // @author Franzz // @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 */ //Ctrl+Alt+Shift+I to open network tab on addon /* GPXParser - v3.0.8 - https://github.com/Luuka/GPXParser.js/blob/master/src/GPXParser.js */ /* Personnal modifications have been applied, care on upgrade */ /** * GPX file parser * * @constructor */ let gpxParser = function () { this.xmlSource = ""; this.metadata = {}; this.waypoints = []; this.tracks = []; this.routes = []; }; /** * Parse a gpx formatted string to a GPXParser Object * * @param {string} gpxstring - A GPX formatted String * * @return {gpxParser} A GPXParser object */ gpxParser.prototype.parse = function (gpxstring) { let keepThis = this; 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 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 = 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"); //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); } 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 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')); 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; routepoints.push(pt); } //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); } 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; 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 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; 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); } }; /** * Get value from a XML DOM 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){ //Get value (in case of CDATA) let sValue = (elem.innerHTML != undefined && elem.innerHTML.substring(0, 8) != '').html(sValue).text(); //Strip HTML tags & trim value return $('
', {'style': 'color: '+sColor+';'}).text(sFormattedMsg)); this.$Feedback.scrollTop(this.$Feedback.prop("scrollHeight")); } incProgress() { if(!this.progress.current) { this.progress.$Done = $('