Add waypoint Icons & Track Colors Scripts

This commit is contained in:
franzz committed 2021-01-17 13:09:26 +01:00
1 parent a5eff5c637
commit a2faa7acf1
3 files changed
+442

No files matched your search

+211
View File
@@ -0,0 +1,211 @@
// ==UserScript==
// @name GaiaGps Track Colors Mass Updater
// @description Add missing feature: Mass update of GaiaGps Track Colors
// @version 1.0
// @grant none
// @match https://www.gaiagps.com/datasummary/tracks/
// @require https://ajax.googleapis.com/ajax/libs/jquery/3.5.0/jquery.min.js
// @namespace https://greasyfork.org/users/583371
// ==/UserScript==
console.log('computes');
function init() {
$Selector = $('<div class="MuiPaper-root MuiMenu-paper MuiPopover-paper MuiPaper-elevation8 MuiPaper-rounded" style="opacity: 1; transform: none; min-width: 40px; transition: opacity 100ms cubic-bezier(0.4, 0, 0.2, 1) 0ms, transform 67ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; top: 440px; left: 114px; transform-origin: 0px 0px 0px;" tabindex="-1"><ul class="MuiList-root MuiMenu-list MuiList-padding" role="listbox" tabindex="-1" style="display: flex; flex-wrap: wrap; width: 217px; flex-grow: 1; justify-content: center;"><li class="MuiButtonBase-root MuiListItem-root MuiMenuItem-root MuiMenuItem-gutters MuiListItem-gutters MuiListItem-button" tabindex="-1" role="option" aria-disabled="false" style="padding-left: 8px; padding-right: 8px;" title="#FFEF00" data-value="#FFEF00"><div style="position: relative; height: 24px; width: 24px; background-color: rgb(255, 239, 0); border-radius: 4px;"></div></li><li class="MuiButtonBase-root MuiListItem-root MuiMenuItem-root MuiMenuItem-gutters MuiListItem-gutters MuiListItem-button" tabindex="-1" role="option" aria-disabled="false" style="padding-left: 8px; padding-right: 8px;" title="#A4A4A4" data-value="#A4A4A4"><div style="position: relative; height: 24px; width: 24px; background-color: rgb(164, 164, 164); border-radius: 4px;"></div></li><li class="MuiButtonBase-root MuiListItem-root MuiMenuItem-root MuiMenuItem-gutters MuiListItem-gutters MuiListItem-button" tabindex="-1" role="option" aria-disabled="false" style="padding-left: 8px; padding-right: 8px;" title="#000000" data-value="#000000"><div style="position: relative; height: 24px; width: 24px; background-color: rgb(0, 0, 0); border-radius: 4px;"></div></li><li class="MuiButtonBase-root MuiListItem-root MuiMenuItem-root MuiMenuItem-gutters MuiListItem-gutters MuiListItem-button" tabindex="-1" role="option" aria-disabled="false" style="padding-left: 8px; padding-right: 8px;" title="#BAF200" data-value="#BAF200"><div style="position: relative; height: 24px; width: 24px; background-color: rgb(186, 242, 0); border-radius: 4px;"></div></li><li class="MuiButtonBase-root MuiListItem-root MuiMenuItem-root MuiMenuItem-gutters MuiListItem-gutters MuiListItem-button" tabindex="-1" role="option" aria-disabled="false" style="padding-left: 8px; padding-right: 8px;" title="#FFC900" data-value="#FFC900"><div style="position: relative; height: 24px; width: 24px; background-color: rgb(255, 201, 0); border-radius: 4px;"></div></li><li class="MuiButtonBase-root MuiListItem-root MuiMenuItem-root MuiMenuItem-gutters MuiListItem-gutters MuiListItem-button" tabindex="-1" role="option" aria-disabled="false" style="padding-left: 8px; padding-right: 8px;" title="#7AD915" data-value="#7AD915"><div style="position: relative; height: 24px; width: 24px; background-color: rgb(122, 217, 21); border-radius: 4px;"></div></li><li class="MuiButtonBase-root MuiListItem-root MuiMenuItem-root MuiMenuItem-gutters MuiListItem-gutters MuiListItem-button" tabindex="-1" role="option" aria-disabled="false" style="padding-left: 8px; padding-right: 8px;" title="#784D3E" data-value="#784D3E"><div style="position: relative; height: 24px; width: 24px; background-color: rgb(120, 77, 62); border-radius: 4px;"></div></li><li class="MuiButtonBase-root MuiListItem-root MuiMenuItem-root MuiMenuItem-gutters MuiListItem-gutters MuiListItem-button" tabindex="-1" role="option" aria-disabled="false" style="padding-left: 8px; padding-right: 8px;" title="#F42410" data-value="#F42410"><div style="position: relative; height: 24px; width: 24px; background-color: rgb(244, 36, 16); border-radius: 4px;"></div></li><li class="MuiButtonBase-root MuiListItem-root MuiMenuItem-root MuiMenuItem-gutters MuiListItem-gutters MuiListItem-button" tabindex="-1" role="option" aria-disabled="false" style="padding-left: 8px; padding-right: 8px;" title="#E834EC" data-value="#E834EC"><div style="position: relative; height: 24px; width: 24px; background-color: rgb(232, 52, 236); border-radius: 4px;"></div></li><li class="MuiButtonBase-root MuiListItem-root MuiMenuItem-root MuiMenuItem-gutters MuiListItem-gutters MuiListItem-button" tabindex="-1" role="option" aria-disabled="false" style="padding-left: 8px; padding-right: 8px;" title="#A726BC" data-value="#A726BC"><div style="position: relative; height: 24px; width: 24px; background-color: rgb(167, 38, 188); border-radius: 4px;"></div></li><li class="MuiButtonBase-root MuiListItem-root MuiMenuItem-root MuiMenuItem-gutters MuiListItem-gutters MuiListItem-button" tabindex="-1" role="option" aria-disabled="false" style="padding-left: 8px; padding-right: 8px;" title="#5726C2" data-value="#5726C2"><div style="position: relative; height: 24px; width: 24px; background-color: rgb(87, 38, 194); border-radius: 4px;"></div></li><li class="MuiButtonBase-root MuiListItem-root MuiMenuItem-root Mui-selected MuiMenuItem-gutters MuiListItem-gutters MuiListItem-button Mui-selected" tabindex="0" role="option" aria-disabled="false" style="padding-left: 8px; padding-right: Line truncated
$Selector.css('z-index', '10000').find('li').click(setColor);
//Background
$Background = $('<div>', {'aria-hidden':'true', 'style':'position: fixed; inset: 0px; background-color: transparent;'}).click(function(){toggleSelector(false);});
//Add Selector & background to DOM
$Selector.add($Background).hide().appendTo('body');
//Extra style
$('body').append($('<style>').text('@keyframes rainbow { 0%, 100% {background-color: red;} 17% {background-color: orange;} 33% {background-color: yellow;} 50% {background-color: green;} 67% {background-color: blue;} 83% {background-color: purple;} }'));
//Button for mass update
$MassUpdate = $('<button>', {'type':'button', 'class':'ga-button ga-button-flat ga-toolbar-button', 'disabled':'disabled'})
.data('track-id', 'mass')
.click(function(){toggleSelector(true, $(this));})
.append($('<i>', {'class':'material-icons ibmid'}).text('color_lens'))
.append(' ')
.append($('<span>', {'class':'ibmid ga-toolbar-button-text'}).text('Change Color'));
$('#DatasummaryController .ga-toolbar .ga-toolbar-left .ga-button').eq(1).after($MassUpdate);
//Event on checkboxes to enable mass icon button
$('.ngGrid .col0 input[type="checkbox"]').change(function(){
$MassUpdate.prop('disabled', ($('.ngGrid .col0 input[type="checkbox"]:checked').length == 0));
});
//DOM Elements
$Grid = $('.ngGrid');
$Head = $Grid.find('.ngTopPanel');
$Body = $Grid.find('.ngViewport');
iColorColLeft = $Grid.find('.colt0').width();
iCol1Width = $Grid.find('.ngHeaderCell.ng-scope.col1.colt1').width();
iCol1Left = parseInt($Grid.find('.ngHeaderCell.ng-scope.col1.colt1').css('left'));
//Insert column header
$Head.find('.ngHeaderContainer .ngHeaderCell.col0').after(
$('<div>', {'class':'ngHeaderCell ng-scope col0-1 colt0-1', 'style':'width:'+iColorColWidth+'px; left:'+iColorColLeft+'px;'})
.append($('<div>', {'class':'ngVerticalBar ngVerticalBarVisible', 'style':'height: '+iColorColHeight+'px;'}).text(' '))
.append($('<div>')
.append($('<div>', {'class':'ngHeaderSortColumn ngSorted', 'style':'cursor: pointer;'})
.append($('<div>', {'class':'ngHeaderText ng-binding', 'style':'width:'+iColorColWidth+'px;'}).text('Color'))
)
)
);
$Head.find('.ngHeaderCell.colt1').width(iCol1Width - iColorColWidth);
$Head.find('.col1').width(iCol1Width - iColorColWidth).css('left', (iCol1Left + iColorColWidth)+'px');
//Update Colors
update();
//Event on DOM change: First track of the page
oObserver = new MutationObserver((oMutations) => {update();});
oObserver.observe($('.ngGrid .ngCanvas .ngCell.col1 .ngCellText.col1 .ng-binding')[0], {attributes: true});
}
function wait(fIsFinished, fAction) {
console.log('waiting for page to load');
if(typeof oWaitTimer != "undefined") clearTimeout(oWaitTimer);
if(fIsFinished()) fAction();
else oWaitTimer = setTimeout(function(){wait(fIsFinished, fAction);}, 100);
}
function update(bWaited) {
bWaited = bWaited || false;
if(!bWaited) {
if(typeof oTimer != "undefined") clearTimeout(oTimer);
oTimer = setTimeout((() => {update(true);}), 200);
return;
}
oObserver.disconnect();
oObserver.observe($('.ngGrid .ngCanvas .ngCell.col1 .ngCellText.col1 .ng-binding')[0], {attributes: true});
console.log('updating');
$Body.find('.ngRow').each(function(key, elem){
var $Row = $(elem);
var sTrackId = $Row.find('.col1 a.ng-binding').attr('href').split('/')[3];
if(!asTracks[sTrackId].post) {
$.get({url:'https://www.gaiagps.com/api/objects/track/'+sTrackId+'/', id:sTrackId}).done(function(asTrack) {
asTracks[this.id].post = asTrack;
refreshRow($Row, this.id);
});
}
else refreshRow($Row, sTrackId);
});
}
function refreshRow($Row, sTrackId) {
//Color
var sColor = asTracks[sTrackId].post.features[0].properties.hexcolor;
if(!sColor) sColor = 'rgb(0,0,0)';
//Add Color
if(!$Row.find('.ngCell.col0-1.colt0-1').length) {
//Move Col1
$Row.find('.colt1').width(iCol1Width - iColorColWidth);
$Row.find('.col1').width(iCol1Width - iColorColWidth).css('left', (iCol1Left + iColorColWidth)+'px');
$Row.find('.ngCell.col0.colt0').after(
$('<div>', {'class':'ngCell col0-1 colt0-1', 'style':'cursor: pointer; width:'+iColorColWidth+'px; left:'+iColorColLeft+'px;'})
.data('color', sColor)
.data('track-id', this.id)
.append($('<div>', {'class':'ngVerticalBar ngVerticalBarVisible', 'style':'height: '+iColorColHeight+'px;'}))
.append($('<div>')
.append($('<div>', {'style':'ngSelectionCell'})
.append($('<div>', {'class':'track-color', 'style':'position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); height: 24px; width: 24px; background-color: '+sColor+'; border-radius: 4px;'}))
)
)
//Display Selector
.click(function(){
toggleSelector(null, $(this));
})
);
}
//Update Color
else {
$Row.find('.ngCell.col0-1.colt0-1')
.data('color', sColor)
.data('track-id', sTrackId)
.find('.track-color')
.css('background', sColor);
}
}
function toggleSelector(bShow, $Track){
bShow = bShow || !$Selector.is(':visible');
$Selector.add($Background).toggle(bShow);
if(bShow) {
$Selector
.data('track', $Track)
.css({top: ($Track.offset().top + iColorColHeight)+'px', left: ($Track.offset().left)+'px'})
.find('li[data-value="'+$Track.data('color')+'"]').addClass('Mui-selected');
}
else {
$Selector
.find('li.Mui-selected').removeClass('Mui-selected');
}
return bShow;
}
function setColor(){
var sColor = $(this).attr('data-value');
//List of tracks to change (selected checkboxes or just the one)
var a$Tracks = [];
if($Selector.data('track').data('track-id') == 'mass') a$Tracks = $('.ngGrid .ngViewport .ngRow .ngCell.col0 .ngSelectionCheckbox:checked').parents('.ngRow').find('.ngCell.col0-1').toArray();
else a$Tracks.push($Selector.data('track'));
$.each(a$Tracks, function(iKey, oTrack){
var $Track = $(oTrack);
$Track.find('.track-color').css('animation', 'rainbow 1s infinite');
var sTrackId = $Track.data('track-id');
asTracks[sTrackId].post.features[0].properties.color = sColor;
asTracks[sTrackId].post.features[0].properties.hexcolor = sColor;
var asPost = {
type: asTracks[sTrackId].post.features[0].type,
properties: asTracks[sTrackId].post.features[0].properties,
geometry: asTracks[sTrackId].post.features[0].geometry,
};
asPost.properties.localId = sTrackId;
$.ajax({
url: 'https://www.gaiagps.com/api/objects/track/'+sTrackId+'/',
type: 'PUT',
contentType: 'application/json',
data: JSON.stringify(asPost)
})
.done(function(asResult){
$.ajax({url:'https://www.gaiagps.com/api/objects/track/'+sTrackId+'/'}).done(function(asTrack){
asTracks[sTrackId].post = asTrack;
$Track.find('.track-color').css({'background': asTrack.features[0].properties.hexcolor, 'animation':'none'});
toggleSelector(false);
});
})
.fail(()=>{
$Track.find('.track-color').css({'animation':'none'});
});
});
}
var iColorColWidth = 50, iColorColHeight = 59;
//Tracks
asTracks = {};
$.ajax({url:'https://www.gaiagps.com/api/objects/track/?routepoints=false&show_archived=true&show_filed=true'}).done((asData) => {
for(var i in asData) asTracks[asData[i].id] = asData[i];
wait(function(){return ($('.ngViewport .ngRow').length > 0);}, init);
});
+3
View File
@@ -1,5 +1,6 @@
// ==UserScript== // ==UserScript==
// @name GaiaGps Uploader // @name GaiaGps Uploader
// @description Allow the user to upload multiple files at once and more than 1000 waypoints
// @version 3.0 // @version 3.0
// @grant none // @grant none
// @match https://www.gaiagps.com/map/* // @match https://www.gaiagps.com/map/*
@@ -7,6 +8,8 @@
// @namespace https://greasyfork.org/users/583371 // @namespace https://greasyfork.org/users/583371
// ==/UserScript== // ==/UserScript==
/* jshint esversion: 6 */
//Ctrl+Alt+Shift+I to open network tab on addon //Ctrl+Alt+Shift+I to open network tab on addon
/* GPXParser - v3.0.6 - https://github.com/Luuka/GPXParser.js/blob/master/src/GPXParser.js */ /* GPXParser - v3.0.6 - https://github.com/Luuka/GPXParser.js/blob/master/src/GPXParser.js */
+228
View File
@@ -0,0 +1,228 @@
// ==UserScript==
// @name GaiaGps Waypoints Mass Updater
// @description Add missing feature: Mass update of GaiaGps Waypoints
// @version 1.2
// @grant none
// @match https://www.gaiagps.com/datasummary/waypoints/
// @require https://ajax.googleapis.com/ajax/libs/jquery/3.5.0/jquery.min.js
// @namespace https://greasyfork.org/users/583371
// ==/UserScript==
console.log('computes');
function init() {
//Event on checkboxes to enable mass icon button
$('.ngGrid .col0 input[type="checkbox"]').change(function(){
$MassUpdate.prop('disabled', ($('.ngGrid .col0 input[type="checkbox"]:checked').length == 0));
});
//DOM Elements
$Grid = $('.ngGrid');
$Head = $Grid.find('.ngTopPanel');
$Body = $Grid.find('.ngViewport');
iIconColLeft = $Grid.find('.colt0').width();
iCol1Width = $Grid.find('.ngHeaderCell.ng-scope.col1.colt1').width();
iCol1Left = parseInt($Grid.find('.ngHeaderCell.ng-scope.col1.colt1').css('left'));
//Insert column header
$Head.find('.ngHeaderContainer .ngHeaderCell.col0').after(
$('<div>', {'class':'ngHeaderCell ng-scope col0-1 colt0-1', 'style':'width:'+iIconColWidth+'px; left:'+iIconColLeft+'px;'})
.append($('<div>', {'class':'ngVerticalBar ngVerticalBarVisible', 'style':'height: '+iIconColHeight+'px;'}).text(' '))
.append($('<div>')
.append($('<div>', {'class':'ngHeaderSortColumn ngSorted', 'style':'cursor: pointer;'})
.append($('<div>', {'class':'ngHeaderText ng-binding', 'style':'width:'+iIconColWidth+'px;'}).text('Icon'))
)
)
);
$Head.find('.ngHeaderCell.colt1').width(iCol1Width - iIconColWidth);
$Head.find('.col1').width(iCol1Width - iIconColWidth).css('left', (iCol1Left + iIconColWidth)+'px');
//Update Icons
update();
//Event on DOM change: First waypoint of the page
oObserver = new MutationObserver((oMutations) => {update();});
oObserver.observe($('.ngGrid .ngCanvas .ngCell.col1 .ngCellText.col1 .ng-binding')[0], {attributes: true});
//Event on buttons
//$('.ga-toolbar-right .ga-toggleicons').click(() => {update();});
}
function update(bWaited) {
bWaited = bWaited || false;
if(!bWaited) {
if(typeof oTimer != "undefined") clearTimeout(oTimer);
oTimer = setTimeout((() => {update(true);}), 200);
return;
}
oObserver.disconnect();
oObserver.observe($('.ngGrid .ngCanvas .ngCell.col1 .ngCellText.col1 .ng-binding')[0], {attributes: true});
console.log('updating');
$Body.find('.ngRow').each(function(key, elem){
var $Row = $(elem);
var sWaypointId = $Row.find('.col1 a.ng-binding').attr('href').split('/')[3];
//Icon
var sIcon = asWaypoints[sWaypointId].icon;
if(sIcon=='') sIcon = 'red-pin-down.png';
//Add Icon
if(!$Row.find('.ngCell.col0-1.colt0-1').length) {
//Move Col1
$Row.find('.colt1').width(iCol1Width - iIconColWidth);
$Row.find('.col1').width(iCol1Width - iIconColWidth).css('left', (iCol1Left + iIconColWidth)+'px');
$Row.find('.ngCell.col0.colt0').after(
$('<div>', {'class':'ngCell col0-1 colt0-1', 'style':'cursor: pointer; width:'+iIconColWidth+'px; left:'+iIconColLeft+'px;'})
.data('icon', sIcon)
.data('waypoint-id', sWaypointId)
.append($('<div>', {'class':'ngVerticalBar ngVerticalBarVisible', 'style':'height: '+iIconColHeight+'px;'}))
.append($('<div>')
.append($('<div>', {'style':'ngSelectionCell', 'style':'margin: 10px 0;text-align: center;'})
.append($('<img>', {'src':asIcons[sIcon].src, style:'width: 20px;', 'class':'waypoint-icon'}))
)
)
//Display Selector
.click(function(){
toggleSelector(null, $(this));
})
);
}
//Update Icon
else {
$Row.find('.ngCell.col0-1.colt0-1')
.data('icon', sIcon)
.data('waypoint-id', sWaypointId)
.find('img.waypoint-icon')
.attr('src', asIcons[sIcon].src);
}
});
}
function toggleSelector(bShow, $Waypoint){
bShow = bShow || !$Selector.is(':visible');
$Selector.add($Background).toggle(bShow);
if(bShow) {
$Selector
.data('waypoint', $Waypoint)
.css({top: ($Waypoint.offset().top + iIconColHeight)+'px', left: ($Waypoint.offset().left)+'px'})
.find('li[data-value="'+$Waypoint.data('icon')+'"]').addClass('Mui-selected');
}
else {
$Selector
.find('li.Mui-selected').removeClass('Mui-selected');
}
return bShow;
}
function setIcon(){
var sIcon = $(this).attr('data-value');
var a$Waypoints = [];
if($Selector.data('waypoint').data('waypoint-id') == 'mass') a$Waypoints = $('.ngGrid .ngViewport .ngRow .ngCell.col0 .ngSelectionCheckbox:checked').parents('.ngRow').find('.ngCell.col0-1').toArray();
else a$Waypoints.push($Selector.data('waypoint'));
$.each(a$Waypoints, function(iKey, oWaypoint){
var $Waypoint = $(oWaypoint);
$Waypoint.find('img').attr('src', sLoader);
var sWaypointId = $Waypoint.data('waypoint-id');
$.ajax({'url':'https://www.gaiagps.com/api/objects/waypoint/'+sWaypointId+'/'}).done(function(asWaypoint){
$.ajax({
url: 'https://elevation.gaiagps.com/geojson/',
type: 'POST',
contentType: 'application/json',
data: JSON.stringify(asWaypoint.geometry)
})
.done(function(asGeo){
asWaypoint.geometry = asGeo;
asWaypoint.properties.icon = sIcon;
$.ajax({
url: 'https://www.gaiagps.com/api/objects/waypoint/'+sWaypointId+'/',
type: 'PUT',
contentType: 'application/json',
data: JSON.stringify(asWaypoint)
})
.done(function(asResult){
$.ajax({url:'https://www.gaiagps.com/api/objects/waypoint/'+sWaypointId+'/'}).done(function(asWaypoint){
$Waypoint.find('img').attr('src', asIcons[asWaypoint.properties.icon].src);
toggleSelector(false);
});
});
});
});
});
}
var iIconColWidth = 50,
iIconColHeight = 40;
sLoader = ' data:image/gif;base64,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';
asIcons = {};
$Icons = $('<ul class="MuiList-root MuiMenu-list MuiList-padding" role="listbox" tabindex="-1" style="display: flex; flex-wrap: wrap; width: 480px; height: 376px; flex-grow: 1;"><li class="MuiButtonBase-root MuiListItem-root MuiMenuItem-root MuiMenuItem-gutters MuiListItem-gutters MuiListItem-button" tabindex="-1" role="option" aria-disabled="false" style="padding-left: 8px; padding-right: 8px;" title="black pin" data-value="black-pin.png"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAQAAAAAYLlVAAAEBklEQVRo3r2ZQWgUVxjHv12iQVyiCK4JiK2KARFPNqIX2fYm1IsHQZD2pmTJoUYEL8tCCt4kHnITaUUDoijkIOSg5KJQ8dCgTUsOira0LnoKm4KJyfw8vPlmdndms/vezOx/j2/e9/+9975535u3Ig5iP+NMM8cideosMsc04+yX7EWRCV7RTq+YoJideYEqdTqpTpVCFvanqdGtapxO1zxHFS+Mv+rNUqbEMAUKDFOizCyrDU/gUSWXlv0W7jUMzhtlAIn5DTBKrRHiHlvSGX1gv+JV2Bprrr+tVFjxGhCSzwLVcOzHNjTX37HGeagmTz0/2Et2d2UvCLt5GeZCknSkoJlf87q3NwjBLNQSvJQ6/StdTn7zQgS54LoMFHXbqVjbC0Il3Jrcdkd+1umPy/xDTLJAnToLTHIo9o0IlmHCDcDf80cjoTczxXrT1rfOFJsjz40GNcKt4vm73kDE/kns/vskgjAQ7o72lZJx03M2Mq6ptiVgKvLsrDaN2wNMm57lyNqvtwVYj+RCWZum7QHmTM9SS8jJDcvgZMvTJW2YswdYND2HW0IubAiw0PL0sDYs2gP4e0ChJWS9w2mk+elC0GAP8Mn07E8E0B8UUnuAj6ZnMdESFLXhoz3Aa9PzQKIkPKANr+0BnpueJxK9hie06bk9wG3T80KijeiCNt2xB6jET6rNVtywYBV7gDOm5+OYOtdtMRIe6wNn7AH2mp7/e32x1b5zORb6WNZitNelHv5r+o44HUcEYUTH/5/becA/jl9yBrikAPfdAMY0uVwBgmQdcwPws2DN2+5kv521JBnQeCg76wRwNsmBzAe4aiLMOAHMKMBVd4AjugiD1va7wgU4Iu7Sb6zL1gCXky+AiAgXTZS/rAH+VICLyQB2smriHLeyPx7cZbBTkomHJtINK4AbCvBQkorv/cOWV+javkBdE/BUcoA+3vuL2TXATzr+9/RJcunJ4B82dWW/ib/dTwGxADtYNvF+7ArgB7VfZoekI67rmTfX0T7HHwpwXdISe/js51RHgFNq/5k9kp70iPq0I8BTBbgtaYrDGve7De2/DY+JhyVd8cjEfbYhwDO1fyRpi2809sm29ifD8Y9I+uKBiT3f5l3I8bvaP5AsxEHWTPxzsQDnwo+Eg5KN+MU4vI18tAv9vFWAXyUr8RUrxuNKBOBKcBPA15KduKa1cVfLASyof9ckS7GND8bnZhPATR3/B7ZJtuK8XsQfDeyPEvyhc16yFnnmjdcL8ghCnhc6/nnykr3Cy79y82UklKQ34q7xW/KGGGJJp/+u9EoMseR/M32a8a/zWGJIeif9cm7QmPRS5PUWzddvPUm/JoR9vAns37BPei8GucU73nGLQfcoXwDnhWdKwxgN/gAAAABJRU5ErkJggg==" width="24"></li><li class="MuiButtonBase-root MuiListItem-root MuiMenuItem-root MuiMenuItem-gutters MuiListItem-gutters MuiListItem-button" tabindex="-1" role="option" aria-disabled="false" style="padding-left: 8px; padding-right: 8px;" title="blue pin" data-value="blue-pin-down.png"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAExElEQVR4AeWaA7AsRxfH+/ti27adFGPbSbniFGLbKMW2nTzbtt8+2/bep4v5Zf/Fvqf2re5uz+zmV3Wqpma6z7/7tHvXhQI4Cngc+BXoA0wF0jI9652+KY3SuloA2Bd4HUhRPCnllY9qrPjOwCtAmpaTli/5rJbK3wwsofwske8kV/x/wCtARBbqm6Kox7zlPNp/Ele2G8Fpvw1k3697IdOz3umb0igt2YmkIa2kVX4H4C+ysHTD5uiRfpPY/5te7PR594JMaZVHecmOtHZIUsvbyrO5sSl6fdh09vm6pypVkimvfMhX9iAkoCcAr2Rr9QtbDVMlymLyJZ8YpJ2ECS/CI7ViHcf81E8FL6vJp3wbpH1znEvdEtvytvLlDoI0sqwOO8fd9TVOTbevjElDWrEOBWBfu8nRZKUChjBpGdJBd4zAG7brFzrbn/3HID4eN4dJK9Ok6xtketY7fSt0dcg2FF53oTB7e63ZeQu9+5c9+CI1D7vH8dA3pVHavP6kaUiFO9WZHZ42Lvkq32fBSgpEafMGQZp2xxjkFAk8joe2rvlaS61aJMqT16+0DY+HCMCveGj/nm/Mq6GKRXnyzQnSNvwaIgB98NAhJlchNbmViPLm9C1tQ58QAZiKh05yuQqpGb5ElDenb2kbpoYIQBoPHWdzFVLLXIkob07f0jakQwRgEx57fNkjtgBI27A5RACW43H4931iGwLSNiwPEYCZeJyqOSCmSVDahpkhAjAMj8vbDo9tGZS2YViIAPyMx0P9Jsa2EZK24ZcQAXgpSzcNthXOM7xeChGA2/HoPX+FChP8MCSTtuH2EAE4Ao/1DY3Rrl94BQ5wHJZJsy6jTXOOcCEAFuJx3j9DVaigJk3DIhcKew3+3KCpwQMgTcPfIQPwoJm0ggdAmoYHXSjsPNAYRdGB3/YOVnlpSTPs+M9zLXZnj/HBAiAtQ8qFBngbj46zlwYLgLQMb8cRgLPsMDjih74Vr7w0snT/s1wcAOPxeH5w5VcDaRhSLi6Ax/CYsqqu4gGYvCqN4bE4A7APUI/HRa0r9/OYfBukvY+LE6A1Ht9Pml+xAMi3obWLG+BaPNL1jZG5JyyLyad805zrkhCArYHFeDwzaErZA/D0wCkYFkvbJQF7R7AgvZHd7JG2BSZf8zM+DS+5pADsCdThcV+vVNkCcG/Gl6FOmi5JAB/kv9EtzSZmfBk+cEkDOBRowOPWzqNbXHn5MDRIyyURe2E6eNHqFgdAPgw/u6QCnILhavvjaRF2VSavRRouyQCd8BiyuPReoLyGTi7pAGdjuLHjqKIrrzxZOMdVA0ArPMYvX1d0AMZl8hhauWoBOAFoxOOenoXfGCmtoUk+XTUBfI/H3HUb8v6ULlMapTX84KoN4DBgMx4vDZmWNwBKY5CPw101ArxrT4q5rs30zZ745MNVK8BuwDI8fpy8YIsB0DeD8u7mqhngfpoTnd9qKLbyeqdveCivq3aA/wNj8Ri1dA07e5XXs94ZlOf/rhYALsTD/sFSzxblcbUE8Aceazc3REf+2BeZnvFQWldrAAeo3ubXpE0yPJRGaV0tAjxIfh50tYaZEIexZYYqjatlgCOBWRj0Tt/cfwFgf+BHYK5Mz3rnYuBfL+mM2UqtTGQAAAAASUVORK5CYII=" width="24"></li><li class="MuiButtonBase-root MuiListItem-root MuiMenuItem-root MuiMenuItem-gutters MuiListItem-gutters MuiListItem-button" tabindex="-1" role="option" aria-disabled="false" style="padding-left: 8px; padding-right: 8px;" title="brown pin" data-value="brown-pin.png"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAE2klEQVR4AeWaA5AkyRvF84+zbdu2bdu2zbm1jmvbtm3btr07Vv/u3jE7o4fbk1U994vIiIqqzO/l9xKFbuML4BTgY6ANMAxYACSr6FjndE11VNeUBoDDgfLALIqO2pRXjERMfF+gDJDMrqMYZRQzUZJ/GFhP/Fmv2GFO/D9AGSBCDHKysyILp4ykV/2yNPnmWaq/dTsVnrhQRcc6p2uojuoSm4g0pBW25PcCOhKD5G2bIj3rlaHikxeR9MDphSqqqzZqS2w6SjNMI98R3BHPjAxuU53yj1+gpIpV1FYxFCu2CSGYCUCZWKPe4LPHlERcimLlMRvKhGHDi2Cxftl8fnj5OnU8rkUxFdtB2g8Heatb7468m3y8TYgxE9arL0FPfa1TZ9qXTJFGjD2hTBBPeMlYaLNSB30UaTkke31iBCq4U7+wu33Nd+9mTI9mbFi5iIy0FBUd65yuFfruEGMplDe+cJ/tdc8uqNNlHzmH8X1akZubSx7omuqoboHxpOkwy9tbnfuEV9BDjhJaMmMshUR1CzRBmtImmlN8GPAxFnp0LWi0NKpFRG0KjCtth499GNAGCz2/F7TmNbWLiNoUuCdI26GNDwOGYaGXmPw6qc2tmKhtvrGl7TDMhwELsNCbXH6d1A5fTNQ239jSdljgw4BkLPQ6m18ndZsrJmqbb2xpLine truncated
$Icons.find('li').each((iKey, sElem)=>{
var $Elem = $(sElem);
asIcons[$Elem.attr('data-value')] = {'title': $Elem.attr('title'), 'src':$Elem.find('img').attr('src')};
});
//Background
$Background = $('<div>', {'aria-hidden':'true', 'style':'position: fixed; inset: 0px; background-color: transparent;'}).click(function(){toggleSelector(false);});
//Build Icon Selector
$Selector = $('<div>', {
'class':'MuiPaper-root MuiMenu-paper MuiPopover-paper MuiPaper-elevation8 MuiPaper-rounded',
'style':'z-index: 1300; opacity: 1; transform: none; min-width: 52px; transition: opacity 100ms cubic-bezier(0.4, 0, 0.2, 1) 0ms, transform 67ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; transform-origin: 0px 0px 0px;'
})
.append($('<ul>', {
'class':'MuiList-root MuiMenu-list MuiList-padding',
'role':'listbox',
'tabindex':'-1',
'style':'display: flex; flex-wrap: wrap; width: 480px; flex-grow: 1;'
}));
$.each(asIcons, function(sIcon, asAttr) {
$Selector.find('ul').append(
$('<li>', {
'class': 'MuiButtonBase-root MuiListItem-root MuiMenuItem-root MuiMenuItem-gutters MuiListItem-gutters MuiListItem-button',
'tabindex': '-1',
'role': 'option',
'style': 'padding-left: 8px; padding-right: 8px;',
'title': asAttr.title,
'data-value': sIcon
})
.click(setIcon)
.append(
$('<img>', {'src': asAttr.src, 'width': '24'})
)
);
});
//Add Selector & background to DOM
$Selector.add($Background).hide().appendTo('body');
//waypoints
asWaypoints = {};
$.ajax({url:'https://www.gaiagps.com/api/objects/waypoint/?routepoints=false&show_archived=true&show_filed=true'}).done((asData) => {
for(var i in asData) {
asWaypoints[asData[i].id] = asData[i];
}
setTimeout(init, 2000);
});
//Icon Button for mass update
$MassUpdate = $('<button>', {'type':'button', 'class':'ga-button ga-button-flat ga-toolbar-button', 'disabled':'disabled'})
.data('waypoint-id', 'mass')
.click(function(){toggleSelector(true, $(this));})
.append($('<i>', {'class':'material-icons ibmid'}).text(''))
.append(' ')
.append($('<span>', {'class':'ibmid ga-toolbar-button-text'}).text('Icon'));
$('#DatasummaryController .ga-toolbar .ga-toolbar-left .ga-button').eq(1).after($MassUpdate);