function classBehaviour(){
		//the handler names and handler arrays
		this.name = 'libClassBehaviour';
		this.initialized = false;
		this.handlerNames = ["first"];
		this.handlers = [];
		//crosbrowser vars
		this.isDOM = document.getElementById?true:false;
		this.isIE = document.all?true:false;
		document.write('<span class="CBinit" />');
		this.allNodes = this.isDOM?document.getElementsByTagName("*"):document.all;
		
		//initialize
		this.includeHandlers(this.allNodes);
	}
		classBehaviour.prototype.includeHandlers = function(allNodes){
			// for all tags
			for(var n=0; n<allNodes.length; n++){
				inc = false;
				// if the item has a className
				if(allNodes[n].className){
					nodeClasses = allNodes[n].className.split(" ");
					//for each class of the element
					for(s = 0; s < nodeClasses.length; s++){
						if(nodeClasses[s].substr(0,2) == 'CB'){
						 
							for(hh = 0; hh < this.handlerNames.length; hh++){
								if(this.handlerNames[hh] == 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>');
		}
		// parse the document for classnames
		classBehaviour.prototype.parseDocument = function(){
			// for all tags
			for(var n=0; n<this.allNodes.length; n++){
				inc = false;
				// if the item has a className
				if(this.allNodes[n].className){
					nodeClasses = this.allNodes[n].className.split(" ");
					//for each class of the element
					for(s = 0; s < nodeClasses.length; s++){
						if(nodeClasses[s].substr(0,2) == 'CB'){
							for(hh = 0; hh < this.handlerNames.length; hh++){
								nodeClass = nodeClasses[s].toLowerCase().substr(2);
								// if the behaviour's name exists in the class name, apply it's events
								if(nodeClass == this.handlerNames[hh]){
										this.handlers[this.handlers.length] = eval('new ' + this.handlerNames[hh] + '(this.allNodes[n])');
								}
							}
						}
					}
				}
			}
		}
		classBehaviour.prototype.getClassParameter = function(targetNode, paramName, defaultValue){
			// get the class parameter from the classname
			var classParameter = targetNode.className;
			// split the classname between the parameter name
			classParameter = classParameter.split(paramName + '_');
			// split the second piece between spaces and take the first part,  if there are two pieces
			classParameter = (classParameter.length>1) ? classParameter[1].split(' ')[0] : null ;
			// return the value
			return (classParameter!=null) ? classParameter : defaultValue ;
		}
		classBehaviour.prototype.getParentNode = function(node){
			prnt = node.parentNode;
			while(prnt.className.lastIndexOf('parentNode') == -1){
				prnt = prnt.parentNode;
				if(prnt.nodeName == 'BODY'){
					break;
				}
			}
			return prnt;
		}
		classBehaviour.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 classBehaviour();
