dc={
	triggerElements:'*', 	// elements to trigger the effect
	parentElementId:'content',	// ID of the parent element (keep null if none)
	uniqueCollapse:false,	// is set to true only one element can be open at a time

	trigger:'trigger',
	triggeropen:'expanded',
	hideClass:'hide',
	showClass:'show',

	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','#');
		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);
		else
		{
			dc.cssjs('add',tohide,dc.showClass);
			dc.currentOpen=o;
		}
		dc.addEvent(o,'click',dc.addCollapse,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;}
	},
	
	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.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))
			{
				dc.cssjs('swap',o.tohide,dc.hideClass,dc.showClass);
				dc.cssjs('add',o,dc.triggeropen);
				dc.cssjs('remove',o,dc.trigger);
			}
			else
			{
				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);
		}
		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;
		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);