/*
* spMenu v1.0
*
*/
/******************************************************************************/
/////// Configuration Variables ///////////////////////////
var timerlen = 5;
var slideAniLen = 250;
var catsFound = "";
var makingMenu = false;
var timerID = new Array();
var startTime = new Array();
var obj = new Array();
var endHeight = new Array();
var moving = new Array();
var dir = new Array();
spMenu.SymbolTag = 'span'; // symbol inserted at beginning of <LI> tags
//spMenu.SymbolTag = ''; // uncomment to disable insertion of symbols
//spMenu.SymbolTag = 'img'; // uncomment to use IMG tags for symbols
//spMenu.SymbolSrcItem = ''; // url to assign to IMG src attribute of an item
//spMenu.SymbolSrcClose = ''; // url to assign to IMG src attribute upon close
//spMenu.SymbolSrcOpen = ''; // url to assign to IMG src attribute upon open
spMenu.OmitSymbols = false; // don't insert symbol but do adjust them
spMenu.SymbolClassItem = 'symbol-item';
spMenu.SymbolClassClose = 'symbol-close';
spMenu.SymbolClassOpen = 'symbol-open';
spMenu.ClassItem = 'item'; // class name added to <LI> tag's class
spMenu.ClassClose = 'close'; // class name added to <LI> tag's class
spMenu.ClassOpen = 'open'; // class name added to <LI> tag's class
spMenu.ClassLast = 'last'; // added to last <LI> and symbol tags' classes
spMenu.CookieSaveStates = true; // flag to use a cookie to save menu state
spMenu.CookieExpire = 1; // days before cookie saving menu states expires
spMenu.SetupMenu = true; // scan document objects to initialize menu
spMenu.Singular = false; // restrict open menus to only one per level
/////// End of Configuration Variables ///////////////////
function make_sp_menu(id,setup,omit_symbols,no_save_state,singular,no_setup) {
makingMenu = true;
var m = new spMenu(id);
if (omit_symbols) m.OmitSymbols = true;
if (no_save_state) m.CookieSaveStates = false;
if (singular) m.Singular = true;
if (no_setup) m.SetupMenu = false;
// Setup menus if we are inserting symbols or restoring menu open/close states.
if (m.SetupMenu) m.setup_symbols(setup);
makingMenu = false;
return m;
}
/*
* spMenu
*/
function spMenu(ul_id) { // object constructor
this.top_ul_id = ul_id;
this.top_ul = document.getElementById(ul_id);
this.configure();
// Register menu
spMenu.menus[ul_id] = this;
return this;
}
/*
* spMenu Class Variables
*/
spMenu.menus = []; // list of defined menus
/*
* spMenu Class Methods
*/
spMenu.underline = function(e) {
e = spMenu.get_ref(e);
var li = spMenu.get_li(e);
var span = li.getElementsByTagName('span')[1];
span.style.textDecoration='underline';
}
spMenu.underlineOff = function(e) {
e = spMenu.get_ref(e);
var li = spMenu.get_li(e);
var span = li.getElementsByTagName('span')[1];
span.style.textDecoration='none';
}
spMenu.toggle = function(e) {
e = spMenu.get_ref(e);
var m = spMenu.menus[spMenu.get_top_ul(e).id];
var li = spMenu.get_li(e);
var ul = li.getElementsByTagName("UL")[0];
if (ul.style.display == "block") {
m.hide_menu(ul,li,e);
}
else {
if (m.Singular) m.hide_menus_except(li);
m.show_menu(ul,li,e);
}
m.save_menu_states();
}
spMenu.cls_more = function(e) {
ul = spMenu.get_ref(e);
var m = spMenu.menus[spMenu.get_top_ul(e).id];
m.save_menu_list();
}
spMenu.show = function(ul) {
ul = spMenu.get_ref(ul);
var top_ul = spMenu.get_top_ul(ul);
if (! top_ul) return;
var m = spMenu.menus[top_ul.id];
var li = spMenu.get_li(ul);
m.show_menu(ul,li);
}
spMenu.hide = function(ul) {
ul = spMenu.get_ref(ul);
var top_ul = spMenu.get_top_ul(ul);
if (! top_ul) return;
var m = spMenu.menus[top_ul.id];
var li = spMenu.get_li(ul);
m.hide_menu(ul,li);
}
spMenu.show_all = function(ul) {
// Show all menus under ul.
ul = spMenu.get_ref(ul);
var uls = ul.getElementsByTagName("UL");
for (i = 0; i < uls.length; i++) {
spMenu.show(uls[i]);
}
}
spMenu.hide_all = function(ul) {
// Hide all menus under ul.
ul = spMenu.get_ref(ul);
var uls = ul.getElementsByTagName("UL");
for (i = 0; i < uls.length; i++) {
spMenu.hide(uls[i]);
}
}
spMenu.save_state = function(ul) {
// Reset menu to original settings.
ul = spMenu.get_ref(ul);
var m = spMenu.menus[spMenu.get_top_ul(ul).id];
m.save_menu_states();
}
spMenu.reset = function(ul) {
// Reset menu to original settings.
ul = spMenu.get_ref(ul);
var m = spMenu.menus[spMenu.get_top_ul(ul).id];
m.reset_menu_states();
}
// Private methods
spMenu.get_ref = function(id) {
if (typeof id == "string") return document.getElementById(id);
return id;
}
spMenu.get_top_ul = function(e) {
while (e && (e.nodeName != 'UL' || ! e.id || ! spMenu.menus[e.id])) e = e.parentNode;
return e;
}
spMenu.get_li = function(e) {
while (e && e.nodeName != 'LI') e = e.parentNode;
return e;
}
/*
* spMenu Object Methods
*/
spMenu.prototype.configure = function() {
// Assign global class settings (capitalized variables) to object settings.
var v,c;
for (v in spMenu) {
c = v.substr(0,1);
if (c == c.toUpperCase()) {
this[v] = spMenu[v];
}
}
}
spMenu.prototype.setup_symbols = function(s) {
// Insert open/close symbols at the beginning of the menu items
// and open or close menus like they were previously.
var states = this.get_menu_states(s);
//alert(states);
var more_link = "st";
var index = 0;
var ul, li, symbol, islast = false;
var ul_elements, li_elements = this.top_ul.getElementsByTagName("LI");
for(var i=0; i < li_elements.length; i++) {
li = li_elements[i];
if (this.ClassLast) islast = this.is_last_item(li);
ul_elements = li.getElementsByTagName("UL");
var defaul_show = document.getElementById("show");
if(ul_elements.length > 0) {
var fc = li.firstChild;
if (fc.nodeName == "SPAN" || fc.nodeName == "DIV"){
if (fc.className == "ttl") {
if (catsFound == "") {
catsFound = fc.innerHTML;
}
else {
catsFound = catsFound + ":" + fc.innerHTML;
}
var lastcatfound = fc.innerHTML;
}
if (fc.className == "more-link") {
fc.setAttribute("parentcat",lastcatfound);
}
}
// Submenus
if (this.SymbolTag && ! this.OmitSymbols) {
symbol = document.createElement(this.SymbolTag);
if (this.ClassLast && islast) symbol.className = this.ClassLast;
symbol.onmouseover = function() { spMenu.underline(this); };
symbol.onmouseout = function() { spMenu.underlineOff(this); };
symbol.onclick = function() { spMenu.toggle(this); };
li.insertBefore(symbol, li.firstChild);
}
ul = ul_elements[0];
if (i == 1 && states[index] == 1 && more_link =="close"){states[index] = 0; more_link = "st";}
if (i == 3 && states[index] == 1 && more_link =="close"){states[index] = 0; more_link = "st";}
if (i == 5 && states[index] == 1 && more_link =="close"){states[index] = 0; more_link = "st";}
if (i == 7 && states[index] == 1 && more_link =="close"){states[index] = 0; more_link = "st";}
if (i == 9 && states[index] == 1 && more_link =="close"){states[index] = 0; more_link = "st";}
if (states[index] == '1') this.show_menu(ul,li);
else this.hide_menu(ul,li);
if (i == 0 && states[index] == '0') more_link = "close";
if (i == 2 && states[index] == '0') more_link = "close";
if (i == 4 && states[index] == '0') more_link = "close";
if (i == 6 && states[index] == '0') more_link = "close";
if (i == 8 && states[index] == '0') more_link = "close";
//if (defaul_show)this.show_menu(ul,li);
index++;
}
else {
// Menu item
if (this.SymbolTag && ! this.OmitSymbols) {
symbol = document.createElement(this.SymbolTag);
if (this.SymbolClassItem)
symbol.className = this.SymbolClassItem;
if (this.SymbolSrcItem)
symbol.src = this.SymbolSrcItem;
if (this.ClassLast && islast)
symbol.className += ' ' + this.ClassLast;
li.insertBefore(symbol, li.firstChild);
}
if (this.ClassItem) li.className += ' ' + this.ClassItem;
}
if (islast) li.className += ' ' + this.ClassLast;
}
}
spMenu.prototype.is_last_item = function(e) {
// Check if element is the last LI element in the list.
e = e.nextSibling;
// Get next element (Mozilla puts text nodes at same level here).
while (e && e.nodeType != 1) e = e.nextSibling;
return e ? false : true;
}
spMenu.prototype.get_menu_states = function(s) {
var cookie = getCookie("sp_" + this.top_ul_id);
if (null == cookie || cookie == 'undefined') cookie = s;
return cookie.split('x');
}
spMenu.prototype.save_menu_states = function() {
// Save all menu and submenu open/close states in a cookie
if (! this.CookieSaveStates) return;
var states = [];
var ul_elements, li_elements = this.top_ul.getElementsByTagName("LI");
for(var i=0; i < li_elements.length; i++) {
ul_elements = li_elements[i].getElementsByTagName("UL");
if (ul_elements.length > 0) {
states[states.length] = ul_elements[0].style.display == "block" ? 1 : 0;
}
}
var expire_date = new Date((new Date().getTime()) + this.CookieExpire*24*60*60*1000);
setCookie("sp_" + this.top_ul_id, states.join('x'), expire_date, '/');
}
spMenu.prototype.save_menu_list = function() {
// Save all menu and submenu open/close states in a cookie
if (! this.CookieSaveStates) return;
var states = [];
var ul_elements, li_elements = this.top_ul.getElementsByTagName("LI");
for(var i=0; i < li_elements.length; i++) {
ul_elements = li_elements[i].getElementsByTagName("UL");
if (i == 1) {states[states.length] = 0; }
else if (i == 3) { states[states.length] = 0; }
else if (i == 5) { states[states.length] = 0; }
else if (i == 7) { states[states.length] = 0; }
else if (i == 9) { states[states.length] = 0; }
else if (ul_elements.length > 0) {
states[states.length] = ul_elements[0].style.display == "block" ? 1 : 0;
}
}
var expire_date = new Date((new Date().getTime()) + this.CookieExpire*24*60*60*1000);
setCookie("sp_" + this.top_ul_id, states.join('x'), expire_date, '/');
}
spMenu.prototype.reset_menu_states = function() {
// Reset all menu and submenu open/close states (delete cookie)
var expire_date = new Date((new Date().getTime()) - 1000); // set to past time
setCookie("sp_" + this.top_ul_id, '', expire_date, '/');
}
spMenu.prototype.add_remove_class = function(e,add_class,remove_class) {
if (e) {
if (!(makingMenu) & add_class == "open" & remove_class == "close"){
var fc = e.firstChild;
var fn = fc.nextSibling;
var fnClass = fn.className;
var fnInner = fn.innerHTML;
if (fnClass == "ttl") {
//alert("Opening category: " + fnInner);
clickTrackNavMore(fnInner, "Open category view");
}
if (fnClass == "more-link") {
var fnid = fn.getAttribute("parentcat");
//alert("Opening more-link for " + fnid);
clickTrackNavMore(fnid, "Open view more");
}
}
else if (!(makingMenu) & add_class == "close" & remove_class == "open"){
var fc = e.firstChild;
var fn = fc.nextSibling;
var fnClass = fn.className;
var fnInner = fn.innerHTML;
if (fnClass == "ttl") {
//alert("Closing category: " + fnInner);
clickTrackNavMore(fnInner, "Close category view");
}
if (fnClass == "more-link") {
var fnid = fn.getAttribute("parentcat");
//alert("Closing more-link for " + fnid);
clickTrackNavMore(fnid, " Close view more");
}
}
}
if (e) {
if (remove_class)
e.className = e.className.replace(remove_class,'');
if (add_class && ! e.className.match( (new RegExp("\\b"+add_class+"(\\s.*)?")) ) ) {
e.className += ' ' + add_class;
}
}
}
spMenu.prototype.show_menu = function(ul,li,e) {
ul.style.display = 'block';
//ul.style.height = '400px';
calcHeight = ul.offsetHeight;
//ul.style.height = "0px";
//alert(calcHeight);
//Expand(ul);
this.add_remove_class(li,this.ClassOpen,this.ClassClose);
if (this.SymbolTag) {
var symbol = li.getElementsByTagName(this.SymbolTag)[0];
this.add_remove_class(symbol,this.SymbolClassOpen,this.SymbolClassClose);
if (this.SymbolSrcOpen) symbol.src = this.SymbolSrcOpen;
}
// Following case is for toggle buttons disassociated with menu structure.
this.add_remove_class(e,this.SymbolClassOpen,this.SymbolClassClose);
}
spMenu.prototype.hide_menu = function(ul,li,e) {
ul.style.display = 'none';
this.add_remove_class(li,this.ClassClose,this.ClassOpen);
if (this.SymbolTag) {
var symbol = li.getElementsByTagName(this.SymbolTag)[0];
this.add_remove_class(symbol,this.SymbolClassClose,this.SymbolClassOpen);
if (this.SymbolSrcClose) symbol.src = this.SymbolSrcClose;
}
// Following case is for toggle buttons disassociated with menu structure.
this.add_remove_class(e,this.SymbolClassClose,this.SymbolClassOpen);
}
spMenu.prototype.hide_menu_g = function(ul,li,e) {
ul.style.display = 'none';
//this.add_remove_class(li,this.ClassClose,this.ClassOpen);
/*if (this.SymbolTag) {
var symbol = li.getElementsByTagName(this.SymbolTag)[0];
this.add_remove_class(symbol,this.SymbolClassClose,this.SymbolClassOpen);
if (this.SymbolSrcClose) symbol.src = this.SymbolSrcClose;
}
*/
// Following case is for toggle buttons disassociated with menu structure.
//this.add_remove_class(e,this.SymbolClassClose,this.SymbolClassOpen);
}
spMenu.prototype.hide_menus_except = function(li) {
// Hide other menus at same level as li.
var n;
var re = new RegExp('\\b' + this.ClassOpen + '\\b');
for (var i = 0; i < li.parentNode.childNodes.length; i++) {
n = li.parentNode.childNodes[i];
if (n == li || n.nodeType != 1) continue;
if (n.className.match(re)) this.hide_menu(n.getElementsByTagName("UL")[0],n);
}
}
/*
* Classic Cookie functions
*/
function setCookie(name, value, expires, path, domain, secure) {
document.cookie = name + "=" + escape(value) +
(expires ? "; expires=" + expires.toGMTString() : "") +
(path ? "; path=" + path : "") +
(domain ? "; domain=" + domain : "") +
(secure ? "; secure" : "");
}
function getCookie(name) {
var dc = document.cookie;
var prefix = name + "=";
var begin = dc.indexOf("; " + prefix);
if (begin == -1) {
begin = dc.indexOf(prefix);
if (begin != 0) return null;
}
else {
begin += 2;
}
var end = document.cookie.indexOf(";", begin);
if (end == -1) end = dc.length;
return unescape(dc.substring(begin + prefix.length, end));
}
function deleteMenuCookie(name,value,days) {
if (days) {
var date = new Date();
date.setTime(date.getTime()+(days*24*60*60*1000));
var expires = "; expires="+date.toGMTString();
}
else var expires = "";
document.cookie = name+"="+value+expires+"; path=/";
}
