var cd = {
	codes : [],
	init : function() {
		cd.moreInfo = getElementsByClassName(document, 'div', 'more-info');
		cd.nextPreviousDiv = $('nextPrevious');
		if(!checkClass($('questions'),'open')){
			addClass($('questions'),'closed');
		} else {
			if(cd.nextPreviousDiv){
				cd.hide(cd.nextPreviousDiv);
			}
		}
		cd.attach();
	},
	attach : function() {
		var i;
		for ( i=0;i<cd.moreInfo.length;i++ ) {
			addClass(cd.moreInfo[i].getElementsByTagName('DIV')[0], 'closed');
			addEvent(cd.moreInfo[i].getElementsByTagName('H4')[0],'click',cd.collapse);
		}
	},
	getEventSrc : function (e) {
		if (!e) e = window.event;
		if (e.originalTarget)
			return e.originalTarget;
		else if (e.srcElement)
		return e.srcElement;
	},
	collapse : function(e) {
		var el = cd.getEventSrc(e);
		el = el.parentNode.getElementsByTagName('DIV')[0];
		if (checkClass(el,'closed') || checkClass(el,'open')) {
			swapClass(el,'closed', 'open');
		} else {
			addClass(el,'closed');
		}
	},
	hide: function(el){
		var el = $(el);
		if(checkClass(el, 'open')){
			swapClass(el,'closed', 'open');
		} else {
			addClass(el, 'closed');
		}
	},
	show: function(el){
		var el = $(el);
		if(checkClass(el, 'closed')){
			swapClass(el,'closed', 'open');
		} else {
			addClass(el, 'open');
		}
	}
};

addLoadEvent(cd.init);


/******************************************************************************** /*
	
	ADD LOAD EVENT:																
	Adds events to trigger after page has fully loaded							
	
	EXAMPLES:																	
	addEvent(window,'load',func1,false);
	addEvent(window,'load',func2,false);
	addEvent(window,'load',func3,false);
	
/******************************************************************************* */

function addLoadEvent(func) {
	var oldonload = window.onload;
	if (typeof window.onload != 'function') {
		window.onload = func;
	}
	else {
		window.onload = function() {
			oldonload();
			func();
		}
	}
} // END ADD LOAD EVENT


/******************************************************************************** /*
	
	ADD EVENT:																
	Adds events elements
	addEvent() originally written by Dustin Diaz - http://www.dustindiaz.com
	eventCache originally written by Mark Wubben - http://novemberborn.net/javascript/event-cache
	
/******************************************************************************* */

function addEvent( obj, type, fn, useCapture ) {
	
	useCapture = (!useCapture)?false:useCapture;
	
	if (obj.addEventListener) {
		obj.addEventListener( type, fn, useCapture );
	}
	else if (obj.attachEvent) {
		obj["e"+type+fn] = fn;
		obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
		obj.attachEvent( "on"+type, obj[type+fn] );
	}
	else {
		obj["on"+type] = obj["e"+type+fn];
	}
}


// END ADD EVENT

/******************************************************************************** /*
	
	GET EVENT TARGET:																
	Adds events elements
	addEvent() originally written by Dustin Diaz - http://www.dustindiaz.com
	eventCache originally written by Mark Wubben - http://novemberborn.net/javascript/event-cache
	
/******************************************************************************* */

function getEventTarget(e){
	var obj;
	if (!e) var e = window.event; 
	if (e.target) obj = e.target; // W3C
	else if (e.srcElement) obj = e.srcElement; // IE
	if (obj.nodeType == 3) // defeat Safari bug
		obj = obj.parentNode;
	return obj;
} // END GET EVENT TARGET


/******************************************************************************** /*
	
	THE PROTOTYPE $ FUNCTION:																
	A very hot extension to get ElementsById()
	http://prototype.conio.net/
	
	// Sample Usage:
	var obj1 = document.getElementById('element1');
	var obj2 = document.getElementById('element2');
	
	function alertElements() {
	  var i;
	  var elements = $('a','b','c',obj1,obj2,'d','e');
	  for ( i=0;i<elements.length;i++ ) {
		alert(elements[i].id);
	  }
	}
	
/******************************************************************************* */

function $() {
	var elements = new Array();
	for (var i = 0; i < arguments.length; i++) {
		var element = arguments[i];
		if (typeof element == 'string')
			element = document.getElementById(element);
		if (arguments.length == 1)
			return element;
		elements.push(element);
	}
	return elements;
} // END PROTOTYPE $() FUNCTION



/******************************************************************************** /*
	
	GET ELEMENTS BY CLASS NAME:																
	Overrides prototypes getElementsByClassName() function.
	Adds optional tag parameter

/******************************************************************************* */

function getElementsByClassName(oElm, strTagName, strClassName){
	var arrElements = (strTagName == "*" && document.all)? document.all : oElm.getElementsByTagName(strTagName);
	var arrReturnElements = new Array();
	strClassName = strClassName.replace(/\-/g, "\\-");
	var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
	var oElement;
	for(var i=0; i<arrElements.length; i++){
		oElement = arrElements[i];		
		if(oRegExp.test(oElement.className)){
			arrReturnElements.push(oElement);
		}	
	}
	return (arrReturnElements)
}
// END GET ELEMENTS BY CLASS NAME

/******************************************************************************** /*
	
	Array.push:																
	adds push for ie 5

/******************************************************************************* */

Array.prototype.push = ArrayPush;
function ArrayPush(value){
	this[this.length] = value;
}

/******************************************************************************** /*

	CLASS MANIPULATION METHODS

/******************************************************************************* */

// add class to the element
function addClass(obj,c){
	if (typeof obj != 'undefined' && obj != null){
		if(!checkClass(obj,c)){obj.className+=obj.className==''?c:' '+c;}
	}
}

// remove class to the element
function removeClass(obj, c) {
	var rep=obj.className.match(' '+c)?' '+c:c;
	obj.className=obj.className.replace(rep,'');
}

// swap classes
function swapClass(obj,c1,c2){
	var cn=obj.className;
	
	if(!checkClass(obj,c1))
	{
		var myExpression = new RegExp("\\b"+c2+"\\b", "gi");
		sNewClass = cn.replace(myExpression,c1);
	}
	else
	{
		var myExpression = new RegExp("\\b"+c1+"\\b", "gi");
		sNewClass = cn.replace(myExpression,c2);
	}
	obj.className = sNewClass;
}

// check if an element has the defined class
function checkClass(obj,c){
	if (typeof obj != 'undefined' && obj != null){
		return new RegExp('\\b'+c+'\\b').test(obj.className);
	}
}
