Wikiversità:Monobook.js/VFonLine.js

//

// Stiamo modificando la White o la Black List?
var BlackOrWhite = "";

$(function (){
   if (BrowserDetect.browser!="Firefox" && BrowserDetect.browser!="Mozilla" && BrowserDetect.browser!="Netscape")
      return; // Funziona solo con browser della famiglia Firefox
      
   if (wgCanonicalSpecialPageName != "Recentchanges")
      return; //Serve solo in Utlime modifiche

   var abilitato = GetCookie('wikiVFOL');
   if (abilitato == '' || abilitato == 'disabilitato')
      return; //Serve solo se c'e' abilitato il filtro

   // Lettura cookie: nei cookie ho salvato la lista in formato testo. Per poter funzionare il controllo devo
   // codificarla in formato URI (ad esempio sostituendo "û" con "%C3%BB")
   WhiteList = GetCookie('wikiWhiteList');
   WhiteList = correggiTesto(WhiteList);
   BlackList = GetCookie('wikiBlackList');
   BlackList = correggiTesto(BlackList);

   // Leggo il contenuto di "content"
   var Contenuto = document.getElementById('content');

   // Estraggo le righe delle modifiche
   if (Contenuto.innerHTML.indexOf("</h4>\n<ul class=\"special\">") != -1)
      tagliatoDa = Contenuto.innerHTML.indexOf("</h4>\n<ul class=\"special\">")+26; // +26 per saltare '</h4>\n<ul class="special">'
   else
      tagliatoDa = Contenuto.innerHTML.indexOf('</h4>')+11; // +11 per saltare '</h4>\n<div>'
      
   // Ogni singola modifica e' un elenco di tag ed e' separata dalle altre con l'uso di <br />
   TutteLeModifiche = Contenuto.innerHTML.substr(tagliatoDa);

   // Splitta le modifiche rispetto a <\n>
   var Modifiche = TutteLeModifiche.split("\n");
  
   // Variabili necessarie per colorare i div che racchiudono numerose modifiche
   var tutteVerdi = true; // Tutte le modifiche all'interno sono verdi
   var unaGialla = false; // Almeno una modifica e' gialla
   var unaRossa = false; // Almeno una modifica e' rossa
   var inDiv = false; // Sono nel div
   var escoAdesso = false; // Mi dice se sto uscendo dal div nell'iterazione corrente del ciclo
   var divCorrente = 0;
   var preModifica = ""; // Se la riga inizia con un tag DIV devo eliminarlo, e ricordarmi di riaggiungerlo dopo

   // Per ogni modifica
   for (z=0;z<Modifiche.length;z++)
   {
      inizioNomeUtente = Modifiche[z].indexOf("Speciale:Contributi/") + 20;
      lunghezzaNomeUtente = Modifiche[z].indexOf("\"",inizioNomeUtente) - inizioNomeUtente;
      nomeUtente = Modifiche[z].substr(inizioNomeUtente,lunghezzaNomeUtente);
         
      // Gestione variabili del DIV
      preModifica = ""; // al momento non ho cancellato niente dalla modifica corrente
      
      // Inizio DIV
      if (Modifiche[z].substr(0,5)=="<div ")
      {
         divCorrente = z-1; // la riga precedente
         inDiv = true;
         tutteVerdi = true;
         unaRossa = false;
         unaGialla = false;
      }
      // Fine DIV
      if (Modifiche[z].substr(0,6)=="</div>")
      {
         // Se siamo arrivati al footer possiamo ignorare questa chiusura di DIV (si riferisce alla chiusura di TutteLeModifiche)
         // altrimenti segnalo "escoAdesso=true", ovvero "colora il DIV"
         if (Modifiche[z].indexOf('<div class="printfooter">') == -1)
         {
            inDiv = false;
            escoAdesso = true;
         }
      }

      if ((WhiteList.indexOf("@"+nomeUtente+"@") != -1) ||  // in Whitelist
          (BlackList.indexOf("@"+nomeUtente+"@") != -1) ||  // in Blacklist
          (nomeUtente.match(/^([0-9]+\.){3}[0-9]+$/)))  // Edit di un anonimo
      {
         // Se questa modifica apre una serie racchiusa in un div va eliminato il tag di apertura
         if (Modifiche[z].substr(0,5)=="<div ")
         {
            preModifica = Modifiche[z].substr(0,Modifiche[z].indexOf('<',2));
            Modifiche[z] = Modifiche[z].substr(Modifiche[z].indexOf('<',2));
         }
            
         // Se questa modifica appare dopo un div va eliminato il tag di chiusura
         if (Modifiche[z].substr(0,6)=="</div>")
         {
            preModifica = Modifiche[z].substr(0,6);
            Modifiche[z] = Modifiche[z].substr(6);
         }

         // Colora la riga
         temp = preModifica;
         
         if (WhiteList.indexOf("@"+nomeUtente+"@") != -1)
            temp += '<div style="background-color: #CCFFCC;">';
         else if (BlackList.indexOf("@"+nomeUtente+"@") != -1)
         {
            if (inDiv == true)
            {
               unaRossa = true;
               tutteVerdi = false;
            }
            temp += '<div style="background-color: #FFCCCC;">';
         }
         else // Edit anonimo
         {
            if (inDiv == true)
               unaGialla = true;
            temp += '<div style="background-color: #FFFFBB;">';
         }
         
         temp += Modifiche[z];
         temp += '</div>';

         // Aggiorno "Modifiche[z]" per usarlo nella creazione dei link di gestione liste
         Modifiche[z] = temp;

      }
      else // l'utente non e' ne' in Whitelist ne' in Blacklist e non e' un anonimo
         if (inDiv == true)
            tutteVerdi = false;
      
      // Aggiungo i link per l'aggiunta/rimozione automatica dalle liste

      // Li aggiungo solo se non siamo nella prima riga di un DIV e se la riga contiene una modifica
      if ((Modifiche[z].indexOf("javascript:toggleVisibility") == -1) &&
          (Modifiche[z].indexOf("Speciale:Contributi/") != -1))
      {
         // Decido le azioni da proporre
         azioneWL = "";
         azioneBL = "";
         
         if (WhiteList.indexOf("@"+nomeUtente+"@") != -1) // utente in Whitelist
            azioneWL = '<a href="javascript:removeFromList(\'White\',\''+nomeUtente+'\')" title="Elimina dalla Whitelist">-wl</a>';
         else
            azioneWL = '<a href="javascript:addToList(\'White\',\''+nomeUtente+'\')" title="Aggiungi alla Whitelist">+wl</a>';

         if (BlackList.indexOf("@"+nomeUtente+"@") != -1) // utente in Blacklist
            azioneBL = '<a href="javascript:removeFromList(\'Black\',\''+nomeUtente+'\')" title="Elimina dalla Blacklist">-bl</a>';
         else
            azioneBL = '<a href="javascript:addToList(\'Black\',\''+nomeUtente+'\')" title="Aggiungi alla Blacklist">+bl</a>';
            
         // Calcolo il punto di inserimento
         if (nomeUtente.match(/^([0-9]+\.){3}[0-9]+$/))  // edit di un utente anonimo
            doveScrivere = Modifiche[z].indexOf('<a href="/wiki/Speciale:Contributi/'+nomeUtente); // Vai al link del nome utente
         else
         {
            if (Modifiche[z].indexOf('<a href="/wiki/Utente:') != -1) // se l'utente ha una sua pagina
               doveScrivere = Modifiche[z].indexOf('<a href="/wiki/Utente:'+nomeUtente+'"'); // Vai al link del nome utente
            else // la pagina utente e' da creare
               doveScrivere = Modifiche[z].indexOf('<a href="/w/index.php?title=Utente:'+nomeUtente); // Vai al link del nome utente
         }

         doveScrivere = Modifiche[z].indexOf('</a>',doveScrivere) + 4; // Vai alla fine del link del nome utente
         
         // Aggiungi i link
         temp = Modifiche[z].substr(0,doveScrivere);
         temp += " (" + azioneWL;
         temp += " " + azioneBL + ")";
         temp += Modifiche[z].substr(doveScrivere);
         
         Modifiche[z] = temp;
      }
      
      // Se sto uscendo da un DIV calcolo come colorarlo
      if (escoAdesso == true)
      {
         // Colora la riga
         if ((unaRossa == true) || (tutteVerdi == true) || (unaGialla == true))
         {
            if (unaRossa == true)
               temp = '<div style="background-color: #FFCCCC;">';
            else if (unaGialla == true)
               temp = '<div style="background-color: #FFFFBB;">';
            else
               temp = '<div style="background-color: #CCFFCC;">';

            temp += Modifiche[divCorrente];
            temp += '</div>';

            Modifiche[divCorrente] = temp;
         }
         
         // Setta i default per il controllo DIV
         escoAdesso = false;
         tutteVerdi = true;
         unaRossa = false;
         unaGialla = false;
         inDiv = false;
      }
   }
   
   // ricrea TutteLeModifiche
   TutteLeModifiche = Modifiche.join("\n");

   // Applica tutti i cambiamenti fatti all'elemento "content"
   Contenuto.innerHTML = Contenuto.innerHTML.substr(0, tagliatoDa) +
                         TutteLeModifiche;
})

// Rimuove un dato utente da una lista
function removeFromList(lista,utente)
{
   // leggi il cookie
   contenuto = GetCookie('wiki'+lista+'List');
   
   // elimina l'utente richiesto
   temp = contenuto.substr(0,contenuto.indexOf(utente));
   temp += contenuto.substr(contenuto.indexOf(utente)+utente.length+1);
   contenuto = temp;
   
   // salva il cookie
   var cookieExpire = new Date(); // scadenza del cookie
   cookieExpire.setTime(cookieExpire.getTime() + (12 * 30 * 24 * 60 * 60 * 1000)); // il cookie scade dopo 1 anno
   SetCookie('wiki'+lista+'List', contenuto, cookieExpire.toGMTString(), '/');
}

// Aggiunge un dato utente ad una lista
function addToList(lista,utente)
{
   // trasforma gli underscore in spazi
   while (utente.indexOf("_") != -1)
   {
      temp = utente.substr(0,utente.indexOf("_"));
      temp += " ";
      temp += utente.substr(utente.indexOf("_")+1);
      utente = temp;
   }
   
   // leggi il cookie
   contenuto = GetCookie('wiki'+lista+'List');
   
   // Se l'utente e' gia' inserito esci
   if (contenuto.indexOf("@"+utente+"@") != -1)
      return;

   // aggiunge l'utente richiesto
   contenuto = "@"+utente+contenuto;
   
   // Nella Whitelist aggiunge in ordine alfabetico, nella blacklist aggiunge in cima
   if  (lista == "White")
      contenuto = '@'+(contenuto.substr(1,contenuto.length-2).split('@').sort().join('@'))+'@';
   
   // salva il cookie
   var cookieExpire = new Date(); // scadenza del cookie
   cookieExpire.setTime(cookieExpire.getTime() + (12 * 30 * 24 * 60 * 60 * 1000)); // il cookie scade dopo 1 anno
   SetCookie('wiki'+lista+'List', contenuto, cookieExpire.toGMTString(), '/');
}

// Nei cookie ho salvato la lista in formato testo. Per poter funzionare il controllo devo
// codificarla in formato URI (ad esempio sostituendo "û" con "%C3%BB")
// devo trasformare i "%40" in "@", @ e' il separatore tra i nomi
// devo trasformare i "%20" in underscore (altrimenti non funziona il confronto con white e black list)
function correggiTesto(stringa)
{
   // codifica la stringa
   stringa = encodeURIComponent(stringa);

   // Trasforma gli "%40" in "@" (altrimenti non funziona il confronto con white e black list), @ e' il separatore tra i nomi
   while (stringa.indexOf("%40") != -1)
   {
      temp = stringa.substr(0,stringa.indexOf("%40"));
      temp += "@";
      temp += stringa.substr(stringa.indexOf("%40")+3);
      stringa = temp;
   }

   // Trasforma i "%20" in underscore (altrimenti non funziona il confronto con white e black list)
   while (stringa.indexOf("%20") != -1)
   {
      temp = stringa.substr(0,stringa.indexOf("%20"));
      temp += "_";
      temp += stringa.substr(stringa.indexOf("%20")+3);
      stringa = temp;
   }

   return stringa;
}

function enableVFOL()
{
   var scritta = GetCookie('wikiVFOL');
   if (scritta == '') // Se il cookie non esiste
      scritta = "disabilitato"; // per default e' disabilitato
   
   // Aggiorna il cookie
   var cookieExpire = new Date(); // scadenza del cookie
   cookieExpire.setTime(cookieExpire.getTime() + (12 * 30 * 24 * 60 * 60 * 1000)); // il cookie scade dopo 1 anno
   if (scritta=="abilitato")
   {
      scritta="disabilitato";
      SetCookie('wikiVFOL', "disabilitato", cookieExpire.toGMTString(), '/');
      // Carica il nodo padre
      d = document.getElementById('vfol').parentNode;
      // ed elimina i figli
      d.removeChild(document.getElementById('vfol1'));
      d.removeChild(document.getElementById('vfol2'));
   }
   else
   {
      scritta="abilitato";
      SetCookie('wikiVFOL', "abilitato", cookieExpire.toGMTString(), '/');
      // Carica il nodo padre
      var tb = document.getElementById('p-tb').getElementsByTagName('ul')[0];
      // E crea i figli
      addlilink(tb, 'javascript:ModificaListaVFOL("White")', 'Mostra la White List', 'vfol1');
      addlilink(tb, 'javascript:ModificaListaVFOL("Black")', 'Mostra la Black List', 'vfol2');
   }

   //E aggiorna la scritta a video
   document.getElementById('vfol').innerHTML="<a href='javascript:enableVFOL()'>VFonLine "+scritta+"</a>";
}

// Carica il contenuto della White/Black List  (es:cookie 'wikiWhiteList') nella textarea
function mostraListVFOL()
{
   // Leggi il cookie
   contenuto = GetCookie('wiki'+BlackOrWhite+'List');

   // Correggi iniziale e finale
   contenuto = contenuto.substr(1, contenuto.length -2);
   
   WBTextarea = document.getElementById("WBTextarea");

   // Mostra la lista trasformando i '@' in '\n'
   WBTextarea.value = contenuto.split('@').join('\n');
}

// Salva il contenuto della textarea nella White/Black List (es: cookie 'wikiWhiteList')
function salvaListVFOL()
{
   WBTextarea = document.getElementById("WBTextarea");
   testo = WBTextarea.value.split('\n');
   
   //Concateno i nomi usando il carattere '@'. Essendo vietato nei nickname evita ambiguita'
   elencoNomi = testo.join('@');
   
   // Correggi iniziale e finale
   elencoNomi = '@' + elencoNomi + '@';

   // Aggiorna il cookie
   var cookieExpire = new Date(); // scadenza del cookie
   cookieExpire.setTime(cookieExpire.getTime() + (12 * 30 * 24 * 60 * 60 * 1000)); // il cookie scade dopo 1 anno
   SetCookie('wiki'+BlackOrWhite+'List', elencoNomi, cookieExpire.toGMTString(), '/');
   
   // e chiudi tutto
   RemoveNode("WBListPopupDiv");
}

// Crea il popup utilizzato per modificare la White/Black List
function ModificaListaVFOL(tipo)
{
    // memorizza la lista da modificare
    BlackOrWhite = tipo;
    
    //Creo il testo del popup
    Greeter = "{{big|testo=<b>Modifica della \"" + BlackOrWhite + "List\"</b>{{big|testo=<br />";
    var div = document.createElement('div');
        div.id = 'WBListPopupDiv';
        div.style.position = 'fixed';
        div.style.zIndex   = 1000;
        div.style.left     =  '5px';
        div.style.top      =  '5px';
        div.style.backgroundColor = '#FFFFFF';
        div.style.borderStyle     = 'solid';
        div.style.borderWidth     = ' medium';
        div.style.borderColor     = '#000000';
        div.style.width = '220px';

    var top = document.createElement('div');
        top.id = 'WBListPopupTop';
        top.style.textAlign = 'right';
        top.style.margin = '8px';
        top.style.backgroundColor = '#DDDDDD';

    // crea il tasto "Close"
    var a = document.createElement('a');
        a.appendChild(document.createTextNode('Close'));
        a.href = "javascript:void RemoveNode('WBListPopupDiv')";
        a.style.margin = '8px';

        top.appendChild(a);

        div.appendChild(top);

    // crea la textarea
    var greet = document.createElement('p');
    greet.innerHTML = Greeter;
    greet.style.margin = '10px';
    div.appendChild(greet);

    var form = document.createElement('form');
    form.name = "popupForm";
    var p = document.createElement('p');

    var lista = document.createElement('TEXTAREA');
    lista.name = 'WBList';
    lista.id = 'WBTextarea';
    lista.rows = 10;
    lista.style.width = '200px';
    lista.style.margin = '7px';
    
    p.appendChild(lista);

    // crea il bottone "OK"
    var button = document.createElement('input');
    button.value = 'OK';
    button.type = 'button';
    button.style.margin = '8px';
    button.setAttribute('onclick', 'salvaListVFOL()');
        
    p.appendChild(button);

    // crea il bottone "Annulla"
    var button2 = document.createElement('input');
    button2.value = 'Annulla';
    button2.type = 'button';
    button2.style.margin = '8px';
    button2.setAttribute('onclick', 'RemoveNode("WBListPopupDiv")');

    p.appendChild(button2);

    // reimposta il tutto
    form.appendChild(p);
    div.appendChild(form);

    // e lo mostra a video
    document.body.appendChild(div);
    div.getElementsByTagName('input')[0].focus();
    
    // e carica la lista
    mostraListVFOL();
}
//