/*****************************************************************************\
* Miscellaneous common functions                                              *
* Copyright (c) 2007 Joerg Tremmel                                            *
 ******************************************************************************
* 09.01.2007  J.Tremmel  initial
* 10.04.2008  J.Tremmel  added discloseEmailAddresses()
* 28.11.2008  J.Tremmel  added retargetExternalLinks(), tweaked discloseEmailAddresses()
* 19.08.2009  J.Tremmel  cleanup w/ JSLint
\*****************************************************************************/
/**
* Safely adds a load event to the window.onload handler
* See: http://simon.incutio.com/archive/2004/05/26/addLoadEvent
*/
function addLoadEvent( func ) { //{{{
  var oldonload = window.onload;
  if (typeof window.onload != 'function') {
    window.onload = func;
  } else {
    window.onload = function() { oldonload(); func(); };
  }
  //}}}
}

/** gets flattened text data of a node and its child elements */
function getChildData(obj) { //{{{
  var data = '';
  for (var k = 0; k < obj.childNodes.length; k++) {
    var child = obj.childNodes[k];
    if (child.data) { data += child.data; }
    if (child.hasChildNodes()) { data += getChildData(child); }
  }
  return data;
  //}}}
}

/** show/hide "toggle" action for entries in news archive */
function toggleArchiveView() { //{{{
  var items = this.parentNode.parentNode.getElementsByTagName('li');
  for (var i = 0; i < items.length; i++) { items[i].className = ''; }
  this.parentNode.className = 'active';
  return false;
  //}}}
}

/** adds "toggle" behaviour to entries in news archive */
function addArchiveNavToggles() { //{{{
  var links = document.links;
  for (var i = 0; i < links.length; i++) {
    if (links[i].className.search(/archive/) > -1) {
        links[i].onclick = toggleArchiveView;
    }
  }
  //}}}
}

/** Discloses previously obscured email addresses */
function discloseEmailAddresses() { //{{{
  var items = document.getElementsByTagName('span');
  // apply changes starting at the "end" to avoid conflicts due to a changing result set
  for (var i = items.length -1 ; i >= 0; i--) {
    if (items[i].className != 'obscuredEmail') { continue; }
    var target = items[i];
    var padding = target.getElementsByTagName('em');
    if (!padding) { continue; }
    for (var j = padding.length; j > 0; --j) {
      target.removeChild(padding[j-1]);
    }
    var email = getChildData(target);
    var link = document.createElement('a');
    link.appendChild(document.createTextNode(email));
    link.href = 'mailto:'+email;
    target.parentNode.replaceChild(link, target);
  }
  //}}}
}

/** Retargets "external" links to open in a new window/tab */
function retargetExternalLinks() { //{{{
  var links = document.links;
  var host  = location.hostname.toLowerCase();
  host.split('.').slice(-2).join('.'); // use only server + single tld
  for (var i = 0; i < links.length; i++) {
    if (links[i].hostname) {
      if (links[i].hostname.substr(-host.length).toLowerCase() != host) {
        links[i].target = "_blank";
      }
    }
  }
  //}}}
}

addLoadEvent(discloseEmailAddresses);
addLoadEvent(retargetExternalLinks);
addLoadEvent(addArchiveNavToggles);


