function ClassBehaviour2(){
		//the handler names and handler arrays
		this.name = 'libClassBehaviour2';
		this.initialized = false;
		this.handlerNames = ["first"];
		this.handlers = [];
		//crosbrowser vars
		this.isDOM = document.getElementById?true:false;
		this.isIE = document.all?true:false;
		this.allNodes = this.isDOM?document.getElementsByTagName("*"):document.all;
		document.write('<span class="CBinit" />');
		//initialize
		this.includeHandlers(this.allNodes);
	}
		ClassBehaviour2.prototype.includeHandlers = function(allNodes){
			for(var n=0; n<allNodes.length; n++){
				inc = false;
				if(allNodes[n].className){
					nodeClasses = allNodes[n].className.split(" ");
					for(s = 0; s < nodeClasses.length; s++){
						if(nodeClasses[s].substr(0,2) == 'CB'){
							for(h = 0; h < this.handlerNames.length; h++){
								if(this.handlerNames[h] == nodeClasses[s].toLowerCase().substr(2)){
									nodeClasses[s] = "";
								}else{
									inc = true;
								}
							}
						}else{
							nodeClasses[s] = "";
						}
					}
					if(inc){
						for(x = 0; x < nodeClasses.length; x++){
							if(nodeClasses[x] != ""){
								document.write('\n<script type="text\/javascript" src="\/scripts\/' + nodeClasses[x].toLowerCase().substr(2) + '.js"><\/script>');
								this.handlerNames[this.handlerNames.length] = nodeClasses[x].toLowerCase().substr(2);
							}
						}
					}
				}
			}
			document.write('');
			//set an interval for IE to load CB
			document.write('<script type="text\/javascript">I = setInterval("if(CB.initialized){clearInterval(I);CB.parseDocument();};", 50);<\/script>');
		}
		ClassBehaviour2.prototype.parseDocument = function(){
			for(var n=0; n<this.allNodes.length; n++){
				inc = false;
				if(this.allNodes[n].className){
					nodeClasses = this.allNodes[n].className.split(" ");
					for(s = 0; s < nodeClasses.length; s++){
						if(nodeClasses[s].substr(0,2) == 'CB'){
							for(h = 0; h < this.handlerNames.length; h++){
								nodeClass = nodeClasses[s].toLowerCase().substr(2);
								if(nodeClass == this.handlerNames[h]){
										this.handlers[this.handlers.length] = eval('new ' + this.handlerNames[h] + '(this.allNodes[n])');
								}
							}
						}
					}
				}
			}
		}
		ClassBehaviour2.prototype.getClassParameter = function(targetNode, paramName, defaultValue){
			var classParameter = targetNode.className;
			classParameter = classParameter.split(paramName + '_');
			classParameter = (classParameter.length>1) ? classParameter[1].split(' ')[0] : null ;
			return (classParameter!=null) ? classParameter : defaultValue ;
		}
		ClassBehaviour2.prototype.getParentNode = function(node){
			prnt = node.parentNode;
			while(prnt.className.lastIndexOf('parentNode') == -1){
				prnt = prnt.parentNode;
				if(prnt.nodeName == 'BODY'){
					break;
				}
			}
			return prnt;
		}
		ClassBehaviour2.prototype.getElementsByClassName = function(node, classname){
			allNodes = node.getElementsByTagName("*");
			nodes = [];
			CBcnt = allNodes.length;
			for(q = 0; q < CBcnt; q++){
				classes = allNodes[q].className.split(' ');
				for(n = 0; n < classes.length; n++){
					if(classes[n] == classname){
						nodes[nodes.length] = allNodes[q];
					}
				}
			}
			return(nodes);
		}	
var CB = new ClassBehaviour2();


/* 
 * 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;        
}


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()'
 */
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);
}

/*
 * Clear Default Text: functions for clearing and replacing default text in
 * <input> elements. by Ross Shannon
 */

addEvent(window, 'load', init, false);

function init() {
    var formInputs = document.getElementsByTagName('input');
    for (var i = 0; i < formInputs.length; i++) {
        var theInput = formInputs[i];
        
        if (theInput.type == 'text' && theInput.className.match(/\bcleardefault\b/)) {  
            /* Add event handlers */          
            addEvent(theInput, 'focus', clearDefaultText, false);
            addEvent(theInput, 'blur', replaceDefaultText, false);
            
            /* Save the current value */
            if (theInput.value != '') {
                theInput.defaultText = theInput.value;
            }
        }
    }
}

function clearDefaultText(e) {
    var target = window.event ? window.event.srcElement : e ? e.target : null;
    if (!target) return;
    
    if (target.value == target.defaultText) {
        target.value = '';
    }
}

function replaceDefaultText(e) {
    var target = window.event ? window.event.srcElement : e ? e.target : null;
    if (!target) return;
    
    if (target.value == '' && target.defaultText) {
        target.value = target.defaultText;
    }
}