var Rollover = Class.create();
Rollover.prototype = {
	initialize : function(obj) {
		this.elements = $$(obj.selector);
		this.suffixOver = obj.suffixOver;
		this.suffixDown = obj.suffixDown;
		if(this.elements && (this.suffixOver || this.suffixDown)) this.setRollover();
	},
	
	setRollover: function() {
		var objs = [];
		var preloadImgs = [];
		for(var i=0; i<this.elements.length; i++) {
			var tmp = {};
			switch(this.elements[i].tagName) {
				case 'IMG':
					var parentElement = this.elements[i].parentNode;
					for(var s=0; s<4; s++) {
						if(parentElement && parentElement.tagName == 'A') {
							tmp.eventObj = parentElement;
							tmp.targetObj = this.elements[i];
							tmp.inactive = this.elements[i].src;
							if(this.suffixOver) {
								tmp.over = this.getImagePath(this.elements[i].src, this.suffixOver);
								preloadImgs.push(tmp.over);
							}
							if(this.suffixDown) {
								tmp.down = this.getImagePath(this.elements[i].src, this.suffixDown);
								preloadImgs.push(tmp.down);
							}
							objs.push(tmp);
							break;
						} else if(parentElement.parentNode) {
							parentElement = parentElement.parentNode;
						} else {
							break;
						}
					}
					break;
				default:
					tmp.eventObj = this.elements[i];
					tmp.targetObj = this.elements[i];
					tmp.inactive = this.elements[i].src;
					if(this.suffixOver) {
						tmp.over = this.getImagePath(this.elements[i].src, this.suffixOver);
						preloadImgs.push(tmp.over);
					}
					if(this.suffixDown) {
						tmp.down = this.getImagePath(this.elements[i].src, this.suffixDown);
						preloadImgs.push(tmp.down);
					}
					objs.push(tmp);
					break;
			}
		}
		
		for(var i=0; i<objs.length; i++) {
			if(this.suffixOver) {
				this.setEvent(objs[i].eventObj, objs[i].targetObj, objs[i].over, 'mouseover');
				this.setEvent(objs[i].eventObj, objs[i].targetObj, objs[i].inactive, 'mouseout');
			}
			if(this.suffixDown) {
				this.setEvent(objs[i].eventObj, objs[i].targetObj, objs[i].down, 'mousedown');
				this.setEvent(objs[i].eventObj, objs[i].targetObj, objs[i].inactive, 'mouseup');
			}
		}
		
		this.preloadImages(preloadImgs);
	},
	
	getImagePath: function(path, suffix) {
		var ext = path.substring(path.lastIndexOf('.'));
		return path.substring(path, path.length - ext.length) + '_' + suffix + ext;
	},
	
	preloadImages: function(imgs) {
		var loaded = {};
		for(var i=0; i<imgs.length; i++) {
			if(loaded[imgs[i]]) continue;
			loaded[imgs[i]] = true;
			(new Image).src = imgs[i];
		}
	},
	
	setEvent: function(eObj, tObj, path, evType) {
		Event.observe(eObj, evType, function(){
			tObj.src = path;
		});
	}
};

Event.domReady.add(function() {
	new Rollover({
		selector:   'img.rollover, input[type~="image"].rollover',
		suffixOver: 'over'
	});
});


