/* 

 * 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

 *

*/



dc={

	triggerElements:'*', 	// 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:'../images/plus.gif',

	closedAlt:'expand section',

	openPic:'../images/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);

			}

		}

	},

	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);

		}

	},

	/* 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;

	},

	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 '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;

		}

	}

}

dc.addEvent(window, 'load', dc.init, false);


