/*!
 * Ext JS Library 3.2.1
 * Copyright(c) 2006-2010 Ext JS, Inc.
 * licensing@extjs.com
 * http://www.extjs.com/license
 */
Ext.ux.PanelResizer = Ext.extend(Ext.util.Observable, {
	minHeight: 0,
	maxHeight: 10000000,
	stateful: false,

	constructor: function(config)
	{
		Ext.apply(this, config);
		this.events = {};
		Ext.ux.PanelResizer.superclass.constructor.call(this, config);
	},

	init: function(p)
	{
		this.panel = p;

		if (this.panel.elements.indexOf('footer') == -1)
		{
			p.elements += ',footer';
		}
		p.on('render', this.onRender, this);
	},

	onRender: function(p)
	{
		this.handle = p.footer.createChild({ cls: 'x-panel-resize' });
		if (this.stateful)
		{
			var height = Ext.state.Manager.get(this.panel.stateId || this.panel.id);
			if (height)
			{
				p.setHeight(height);
			}
		}
		this.tracker = new Ext.dd.DragTracker({
			onStart: this.onDragStart.createDelegate(this),
			onDrag: this.onDrag.createDelegate(this),
			onEnd: this.onDragEnd.createDelegate(this),
			tolerance: 3,
			autoStart: 300
		});
		this.tracker.initEl(this.handle);
		p.on('beforedestroy', this.tracker.destroy, this.tracker);
	},

	// private
	onDragStart: function(e)
	{
		this.dragging = true;
		this.startHeight = this.panel.el.getHeight();
		this.fireEvent('dragstart', this, e);
	},

	// private
	onDrag: function(e)
	{
		this.panel.setHeight((this.startHeight - this.tracker.getOffset()[1]).constrain(this.minHeight, this.maxHeight));
		this.fireEvent('drag', this, e);
	},

	// private
	onDragEnd: function(e)
	{
		this.dragging = false;
		this.fireEvent('dragend', this, e);
		if (this.stateful)
		{
			Ext.state.Manager.set(this.panel.stateId || this.panel.id, this.panel.getHeight());
		}
	}
});
Ext.preg('panelresizer', Ext.ux.PanelResizer);
