
function Toggle () {
    this.element = null;
    
    this.display = new Object();
    this.display.shown = Toggle.DISPLAY_SHOWN;
    this.display.hidden = Toggle.DISPLAY_HIDDEN;
    
    this.toggleListeners = new Array();
    
    this.currentState = Toggle.STATE_UNKNOWN;
}

Toggle.DISPLAY_SHOWN = '';
Toggle.DISPLAY_HIDDEN = 'none';

Toggle.STATE_UNKNOWN = 0;
Toggle.STATE_SHOWN = 1;
Toggle.STATE_HIDDEN = 2;

Toggle.subscribes = function (element) {
    var target = element;
    var onCreateFunction = null;
    var currentState = Toggle.STATE_UNKNOWN;
    var shownValue = Toggle.DISPLAY_SHOWN;
    var hiddenValue = Toggle.DISPLAY_HIDDEN;
    
    switch (arguments.length) {
        case 5 : {
            onCreateFunction = arguments[4];
            
        }
        
        case 4 : {
            hiddenValue = (arguments[3] != null) ? arguments[3] : hiddenValue;
            
        }
        
        case 3 : {
            shownValue = (arguments[2] != null) ? arguments[2] : shownValue;
            
        }
        
        case 2 : {
            currentState = (arguments[1] != null) ? arguments[1] : currentState;
            
            if ((currentState != Toggle.STATE_SHOWN)
                    && (currentState != Toggle.STATE_HIDDEN)) {
                currentState = Toggle.STATE_UNKNOWN;
            }
            
        } break;
        
        
        default : {
            // do nothing
        } break;
        
    }
    
    window.appendLoadEvent(function () {
        if (typeof element == 'string') {
            target = document.getElementById(element);
            if (DomTools.isElement(target) == false) {
                return false;
            }
        }
        
        
        
        var t = new Toggle();
        t.setElement(target);
        //t.currentState = currentState;
        t.display.shown = shownValue;
        t.display.hidden = hiddenValue;
        
        if (currentState == Toggle.STATE_SHOWN) {
            t.show();
        } else if (currentState == Toggle.STATE_HIDDEN) {
            t.hide();
        }
        
        
        if (onCreateFunction != null) {
            return onCreateFunction(t);
        }
        
        return true;
    });
    
    return true;
}

Toggle.subscribesByClassName = function (className) {
    var onCreateFunction = null;
    var currentState = Toggle.STATE_UNKNOWN;
    var shownValue = Toggle.DISPLAY_SHOWN;
    var hiddenValue = Toggle.DISPLAY_HIDDEN;
    
    switch (arguments.length) {
        case 5 : {
            onCreateFunction = arguments[4];
            
        }
        
        case 4 : {
            hiddenValue = (arguments[3] != null) ? arguments[3] : hiddenValue;
            
        }
        
        case 3 : {
            shownValue = (arguments[2] != null) ? arguments[2] : shownValue;
            
        }
        
        case 2 : {
            currentState = (arguments[1] != null) ? arguments[1] : currentState;
            
            if ((currentState != Toggle.STATE_SHOWN)
                    && (currentState != Toggle.STATE_HIDDEN)) {
                currentState = Toggle.STATE_UNKNOWN;
            }
            
        } break;
        
        
        default : {
            // do nothing
        } break;
        
    }
    
    window.appendLoadEvent(function () {
        var list = _$(className);
        var i = 0;
        var sz = list.length;
        var current = null;
        var toggle = null;
        var img = null;
        
        for (i = 0; i < sz; i++) {
            current = list[i];
            
            Toggle.subscribes(
                current,
                currentState,
                shownValue,
                hiddenValue,
                onCreateFunction);
            
        }
        
        
        return true;
    });
    
    return true;
}

Toggle.prototype.associatesWithClick = function (image, element) {
    var tsi = null;
    if (DomTools.isElement(image) == true) {
        DomTools.addHelpers(image);
        
        image.style.cursor = 'pointer';
        image.rugama.set('Toggle', this);
        
        tsi = new TwoStateImage();
        tsi.setElement(image);
        
        var fi = image.src.getPathInfo();
        
        
        
        tsi.setOnImage(fi.path + '/bt_moins.gif');
        tsi.setOffImage(fi.path + '/bt_plus.gif');
        
        
        image.appendNewEvent(
            'click',
            function (ev) {
                e = DomTools.createEvent(ev);
                
                tsi.toggle();
                
                if (tsi.currentState == true) {
                    image.rugama.get('Toggle').show();
                    
                } else {
                    image.rugama.get('Toggle').hide();
                    
                }
                
                e.dispose();
                
                return false;
            });
        
        if (this.isShown() == true) {
            tsi.on();
            
        } else if (this.isHidden() == true) {
            tsi.off();
        
        }
    }
    
    if (DomTools.isElement(element) != true) {
        return true;
    }
    
    DomTools.addHelpers(element);
    
    element.style.cursor = 'pointer';
    element.rugama.set('Toggle', this);
    
    if (image != null) {
        element.rugama.set('TwoStateImage', tsi);
    }
    
    element.appendNewEvent(
        'click',
        function (ev) {
            e = DomTools.createEvent(ev);
            
            if (e.getTarget().nodeName.toLowerCase() == 'a') {
                //e.dispose();
                return false;
            }
            
            element.rugama.get('Toggle').toggle();
            
            if (element.rugama.has('TwoStateImage') == true) {
                element.rugama.get('TwoStateImage').toggle();
            }
            
            e.dispose();
            
            return false;
        });
    
    return true;
}

Toggle.prototype.setElement = function (node) {
    DomTools.addHelpers(node);
    
    node.rugama.set('Toggle', this);
    
    this.element = node;
        
}

Toggle.prototype.appendToggleListener = function (toggleEvent) {
    toggleEvent.owner = this;
    
    if (!toggleEvent.show) {
        toggleEvent.show = function () {
            return true;
        }
    }
    
    if (!toggleEvent.hide) {
        toggleEvent.hide = function () {
            return true;
        }
    }
    
    if (!toggleEvent.toggle) {
        toggleEvent.toggle = function () {
            return true;
        }
    }
    
    this.toggleListeners.push(toggleEvent);
}

Toggle.prototype.removeToggleListener = function (toggleEvent) {
    var i = 0;
    var sz = this.toggleListeners.length;
    
    for (i = 0; i < sz; i++) {
        if (this.toggleListeners[i] != toggleEvent) {
            continue;
        }
        
        this.toggleListeners[i].owner = null;
        delete this.toggleListeners[i];
    }
    
}

Toggle.prototype.isShown = function () {
    if (this.element == null) {
        return null;
    }
    
    if (this.currentState == Toggle.STATE_SHOWN) {
        return true;
        
    } else if (this.currentState == Toggle.STATE_HIDDEN) {
        return false;
        
    }
    
    return (this.isHidden() == false) ? true : false;
}

Toggle.prototype.show = function () {
    if (this.element == null) {
        return true;
    }
    
    var i = 0;
    var sz = this.toggleListeners.length;
    for (i = 0; i < sz; i++) {
        if (this.toggleListeners[i].show() === false) {
            return true;
        }
    }
    
    this.currentState = Toggle.STATE_SHOWN;
    this.element.style.display = this.display.shown;
    
    return true;
}

Toggle.prototype.isHidden = function () {
    if (this.element == null) {
        return null;
    }
    
    if (this.currentState == Toggle.STATE_SHOWN) {
        return false;
        
    } else if (this.currentState == Toggle.STATE_HIDDEN) {
        return true;
        
    } else if (this.element.getActualStyle('display') == this.display.hidden) {
        return true;
    }
    
    return false;
}

Toggle.prototype.hide = function () {
    if (this.element == null) {
        return true;
    }
    
    var i = 0;
    var sz = this.toggleListeners.length;
    for (i = 0; i < sz; i++) {
        if (this.toggleListeners[i].hide() === false) {
            return true;
        }
    }
    
    this.currentState = Toggle.STATE_HIDDEN;
    this.element.style.display = this.display.hidden;
    
    return true;
}

Toggle.prototype.toggle = function () {
    if (this.element == null) {
        return true;
    }
    
    var i = 0;
    var sz = this.toggleListeners.length;
    for (i = 0; i < sz; i++) {
        if (this.toggleListeners[i].toggle() === false) {
            return true;
        }
    }
    
    if (this.isHidden() == true) {
        this.show();
        
    } else {
        this.hide();
        
    }
    
    return true;
}