/*
 *		Element.extend
 */
Element.addMethods(
{
	centralize : function(element, container, type)
	{
		element = $(element);
		types_ = $w('absolute fixed relative static');
		if(!isset(type) && typeof container == 'string' && types_.indexOf(container)!=-1)
		{
			type = container;
			container = null;
		}
		if(!isset(type)) type = types_[0];
		if(isempty(container)) { container = document.viewport };

		x = (container.getWidth()*0.5) - (element.getWidth()*0.5);
		y = (container.getHeight()*0.5) - (element.getHeight()*0.5);

		element.position(type, x, y);
		return element;
	},
	position : function(element, type, x, y)
	{
		element = $(element);
		if(arguments.length == 3 && typeof type == 'number')
		{
			y = x;
			x = type;
			type = 'absolute';
		}
		styles = 
		{
			'position' : type,
			'left' : x+'px',
			'top' : y+'px'
		}
		element.setStyle(styles);
		return element;
	},
	zindex : function(element, z)
	{
		element = $(element);
		if(isset(z))
		{
			if(!element.id) element.id = "Z_indexed"+Math.floor((999+(Math.random()*9999)));

			zindexRule = (" { z-index: level; }").replace('level',z);
			zindexId = '#'+element.id;

			if(!Prototype.Browser.IE)
			{
				zindexTag = ('<style type="text/css"> #styles </style>').replace('#styles',zindexId+zindexRule);
				$$('head')[0].insert(zindexTag);
			}
			else
			{
				zindexTag = document.createStyleSheet();
				$(zindexTag);
				zindexTag.addRule(zindexId, zindexRule);
			}
			element.__zindex = z;
			return element;
		}
		else
		{
			if(isset(element.__zindex)) return element.__zindex;
			else
			{
				return 0;
			}
		}
	},
	move : function(element, x, y, mode, onFinish, onStart)
	{
		var opts;
		element = $(element);

		if(!Object.isNumber(x) && arguments.length == 2)
		{
			opts = x;
		}
		if(isempty(opts))
		{
			opts = {'x':x,'y':y,'mode':mode,'onFinish':onFinish,'onStart':onStart};
		}

		new Effect.Move(element, opts);
		return element;
	},
	moveTo : function(element, x, y, mode, onFinish, onStart)
	{
		element = $(element);
		
		return element.move(x, y, mode, onFinish, onStart);
	}
});

/*
 *		Conveniences
 */
Object.extend(String.prototype,
{
	lcfirst : function()
	{
		map = this.split('');
		map[0] = map[0].toLowerCase();
		return map.join('');
	},
	trim : function()
	{
		return this.strip().replace(String.fromCharCode(13),'').replace(String.fromCharCode(9),'');
	}
});
Object.extend(Array.prototype,
{
	withoutEmptys : Array.prototype.without.curry('',' ',null,'undefined',undefined) 
});
var ___emptyValues = ['',' ',null,undefined,'undefined',0];
var isset = function(variable) { return !Object.isUndefined(variable); }
var isempty = function(variable)
{
	if(___emptyValues.indexOf(variable) != -1)
	{
		return true;
	}
	else
	{
		if(variable.length && variable.length == 0) return true;
		if(typeof variable == 'undefined') return true;
	}
	
	return false;
}
var ping = function() { alert('ping'); }

var OnLoadHandler =
{
	___ready : false,
	onReady : function(func)
	{
		if(!this.___ready)
			this.schedule(func);
		else
			func();
		return func;
	},
	schedule : document.observe.bind(document,'dom:loaded'),
	setReady : function() { this.___ready = true; }
}
OnLoadHandler.onReady(OnLoadHandler.setReady.bind(OnLoadHandler));
document.onReady = OnLoadHandler.onReady.bind(OnLoadHandler);

