// Navigation Handler // --------------- // Author: Bradley Spaulding, USAi.net // // Navigation Handler is built for the USAi.net Wireless Portal. // This script handles DOM manipulation for page navigation. // Updated 2009-08-20: Fixed IE Latency issue which caused frequent "No Navigation Item is Active" errors. function NavigationHandler(set_nav_div, set_content_div) { // Set navigation and content div name defaults if(!set_nav_div) set_nav_div = 'navigation'; if(!set_content_div) set_content_div = 'main'; // Configuration this.navigation_div_id = set_nav_div; this.navigation_class_active = 'selected'; this.navigation_class_inactive = 'unselected'; this.content_div_id = set_content_div; this.content_class_active = this.content_div_id + '_item active'; this.content_class_inactive = this.content_div_id + '_item inactive'; // Internal Variables // WARNING: DO NOT ALTER THESE DIRECTLY! this._navigation_div; this._content_div; this._last_active_nav_element_id; this._last_active_content_element_id; // navigation_div() // Singleton accessor for _navigation_div this.navigation_div = function() { if(this._navigation_div == null) this._navigation_div = document.getElementById(this.navigation_div_id); return this._navigation_div; } // content_div() // Singleton accessor for _content_div this.content_div = function() { if(this._content_div == null) this._content_div = document.getElementById(this.content_div_id); return this._content_div; } // active_nav_element() // Returns: active navigation DOM element this.active_nav_element = function() { if(this._last_active_nav_element_id != null) { return document.getElementById(this._last_active_nav_element_id); } else { for(i = 0; i < this.navigation_div().childNodes.length; i++) { child = this.navigation_div().childNodes[i]; if(child.className == this.navigation_class_active) { this._last_active_nav_element_id = child.id; return child; } } } alert("Error: No navigation item is active."); return null; } // active_content_element() // Returns: active content DOM element this.active_content_element = function() { if(this._last_active_content_element_id != null) { return document.getElementById(this._last_active_content_element_id); } else { for(i = 0; i < this.content_div().childNodes.length; i++) { child = this.content_div().childNodes[i]; if(child.className == this.content_class_active) { this._last_active_content_element_id = child.id; return child; } } } alert("Error: No content item is active."); return null; } // activate() // Params: // nav_element_id => string id of navigation element to be active // content_element_id => string id of content element to be active this.activate = function(nav_element_id, content_element_id) { // Get old active child active_nav_div = this.active_nav_element(); // Don't do anything if the old active IS the new active // (i.e, the user clicked on the active item). if(!(active_nav_div.id == nav_element_id)) { // Set the new active to active document.getElementById(nav_element_id).className = this.navigation_class_active; this._last_active_nav_element_id = nav_element_id; // Set the old active to inactive active_nav_div.className = this.navigation_class_inactive; // Set the old active content to inactive this.active_content_element().className = this.content_class_inactive; // Activate the new content area document.getElementById(content_element_id).className = this.content_class_active; this._last_active_content_element_id = content_element_id; } } }