/**
 *
 * @auther Adam Brill adam@solutionset.com
 * @date 20070122
 *
 * @see prototype.js v1.6
 * @see SS.Base.js for v1.6
 */

SS.Restrain = Class.create(SS.Base, {
	/**
	 * Object used to store nodes. Extends the parent class nodes
	 * @var Object
	 */
	n: {
		element: null
	},
	
	/**
	 * @param Function $super
	 * @param DOM Element element
	 * @param object options
	 * @return void
	 */
	initialize: function($super, element, options) {
		this.n.element = $(element);
		
		this._captureEvents();
		this.putOnScreen();
	},
	
	/**
	 * @param DOM Event e
	 * @return void
	 */
	onMoveElement: function(e) {
		this.putOnScreen();
	},
	
	/**
	 * @param void
	 * @return void
	 */
	putOnScreen: function() {
		var coords = Object.extend(document.viewport.getDimensions(), document.viewport.getScrollOffsets()),
		dims = this.n.element.getDimensions(),
		style = {top: parseInt(this.n.element.getStyle('top')), left: parseInt(this.n.element.getStyle('left'))};
		
		if (coords.top > style.top) {
			this.n.element.setStyle({top:coords.top + "px"});
		} else if (coords.height+coords.top < style.top+dims.height && dims.height < coords.height) {
			this.n.element.setStyle({top:coords.height+coords.top-dims.height + "px"});
		}
		
		if (coords.left > style.left) {
			this.n.element.setStyle({left:coords.left + "px"});
		} else if (coords.width+coords.left < style.left+dims.width && dims.width < coords.width) {
			this.n.element.setStyle({left:coords.width+coords.left-dims.width + "px"});
		}
	},
	
	/**
	 * @param void
	 * @return void
	 */
	_captureEvents: function() {
		Element.observe(this.n.element, "ss:move", this.onMoveElement.bindAsEventListener(this));
	}
});

/**
 * @param Function proceed
 * @return void
 */
Draggable.prototype.updateDrag = Draggable.prototype.updateDrag.wrap(function(proceed) {
	var args = $A(arguments);
	args.splice(0,1);
	proceed.apply(this, args);
	Element.fire(this.element, 'ss:move');
});
