
//
// Copyright 2007 all rights reserved.
//

//var startPosY = 0;
//var startClientY = 0;
//var startOffsetY = 0;

var curPanel = null;
var curSliderImg = null;

var debugDiv;
var debugCnt = 0;


function dragStart(evt,obj) {

	// IE/Moz
	var evtTarget = evt.target ? evt.target : evt.srcElement

	if( evtTarget.className != "sliderImg" )
		return;
		
	curSliderImg = evtTarget;

//	startPosY = obj.offsetTop;
//	startClientY = evt.clientY;
//	startOffsetY = startClientY - startPosY;

	var startOffset;
	
	if (obj.id == "slider_NeedYears" || obj.id == "slider_YearsTill2") {
		startOffset = evt.clientX - obj.offsetLeft;
	}
	else {
		startOffset = evt.clientY - obj.offsetTop;
	}

	if (obj.id == "slider_NeedYears" || obj.id == "slider_YearsTill2") {
		curSliderImg.style.marginTop= "-2px";
	}
	else {
		curSliderImg.style.marginLeft = "-2px";
	}

	document.onmousemove = function(event) {
		drag(event, obj, startOffset);
	};
	document.onmouseup	 = function(event) {
		dragEnd(event,obj);
	};

}


function dragEnd(evt, obj) {

	document.onmousemove = "";
	document.onmouseup = "";

	curSliderImg.style.marginTop = "";
	curSliderImg.style.marginLeft = "";
	//obj.style.border = "";
	
	curSliderImg = null;

//	startPosY = 0;
//	startClientY = 0;
//	startOffsetY = 0;

	debugAllSliders();

	readoutUpdate();

}


function drag(evt, obj, startOffset) {

	if (! evt) {
		evt = event;
	}

	// IE/Moz
	if (evt.preventDefault)
		evt.preventDefault();
	else
		evt.returnValue = false;

	setSlider(evt, obj, startOffset);

//	readoutUpdate();
}


function setSlider(evt, obj, startOffset) {

	var posY = 0;

	if (typeof(evt) == "number" ) {
		posY = evt;
	}
	else {	
		if (obj.id == "slider_NeedYears" || obj.id == "slider_YearsTill2") {
			posY =	evt.clientX -
					obj.parentNode.offsetLeft -
					startOffset;
		}
		else {
			posY =	evt.clientY -
					obj.parentNode.offsetTop -
					startOffset;
		}
	}

	if (obj.id == "slider_NeedYears") {
		posY = posY<0 ?0 :posY>60 ?60 :posY;
	}
	else if (obj.id == "slider_YearsTill2") {
		posY = posY<0 ?0 :posY>60 ?60 :posY;
	}
	else {
		posY = posY<0 ?0 :posY>100 ?100 :posY;
	}

	var sliderTxt;
	var sliderImg;

	var txtN;

	for(idx=0; idx <  obj.childNodes.length; idx++) {
		if( obj.childNodes[idx].className == "sliderTxt" ) {
			sliderTxt = obj.childNodes[idx];
//			var txtN = sliderTxt.childNodes[0];
			if(sliderTxt.childNodes[0]) {
				sliderTxt.removeChild(sliderTxt.childNodes[0]);
			}
			switch( obj.id ) {
				case "slider_Infl":
					txtN = document.createTextNode(
						(posY/4%1 ?posY/4*10%1 ?posY/4 :posY/4 + "0" :posY/4 + ".00" ) +
						 "%");
					break;
				case "slider_Current":
					txtN = document.createTextNode(posY*1 + "K");
					break;
				case "slider_Annual":
					txtN = document.createTextNode(posY/4 + "K");
					break;
				case "slider_TargIncome":
					txtN = document.createTextNode(posY + "K");
					break;
				case "slider_Return":
				case "slider_PRReturn":
					txtN = document.createTextNode(
//						posY/4 +
						(posY/4%1 ?posY/4*10%1 ?posY/4 :posY/4 + "0" :posY/4 + ".00" ) +
						 "%");
					break;
/*
			case "slider_TargAge":
					if (posY < getSliderValue("slider_RetireAgeTxt")) {
						posY = getSliderValue("slider_RetireAgeTxt");
					}
					if (posY < getSliderValue("slider_cAgeTxt")) {
						posY = getSliderValue("slider_cAgeTxt");
					}
					txtN = document.createTextNode(posY);
					break;
*/
//				case "slider_cAge":
				case "slider_RetireAge":
					txtN = document.createTextNode(posY);
					break;
				case "slider_YearsTill":
					posY =	Math.round(posY/4)*4;
					txtN = document.createTextNode(posY/4);
					break;
				case "slider_YearsTill2":
					posY =	Math.round(posY/3)*3;
					txtN = document.createTextNode(posY/3);
					posY += 3;
					break;
				case "slider_NeedYears":
//console.log(evt.clientY + ": " + posY + "(" + (Math.round(posY/25)*25) + ")");
//					posY =	Math.round(posY/20)*20;
//					txtN = document.createTextNode(posY/20);
					posY =	Math.round(posY/10)*10;
					txtN = document.createTextNode(posY/10);
					posY +=3;
					break;
				default:
					txtN = document.createTextNode(posY);
			}
			
			if (obj.id == "slider_NeedYears" || obj.id == "slider_YearsTill2") {
				obj.style.left = posY + "px";
			}
			else {
				obj.style.top = posY + "px";
			}

			sliderTxt.appendChild(txtN);

			// Align the text (right align)			
			if (obj.id == "slider_NeedYears" || obj.id == "slider_YearsTill2") {
//				sliderTxt.style.left = 37 - sliderTxt.offsetWidth + "px";
//console.log(sliderTxt.offsetHeight);
				sliderTxt.style.top = 23 - sliderTxt.offsetHeight + "px";
			}
			else {
				sliderTxt.style.left = 37 - sliderTxt.offsetWidth + "px";
			}

		}
	}

	// Align the knob (left align)
	for(idx=0; idx <  obj.childNodes.length; idx++) {
		if (obj.id == "slider_NeedYears" || obj.id == "slider_YearsTill2") {
			if( obj.childNodes[idx].className == "sliderImg" ) {
				sliderImg = obj.childNodes[idx];
				sliderImg.style.top =
					28 - sliderTxt.offsetHeight + "px";
			}
		}
		else {
			if( obj.childNodes[idx].className == "sliderImg" ) {
				sliderImg = obj.childNodes[idx];
				sliderImg.style.left =
					42 - sliderTxt.offsetWidth + "px";
			}
		}
	}
	//alert(obj.offsetWidth);
}


function showArr(arr) {

alert(arr);

	var rStr = "";
	for(var idx=0; idx < arr.length; idx++) {
		alert(arr[idx]);
		rStr = rStr + arr[idx] + "\n";
	} 
	return rStr;
}


function panelMouseOver (pnl) {

	curPanel = pnl;

//	pnl.style.border = "2px #00cc00 solid";
//	pnl.style.margin = "4px";

//	pnl.style.border = "1px #00cc00 dotted";

//	pnl.style.fontWeight = "bold";
}


function panelMouseOut (pnl) {

	// Unet global ref to the current panel
	curPanel = null;

//	pnl.style.border = "";
//	pnl.style.margin = "";
//	pnl.style.fontWeight = "";

}



function keyPress(evt) {

//debug(evt);
	if( ! curPanel )
		return true;

//	debug(curPanel.childNodes[3].childNodes[1] + " : " + evt.keyCode);
//	debug(curSliderKnob.offsetTop-curSliderKnob.parentNode.offsetTop);

	var offsetPosY = 0;

	if( evt.keyCode == 33 )
		offsetPosY = 10;
	else if( evt.keyCode == 34 )
		offsetPosY = -10;
	else if( evt.keyCode == 38 )
		offsetPosY = 1;
	else if( evt.keyCode == 40 )
		offsetPosY = -1;
	else
		return true;

	var curSliderKnob = curPanel.childNodes[3].childNodes[1];

	setSlider(curSliderKnob.offsetTop -
			curSliderKnob.parentNode.offsetTop -
			offsetPosY,
		curSliderKnob);

	debugAllSliders();

	return false;
}

function myChartUpdate() {

	var readout = document.getElementById("iPreadout");
	var chart = document.getElementById("readoutChart");
	
	var chartBarDiv;
	
	var chartBarVal	= parseFloat(getSliderValue("slider_CurrentTxt"));
	var annual		= parseFloat(getSliderValue("slider_AnnualTxt"));
	var preReturn	= parseFloat(getSliderValue("slider_ReturnTxt"));
	var inflation	= parseFloat(getSliderValue("slider_InflTxt"));
//	var postReturn	= parseFloat(getSliderValue("slider_PRReturnTxt"));
	var postReturn	= preReturn;
	var need		= parseFloat(getSliderValue("slider_TargIncomeTxt"));
//	var RetAge		= parseFloat(getSliderValue("slider_RetireAgeTxt"));
//	var yearsTill	= parseFloat(getSliderValue("slider_YearsTillTxt"));
	var yearsTill	= parseFloat(getSliderValue("slider_YearsTill2Txt"));
//	var targAge		= parseFloat(getSliderValue("slider_TargAgeTxt"));
	var needYears	= parseFloat(getSliderValue("slider_NeedYearsTxt"));
//	var curAge		= parseFloat(getSliderValue("slider_cAgeTxt"));
//	var curAge		= document.forms[0].current_age.value;
	
	// Clear any previous chart elements
	var chartLen = chart.childNodes.length;
	for (var ii=0; ii < chartLen; ii++) {
		chart.removeChild(chart.childNodes[0]);
	}

	// Calculate the bars/values
	var chartBarValStr = "";
	for (var ii=0; ii < (yearsTill + needYears); ii++) {
		chartBarVal = ii < yearsTill
			? chartBarVal * (1 + preReturn/100) / (1 + inflation/100) + annual
			: chartBarVal * (chartBarVal>0?(1 + postReturn/100):1) / (1 + inflation/100) - need + annual;
//			: chartBarVal * (1 + postReturn/100) / (1 + inflation/100) - need;
		chartBarValStr +=
			(chartBarValStr?"|":"") +
			Math.round(chartBarVal*1000);
	}

	debug("Chart: " + chartBarVal + ", " +  need);

	chartUpdate(chart, chartBarValStr, readout.clientWidth-20, myRolloverFunc);

	chart.style.left = readout.clientWidth/2 - chart.clientWidth/2 - 10;

	// Show final #
	var estateTxtDOM = document.getElementById("estateTxt");
	estateTxtDOM.style.color =
		chartBarVal>0 ?"#408a40" :chartBarVal<0 ?"red" :"";
	estateTxtDOM.childNodes[0].data = formatNumStr(chartBarVal*1000,"$");

}

function readoutUpdate() {

	var iPreadoutDom = document.getElementById("iPreadout");
	
	iPreadoutDom.style.opacity = ".3";

//	sendRequest();
	
	myChartUpdate();
	
	iPreadoutDom.style.opacity = "";
	
}


function getSliderValue(sliderId) {
	return parseFloat(document.getElementById(sliderId).childNodes[0].data);
}

function debugObj(obj, winName) {

	var str = "";
	for (p in obj) {
		str = str + p + " = " +  obj[p] + "<br>";
	}
	//alert(str);
	w = window.open("",winName?winName:"");
	w.document.write(str);
	w.document.close();
}


function debug(dbg, nobr) {

//	appendChild

	debugDiv.insertBefore(
		document.createTextNode( dbg + "\n"),
		debugDiv.childNodes[0]);

	if( !nobr )
		debugDiv.insertBefore(document.createElement("hr"),
			debugDiv.childNodes[0]);
}


function debugAllSliders() {

//	debug(parseFloat(getSliderValue("slider_cAgeTxt")), 1);
//	debug(parseFloat(getSliderValue("slider_PRReturnTxt")), 1);
	debug(parseFloat(getSliderValue("slider_TargIncomeTxt")), 1);
//	debug(parseFloat(getSliderValue("slider_TargAgeTxt")), 1);
	debug(parseFloat(getSliderValue("slider_NeedYearsTxt")), 1);
//	debug(parseFloat(getSliderValue("slider_RetireAgeTxt")), 1);
//	debug(parseFloat(getSliderValue("slider_YearsTillTxt")), 1);
	debug(parseFloat(getSliderValue("slider_YearsTill2Txt")), 1);
	debug(parseFloat(getSliderValue("slider_ReturnTxt")), 1);
	debug(parseFloat(getSliderValue("slider_InflTxt")), 1);
	debug(parseFloat(getSliderValue("slider_AnnualTxt")), 1);
	debug(parseFloat(getSliderValue("slider_CurrentTxt")), 1);
	debug("Sliders: ", 1);
	debug("");
}


function init() {

	debugDiv = document.getElementById("debug");

	if (scGetCookie(9)) {
		scLd(9);
	}
	else {
		setSlider(15, document.getElementById("slider_Current"));
		setSlider(6*4, document.getElementById("slider_Annual"));
		setSlider(7.5*4, document.getElementById("slider_Infl"));
		setSlider(8*4, document.getElementById("slider_Return"));
		setSlider(10*3, document.getElementById("slider_YearsTill2"));
		setSlider(4*10, document.getElementById("slider_NeedYears"));
		setSlider(24, document.getElementById("slider_TargIncome"));
	}	
	readoutUpdate();
	
	window.onkeydown = keyPress; 

/*
	if (window.addEventListener)
		window.addEventListener('DOMMouseScroll',
								function (event) {wheel(event);},
								false);
	window.onmousewheel=document.onmousewheel = wheel;
*/

	var iPcats = getElementsByClass("iPcat");
	var shDIV;
	for (var ii=0; ii<iPcats.length; ii++) {
		if (getElementsByClass("iPcatLabel",iPcats[ii]).length == 0)
			continue;
		shDIV = document.createElement("div");
		shDIV.innerHTML = "<div class='shadowLB1'></div>" +
		 				  "<div class='shadowLB2'></div>" +
		 				  "<div class='shadowLB3'></div>";
		iPcats[ii].insertBefore (shDIV, iPcats[ii].childNodes[0]);
	}

	scDispUpd();
}

function wheel(evt) {
	
	if (!evt)
		evt = window.event;
	
	if (evt.detail)
		debug("WheelA: " + evt.detail);
	else
		debug("WheelB: " + evt.wheelDelta);
}

function myRolloverFunc (evt, tip, tipDOM, tgt) {

	if ( ! evt )
		evt = window.event;

	var amt = formatNumStr(tip.split("|")[1],"$");
	var amtStyle = amt.substring(0,1)=="-" ? "color:#800;" : "color:#060;";


	tipDOM.innerHTML =
		"Year " + (parseInt(tip.split("|")[0]) + 1) + ""+
		" <br>"+
//		" (Age " + (parseInt(tip.split("|")[0]) + 1 + parseInt(getSliderValue("slider_cAgeTxt"))) + ")<br>"+
//		" (Age " + (parseInt(tip.split("|")[0]) + 1 + parseInt(document.forms[0].current_age.value)) + ")<br>"+
		"<span style='font-weight:bold;"+amtStyle+"'>" + amt + "</span>";
	tipDOM.style.top =  tgt.offsetTop - tipDOM.offsetHeight - 0 + "px";
	tipDOM.style.left =  tgt.offsetLeft + "px";
//	tipDOM.style.borderLeft = "18px #ffff99 solid";
	tipDOM.style.backgroundColor = "#ffff88";
	tipDOM.style.backgroundPosition = tgt.offsetWidth + "px bottom";
	tgt.style.backgroundColor = "#ffff66";
	tgt.style.opacity = ".7";
	tgt.style.filter = "alpha(opacity=70)";
	tipDOM.style.visibility = "visible";		
}


function scGetCookie(sc) {
	var cookies = document.cookie.split("; ");
	for (var ii=0; ii < cookies.length; ii++) {
		if (cookies[ii].indexOf("ip"+sc+"v") == 0 )
			return cookies[ii].split("=")[1]!="" ?cookies[ii] :null;
	}
	return null;
}

function scLd(sc) {

	var scCookie = scGetCookie(sc);
	
	if ( ! scCookie ) {
		if (sc != 9) {
			alert("Scenario " + sc + " is was not found." + 
			  	  "\n\n" + 
				  "Note: To enhance privacy, data is stored in your\n" +
				  "browser instead of our server, so browser crashes\n" +
				  "may prevent sceneario's from being saved.");
		}
		return;
	}

	if (sc != 9)
		showStat ("Loading...");

	var vals = scCookie.substring(scCookie.indexOf("=")+1).split("|");
	setSlider(vals[0]*10, document.getElementById("slider_NeedYears"));
	setSlider(vals[1]*3, document.getElementById("slider_YearsTill2"));
	setSlider(vals[2]*1, document.getElementById("slider_Current"));
	setSlider(vals[3]*4, document.getElementById("slider_Annual"));
	setSlider(vals[4]*4, document.getElementById("slider_Return"));
	setSlider(vals[5]*4, document.getElementById("slider_Infl"));
	setSlider(vals[6]*1, document.getElementById("slider_TargIncome"));
	readoutUpdate();

	if (sc != 9)
		showStat ("Scenario-" + sc + ": Loaded", 750);

}

function scSv(sc) {

	if (sc != 9 && scGetCookie(sc)) {
		if ( ! confirm("Scenario-" + sc + " was stored previously. Overwrite it?"))
			return;
	}

	var days = 365.25*10;
	var date = new Date();
	date.setTime(date.getTime()+(days*24*60*60*1000));
	document.cookie =
		"ip" + sc + "v1=" +
		parseFloat(getSliderValue("slider_NeedYearsTxt")) + "|" +
		parseFloat(getSliderValue("slider_YearsTill2Txt")) + "|" + 
		parseFloat(getSliderValue("slider_CurrentTxt")) + "|" +
		parseFloat(getSliderValue("slider_AnnualTxt")) + "|" +
		parseFloat(getSliderValue("slider_ReturnTxt")) + "|" +
		parseFloat(getSliderValue("slider_InflTxt")) + "|" +
		parseFloat(getSliderValue("slider_TargIncomeTxt")) + "; " +
		"expires=" + date.toGMTString() + "; " +
		"domain=" + escape("529ratings.com") + ";";
		"path=" + escape("/") + ";";

	if (sc != 9) {
		showStat("Scenario-" + sc + ": Saved", 750);
		scDispUpd();
	}
}

function scRm(sc) {

	var scenarios;
	if (sc) {
		if (scGetCookie(sc)) {
			if ( ! confirm("Are you sure you want to remove Scenario-" + sc + "?"))
				return;
		}
		scenarios = [sc];
	}
	else {
		if ( ! confirm("Are you sure you want to remove ALL the Scenarios?"))
			return;
		scenarios = [1,2,3];
	}

	var cookie;
	for (var ii=0; ii<scenarios.length; ii++) {
		cookie = scGetCookie(sc);
		if (cookie)
			document.cookie =
				cookie.split("=")[0] + "=; " +
				"expires=" + escape("-1") + "; " +
				"domain=" + escape("529ratings.com") + ";";
				"path=" + escape("/") + ";";
	}
	
	scDispUpd();
}

function scDispUpd() {

	for (var ii=1; ii<=3; ii++) {
		if ( ! scGetCookie(ii)) {
			var scDOM = document.getElementById("sc"+ii);
			scDOM.style.opacity = ".50";
			scDOM.style.filter = "alpha(opacity=70)";
			var links = scDOM.getElementsByTagName("a");
			links[0].style.borderStyle = "none";
			links[1].style.borderStyle = "none";
		}
		else {
			var scDOM = document.getElementById("sc"+ii);
			scDOM.style.opacity = "";
			scDOM.style.filter= "";
			var links = scDOM.getElementsByTagName("a");
			links[0].style.borderStyle = "solid";
			links[1].style.borderStyle = "solid";
		}
	}
}


var showStatTimeout = null;
function showStat(txt, ms) {

	if (showStatTimeout)
		clearTimeout (showStatTimeout);
		
	var statDOM = document.getElementById("statDIV");
	if (!statDOM) {
		statDOM = document.createElement("div");
		statDOM.id = "statDIV";
		statDOM.style.position = "absolute";
		statDOM.style.display = "none";
//		var statInnerDOM = document.createElement("div");
//		statInnerDOM.className = "status";
//		statDOM.appendChild(statInnerDOM);
		statDOM.className = "status";
		document.body.appendChild(statDOM);
	}
	
	var parentDOM = document.getElementById("iPreadout");

//	statDOM.childNodes[0].innerHTML =
//	 	"<div class='shadowLB1'></div>" +
//	 	"<div class='shadowLB2'></div>" +
//	 	"<div class='shadowLB3'></div>" +
	statDOM.innerHTML =
	 	txt;
	statDOM.style.display = "block"; // has to be drawn to have dimensions
	statDOM.style.top  = getOffset(parentDOM).top + parentDOM.clientHeight/2 - statDOM.clientHeight/2 + "px";
	statDOM.style.left = getOffset(parentDOM).left + parentDOM.clientWidth/2 - statDOM.clientWidth/2 + "px";
//	statDOM.style.left = getOffset(parentDOM).left + parentDOM.clientWidth/2 + "px";
	statDOM.style.width = (parentDOM.clientWidth-20) + "px";
			
	if (ms)
		showStatTimeout = setTimeout ( function () {statDOM.style.display = "none";}, ms);
}


function getOffset(obj) {
	for( var ll=0, tt=0, oo=obj; oo; oo=oo.offsetParent) {
		tt += oo.offsetTop;
		ll += oo.offsetLeft;
	}
	return {left: ll, top: tt};
}

function getElementsByClass(className, startNode, tag) {
	var classEls = new Array();
	if(!startNode) startNode = document;
	if(!tag) tag = "*";
	var els = startNode.getElementsByTagName(tag);
	var pattern = new RegExp("(^|\\s)"+className+"(\\s|$)");
	for (var ii=0, jj=0; ii<els.length; ii++) {
		if (pattern.test(els[ii].className))
			classEls[jj++] = els[ii];
	}
	return classEls;
}

