
/*********************************************

網站資訊物件 Website_

屬性：	path		傳回目前網站的路徑
		title		傳回網站站名，由 index.htm 之 <title> 決定
		homepage	傳回內定的首頁檔名，預設值為 home.htm
		sitemap		以 XML 格式記錄目前網站的結構

*********************************************/

var Website_={
	path:location.href.replace(/(#|\?).+$/, "").replace(/(.+(\/|\\)).*/, "$1"),
	title:document.title,
	homepage:IS_.getMETA("homepage")?IS_.getMETA("homepage"):"home.htm",
	sitemap:null
}

/*********************************************

目前頁面資訊物件 Current_

屬性：	path	傳回路徑
		title	傳回標題
		hash	傳回雜湊（不包含 # 的部分）
		loading	是否正在載入

*********************************************/

var Current_={ path:null, title:null, hash:null, loading:false}

/*********************************************

客戶端資訊物件 Client_

屬性：	appName		傳回瀏覽器軟體名稱
					目前可區分 IE、Firefox、Mozilla、Chrome、Netscape、Safari、Camino、Konqueror、Opera（見註一）
		appVersion	傳回瀏覽器版本
					目前可處理 IE、Firefox、Safari、Opera 的版本
		proper		記錄客戶端瀏覽環境是否適合。

*********************************************/

function appDetect_() {
	var u=navigator.userAgent;
	if(u.indexOf("Opera")>=0) return "Opera";
	if(u.indexOf("MSIE")>0) return "IE";
	if(u.indexOf("Chrome")>0) return "Chrome";
	if(u.indexOf("AppleWebKit")>0) return "Safari";
	if(u.indexOf("Camino")>0) return "Camino";
	if(u.indexOf("Konqueror")>0) return "Konqueror";
	if(u.indexOf("Firefox")>0) return "Firefox";
	if(u.indexOf("Netscape")>0) return "Netscape";
	if(u.indexOf("Gecko")>0) return "Mozilla";
	return "unknown";
}
function appVersionDetect_() {
	try {
		switch(appDetect_()) {
			case "IE":		return eval(navigator.userAgent.match(/MSIE (\d+(\.\d+)?)/)[1]);
			case "Firefox": return eval(navigator.userAgent.match(/Firefox\/(\d+(\.\d+)?)/)[1]);
			case "Safari":	return eval(navigator.userAgent.match(/Version\/(\d+(\.\d+)?)/)[1]);
			case "Chrome":	return eval(navigator.userAgent.match(/Chrome\/(\d+(\.\d+)?)/)[1]);
			case "Opera":	return eval(navigator.userAgent.match(/Opera(\/| )(\d+(\.\d+)?)/)[2]);
			default:		return 0;
		}
	} catch(e) { return 0;}
}
var Client_={
	appName:appDetect_(),
	appVersion:appVersionDetect_(),
	supportList:null,
	proper:false
}

/*********************************************

轉換函數物件 TransFunctions_

方法：	locationTrans(F)	指定一個框架 F，此方法會將該框架中的連結與圖片之路徑進行轉換
		load(l)				指定一個字串陣列 l，此方法會將對應的函數讀入作為轉換函數清單
							此方法只能使用一次，之後便會無效

*********************************************/

var TransFunctions_={

	// 將相對路徑轉換成絕對路徑，見註二
	locationTrans:function(F) {
		var t, i;
		t=F.document.getElementsByTagName("a");
		for(i=0;i<t.length;i++) if(t[i].href) {
			// 把連往外部網站的連結加上 target
			if(!t[i].href.match(Website_.path)) t[i].target="_blank";
		}

		t=F.document.body.innerHTML;
		t=TransFunctions_.locationTransReg(t, F, "a", "href");
		t=TransFunctions_.locationTransReg(t, F, "img", "src");
		t=TransFunctions_.locationTransReg(t, F, "form", "action");
		return t;
	},
	locationTransReg:function(s, F, tag, attr) {
		var o=F.document.createElement("span");
		s=s.replace(RegExp("(<"+tag+"(?:\\s[^>]*)?\\s"+attr+"=)([^>\\s]+|\"[^\"]*\"|'[^']*')([^>]*>)", "ig"),
			function($0, $2, $1, $3) {
				if($1.substr(0,1)=='"'||$1.substr(0,1)=="'") $1=$1.substring(1, $1.length-1);
				// 間接式路徑轉換機制，見註三
				o.innerHTML="<a href='"+$1+"'></a>";
				return $2+'"'+o.firstChild.href+'"'+$3;
			}
		);
		return s;
	},

	// 處理選單 base 屬性的函數
	menuBaseTrans:function(n) {
		if(n.nodeType!=1) return;
		var b=n.getAttribute("base");
		if(n.nodeName=="item"&&b) {
			n.setAttribute("href", b+"/"+n.getAttribute("href"));
			for(var i=0;i<n.childNodes.length;i++) if(n.childNodes[i].nodeType==1) {
				if(n.childNodes[i].getAttribute("base")) n.childNodes[i].setAttribute("base", b+"/"+n.childNodes[i].getAttribute("base"));
				else n.childNodes[i].setAttribute("base", b);					
			}
		}
		if(n.nodeName=="item") {
			o=document.createElement("span");
			o.innerHTML="<a href='"+n.getAttribute("href")+"'></a>";
			n.setAttribute("href", o.firstChild.href);
		}
		for(var i=0;i<n.childNodes.length;i++) TransFunctions_.menuBaseTrans(n.childNodes[i]);
	},

	// 載入轉換函數清單
	load:function(l) {
		var f;
		if(TransFunctions_.ready) return;
		if(TransFunctions_.list==null) TransFunctions_.list=l;
		for(f in TransFunctions_.list) {
			if(typeof(TransFunctions_.list[f])=="string") {
				try	{ TransFunctions_.list[f]=eval(TransFunctions_.list[f]);}
				catch(e) { setTimeout("TransFunctions_.load();", 300); return;}
			}
		}
		TransFunctions_.ready=true;
	},

	// 轉換函數清單，所有在這個清單當中的函數會依序被用於頁面內容的轉換上
	list:null,

	// 轉換函數清單準備狀態
	ready:false
}

/*********************************************

註一：
實際上在 FireFox、Netscape、Camino、Konqueror、Safari 中都會出現 Gecko 的字眼，
所以它們必須較早被識別。類似地，因為 Opera 有偽裝 IE 的功能，
也必須先被識別。很可笑地，即便 Opera 啟用偽裝模式，版本號中仍然有 Opera 的字樣。
Opera 在沒有偽裝模式的情況下字樣會出現在開頭。
而 Netscape 8 的雙核心機制在啟動 IE 核心的時候也會出現 Netscape 字樣，
因此必須在 IE 之後被辨識。

註二：
IE 只要將 <a> 或 <img> innerHTML 重新寫入一次就可以轉換相對路徑成絕對路徑，
但這個作法在 Firefox 上不適用；然而，將元件屬性再次寫入對兩種瀏覽器都適用，
因為在讀出屬性的時候，兩者都會以絕對路徑的型式讀出。

註三：
IE 在讀取 <form> 的 action 時不會讀成絕對路徑（應為 bug），
因此這邊採用迂迴的技巧，先將路徑寫入一個暫時的 <a> 物件，再重新讀出。
直接將路徑以 href 寫入是沒有用的，
因為 <a> 只有當其語法被解析的時候 IE 才會把路徑轉成絕對路徑，
所以這邊利用寫入 innerHTML 以驅動語法解析的方式來完成這個轉換。
雖然，如果改成用 <img> 物件配合其 src 屬性來轉換並沒有這個問題，
但缺點是在寫入 src 的時候會送出存取，這可能會造成危險。

*********************************************/