/* $Id: common.js,v 1.1 2006/05/11 23:24:18 hoss Exp hoss $ */

/*
 * cssjs
 * written by Christian Heilmann (http://icant.co.uk)
 * eases the dynamic application of CSS classes via DOM
 * parameters: action a, object o and class names c1 and c2 (c2 optional)
 * actions: swap exchanges c1 and c2 in object o
 *      add adds class c1 to object o
 *      remove removes class c1 from object o
 *      check tests if class c1 is applied to object o
 * example: cssjs('swap',document.getElementById('foo'),'bar','baz');
 */

function cssjs(a,o,c1,c2) {
  switch (a){
    case 'swap':
      if (!cssjs('check',o,c1)) { o.className = o.className.replace(c2,c1); }
      else                      { o.className = o.ClassName.replace(c1,c2); }
      break;
    case 'add':
      if (!cssjs('check',o,c1)) { o.className += o.className? ' '+c1 : c1; }
      break;
    case 'remove':
      var rep = o.className.match(' '+c1) ? ' '+c1 : c1;
      o.className = o.className.replace(rep,'');
      break;
    case 'check':
      return new RegExp('\\b'+c1+'\\b').test(o.className)
      break;
  }
}

function kasxu(nodo, lingvo) {
  if (nodo.getAttribute('lang') == lingvo) {
    /* nodo.className = 'hidden'; */
    cssjs('add', nodo, 'hidden');
  }
}

function montru(nodo, lingvo) {
  if (nodo.getAttribute('lang') == lingvo) {
    /* nodo.className = 'unhidden'; */
    cssjs('remove', nodo, 'hidden');
  }
}



// trairu cxiujn nodojn en la korpo de la dokumento
function trairu_kaj_kasxu(n, lingvo) {
  // nur trairu 'element'-nodojn
  if (n.nodeType != 1)    { return(true) }            
  kasxu(n, lingvo);
  if (!n.hasChildNodes()) { return(true) }
  for (var i = 0; i < n.childNodes.length; i++) {
    trairu_kaj_kasxu(n.childNodes[i], lingvo);
  }
}

function trairu_kaj_montru(n, lingvo) {
  // nur trairu 'element'-nodojn
  if (n.nodeType != 1)    { return(true) }            
  montru(n, lingvo);
  if (!n.hasChildNodes()) { return(true) }
  for (var i = 0; i < n.childNodes.length; i++) {
    trairu_kaj_montru(n.childNodes[i], lingvo);
  }
}


function traduku(kasxlingvo, montrlingvo) {
  var el = document.getElementsByTagName('body')[0];
  trairu_kaj_kasxu(el, kasxlingvo);
  trairu_kaj_montru(el, montrlingvo);
}


/* El http://www.alistapart.com/stories/alternate */
function setActiveStyleSheet(title) {
  var i, a;
  for(i=0; (a = document.getElementsByTagName("link")[i]); i++) {
    if(a.getAttribute("rel").indexOf("style") != -1
       && a.getAttribute("title")) {
      a.disabled = true;
      if(a.getAttribute("title") == title) a.disabled = false;
    }
  }
  return(true);
}

function addEvent(obj, evType, fn) { 
  if (obj.addEventListener) { 
    obj.addEventListener(evType, fn, true); 
    return(true); 
  }
  if (obj.attachEvent) { 
    var r = obj.attachEvent("on"+evType, fn); 
    return(r); 
  }
  return(false); 
}

function aldonuEventon(obj, speco, fn) {
  if (obj.addEventListener) {
    obj.addEventListener(speco, fn, true);
    return(true);
  }
  if (obj.attachEvent) {
    var r = obj.attachEvent("on"+speco, fn);
    return(r);
  }
  return(false);
}

/* Kasxu retposxtajn adresojn de spamrobotoj.
 *
 * Tiu cxi funkcio sxangxos:
 *   <span class="retposxtadreso">user cxe example punkto com</span>
 * al
 *   <a href="mailto:user@example.com">user@example.com</a>
 *
 * Bonvolu noti, ke:
 *  - "class" povas esti aux "retposxtadreso" aux "retpoŝtadreso"
 *    aux "retposhtadreso" aux "emailaddress"
 *  - per "@" anstatauxigxas kaj "cxe" kaj "che" kaj "ĉe" kaj "at"
 *  - per "." anstatauxigxas kaj "punkto" kaj "punkt" kaj "dot"
 */

function kasxuRetposxtajnAdresojn() {
  var reClass  = /\b(retpo(sx|sh|s\^|\^s|s'|ŝ)t)?adreso?|email(address)?\b/i;
  var reCxe    = /(\w)\W+(cxe|che|c\^e|\^ce|c'e|ĉe|at|&amp;t)\W+(\w)/i;
  var rePunkto = /(\w)\W+(punkto?|dot|point)\W+(\w)/ig;
  var spanoj = document.getElementsByTagName('span');
  for (var i = 0; i < spanoj.length; i++) {
    var s = spanoj[i];
    if (reClass.test(s.className)) {
      var teksto = s.firstChild;
      var adreso = teksto.data.replace(reCxe, "$1@$3")
      adreso = adreso.replace(rePunkto, "$1.$3");
      adreso = adreso.replace(/\s*/g, ''); /* forigu spacojn */
      var ankro = document.createElement('a');
      ankro.appendChild(document.createTextNode(adreso));
      ankro.setAttribute('href', 'mailto:' + adreso);
      s.removeChild(teksto);
      s.appendChild(ankro);
    }
  }
}


/* Sxangxu href-atributojn en ligiloj, kiuj kondukas nin al aliaj pagxaroj.
 * Cxar la sxangxoj nur okazas dum musklakon, la nova valuto ne
 * montrigxas en la statusindikilo dum mussxvebo.
 */

function flaguElligilojn() {
  var ankroj = document.getElementsByTagName('a');
  var re1 = /^http:/;
  var re2 = new RegExp(window.location.hostname);
  for (var i = 0; i < ankroj.length; i++) {
    var a = ankroj[i];
    var url = a.getAttribute('href');
    if (re1.test(url) && !re2.test(url)) {
      var title = a.getAttribute('title') || '';
      a.setAttribute('title', title + (title == '' ? '' : ' ') + '(offsite)');
      a.onclick = function() {
        window.open('/cgi/go/' + this.getAttribute('href'), "_self");
        return(false);
      }
    }
  }
}


/* 
 * Rewrite anchors with classes of the form "popup-<width>x<height>" with
 * window.open() for their onClick attribute, so that the requested content
 * appears in a new window with dimensions width x height.
 *
 * Useful for launching video clips in a separate window.  Passes 
 * XHTML Strict muster, and degrades gracefully when JavaScript support
 * is absent.  (In such cases, the clip simply opens in the current window.)
 *
 * Author: Hoss Firooznia <hoss@lodestone.org>
 *
 */

/* automatically rewrite wxh links */
function sxangxuSxprucLigilojn() {
  var re = /popup-([0-9]+)x([0-9]+)/;
  var ankroj = document.getElementsByTagName("a");
  for (var i = 0; i < ankroj.length; i++) {
    var a = ankroj[i];
    var c = (a.getAttribute('class') || a.getAttribute('className'));
    if (re.test(c)) {
      a.onclick = function() {
        var ary =
          re.exec(this.getAttribute('class') || this.getAttribute('className'));
        var width = ary[1];
        var height = ary[2];
        window.open(this.getAttribute('href'), '_blank', +
          'toolbar=0,location=0,directories=0,status=0,' +
          'channelmode=0,dependent=0,fullscreen=0,menubar=0,' +
          'scrollbars=1,resizable=1,width=' + width + ',height=' +
          (Number(height) + 15));
        return(false);
      }
    }
  }
}

/* De: http://validweb.nl/artikelen/javascript/better-zebra-tables */
function striu() {
  var tables = document.getElementsByTagName("table");  

  for(var x=0;x!=tables.length;x++){
    var table = tables[x];
    if (! table) { return; }
    
    var tbodies = table.getElementsByTagName("tbody");
    
    for (var h = 0; h < tbodies.length; h++) {
      var even = true;
      var trs = tbodies[h].getElementsByTagName("tr");
      
      for (var i = 0; i < trs.length; i++) {
        if(even)
          trs[i].className += " even";
        even = !even;
      }
    }
  }
}

aldonuEventon(window, "load", flaguElligilojn);
aldonuEventon(window, "load", sxangxuSxprucLigilojn);
aldonuEventon(window, "load", kasxuRetposxtajnAdresojn);
aldonuEventon(window, "load", striu);

