// common functions/objects etc.

function OnLoadHandler() {
  var self = this;
  this.handlers = [];
  this.addHandler = function(f) {
    if (typeof(f)!='function') {
      alert('addOnloadHandler(): f is not of type "function".');
      return false;
    } else {
      self.handlers[self.handlers.length] = f;
    }
  }
  this.onload = function() {
    for (var i=0; i<self.handlers.length; i++) {
      self.handlers[i]();
    }
  }
}

// JS Debugging

var oDebug = null;
var tStart = new Date();

var DEBUG_ENABLED = (window.location.toString().indexOf('debug=1')+1);

function writeDebug(html) {
  if (document.body && !oDebug) {
    oDebug = document.createElement('div');
    oDebug.style.position = 'absolute';
    oDebug.style.zIndex = 100;
    oDebug.style.right = '4px';
    oDebug.style.top = '8px';
    oDebug.style.width = '218px';
    oDebug.style.padding = '4px';
    oDebug.style.border = '1px solid #999';
    oDebug.style.backgroundColor = '#eee';
    oDebug.style.font = '9px Lucida Console';
    oDebug.style.color = '#666';
    oDebug.onclick = function(){this.style.display='none';}
    document.body.appendChild(oDebug);
  }
  if (oDebug) {
    newDiv = document.createElement('div');
    newDiv.innerHTML = (new Date()-tStart)+': '+html;
    oDebug.appendChild(newDiv);
  }
}

if (!DEBUG_ENABLED) writeDebug = function(){}

var nodes = null;

function getElementsByClassName(className,tagNames,oParent) {
  // grab elements matching className, restricting search to certain tags or a parent element
  // tagNames: Optional. Can be a string or array of strings
  // oParent: Optional. Can be an object eg. a DIV etc.
  var doc = (oParent||document);
  var matches = [];
  var i,j;
  writeDebug('getEBCN('+className+',['+tagNames+'],'+(oParent?oParent.nodeName:'document')+')');
  // nodes - globally declared array (var nodes = [])
  if (!nodes) nodes = []; // required to keep Opera happy
  if (tagNames && typeof(tagNames)!='string') {
    for (i=0; i<tagNames.length; i++) {
      if (!nodes || !nodes[tagNames[i]]) {
        nodes[tagNames[i]] = doc.getElementsByTagName(tagNames[i]);
      }
    }
  } else if (tagNames) {
    nodes = tagNames?(doc.getElementsByTagName(tagNames)):(doc.all||doc.getElementsByTagName('*'));
  }
  if (typeof(tagNames)!='string') {
    for (i=0; i<tagNames.length; i++) {
      for (j=0; j<nodes[tagNames[i]].length; j++) {
        if (nodes[tagNames[i]][j].className && nodes[tagNames[i]][j].className.indexOf(className)+1 && (nodes[tagNames[i]][j].className == className || nodes[tagNames[i]][j].className.indexOf(className+' ')+1 || nodes[tagNames[i]][j].className.indexOf(' '+className)+1)) {
          matches[matches.length] = nodes[tagNames[i]][j];
        }
      }
    }
  } else {
    for (i=0; i<nodes.length; i++) {
      if (nodes[i].className && nodes[i].className.indexOf(className)+1 && (nodes[i].className == className || nodes[i].className.indexOf(className+' ')+1 || nodes[i].className.indexOf(' '+className)+1)) {
        matches[matches.length] = nodes[i];
      }
    }
  }
  writeDebug('getEBCN(): returning '+matches.length+' matches');
  return matches;
}

function winOpen(url,name,width,height,params) {
  // pop-up blocking/error handling can be added here
  if (!name) name = ('andersenPopup'+parseInt(Math.random()*1048576)); // random window name
  var result = window.open(url,name,width,height,params);
  return result;
}

function fixTriangleLinks(tags,count) {
  // fix for broken margin/spacing IE on block-inline links (eg. ie:win32, for example)
  writeDebug('fixTriangleLinks()');
  tags = tags||['a','div','span','input'];
  count = count?count:4;
  fixTriangleItems(getElementsByClassName('triangle',tags),count);
  fixTriangleItems(getElementsByClassName('triangle-dark',tags),count);
}

function fixTriangleItems(elements,count) {
  var html = '';
  for (var i=0; i<count; i++) {
    html += '&nbsp;';
  }
  if (!elements || !elements.length) return false;
  for (var i=0; i<elements.length; i++) {
    elements[i].innerHTML = elements[i].innerHTML + html;
  }
}

function TriangleMouseOverHandler() {
  this.className = (this.className + (this.className?' ':'')+'hover');
  if (this._onmouseover) this._onmouseover();
}

function TriangleMouseOutHandler() {
  this.className = this.className.replace(/ hover/g,'');
  if (this._onmouseout) this._onmouseout();
}

function ButtonMouseOverHandler() {
  this.className = (this.className+'-active');
  if (this._onmouseover) writeDebug('Crash over?');
  if (this._onmouseover) this._onmouseover();
  writeDebug(this.className);
}

function ButtonMouseOutHandler() {
  this.className = this.className.replace(/-active/g,'');
  if (this._onmouseout) writeDebug('Crash out?');
  if (this._onmouseout) this._onmouseout();
  writeDebug(this.className);
}

function GButtonMouseOverHandler() {
  this.className = this.className+'-active';
  if (this._onmouseover) this._onmouseover();
}

function GButtonMouseOutHandler() {
  this.className = this.className.replace(/-active/g,'');
  if (this._onmouseout) this._onmouseout();
}

function addTriangleHover() {
  writeDebug('Adding non-anchor-based triangle hover');
  var elements = getElementsByClassName('triangle',['div','span','input','button']);
  if (!elements.length) return false;
  addMouseHandlers(elements,TriangleMouseOverHandler,TriangleMouseOutHandler);
}

function addButtonHover() {
  // for block-link type buttons
  writeDebug('Adding button.block-link hover');
  var elements = getElementsByClassName('block-link',['button']);
  addMouseHandlers(elements,ButtonMouseOverHandler,ButtonMouseOutHandler);
  elements = getElementsByClassName('generic-button',['button']);
  addMouseHandlers(elements,GButtonMouseOverHandler,GButtonMouseOutHandler);
}  

function addMouseHandlers(elements,OverHandler,OutHandler) {
  for (var i=0; i<elements.length; i++) {
    if (elements[i].onmouseover) elements[i]._onmouseover = elements[i].onmouseover;
    if (elements[i].onmouseout) elements[i]._onmouseout = elements[i].onmouseout;
    elements[i].onmouseover = OverHandler;
    elements[i].onmouseout = OutHandler;
  }
}

function fixClearElements() {
  // add &nbsp; to clear elements where applicable (when whitespace not recognised as "content")
  writeDebug('fixClearElements()');
  var elements = getElementsByClassName('clear','div',document.getElementById('content-main'));
  for (var i=0; i<elements.length; i++) {
    elements[i].innerHTML = '&nbsp;';
    elements[i].style.marginTop = '-2px'; // compensate for spacing
  }
}

function addFooterSpacing() {
  // add &nbsp; to footer links where applicable (when margins are not recognised)
  var elements = document.getElementById('footer').getElementsByTagName('a');
  var spacing = '&nbsp;&nbsp;&nbsp;&nbsp';
  elements[0].innerHTML = spacing + elements[0].innerHTML;
  for (var i=0; i<elements.length; i++) {
    elements[i].innerHTML = elements[i].innerHTML + spacing;
  }
}

var onloadHandler = new OnLoadHandler();
// assign function references and event handler
var addOnloadHandler = onloadHandler.addHandler;
window.onload = onloadHandler.onload;

if (navigator.appVersion.indexOf('MSIE 5.0')+1 && navigator.platform == 'Win32') {
  addOnloadHandler(fixTriangleLinks);
  addOnloadHandler(addFooterSpacing);
}
if (navigator.appVersion.indexOf('MSIE')+1) {
  // add hover for non-anchor triangle items
  addOnloadHandler(addTriangleHover);
  addOnloadHandler(addButtonHover);
}
if (navigator.userAgent.indexOf('Netscape6')+1) {
  addOnloadHandler(fixClearElements);
  addOnloadHandler(function(){fixTriangleLinks(['input','button'],2);})
}
if (navigator.userAgent.indexOf('Netscape/7')+1) {
  addOnloadHandler(fixClearElements);
  addOnloadHandler(function(){fixTriangleLinks(['button'],2);});
}

