// ==UserScript==
// @name WME Export Trajet
// @name:fr WME Export Trajet
// @version 0.7
// @description Export GPS point of your drives.
// @description:fr Export des coordonée GPS de vos trajet.
// @include https://www.waze.com/editor/*
// @include https://www.waze.com/*/editor/*
// @include https://editor-beta.waze.com/*
// @exclude https://www.waze.com/user/*
// @namespace https://greasyfork.org/fr/scripts/14832-wme-export-trajet
// @author seb-d59
// @copyright seb-d59 - 2015
// ==/UserScript==
var WMEExpT_Version = 0.7;
var WMEExpT_Name = "WME Export Trajet";
var WMEExpT = {};
var icon_export="iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAYAAACOEfKtAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3wgBFAggT+iJkgAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAADUklEQVR42u2dTWsTURSGn5lOrEoJVYsff0AqUhHEreBW40IR/FiJKze6cV2NuhFdiFgQXLgQf0ARXIk7t3UhLYp/QBTFEksbmibjYk4kxHSMucn96JwXhtAmTU6fOfecc++cuYmwoxIQ459aQMPkDSILRk4CN4EZDwEuAQ+BZTxVCbgH/ACaHh4/gUdykr3UODAvxqaeHkYQY1STwBXg9iAQEwcG14AFYMXBZ1c2ifttiAB3/icmugC4AFwWI1OLoeRlF7waUDaF6ALgihhXd1CydOo5cNUUoqsYmDr63E6I0wKxZhITi5xEGsB9U4hFz8LLMlQHhqhljCFEBWgIUQEaQlSAhhAVoCHEpMCgJoBdspjQrTUpccgptleBapEBHpPpXd6cvJQzYzkMxEUGWAZO9vG6U3klYJEBDpIDWt1/U5Qk0iJbvq8N+42L4oENsmsfMNi1mRjYAM4UFWC7PKkOOOrGgRdF9sBOT3QaRFUKUAEqQAWoUoAKUAH2rW3ADux0km05gBGwBzgnj5ECHGwadR64AUz5BjEEgBGwl2xR87pvEENJIjFwwEeIIWVhLyGOejVmA7jI8DqxOiECPAG+465ZaeQA273Io/JE5xCTnMA9JsZGjkfIPmB7DsQImAO+uYDYC+AYWe9cBTgC7HQIMQH2AwdzPPGaQL4FfLUNMenhedPAXeAE2fVP14km/sdzU8AF+XnWticmPbyvIvCmAsrQZeCseOBjiYlOzm4sw2UiwHn9buAScBqL13q6AbaAz7i5BcFU68Ai8H4Emb9vgE3gNfBOhsFGIPDqwBuJ3R9dxsBUDJjtysKuEsmYZNhDYkcevCrwwfZJTzYpfpeAT/IPuJ4pzQBPgaO+wcsrpFMxxvUQXpfMWvcRXmiLCd7BswGw1+2ur+T3wcML0QO9gmdjNWaYWgXe+gQvJIBrHXWeN/BCAdiUwn7eN3ghAEzJGiOfAV9sTtG2kgf+kiP10bgQAKY+G6e9MQpQASpABahSgApQASpAlQJUgApQAaoUoAIMSC7WA/M2vPFVk2zSseYCYD8b3vimCeB4rxHrAmC/G94EEe4Sn4zRJPK3RrbhjWPVyJo5W6P2QNMNb3zVIvAAaNi6faHE1iqZ/nyNxm/UEhZ+/DhJcwAAAABJRU5ErkJggg==";
var lang={};
WMEExpT.Trajets = {'list': {},'objects':{}};
var resultRequest={};
var debug=true;
// *********************
// ** HELPER FUNCTION **
// *********************
function log(msg, obj)
{
if (obj === undefined)
console.log(WMEExpT_Name + " v" + WMEExpT_Version + " - " + msg);
else if (debug)
console.debug(WMEExpT_Name + " v" + WMEExpT_Version + " - " + msg + " " ,obj);
}
function getId(node) {
return document.getElementById(node);
}
function getElementsByClassName(classname, node) {
node || (node = document.getElementsByTagName("body")[0]);
for (var a = [], re = new RegExp("\\b" + classname + "\\b"), els = node.getElementsByTagName("*"), i = 0, j = els.length;i < j;i++) {
re.test(els[i].className) && a.push(els[i]);
}
return a;
}
function getFunctionWithArgs(func, args) {
return (
function () {
var json_args = JSON.stringify(args);
return function() {
var args = JSON.parse(json_args);
func.apply(this, args);
};
}
)();
}
// *************
// ** INIT **
// *************
function WMEExpT_bootstrap() {
if (typeof unsafeWindow === "undefined") {
unsafeWindow = ( function () {
var dummyElem = document.createElement('p');
dummyElem.setAttribute('onclick', 'return window;');
return dummyElem.onclick();
}) ();
}
/* begin running the code! */
log("starting");
WMEExpT_init();
}
function WMEExpT_init(){
// Waze object needed
/*
WMEExpTWaze = unsafeWindow.Waze;
if(typeof(WMEExpTWaze) === 'undefined'){
if (debug) { console.error("WME Export Trajet - WMEExpTWaze : NOK"); }
window.setTimeout(WMEExpT_init, 500);
return;
}
WMEExpTMap = WMEExpTWaze.map;
if(typeof(WMEExpTMap) === 'undefined'){
if (debug) { console.error("WME Export Trajet - WMEExpTmap : NOK"); }
window.setTimeout(WMEExpT_init, 500);
return;
}
WMEExpTModel = WMEExpTWaze.model;
if(typeof(WMEExpTModel) === 'undefined'){
if (debug) { console.error("WME Export Trajet - WMEExpTModel DOM : NOK"); }
window.setTimeout(WMEExpT_init, 500);
return;
}
// OpenLayers
WMEExpTOpenLayers = unsafeWindow.OpenLayers;
if(typeof(WMEExpTOpenLayers) === 'undefined'){
if (debug) { console.error("WME Export Trajet - OpenLayers : NOK"); }
window.setTimeout(WMEExpT_init, 500);
return;
}
*/
// Traductions
WMEExpTI18n = unsafeWindow.I18n.locale;
if(typeof(WMEExpTI18n) === 'undefined'){
if (debug) { console.error("WME Export Trajet - WMEExpTI18n : NOK"); }
setTimeout(WMEExpT_init, 500);
return;
}
// Waze GUI needed
WMEExpT_userInfo = getId("user-info");
if(typeof(WMEExpT_userInfo) === 'undefined'){
if (debug) { console.error("WME Export Trajet - WMEExpT_userInfo : NOK"); }
setTimeout(WMEExpT_init, 500);
return;
}
WMEExpT_navTabs = getElementsByClassName("nav-tabs", WMEExpT_userInfo)[0];
if(typeof(WMEExpT_navTabs) === 'undefined'){
if (debug) { console.error("WME Export Trajet - WMEExpT_navTabs : NOK"); }
setTimeout(WMEExpT_init, 500);
return;
}
WMEExpT_tabContent = getElementsByClassName("tab-content", WMEExpT_userInfo)[0];
if(typeof(WMEExpT_tabContent) === 'undefined'){
if (debug) { console.error("WME Export Trajet - WMEExpT_tabContent : NOK"); }
setTimeout(WMEExpT_init, 500);
return;
}
WMEExpTDrives = getId("sidepanel-drives");
if(typeof(WMEExpTDrives) === 'undefined'){
if (debug) { console.error("WME Export Trajet - WMEExpTDrives : NOK"); }
setTimeout(WMEExpT_Main, 1000);
return;
}
/*
if (typeof(localStorage.WMEExportTrajets) !== "undefined") {
localStorage.removeItem("WMEExportTrajets");
}
if (typeof(sessionStorage.WMEExportTrajets) !== "undefined") {
sessionStorage.removeItem("WMEExportTrajets");
}
*/
//======================================================
// Translation
if (WMEExpTI18n == "fr") {
lang = new Array("Export","Selectionnez le trajet");
}
else {
lang = new Array("Export","Select the Drive");
}
log("init ok");
// Then running
WMEExpT_css();
}
// *************
// ** HTML **
// *************
function WMEExpT_css() {
var Scss = document.createElement("style");
Scss.type = "text/css";
var css =".CSETcontent {width:260px; margin-left:10px; box-shadow: 0 4px 10px #aaa;}";
css +=".divl {float:left; text-align:center;}";
css +=".divr {float:right; text-align:center;}";
css +="#export {width:35px; height:22px;}";
Scss.innerHTML = css;
document.body.appendChild(Scss);
log('CSS Ok');
WMEExpT_html();
}
function WMEExpT_html() {
var addon= document.createElement('div', "ExpT-cotent");
var content = "<div style='float:left; margin-left:5px;'><b><a href='https://greasyfork.org/fr/scripts/14832-wme-export-trajet' target='_blank'><u>"+ WMEExpT_Name +"</u></a></b> v"+ WMEExpT_Version +"</div><br>";
content += "<div style='clear:both; padding-top:10px;'></div><div class='CSETcontent' >";
content += "<div class='divl' style='width:240px; text-align:left;'><select id='selectTrajet' style='width:200px;'>";
content +="<option value='0' id='0'>"+lang[1]+"</option>";
content +="</select></div>";
content += "<div class='divr' style='width:20px;'><a href='#' id='exportTrajet'><img style='width:20px;' title='"+ lang[0] +"' src='data:image/png;base64,"+ icon_export +"' /></a></div></div>";
addon.innerHTML = content;
WMEExpTDrives.appendChild(addon);
getId('selectTrajet').onfocus = updateTrajetsList;
getId('selectTrajet').onchange = ExpTrajet;
log('html Ok');
}
function updateTrajetsList()
{
var available_Trajets = getElementsByClassName('result session session-available');
if(typeof(available_Trajets) === 'undefined'){
if (debug) { console.error("WME Export Trajet - available_Trajets : NOK"); }
return;
}
var selectTrajet = getId('selectTrajet');
selectTrajet.options.length = 1;
for (var i=0;i<available_Trajets.length;i++){
var trajetID= available_Trajets[i]['dataset'].id;
var trajetDetail = available_Trajets[i].childNodes[1].childNodes[0].textContent;
WMEExpT.Trajets.list[trajetID] = trajetDetail.replace(/,/g,'');
var expTrOption = document.createElement('option');
var expTrText = document.createTextNode(WMEExpT.Trajets.list[trajetID]);
expTrOption.setAttribute('value','0');
expTrOption.setAttribute('id', trajetID);
expTrOption.appendChild(expTrText);
selectTrajet.appendChild(expTrOption);
}
log('updateTrajetsList Ok');
}
function ExpTrajet() {
var selectTrajet = getId('selectTrajet');
if (selectTrajet.selectedIndex <= 0)
return;
id = selectTrajet.options[selectTrajet.selectedIndex].id;
if (id <= 0)
return;
if (!WMEExpT.Trajets.objects.hasOwnProperty(id)) {
var url = "https://www.waze.com/row-Descartes-live/app/Archive/Session?id="+id;
RequestObject = window.ActiveXObject
// ? new ActiveXObject("Microsoft.XMLHTTP")
? new ActiveXObject("Msxml2.XMLHTTP")
: new XMLHttpRequest();
RequestObject.onreadystatechange = function()
{
if(RequestObject.readyState == 4) {
resultRequest={};
resultRequest = JSON.parse(RequestObject.responseText);
WMEExpT.Trajets.objects[id] = resultRequest.archiveSessions.objects[0];
log('New data download link ok: '+ WMEExpT.Trajets.list[id]+'; id= '+ id);
generateFile();
}
};
RequestObject.open("GET", url,false);
RequestObject.send(null);
}else {
log('data download link ok: '+ WMEExpT.Trajets.list[id]+'; id= '+ id);
log('WMEExpT.Trajets.objects[id].gpx',WMEExpT.Trajets.objects[id].gpx);
getId('exportTrajet').setAttribute('download', WMEExpT.Trajets.list[id]+ '.gpx');
getId('exportTrajet').href='data:Application/octet-stream,' + encodeURIComponent(WMEExpT.Trajets.objects[id].gpx);
}
}
function generateFile(){
var entete = '<?xml version="1.0" encoding="UTF-8"?>\n<gpx xmlns="http://www.topografix.com/GPX/1/1" version="1.1" creator="seb-d59" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">\n';
entete += '<trk>\n';
var contenu = document.createElement('contenu');
contenu.id='Détail_'+id;
contenu.innerHTML = WMEExpT.Trajets.objects[id].data;
log('contenu',contenu);
var roadName = contenu.getElementsByTagName("MYNS:NAME");
log(roadName[0].textContent +' vers '+ roadName[roadName.length-1].textContent);
var nameIti = '<name>'+ roadName[0].textContent +' vers '+ roadName[roadName.length-1].textContent +'</name>\n<trkseg>\n';
var child = contenu.childNodes[2].childNodes;
//log('child',child);
//************************************************//
// Sens de déplacement: //
// si direction="1" => node A -> B //
// si direction="2" => node B -> A //
//************************************************//
//************************************************//
// Format du Fichier:
//
// <gpx .......>
// <trk>
// <name>Test Traces</name>
// <trkseg>
// <trkpt lat="..." lon="...">
// </trkpt>
// .....
// <trkpt lat="..." lon="...">
// </trkpt>
// </trkseg>
// </trk>
// </gpx>
//
//***********************************************//
var traitementlonlat=[];
for (var i=3; i<child.length; i=i+2){
traitementlonlat.push(child[i].childNodes[1].childNodes[3].childNodes[1].childNodes[1].textContent);
}
//log('traitementlonlat',traitementlonlat);
var lonlat=[];
for (i=0; i < traitementlonlat.length; i++){
//log('traitementlonlat['+i+'] = ' + traitementlonlat[i]);
if (traitementlonlat[i] !== undefined) traitementlonlat[i] = traitementlonlat[i].split(" ");
}
//log('traitementlonlat après split',traitementlonlat);
for (i=0; i < traitementlonlat.length; i++){
for (j=0; j < traitementlonlat[i].length; j++){
if ((traitementlonlat[i][j] != "\n") & (traitementlonlat[i][j] != "")) lonlat.push(traitementlonlat[i][j].split(","));
}
}
var lonlatText = "";
log('lonlat',lonlat);
for (i=0; i<lonlat.length;i++){
lonlatText += '<trkpt lon="' + lonlat[i][0] +'" lat="'+ lonlat[i][1] +'"></trkpt>\n';
}
var end = '</trkseg>\n</trk>\n</gpx>';
WMEExpT.Trajets.objects[id].gpx = entete + nameIti + lonlatText + end;
log('WMEExpT.Trajets.objects[id].gpx',WMEExpT.Trajets.objects[id].gpx);
getId('exportTrajet').setAttribute('download', WMEExpT.Trajets.list[id]+ '.gpx');
getId('exportTrajet').href='data:Application/octet-stream,' + encodeURIComponent(WMEExpT.Trajets.objects[id].gpx);
}
/* begin running the code! */
WMEExpT_bootstrap ();