﻿package TableWidget
{
	import flash.events.Event;
	import flash.events.EventDispatcher;
	import flash.events.IOErrorEvent;
	import flash.net.URLLoader;
	import flash.net.URLRequest;
	
	/**
	 * ...
	 * @author Devender Gupta
	 */
	public class CSVParser extends EventDispatcher
	{
		private var fileLoader:URLLoader;
		private var requiredFor:String;
		private var strRawData:String;
		private var arrRows:Array;
		private var tableFontFormatter:String;
		private var tableHeaderFontFormatter:String;
		//private var arrYAxis:Array;
		//private var arrXAxis:Array;
		
		public var xml:XML
				
		public function CSVParser(strSchema:String) {
			//<table><column><row><cell bgColor="" borderColor=""></cell></row></column></table>
			//<table><row><column>X/Y*</column></row></table>
			requiredFor = strSchema;
		}
		
		public function setProperties(xmlProperties:XMLList) {
			//var strFonts = < font face = "" size = "" color = ""
			//<font face="Arial" style="" size="12"/><textDecoration bold="false" underline="false" italic="false"/>
			tableFontFormatter = '<font face="' + xmlProperties.font.@face + '" size="' + xmlProperties.font.@size + '" color="' + formatColor(xmlProperties.color.@textColor) + '">'
			tableHeaderFontFormatter = '<font face="'+xmlProperties.font.@face+'" size="'+xmlProperties.font.@size+'" color="#FFFFFF">'
		}
		
		private function formatColor(strColor:String):String
		{
			return strColor.substring(2, strColor.length);
		}
		public function loadFile(fileText:String):void
		{
			/*fileLoader = new URLLoader();
			fileLoader.addEventListener(IOErrorEvent.IO_ERROR, IOErrorHandler)
			fileLoader.addEventListener(Event.COMPLETE, fileLoaded);
			fileLoader.load(new URLRequest(filePath));*/
			strRawData = fileText;
			fileLoaded(null);
		}
		
		private function IOErrorHandler(e:IOErrorEvent):void 
		{
			dispatchEvent(new IOErrorEvent(IOErrorEvent.IO_ERROR));
		}
		
		private function fileLoaded(e:Event):void 
		{
			if(requiredFor == "table"){
				createTableXML();
			}else if (requiredFor == "charts") {
				createChartsXML();
			}
		}
		
		private function createTableXML():void
		{
			parseData();
			var len:int = arrRows.length;
			var strXML:String = '<table>'
			var maxCols:int = 0;
			for (var i = 0; i < len; i++) {
				maxCols = Math.max(maxCols, arrRows[i].length);
			}
			
			for ( i = 0; i < maxCols; i++) {
				strXML += '<column>'
				for (var j = 0; j < len; j++) {
					if (j == 0) {
						strXML += ('<row><cell bgColor="" borderColor="">' + tableHeaderFontFormatter)
					}else{
						strXML += ('<row><cell bgColor="" borderColor="">' + tableFontFormatter)
					}
					if (i >= arrRows[j].length) {
						strXML += "";
					}else{
						strXML += arrRows[j][i];
					}
					strXML += '</font></cell></row>'
				}
				strXML += '</column>'
			}
			strXML += '</table>'
			XML.prettyIndent = 0;
			XML.prettyPrinting = false;
			xml = new XML(strXML);
			dispatchEvent(new Event(Event.COMPLETE));
		}
		
		private function createChartsXML():void
		{
			parseData();
			var len:int = arrRows.length;
			var strXML:String = '<table>'	
			for (var i = 0; i < len; i++) {
				var col:int = arrRows[i].length
				strXML += '<row>'
				for (var j = 0; j < len; j++) {
					strXML += '<column>'
					if (i != 0 || j != 0) {
						strXML += arrRows[j][i];
					}else{
						strXML += 'X/Y*';
					}
					strXML += '</column>'
				}
				strXML += '</row>'
			}
			strXML += '</table>'
			xml = new XML(strXML);		
			dispatchEvent(new Event(Event.COMPLETE));
		}
		
		private function parseData():void
		{
			
			if(strRawData.indexOf("\r") != -1){
				arrRows = strRawData.split("\r");
			}else if(strRawData.indexOf("\r") != -1){
				arrRows = strRawData.split("\n");
			}else {
				arrRows = new Array(strRawData);
			}
			if (arrRows[arrRows.length - 1] == "") {
				arrRows.pop();
			}
			var numItems:int = arrRows.length;
			for (var i = 0; i < numItems; i++) {
				var strTemp = arrRows[i];
				arrRows[i] = strTemp.split(",");
			}
		}
		
	}
	
}