/** 
 * 指定された要素に対して、イベントリスナーを定義する
 **/
function addListener(el, eventType, fnc, cap) {
	if (el.addEventListener) {
		el.addEventListener(eventType, fnc, cap);
	} else if (el.attachEvent) {
		el.attachEvent("on" + eventType, fnc);
	}
}

/** 
 * 指定されたIDに該当するエレメントを取得する
 **/
function getEmt(id) {
	var el = document.getElementById(id);
	return el;
}

/** 
 * フェードインの処理を指示する
 **/
var fi_array = new Array();
function fadeIn(elId, opacity, max, sec, add, fnc) {

	// Arrayに新しいオブジェクトを追加する
	var arrayNo = fi_array.length;
	fi_array[arrayNo] = new Object();

	var obFi = fi_array[arrayNo];
	obFi.count = 0;
	obFi.elid = elId;

	// アルファ値の初期値
	if (!opacity) 	obFi.opacity = 0;
	else 				obFi.opacity = opacity;

	// アルファ値の最大値
	if (!max) 						obFi.max = 100;
	else if (100 < max) 	obFi.max = 100;
	else 								obFi.max = max;

	// フェードインの間隔
	if (!sec) 	obFi.sec = 200;
	else 			obFi.sec = sec;

	// アルファ値の増加値
	if (!add) 	obFi.add = 5;
	else 			obFi.add = add;

	// 対象となるエレメントのアルファ値を初期化する
	setOpacity(elId, obFi.opacity);

	// 対象となるエレメントをフェードインする
	obFi.timerid = setInterval("changeOpacity(" + arrayNo + ", " +  fnc + ")", obFi.sec);
}

/** 
 * タイマーを使って、フェードイン処理を行う
 **/
function changeOpacity(arrayNo, fnc) {

	var isEnd = true;
	var obFi = fi_array[arrayNo];

	obFi.count ++;

	var el = getEmt(obFi.elid);
	if (el) {
		if (obFi.opacity < 10) {
			obFi.opacity = 10;
		}
		if (obFi.opacity <= obFi.max) {
			if (el.style.MozOpacity != null) {
				el.style.MozOpacity = (obFi.opacity / 100) - .001;
				isEnd = false;
			} else if (el.style.opacity != null) {
				el.style.opacity = (obFi.opacity / 100) - .001;
				isEnd = false;
			} else if (el.style.filter != null) {
				el.style.filter = "alpha(opacity=" + obFi.opacity + ")";
				isEnd = false;
			}
			obFi.opacity += obFi.add;
		} else {
			if (el.style.MozOpacity != null) 		el.style.MozOpacity = (obFi.max / 100) - .001;
			else if (el.style.opacity != null) 		el.style.opacity = (obFi.max / 100) - .001;
			else if (el.style.filter != null) 			el.style.filter = "alpha(opacity=" + obFi.max + ")";
		}
	}

	if (isEnd) {
		clearInterval(obFi.timerid);
		if (fnc) {
			fnc();
		}
	}
}

/** 
 * フェードインの実行にあたって、対象エレメントの半透明状態を初期化する
 **/
function setOpacity(elId, opacity) {
	var el = getEmt(elId);
	if (el) {
		if (el.style.MozOpacity != null) {
			el.style.MozOpacity = (opacity / 100) - .001;
		} else if (el.style.opacity != null) {
			el.style.opacity = (opacity / 100) - .001;
		} else if (el.style.filter != null) {
			el.style.filter = "alpha(opacity=" + opacity + ")";
		}
	}
}
