// Add event handler to body when window loads
function addLoadEvent(func) {
	var oldonload = window.onload;
	
	if (typeof window.onload != "function") {
		window.onload = func;
	} else {
		window.onload = function () {
			oldonload();
			func();
		}
	}
}

addLoadEvent(function () {
	Hover.init(Hover.collections);
	Callouts.fix();
	Chart.init();
	Cursors.init();
	if (RequirePrototype.valid())
		Email.fixEmails();
	DocLinks.init();
});

/*------------------------------------------------------------------------+
 | RequirePrototype - Ensure correct version of prototype is loaded |
 +------------------------------------------------------------------------*/
var RequirePrototype = {

	REQUIRED_PROTOTYPE: '1.6.0.2',
	
	valid : function () {
		
		function convertVersionString(versionString){
	      var r = versionString.split('.');
	      return parseInt(r[0])*100000 + parseInt(r[1])*1000 + parseInt(r[2]);
	    }
		
		if((typeof Prototype=='undefined') || 
	       (typeof Element == 'undefined') || 
	       (typeof Element.Methods=='undefined') ||
	       (convertVersionString(Prototype.Version) < convertVersionString(RequirePrototype.REQUIRED_PROTOTYPE)))
			return false;
			//throw("lib.js requires the Prototype JavaScript framework >= " + RequirePrototype.REQUIRED_PROTOTYPE);
		else		
			return true;
	}
}

/*------------------------------------------------------------------------+
 | Callouts - Adjust widths of callouts depending on size of image within |
 +------------------------------------------------------------------------*/
var Callouts = {
	fix : function() {
		// Check for functionality
		if (!document.getElementById || !document.getElementsByTagName) return false;
		
		var bin = document.getElementById("content-primary");
		var arrBins = bin.getElementsByTagName("*");
		var classRE = /call-[lr]/gi;
		
		// Set div width = largest image width
		for (var i = 0; i < arrBins.length; i++) {
			if (classRE.test(arrBins[i].className)) {
				var images = arrBins[i].getElementsByTagName("img");
				
				if (images.length >= 1) {
					var maxWidth = images[0].offsetWidth;
					
					for (var j = 0; j < images.length; j++) {
						var curWidth = images[j].offsetWidth;
						if (curWidth > maxWidth) maxWidth = curWidth;
					}
					
					if (maxWidth > 100) {
						arrBins[i].style.width = maxWidth + "px";
					}
				}
			}
		}
		
		return false;
	}
};


/*---------------------------------------------+
 | Chart - Create Google chart from data table |
 +---------------------------------------------*/
var Chart = {
	init : function() {
		// Check for functionality
		if (!document.getElementById || !document.getElementsByTagName) return false;
		
		// Find data table
		var dataTable = document.getElementById("chart-data");
		if (!dataTable) return false;
		
		var dataDates = new Array();
		var dataMarket = new Array();
		var dataNav = new Array();
		
		// Populate data arrays from data table
		for (var i = 0; i < dataTable.rows.length; i++) {
			if (
				dataTable.rows[i].cells[0].nodeName.toLowerCase() == "td"
				&& dataTable.rows[i].cells[1].nodeName.toLowerCase() == "td"
				&& dataTable.rows[i].cells[2].nodeName.toLowerCase() == "td"
			) {
				dataDates.push(new Date(dataTable.rows[i].cells[0].innerHTML));
				dataMarket.push(parseFloat(dataTable.rows[i].cells[1].innerHTML));
				dataNav.push(parseFloat(dataTable.rows[i].cells[2].innerHTML));
			}
		}
		
		var dataPrices = dataMarket.concat(dataNav);
		var maxPrice = Chart.getMaxValue(dataPrices);
		var minPrice = Chart.getMinValue(dataPrices);
		
		// Generate first X axis
		var xAxis = "0:|";
		for (var i = 0; i < dataDates.length; i++) {
			xAxis += (dataDates[i].getDate()) + "|";
		}
		
		// Generate Y axis (each value must be accurate to 2 decimal places
		var yAxis = "1:|";
		for (var i = 0; i < 5; i++) {
			var inc = String(minPrice + (((maxPrice - minPrice) / 4) * i));
			inc = inc.substring(0, 5);
			yAxis += inc + "|";
		}
		
		// Generate second X axis
		var xAxis2 = "2:|" + Chart.MonthNames[dataDates[0].getMonth()];
		var curDate = dataDates[0];
		var chxp = "2,0";
		
		for (var i = 0; i < dataDates.length; i++) {
			var newDate = dataDates[i];
			
			if (newDate.getDate() < curDate.getDate()) {
				xAxis2 += "|" + Chart.MonthNames[dataDates[i].getMonth()];
				chxp += "," + (Math.round((i / dataDates.length) * 100));
			}
			
			curDate = newDate;
		}
		
		// Insert image
		var newImg = document.createElement("img");
		newImg.src = "http://chart.apis.google.com/chart?"
			+ "&chco=00688e,000000"
			+ "&chd=t:" + dataMarket + "|" + dataNav
			+ "&chds=" + Chart.getMinValue(dataPrices) + "," + Chart.getMaxValue(dataPrices)
			+ "&chg=" + (Math.round(100 / dataDates.length)) + ",25,1,2"
			+ "&chs=433x140"
			+ "&cht=lc"
			+ "&chxl=" + xAxis + yAxis + xAxis2
			+ "&chxp=" + chxp
			+ "&chxs=0,777777,10|1,777777,10|2,777777,10"
			+ "&chxt=x,y,x";
		var chartHolder = document.getElementById("chart");
		chartHolder.appendChild(newImg);
		
		// Add recent market price, date, diff
		var marketPrice = document.getElementById("market-price");
		var marketDate = document.getElementById("market-date");
		var marketDiff = document.getElementById("market-diff");
		
		if (marketPrice && marketDate && marketDiff) {
			var latestPrice = document.createTextNode("$" + dataMarket[dataMarket.length - 1].toFixed(2));
			var latestDate = document.createTextNode("Market price as of " + Chart.MonthNames[dataDates[dataDates.length - 1].getMonth()] + " " + dataDates[dataDates.length - 1].getDate() + ", " + dataDates[dataDates.length - 1].getFullYear());
			
			var diff = dataMarket[dataMarket.length - 1] - dataMarket[dataMarket.length - 2];
			marketDiff.className = (diff >= 0) ? "pos" : "neg";
			diff = (diff > 0) ? "+" + diff.toFixed(2) : diff.toFixed(2);
			var latestDiff = document.createTextNode("(" + diff + ")");
			
			marketPrice.appendChild(latestPrice);
			marketDate.appendChild(latestDate);
			marketDiff.appendChild(latestDiff);
		}
		
		// Add recent NAV price, date, diff
		var navPrice = document.getElementById("nav-price");
		var navDate = document.getElementById("nav-date");
		var navDiff = document.getElementById("nav-diff");
		
		if (navPrice && navDate && navDiff) {
			var latestPrice = document.createTextNode("$" + dataNav[dataNav.length - 1].toFixed(2));
			var latestDate = document.createTextNode("NAV as of " + Chart.MonthNames[dataDates[dataDates.length - 1].getMonth()] + " " + dataDates[dataDates.length - 1].getDate() + ", " + dataDates[dataDates.length - 1].getFullYear());
			
			var diff = dataNav[dataNav.length - 1] - dataNav[dataNav.length - 2];
			navDiff.className = (diff >= 0) ? "pos" : "neg";
			diff = (diff > 0) ? "+" + diff.toFixed(2) : diff.toFixed(2);
			var latestDiff = document.createTextNode("(" + diff + ")");
			
			navPrice.appendChild(latestPrice);
			navDate.appendChild(latestDate);
			navDiff.appendChild(latestDiff);
		}
	},
	
	// Find maximum value from array
	getMaxValue : function(array) {
		var mxm = array[0];
		for (i = 0; i<array.length; i++) {
			if (array[i] > mxm) {
				mxm = array[i];
			}
		}
		return mxm;
	},
	
	// Find minimum value from array
	getMinValue : function(array) {
		var mn = array[0];
		for (i=0; i<array.length; i++) {
			if (array[i]<mn) {
				mn = array[i];
			}
		}
		return mn;
	},
	
	MonthNames : new Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec")
};


/*--------------------------------------------+
 | Cursors - Change cursor for sortable lists |
 +--------------------------------------------*/
var Cursors = {
	init : function() {
		// Check for functionality
		if (!document.getElementById || !document.getElementsByTagName) return false;
		
		var lists = document.getElementsByTagName("ul");
		
		for (var i = 0; i < lists.length; i++) {
			var curList = lists[i];
			
			if (curList.className.indexOf("sequence") > -1) {
				var listItems = curList.getElementsByTagName("li");
				
				for (var j = 0; j < listItems.length; j++) {
					listItems[j].onmousedown = function() { this.style.cursor = "url(/images/shared/grabbing.cur), move"; };
					listItems[j].onmouseup = function() { this.style.cursor = "url(/images/shared/grab.cur), move"; };
				}
			}
		}
	}
};


/*----------------------------------------------+
 | DocLinks - Add icon after links to documents |
 +----------------------------------------------*/
var DocLinks = {
	init : function() {
		// Find all links
		var links = document.getElementsByTagName("a");
		
		for (var i = 0; i < links.length; i++) {
			var theLink = links[i];
			var address = theLink.href.toLowerCase();
			
			// Check if link points to files with common extensions
			var matches = address.match(/\.(doc|pdf|xls|ppt)/);
			
			if (matches) {
				// Using "match" always returns two results (not sure why)
				var ext = matches[0].substr(1, 3);
				
				// Create new image and insert it
				var newImg = document.createElement("img");
				newImg.alt = "(" + ext.toUpperCase() + ")";
				newImg.className = "file-icon";
				newImg.src = "/images/shared/icon-" + ext + ".gif";
				newImg.title = newImg.alt;
				
				if (theLink.getElementsByTagName("img").length <= 0)
					theLink.parentNode.insertBefore(newImg, theLink);
				
				// Make link open in new window/tab
				theLink.onclick = function () {
					window.open(this.href);
					return false;
				};
			}
		}
	}
};


/*-----------------------------------------+
 | Hover - Add :hover functionality for IE |
 +-----------------------------------------*/
var Hover = {
	// Create two-dimensional array of identifiers for hover effect
	// [id/class] [child nodes] [unique]
	collections : new Array(
		new Array("nav", "li", true)
	),
	
	// Find all elemnts specified in array (IE only)
	init : function(collections) {
		if (document.all && document.getElementById && document.getElementsByTagName) {
			for (var i = 0; i < collections.length; i++) {
				var list = collections[i];
				var name = list[0];
				var delimiter = list[1];
				var unique = list[2];
				var children = new Array();
				
				if (unique) {
					// Unique element, find by ID
					var parent = document.getElementById(name);
					
					if (parent) {
						children = parent.getElementsByTagName(delimiter);
						Hover.addBehaviors(children);
					}
				} else {
					// Not unique, find by class
					var parents = document.getElementsByTagName("*");
					
					for (var j = 0; j < parents.length; j++) {
						if (parents[j].className.indexOf(name) > -1) {
							children = parents[j].getElementsByTagName(delimiter);
							Hover.addBehaviors(children);
						}
					}
				}
			}
		}
	},
	
	// Add class of "over" to elements when mouse hovers over them, remove when mouse stops hovering
	addBehaviors : function(collection) {
		for (var j = 0; j < collection.length; j++) {
			var node = collection[j];
			
			if (node.className.indexOf("current") == -1) {
			    node.onmouseover = function() { this.className += " over"; };
				node.onmouseout = function() { this.className = this.className.replace(" over", ""); };
			}
		}
	}
};


/*--------------------------------------------------+
 | Tog - Toggle visibility of two opposing elements |
 +--------------------------------------------------*/
var Tog = {
	check : function (a, b) {
		for (var i = 0; i < a.length; i++) {
			if (document.getElementById(a[i]).checked) {
				Tog.toggle(b[i]);
			}
		}
	},
	checkRadioSelected : function (radiolist, toggleElement) {
		for(var i=0; i < radiolist.length;i++)
		{
			if( radiolist[i].checked)
			{
			  if(radiolist[i].value == "3")
			   {
				 Tog.toggle(toggleElement);
			   }
			}
		}
	},
	swap : function (a, b) {
		a = document.getElementById(a);
		b = document.getElementById(b);
		
		if (!a || !b) return false;
		
		if (a.className.indexOf("closed") != -1) {
			oldClass = a.className;
			newClass = oldClass.replace(/closed/g, "");
			a.className = newClass;
			
			b.className += " closed";
		} else {
			oldClass = b.className;
			newClass = oldClass.replace(/closed/g, "");
			b.className = newClass;
			
			a.className += " closed";
		}
	},
	toggle : function (a) {
		a = document.getElementById(a);
		if (!a) return false;
		
		if (a.className.indexOf("closed") != -1) {
			oldClass = a.className;
			newClass = oldClass.replace(/closed/g, "");
			a.className = newClass;
		} else {
			a.className += " closed";
		}
	},
	togglePropertyValue : function (a, prop, value1, value2) {
		a = document.getElementById(a);
		
		if (!a) return false;
		
		if (a[prop].indexOf(value1) != -1) {
			a[prop] = value2;
		} else {
			a[prop] = value1;
		}
	}
};

/*-----------------------------------+
 | Email - Obfuscate email addresses |
 +-----------------------------------*/
var Email = 
{
	// Finds all email links with the class name "email-link" and reverses the innerHTML and href
	// Also removes the "email-link" class so the style sheet won't reverse the innerHTML
	fixEmails : function ()
	{
		$$(".email-link").each
		(
			function(emailAddr)
			{
				var emailLink = emailAddr.href.replace("mailto:", "");
				emailAddr.href = "mailto:" + Email.reverseString(emailLink);
				emailAddr.innerHTML = Email.reverseString(emailLink);
				emailAddr.className = emailAddr.className.replace("email-link", "");
			}
		)
	},

	// Takes in a string and returns the reverse of it
	reverseString : function(sourceString)
	{
		var reversedString = "";
		for(var i = sourceString.length - 1; i >= 0; i--)
		{
			reversedString += sourceString.charAt(i);
		}
		return reversedString;
	}
}
