/*********************************************************************************/
/**			copyright (c) PlanetCalc.com	  			**/
/**		    	bar diagram generator		 			*/
/*********************************************************************************/

function open_flash_chart_data()
{
	var records = new Array();	

	var column = new Object();
	column.dispname = "";
	column.chartKind = 1;	

	var columns = new Array();		
	column.name = "column1";
	columns["column1"] = column;	
	column.name = "column2";	
	columns["column2"] = column;	
	
    return JsonChartData( records, columns );
}

function flash_chart_reload(destination, data)
{
	var movie = document.getElementById(destination);
	if (movie.firstChild.load)
		movie.firstChild.load(data);
	else
		setTimeout("flash_chart_reload(\"" + destination + "\", '" + data + "')", 100);
}

function flash_navigation_reload(destination, linknum)
{
	var navigation = document.getElementById(destination + "_navigation");
	var num = 0;
	for(var i in navigation.childNodes)
	{
		if (navigation.childNodes[i].style)
		{
			navigation.childNodes[i].style.backgroundColor = (num == linknum) ? "grey" : navigation.style.backgroundColor;
			navigation.childNodes[i].style.color = (num == linknum) ? "white" : "blue";
			num++;
		}
	}
}

function Slices(records, columns)
{
	var candles = 0; 
	var series = -1; //skip first column as x-axis
	for(var i in columns)
	{
		if (columns[i].chartKind < 2)
			series++;
		else
			candles++;
	}
	if (4 == candles)
		series++;
	
	if (0 == series) //only lines
		series++;
	
	var count = records.length;
	
	var screen_limit = (series == 1) ? 40 : Math.ceil(100 / series); //empiric numbers, for current chart labels font.
	var screens = Math.ceil(count / screen_limit);
	screen_limit = Math.ceil(count / screens);
	var slices = new Array();
	for(var i = 0; i < screens; ++i)
	{
		slices[i] = JsonChartData( records.slice(i * screen_limit, (i + 1) * screen_limit), columns );
	}
	return slices;
}

function QuoteQuotes(data)
{
	data = data.replace(/\"/g, "&quot;");
	return data;
}

function JsonChartData( records, columns ) 
{
	var maxYvalue = GetFirstValue(records, columns); 
	var minYvalue = GetFirstValue(records, columns);
	var bHasCandles = false;

	var xLegend = "";
	
	var seriesColors = new Array("#76A4FB","#224499","#FF0000","80C65A","#BB00BB","00BBBB");

	function GetFirstValue(records, columns)
	{
		if (undefined == records)
			return 0;
		if (0 == records.length)
			return 0;
		
		var i = 0;
		do
		{
			var firstvalue = GetFirstRecordValue(records[i], columns);
			if (isFinite(firstvalue))
				return firstvalue;
		}
		while(++i < records.length)
		return 0;
	}	

	function GetFirstRecordValue(record, columns)
	{
		var bSkipXAxis = true;
		for(var i in columns)
		{
			if (bSkipXAxis)
			{
				bSkipXAxis = false;
				continue;
			}
			return record[i];
		}
		return 0;
	
	}
	
	function GetXAxisLabels(records, columns)
	{
		var labels = new Array();
		var colname = "";
		for(var i in columns)
		{
			colname = i;
			xLegend = columns[i].dispname;
			break;
		}
		for (var i in records)
		{
			var record = records[i];
			labels[labels.length] = String(record[colname]);
		}
		return labels;
	}
	
	function GetChartkind(kind)
	{
		switch(kind)
		{
			case 1:
				return "bar_filled";
			case 2:
				return "line";
			case 3:
			case 4:
			case 5:
			case 6:
				return kind;
		}
		return "bar_filled"; //for old published calculators
	}
	
	function SetupYAxis(bCandles, minValue, maxValue)
	{
		var y_axis = new Object();
		y_axis.stroke = 1;
		y_axis.tick_length = 3;
		y_axis.colour = "#999999";
		y_axis.grid_colour = "#999999";
		y_axis.offset = 0;
		
		if (bCandles && (minValue != maxValue) && (Math.abs(maxValue - minValue)/maxValue < 0.05)) //(maxValue - minValue)/maxValue - range factor
		{
			y_axis.min = minValue;	
			y_axis.max = maxValue;	
			y_axis.steps = (maxValue - minValue)/10;			
		}
		else
		{
			y_axis.min = minValue < 0 ? minValue : 0;	
			y_axis.max = maxValue > 10 ? Math.ceil(maxValue) : maxValue;	
			y_axis.steps = maxValue > 10 ? Math.ceil(maxValue/10) : maxValue/10;						
		}
		return y_axis;
	}
	
	function GetElement(records, colname, coldescription, colchartkind, colcolor)
	{
		var element = new Object();
		element.type = GetChartkind(colchartkind);
		element.alpha = 0.5;
		element.colour = colcolor;
		element.text = coldescription;
		element["font-size"] = 10;
		element.values = new Array();
		for(var i in records)
		{
			var record = records[i];
			if (!isFinite(record[colname]))
			{
				element.values[element.values.length] = null;			
				continue;
			}
			if (record[colname] > maxYvalue)
				maxYvalue = record[colname];
			if (record[colname] < minYvalue && null != record[colname])
				minYvalue = record[colname];				
			element.values[element.values.length] = record[colname];			
		}
		return element;
	}

	function CreateCandles(candle_array, candlecolor, candlenegcolor)
	{
		bHasCandles = true;
		var sumelement = new Object();
		sumelement.type = "candle";
		sumelement.colour = candlecolor;
		sumelement["negative-colour"] = candlenegcolor;
		sumelement.tip = "#x_label#<br>#high#<br>#open#<br>#close#<br>#low#";
		
		sumelement.values = new Array();
		for(var i in candle_array)
		{
			for(var j in candle_array[i].values)
			{
				if (undefined == sumelement.values[j])
					sumelement.values[j] = new Object();
				if (candle_array[i].type == 3)
					sumelement.values[j].top = candle_array[i].values[j];
				else if (candle_array[i].type == 4)
					sumelement.values[j].high = candle_array[i].values[j];
				else if (candle_array[i].type == 5)
					sumelement.values[j].low = candle_array[i].values[j];					
				else if (candle_array[i].type == 6)
					sumelement.values[j].bottom = candle_array[i].values[j];										
			}
		}
		return sumelement;
	}
  	
	function GetElements(records, columns)
	{
		var elements = new Array();
		var candle_elements = new Array();
		var seriescount = 0;
		var bSkipXAxis = true;
		for(var i in columns)
		{
			if (bSkipXAxis)
			{
				bSkipXAxis = false;
				continue;
			}
			if (columns[i].chartKind <= 2)
			{
				elements[elements.length] = GetElement(records, i, columns[i].dispname, columns[i].chartKind, seriesColors[seriescount % seriesColors.length]);	
				seriescount++;
			}
			else 
			{
				candle_elements[candle_elements.length] = GetElement(records, i, columns[i].dispname, columns[i].chartKind, seriesColors[seriescount % seriesColors.length]);
			}			
		}
		if (4 == candle_elements.length)
			elements[elements.length] = CreateCandles(candle_elements, seriesColors[seriescount % seriesColors.length], seriesColors[ (seriescount+1) % seriesColors.length]);
		return elements;
	}	

	var data = new Object();
	data.title = new Object();
	data.title.text = "";
	data.title.style = "{font-size: 20px; color:#0000ff; font-family: Verdana; text-align: center;}";
	
	data.y_legend = new Object();
	data.y_legend.text = "";
	data.y_legend.style = "{color: #736AFF; font-size: 12px;}";
	
	data.x_axis = new Object();
	data.x_axis.stroke = 1;
	data.x_axis.tick_height = 10;
	data.x_axis.colour = "#999999";
	data.x_axis.grid_colour = "#999999";
	data.x_axis.labels = new Object();
	data.x_axis.labels.rotate = 270; //todo calculate if rotate needed dynamically
	data.x_axis.labels.labels = GetXAxisLabels(records, columns);

	data.x_legend = new Object();
	data.x_legend.text = xLegend;
	data.x_legend.style = "{color: #736AFF; font-size: 12px;}";
    
	data.elements = GetElements(records, columns);
	
	data.y_axis = SetupYAxis(bHasCandles, minYvalue, maxYvalue);
	
	return Value2Json(data);
}

function BarDiagram( destination, height, numberOfSections, maxSeriesCount, diagramAccessString ) {

	this.Header = new RecordsetHeader();

	this.m_destination = document.getElementById( destination );
	if (!this.m_destination.firstChild)
		this.m_destination.innerHTML = BSInsertFlash(700, 300, destination) + "<div id=\"" + destination + "_navigation\"></div>";

	this.m_numberOfSections = numberOfSections;

	this.Render = function ( tableData ) {
		if (0 == tableData.length) //with comments renders white rectangle on empty dataset
			return;
		var slices = Slices(tableData, this.Header.Columns);
		
		if (this.m_destination.firstChild.load)
			this.m_destination.firstChild.load( slices[0] );
		else
			setTimeout("flash_chart_reload(\"" + destination + "\", '" + slices[0] + "')", 100);

		var navElement = document.getElementById(destination + "_navigation");				
		if (slices.length > 1)
		{
			var navigation = "";
			for(var i = 0; i < slices.length; ++i)
				navigation += "<a href=\"javascript:flash_chart_reload('" + destination + "', '" + QuoteQuotes(slices[i]) + "');flash_navigation_reload('" + destination + "'," + i + ");\">" + (i+1) + "</a>&nbsp;"

			navElement.innerHTML = navigation;
		}		
		else
			navElement.innerHTML = "";
	}
}
