WME Map Tiles Update

Show the last server update and different times

当前为 2017-11-06 提交的版本,查看 最新版本

// ==UserScript==
// @name         WME Map Tiles Update
// @version      1.29
// @description  Show the last server update and different times
// @namespace    Sebiseba
// @copyright    Sebiseba 2014-2016
// @include      https://www.waze.com/editor*
// @include      https://www.waze.com/*/editor*
// @include      https://beta.waze.com/*
// @exclude      https://www.waze.com/user/*editor/*
// @exclude      https://www.waze.com/*/user/*editor/*
// @connect      status.waze.com
// @connect      status-il.waze.com
// @connect      maps.googleapis.com
// @grant        GM_xmlhttpRequest
// @grant        unsafeWindow
// ==/UserScript==
/* jshint -W097 */
'use strict';
/***
Thanks
   Translations :
   Brazilian Portuguese by fsmallmann
   Hebrew by gad_m
***/
// **********************************
// **  DOWNLOAD HELPER BY DUMMYD2  **
// **********************************
/******** AUTO INJECTED PART ***************/
function MTUdownloadHelperInjected() {
  window.MTUDownloadHelper = {
    jobs: [
    ],
    _waitForData: function (id)
    {
      if (this.jobs.length <= id) {
        this.jobs[id].callback({
          url: null,
          data: null,
          callback: this.jobs[id].callback,
          status: 'error',
          error: 'Request not found'
        });
      } 
      else
      {
        if (this.jobs[id].status == 'success' || this.jobs[id].status == 'error')
        this.jobs[id].callback(this.jobs[id]);
         else
        {
          if (this.jobs[id].status == 'downloading' && this.jobs[id].progressCallback) {
            this.jobs[id].progressCallback(this.jobs[id]);
          }
          var _this = this;
          window.setTimeout(function () {
            _this._waitForData(id);
          }, 500);
        }
      }
    },
    add: function (params, callback, progressCallback)
    {
      this.jobs.push({
        params: params,
        data: null,
        callback: callback,
        progressCallback: progressCallback,
        status: 'added',
        progression: 0,
        error: ''
      });
      var id = this.jobs.length - 1;
      var _this = this;
      window.setTimeout(function () {
        _this._waitForData(id);
      }, 500);
    }
  };
}
var MTUdownloadHelperInjectedScript = document.createElement('script');
MTUdownloadHelperInjectedScript.textContent = '' + MTUdownloadHelperInjected.toString() + ' \n' + 'MTUdownloadHelperInjected();';
MTUdownloadHelperInjectedScript.setAttribute('type', 'application/javascript');
document.body.appendChild(MTUdownloadHelperInjectedScript);
/******** SANDBOX PART ***************/
function MTUlookFordownloadHelperJob() {
  for (var i = 0; i < unsafeWindow.MTUDownloadHelper.jobs.length; i++) {
    if (unsafeWindow.MTUDownloadHelper.jobs[i].status == 'added') {
      unsafeWindow.MTUDownloadHelper.jobs[i].status = cloneInto('downloading', unsafeWindow.MTUDownloadHelper.jobs[i]);
      var f = function () {
        var job = i;
        GM_xmlhttpRequest({
          method: unsafeWindow.MTUDownloadHelper.jobs[job].params.method,
          headers: unsafeWindow.MTUDownloadHelper.jobs[job].params.headers,
          data: unsafeWindow.MTUDownloadHelper.jobs[job].params.data,
          synchronous: false,
          timeout: 3000,
          url: unsafeWindow.MTUDownloadHelper.jobs[job].params.url,
          //job: i,
          onerror: function (r) {
            unsafeWindow.MTUDownloadHelper.jobs[job].status = cloneInto('error', unsafeWindow.MTUDownloadHelper.jobs[job]);
          },
          ontimeout: function (r) {
            unsafeWindow.MTUDownloadHelper.jobs[job].status = cloneInto('error', unsafeWindow.MTUDownloadHelper.jobs[job]);
          },
          onload: function (r) {
            unsafeWindow.MTUDownloadHelper.jobs[job].status = cloneInto('success', unsafeWindow.MTUDownloadHelper.jobs[job]);
            unsafeWindow.MTUDownloadHelper.jobs[job].data = cloneInto(r.responseText, unsafeWindow.MTUDownloadHelper.jobs[job]);
          },
          onprogress: function (r) {
            unsafeWindow.MTUDownloadHelper.jobs[job].progression = cloneInto(r.total == 0 ? 0 : (r.loaded / r.total), unsafeWindow.MTUDownloadHelper.jobs[job]);
          }
        });
      }();
    }
  }
  window.setTimeout(MTUlookFordownloadHelperJob, 2000);
}
window.setTimeout(MTUlookFordownloadHelperJob);
/*******************/
function run_MTU() {
  var WME_MUpdate_Version = '1.29',
  lang,
  MTUhandle,
  MTUenv,
  MTULang,
  userLang,
  timermaphours,
  timerupd,
  tz,
  timestamp,
  whendate,
  whentimeutc,
  whentimeloc,
  dw,
  debug = '';
  var icon_info = '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';
  var icon_close = 'iVBORw0KGgoAAAANSUhEUgAAAAsAAAALCAYAAACprHcmAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAABbSURBVHjajJBLFsAgCAOB5724OjmZXbUvxWjLys+MQryqpv2sYWaWmf4FApjBmx10rx84M70LACb/GnzJQgcXmAU1R6geVUsLzC8qIXbDKOGVhoqOz8cp417XAOaUPpt0thLzAAAAAElFTkSuQmCC';
  function getId(node) {
    return document.getElementById(node);
  }
  function getElementsByClassName(classname, node) {
    if (!node) node = document.getElementsByTagName('body') [0];
    var a = [
    ];
    var re = new RegExp('\\b' + classname + '\\b');
    var els = node.getElementsByTagName('*');
    for (var i = 0, j = els.length; i < j; i++)
    if (re.test(els[i].className)) a.push(els[i]);
    return a;
  }
  function translate_server(lang) {
    var elt = '',
    trad = new Array('en', 'SERVER', 'en-GB', 'SERVER', 'es', 'SERVIDOR', 'es-419', 'SERVIDOR', 'fr', 'SERVEUR', 'it', 'SERVER', 'ru', 'сервер', 'ja', 'サーバー', 'he', 'שרת', 'de', 'SERVER', 'ro', 'SERVER', 'tr', 'SUNUCU', 'af', 'BEDIENER', 'cs', 'SERVER', 'ko', '서버', 'ms', 'SERVER', 'pl', 'SERWER', 'pt-BR', 'SERVIDOR', 'pt-PT', 'SERVIDOR', 'hu', 'SZERVER', 'nl', 'SERVER', 'sv', 'SERVER', 'no', 'SERVER', 'sk', 'SERVERA', 'da', 'SERVER', 'gl', 'GWEINYDDWR', 'lt', 'SERVERIS', 'zh', 'SERVER', 'bg', 'СЪРВЪРА', 'fi', 'SERVER', 'hr', 'SERVER'
    );
    var i = - 1;
    for (elt in trad) {
      i++;
      if (trad[elt] == lang) {
        return trad[i + 1];
      }
    }
    return 'SERVER';
  }
  function IsJsonString(str) {
    try {
      JSON.parse(str);
    } catch (e) {
      return false;
    }
    return true;
  }
  function pad(str) {
    str = str.toString();
    return str.length < 2 ? pad('0' + str, 2)  : str;
  }
  function toTimestamp(strDate) {
    var datum = Date.parse(strDate);
    return datum / 1000;
  }
  function checkTimestamp(strDate) {
    if (timestamp < strDate) {
      return '#f00';
    } 
    else {
      return '#3a0';
    }
  }
  function MTUinit() {
    if (typeof (Waze.location) === 'undefined') {
      window.setTimeout(MTUinit, 500);
      return;
    }
    if (typeof (Waze.Config.api_base) === 'undefined') {
      setTimeout(MTUinit, 500);
      return;
    }
    if (typeof (I18n) === 'undefined') {
      setTimeout(MTUinit, 500);
      return;
    }
    MTUhandle = getElementsByClassName('olControlPanZoomBar') [0];
    if (!MTUhandle) {
      setTimeout(MTUinit, 1000);
      return;
    } // Detect Country Server (World/US/Israel)

    MTUenv = Waze.location.code;
    if (debug) {
      console.info('WME Map Tiles Update - Serveur : ' + MTUenv);
    } //    Then running

    if (!localStorage.getItem('MTUlastupdate') || !IsJsonString(localStorage.getItem('MTUlastupdate'))) {
      localStorage.setItem('MTUlastupdate', '{"usa":"","row":"","il":""}');
    } // Translation

    MTULang = I18n.locale;
    if (debug) {
      console.info('WME Map Tiles Update - Langue: ' + MTULang);
    }
    html();
    Waze.selectionManager.events.register('selectionchanged', null, Check_MTU);
    //Check_MTU();
    setTimeout(Back_Info, 2000);
  }
  function html() {
    //CSS
    var cssElt = document.createElement('style');
    cssElt.type = 'text/css';
    var css = '#Info_div { z-index:10;width:25px;margin:0 auto;margin-top:18px; }';
    if (MTULang == 'he') {
      var float = 'right';
      css += '#Info_content {direction:rtl;}';
    } else {
      var float = 'left';
    }
    css += '.Info_title { clear:both;float:' + float + ';width:160px;padding-right:15px;line-height:22px; text-align:' + float + '; }';
    css += '.Info_data { float:' + float + '; }';
    css += '.Info_line { clear:both;float:' + float + ';height:1px;min-width:330px;background-color:#59899e; }';
    css += '#Info_server { z-index:10;float:' + float + ';width:22px;height:22px;background:url(data:image/png;base64,' + icon_info + ') no-repeat ' + float + ' top; }';
    css += '#Info_text { z-index:11;float:' + float + '; }';
    css += '#Info_close { z-index:11;float:right;width:11px;height:11px;margin-right:3px;background:url(data:image/png;base64,' + icon_close + ') no-repeat right top; }';
    css += '#lastupderr { clear:both;float:' + float + ';width:330px;color:#F23456;line-height:22px;}';
    css += '#Info_content { z-index:10;position:fixed;top:80px;margin-left:30px;line-height:22px;padding:8px 5px 5px 8px;color:white;background-color:rgba(0,0,0,0.7);border-radius:6px;display:none; }';
    cssElt.innerHTML = css;
    document.body.appendChild(cssElt);
    //HTML
    var div = document.createElement('div');
    div.id = 'Info_div';
    var divicon = document.createElement('div');
    divicon.id = 'Info_server';
    divicon.onmouseover = (function () {
      Back_Info();
      Show_Info_content();
    });
    divicon.onmouseout = (function () {
      getId('Info_content').style.display = 'none';
      divicon.style.opacity = '0.5';
      clearTimeout(timermaphours);
    });
    divicon.onclick = (function () {
      if (MTUenv === 'il') {
        window.open('https://status-il.waze.com/');
      } 
      else {
        window.open('https://status.waze.com/');
      }
    });
    div.appendChild(divicon);
    var divinfo = document.createElement('div');
    divinfo.id = 'Info_content';
    div.appendChild(divinfo);
    var divtext = document.createElement('div');
    divtext.id = 'Info_text';
    switch (MTULang) {
      case 'fr':
        userLang = new Array('Mis &agrave; jour jusqu\'au', 'Fait le', 'Dernier problème', 'Heure locale', 'Heure carte', 'Heure UTC', 'local');
        break;
      case 'pt-BR':
        userLang = new Array('Dados de', 'Efetuado em', 'Última problema', 'Hora local', 'Hora mapa', 'Hora UTC', 'local');
        break;
      case 'he':
        userLang = new Array('עדכון אחרון', 'בוצע', 'בעיה אחרונה', 'זמן מקומי', 'זמן מפה', 'זמן UTC', 'מקומי');
        break;
      default:
        userLang = new Array('Last update', 'Performed', 'Last problem', 'Home time', 'Map time', 'UTC time', 'home');
        break;
    }
    var content = '<div class=\'Info_title\'>' + translate_server(MTULang) + ' :</div><div class=\'Info_data\'><b>' + I18n.translations[MTULang].envs[MTUenv] + '</b></div>';
    content += '<div class=\'Info_title\'>' + userLang[0] + ' :</div><div class=\'Info_data\' style=\'color:#93C4D3;\' id=\'lastdate\'></div>';
    content += '<div class=\'Info_title\'>&nbsp;</div><div class=\'Info_data\' style=\'color:#59899e;\' id=\'lasttimeutc\'></div>';
    content += '<div class=\'Info_title\'>' + userLang[1] + ' :</div><div class=\'Info_data\' style=\'color:#93C4D3;\' id=\'whendate\'></div>';
    content += '<div class=\'Info_title\'>&nbsp;</div><div class=\'Info_data\' style=\'color:#59899e;\' id=\'whentimeutc\'></div>';
    content += '<div class=\'Info_line\'></div><div id=\'mtuerror\'>';
    content += '<div class=\'Info_title\'>' + userLang[2] + ' :</div><div class=\'Info_data\' style=\'color:#F23456;\' id=\'probdate\'></div>';
    content += '<div id=\'lastupderr\'></div>';
    content += '<div class=\'Info_line\'></div></div>';
    content += '<div class=\'Info_title\'>' + userLang[5] + ' :</div><div class=\'Info_data\' style=\'color:#93C4D3;font-weight:bold;\' id=\'utchours\'></div>';
    content += '<div class=\'Info_title\'>' + userLang[3] + ' :</div><div class=\'Info_data\' style=\'color:#93C4D3;font-weight:bold;\' id=\'localhours\'></div>';
    content += '<div class=\'Info_title\'>' + userLang[4] + ' :</div><div class=\'Info_data\' style=\'color:#93C4D3;font-weight:bold;\' id=\'maphours\'></div>';
    content += '<div id=\'tzname\' style=\'color:#59899e;font-weight:bold;font-size:10px;float:' + float + ';padding:0 5px;\'></div>';
    divtext.innerHTML = content;
    divinfo.appendChild(divtext);
    var divclose = document.createElement('div');
    divclose.id = 'Info_close';
    divclose.onclick = (function () {
      divinfo.style.backgroundColor = 'rgba(' + [0,
      0,
      0,
      0.7].join(',') + ')';
      divinfo.style.display = 'none';
      divicon.style.opacity = '0.5';
    });
    divinfo.appendChild(divclose);
    MTUhandle.appendChild(div);
    if (debug) {
      console.log('WME Map Tiles Update - HTML OK');
  }
}
function Show_Info_content() {
  getId('Info_content').style.display = 'block';
  getId('Info_server').style.opacity = '1';
  if (getComputedStyle(getElementsByClassName('olControlPanZoomBar') [0]).getPropertyValue('left') === '10px') {
    getId('Info_content').style.left = '350px';
    getId('Info_content').style.right = '';
  } else {
    getId('Info_content').style.right = '50px';
    getId('Info_content').style.left = '';
  }
}
function Back_Info() {
  try {
    if (MTUenv == 'il') {
      var url = 'https://status-il.waze.com/feeds/posts/default';
    } 
    else {
      var url = 'https://status.waze.com/feeds/posts/default';
    }
    var params = {
      url: url,
      headers: {
        'User-Agent': 'Mozilla/5.0',
        'Accept': 'text/plain'
      },
      data: null,
      method: 'GET'
    };
    MTUDownloadHelper.add(params, function (data) {
      if (debug) {
        console.log('MTU - Data from ', MTUenv, url, data);
      }
      if (data && data.status == 'success') {
        // Get XML data
        var parser = new DOMParser(),
        whenupdate,
        lastupdate,
        probDate,
        probReason;
        var xml = parser.parseFromString(data.data, 'text/xml');
        var items = xml.getElementsByTagName('entry');
        for (var i = 0; i < items.length; i++) {
          var title = items[i].getElementsByTagName('title') [0].innerHTML;
          var pubdate = items[i].getElementsByTagName('published') [0].innerHTML;
          var category = title.split(' ');
          if (!probReason && category[0] != 'INTL' && category[0] != 'NA' && category[0] != 'ISRAEL') {
            probDate = pubdate;
            probReason = title;
          }
          if (!whenupdate) {
            if (MTUenv == 'usa' && category[0] == 'NA' || MTUenv == 'row' && category[0] == 'INTL' || MTUenv == 'il' && category[0] == 'ISRAEL') {
              whenupdate = pubdate;
              lastupdate = title.substring(title.indexOf('successfully updated to:') + 25);
              break;
            }
          } else {
            break;
          }
        }
        if (debug) {
          console.log('MTU ' + category[0] + ' / ' + whenupdate + ' / ' + lastupdate + ' / ' + probDate + ' / ' + probReason);
        }
        var step = new Date().getTimezoneOffset() / 60;
        timestamp = toTimestamp(lastupdate) * 1000;
        // Update date
        var lastdate,
        a = lastupdate.split(' ');
        if (MTULang == 'fr') {
          lastdate = pad(a[1].replace(',', '')) + ' ' + a[0] + ' ' + a[2];
        } else {
          lastdate = a[0] + ' ' + pad(a[1].replace(',', '')) + ', ' + a[2];
        } // Update UTC Time

        var lasttimeutc = a[3] + ' ' + a[4];
        // Update local Time
        var lasttimeloc,
        b = a[3].split(':');
        var hb = parseInt(b[0]);
        if ((hb - step) < 10) {
          lasttimeloc = '0' + (hb - step) + ':' + b[1];
          var dd = '';
        } 
        else if ((hb - step) > 23) {
          if ((hb - step - 24) < 10) {
            lasttimeloc = '0' + (hb - step - 24) + ':' + b[1];
            var dd = ' (+1)';
          } 
          else {
            lasttimeloc = (hb - step - 24) + ':' + b[1];
            var dd = ' (+1)';
          }
        } 
        else {
          lasttimeloc = (hb - step) + ':' + b[1];
          var dd = '';
        }
        if (debug) {
          console.log('MTU dernier Update le ' + lastdate + ' à ' + lasttimeutc + ' / ' + lasttimeloc);
        } // Last  update

        convertDate(whenupdate, step);
        getId('lastdate').innerHTML = '<b>' + lastdate + '</b>';
        getId('whendate').innerHTML = '<b>' + whendate + '</b>';
        if (MTULang == 'he') {
          getId('lasttimeutc').innerHTML = dd + '<b>' + lasttimeloc + ' ' + userLang[6] + ' / ' + lasttimeutc + '</b>';
          getId('whentimeutc').innerHTML = dw + '<b>' + whentimeloc + ' ' + userLang[6] + ' / ' + whentimeutc + '</b>';
        } 
        else {
          getId('lasttimeutc').innerHTML = '<b>' + lasttimeutc + ' / ' + lasttimeloc + ' ' + userLang[6] + '</b>' + dd;
          getId('whentimeutc').innerHTML = '<b>' + whentimeutc + ' / ' + whentimeloc + ' ' + userLang[6] + '</b>' + dw;
        } // Problem message

        if (probDate) {
          convertDate(probDate, step);
          getId('mtuerror').style.display = 'block';
          getId('probdate').innerHTML = '<b>' + whendate + '</b>';
          getId('lastupderr').innerHTML = '<b>' + probReason + '</b>';
        } else {
          getId('mtuerror').style.display = 'none';
        } // If new update

        var checklast = JSON.parse(localStorage.getItem('MTUlastupdate'));
        if (checklast[MTUenv] != whenupdate) {
          getId('Info_content').style.backgroundColor = 'rgba(' + [25,
          50,
          0,
          0.7].join(',') + ')';
          Show_Info_content();
          checklast[MTUenv] = whenupdate;
          localStorage.setItem('MTUlastupdate', JSON.stringify(checklast));
          if (typeof (timerupd) != 'undefined') {
            clearTimeout(timerupd);
          }
        } else {
          timerupd = setTimeout(function () {
            getId('Info_content').style.backgroundColor = 'rgba(' + [0,
            0,
            0,
            0.7].join(',') + ')';
            getId('Info_content').style.display = 'none';
            getId('Info_server').style.opacity = '0.5';
            clearTimeout(timermaphours);
          }, 5000);
        }
      } 
      else {
        console.log('Error: ', data);
        getId('probdate').innerHTML = '<b>Error with datas</b>';
      }
    }, null);
  } 
  catch (e) {
    console.error('Error @ upload data:', e);
    getId('probdate').innerHTML = '<font color=\'red\'>Error width datas</font>';
  }
  gettimezone();
  setTimeout(Back_Info, 1000 * 60 * 30);
}
function Check_MTU() {
  try {
    var a = getElementsByClassName('additional-attributes list-unstyled side-panel-section') [0];
    if (typeof (a) === 'undefined') {
      return;
    }
    var so = Waze.selectionManager.selectedItems[0];
    if (so.model.attributes.residential) { // Special residential
      var createdOn = so.model.attributes.createdOn,
      domCreated = I18n.translations[MTULang].edit.created + ' ',
      cd = new Date(createdOn).toString();
      var updatedOn = so.model.attributes.updatedOn,
      domUpdated = I18n.translations[MTULang].edit.updated + ' ',
      ud = new Date(updatedOn).toString();
      var content = '<li>' + domCreated.replace('%{time}', '<font color="' + checkTimestamp(createdOn) + '"><b>' + cd.substring(0, cd.indexOf(' GMT')) + '</b></font>').replace('%{user}', 'Wazer') + '</li>';
      if (typeof (updatedOn) !== 'undefined') {
        content += '<li>' + domUpdated.replace('%{time}', '<font color="' + checkTimestamp(updatedOn) + '"><b>' + ud.substring(0, ud.indexOf(' GMT')) + '</b></font>').replace('%{user}', 'Wazer') + '</li>';
      }
      a.children[0].innerHTML = content + a.children[0].innerHTML;
    } 
    else if ((so.model.type === 'segment' || so.model.type === 'venue') && typeof (so.model.attributes.createdBy) !== 'undefined') {
      var createdOn = so.model.attributes.createdOn,
      createdBy = Waze.model.users.get(so.model.attributes.createdBy).userName,
      createdByRank = Waze.model.users.get(so.model.attributes.createdBy).normalizedLevel,
      domCreated = I18n.translations[MTULang].edit.created + ' ',
      cd = new Date(createdOn).toString();
      if (typeof (so.model.attributes.updatedBy) !== 'undefined') {
        var updatedOn = so.model.attributes.updatedOn,
        updatedBy = Waze.model.users.get(so.model.attributes.updatedBy).userName,
        updatedByRank = Waze.model.users.get(so.model.attributes.updatedBy).normalizedLevel,
        domUpdated = I18n.translations[MTULang].edit.updated + ' ',
        ud = new Date(updatedOn).toString();
      }
      if (so.model.type == 'segment') {
        var b = a.children[1].innerHTML,
        c = a.children[2].innerHTML; // segment
      } else {
        if (typeof (updatedOn) === 'undefined') {
          var b = null,
          c = a.children[0].innerHTML; // venue without update
        } else {
          var b = a.children[0].innerHTML,
          c = a.children[1].innerHTML; // venue
        }
      }
      if (so.model.type == 'segment') {
        a.children[2].innerHTML = domCreated.replace('%{time}', '<font color="' + checkTimestamp(createdOn) + '"><b>' + cd.substring(0, cd.indexOf(' GMT')) + '</b></font>').replace('%{user}', colorUser(createdBy, createdByRank));
        if (updatedOn) {
          a.children[1].innerHTML = domUpdated.replace('%{time}', '<font color="' + checkTimestamp(updatedOn) + '"><b>' + ud.substring(0, ud.indexOf(' GMT')) + '</b></font>').replace('%{user}', colorUser(updatedBy, updatedByRank));
        }
      } 
      else {
        if (typeof (updatedOn) === 'undefined') {
          a.children[0].innerHTML = domCreated.replace('%{time}', '<font color="' + checkTimestamp(createdOn) + '"><b>' + cd.substring(0, cd.indexOf(' GMT')) + '</b></font>').replace('%{user}', colorUser(createdBy, createdByRank));
        } else {
          a.children[1].innerHTML = domCreated.replace('%{time}', '<font color="' + checkTimestamp(createdOn) + '"><b>' + cd.substring(0, cd.indexOf(' GMT')) + '</b></font>').replace('%{user}', colorUser(createdBy, createdByRank));
        }
        if (updatedOn) {
          a.children[0].innerHTML = domUpdated.replace('%{time}', '<font color="' + checkTimestamp(updatedOn) + '"><b>' + ud.substring(0, ud.indexOf(' GMT')) + '</b></font>').replace('%{user}', colorUser(updatedBy, updatedByRank));
        }
      }
    } 
    else {
      return;
    }
  } 
  catch (e) {
    console.error('MTU Error @ catch data:', e);
  }
}
function gettimezone() {
  var a = getElementsByClassName('WazeControlPermalink') [0].innerHTML;
  var b = a.substring(a.indexOf('https')).split('?');
  var c = b[1].split(/"/g);
  var d = c[0].split('&amp;');
  for (var i = 0; d[i]; i++) {
    if (d[i].substring(0, 3) == 'lon') {
      var lon = d[i].substring(4);
    }
    if (d[i].substring(0, 3) == 'lat') {
      var lat = d[i].substring(4);
    }
  }
  try {
    if (debug) {
      console.log('MTU - url : https://maps.googleapis.com/maps/api/timezone/json?location=' + lat + ',' + lon + '&timestamp=' + Math.floor(new Date().getTime() / 1000) + '&language=' + MTULang);
    }
    var params = {
      url: 'https://maps.googleapis.com/maps/api/timezone/json?location=' + lat + ',' + lon + '&timestamp=' + Math.floor(new Date().getTime() / 1000) + '&language=' + MTULang,
      headers: {
        'User-Agent': 'Mozilla/5.0',
        'Accept': 'text/plain'
      },
      data: null,
      method: 'GET'
    };
    MTUDownloadHelper.add(params, function (data) {
      if (data.status == 'success') {
        var timezone = JSON.parse(data.data);
        tz = timezone.rawOffset * 1000 + timezone.dstOffset * 1000;
        if (debug) {
          console.log('MTU - Loading Time Zone Success');
        }
        getId('tzname').innerHTML = ' (' + timezone.timeZoneId.replace(/\_/g, ' ') + ')';
        maphours();
      }
    }, null);
  } 
  catch (e) {
    console.error('MTU Error @ upload data:', e);
  }
}
function convertDate(date, step) {
  var c = date.split('T');
  var d = c[0].split('-');
  if (MTULang == 'fr') {
    whendate = d[2] + ' ' + I18n.translations[MTULang].date.month_names[parseInt(d[1])] + ' ' + d[0];
  } 
  else {
    whendate = I18n.translations[MTULang].date.month_names[parseInt(d[1])] + ' ' + d[2] + ', ' + d[0];
  } // Publishing UTC Time

  var e = c[1].split('.');
  whentimeutc = e[0].substring(0, 5) + ' UTC';
  // Publishing local Time
  var b = e[0].split(':');
  var hb = parseInt(b[0]);
  if ((hb - step) < 10) {
    whentimeloc = '0' + (hb - step) + ':' + b[1];
    dw = '';
  } 
  else if ((hb - step) > 23) {
    if ((hb - step - 24) < 10) {
      whentimeloc = '0' + (hb - step - 24) + ':' + b[1];
      dw = ' (+1)';
    } 
    else {
      whentimeloc = (hb - step - 24) + ':' + b[1];
      dw = ' (+1)';
    }
  } 
  else {
    whentimeloc = (hb - step) + ':' + b[1];
    dw = '';
  }
  if (debug) {
    console.log('MTU Update le ' + whendate + ' à ' + whentimeutc + ' / ' + whentimeloc);
  }
  return;
}
function maphours() {
  //Local time
  var d = new Date();
  var h = pad(d.getHours());
  var m = pad(d.getMinutes());
  var s = pad(d.getSeconds());
  getId('localhours').innerHTML = h + ':' + m + ':' + s;
  //Map time
  var utc = d.getTime() + (d.getTimezoneOffset() * 60000);
  var dtz = utc + tz;
  var md = new Date(dtz);
  var mh = pad(md.getHours());
  var mm = pad(md.getMinutes());
  var ms = pad(md.getSeconds());
  getId('maphours').innerHTML = mh + ':' + mm + ':' + ms;
  // UTC Time
  var ud = new Date(utc);
  var uh = pad(ud.getHours());
  var um = pad(ud.getMinutes());
  var us = pad(ud.getSeconds());
  getId('utchours').innerHTML = uh + ':' + um + ':' + us;
  timermaphours = setTimeout(maphours, 1000);
}
function colorUser(editor, rank) {
  var user;
  if (/^(admin|avseu|WazeFeed|WazeParking1|waze-maint-bot|Waze3rdparty)/.test(editor)) {
    user = '<font color="red">' + editor + '(' + rank + ')</font>';
  } 
  else if (editor === 'Inactive User') {
    user = '<font color="grey">' + editor + '(' + rank + ')</font>';
  } 
  else if (typeof (editor) === 'undefined') {
    user = '<font color="grey">Wazer(' + rank + ')</font>';
  } 
  else {
    user = '<a target="_blank" href="https://www.waze.com/user/editor/' + editor + '">' + editor + '(' + rank + ')</a>';
  }
  return user;
}
console.log('WME Map Tiles Update - ' + WME_MUpdate_Version + ' starting');
MTUinit();
}
var MTUscript = document.createElement('script');
MTUscript.textContent = '' + run_MTU.toString() + ' \n' + 'run_MTU();';
MTUscript.setAttribute('type', 'application/javascript');
document.body.appendChild(MTUscript);

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址