if (typeof CPP == "undefined" || !CPP) {
	//create CPP namespace if it hasn't been done already
	CPP = new Object();
}

CPP.setStyles = new Array();

/* credit due
	dynamicCSS.js v1.0 <http://www.bobbyvandersluis.com/articles/dynamicCSS.php>
	Copyright 2005 Bobby van der Sluis
	This software is licensed under the CC-GNU LGPL <http://creativecommons.org/licenses/LGPL/2.1/>

	
	changes
	- moved to pwcc namespace
	- added media to passed variables

*/
CPP.createStyleRule = function (selector, declaration, media) {
	if (media == null)
		media = 'screen';
	if (!document.getElementsByTagName ||
		!(document.createElement || document.createElementNS)) return;
	var agt = navigator.userAgent.toLowerCase();
	var is_ie = ((agt.indexOf("msie") != -1) &&  (agt.indexOf("opera") == -1));
	var is_iewin = (is_ie &&  (agt.indexOf("win") != -1));
	var is_iemac = (is_ie &&  (agt.indexOf("mac") != -1));
	if (is_iemac) return; // script doesn't work properly in IE/Mac
	var head = document.getElementsByTagName("head")[0];
	var style = (typeof document.createElementNS != "undefined") ?
		document.createElementNS("http://www.w3.org/1999/xhtml", "style") :
		document.createElement("style");
	if (!is_iewin) {
		var styleRule = document.createTextNode(selector + " {" + declaration + "}");
			style.appendChild(styleRule); // bugs in IE/Win
	}
	style.setAttribute("type", "text/css");
	style.setAttribute("media", media); 
	head.appendChild(style);
 	if (is_iewin &&  document.styleSheets &&  document.styleSheets.length > 0) {
		var lastStyle = document.styleSheets[document.styleSheets.length - 1];
		if (typeof lastStyle.addRule == "object") {
			lastStyle.addRule(selector, declaration);
		}
	}
}

CPP.getElement = function (type, name, node){
	sb = 0;
	el = null;
	if( type == '.'){
		elements	= CPP.getElementsByClass( name, null, node );
		for(var i=0; i<elements.length-1; i++ ){
			sb = elements[i].offsetHeight + sb;
		}
		el = elements[elements.length - 1];
	}else{
        el = document.getElementById( name );
	}
	return new Array(el, sb);
}

CPP.getComputedHeight = function ( el, node ){
	maxHeight = 0;
	for( var i=0; i<el.length; i++ ){
		objHeight = 0;

		if(isArray( el[i] ))
			objHeight = CPP.getComputedHeight( el[i], node );
		else
			objHeight = CPP.getSingleHeight( el[i], node );

		maxHeight += objHeight;
	}

	return maxHeight;
}

CPP.getSingleHeight = function ( el, node ){
	type = el.substr( 0, 1 );
	name = el.substr( 1 );
	height = 0;
	if( type == '.'){
		elements	= CPP.getElementsByClass( name, null, node );
		for(var i=0; i<elements.length; i++ ){
			height = elements[i].offsetHeight + height;
		}
	}else{
        height = document.getElementById( name ).offsetHeight;
	}

	return height;
}

// Not being Used yet
/*
CPP.getLastElement = function ( el, node, height, subtract ){
	last		= el[el.length - 1];
	type		= el.substr( 0, 1 );
	name		= el.substr( 1 );
	subtract	= typeof(subtract) != 'undefined' ? subtract : 0;

	for(var i=0; i<el.length; i++ ){
		if(isArray( el[i] )) continue;
		subtract = el[i].offsetHeight + subtract;
	}

	if(isArray( last ))
		CPP.getLastElement( last, node, height, subtract );
	else
		CPP.setSingleHeight( last, node, height, subtract );
}
*/

CPP.setComputedHeight = function ( el, node, height ){
	subtract = 0;
	if ( el.length < 1) {
		return;
	};
	for( var i=0; i<el.length; i++ ){
		nel = el[i];
		if(el.length-1 == i) continue; // Avoid adding the last element
		type		= nel.substr( 0, 1 );
		name		= nel.substr( 1 );
		rt			= CPP.getElement(type, name, node);
		subtract	= rt[0].offsetHeight + rt[1] + subtract;
	}
	// If this is not the tallest column
	if(subtract + rt[0].offsetHeight == height){
		subtract = height;
	}
	if(isArray( nel ))
		CPP.getLastElement( nel, node, height );
	else
		CPP.setSingleHeight( nel, node, height, subtract );
}

CPP.setSingleHeight = function ( el, node, height, subtract ){
	type		= el.substr( 0, 1 );
	name		= el.substr( 1 );
	isubtract	= typeof(subtract)	!= 'undefined' ? subtract : 0;		// Override the subtract
	media		= typeof(media)		!= 'undefined' ? media : 'screen';

	rt			= CPP.getElement(type, name, node);
	element		= rt[0];
	subtract	= rt[1];
	if(isubtract) subtract = isubtract;

	height		= height - subtract;
	className	= 'equalHeight-' + height;

	CPP.addClass(element, className);
	if(CPP.setStyles[className]) return;
	CPP.setStyles[className] = true;

	// Create css declaration
	var classDeclaration = 'min-height: ' + height + 'px;'
	var ie6Declaration = 'height: ' + height + 'px;'
	CPP.createStyleRule('.' + className, classDeclaration, media);
	CPP.createStyleRule('* html .' + className, ie6Declaration, media);
}

CPP.equalHeight = function (eql, node, className, media) {
	media		= typeof(media)		!= 'undefined' ? media : 'screen';
	className	= typeof(className)	!= 'undefined' ? className : 'equalHeight';

	eql = CPP.cleanIDs( eql );

	if(eql.lenght < 1) return;

	// Generate class name
	var classRandom = Math.floor(Math.random()*999999);
	className = className + '-' + classRandom;

	// Get column heights, add class name to html elemenets
	var maxHeight = 0;
	for(var i=0; i<eql.length; i++ ){
		objHeight = 0;

		if(isArray(eql[i]))
			objHeight = CPP.getComputedHeight( eql[i], node );
		else
			objHeight = CPP.getSingleHeight( eql[i], node );

		// Determine if this is the heighest object
		if (objHeight > maxHeight)
			maxHeight = objHeight;
	}

	for(var i=0; i<eql.length; i++ ){
		if(isArray(eql[i]))
			objHeight = CPP.setComputedHeight( eql[i], node, maxHeight );
		else
			objHeight = CPP.setSingleHeight( eql[i], node, maxHeight );
	}
}

CPP.cleanIDs = function( eql ){
	for( var i=0; i<eql.length; i++ ){
		if( isArray(eql[i]) ){
			eql[i] = CPP.cleanIDs(eql[i]);
		}else{
			type = eql[i].substr( 0, 1 );
			name = eql[i].substr( 1 );
			height = 0;
			if( type == '.'){
				continue;
			}else{
		        if( !document.getElementById( name ) ){
					delete eql[i];
				}
			}
		}
	}

	new_arr = new Array();
	for( var i=0; i<eql.length; i++ ){
		if(typeof eql[i] != 'undefined')
			new_arr.push(eql[i]);
	}

	return new_arr;
}

// Setup the event
CPP.DomReady = function(fn) {
	var _this = this;
	// W3C
	if(document.addEventListener)
		document.addEventListener("DOMContentLoaded", fn, false);
	// IE
	else
		document.onreadystatechange = function(){CPP.readyState(fn)}
}

// IE execute function
CPP.readyState = function (fn) {
	//dom is ready for interaction
	if(document.readyState == "interactive")
		fn();
}

// Create onDomReady Event
window.onDomReady = CPP.DomReady;

CPP.onReady = function () {
	// Called on Dom Initialisation
}

window.onDomReady(function() {
	CPP.onReady();
});


/**
 * Functions addLoadEvent, addDomEvent
 * 
 * Adds an event to the window.onload event
 * addLoadEvent should only be used for functions that require a knowledge of images, otherwise addDomEvent should be used
 * 
 * Credit Due: Simon Willison, simonwillison.net
 * Taken from: http://simonwillison.net/2004/May/26/addLoadEvent/
 * 
 * CHANGE LOG
 * changed to CPP name space
 * addDomEvent is a straight copy of addLoad Event, works with DomInit rather that window.onload
 **/


CPP.addLoadEvent = function(func) {
	var oldonload = window.onload;
	if (typeof window.onload != 'function') {
		window.onload = func;
	} else {
		window.onload = function() {
			if (oldonload)
				oldonload();
			func();
		}
	}
}

CPP.addDomEvent = function(func) {
	var oldDomInit = this.onReady;
	var _this = this;
	if (typeof oldDomInit != 'function') {
		_this.onReady = func;
	} else {
		_this.onReady = function() {
   			if (oldDomInit) {
   		        oldDomInit();
   			}
   			func();
		}
	}
}


// Two options for running addLoadEvent
/*
CPP.addLoadEvent(nameOfSomeFunctionToRunOnPageLoad);

CPP.addLoadEvent(function() {
  // more code to run on page load
});

	functions 
		hasClass
		addClass
		removeClass

	checks for, adds and removes classes from an element

	Credit due: Sitepoint - Kevin Yank, Cameron Adams
	Book: Simply Javascript - http://www.sitepoint.com/books/javascript1/

	CHANGE LOG
	changed to CPP namespace
*/

CPP.hasClass = function(target, theClass) {
	var pattern = new RegExp("(^| )" + theClass + "( |$)");

	if (pattern.test(target.className))
		return true;

	return false;
}

CPP.addClass = function(target, theClass) {
	if (!this.hasClass(target, theClass))
		if (target.className == "")
			target.className = theClass;
		else
			target.className += " " + theClass;
}

CPP.removeClass = function(target, theClass) {
	var pattern = new RegExp("(^| )" + theClass + "( |$)");

	target.className = target.className.replace(pattern, "$1");
	target.className = target.className.replace(/ $/, "");
}


//http://javascript.internet.com/snippets/getelementsbyclass.html
// swapped tag and node around.
// added lines var i & var j to avoid globals
// moved to CPP name space
CPP.getElementsByClass = function(searchClass,tag,node) {
	var classElements = new Array();
	if (node == null)
		node = document;
	if (tag == null)
		tag = '*';
	var els = node.getElementsByTagName(tag);
	var elsLen = els.length;
	var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
	for (var i = 0, j = 0; i < elsLen; i++) {
		if (pattern.test(els[i].className) ) {
			classElements[j] = els[i];
			j++;
		}
	}
	return classElements;
}

function isArray(obj) {
	//returns true is it is an array
	try{
		if (obj.constructor.toString().indexOf("Array") == -1){
			return false;
		}else{
			return true;
		}
	}catch(e){return false;}
}
