/* 
 * DOMcollapse
 * Version 3.0
 * released 06.12.2005 
 * Not for commercial reselling or use, unless consent given by the author
 * Check for updates on http://onlinetools.org and http://wait-till-i.com
 *
 * Modified on 6/10/06 by Will McElwain (added changeAll function and some helper functions)
*/

dc={
	triggerElements:'h3', 	// elements to trigger the effect
	parentElementId:null,	// ID of the parent element (keep null if none)
	uniqueCollapse:false,	// is set to true only one element can be open at a time

	// CSS class names
	trigger:'trigger',
	triggeropen:'expanded',
	hideClass:'hide',
	showClass:'show',
	
	// pictures and text alternatives
	closedPic:'/img/plus.gif',
	closedAlt:'expand section',
	openPic:'/img/minus.gif',
	openAlt:'collapse section',
	/* Doesn't work with Safari
		hoverClass:'hover',
	*/

	init:function(e){
		var temp;
		if(!document.getElementById || !document.createTextNode){return;}
		if(!dc.parentElementId){
			temp=document.getElementsByTagName(dc.triggerElements);
		} else if(document.getElementById(dc.parentElementId)){
			temp=document.getElementById(dc.parentElementId).getElementsByTagName(dc.triggerElements);
		}else{
			return;
		}
		dc.tempLink=document.createElement('a');
		dc.tempLink.setAttribute('href','#');
		dc.tempLink.appendChild(document.createElement('img'));
		for(var i=0;i<temp.length;i++){
			if(dc.cssjs('check',temp[i],dc.trigger) || dc.cssjs('check',temp[i],dc.triggeropen)){
				dc.makeTrigger(temp[i],e);
			}
		}
      var changealls=dc.getElementsByClassName(document,'span','excoll');
      for(var i=0;i<changealls.length;i++){
         dc.addEvent(changealls[i],'click',dc.changeAll,false);
      }
	},
	makeTrigger:function(o,e){
		var tl=dc.tempLink.cloneNode(true);
		var tohide=o.nextSibling;
		while(tohide.nodeType!=1)
		{
			tohide=tohide.nextSibling;
		}
		o.tohide=tohide;
		if(!dc.cssjs('check',o,dc.triggeropen)){
			dc.cssjs('add',tohide,dc.hideClass);
			tl.getElementsByTagName('img')[0].setAttribute('src',dc.closedPic);
			tl.getElementsByTagName('img')[0].setAttribute('alt',dc.closedAlt);
			o.setAttribute('title',dc.closedAlt);
		}else{
			dc.cssjs('add',tohide,dc.showClass);
			tl.getElementsByTagName('img')[0].setAttribute('src',dc.openPic);
			tl.getElementsByTagName('img')[0].setAttribute('alt',dc.openAlt);
			o.setAttribute('title',dc.openAlt);
			dc.currentOpen=o;
		}
		dc.addEvent(o,'click',dc.addCollapse,false);
		/* Doesn't work with Safari
		dc.addEvent(o,'mouseover',dc.hover,false);
		dc.addEvent(o,'mouseout',dc.hover,false);
		*/
		o.insertBefore(tl,o.firstChild);
		dc.addEvent(tl,'click',dc.addCollapse,false);
		// Safari hacks 
		tl.onclick=function(){return false;}
		o.onclick=function(){return false;}
	},
	/* Doesn't work with Safari
	hover:function(e){
		var o=dc.getTarget(e);
		var action=dc.cssjs('check',o,dc.hoverClass)?'remove':'add';
		dc.cssjs(action,o,dc.hoverClass)
	},
	*/
	addCollapse:function(e){
		var action,pic;
		// hack to fix safari's redraw bug 
		// as mentioned on http://en.wikipedia.org/wiki/Wikipedia:Browser_notes#Mac_OS_X
		if (self.screenTop && self.screenX){
			window.resizeTo(self.outerWidth + 1, self.outerHeight);    
			window.resizeTo(self.outerWidth - 1, self.outerHeight);   
		}
		if(dc.uniqueCollapse && dc.currentOpen){
			dc.currentOpen.getElementsByTagName('img')[0].setAttribute('src',dc.closedPic);
			dc.currentOpen.getElementsByTagName('img')[0].setAttribute('alt',dc.closedAlt);
			dc.currentOpen.setAttribute('title',dc.closedAlt);
			dc.cssjs('swap',dc.currentOpen.tohide,dc.showClass,dc.hideClass);
			dc.cssjs('remove',dc.currentOpen,dc.triggeropen);
			dc.cssjs('add',dc.currentOpen,dc.trigger);
		}
		var o=dc.getTarget(e);
		if(o.tohide){
			if(dc.cssjs('check',o.tohide,dc.hideClass)){
				o.getElementsByTagName('img')[0].setAttribute('src',dc.openPic);
				o.getElementsByTagName('img')[0].setAttribute('alt',dc.openAlt);
				o.setAttribute('title',dc.openAlt);
				dc.cssjs('swap',o.tohide,dc.hideClass,dc.showClass);
				dc.cssjs('add',o,dc.triggeropen);
				dc.cssjs('remove',o,dc.trigger);
			}else{
				o.getElementsByTagName('img')[0].setAttribute('src',dc.closedPic);
				o.getElementsByTagName('img')[0].setAttribute('alt',dc.closedAlt);
				o.setAttribute('title',dc.closedAlt);
				dc.cssjs('swap',o.tohide,dc.showClass,dc.hideClass);
				dc.cssjs('remove',o,dc.triggeropen);
				dc.cssjs('add',o,dc.trigger);
			}
			dc.currentOpen=o;
			dc.cancelClick(e);
			//document.getElementById('debug').innerHTML=o.tohide.className;
		}
		else{
			dc.cancelClick(e);
		}
	},
	changeAll:function(e){
      var target=dc.newGetTarget(e);
      var nodes=document.getElementById('glean').childNodes;
      var within=false;
      var o, tohide;

      for(var i=0;i<nodes.length;i++){
         if (nodes[i].nodeType!=1) continue;
         if (nodes[i].nodeName.toLowerCase()=='h2'){
            if (nodes[i].hasChildNodes() && nodes[i].firstChild==target){
               within=true;
            } else within=false;
            continue;
         } else if (nodes[i].nodeName.toLowerCase()=='h3'){
            o=nodes[i];
            continue;
         } else if (nodes[i].nodeName.toLowerCase()=='div'){
            tohide=nodes[i];
         }

         if (!within) continue;
         if (o.className.trim()!=dc.trigger && o.className.trim()!=dc.triggeropen) continue;
         if (tohide.className.trim()!=dc.showClass && tohide.className.trim()!=dc.hideClass) continue;

         if(target.innerHTML=='[expand all]'){
            o.getElementsByTagName('img')[0].setAttribute('src',dc.openPic);
            o.getElementsByTagName('img')[0].setAttribute('alt',dc.openAlt);
            o.setAttribute('title',dc.openAlt);
            dc.cssjs('set',tohide,dc.hideClass,dc.showClass);
            dc.cssjs('add',o,dc.triggeropen);
            dc.cssjs('remove',o,dc.trigger);
         }else if (target.innerHTML=='[collapse all]'){
            o.getElementsByTagName('img')[0].setAttribute('src',dc.closedPic);
            o.getElementsByTagName('img')[0].setAttribute('alt',dc.closedAlt);
            o.setAttribute('title',dc.closedAlt);
            dc.cssjs('set',tohide,dc.showClass,dc.hideClass);
            dc.cssjs('remove',o,dc.triggeropen);
            dc.cssjs('add',o,dc.trigger);
         }
      }

      if (target.innerHTML=='[expand all]') {
         target.innerHTML='[collapse all]';
      } else if (target.innerHTML=='[collapse all]') {
         target.innerHTML='[expand all]';
      }

      dc.cancelClick(e);
	},
	/* helper methods */
	getTarget:function(e){
		var target = window.event ? window.event.srcElement : e ? e.target : null;
		if (!target){return false;}
		while(!target.tohide && target.nodeName.toLowerCase()!='body')
		{
			target=target.parentNode;
		}
		// if (target.nodeName.toLowerCase() != 'a'){target = target.parentNode;} Safari fix not needed here
		return target;
	},
	newGetTarget:function(e){  // from http://www.quirksmode.org/js/events_properties.html#target
      var targ;
      if (!e) var e = window.event;
      if (e.target) targ = e.target;
      else if (e.srcElement) targ = e.srcElement;
      if (targ.nodeType == 3) targ = targ.parentNode; // defeat Safari bug
		return targ;
	},
	cancelClick:function(e){
		if (window.event){
			window.event.cancelBubble = true;
			window.event.returnValue = false;
			return;
		}
		if (e){
			e.stopPropagation();
			e.preventDefault();
		}
	},
	addEvent: function(elm, evType, fn, useCapture){
		if (elm.addEventListener) 
		{
			elm.addEventListener(evType, fn, useCapture);
			return true;
		} else if (elm.attachEvent) {
			var r = elm.attachEvent('on' + evType, fn);
			return r;
		} else {
			elm['on' + evType] = fn;
		}
	},
	cssjs:function(a,o,c1,c2){
		switch (a){
			case 'swap':
				o.className=!dc.cssjs('check',o,c1)?o.className.replace(c2,c1):o.className.replace(c1,c2);
			break;
			case 'set':
				o.className=o.className.replace(c1,c2);
			break;
			case 'add':
				if(!dc.cssjs('check',o,c1)){o.className+=o.className?' '+c1:c1;}
			break;
			case 'remove':
				var rep=o.className.match(' '+c1)?' '+c1:c1;
				o.className=o.className.replace(rep,'');
			break;
			case 'check':
				return new RegExp("(^|\\s)" + c1 + "(\\s|$)").test(o.className)
			break;
		}
	},
   getElementsByClassName:function(oElm, strTagName, strClassName){
      /*
         Written by Jonathan Snook, http://www.snook.ca/jonathan
         Add-ons by Robert Nyman, http://www.robertnyman.com
      */
      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);
   }
}
String.prototype.trim = function() { return this.replace(/^\s+|\s+$/, ''); };
dc.addEvent(window, 'load', dc.init, false);