Ext.BLANK_IMAGE_URL = '/primal/pub/img/blank.gif';

Ext.ux.handleError = function(response, title, fn) {
	var data = Ext.util.JSON.decode(response.responseText);
	if (data['success']==false) {
		Ext.Msg.show({
			title: title ? title.lc() : 'Error',
			fn : fn ? fn : null,
			msg: data['exception'],
			buttons: Ext.Msg.OK,
			icon: Ext.Msg.ERROR,
			minWidth: 200
		});

		return true;
	}

	return false;
}

Ext.ux.handleException = function(data, title, fn) {
	if (data['success']==false) {
		Ext.Msg.show({
			title: title ? title.lc() : 'Error'.lc(),
			fn : fn ? fn : null,
			msg: data['exception'],
			buttons: Ext.Msg.OK,
			icon: Ext.Msg.ERROR,
			minWidth: 200
		});

		return true;
	}

	return false;
}

Ext.override(Ext.tree.TreeEditor, {
    triggerEdit : function(node, defer){
        this.completeEdit();
        if(node.attributes.editable !== false){
            this.editNode = node;
            if(this.tree.autoScroll){
                Ext.fly(node.ui.getEl()).scrollIntoView(this.tree.body);
            }
            var value = node.text || '';
            if (!Ext.isGecko && Ext.isEmpty(node.text)){
                node.setText('&nbsp;');
            }
            this.autoEditTimer = this.startEdit.defer(this.editDelay, this, [node.ui.textNode, value]);
            return false;
        }
    }
});

//implement getState for TreePanel to make stateful work
Ext.override(Ext.tree.TreePanel, {
    getState: function() {
        //get current expanded nodes
        var state = [];
        for(var id in this.nodeHash)
        {
            var node = this.nodeHash[id];
            if (node.expanded)
            {
                var path = node.getPath();
                var add = true;

                //remove path's parents
                var parents = node.getOwnerTree();
                for (var i=0; i<parents.length; i++)
                {
                    state.remove(parents[i].getPath());
                    //if any of its parents are collapsed, don't add
                    if (!parents[i].expanded) add = false;
                }

                if (add)
                {
                    state.push(node.getPath());
                }
            }
        }

        return state;
    },

    applyState : function(state, config) {
		this.getRootNode().expand();

        if (state && state.length > 0)
        {
            for (var i=0; i<state.length; i++)
            {
                var path = state[i];

				this.expandPath(path);
            }
            return true;
        }

    }
    
	, storeState : function () {
		this.innerState = this.getState();
	}

	, restoreState: function () {
		if (this.innerState) {
			this.applyState(this.innerState);
		}
	}
});

/**
 * Merge 2 menus
 * Only 1 level merge
 *
 */
Ext.ux.mergeMenu = function(menu1, menu2) {
	for (var i=0;i<menu1.items.getCount();i++) {
		var item1 = menu1.items.get(i);
		
		var found = null;
		for (var t=0;t<menu2.items.getCount();t++) {
			var item2 = menu2.items.get(t);
			
			if (item2.text==item1.text) {
				found = item2;
				break;
			}
		}
		
		if (found) {
			if (item1.menu && found.menu) {
				for (var j=0;j<found.menu.items.getCount();j++) {
					item1.menu.add(found.menu.items.get(j));
				}
				
				found._processed = true;
			}
		}
	}
	
	for (var t=0;t<menu2.items.getCount();t++) {
		var item2 = menu2.items.get(t);
		if (!item2._processed) {
			menu1.add(item2);
		}
	}
	
	return menu1;
}
