App.Categories = function() {
	var tree = null;
	var tId = null;
	
	return {
		init: function() {
			var loader = new Ext.tree.TreeLoader({
				dataUrl: 'shop.php'
				, method: 'post'
				, baseParams: { realm: 'category', action: 'getChildCategoriesList' }
				, baseAttrs: { singleClickExpand: true }
			});
             
			loader.on('beforeload', function(loader, node) {
				if (node.attributes.Children == 0)
                    return false;
                Ext.apply(loader.baseParams, { id : node.attributes.id });
			});
			
			loader.on('load', function(loader, node) {
				node.eachChild(function(child) {
					if (child.attributes.Children == 0) child.expand();
				});
			});
		
			tree = new Ext.tree.TreePanel('tree', {
				animate: true
				, rootVisible: false
				, loader: loader
				, containerScroll: false
				, singleExpand: true
			});
		
			var root = new Ext.tree.AsyncTreeNode({
				text: 'root'
				, draggable: false
				, singleClickExpand: true
				, id:'1'
			});
            
			tree.setRootNode(root);
		
			tree.render();
			root.expand();
		
			tree.on('click', function(node) { var categoriesId = (node.isLeaf()) ? node.attributes.id : null; App.ProductView.loadList(categoriesId); });
			tree.on('click', App.Search.reset, App.Search);
		}
		
		, setPath: function(list) {
			var nodeId, node;
			if (! list.length) return;
			nodeId = list.shift();
			if (! nodeId) return;
			node = tree.getNodeById(nodeId);
			if (node) {
				node.select();
				if (!node.isLeaf()) {
					if (node.isExpanded()) 
						this.setPath(list);
					else 
						node.expand(false, true, this.setPath.createDelegate(this, [list]));
				}
				else {
					if (! App.ProductView.productsPanel) App.ProductView.loadList(null);
				}
				return;
			}
			this.setPath.defer(250, this, [list]);
		}
		
		, loadFilterList: function(filter) {
			if (Ext.Ajax.isLoading(tId)) Ext.Ajax.abort(tId);
			var r = tree.getRootNode();
			while(r.firstChild) {
				r.removeChild(r.firstChild);
			}
			tId = Ext.Ajax.request({
				url: 'shop.php'
				, method: 'POST'
				, params: { realm: 'category', action: 'getListByFilter', filter: filter }
				, success: function(response) {
					var data = Ext.decode(response.responseText || '[]');
					Ext.each(data, function(record) {
						n = new Ext.tree.AsyncTreeNode({
							id: record.id
							, text: record.text
							, leaf: record.Children == 0
							, singleClickExpand: true
						});
						n.attributes = record;
						r.appendChild(n);
					});
				} 
			})
		}
		
		, reload: function() {
			tree.getRootNode().reload();
		}
	}
}();

Ext.onReady(App.Categories.init, App.Categories, true);
