Rollover = function (selector, imgSelector) {	// (selector, [imgSelector])
	this.selector = selector;
	this.imgSelector = imgSelector;	// if imgSelector passed, apply event to first, fetch img with second
	this.imgCache = new Array();
	Rollover.list.push(this);
}

Rollover.list = new Array();


onloadList.unshift(		// adds to front of array
	function () {
		for(var i = 0; i < Rollover.list.length; i++) {
			Rollover.list[i].init();
		}
	}
);


p = Rollover.prototype;

p.init = function () {
	var tags;
	tags = document.select(this.imgSelector || this.selector);	// get by imgSelector, or if that's not there, selector
	
	if(tags.length > 0) {
		if(tags[0].tagName == 'IMG' || tags[0].tagName == 'INPUT') {	// use img tags, get image source from src attr
			for(var iTag = tags.length - 1; iTag >= 0; iTag--) {
				this.cacheSrc(tags[iTag].src);
			}
			this.bind();
		} else {	// use div or other tags, get image source from applied CSS
			for(var iTag = tags.length - 1; iTag >= 0; iTag--) {
				var src = Tag_getStyle.apply(tags[iTag], ['background-image']);
				this.cacheSrcCss(src);
			}
			if(tags[0].tagName != 'A')
				this.bindCssClassHover();
		}
	}
}

Rollover.parseSrcCss = function (src) {
	if(src.indexOf("url('") == 0 || src.indexOf('url("') == 0) {	// url('') func with quotes
		return src.substring(5, src.length - 2);
	} else {
		return src.substring(4, src.length - 1);
	}
}

p.cacheSrcCss = function (src) {
	this.cacheSrc(Rollover.parseSrcCss(src));
}

p.cacheSrc = function (src) {
	if(src.indexOf('-active') > 0)	// don't attempt to cache active images
		return;
		
	this.imgCache.push(Rollover.createImage(src));
	
	var sParts = Rollover.splitSrc(src);
	
	this.imgCache.push(Rollover.createImage(sParts[0] + '-hover.' + sParts[1]));
}

Rollover.createImage = function (src) {
	var image = new Image();
	image.src = src;
	return image;
}

Rollover.splitSrc = function (src) {
	var indexOfDot = src.lastIndexOf('.');
	return [src.substr(0, indexOfDot), src.substr(indexOfDot + 1)];
}

p.bind = function () {
	var ev;
	ev = EventDefs.get(this.selector, 'onmouseover');
	ev.bind(Rollover.over, {imgSelector: this.imgSelector});
	
	ev = EventDefs.get(this.selector, 'onmouseout');
	ev.bind(Rollover.out, {imgSelector: this.imgSelector});
}
p.bindCssClassHover = function () {
	var ev;
	ev = EventDefs.get(this.selector, 'onmouseover');
	ev.bind(Rollover.overCss);
	
	ev = EventDefs.get(this.selector, 'onmouseout');
	ev.bind(Rollover.outCss);
}


Rollover.over = function (ev) {
	if(ev.options && ev.options.imgSelector) {
		var tags = call(ev.tag, Tag_select, [ev.options.imgSelector]);
		forall(tags, function (tag) {Rollover.hoverImg(tag);}, true);
	} else {
		Rollover.hoverImg(ev.tag);
	}
}
Rollover.overCss = function (ev) {
	var src = call(ev.tag, Tag_getStyle, ['background-image']);
	src = Rollover.parseSrcCss(src);
	var sParts = Rollover.splitSrc(src);
	ev.tag.style.backgroundImage = 'url("' + sParts[0] + '-hover.' + sParts[1] + '")';
	//CssClassList.add(ev.tag, 'hover');
}

Rollover.hoverImg = function (img) {
	if(img.src.toString().indexOf('-active') > 0)	// don't hover active images
		return false;

	var sParts = Rollover.splitSrc(img.src.toString());

	img.src = sParts[0] + '-hover.' + sParts[1];
}

Rollover.out = function (ev) {
	if(ev.options && ev.options.imgSelector) {
		var tags = call(ev.tag, Tag_select, [ev.options.imgSelector]);
		forall(tags, function (tag) {Rollover.unhoverImg(tag);}, true);
	} else {
		Rollover.unhoverImg(ev.tag);
	}
}
Rollover.outCss = function (ev) {
	ev.tag.style.backgroundImage = '';
	//CssClassList.remove(ev.tag, 'hover');
}

Rollover.unhoverImg = function (img) {
	if(img.src.toString().indexOf('-active') > 0)	// don't hover active images
		return false;

	var sParts = img.src.toString().split('-hover');

	img.src = sParts[0] + sParts[1];
}