/*
 * Ext JS Library 2.0.2
 * Copyright(c) 2006-2008, Ext JS, LLC.
 * licensing@extjs.com
 * 
 * http://extjs.com/license
 */

Ext.tree.ColumnTree = Ext.extend(Ext.tree.TreePanel,
{
	lines: false,
	borderWidth: Ext.isBorderBox ? 0 : 2, // the combined left/right border for each cell
	cls: 'x-column-tree',

		/*
		 * Fix speed for great justice
		 *
		if (typeof(this.itHeadersHash['z' + dataIndex]) == 'undefined') throw 'Header "' + dataIndex + '" not found';
		this.itHeadersHash['z' + dataIndex].innerHTML = text;
		*/
	itSetHeaderText: function(dataIndex, text)
	{
		var firstNodeHeader = typeof this.itHeadersHash['z' + dataIndex].firstChild.innerHTML == 'undefined' ||  this.itHeadersHash['z' + dataIndex].firstChild.innerHTML == null ? this.itHeadersHash['z' + dataIndex] : this.itHeadersHash['z' + dataIndex].firstChild;
		var firstNodeHeaderFix = typeof this.itFixHeadersHash['z' + dataIndex].firstChild.innerHTML == 'undefined' ||  this.itFixHeadersHash['z' + dataIndex].firstChild.innerHTML == null ? this.itFixHeadersHash['z' + dataIndex] : this.itFixHeadersHash['z' + dataIndex].firstChild; 
		
		firstNodeHeader.innerHTML = text;
		firstNodeHeaderFix.innerHTML = text;
	},
	
	onRender: function()
	{
		Ext.tree.ColumnTree.superclass.onRender.apply(this, arguments);
		this.headers = this.body.createChild({ cls:'x-tree-headers' }, this.innerCt.dom);
		this.fixHeaders = this.header.parent().createChild({ cls:'x-tree-fix-headers' });

		var c;
		var cols = this.columns;
		var totalWidth = 0;
		var allButtons = [];
		var headers = [];

		this.itHeadersHash = {};
		this.itFixHeadersHash = {};

		for (var i = 0, len = cols.length; i < len; i++)
		{
			var c = cols[i];

			this.headers.createChild({
				cls: 'x-tree-hd x-sorting-up ' + (c.cls ? c.cls+'-hd' : ''),
				cn: {
					cls: 'x-tree-hd-text',
					html: c.header
				},
				style: 'width:'+(c.width-this.borderWidth)+'px;left:'+totalWidth+'px;'
			});
			
			var headerClassName = c.isOneRow != null && c.isOneRow ? 'one-row-header' : 'multi-row-header';
			var html = c.itComment != null ? '<div class="' + headerClassName + '">' + c.header + '</div>' : '<div class="' + headerClassName + '">' + c.header + '</div><div id="sort_index' + i + '" class="sorting-pointer not-sorted"></div><div style="clear: both"></div>';
			
			var headerCell = this.fixHeaders.createChild({
				cls: 'x-tree-hd x-not-sorted ' + (c.cls ? c.cls+'-hd' : ''),
				cn: {
					cls: 'x-tree-hd-text',
					html: html
				}, 
				style: 'width:'+(c.width-this.borderWidth)+'px;left:'+totalWidth+'px;'
			});
			
			if (c.itComment == null)
			{
				var tmp = {};
				
				tmp.indexer = Ext.get('sort_index' + i);
				tmp.container = headerCell;
				tmp.data = c.dataIndex;
				
				headers.push(tmp)
			}
					
			totalWidth += c.width;

			this.itHeadersHash['z' + c.dataIndex] = this.headers.dom.childNodes[i].firstChild;
			this.itFixHeadersHash['z' + c.dataIndex] = this.fixHeaders.dom.childNodes[i].firstChild;
		}
		
		
		for (var i = 0; i < headers.length; i++)
		{
			headers[i].container.on('click', function(index, all)
			{
				return function() { TaxTool.TaxTree.makeSort(index, all);};
			}(i, headers));
		}

		this.headers.createChild({ cls:'x-clear' });
		this.fixHeaders.createChild({ cls:'x-clear' });

		// prevent floats from wrapping when clipped
		this.headers.setWidth(totalWidth);
		this.innerCt.setWidth(totalWidth);
		this.fixHeaders.setWidth(totalWidth);

		this.fixHeaders.dom.style.top = 52 + 'px';
	}
});

Ext.tree.ColumnNodeUI = function()
{
	Ext.tree.ColumnNodeUI.superclass.constructor.apply(this, arguments);
	this.node.addEvents({ "uirendered" : true });
}

Ext.extend(Ext.tree.ColumnNodeUI, Ext.tree.TreeNodeUI,
{
	focus: Ext.emptyFn, // prevent odd scrolling behavior

	initEvents: function(e)
	{
		Ext.tree.ColumnNodeUI.superclass.initEvents.call(this);
	},

	itUpdateChbClass: function(elNode, checked)
	{
		var ind = elNode.className.indexOf(' x-tree-sel');
		if (ind >= 0) { elNode.className = elNode.className.substring(0, ind) + elNode.className.substring(ind + ' x-tree-sel'.length); }

		if (checked) { elNode.className += ' x-tree-sel'; }
	},

	onCheckChange: function(e)
	{
		var chbEl = e.target;
		var dataIndex = chbEl.parentNode.parentNode.getAttribute('it:dataIndex');
		var checked = chbEl.checked;

		this.itChbClear();
		chbEl.checked = checked;

		var itNode = this.itNodesHash['z' + dataIndex];
		if (itNode.type != 'check') throw 'Internal error in "' + itNode.dataIndex + '" column';

		itNode.checked = checked;
		this.itUpdateChbClass(itNode.element.childNodes[1], checked);
	},

	itGetCheckedDataIndex: function()
	{
		for (var i = 0; i < this.itCheckNodes.length; i++) {
			if (this.itCheckNodes[i].checked) {
				return this.itCheckNodes[i].dataIndex;
			}
		}

		return null;
	},

	itChbClear: function()
	{
		for (var i = 0; i < this.itCheckNodes.length; i++)
		{
			var el = this.itCheckNodes[i].element;
			el.firstChild.firstChild.checked = false;
			this.itCheckNodes[i].checked = false;

			this.itUpdateChbClass(el.childNodes[1], false);
		}
	},

	itChbEnable: function()
	{
		if (!this.itCanCheck) { return; }

		for (var i = 0; i < this.itCheckNodes.length; i++)
		{
			var el = this.itCheckNodes[i].element;
			el.childNodes[0].style.display = '';
			el.childNodes[1].style.display = 'none';
		}
	},

	itChbDisable: function()
	{
		if (!this.itCanCheck) { return; }

		for (var i = 0; i < this.itCheckNodes.length; i++)
		{
			var el = this.itCheckNodes[i].element;
			el.childNodes[0].style.display = 'none';
			el.childNodes[1].style.display = '';
		}
	},

		/*
		 * Fix speed for great justice
		 *

		if (typeof(this.itNodesHash['z' + dataIndex]) == 'undefined') throw 'Column "' + dataIndex + '" not found';

		var itNode = this.itNodesHash['z' + dataIndex];
		itNode.textElement.innerHTML = text;
		*/
	itSetText: function(dataIndex, text)
	{
		this.itNodesHash['z' + dataIndex].textElement.innerHTML = text;
	},

		/*
		 * Fix speed for great justice
		 *

		if (typeof(this.itNodesHash['z' + dataIndex]) == 'undefined') throw 'Column "' + dataIndex + '" not found';

		var itNode = this.itNodesHash['z' + dataIndex];
		return itNode.textElement.innerHTML;
		*/
	itGetText: function(dataIndex)
	{
		return this.itNodesHash['z' + dataIndex].textElement.innerHTML;
	},

	itChbSetCheck: function(canCheck)
	{
		this.itCanCheck = canCheck;

		for (var i = 0; i < this.itNodes.length; i++)
		{
			if (this.itNodes[i].type == 'check')
			{
				var el = this.itNodes[i].element;

				var elNode = el.childNodes[1];
				var ind = elNode.className.indexOf(' x-tree-sel');
				if (ind >= 0) { elNode.className = elNode.className.substring(0, ind) + elNode.className.substring(ind + ' x-tree-sel'.length); }

				if (canCheck) {
					if (this.itNodes[i].checked) {
						elNode.className += ' x-tree-sel';
					}
				} else {
					elNode.className += ' x-tree-no-check';
				}
			}
		}
	},

	renderElements: function(n, a, targetNode, bulkRender)
	{
		this.indentMarkup = n.parentNode ? n.parentNode.ui.getChildIndent() : '';

		var t = n.getOwnerTree();
		var cols = t.columns;
		var bw = t.borderWidth;
		var c = cols[0];

		var buf = [
			'<li class="x-tree-node"><div ext:tree-node-id="', n.id, '" class="x-tree-node-el x-tree-node-leaf ', a.cls, '">',
				'<div class="x-tree-col" style="width:', c.width-bw, 'px;">',
					'<span class="x-tree-node-indent">', this.indentMarkup, "</span>",
					'<img src="', this.emptyIcon, '" class="x-tree-ec-icon x-tree-elbow">',
					'<img src="', a.icon || this.emptyIcon, '" class="x-tree-node-icon', (a.icon ? " x-tree-node-inline-icon" : ""), (a.iconCls ? " "+a.iconCls : ""), '" unselectable="on">',
					'<a hidefocus="on" class="x-tree-node-anchor" href="', (a.href ? a.href : "#"), '" tabIndex="1" ',
					(a.hrefTarget ? ' target="'+a.hrefTarget+'"' : ""), '>',
					'<span unselectable="on">', n.text || (c.renderer ? c.renderer(a[c.dataIndex], n, a) : a[c.dataIndex]), "</span></a>",
				"</div>"
		];

		this.itNodes = [];
		var leftX = c.width;
		var tmp = 0;

		for (var i = 1, len = cols.length; i < len; i++)
		{
			c = cols[i];
			var textContainer = '';
			var textContainerStyle = '';

			var itNode = {
				dataIndex: c.dataIndex,
				checked: false,
				type: 'text',
				leaf: a.leaf,
				text: ''
			};

			if (c.itCheckboxed)		/* &&  */
			{
				itNode.type = 'check';

				textContainer += '<div class="x-tree-col-text" style="text-align:center;display:none;"><input type="checkbox" /></div>';
				textContainerStyle = ' style="text-align:center;"';
			}
			else
			if (c.itAlign)
			{
				textContainerStyle = ' style="text-align:' + c.itAlign + '"';
			}
			
			if (c.itComment)
			{
				textContainer += '<div class="x-comment-container"><span><img src="images/comment.png" alt="view comments" /></span></div>';
			}

			textContainer += '<div class="x-tree-col-text' + (a.txcls ? ' ' + a.txcls : '') + (a.leaf ? '' : ' x-tree-imp') + '"' + textContainerStyle + '>';

			buf.push(
				'<div class="x-tree-col ', (c.cls ? c.cls : ''), '" style="width:', c.width-bw, 'px;left:', leftX,'px">',
					textContainer, (c.renderer ? c.renderer(a[c.dataIndex], n, a) : a[c.dataIndex]), "</div>",
				"</div>"
			);

			leftX += c.width;
			this.itNodes.push(itNode);
		}

		buf.push(
				'<div class="x-clear"></div></div>',
				'<ul class="x-tree-node-ct" style="display:none;"></ul>',
			"</li>"
		);

		if (bulkRender !== true && n.nextSibling && n.nextSibling.ui.getEl()) {
			this.wrap = Ext.DomHelper.insertHtml("beforeBegin", n.nextSibling.ui.getEl(), buf.join(""));
		} else {
			this.wrap = Ext.DomHelper.insertHtml("beforeEnd", targetNode, buf.join(""));
		}

		this.elNode = this.wrap.childNodes[0];
		this.ctNode = this.wrap.childNodes[1];

		var cs = this.elNode.firstChild.childNodes;
		this.indentNode = cs[0];
		this.ecNode = cs[1];
		this.iconNode = cs[2];
		this.anchor = cs[3];
		this.textNode = cs[3].firstChild;

		var itTitle = this.elNode.firstChild.childNodes[3];

		new Ext.ToolTip({
			target: itTitle,
			showDelay: 500,
			html: itTitle.innerHTML
		});

		this.itNodesHash = {};
		this.itCheckNodes = [];
		this.itCanCheck = true;

		for (var i = 1, len = cols.length - 1; i < len; i++)
		{
			var itNode = this.itNodes[i - 1];

			itNode.element = this.elNode.childNodes[i];
			itNode.element.setAttribute('it:dataIndex', itNode.dataIndex);

			if (itNode.type == 'check') {
				itNode.textElement = itNode.element.childNodes[1];
				this.itCheckNodes.push(itNode);
			} else {
				itNode.textElement = itNode.element.firstChild;
			}

			this.itNodesHash['z' + itNode.dataIndex] = itNode;
		}
		
		this.commentNode =  this.elNode.childNodes[cols.length - 1];
		var commentContainer = this.commentNode.firstChild;
		var commentButton = commentContainer.firstChild;
		
		if (commentButton.addEventListener) 
		{
			commentButton.addEventListener ("click", function() { COMMENTS.ShowCommentWindow(commentButton, a['id'], a['category_name']); },false);
		} 
		else if (commentButton.attachEvent) 
		{
			commentButton.attachEvent ("onclick", function() { COMMENTS.ShowCommentWindow(commentButton, a['id'], a['category_name']); });
		} 
		else 
		{
			commentButton.onmouseover = function() { COMMENTS.ShowCommentWindow(commentButton, a['id'], a['category_name']); };
		}
		
		this.node.fireEvent('uirendered', this.node);
	}
});
