var ie = false;
var mozilla = false;

if (document.all)
	ie = true;
else
	mozilla = true;
	
var chartData;
var chartLabels;
var seriesNames;
var chartTitle;
var chartWidth = 80;
var chartPrefix = "";
var chartPostfix = "";
var mapWidth = 500;
var mapHeight = 420;
var showLegend = false;
var legendCols = 2;

function ColumnChart()
{
	var html = "";
	
	var chartDiv = FindChartDiv();
	
	// debugging switches
	var trace = false;
	var draw = true;
	var showData = false;
	
	
	var dataLength = chartData.length;
	
	if (dataLength <= 0)
	{
		alert("ColumnChart(): No data array defined!");
		return;
	}
	if (chartLabels.length != dataLength)
	{
		alert("ColumnChart(): Labels array different size than data array!");
		return;
	}
	
	var colSpan = (dataLength * 2) + 1;
	var rangeInfo = CalculateRange(chartData, dataLength, false);	
	var cTop = rangeInfo[0];
	var cBottom = rangeInfo[1];
	var topRows = rangeInfo[3];
	var bottomRows = rangeInfo[4];
	var step = rangeInfo[2];
	
	// Some variables for drawing loop
	
	var bottomNext = false;
	var firstTime = true;
	var stopTime = 0;
	
	if (cBottom < 0)
		stopTime = (topRows + bottomRows);
	else
		stopTime = topRows;
	
	// Display debug info	
	if (trace)
	{		
		html += ("DataLength=" + dataLength + "<br>");
		html += ("top=" + cTop + "<br>");
		html += ("bottom=" + cBottom + "<br>");
		html += ("topRows=" + topRows + "<br>");
		html += ("bottomRows=" + bottomRows + "<br>");
		html += ("step=" + step + "<br>");
	}
	if (showData)
	{
		html += chartData.toString();
	}
	/////////// Draw the chart /////////////////////////////////
	if (draw)
	{
	// Draw the header and chart title
	html += '<table cellpadding="0" cellspacing="0" border="0" class="chartShell">';
	html += '<tr><td>';
	html += '<table class="graph" cellspacing="0" cellpadding="0" border="0" style="background-color : #FFF;">';
	html += '<tr>';
	html += '<td colspan="' + colSpan + '" class="chartHead chartbg_01" style="padding : 6px;">' + chartTitle + '</td>';
	html += '</tr><tr>';
	html += '<td colspan="' + colSpan + '" class="chartbg_02" style="padding : 6px;"><img src="images/spacer.gif" width="1" height="1"></td>';
 	html += '</tr>';

	// Go down the chart one increment at a time 	
	for (var i = cTop, rows=0 ; rows <= stopTime ; i -= step, ++rows)
	{
		// Add postfix or prefix
		var yLabel = i.toString();
		if (chartPrefix != "")
		{
			if (i < 0)
			{
				yLabel = yLabel.replace('-',"");
				yLabel = "-" + chartPrefix + yLabel;
			} else {
				yLabel = chartPrefix + yLabel;
			}
		}
		if (chartPostfix != "")
		{
			yLabel = yLabel + chartPostfix;
		}
		
	 	html += '<tr>';
	 	html += ('<td align="right">' + yLabel + '</td><td class="labelY"><img src="images/tic_h.gif"></td>');
	 
	 	// Draw the top bars
	 	if ((i == cTop) && (cTop != 0))
	 	{
	 		for (var j = 0 ; j < dataLength ; ++j)
	 		{
	 				var stepsTaken = chartData[j] / step;
					var height = Math.ceil(stepsTaken * 40);			
		 			
		 			
		 			html += ('<td class="graphCel_top" rowspan="' + topRows + '">');
		     	html += ('<div class="top_bar">');
		     	
		     	if (stepsTaken > 0)
		     	{
		     		html += ('<div style="height : ' + height + 'px; width : ' + chartWidth + 'px; border-left : ' + chartWidth + 'px solid #E2C35E;"></div></div></td>'); 		
		     	}
		     	if (stepsTaken == 0)
		     	{
		     		html += ('<div class="bar_clear" style="height : 0px; width :' + chartWidth + 'px;"></div></div></td>'); 		
		     	}
		     	if (stepsTaken < 0)
		     	{
		     		html += ('&nbsp</div></td>');
		     	}
		
					if (j < dataLength - 1)     
		     		html += ('<td rowspan="' + topRows + '">&nbsp;</td>');
	   	}
	 	}
	 	
	 	// Draw the bottom bars
	 	if (bottomNext)
		{
			for (var j = 0 ; j < dataLength ; ++j)
			{
				var stepsTaken = -chartData[j] / step;	
	 			var height = Math.ceil(stepsTaken * 40);			
	 			
	 			html += ('<td class="graphCel_bottom" rowspan="' + bottomRows + '">');
	 			html += ('<div class="bottom_bar">');
	     	
	 			if (chartData[j] < 0)
	 			{
	 				html += ('<div style="height : ' + height + 'px; width : ' + chartWidth + 'px; border-left : ' + chartWidth +'px solid #E2C35E;"></div>');
					html += ('</div></td>');
	     	}
	     	if ((chartData[j] == 0) && (cTop == 0))
	     	{
	     		html += ('<div class="bar_clear" style="height : 0px; width : ' + chartWidth + 'px;"></div>');
	   	 	}
	     	if (chartData[j] > 0)
	     	{
	     		html += ('&nbsp</div></td>');
	     	}	
	     
	     	if (j < dataLength - 1)
	     		html += ('<td rowspan="' + bottomRows + '">&nbsp;</td>');
			}
			
			bottomNext = false;
		}
	
		// Draw X Axis
	 	if (i == 0)
	 	{
	 		bottomNext = true;
	 		for (var j = 0 ; j < dataLength ; ++j)
	 		{
	 			html += ('<td class="zeroAxis"><div class="zeroAxis">&nbsp;</div></td>');
		 		if (j < dataLength - 1)
	    		html += ('<td class="zeroAxisTic"><div class="zeroAxisTic"><img src="/mbm4/images/tic_v.gif"></div></td>');
	   	}
		}
				
		html += ('</tr>');
	}
	
	// Draw footer	
	html += '<tr>';
	for (var i = 0 ; i < dataLength ; ++i)
	{
		if (i == 0)
		{
			html += '<td colspan="2" class="heavy chartbg_04">&nbsp;</td>';
		} else {
			html += '<td class="heavy chartbg_04"></td>';
		}
	  html += '<td align="center" class="heavy chartbg_04">' + chartLabels[i] + '</td>';
	}
	html += '</tr></table></td></tr></table>';                
	}		// End drawing

	chartDiv.innerHTML = html;
}

function StackedChart()
{
	var html = "";
	
	var chartDiv = FindChartDiv();
	
	var trace = false;
	var draw = true;
	
	var dataLength = chartData.length;
	if (dataLength <= 0)
	{
		alert("StackedChart(): No data array defined!");
		return;
	}
	
	var numSeries = chartData[0].length;
	if (numSeries <= 0)
	{
		alert("StackedChart(): No series defined!");
		return;
	}
	for (var i = 0 ; i < dataLength ; ++i)
	{
		if (chartData[i].length != numSeries)
		{
			alert("StackedChart(): Number of series for each data point do not match!");
			return;
		}
	}
	if (showLegend && (seriesNames.length != numSeries) )
	{
		alert("StackedChart(): Number of series names does not match number of series!");
		return;
	}
	if (chartLabels.length != dataLength)
	{
		alert("StackedChart(): Labels array different size than data array!");
		return;
	}
	
	var colSpan = (dataLength * 2) + 1;
	
	// Calculate the range
	var rangeInfo = CalculateRange(chartData, dataLength, true);	
	var cTop = rangeInfo[0];
	var topRows = rangeInfo[3];
	var step = rangeInfo[2];
	
	// Generate series colors
	var styles = new Array(numSeries);
	for (var i = 0 ; i < numSeries ; ++i)
	{
		switch (i % 6)
		{
			case 0:
			{
				styles[i] = "border-left : " + chartWidth + "px solid #E2C35E;";
			} break;
			case 1:
			{
				styles[i] = "border-left : " + chartWidth + "px solid #FFE799;";
			} break;
			case 2:
			{
				styles[i] = "border-left : " + chartWidth + "px solid #AD9649;";
			} break;
			case 3:
			{
				styles[i] = "border-left : " + chartWidth + "px solid #877DC2;";
			} break;
			case 4:
			{
				styles[i] = "border-left : " + chartWidth + "px solid #5542C8;";
			} break;
			case 5:
			{
				styles[i] = "border-left : " + chartWidth + "px solid #30208C;";
			} break;
		}
	}
	
	// Some variables for drawing loop
	
	var firstTime = true;
	
	// Display debug info	
	if (trace)
	{		
		html += ("DataLength=" + dataLength + "<br>");
		html += ("numSeries=" + numSeries + "<br>");
		html += ("top=" + cTop + "<br>");
		html += ("topRows=" + topRows + "<br>");
		html += ("step=" + step + "<br>");
	}
	
	/////////// Draw the chart /////////////////////////////////
	if (draw)
	{
	// Draw the header and chart title
	html += '<table cellpadding="0" cellspacing="0" border="0" class="chartShell">';
	html += '<tr><td>';
	html += '<table class="graph" cellspacing="0" cellpadding="0" border="0" style="background-color : #FFF;">';
	html += '<tr>';
	html += '<td colspan="' + colSpan + '" class="chartHead chartbg_01" style="padding : 6px;">' + chartTitle + '</td>';
	html += '</tr><tr>';
	html += '<td colspan="' + colSpan + '" class="chartbg_02" style="padding : 6px;"><img src="images/spacer.gif" width="1" height="1"></td>';
 	html += '</tr>';
 	
 	for (var i = cTop, rows=0 ; rows <= topRows ; i -= step, ++rows)
	{
	 	html += '<tr>';
	 	
	 	// Add postfix or prefix
		var yLabel = i.toString();
		if (chartPrefix != "")
		{
			if (i < 0)
			{
				yLabel = yLabel.replace('-',"");
				yLabel = "-" + chartPrefix + yLabel;
			} else {
				yLabel = chartPrefix + yLabel;
			}
		}
		if (chartPostfix != "")
		{
			yLabel = yLabel + chartPostfix;
		}
		
	 	html += ('<td align="right">' + yLabel + '</td><td class="labelY"><img src="images/tic_h.gif"></td>');
	 
	 	// Draw the top bars
	 	if ((i == cTop) && (cTop != 0))
	 	{
	 		for (var j = 0 ; j < dataLength ; ++j)
	 		{
	 			html += ('<td class="graphCel_top" rowspan="' + topRows + '">');
		  	html += ('<div class="top_bar">');
		  
	 			for (var k = 0 ; k < numSeries ; ++k)
	 			{
	 				var stepsTaken = chartData[j][k] / step;
					var height = Math.ceil(stepsTaken * 40);			
		 			if (stepsTaken > 0)
		     	{
		     		var point = chartData[j][k];
		     		if (chartPrefix == "$")
		     			point = FormatMoney(point);
		     		if (chartPostfix == "%")
		     			point = FormatPercent(point);
		     		html += ('<div style="' + styles[k] + 'height : ' + height + 'px; width :' + chartWidth + 'px;">');
		     		html += '</div>';
		     	}
	 			}
	 			
	 			html += ('</div></td>');
		 			   	
		  	if (j < dataLength - 1)     
		     		html += ('<td rowspan="' + topRows + '">&nbsp;</td>');
	   	}
	 	}

		// Draw X Axis
	 	if (i == 0)
	 	{
	 		bottomNext = true;
	 		for (var j = 0 ; j < dataLength ; ++j)
	 		{
	 			html += ('<td class="zeroAxis"><div class="zeroAxis">&nbsp;</div></td>');
		 		if (j < dataLength - 1)
	    		html += ('<td class="zeroAxisTic"><div class="zeroAxisTic"><img src="/mbm4/images/tic_v.gif"></div></td>');
	   	}
		}
				
		html += ('</tr>');
	}
	
	// Draw footer	
	html += '<tr>';
	for (var i = 0 ; i < dataLength ; ++i)
	{
		if (i == 0)
		{
			html += '<td colspan="2" class="heavy chartbg_04">&nbsp;</td>';
		} else {
			html += '<td class="heavy chartbg_04"></td>';
		}
	  html += '<td align="center" class="heavy chartbg_04">' + chartLabels[i] + '</td>';
	}
	html += '</tr>';
	
	// Draw legend
	if (showLegend)
	{
		html += '<tr><td colspan="2">&nbsp;</td>';
		html += '<td colspan="' + ((dataLength * 2) - 1) + '" align="center" class="heavy" style="font-size : 16px;">LEGEND</td></tr>';
		
		for (var i = 0 ; i < numSeries ; ++i)
		{
			switch (i % 6)
			{
				case 0:
				{
					styles[i] = "legend_01";
				} break;
				case 1:
				{
					styles[i] = "legend_02";
				} break;
				case 2:
				{
					styles[i] = "legend_03";
				} break;
				case 3:
				{
					styles[i] = "legend_04";
				} break;
				case 4:
				{
					styles[i] = "legend_05";
				} break;
				case 5:
				{
					styles[i] = "legend_06";
				} break;
			}
		}
		
		var cutOff = Math.ceil(numSeries / legendCols);
		var span = Math.floor(((dataLength * 2) - 1) / legendCols);
		
		for (var i = 0 ; i < cutOff ; ++i)
		{
			html += '<tr>';
			html += '<td colspan="2">&nbsp;</td>';
			for (var j = 0 ; j < legendCols ; ++j)
			{
				if ( (i + (j * cutOff)) < numSeries)
				{
					html += ('<td align="center" colspan="' + span + '"><div class="' + styles[i + (j * cutOff)] + '">' + seriesNames[i + (j * cutOff)] + '</div></td>');
					if ( (j+1) < legendCols )
						html += '<td>&nbsp;</td>';
				}
				else
				{
					html += '<td colspan="' + span + '">&nbsp;</td>'
				}
			}
			/*
			if ( (i + cutOff) < numSeries )
			{
				html += ('<td align="center"><div  class="' + styles[i + cutOff] + '">' + seriesNames[i + cutOff] + '</div></td>');
			} else {
				html += '<td>&nbsp;</td>';
			}*/
			html += '</tr>';
		}
		
		html += '<tr><td colspan="' + ((dataLength * 2) + 1) + '">&nbsp;</td>';
	}
	
	html += '</table></td></tr></table>';                
	}		// End drawing

	chartDiv.innerHTML = html;
}

function PlotChart()
{
	var dontPlot = false;
	var xInc = mapWidth / 100;
	var yInc = mapHeight / 100;
	var dotOffset = 12;

	var dataLength = chartData.length;
	if (dataLength != 2)
	{
		alert("PlotChart() : 2 (and only 2) data points must be passed!");
		return;
	}
	
	var dotDiv = document.getElementById("PlotDot");
	if (dotDiv == null)
	{
		alert("PlotChart() : PlotDot div not defined! (Did you forget the cf_PlotMap tag?)");
		return;
	}
	
	if (chartData[0] < 0 || 
			chartData[0] > 100 || 
			chartData[1] < 0 || 
			chartData[1] > 100)
	{
			dotDiv.innerHTML = "";
			return;
	}
	
	var plotX = -mapWidth;
	var plotY = 24;
		
	plotX += (Math.ceil(chartData[0] * xInc) - dotOffset);
	plotY += (mapHeight - Math.ceil(chartData[1] * yInc) - dotOffset);
		
	dotDiv.style.left = plotX;
	dotDiv.style.top = plotY;
	dotDiv.innerHTML = '<img width="24" height="24" src="images/plotmap_dot.gif">';
}

/***************************************************************************
*
*				UTILITY FUNCTIONS
*
****************************************************************************/

function FindPlotDiv()
{
	var divs = document.getElementsByTagName('div');
	for (var i = 0 ; i < divs.length ; ++i)
	{
		if (divs[i].className == "plotchart")
			return divs[i];
	}
}

function FindChartDiv()
{
	// Find the div tag we will use to draw chart
	var divs = document.getElementsByTagName('div');
	for (var i = 0 ; i < divs.length ; ++i)
	{
		if (divs[i].className == "chart")
		{
			return (divs[i]);
		}
	}
}

function CalculateRange(chartData, dataLength, stacked)
{
	var numIntervals = 10;	// Actual ticks=numIntervals+2
	
	var dataMin = 0;
	var dataMax = 0;
	var tmpTop = 0;
	var range = new Array(5);	// range[0] = top, range[1] = bottom, range[2] = step, 
														// range[3] = topRows, range[4] = bottomRows
	

	if (stacked)
	{
		numSeries = chartData[0].length;
		for (var i = 0 ; i < dataLength ; ++i)
		{
			var sum = 0;
			for (var j = 0 ; j < numSeries ; ++j)
				sum += chartData[i][j];
			if (sum > dataMax)
				dataMax = sum;
			if (sum < dataMin)
				dataMin = sum;
		}
	} else {
		for (var i = 0 ; i < dataLength ; ++i)
		{
			if (chartData[i] > dataMax)
				dataMax = chartData[i];
			if (chartData[i] < dataMin)
				dataMin = chartData[i];
		}
	}
	
	if (dataMax < 0)
		tmpTop = 0;
	else
		tmpTop = dataMax;
	if (dataMin < 0)
		range[1] = dataMin;
	else
		range[1] = 0;
		
	var gap = tmpTop - range[1];
	range[2] = Math.ceil(gap / numIntervals);
	
	range[0] = 0;
	range[3] = 0;
	if (tmpTop != 0)
	{
		while(range[0] < tmpTop)
		{
			range[0] += range[2];
			++range[3];
		}
		// Allow one extra row if we're all positive
		if (dataMin >= 0)
		{
			range[0] += range[2];
			++range[3];
		}
	}
		
	range[4] = numIntervals - range[3] + 1;
	
	return range;
}

function GetAbsX(elt) 
{ 
	return GetAbsPos(elt,"Left"); 
}

function GetAbsY(elt) 
{ 
	return GetAbsPos(elt,"Top"); 
}

function GetAbsPos(elt, property) 
{
 var iPos = 0;
 var lastOne = 0;
 
 while (elt != null) 
 {
 	lastOne = elt["offset" + property];	
 	iPos += lastOne;
  elt = elt.offsetParent;
 }
 
 if (mozilla)
 	iPos -= lastOne;
 	
 return iPos;
}