//
// Copyright 2007 all rights reserved
//

if (typeof console == "undefined") {
	console = {log:function(s) {void(s);}}
}


function chartUpdate(domObj, vals, maxWidth, opts) {

	if (!opts)
		opts = {};

	if(typeof(domObj) == "string")
		domObj = document.getElementById(domObj);
	
	var outerDom = domObj;
	
	// Create the innner DIV for the chart
	var innerDom = document.createElement("div");
	innerDom.className = "chart";
	outerDom.appendChild(innerDom);

//	if (!opts.yLines)
//		innerDom.style.borderTopStyle =
//			innerDom.style.borderBottomStyle = "none";

	
	// Parse ouf the chart data values
	var valsArr = typeof(vals)=="string" ?vals.split("|") :vals;
	
	var bar;
	var overBar;
	var barVal;
	var valsMax = 0;
	var valsMin = 0;

	for (var ii=0; ii < valsArr.length; ii++) {

		valsArr[ii] = parseFloat(valsArr[ii]);

		if (valsArr[ii] > valsMax)
			valsMax = valsArr[ii];
		if (valsArr[ii] < valsMin)
			valsMin = valsArr[ii];
	}
	if(opts.type==1)
		var maxY = ( innerDom.clientWidth
				     ? innerDom.clientWidth
				     : innerDom.offsetWidth) - 1;
	else
		var maxY = ( innerDom.clientHeight
				     ? innerDom.clientHeight
				     : innerDom.offsetHeight) - 1;
	var barYFactor = (opts.maxVal ?opts.maxVal :(valsMax-valsMin))/(maxY-3);
	var maxYPos = Math.round(valsMax/barYFactor);
	var minYPos = Math.round(valsMin/barYFactor);

	// Y-Axis lines (code needs to be expaned for opts.type 1)
	var yAxisDom = null;
	if(opts.yAxis) {

		yAxisDom = document.createElement("div");
		yAxisDom.className = "chartYAxis";
		outerDom.insertBefore(yAxisDom, innerDom);


		var yAxisTopDom = document.createElement("div");
		yAxisTopDom.innerHTML =
			formatNumStr(valsMax>=1000?valsMax/1000:valsMax) +
			(valsMax>=1000?"K":"");
		yAxisTopDom.style.position = "relative";
		yAxisDom.appendChild(yAxisTopDom);
		yAxisTopDom.style.top = (0 - yAxisTopDom.offsetHeight/2) + "px";
	
		var yAxisCtrDom = document.createElement("div");
//		yAxisCtrDom.innerHTML = 0;
		yAxisCtrDom.style.position = "relative";
		yAxisDom.appendChild(yAxisCtrDom);
		yAxisCtrDom.style.top = ( maxYPos -
								  yAxisTopDom.offsetHeight -
								  yAxisCtrDom.offsetHeight/2) + "px";

		var yAxisBtmDom = document.createElement("div");
		yAxisBtmDom.innerHTML =
			formatNumStr(valsMin<=1000?valsMin/1000:valsMin) +
			(valsMin<=1000?"K":"");
		yAxisBtmDom.style.position = "relative";
		yAxisDom.appendChild(yAxisBtmDom);
		yAxisBtmDom.style.top = ( innerDom.offsetHeight -
								  yAxisTopDom.offsetHeight -
								  yAxisCtrDom.offsetHeight -
								  yAxisBtmDom.offsetHeight/2 ) + "px";
	}
	

	// Y-Axis Grid Lines
	if (opts.yLines == -1) {
		var yTopDOM = document.createElement("div");
		yTopDOM.className = "chartYAxisLine";
		yTopDOM.style.top = 0 + "px";
		innerDom.appendChild(yTopDOM);

		yTopDOM = document.createElement("div");
		yTopDOM.className = "chartYAxisLine";
		yTopDOM.style.top = maxYPos/2 + "px";
		innerDom.appendChild(yTopDOM);

		yTopDOM = document.createElement("div");
		yTopDOM.className = "chartYAxisLine";
		yTopDOM.style.top = maxYPos + "px";
		innerDom.appendChild(yTopDOM);

		if( valsMin < 0) {
			yTopDOM = document.createElement("div");
			yTopDOM.className = "chartYAxisLine";
			yTopDOM.style.top = maxYPos - minYPos + "px";
			innerDom.appendChild(yTopDOM);
		}
	}
	else if (opts.yLines) {
		var interval = maxY/opts.yLines;
		for (var ii=maxYPos; ii >=0 ; ii-=interval) {
		 	var yTopDOM = document.createElement("div");
			yTopDOM.className = "chartYAxisLine";
			yTopDOM.style.top = ii+ "px";
			innerDom.appendChild(yTopDOM);
		}
		for (var ii=maxYPos+interval; ii <= maxY; ii+=interval) {
		 	var yTopDOM = document.createElement("div");
			yTopDOM.className = "chartYAxisLine";
			yTopDOM.style.top = ii+ "px";
			innerDom.appendChild(yTopDOM);
		}
	}


	// Define Tip DIV
	var barTipDOM = document.createElement("div");
	barTipDOM.className = "chartTip";
	innerDom.appendChild(barTipDOM);
	

	var chartWidth= opts.type==1 ?(maxWidth-(yAxisDom?yAxisDom.offsetWidth:0))
	                             :(maxWidth-(yAxisDom?yAxisDom.offsetHeigth:0));
	var barWidth = maxWidth ?parseInt(chartWidth/valsArr.length)-1 :0;

	// Define and add the actual bars.
	var barSize;
	for (var ii=0; ii < valsArr.length; ii++) {

		overBar = document.createElement("div");
		overBar.className    = "chartCol";
		if (barWidth)
			overBar.style.width = barWidth + "px";
		if(opts.type==1)
			overBar.style.width = (maxY + 1) + "px";
		else
			overBar.style.height = (maxY + 1) + "px";
		if(opts.type==1) {
			overBar.style.float = "none";
			overBar.style.clear = "both";
		}
		innerDom.appendChild(overBar);
		
		bar = document.createElement("div");
/*		bar.className    = "chartBar";*/

//		if (opts.showVals)
//			bar.innerHTML = "<span style='padding-left:3px;'>" + valsArr[ii] + "</span>";

		barSize = Math.round(Math.abs(valsArr[ii]) / barYFactor);
		barSize = barSize < 1 ? 1 : barSize + 1;

		if(opts.type==1) {
			bar.style.left = ( valsMin 
				?(valsArr[ii]>0 ?Math.round(Math.abs(valsMin)/barYFactor) :0)
				:0) + "px";
			bar.style.width = barSize + "px";
		} else {
			bar.style.top = ( valsArr[ii] >= 0
				     ? maxYPos - Math.round(valsArr[ii] / barYFactor)
				     : maxYPos) + "px";;
			bar.style.height = barSize + "px";
		}

		bar.className =
			valsArr[ii] < 0 ? "chartBarNeg"
			: valsArr[ii] == 0 ? "chartBar0"
			: ii && valsArr[ii] < valsArr[ii-1] ? "chartBarPos2"
			: "chartBarPos";
			
		if (barWidth) {
			bar.style.width = barWidth + "px";
		}
//		bar.style.marginRight = "0px";
		
		overBar.appendChild(bar);

		if (opts.showVals) {

			var showVal = document.createElement("div");
			showVal.style.position = "absolute";
			showVal.style.color = "#000";
			showVal.style.fontWeight = "bold";
			showVal.style.fontSize = "11px";
			showVal.style.zIndex = "5";
			showVal.style.left = 1 + "px";
			showVal.style.top= 1 + "px";
			showVal.style.paddingLeft = "3px";
			showVal.style.paddingTop = "1px";
			showVal.innerHTML = opts.valLabels ?opts.valLabels[ii] :valsArr[ii];
			overBar.appendChild(showVal);

			var showVal = document.createElement("div");
			showVal.style.position = "absolute";
			showVal.style.color = "#fff";
			showVal.style.fontWeight = "bold";
			showVal.style.fontSize = "11px";
			showVal.style.zIndex = "5";
			showVal.style.left = 0 + "px";
			showVal.style.paddingLeft = "3px";
			showVal.style.paddingTop = "1px";
			showVal.innerHTML = valsArr[ii];
			overBar.appendChild(showVal);

			if (1==2 && showVal.offsetWidth > bar.offsetWidth) {
				showVal.style.left = bar.offsetWidth + 2 + "px";
				showVal.style.paddingLeft = "0px";
				showVal.style.paddingTop = "1px";
				showVal.style.color = "#000";;
				showVal.style.fontWeight = "normal";
			}
		}

		if (opts.axisLabels) {
			var axisLabel = document.createElement("div");
			axisLabel.style.position = "absolute";
			axisLabel.style.zIndex = "5";
			axisLabel.style.right = maxY + "px";
			axisLabel.style.paddingRight = "5px";
			axisLabel.innerHTML = opts.axisLabels[ii];
			overBar.insertBefore(axisLabel, bar);
		}

		overBar.id = ii + "|" + valsArr[ii];

		var rolloverFunc = opts.rolloverFunc ?opts.rolloverFunc :chartTipShow;
		overBar.onmouseover = function(event) {
			rolloverFunc(event, this.id, barTipDOM, this)
		};
		overBar.onmouseout = function(event) {
			this.className    = "chartCol";
			barTipDOM.style.visibility = "hidden";
			this.style.backgroundColor = "";
			this.style.opacity = "";
			if (this.style.filter)
				this.style.filter = "";
		};
		if (opts.onclickFunc)
			overBar.onclick = function(event) {
				opts.onclickFunc(event, this.id, barTipDOM, this);
			};
	}

	// set overal chart width, else rows may wrap on screen shrink
	if(opts.type==1) {
		innerDom.style.height = ( (valsArr.length) * overBar.offsetHeight) + "px";
		outerDom.style.height = ( (valsArr.length) * overBar.offsetHeight +
								 (yAxisDom?yAxisDom.offsetHeight:0) + 2) + "px";
		outerDom.style.width = maxY + "px";
	} else {
		innerDom.style.width = ( (valsArr.length) * overBar.offsetWidth) + "px";
		outerDom.style.width = ( (valsArr.length) * overBar.offsetWidth +
								 (yAxisDom?yAxisDom.offsetWidth:0) + 2) + "px";
	}
	

//?	overBar.style.paddingRight = "0px";
//?	overBar.style.marginRight = "0px";
	

//	outerDom.style.height = (innerDom.offsetHeight + 2) +
//							"px";
//	outerDom.style.width = (innerDom.offsetWidth + yAxisDom.offsetWidth + 2) +
//						   "px";

}


// Default TipShow
function chartTipShow(evt, tip, tipDOM, tgt) {

	if ( ! evt )
		evt = window.event;

	//var evtTarget = evt.target ? evt.target : evt.srcElement;

	tipDOM.innerHTML =
		(parseInt(tip.split("|")[0]) + 1) + " : " +
		tip.split("|")[1];

	tipDOM.style.top =  tgt.offsetTop - tipDOM.offsetHeight - 1 + "px";
//	tipDOM.style.top =  tgt.offsetHeight + 1;
	tipDOM.style.left =  tgt.offsetLeft + "px";
//	tipDOM.style.border = "1px #ffffcc solid";
//	tipDOM.style.borderLeft = "18px #ffff99 solid";
	tipDOM.style.backgroundColor = "#ffff99";
	
	tgt.style.backgroundColor = "#ffff66";
	tgt.style.opacity = ".7";
	tgt.style.filter = "alpha(opacity=60)";
	tipDOM.style.visibility = "visible";
}


function formatNumStr(num, prefix) {

	if (!prefix)
		prefix = "";
		
	num = Math.round(num);
	
	var numStr = "";
	var numAbsLen = (Math.abs(num)).toString().length;
	var numStrLen = num.toString().length;

	for (var ii=0; ii < numStrLen; ii+=3) {
		numStr =
			(ii < numAbsLen - 3 ? "," : "") +
			num.toString().substring(numStrLen-ii-3,numStrLen-ii) +
			numStr;
	}

	if (numStr.substring(0,1) == "-") {
		numStr = "-" + prefix + numStr.substring(1);
	}
	else {
		numStr = prefix + numStr;
	}
	
	return numStr;
}

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