var AtlasMenu = function(associatedElement) {
    this._associatedElement = $get(associatedElement);
    this._hoverClass = "atlas-menu-hover";
    this._mouseOverHandler = null;
    this._mouseOutHandler = null;
};

AtlasMenu.prototype = {
    initialize : function() {
        this._mouseOverHandler = Function.createDelegate(this, this._onMouseOver);
        this._mouseOutHandler = Function.createDelegate(this, this._onMouseOut);

        var menus = this._associatedElement.getElementsByTagName("UL");
        
        for (var i = 0; i < menus.length; i++)
        {
            if (menus[i].className == "atlas-menu")
            {
                var items = menus[i].getElementsByTagName("LI");
                for (var k = 0; k < items.length; k++)
                {
                    $addHandler(items[k], "mouseover", this._mouseOverHandler);
                    $addHandler(items[k], "mouseout", this._mouseOutHandler);
                }
            }
        }
    },
    
    dispose : function() {
        var menus = this._associatedElement.getElementsByTagName("UL");
        
        for (var i = 0; i < menus.length; i++)
        {
            if (menus[i].className == "atlas-menu")
            {
                var items = menus[i].getElementsByTagName("LI");
                for (var k = 0; k < items.length; k++)
                {
                    $removeHandler(items[k], "mouseover", this._mouseOverHandler);
                    $removeHandler(items[k], "mouseout", this._mouseOutHandler);
                }
            }
        }
    },

    _onMouseOver : function(e) {
        if (Sys.Browser.agent == Sys.Browser.InternetExplorer) {
            var srcEl = window.event.srcElement;

            while (srcEl.nodeName != "LI" && srcEl.nodeName != "BODY")
                srcEl = srcEl.parentNode;

            this._addClass(srcEl, this._hoverClass);
        }
        else
            this._addClass(e.target, this._hoverClass);

        return;
    },
    
    _onMouseOut : function(e) {
        if (Sys.Browser.agent == Sys.Browser.InternetExplorer) {
            var srcEl = window.event.srcElement;
            var toEl = window.event.toElement;
            var fromEl = window.event.fromElement;

            while (srcEl.nodeName != "LI" && srcEl.nodeName != "BODY")
                srcEl = srcEl.parentNode;

            if (srcEl.contains(toEl) || (fromEl.nodeName == "IMG" && (toEl && toEl.contains(fromEl))))
                return;

            this._removeClass(srcEl, this._hoverClass);
        }
        else
            this._removeClass(e.target, this._hoverClass);
        
        return;
    },

    _addClass : function(element, classToAdd) {
        if (this._hasAnyClass(element)) {
            if (!this._hasClass(element, classToAdd))
                element.className = element.className + ' ' + classToAdd;
        }
        else if (this._canHaveClass(element))
            element.className = classToAdd;
    },
    
    _canHaveClass : function(element) {
        return ((element != null) && (element.className != null));
    },

    _hasAnyClass : function(element) {
        return (this._canHaveClass(element) && (element.className.length > 0));
    },

    _hasClass : function(element, specificClass) {
        return (this._hasAnyClass(element) && (element.className.indexOf(specificClass) > -1));
    },

    _swapClass : function(element, oldClass, newClass) {
        if (this._hasAnyClass(element))
            element.className = element.className.replace(new RegExp(oldClass, "gi"), newClass);
    },

    _removeClass : function(element, classToRemove) {
        this._swapClass(element, classToRemove, '');
    }
};
