Effect.ScaleTo = Class.create();
Object.extend(Object.extend(Effect.ScaleTo.prototype, Effect.Base.prototype), {
initialize: function(element, width, height) {
	this.element = $(element);
	if(!this.element) throw(Effect._elementDoesNotExistError);

	var options = Object.extend({
		scaleX: true,
		scaleY: true,
		scaleContent: true,
		scaleFromCenter: false,
		scaleMode: 'box',        // 'box' or 'contents' or {} with provided values
		scaleToW: width,
		scaleToH: height
	}, arguments[3] || {});
	this.start(options);
},

setup: function() {
	this.elementPositioning = this.element.getStyle('position');
	
	this.originalStyle = {};
	['top','left','width','height','fontSize'].each( function(k) {
	this.originalStyle[k] = this.element.style[k];
	}.bind(this));
	
	this.originalTop  = this.element.offsetTop;
	this.originalLeft = this.element.offsetLeft;
			
	this.dims = null;
	if(this.options.scaleMode=='box')
	this.dims = [this.element.offsetHeight, this.element.offsetWidth];
	if(/^content/.test(this.options.scaleMode))
	this.dims = [this.element.scrollHeight, this.element.scrollWidth];
	if(!this.dims)
	this.dims = [this.options.scaleMode.originalHeight,
	this.options.scaleMode.originalWidth];
},

update: function(position) {
	var currentScaleW = (this.options.scaleToW - this.dims[1]) * position;
	var currentScaleH = (this.options.scaleToH - this.dims[0]) * position;
	this.setDimensions(this.dims[0] + currentScaleH, this.dims[1] + currentScaleW);
},

setDimensions: function(height, width) {
	var d = {};
	if(this.options.scaleX) d.width = Math.round(width) + 'px';
	if(this.options.scaleY) d.height = Math.round(height) + 'px';
	if(this.options.scaleFromCenter) {
		var topd  = (height - this.dims[0])/2;
		var leftd = (width  - this.dims[1])/2;
		if(this.elementPositioning == 'absolute') {
			if(this.options.scaleY) d.top = this.originalTop-topd + 'px';
			if(this.options.scaleX) d.left = this.originalLeft-leftd + 'px';
		} else {
			if(this.options.scaleY) d.top = -topd + 'px';
			if(this.options.scaleX) d.left = -leftd + 'px';
		}
	}
	this.element.setStyle(d);
}
});
