/**
* plugin: jquery.akinavi.js
* author: 秋廣　誠　akitec@akitec.org
* website: akitec.org
* version: 0.6
* date: june 2011
* description: slideup | down navigation

* require jquery-1.3 or later.

Copyright (c) 2011 AKIHIRO MAKOTO

		 * 概要　動作
		 * 
		 * メニュー動作補助プラグイン
		 *
		 * hover()だけではリーフ表示の挙動が不安定になる。トリガ要素がリーフなどの子要素をいろいろ抱えてるから。
		 * mouseoverでなく、mouseenterを。
		 * see http://api.jquery.com/mouseenter/
		 *
		 * リーフの表示トリガ判定に注目する。
		 * hoverが一定時間以上ならトリガするようにする。
		 *
		 * トリガ要素のmouseenterでフォールがカウントアップされる。
		 * カウントが一定以上の値になるとトリガされ、リーフが表示される。
		 *
		 * トリガがmouseleaveするとリーフはエフェクトにより非表示になる。
		 * cタイマがリセットされ、フォールカウントも初期化される。
		 *
		 
		 *
		 * ←●→フロートマーカを追加
		 * メニューラッパー要素のleaveのタイマスレッドも用意した。
		 
		 *todo
		 * マーカを画像に。
		 
		 *方針
		 * jquery.ui 拡張は不使用。
		 
		 * 注意
		 * html上の要素構造、スタイルに依存。
		 * jquery-1.2でも動くね。

**/

$.fn.akinavi = function(options){
	return this.each(function(){

		

		// 1. set up default options 
		var defaults = { 
		
			i_debug         : false, // デバッグモード
			
			c_triggerClass  : 'li.h-h',	//
			c_menuWrapper   : 'ul#hn',// ハイライトマーカの基準要素
			FM_difY         : 65,// フロートマーカ　Yオフセット
			FM_difX         : 54,
			FM_Xint         : -100,
			
			FM                : false,// フロートマーカを動作させるか
			
			FM_active_class   : "aknv_fm_active",
			FM_inactive_class : "aknv_fm_inactive",
			
			c_targetDiffAttr  : 'rel',	//
			time_enter        : 20,	// エンター　クロックms
			time_leaveMenu    : 20,  // メニューリーブ　クロックms
			cond_enter        : 10,//
			//cond_leaveMenu:  20,//
			
			leaveMenu_Val_int : 30,//カウントダウン
			//leaveMenu_Val = 20;//カウントダウン
			
			c_classExpand   : 'aknv_expand',
			c_classCollapse : 'aknv_collapse',
			p_slideDown     : "fast",
			p_slideUp       : "fast"
		};
		var op = $.extend({}, defaults, options);
		
		// init　二つのタイマースレッド
		var enter_threadID;
		var leaveM_threadID;
		var enter_Val = 0;//カウントアップ
		var leaveMenu_Val = op.leaveMenu_Val_int;
		
		//位置情報
		var pos;
		var crX   = 0;// ハイライトマーカのターゲット位置X
		var crY   = 0;
		
		// js on用のｽﾀｲﾙ　（offはdisplay:block)
		$("#akinavi_w div.akinavi_leaf").css({display:"none", top: "inherit"});//top: inherit;
		
		// 2. デバッグ要素アペンド
		if(op.i_debug){
			 $('body').prepend('<p>akinavi debug enter_Val = <span id="akinavi_enter_Val"></span></p><p>akinavi debug cond_enter = <span id="akinavi_cond_enter"></span></p><p>akinavi debug leave_Val = <span id="akinavi_leaveM_Val"></span></p><p>akinavi debug cond_leave = <span id="akinavi_cond_leave"></span></p><p>akinavi debug rel = <span id="akinavi_targetID"></span></p><p>akinavi debug X = <span id="akinavi_X"></span></p>');
			 $("#akinavi_cond_enter").text(op.cond_enter);
		 }
		 
		 
		// フロートマーカ生成
		if(op.FM){
			
			$("body").prepend('<p id="aknv_FM" class="aknv_fm_active" style="width:8px;height:8px;position:absolute;left:-100px;z-index:30">&nbsp;</p>');
		
		
			// 3.デバッグ要素生成後の初期化
			// おもにメニュー要素の位置取得
			var FMPosInt;
			var FMPosIntY;
			FMPosInt = $(op.c_menuWrapper).position();
			//crY = ;//フロートマーカ Y位置
			FMPosIntY = FMPosInt.top + op.FM_difY;
			$("#aknv_FM").css("top", FMPosIntY+"px");
			//$("#aknv_HM").animate({"top": HMPosInt.top+"px","left":"100px"},"slow");
		}
		
		
		// 4.個々のメニュー項目の挙動
		$(op.c_triggerClass).mouseenter(
			function() {
				var o   = $(this);
				var rel = o.attr(op.c_targetDiffAttr);
				pos = o.find("a.akinavi_trigger").position();
				clearInterval(leaveM_threadID);
				enter_threadID = setInterval(function(){
					enter_Val++;
					if(op.i_debug) $('#akinavi_enter_Val').text(enter_Val);
					if(op.i_debug) $('#akinavi_targetID').text(rel);
					
					crX = pos.left;

					if(op.i_debug) $('#akinavi_X').text(crX);
						
					if(rel&&(enter_Val > op.cond_enter)){
						$("#"+rel).addClass(op.c_classExpand).removeClass(op.c_classCollapse).slideDown(op.p_slideDown);
	//					$("#"+rel).addClass(op.c_classExpand).removeClass(op.c_classCollapse).animate({height:"show"},100,"swing");
	
						// ←●→マーカ移動
						if(op.FM) $('#aknv_FM').addClass("aknv_fm_active").removeClass("aknv_fm_inactive").animate({"left": crX+op.FM_difX+"px"}, "fast");
					}
					//おつ。
					if(enter_Val > op.cond_enter) clearInterval(enter_threadID);// てきとう
					
					
				},op.time_enter);
			}
		).mouseleave(
			function() {
				if(op.i_debug) $('#akinavi_enter_Val').text(enter_Val);
				if(op.i_debug) $('#akinavi_targetID').text('');
				
				
				if(op.i_debug) $('#akinavi_X').text('');
				var rel = $(this).attr(op.c_targetDiffAttr);
				if(rel)
				$("#"+rel).addClass(op.c_classCollapse).removeClass(op.c_classExpand).slideUp(op.p_slideUp);
//				$("#"+rel).addClass(op.c_classCollapse).removeClass(op.c_classExpand).fadeOut();
				//エンタースレッド　おつかれ。
				clearInterval(enter_threadID);
				
				enter_Val = 0;// init
				
				// ハイライトマーカ移動
				//$('#aknv_HM').animate({"left":"10px"}, "slow");
				
				
			}
		);
		
		
		
		// 5.メニューラッパー要素からmouseleave
		$(op.c_menuWrapper).mouseleave(function(){
												
			// ←●→マーカの色を元にもどす　開発版
			if(op.FM) $('#aknv_FM').removeClass("aknv_fm_active").addClass("aknv_fm_inactive");
			
			leaveM_threadID = setInterval(function(){
						
				leaveMenu_Val--;
				if(op.i_debug) $('#akinavi_leaveM_Val').text(leaveMenu_Val);

				if( leaveMenu_Val < 1 ){
					// ←●マーカ　戻れ。
					if( op.FM ) $('#aknv_FM').removeClass("aknv_fm_active").addClass("aknv_fm_inactive").animate({"left":op.FM_Xint+"px"}, "fast");
					//alert('float maker goes init pos');
					/*リーブスレッド　おつかれ。*/
					clearInterval(leaveM_threadID);
				}
			},op.time_leaveMenu);
			leaveMenu_Val = op.leaveMenu_Val_int;
		});
	
	
	
	});// foreach
	

	
	
}// fn.
