var AjaxMenu = Class.create({
	initialize: function(className) {

		// Get options
		this.options = Object.extend({
			dropMenuClass:	null,
			clickCallback:	null,
			clickClass:		null
		}, arguments[1] || {} );
		
		this.className = className;
		this.submenu = null;
		this.debug = false;
		// Make menu items for each link
		var menu_i = 0;
		this.menuItems = new Array();
		$$('a.' + this.className).each(function(elem) {
			this.menuItems[menu_i++] = new AjaxMenuItem(elem, this, this.options);
		}, this);
		
		$$('a.sub' + this.className).each(function(elem) {
			this.menuItems[menu_i++] = new AjaxMenuItem(elem, this, Object.extend(Object.clone(this.options), {isSubmenu: true, clickClass: 'sub' + this.options.clickClass}));
		}, this);
		
		this.dropMenuItems = null;
		if(this.options.dropMenuClass != null)
		{
			var drop_i = 0;
			this.dropMenuItems = new Array();
			$$('a.' + this.options.dropMenuClass).each(function(elem) {
				this.dropMenuItems[drop_i++] = new DropMenuItem(elem);
				//this.menuItems[menu_i++]     = new AjaxMenuItem(elem, this, this.options);
			}, this);
			
			$$('a.sub' + this.options.dropMenuClass).each(function(elem) {
				this.menuItems[menu_i++] = new AjaxMenuItem(elem, this, Object.extend(Object.clone(this.options), {isSubmenu: true, clickClass: 'sub' + this.options.clickClass, dropSubmenu: true}));
			}, this);
		}
		
		if (this.debug) console.log('AjaxMenu.initialize: '+className);
	},
	
	setClickCallback: function(func) {
		this.menuItems.each(function(item) {
		    if (this.debug) console.log('AjaxMenu.setClickCallback: '+item.element);
			item.setClickCallback(func); }
		);
	},
	
	kill: function() {
		this.menuItems.each(function(item) {
			item.kill(); }
		);
	},
	
	clearSelected: function() {
		this.menuItems.each(function(item) {
			item.clearSelected(); }
		);
	},
	
	selectItemUrl: function(url) {
		this.menuItems.each(function(item) {
			item.selectItemUrl(url); }
		);
	},
	
	selectItemId: function(id) {
		this.menuItems.each(function(item) {
			item.selectItemId(id); }
		);
	}
});

var AjaxMenuItem = Class.create({
	initialize: function(elem, menuObject) {
		
		// Get options
		this.options = Object.extend({
			clickCallback:	null,
			clickClass:		null,
			isSubmenu:		false,
			dropSubmenu:	false
		}, arguments[2] || {} );
		
		// Initialize members
		this.menuObject = menuObject;
		this.element = $(elem);
		this.selected = false;
		this.selecting = false;
		this.submenu = null;
		this.page = null;
		this.debug = false;
		
		// Look for a submenu
		var matchArray = /([^\/]+)\.(php|html?)/i.exec(this.element.href);
		if(matchArray)
		{
			this.page = matchArray[1];
			this.submenu = $(this.page);
		}
		
		// If this is in a submenu, get the parent id
		if(this.options.isSubmenu == true) {
			this.parent = $(this.element.parentNode).readAttribute('id'); }
		
		// Attach click event
		this.bonClick = this.onClick.bindAsEventListener(this);
		this.element.observe('click', this.bonClick);
	},
	
	setClickCallback: function(func) {
	    if (this.debug) console.log('AjaxMenuItem.setClickCallback: '+func);
		this.options.clickCallback = func;
	},
	
	kill: function() {
		this.element.stopObserving('click', this.bonClick);
	},
	
	clearSelected: function() {
		if(this.selecting == true) {
			return; }
		
		this.selected = false;
		if(this.options.clickClass != null && this.menuObject.submenu != this.page) {
			this.element.removeClassName(this.options.clickClass); }
		
		// Get rid of the submenu
		if(this.submenu != null && this.menuObject.submenu != this.page) {
			this.submenu.hide(); }
	},
	
	selectItemUrl: function(url) {
	    if (this.debug) console.log('selectItemUrl: '+this.element.href);
		var pageMatch = new RegExp(url + "$");
		if(pageMatch.test(this.element.href)) {
			this.onClick(null); }
	},
	
	selectItemId: function(id) {
		if(this.page == id)
		{
			if(this.submenu != null)
			{
				this.menuObject.submenu = this.page;
				if(this.options.dropSubmenu == false) {
					this.submenu.show(); }
			}
			
			if(this.options.clickClass != null) {
				this.element.addClassName(this.options.clickClass); }
		}
	},
	
	onClick: function(event) {
		if(event) {
			event.stop(); }

		if(this.selected == true) {
			return; }
		this.selected = true;
		
		// Show a submenu if there is one
		if(this.submenu != null)
		{
			this.menuObject.submenu = this.page;
			if(this.options.dropSubmenu == false) {
				this.submenu.show(); }
		}
		else if(this.options.isSubmenu == false) {
			this.menuObject.submenu = null; }
		
		// If this is a submenu, make sure the parent is selected
		if(this.options.isSubmenu == true) {
			this.menuObject.selectItemId(this.parent); }
		
		// Deselect the other menu options
		this.selecting = true;
		this.menuObject.clearSelected();
		this.selecting = false;
		
		if(this.options.clickClass != null) {
			this.element.addClassName(this.options.clickClass); }
		
		if(this.options.clickCallback != null) {
			this.options.clickCallback(this.element.href); }
			
		// FIXME -- there must be a better way
		this.selected = false;
	}
});