var NodeBuilder = require('../../vn/node-builder');

/**
 * Represents a grid column. This is an abstract class and should not be
 * instantiated directly.
 */
module.exports = new Class({
	Extends: NodeBuilder
	,Tag: 'htk-column'
	,Properties: {
		value: {
			type: String
			,value: null
		},
		column: {
			type: String
			,value: null
		},
		columnIndex: {
			type: Number
			,value: -1
		},
		title: {
			 type: String
			 ,value: null
		},
		editable: {
			type: Boolean
			,value: false
		},
		renderer: {
			type: Function
			,value: false
		},
		class: {
			type: String
			,set: function(x) {
				this._userCssClass = x;
				
				if (this._cssClass)
					this._cssClass = x +' '+ this._cssClass;
				else
					this._cssClass = x;
			}
			,get: function() {
				return this._userCssClass;
			}
		}
	}
	
	,_cssClass: null
	,_userCssClass: null

	/**
	 * Initializes the column.
	 */
	,initialize: function(props) {
		NodeBuilder.prototype.initialize.call(this, props);
		this.td = this.createElement('td');
	}
	
	,renderHeader: function() {
		var th = this.createElement('th');
		
		if (this.title)
			th.appendChild(this.createTextNode(this.title));
			
		return th;
	}

	/**
	 * Draws the cell and returns its associated td.
	 *
	 * @return {HTMLTableData} the rendered cell
	 */
	,render: function() {
		var td = this.td.cloneNode(true);

		if (this._cssClass)
			td.className = this._cssClass;
			
		return td;
	}

	,updateColumnName: function(model) {
		if (this.columnIndex !== -1)
			this.column = model.getColumnName(this.columnIndex);
	}

	,changed: function(tr, newValue) {
		this.emit('changed', tr.rowIndex - 1, newValue);
	}
});