
var loaded = false;
var overKey = "_on";
var activeKey = "_active";
var activeImgNames = new Array();
activeImgNames.contains = function(str) {
	for (var i = 0; i < this.length; i++) {
		if (this[i] == str) {
			return true;
		}
	}
	return false;
};

var naviClassnames = new Array();
naviClassnames.contains = function(str) {
	for (var i = 0; i < this.length; i++) {
		if (this[i] == str) {
			return true;
		}
	}
	return false;
};

/**
 * ページに含まれているすべての画像で、マウスオーバー状態の画像をプリロードする。
 * ただし、class="preload"と指定されたimg要素に限定する。
 */
function initPreloadImages() {
	if (loaded) { return; } else { loaded = true; }
	var overkey = "_on";
	var images = getTagElements('img');
	for (var i = 0; i < images.length; i++) {
		var className = getClassname(images[i]);
		if (className && className.indexOf('preload') != -1) {
			var suffix = getSuffix(images[i]);
			var basename = getBasename(images[i], overkey);
			(new Image()).src = basename + overkey + suffix;
		}
	}
}

/**
 * a要素内の画像について、マウスオーバー処理を追加する。
 * ただし、a要素にclass="rollover"属性が指定されている場合に限定。
 */
function initRolloverAnchors() {
	var anchors = getTagElements('a');
	for (var i = 0; i < anchors.length; i++) {
		var className = getClassname(anchors[i]);
		if (className && className.indexOf('rollover') != -1) {
			anchors[i].onmouseover
				= function(event) { swapImg(event, overKey, activeKey);};
			anchors[i].onmouseout 
				= function(event) { swapImg(event, overKey, activeKey);};
			anchors[i].onblur 
				= function(event) { swapImg(event, overKey, activeKey);};
			anchors[i].onfocus 
				= function(event) { swapImg(event, overKey, activeKey);};
		}
	}
}

/**
 * ナビゲーション要素用の初期化処理。
 * ロールオーバー画像のプリロード処理と、条件に合う画像をアクティブ状態に入れ替える処理を行う。
 */
function initNavigation() {
	scanClassnames(document.body);
	var images = getTagElements('img');
	for (var i = 0; i < images.length; i++) {
		var img = images[i];
		if (!img.id) continue;
		
		/* オーバー画像のプリロード */
		var suffix = getSuffix(img);
		var basename = getBasename(img, overKey, activeKey);
		(new Image()).src = basename + overKey + suffix;
		
		/*
		 * idと同じclassがある場合はアクティブ状態の画像に入れ替える。
		 */
		if (naviClassnames.contains(img.id)) {
			activeImgNames.push(img.id);
			img.src = basename + activeKey + suffix;
		}
	}
}

/**
 * 指定した要素以下で使用されているclass属性を取得し、naviClassnames配列に格納する。
 */
function scanClassnames(elms) {
	if (elms.tagName.toLowerCase() == 'body') naviClassnames.push(getClassname(elms));
	var children = $(elms).immediateDescendants();
	for (var i = 0; i < children.length; i++) {
		var elm = children[i];
		var classNames = getClassname(elm);
		if (classNames) {
			naviClassnames.push(classNames.split(" "));
		}
		scanClassnames(elm);
	}
}

/**
 * 指定したイベントを元に画像を入れ替える。
 */
function swapImg(event, key, activeKey) {
	var evt = getEvent(event);
	var img = getTarget(evt);
	var imgId = getAttribute(img, 'id');
	var suffix = getSuffix(img);
	var path = getBasename(img, key, activeKey);

	var newSrc;
	if (evt.type == 'mouseover' || evt.type == 'focus') {
		newSrc = (activeImgNames.contains(imgId))
			? path + activeKey + suffix
			: path + key + suffix;
	} else if (evt.type == 'mouseout' || evt.type == 'blur') {
		/*
		newSrc = (activeImgName != "" && imgId != "" && activeImgName == imgId)
			? path + activeKey + suffix
			: path + suffix;
		*/
		newSrc = (activeImgNames.contains(imgId))
			? path + activeKey + suffix
			: path + suffix;
	}
	img.src = newSrc;
}

/**
 * 指定した要素のclass属性値を取得する。
 */
function getClassname(obj) {
	var classname;
	if (obj.className) {
		classname = obj.className;
	} else if (obj.getAttribute('class')){
		classname = obj.getAttribute('class');
	}
	return classname;
}

/**
 * 指定した要素の指定した属性の値を取得する。
 */
function getAttribute(obj, attrName) {
	var attr;
	if (eval("obj."+attrName)) {
		attr = eval("obj."+attrName);
	} else if (obj.getAttribute) {
		attr = obj.getAttribute(attrName);
	}
	return attr;
}

/**
 * パスの、拡張子を除いた部分を取得する。
 */
function getBasename(img, key, activeKey) {
	var path = img.src.substr(0, img.src.lastIndexOf('.'));
	if (path.lastIndexOf(key) == (path.length - key.length)) {
		path = path.substr(0, path.length - key.length);
	}
	if (path.lastIndexOf(activeKey) == (path.length - activeKey.length)) {
		path = path.substr(0, path.length - activeKey.length);
	}
	return path;
}

/**
 * パスの拡張子部分を取得する。
 */
function getSuffix(img) {
	var suffix = img.src.substr(img.src.lastIndexOf('.'));
	return suffix;
}

/**
 * イベントを取得する。
 */
function getEvent(event) {
	return (!event && window.event) ? window.event : event;
}

/**
 * イベントの発生元要素を取得する。
 */
function getTarget(evt) {
	var target = (evt.target) ? evt.target : evt.srcElement;
	if (evt.type == 'focus' || evt.type == 'blur') {
		return target.getElementsByTagName('img')[0];
	} else if (evt.type == 'mouseover' || evt.type == 'mouseout') {
		return target;
	}
}

/**
 * 指定したタグ名を持つ要素リストを取得する。
 */
function getTagElements(tagName) {
	var tags;
	if (document.getElementsByTagName) {
		tags = document.getElementsByTagName(tagName);
	}
	return tags;
}





if (window.attachEvent) {
	window.attachEvent('onload', initRolloverAnchors);
	window.attachEvent('onload', initPreloadImages);
	window.attachEvent('onload', initNavigation);
} else if (window.addEventListener){
	window.addEventListener('load', initRolloverAnchors, true);
	window.addEventListener('load', initPreloadImages, true);
	window.addEventListener('load', initNavigation, true);
}


