Element.EXPAND_COLLAPSE_DURATION = 0.5;

Element._findAncestorForm = function(element) {
    var node = element;
    
    do {
        node = node.parentNode;
    } while(node && node.nodeName !== 'FORM');

    return node; 
};


Element._setEnabledOnChildren = function(element, enabled) {
    if (element.nodeName == 'INPUT' || element.nodeName == 'SELECT') {
        element.disabled = !enabled;
    } else {
        $A(element.childNodes).each(
            function (child) {
                Element_setEnabledOnChildren(child, enabled);
            }
        );
    }
};


Element.addMethods
(
    {
        addOption : function(element, option) {
            try {
                element.add(option, null);
            } catch (e) {
                element.add(option);
            }
        },
        
        clearOptions : function(element) {
            while(element.options && element.options.length > 0) {
                element.remove(0);
            }
        },
        
        setOptions: function (element, options) {
            $(element).clearOptions();
            $H(options).each(
                function(entry) {
                    $(element).addOption(new Option(entry.value, entry.key));
                }.bind(this)
            );
        },
        
        addRow : function(element, columns) {
            var row = element.insertRow(element.rows.count);
            $A(columns).each(
                function(content) {
                    var cell = row.insertCell(-1);
                    cell.appendChild(
                        document.createTextNode(
                            content
                        )
                    );
                }
            );
        },
        
        deleteAllRows : function(element) {
            if (element.rows) {
                while(element.rows.length) {
                    element.deleteRow(0);
                }
            }
        },
        
        removeAllChildren: function(element) {
            var child = element.firstChild;
            while (child) {            
                var nextSibling = child.nextSibling;
                $(child).remove();
                child = nextSibling;
            }
        },
        

        
        disableAll : function(element) {
            Element._setEnabledOnChildren(element, false);
        },
        
        enableAll : function(element) {
            Element._setEnabledOnChildren(element, true);
        },
        
        
        expand : function(element) {
            Effect.BlindDown(
                element.id, 
                {
                    duration : Element.EXPAND_COLLAPSE_DURATION
                }
            );      
        },

        collapse : function(element) {
            Effect.BlindUp(
                element.id, 
                {
                    duration : Element.EXPAND_COLLAPSE_DURATION
                }
            );      
        },
        
        
        getForm: function(element) {
            var form = null;
            
            if (element.form) {
                form = element.form;
            } else {
                form = Element._findAncestorForm(element);
            }
            
            return form;
        },
        
        scrollToElement : function(element, target, scrollAxes) {
            if (!scrollAxes) {
                scrollAxes = [true, true];
            }
            var targetPosition = Position.cumulativeOffset(target);
            var elementPosition = Position.cumulativeOffset(element);
            if (scrollAxes[0]) {
                element.scrollLeft = targetPosition[0] - elementPosition[0];
            }
            
            if (scrollAxes[1]) {
                element.scrollTop = elementPosition[1] - targetPosition[1];
            }
        }
        
    }
);
