Singles Top100 Simplifier v1.00

By realtebo Last update Jul 17, 2008 — Installed 56 times.
// ==UserScript==
// @name           Singles Top100 Simplifier v1.00
// @namespace      WorldSingleChartBautifier
// @description    Italian Only, for now - Questo script rende di rapidissima consultazione la classifica dei 100 singoli più venduti pubblicata su top40-charts.com 
// @include        http://top40-charts.com/chart.php?cid=35
// ==/UserScript==


// **************************************************************************
// **************** SPAZIO FUNZIONI DI SUPPORTO *****************************
// **************************************************************************

// quersta funzione crea nodi di qualsiasi tipo, eventualmente li riempe con
// del testo e poi rende indietro il nodo appena creato per successive 
// manipolazioni

function creaNodo(idNodo, nomeClasse, testoHtml, nomeTag) { 
  var Nodo = document.createElement(nomeTag||"div"); // Se non specifico, è un DIV
  if (idNodo) Nodo.id = idNodo; // Se ho dato l'id lo inserisco tra gli attributi
  if (nomeClasse) Nodo.className = nomeClasse; // idem
  if ("undefined" != typeof testoHtml) {
    // se ho del testo glielo inserisco dentro come figlio testuale
    Nodo.appendChild(document.createTextNode(testoHtml)); //
  } 
  return Nodo; // Infine passo il nodo appena creato, può sempre servire
}

// Questa funzione è presa da un libro di programmazione ed aggiunge
// quanto inserito come stringa al CSS presente (o meno) nell'HEAD della
// pagina. Verifico che altri script non usino lo stesso nome di funzione
if(!window.addGlobalStyle){
 function addGlobalStyle(css) {
		try {
			var elmHead, elmStyle;
			elmHead = document.getElementsByTagName('head')[0];
			elmStyle = document.createElement('style');
			elmStyle.type = 'text/css';
			elmHead.appendChild(elmStyle);
			elmStyle.innerHTML = css;
		} catch (e) {
			if (!document.styleSheets.length) {
				document.createStyleSheet();
			}
			document.styleSheets[0].cssText += css;
		}
 }
}


// **************************************************************************
// ********************** debug SCRIPT ********************************
// **************************************************************************

/*

// Marco tutti gli elementi che mi interessano come NON da rimuovere
var xPath = "//div/table/tbody/tr/td/center" + 
            "/table[1]/tbody/tr/td" + 
            "/table/tbody/tr/td" +
            "/table[2]/tbody/tr/td"+
            "/table//*";

var snapResults = document.evaluate(xPath, document, null, 
  XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
  
GM_log ("Rendo visibile la tabella che mi interessa << " + xPath + " >> -> " + snapResults.snapshotLength);
 
	for (var i = snapResults.snapshotLength - 1; i >= 0; i--) {
		var elm = snapResults.snapshotItem(i);
     elm.style.visibility = "visible";
}
	
var xPath = "//div/table/tbody/tr/td/center" + 
            "/table[1]/tbody/tr/td" + 
            "/table/tbody/tr/td" +
            "/table[2]/tbody/tr/td"+
            "/table/tbody/tr/td";


var snapResults = document.evaluate(xPath, document, null, 
  XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
  

GM_log ("Nascondo alcune celle " + snapResults.snapshotLength);
for (var i = 0; i <= 9; i++) {
		var elm = snapResults.snapshotItem(i);
    elm.style.visibility = "hidden";
}
          
*/ 
  
 

// **************************************************************************
// ********************** CORPO DELLO SCRIPT ********************************
// **************************************************************************
  
          
// ----------------------- Le posizioni attuali ---------------------------

var real_pos = new Array();
var count_pos = 0;

var xPath = "//div/table/tbody/tr/td/center" + 
            "/table[1]/tbody/tr/td" + 
            "/table/tbody/tr/td" +
            "/table[2]/tbody/tr/td"+
            "/table/tbody/tr[position()>3]/td[1]";


var snapResults = document.evaluate(xPath, document, null, 
  XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
  

for (var i = 0; i < snapResults.snapshotLength ; i++) {
		var elm = snapResults.snapshotItem(i);
    
    // devo usare questo if perchè prima di ogni cella buona ce n'è una vuota !!!
    if (elm.hasChildNodes() ) {
     count_pos ++;
     // DAL TD prendo il primo figlio, B, e il primo figlio è il testo, di cui 
     // leggo il nodeValue per leggerlo 
     real_pos[count_pos] = elm.firstChild.firstChild.nodeValue;
     /*
     GM_log ("Elemento n° " + count_pos + ": \nNome: " +  elm.nodeName + 
             " \nNodi: " + elm.childNodes.length + "\nTesto:" + 
             elm.innerHTML + "\nValore: "  + 
             elm.firstChild.firstChild.nodeValue);
     */
    }    
}

//GM_log ("Raccolte posizioni attuali in q.ta. " + ( real_pos.length - 1) );

// ----------------------- Le posizioni vecchie ---------------------------

var real_oldPos = new Array();
var count_oldPos = 0;

var xPath = "//div/table/tbody/tr/td/center" + 
            "/table[1]/tbody/tr/td" + 
            "/table/tbody/tr/td" +
            "/table[2]/tbody/tr/td"+
            "/table/tbody/tr[position()>3]/td[3]/font";


var snapResults = document.evaluate(xPath, document, null, 
  XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
  


for (var i = 0; i < snapResults.snapshotLength ; i++) {
		var elm = snapResults.snapshotItem(i);
    count_oldPos ++;
    
    if ( elm.firstChild.hasChildNodes() ) {
      real_oldPos[count_oldPos] = elm.firstChild.firstChild.nodeValue;
    } else {
      real_oldPos[count_oldPos] = elm.firstChild.nodeValue;
    }
    /*    
          GM_log ("Elemento n° " + count_oldPos + ": \nNome: " +  elm.nodeName + 
             " \nNodi: " + elm.childNodes.length + 
             "\n\nValore nodo:" + elm.firstChild.nodeValue +
             "\n\nCon sottonodi?:" + elm.firstChild.hasChildNodes()
            );
    */
}

//GM_log ("Raccolte vecchie posizioni in q.ta. " +  ( real_oldPos.length -1) ) ;

// ----------------------- Le settimane che è in classifica ---------------------------


var real_weeks = new Array();
var count_weeks = 0;

var xPath = "//div/table/tbody/tr/td/center" + 
            "/table[1]/tbody/tr/td" + 
            "/table/tbody/tr/td" +
            "/table[2]/tbody/tr/td"+
            "/table/tbody/tr[position()>3]/td[8]/font";


var snapResults = document.evaluate(xPath, document, null, 
  XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
  

for (var i = 0; i < snapResults.snapshotLength ; i++) {
		var elm = snapResults.snapshotItem(i);
    
    count_weeks ++;
    real_weeks[count_weeks] = elm.firstChild.nodeValue;
    /*
    elm.style.border = "3px solid red";
    GM_log ("Elemento n° " + count_weeks + ": \nNome: " +  elm.nodeName + 
             " \nNodi: " + elm.childNodes.length + "\nTesto:" + 
             elm.firstChild.nodeValue);
    */
}


//GM_log ("Raccolte settimane in classifica in q.ta. " +( real_weeks.length - 1) );


// ----------------------- I titoli dei brani ---------------------------


var real_titles = new Array();
var count_titles = 0; 

// Ricavo i titoli dei brani
var xPath = "//div/table/tbody/tr/td/center" + 
            "/table[1]/tbody/tr/td" + 
            "/table/tbody/tr/td" +
            "/table[2]/tbody/tr/td"+
            "/table/tbody/tr/td/table/tbody/tr/td[3]/div/b/a";


var snapResults = document.evaluate(xPath, document, null, 
  XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);

//GM_log ("Evidenzio le celle con titolo e artista " + snapResults.snapshotLength);
for (var i = 0; i < snapResults.snapshotLength ; i++) {
		var elm = snapResults.snapshotItem(i);
    count_titles ++;
    real_titles[count_titles] = elm.firstChild.nodeValue;
    /*
    elm.style.border = "3px solid green";
    GM_log ("Elemento verde n° " + i + ": \nNome: " +  elm.nodeName + 
            "\nNodi: " + elm.childNodes.length + 
            "\n\nTesto:\n" + elm.firstChild.nodeValue 
          );
    */
}

//GM_log ("Raccolti titoli in q.ta. " +( real_titles.length - 1) );


// ----------------------- Nome dell'artista ---------------------------


var real_artists = new Array();
var count_artists = 0;

// Ricavo i titoli dei brani
var xPath = "//div/table/tbody/tr/td/center" + 
            "/table[1]/tbody/tr/td" + 
            "/table/tbody/tr/td" +
            "/table[2]/tbody/tr/td"+
            "/table/tbody/tr/td/table/tbody/tr/td[3]/a";


var snapResults = document.evaluate(xPath, document, null, 
  XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);

//GM_log ("Evidenzio le celle con l'artista " + snapResults.snapshotLength);
for (var i = 0; i < snapResults.snapshotLength ; i++) {
		var elm = snapResults.snapshotItem(i);
    count_artists ++;
    real_artists[count_artists] = elm.firstChild.nodeValue;
    /*
    elm.style.border = "3px solid green";
    GM_log ("Elemento verde n° " + i + ": \nNome: " +  elm.nodeName + 
            "\nNodi: " + elm.childNodes.length + 
            "\n\nTesto:\n" + elm.innerHTML 
          );
    */
}

//GM_log ("Raccolti artisti in q.ta. " +( real_artists.length - 1) );



// ----------------------- Svuoto la pagina ---------------------------

// Marco tutti gli elementi della pagina come da rimuovere

var snapResults = document.evaluate("//body/*", document, null, 
  XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);

//GM_log ("Elementi, tutti, occultati: " + snapResults.snapshotLength);
for (var i = snapResults.snapshotLength - 1; i >= 0; i--) {
		var elm = snapResults.snapshotItem(i);
    elm.parentNode.removeChild(elm);
}

// Rimuovo anche tutto l''head'

var snapResults = document.evaluate("/html/head", document, null, 
  XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);

//GM_log ("Elementi, tutti, occultati: " + snapResults.snapshotLength);
for (var i = snapResults.snapshotLength - 1; i >= 0; i--) {
		var elm = snapResults.snapshotItem(i);
    elm.parentNode.removeChild(elm);
}

// Poi lo ricreo e lo appeno ad HTML
var nuovo_head = creaNodo("","","","head");
var nuovo_titolo = creaNodo("","","Top100 - Versione stmapabile - by Realtebo","title");
nuovo_head.appendChild(nuovo_titolo);


// lo appendo solo nella prossima fase, poche righe sotto


// ----------------------- Ora creo la tabella ---------------------------

// mi procuro un riferimento al BODY html

var snapResults = document.evaluate("//body", document, null, 
  XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);

//GM_log ("Body rintracciati: " + snapResults.snapshotlength);

var body = snapResults.snapshotItem(0);
// Sto inserendo l'header sotto html come ramo, ma prima di body come ordine
body.parentNode.insertBefore(nuovo_head, body);

// Tabelle
var table = creaNodo("","realTable","","table");
body.appendChild(table);
body.appendChild(document.createTextNode("\n") );

// Header
var table_head = creaNodo("","realTableHead","","tr");
table.appendChild(table_head);

// Celle dell'header
var table_head_pos = creaNodo("realPos","realTableHeadCell","Posizione","td");
table_head.appendChild(table_head_pos);
table_head_pos = creaNodo("realPosPrec","realTableHeadCell","Posizione Precedente","td");
table_head.appendChild(table_head_pos);
table_head_pos = creaNodo("realArtist","realTableHeadCell","Artista","td");
table_head.appendChild(table_head_pos);
table_head_pos = creaNodo("realSong","realTableHeadCell","Titolo del brano","td");
table_head.appendChild(table_head_pos);
table_head_pos = creaNodo("realWeeks","realTableHeadCell","Settimane","td");
table_head.appendChild(table_head_pos);

// Table Body

var table_body = creaNodo("","realTableBody","","tbody");
table.appendChild(table_body);

for (var riga= 1; riga<= 100 ; riga++) {

 // Ora vado ad aggiungere i vari valori letti lungo la pagina
 // Ci creo le celle, con rispettivi id e classi per poterli ben
 // personalizzare.
 
 // Prima però verifico che il brano non sia una nuova entrata
 // nel qual caso evidenzio la riga, dandogli un nome di classe-riga divero

 var id_row_name = "realRow"+(riga%2);
 if (real_oldPos[riga] == "New") {
  id_row_name = "newEntry";
 } 
 // Creo la riga  alternando tra 0 (zero) e 1 (uno) l'id, classe uguale
 var table_row = creaNodo( id_row_name ,"realTableRow","","tr");
 // Inserisco un piccolo effetto dinamico, per agevolare la lettura
 table_row.setAttribute("onMouseOver", "this.id='hoverOn' ");
 table_row.setAttribute("onMouseOut", "this.id='"+ id_row_name+ "'");
 table_body.appendChild(table_row);
 

 // Inserisco la cella con la posizione attuale
 var table_td = creaNodo("realPos","realTableTd", real_pos[riga]  ,"td");
 table_row.appendChild(table_td);
 
 // Inserisco la cella con la posizione precedente
 table_td = creaNodo("realPosPrec","realTableTd", real_oldPos[riga]  ,"td");
 table_row.appendChild(table_td);
 
 // Inserisco la cella con l'artista
 table_td = creaNodo("realArtist","realTableTd", real_artists[riga]  ,"td");
 table_row.appendChild(table_td);
 
  // Inserisco la cella con il titolo del brano
 table_td = creaNodo("realSong","realTableTd", real_titles[riga]  ,"td");
 table_row.appendChild(table_td);
 
  // Inserisco la cella con il numero di settimane che è in classifica
 table_td = creaNodo("realWeeks","realTableTd", real_weeks[riga]  ,"td");
 table_row.appendChild(table_td);
 
}

// Termino con una nota di stile
addGlobalStyle (
 "body { margin: 10px 50px 10px 50px;  background-color: AliceBlue;  border: 1px solid green;  font-family: Verdana; } \n"+ 
 "table {  width: 100% !important;  border: 1px solid gray; } \n" +
 "TD {  padding: 2px;  font-size: 0.8em; } \n" +
 "TR#realRow0 { background-color: #FFFFE0; } \n" +
 "TR#realRow1 { background-color: #B0E0E6; } \n" +
 "TR#newEntry { background-color: #FFB6C1 } \n" +
 "TR.realTableHead {  background-color: #FFE4C4; height: 2em; } \n" +
 "TD.realTableHeadCell { text-align: center;  font-weight: bold;  font-size: 1em; } \n" +
 "TD#realPos { font-weight: bold; text-align: center;  width: 110px !important; padding: 5px; } \n" +
 "TD#realPosPrec {  text-align: center; width: 110px !important; } \n" + 
 "TD#realSong { font-weight: bold; } \n" +
 "TD#realWeeks {  text-align: center; width: 110px !important; } \n" +
 "TD#realArtist { font-style: italic; } \n" +
 "TR#hoverOn { background-color: yellow; }"   
);