﻿package TableWidget{
	

	import flash.display.MovieClip;
	import flash.text.TextField;
	import flash.text.TextFieldAutoSize;
	import fl.containers.ScrollPane;
	import flash.events.MouseEvent;
	import flash.events.Event;
	import flash.events.EventDispatcher;
	import flash.xml.XMLNode;
	import TableWidget.comp.textformatter.TextPropertiesComponent;
	/**
	* This class is used to create Column level assets and keeps the reference of all columns.
	* @author Devender Gupta
	*/
	public class ColumnClass extends EventDispatcher{
		
		private static var instance:ColumnClass;
		private var objWidgetController:WidgetController;
		
		private var objTextPropertiesComponent:TextPropertiesComponent;
		private var mcRef:MovieClip;
		private var objConfigXML:XML;
		private var xmlCaptivateParams:XML;
		private var wm:String = "Stage";
		
		private var mcCells:MovieClip;
		private var mcGrid:MovieClip;
		private var columnsMc:MovieClip;
		private var oldDepthForMenu:int;
		private var oldMenuDisplayingColumn:MovieClip;
		private var oldDepthForSelection:int;
		
		private var arrColumnAssets:Array;
		private var arrColumnReferences:Array;
		private var arrRowReferences:Array;
		private var arrColumnNames:Array;
		
		private var selectedColumn:Number = -1;
		private var completeColumnSelected:Number = -1;
		
		private var objSorting:SortColumns;
		private var objRowClass:RowClass;
		
		public var objCursor:mcCursor;
		public var addColumnBar:AddRowColumnBar;
		private var arrAlphabets:Array = new Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z");
		
		
		public function ColumnClass(){
			
		}
				
		public static function getInstance():ColumnClass{
			if(instance == null){
				instance =  new ColumnClass();
			}
			return instance;
		}
		
		public function killSingleton(){
			instance = null;
		}
		
		/**
		* This function set the references of the required objects like, controller instance, configuration XML, data XML, 
		* and widget mode.
		* Also, it takes refrence of the main movieclip in which the whole table will be created.
		*/
		public function setReferences(mc:MovieClip):void{
			objWidgetController = WidgetController.getInstance();
			objConfigXML = objWidgetController.objConfigXML;
			xmlCaptivateParams = objWidgetController.xmlCaptivateParams;
			wm = objWidgetController.wm;
			objTextPropertiesComponent = objWidgetController.objTextPropertiesComponent;
			mcRef = mc
			mcCells = MovieClip(mc.getChildByName("mcCells"))
			mcGrid = MovieClip(mc.getChildByName("mcGrid"))
		}
		
		/**
		* This function is used to initiate the column creation logic of the class. It generate default columns.
		*/
		public function init():void{
			arrColumnReferences = new Array();
			arrColumnNames = new Array();
			arrColumnAssets = new Array();
			arrRowReferences = new Array();
			
			if(addColumnBar != null){
				mcGrid.removeChild(addColumnBar);
			 	addColumnBar = null;
			}
			addColumnBar = new AddRowColumnBar();
			addColumnBar.name = "addColumnBar";
			mcGrid.addChild(addColumnBar);
			addColumnBar.alpha = 0;
			addColumnBar.addEventListener(MouseEvent.MOUSE_OVER, displayAddColumnBar);
			addColumnBar.addEventListener(MouseEvent.MOUSE_OUT, hideAddColumnBar);
			addColumnBar.bg.addEventListener(MouseEvent.CLICK, addColumnAtLast);
			
			if(columnsMc != null){
				mcGrid.removeChild(columnsMc);
			 	columnsMc = null;
			}
			
			columnsMc = new MovieClip();
			columnsMc.name = "columns";			
			mcGrid.addChild(columnsMc);
			
			objCursor = new mcCursor();
			mcGrid.addChild(objCursor);
			objCursor.visible = false;
			objCursor.x = 10;
			objCursor.y = 10;
			objWidgetController.objCursor = objCursor;
			
			objRowClass = RowClass.getInstance();
			arrRowReferences = objRowClass.getRowReferences()
			createDefaultColumns();
			objRowClass.setDefaultRowHeights();
			arrColumnReferences[0].arrCellsReference[1].setSelection(true);
			objSorting = new SortColumns();
			objSorting.setReferences()
			objSorting.setRowReferences(arrRowReferences);
			objSorting.setColumnReferences(arrColumnReferences);
			
			
		}
		
		private function createDefaultColumns():void{
			if(xmlCaptivateParams != null){
				var columns = xmlCaptivateParams.table.column.length();
				for(var i=0; i<columns; i++){
					createColumnAt(i, true);					
				}
				for(i=0; i<arrRowReferences.length; i++){
					arrRowReferences[i].setColumnReferences(arrColumnReferences)
				}
			}
			
		}
		
		
		
		
		/**
		* This function is used to create column at any index value. This will be used while creating default columns and
		* while inserting new columns on user's demand.
		*/
		public function createColumnAt(index:int, isDefault:Boolean = false):void{
			var selectNewColumn = false;
			
			/*if(objWidgetController.creationComplete)
			{
				objTextPropertiesComponent.initializeFormatter();
			}*/
			if(completeColumnSelected != -1){
				selectNewColumn = true
				deselectColumnSelection();
			}
			if(!isDefault){
				objRowClass.deselectRowSelection()
				objRowClass.deselectAllRows()
				deselectAllColumns();
			}
			createAssets(index, isDefault);
			
			if(!isDefault){
				if(index < arrColumnReferences.length ){
					xmlCaptivateParams.table.insertChildBefore(xmlCaptivateParams.table.column[index], getNewColmnXML())
				}else if(index == arrColumnReferences.length){
					xmlCaptivateParams.table.insertChildAfter(xmlCaptivateParams.table.column[index-1], getNewColmnXML())
				}
			}
			//trace("xmlCaptivateParams : "+xmlCaptivateParams);
			for(var i=0; i<arrColumnReferences.length; i++){
				if(i>= index){
					arrColumnReferences[i].shift(objConfigXML.column.@width);
				}	
			}
			var objColumnReference = new ColumnReference();
			if(isDefault == false){
				if(arrColumnReferences.length > index){
					if(arrColumnReferences[index].currentSelectedCell == -1 && index > 0){
						objColumnReference.currentSelectedCell = arrColumnReferences[index-1].currentSelectedCell
					}else{
						objColumnReference.currentSelectedCell = arrColumnReferences[index].currentSelectedCell
					}
				}else if(arrColumnReferences.length == index){
					objColumnReference.currentSelectedCell = arrColumnReferences[index-1].currentSelectedCell
				}
			}
			objColumnReference.setReferences(mcCells, arrColumnReferences);
			objColumnReference.init(index);
			if(isDefault){

				if(xmlCaptivateParams.table.column[index].@width!=undefined){
					objColumnReference.columnWidth = int(xmlCaptivateParams.table.column[index].@width)
				}
			}
			objColumnReference.setRowReferences(arrRowReferences);
			objColumnReference.createColumnAt(index);
			arrColumnReferences.splice(index, 0, objColumnReference)
			for(i=index+1; i<arrColumnReferences.length; i++){
				arrColumnReferences[i].index = i;
			}
			objRowClass.updateCellReferences(index, objColumnReference.arrCellsReference);
			ScrollPane(mcRef.parent.parent).update();
			
			if(!isDefault){
				if(index <= selectedColumn){
					selectedColumn++
				}
				objColumnReference.columnChanged();
			}
			objColumnReference.addEventListener(objColumnReference.UPDATEWIDTH, columnResized);
			shiftAddColumnBar();
			if((isDefault == false) && (selectedColumn == -1)){
				objColumnReference.arrCellsReference[1].setSelection(true);
			}
			if(selectNewColumn){
				selectionColumnAt(index)
			}
		}
		
		public function deleteColumnAt(index:int):void{
			if(arrColumnReferences.length ==1){
				return
			}
			var selectNewColumn = false;
			
			
			if(completeColumnSelected != -1){
				selectNewColumn = true
				deselectColumnSelection();
			}
			objRowClass.deselectRowSelection()
			objRowClass.deselectAllRows()
			deselectAllColumns();
			oldDepthForSelection--;
			
			deleteAssets(index);
			delete xmlCaptivateParams.table.column[index]
			for(var i=0; i<arrColumnReferences.length; i++){
				if(i> index){
					arrColumnReferences[i].shift(-arrColumnReferences[index].columnWidth);
				}	
			}
			var objColumnReference = arrColumnReferences[index];
			var newIndex:int;
			if(objColumnReference.currentSelectedCell != -1){
				if(arrColumnReferences.length > index+1){
					arrColumnReferences[index+1].currentSelectedCell = objColumnReference.currentSelectedCell
					newIndex = index
				}else if(arrColumnReferences.length == index+1){
					arrColumnReferences[index-1].currentSelectedCell = objColumnReference.currentSelectedCell
					newIndex = index-1;
				}
				selectedColumn = -1;
			}
			
			objColumnReference.deleteCellsAt(index);
			arrColumnReferences.splice(index, 1)

			for(i=0; i<arrColumnReferences.length; i++){
				arrColumnReferences[i].index = i;
			}
			arrColumnReferences[newIndex].columnChanged();
			objRowClass.setDefaultRowHeights();
			shiftAddColumnBar();
			
			ScrollPane(mcRef.parent.parent).update();
			var selectionIndex = (arrColumnReferences.length > index) ? index : (index - 1)
			selectionColumnAt(selectionIndex)
			arrRowReferences[selectionIndex].arrCellsReference[0].setSelection(true);
		}
		
		private function displayAddColumnBar(evt:MouseEvent){
			evt.currentTarget.alpha = 1
		};

		private function hideAddColumnBar(evt:MouseEvent){
			evt.currentTarget.alpha = 0
		}
		
		private function addColumnAtLast(evt:MouseEvent){
			hideDisplayedColumn();
			objRowClass.hideDisplayedRow();
			objRowClass.deselectRowSelection();
			objRowClass.deselectAllRows()
			createColumnAt(arrColumnReferences.length);
			arrColumnReferences[arrColumnReferences.length-1].arrCellsReference[1].setSelection(true);
		}
		
		private function shiftAddColumnBar(){
			addColumnBar.x = int(objConfigXML.rowColumnGrid.@rowWidth) + mcCells.x + mcCells.width;
			addColumnBar.y = objConfigXML.rowColumnGrid.@columnHeight;
			addColumnBar.bg.height = mcCells.height;
			objRowClass.addRowBar.y = int(objConfigXML.rowColumnGrid.@columnHeight) + mcCells.y + mcCells.height;
			objRowClass.addRowBar.bg.width = mcCells.width;
		}
		
		/**
		* This function will set the references of all the columns in RowClass so that every rowReference 
		* object can contain the same for their logic.
		*/
		
		public function getColumnReferences():Array{
			return arrColumnReferences;
		}
		
		public function updateCellReferences(index:int, arrCells:Array){
			for(var i=0; i<arrColumnReferences.length; i++){
				arrColumnReferences[i].arrCellsReference.splice(index, 0, arrCells[i])
				arrColumnReferences[i].addEvents();
			}
		}
		private function getNewColmnXML():XML{
			var xml:XML = <column></column>
			for(var i=0; i<arrRowReferences.length; i++){
				xml.appendChild(<row><cell bgColor='' borderColor=''></cell></row>)
			}
			return xml;
		}
		/**
		* This function is used to create column level assets like Column Name, cell, drop down menu etc.
		*/
		private function createAssets(index, isDefault:Boolean = false){
			var columnName = getColumnName(arrColumnNames.length);
			arrColumnNames.push(columnName)
			
			var columnMc = new MovieClip();
			arrColumnAssets.splice(index, 0, columnMc);
			//trace("columnsMc : "+ columnsMc +":"+columnsMc.name)
			columnsMc.addChild(columnMc)
			
			var columnWidth = int(objConfigXML.column.@width)
			if(isDefault){
				if(xmlCaptivateParams.table.column.length() >= (index+1)){
					if(xmlCaptivateParams.table.column[index].@width!=undefined){
						columnWidth = int(xmlCaptivateParams.table.column[index].@width)
					}
				}
			}
			var bg:MovieClip = new MovieClip();
			bg.name = "bg";
			bg.graphics.beginFill(objConfigXML.rowColumnGrid.@bgColor);
			bg.graphics.lineStyle(objConfigXML.rowColumnGrid.@borderThickness, objConfigXML.rowColumnGrid.@borderColor);
			bg.graphics.drawRect(0, 0, columnWidth, objConfigXML.rowColumnGrid.@columnHeight);
			bg.graphics.endFill()
			bg.addEventListener(MouseEvent.MOUSE_OVER, showDDMenu)
			bg.addEventListener(MouseEvent.CLICK, clickedColumnBg)
			bg.addEventListener(MouseEvent.MOUSE_OUT, hideDDMenu)
			columnMc.addChild(bg);
			columnMc.bg = bg;
			
			var bgRollover = new MovieClip();
			bgRollover.name = "bgRollover";
			bgRollover.graphics.beginFill(objConfigXML.rowColumnGrid.@hoverBgColor);
			bgRollover.graphics.lineStyle(objConfigXML.rowColumnGrid.@borderThickness, objConfigXML.rowColumnGrid.@borderColor);
			bgRollover.graphics.drawRect(0, 0, columnWidth, objConfigXML.rowColumnGrid.@columnHeight);
			bgRollover.graphics.endFill()
			bgRollover.addEventListener(MouseEvent.MOUSE_OVER, showDDMenu)
			bgRollover.addEventListener(MouseEvent.CLICK, clickedColumnBg)
			bgRollover.addEventListener(MouseEvent.MOUSE_OUT, hideDDMenu)
			bgRollover.visible = false
			columnMc.addChild(bgRollover);
			columnMc.bgRollover = bgRollover;
			
			var addButtonLeft = new AddColumnButton();
			addButtonLeft.name = "addButtonLeft";
			addButtonLeft.x = bg.x
			addButtonLeft.y = bg.y
			addButtonLeft.visible = false
			columnMc.addChild(addButtonLeft);
			columnMc.addButtonLeft = addButtonLeft;
			addButtonLeft.addEventListener(MouseEvent.CLICK, addColumnToLeft)
			
			var addButtonRight = new AddColumnButton();
			addButtonRight.name = "addButtonRight";
			addButtonRight.x = bg.x + bg.width
			addButtonRight.y = bg.y
			addButtonRight.visible = false
			columnMc.addChild(addButtonRight);
			columnMc.addButtonRight = addButtonRight;
			addButtonRight.addEventListener(MouseEvent.CLICK, addColumnToRight)
			
			var tf:TextField = new TextField();
			tf.width = bg.width;
			tf.autoSize = TextFieldAutoSize.CENTER;
			tf.selectable = false;
			//tf.embedFonts = true;
			tf.mouseEnabled = false
			columnMc.tf = tf;			
			
			var dropDownMenuButton = new ColumnDropDownMenuButton();
			dropDownMenuButton.useHandCursor = false
			dropDownMenuButton.x = (bg.width/2) + 4
			dropDownMenuButton.y = bg.y + (bg.height /2)
			dropDownMenuButton.visible = false;
			columnMc.dropDownMenuButton = dropDownMenuButton;
			dropDownMenuButton.addEventListener(MouseEvent.MOUSE_OVER, showMenu)
			dropDownMenuButton.addEventListener(MouseEvent.MOUSE_DOWN, showCompleteMenu)
			columnMc.addChild(dropDownMenuButton)
			
			var dropDownMenu = new ColumnDropDownMenu();
			dropDownMenu.x = dropDownMenuButton.x
			dropDownMenu.y = dropDownMenuButton.y
			dropDownMenu.visible = false;
			dropDownMenu.menuBtn1.addEventListener(MouseEvent.CLICK, sortAscending);
			dropDownMenu.menuBtn1.useHandCursor = false
			dropDownMenu.menuBtn2.addEventListener(MouseEvent.CLICK, sortDescending);
			dropDownMenu.menuBtn2.useHandCursor = false
			dropDownMenu.menuBtn3.addEventListener(MouseEvent.CLICK, insertColumnMenu);
			dropDownMenu.menuBtn3.useHandCursor = false
			dropDownMenu.menuBtn4.addEventListener(MouseEvent.CLICK, deleteColumnMenu);
			dropDownMenu.menuBtn4.useHandCursor = false
			//dropDownMenu.closeMenu.buttonMode = true;
			dropDownMenu.closeMenu.addEventListener(MouseEvent.MOUSE_DOWN, hideCompleteMenu)
			columnMc.dropDownMenu = dropDownMenu;
			columnMc.addChild(dropDownMenu)
			
			columnMc.addChild(tf);
			
			//code to select the column
			
			for(var i=0; i<arrColumnAssets.length; i++){
				if(i>0){
					arrColumnAssets[i].x = arrColumnAssets[i-1].x + arrColumnAssets[i-1].bg.width
				}else{
					arrColumnAssets[i].x = int(objConfigXML.rowColumnGrid.@xPos) + int(objConfigXML.rowColumnGrid.@rowWidth)
				}
				arrColumnAssets[i].tf.htmlText = objWidgetController.htmlize(arrColumnNames[i], "rowColumnGrid");
				arrColumnAssets[i].tf.y = (arrColumnAssets[i].bg.height - arrColumnAssets[i].tf.height)/2
				arrColumnAssets[i].y = objConfigXML.rowColumnGrid.@yPos
			}
		}
		
		private function deleteAssets(index:int){
			var columnMc = arrColumnAssets.splice(index, 1)[0];
			columnsMc.removeChild(columnMc)
			for(var i=0; i<arrColumnAssets.length; i++){
				if(i>0){
					arrColumnAssets[i].x = arrColumnAssets[i-1].x + arrColumnAssets[i-1].bg.width
				}else{
					arrColumnAssets[i].x = int(objConfigXML.rowColumnGrid.@xPos) + int(objConfigXML.rowColumnGrid.@rowWidth)
				}
				arrColumnAssets[i].tf.htmlText = objWidgetController.htmlize(arrColumnNames[i], "rowColumnGrid");
				arrColumnAssets[i].tf.y = (arrColumnAssets[i].bg.height - arrColumnAssets[i].tf.height)/2
				arrColumnAssets[i].y = objConfigXML.rowColumnGrid.@yPos
			}
		}
		
		private function showMenu(evt:MouseEvent):void{
			evt.currentTarget.visible = true
		}
		private function showDDMenu(evt:MouseEvent):void{
			evt.currentTarget.parent.dropDownMenuButton.visible = true
		}
		private function hideDDMenu(evt:MouseEvent):void{
			evt.currentTarget.parent.dropDownMenuButton.visible = false
		}
		private function showCompleteMenu(evt:MouseEvent):void {
			var toDisable = false;
			if(selectedColumn != -1){
				var currentSelectedColumn = arrColumnReferences[selectedColumn]
			
				if(currentSelectedColumn.currentSelectedCell!=-1){
					var currentSelectedColumnCell = currentSelectedColumn.arrCellsReference[currentSelectedColumn.currentSelectedCell]
					//currentSelectedColumnCell.killCellFocus(null)
					if(currentSelectedColumnCell.cellText.type == "input"){
						toDisable = true
					}
				}
			}
			if(!toDisable){
					//if(!evt.currentTarget.parent.bgRollover.visible){
						if(oldMenuDisplayingColumn){
							columnsMc.setChildIndex(oldMenuDisplayingColumn, oldDepthForMenu)
							oldMenuDisplayingColumn.dropDownMenu.visible = false;
							oldMenuDisplayingColumn.dropDownMenuButton.visible = false;
						}
						oldMenuDisplayingColumn = evt.currentTarget.parent;
						if(selectedColumn!=-1){
							arrColumnAssets[selectedColumn].addButtonLeft.visible = false;
							arrColumnAssets[selectedColumn].addButtonRight.visible = false;
						}
						oldDepthForMenu = columnsMc.getChildIndex(oldMenuDisplayingColumn);
						columnsMc.setChildIndex(evt.currentTarget.parent, arrColumnAssets.length-1)
					//}
					
					evt.currentTarget.parent.dropDownMenu.visible = true;
					mcRef.cellBlocker.reference = evt.currentTarget.parent;
					mcRef.cellBlocker.width = mcRef.width //- 58
					mcRef.cellBlocker.height = mcRef.parent.height;//mcRef.height //- 27
					mcRef.cellBlocker.visible = true;
					mcRef.setChildIndex(mcRef.cellBlocker, 1);
					mcRef.cellBlocker.addEventListener(MouseEvent.CLICK, clickedOutSideMenu);
					//deselectColumnSelection();
					//objRowClass.deselectRowSelection();					
					dispatchEvent(new Event("hideopenedmenu"));
			}
		}
		
		private function hideCompleteMenu(evt:MouseEvent):void{
			mcRef.cellBlocker.width = 0
			mcRef.cellBlocker.height = 0
			if(oldMenuDisplayingColumn){
				columnsMc.setChildIndex(oldMenuDisplayingColumn, oldDepthForMenu)
				oldMenuDisplayingColumn = null;
				oldDepthForMenu = 0
			}
			if(selectedColumn!=-1){
				arrColumnAssets[selectedColumn].addButtonLeft.visible = true;
				arrColumnAssets[selectedColumn].addButtonRight.visible = true;
			}
			evt.currentTarget.parent.visible = false;
		}
		
		private function clickedOutSideMenu(evt:MouseEvent):void{
			mcRef.cellBlocker.removeEventListener(MouseEvent.CLICK, clickedOutSideMenu);
			mcRef.cellBlocker.visible = false;
			mcRef.cellBlocker.width = 0
			mcRef.cellBlocker.height = 0
			mcRef.cellBlocker.reference.dropDownMenu.visible = false;
			mcRef.cellBlocker.reference.dropDownMenuButton.visible = false;
			if(selectedColumn!=-1){
				arrColumnAssets[selectedColumn].addButtonLeft.visible = true;
				arrColumnAssets[selectedColumn].addButtonRight.visible = true;
			}
			if(oldMenuDisplayingColumn){
				columnsMc.setChildIndex(oldMenuDisplayingColumn, oldDepthForMenu)
				oldMenuDisplayingColumn = null;
				oldDepthForMenu = 0
			}
		}
		
		private function clickedColumnBg(evt:MouseEvent):void{
			mcRef.cellBlocker.width = 0
			mcRef.cellBlocker.height = 0
			if(selectedColumn!=-1){
				arrColumnAssets[selectedColumn].addButtonLeft.visible = true;
				arrColumnAssets[selectedColumn].addButtonRight.visible = true;
			}
			hideDisplayedColumn();
			objRowClass.hideDisplayedRow();
			if(evt != null){
				selectCompleteColumn(evt);
			}
		}
		
		private function sortAscending(evt:MouseEvent):void{
			mcRef.cellBlocker.width = 0
			mcRef.cellBlocker.height = 0
			hideDisplayedColumn();
			var mc = evt.currentTarget.parent.parent;
			mc.dropDownMenu.visible = false;
			objSorting.sortColumnAt(getColumnNumber(mc), Array.CASEINSENSITIVE);
		}
		private function sortDescending(evt:MouseEvent):void{
			mcRef.cellBlocker.width = 0
			mcRef.cellBlocker.height = 0
			hideDisplayedColumn();
			var mc = evt.currentTarget.parent.parent;
			mc.dropDownMenu.visible = false;
			objSorting.sortColumnAt(getColumnNumber(mc), Array.DESCENDING);
		}
		private function insertColumnMenu(evt:MouseEvent):void{
			mcRef.cellBlocker.width = 0
			mcRef.cellBlocker.height = 0
			hideDisplayedColumn();
			var mc = evt.currentTarget.parent.parent;
			mc.dropDownMenu.visible = false;
			createColumnAt(getColumnNumber(mc));
		}		
		private function deleteColumnMenu(evt:MouseEvent):void{
			mcRef.cellBlocker.width = 0
			mcRef.cellBlocker.height = 0
			hideDisplayedColumn();
			var mc = evt.currentTarget.parent.parent;
			mc.dropDownMenu.visible = false;
			deleteColumnAt(getColumnNumber(mc));
		}
		
		
		
		public function hideDisplayedColumn(){
			if(oldMenuDisplayingColumn){
				oldMenuDisplayingColumn.dropDownMenu.visible = false;
				oldMenuDisplayingColumn.dropDownMenuButton.visible = false;
				columnsMc.setChildIndex(oldMenuDisplayingColumn, oldDepthForMenu)
				oldMenuDisplayingColumn = null;
				oldDepthForMenu = 0
			}
		}
		private function getColumnNumber(mc:MovieClip):int{
			var num:int = 0;
			for(var i=0; i<arrColumnAssets.length; i++){
				if(mc == arrColumnAssets[i]){
					num = i;
					break;
				}
			}
			return num;
		}
		
		public function setSelection(index:int, rowIndex:int):void{
			deselectColumnSelection();
			deselectAllColumns();
			if(selectedColumn != -1){
				columnsMc.setChildIndex(arrColumnAssets[selectedColumn], oldDepthForSelection)
				arrColumnAssets[selectedColumn].bgRollover.visible = false;
				arrColumnAssets[selectedColumn].addButtonRight.visible = false;
				arrColumnAssets[selectedColumn].addButtonLeft.visible = false;
				arrColumnReferences[selectedColumn].currentSelectedCell = -1
			}
			
			if(rowIndex== -2){
				deselectAllColumns();
				objRowClass.selectAllRows();
			}else{
				arrColumnReferences[index].currentSelectedCell = rowIndex
			}
			arrColumnAssets[index].bgRollover.visible = true;
			arrColumnAssets[index].addButtonRight.visible = true;
			arrColumnAssets[index].addButtonLeft.visible = true;
			oldDepthForSelection = columnsMc.getChildIndex(arrColumnAssets[index]);
			columnsMc.setChildIndex(arrColumnAssets[index], arrColumnAssets.length-1)
			selectedColumn = index
		}
		public function selectAllColumns(){
			deselectAllColumns();
			arrColumnAssets[0].addButtonLeft.visible = true;
			arrColumnAssets[arrColumnAssets.length-1].addButtonRight.visible = true;
			for(var i=0; i<arrColumnAssets.length; i++){
				arrColumnAssets[i].bgRollover.visible = true;
			}
		}
		
		public function deselectAllColumns(){
			
			for(var i=0; i<arrColumnAssets.length; i++){
				if(arrColumnAssets[i].bgRollover.visible){
					//columnsMc.setChildIndex(arrColumnAssets[i], oldDepthForSelection)
					arrColumnAssets[i].bgRollover.visible = false;
					arrColumnAssets[i].addButtonRight.visible = false;
					arrColumnAssets[i].addButtonLeft.visible = false;
					arrColumnReferences[i].currentSelectedCell = -1
					selectedColumn = -1;
				}
			}
		}
		private function selectCompleteColumn(evt:MouseEvent){
			var mc = evt.currentTarget.parent;
			objRowClass.deselectRowSelection();
			selectionColumnAt(getColumnNumber(mc));
		}
		private function addColumnToRight(evt:Event):void{
			var mc = evt.currentTarget.parent;
			createColumnAt(getColumnNumber(mc)+1);
		}
		
		private function addColumnToLeft(evt:Event):void{
			var mc = evt.currentTarget.parent;
			createColumnAt(getColumnNumber(mc));
		}
		
		private function getColumnName(index) :String{
			var quotient = Math.floor(index / 26)
			var columnName = ""
			if (quotient > 0){
				 columnName  = getColumnName(quotient) + arrAlphabets[index % 26]
			}else{
				 columnName = arrAlphabets[index % 26]
			}
			return columnName;
		}
		
		private function selectionColumnAt(index:int):void{
			if(selectedColumn >= 0){
				
				var selectedColRef = arrColumnReferences[selectedColumn]
				if(selectedColRef.currentSelectedCell != -1){
					selectedColRef.arrCellsReference[selectedColRef.currentSelectedCell].setSelection(false);
				}
			}
			
			var colCellsRef = arrColumnReferences[index].arrCellsReference
			
			var selXPos = colCellsRef[0].x;
			var selWidth = colCellsRef[1].width - 1;
			var selYPos = colCellsRef[0].y;
			var lastCell = colCellsRef[colCellsRef.length-1]
			var selHeight = lastCell.y + lastCell.height - selYPos - 1;
			
			setSelection(index, -2);
			deselectColumnSelection();
			
			var mc:MovieClip
			if(mcGrid.getChildByName("columnSelection") == null){
				mc = new MovieClip();
				mc.name = "columnSelection"
				mcGrid.addChild(mc);
				mcGrid.setChildIndex(mc, 0)
			}else{
				mc = MovieClip(mcGrid.getChildByName("columnSelection"));
				mc.graphics.clear();
				mcGrid.setChildIndex(mc, 0)
				mc.visible = true;
			}
			mc.graphics.lineStyle(2,objConfigXML.cell.@selectedBorderColor);
			mc.graphics.drawRect(0, 0, selWidth, selHeight);
			mc.graphics.endFill();
			mc.x = selXPos+1;
			mc.y = selYPos+1
			
			var cellRef
			arrColumnReferences[index].columnSelected = true;
			cellRef = arrColumnReferences[index].arrCellsReference
			for(var i=0; i<cellRef.length; i++){
				cellRef[i].changeToSelection(true);
			}
			completeColumnSelected = index;
			
		}
		
		public function deselectColumnSelection(){
			if(completeColumnSelected != -1){
				var prevSelectedColumn = arrColumnReferences[completeColumnSelected];
				prevSelectedColumn.columnSelected = false;
				var cellRef = prevSelectedColumn.arrCellsReference
				for(var i=0; i<cellRef.length; i++){
					cellRef[i].changeToSelection(false);
				}
				completeColumnSelected = -1;
				if(mcGrid.getChildByName("columnSelection") != null){
					var mc:MovieClip = MovieClip(mcGrid.getChildByName("columnSelection"));
					mc.visible = false;
				}
			}
		}
		
		private function columnResized(evt:Event){
			var index = evt.currentTarget.index;
			var mcAsset = arrColumnAssets[index]
			mcAsset.bg.width = (arrColumnReferences[index].columnWidth > 60)? arrColumnReferences[index].columnWidth : 60;
			xmlCaptivateParams.table.column[index].@width = mcAsset.bg.width
			mcAsset.bgRollover.width = arrColumnReferences[index].columnWidth;
			mcAsset.addButtonRight.x = mcAsset.bg.x + mcAsset.bg.width
			mcAsset.tf.x = (mcAsset.bg.width - mcAsset.tf.width)/2
			mcAsset.dropDownMenuButton.x = mcAsset.bg.x + (mcAsset.bg.width /2)
			mcAsset.dropDownMenu.x = mcAsset.dropDownMenuButton.x
			
			for(var i=index+1; i<arrColumnAssets.length; i++){
				arrColumnAssets[i].x = arrColumnAssets[i-1].x + arrColumnAssets[i-1].bg.width
			}
			objRowClass.setDefaultRowHeights();
			shiftAddColumnBar();
			ScrollPane(mcRef.parent.parent).update();
		}
		
	}
}