//
// prototype extensions
//
Element.addMethods({
	fire: function(element, eventName, memo, bubble) {
		element = $(element);

		if (typeof bubble == 'undefined') {
			bubble = true;
		}

		if (element == document && document.createEvent && !element.dispatchEvent) {
			element = document.documentElement;
		}

		var event;

		if (document.createEvent) {
			event = document.createEvent('HTMLEvents');
			if (eventName.indexOf(':') != -1) {
				event.initEvent('dataavailable', bubble, true);
			} else {
				event.initEvent(eventName, bubble, true);
			}
		} else {
			event = document.createEventObject();
			if (eventName.indexOf(':') != -1) {
				event.eventType = bubble ? 'ondataavailable' : 'onlosecapture';
			} else {
				event.eventType = 'on' + eventName;
			}
		}

		event.eventName = eventName;
		event.memo = memo || {};

		if (document.createEvent) {
			element.dispatchEvent(event);
		} else {
			element.fireEvent(event.eventType, event);
		}

		return Event.extend(event);
	},
	/*removePartialClassName: function(element, className) {
		if (!(element = $(element))) {
			return;
		}

		element.className = element.className.replace(className, '');
		return element;
	},*/
	isVisible: function(element) {
		if (!element) {
			return false;
		}

		while (element) {
			if (element.style && (element.style.display == 'none' || element.style.visibility == 'hidden')) {
				return false;
			}

			element = element.parentNode;
		}

		return true;
	}
});

var $extend = Object.cloneExtend = function() {
	var result = {};

	for (var x = 0, source = arguments[0]; source; source = arguments[++x]) {
		for (var key in source) {
			result[key] = source[key];
		}
	}

	return result;
}

document.ready = (function() {
	var queue = [];

	document.observe('dom:loaded', function() {
		queue.each(function(handler) {
			try {
				handler();
			} catch (e) {
				//alert(e.toString());
			}
		});
	});

	return function(handler) {
		queue.push(handler);
	}
})();

