﻿/* jQuery多線選單展開器 v3.0.1版
 * 
 * 1.調整build方法中，舊ID的緩存至元素本身this.Lable_IDtemp標簽中
 * 2.新增expand方法，對a標簽出現選中(selected='selected')時，向根節點展開，與附上選中樣式。
 * 3.調整listen方法，記錄最後一次點擊於名稱Cookie_Expand的cookie值。
 * 4.調整expand，加入檢查Cookie_Expand的cookie值不為空時，以該值展開選單
 * 5.修正方法註釋 ...2010/07/09
 * 6.修正listen方法，判定當前層級>Level_Res才會展開下層ul的錯誤，
 * 
 */

function jquery_menu()
{
	this.ID_Menu="";	//目標選單ID	
	this.Level_Max=3;	//選單最大層
	this.Level_Res=0;	//選單重整層
	this.Label_Cache="Cache";		//標簽:暫存
	this.Label_Number="Number";		//標簽:序號
	this.Lable_IDtemp="IDtemp";		//標簽:舊ID暫存
	this.Style_Selected="selected";	//樣式:選中
	this.Cookie_Expand="CK_Expand";	//Cookie:預設展開
	//this.Cookie_OnPage="CK_OnPage";	//Cookie:預設展開
	
	/* 設定 目標DIV塊ID
	 * @param string ID_Menu notnull 選單DIV塊ID
	 * @access public
	 */
	this.set_id=function(ID_Menu)
	{
		this.ID_Menu=ID_Menu;
	}//*/
	
	/* 設定 選單層級
	 * @param int Level_Max 選單最大層
	 * @param int Level_Res 選單重整層
	 * @access public
	 */
	this.set_lv=function(Level_Max, Level_Res)
	{
		this.Level_Max=Level_Max;
		this.Level_Res=Level_Res;
	}//*/
	
	/* 設定 選單層級
	 * @param string CK_Expand Cookie鍵->預設展開
	 * @access public
	 */
	this.set_cookie=function(CK_Expand)
	{
		this.Cookie_Expand=CK_Expand;
	}
	
	/* 建置選單(存儲ul li a 級別資料)
	 * @access public
	 */
	this.build=function()
	{
		var oThis=this;
		jQuery(document).ready(function($)
		{
			var id_Menu="#"+oThis.ID_Menu+" ";
			var lv_Now=oThis.Level_Max;
			var ll_Cache=oThis.Label_Cache;
			var ll_Number=oThis.Label_Number;
			var ll_IDtemp=oThis.Lable_IDtemp;
			$(id_Menu+"ul").attr(ll_Cache, '');	$(id_Menu+"li").attr(ll_Cache, '');	$(id_Menu+"a").attr(ll_Cache, '');
						
			while(lv_Now>0)
			{
				var cmd_ul=id_Menu;for(var a=lv_Now;a>1;a--){cmd_ul+="ul ";}cmd_ul+="ul["+ll_Cache+"='']";
				$(cmd_ul).each(function(i)
				{
					$(this).attr(ll_Cache, lv_Now).children("li").each(function(j)//層級
					{
						var $jqObj_A=$(this).children("a").eq(0);
						var id_a="_"+lv_Now+"_"+i+"_"+j;
						var id_a_old=($jqObj_A.attr("id")!=undefined)?$jqObj_A.attr("id"):"";
						var ll_Num=ll_Number+"_"+lv_Now;
						var lv_Num=j+1;
						
						$jqObj_A.attr("id", id_a).attr(ll_IDtemp, id_a_old)
						.attr(ll_Cache, lv_Now).attr(ll_Num, lv_Num)
						.next("ul").attr("id", id_a).hide()
						.find("a").attr(ll_Num, lv_Num)
					});
				});
				lv_Now--;
			}
		});//jQuery
	}
	
	/* 偵聽選單事件(點擊展開與層級重整)
	 * @access public
	 */
	this.listen=function()
	{
		var oThis=this;
		jQuery(document).ready(function($)
		{
			var id_Menu="#"+oThis.ID_Menu+" ";
			var ll_Cache=oThis.Label_Cache;
			var sl_Selected=oThis.Style_Selected;
			var ck_Expand=oThis.Cookie_Expand;
			
			$(id_Menu+"li").each(function(i)
			{	
				$(this).children("a").eq(0).click(function()
				{
					var lv_Max=oThis.Level_Max;
					var lv_Now=$(this).attr(ll_Cache)*1;
					var id_a_on=$(this).attr("id");
					
					if($(this).hasClass(sl_Selected))
					{
						$(this).removeClass(sl_Selected).next("ul").slideUp();
						return false;
					}
					else
					{
						$.cookie(ck_Expand, id_a_on, { expires: 7, path: '/'});//緩存選中的ID
						while(lv_Now>oThis.Level_Res && lv_Now<=lv_Max)
						{
							$(id_Menu+"a["+ll_Cache+"='"+lv_Max+"']").each(function(i)
							{
								$(this).removeClass(sl_Selected).next("ul").slideUp();
							});
							lv_Max--;
						}
						
						var $next_UL=$(this).addClass(sl_Selected).next("ul").slideDown();
						if($next_UL.html()!=null)
						{
							return false;
						}
						else
						{
							return true;//依href與targat開啟頁面
						}
						//*/
						
					}//if
				});
			});
		});//jQuery
	}//*/
	
	/* 展開選單(預設)
	 * @param string id_select null 預設展開的舊ID
	 * @access public
	 */
	this.expand=function(id_select)
	{
		var oThis=this;
		jQuery(document).ready(function($)
		{
			var id_Menu="#"+oThis.ID_Menu+" ";
			var ll_Cache=oThis.Label_Cache;
			var ll_IDtemp=oThis.Lable_IDtemp;
			var sl_Selected=oThis.Style_Selected;
			var ck_Expand=oThis.Cookie_Expand;
			
			var cmd_Select=id_Menu;
			var vl_Expand=$.cookie(ck_Expand);
			if(vl_Expand!=null && vl_Expand!="")
			{
				id_select=$.cookie(ck_Expand);
				cmd_Select+="[id='"+id_select+"']";
			}
			else if(id_select==undefined)
			{
				id_select=$(id_Menu+"a[selected='selected']").last().attr("id");
				cmd_Select+="[id='"+id_select+"']";
			}
			else
			{
				cmd_Select+="["+ll_IDtemp+"='"+id_select+"']";
			}
			
			$(cmd_Select).parents("li").each(function()
			{
				var $jqObj_A=$(this).find("a").eq(0);
				$jqObj_A.addClass(sl_Selected).next("ul").show();
			});
		});
	}
	
	/* 顯示選單編號
	 * @param int Mode 編號模式 
	 * @param int Level_max 編號最後層級
	 * @param string Tag_body 間中連接符
	 * @param string Tag_tail 尾部連接符
	 * @access public
	 */
	this.number=function(Mode, Level_max, Tag_body, Tag_tail)
	{
		var oThis=this;
		jQuery(document).ready(function($)
		{
			var id_Menu="#"+oThis.ID_Menu+" ";
			var ll_Cache=oThis.Label_Cache;
			var ll_Number=oThis.Label_Number;
			
			$(id_Menu+"li").each(function(i)
			{
				$jqObj_A=$(this).children("a").eq(0);
				var Level_now=$jqObj_A.attr(ll_Cache);
				if(Level_now<=Level_max)
				{
					var lv_a=$jqObj_A.attr(ll_Cache);
					var lv_Num=$jqObj_A.attr(ll_Number+"_"+lv_a);
					$jqObj_A.prepend(lv_Num+Tag_tail);
					switch(Mode)
					{
						case 1:
							var lv_a=$jqObj_A.attr(ll_Cache);
							for(var num=(lv_a-1);num>0;num--)
							{
								var lv_Num=$jqObj_A.attr(ll_Number+"_"+num);
								$jqObj_A.prepend(lv_Num+Tag_body);
							}
							break;
					}
				}
			})
		});//jQuery
	}//*/
	
	/* 底圖位移修正(圓角塊)
	 * @param int Mode 		位移模式 1:第一欄, -1:最後欄 
	 * @param int Level_on	位移所在層級
	 * @param string Position 位移設定值
	 * @access public
	 */
	this.mvbgimg=function(Mode, Level_on, Position)
	{
		var oThis=this;
		jQuery(document).ready(function($)
		{
			var id_Menu="#"+oThis.ID_Menu+" ";
			var ll_Cache=oThis.Label_Cache;
			
			$(id_Menu+"ul["+ll_Cache+"='"+Level_on+"']").each(function()
			{
				$jqObj_li=$(this).children("li");
				switch(Mode)
				{
					case 1://第一欄
						$jqObj_li.first().css("background-position", Position);
						break;
					case -1://最後欄
						$jqObj_li.last().css("background-position", Position);
						break;
				}
			});
		});//jQuery				
	}//*/
}


