/**
	version 2.1, 18.05.2010. Ken
*/

/**
* @desc: object of chart
* @param: containerId - id of external container
* @type: public
**/
function dhtmlXGridToChartObject (containerId) {
  	_self = this;
	_self.externalContainer = document.getElementById(containerId);
  	if (_self.externalContainer.style.width)  _self.externalContainer.width = parseInt(_self.externalContainer.style.width);
  	if (_self.externalContainer.style.height) _self.externalContainer.height = parseInt(_self.externalContainer.style.height);
	_self.sourceGrid = null;
  	_self.libName = "fly";
  	_self.libPath = "";  	
  	_self.libLoadStatus = false;
  	_self.chart	= null;
  	_self.chartType = "line";
  	_self.chartDataset = {};
  	_self.chartOptions;
  	_self.chartDataColInd;
  	_self.chartTicksColInd = null;
  	_self.maxValue;
  	_self.pointTitles = false;
	_self.chartBarWidth = 0;
	_self.activeColumnIds;
	_self.chartPreview = false;	
	_self.chartPreviewOptions;
	_self.chartPreviewContainer = null;
	_self.chartXMLData = "";//"<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
	_self.chartDefaultColors = ["edc240", "afd8f8", "cb4b4b", "4da74d", "9440ed"];
	_self.chartValuesColors = null;
	_self.dataPointRadius = 3;
	_self.debug = false;
	
	_self.scrollBorder = null;
	_self.scrollSliderBorder = null;
	_self.scrollSliderColor = null;
	_self.scrollImageColor = null;
	_self.shadowColor = null;
		
	_self.chartXMLData = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><graph top=\"60\" left=\"80\"><font><FontCaption font=\"Arial\" size=\"14\" color=\"000000\" bold=\"false\" italic=\"false\"/><FontBase font=\"Arial\" size=\"15\" color=\"000000\" bold=\"true\" italic=\"true\" align=\"right\"/><FontAxis font=\"Arial\" size=\"12\" color=\"555555\" bold=\"false\" italic=\"\"/><FontChart font=\"Arial\" size=\"11\" color=\"cccccc\" bold=\"true\" italic=\"false\"/><FontLegend font=\"Arial\" size=\"12\" color=\"000000\" bold=\"false\" italic=\"false\"/><FontTips font=\"Arial\" size=\"10\" color=\"000000\" bold=\"false\" italic=\"false\"/></font><tips font=\"FontTips\"><color>ffffff</color><borderColor>000000</borderColor></tips><chartScene width=\"450\" height=\"200\"><color>cccccc, ffffff, ffffff</color><opacity>30, 10, 10</opacity><border>2</border><borderColor>cccccc</borderColor></chartScene><grid><vertical>.1</vertical><verticalColor>c8c8c8</verticalColor><horizontal>.1</horizontal><horizontalColor>c8c8c8</horizontalColor></grid><axis xleft=\"5\" xbottom=\"3\" yleft=\"0\" ybottom=\"3\" font=\"FontAxis\"><x-axis stepWidth=\"100\"></x-axis><y-axis></y-axis></axis><caption caption=\"Sample\" font=\"FontCaption\"/><base color=\"000000\" font=\"FontBase\"/><chartstyle name=\"myline\"><type>column</type><font>FontChart</font><name>Sample</name><tips>on</tips><pointTitles>on</pointTitles><lineColor>bbc0f6</lineColor><color>bbc0f6</color><opacity>100</opacity><knotType>circle</knotType><knotSize>10</knotSize><line>1</line><nullLine>2</nullLine><columnTargetColor>FFFFFFF</columnTargetColor><columnWidth>30</columnWidth></chartstyle></graph>";
}

dhtmlXGridToChartObject.prototype.setChartDefaultColors = function(colorsArray){
	_self.chartDefaultColors = colorsArray;
}

dhtmlXGridToChartObject.prototype.setDebugMode = function(themode){
	_self.debug = themode;
}

dhtmlXGridToChartObject.prototype.setChartValuesColors = function(colorsArray){
	_self.chartValuesColors = colorsArray;
}

/**
*	@desc: set libraries path
*	@param: libPath
*	@type: public
**/
dhtmlXGridToChartObject.prototype.setLibPath = function(libPath){
	_self.libPath = libPath
}

/**
*	@desc: set library of chart
* 	@param: libName - library name
* 	@type: public
**/
dhtmlXGridToChartObject.prototype.setLib = function(libName){
  	_self.libName=libName;
  	switch(libName) {
		case "fly":
			_self._loadJSFile(_self.libPath+"fly/swfobject.js");
		break;		
	}
	_self._setDefaultOptions();	
}

dhtmlXGridToChartObject.prototype.loadLib = function(){

	if (_self.libPath) _self._loadJSFile(_self.libPath + "fly/swfobject.js");
	_self._setDefaultOptions();	
}

/**
* 	@desc: set source grid
* 	@param: gridObj - grid object
*	@type: public
**/
dhtmlXGridToChartObject.prototype.setSourceGrid = function(gridObj){
	_self.sourceGrid = gridObj;
}

/**														
* 	@desc: set type of chart (pie,line,bar)
* 	@param: chartType - grid object
* 	@type: public
**/
dhtmlXGridToChartObject.prototype.setChartType = function(chartType){
	_self.chartType = chartType;
	if ((chartType=="bar")&&(_self.libName=="fly"))
		_self.chartType="column";
}

/** 
* 	@desc: set column indexes of data in grid
* 	@param: colInd - column index
* 	@type: public
**/
dhtmlXGridToChartObject.prototype.setDataColumnIndex = function(colInd){
	_self.chartDataColInd = colInd;
}

/**
* 	@desc: set default options for chart
* 	@type: private 
**/
dhtmlXGridToChartObject.prototype._setDefaultOptions = function(){
  	switch(_self.libName) {
	}
}

dhtmlXGridToChartObject.prototype._changeXMLData3Tags = function (nodeName,nodeValue) {

	var nodeList = nodeName.split(".");
	
	var target = null;
	var injection = null;
	var val1text = null;
	var val2text = null;
	
	var curtext = _self.chartXMLData;
	
	if (nodeList.length < 2) return false;
	
	if (nodeList[2])
	{
		//find root tag
		var tagstart = curtext.indexOf("<" + nodeList[0] + ">");
		if (tagstart == -1) tagstart = curtext.indexOf("<" + nodeList[0] + " ");
		
		if (tagstart != -1)
			val1text = curtext.substr(tagstart, curtext.lastIndexOf("</"+nodeList[0]+">")-tagstart+("</"+nodeList[0]+">").length);
		//create if not found
		else val1text = "<" + nodeList[0] + "></" + nodeList[0] + ">";
			
		nodeName = nodeList[1] + "." + nodeList[2];
		nodeList = nodeName.split(".");
	}
	
	curtext = val1text?val1text:curtext;
	
	if (nodeList[1])
	{
		//find 2nd level tag
		var tagstart = curtext.indexOf("<" + nodeList[0] + ">");
		if (tagstart == -1) tagstart = curtext.indexOf("<" + nodeList[0] + " ");
		
		if (tagstart != -1)
			val2text = curtext.substr(tagstart, curtext.lastIndexOf("</"+nodeList[0]+">")-tagstart+("</"+nodeList[0]+">").length);
		//create if not found
		else val2text = "<" + nodeList[0] + "></" + nodeList[0] + ">";
			
		nodeName = nodeList[1];
		nodeList = nodeName.split(".");
	}
	
	curtext = val2text?val2text:curtext;
	
	if (nodeList[0])
	{
		//find value tag
		var tagstart = curtext.indexOf("<" + nodeList[0] + ">");
		if (tagstart == -1) tagstart = curtext.indexOf("<" + nodeList[0] + " ");
		if (tagstart != -1)
		{
			//if such tag exists already => remove it and update with new value
			var i = curtext.lastIndexOf("</" + nodeList[0] + ">");
			if (i != -1)
				curtext = curtext.substr(0, tagstart) + "<" + nodeList[0] + ">" + nodeValue + "</" + nodeList[0] + ">" +
				curtext.substring(i + 3 + nodeList[0].length);
		}
		else
		{
			//if such tag is absent - get closing tag and insert node tag before it
			var i = curtext.lastIndexOf("</");
			if (i != -1)
				curtext = curtext.substr(0, i) + "<" + nodeList[0] + ">" + nodeValue + "</" + nodeList[0] + ">" + curtext.substring(i);
		}
	}
	
	if (val1text && val2text)
	{
		//if 3 tags set
		var i = val1text.indexOf(val2text);
		if (i != -1) 
			curtext = val1text.substr(0, i) + curtext + val1text.substring(i + val2text.length);
	}
	else if (val2text)
	{
		//if 2 tags set
		val1text = val2text;
	}
	
	if (val1text)
		//make final changes
		_self.chartXMLData = _self.chartXMLData.replace(val1text, curtext);
		
	return true;
}

/**
*	@desc: add XML params
*	@param: nodeName - option name (e.g. graph.grid.color)
*	@param: nodeValue - option value
*	@param: paramName - option attribute name
*	@param: paramvalue - option attribute value
*	@param: type - type of operation (add,del or edit)
**/
dhtmlXGridToChartObject.prototype._addXMLData = function (nodeName,nodeValue,paramName,paramValue,type) {
  	var nodeList = nodeName.split(".");
  	if (type=="del") {	
		var openTagEndChar = _self.chartXMLData.substr(_self.chartXMLData.indexOf("<"+nodeList[nodeList.length-1])+("<"+nodeList[nodeList.length-1]).length,1);
		_self.chartXMLData =_self.chartXMLData.substr(0,_self.chartXMLData.lastIndexOf("<"+nodeList[nodeList.length-1]+openTagEndChar))+
				   _self.chartXMLData.substr(_self.chartXMLData.lastIndexOf("</"+nodeList[nodeList.length-1]+">")+("</"+nodeList[nodeList.length-1]+">").length);
		return;
	}
 	if (nodeList.length>1) {
  		if ((_self.chartXMLData.indexOf("<"+nodeList[0]+">")==-1)&&(_self.chartXMLData.indexOf("<"+nodeList[0]+" ")==-1))
		  	_self.chartXMLData+="<"+nodeList[0]+"></"+nodeList[0]+">";
		if (type=="add"&&nodeList.length==2) {
  			  	_self.chartXMLData = _self.chartXMLData.substr(0,_self.chartXMLData.lastIndexOf("</"+nodeList[0]+">"))+
  						 			"<"+nodeList[1]+(paramName&&nodeList.length==2?" "+paramName+"=\""+paramValue+"\"":"")+">"+(nodeValue&&nodeList.length==2?nodeValue:"")+"</"+nodeList[1]+">"+
  						 			_self.chartXMLData.substr(_self.chartXMLData.lastIndexOf("</"+nodeList[0]+">"));  				
	  	} else {
		    var parentNodeAsText = "";
			if (_self.chartXMLData.indexOf("<"+nodeList[0]+" ")!=-1)
				parentNodeAsText = _self.chartXMLData.substr(_self.chartXMLData.lastIndexOf("<"+nodeList[0]+" "),
					  			   _self.chartXMLData.lastIndexOf("</"+nodeList[0]+">")-_self.chartXMLData.lastIndexOf("<"+nodeList[0]+" ")+("</"+nodeList[0]+">").length);
			else 
				parentNodeAsText = _self.chartXMLData.substr(_self.chartXMLData.indexOf("<"+nodeList[0]+">"),
					  			   _self.chartXMLData.indexOf("</"+nodeList[0]+">")-_self.chartXMLData.indexOf("<"+nodeList[0]+">")+("</"+nodeList[0]+">").length);
					  			   
	  	  	if ((parentNodeAsText.indexOf("<"+nodeList[1]+">")==-1)&&(parentNodeAsText.indexOf("<"+nodeList[1]+" ")==-1)) {
  			  	_self.chartXMLData = _self.chartXMLData.substr(0,_self.chartXMLData.lastIndexOf("</"+nodeList[0]+">"))+
  						 			"<"+nodeList[1]+(paramName&&nodeList.length==2?" "+paramName+"=\""+paramValue+"\"":"")+">"+(nodeValue&&nodeList.length==2?nodeValue:"")+"</"+nodeList[1]+">"+
  						 			_self.chartXMLData.substr(_self.chartXMLData.lastIndexOf("</"+nodeList[0]+">"));  				
			}
  			else if (nodeList.length==2) {
  			  	if (_self.chartXMLData.indexOf("<"+nodeList[1]+" ")!=-1)
					var openTagEndChar = _self.chartXMLData.substr(_self.chartXMLData.indexOf("<"+nodeList[1]+" ")+("<"+nodeList[1]).length,1);
				else
					var openTagEndChar = _self.chartXMLData.substr(_self.chartXMLData.indexOf("<"+nodeList[1]+">")+("<"+nodeList[1]).length,1);
				  	var nodeAsText = _self.chartXMLData.substr(_self.chartXMLData.lastIndexOf("<"+nodeList[1]+openTagEndChar),
					  				 _self.chartXMLData.indexOf(">",_self.chartXMLData.lastIndexOf("<"+nodeList[1]+openTagEndChar))-_self.chartXMLData.lastIndexOf("<"+nodeList[1]+openTagEndChar)+1)
					var nodeAsValue = _self.chartXMLData.substr(_self.chartXMLData.indexOf(">",_self.chartXMLData.lastIndexOf("<"+nodeList[1]+openTagEndChar))+1,
									  _self.chartXMLData.indexOf("<",_self.chartXMLData.indexOf(">",_self.chartXMLData.lastIndexOf("<"+nodeList[1]+openTagEndChar)))-_self.chartXMLData.indexOf(">",_self.chartXMLData.lastIndexOf("<"+nodeList[1]+openTagEndChar))-1)
					//Node params and value replacing block															  
					if ((paramName!="")&&nodeAsText.indexOf(paramName+"=")!=-1) {
						nodeAsText = nodeAsText.substr(0,nodeAsText.indexOf("\"",nodeAsText.indexOf(paramName+"=")))+
									 "\""+paramValue+"\""+
									 nodeAsText.substr(nodeAsText.indexOf("\"",nodeAsText.indexOf("\"",nodeAsText.indexOf(paramName+"="))+1)+1)
					}
					//Node params and value add block
					else {
						nodeAsText = nodeAsText.substr(0,nodeAsText.length-1)+(paramName?" "+paramName+"=\""+paramValue+"\"":"")+">";
					}
					nodeAsValue = (nodeValue?nodeValue:"")
					_self.chartXMLData = _self.chartXMLData.substr(0,_self.chartXMLData.lastIndexOf("<"+nodeList[1]+openTagEndChar))+
										 nodeAsText+nodeAsValue+
					  				 _self.chartXMLData.substr(_self.chartXMLData.indexOf("<",_self.chartXMLData.indexOf(">",_self.chartXMLData.lastIndexOf("<"+nodeList[1]+openTagEndChar))))//-_self.chartXMLData.indexOf("<"+nodeList[1]+" ")))
			}			
		}
		if (nodeList.length>2) {
		  	nodeList.splice(0,1);
		  	_self._addXMLData(nodeList.join("."),nodeValue,paramName,paramValue,type)
		}
	} else 
		if (_self.chartXMLData.indexOf(nodeName)==-1)
			_self.chartXMLData+="<"+nodeName+(paramName?" "+paramName+"=\""+paramValue+"\"":"")+">"+(nodeValue?nodeValue:"")+"</"+nodeName+">";
		else {
  			  	if (_self.chartXMLData.indexOf("<"+nodeName+" ")!=-1)
					var openTagEndChar = _self.chartXMLData.substr(_self.chartXMLData.indexOf("<"+nodeName+" ")+("<"+nodeName).length,1);
				else
					var openTagEndChar = _self.chartXMLData.substr(_self.chartXMLData.indexOf("<"+nodeName+">")+("<"+nodeName).length,1);
		  	var nodeAsText = _self.chartXMLData.substr(_self.chartXMLData.lastIndexOf("<"+nodeName+openTagEndChar),
			  				 _self.chartXMLData.indexOf(">",_self.chartXMLData.lastIndexOf("<"+nodeName+openTagEndChar))-_self.chartXMLData.lastIndexOf("<"+nodeName+openTagEndChar)+1)
			var nodeAsValue = _self.chartXMLData.substr(_self.chartXMLData.indexOf(">",_self.chartXMLData.lastIndexOf("<"+nodeName+openTagEndChar))+1,
							  _self.chartXMLData.indexOf("<",_self.chartXMLData.indexOf(">",_self.chartXMLData.lastIndexOf("<"+nodeName+openTagEndChar)))-_self.chartXMLData.indexOf(">",_self.chartXMLData.lastIndexOf("<"+nodeName+openTagEndChar))-1)
			//Node params and value replacing block															  
			if ((paramName!="")&&nodeAsText.indexOf(paramName+"=")!=-1) {
				nodeAsText = nodeAsText.substr(0,nodeAsText.indexOf("\"",nodeAsText.indexOf(paramName+"=")))+
							 "\""+paramValue+"\""+
							 nodeAsText.substr(nodeAsText.indexOf("\"",nodeAsText.indexOf("\"",nodeAsText.indexOf(paramName+"="))+1)+1)
			}
			//Node params and value add block
			else {
				nodeAsText = nodeAsText.substr(0,nodeAsText.length-1)+(paramName?" "+paramName+"=\""+paramValue+"\"":"")+">";
			}
			nodeAsValue = (nodeValue?nodeValue:"")
			_self.chartXMLData = _self.chartXMLData.substr(0,_self.chartXMLData.lastIndexOf("<"+nodeName+openTagEndChar))+
								 nodeAsText+nodeAsValue+
			  				 _self.chartXMLData.substr(_self.chartXMLData.indexOf("<",_self.chartXMLData.indexOf(">",_self.chartXMLData.lastIndexOf("<"+nodeName+openTagEndChar))))//-_self.chartXMLData.indexOf("<"+nodeList[1]+" ")))					  				
		}
}

/**
*	@desc: add option for chart
*	@param: variable - needed to switch between main options and previewOptions
*	@param: field - option field name (e.g. grid.color)
*	@param: value - option value
*	@type: private
**/
dhtmlXGridToChartObject.prototype._addChartOption = function (variable,field,value) {
		var fieldsList = field.toString().split(".");
		  	if (fieldsList.length>1) {
		  	  	if (!variable[fieldsList[0]]) variable[fieldsList[0]]={};
		  	  	_self._addChartOption(variable[fieldsList.splice(0,1)],fieldsList.join("."),value);
			} else 
				variable[fieldsList[0]]=value;
}



/**
* 	@desc: set options for chart
*	@param: opiton name
* 	@param: opiton value
*	@param: preview enable (true/false)
* 	@type: public
**/
dhtmlXGridToChartObject.prototype.setChartOption = function(optName,optValue,preview){
	switch(_self.libName) {
		case "fly":
			switch(optName) {
				
	//#######	CHART
				case "chartColors" :
					_self.chartDefaultColors= optValue.replace(/#/g,"").toString().split(",");
					break;
				case "chartSizes" :
					_self._addXMLData("graph.chartScene","","width",optValue[0]);
					_self._addXMLData("graph.chartScene","","height",optValue[1]);
					break;
				case "chartPosition" :
					_self._addXMLData("graph","","left",optValue[0]);
					_self._addXMLData("graph","","top",optValue[1]);
					break;
				case "autoXAxis" :
					//0, 1, 2, 3, 4 - start, end, step, gridWidth, stepWidth
					if (optValue[0] || optValue[0] == 0) _self._addXMLData("graph.axis.x-axis","","start", optValue[0]);
					if (optValue[1]) _self._addXMLData("graph.axis.x-axis","","end", optValue[1]);
					if (optValue[2]) _self._addXMLData("graph.axis.x-axis","","step", optValue[2]);
					if (optValue[3]) _self._addXMLData("graph.axis.x-axis","","gridWidth", optValue[3]);
					if (optValue[4]) _self._addXMLData("graph.axis.x-axis","","stepWidth", optValue[4]);
					break;
					
				case "autoYAxis" :
					//0, 1, 2, 3 - start, end, step, gridWidth
					if (optValue[0] || optValue[0] == 0) _self._addXMLData("graph.axis.y-axis","","start", optValue[0]);
					if (optValue[1]) _self._addXMLData("graph.axis.y-axis","","end", optValue[1]);
					if (optValue[2]) _self._addXMLData("graph.axis.y-axis","","step", optValue[2]);
					if (optValue[3]) _self._addXMLData("graph.axis.y-axis","","gridWidth", optValue[3]);
					break;
					
				case "YAxisInterval" :
					//0, 1, 2 - valueinterval, interval, intervalLine
					if (optValue[0]) _self._addXMLData("graph.axis.y-axis","","valueinterval", optValue[0]);
					if (optValue[1]) _self._addXMLData("graph.axis.y-axis","","interval", optValue[1]);
					if (optValue[2]) _self._addXMLData("graph.axis.y-axis","","intervalLine", optValue[2]);
					break;
					
				case "chartBorder" :
					_self._changeXMLData3Tags("graph.chartScene.border", optValue);
					break;
				case "chartBorderColor" :
					_self._changeXMLData3Tags("graph.chartScene.borderColor", optValue.replace(/#/g,""));
					break;
				case "chartBGColor" : 
					//_self._addXMLData("graph.chartScene.color", optValue.replace(/#/g,""));
					_self._changeXMLData3Tags("graph.chartScene.color", optValue.replace(/#/g,""));
					break;
				case "chartBGOpacity" : 
					_self._changeXMLData3Tags("graph.chartScene.opacity", optValue);
					break;
				case "caption" : 
					_self._addXMLData("graph.caption","","caption", optValue);
					break;
				case "caption-x" : 
					_self._addXMLData("graph.axis","","xname", optValue);
					break;
				case "caption-y" : 
					_self._addXMLData("graph.axis","","yname", optValue);
					break;
				case "gridColor" :
					_self._addXMLData("graph.grid.verticalColor",optValue);
					//_self._changeXMLData3Tags("graph.grid.verticalColor", optValue.replace(/#/g,""));
					_self._addXMLData("graph.grid.horizontalColor",optValue);
					_self._addXMLData("graph.grid.verticalMarkColor",optValue);
					_self._addXMLData("graph.grid.horizontalMarkColor",optValue);
					break;
				case "chartLabelsColor" :
					_self._addXMLData("graph.font.axisFont","","color",optValue.replace(/#/g,""));
					break;		
					
				case "showLabels" :
					if (optValue===false)
						_self.chartTicksColInd = null;
					break;
				case "tipMask" :
					_self._changeXMLData3Tags("graph.tips.mask", optValue);
					//_self._addXMLData("graph.tips.mask", optValue);
					break;
				case "labelsColInd" :	
					_self.chartTicksColInd = optValue;
					break;
				case "rotation" :	
					_self._addXMLData("graph.axis.x-axis","","rotation","on");
					break;
				case "xStepWidth" :
				  	_self._addXMLData("graph.axis.x-axis","","stepWidth",optValue);
					break;		
				case "fill" :
					if (optValue==true)
					_self.chartType = "area";
//						_self.chartXMLData.replace(/"line"/g,"area");				
					break;
				case "showDataPoints":
			  		_self.dataPointRadius = 0;
					break;
				case "barWidth":
						_self.chartBarWidth = optValue;
					break;				
				case "showPointTitles":
						_self.pointTitles = optValue;
					break;
					
				case "3DShadowColor":
						_self.shadowColor = optValue;
					break;
				case "chart3D":
					{
						if (optValue) 
						{
							var dtype = optValue;
							if (dtype != "3D" && dtype != "cascade" && dtype != "volume") dtype = "cascade";
							var scene = "<chartScene3D type=\"" + dtype + "\"><border></border><borderColor></borderColor><depthy>3</depthy><depthx>10</depthx><indentHeight>30</indentHeight><indentDepth>40</indentDepth><colorLight>fafafa</colorLight><colorNormal>efefef</colorNormal><colorDark>dedede</colorDark><shadowColor>" + (_self.shadowColor?_self.shadowColor:"c6e2ff") + "</shadowColor><chartPadding>10</chartPadding></chartScene3D>";
							var i = _self.chartXMLData.indexOf("</font>");
							if (i != -1) _self.chartXMLData = _self.chartXMLData.substring(0, i + 7) + scene + _self.chartXMLData.substring(i + 7);
						}
					}
				break;
				
	//#######	LEGEND
				case "legendLeftPosition" :
					_self._addXMLData("graph.legend","","left",optValue);
					break;
				case "legendBGOpacity" :
					_self._addXMLData("graph.legend.opacity",optValue);
					break;
				case "legendLabelsColor" :
					_self._addXMLData("graph.font.legendFont","","color",optValue.replace(/#/g,""));
					break;
				case "legendBGColor":
					_self._addXMLData("graph.legend.color",optValue.replace(/#/g,""));
					break;
				case "legendWidth":
					_self._addXMLData("graph.legend","","width",optValue);
					break;
				case "legendHeight":
					_self._addXMLData("graph.legend","","height",optValue);
					break;
				case "legendBorder":
					_self._addXMLData("graph.legend.border",optValue);
					break;
				case "legendBorderColor":
					_self._addXMLData("graph.legend.borderColor",optValue.replace(/#/g,""));
					break;
				case "showLegend":
					{
						if (optValue) 
						{
							_self._addXMLData("graph.legend","","position","right");
							_self._addXMLData("graph.legend","","font","legendFont");
							//_self._addXMLData("graph.legend.border","1");
							//_self._addXMLData("graph.legend.borderColor","FFFFFF");
							//_self._addXMLData("graph.legend.color"," FFFFFF");
							//_self._addXMLData("graph.legend.opacity","10, 50");
						} else {
							_self._addXMLData("graph.legend","","","","del");
						}
					}
				break;
					
				case "pointsRadius":				
					_self.dataPointRadius = optValue;
					break;
					
				case "scrollBorder":				
					_self.scrollBorder = optValue;
				break;
				case "scrollSliderBorder":				
					_self.scrollSliderBorder = optValue;
				break;
				case "scrollSliderColor":				
					_self.scrollSliderColor = optValue;
				break;
				case "scrollImageColor":				
					_self.scrollImageColor = optValue;
				break;
					
				case "showSlider":
					if (optValue) {
						
						_self._addXMLData("graph.chartScene","","height",_self.externalContainer.height-150);					//Navigation
						_self._addXMLData("graph.scroll","","position","bottom");
						_self._addXMLData("graph.scroll","","height","50");
						_self._addXMLData("graph.scroll.border", _self.scrollBorder && _self.scrollBorder[0]?_self.scrollBorder[0]:"1");
						_self._addXMLData("graph.scroll.borderColor", _self.scrollBorder && _self.scrollBorder[1]?_self.scrollBorder[1]:_self.chartDefaultColors[0]);		
						_self._addXMLData("graph.scroll.sliderBorder", _self.scrollSliderBorder && _self.scrollSliderBorder[0]?_self.scrollSliderBorder[0]:"1");
						_self._addXMLData("graph.scroll.sliderBorderColor", _self.scrollSliderBorder && _self.scrollSliderBorder[1]?_self.scrollSliderBorder[1]:_self.chartDefaultColors[1]);
						_self._addXMLData("graph.scroll.sliderColor", _self.scrollSliderColor && _self.scrollSliderColor[0]?_self.scrollSliderColor[0]:(_self.chartDefaultColors[0]+","+_self.chartDefaultColors[1]+","+_self.chartDefaultColors[1]+","+_self.chartDefaultColors[0]));
						_self._addXMLData("graph.scroll.sliderOpacity", _self.scrollSliderColor && _self.scrollSliderColor[1]?_self.scrollSliderColor[1]:"40, 20, 20, 40");
						_self._addXMLData("graph.scroll.pictureColor", _self.scrollImageColor?_self.scrollImageColor:_self.chartDefaultColors[1]);
					} else {
						_self._addXMLData("graph.scroll","","","","del");
						_self._addXMLData("graph.chartScene","","height",_self.externalContainer.height-50);
					}
				break;
			}
			break;		
	}  	
}

/** 
* 	@desc: get data from dhtmlXGrid and prepare their for Chart 
* 	@type: private
**/
dhtmlXGridToChartObject.prototype._setChartDataset = function(){
  	var colIndexes = _self.chartDataColInd.toString().split(",");
	switch(_self.libName) {
		case "fly":
			//_self.chartDataset = 
				if (_self.chartTicksColInd) {
					var tmp = new Array;					  
					for (var i=0;i<_self.sourceGrid.getRowsNum();i++) {
						_self._addXMLData("graph.axis.x-axis.col",_self.sourceGrid.cells2(i,_self.chartTicksColInd).getValue(),"","","add");
					}
				}
//			if (_self.chartType=="bar")			
//				_self.chartBarWidth = (_self.sourceGrid.getRowsNum()-(_self.sourceGrid.getRowsNum()-1)*0.25)/(_self.sourceGrid.getRowsNum()*colIndexes.length);
			
			for (j=0;j<colIndexes.length;j++) {
			  			//Chart default style
						_self._addXMLData("graph.chartstyle","","name","defstyle"+j,"add");
						_self._addXMLData("graph.chartstyle.type",_self.chartType);
						_self._addXMLData("graph.chartstyle.font","FontChart");
						_self._addXMLData("graph.chartstyle.name",_self.sourceGrid.getHeaderCol(colIndexes[j]));
						_self._addXMLData("graph.chartstyle.tips","on");
						_self._addXMLData("graph.chartstyle.pointTitles",(_self.pointTitles?"on":"off"));
						_self._addXMLData("graph.chartstyle.lineColor",_self.chartDefaultColors[j]);
						_self._addXMLData("graph.chartstyle.color",_self.chartDefaultColors[j]);
						_self._addXMLData("graph.chartstyle.opacity","70, 10");
						_self._addXMLData("graph.chartstyle.knotType","circle");
						_self._addXMLData("graph.chartstyle.knotSize",(_self.dataPointRadius>0?parseInt(_self.dataPointRadius)*2:1));
						_self._addXMLData("graph.chartstyle.line","1");
						_self._addXMLData("graph.chartstyle.nullLine","2");
						_self._addXMLData("graph.chartstyle.columnTargetColor","FFFFFFF");
						_self._addXMLData("graph.chartstyle.columnWidth",(_self.chartBarWidth==0?15:_self.chartBarWidth));
						
		  		_self._addXMLData("graph.chart","","chartstyle","defstyle"+j,"add");
				for (var i=0;i<_self.sourceGrid.getRowsNum();i++) {
					_self._addXMLData("graph.chart.set","","name",(_self.chartTicksColInd?_self.sourceGrid.cells2(i,_self.chartTicksColInd).getValue():""),"add");
					_self._addXMLData("graph.chart.set","","value",_self.sourceGrid.cells2(i,colIndexes[j]).getValue());
					var setColor = _self.chartValuesColors && _self.chartValuesColors[i]?_self.chartValuesColors[i]:_self.chartDefaultColors[j];
					_self._addXMLData("graph.chart.set","","color",setColor);
				}
			}
	}
}

/**
* 	@desc: function for show large preview (only for "Flot")
* 	@param: mode - switch preview on/off
* 	@param: w - width
* 	@param: h - height
* 	@type: public
**/
dhtmlXGridToChartObject.prototype.enablePreview = function(mode,w,h) {
  	_self.chartPreview = mode;
	_self.chartPreviewContainer = document.createElement("div");
	_self.chartPreviewContainer.style.width  	= (w ||"530px");
	_self.chartPreviewContainer.style.height 	= (h ||"300px");
	_self.chartPreviewContainer.style.display 	= "none";
	_self.chartPreviewContainer.style.position 	= "absolute";
	document.getElementsByTagName("body")[0].appendChild(_self.chartPreviewContainer);
	_self.externalContainer.onmousedown = function () {
		_self.chartPreviewContainer.style.display = "";
		_self.chartPreviewContainer.style.top = (document.body.clientHeight || innerHeight)/2-parseInt(_self.chartPreviewContainer.style.height)/2;		
		_self.chartPreviewContainer.style.left = (document.body.clientWidth || innerWidth)/2-parseInt(_self.chartPreviewContainer.style.width)/2;				
		document.body.onmouseup = function () {
			document.body.onmouseup = null;
			_self.chartPreviewContainer.style.display = "none";
		}
	  }
}

/**
* 	@desc: function which render a chart
* 	@type: public
**/
dhtmlXGridToChartObject.prototype.draw = function() {
	if (!_self.libLoadStatus) {
		window.setTimeout(function(){_self.draw()},100)
		return;
	}
	if (_self.chart) return;
	if ((!_self.libName)||(!_self.sourceGrid)||(!_self.chartDataColInd)) return;
	_self._setChartDataset();	
	switch(_self.libName) {			
		case "fly" :
			var so = new SWFObject(_self.libPath+"fly/FlyCharts2.swf?dataUrl=dummy%2Fxml","graph",_self.externalContainer.width,_self.externalContainer.height,"8","#FFFFFF");
			so.addParam("scale", "noscale");
			so.addParam("salign", "lt");
			so.addParam("allowScriptAccess", "always");
			so.write(_self.externalContainer.id);
			var flash =  navigator.appName.indexOf("Microsoft") != -1?window["graph"]:document["graph"];
			flash = flash && flash.length?flash[1]:flash;
			window.setTimeout(function() {
			  											  
			  								if (flash)
											{
												//if (_self.debug && console && console.log) console.log(_self.chartXMLData);
												if (flash.refresh) flash.refresh(_self.chartXMLData);
												//else if (console) console.log("fail");
											}
										 }
								,500);
			
		break;
	} 
}

/**
* 	@desc: preload JS files(libraries)
*	@param: filenames - JS filenames list with comma-splitter
* 	@type: _private
**/
dhtmlXGridToChartObject.prototype._loadJSFile = function(filenames) {
	var head = document.getElementsByTagName('head')[0]
	var script = document.createElement('script');
	var fileNamesArr = filenames.split(",");
	script.src = fileNamesArr[0];
	script.type = 'text/javascript';
	script.onreadystatechange = script.onload = function () {
		if ((!this.readyState)||(this.readyState=="complete")||(this.readyState=="loaded")) {
		  	fileNamesArr.splice(0,1);
		  	if (fileNamesArr.length>0) {
		  	  	filenames = fileNamesArr.join();
		  		_self._loadJSFile(filenames);
			} else {
				_self.libLoadStatus = true;
			    this.onreadystatechange = null;
			    return true;
			}
		}
	}
	
	head.appendChild(script)
}

