// *************** link functionality *****************
// Add target = _blank to all non-hemscott links and target = _top to all internal links

addLoadEvent('footer',function() {
  var links = getElementsByTagName(document,'a');
  for(var i=0;i < links.length;i++) {
    var link = links[i];

    if (link.innerHTML.substring(0, 4) != 'www.'){
      if (link.href != '' && link.href.indexOf('mailto:') == -1) link.href = link.href.replace(/miranda/,'www');
    }

    if ((link.href.indexOf('http://') > -1 && link.href.indexOf('http://' + document.location.host) == -1)
     || (link.href.indexOf('https://') > -1 && link.href.indexOf('https://' + document.location.host) == -1)
     || elementHasClass(link,'external')) {
      link.target = "_blank";
      if (link.title == '') link.title = 'opens in a new window';
      else link.title += ' (opens in a new window)';
    }
    if (link.href.indexOf('http://') > -1 && link.href.indexOf('hemscott.com') > -1){
      link.target = "_top";
      if (link.title == '') link.title = 'opens in parent window';
      else link.title += ' (opens in parent window)';
    }
  }
});

// *************** replace functionality *****************

function replaceTitle(id,altText){
  var title = getElementById(id);
  var titleImage = createElement('img');
  titleImage.src = id + '.gif';
  titleImage.alt = altText;
  titleImage.id = id;
  replaceElement(title,titleImage);
}

// ***************** general utility functions ******************

function padNumber(number,width) {
  //pad a number with zeros, up to the specified width;
  var s = '' + number;
  while (s.length < width) s = '0' + s;
  return s;
}

function trim(text) {
  //trim whitespace from a string
  text = text.replace(/^\s+/g,''); //leading space
  return text.replace(/\s+$/g,''); //trailing space
}

function elementHasClass(element, className) {
  //return true if the element has the given class name
  className = className.replace(/\-/g, '\\-');
  var re = new RegExp('(^|\\s)' + className + '(\\s|$)');
  return re.test(element.className);
}

function applyClass(element, className) {
  //add a class to an element
  if (!elementHasClass(element, className)) element.className += ' ' + className;
}

function removeClass(element, className) {
  //remove a class from an element
  className = className.replace(/\-/g, '\\-');
  var re = new RegExp('(^|\\s)' + className + '(\\s|$)');
  element.className = element.className.replace(re,'');
}

function getElementById(id) {
  //get element with a given id
  return (document.all)? document.all[id] : document.getElementById(id);
}

function getElementsByTagName(container, tagName) {
  //get all html nodes of a given type within a given container
  if (container) return container.getElementsByTagName(tagName);
  else return new Array();
}

function getElementsByClassName(container, tagName, className) {
  //get all html nodes of a given type and class within a given container
  var elements = getElementsByTagName(container, tagName);
  var result = new Array();
  for(var i=0;i < elements.length;i++) {
    var e = elements[i];
    if (elementHasClass(e,className)) result.push(e);
  }
  return result;   
}

function addEvent(element, event, func) {
  //add an event to the specified element, preserving any existing events that are attached
  if (!element) return;
  if (element.addEventListener) {
    element.addEventListener(event, func, false);
    return true;  
  } else {
    var oldFn = element['on' + event];
    var fn;
    if (oldFn) {
      fn = function() {
        return oldFn();
        return func();
      }
    } else {
      fn = func;
    }
    if (element.attachEvent) return element.attachEvent('on' + event, fn);
    else element['on' + event] = fn;
  }
}

function addLoadEvent(id,func) {
  //add an onload event which will fire once the given id is located within the document
  //this is more reliable than window.onload and will happen exactly when needed

  function loadEvent() {
    var element = getElementById(id);
    if (element) func(); else window.setTimeout(loadEvent,2000);
  }

  loadEvent();

}

function createElement(tagName) {
  //create an html node of the specified type
  return document.createElement(tagName);
}

function createTextNode(text) {
  //create an html text node
  return document.createTextNode(text);
}

function replaceElement(element,replacement) {
  //replace an html node with the specified alternative
  if (element) element.parentNode.replaceChild(replacement,element);
}

function insertElement(parent,child) {
  //insert an html node within the specified parent, after the last child
  if (parent) parent.appendChild(child);
}

function removeElement(element) {
  //remove the specified node from the dom tree
  if (element && element.parentNode) element.parentNode.removeChild(element);
}

function insertElementBefore(element,before) {
  //insert an html node before the specified element
  if (before && before.parentNode) before.parentNode.insertBefore(element,before);
}

function insertElementAfter(element,after) {
  //insert an html node after the specified element
  if (after && after.parentNode) {
    if (after.nextSibling) insertElementBefore(element,after.nextSibling);
    else insertElement(after.parentNode,element);
  }
}

function showChildren(element, show) {
  //show or hide all the children of the specified element
  var display = (show)? 'inline':'none';
  if (element) for (e in element.childNodes) {
    var e = element.childNodes[e];
    if (e.style) e.style.display = display;
  }
}

function setElementPosition(element,x,y) {
  //set the absolute (document relative) position of an element in pixels
  if (element.offsetParent) { // using ie's relative positioning model
    x -= getOffsetLeft(element.parentNode);
    y -= getOffsetTop(element.parentNode);
  }
  element.style.left = x + 'px';
  element.style.top = y + 'px';
}

function getOffsetTop(element) {
  //get the absolute (document relative) position of an element in pixels
  var o = element.offsetTop;
  while (element.offsetParent) {
    element = element.offsetParent
    o += element.offsetTop;
  }
  return o;
}

function getOffsetLeft(element) {
  //get the absolute (document relative) position of an element in pixels
  var o = element.offsetLeft;
  while (element.offsetParent) {
    element = element.offsetParent
    o += element.offsetLeft;
  }
  return o;
}

function importScript(url) {
  //import an external javascript file
  document.writeln('<script type="text/javascript" src="' + url + '"></scr' + 'ipt>');
}

function getQueryParams(query) {
  //decode query parameters into an associative array
  var params = new Object();
  if (!query) return params;
  var start = query.indexOf('?');
  if (start > -1) query = query.substr(start + 1);
  var paramArray = query.split("&");
  for (var i in paramArray) {
    var param = paramArray[i];
    var splitPos = param.indexOf("=");
    var name = unescape(param.substring(0,splitPos));
    var value = unescape(param.substring(splitPos+1));
    params[name] = value;
  }
  return params;
}

function setCookie(name, value, expires, path, domain, secure) {
  //set a cookie
  document.cookie = name + '=' + escape(value) +
    ((typeof(expires) != 'undefined' && expires) ? '; expires=' + expires.toGMTString() : '') +
    ((typeof(path) != 'undefined' && path) ? '; path=' + path : '; path=/') +
    ((typeof(domain) != 'undefined' && domain) ? '; domain=' + domain : '') +
    ((typeof(secure) != 'undefined' && secure) ? '; secure' : '');
}

function deleteCookie(name) {
  //delete a cookie
  document.cookie = name + '=; expires=0; path=/';
}

function getCookie(name) {
  //get a cookie
  var dc = document.cookie;
  var prefix = name + '=';
  var begin = dc.indexOf('; ' + prefix);
  if (begin == -1) {
    begin = dc.indexOf(prefix);
    if (begin != 0) return null;
  } else begin += 2;
  var end = document.cookie.indexOf(';', begin);
  if (end == -1) end = dc.length;
  return unescape(dc.substring(begin + prefix.length, end));
}