// Useful JavaScript functions for the KBroker JSP's
 
// Static variables
var MENU_IDENTIFIER = "section-toggle";
var MENU_HOVER_CLASS = "menu-hover";
var MENU_TOGGLE_CLASS = "menu-toggle";
var TOGGLE_LINK_CLASS = "toggle-link";
var USE_SCRIPTACULOUS = false;
var EFFECT_DURATION = 0.2;
var HOVER_HIDE_ON_OUT = true; 
var SELECTED_MENU_CLASS = "depth0 toggled";

var GENERAL_SEARCH_ID = "tx2";

/** ===============================================================================================
 *  getElementsByClassName
 *
 *  Retrieves child elements by class name
 *  Taken from http://www.robertnyman.com/2005/11/07/the-ultimate-getelementsbyclassname/ 
 *  =============================================================================================== 
 */
function getElementsByClassName(className, tag, elm){
	var testClass = new RegExp("(^| )" + className + "( |$)");
	var tag = tag || "*";
	var elm = elm || document;
	var elements = (tag == "*" && elm.all)? elm.all : elm.getElementsByTagName(tag);
	var returnElements = [];
	var current;
	var length = elements.length;
	for(var i=0; i<length; i++){
		current = elements[i];
		if(testClass.test(current.className)){
			returnElements.push(current);
		}
	}
	return returnElements;
}

/** ===============================================================================================
 *  External Links - Adds "Open in New Window" functionality for XHTML code.
 *
 *  target="_blank" is no longer valid for anchors in XHTML strict. Due to this, we are using a
 *  piece of JavaScript to make all links marked with rel="external" to open in a new window.
 *  =============================================================================================== 
 */
function externalLinks() {
	var objCurrent, objReplacement;

	if (document.getElementsByTagName) {
		var objAnchors = document.getElementsByTagName("a");
		for (var iCounter=0; iCounter<objAnchors.length; iCounter++) {
			if (objAnchors[iCounter].getAttribute("href") &&objAnchors[iCounter].getAttribute("rel") == "external") {
				objAnchors[iCounter].onclick = function(event){return launchWindow(this, event);}
				objAnchors[iCounter].onkeypress = function(event){return launchWindow(this, event);}

				if (document.replaceChild) {
					objCurrent = objAnchors[iCounter].firstChild;
					if (objCurrent.alt) {  // Image
						objReplacement = objCurrent;
						objReplacement.alt = objCurrent.alt + " (opens in a new window)";
						try {
							objAnchors[iCounter].replaceChild(objReplacement, objCurrent);
						} catch(e) {}
					}
				}
			}
		}
	}
}

/** ===============================================================================================
 *	Launch Window
 *
 *  Opens a new window
 *  ===============================================================================================
 */
function launchWindow(objAnchor, objEvent) {
	var iKeyCode;

	if (objEvent && objEvent.type == "keypress") {
		if (objEvent.keyCode) {
			iKeyCode = objEvent.keyCode;
		} else if (objEvent.which) {
			iKeyCode = objEvent.which;
		}

		if (iKeyCode != 13 && iKeyCode != 32) {
			return true;
		}
	}
	return !window.open(objAnchor);
}
 
/** ===============================================================================================
 *	goBack
 *
 *  Takes the user back one page in their history (if available)
 *  ===============================================================================================
 */ 
function goBack() {
  var h = window.history;
  if (h.length) { 
  	h.back();
	}
}

/** ===============================================================================================
 *	createCookie
 *
 *  Creates a cookie for the with the specified key/value pair.  It will expire in the set amount
 *  of days
 *  ===============================================================================================
 */
function createCookie(name,value,days) {
  if (days) {
    var date = new Date();
    date.setTime(date.getTime()+(days*24*60*60*1000));
    var expires = "; expires="+date.toGMTString();
  } else {
  	expires = "";
  }
  document.cookie = name+"="+value+expires+"; path=/";
}

/** ===============================================================================================
 *	readCookie
 *
 *  Returns the value from the specified cookie
 *  ===============================================================================================
 */
function readCookie(name) {
  var nameEQ = name + "=";
  var ca = document.cookie.split(';');
  for (var i=0; i<ca.length;i++) {
    var c = ca[i];
    while (c.charAt(0)==' ') {
    	c = c.substring(1,c.length);
    }
    if (c.indexOf(nameEQ) == 0) {
    	return c.substring(nameEQ.length,c.length);
    }
  }
  return null;
}

/** ===============================================================================================
 *	prepareMenu
 *
 *  Prepares the onclicks for a menu
 *  ===============================================================================================
 */
function prepareMenu() {
    var menuElement = document.getElementById(MENU_IDENTIFIER);
    if (menuElement.className.indexOf(MENU_TOGGLE_CLASS) >= 0) {
        //  prepareToggleMenu(menuElement);
    } else if (menuElement.className.indexOf(MENU_HOVER_CLASS) >= 0) {
        prepareHoverMenu(menuElement);
    }
}

/** ===============================================================================================
 *	prepareHoverMenu
 *
 *  Prepares the onclicks for a hover menu
 *  ===============================================================================================
 */
function prepareHoverMenu(hoverMenu) {
    if (!document.getElementById || !document.getElementsByTagName) return false;
    if (!hoverMenu) return false;

    // Hide the menus
    hideChildItems(hoverMenu, "UL");

    // Open any selected menu
    var selectedMenu = getElementsByClassName(SELECTED_MENU_CLASS, "LI", hoverMenu);
    if (selectedMenu != null && selectedMenu.length > 0) {
	showChildItems(selectedMenu[0], "UL");
    }

    var hoverItems = hoverMenu.getElementsByTagName("LI");
    for (var i=0; i<hoverItems.length; i++) {
        hoverItems[i].onmouseover = function() {
            hideChildItems(hoverMenu, "UL");
            this.getElementsByTagName("UL")[0].style.display = "block";
        }
        if (HOVER_HIDE_ON_OUT) {
            hoverItems[i].onmouseout = function() {
                hideChildItems(this, tag);
            }
        }
    }
}

/** ===============================================================================================
 *	hideChildItems
 *
 *  Hides child elements
 *  ===============================================================================================
 */
function hideChildItems(elem, tag) {
    var items = elem.getElementsByTagName(tag);
    for (var i=0; i<items.length; i++) {
    		if (USE_SCRIPTACULOUS) {
    				Effect.BlindUp(items[i], {queue: 'front', duration: EFFECT_DURATION});
    		} else {
        		items[i].style.display = "none";
        }
    }
}

/** ===============================================================================================
 *	showChildItems
 *
 *  Show child elements
 *  ===============================================================================================
 */
function showChildItems(elem, tag) {
    var items = elem.getElementsByTagName(tag);
    for (var i=0; i<items.length; i++) {
    		if (USE_SCRIPTACULOUS) {
    				Effect.BlindDown(items[i], {queue: 'front', duration: EFFECT_DURATION});
    		} else {
        		items[i].style.display = "block";
        }
    }
}

/** ===============================================================================================
 *	hideSiblingsLists
 *
 *  Hides lists at the same level as the current one
 *  ===============================================================================================
 */
function hideSiblingsLists(elem) {
		// Elem is a LI.  We need the parent UL/OL
		var parent = elem.parentNode;
		if (!parent) return false;

		// Now get all the LI under that parent
    var children = parent.childNodes;
    for (var i=0; i<children.length; i++) {
        if (children[i].nodeType == 1) {
            // We are in a LI.  Get child UL/OL's if available and hide them!
           	hideChildItems(children[i], "UL");
           	hideChildItems(children[i], "OL");
        }
    }   
}

/** ===============================================================================================
 *	prepareToggleMenu
 *
 *  Prepares onclicks for a toggle menu
 *  ===============================================================================================
 */
function prepareToggleMenu(toggleMenu) {
    if (!document.getElementById || !document.getElementsByTagName) return false;
    if (!toggleMenu) return false;

    // Open any selected menu
    var selectedMenu = getElementsByClassName(SELECTED_MENU_CLASS, "LI", toggleMenu);
    if (selectedMenu != null && selectedMenu.length > 0) {
	showChildItems(selectedMenu[0], "UL");
    }
    
    var toggleLinks = getElementsByClassName(TOGGLE_LINK_CLASS, "a", toggleMenu);
    for (var i=0; i<toggleLinks.length; i++) {
        toggleLinks[i].onclick = function() {
        		hideSiblingsLists(this.parentNode);
        		return !toggleMenuItem(this.parentNode.getElementsByTagName("UL")[0]);
        }
    }
}

/** ===============================================================================================
 *	toggleMenuItem
 *
 *  Shows or hides a menu item
 *  ===============================================================================================
 */
function toggleMenuItem(node) {
    if (!document.getElementById) return false;
    
    // Node not found? Fall back to link
    if (!node) {
    	return false;
    }
    
    if (USE_SCRIPTACULOUS) {
        Effect.toggle(node, 'blind', {queue: 'end', duration: EFFECT_DURATION} );
    } else {
        if (node.style.display == "") {
            node.style.display = "none";
        } else {
            node.style.display = "";
        }
    }
    
    return true;
}

/** ===============================================================================================
 *	giveFocus
 *
 *  Gives focus to the specified element
 *  ===============================================================================================
 */
function giveFocus(elementId) {
	if (!document.getElementById) return false;
	if (!document.getElementById(elementId)) return false;
	document.getElementById(elementId).focus();
}

/** ===============================================================================================
 *	setDisplayNone
 *
 *  Gives the specified element a CSS style of display: none;
 *  ===============================================================================================
 */
function setDisplayNone(elementId) {
	if (!document.getElementById) return false;
	if (!document.getElementById(elementId)) return false;
	document.getElementById(elementId).style.display = 'none';
}

/** ===============================================================================================
 *	setAllToDisplayNone
 *
 *  Gives the specified elements a CSS style of display: none;
 *  ===============================================================================================
 */
function setAllToDisplayNone(elementIds) {
	if (!document.getElementById) return false;
	
	for (var i=0; i<elementIds.length; i++) {
		if (!document.getElementById(elementIds[i])) continue;
		document.getElementById(elementIds[i]).style.display = 'none';
	}
}

/** ===============================================================================================
 *	setElementsToDisplayNone
 *
 *  Gives the specified elements a CSS style of display: none;
 *  ===============================================================================================
 */
function setElementsToDisplayNone(elements) {
	for (var i=0; i<elements.length; i++) {
		elements[i].style.display = 'none';
	}
}

function focusGeneralSearch() {
	document.getElementById(GENERAL_SEARCH_ID).focus();
}

function hideElements() {
	if (location.href.indexOf("start.jsp")>-1){
	  var hidelinkCode = '<a href="javascript:Effect.toggle(\'filterhider\',\'blind\',\{duration:0.5\})\;">More about us...</a>';
	  document.getElementById('filterHiderAnchor').innerHTML = hidelinkCode;
	  setDisplayNone("filterhider");
	}
}