//==================================================================
//	目次表示制御用
//==================================================================
//******************************************************************
//	
//******************************************************************
function IndexItem(id, top, visible){
	this.id		= id;
	this.top	= top;
	this.visible= visible;

	return 0;
}

//******************************************************************
//	変数
//******************************************************************
var	indexItems;						// 表示されている項目
var	indexItemNo;					// indexItemsのインデックス(indexItemNo['index.1'])
var	indexItemView;					// 表示されている項目の名をソートしたもの
var	indexItemRefer;					// 参照
var	indexItemTop;					// 一番上に表示されている項目のインデックス
var	isIndexViewEnable;				// 
indexItems		= new Array();
indexItemNo		= new Array();
indexItemView	= new Array();
indexItemRefer	= new Array();
indexItemTop	= -1;

//******************************************************************
//	関数
//******************************************************************
//------------------------------------------------------------------
// 機　能：項目をArrayに追加する
// 引　数：id						'index.1'など
// 　　　　top						表示位置
// 　　　　visible					表示状態
// 戻り値：無し
//------------------------------------------------------------------
function setIndexItem(id, top, visible){

	var	index;
	// インデックスを取得
	index	= indexItemNo[id];

	// 存在しなければ追加する
	//**********************************
	//	↓2003/10/17 修正
	//**********************************
	//	if(index == undefined){
	if(!(index >= 0)){
	//↑********************************

		// インデックスを設定しArrayに追加する
		indexItemNo[id]	= indexItems.length;

		//**********************************
		//	↓2003/10/17 修正
		//**********************************
		//		indexItems.push(new IndexItem(id, top, visible));
		var	newItem;
		newItem	= new Array(new IndexItem(id, top, visible));
		indexItems	= indexItems.concat(newItem);
		//↑********************************


		// ソート用のidを取得、追加し、ソートする
		var	sortID;
		sortID	= convertIdToSortId(id);

		//**********************************
		//	↓2003/10/17 修正
		//**********************************
		//		indexItemView.push(sortID);
		newItem	= new Array(sortID);
		indexItemView	= indexItemView.concat(newItem);
		//↑********************************

		indexItemView.sort();
	}else{
		indexItems[index].top = top;
	}

	return 0;
}

//------------------------------------------------------------------
// 機　能：項目をArrayから削除する
// 引　数：id						'index.1'など
// 戻り値：無し
//------------------------------------------------------------------
function deleteIndexItem(id){
	var	index;

	index	= indexItemNo[id];

	// 存在するなら削除
	//**********************************
	//	↓2003/10/17 修正
	//**********************************
	//	if(index != undefined){
	if(index >= 0){
	//↑********************************

		//**********************************
		//	↓2003/10/17 修正
		//**********************************
		//		indexItemNo[id]	= undefined;
		indexItemNo[id]	= -1;
		//↑********************************

		//**********************************
		//	↓2003/10/17 修正
		//**********************************
		//		if(index == 0){
		//			indexItems.shift();
		//		}else if(index == indexItems.length){
		//			indexItems.pop();
		//		}else{
		//			var	work;
		//			work		= indexItems.slice(0, index);
		//			indexItems	= work.concat(indexItems.slice(index + 1));
		//		}
		var	work;
		if(index == 0){
			indexItems	= indexItems.slice(1);
		}else if(index == indexItems.length){
			indexItems	= indexItems.slice(0, index - 1);
		}else{
			work		= indexItems.slice(0, index);
			indexItems	= work.concat(indexItems.slice(index + 1));
		}
		//↑********************************

		for(i=index; i<indexItems.length; i++){
			indexItemNo[indexItems[i].id]--;
		}

		var	sortID;
		sortID	= convertIdToSortId(id);

		var	i;
		for(i=indexItemTop; i<indexItemView.length; i++){
			if(indexItemView[i] == sortID){
				indexItemView[i]	= "";
				indexItemView.sort();
				//**********************************
				//	↓2003/10/17 修正
				//**********************************
				//				indexItemView.shift();
				indexItemView	= indexItemView.slice(1);
				//↑********************************
				break;
			}
		}

	}

	return 0;
}

//------------------------------------------------------------------
// 機　能：mousedownイベントを設定する(Netscape4用)
// 引　数：id						'index.1'など
// 　　　　isTop					親を持たない項目かどうか
// 戻り値：無し
//------------------------------------------------------------------
function setChildIndexItemEvent(id, isTop){
	var	i;
	var	child;
	var	top;

	i		= 1;
	top		= 20;
	child	= getIndexItem(id + "." + i);

	// 存在する間繰り返し
	while(child){

		// 親を持たない項目で1〜15なら表示状態にする
		if(isTop){
			if(i < 16){
				setIndexItem(child.id, top, true);
			}else{
				setIndexItem(child.id, top, false);
			}
			top	+= getLayerHeight(child);
		}

		// 子が存在するなら
		if(getIndexItem(child.id + ".1")){

			// mousedownイベントを設定
			child.captureEvents(Event.MOUSEDOWN);
			child.onmousedown	= new Function("e", "clickIndexEvent('" + id + "." + i + "');");
	
			// 
			setChildIndexItemEvent(child.id, false);

		}

		// 次の項目
		i++;
		child	= getIndexItem(id + "." + i);
	}

	return 0;
}

//------------------------------------------------------------------
// 機　能：クリック時のイベント処理
// 引　数：id						クリックされた項目のID
// 戻り値：無し
//------------------------------------------------------------------
function clickIndexEvent(id){

// var	start = new Date();

	// 表示切替
	changeIndexVisibility(id);

	// クリックされた位置のインデックスを取得し、再表示
	var	i;
	i=indexItemTop;
	if(i < 0){
		i = 0;
	}
	while(i<indexItemView.length){
		var	workID;
		workID	= convertSortIdToId(indexItemView[i]);

		if(id == workID){
			break;
		}

		i++;
	}
	showIndex(i);

// alert((new Date()) - start);

	return 0;
}

//------------------------------------------------------------------
// 機　能：表示切替
// 引　数：id						親ID
// 戻り値：無し
//------------------------------------------------------------------
function changeIndexVisibility(id){

	var	child;
	var	visible;

	child	= getIndexItem(id + ".1");

	if(child){

		// 表示されているなら非表示に、非表示なら表示する
		if(getIndexItemStyle(child).visibility != "hidden" && getIndexItemStyle(child).visibility != "hide"){
			visible	= "hidden";
		}else if(document.layers){
			visible	= "show";
		}else{
			visible	= "visible";
		}

		// 画像切り替え
		var	docimg;
		docimg	= getIndexItemImage(getIndexItem(id));
		if(docimg){
			if(visible != "hidden" && visible != "hide"){
				docimg.src	= "image/click_mn.gif";
			}else{
				docimg.src	= "image/click_pl.gif";
			}
		}

		// 子の表示切替
		changeChildIndexVisibility(id, visible);
	}

	return 0;
}

//------------------------------------------------------------------
// 機　能：idで指定された親の子の表示切替
// 引　数：id						親のID
// 　　　　visible					設定する表示状態
// 戻り値：
// 作成日：
//------------------------------------------------------------------
function changeChildIndexVisibility(id, visible){
	var	i;
	var	child;

	i		= 1;
	child	= getIndexItem(id + "." + i);
	while(child){

		// スタイル取得
		var	childStyle;
		childStyle				= getIndexItemStyle(child);

		// 画像指定
		if(visible != "hidden" && visible != "hide"){
			var	docimg;
			docimg	= getIndexItemImage(child);
			if(docimg){
				docimg.src	= "image/click_pl.gif";
			}
		}

		// 表示設定
		if(visible != "hidden" && visible != "hide"){
			setIndexItem(child.id, 0, true);
		}else{
			childStyle.visibility	= visible;
			deleteIndexItem(child.id);
		}

		// 孫の表示設定
		if(visible == "hidden" || visible == "hide"){
			changeChildIndexVisibility(child.id, visible);
		}

		// 次の子を取得
		i++;
		child	= getIndexItem(id + "." + i);
	}

	return 0;
}

//------------------------------------------------------------------
// 機　能：再表示する
// 引　数：start					再表示開始位置
// 戻り値：無し
//------------------------------------------------------------------
function showIndex(start){

	// 表示項目がないか、開始位置が表示項目を超えていたら何もしない
	if(indexItemView.length <= 0){
		return;
	}else if(start >= indexItemView.length){
		return;
	}

	var	top;

	// 一番上の項目の位置を取得
	var	prefix;
	prefix	= indexItemView[0].split(".")[0];
	style	= getIndexItemStyle(getIndexItem(prefix + "." + 1));
	top		= style.top;
	if(!document.layers){
		top		= parseInt(top.substring(0, top.length - 2));
	}

	// 画面上で一番上に表示されている項目の位置を取得
	var	id;
	var	i;
	var	j;
	j=start - indexItemTop;
	i=start;
	if(i < 0){
		i	= 0;
	}else if(i > 0){
		var	parent;
		id		= convertSortIdToId(indexItemView[i-1]);
		parent	= getIndexItem(id);
//		top		= getIndexItemStyle(parent).top;
		top		= indexItems[indexItemNo[id]].top;
		top		= top + getLayerHeight(parent);
	}

	// 表示項目数分繰り返し
	while(i < indexItemView.length){

		var	visible;
		// 15個は表示し、それ以外は非表示
		if(j < 16){
			if(document.layers){
				visible	= "show";
			}else{
				visible	= "visible";
			}
		}else{
			visible	= "hidden";
		}

		// 表示位置、表示状態を設定
		var	work;
		id		= convertSortIdToId(indexItemView[i]);
		work	= indexItemView[i].split(".");

		if((indexItems[indexItemNo[id]].visible == true && j >= 16) || (j < 16)){
			var	child;
			child	= getIndexItem(id);
			var	style;
			style	= getIndexItemStyle(child);
			if(visible != "hidden"){
				indexItems[indexItemNo[id]].visible	= true;

				if(style.top != top){
					style.top						= top;
				}
				indexItems[indexItemNo[id]].top		= top;
				height								= getLayerHeight(child);
				top									= top + height;

				//**********************************
				//	↓2003/10/14 追加
				//	ネスケ４対応
				//**********************************
				// N4
				if(document.layers){
					var	scrlArea;

					scrlArea	= document.layers[0].document.layers[0];
					// スクロールエリアの高さが次の項目の上位置以下なら高さを調節
					if(top >= getLayerHeight(scrlArea)){
						scrlArea.clip.height	= top - 1;
					}
				}
				//↑********************************

			}else{
				indexItems[indexItemNo[id]].visible	= false;
			}
			if(style.visibility != visible){
				style.visibility	= visible;
			}
		}

		j++;
		i++;
	}

	return;

}

//------------------------------------------------------------------
// 機　能：idからオブジェクトを取得する
// 引　数：id						取得するオブジェクトのid
// 戻り値：オブジェクト
//------------------------------------------------------------------
function getIndexItem(id){
	var	item;

	if(indexItemRefer[id]){
		item	= indexItemRefer[id];
	}else{
		// N4
		if(document.layers){
			item	= document.layers[0].document.layers[0].document.layers[id];
		}
	
		// IE
		if(document.all){
			item	= document.all(id);
		}
	
		// N6
		if(document.getElementById){
			item	= document.getElementById(id);
		}

		indexItemRefer[id]	= item;
	}

	return item;
}

//------------------------------------------------------------------
// 機　能：スタイルを取得する
// 引　数：doc						オブジェクト
// 戻り値：スタイル
//------------------------------------------------------------------
function getIndexItemStyle(doc){
	var	style;

	// N4
	if(document.layers){
		style	= doc;
	}

	// IE
	if(document.all){
		style	= doc.style;
	}

	// N6
	if(document.getElementById){
		style	= doc.style;
	}

	return style;
}

//------------------------------------------------------------------
// 機　能：イメージを取得する
// 引　数：doc						オブジェクト
// 戻り値：イメージ
//------------------------------------------------------------------
function getIndexItemImage(doc){
	var	img;

	// N4
	if(document.layers){
		img	= doc.document.images[doc.id + ".img"];
	}

	// IE
	if(document.all){
		img	= document.images[doc.id + ".img"];
	}

	// N6
	if(document.getElementById){
		img	= document.images[doc.id + ".img"];
	}

	return img;
}

//------------------------------------------------------------------
// 機　能：idをソート用のidに変換する
// 引　数：id						id
// 戻り値：ソート用のid
//------------------------------------------------------------------
function convertIdToSortId(id){
	var	work;
	var	sortID;
	var	i;
	work	= id.split(".");
	sortID	= work[0];
	for(i=1; i<work.length; i++){
		sortID	+= "." + ("    " + work[i]).substring(work[i].length);
	}

	return sortID;
}

//------------------------------------------------------------------
// 機　能：ソート用のidをidに変換する
// 引　数：sortID					ソート用id
// 戻り値：id
//------------------------------------------------------------------
function convertSortIdToId(sortID){
	var	work;
	var	id;
	var	i;
	work	= sortID.split(".");
	id		= work[0];
	for(i=1; i<work.length; i++){
		id	+= "." + parseInt(work[i]);
	}

	return id;
}

//------------------------------------------------------------------
// 機　能：レイヤーの高さを取得する
// 引　数：layer					レイヤー
// 戻り値：高さ
//------------------------------------------------------------------
function getLayerHeight(layer){

	var	height;

	// N4
	if(document.layers){
		height	= layer.clip.height;
	}

	// IE
	if(document.all){
		height	=  layer.offsetHeight;
	}

	// N6
	if(document.getElementById){
		height	=  layer.offsetHeight;
	}

	// 取得できなかったら21、
	// 21の倍数でないときは21の倍数に合わせる
	//**********************************
	//	↓2003/10/17 修正
	//**********************************
	//	if(height == undefined){
	if(!height){
	//↑********************************
		height	= 21;
	}else{
		var	work;
		work	= height % 21;
		if(work != 0){
			height	+= 21 - work;
		}
	}
	
	return height;
}


