Logtime Plus

https://github.com/pcluchet/logtime-plus

// ==UserScript==
// @name        Logtime Plus
// @namespace   profile.intra.42.fr
// @include     https://profile.intra.42.fr/
// @version     1.3
// @grant       none
// @description https://github.com/pcluchet/logtime-plus
// ==/UserScript==
 
function minTommss(minutes){
    var sign = minutes < 0 ? "-" : "";
    var min = Math.floor(Math.abs(minutes));
    var sec = Math.floor((Math.abs(minutes) * 60) % 60);
    return sign + (min < 10 ? "0" : "") + min + "h" + (sec < 10 ? "0" : "") + sec;
}

function load_js()
   {
      var head= document.getElementsByTagName('head')[0];
      var script= document.createElement('script');
      script.type= 'text/javascript';
      script.src= 'https://profile.intra.42.fr/assets/application-a482bc20dff3485ff22a2d7350c86b65accb523b5f0b6f711d36840efbefc37d.js';
      head.appendChild(script);
   }
 
 
function wait(ms){
   var start = new Date().getTime();
   var end = start;
   while(end < start + ms) {
     end = new Date().getTime();
  }
}
 
function get_n(add, n){
    //console.log("Birdel0");
    var tt = n + add;
    console.log('n : ' + n + " add : " + add);
   if (tt == 0)
  {
   return 12;
  }
  else if ( tt < 0)
    {
      return 11;
    }
    else
        {
  return n+add;
        }
}

function disp_hint_top(event){

                              var box = document.createElementNS("http://www.w3.org/2000/svg", 'g');
                             var svg = document.getElementById("user-locations");
                             var s = new XMLSerializer();
                // get the inner DOM of alpha.svg
                    console.log('target = '+ s.serializeToString(event.target));
               
                             var sum = event.target.parentNode.getAttribute('hoursum');
                             var x = parseFloat(event.target.parentNode.getAttribute('spoof_x'));
                             var y = parseFloat(event.target.parentNode.getAttribute('spoof_y'));
                             var to_add = document.createElementNS("http://www.w3.org/2000/svg", 'rect')
                         to_add.setAttribute("x", x+17);
                         to_add.setAttribute("y", y-5);
                         to_add.setAttribute("fill", '#fff');
                         to_add.setAttribute("width", '53');
                         to_add.setAttribute("height", '22');
                         to_add.setAttribute("filter", 'url(#black-glow)');
                         to_add.setAttribute("font-family", 'sans-serif');
                         box.setAttribute("id", sum + x + y);
                         box.appendChild(to_add);
                             
                             var to_add = document.createElementNS("http://www.w3.org/2000/svg", 'text')
                         to_add.setAttribute("x", x+28);
                         to_add.setAttribute("y", y+11);
                         to_add.setAttribute("fill", '#444');
                         to_add.setAttribute("width", '42');
                         to_add.setAttribute("height", '22');
                         to_add.setAttribute("font-family", 'sans-serif');
                         to_add.setAttribute("font-size", '13');
                         to_add.innerHTML = sum;
                         box.setAttribute("id", sum + x + y);
                         box.appendChild(to_add);
                             
                         var to_add = document.createElementNS("http://www.w3.org/2000/svg", 'line')
                         to_add.setAttribute("x1", x+16);
                         to_add.setAttribute("y1", y-5);
                         to_add.setAttribute("x2", x+16);
                         to_add.setAttribute("y2", y+18);
                         to_add.setAttribute("stroke", '#666');
                         to_add.setAttribute("stroke-width", '1');
                        
                         to_add.innerHTML = sum;
                         box.setAttribute("id", sum + x + y);
                         box.appendChild(to_add);
                             
                             
                             console.log("created id = ", sum + x + y);
                         //to_add.innerHTML = minTommss(tot);
                             
                             var to_add = document.createElementNS("http://www.w3.org/2000/svg", 'polygon')
                         to_add.setAttribute("x", x+9);
                         to_add.setAttribute("y", y+8);
                         to_add.setAttribute("fill", '#666');
                             var p1x = x+10;
                             var p1y = y+8;
                             var p2x = x+16;
                             var p2y = y+2;
                             var p3x = x+16;
                             var p3y = y+14;
                         to_add.setAttribute("points", p1x + ' ' + p1y + ', ' + p2x + ' ' + p2y + ', ' + p3x + ' ' + p3y);
                             console.log('attribut pts :' + to_add.getAttribute('points'));
                         to_add.setAttribute("height", '17');
                          box.appendChild(to_add);
                          svg.appendChild(box);
                            
                             console.log("sum =" +sum);
                             
                             //alert('sum = ' + sum);
          
                         }

function disp_hint(event){
                             console.log('FIREF');
                              var box = document.createElementNS("http://www.w3.org/2000/svg", 'g');
                             var svg = document.getElementById("user-locations");
                             var s = new XMLSerializer();
                // get the inner DOM of alpha.svg
                    console.log('target = '+ s.serializeToString(event.target));
               
                             var sum = event.target.getAttribute('hoursum');
                             var x = parseFloat(event.target.getAttribute('x'));
                             var y = parseFloat(event.target.getAttribute('y'));
                             var to_add = document.createElementNS("http://www.w3.org/2000/svg", 'rect')
                         to_add.setAttribute("x", x+17);
                         to_add.setAttribute("y", y-5);
                         to_add.setAttribute("fill", '#fff');
                         to_add.setAttribute("width", '53');
                         to_add.setAttribute("height", '22');
                         to_add.setAttribute("filter", 'url(#black-glow)');
                         to_add.setAttribute("font-family", 'sans-serif');
                         box.setAttribute("id", sum + x + y);
                         box.appendChild(to_add);
                             
                             var to_add = document.createElementNS("http://www.w3.org/2000/svg", 'text')
                         to_add.setAttribute("x", x+28);
                         to_add.setAttribute("y", y+11);
                         to_add.setAttribute("fill", '#444');
                         to_add.setAttribute("width", '42');
                         to_add.setAttribute("height", '22');
                         to_add.setAttribute("font-family", 'sans-serif');
                         to_add.setAttribute("font-size", '13');
                         to_add.innerHTML = sum;
                         box.setAttribute("id", sum + x + y);
                         box.appendChild(to_add);
                             
                         var to_add = document.createElementNS("http://www.w3.org/2000/svg", 'line')
                         to_add.setAttribute("x1", x+16);
                         to_add.setAttribute("y1", y-5);
                         to_add.setAttribute("x2", x+16);
                         to_add.setAttribute("y2", y+18);
                         to_add.setAttribute("stroke", '#666');
                         to_add.setAttribute("stroke-width", '1');
                        
                         to_add.innerHTML = sum;
                         box.setAttribute("id", sum + x + y);
                         box.appendChild(to_add);
                             
                             
                             console.log("created id = ", sum + x + y);
                         //to_add.innerHTML = minTommss(tot);
                             
                             var to_add = document.createElementNS("http://www.w3.org/2000/svg", 'polygon')
                         to_add.setAttribute("x", x+9);
                         to_add.setAttribute("y", y+8);
                         to_add.setAttribute("fill", '#666');
                             var p1x = x+10;
                             var p1y = y+8;
                             var p2x = x+16;
                             var p2y = y+2;
                             var p3x = x+16;
                             var p3y = y+14;
                         to_add.setAttribute("points", p1x + ' ' + p1y + ', ' + p2x + ' ' + p2y + ', ' + p3x + ' ' + p3y);
                             console.log('attribut pts :' + to_add.getAttribute('points'));
                         to_add.setAttribute("height", '17');
                          box.appendChild(to_add);
                          svg.appendChild(box);
                            
                             console.log("sum =" +sum);
                             
                             //alert('sum = ' + sum);
          
                         }

function disp_hint_reverse( event ) {
                             console.log('FIREF');
                              var box = document.createElementNS("http://www.w3.org/2000/svg", 'g');
                             var svg = document.getElementById("user-locations");
                             var s = new XMLSerializer();
                // get the inner DOM of alpha.svg
                    console.log('target = '+ s.serializeToString(event.target));
               
                             var sum = event.target.getAttribute('hoursum');
                             var x = parseFloat(event.target.getAttribute('x'));
                             var y = parseFloat(event.target.getAttribute('y'));
                             var to_add = document.createElementNS("http://www.w3.org/2000/svg", 'rect')
                         to_add.setAttribute("x", x-7-53);
                         to_add.setAttribute("y", y-5);
                         to_add.setAttribute("fill", '#fff');
                         to_add.setAttribute("width", '53');
                         to_add.setAttribute("height", '22');
                         to_add.setAttribute("filter", 'url(#black-glow)');
                         to_add.setAttribute("font-family", 'sans-serif');
                         box.setAttribute("id", sum + x + y);
                         box.appendChild(to_add);
                             
                             var to_add = document.createElementNS("http://www.w3.org/2000/svg", 'text')
                         to_add.setAttribute("x", x-8-42);
                         to_add.setAttribute("y", y+11);
                         to_add.setAttribute("fill", '#444');
                         to_add.setAttribute("width", '42');
                         to_add.setAttribute("height", '22');
                         to_add.setAttribute("font-family", 'sans-serif');
                         to_add.setAttribute("font-size", '13');
                         to_add.innerHTML = sum;
                         box.setAttribute("id", sum + x + y);
                         box.appendChild(to_add);
                             
                         var to_add = document.createElementNS("http://www.w3.org/2000/svg", 'line')
                         to_add.setAttribute("x1", x-6);
                         to_add.setAttribute("y1", y-5);
                         to_add.setAttribute("x2", x-6);
                         to_add.setAttribute("y2", y+18);
                         to_add.setAttribute("stroke", '#666');
                         to_add.setAttribute("stroke-width", '1');
                        
                         to_add.innerHTML = sum;
                         box.setAttribute("id", sum + x + y);
                         box.appendChild(to_add);
                             
                             
                             console.log("created id = ", sum + x + y);
                         //to_add.innerHTML = minTommss(tot);
                             
                             var to_add = document.createElementNS("http://www.w3.org/2000/svg", 'polygon')
                         to_add.setAttribute("x", x+9);
                         to_add.setAttribute("y", y+8);
                         to_add.setAttribute("fill", '#666');
                             var p1x = x-1;
                             var p1y = y+8;
                             var p2x = x-6;
                             var p2y = y+2;
                             var p3x = x-6;
                             var p3y = y+14;
                         to_add.setAttribute("points", p1x + ' ' + p1y + ', ' + p2x + ' ' + p2y + ', ' + p3x + ' ' + p3y);
                             console.log('attribut pts :' + to_add.getAttribute('points'));
                         to_add.setAttribute("height", '17');
                          box.appendChild(to_add);
                          svg.appendChild(box);
                            
                             console.log("sum =" +sum);
                             
                             //alert('sum = ' + sum);
          
                         }

function remove_hint( event ) {
                              console.log('MOUSEOUT');
                             var svg = document.getElementById("user-locations");
                             var s = new XMLSerializer();
                    //console.log('svg = '+ s.serializeToString(event.target));
                             var sum = event.target.getAttribute('hoursum');
                             var x = event.target.getAttribute('x');
                             var y = event.target.getAttribute('y');
                             
                             var to_remove = document.getElementById(sum + x + y);

                             to_remove.parentNode.removeChild(to_remove);

                         }

function remove_hint_spoof( event ) {
                              console.log('MOUSEOUT');
                             var svg = document.getElementById("user-locations");
                             var s = new XMLSerializer();
                    //console.log('svg = '+ s.serializeToString(event.target));
                             var sum = event.target.parentNode.getAttribute('hoursum');
                             var x = event.target.parentNode.getAttribute('spoof_x');
                             var y = event.target.parentNode.getAttribute('spoof_y');
                             
                             var to_remove = document.getElementById(sum + x + y);

                             to_remove.parentNode.removeChild(to_remove);

                         }
 
 
window.onload = function(){
   
    var mois = [];
mois[1] = 0.0;
mois[2] = 0.0;
mois[3] = 0.0;
mois[4] = 0.0;
mois[5] = 0.0;
mois[6] = 0.0;
mois[7] = 0.0;
mois[8] = 0.0;
mois[9] = 0.0;
mois[10] = 0.0;
mois[11] = 0.0;
mois[12] = 0.0;
  
var mois_j = [];
  
  for (var w = 0; w <= 12; w++)
    {
      var jours = [];
      for (var z = 0; z <= 31; z++)
         {
            jours[z] = 0.0;
         }  
            mois_j[w] = jours;
    }

 
 
var months = [];
months[1] = 'Janvier';
months[2] = 'Febrier';
months[3] = 'Mars';
months[4] = 'April';
months[5] = 'May';
months[6] = 'June';
months[7] = 'July';
months[8] = 'August';
months[9] = 'Septembre';
months[10] = 'Octobre';
months[11] = 'Novembre';
months[12] = 'Decembre';
   
    var jl = document.getElementsByClassName("container-inner-item boxed");
var logtimes = document.getElementById("user-locations").getAttribute("data-location-graph");
   
    logtimes = logtimes.substr(1);
logtimes = logtimes.substr(0, logtimes.length - 1);
var set = logtimes.split(",");
 
set.forEach(function(element) {
 
    var base = element.split(":");
    var annee = base[0].substr(1,4);
    var ms = base[0].substr(6,2);
    var jour = base[0].substr(9,2);
 
    var heures = base[1].substr(1,2);
    var minutes = base[2];
    var secondes = base[3].substr(0,2);
 
    mois[parseInt(ms)] += parseInt(heures) + parseInt(minutes)/60;//+(parseInt(minutes)/60)*10);
    mois_j[parseInt(ms)][parseInt(jour)] = parseInt(heures) + parseInt(minutes)/60;
 
});
  
//  console.log('mj = ' + mois_j);
 
var d = new Date();
  console.log("la date c: " + d.toISOString());
var n = d.getMonth();
var total = mois[n-1] + mois[n-0] + mois[n+1];
 
var t = document.createElement("div");
 
t.innerHTML = '<h4>Logtime Plus : '+ minTommss(total) + '</h4>';
n = get_n(-1,d.getMonth());
t.innerHTML = t.innerHTML + months[n-1] +' : '+ minTommss(mois[n-1])+'<br/>';
n = get_n(0,d.getMonth());
t.innerHTML = t.innerHTML + months[n-0]+' : '+minTommss(mois[n-0])+'<br/>';
n = d.getMonth();
t.innerHTML = t.innerHTML + months[n+1]+' : '+minTommss(mois[n+1])+'<br/>';
 
 
 
var k = jl[2].getElementsByClassName('profile-title');
 
k[0].innerHTML = 'Logtime⁺';
 
    var svg = document.getElementById("user-locations");
  
  	//this kills the handlers
  	//svg.innerHTML = svg.innerHTML;
  
  
    svg.setAttribute('viewBox','0 0 610 200');
    var s = new XMLSerializer();
                // get the inner DOM of alpha.svg
                    console.log('svg = '+ s.serializeToString(svg));
                   var svgBrut = s.serializeToString(svg);
               
   
   
                var parser = new DOMParser();
                //var svgDoc = parser.parseFromString(svgBrut, "text/xml");
                var svgDoc = svg;
                var defs = document.createElementNS("http://www.w3.org/2000/svg", 'defs');
    defs.innerHTML = "<filter id=\"black-glow\">\
    <feColorMatrix type=\"matrix\" values=\
                \"0 0 0 0   0\
                 0 0 0 0   0\
                 0 0 0 0   0\
                 0 0 0 0.1 0\"/>\
    <feGaussianBlur stdDeviation=\"2.5\" result=\"coloredBlur\"/>\
    <feMerge>\
        <feMergeNode in=\"coloredBlur\"/>\
        <feMergeNode in=\"SourceGraphic\"/>\
    </feMerge>\
</filter>";
                svgDoc.insertBefore(defs, svgDoc.firstChild);
        
                var elemcol = [];
                var texts = svgDoc.getElementsByTagName("*");
                var kmatch = 999;
                var oldx = 0;
                var oldy = 0;
                var tot = 0.0;
                var match = false;
                var last = false;
                var max = texts.length;
                for(var i = 0; i <= max; i++) {
                    if ( i == max)
                        last = true;
                  /*
                  if (texts[i].tagName = 'g' && texts[i].firstChild && texts[i].firstChild.tagName == 'rect')
                  {
                    var sum = 0.0;
                    
                    n = get_n(kmatch,d.getMonth());
                    sum = mois_j[n+kmatch][texts[i].childNodes[1].innerHTML]
                    
                    console.log('en x =' + texts[i].childNodes[0].getAttribute('x'));
                    texts[i].setAttribute("hoursum", minTommss(sum));
                    texts[i].setAttribute("spoof_x", texts[i].childNodes[0].getAttribute('x') );
                    texts[i].setAttribute("spoof_y", texts[i].childNodes[0].getAttribute('y') );
            		texts[i].addEventListener("mouseover", disp_hint_top);
                    texts[i].addEventListener("mouseout",remove_hint_spoof);
                    console.log('g');
                  }
                 */
                   // console.log('elem: '+ texts[i].innerHTML);
                   
                  //valeurs a coté du nom du mois
                    for(var k = -2; k <= 1; k++)
                        {
                    n = get_n(k, d.getMonth());
                    var moistxt = months[n];
                    //console.log('mois = ' + moistxt);
                    //console.log('cmp = ' + moistxt.substr(0,3) + "html = "+ texts[i].innerHTML);
                   
                    if (texts[i].innerHTML == moistxt.substr(0,3))
                        {
                          match = true;
                          kmatch = k;
                            console.log("moistxt =" + moistxt + "k = " + k);
                            console.log("MATCH MATCH MATCH");
                            texts[i].innerHTML = moistxt.substr(0,3) +"  -  " + minTommss(mois[n]);  
                            texts[i].setAttribute('font-size','12');
                            if (k == -2)
                                {
                                  texts[i].setAttribute('x','50');
                                }
                            else if (k == -1)
                                {
                                  texts[i].setAttribute('x','195');
                                }
                            else if (k == 0)
                                {
                                  texts[i].setAttribute('x','339');
                                }
                            else if (k == 1)
                                {
                                  texts[i].setAttribute('x','480');
                                }
                        }  
                    }
                  
                  //decalage pour faire la place du temps semaine
                  var xxx = parseFloat(texts[i].getAttribute('x'));
                  var yyy = parseFloat(texts[i].getAttribute('y'));
                   			if (kmatch == -2)
                                {
                                   xxx += -10;
                                  texts[i].setAttribute('x',xxx);
                                }
                            else if (kmatch == -1)
                                {
                                  texts[i].setAttribute('x',xxx);
                                }
                            else if (kmatch == 0)
                                {
                                   xxx += 10;
                                  texts[i].setAttribute('x',xxx);
                                }
                            else if (kmatch == 1)
                                {
                                  xxx += 20;
                                  texts[i].setAttribute('x',xxx);
                                }
                  //fin de semaine ou besoin d'écrire le total de semaine
                  if ( oldx == 120.5 || oldx == 274.5 || oldx == 582.5 || oldx == 428.5 ||  match || last)
                    {
                      //creation du rectangle coloré pour la semaine
                        var box = document.createElementNS("http://www.w3.org/2000/svg", 'g');
                        var to_add = document.createElementNS("http://www.w3.org/2000/svg", 'rect');
                        
                        var en_x = 0;
                        if (match)
                            kmatch -= 1;
                         console.log('mois = ' + kmatch);
                        
                         if (kmatch == -2)
                                {
                                   en_x = 135.5;
                                }
                            else if (kmatch == -1)
                                {
                                   en_x = 289.5;
                                }
                            else if (kmatch == 0)
                                {
                                     en_x = 443.5;
                                }
                            else if (kmatch == 1)
                                {
                                     en_x = 597.5;
                                }
                        if (match)
                            kmatch += 1;
                        
                         to_add.setAttribute("x", en_x);
                         to_add.setAttribute("y", oldy-10);
                         if (tot)
                             {
                                var color = '#2CD57B';
                                 var ratio = (tot/60);
                             }
                         else
                             {
                                var color = '#F5F5F5';
                                var ratio = 1;
                             }
                         to_add.setAttribute("fill", color );
                         
                         to_add.setAttribute("fill-opacity", ratio);
                         to_add.setAttribute("width", '7');
                         to_add.setAttribute("height", '17');
                         to_add.setAttribute("font-family", 'sans-serif');
                         to_add.setAttribute("font-size", '8');
                         to_add.setAttribute("hoursum", minTommss(tot));
                        var tmp = oldx-5;
                        var tmp2 = oldy-10;
                        box.appendChild(to_add);
                        
                        
                        //ajout des listeners pour afficher le temps lors du survol.
                        if (!(last || kmatch == 1)) 
                           box.addEventListener("mouseover", disp_hint);
                        else 
                           box.addEventListener("mouseover",disp_hint_reverse);
                        
                         box.addEventListener("mouseout",remove_hint);
                         
                         svg.appendChild(box);
                        
                     
                      tot = 0.0;
                    }
                  n = get_n(kmatch,d.getMonth());
                  if (parseInt(texts[i].innerHTML) && kmatch != 999)
                    {
                    //  console.log("trying to get [" + n +"+"+kmatch + "][" + texts[i].innerHTML +"]");
                    // console.log("inside = " + mois_j[n+kmatch][texts[i].innerHTML]);
                       tot += mois_j[n][texts[i].innerHTML];
                    }
                  
                  if (xxx)
                      oldx = xxx;
                  else
                      oldx = -100;
                  if (xxx)
                      oldy = yyy;
                  match = false
 
                }       
                     
            };