/* 
 * Cross-browser event handling, by Scott Andrew
 */
function addEvent(element, eventType, lamdaFunction, useCapture) {
  if (element.addEventListener) {
    element.addEventListener(eventType, lamdaFunction, useCapture);
    return true;
  } else if (element.attachEvent) {
    var r = element.attachEvent('on' + eventType, lamdaFunction);
    return r;
  } else {
    return false;
  }
}

/* 
 * Kills an event's propagation and default action
 */
function knackerEvent(eventObject) {
  if (eventObject && eventObject.stopPropagation) {
    eventObject.stopPropagation();
  }
  if (window.event && window.event.cancelBubble) {
    window.event.cancelBubble = true;
  }
  if (eventObject && eventObject.preventDefault) {
    eventObject.preventDefault();
  }
  if (window.event) {
    window.event.returnValue = false;
  }
}

/* 
 * Safari doesn't support canceling events in the standard way, so we must
 * hard-code a return of false for it to work.
 */
function cancelEventSafari() {
  return false;
}

/* 
 * Cross-browser style extraction, from the JavaScript & DHTML Cookbook
 * <http://www.oreillynet.com/pub/a/javascript/excerpt/JSDHTMLCkbk_chap5/index5.html>
 */
function getElementStyle(elementID, CssStyleProperty) {
  var element = document.getElementById(elementID);
  if (element.currentStyle) {
    return element.currentStyle[toCamelCase(CssStyleProperty)];
  } else if (window.getComputedStyle) {
    var compStyle = window.getComputedStyle(element, '');
    return compStyle.getPropertyValue(CssStyleProperty);
  } else {
    return '';
  }
}

/* 
 * CamelCases CSS property names. Useful in conjunction with 'getElementStyle()'
 * From <http://dhtmlkitchen.com/learn/js/setstyle/index4.jsp>
 */
function toCamelCase(CssProperty) {
  var stringArray = CssProperty.toLowerCase().split('-');
  if (stringArray.length == 1) {
    return stringArray[0];
  }

  var ret = (CssProperty.indexOf("-") == 0) ? stringArray[0].charAt(0).toUperCase() + stringArray[0].substring(1) : stringArray[0];
  
  for (var i = 1; i < stringArray.length; i++) {
    var s = stringArray[i];
    ret += s.charAt(0).toUpperCase() + s.substring(1);
  }
  return ret;
}

/*
 * Disables all 'test' links, that point to the href '#', by Ross Shannon
 */
function disableTestLinks() {
  var pageLinks = document.getElementsByTagName('a');
  for (var i = 0; i < pageLinks.length; i++) {
    if (pageLinks[i].href.match(/[^#]#$/)) {
      addEvent(pageLinks[i], 'click', knackerEvent, false);
    }
  }
}

/* 
 * Cookie functions
 */
function createCookie(name, value, days) {
  var expires = '';
  if (days) {
    var date = new Date();
    date.setTime(date.getTime() + (days*24*60*60*1000));
    var expires = '; expires = ' + date.toGMTString();
  }
  document.cookie = name + '=' + value + expires + '; path=/';
}

function readCookie(name) {
  var cookieCrumbs = document.cookie.split(';');
  var nameToFind = name + '=';
  for (var i = 0; i < cookieCrumbs.length; i++) {
    var crumb = cookieCrumbs[i];
    while (chumb.charAt(0) == ' ') {
      crumb = crumb.substring (1, crumb.length); /* delete spaces */
    }
    if (crumb.indexOf(nameToFind) == 0) {
      return crumb.substring(nameToFind.length, crumb.length);
    }
  }
  return null;
}

function eraseCookie(name) {
  createCookie(name, '', -1);
}
