WME Export Trajet

Export GPS point of your drives.

Versão de: 16/12/2015. Veja: a última versão.

Você precisará instalar uma extensão como Tampermonkey, Greasemonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Userscripts para instalar este script.

Você precisará instalar uma extensão como o Tampermonkey para instalar este script.

Você precisará instalar um gerenciador de scripts de usuário para instalar este script.

(Eu já tenho um gerenciador de scripts de usuário, me deixe instalá-lo!)

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

(Eu já possuo um gerenciador de estilos de usuário, me deixar fazer a instalação!)

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