//argument 4 (arguments[3]), which is optional, is used to determine if the link is encapsulated in a parent element
//if it is, the function will traverse the parent's siblings instead of the links
//argument 5 is the parent level to start from
//argument 6 is the tagName, if blank, will default to A
//argument 7 is the value you want the function to return (this is intended to allow you to place the click handler on 
//			 checkboxes and still have them tick (a link on the other hand might be more useful returning false, which is the default).
//argument 8 - only one allowed, default is false, this collapses all other elements with the same collapsible class
function setCollapsibles(linkClass, linkAlternateClass, collapsibleClass){
	var useParent = false;
	var parentLevel = 0; // default is 0 levels
	var tagName = "A";
	var returnVal = false;
	var onlyOneAllowed = false;
	
	// length is number of elements and array is 0 indexed
	if (arguments.length > 3){
		useParent = arguments[3];
	}
	
	if (arguments.length > 4 )
	{
		parentLevel = arguments[4];
	}
	
	if (arguments.length > 5){
		if (arguments[5] == ""){
			tagName = "A";
		} else {
			tagName = arguments[5].toUpperCase();
		}
	}
	
	if (arguments.length > 6){
		returnVal = arguments[6];
	}
	
	if (arguments.length > 7){
		onlyOneAllowed = arguments[7];
	}
	
	var anchors = document.getElementsByTagName(tagName);
	
	for (i = 0; i < anchors.length; i++)
	{
		//debugger;
		if (isClass(anchors[i], linkClass))
		{
			/*****************
			 onClick Function
			*****************/
			anchorclick = function()
			{
				//debugger;
				//alert(this.target);//nextSibling.nodeName);
				//IE annoyingness, doesn't pass event source as param
				/*var isOpera = (navigator.userAgent.indexOf("Opera") != -1) ? true : false;
				if (isOpera){
					alert('opera');
				}*/
				/*if (!this.tagName){
					var sourceElement = window.event.target;
				} else {
				*/
					var sourceElement = this;
				/*}*/
				//alert(sourceElement);
				if (useParent)
				{										
					var currentElement = sourceElement.parentNode;
					
					for(i = 1; i < parentLevel; i++)
					{
						currentElement = currentElement.parentNode;
					}										
					
					currentElement = currentElement.nextSibling;

				} else {
					var currentElement = sourceElement.nextSibling;
				}
				var targetElement = null;
				
				while (currentElement != null || targetElement == null)
				{
					if (isClass(currentElement, collapsibleClass)){
						if (currentElement.style.display == "none"){
							currentElement.style.display = "block";
						} else {
							currentElement.style.display = "none";
						}
						switch(currentElement.style.display){
							case "none":
								if (isClass(sourceElement, eval("linkAlternateClass"))){
									removeClass(sourceElement, eval("linkAlternateClass"));
									addClass(sourceElement, eval("linkClass"));
								}
							break;
							case "block":
								if (isClass(sourceElement, eval("linkClass"))){
									removeClass(sourceElement, eval("linkClass"));
									addClass(sourceElement, eval("linkAlternateClass"));
								}
							break;
						}
						//return returnVal;
						targetElement = currentElement;
					}
					currentElement = currentElement.nextSibling;
				}

				if (onlyOneAllowed){
					//collapse all others of same class before proceeding
					var collapsibleLinks = getElementsByClassName(document, "*",linkAlternateClass);
					var collapsibles = getElementsByClassName(document, "*", collapsibleClass);
					
					for (i = 0; i < collapsibleLinks.length; i++){
						if (collapsibleLinks[i] != sourceElement){
							
							if (isClass(collapsibleLinks[i], eval("linkAlternateClass"))){
								
								removeClass(collapsibleLinks[i], eval("linkAlternateClass"));
								addClass(collapsibleLinks[i], eval("linkClass"));
							}
						}
					}
					
					for (i = 0; i < collapsibles.length; i++){
						if (collapsibles[i].style.display != "none" && collapsibles[i] != targetElement){
							collapsibles[i].style.display = "none";
						}
					}
				}
				
				
				return false;
			}
			anchors[i].onclick = anchorclick;
			//addClickHandler(anchors[i], anchorclick);
			//xb.addEvent(anchors[i],"click", anchorclick, true);
		}
	}
	
	//collapse all elements with collapsibleClass
	//this is a once only thing
	var collapsibles = getElementsByClassName(document, "*", collapsibleClass);
	for (i = 0; i < collapsibles.length; i++){
		collapsibles[i].style.display = "none";
	}
	
}


function isClass(element, sClass) {
	sClassName = element.className;
	re = new RegExp(sClass + "( |$)");
	if (!sClassName) return false;
	return re.test(sClassName); 
}

function addClass( element, className ) {

	if( !element.className.match( '\\b' + className + '( *,?[\s]|$)\\b' ) ){
//	if( !element.className.match( '\\b' + className + '\\b' ) )
		element.className += ' ' + className;
	}
}

function removeClass( element, className ) {
	element.className = element.className.replace( new RegExp('\\b' + className + '\\b', 'g' ), '' );
}
function isdefined( variable)
{
    return (typeof(window[variable]) == "undefined")?  false: true;
}
/*
    getElementsByClassName Written by Jonathan Snook, http://www.snook.ca/jonathan
    Add-ons by Robert Nyman, http://www.robertnyman.com
*/
function getElementsByClassName(oElm, strTagName, strClassName){
    var arrElements = (strTagName == "*" && oElm.all)? oElm.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)
}

function addClickHandler(element, fn){
	if (element.addEventListener){
		element.addEventListener("click", fn, true);
	} else if(element.attachEvent){
		element.attachEvent("onclick", fn);
	} else {
		element.onclick = fn;
	}
}