/*

WRITTEN BY:		JJLANG/GCAUSTI, CORPORATE WEB SOLUTIONS
DATE:			OCTOBER 15, 2008
PURPOSE:		JAVASCRIPT FUNCTIONALITY FOR NSA.GOV
	
UPDATES:
	DATE			CHANGE MADE
	05-20-2009		JJLANG - ADJUSTED FURL VARIABLE TO ALLOW SCRIPTS TO WORK IN HTTP/HTTPS 
					ENVIRONMENTS
		
*/

// setup variables for other functions
sPath = '/';
fURL = document.location.protocol + '//';
fURL += 'www.nsa.gov' + sPath;
noticeURL = fURL + 'applications/links/notices.cfm?address=';
allowExt = new Array('.mil','.gov','.fed.us');

/************************************************
	purpose:	run functions to modify page
*************************************************/
window.onload = function() {
	// make left menu context sensitive
	leftMenu();
	
	// browser detection
	BrowserDetect.init();
	
	// build top menu drop downs
	if (BrowserDetect.browser != 'Netscape'){
		topMenu();
	};
	
	// If browser is Netscape need to make style fixes
	if (BrowserDetect.browser == 'Netscape'){
		Netscapeadjustments()
	};
	
	// highlight image of section currently on
	highlightSection();
	
	// build bread crumbs
	breadCrumbs();
	
	// load son of suckerfish to get menus to work in IE
	if(window.attachEvent) {
		window.attachEvent("onload",sfHover);
	}
	
	// ensure all external links are correct
	checkLinks();
}

/************************************************
	function:	breadCrumbs
	purpose:	builds bread crumb trail
*************************************************/
function breadCrumbs() {
	// variables
	crumbsep = " > ";
	precrumb = "<span class=\"crumb\">";
	postcrumb = "</span>";
	sectionsep = "/";
	rootname = "Home";
	ucfirst = 1;
	crumbTrail = precrumb + '<a href="' + fURL + '">' + rootname + '</a>' + postcrumb;
	currenturl = fURL;
	if(currenturl.charAt(currenturl.length - 1) == "/") {
		currenturl = currenturl.substring(0, currenturl.length - 1);	
	}
	
	// save url to variable and remove base href from it
	pageurl = document.location.toString().replace(fURL,'');
	page_ar = pageurl.split(sectionsep);
	if(page_ar.length > 1) {
		LoadCrumbs(fURL + '_root/includes/' + page_ar[0] + '/breadcrumb.js');
	}
}

/************************************************
	function:	checkLinks
	purpose:
	ensure all links pointing go through notices 
	page except internal, javascript, and mailto
*************************************************/
function checkLinks() {	
	// loop over all links on page and adjust any found
	for(var aidx=0; aidx<document.links.length; aidx++) {
		if(document.links[aidx].href.toString().indexOf(fURL) != 0  
		&& document.links[aidx].href.toString().indexOf(noticeURL) != 0
		&& document.links[aidx].href.toString().indexOf('javascript:') != 0
		&& document.links[aidx].href.toString().indexOf('mailto:') != 0
		&& document.links[aidx].href.toString().split('.')[2].indexOf('gov') != 0
		&& document.links[aidx].href.toString().split('.')[2].indexOf('mil') != 0
		&& (document.links[aidx].href.toString().split('.')[2].indexOf('fed') != 0
			|| document.links[aidx].href.toString().split('.')[3].indexOf('us') != 0)){
			// save innerHTML to resolve IE issue with updating that as well as HREF
			tText = document.links[aidx].innerHTML;
			document.links[aidx].href = noticeURL + document.links[aidx].href;
			if(currentURL[0] != 'careers') {
				document.links[aidx].innerHTML = tText;
			}
		}
	}	
}
/************************************************
	function:	displayCrumbs
	purpose:
	build remainder of crumbs after ajax page
	loaded and display through HTML injection
*************************************************/
function displayCrumbs() {
	for(i=0; i<page_ar.length-1; i++) {
		var displayname = "";
		var disname2 = '';
		currenturl += "/" + page_ar[i];
		if(objurl[page_ar[i]]) {
			displayname = objurl[page_ar[i]];
			disname2 = displayname;
		}
		else {
			if(ucfirst == 1){
				var setname = page_ar[i]
				displayname = setname.charAt(0).toUpperCase() + page_ar[i].substring(1);
				displayname = displayname.replace(/_/g," ");
				var splitdisplay = displayname.split(" ");
				for(sidx=0; sidx < splitdisplay.length; sidx++) {
					disname2 += splitdisplay[sidx].charAt(0).toUpperCase() + splitdisplay[sidx].substring(1); 
					if(sidx+1 < splitdisplay.length) {
						disname2 += " ";	
					}
				}
			}
			else {
				var setname = page_ar[i];
				displayname = replace(setname, "_");
				disname2 = displayname;
			}
		}
		if(disname2 != ' ') {
			crumbTrail += crumbsep + precrumb + "<a href=\"" + currenturl + "/\">" + disname2 + "</a>" + postcrumb;
		}
	}
	document.getElementById('breadCrumbs').innerHTML = crumbTrail;
}

/************************************************
	function: 	getElementsByClass
	parameters:	searchClass, node, tag
	purpose:	
	get reference to items by class name since 
	javascript doesn't inheritly have a function 
	for doing so
*************************************************/
function getElementsByClass(searchClass, node, tag) {
	// create an array to hold all found elements
	var classElements = new Array();
	
	// if a node isn't passed, assume referring to document
	if(node == null) {
		node = document;
	}
		
	// if a tag isn't passed, assume all
	if(tag == null) {
		tag = '*';
	}
	
	// get all elements of tag
	var els = node.getElementsByTagName(tag);
	var elsLen = els.length;
	
	// regular expression to find the class we're looking for
	var pattern = new RegExp('(^|\\s)'+searchClass+'(\\s|$)');
	
	// loop over elements and append any found elements with the class name to the array
	for(i = 0,j=0;i<elsLen;i++) {
		if(pattern.test(els[i].className)) {
			classElements[j] = els[i];
			j++;
		}
	}
	
	// return the array of elements
	return classElements;
}

/************************************************
	function: 	getRandomNumber    				
	purpose:	return a randomly generated number			
*************************************************/
function getRandomNumber() {
	// obtain random number and convert to string
	randomNumber = Math.floor(Math.random()*1000001).toString();
	
	return randomNumber;
}

/************************************************
	function:	highlightSection
	puropse:	highlight image of section on
*************************************************/
function highlightSection() {
	currentURL = window.location.href;
	// remove first part of url
	currentURL = currentURL.replace(/[a-z|A-Z|:]{1,}[\/]{2}/, '');
	currentURL = currentURL.replace(/[a-z|A-Z|.|0-9]{1,}/,'');
	
	// if url is not a top lvl domain, remove the rest of the path
	if(sPath != undefined && sPath != '') {
		currentURL = currentURL.replace(sPath,'');
	}
	
	// split the url at the slashes
	currentURL = currentURL.split("/");
	
	// if an image exists with the name of the first split, show the hovered image
	if(document.images[currentURL[0]]) {
		hover(currentURL[0]);	
	}

}

/************************************************
	function:	hover
	parameters:	imageRef
	purpose:	display "on" image
*************************************************/
function hover(imageRef) {
	document.images[imageRef].src = document.images[imageRef].src.replace(/off.jpg/, 'on.jpg');
}

/************************************************
	function:	hoverOff
	parameters:	imageRef
	purpose:	display "off" image
	(so long as not the current section on)
*************************************************/
function hoverOff(imageRef) {
	if(typeof(currentURL) != 'undefined' && currentURL[0] != imageRef) {
		document.images[imageRef].src = document.images[imageRef].src.replace(/on.jpg/,'off.jpg');
	}
}

/************************************************
	function: 	leftMenu
	parameters:	level1*, level2*, level3*
	note: * = not passed, but still utilized
	purpose:	
	modify menu by making it context sensitive
	based on level1, level2, and level3 set in
	the page
*************************************************/
function leftMenu() {
	// ensure level1, level2, and level3 are all set in page by aborting if they aren't
	if(typeof(level1)=='undefined' || typeof(level2)=='undefined' || typeof(level3)=='undefined') {
		return;
	}
	
	// proceed only if level1 is not null
	if(level1 != '')  {
		// turn on level1 sub nav (if any)
		toggleLeftMenuSubNav(level1, 'block');
		// if level2 is null, set level1 to current
		if(level2 == '') {
			document.getElementById(level1).className = 'lvl1current';
		}
		// otherwise, set level1 to current with sub and turn on level2 sub nav (if any)
		else {
			toggleLeftMenuSubNav(level2, 'block');
			document.getElementById(level1).className = 'lvl1currentSub';
			// if level3 is null, set level2 to current
			if(level3 == '') {
				document.getElementById(level2).className = 'lvl2current';
			}
			// otherwise, set level2 to current with sub and level3 to current
			else {
				document.getElementById(level2).className = 'lvl2currentSub';
				document.getElementById(level3).className = 'lvl3current';
			}
		}
	}
}

/************************************************
	function: 	LoadCrumbs     				
	parameters: file
	purpose:	loads breadcrumb file	
*************************************************/
function LoadCrumbs(file)
{
	// setup XMLHttpRequestObject based on browser compatibility
	if (window.XMLHttpRequest) {
		requestObject = new XMLHttpRequest();
	} 	
	else if (window.ActiveXObject) {
		requestObject = new ActiveXObject("Microsoft.XMLHTTP");
	}
	// add random number to file path
	file.indexOf('?')<-1 ? file+'&rand='+getRandomNumber() : file+'?rand='+getRandomNumber();
	// proceed if XMLHttpRequestObject defined
	if(requestObject) {
		// if no method defined, assume GET and open file
		requestObject.open("GET", file, true);
		// watch the ready state of the request object
		requestObject.onreadystatechange = function() 
		{
			// when request is ready and the status is ok, proceed
			if(requestObject.readyState == 4 && requestObject.status == 200) {
				try {
					eval(requestObject.responseText);
					displayCrumbs();
				}
				catch(e) {
					alert(requestObject.responseText.replace(/\\n/g,''));
					alert(e.message);
				}
			}
		}
		requestObject.send(null);
	}
}

/************************************************
	function: 	LoadTopMenu     				
	parameters: file
	purpose:	loads top menu file
*************************************************/
function LoadTopMenu(file, id, areaid)
{
	requestObject2 = this;
	// setup XMLHttpRequestObject based on browser compatibility
	if (window.XMLHttpRequest) {
		requestObject2[id] = new XMLHttpRequest();
	} 	
	else if (window.ActiveXObject) {
		requestObject2[id] = new ActiveXObject("Microsoft.XMLHTTP");
	}
	// add random number to file path
	file.indexOf('?')<-1 ? file+='&rand='+getRandomNumber() : file+='?rand='+getRandomNumber();
	// proceed if XMLHttpRequestObject defined
	if(requestObject2[id]) {
		// if no method defined, assume GET and open file
		if(window.navigator.appName.indexOf('Opera') == -1) {
			requestObject2[id].open("GET", file);
		}
		else {
			requestObject2[id].open("GET", file, false);
		}	
		// watch the ready state of the request object
		requestObject2[id].onreadystatechange = function() 
		{
			// when request is ready and the status is ok, proceed
			if(requestObject2[id] && requestObject2[id].readyState == 4 && requestObject2[id].status == 200) {
				try {
					// remove ids from response and surround links in list items
					var nContent = requestObject2[id].responseText;
						nContent = nContent.replace(/id=\"[a-z|A-Z|0-9]{1,}\"/g,'');
						nContent = nContent.replace(/<a/g, '<li><a');
						nContent = nContent.replace(/<\/a\/>/g, '</a></li>');
						nContent = '<ul id="'+areaid+'">' + nContent + '</ul>';
					
					// append to id's innerHTML
					document.getElementById(id).innerHTML += nContent;
					// remove lvl2 and lvl3 elements
					var lvl2elements=getElementsByClass('lvl2', document.getElementById(areaid));
					for(var i=0; i<lvl2elements.length; i++) {
						var lielements = document.getElementById(areaid).getElementsByTagName("li");
						for(var lidx=0; lidx<lielements.length; lidx++) {
							var lvl2link = lvl2elements[i].toString();
							lvl2link = lvl2link.replace(/[a-z|A-Z|:]{1,}[\/]{2}/, '');
							lvl2link = lvl2link.replace(/[a-z|A-Z|.|0-9]{1,}[\/]/,'');
							if(lielements[lidx].innerHTML.indexOf(lvl2link) != -1) {
								document.getElementById(areaid).removeChild(lielements[lidx]);	
							}
						}
					}
					// remove lvl2 and lvl3 elements
					var lvl3elements = getElementsByClass('lvl3', document.getElementById(areaid));
					for(var i=0; i<lvl3elements.length; i++) {
						var lielements = document.getElementById(areaid).getElementsByTagName("li");
						for(var lidx=0; lidx<lielements.length; lidx++) {
							var lvl3link = lvl3elements[i].toString();
							lvl3link = lvl3link.replace(/[a-z|A-Z|:]{1,}[\/]{2}/, '');
							lvl3link = lvl3link.replace(/[a-z|A-Z|.|0-9]{1,}[\/]/,'');
							if(lielements[lidx].innerHTML.indexOf(lvl3link) != -1) {
								document.getElementById(areaid).removeChild(lielements[lidx]);	
							}
						}
					}
				}
				catch(e) {
					alert(requestObject2[id].responseText.replace(/\\n/g,''));
					alert(e.message);
				}
			}
		}
		requestObject2[id].send(null);
	}
}

/************************************************
	function:	sfHover
	purpose:	son of suckerfish
	(makes css drop downs work in IE)
*************************************************/
function sfHover() {
	var sfEls = document.getElementById('flyout2').getElementsByTagName('li');
	for(var i=0; i<sfEls.length; i++) {
		sfEls[i].onmouseover=function() {
			this.className+=" sfhover";
		}
		sfEls[i].onmouseout=function() {
			this.className=this.className.replace(new RegExp(" sfhover\\b"), "");
		}
	}
}

/************************************************
	function: 	toggleLeftMenuSubNav
	parameters:	className, toggle
	purpose:	
	toggle sub navigation as on/off based on value
	passed
*************************************************/
function toggleLeftMenuSubNav(className, toggle) {
	// get array of elements with className
	var subs = getElementsByClass(className);
	
	// if toggle is not passed, set to none (hidden)
	if(!toggle) {
		toggle = 'none';	
	}
	
	// loop over elements and set each to toggle value
	for(var i=0; i < subs.length; i++) {
		subs[i].style.display = toggle;	
	}
}

/************************************************
	function: 	topMenu
	purpose:	build top menu drop downs
*************************************************/
function topMenu() {
	// areas to display
	var displayAreas = Array("aboutdropdown","academiadropdown","businessdropdown","careersdropdown","iadropdown","researchdropdown","public_infodropdown","commitmentdropdown");
	
	// loop over array and build top level navigation drop downs
	for(var idx=0; idx<displayAreas.length; idx++) {
		var areaName = displayAreas[idx].replace(/dropdown/,'flyout');
		var areaName2 = areaName.replace(/flyout/,'');
		
		// if areaName exists, proceed
		if(document.getElementById(areaName)) {
			// get top menu contents
			LoadTopMenu(fURL + '_root/includes/' + areaName2 + '/mainmenu.shtml',
						areaName, 
						displayAreas[idx].toString() + '2');
			
		}
	}
}

/************************************************
	function: 	BrowserDetect
	purpose:	check for browser types
	values:		
	BrowserDetect.browser, BrowserDetect.version, 
	BrowserDetect.OS
*************************************************/
var BrowserDetect = {
	init: function () {
		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
		this.version = this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "an unknown version";
		this.OS = this.searchString(this.dataOS) || "an unknown OS";
	},
	searchString: function (data) {
		for (var i=0;i<data.length;i++)	{
			var dataString = data[i].string;
			var dataProp = data[i].prop;
			this.versionSearchString = data[i].versionSearch || data[i].identity;
			if (dataString) {
				if (dataString.indexOf(data[i].subString) != -1)
					return data[i].identity;
			}
			else if (dataProp)
				return data[i].identity;
		}
	},
	searchVersion: function (dataString) {
		var index = dataString.indexOf(this.versionSearchString);
		if (index == -1) return;
		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	},
	dataBrowser: [
		{
			string: navigator.userAgent,
			subString: "Chrome",
			identity: "Chrome"
		},
		{ 	string: navigator.userAgent,
			subString: "OmniWeb",
			versionSearch: "OmniWeb/",
			identity: "OmniWeb"
		},
		{
			string: navigator.vendor,
			subString: "Apple",
			identity: "Safari",
			versionSearch: "Version"
		},
		{
			prop: window.opera,
			identity: "Opera"
		},
		{
			string: navigator.vendor,
			subString: "iCab",
			identity: "iCab"
		},
		{
			string: navigator.vendor,
			subString: "KDE",
			identity: "Konqueror"
		},
		{
			string: navigator.userAgent,
			subString: "Firefox",
			identity: "Firefox"
		},
		{
			string: navigator.vendor,
			subString: "Camino",
			identity: "Camino"
		},
		{		// for newer Netscapes (6+)
			string: navigator.userAgent,
			subString: "Netscape",
			identity: "Netscape"
		},
		{
			string: navigator.userAgent,
			subString: "MSIE",
			identity: "Explorer",
			versionSearch: "MSIE"
		},
		{
			string: navigator.userAgent,
			subString: "Gecko",
			identity: "Mozilla",
			versionSearch: "rv"
		},
		{ 		// for older Netscapes (4-)
			string: navigator.userAgent,
			subString: "Mozilla",
			identity: "Netscape",
			versionSearch: "Mozilla"
		}
	],
	dataOS : [
		{
			string: navigator.platform,
			subString: "Win",
			identity: "Windows"
		},
		{
			string: navigator.platform,
			subString: "Mac",
			identity: "Mac"
		},
		{
			string: navigator.platform,
			subString: "Linux",
			identity: "Linux"
		}
	]

};

/************************************************
	function: 	Netscapeadjustments
	purpose:	
	Fixes style issues with old Netscape Browswers
*************************************************/
function Netscapeadjustments(){
	document.getElementById("searchBox").className = 'searchBoxNetscape';
};

