// Llibreria SML v1.2.2, 21 des 2004
// Jaume Batlle Brugal.
// Recull de funcions pròpies i de recollides per la web.

/* RECURSOS
** init()
** ^^^^^^
** Funció especial que s'executa en carregar la pàgina. La defineix l'usuari.
**
** versioLlibreria()
** ^^^^^^^^^^^^^^^^^ v1
** Mostra una alerta amb informació sobre la versió de la llibreria.
**
** resolExterns()
** ^^^^^^^^^^^^^^ v1.2
** Els enllaços marcats amb l'atribut 'rel="extern"' s'obren en una
** nova finestra del navegador.
**
** Els enllaços marcats amb l'atribut 'rel="popup"' es passen a la
** funció 'funcioPopUp'. Se n'ofereix una de feta, però s'aconsella
** que l'usuari la sobreescrigui definint-ne una de pròpia.
** L'atribut 'href' de l'enllaç ha estat esborrat i copiat
** sobre '_href' per evitar que l'enllaç s'obri a la pàgina actual.
** L'adreça a obrir és accessible dins de 'funcioPopUp' amb la instrucció
** 'this.getAttribute("_href")'
**
** preCarregaImatges(url_1, url_2, ...)
** ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ v1.0
** En ser cridada carrega les imatges que se li passen com argument a la memòria
** del navegador. Normalment es cridarà dins de 'init()'.
** Es pot cridar múltiples vegades.
**
** llegeixGaleta(nom) -> valor
** ^^^^^^^^^^^^^^^^^^^^^^^^^^^ v1.0
** Llegeix una galeta emmagatzemada amb el 'nom' i en retorna el valor.
**
** escriuGaleta(nom, valor, [caducitat], [camí], [domini], [segura(= 1|0)])
** ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ v1.0
** Escriu una galeta amb el 'nom' i el 'valor' definits. Es pot cridar
** sense més paràmetres. Si no s'especifica 'segura' s'entendrà com a no segura
** (valor '0'). El paràmetre 'caducitat' s'expressa en dies.
**
** llegeixGet() -> vector | null
** ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ v1.0.1
** Llegeix la cadena 'search' o variables passades pel mètode
** 'GET' i les retorna en un vector on cada clau és el nom de
** la variable, i conté el valor de la mateixa.
**
** reArrela(nomFill, nomNouPare) -> bool
** ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ v1a
** Busca l'objecte 'nomFill', l'esborra de la llista de fills
** del seu pare en l'arbre del DOM, i el situa com a nou fill
** de l'objecte 'nomNouPare'.
** Els dos objectes no poden ser el mateix objecte. Retorna
** cert o fals ('true'|'false') segons tingui èxit o no en
** l'operació.
**
** Aquesta llibreria ha estat recollida per en Jaume Batlle Brugal
** i es pot trobar a ...?
*/

function versioLlibreria()
{
  var ver="v1.2.2, 21 des 2004";
  alert("Llibreria SML " + ver +"\nJaume Batlle Brugal\n"+
        "Recull de funcions pròpies i de recollides per la web");
}

function resolExterns()
{ // v1.2
  // Funció perquè els enllaços marcats com a 'rel="extern"' s'obrin
  // en una finestra nova, i així escriure documents
  // 100% compatible amb els standards HTML 4.0 i XHTML, on l'atribut
  // 'target' ja no existeix.
  // També suporta finestres emergents amb 'rel="popup"'. Es pot redefinir
  // la funció 'funcioPopUp' per personalitzar-ne el comportament.
  
  if (!document.getElementsByTagName) {
    // El navegador no suporta la funció. Tornem.
    return;
  }
  var ancores = document.getElementsByTagName("a"); // Tenim la llista d'<a>
  for (var it = 0; it < ancores.length; it++) { // Mirem totes les <a>
      var ancora = ancores[it];
      if (ancora.getAttribute("href")) {
         if (ancora.getAttribute("rel") == "extern") {
            // Tenim una ancora que representa un enllaç i és un enllaç extern
            ancora.target = "_blank"; // li diem que obri una nova finestra
         } else if (ancora.getAttribute("rel") == "popup") {
           // Volem obrir l'enllaç en un pop-up
           ancora.setAttribute("_href", ancora.getAttribute("href"));
           ancora.setAttribute("href", "javascript:void(null)");
           ancora.onclick = funcioPopUp; // <- Definida per l'usuari per obrir els popups.
         }
      }
  }
}

function preCarregaImatges()
{
  // v1.0
  // Carrega en memòria les imatges que es faran servir després
  // i no haver d'esperar que es carreguin en ser sol·licitades.
  if (document.images) { // El navegador suporta l'habilitat?
     if (!document.vectorImatges) { // Conté les imatges a carregar
        // podria existir de crides anteriors a la funció
        document.vectorImatges = new Array();
     }
     var fi;
     for (var it = 0; it < preCarregaImatges.arguments.length; it++) {
       // Utilitzant la propietat '.arguments' de la funció puc passar
       // un nombre indeterminat dels mateixos.
       fi = document.vectorImatges.length; // Suporta crides múltiples
       document.vectorImatges[fi] = new Image; // Crea la nova imatge
       document.vectorImatges[fi].src = preCarregaImatges.arguments[it]; // Carrega la nova imatge
     }
  }
}

function llegeixGaleta(nom)
{
  // v1
  // Llegeix el valor d'una galeta (cookie)
  var index = document.cookie.indexOf(nom + "=");
  if (index == -1)
     return null;
  index = document.cookie.indexOf("=", index) + 1;
  var endstr = document.cookie.indexOf(";", index);
  if (endstr == -1)
     endstr = document.cookie.length;
  return unescape(document.cookie.substring(index, endstr));
}

function escriuGaleta()
{ // v1.1
  // Els arguments són: 'nom', 'valor', 'dies_de_vida',
  // 'camí', 'domini' i 'segura?', dels quals només els
  // dos primers són obligatoris.
  var args = escriuGaleta.arguments;
  if (args.length >= 2) {
    var sGaleta = "";
    var noms = new Array(args[0], "expires", "path", "domain");
    for (it = 1; it < args.length; it++) {
      if (it == 2) {
        // El valor és la caducitat. Hem de transformar els dies
        // en mil·lisegons
        var ara = new Date();
        var caduca = new Date(ara.getTime() + parseInt(args[it]) * 24 * 3600000);
        sGaleta += noms[it-1] + "=" + caduca.toGMTString() + ";";
      } else {
        sGaleta += noms[it-1] + "=" + args[it] +"; ";
      }
    }
    if ((args.length >= 6) && (args[5] == '1')) {
      sGaleta += "SECURE";
    }
    document.cookie = sGaleta;
  }
}

function llegeixGet()
{ // v1.01
  // Retorna un vector (Array), o bé 'null' si no
  // tinc variables per 'GET'
  if (document.location.search != "") {
    var s = document.location.search; // abreviant
    var res = new Array(); // el resultat aquí.
    var i, f, ff; // índex inicial i final del nom i del valor
    // Ens situem al principi de la cadena
    i = 1; // saltem '?'
    var valor;
    while (i > 0) {
      f = s.indexOf('=', i); // final del nom
      ff = s.indexOf('&', f); // final del valor
      // Ara tenim que s[i..f] és el nom de la variable,
      // i s[f+1..ff] és el valor de la variable.
      if (ff != -1) {
        valor = s.slice(f+1, ff); // saltem '='
      } else {
        valor = s.slice(f+1, s.length); // hem arribat al final
      }
      // Traduïm el valor a llenguatge 'humà'
      valor = valor.replace(/\+/g, "%20"); // canvia '+' per codi '%20'
      res[s.slice(i,f)] = unescape(valor); // torna el valor legible
      i = ff + 1; // anem a l'inici del paràmetre següent
    }
    return res;
  } else {
    return null; // No hi ha valors
  }
}

function reArrela(nomFill, nouPare)
{ // v1b
  // Canvia l'arrel del fill per nouPare

  if (!document.getElementById) {
    return false; // Pleguem si no podem treballar
  } else {
    var f = document.getElementById(nomFill);
    var np = document.getElementById(nouPare);
    if (f && np) {
      var p = f.parentNode;
      np.appendChild(p.removeChild(f));
      return true;
    }
  }
}

// Funcions privades per redefinir
function funcioPopUp()
{
  // v1.0
  // Si l'usuari no defineix la 'funcioPopUp', aqui en defineix una "d'emergència"
  var finestraemergent;
  finestraemergent = window.open(this.getAttribute("_href"), "finestraemergent", "resizable");
  finestraemergent.focus();
}

function init() {} // Si després no es definís, donaria error d'execució

// Funcions privades
    
function inicialitza()
{
  window.status= "Carregant..."; // Petits indicadors. Es poden desactivar
  resolExterns();
  init();
  window.status = "(c) sml 2005"; // Al Mozilla, el punt marca la diferència.
  return;
}

window.onload = inicialitza;

// --- 21 de desembre de 2004