/*
 *	以下、ナビ位置補正メソッド群
 */
var	DEF_NAVI_TRACKING_INDICATOR	= FALSE ;	/*	ナビ動作中インジケータフラグ	*/

var	idTimerNaviAllocateUpdate=0 ;	/*	ナビ位置更新タイマID	*/
var	fNaviTracking=TRUE ;			/*	ナビ追跡状態　TRUEで追跡モード	*/

var	idTimerAlocateSubUpdate ;	/*	ナビ位置差分更新タイマID	*/
var	targetOffset ;				/*	ナビ位置オフセット目標値	*/
var	lastOffset = 0 ;			/*	最新のナビ位置オフセット設定値	*/
var	prevOffset = lastOffset ;	/*	前回のナビ位置オフセット設定値	*/

var	DEF_UPDATE_INTERVAL_RETRY = 250 ;	/*	ナビ位置更新リトライ間隔	*/

var	cmdSkeleton ;				/*	コマンドスケルトン	*/
var	msgDebug="" ;



/*	ちょっとずつ追っかけモード用設定	*/
var	DEF_SUB_UPDATE_TERM		= 25 ;	/*	ナビ位置更新サブ間隔(ms)	*/
var	DEF_SUB_UPDATE_DIVIDE	= 20 ;	/*	ナビ位置更新分割数			*/

var	DEF_UPDATE_INTERVAL = 2700 ;	/*	ナビ位置更新間隔			*/
var	initOffset = 80 ;				/*	メインナビの開始Ｙ座標		*/


/*	画像ソース	*/
var	DEF_IMG_SRC_BUSY			= "./images/shape/tracking_busy.gif" ;		/*	追跡中	*/
var	DEF_IMG_SRC_STANDBY			= "./images/shape/tracking_nothing.gif" ;	/*	待機中	*/
var	DEF_IMG_SRC_ON_TRACKING		= "./images/shape/tracking_enable.gif" ;	/*	追跡有効	*/
var	DEF_IMG_SRC_NOT_TRACKING	= "./images/shape/tracking_disable.gif" ;	/*	追跡無効	*/



var		XML_DATA = "" ;
var		flag = false ;
var	fTermValid=false ;	/*	表示有効期間フラグ	*/
var	fAdmin=false ;	/*	管理者モードフラグ	*/
var	idDocNavi ;		/*	ナビ表示するHTML文書上のDOM ID	*/





document.scroll = function(){
   return {
      x: this.body.scrollLeft || this.documentElement.scrollLeft,
      y: this.body.scrollTop  || this.documentElement.scrollTop
   };
};

/*
 *	メインナビの表示位置をウィンドウのスクロール位置に合わせて補正する
 */
function updateNaviLocate(){
	var	msg="" ;
	var	scrollTop ;
	var	targetDOMId = "ID_SIDE_MENU" ;

	function getScrollSize() {
		return {
			x: document.body.scrollLeft || document.documentElement.scrollLeft,
			y: document.body.scrollTop  || document.documentElement.scrollTop
		};
	}


	targetOffset = document.scroll().y - initOffset ;
	if( targetOffset<0 ) {
		targetOffset = 0 ;
	}

	cmdSkeleton = sprintf( "$('%s').style.paddingTop='%%dpx'", targetDOMId ) ;
	if (TRUE) {
		/*	過渡応答性ありタイプ（目標値に近づくにつれてだんだんゆっくり）	*/
		idTimerAlocateSubUpdate = setInterval("assignNaviLocation()",DEF_SUB_UPDATE_TERM);
		if( DEF_NAVI_TRACKING_INDICATOR || fAdmin) {
			document.NAVI_OPERATION_STATE.src = DEF_IMG_SRC_BUSY ;
		}
	}
	else {
		/*	０９シーズン向けのリリース当初は瞬間移動！タイプ	*/
		assignNaviLocationDirect() ;
	}
}


/*
 *	ナビ位置を補正する。
 *	移動に過渡応答性有り。
 */
function assignNaviLocation() {
	var	cmd ;
	lastOffset += Math.floor( ( targetOffset - lastOffset ) / DEF_SUB_UPDATE_DIVIDE ) ;

	if( Math.abs(lastOffset-prevOffset)<1 ) {
		/*	目標値との差分が規定値以内なら補正終了	*/
		clearInterval( idTimerAlocateSubUpdate ) ;
		if( DEF_NAVI_TRACKING_INDICATOR || fAdmin ) {
			document.NAVI_OPERATION_STATE.src = DEF_IMG_SRC_STANDBY ;
		}
		return ;
	}
	cmd = sprintf( cmdSkeleton, lastOffset ) ;
	prevOffset = lastOffset ;
	eval( cmd ) ;
}


/*
*	ナビ位置を補正する。
*	ダイレクト補正（瞬間移動タイプ）
*/
function assignNaviLocationDirect() {
	var	cmd ;
	cmd = sprintf( cmdSkeleton, targetOffset ) ;
	eval( cmd ) ;
}


/*
 *	ナビ追跡を設定する。
 */
function setNaviTrackingState() {
	var		msg="" ;
	var		mode ;
	if( typeof(document.NAVI_OPERATION)=="undefined" ) {
		/*
		 *	初回起動時インスタンスが未定義の場合
		 *	ナビ位置更新間隔後、再度実行
		 */
		setTimeout("setNaviTrackingState()",DEF_UPDATE_INTERVAL_RETRY);
		return;
	}


	if ( !fNaviTracking ) {
		/*	追っかけないモード	*/
		mode = "追っかけないモード"
		document.NAVI_OPERATION.src = DEF_IMG_SRC_NOT_TRACKING ;
		if( DEF_NAVI_TRACKING_INDICATOR || fAdmin ) {
			document.NAVI_OPERATION_STATE.src = DEF_IMG_SRC_STANDBY ;
		}
		stopNaviTracking() ;
	}
	else {
		/*	追っかけモード	*/
		mode = "（ちょっとずつ）追っかけモード"
		document.NAVI_OPERATION.src = DEF_IMG_SRC_ON_TRACKING ;
		startNaviTracking() ;
	}
	msg += mode + "\n" ;
	window.status = mode ;

	/*
	 *	追跡モードのトグル
	 */
	fNaviTracking = (fNaviTracking)?FALSE:TRUE ;
}


/*
 *	ナビ追跡しない。
 */
function stopNaviTrackingState() {
	var		msg="" ;
	var		mode ;
	if( typeof(document.NAVI_OPERATION)=="undefined" ) {
		/*
		 *	初回起動時インスタンスが未定義の場合
		 *	ナビ位置更新間隔後、再度実行
		 */
		setTimeout("setNaviTrackingState()",DEF_UPDATE_INTERVAL_RETRY);
		return;
	}


	/*
	 *	追跡モードOFF
	 *	追っかけないモード	
	 */
	fNaviTracking = FALSE ;

	mode = "追っかけないモード"
	document.NAVI_OPERATION.src = DEF_IMG_SRC_NOT_TRACKING ;
	if( DEF_NAVI_TRACKING_INDICATOR || fAdmin ) {
		document.NAVI_OPERATION_STATE.src = DEF_IMG_SRC_STANDBY ;
	}
	stopNaviTracking() ;
	msg += mode + "\n" ;
	window.status = mode ;
}


/*
*	追っかけモード。
*/
function startNaviTracking() {
	idTimerNaviAllocateUpdate = setInterval("updateNaviLocate()",DEF_UPDATE_INTERVAL);
}

/*
*	追っかけないモード。
*/
function stopNaviTracking() {
	clearInterval( idTimerNaviAllocateUpdate ) ;
}




/*
 *	ナビを表示する。
 *
 *	@param	urlXML	ナビ表示情報を含むXMLデータアドレス。
 *			id		ナビ情報を書き出すHTML文書上のDOM ID。
 */
function putNavi( urlXML, id ) {
	var pars = 'id='+id ;

	idDocNavi = id ;
	var myAjax = new Ajax.Request(
		urlXML, 
		{
			method: 'get', 
			/*	parameters: pars, */
			onComplete: function(transport) {
				//	alert( "putNavi() " + transport.responseXML ) ;
					putNaviHtmlById(transport.responseXML,idDocNavi);
				}
			
		});
}


/*
 *	管理者モードナビを表示する。
 *
 *	@param	urlXML	ナビ表示情報を含むXMLデータアドレス。
 *			id		ナビ情報を書き出すHTML文書上のDOM ID。
 */
function putNaviAdmin( urlXML, id ) {
	fAdmin = TRUE ;
	putNavi( urlXML, id ) ;
}


/*
 *	表示済みのナビ内容を置き換える。
 *
 *	@param	urlXML	ナビ表示情報を含むXMLデータアドレス。
 */
function replaceNavi( urlXML ) {
	fAdmin = FALSE ;
	putNavi( urlXML, idDocNavi ) ;
}


/*
 *	指定されたDOM IDにナビHTMLデータを書き込む。
 *
 *	@param	dataXML	ナビ表示情報を含むXMLデータ。
 *			id		ナビ情報を書き出すHTML文書上のDOM ID。
 */
function putNaviHtmlById(dataXML,id) {
	var htmlNaviHead = "" ;
	var htmlNaviFoot = "" ;
	var html = "" ;

	/*	ナビHTMLのヘッダ部分	*/
	htmlNaviHead += "<a onclick='setNaviTrackingState();'>" ;
	htmlNaviHead += "<img name='NAVI_OPERATION' src='" + ( (fNaviTracking==TRUE)?DEF_IMG_SRC_NOT_TRACKING:DEF_IMG_SRC_ON_TRACKING ) + "' alt='追っかけナビ' title='追っかけナビ' />" ;
	htmlNaviHead += "</a>" ;
	htmlNaviHead +="<table class='navi' cellspacing='0' cellpadding='0' border='0'>" ;
	htmlNaviHead +="<tr><td>" ;
	/*	ナビHTMLのフッタ部分	*/
	htmlNaviFoot += "</td></tr>" ;	htmlNaviFoot += "</table>" ;	if( fAdmin ) {
		htmlNaviFoot += "<img name='NAVI_OPERATION_STATE' src='" + DEF_IMG_SRC_STANDBY + "' alt='indicator' />" ;
	}

	/*	ナビHTMLの表示	*/
	html += htmlNaviHead ;	html += generateNaviHtml(dataXML);	html += htmlNaviFoot ;

	$(id).innerHTML = html;
}


/*
 *	ナビ表示情報を含むXMLデータからナビ表示用HTMLを生成する。
 *
 *	@param	dataXML	ナビ表示情報を含むXMLデータ。
 */
function generateNaviHtml(dataXML) {	var	html = "" ;
	var	fValidStart=FALSE, fValidEnd=FALSE ;
	var validity, type, field, url, tip, min, validStart, validEnd;
	var numValid=-1, numType=-1, numField=-1, numUrl=-1, numTip=-1, numValidIn=-1, numValidOut=-1 ;

	var Koumoku	= dataXML.getElementsByTagName("cap");	var Items	= dataXML.getElementsByTagName("item");
	if( Items.length == 0 ) {
		/*	ナビデータがない！	*/
		alert( "no navi data" ) ;
		html = "<div><a href='#'>nothing</a></div>" ;
		return( html ) ;
	}

	var xValidity	= dataXML.getElementsByTagName("validity");
	var xType		= dataXML.getElementsByTagName("type");
	var xField		= dataXML.getElementsByTagName("field");
	var xUrl		= dataXML.getElementsByTagName("url");
	var xTip		= dataXML.getElementsByTagName("tip");

	min = Items.length ;
	numValid = xValidity.length ;
	numType = xType.length ;
	numField = xField.length ;
	numUrl = xUrl.length ;
	numTip = xTip.length ;
	if( numValid!=numType || numValid!=numField || numValid!=numUrl || numValid!=numTip ) {
		alert ( sprintf( "illegal data struct!!\nvalid=%d type=%d field=%d url=%d tip=%d valid-in=%d valid-out=%d", numValid, numType, numField, numUrl, numTip, numValidIn, numValidOut )  ) ;
		if( min>numValid )	{	min = numValid ;	}
		if( min>numType ) 	{	min = numType ;	}
		if( min>numField ) 	{	min = numField ;	}
		if( min>numUrl ) 	{	min = numUrl ;	}
		if( min>numTip ) 	{	min = numTip ;	}
	}

	for(ii=0; ii<min ; ii++) {
		valid	= xValidity[ii].firstChild.nodeValue ;
		type	= xType[ii].firstChild.nodeValue ;
		field	= xField[ii].firstChild.nodeValue ;
		url		= xUrl[ii].firstChild.nodeValue ;
		tip		= xTip[ii].firstChild.nodeValue ;

		if( !fAdmin && ( valid!=1 || typeof(valid) == "undefined" ) ) {
			continue ; 
		}


		if(
			typeof(type) != "undefined" && typeof(field) != "undefined" &&
			typeof(url) != "undefined" && typeof(tip) != "undefined"
		) {	

			if( getBrowserCode()==DEF_BROWSER_TYPE_IE6 ) {
				/*
				 *	IE6のみナビ間隔が狭いためやむを得ず。。。
				 *	世の中の標準に沿っているので制約。
				 */
				html += sprintf( "<div class='%s' style='padding-top:4px;'>", type ) ;
			}
			else {
				html += sprintf( "<div class='%s'>", type ) ;
			}

			html += sprintf( "<a href='%s' title='%s'>%s</a>", url, tip, field ) ;
			html += "</div>" ;		}
	}	return( html ) ;
}



/*
 *	テスト関数：XMLデータをロードする。。
 *
 *	@param	urlXML	ナビ表示情報を含むXMLデータアドレス。
 */
function loadXMLData(urlXML) {
	var myAjax = new Ajax.Request(
		urlXML, 
		{
			method: 'get', 
			onComplete: function(transport) {
					XML_DATA = transport.responseXML ;
					setXMLData(XML_DATA);
				}
			});
}
/*
 *	テスト関数：ロードしたXMLデータローカル変数に保存する。
 *
 *	@param	urlXML	ナビ表示情報を含むXMLデータアドレス。
 */
function setXMLData(dataXML) {
	flag = true ;
	XML_DATA = dataXML ;
}

