﻿// final edit 3/16
// 設計內建的標籤雲 ... done
// 可選擇日期是否顯示 done
// 分頁選項 done
// 如果沒有標籤元素，則會直接顯示最新文章 .... done (need test)
// 使用 cookies:  紀錄上次讀取的文章標籤，與讀取頁數 done
// Loading 的方式，不用 jQuery ....done
// Table of content
	//beautiful beta TOC 的作法是先一口氣抓 999 篇文章，然後做成表格，有了所有的資訊，你就可以排序...
	// 如果不知道所有的標籤，是有些困難做到 toc 或是排序等功能，所以我的作法是修改標籤元素，而他的作法是直接取回所有的文章
	// 他的缺點顯而易見，那就是取回所有的文章需要一些時間，如果文章多的話，對於伺服系的負擔極大，對於網路慢的用戶也會有明顯延遲
	// 我的作法的缺點就是一定需要加入標籤元素，沒有標籤元素就無法得到所有的功能，但可以跟網路/loading 速度取得平衡。
	// 我的想法是 toc 要做，但做在這個外掛裡是不切實際的，考慮放在日曆裡，排序的方式可以參考 beautiful beta，這就變得有點像是無名的樣子，只是更強大。
// 多重標籤選擇 ... maybe impossible
// 可進入該標籤的連結... 
// multiple tag list???
// loading problem while using cookie after chage defaute post setting
// next to do??
// 標籤沒有數字的問題
//沒有標籤的時候該怎麼辦
// 取網址的方法有問題...done

/*
tagListSetting.postShow: 每頁顯示文章數
tagListSetting.labelName: 如果有不只一個 Label，請指定 Label 的名稱，預設 Label1
tagListSetting.defaultPost: 預設標籤，預設為最新文章
tagListSetting.loadingImage: 載入時的文字與圖片
tagListSetting.headerButton: 是否顯示標籤按鈕
tagListSetting.tagsShow: 是否預設顯示標籤雲
tagListSetting.lineHeight: 設定標籤雲字間的高度，免得字大的時候疊在一起
*/
var tagListSetting = {
postShow:5 ,
labelName:'Label1',
defaultPost: '',
loadingImage: '資料載入中...',
headerButton:true,
tagsShow:false,
lineHeight:24,
useTagCould:true,
dropDown:false,
autohideTag:true,
showTimeStamp:true,
upNdownOnly:false,
lastTagPage:true,
messagesArr:['最新文章','選擇標籤','%tagName% %range%，共有 %totalNum% 篇文章','上一頁','下一頁','<p>一篇文章也沒有耶！<br>會不會是輸入錯誤的標籤啊？</p>'],
countDisplay:true,
minColor: [8, 8, 138], 	// Color setting
maxColor: [223, 116, 4],	// Color setting
fontSize: [10, 26]
};
var tagListinner = {
startIndex: 1,
pageNum:1,
blogName:''
};
var tagFunc = {};

tagFunc.findTag = function(id, name,type)
{
	switch (type)
	{
		case 'id':
			var tags = id.getElementsByTagName('*');
			for (var i = 0 ; i < tags.length ; i++ )
			{
				if (tags[i].id == name)
					return tags[i];
			}
			return null;
		case 'class': // while getAttribute('class') && getElementsByClassName won't work
			var tags = id.getElementsByTagName('*');
			var tagsArr = new Array();
			var idx = 0;
			for (var i = 0 ; i < tags.length ; i++ )
			{
				if (tags[i].className == name)
				{
					tagsArr[idx] = tags[i];
					idx++;
				}
			}
			return tagsArr;
	}

};

/*---------------------------------------------------------------
// json-in-script function, a handler for creating a list of post titles
---------------------------------------------------------------*/
tagFunc.Util =function(json)
{
	var tagPostNum = json.feed.openSearch$totalResults.$t;
	if (tagListSetting.labelName != null)
		var getTag = tagFunc.findTag(document.getElementById(tagListSetting.labelName),'postsList','id');
	else
		var getTag = document.getElementById('postsList');
	var titleLinkIdx = 0;
	if (tagListSetting.headerButton && tagListSetting.countDisplay && tagListSetting.dropDown && !tagListSetting.useTagCould)
	{
		var rpNum = document.getElementById('headerBlock').getElementsByTagName('option')[0];
		if (rpNum.innerHTML==tagListSetting.messagesArr[0])
			rpNum.innerHTML = rpNum.innerHTML + '(' + tagPostNum + ')';
	}
	if (tagPostNum != 0)
	{
		var temp = '<ul>';
		if (tagListinner.startIndex+tagListSetting.postShow > tagPostNum)
			var looping = tagPostNum - tagListinner.startIndex+1;
		else
			var looping = tagListSetting.postShow;
		for (var i=0; i < looping ; i++) 
		{
			post = json.feed.entry[i];
			var j = 0;
			while (j < post.link.length && post.link[j].rel!='alternate' ) // we search for the link we want
				j++;
			titleLinkIdx = j;			
			var title=post.title.$t;
			var link=post.link[titleLinkIdx].href;
			if (tagListSetting.showTimeStamp)
			{
				var timestamp=post.published.$t.substr(0,10);
				temp += '<li><a href="'+ link +'">'+ title +'</a><span class="RP_date">'+ timestamp +'</span></li>';
			}
			else
				temp += '<li><a href="'+ link +'">'+ title +'</a></li>';
		}
		temp+='</ul>';
		getTag.innerHTML = temp;
		var object = document.getElementById('listLoading');
		// 老方法，加上頁尾
		var addFooterButton = function()
		{
			if (object != null) // Remove loading message
				object.parentNode.removeChild(object);
			var listInfo = '<span class="footerMsg">' + tagListSetting.messagesArr[2] +'</span>';
			if (tagListSetting.defaultPost == '')
				listInfo = listInfo.replace(/%tagName%/,tagListSetting.messagesArr[0]);
			else
				listInfo = listInfo.replace(/%tagName%/,tagListSetting.defaultPost);
			listInfo = listInfo.replace(/%range%/,tagListinner.startIndex +'~'+ (tagListinner.startIndex+looping-1));
			listInfo = listInfo.replace(/%totalNum%/,tagPostNum);
			var nNode = document.createElement('div');
			nNode.id = 'footerInfo';
			var footerButton = '';
			var number = ''; // string for page number
			if (!tagListSetting.upNdownOnly){
			var crPage  = tagListinner.pageNum; //current page number
			var totalPage = (tagPostNum%tagListSetting.postShow > 0)?Math.floor(tagPostNum/tagListSetting.postShow)+1:tagPostNum/tagListSetting.postShow;
			var showPageRange, endPage;
			if (totalPage <= 7) //why 7? I don't know. It just makes me feet good.
			{
				showPageRange = 1;
				endPage = totalPage;
			}
			else
			{
				if (crPage < ((7+1)/2+1))
					showPageRange = 1;
				else if (crPage > (totalPage -((7+1)/2)))
					showPageRange = totalPage - (7-1);
				else
					showPageRange = crPage - ((7+1)/2-1);
				endPage = showPageRange + 6;
			}
			if (showPageRange == 1) // Create link for first page
			{
				if (crPage == 1)
					number += '<span class="footerMsg">1&nbsp;&nbsp;';
				else 
					number += '<span class="footerMsg"><a href="javascript:tagFunc.goPage(1,tagListSetting.defaultPost);">1</a>&nbsp;&nbsp;';
			}
			else 
				number += '<span class="footerMsg"><a href="javascript:tagFunc.goPage(1,tagListSetting.defaultPost);">1</a>...&nbsp;&nbsp;';
			for (var i = showPageRange+1; i < endPage ; i++)
			{
				if (i == crPage)
					number += i;
				else
					number += '<a href="javascript:tagFunc.goPage('+i+',tagListSetting.defaultPost);">' + i + '</a>';
				number += '&nbsp;&nbsp;';
			}
			if ((showPageRange + 6) >= totalPage)
			{
				if (crPage == totalPage)
					number += totalPage+'&nbsp;&nbsp;</span>';
				else 
					number += '<a href="javascript:tagFunc.goPage('+ totalPage +',tagListSetting.defaultPost);">' + totalPage + '</a>&nbsp;&nbsp;</span>';
			}
			else
				number += '...<a href="javascript:tagFunc.goPage('+ totalPage +',tagListSetting.defaultPost);">' + totalPage + '</a>&nbsp;&nbsp;</span>';
			}
			var next = '<a class="changePage" href="javascript:tagFunc.goPage(++tagListinner.pageNum,tagListSetting.defaultPost);">'+tagListSetting.messagesArr[4]+'</a>';			
			var previous = '<a class="changePage" href="javascript:tagFunc.goPage(--tagListinner.pageNum,tagListSetting.defaultPost);">'+tagListSetting.messagesArr[3]+'</a>';
			if (tagListinner.startIndex == 1)
			{
				if (tagListSetting.postShow < tagPostNum  )
					footerButton+= '<br\>' + number + '&nbsp;&nbsp;' + next ;
			}
			else if (tagListinner.startIndex+tagListSetting.postShow > tagPostNum)
			{
				footerButton+= '<br\>' + previous+ '&nbsp;&nbsp;' + number;
			}
			else 
			{
				footerButton += '<br\>' +previous + '&nbsp;&nbsp;'+ number +'&nbsp;&nbsp;'+ next;
			}
			object = document.getElementById('postsList');
			nNode.innerHTML = listInfo + footerButton;
			object.parentNode.insertBefore(nNode,object.nextSibling);
		};
		addFooterButton();
	}
	else
	{
		//如果有人耍寶，就會跑出下面那段話
		getTag.innerHTML = tagListSetting.messagesArr[5];
		if (object != null) // Remove loading message
			object.parentNode.removeChild(object);
	}
};


/*---------------------------------------------------------------
// Convert  to UTF8
---------------------------------------------------------------*/
tagFunc.convertTag = function (tag)
{
//Shit， Google 會把中文的特殊字元轉成UTF-8，我還得自己轉回去
//http://wwwrsphysse.anu.edu.au/~mxk121/javascript/
	function dec2hex(dec) 
	{
		var h = new Array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');
		var hex = '';
		hex += h[Math.floor(dec / 0x1000)]; dec = dec % 0x1000;
		hex += h[Math.floor(dec / 0x100)]; dec = dec % 0x100;
		hex += h[Math.floor(dec / 0x10)]; dec = dec % 0x10;
		hex += h[Math.floor(dec / 0x1)]; dec = dec % 0x1;
		return hex;
	};
//http://wwwrsphysse.anu.edu.au/~mxk121/javascript/
// 這是個很有趣的寫法，我嘗試改變它的變數，但卻失敗了，敗的不明不白
// 還有更簡潔的寫法嗎？
	function html_unic(str) {
		var nc = '';
		var arr,s,c;
		for (var i = 0; i < str.length; i++) 
		{
			s = str.substr(i, 8);
			if (arr = s.match(/^&#[0-9]+;/)) //最神奇的是這裡，arr 變成了數字，之後居然還可以用 arr[0] 當成字串用，誇張的是，這樣轉出來的還是數字。
			{
				c = arr[0].replace(/[&#;]/g, '');
				c = dec2hex(c);
				c = "%u" + c;
				c = c.replace(/^%u00/, "%");
				i += arr[0].length - 1;
			} 
			else 
				c = str.charAt(i);
		nc += c;
		}
		return unescape(nc); // 直接丟 text 回去
	};
	return html_unic(tag);
};

/*---------------------------------------------------------------
// Run script
// tag: tag name
// This function will run the json-in-script and append the child script to the document
---------------------------------------------------------------*/
tagFunc.Run = function(tag)
{
	var encodeTag = tagFunc.convertTag(tag);
		encodeTag = encodeURIComponent(encodeTag);
	var tagList_script = document.createElement('script');
	var blogLink = 'http://'+ tagListinner.blogName +'/feeds/posts/summary';
	if (tag != '')
		blogLink = blogLink + '/-/' + encodeTag;
	tagList_script.setAttribute('src',blogLink +'/?alt=json-in-script&start-index='+ tagListinner.startIndex +'&max-results='+ tagListSetting.postShow +'&orderby=published&callback=tagFunc.Util');
	tagList_script.setAttribute('type', 'text/javascript');
	tagList_script.id ='listScript';
	document.documentElement.firstChild.appendChild(tagList_script);
};

/*---------------------------------------------------------------
// Change page
// pageNum: Page number, index from 1 to ?
// tag: tag name
---------------------------------------------------------------*/
tagFunc.goPage = function(pageNum, tag)
{
	var nodes = document.getElementById('listScript');
	nodes.parentNode.removeChild(nodes);  // I think this is important. If you don't remove the previous loading script, the browser will sometimes crash.
	var nodes = document.getElementById('postsList');
	//nodes.parentNode.removeChild(nodes.nextSibling);
	var nNode = document.createElement('div');
	nNode.id = 'listLoading';
	nNode.innerHTML = tagListSetting.loadingImage;
	nodes.parentNode.replaceChild(nNode, nodes.nextSibling);
	tagListinner.pageNum = pageNum;
	tagListinner.startIndex = tagListSetting.postShow*(tagListinner.pageNum-1)+1;
	tagListSetting.defaultPost = tag;
	// Determine the action after select a tag dropdown list, autoscroll, autohide, you can only choose one. Action order is drowdown list -> autohide
	if (tagListSetting.autohideTag && (!tagListSetting.dropDown || tagListSetting.useTagCould) && tagListSetting.labelName != null) // add autohide feature 10/2
		document.getElementById(tagListSetting.labelName).getElementsByTagName('ul')[0].style.display = 'none';
	tagFunc.setCookie('cur_pageNumber',pageNum,1000*60*10,'/');  // Set cookies
	if (tagListSetting.defaultPost == '')
		tagFunc.setCookie('cur_tag', '.', 10*60*1000, '/'); // for ie 
	else
		tagFunc.setCookie('cur_tag', tag, 10*60*1000, '/'); // Set  to cur_label , expire time to 10 mins
	tagFunc.Run(tag);
};

/*---------------------------------------------------------------
 You wanna intergrated TagCroud? Here it is!!!
---------------------------------------------------------------*/
tagFunc.labelCloud = function (){
	var arLabels = new Array();
    var arLabelCounts = new Array();
    var labelMaxCount = labelMinCount = 0;
	var categoryList = document.getElementById(tagListSetting.labelName);
	var lists = categoryList.getElementsByTagName('li');
	lists[0].parentNode.id = 'RP-tagCloud';
	//var categoryName = lists[0].innerHTML.replace(/<(?:.|\s)*?>/g,'');
	//alert(categoryName);
	function s(a,b,i,x,y){
		if (x!=y)	i = Math.floor((i/x)*(x-y+1));
		else		i = 1;
		if (i == 0) i = 1;
	    if(a>b){ var m=(a-b)/Math.log(x),v=a-Math.floor(Math.log(i)*m); }
	    else{ var m=(b-a)/Math.log(x),v=Math.floor(Math.log(i)*m+a); }
	    return v;
	}
	for (var idx = 0 ; idx < lists.length ; idx++)
	{
        var txt = lists[idx].innerHTML.replace(/<(?:.|\s)*?>/g,''); // innerText is IE only...so this is the only way I know to do it.
        var i = txt.indexOf('(');
        var j = txt.indexOf(')');
        var labelCount = txt.substr(i+1, (j-i-1));
        arLabelCounts[idx] = parseInt(labelCount);
		if (idx ==0) labelMinCount = arLabelCounts[idx];
        if(arLabelCounts[idx] > labelMaxCount)
			labelMaxCount = arLabelCounts[idx];
		else if (arLabelCounts[idx] < labelMinCount)
			labelMinCount = arLabelCounts[idx];
	}
	for (var i = 0; i < lists.length; i++)
	{
		var minFontSize = tagListSetting.fontSize[0];
		var maxFontSize = tagListSetting.fontSize[1];
		var minColor = tagListSetting.minColor;
		var maxColor = tagListSetting.maxColor;
		var v = s(minFontSize, maxFontSize, arLabelCounts[i], labelMaxCount, labelMinCount);
        var r = s(minColor[0], maxColor[0], arLabelCounts[i], labelMaxCount, labelMinCount);
        var g = s(minColor[1], maxColor[1], arLabelCounts[i], labelMaxCount, labelMinCount);
        var b = s(minColor[2], maxColor[2], arLabelCounts[i], labelMaxCount, labelMinCount);
		var aObj = lists[i].firstChild;  // This is how I remove the unwanted text node and change the innerHTML of A tag
		while (aObj != null)	{
			if(aObj.nodeName == 'A')	{
				aObj.style.color = 'rgb('+r+','+g+','+b+')';
				if (tagListSetting.countDisplay)
					aObj.innerHTML = aObj.innerHTML + '('+arLabelCounts[i]+')';	
			}				
			else if	(/\d+/.test(aObj.nodeValue) || /\d+/.test(aObj.innerHTML))// in this case , the post counts must be attached after labels (sorry my English is bad, hope you understand)
			{
				lists[i].removeChild(aObj);				
				break;
			}				
			aObj = aObj.nextSibling;
		}		
		lists[i].style.fontSize = v+'px';
        lists[i].style.display = 'inline';
		lists[i].style.lineHeight = tagListSetting.lineHeight+'px';
	}
};

/*---------------------------------------------------------------
 Ohhh!!! My cookie
---------------------------------------------------------------*/
tagFunc.setCookie = function(c_name, value, expireTime, path) {
	var exdate = new Date();
	exdate.setTime(exdate.getTime() + expireTime);
	document.cookie = c_name + "=" + escape(value) + ((expireTime==null) ? '' : ';expires='+exdate.toGMTString()) + ((path==null) ? '' :';path='  + path);
};

/*---------------------------------------------------------------
 Get cookie info
---------------------------------------------------------------*/
tagFunc.getCookie = function(c_name)
{
	if (document.cookie.length > 0)
	{
		var c_start = document.cookie.indexOf(c_name + '=');
		if (c_start!=-1)
		{ 
			c_start = c_start + c_name.length + 1; 
			c_end = document.cookie.indexOf(';', c_start);
			if (c_end==-1) c_end=document.cookie.length;
			var cookieValue = document.cookie.substring(c_start,c_end);
			if (cookieValue == '.')
				return '';
			else
				return unescape(cookieValue);
		} 
	}
	return null;
};

/*---------------------------------------------------------------
 Checking cookie
---------------------------------------------------------------*/
tagFunc.checkCookie = function()
{
	cur_pageNamber = tagFunc.getCookie('cur_pageNumber');
	if (cur_pageNumber!=null && cur_pageNumber!="")
	{
		alert('Now is page:'+ cur_pageNumber +'!');
	}
	else 
	{
		tagFunc.setCookie('cur_pageNumber',tagListinner.pageNum, 10000, '/');
	}
};


// 最後當然是在 DOM ready 之後才執行囉
tagFunc.getReady = function()
{
	var object = document.createElement('div');
	object.id = 'postsList';
	if (document.getElementById(tagListSetting.labelName)!=null)
	{
		// Get the name of the category and convert them to a list
		var categoryList = document.getElementById(tagListSetting.labelName);
		var widget = tagFunc.findTag(categoryList,'widget-content','class');
		var lists = categoryList.getElementsByTagName('li');
		var listTableShow = lists[0].parentNode;
		listTableShow.parentNode.insertBefore(object,listTableShow.nextSibling);
		var links = listTableShow.getElementsByTagName('a');
		tagListinner.blogName = listTableShow.getElementsByTagName('a')[0].getAttribute('href').replace(/http:\/\/(.+)\/search\/label.+$/,'$1');
		if (tagListSetting.lastTagPage) // if allow cookies, checking cookie
		{
			var cur_pageNumber = tagFunc.getCookie('cur_pageNumber');
			var cur_tag = tagFunc.getCookie('cur_tag');
			if (cur_tag == null)
			{
				if (tagListSetting.defaultPost == '')
					tagFunc.setCookie('cur_tag', '.', 10*60*1000, '/'); // for ie , because empty string will clear the cookie
				else
					tagFunc.setCookie('cur_tag', tagListSetting.defaultPost, 10*60*1000, '/'); // Set  to cur_label , expire time to 10 mins
				tagFunc.setCookie('cur_pageNumber', '1', 10*60*1000, '/'); // Set page to 1, expire time to 10 mins
			}
/* 			else if (cur_tag != tagListSetting.defaultPost)
			{
				if (tagListSetting.defaultPost == '')
					tagFunc.setCookie('cur_tag', '.', 10*60*1000, '/'); // for ie 
				else
					tagFunc.setCookie('cur_tag', tagListSetting.defaultPost, 10*60*1000, '/'); // Set  to cur_label , expire time to 10 mins
				tagFunc.setCookie('cur_pageNumber', '1', 10*60*1000, '/'); // Set page to 1, expire time to 10 mins
			} */
			else //I am still thinking  if this is a proper behavior.
			{
				tagListinner.pageNum = parseInt(cur_pageNumber);
				tagListSetting.defaultPost = cur_tag; 
			}
		}
		if (tagListSetting.headerButton) // add header
		{
			var blockInfo = document.createElement('div');
			var blockInfoHTML = '';
			blockInfo.id = 'headerBlock';
			if (tagListSetting.dropDown && !tagListSetting.useTagCould) //
			{
				var dropdownStr = '<option value=""';
				if (tagListSetting.defaultPost == '')
					dropdownStr += ' selected';
				dropdownStr += '>' + tagListSetting.messagesArr[0] + '</option>';
				for (var i = 0 ; i < lists.length ; i++)
				{
					var nameOnly = links[i].firstChild.nodeValue.replace(/^\s+|\s+$/g,'');
					var tagName = nameOnly + lists[i].innerHTML.replace(/<(?:.|\s)*?>/g,'').match(/\(\d+\)/);
					dropdownStr += '<option value="'+ nameOnly +'"';
					if (tagName.match(tagFunc.convertTag(tagListSetting.defaultPost))!=null && tagListSetting.defaultPost != '')
						dropdownStr += ' selected';
					if (tagListSetting.countDisplay) 
						dropdownStr +=  '>'+ tagName + '</option>';
					else
						dropdownStr +=  '>'+ nameOnly + '</option>';
				}
					dropdownStr = '<select onChange="javascript:var getName=this.options[this.selectedIndex].value; if (tagListSetting.defaultPost!= getName) tagFunc.goPage(1,getName);">' + dropdownStr + '</select>';
					blockInfo.innerHTML = dropdownStr;
					widget[0].insertBefore(blockInfo,widget[0].firstChild);
					listTableShow.parentNode.removeChild(listTableShow);
			}
			else {
					for (var i = 0 ; i < lists.length ; i++)
					{
						var tagName = links[i].firstChild.nodeValue;
						tagName = tagName.replace(/^\s+|\s+$/g,''); // fix the problem occurred on 12/16. An extra space and lots of space when fetching the name.
						links[i].href = 'javascript:if(tagListSetting.defaultPost!="'+ tagName +'") tagFunc.goPage(1,"'+ tagName +'");';
						if (!tagListSetting.countDisplay)
							links[i].title = lists[i].innerHTML.match(/\(\d+\)/);
					}
				blockInfoHTML += '<span class = "buttonStyle"><a href="javascript:if(tagListSetting.defaultPost!=&quot;&quot;) tagFunc.goPage(1,&quot;&quot;)">'+tagListSetting.messagesArr[0]+'</a></span><span class="buttonStyle"><a href = "javascript:void(0)">'+tagListSetting.messagesArr[1]+'</a></span>';
				blockInfo.innerHTML = blockInfoHTML;
				if (!tagListSetting.tagsShow)
					listTableShow.style.display = 'none';
				widget[0].insertBefore(blockInfo,widget[0].firstChild);
				var setStyle = tagFunc.findTag(categoryList,'buttonStyle','class');
				//setStyle[0].style.marginLeft = '1em';
				setStyle[1].style.marginLeft = '1em';
				setStyle[1].onclick = function()
				{
					if (listTableShow.style.display != 'none')
						listTableShow.style.display = 'none';
					else
						listTableShow.style.display = 'block';
				}
			}
		}
		else if (!tagListSetting.useTagCould)
			listTableShow.parentNode.removeChild(listTableShow);
		if (tagListSetting.useTagCould) // if using tag cloud
			tagFunc.labelCloud(); //put at the end
		tagListinner.startIndex = tagListSetting.postShow*(tagListinner.pageNum-1)+1;  // Go to "THE' page
		tagFunc.Run(tagListSetting.defaultPost);
	}
	else
	{
		tagListSetting.labelName = null;
		tagListSetting.headerButton = false;
		tagListSetting.useTagCould = false;
		tagListSetting.dropDown	= false;
		var getScript = document.documentElement.getElementsByTagName('script');
		for (var i = 0 ; i < getScript.length ; i++)
		{
			if (getScript[i].src.match(/label/))
				break;
		}
		getScript[i].parentNode.insertBefore(object,getScript[i].nextSibling);
		tagListinner.blogName = window.location.href.replace(/http:\/\/(.+)\//,'$1');
		tagFunc.Run('');
	}
};
//http://www.javascriptkit.com/dhtmltutors/domready.shtml
//http://www.java2s.com/Code/JavaScriptReference/Javascript-Properties/readyState.htm
var alreadyrunflag=0; //flag to indicate whether target function has already been run
if (document.addEventListener) // FF DOM ready loader
	document.addEventListener("DOMContentLoaded", function(){alreadyrunflag=1; tagFunc.getReady();}, false);
else if (document.all && !window.opera){ // IE DOM reaady loader
	document.onreadystatechange=function() {  
      if (document.readyState=="complete") {
        alreadyrunflag=1;
		tagFunc.getReady();
      }
	}; 
}
else if(/Safari/i.test(navigator.userAgent)){ //Test for Safari
  var _timer=setInterval(function(){
  if(/loaded|complete/.test(document.readyState)){
    clearInterval(_timer);
	alreadyrunflag=1;
    tagFunc.getReady(); // call target function
  }}, 10);
}
window.onload=function()
{
	setTimeout("if (!alreadyrunflag) tagFunc.getReady();", 0);
};

