/*
Written by: Adam Crownoble (adam@bryan.edu)
Date: April 3 2006
License: LGPL (http://www.gnu.org/copyleft/lesser.html)
Dependencies: mootools (mootools.net)
 */

var DropDownMenu = new Class( {

    initialize: function(menuElement) {

        this.menu = menuElement; 
		this.id = menuElement.id; 
		this.duration = 400;
        this.buttons = []; 
		this.submenu2 = new Element("div").setProperty("id", "submenu2").injectInside($$("body")[0]);
        this.submenu2FX = new Fx.Style(this.submenu2, 'height',  {duration: this.duration, transition: Fx.Transitions.quartOut});
		document.menuOver = false; 
		document.waitTimeout = null;

        $A(this.menu.getElementsByTagName('li')).each(function(li) {
            if (li.parentNode == menuElement) {
                this.buttons.push($(li));
            }
        }.bind(this)); 
		this.submenus = $A(this.menu.getElementsByTagName('ul'));

        this.submenus.each(function(submenu) {
            submenu = $(submenu);
			submenu.setStyles("display:block;");
			submenu.originalHeight = submenu.offsetHeight;
			submenu.originalWidth = submenu.offsetWidth;
			submenu.effect = new Fx.Style(submenu, 'height', {duration: this.duration, transition: Fx.Transitions.quartOut});
			submenu.effect.set(0);
			//
			if (submenu.hasClass("sub1")) {
				var linkButton = submenu.getPrevious();
				linkButton.addClass("hasSub");
				submenu.setStyles("font-size:0; line-height:0;");
			}
        }.bind(this));

        this.buttons.each(function(button) {
            button.addEvent('mouseover', this.expand.bindAsEventListener(this)); 
			button.addEvent('mouseout', this.collapse.bindAsEventListener(this));
        }.bind(this));
		
		$$("#"+menuElement.id+" a").each(function(a){
			a.addEvent('mouseover', function(){
				document.menuOver = true;
			});
			a.addEvent('mouseout', function(){
				document.menuOver = false;
			});
		});
    },

    findButton: function(element) {
        var button = false;
        while (element.parentNode) {
            if (this.buttons.test(element)) {
                button = element;
            }
            element = element.parentNode;
        }
        return button;
    },

    findSubmenu: function(element) {
        var button = this.findButton(element); 
		var submenu = button.getElementsByTagName('ul')[0]; 
		return submenu;
    },

    expand: function(event) {
        var submenu = this.findSubmenu(event.target || event.srcElement); 
		//
		if (document.oldSubmenu) {
            document.oldSubmenu.effect.clearTimer();
            document.oldSubmenu.effect.start(0);
			if (document.oldSubmenu2) {
				document.oldSubmenu2.clearTimer();
				document.oldSubmenu2.start(0);
				document.oldSubmenu2 = null;
			}
        }
        if (submenu) {
            submenu.effect.clearTimer(); 
			submenu.effect.start(submenu.originalHeight);
        }
		//
		var button = $(event.target || event.srcElement);
		var submenu2UL = button.getNext(); 
		var submenu2FX = this.submenu2FX; 
		if (submenu2UL && submenu2UL.getTag() == "ul" && submenu2UL.hasClass("sub1")) {
            this.submenu2.setStyles({
                visibility: "visible", 
				//width: submenu2UL.originalWidth+10+"px", 
				height: "0px", 
				top: button.getCoordinates().top+"px", 
				left: button.getCoordinates().left+button.getCoordinates().width+2+(!window.ie?2:0)+"px"
            });
			this.submenu2.empty(); 
			this.submenu2.addEvent("mouseover", function() {
                document.menuOver = true;
            }); 
			this.submenu2.addEvent("mouseout", function() {
                document.menuOver = false;
            }); 
			var newUL = submenu2UL.clone().removeClass("sub1").setStyles("font-size:11px; line-height:13px; position:static; top:0; left:0; width:180px; overflow:hidden;");
			newUL.injectInside(this.submenu2);
			/*$A(newUL.getElementsByTagName('a')).each(function(item){
				item.addEvent("mouseover", function(){
					document.menuOver = true;
				});
				item.addEvent("mouseout", function() {
	                document.menuOver = false;
	            });
			});*/
			submenu2FX.clearTimer(); 
			submenu2FX.start(0, submenu2UL.originalHeight+4);
			//
			document.oldSubmenu2 = submenu2FX;
        }
        clearInterval(document.waitTimeout); 
		document.menuOver = true;
    },

    collapse: function(event) {
        var submenu = this.findSubmenu(event.target || event.srcElement); 
		var button = $(event.target || event.srcElement);
		var submenu2UL = button.getNext(); 
		var submenu2FX = this.submenu2FX;
		document.oldSubmenu = submenu;

        document.menuOver = false; 
		document.waitTimeout = setInterval(function() {
			if (document.menuOver) return;
            if (submenu) {
                submenu.effect.clearTimer(); submenu.effect.start(0);
            }
            if (submenu2UL && submenu2UL.getTag() == "ul" && submenu2UL.hasClass("sub1")) {
				submenu2FX.clearTimer();
				submenu2FX.start(0);
            }
        }, 500);
    }
});
