/* 
 * 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:'/ckc/images/plus.gif',
        closedAlt:'Expand',
        openPic:'/ckc/images/minus.gif',
        openAlt:'Collapse',
        /* 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);
