/**
 * @name Rollover
 * @created 2008-05-06
 * @modified 2008-05-06
 * @version 0.0.1
 */

var rollover = new Rollover();
rollover.addEvent(window, 'load', function() { rollover.setToggle('.rollover', '_ov'); }, false);

function Rollover() {
	// トグル
	this.setToggle = function(target, hover, active, focus) {
		var self = this;
		target = this.collect(target);
		if (target) {
			for (var i = 0, l = target.length; i < l; i++) {
				new function() {
					var elm = target[i];
					var isActive = active && elm.src.match(active + '(\.gif|\.jpg|\.png)([\?].*|$)');
					if (isActive && !focus) return;
					elm.src.match('(\.gif|\.jpg|\.png)([\?].*|$)');
					var ext = RegExp.$1;
					var search = (isActive && focus) ? active + ext : ext;
					var replace = (isActive && focus) ? focus + ext : hover + ext;
					var out = elm.src;
					var over = elm.src.replace(search, replace);

					// プレロード
					new Image().src = over;

					// スワップ
					self.addEvent(elm, 'mouseover', function() { elm.src = over; }, false);

					// レストア
					self.addEvent(elm, 'mouseout', function() { elm.src = out; }, false);
				}
			}
		}
	}

	// 要素を取得
	this.collect = function(selector) {
		return (typeof selector == 'object') ? selector
			: (selector.match('^#(.+)')) ? document.getElementById(RegExp.$1)
			: (selector.match('^[\.](.+)')) ? this.getElementsByClassName(RegExp.$1)
			: document.getElementsByTagName(selector);
	}

	// クラス名をもとに要素を取得
	this.getElementsByClassName = function(className, parent, tagName) {
		parent = (typeof parent == 'object') ? parent
			: (typeof parent == 'string') ? document.getElementById(parent)
			: document;
		if (!tagName) tagName = '*';
		var elms = [];
		var collection = parent.getElementsByTagName(tagName);
		if (tagName == '*' && !collection.length && parent.all) collection = parent.all;// Win IE 5.x
		for (var i = 0, l = collection.length; i < l; i++) {
			if (collection[i].className.match('(^|\\s)' + className + '(\\s|$)')) {
//				elms.push(collection[i]);
				elms[elms.length] = collection[i];// Win IE 5.x
			}
		}
		return (elms.length == 0) ? null : elms;
	}

	// イベントを追加
	this.addEvent = function(elm, ev, fn, capt) {
		if (elm.addEventListener) {// Fx, Sf, Op, Ns
			elm.addEventListener(ev, fn, capt);
			return true;
		} else if (elm.attachEvent) {// Win IE
			return elm.attachEvent('on' + ev, fn);
		} else {// Mac IE
			var temp = elm['on' + ev];
			if (typeof elm['on' + ev] != 'function') {
				elm['on' + ev] = function(e) { fn(e); }
			} else {
				elm['on' + ev] = function(e) {
					temp(e);
					fn(e);
				}
			}
		}
	}
}








