/* 
 * 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: true, // 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: '/media/images/plus.gif',
    closedAlt: 'Click to expand section',
    openPic: '/media/images/minus.gif',
    openAlt: 'Click to 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);

