Skip to content

Instantly share code, notes, and snippets.

@bspaulding
Created June 19, 2009 21:39
Show Gist options
  • Save bspaulding/132902 to your computer and use it in GitHub Desktop.
Save bspaulding/132902 to your computer and use it in GitHub Desktop.
// 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;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment