WME Export Trajet

Export GPS point of your drives.

Per 13-12-2015. Zie de nieuwste versie.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey, Greasemonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Userscripts.

Voor het installeren van scripts heb je een extensie nodig, zoals {tampermonkey_link:Tampermonkey}.

Voor het installeren van scripts heb je een gebruikersscriptbeheerder nodig.

(Ik heb al een user script manager, laat me het downloaden!)

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

(Ik heb al een beheerder - laat me doorgaan met de installatie!)

// ==UserScript==
// @name             WME Export Trajet
// @name:fr          WME Export Trajet
// @version          0.6
// @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/*
// @namespace        https://greatest.deepsurf.us/fr/scripts/14832-wme-export-trajet
// @author           seb-d59
// @copyright        seb-d59 - 2015
// ==/UserScript==


var WMEExpT_Version = 0.6;
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://greatest.deepsurf.us/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    ();