Wikiversità:Monobook.js/Pulsanti personali.js

/*

Interfaccia grafica per il setup dei pulsanti personali.
Autore: Jalo.

  • /

//

var myButtonsNew;
var tblBody;

// Grazie a [[:en:User:Topaz]]
function msXmlhttpreq() {
  if (window.XMLHttpRequest) {
    xmlhttpobj = new XMLHttpRequest()
  } else {
    try {
      xmlhttpobj = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      try {
        xmlhttpobj = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (e) {
        xmlhttpobj = null;
      }
    }
  }
  return xmlhttpobj;
}

// Grazie a [[:en:User:Topaz]]
function msDoReq(url,postdata,headers) {
  var req = msXmlhttpreq();
  req.open(postdata?"POST":"GET", url, false);
  for(header in headers)
    req.setRequestHeader(header,headers[header]);
  req.send(postdata||null);
  return req;
}

function fullescape(text)
{
  return escape(text).replace(/\+/g,"%2B");
}
 
// Grazie a [[:en:User:Topaz]]
function msSetPageContent(pagename,content,summary,watch) {
  var prelimresp = msDoReq("/w/index.php?title="+pagename+"&action=submit");
  var edittime = prelimresp.responseText.match(/\<input type='hidden' value="(\d+)" name="wpEdittime" \/\>/)[1];
var edittoken = prelimresp.responseText.match(/\<input type='hidden' value="([^"]+)" name="wpEditToken" \/\>/)[1];
  msDoReq("/w/index.php?title="+pagename+"&action=submit",
      "wpEdittime="+edittime+
      "&wpEditToken="+fullescape(edittoken)+
      "&wpTextbox1="+encodeURIComponent(content)+
      "&wpSummary="+encodeURIComponent(summary)+
      (watch?"&wpWatchthis=on":"")+
      "&wpSection=&wpSave=Save+page",
      {"Content-Type":"application/x-www-form-urlencoded"});
}

// Grazie a [[:en:User:Topaz]]
function msGetPageContent(pagename) {
  var req = msDoReq("/w/index.php?title="+pagename+"&action=edit");
  var content = req.responseText.match(/\<textarea[\w\W]*?\>([\w\W]*?)\<\/textarea\>/)[1];
  content = content.replace(/\&lt\;/gi, "<");
  content = content.replace(/\&gt\;/gi, ">");
  content = content.replace(/\&quot\;/gi, "\"");
  content = content.replace(/\&amp\;/gi, "&");
  return content;
}

// Crea una nuova stringa da aggiungere al monobook
function msGenerateNewConfig(){
  var res = '';
  
  // tolgo i caratteri speciali
  for(i = 0; i < myButtonsNew.length; i++)
    for(j = 0; j < myButtonsNew[0].length; j++)
      if (myButtonsNew[i][j] == "·")
        myButtonsNew[i][j] = "";

  // creo la stringa da salvare
  for(i = 0; i < myButtonsNew.length; i++)
  {
    //  trasformo   '   in   \\\'
    myButtonsNew[i][1] = myButtonsNew[i][1].replace(/\'/gi, "\\\'");
    myButtonsNew[i][2] = myButtonsNew[i][2].replace(/\'/gi, "\\\'");
    myButtonsNew[i][3] = myButtonsNew[i][3].replace(/\'/gi, "\\\'");
    
    //  trasformo   \n   con   \\\\n
    myButtonsNew[i][1] = myButtonsNew[i][1].replace(/\\n/gi, "\\\\n");
    myButtonsNew[i][2] = myButtonsNew[i][2].replace(/\\n/gi, "\\\\n");
  
    res += '[' + myButtonsNew[i][0] + ',\'' + myButtonsNew[i][1] + '\',\'' + myButtonsNew[i][2] + '\',\'' + myButtonsNew[i][3] + '\',' + myButtonsNew[i][4] + '],';
  }
    
  // tolgo l'ultima virgola
  res = res.substr(0,res.length-1);

  return res;
}

// Salva la tabella corrente
function msSave(){
  var oldMonobook = msGetPageContent('Utente:' + wgUserName + '/' + msConfigFile);
  
  // Se c'erano gia' i pulsanti
  if (oldMonobook.match(/var myButtons[ ]*=[ ]*new Array.*;/) != null)
    var newMonobook = oldMonobook.replace(/var myButtons[ ]*=[ ]*new Array.*;/, "var myButtons = new Array(" + msGenerateNewConfig() + ");");
  else
    var newMonobook = oldMonobook.replace(/var toLoad/, "var myButtons = new Array(" + msGenerateNewConfig() + ");\n\nvar toLoad");

  msSetPageContent('Utente:' + wgUserName + '/' + msConfigFile, newMonobook, "Pulsanti personali Setup");
  if (newMonobook != oldMonobook)
    alert("Configurazione salvata. Ricordati di premere ctrl+r per pulire la cache per attivare i cambiamenti.");
  else
    alert("Nessuna modifica effettuata.");
  RemoveNode('SetupPulsanti');
}

// Crea una riga nella tabella
function creaRiga(numero, titolo, dove, prima, dopo)
{
    var row = document.createElement("tr");
    row.id = 'Riga'+numero;
    
    // Crea pulsante "rimuovi questo pulsante"
    var cell = document.createElement("td");
    var rimuovimi = document.createElement('input');
    rimuovimi.value = 'Rimuovi';
    rimuovimi.id = numero;
    rimuovimi.type = 'button';
    
    rimuovimi.onclick = function() {rimuoviPulsante(this.id);};
        
    cell.appendChild(rimuovimi);
    row.appendChild(cell);

    // Creo cella per titolo
    var cell = document.createElement("td");
    cell.innerHTML += titolo;
    row.appendChild(cell);

    // Creo cella per tipo
    var cell = document.createElement("td");
    cell.innerHTML += dove;
    row.appendChild(cell);

    // Creo cella per prima
    var cell = document.createElement("td");
    cell.innerHTML += prima;
    row.appendChild(cell);

    // Creo cella per dopo
    var cell = document.createElement("td");
    cell.innerHTML += dopo;
    row.appendChild(cell);

    // aggiunge la riga alla fine della tabella
    tblBody.appendChild(row);
}

// Crea un pulsante
function msCreate()
{
    msWndSetup=document.getElementById("SetupPulsanti");

    var tipo, titolo, prima, dopo, offset, dove;
    
    // Recupera i valori da salvare
    titolo = document.getElementById("nomePulsante").value;
    dove = document.getElementById("dovePulsante").value;
    prima = document.getElementById("primaPulsante").value;
    dopo = document.getElementById("dopoPulsante").value;
    offset = 0;
    
    // Correggo i caratteri apostrofo
    titolo = titolo.replace(/\'/gi, "\'");
    prima = prima.replace(/\'/gi, "\'");
    dopo = dopo.replace(/\'/gi, "\'");

    // Sistemali un po'
    switch(dove){
        case "0":
            tipo = "1";
            dopo = "0";
            dove = "In cima alla pagina";
            break;
        case "1":
            tipo = "1";
            dopo = "1";
            dove = "In fondo alla pagina";
            break;
        case "2":
            tipo = "2";
            dove = "Posizione del cursore";
            if (dopo == "")
                offset = prima.length;
            break;
        default: break;
    }
    
    // Aggiungili all'Array
    var nuovo = new Array(tipo, prima, dopo, titolo, offset);
    myButtonsNew[myButtonsNew.length] = nuovo;
    
    // E alla tabella
    
    if ((tipo != "2") && ((dopo == "") || (dopo == "0") || (dopo == "1")))
        dopo = "·";
        
    // Correggi il font
    titolo = "<span style=\"font-size: medium;\">"+titolo+"</span>";
    dove = "<span style=\"font-size: medium;\">"+dove+"</span>";
    prima = "<span style=\"font-size: medium;\">"+prima+"</span>";
    dopo = "<span style=\"font-size: medium;\">"+dopo+"</span>";
    
    creaRiga(tblBody.rows.length, titolo, dove, prima, dopo);
}

// Cancella un pulsante
function rimuoviPulsante(riga)
{
    msWndSetup=document.getElementById("SetupPulsanti");

    //Elimina riga "riga" dalla myButtonsNew
    myButtonsNew.splice(riga,1); // Rimuove 1 elemento dall'indice "riga"

    // E aggiorna graficamente la tabella
    rowToRemove = document.getElementById('Riga'+riga);
    rowToRemove.parentNode.removeChild(rowToRemove);
    
    // Chiudi e riapri per riordinare gli id delle righe
    RemoveNode('SetupPulsanti');
    msCreateUI();
}

// Disegna la finestra
function msCreateUI(){
    var msWndSetup = document.createElement('div');
        msWndSetup.id = 'SetupPulsanti';
        msWndSetup.style.position = 'absolute';
        msWndSetup.style.zIndex   = 1000;
        msWndSetup.style.left     =  '0px';
        msWndSetup.style.top      =  '0px';
        msWndSetup.style.backgroundColor = '#FFFFFF';
        msWndSetup.style.borderStyle     = 'solid';
        msWndSetup.style.borderWidth     = ' medium';
        msWndSetup.style.borderColor     = '#000000';
        msWndSetup.style.width = '630px';

    var top = document.createElement('div');
        top.id = 'setupPulsantiTop';
        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('SetupPulsanti')";
        a.style.margin = '8px';

        top.appendChild(a);

        msWndSetup.appendChild(top);


  var body = msWndSetup;

  var intro = document.createElement('p');

  intro.innerHTML = "<span style=\"font-size: medium;\">Benvenuto nella configurazione dei tuoi <b>Pulsanti personali</b>.<br /><br />" +
                    "Vedi <span style=\"font-weight: bold;\"><a href='http://it.wikiversity.org/wiki/Wikiversità:Monobook.js/Pulsanti personali' target=new>qui</a></span> per maggiori informazioni</span><br /><br />";
                    
  body.appendChild(intro);

  body.appendChild(document.createElement("hr"));
  
  var ACapo = document.createElement('p');
  ACapo.innerHTML = '<br />';
  body.appendChild(ACapo);

  // Mostra la tabella dei comandi esistenti
  var titoloTbl = document.createElement('p');
  titoloTbl.innerHTML = '<span style="font-size: large;color: red;text-decoration: underline;">Elenco dei pulsanti installati:</span>';
  body.appendChild(titoloTbl);

  var ACapo = document.createElement('p');
  ACapo.innerHTML = '<br />';
  body.appendChild(ACapo);

  // crea la <table> ed il  <tbody>
  var tbl = document.createElement("table");
  tblBody = document.createElement("tbody");

  // Crea la riga di intestazione della tabella
  var header = document.createElement("tr");

  var cell1 = document.createElement("td");
  var cellText1 = document.createElement('p');
  cellText1.innerHTML = "·";
  cell1.appendChild(cellText1);
  header.appendChild(cell1);

  var cell2 = document.createElement("td");
  var cellText2 = document.createElement('p');
  cellText2.innerHTML = "<span style=\"font-size: medium;\"><b>Nome pulsante</b></span>";
  cell2.appendChild(cellText2);
  header.appendChild(cell2);

  var cell3 = document.createElement("td");
  var cellText3 = document.createElement('p');
  cellText3.innerHTML = "<span style=\"font-size: medium;\"><b>Dove inserire</b></span>";
  cell3.appendChild(cellText3);
  header.appendChild(cell3);

  var cell4 = document.createElement("td");
  var cellText4 = document.createElement('p');
  cellText4.innerHTML = "<span style=\"font-size: medium;\"><b>Testo da inserire prima</b></span>";
  cell4.appendChild(cellText4);
  header.appendChild(cell4);

  var cell5 = document.createElement("td");
  var cellText5 = document.createElement('p');
  cellText5.innerHTML = "<span style=\"font-size: medium;\"><b>Testo da inserire dopo</b></span>";
  cell5.appendChild(cellText5);
  header.appendChild(cell5);
  tblBody.appendChild(header);
  
  // mette <tbody> nella <table>
  tbl.appendChild(tblBody);
  // <table> nel <body>
  body.appendChild(tbl);
  // e setta il bordo a 2 e lo sfondo a bianco
  tbl.setAttribute("border", "2");
  tbl.setAttribute("style","background-color:white;");
 
  // crea tutte le celle
  for (var j = 0; j < myButtonsNew.length; j++)
  {

    // Creo "dive"
    if (myButtonsNew[j][0] == '2')
      var dove = "Posizione del cursore";
    else if (myButtonsNew[j][2] == '0')
      var dove = "In cima alla pagina";
    else
      var dove = "In fondo alla pagina";

    // Creo "dopo"
    if ((myButtonsNew[j][0] == '2') && (myButtonsNew[j][2] != ''))
      var dopo = myButtonsNew[j][2];
    else
      var dopo = "·";

    creaRiga(j, "<span style=\"font-size: medium;\">"+myButtonsNew[j][3]+"</span>",
                "<span style=\"font-size: medium;\">"+dove+"</span>",
                "<span style=\"font-size: medium;\">"+myButtonsNew[j][1]+"</span>",
                "<span style=\"font-size: medium;\">"+dopo+"</span>");
  }

  var ACapo = document.createElement('p');
  ACapo.innerHTML = '<br />';
  body.appendChild(ACapo);

  body.appendChild(document.createElement("hr"));
  
  var ACapo = document.createElement('p');
  ACapo.innerHTML = '<br />';
  body.appendChild(ACapo);

  // Mostra i comandi per crearne uno nuovo
  var titoloCrea = document.createElement('p');
  titoloCrea.innerHTML = '<span style="font-size: large;color: red;text-decoration: underline;">Crea un nuovo pulsante:</span><br />';
  body.appendChild(titoloCrea);

  var ACapo = document.createElement('p');
  ACapo.innerHTML = '<br />';
  body.appendChild(ACapo);

  // Nome del pulsante
  var p = document.createElement('p');
  p.innerHTML += "<span style=\"font-size: medium;\">Nome del pulsante:  </span>";
  var nomePulsante = document.createElement('input');
  nomePulsante.name = 'nomePulsante';
  nomePulsante.id = 'nomePulsante';
  nomePulsante.type = 'text';
  p.appendChild(nomePulsante);
  body.appendChild(p);
  
  // Dove inserire
  var p = document.createElement('p');
  p.innerHTML += "<span style=\"font-size: medium;\">Dove inserire il testo?:  </span>";
  var dovePulsante = document.createElement('select');
  dovePulsante.name = 'dovePulsante';
  dovePulsante.id = 'dovePulsante';
  dovePulsante.size = 1;
  var option1 = new Option('In cima','0');
  var option2 = new Option('Sul cursore','2');
  var option3 = new Option('In fondo','1');
  dovePulsante.options[0] = option1;
  dovePulsante.options[1] = option2;
  dovePulsante.options[2] = option3;
  option1.selected = 'true';
  p.appendChild(dovePulsante);
  body.appendChild(p);

  // Cosa inserire prima
  var p = document.createElement('p');
  p.innerHTML += "<span style=\"font-size: medium;\">Cosa inserire?:  </span>";
  var primaPulsante = document.createElement('input');
  primaPulsante.name = 'primaPulsante';
  primaPulsante.id = 'primaPulsante';
  primaPulsante.type = 'text';
  p.appendChild(primaPulsante);
  p.innerHTML += "  (\"a capo\" = \"\\n\". Ad esempio \"Prima riga\\nSeconda riga\")";
  body.appendChild(p);

  // Cosa inserire dopo
  var p = document.createElement('p');
  p.innerHTML += "<span style=\"font-size: medium;\">Cosa inserire dopo?:  </span>";
  var dopoPulsante = document.createElement('input');
  dopoPulsante.name = 'dopoPulsante';
  dopoPulsante.id = 'dopoPulsante';
  dopoPulsante.type = 'text';
  p.appendChild(dopoPulsante);
  p.innerHTML += "  (solo per inserimenti sul cursore, leggi <span style=\"font-weight: bold;\"><a href='http://it.wikiversity.org/wiki/Wikiversità:Monobook.js/Pulsanti personali' target=new>la guida</a></span> per info)";
  body.appendChild(p);

  var ACapo = document.createElement('p');
  ACapo.innerHTML = '<br />';
  body.appendChild(ACapo);

  // Bottone "Crea"
  var btnCreate=document.createElement('input');
  btnCreate.type='button';
  btnCreate.value = "Crea questo pulsante";
  btnCreate.onclick = msCreate;
  body.appendChild(btnCreate);
       
  var ACapo = document.createElement('p');
  ACapo.innerHTML = '<br />';
  body.appendChild(ACapo);

  body.appendChild(document.createElement("hr"));

  var ACapo = document.createElement('p');
  ACapo.innerHTML = '<br />';
  body.appendChild(ACapo);

  // Bottone "Salva"
  var btnSave=document.createElement('input');
  btnSave.type='button';
  btnSave.value = "Salva";
  btnSave.onclick = msSave;
  body.appendChild(btnSave);

  var pad=document.createElement('label');
  pad.innerHTML="   ";
  body.appendChild(pad);

  // Bottone "Annulla"
  var btnClose=document.createElement('input');
  btnClose.type='button';
  btnClose.value = "Annulla";
  btnClose.onclick = function(){ RemoveNode('SetupPulsanti') };
  body.appendChild(btnClose);
  
  var ACapo = document.createElement('p');
  ACapo.innerHTML = '<br />';
  body.appendChild(ACapo);
  
  // e lo mostra a video
  document.body.appendChild(msWndSetup);
  msWndSetup.getElementsByTagName('input')[0].focus();
}

//START DEL TOOL
if (typeof msConfigFile == 'undefined')
  msConfigFile = 'monobook.js';

if(typeof(msWndSetup) != 'undefined'){
  msWndSetup.focus();
}else{
  myButtonsNew = new Array();
  // se non esiste ancora "myButtons" la creo
  if (typeof (myButtons) == 'undefined')
    var myButtons = new Array();
  else
  {
    for (i=0; i < myButtons.length; i++)
        myButtonsNew[i] = new Array();
    for (i=0; i < myButtons.length; i++)
        for (j=0; j < myButtons[0].length; j++)
            myButtonsNew[i][j] = myButtons[i][j].toString();
  }
  
  // Disegna la finestra
  msCreateUI();
}
//