var Utility = {
	preventDefault : function(event){
		try{
			event.preventDefault();
		}catch(e){
			window.event.returnValue = false;
		}
	},//close preventDefault

	stopBubbling : function(event){
		try{
			event.stopPropagation();
		}catch(e){
			window.event.cancelBubble = true;
		}	
	},//close stopBubbling

	attach : function(elm, eventType, handler) {
		try{
			elm.addEventListener(eventType, handler, false);
		}catch(e){
			elm.attachEvent('on' + eventType, handler);
		}
	},//close attach

	detach : function(elm, eventType, handler) {
		try{
			elm.removeEventListener(eventType, handler, false);
		}catch(e){
			elm.detachEvent('on' + eventType, handler);
		}
	},//close detach

	getElementsByClassName : function(name){
		var results = new Array;
		var elms = new Array;

		if(document.all){
			elms = document.all; //ie 5.5 fix
		}else{
			elms = document.getElementsByTagName('*');
		}
		for (var i=0,l=elms.length; i<l; i++) {
			if (elms[i].className == name){
				results.push(elms[i]);
			}
		}
		return results;
	},//close getElementsByClassName

	getAnchor : function(elm){
		// 成功の場合にはアンカーを返す
		// エラーの場合はfalseを返す
		try {
			var str = elm.href.split(/#+/);
			var strAnchor = str.pop();
			return strAnchor;
		}catch(e) {
			return false;
		}
	},//close getAnchor

	getTarget : function(event){
		try{
			return event.target;
		}catch(e){
			return event.srcElement;
		}
	},//close getTarget

	getNavigator : function(){
		if(navigator.userAgent.indexOf('Firefox')){
			console.log('Firefox');
		}
	},//close getNavigator

	addClass : function(elm,Class){
		elm.className += " " +Class;
	},//close addClass

	removeClass : function(elm,Class){
		var oldStr = elm.className;
		var newStr = "";
		var oldArray = oldStr.split(" ");
		var newArray = new Array();

		for(var i=0,l=oldArray.length; i<l; i++){
			if(oldArray[i] !== Class){
				newArray.push(oldArray[i]);
			}
		}
		newClass = newArray.join(" ");
		elm.className = newClass;
	}//close removeClass

/* object details -------------------------
	preventDefault() / デフォルト処理の停止
	stopBubbling() / バブリングの停止
	attach() / イベントリスナーへ追加
	detach() / イベントリスナーから削除
	getElementsByClassName() / 指定CLASSの要素を取得
	getAnchor() / a要素のアンカーを取得
	addClass() / 要素にクラス属性値を追加
	removeClass() / 要素からクラス属性値を削除
---------------------------------------- */

};



function tabEvent(NaviCLASS,ContentCLASS,DefaultID,CurrentCLASS){

/* object details ---------------------- */
	this.NaviCLASS = NaviCLASS; // ナビゲーション CLASS
	this.ContentCLASS = ContentCLASS; // タブコンテンツ CLASS
	this.DefaultID = DefaultID; // デフォルトタブ ID
	this.CurrentCLASS = CurrentCLASS; // ナビに追加するCLASS
/* ----------------------------------------
	tabHideALL() / 指定StyleSheetクラスのdisplayにnoneを設定
	tabShow() / 指定IDのdisplayにBlockを設定
	naviEvent() / ナビにイベントを設定
	makeEvent() / ナビイベントを作成

2008/10/19
---------------------------------------- */

	// タブの初期化処理
	this.naviEvent();
	this.tabHideALL();
	this.tabShow(this.DefaultID);
};

tabEvent.prototype = {
	tabHideALL : function(){
		// 指定StyleCLASSのスタイル displayにnoneを渡す
		var elm = Utility.getElementsByClassName(this.ContentCLASS);
		for(var i=0,l=elm.length;i<l;i++){
			elm[i].style.display = "none";
		}
	},//close tabHideALL

	tabShow : function(ID){
		// 引数IDのスタイルdisplayにBlockを渡す
		document.getElementById(ID).style.display = "block";
	},//close tabShow

	tabClassRemove : function(){
		var pNavi = Utility.getElementsByClassName(this.NaviCLASS);

		for(var i=0, pl=pNavi.length; i<pl; i++){
			var eNavi = pNavi[i].getElementsByTagName('a');

			for(var j=0, el=eNavi.length; j<el; j++){
				Utility.removeClass(eNavi[j],this.CurrentCLASS);
			}
		}
	},//close tabClassRemove

	naviEvent : function(){
		var pNavi = Utility.getElementsByClassName(this.NaviCLASS);

		for(var i=0, pl=pNavi.length; i<pl; i++){
			var eNavi = pNavi[i].getElementsByTagName('a');
	
			for(var j=0, el=eNavi.length; j<el; j++){
				var ID = Utility.getAnchor(eNavi[j]);
				Utility.attach(eNavi[j],'click',this.makeEvent(eNavi[j],ID));
			}
		}
	},//close naviEvent

	makeEvent : function(elm,ID){
		var obj = this; // クロージャにオブジェクトを渡す
		return function(e){
			obj.tabHideALL();
			obj.tabShow(ID);
			obj.tabClassRemove();
			Utility.addClass(elm,obj.CurrentCLASS);
			Utility.preventDefault(e);
		}
	}//close makeEvent

};
