var ELEMENT_NODE = 1;
    
function _toggler_getToggleItemParams(class_string)
{
    var element_classes = class_string.split(/\s+/);
    
    var params = new Array();
    
    for (var i = 0; i < element_classes.length; i++) {
        if (element_classes[i].indexOf("toggler-") == 0) {      
        params = element_classes[i].split("-");
        break;
        }
    }
    
    return params;
}

function _toggler_toggleElement(element, toggler_id, status)
{
    var params = _toggler_getToggleItemParams(element.className);
    
    var re = new RegExp(toggler_id + "$", "i");

    if ((params.length > 0) && (params[1] != "parent") && element.getAttribute("id").match(re)) {
        if ((params[2] == "expanded" && status) || (params[2] == "collapsed" && !status) || (params.length == 2 && status)) {
        element.style.display = "none";
        } else {
        element.style.display = params[1];
        }
    }

    return;
}


function _toggler_toggleTree(element, toggler_id, status)
{
    var elem = element;


    for (var i = 0; i < elem.childNodes.length; i++) {
        var child = elem.childNodes.item(i);
        
        if (child.nodeType == ELEMENT_NODE) {
        _toggler_toggleTree(child, toggler_id, status);
        }
    }


    _toggler_toggleElement(element, toggler_id, status);
    
    return;
}



function toggler_clickHandler(element)
{
    var params = _toggler_getToggleItemParams(element.className);
    
    if (params.length > 0) {
    
        var togglee_id = "";
    
        var toggler_id = element.getAttribute("id");

        var togglee_id_offset = toggler_id.indexOf("toggler_expanded_");
            
        if (togglee_id_offset >= 0) {
            
            togglee_id_offset += "toggler_expanded_".length;
                
        } else {
            
            togglee_id_offset = toggler_id.indexOf("toggler_collapsed_");
            if (togglee_id_offset >= 0) {
                togglee_id_offset += "toggler_collapsed_".length;
            } else {
            
                togglee_id_offset = toggler_id.indexOf("toggler_parent_");
                if (togglee_id_offset >= 0) {
                    togglee_id_offset += "toggler_parent_".length;
                } 
            }
        }

        if (togglee_id_offset >= 0) {
            togglee_id = toggler_id.substring(togglee_id_offset);
        }
            

        if (togglee_id == "") {
            /* Failed to get the togglee id */
            return false;
        }

        var toggle_block_parent;
            
        if (params[1] == "parent") {
            toggle_block_parent = element;
        } else {
            toggle_block_parent = document.getElementById("toggler_parent_" + togglee_id);
        }

        if (!toggle_block_parent) {
            toggle_block_parent = document.body;
        }

        /* The main  togglable block */
        var togglee = document.getElementById(togglee_id);
            
        /* Toggle status (false - collapsed, true - expanded */
        var status = (togglee.style.display != 'none');


        _toggler_toggleTree(toggle_block_parent, togglee_id, status);
        
        _toggler_toggleElement(togglee, togglee_id, status);
            
        return true;
    }
       
    return false;
}
