/**
 * Preditor Rendering Engine Utilities
 */
var Util = {
	getMaxWidth: function(elements, inc_pad)
	{
		if ( inc_pad == undefined )
		{
			inc_pad = false;
		} 
		
		var max = 0;
		var width;
		
		elements.each( function(element) {
			
			if ( inc_pad )
			{
				var padding = parseInt(element.getStyle('paddingLeft').gsub('px', '')) + parseInt(element.getStyle('paddingRight').gsub('px', ''));
			}
			else
			{
				var padding = 0;
			}
			
			var width = element.getWidth() - padding;
			if ( width > max )
			{
				max = width;
			}
		});
		
		return max;
	},
	
	getMaxHeight: function(elements, inc_pad)
	{
		// Check if height must include padding
		if ( inc_pad == undefined )
		{
			inc_pad = false;
		} 
		
		var max = 0
		var height;
		
		elements.each( function(element) {
			
			if ( inc_pad )
			{
				var padding = parseInt(element.getStyle('paddingTop').gsub('px', '')) + parseInt(element.getStyle('paddingBottom').gsub('px', ''));
			}
			else
			{
				var padding = 0;
			}
			
			var height = element.getHeight() - padding;
			if ( height > max )
			{
				max = height;
			}
		});
		
		return max;
	},
	
	getScrollOffset: function()
	{
		var x = 0, y = 0;
		
		if ( typeof( window.pageYOffset ) == 'number' )
		{
			// Netscape
			y = window.pageYOffset;
			x = window.pageXOffset;
		}
		else if ( document.body && ( document.body.scrollLeft || document.body.scrollTop ) )
		{
			// DOM
			y = document.body.scrollTop;
			x = document.body.scrollLeft;
		}
		else if ( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) )
		{
			// IE6 standards compliant mode
			y = document.documentElement.scrollTop;
			x = document.documentElement.scrollLeft;
		}
		
		return {left: x, top: y};
	}
}

/**
 * Prototype extentions
 */
 
Element.addMethods({
	getBoxWidth: function(element)
	{
		element = $(element);
		
		var padding = parseInt(element.getStyle('padding-left').gsub('px', '')) + parseInt(element.getStyle('padding-right').gsub('px', ''));
		var border = parseInt(element.getStyle('border-left-width').gsub('px', '')) + parseInt(element.getStyle('border-right-width').gsub('px', ''));
		var margin = parseInt(element.getStyle('margin-left').gsub('px', '')) + parseInt(element.getStyle('margin-right').gsub('px', ''));
		
		// Check for NaN value returned in IE
		padding = ( isNaN(padding) ) ? 0 : padding;
		border = ( isNaN(border) ) ? 0 : border;
		margin = ( isNaN(margin) ) ? 0 : margin;
		
		return element.getWidth() + padding + border + margin;
	},
	
	getInnerDimensions: function(element)
	{
		element = $(element);
		
		var padding_width = parseInt(element.getStyle('padding-left').gsub('px', '')) + parseInt(element.getStyle('padding-right').gsub('px', ''));
		var border_width = parseInt(element.getStyle('border-left-width').gsub('px', '')) + parseInt(element.getStyle('border-right-width').gsub('px', ''));
		var margin_width = parseInt(element.getStyle('margin-left').gsub('px', '')) + parseInt(element.getStyle('margin-right').gsub('px', ''));
		
		var padding_height = parseInt(element.getStyle('padding-top').gsub('px', '')) + parseInt(element.getStyle('padding-bottom').gsub('px', ''));
		var border_height = parseInt(element.getStyle('border-top-width').gsub('px', '')) + parseInt(element.getStyle('border-bottom-width').gsub('px', ''));
		var margin_height = parseInt(element.getStyle('margin-top').gsub('px', '')) + parseInt(element.getStyle('margin-bottom').gsub('px', ''));
		
		var dimensions = element.getDimensions();
		
		var inner_width = dimensions.width - padding_width - border_width - margin_width;
		var inner_height = dimensions.height - padding_height - border_height - margin_height;
		
		return {width: inner_width, height: inner_height};		
	}
});

/**
 * Scriptaculous extensions
 */

Effect.ReSize = Class.create();

Object.extend(Object.extend(Effect.ReSize.prototype, Effect.Base.prototype), {
	
	initialize: function(element)
	{
		this.element = element;
		
		if( !this.element )
		{
			throw(Effect._elementDoesNotExistError);
		}
		
		var options = Object.extend({ amount: 100, direction: 'vert', toSize:null }, arguments[1] || {});
		
		if( options.direction == 'vert' )
		{
			this.originalSize = options.originalSize || parseInt(this.element.style.height);
		}
		else
		{
			this.originalSize = options.originalSize || parseInt(this.element.style.width);
		}

	    if( options.toSize != null )
		{
			options.amount = options.toSize - this.originalSize;
		}

		this.start(options);
	},
  
	setup: function()
	{
		// Prevent executing on elements not in the layout flow
		if ( this.element.getStyle('display') == 'none' )
		{
			this.cancel();
			return;
		}
	},
  
	update: function(position) {
		if( this.options.direction == 'vert' )
		{
			this.element.setStyle({ height: this.originalSize+(this.options.amount*position)+'px' });
		}
		else
		{
			this.element.setStyle({ width: this.originalSize+(this.options.amount*position)+'px' });
		}
	},

	finish: function()
	{
		if( this.options.direction == 'vert' )
	    {
			this.element.setStyle({ height: this.originalSize + this.options.amount + 'px' });
	    }
	    else
	    {
			this.element.setStyle({ width: this.originalSize + this.options.amount + 'px' });
	    }
	}
});

Effect.Transitions.slowstop = function(pos)
{
	return 1 - Math.pow(0.60, 20 * pos);
}

 