﻿package TableWidget{
	

	import flash.display.MovieClip;
	import flash.text.TextField;
	import flash.text.TextFieldAutoSize;
	import fl.containers.ScrollPane;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.events.EventDispatcher;
	/**
	* This class is used to sort the particular column whose index will be provided.
	* @author Devender Gupta
	*/
	public class SortColumns extends EventDispatcher{
		
		private var arrColumnReferences:Array;
		private var arrRowReferences:Array;
		private var sortType:int;
		private var objWidgetController:WidgetController;
		private var objConfigXML:XML;
		private var xmlCaptivateParams:XML;
		public var selectedRow:int;
		public var selectedColumn:int;
		private var columnIndex:int;
		
		public function SortColumns(){
			
		}
		
		public function setReferences():void{
			objWidgetController = WidgetController.getInstance();
			objConfigXML = objWidgetController.objConfigXML;
			xmlCaptivateParams = objWidgetController.xmlCaptivateParams;
		}
		
		public function setRowReferences(arrRows:Array):void{
			arrRowReferences = arrRows;
		}
		
		public function setColumnReferences(arrColumns:Array):void{
			arrColumnReferences = arrColumns;
		}
		
		public function sortColumnAt(index:int, ascDesc:int){
			if(columnIndex == index && sortType == ascDesc){
				return;
			}
			columnIndex = index
			var arrTexts:Array = getColumnContent(index);
			sortType = ascDesc;
			var arrIndices:Array = arrTexts.sort(customComparisionFunction, 8);
			
			for(var i=0; i<arrIndices.length; i++){
				if(arrIndices[i] == 0){
					arrIndices.splice(i,1);
				}
			}
			arrIndices.unshift(0);
			
			setNewIndices(arrIndices);
			reflectSortOnCells();
		}
		
		private function reflectSortOnCells(){
			var arrTemp:Array;
			for(var i=0; i<arrColumnReferences.length; i++){
				arrTemp = arrColumnReferences[i].arrCellsReference
				for(var j=0;j<arrTemp.length; j++){
					var objCellClass = arrTemp[j] as CellClass;
					objCellClass.setColumnReference(arrColumnReferences[i]);
					objCellClass.setRowReference(arrRowReferences[j])
					if(j>0){
						objCellClass.y = arrTemp[j-1].y + arrTemp[j-1].Height;
					}else{
						objCellClass.y = int(objConfigXML.rowColumnGrid.@yPos) + int(objConfigXML.rowColumnGrid.@columnHeight);
					}
					
					
				}
				if(i==selectedColumn){
					arrTemp[selectedRow].setSelection(true);
				}
			}
			//arrRowReferences[selectedRow].currentSelectedColumn = arrColumnReferences[selectedColumn]
		}
		private function setNewIndices(arrIndices:Array){
			var arrDupCellRef:Array;
			for(var i=0; i<arrColumnReferences.length; i++){
				if(arrColumnReferences[i].currentSelectedCell != -1){
					selectedRow = arrColumnReferences[i].currentSelectedCell
					selectedColumn = i;
				}
				arrDupCellRef = new Array();
				for(var j=0;j<arrIndices.length; j++){
					arrDupCellRef.push(arrColumnReferences[i].arrCellsReference[arrIndices[j]])
				}
				arrColumnReferences[i].arrCellsReference = arrDupCellRef;
			}
			
			var objRowClass = RowClass.getInstance();
			var arrDupRowRef:Array = new Array();
			var arrDupRowAssets2:Array = new Array();
			for(i=0;i<arrIndices.length; i++){
				arrDupRowRef.push(arrRowReferences[arrIndices[i]])
				arrDupRowAssets2.push(objRowClass.arrRowsAssets[arrIndices[i]])
				arrDupRowRef[i].index = i;
				if(i>0){
					arrDupRowRef[i].yPos = arrDupRowRef[i-1].yPos + arrDupRowRef[i-1].rowHeight
					arrDupRowAssets2[i].y = arrDupRowAssets2[i-1].y + arrDupRowAssets2[i-1].bg.height;
				}else{
					arrDupRowRef[i].yPos = int(objConfigXML.rowColumnGrid.@yPos) + int(objConfigXML.rowColumnGrid.@columnHeight)
					arrDupRowAssets2[i].y = int(objConfigXML.rowColumnGrid.@yPos) + int(objConfigXML.rowColumnGrid.@columnHeight)
				}
				if (i != 0)
				{
					arrDupRowAssets2[i].tf.htmlText = objWidgetController.htmlize(i, "rowColumnGrid");
				}
				arrDupRowAssets2[i].tf.y = (arrDupRowAssets2[i].bg.height - arrDupRowAssets2[i].tf.height)/2
				arrDupRowAssets2[i].x = objConfigXML.rowColumnGrid.@xPos
			}
			for(i=arrRowReferences.length-1; i>=0; i--){
				arrRowReferences.splice(i,1);
				objRowClass.arrRowsAssets.splice(i,1);
			}
			
			for(i=0; i<arrDupRowRef.length; i++){
				arrRowReferences.push(arrDupRowRef[i]);
				objRowClass.arrRowsAssets.push(arrDupRowAssets2[i]);
			}
			/*var arrRef = objRowClass.getRowReferences();
			var arrDupRowRef:Array = new Array();
			var arrDupRowAssets2:Array = new Array();
			for(i=0;i<arrIndices.length; i++){
				arrDupRowRef.push(arrRowReferences[arrIndices[i]])
				arrDupRowAssets2.push(objRowClass.arrRowsAssets[arrIndices[i]])
				arrDupRowRef[i].index = i;
				if(i>0){
					arrDupRowRef[i].yPos = arrDupRowRef[i-1].yPos + arrDupRowRef[i-1].rowHeight
					arrDupRowAssets2[i].y = arrDupRowAssets2[i-1].y + arrDupRowAssets2[i-1].bg.height;
				}else{
					arrDupRowRef[i].yPos = int(objConfigXML.rowColumnGrid.@yPos) + int(objConfigXML.rowColumnGrid.@columnHeight)
					arrDupRowAssets2[i].y = int(objConfigXML.rowColumnGrid.@yPos) + int(objConfigXML.rowColumnGrid.@columnHeight)
				}
				arrDupRowAssets2[i].tf.htmlText = objWidgetController.htmlize(i+1, "rowColumnGrid");
				arrDupRowAssets2[i].tf.y = (arrDupRowAssets2[i].bg.height - arrDupRowAssets2[i].tf.height)/2
				arrDupRowAssets2[i].x = objConfigXML.rowColumnGrid.@xPos
				
			}
			
			
			for(i=arrRowReferences.length-1; i>=0; i--){
				arrRowReferences.splice(i,1);
				arrRef.splice(i,1);
				objRowClass.arrRowsAssets.splice(i,1);
			}
			arrRowReferences = arrDupRowRef;
			objRowClass.setRowReferences(arrDupRowRef);
			objRowClass.arrRowsAssets = arrDupRowAssets2;
			
			for(i=0; i<arrRowReferences.length; i++){
				arrRowReferences[i].arrRowReferences = arrDupRowRef;
			}*/
			objRowClass.deselectAllRows();
			for(i=0; i<arrColumnReferences.length; i++){
				var arrTexts:Array = getColumnContent(i);				
				for (j = 0; j < arrTexts.length; j++) {
					//trace("xmlCaptivateParams.column :::: "+xmlCaptivateParams.table);
					xmlCaptivateParams.table.column[i].row[j].cell[0] = arrTexts[j]
				}
			}
		}
		
		private function customComparisionFunction(obj1, obj2):Number{
			var arrTmp = new Array(obj1, obj2);
			var ret;
			if(!isNaN(obj1) && !isNaN(obj2)){
				
				if(obj1==obj2){
					ret = 0;
				}else if(sortType== Array.CASEINSENSITIVE){
					if(Number(obj1) > Number(obj2)){
						ret = 1;
					}else{
						ret = -1
					}
					
				}else{
					if(Number(obj1) > Number(obj2)){
						ret = -1;
					}else{
						ret = 1
					}
				}
			}else if(!isNaN(obj1)){
				if(sortType== Array.CASEINSENSITIVE){
					ret = -1;
				}else{
					ret = 1;
				}
			}else if(!isNaN(obj2)){
				if(sortType== Array.CASEINSENSITIVE){
					ret = 1;
				}else{
					ret = -1;
				}
			}else{
				arrTmp.sort(sortType);
				
				if(arrTmp[0] == obj1 && arrTmp[1] == obj2){
					ret = -1;
				}else{
					ret = 1
				}
				
			}
			
			return ret
		}
		
		private function getColumnContent(index:int):Array{
			var arrCells = arrColumnReferences[index].arrCellsReference
			//for(var i=0; i<arrCells.length; i++){
				//trace("Checking Index : "+ arrCells[i].rowRef.index)
			//}
			var arrTxt:Array = new Array();
			for(var i=0; i<arrCells.length; i++){
				var txt = arrCells[i].txtContent;
				var tf = new TextField();
				tf.htmlText = txt;
				txt = tf.text;
				arrTxt.push(txt);				
			}
			return arrTxt
		}
		
	}
}