/***************************************************************************************************

	FILE NAME:		collapsible.js
	CREATED:		10.03.2006	
	LAST MODIFIED:	11.06.2006
	
	PROGRAMMER(S):	Matthew Broude
					Tufts University School of Medicine
					OIT | Creative Services
					617.636.3593 / matthew.broude@tufts.edu
					
	DESCRIPTION:	Javascript functions for handling dynamic collapsible content on a webpage.
					These functions utilize the DOM, with accomodation for Internet Explorer's
					partially incorrect implementation of the standard DOM methods.
					
					This file is part of a set of files related to creating dynamic functionality
					to expand/collapse content on a webpage\

***************************************************************************************************/

var allCollapsed = false;

function initCollapsible(blnCollapseAll) {
	allCollapsed = blnCollapseAll;

	collapseOrExpandAll();
	addCollapseEvents();
}

function collapseButton(loc) {
	if (allCollapsed) {
		loc.setAttribute('value','Collapse All');
	} else {
		loc.setAttribute('value','Expand All');
	}
	
	collapseOrExpandAll();
}

function addCollapseEvents() {
	// Check for DOM support of getElementsByTagName
	if (document.getElementsByTagName) {
		var fieldsetNodes = document.getElementsByTagName("fieldset");
		for (var i = 0; fieldsetNodes[i]; i++) {
			// Get fieldset class name
			var fieldsetClass = fieldsetNodes[i].getAttribute('class');

			// IE mistakenly excludes class from the DOM object and gets/sets it via the proprietary
			// object.className method instead. When lookup via DOM yields nothing and this method
			// is supported, we use it secondarily to get the class name.
			if (!fieldsetClass && fieldsetNodes[i].className) { fieldsetClass = fieldsetNodes[i].className; }

			if (fieldsetClass) { fieldsetClass = fieldsetClass.toLowerCase(); }
	
			if (fieldsetClass == 'collapsible') {

				// XHTML requires the legend to be the first node within a fieldset, so we take the
				// first child as the legend node...
				var legendNode = fieldsetNodes[i].firstChild;
				/// ...but we allow for fault-tolerance to accomodate invalid code by checking
				// subsequent sibling nodes if we don't find the legend immediately.
				while (legendNode.nodeName.toLowerCase() !== 'legend') {
					legendNode = legendNode.nextSibling;
				}

				legendNode.setAttribute('onclick','collapse(this)');
			}
		}
	
		var inputNodes = document.getElementsByTagName("input");
		for (var j = 0; inputNodes[j]; j++) {	
			// Get input type
			var inputType = inputNodes[j].getAttribute('type');
			if (inputType) { inputType = inputType.toLowerCase(); }

			// Get input class
			var inputClass = inputNodes[j].getAttribute('class');

			// IE mistakenly excludes class from the DOM object and gets/sets it via the proprietary
			// object.className method instead. When lookup via DOM yields nothing and this method
			// is supported, we use it secondarily to get the class name.
			if (!inputClass && inputNodes[j].className) { inputClass = inputNodes[j].className; }
			
			if (inputClass) { inputClass = inputClass.toLowerCase(); }

			if (inputType == 'button' && inputClass == 'collapsible') {
				inputNodes[j].setAttribute('onclick','collapseButton(this)');
				collapseButton(inputNodes[j]);
			}
		}
	}
}

function collapseOrExpandAll() {
	var newClass;
	if (allCollapsed) {
		newClass = 'collapsible';
	} else {
		newClass = 'collapsed';
	}

	var fieldsetNodes = document.getElementsByTagName("fieldset");

	for (var i = 0; fieldsetNodes[i]; i++) {
		var fieldsetClass = fieldsetNodes[i].getAttribute('class');
		
		// IE mistakenly excludes class from the DOM object and gets/sets it via the proprietary
		// object.className method instead. When lookup via DOM yields nothing and this method
		// is supported, we use it secondarily to get the class name.
		if (!fieldsetClass && fieldsetNodes[i].className) { fieldsetClass = fieldsetNodes[i].className; }
		
		if (fieldsetClass) { fieldsetClass = fieldsetClass.toLowerCase(); }
		
		if(fieldsetClass == 'collapsible' || fieldsetClass == 'collapsed') {
			if (fieldsetNodes[i].className) {
				// Set class name in IE
				fieldsetNodes[i].className = newClass;
				fieldsetNodes[i].parentNode.innerHTML = fieldsetNodes[i].parentNode.innerHTML;
			} else {
				// Set class name in DOM-compliant browsers
				fieldsetNodes[i].setAttribute('class',newClass);
			}	
		}
	}
	
	allCollapsed = !allCollapsed;	
}

function collapse(loc) {
	// Locate legend tag
	var legendNode = loc;
	while (legendNode.nodeName.toLowerCase() !== 'legend') {
		legendNode = legendNode.parentNode;
	}
	
	// Local fieldset tag
	var fieldsetNode = loc;
	while (fieldsetNode.nodeName.toLowerCase() !== 'fieldset') {
		fieldsetNode = fieldsetNode.parentNode;
	}

	// Change fieldset class
	var fieldsetClass = fieldsetNode.getAttribute('class');

	// IE mistakenly excludes class from the DOM object and gets/sets it via the proprietary
	// object.className method instead. When lookup via DOM yields nothing and this method
	// is supported, we use it secondarily to get the class name.	
	if (!fieldsetClass && fieldsetNode.className) { fieldsetClass = fieldsetNode.className; }
	
	if (fieldsetClass) { fieldsetClass = fieldsetClass.toLowerCase(); }
	
	if(fieldsetClass == 'collapsed') {
		if (fieldsetNode.className) {
			// Set class name in IE
			fieldsetNode.className = 'collapsible';
		} else {
			// Set class name in DOM-compliant browsers
			fieldsetNode.setAttribute('class','collapsible');
		}
	} else {
		if (fieldsetNode.className) {
			// Set class name in IE
			fieldsetNode.className = 'collapsed';
		} else {
			// Set class name in DOM-compliant browsers
			fieldsetNode.setAttribute('class','collapsed');
		}
	}
	
	/* Removed - easier to alter fieldset class instead...
	   May want to use this to universally hide children of anything, though?
	// Hide children
	var fieldsetChildren = fieldsetNode.childNodes;
	for(var i = 0; fieldsetChildren[i]; i++) {
		var nodeName = fieldsetChildren[i].nodeName.toLowerCase();
		if(nodeName !== '#text' && nodeName !== 'legend') {
			var currClass = fieldsetChildren[i].getAttribute('class');
			if(currClass == 'collapsed') {
				fieldsetChildren[i].setAttribute('class','collapsible');
			} else {
				fieldsetChildren[i].setAttribute('class','collapsed');
			}
		}	
	}
	*/
}