/* Copyright (c) 2006 N2N Consulting Pte Ltd. All rights reserved. */

/**
* @author Antonius Ng
* 
* $Id: Grid.js,v 1.1 2007/05/30 09:10:42 antonius Exp $
*/

/**
* @class A Grid object.
* Need Prototype library.
*
* Usage:
* var grid = new n2n.Grid("grid_id");
*
* // set the properties of the grid
* grid.addColumn();
*
* // draw the grid
* grid.paint();
*/

dojo.provide("n2n.Grid");
dojo.require("dojo.lang.*");
dojo.require("n2n.Div");
dojo.require("n2n.Table");
n2n.Grid = Class.create();

n2n.Grid.prototype = {
	
	
	initialize: function(id, container) {
		this.id = id;
		
			
		this.resetDisplayData();
		this.columns = new dojo.collections.ArrayList();
		this.rows = new dojo.collections.ArrayList();
		this.container = document;
		if (container)
			this.container = container;
		this.hasTitleBar = false;
		this.title = "";
		this.titleBarBackground = "/images/defaultTitleBackground.gif"; //Applicable only when there is a title bar
		this.displayData = new dojo.collections.ArrayList();
		this.box = new n2n.Div(this.id, this.container);
		
	},
	
	addColumn: function(label, isSortable) {
		var col = new n2n.GridColumn(this.columns.size(), label, isSortable, this)
		this.columns.add(col);
		this.resetDisplayData();
		return col;
	},
	
	addData: function(dataArr) {
		var i;
		var n=dataArr.length;
		var rowIdx = this.rows.size()
		var row = new n2n.GridRow(rowIdx,this);
		this.rows.add(row);
		var results = [];
		for (i=0;i<n;i++) {
		
			var data = dataArr[i];
			
			var cell = new n2n.GridCell(row,this.columns.item(i),this,data);
			
			var j;
			
			row.addCell(cell);
			
			this.columns.item(i).addCell(cell);
			results[i] = cell;
		}
		this.resetDisplayData();
		return results;
	},
	
	reset: function() {
		this.rows.clear();
		this.displayData.clear();
	},
	
	resetDisplayData: function() {
		this.displayData = this.rows;
	},
	sort: function(colIdx) {
		var sortedRows = new dojo.collections.ArrayList();
		var i,j;
		var rowSize = this.rows.size();
		var colSize = this.columns.size();
		var sortedCells = new dojo.collections.ArrayList();
		for (i=0;i<rowSize;i++) {
			var cell = this.columns.item(colIdx).cells.item(i);
			for(j=0;j<sortedCells.size();j++) {
				if (sortedCells.item(j).data > cell.data) {
					sortedCells.insert(j,cell);
					j++;
					break;
				}
			}
			if (sortedCells.size()==j) {
				sortedCells.add(cell);
			}
		}
		for (i=0;i<rowSize;i++) {
			sortedRows.add(sortedCells.item(i).row);
		}
		this.displayData = sortedRows;
	},
	paint: function(hide) {
		var i,j,k;
		
		var table = new n2n.Table(this.id+"_table", this.box);
		
		this.box.paint();
		
		this.getDiv().innerHTML = "";
		
		table.paint();
		
		if (this.hasTitleBar){
			var rw = table.HTMLObject.insertRow(i);
	
			var idx = 0;
			for(j=0;j<this.columns.size();j++) {
				var col = this.columns.item(j);
				if (col.isVisible) {
					var cel = rw.insertCell(idx++);
				
					cel.innerHTML=col.label;
					if (col.width) {
						cel.width=col.width;
					}
				
					cel.style.background="url("+this.titleBarBackground+")";
					
					if (this.columns.size() > j) {
						cel.style.borderRightWidth="thin";
						cel.style.borderRightColor="#BEBEBE";
						cel.style.borderRightStyle="solid";
					}
					cel.style.borderBottomWidth="thin";
					cel.style.borderBottomStyle="solid";
				}
			}
		}
		
		for(i=0;i<this.displayData.size();i++) {
			var row = this.displayData.item(i);
			
			if (this.hasTitleBar) {
				k=i+1;
			} else {
				k=i;
			}
			var rw = table.HTMLObject.insertRow(k);
			
			var idx=0;
			for(j=0;j<this.columns.size();j++) {
				
				if (this.columns.item(j).isVisible) {
					var cell = rw.insertCell(idx++);
					
					//row.cells.item(idx).onClickFunction();
					
					cell.innerHTML =  row.cells.item(j).data;
					cell.cell = row.cells.item(j);
					
					cell.onmousedown = row.cells.item(j).onClickFunction;
					if (this.columns.size() > j) {
						cell.style.borderRightWidth="thin";
						cell.style.borderRightColor="#BEBEBE";
						cell.style.borderRightStyle="solid";
					}
					
				}
			}
			
		}
		
		if (hide) {
			this.getDiv().style.display='none';
		}

	},
	getTable: function() {
		return document.getElementById(this.id+"_table");
	},
	getDiv: function() {
		return this.box.getDiv();
	},
	hide: function() {
		document.getElementById(this.id).style.display='none';
	},
	show: function() {
		document.getElementById(this.id).style.display='';
	}
}

/**
* @class A Grid Column object.
* Need Prototype library.
*
* Usage:
* var grid = new n2n.Grid("grid_id");
*
* // set the properties of the grid
* grid.addColumn();
*
* // draw the grid
* grid.paint();
*/
n2n.GridColumn = Class.create();

n2n.GridColumn.prototype = {
	
	initialize: function(idx, label, grid) {
		this.isVisible = true;
		this.label = label;
		this.idx = idx;
		this.isSortable = true;
		this.grid = grid;
		this.cells = new dojo.collections.ArrayList();
	},
	addCell: function(cell) {
		this.cells.add(cell);
	}
	
}

/**
* @class A Grid Row object.
* Need Prototype library.
*
* Usage:
* var grid = new n2n.Grid("grid_id");
*
* // set the properties of the grid
* grid.addColumn();
*
* // draw the grid
* grid.paint();
*/
n2n.GridRow = Class.create();

n2n.GridRow.prototype = {
	
	initialize: function(idx, grid) {
		this.idx = idx;
		this.grid = grid;
		this.cells = new dojo.collections.ArrayList();
	},
	addCell: function(cell) {
		this.cells.add(cell);
	}
}

/**
* @class A Grid Cell object.
* Need Prototype library.
*
* Usage:
* var grid = new n2n.Grid("grid_id");
*
* // set the properties of the grid
* grid.addColumn();
*
* // draw the grid
* grid.paint();
*/
n2n.GridCell = Class.create();

n2n.GridCell.prototype = {
	initialize: function(row, column, grid, data) {
		this.row = row;
		this.column = column;
		this.grid = grid;
		this.data = data;
		this.categoryId;
		this.onClickFunction = function() {
		}
	}
	
}