var b = new browserObj();

function init(){


	initChartOffsets();
	initChartOptions();
	initPop();
	initSmartBlurbs();
	isLocked = false;
	newsInit = false;

	var myLastChart = eval(parseInt(document.getElementById("lastChart").value)+ 1);

	if (myLastChart == 2){

		updateChart(false, "estimate")

	} else if (myLastChart == 3){

		updateChart(false, "estRange")

	} else if (myLastChart == 1){

		updateChart(false, "earnings")

	}

}

function initChartOffsets(){

	var offsetObj = getAbsolutePos(document.getElementById("chartEarnings"));
	var loading = document.getElementById("loading")

	oX = parseInt(offsetObj.x);
	oY = parseInt(offsetObj.y);

	offsetObj = getAbsolutePos(loading);
	loading.style.top = oY + 25 + "px";
	loading.style.left = oX + 7 + "px";
}

function initChartActivate(chartNum){
	if (chartNum == 1){
	selectChart(chartNum);
	}

}

function initSmartBlurbs(){

	// populate blurb area with correct text in array

	var idx = (tabSelected)?(tabSelected - 1) * 2:0;

	if (optAnnQtr && optAnnQtr == "ann"){
		idx += 1;
	}

	if (smartBlurbs[idx]){
		document.getElementById("chartOptionsLeft").innerHTML = smartBlurbs[idx].text;
	} else if (smartBlurbs[0]){
		document.getElementById("chartOptionsLeft").innerHTML = smartBlurbs[0].text;
	}
}

function initPop(){

	// choose content style for popup.

	if (optChartScheme == "Compare" && tabSelected == 1){

		pop = document.getElementById("pop");
		popContent = document.getElementById("popContent");

	} else if (optChartScheme == "News" && tabSelected == 1) {

		pop = document.getElementById("popNews");
		popContent = document.getElementById("popNewsContent");

	} else if (tabSelected == 2) {

		pop = document.getElementById("popEstimate");

	} else {

		pop = document.getElementById("popInfo");
		popContent = document.getElementById("popInfoContent");

	}

	if (typeof(pops) == "undefined"){

		pops = [];

		for (var x=0; x < 4; x++){

			pops[x] = {
				est: document.getElementById("popEstimate" + x),
				img: document.getElementById("popEstimate" + x + "img")
			}
		}
	}

	pop.style.zIndex = 2000;
}

function clickCheckbox(n){
	// news, high-low, price chart.

	var who = document.getElementById("opt" + n);

	if (who.disabled){ return false }

	if (!isLocked){

		deactivateRollover();
		isLocked = true;

		if (eval("opt" + n) == "on"){

			who.checked = false;
			eval("opt" + n + " = 'off';")

		} else {

			who.checked = true;
			eval("opt" + n + " = 'on';")

		}

		storePref("Earnings."+ n, eval("opt" + n), "clickCheckbox")
		updateChart();

	} else {

		alert("Page is busy, please try again momentarily.")
		window.event.cancelBubble = true;

	}

}

function clickScheme(n){

	// growth rate / compare to last year / draw lines

	if (document.getElementById("optScheme" + n).disabled){ return false }

	if (!isLocked){

		deactivateRollover();
		isLocked = true;

		optChartScheme = (n == optChartScheme)?"off":n;

		optSchemeDraw.checked = (n == "Draw" && optChartScheme == "Draw")?true:false;
		optSchemeGrowth.checked = (n == "Growth" && optChartScheme == "Growth")?true:false;
		optSchemeCompare.checked = (n == "Compare" && optChartScheme == "Compare")?true:false;
		optSchemeNews.checked = (n == "News" && optChartScheme == "News")?true:false;

		storePref("Earnings.ChartScheme", optChartScheme, "clickScheme");
		initPop();
		updateChart();

	} else {

		alert("Page is busy, please try again momentarily.")
		window.event.cancelBubble = true;
	}
}



function clickAnnQtr(who){

	// ann/qtr

	if (!isLocked){

		deactivateRollover();
		isLocked = true;

		var formAnn = document.getElementById("formAnn");
		var formQtr = document.getElementById("formQtr");

		var origChecked = (formAnn.checked)?"ann":(formQtr.checked)?"qtr":"qtr";
		var newVal = ((origChecked == "ann")?"qtr":"ann");

		formAnn.checked = (newVal == "ann")?true:false;
		formQtr.checked = (newVal == "qtr")?true:false;

		storePref("Earnings.AnnQtr", newVal, "clickAnnQtr")

		optAnnQtr = newVal;

		initChartOptions();

		updateChart();

	} else {
		alert("Page is busy, please try again momentarily.")
		window.event.cancelBubble = true;
	}

	initSmartBlurbs();
}



function storePrefComplete(storeSuccessful, val, val2){

	// allows us to make additional calls after store is complete.
	if (val2 == "clickCheckbox"){
	} else if (val2 == "clickScheme"){
	} else if (val2 == "clickAnnQtr"){
	}

	isLocked = false;

}

function track(e) {

	// called with each mousemove event

	if (isLocked){return false;}

	if (!e) var e = window.event;

	if (e.pageX || e.pageY){

		posX = e.pageX - oX;
		posY = e.pageY;

	} else if (e.clientX || e.clientY) {

		posX = e.clientX + document.body.scrollLeft - oX;
		posY = e.clientY + document.body.scrollTop;

	} else {
		return false;
	}

	// call proper positioning function

	if (tabSelected == 1 && optSchemeCompare.checked){

		positionRolloverCompare(getIdx(posX))

	} else if (tabSelected == 2){

		if (posX > optWidthChart - 3 || posX < 1){
			hidePop("force");
			return false;
		}

		setTimeout('positionRolloverEstPop('+posX+')',5)

		var estIdx;

		for (var x=0; x < rollData.length; x++){

			estIdx = getEstIdx(x, posX);

			if (estIdx){
				setTimeout("positionRolloverEstimate("+x+","+estIdx+","+posX+")",5)
			}
		}

	} else {
		setTimeout("positionRolloverInfo(getIdx("+posX+"))",5);
	}


}

function chkVals(){

	// multi isVal() checker.
	for (var x=0; x < arguments.length; x++){

		if (!isVal(arguments[x])){
			return false;
		}

	}
	return true;
}


var trackCurr, trackPrev, pct, netChg;
var lastCompareIdx = -1;

function positionRolloverCompare(idx){

	// rollover for compare scheme

	trackCurr = rollData[idx];
	trackPrev = rollData[idx - 4];

	if (
		optAnnQtr == "ann" ||
		typeof(trackCurr) == "undefined" ||
		typeof(trackPrev) == "undefined" ||
		!chkVals(
			trackPrev.value, trackCurr.value,
			trackPrev.x0, trackPrev.x1,
			trackPrev.y0, trackPrev.y1,
			trackCurr.x0, trackCurr.x1,
			trackCurr.y0, trackCurr.y1
		)
	){

		hidePop("force");
		return false;

	}

	if (idx == lastCompareIdx && pop.style.visibility != "hidden"){
		return false;
	} else {
		lastCompareIdx = idx;
	}

	try{

		if (pop.style.visibility != "visible"){
			pop.style.visibility = "visible";
		}

		pop.style.left = -4 + (trackCurr.x0 + oX - (trackCurr.x0 - trackPrev.x0) + Math.floor((trackCurr.x1 - trackCurr.x0) / 2)) + "px";
		pct = getPctChange(trackPrev.value, trackCurr.value);

		if (pct != "NA" && pct != "0%"){

			pct = "<span class='"+((parseFloat(pct) >= 0)?"positive":"negative")+"'>"+pct+"</span>";

		} else if (pct == "NA"){

			netChg = trackCurr.value - trackPrev.value;
			netChg = ((netChg*1000)/1000).toFixed(2);
			pct = (!isNaN(netChg))?"<span class='"+((parseFloat(netChg) >= 0)?"positive":"negative")+"'>$"+netChg+"</span>":"NA";
		}

		popWidth.style.width = ((trackCurr.x0 - trackPrev.x0) - ((trackCurr.x1 - trackCurr.x0)/2)) +  "px";
		pop.style.top = (oY + 20) + "px";
		popLimg.style.height = Math.max(0, trackPrev.y0 - 45) + "px";
		popRimg.style.height = Math.max(0, trackCurr.y0 - 45) + "px";
		// try to use netchg instead of pctchg for NA's.
		popContent.innerHTML = "&nbsp;<b>" + pct + "</b> since " + "Q" + trackPrev.qtr + " " + trackPrev.date;

	} catch(e){

		pop.style.visibility = "hidden"

	}
}

function positionRolloverInfo(idx){

	//rollover for nomal bar info

	trackCurr = rollData[idx];

	if (
		typeof(trackCurr) == "undefined" ||
		/32768/.test(trackCurr.description)
	){
		hidePop("force");
		return false;
	}

	if (pop.style.visibility != "visible"){
		pop.style.visibility = "visible";
	}

	try{

		pop.style.left = (-93 + oX + trackCurr.x0 + ((trackCurr.x1 - trackCurr.x0) / 2)) + "px";
		pop.style.top = (-33 + oY + trackCurr.y0) + "px";
		popContent.innerHTML = trackCurr.description;

	} catch(e){}

	pct = trackCurr.value



}


function positionRolloverEstPop(x0){

	//rollover for nomal bar info

	if (pop.style.visibility != "visible"){
		pop.style.visibility = "visible";
	}

	pop.style.left = -2.5 + oX + parseInt(x0) + "px";
	pop.style.top = (oY + 16) + "px";
	pop.style.width = "5px";
	pop.style.height = "139px";

}

function positionRolloverEstimate(rollIdx, idx, posX){

	//rollover for nomal bar info

	trackCurr = rollData[rollIdx]

	if (
		typeof(trackCurr) == "undefined"
	){

		//chartEarnings.style.cursor = "default";
		hidePop("force");

		return false;

	}

	isLeft = posX < 360

	try{
		if (/(.+)r.gif/.test(pops[rollIdx].img.src) && isLeft){

			//pops[rollIdx].img.src = "/tdameritrade/images/rollE" + (1 + rollIdx) + ".gif";
			pops[rollIdx].est.style.borderLeft = "0px";
			pops[rollIdx].est.style.borderRight = "1px solid #000";
			pops[rollIdx].est.style.textAlign = "left";

		} else if (!/r.gif/.test(pops[rollIdx].img.src) && !isLeft){

			//pops[rollIdx].img.src = "/tdameritrade/images/rollE" + (1 + rollIdx) + "r.gif";
			pops[rollIdx].est.style.borderRight = "0px";
			pops[rollIdx].est.style.borderLeft = "1px solid #000";
			pops[rollIdx].est.style.textAlign = "right";
		}

		if (pops[rollIdx].est.style.visibility != "visible"){
			pops[rollIdx].est.style.visibility = "visible";
			//pops[rollIdx].img.style.visibility = "visible";
		}
		/*
		pops[1].est.style.top = 210
		pops[2].est.style.top = 215
		pops[3].est.style.top = 230
		*/
		var baseHeight = 200;

		for(i=0; i< pops.length; i++){
			//if(i == 0){
			//pops[0].est.style.top = 200
			//}else{

		pops[rollIdx].est.style.top = (rollIdx == 0)? ((oY+50)+"px")  : (parseInt(pops[eval(rollIdx-1)].est.style.top) + 13)+"px";
		//}
		}
		//pops[0].est.style.visibility = "visible";
		//pops[0].est.style.left = ((!isLeft)?-156:0) + oX + parseInt(posX) + "px";
		//pops[0].content.innerHTML = trackCurr.coords[idx][0];
		var w = b.isIE ? 156:164;
		pops[rollIdx].est.style.left = ((!isLeft)?-w:0) + oX + parseInt(posX) + "px";
		//pops[rollIdx].est.style.top = 200 //-8 + parseInt(oY) + parseInt(trackCurr.coords[idx][2]) + "px";
		//pops[rollIdx].img.style.left = ((!isLeft)?-8:0) + oX + parseInt(posX) + "px"
		//pops[rollIdx].img.style.top = -7 + parseInt(oY) + parseInt(trackCurr.coords[idx][2]) + "px";
		pops[rollIdx].content.innerHTML = trackCurr.coords[idx][0];

	} catch(e){

		pops[rollIdx].est.style.visibility = "hidden";
		pops[rollIdx].img.style.visibility = "hidden";
	}

}

function getPctChange(a, b){

	// a is previous, b is current.

	if (
		!isVal(a) ||
		!isVal(b) ||
		(a < 0 && b == 0) ||
		(a == 0 && b != 0) ||
		(a < 0 && b > 0) ||
		(a > 0 && b < 0)
	){
		return "NA"
	}

	return ((parseFloat(b) < parseFloat(a))?"-":"") + Math.round((Math.abs(b - a) / Math.abs(a)) * 100) + "%";

}


function getIdx(x){

	for (var y=0; y < rollData.length; y++){
		if (x >= rollData[y].x0 && x < rollData[y].x1) {
			return y;
		}
	}
}

function getEstIdx(rollIdx, x){

	for (var y=0; y < rollData[rollIdx].coords.length; y++){
		try{
			if (
				(
					x >= rollData[rollIdx].coords[y][1] &&
					x < rollData[rollIdx].coords[y+1][1]
				)
			){
				return y;

			}
		} catch(e){}
	}

	pops[rollIdx].est.style.visibility = "hidden";
	pops[rollIdx].img.style.visibility = "hidden";

	return false;
}



function activateLineDraw(){

	chartEarnings.style.cursor = "crosshair";
	deactivateRollover();
	//deactivateNews()
	chartEarnings.onmousedown = penDown;
	document.onmouseup = penUp;
	restoreLines()
}

function deactivateLineDraw(){

	pen.clearHTM(pen.currLine);
	chartEarnings.style.cursor = "default";
	chartEarnings.onmousemove = abortEvent;
	chartEarnings.onmousedown = abortEvent;
	document.onmouseup = abortEvent;
	hideLines()

}

function activateRollover(){

	deactivateLineDraw()
	//deactivateNews()
	chartEarnings.onmousemove = track;
	chartEarnings.onmouseout = hidePop;
	pop.onmousemove = track;

	var popObj;


	if (pops){
		for (var x=0; x < pops.length; x++){

			pops[x].est.onmousemove = track;

		}
	}


}

function deactivateRollover(){

	//chartEarnings.style.cursor = "default";
	hidePop("force");
	chartEarnings.onmousemove = abortEvent;
	chartEarnings.onmouseout = null;
	pop.onmousemove = abortEvent;

}

function selectChart(num){
	tabSelected = num;
	hidePop("force");

	deactivateLineDraw();
	deactivateRollover();

	for (var x=0; x < 3; x++){
		document.getElementById("tab_"+x).className = (num == x + 1)?"current":"";
	}

	if (num == 2){

		updateChart(false, "estimate")

	} else if (num == 3){

		updateChart(false, "estRange")

	} else if (num == 1){

		updateChart(false, "earnings")

	}

	initSmartBlurbs();

	initChartOptions();


}

function initChartOptions(){
	//alert(isLocked);
	// turn all on.

	flipOption("optSchemeGrowth", "on")
	flipOption("optSchemeCompare", "on")
	flipOption("optSchemeDraw", "on")
	flipOption("optSchemeNews", "on")
	flipOption("optShowHighLow", "on")
	flipOption("optShowPrice", "on")

	// selectively turn some off.

	if (optAnnQtr == "ann"){

		flipOption("optSchemeCompare", "off")
		flipOption("optSchemeGrowth", "off")
	}

	if (tabSelected == 2 || tabSelected == 3){

		flipOption("optSchemeGrowth", "off");
		flipOption("optSchemeCompare", "off");
		flipOption("optSchemeDraw", "off");
		flipOption("optSchemeNews", "off");
		flipOption("optShowHighLow", "off");

	}

	if (tabSelected == 1 || tabSelected == 3){

		flipOption("optShowPrice", "off");
	}

}

function flipOption(id, dir){

	// flips text color and .disabled property

	var opt = document.getElementById(id);
	var desc = document.getElementById(id + "Desc");

	if (dir == "off"){

		opt.disabled = true;
		opt.style.cursor = "default";
		desc.style.color = "#AAAAAA";
		desc.style.cursor = "default";

	} else {

		opt.disabled = false;
		opt.style.cursor = "hand";
		desc.style.color = "#000000";
		desc.style.cursor = "hand";

	}

}

function checkLogin(){

	//alert(document.getElementById("contentBuffer2").src)

}

function abortEvent(e){

	if (!e) var e = window.event;
	e.returnValue = false;
	try{e.preventDefault()}catch(e){}

	if (window.event) {
		window.event.returnValue=false;
	}
}


function hidePop(e){
	if (isLocked){return false}

	if (e && typeof(e) == "string"){

		var e = false;

	} else if (e || !e){

		var e = (e)?e:window.event

		if (e || window.event){

			var tg = (window.event) ? e.srcElement : e.target;

			if (tg.nodeName != 'IMG'){
				e.cancelBubble = true;
				return;
			}

			var reltg = (e.relatedTarget) ? e.relatedTarget : e.toElement;

			if (reltg && (reltg.nodeName != "DIV" || /popEst/.test(reltg.className))){
				e.cancelBubble = true;
				return;
			}

		}
	}



	if (pop.style.visibility != "hidden"){
		pop.style.visibility = "hidden";
	}

	for (var p in pops){
		pops[p].est.style.visibility = "hidden";
		pops[p].img.style.visibility = "hidden";
	}

}

function updateChart(width, type){

	loadingGif.style.visibility = "visible";

	deactivateRollover();

	var currSrc = document.getElementById("contentBuffer2").src;

	width = (width)?width:((/width\=(\d+)/.test(currSrc))?RegExp.$1:580);
	type = (type)?type:((/type\=([^&]+)/.test(currSrc))?RegExp.$1:"earnings");

	var src = buildAbsolutePath("/common/chart.asp") + "?symbol="+WSODIssue+"&width="+width;
		src += "&annQtr=" + optAnnQtr;
		src += "&chartScheme=" + optChartScheme;
		src += "&showHighLow=" + optShowHighLow;
		src += "&type=" + type;
		src += "&showPrice=" + optShowPrice;

	document.getElementById("contentBuffer2").src = src;

}

var chartFilename = "";

function updateChartSuccess(filename, data, type, drawData){

	// called from buffer iframe when it's done loading.

	if (filename){
		chartFilename = filename;
		loadingGif.style.visibility = "hidden";
	}

	type = (type)?type:"earnings";
	optWidthChart = (/width\=(\d+)/.test(document.getElementById("contentBuffer2").src))?RegExp.$1:580;
	setPenBoundaries(optWidthChart, 175)
	chartEarnings.src = chartFilename;

	if (data){

		if (type == "estimate"){
			rollData = getEstimateRollData(data);
		} else {
			rollData = getRollData(data);
		}
		//recurseObject({o:rollData,i:1,clear:1});
		//initNews();

		if (optChartScheme == "Draw" && type == "earnings"){

			activateLineDraw();

		} else {

			initPop();

			if (optChartScheme == "News"){
				activateNews();
			} else {

				activateRollover();
			}
		}

		if (optChartScheme == "Compare" && type == "earnings"){

			rollLoop:
			for (var x=4; x < rollData.length; x++){

				if (typeof(rollData[x - 4].value) != "undefined"){

					positionRolloverCompare(x);
					break rollLoop;

				}
			}

		}


	}

	if (drawData){

		if (typeof(pen) != "undefined"){
			pen.setYAxisExtents(drawData);
		}

	}

	isLocked = false;

}

function getRollData(flat){
	// GRAB CHART POSITION DATA

	var rollData = [];
	var roll, showRange
	var surprise;

	flat = (flat)?flat.split("|"):[];

	for (var x=0; x < flat.length; x++){

		flat[x] = flat[x].split(",");

		rollData[x] = {
			date:flat[x][0],
			value:flat[x][1],
			x0:parseInt(flat[x][2]),
			y0:parseInt(flat[x][3]),
			x1:parseInt(flat[x][4]),
			y1:parseInt(flat[x][5]),
			qtr:parseInt(flat[x][6]),
			surprise:flat[x][7],
			estHigh:flat[x][8],
			estLow:flat[x][9],
			estPrev:flat[x][10],
			newsX:parseInt(flat[x][11]),
			newsY:parseInt(flat[x][12]),
			newsDate:flat[x][13],
			actual:flat[x][14],
			news:[],
			description: ""
		}

		roll = rollData[x]
		showRange = true;

		// to do: pre-calculate things that are too slow while animating.

		if (roll.actual == "A" && /MET|32768/.test(roll.surprise.toString())){

			roll.description = "<B>" + ((roll.qtr > 0)?"Q" + roll.qtr + " ":"") + " " + roll.date + " Actual: $" + roll.value + "</b>"

		} else if (roll.actual == "A" && roll.surprise == "NEG"){

			// NEG

			roll.description = "<b class='negative'>" + ((roll.qtr > 0)?"Q" + roll.qtr + " ":"") + " " + roll.date + " Negative Surprise" + ((isVal(roll.value))?": </b><b>$" + roll.value + "</b>":"</b>") + ((isVal(roll.estPrev))?"<br><span class='popInfoLight'>Consensus Estimate: $" + roll.estPrev + "</span>":"");
			showRange = false;

		} else if (roll.actual == "A" && roll.surprise == "POS"){

			// POS

			roll.description = "<b class='positive'>"+ ((roll.qtr > 0)?"Q" + roll.qtr + " ":"") + " " + roll.date + " Positive Surprise" + ((isVal(roll.value))?": </b><b>$" + roll.value + "</b>":"</b>") + ((isVal(roll.estPrev))?"<br><span class='popInfoLight'>Consensus Estimate: $" + roll.estPrev + "</span>":"");
			showRange = false;

		} else {

			// ESTIMATE

			roll.description =((roll.qtr > 0)?"Q" + roll.qtr + " ":"") + " " + roll.date + " Estimate: $<b>" + roll.value + "</b>"

		}

		// range line

		if (showRange && isVal(roll.estLow) && isVal(roll.estHigh) && roll.estLow != roll.estHigh){
			roll.description += "<br><span class='popInfoLight'>";
			roll.description += (isVal(roll.estLow) && isVal(roll.estHigh))?"Estimate Range: $" + roll.estLow + " to $" + roll.estHigh:(isVal(roll.estLow))?"low estimate: " + roll.estLow:(isVal(roll.estHigh))?"high estimate: " + roll.estHigh:"";
			roll.description += "</span>";
		}

	}

	return rollData;

}

function getEstimateRollData(flat){

	// GRAB CHART POSITION DATA

	var rollData = [];
	var header, coords;
	var isQtr = optAnnQtr && optAnnQtr == "qtr";

	flat = (flat)?flat.split("#"):[];

	for (var x=0; x < flat.length; x++){

		flat[x] = flat[x].split("~");
		header = flat[x][0].split("|");
		coords = flat[x][1].split(",");

		rollData[x] = {
			year: header[0]
		};

		if (isQtr){
			rollData[x].qtr = header[1]
		}

		rollData[x].coords = [];

		for (var y=0; y < coords.length; y++){

			rollData[x].coords[y] = coords[y].split("|");

			// 0 == value, 1 = x, 2 = y

		}

		pops[x].est.innerHTML = " FY " + rollData[x].year + ((rollData[x].qtr)?" Qtr " + rollData[x].qtr:"") + " Estimate <b><span id=pE"+x+"c></span></b>";
		pops[x].content = document.getElementById("pE" + x + "c");


	}

	return rollData;

}

function setPenBoundaries(xMax){

	var yMin = 16;
	var yMax = (optAnnQtr && optAnnQtr == "ann")?155:140;

	if (!xMax && !yMax){

		var currSrc = document.getElementById("contentBuffer2").src;

		xMax = (currSrc && /width\=(\d+)/.test(currSrc))?RegExp.$1:580;

	}

	pen.setBoundaries(xMax, yMin, yMax);

}

// preloads

var img0 = new Image();
	img0.src = "/tdameritrade/images/rollL1.gif";