var NavigationMenu = Class.create(); NavigationMenu.prototype = { initialize: function(el) { this.el = el; this.main_node_list = new NavigationMenuNodeList(this.fetchSingleElement(this.el, ".main_node_list", null), this, null); this.sub_node_lists = []; this.el.select(".sub_node_list").each( function(sub_node_list, sub_node_list_index) { // initialy hide sub_node_list //sub_node_list.hide(); var obj = new NavigationMenuNodeList(sub_node_list, this); this.sub_node_lists.push(obj); }.bind(this)); this.linkages = []; this.checkTimer = null; }, hideAllSubNodeList: function() { if ( this.checkTimer != null ) { clearTimeout(this.checkTimer); } this.checkTimer = setTimeout(function() { var any_selected_node = false; var node_lists = [this.main_node_list]; this.sub_node_lists.each( function(sub_node_list_obj, sub_node_list_obj_index) { node_lists.push(sub_node_list_obj); }.bind(this)); node_lists.each( function(node_list_obj, node_list_obj_index) { if ( node_list_obj.selected_node != null ) { any_selected_node = true; return; } }.bind(this)); this.checkTimer = null; // If no nodes are selected, hide all sub menus if ( !any_selected_node ) { this.sub_node_lists.each( function(sub_node_list_obj, sub_node_list_obj_index) { sub_node_list_obj.el.hide(); }.bind(this)); } }.bindAsEventListener(this), 500); }, linkNodeList: function(node, node_list) { var node_list_obj = null; // main_node_list? if ( node_list == this.main_node_list.el ) { node_list_obj = this.main_node_list; } else { // sub_node_list? this.sub_node_lists.each( function(sub_node_list_obj, sub_node_list_obj_index) { if ( node_list == sub_node_list_obj.el ) { node_list_obj = sub_node_list_obj; return; } }.bind(this)); } if ( node_list_obj != null ) { this.linkages.push({ node: node, node_list_obj: node_list_obj }); } }, fetchSingleElement: function(element, selector, default_element) { var v = element.select(selector); if ( v.length > 0 ) { return v[0]; } else { return default_element; } } }; var NavigationMenuNodeList = Class.create(); NavigationMenuNodeList.prototype = { initialize: function(el, menu) { this.el = el; this.menu = menu; this.nodes = this.el.select(".node"); this.current_active_linkage = null; this.selected_node = null; // Apply event this.nodes.each( function(node, node_index) { node.observe("mouseover", function(event){ this.handleNodeMouseover(node) }.bindAsEventListener(this) ); node.observe("mouseout", function(event){ this.handleNodeMouseout(node) }.bindAsEventListener(this) ); }.bind(this)); }, handleNodeMouseover: function(node) { // Swap image var image = this.fetchSingleElement(node, ".image", null); if ( image != null) { image.src = image.src.substring(0, image.src.length - 4)+"_on"+image.src.substring(image.src.length - 4, image.src.length); } else if ( node.hasClassName("first_node")) { node.addClassName("first_node_mouseover"); } else { node.addClassName("node_mouseover"); } // Find linkage var linkage_found = false; this.menu.linkages.each( function(linkage, linkage_index) { if ( linkage.node == node ) { var node_position = Element.positionedOffset(linkage.node); var node_height = Element.getHeight(linkage.node); linkage.node_list_obj.el.setStyle({ top: (node_position[1] + node_height)+"px", left: node_position[0]+"px" }); this.showLinkage(linkage); linkage_found = true; } }.bind(this)); if ( !linkage_found && this.current_active_linkage != null ) { this.current_active_linkage.node_list_obj.el.hide(); this.current_active_linkage = null; } this.selected_node = node; }, handleNodeMouseout: function(node) { // Swap image var image = this.fetchSingleElement(node, ".image", null); if ( image != null) { image.src = image.src.substring(0, image.src.length - 7)+image.src.substring(image.src.length - 4, image.src.length); } else if ( node.hasClassName("first_node")) { node.removeClassName("first_node_mouseover"); } else { node.removeClassName("node_mouseover"); } this.selected_node = null; this.menu.hideAllSubNodeList(); }, showLinkage: function(linkage) { if ( this.current_active_linkage != null && this.current_active_linkage != linkage ) { this.current_active_linkage.node_list_obj.el.hide(); } this.current_active_linkage = linkage; this.current_active_linkage.node_list_obj.el.show(); }, fetchSingleElement: function(element, selector, default_element) { var v = element.select(selector); if ( v.length > 0 ) { return v[0]; } else { return default_element; } } }