WME Export Trajet

Export GPS point of your drives.

当前为 2015-12-13 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==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://greasyfork.org/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://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    ();