var oh_rating = {
	elements: {},
	storage: {},
	addListener: function(element, md5) {
		this.storage[element] = [];
		var images = oh_rating.getImages(element);
		if (images.length) {
			var rating = 0;
			$A(images).each(function(value) {
				rating++;
				if (oh_rating.elements[md5] && oh_rating.elements[md5].slider) {
					oh_rating.storage[element].push(value.src);
				}
				Event.observe(value, 'mouseover', oh_rating.handleStartSelector(element, md5, rating));
			});
		}
		Event.observe(element, 'mouseout', oh_rating.handleStopSelector(element, md5));
	},
	removeListener: function(element) {
		this.storage[element] = [];
		var images = oh_rating.getImages(element);
		element = $(element);

		if (images.length) {
			$A(images).each(function(value) {
				Event.stopObserving(value, 'mouseover');
			});
			Event.stopObserving(element, 'mouseout');

		/**
		 * @deprecated: Required for prototype 1.5.0 - TYPO3 4.2.0 uses prototype 1.6
		 **
			for (var i = 0, length = Event.observers.length; i < length; i++) {
				alert(i);
				$A(images).each(function(value) {
					if (Event.observers[i][0] == value) {
						Event.stopObserving.apply(this, Event.observers[i]);
						Event.observers[i][0] = null;
					}
				});
				if (Event.observers[i][0] == element) {
					Event.stopObserving.apply(this, Event.observers[i]);
					Event.observers[i][0] = null;
				}
			}
		*/
		}
	},
	setupElements: function(md5, elements) {
		this.elements[md5] = elements;
	},
	handleStartSelector: function(element, md5, rating) {
		return function(event) { oh_rating.startSelector(element, md5, rating); };
	},
	handleStopSelector: function(element, md5) {
		return function(event) { oh_rating.stopSelector(element, md5); };
	},
	startSelector: function(element, md5, rating) {
		var images = oh_rating.getImages(element);
		var labelElement = oh_rating.getLabelElement(element);
		if (oh_rating.elements[md5] && oh_rating.elements[md5].slider && oh_rating.elements[md5].icons && images.length) {
			var icons = oh_rating.elements[md5].icons;
			var current = 0;
			$A(images).each(function(value) {
				value.src = (current++<rating ? icons['full'] : icons['zero']);
			});
		}
		if (labelElement && oh_rating.elements[md5].labels && oh_rating.elements[md5].labels[rating]) {
			labelElement.innerHTML = oh_rating.elements[md5].labels[rating];
		}
	},
	stopSelector: function(element, md5) {
		var images = oh_rating.getImages(element);
		if (oh_rating.elements[md5] && oh_rating.elements[md5].slider && oh_rating.storage[element] && images.length) {
			var icons = oh_rating.storage[element];
			var current = 0;
			$A(images).each(function(value) {
				value.src = icons[current++];
			});
		}
		var labelElement = oh_rating.getLabelElement(element);
		if (labelElement) {
			if (oh_rating.elements[md5] && oh_rating.elements[md5].labels && oh_rating.elements[md5].labels['default']) {
				labelElement.innerHTML = oh_rating.elements[md5].labels['default'];
			} else {
				labelElement.innerHTML = '&nbsp;';
			}
		}
	},
	getImages: function(element) {
		var images = $(element).getElementsByTagName('img');
		return images;
	},
	getLabelElement: function(element) {
		var labelElements = Element.select(element, '.label');
		if (labelElements.length) {
			return labelElements[0];
		}
		return false;
	},
	removeChildren: function(element) {
		element = $(element);
		$A(element.childNodes).each(function(node) {
			element.removeChild(node);
		});
	}
};