/* 

 * 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).toUpperCase() + 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 (crumb.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);

}