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:'http://www.teknemedia.net/js/trigger_on.gif',
    closedAlt:'Apri box',
    openPic:'http://www.teknemedia.net/js/trigger_off.gif',
    openAlt:'Chiudi box',
    /* 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);
