
function OpenmrsGraph()
{

	var flashObject;

	var values; //array
	var valuesX; //array
	var xLabels; //array of the text of ticks on X axis
	var maxXLabels; //maximum number of labels to show on the X axis
	var yMin = 0;
	
	var yMax = 20;
	var xMin = 0;
	var xMax = 20;
	
	var title = '';
	var titleSize = 30;
	var titleColour = '#FFFFFF';
	var titlePadding = 0;
	
	var xTickSize = -1;
	
	//name of the function to call when value is clicked
	var clickCallbackFunc = "";
	var links;
	
	//Grid Styles
	//var xAxisColour = '';
	//var xGridColour = '';
	//var yAxisColour = '';
	//var yGridColour = '';
	var xAxisSteps = 1;
	 
	// Axis Label Styles
	this.xLabelStyleSize = 0;
	var xLabelStyleColour = '#FFFFFF';
	this.xLabelStyleOrientation = 1;
	var xLabelStyleStep = 1;
	
	var yTicks = [5,10];
	var yLabelSteps = 5;
	var yLabelStyleSize = -1;
	var yLabelStyleColour = '#FFFFFF';
	
	//Axis Legend Styles
	var xLegend = '';
	var xLegendSize = 20;
	var xLegendColour = '#000000';
	
	var yLegend = '';
	var yLegendSize = 20;
	var yLegendColour = '#000000';
	
	var lines; //array
	var lineDefault; //wtf
	
	var bgColour = '0xEFEFEF';
	var bgImage = '';
	var bgImageX = 0;
	var bgImageY = 0;
	
	var innerBgColour = '0xFFFFFF';
	var innerBgColour2 = '';
	var innerBgAngle = '';
	
	var zoomActive = false;
	
	var maxLimit;
	var maxLimit2;
	var minLimit;
	var minLimit2;
	
	var limitAxis = 'Y';
	
	this.setFlashObject = setFlashObject;
	
	this.initGraph = initGraph;
	this.setData = setData;
	
	function setFlashObject(obj) {
		flashObject = obj;
		flashObject.setGraphObject(this);
	}
	
	function initGraph() {
		flashObject.initGraph();
	}
	
	function setData(values, isDate) {
	
		if(isDate)
			values = processDate(values);
		
		valuesStr = "";
		xValuesStr = "";
		legendArray = new Array;
		linksArray = new Array;
		for (var i = 0; i < values.length; ++i) {
			valuesStr += values[i].YValue;
			xValuesStr += values[i].XValue;

			legendArray[i] = values[i].label;
			linksArray[i] = values[i].ids+"|";

			if(i!=values.length-1) {
				valuesStr+=","
				xValuesStr+=","
			}
			if(values[i].YValue > this.yMax)
				this.yMax = values[i].YValue;
		}
		this.values = valuesStr;
		this.valuesX = xValuesStr;
		this.xLabels = legendArray;
		this.links = linksArray;
		
	}
	
	this.values = values;
	this.xLabels = xLabels;
	this.yMax = yMax;
	this.xMax = xMax;
	this.xMin = xMin;
	this.values = values;
	this.valuesX = valuesX;
	this.links = links;
	this.maxXLabels = maxXLabels;
	this.zoomActive = zoomActive;
	this.maxLimit = maxLimit;
	this.maxLimit2 = maxLimit2;
	this.minLimit = minLimit;
	this.minLimit2 = minLimit2;
	this.limitAxis = limitAxis;
	this.clickCallbackFunc = clickCallbackFunc;
	
	function processDate(values) {
		var one_day=1000*60*60*24;
		var dateValues = [];
		for(var i=0; i < values.length; i++)
		{
			dateValues[i] = Date.parse(values[i].XValue);
			var dateDiff;
			if(i > 0)
			{
				dateDiff = Math.ceil((dateValues[i] - dateValues[0])/one_day);
				values[i].XValue = dateDiff;
			}
			else 
				values[i].XValue = 0;
			if(i == values.length -1)
				this.xMax = dateDiff;
		}
		
		this.xMin = 0;
		return values;
	}


	this.getChartHtml = function(chartFilePath, fileName,chartId,width,height,conceptId){
	    
		if(chartFilePath == null)
			chartFilePath = "./scripts/Openflashchart1.8/";
    	if(fileName == null)
			fileName = "open-flash-chart.swf";
		if(width==null)
	        width = "500";
	    if(height==null)
	        height="300";
        
		var  str = "<div id='div" + chartId + "'><OBJECT classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"" +  
			"codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0\"" +  
			"width=\""+width+"\" height=\""+height+"\" id=\""+chartId+"\" >" +
            "<param name=\"allowScriptAccess\" value=\"always\" />" +
            "<param name=\"movie\" value=\""+chartFilePath+fileName+"?width="+width+"&height="+height+"&conceptId=" + conceptId +"\" />"+
            "<param name=\"quality\" value=\"high\" />"+
            "<param name=\"bgcolor\" value=\"#FFFFFF\" />"+
            "<embed src=\""+chartFilePath+fileName+"?width="+width+"&height="+height+"&conceptId=" + conceptId +"\" " + " allowScriptAccess=\"always\"" +
            "quality=\"high\" " +
            "width=\""+width+"\" height=\""+height+"\" " +
            "name=\""+chartId+"\" type=\"application/x-shockwave-flash\" " +
            "pluginspage=\"http://www.macromedia.com/go/getflashplayer\" />"+
         "</OBJECT></div>";
		 
		return str;
	}
	   
}




function SparkLines()
{
	this.allData = "wtf";
	this.initSparkLine = function(conceptId)
	{
		//document.getElementById("outputs").innerHTML += " :" + conceptId + ": ";
		//initFlashElement(conceptId);
		for(var temp = 0; temp < this.allData.length; temp++)
		{
			if (conceptId == this.allData[temp].conceptId)
				sparkData = this.allData[temp];
		}
		//alert(conceptId + " -- " + sparkData.conceptId);
		if(sparkData != null)
		{
			var datesString = '';

			//For Non-IE Browsers only
			chartValuesX = sparkData.XValues;
			chartValuesY = sparkData.YValues;
			obsIdsString = sparkData.ObsIds;
			conceptName  = sparkData.conceptName;
			conceptId 	 = sparkData.conceptId;
			critLo		 = sparkData.critLo;
			critHi 		 = sparkData.critHi;
			normLo		 = sparkData.normLo;
			normHi		 = sparkData.normHi;
			flashMov = window.document["sparkline" + conceptId];
			//alert("sparkline" + conceptId);
			if(flashMov)
			{
				//Date Formats
				var graphValues = chartValuesY.split(",");
				var minVal = parseInt(graphValues[0]); var maxVal  = parseInt(graphValues[0]);
				for(var k = 0; k < graphValues.length; k++)
				{   var temp = parseFloat(graphValues[k]);
					if(minVal > temp)minVal = temp;
					if(maxVal < temp)maxVal = temp;
				}
				
				var dates = chartValuesX.split(',');
				var dateValues = [];
				var one_day=1000*60*60*24;
				for(var j=0; j < dates.length; j++)
				{
					dateValues[j] = Date.parse(dates[j]);
					var dateDiff;
					if(j > 0)
					{
						dateDiff = Math.ceil((dateValues[j] - dateValues[0])/one_day);
						datesString +=',' + dateDiff;
					}
					else
						datesString = '0';
					if(j == dates.length -1)
						xMax = dateDiff;
				}
				//alert(chartValuesY + "\nMinVal: " + minVal + "\nMaxVal: " + maxVal);
				//document.getElementById("hiddendata" + conceptId).innerHTML="Max:" + maxVal + " Min:" + minVal + " Current:" + graphValues[graphValues.length -1];
				
				sparkDataObject = new Object();
				sparkDataObject.conceptId 	= conceptId;
				sparkDataObject.values 		= chartValuesY;
				sparkDataObject.valuesX		= datesString;
				sparkDataObject.xMax 		= xMax + 5;
				sparkDataObject.xMin		= 0;
				sparkDataObject.valueMinY 	= minVal;
				sparkDataObject.valueMaxY 	= maxVal;
				sparkDataObject.critLo		= critLo;
				sparkDataObject.critHi		= critHi;
				sparkDataObject.normLo		= normLo;
				sparkDataObject.normHi		= normHi;		
				sparkDataObject.obsDateString = chartValuesX;
				
				flashMov.setGraphObject(sparkDataObject);
				//flashMov.initGraph();
			}
		}
	}
	
	this.initFlashGraph = function(conceptId)
	{
		for(var i = 0; i < this.allData.length; i++)
		{
			if(this.allData[i].conceptId == conceptId)
				chartData = this.allData[i];
		}
		
		if(chartData != null)
		{
			var datesString = '';
			//alert('chartdata not null: ' + "flashgraph" + conceptId);
			//For Non-IE Browsers only
			chartValuesX = chartData.XValues;
			chartValuesY = chartData.YValues;
			obsIdsString = chartData.ObsIds;
			conceptName  = chartData.conceptName;
			conceptId 	 = chartData.conceptId;
			critLo		 = chartData.critLo;
			critHi 		 = chartData.critHi;
			normLo		 = chartData.normLo;
			normHi		 = chartData.normHi;
			chartMov = window.document["flashgraph" + conceptId];
			
			//if(chartMov != null)
			//{
				//Date Formats
				//alert('flash found');
				var graphValues = chartValuesY.split(",");
				var minVal = parseInt(graphValues[0]); var maxVal  = parseInt(graphValues[0]);
				for(var k = 0; k < graphValues.length; k++)
				{   var temp = parseFloat(graphValues[k]);
					if(minVal > temp)minVal = temp;
					if(maxVal < temp)maxVal = temp;
				}
				
				var dates = chartValuesX.split(',');
				var dateValues = [];
				var one_day=1000*60*60*24;
				for(var j=0; j < dates.length; j++)
				{
					dateValues[j] = Date.parse(dates[j]);
					var dateDiff;
					if(j > 0)
					{
						dateDiff = Math.ceil((dateValues[j] - dateValues[0])/one_day);
						datesString +=',' + dateDiff;
					}
					else
						datesString = '0';
					if(j == dates.length -1)
						xMax = dateDiff;
				}
				graphDataObject = new Object();
				//ofcObject.setData(myArray);
				graphDataObject.title 		= conceptName;
				graphDataObject.conceptId 	= conceptId;
				graphDataObject.titleSize 	= 16;
				graphDataObject.titleColour = '#000000';
				graphDataObject.titlePadding = 0;
				graphDataObject.values		=chartValuesY;
				graphDataObject.valuesX		=datesString;
				graphDataObject.xMax 		= xMax + 5;
				graphDataObject.xMin 		= 0;
				graphDataObject.valueMinY 	= minVal;
				graphDataObject.valueMaxY 	= maxVal;
				graphDataObject.critLo		= critLo;
				graphDataObject.critHi		= critHi;
				graphDataObject.normLo		= normLo;
				graphDataObject.normHi		= normHi;	
				
				graphDataObject.yMax 		= maxVal + maxVal/20;
				graphDataObject.yMin 		= minVal - minVal/20;
				graphDataObject.bgColour	="0xEFEFEF";
				graphDataObject.innerBgColour="0xFFFFFF";
				graphDataObject.line_dot	=".5,0x555555,"+ conceptName +",10,5";
				graphDataObject.xLabels		=dates;
				graphDataObject.xLabelStyleSize = .01;
				
				graphDataObject.obsDateString = chartValuesX;
				chartMov.setGraphObject(graphDataObject);
				chartMov.initGraph();
			//}
		}
	}
	
}