Object.extend(Number.prototype, {
	toInt: function(base) {
		return parseInt(this, base || 10);
	}
});
Object.extend(String.prototype, {
	toInt: function(base) {
		return parseInt(this, base || 10);
	}
});
Object.extend(window, {
	addEvent: function(element, type, fn) {
		if (typeof fn === 'undefined') {
			var fn = type;
			var type = element;
			var element = window;
		}
		Element.addEvent(element, type, fn);
	},
	removeEvent: function(element, type, fn) {
		if (typeof fn === 'undefined') {
			var fn = type;
			var type = element;
			var element = window;
		}
		Element.removeEvent(element, type, fn);
	},
	addEvents: function(events) {
		Element.addEvents(window, events);
	},
	removeEvents: function(events) {
		Element.removeEvents(window, events);
	}
});
Object.extend(document, {
	id: window.$
});
Element.addMethods({
	addEvent: function(element, type, fn) {
		var func = function(ev) {
			ev.stop = function() {
				Event.stop(ev);
				return ev;
			};
			return fn(ev);
		};
		Event.observe(element, type, func, false);
		return element;
	},
	removeEvent: function(element, type, fn) {
		Event.stopObserving(element, type, fn, false);
		return element;
	},
	fireEvent: function(element, ev) {
		Event.fire(element, ev);
	},
	addEvents: function(element, events) {
		for (var event in events) {
			Element.addEvent(element, event, events[event]);
		}
		return element;
	},
	removeEvents: function(element, events) {
		for (var event in events) {
			Element.removeEvent(element, event, events[event]);
		}
		return element;
	},
	getElement: function(element, expression) {
		return Element.getElementsBySelector.apply(
			element,
			[element].concat(expression.split(','))
		)[0];
	},
	getElements: function(element, expression) {
		return Element.getElementsBySelector.apply(
			element,
			[element].concat(expression.split(','))
		);
	},
	getParent: function(element) {
		return document.id(element.parentNode);
	},
	getProperty: function(element, attribute) {
		return element[attribute];
	},
	setProperty: function(element, attribute, value) {
		element[attribute] = value;
		return element;
	},
	removeProperty: function(element, attribute) {
		element[attribute] = null;
	},
	set: function(element, attribute, value) {
		element[attribute + 'Options'] = value;
		return element;
	},
	tween: function(element, property, from, to) {
		if (typeof to === 'undefined') {
			to = from;
			from = element.getStyle(property);
		}
		(new Fx.Style(element, property, element.tweenOptions)).custom(from, to);
		return element;
	},
	morph: function(element, props) {
		for (var p in props) {
			if (typeof props[p][1] === 'undefined') {
				props[p][1] = props[p][0];
				props[p][0] = element.getStyle(p);
			}
		}
		(new Fx.Styles(element, element.morphOptions)).custom(properties);
		return element;
	},
	hasClass: Element.hasClassName,
	addClass: Element.addClassName,
	removeClass: Element.removeClassName,
	toggleClass: Element.toggleClassName,
	swapClass: function(element, remove, add) {
		return element.removeClass(remove).addClass(add);
	}
});

