Ext.TreeBar = Ext.extend(Ext.Panel, {
	//url to get data structure
	urlGetData : '',
	//handle tree posts, add, modify, delete, connect selected grid rows
	urlTreeHandler : '',
	urlTreeDelete : '',
	//url to get tree form config
	urlGetTreeFormItem : '',
	//frontend grid object to connect, refresh and gather selected rows
	connectedGrid : '',
	//store tree handler window 
	treeWindow : {},
	//store tree items
	treeForm : {},
	dblClickEvent : 'obj.showNodeModifyForm',

	buttons:{
		create : 'Create',
		edit : 'Edit',
		del : 'Delete',
		changeParent : 'Change category'
	},

	moduleName : '',
	gridName : '',

	dataIndex : '',

	gridPkField : 'ID',
	editableRoot : true,
	gridParentField : 'PARENT_ID',
	itemPkvalue : null,
	parentPkvalue : null,
	windowedForms : true,
	previousNode : null,
	countSelect : 0,

	tree : {},
	treeRoot : {},
	toolbar : {},

	treeLoaderParams : {},

	showToolbar :true,
	
	initTreeRoot : function(){
		this.treeRoot = new Ext.tree.AsyncTreeNode( {
			draggable : true,
			id : '-1'
		} );
	},

	initTree : function(){
		this.initTreeRoot();
		if(this.showToolbar==true){
		this.toolbar = new Ext.Toolbar( {
			items : [
				{
					tooltip : this.buttons.create,
					obj : this,
					cls : 'x-btn-icon',
					icon : CC_webroot+'/images/icons/add.gif', 
					handler : this.showNodeAddForm
				},
				{
					disabled : true,
					tooltip : this.buttons.edit,
					obj : this,
					cls : 'x-btn-icon',
					icon : CC_webroot+'/images/icons/szerkesztes.png', 
					handler : this.showNodeModifyForm
				},
				{
					disabled : true,
					tooltip : this.buttons.del,
					obj : this,
					cls : 'x-btn-icon',
					icon : CC_webroot+'/images/icons/torles.png', 
					handler : this.confirmDeleteNode
				},
				{
					xtype : 'label',
					id : 'treeBarFilter',
					cls : 'x-btn-icon',
					style : 'margin-left:6px;white-space:nowrap;display:block;width:122px;'
				}
			]
		} );
		}else{
			this.toolbar = new Ext.Toolbar( {
				items : [
					{
						xtype : 'label',
						id : 'treeBarFilter',
						cls : 'x-btn-icon',
						style : 'margin-left:6px;white-space:nowrap;display:block;width:122px;'
					}
				]
			} );
		}
		if(this.buttons.changeParent != null) {
			this.toolbar[1] = {
				xtype : 'toolbar',
				items : [
					{
						text : this.buttons.changeParent,
						obj : this,
						cls : 'x-btn-text-icon',
						icon : CC_webroot+'/images/icons/assign.gif', 
						handler : this.changeParent
					}
				]
			};
		};

		this.tree = new Ext.tree.TreePanel( {
			frame : false,
			hlColor : '#FFF',
			bodyBorder : false,
			loader : new Ext.tree.TreeLoader( {
				url : this.urlGetData,
				baseParams : this.treeLoaderParams,
				preloadChildren : true
			} ),
			lines : true,
			rootVisible : false,
			selModel : new Ext.tree.DefaultSelectionModel(),
			enableDrag : true,
			obj : this,
			useArrows : true,
			containerScroll : true,
			autoScroll : true,
			toolbar : this.toolbar
		} );
		var obj = this;
		if(typeof obj.dblClickEvent == 'function') {
			this.tree.on('dblclick', obj.dblClickEvent);
		} else {
			this.tree.on('dblclick',
				function() { eval(obj.dblClickEvent + '(obj)'); } );
		}
		this.tree.on('click', obj.setPrevNode);
		this.tree.setRootNode(this.treeRoot);
	},


	//additional functions here
	//default params here
	title : '',
	border : false,
	bodyBorder : false,
	height : 500,


	initComponent : function(){
		if(this.dataIndex == '') {
			alert('Nincs dataIndex-e a tree-nek! id: '+ this.id);
		}
		this.initTree();
		this.items = [
			this.toolbar,
			this.tree
		];
		Ext.TreeBar.superclass.initComponent.apply(this, arguments);
	},


	setPrevNode : function(obj){
		var oto = obj.ownerTree.obj;
		if(typeof oto.previousNode == 'object') {	
			oto.previousNode = obj.id;
			oto.countSelect++;
		} else {
			if(oto.countSelect >= 1) {
				oto.previousNode = obj.id;
				oto.countSelect = 0;
			} else {
				oto.countSelect++;
			}
		}

		var tbi = this.toolbar.items.items;
		for(var i = 1; i < tbi.length - 1; i++) {
			var b = tbi[i];
			if(obj.attributes['ID']) b.enable();
			else b.disable();
		}
	},


	showNodeForm : function(onSaveFunction){
		var obj = this;
		var url_params = {};
		if(obj.itemPkvalue != null) {
			url_params[obj.gridPkField] = obj.itemPkvalue;
		}
		var param = {
			singleInstance : true,
			url : obj.urlGetTreeFormItem,
			params : url_params,
			success : function(result) {
				obj.treeForm = result;
				CC.help.form.makeItems(obj.treeForm.items, obj.moduleName, obj.dataIndex, CC.b.mod[obj.moduleName].config.grids[obj.gridName]);
				if(obj.windowedForms) {
					CC.help.form.showWindow(obj.treeForm.items, obj.moduleName, obj.dataIndex, 'tree.saveNode', obj.treeForm.window.edit, obj);
					try {
						obj.treeForm.window.edit[obj.gridPkField] = url_params[obj.gridPkField];
					} catch(e) {}
				} else {
					CC.main.layout.clearCenter();
					CC.main.layout.center.add(obj.treeForm);
					CC.main.layout.center.doLayout();
					try {
						CC.f.mod[obj.moduleName][obj.gridPkField] = url_params[obj.gridPkField];
					} catch(e) {}
				}
			}
		};	
		CC.help.ajax.doAjax(param);
	},


	showNodeAddForm : function(){
		var o = this.obj;
		o.itemPkvalue = null;
		var node = o.getNode();
		o.parentPkvalue = !node ? null : node.attributes[o.gridPkField];
		o.showNodeForm();
	},

	
	getNode : function(){
		return this.tree.selModel.getSelectedNode();
	},


	showNodeModifyForm: function(obj){
		if(obj.obj != null) {
			var obj = this.obj;
		}
		var canRun = true;
		if(obj.editableRoot == false && obj.tree.selModel.getSelectedNode().attributes[obj.gridPkField] == null) {
			canRun = false;
		}
		if(canRun) {
			if(!obj.tree.selModel.getSelectedNode()) {
				Ext.Msg.alert(CC.b.enter.msgWarning, 'Select a node first');
			} else {
				obj.itemPkvalue = obj.tree.selModel.getSelectedNode().attributes[obj.gridPkField];
				obj.showNodeForm();
			}
		}
	},


	saveNode : function(id) {
		var obj = id != null ? Ext.getCmp(id) : this;
		if(!CC.help.form.validateForm(CC.f.mod[obj.moduleName].formItems[obj.dataIndex])) return false;

		var dataTemp = CC.help.form.getFormData(CC.f.mod[obj.moduleName].formItems[obj.dataIndex]);	
		dataTemp['default'][obj.gridPkField] = obj.itemPkvalue;
		//dataTemp['default'][obj.gridParentField] = obj.parentPkvalue;
		var hasNode = this.getNode();
		if(hasNode) var path = obj.tree.selModel.getSelectedNode().getPath();
		CC.help.ajax.doAjax({
			singleInstance : true,
			params : { formdata : Ext.encode(dataTemp) },
			url : obj.urlTreeHandler,
			success : function(result) {
				obj.treeRoot.reload();
				if(hasNode) obj.tree.expandPath(path);
			}
		});

		return true;
	},


	confirmDeleteNode : function() {
		var obj = this.obj;
		Ext.Msg.confirm(CC.b.enter.msgWarning, obj.textConfirmDelete,
			function(btn) {
				if(btn == 'yes') obj.doDeleteNode();
			}
		);
	},


	doDeleteNode : function() {
		var obj = this;
		if(obj.editableRoot == false && obj.tree.selModel.getSelectedNode().attributes[obj.gridPkField] == null) return;

		var urlParams = {};
		urlParams[obj.gridPkField] = obj.tree.selModel.getSelectedNode().attributes[obj.gridPkField];
		CC.help.ajax.doAjax({
			url : obj.urlTreeDelete,
			params : urlParams,
			success : function(result) {
				if(result.success) obj.reload();
				else Ext.MessageBox.alert(CC.b.enter.config.msgError, result.message);
			}
		});
	},


	changeParent : function(obj) {
		die_r(obj);
	},


	reload : function() {
		var sel = this.tree.selModel.getSelectedNode();
		var path = null
		if(sel != null) {
			path = sel.getPath();
		}
		this.treeRoot.reload();
		if(sel != null) {
			this.tree.expandPath(path);
		}
	},


	setTBHeight : function(h) {
		this.setHeight(h);
		this.tree.setHeight(h - 51);
	}

});
Ext.reg('treebar', Ext.TreeBar);