/*
Author: James Craig (jcraig at bearingpoint dot net)
*/

/* a few sniffs to circumvent known browser bugs */
var sUserAgent = navigator.userAgent.toLowerCase();
var isIE=document.all?true:false;
var isNS4=document.layers?true:false;
var isOp=(sUserAgent.indexOf('opera')!=-1)?true:false;
var isMac=(sUserAgent.indexOf('mac')!=-1)?true:false;
var isMoz=(sUserAgent.indexOf('mozilla/5')!=-1&&sUserAgent.indexOf('opera')==-1&&sUserAgent.indexOf('msie')==-1)?true:false;
var isNS6=(sUserAgent.indexOf('netscape6')!=-1&&sUserAgent.indexOf('opera')==-1&&sUserAgent.indexOf('msie')==-1)?true:false;
var dom=document.getElementById?true:false;

/* sets time until menus disappear in milliseconds */
var iMenuTimeout=500;

var aMenus=new Array;
var oMenuTimeout;
var iMainMenusLength=0;

/* the following boolean controls the z-index property if needed */
/* if is only necessary if you have multiple mainMenus in one file that are overlapping */
/* set bSetZIndeces to true (either here or in the HTML) and the main menus will have a z-index set in descending order so that preceding ones can overlap */
/* the integer iStartZIndexAt controls z-index of the first main menu */
var bSetZIndeces=true;
var iStartZIndexAt=10000;
var aMainMenus=new Array;

/* load up the submenus */
function loadMenus(){
	if(!dom)return;
	var aLists=document.getElementsByTagName('ul');
	for(var i=0;i<aLists.length;i++){
		if(aLists[i].className=='navMenu')aMenus[aMenus.length]=aLists[i];
	}
	var aAnchors=document.getElementsByTagName('a');
	var aItems = new Array;
	for(var i=0;i<aAnchors.length;i++){
		if(aAnchors[i].className=='navItem')aItems[aItems.length] = aAnchors[i];
	}
	var sMenuId=null;
	var oParentMenu=null;
	var aAllElements=document.body.getElementsByTagName("*");
	if(isIE)aAllElements=document.body.all;
	/* loop through navItem and navMenus and dynamically assign their IDs */
	/* each relies on it's parent's ID being set before it */
	for(var i=0;i<aAllElements.length;i++){
		if(aAllElements[i].className.indexOf('mainMenu')!=-1){
			/* load up main menus collection */
			if(bSetZIndeces)aMainMenus[aMainMenus.length]=aAllElements[i];
		}
		if(aAllElements[i].className=='navItem'){
			oParentMenu = aAllElements[i].parentNode.parentNode;
			if(!oParentMenu.childMenus) oParentMenu.childMenus = new Array;
			oParentMenu.childMenus[oParentMenu.childMenus.length]=aAllElements[i];
			if(aAllElements[i].id==''){
				if(oParentMenu.className=='mainMenu'){
					aAllElements[i].id='navItem_'+iMainMenusLength;
					//alert(aAllElements[i].id);
					iMainMenusLength++;
				}else{
					aAllElements[i].id=oParentMenu.id.replace('Menu','Item')+'.'+oParentMenu.childMenus.length;
				}
			}
		} else if(aAllElements[i].className=='navMenu'){
			oParentItem = aAllElements[i].parentNode.firstChild;
			aAllElements[i].id = oParentItem.id.replace('Item','Menu');
		}
	}
	/* dynamically set z-indeces of main menus so they won't underlap */
	for(var i=aMainMenus.length-1;i>=0;i--){
		aMainMenus[i].style.zIndex=iStartZIndexAt-i;
	}
	/* set menu item properties */
	for(var i=0;i<aItems.length;i++){
		sMenuId=aItems[i].id;
		sMenuId='navMenu_'+sMenuId.substring(8,sMenuId.lastIndexOf('.'));
		/* assign event handlers */
		/* eval() used here to avoid syntax errors for function literals in Netscape 3 */
		eval('aItems[i].onmouseover=function(){modClass(true,this,"activeItem");window.clearTimeout(oMenuTimeout);showMenu("'+sMenuId+'");};');
		eval('aItems[i].onmouseout=function(){modClass(false,this,"activeItem");window.clearTimeout(oMenuTimeout);oMenuTimeout=window.setTimeout("hideMenu(\'all\')",iMenuTimeout);}');
		eval('aItems[i].onfocus=function(){this.onmouseover();}');
		eval('aItems[i].onblur=function(){this.onmouseout();}');
		//aItems[i].addEventListener("keydown",function(){keyNav(this,event);},false);
	}
	var sCatId=0;
	var oItem;
	for(var i=0;i<aMenus.length;i++){
		/* assign event handlers */
		/* eval() used here to avoid syntax errors for function literals in Netscape 3 */
		eval('aMenus[i].onmouseover=function(){window.clearTimeout(oMenuTimeout);}');
		eval('aMenus[i].onmouseout=function(){window.clearTimeout(oMenuTimeout);oMenuTimeout=window.setTimeout("hideMenu(\'all\')",iMenuTimeout);}');
		sCatId=aMenus[i].id;
		sCatId=sCatId.substring(8,sCatId.length);
		oItem=document.getElementById('navItem_'+sCatId);
		if(oItem){
			if(!isOp && !(isMac && isIE) && oItem.parentNode)modClass(true,oItem.parentNode,"hasSubMenu");
			else modClass(true,oItem,"hasSubMenu");
			/* assign event handlers */
			eval('oItem.onmouseover=function(){window.clearTimeout(oMenuTimeout);showMenu("navMenu_'+sCatId+'");}');
			eval('oItem.onmouseout=function(){window.clearTimeout(oMenuTimeout);oMenuTimeout=window.clearTimeout(oMenuTimeout);oMenuTimeout=window.setTimeout(\'hideMenu("navMenu_'+sCatId+'")\',iMenuTimeout);}');
			eval('oItem.onfocus=function(){window.clearTimeout(oMenuTimeout);showMenu("navMenu_'+sCatId+'");}');
			eval('oItem.onblur=function(){window.clearTimeout(oMenuTimeout);oMenuTimeout=window.clearTimeout(oMenuTimeout);oMenuTimeout=window.setTimeout(\'hideMenu("navMenu_'+sCatId+'")\',iMenuTimeout);}');
			//oItem.addEventListener("keydown",function(){keyNav(this,event);},false);
		}
	}
}

/* this will append the loadMenus function to any previously assigned window.onload event */
/* if you reassign this onload event, you'll need to include this or execute it after all the menus are loaded */
function newOnload(){
	if(typeof previousOnload=='function')previousOnload();
	loadMenus();
}
var previousOnload;
if(window.onload!=null)previousOnload=window.onload;
window.onload=newOnload;

/* show menu and hide all others except ancestors of the current menu */
function showMenu(sWhich){
	var oWhich=document.getElementById(sWhich);
	if(!oWhich){
		hideMenu('all');
		return;
	}
	var aRootMenus=new Array;
	aRootMenus[0]=sWhich
	var sCurrentRoot=sWhich;
	var bHasParentMenu=false;
	if(sCurrentRoot.indexOf('.')!=-1){
		bHasParentMenu=true;
	}
	/* make array of this menu and ancestors so we know which to leave exposed */
	/* ex. from ID string "navMenu_12.3.7.4", extracts menu levels ["12.3.7.4", "12.3.7", "12.3", "12"] */
	while(bHasParentMenu){
		if(sCurrentRoot.indexOf('.')==-1)bHasParentMenu=false;
		aRootMenus[aRootMenus.length]=sCurrentRoot;
		sCurrentRoot=sCurrentRoot.substring(0,sCurrentRoot.lastIndexOf('.'));
	}
	for(var i=0;i<aMenus.length;i++){
		var bIsRoot=false;
		for(var j=0;j<aRootMenus.length;j++){
			var oThisItem=document.getElementById(aMenus[i].id.replace('navMenu_','navItem_'));
			if(aMenus[i].id==aRootMenus[j])bIsRoot=true;
		}
		if(bIsRoot && oThisItem)modClass(true,oThisItem,'hasSubMenuActive');
		else modClass(false,oThisItem,'hasSubMenuActive');
		if(!bIsRoot && aMenus[i].id!=sWhich)modClass(false,aMenus[i],'showMenu');
	}
	modClass(true,oWhich,'showMenu');
	var oItem=document.getElementById(sWhich.replace('navMenu_','navItem_'));
	if(oItem)modClass(true,oItem,'hasSubMenuActive');
}

function hideMenu(sWhich){
	if(sWhich=='all'){
		/* loop backwards b/c WinIE6 has a bug with hiding display of an element when it's parent is already hidden */
		for(var i=aMenus.length-1;i>=0;i--){
			var oThisItem=document.getElementById(aMenus[i].id.replace('navMenu_','navItem_'));
			if(oThisItem)modClass(false,oThisItem,'hasSubMenuActive');
			modClass(false,aMenus[i],'showMenu');
		}
	}else{
		var oWhich=document.getElementById(sWhich);
		if(oWhich)modClass(false,oWhich,'showMenu');
		var oThisItem=document.getElementById(sWhich.replace('navMenu_','navItem_'));
		if(oThisItem)modClass(false,oThisItem,'hasSubMenuActive');
	}
}

/* add or remove element className */
function modClass(bAdd,oElement,sClassName){
	if(bAdd){/* add class */
		if(oElement.className.indexOf(sClassName)==-1)oElement.className+=' '+sClassName;
	}else{/* remove class */
		if(oElement.className.indexOf(sClassName)!=-1){
			if(oElement.className.indexOf(' '+sClassName)!=-1)oElement.className=oElement.className.replace(' '+sClassName,'');
			else oElement.className=oElement.className.replace(sClassName,'');
		}
	}
	return oElement.className; /* return new className */
}

//document.body.addEventListener("keydown",function(){keyNav(event);},true); 

function setBubble(oEvent){
	oEvent.bubbles = true;	
}

function keyNav(oElement,oEvent){
	alert(oEvent.keyCode);
	window.status=oEvent.keyCode;
	return false;
}


// Clear Default Text

addEvent(window, 'load', init, false);

function init() {
    var formInputs = document.getElementsByTagName('input');
    for (var i = 0; i < formInputs.length; i++) {
        var theInput = formInputs[i];
        
        if (theInput.type == 'text' && theInput.className.match(/\bcleardefault\b/)) {  
            /* Add event handlers */          
            addEvent(theInput, 'focus', clearDefaultText, false);
            addEvent(theInput, 'blur', replaceDefaultText, false);
            
            /* Save the current value */
            if (theInput.value != '') {
                theInput.defaultText = theInput.value;
            }
        }
    }
}

function clearDefaultText(e) {
    var target = window.event ? window.event.srcElement : e ? e.target : null;
    if (!target) return;
    
    if (target.value == target.defaultText) {
        target.value = '';
    }
}

function replaceDefaultText(e) {
    var target = window.event ? window.event.srcElement : e ? e.target : null;
    if (!target) return;
    
    if (target.value == '' && target.defaultText) {
        target.value = target.defaultText;
    }
}
/* 
 * Cross-browser event handling, by Scott Andrew
 */
function addEvent(element, eventType, lamdaFunction, useCapture) {
    if (element.addEventListener) {
        element.addEventListener(eventType, lamdaFunction, useCapture);
        return true;
    } else if (element.attachEvent) {
        var r = element.attachEvent('on' + eventType, lamdaFunction);
        return r;
    } else {
        return false;
    }
}

/* 
 * Kills an event's propagation and default action
 */
function knackerEvent(eventObject) {
    if (eventObject && eventObject.stopPropagation) {
        eventObject.stopPropagation();
    }
    if (window.event && window.event.cancelBubble ) {
        window.event.cancelBubble = true;
    }
    
    if (eventObject && eventObject.preventDefault) {
        eventObject.preventDefault();
    }
    if (window.event) {
        window.event.returnValue = false;
    }
}

/* 
 * Safari doesn't support canceling events in the standard way, so we must
 * hard-code a return of false for it to work.
 */
function cancelEventSafari() {
    return false;        
}

/* 
 * Cross-browser style extraction, from the JavaScript & DHTML Cookbook
 * <http://www.oreillynet.com/pub/a/javascript/excerpt/JSDHTMLCkbk_chap5/index5.html>
 */
function getElementStyle(elementID, CssStyleProperty) {
    var element = document.getElementById(elementID);
    if (element.currentStyle) {
        return element.currentStyle[toCamelCase(CssStyleProperty)];
    } else if (window.getComputedStyle) {
        var compStyle = window.getComputedStyle(element, '');
        return compStyle.getPropertyValue(CssStyleProperty);
    } else {
        return '';
    }
}

/* 
 * CamelCases CSS property names. Useful in conjunction with 'getElementStyle()'
 * From <http://dhtmlkitchen.com/learn/js/setstyle/index4.jsp>
 */
function toCamelCase(CssProperty) {
    var stringArray = CssProperty.toLowerCase().split('-');
    if (stringArray.length == 1) {
        return stringArray[0];
    }
    var ret = (CssProperty.indexOf("-") == 0)
              ? stringArray[0].charAt(0).toUpperCase() + stringArray[0].substring(1)
              : stringArray[0];
    for (var i = 1; i < stringArray.length; i++) {
        var s = stringArray[i];
        ret += s.charAt(0).toUpperCase() + s.substring(1);
    }
    return ret;
}
/* 
 * Cookie functions
 */
function createCookie(name, value, days) {
    var expires = '';
    if (days) {
        var date = new Date();
        date.setTime(date.getTime() + (days*24*60*60*1000));
        var expires = '; expires=' + date.toGMTString();
    }
    document.cookie = name + '=' + value + expires + '; path=/';
}

function readCookie(name) {
    var cookieCrumbs = document.cookie.split(';');
    var nameToFind = name + '=';
    for (var i = 0; i < cookieCrumbs.length; i++) {
        var crumb = cookieCrumbs[i];
        while (crumb.charAt(0) == ' ') {
            crumb = crumb.substring(1, crumb.length); /* delete spaces */
        }
        if (crumb.indexOf(nameToFind) == 0) {
            return crumb.substring(nameToFind.length, crumb.length);
        }
    }
    return null;
}

function eraseCookie(name) {
    createCookie(name, '', -1);
}
<!--//
	//lets take user to quick link using this function
	function visit(newURL) {
	  if (newURL != "") {
	    location.href=newURL
	  }
	}
//-->