//-----------------------------------------------------------------------------
//
// Extensions to domCollapse that support programmatic node expansion and
// collapse.
//
// Check http://onlinetools.org for info about domCollapse.
//
// If you include this file and get a message about "dc" being undefined, it's
// because you forgot to include "domcollapse.js" ahead of this file.
//
//-----------------------------------------------------------------------------


//
// Determine if a given element is a domCollapse trigger element.
//
dc.isTrigger = function(element)
{
    // See dc.init().
    return (this.cssjs('check', element, this.trigger) || this.cssjs('check', element, this.triggeropen));
}


//
// Get an array containing all nodes in the current document that are
// domCollapse triggers.
//
dc.getTriggerElements = function()
{
    var triggers = new Array();
    var next_trigger = 0;

    // The following is shamelessly copied from dc.init().

    var temp;
    if(!document.getElementById || !document.createTextNode){return triggers;}
    if(!this.parentElementId){
        temp=document.getElementsByTagName(this.triggerElements);
    } else if(document.getElementById(this.parentElementId)){
        temp=document.getElementById(this.parentElementId).getElementsByTagName(this.triggerElements);
    }else{
        return triggers;
    }
    for(var i=0;i<temp.length;i++){
        if(this.isTrigger(temp[i]))
            triggers[next_trigger++] = temp[i];
    }

    return triggers;
}


//
// Dynamically expand or collapse a single domCollapse element. Expand it
// if 'expand' is true or collapse it if it's false.
//
// To do this, we must synthesize a "click" event to trigger the domCollapse
// event handler.
//
dc.expand = function(element, expand)
{
    // Do nothing unless the element's a domCollapse trigger element.
    if (this.isTrigger(element))
    {
        // Create the event object we'll fire.
        var click;
        if (this.useIEStyleEvents())
        {
            click = document.createEventObject();
            click.type = 'click';
        }
        else
        {
            click = document.createEvent('MouseEvents');
            click.initEvent('click', true, true);
        }

        // Use the domCollapse object (see "domcollapse.js")
        // to determine if the element is already in the
        // required state.
        if (this.cssjs('check', element, this.triggeropen) != expand)
        {
            // Need to change state. Fire the event.
            if (this.useIEStyleEvents())
                element.fireEvent('onclick', click);
            else
                element.dispatchEvent(click);
        }
    }
}


//
// Set the initial state of a domCollapse element. This method is for use
// *ONLY* when setting the initial state during page load. For dynamic
// state changes, use dc.expand().
//
// We need two methods because the technique used to expand a trigger
// varies depending on the point at which its done (and, of course, varies
// with browser).
//
dc.setExpanded = function(element, expand)
{
    // Triggers are collapsed by default so if the initial state is "collapsed,"
    // there's nothing to do. Continue only if "expand" is true.
    if (expand && this.isTrigger(element))
    {
        // Determined by trial-and-error that this requires browser-specific
        // behavior (sigh).

        if (dc.canExpandAtPageLoadViaClassName())
            element.className = 'expanded';
        else
            dc.expand(element, true);
    }
}


//
// With some browsers, we can set a trigger's initial state at page-load
// time simply by assigning the relevant class name. For other browsers,
// we must call dc.expand().
//
dc.canExpandAtPageLoadViaClassName = function()
{
    var browser = window.navigator.appName;
    return ((browser.indexOf('Internet Explorer') >= 0) || (browser.indexOf('Opera') >= 0));
}


//
// Dynamically expand or collapse all domCollapse elements. All triggers are
// expanded if 'expand' is true, or are collapsed if it's false.
//
dc.expandAll = function(expand)
{
    var triggers = this.getTriggerElements();
    for (var t = 0; t < triggers.length; t++)
    {
        this.expand(triggers[t], expand);
    }
}


//
// Search the list of trigger elements for one having text that
// contains a specified substring.
//
dc.findTriggerByTextFragment = function(fragment)
{
    var triggers = this.getTriggerElements();

    // For comparison, expand embedded escapes and convert
    // to lower case for case-insensitive comparison.
    var elementTextFragment = decodeURI(fragment).toLowerCase();
    //alert('looking for [' + elementTextFragment + ']');

    for (var t = 0; t < triggers.length; t++)
    {
        var element = triggers[t];
        var text = decodeURI(element.innerHTML).toLowerCase();
        //alert('text = [' + text + ']');
        if (text.indexOf(elementTextFragment) >= 0)
            return element;
    }

    // Didn't find it.
    return null;
}


//
// What a pain.
//
//           window.event document.createEventObject document.createEvent
// ---------+-----------------------------------------------------------
// IE       |    Y                   Y                       N
// Netscape |    N                   N                       Y
// FireFox  |    N                   N                       Y
// Opera    |    Y                   N                       Y
// Safari   |    ?                   ?                       ?
//
dc.useIEStyleEvents = function()
{
    return (document.createEvent == null);
}

dc.useNetscapeStyleEvents = function()
{
    return !this.useIEStyleEvents();
}

