/* $Id: komuna.js,v 1.1 2007/04/15 16:57:03 hoss Exp hoss $ */

// Turn a Unix seconds-since-epoch timestamp into a human friendly string
// such as "3 days ago" or "an hour ago". Format this clientside in Javascript
// rather than serverside so that the info looks right even if page is cached.
//
// By Nelson Minar <nelson@monkey.org>. License: public domain.
// http://www.nelson.monkey.org/~nelson/weblog/
//
// ref: the reference time you're evaluating. Seconds since epoch.
// now: optional parameter, current time. Leave blank to evaluate ref
//   according to browser's current time. Seconds since epoch.
//
// Example - ago(1125580859 - 60 * 3, 1125580859) == "3 minutes ago"

function kiomagxa(ref, nun) {
  if (typeof(nun) == "undefined") {
    nun = Math.floor(new Date().getTime() / 1000);
  }
  delta = nun - ref;
  if (delta < 0) {
    return "estontece";
  } else if (delta == 0) {
    return "nun";
  } else if (delta < 60) {
    return "antaŭ malpli ol 1 minuto";
  } else if (delta < 120) {
    return "antaŭ 1 minuto";
  } else if (delta < 3600) {
    minutes = Math.floor(delta / 60);
    return "antaŭ " + minutes + " minutoj";
  } else if (delta < 7200) {
    return "antaŭ 1 horo";
  } else if (delta < 86400) {
    hour = Math.floor(delta / 3600);
    return "antaŭ " + hour + " horoj";
  } else if (delta < 172800) {
    return "antaŭ 1 tago";
  } else if (delta <  1209600) {
    day = Math.floor(delta / 86400);
    return "antaŭ " + day + " tagoj";
  } else if (delta < 2592000) {
    week = Math.floor(delta / 604800);
    return "antaŭ " + week + " semajnoj";
  } else if (delta < 5184000) {
    return "antaŭ 1 monato";
  } else if (delta < 31536000) {
    month = Math.floor(delta / 2592000);
    return "antaŭ " + month + " monatoj";
  } else if (delta < 63072000) {
    return "antaŭ 1 jaro"
  } else {
    year = Math.floor(delta / 31536000);
    return "antaŭ " + year + " jaroj";
  }
}

function getTargetElement(evt) {
  var elem
  if (evt && evt.target) {
    elem = (evt.target.nodeType == 3) ? evt.target.parentNode : evt.target
  }
  else {
    elem = evt.srcElement
  }
  return(elem)
}

function getEvent(evt) {
  return((evt) ? evt : ((window.event) ? event : null))
}

/*
function eventHandler(evt) {
  evt = getEvent(evt)
  var elem = getTargetElement(evt)
  if (elem) {
    // do something
  }
}
<a onclick="eventHandler(event)"></a>
*/

function XMLHttpReq() {
  req = false;
  // branch for native XMLHttpRequest object
  if (window.XMLHttpRequest && !(window.ActiveXObject)) {
    try {
      req = new XMLHttpRequest();
    }
    catch(e) {
      req = false;
    }
  }
  else if (window.ActiveXObject) {
    // branch for IE/Windows ActiveX version
    try {
      req = new ActiveXObject("Msxml2.XMLHTTP");
    }
    catch(e) {
      try {
        req = new ActiveXObject("Microsoft.XMLHTTP");
      } catch(e) {
        req = false;
      }
    }
  }
  return req
}

function extractXMLTreeVal(req, name) {
  return req.responseXML.getElementsByTagName(name)[0].childNodes[0].nodeValue
}

/* 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); 
}

/* 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') || '';
      var aldonajxo = '(offsite link)';
      if (a.getAttribute('xml:lang') == 'eo')
        aldonajxo = '(fordirekta ligilo)';
      a.setAttribute('title', title + (title == '' ? '' : ' ') + aldonajxo);
      */
      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;
      }
    }
  }
}

/*
 * 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;
  }
}

// por MSIE, kiu ne scias pri la CSS3-elektmetodon *[lang] 
// ni aŭtomate aldonu tiun lingvon al la klaso, por ke MSIE
// sciu pri ĝi.

function trairu_kaj_aldonu_lingvoklason(nodo) {
  // nur trairu 'element'-nodojn
  if ((nodo.nodeType != 1) || !nodo.hasChildNodes())
    return(true)
  var lingvo = nodo.getAttribute('lang')
  if (lingvo) 
    cssjs('add', nodo, lingvo)
  for (var i = 0; i < nodo.childNodes.length; i++) {
    trairu_kaj_aldonu_lingvoklason(nodo.childNodes[i]);
  }
}
function helpuMSIE() { trairu_kaj_aldonu_lingvoklason(document.body); }

// ŝarĝu bildojn al malloka tabelo, por ke ni ne bezonu elŝuti ilin poste
var _cxiujBildoj = new Array()
function sxargxuBildojn(tbl) {
  var l = _cxiujBildoj.length
  for (var i=0; i < tbl.length; i++) {
    if (tbl[i] != undefined) {
      _cxiujBildoj[l+i] = new Image()
      _cxiujBildoj[l+i].src = tbl[i] 
    }
  }
}


function atentigi_sercxantojn() {
  if (!document.createElement) return;
  ref = document.referrer;
  if (ref.length == 0) return;
  if (/lodestone/.test(ref)) return;
  if (!/google|bing|yahoo/.test(ref)) return;
  var a = document.getElementById("atentigilo");
  a.innerHTML = "<div class='enhavo'>\
    <a href='/index.rss'>\
    <img style='float:left' src='/bildoj/feed-icon48x48.png'</a>\
    <div class='dulingva'\
      style='font-family:sans-serif; font-size: 90%; margin-left: 55px'>\
      <div xml:lang='en' lang='en'><p>\
        Welcome, visitor! If you find this site useful, you might want\
        to <a href='/novajxoj/feed/'>subscribe to the RSS feed</a>\
        for the latest updates.</p>\
      </div>\
      <div xml:lang='eo' lang='eo'>\
        <p>Bonvenon, vizitanto! Se vi ŝatas ĉi tiun retejon, eble vi ŝatus\
          <a href='/novajxoj/feed/'>aboni la RSS-fluon</a> por ricevi\
          la plej freŝajn novaĵojn.\
        </p>\
      </div> \
    </div>\
    <br style='clear:left; margin: 0' /></div>\
  ";
}

addEvent(window, "load", striu)
addEvent(window, "load", kasxuRetposxtajnAdresojn)
addEvent(window, "load", sxangxuSxprucLigilojn)
addEvent(window, "load", flaguElligilojn)
addEvent(window, "load", helpuMSIE)
addEvent(window, "load", atentigi_sercxantojn)

