/*
 * ============================================================================ 
 */

var HOST = "www.35-35.net"
//var HOST = "localhost"
var DATA_DIR_URL = "http://" + HOST + "/aozora/data";
var JNLP_URL     = "http://" + HOST + "/aozora/cgi/aozora.jnlp"; // AozoraViewer 起動のURL
var COMMENT_ICON_URL = "http://" + HOST + "/aozora/jws/img/comment.png"
var TIMEOUT = 300;

/*
 * ============================================================================ 
 */

var key_weekly = "weekly";
var key_monthly = "monthly";
var key_card = "card";
var key_author = "author";
var key_ranking = "ranking";
var key_date = "date";
var key_comment = "comment";
var key_list = "list";
var key_name = "name";
var key_contents = "contents";
var key_nowreading = "nowreading";

/*
 * ============================================================================ 
 */

// HttpRequestオブジェクトの作成
function createHttpRequest(){
	//Win ie用
	if(window.ActiveXObject){
		try {
			//MSXML2以降用
			return new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				//旧MSXML用
				return new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e2) {
				return null;
			}
		}
	} else if(window.XMLHttpRequest){
		//Win ie以外のXMLHttpRequestオブジェクト実装ブラウザ用
		return new XMLHttpRequest(); //[1]'
	} else {
		return null;
	}
}

/*
 * ============================================================================ 
 */

var limit = 5;
var async = true;
var navi = false;
var comment_limit = 5;
var comment_async = true;
var comment_navi = false;
var nowreading_async = true;

/**
 * 指定されたperiodとtypeのデータを次の期間で更新します。
 * @param limit 取得する件数の最大。すべて取得する場合は -1
 * @param async 著者名と作者名取得を非同期にする場合 true
 * @return
 */
function ranking(limit, async, navi) {
	this.limit = limit;
	this.async = async;
	this.navi = navi;
	showRanking(key_weekly, key_card, 0); // 週間作品別
	showRanking(key_weekly, key_author, 0); // 週間著者別
	showRanking(key_monthly, key_card, 0); // 月間作品別
	showRanking(key_monthly, key_author, 0); // 月間著者別
}

/**
 * 最新のコメントを取得します。
 * @param comment_limit 取得する件数の最大。
 * @param comment_async 著者名と作者名取得を非同期にする場合 true
 * @return
 */
function comment(comment_limit, comment_async, comment_navi) {
	this.comment_limit = comment_limit;
	this.comment_async = comment_async;
	this.comment_navi = comment_navi;
	showComment(0);
}

/**
 * 現在読まれている作品を取得します。
 */
function nowreading(nowreading_async) {
	this.nowreading_async = nowreading_async;
	showNowreading(true);
}

/**
 * 現在読まれている作品を再取得します。
 */
function reloadnowreading() {
	showNowreading(false);
}

/**
 * @param period "weekly" or "monthly"
 * @param type "card" or "author"
 * @return 指定されたランキング挿入用タグのID
 */
function getRankingTagID(period, type) {
	return key_ranking + "." + period + "." + type;
}

/**
 * @param period "weekly" or "monthly"
 * @return 指定された日付挿入用タグのID
 */
function getDateTagID(period) {
	return key_ranking + "." + period + "." + key_date;
}

/*
 * ============================================================================ 
 */


var monthly_year = null;
var monthly_month = null;

/**
 * 月間ランキングの年月のフィールド変数を初期化
 * @return なし
 */
function initMonthlyDate() {
	var dt = new Date();//現在の年月日を取得
	monthly_year = dt.getFullYear();
	//今月の月を取得
	monthly_month = dt.getMonth() + 1;
	if (monthly_month < 10) {
		monthly_month = '0' + monthly_month;
	}
	// 表示を更新
	appendMonthlyDateHTML();
}

/**
 * 月間ランキングの年月のフィールド変数を先月にし、表示を更新
 * @return なし
 */
function prevMonth() {
	if (monthly_year == null || monthly_month == null) {
		initMonthlyDate();
	}
	monthly_month -= 0; // 数値化
	if (monthly_month == 1) {
		monthly_month = 12;
		monthly_year = monthly_year - 1;
	} else {
		monthly_month = monthly_month - 1;
	}
	if (monthly_month < 10) {
		monthly_month = '0' + monthly_month;
	}
	// 表示を更新
	appendMonthlyDateHTML();
	removeRankingCsvCache(key_monthly, key_card);
	removeRankingCsvCache(key_monthly, key_author);
	showRanking(key_monthly, key_card, 0); // 月間作品別
	showRanking(key_monthly, key_author, 0); // 月間著者別
}

/**
 * 月間ランキングの年月のフィールド変数を来月にし、表示を更新
 * @return なし
 */
function nextMonth() {
	if (monthly_year == null || monthly_month == null) {
		initMonthlyDate();
	}
	monthly_month -= 0; // 数値化
	if (monthly_month == 12) {
		monthly_month = 1;
		monthly_year = monthly_year + 1;
	} else {
		monthly_month = monthly_month + 1;
	}
	if (monthly_month < 10) {
		monthly_month = '0' + monthly_month;
	}
	// 表示を更新
	appendMonthlyDateHTML();
	removeRankingCsvCache(key_monthly, key_card);
	removeRankingCsvCache(key_monthly, key_author);
	showRanking(key_monthly, key_card, 0); // 月間作品別
	showRanking(key_monthly, key_author, 0); // 月間著者別
}

/**
 * 現在の期間の月間ランキングデータのURLを取得
 * @param type author or card
 */
function getMonthlyDataURL(type) {
	if (monthly_year == null || monthly_month == null) {
		initMonthlyDate();
	}
	//deta/ranking内から最新のデータファイルを取得（例：月間著者別ランキングデータ monthly.2008.09.author.txt）
	var LatestMonthlyDataURL = DATA_DIR_URL + "/ranking/monthly." + monthly_year + '.' + monthly_month + '.' + type + '.txt';
	return LatestMonthlyDataURL;
}

/*
 * ============================================================================ 
 */

var weekly_year = null;
var weekly_month = null;
var weekly_date = null;

/**
 * 月間ランキングの年月のフィールド変数を初期化
 * @return なし
 */
function initWeeklyDate() {
	var dt = new Date();//現在の日付を取得
	var year = dt.getFullYear();//現在の年を取得
	var date = dt.getDate();//現在の日を取得
	var day = dt.getDay();//現在の曜日を数字で取得(日:0 - 土:6)
	
	//今週月曜日の日付を取得
	if (day == 0) {
		dt.setDate(date-6-day);//現在の日付-6-曜日分の数=先週月曜日の日にち
	} else {
		dt.setDate(date+1-day);//現在の日付+1-曜日分の数=今週月曜日の日にち
	}
	
	weekly_year = dt.getFullYear();//最新データの年
	weekly_month = dt.getMonth() + 1;//最新データの月

	if (weekly_month < 10) {
		weekly_month = '0' + weekly_month;
	}
	weekly_date = dt.getDate();//最新データの日
	if (weekly_date < 10) {
		weekly_date = '0' + weekly_date;
	}
	// 表示を更新
	appendWeeklyDateHTML();
}

/**
 * 月間ランキングの年月のフィールド変数を先月にし、表示を更新
 * @return なし
 */
function prevWeek() {
	if (weekly_year == null || weekly_month == null || weekly_date == null) {
		initWeeklyDate();
	}
	weekly_month -= 0; // 数値化
	weekly_date -= 0; // 数値化

	// 先週の日付を取得
	var dt = new Date(weekly_year, weekly_month - 1, weekly_date - 7); // 7日前

	weekly_year = dt.getFullYear();//最新データの年
	weekly_month = dt.getMonth() + 1;//最新データの月
	if (weekly_month == 0) {
		weekly_month = 12;
	}
	if (weekly_month < 10) {
		weekly_month = '0' + weekly_month;
	}
	weekly_date = dt.getDate();//最新データの日
	if (weekly_date < 10) {
		weekly_date = '0' + weekly_date;
	}
	// 表示を更新
	appendWeeklyDateHTML();
	removeRankingCsvCache(key_weekly, key_card);
	removeRankingCsvCache(key_weekly, key_author);
	showRanking(key_weekly, key_card, 0); // 週間作品別
	showRanking(key_weekly, key_author, 0); // 週間著者別
}

/**
 * 月間ランキングの年月のフィールド変数を来月にし、表示を更新
 * @return なし
 */
function nextWeek() {
	if (weekly_year == null || weekly_month == null || weekly_date == null) {
		initWeeklyDate();
	}
	weekly_month -= 0; // 数値化
	weekly_date -= 0; // 数値化

	// 来週の日付を取得
	var dt = new Date(weekly_year, weekly_month - 1, weekly_date + 7); // 7日後

	weekly_year = dt.getFullYear();//最新データの年
	weekly_month = dt.getMonth() + 1;//最新データの月
	if (weekly_month == 0) {
		weekly_month = 12;
	}
	if (weekly_month < 10) {
		weekly_month = '0' + weekly_month;
	}
	weekly_date = dt.getDate();//最新データの日
	if (weekly_date < 10) {
		weekly_date = '0' + weekly_date;
	}
	// 表示を更新
	appendWeeklyDateHTML();
	removeRankingCsvCache(key_weekly, key_card);
	removeRankingCsvCache(key_weekly, key_author);
	showRanking(key_weekly, key_card, 0); // 週間作品別
	showRanking(key_weekly, key_author, 0); // 週間著者別
}

/**
 * 現在の期間の週間ランキングデータのURLを取得
 * @param type author or card
 */
function getWeeklyDataURL(type){
	if (weekly_year == null || weekly_month == null || weekly_date == null) {
		initWeeklyDate();
	}
	//deta/ranking内から最新のデータファイルを取得（例：週間著者別ランキングデータ weekly.2008.10.06.author.txt）
	var LatestWeeklyDataURL = DATA_DIR_URL + "/ranking/weekly." + weekly_year + '.' + weekly_month + '.' + weekly_date + '.' + type + '.txt'; 
	return LatestWeeklyDataURL;
}

/*
 * ============================================================================ 
 */

function getJnlpUrl(author, card, title, position, commentTimes) {
	var url = JNLP_URL;
	var and = '?';
	if (author != null && author != '') {
		url += and + "author=" + author;
		and = '&';
	}
	if (card != null && card != '') {
		url += and + "card=" + card;
		and = '&';
	}
	if (title != null && title != '') {
		url += and + "title=" + encodeURI(title);
		and = '&';
	}
	if (position != null && position != '') {
		url += and + "position=" + encodeURI(position);
		and = '&';
	}
	if (commentTimes != null && commentTimes != '') {
		url += and + "commenttimes=" + encodeURI(commentTimes);
		and = '&';
	}
	url += and + "trypremier=true";
	return url;
}

/*
 * ============================================================================ 
 */

var rankingCsvArr = new Array();

/**
 * 指定されたperiodとtypeのランキングのキャッシュを削除する。
 * @param period weekly or monthly
 * @param type card or author
 * @return なし
 */
function removeRankingCsvCache(period, type) {
	var key = period + '.' + type;
	rankingCsvArr[key] = null;
}

/**
 * 指定されたperiodとtypeのランキングを取得する。
 * 一度読み込んだランキングはキャッシュとしてフィールドに保持する。
 * @param period weekly or monthly
 * @param type card or author
 * @return 指定された priod でランキングのArray
 */
function getRankingCsv(period, type) {
	var key = period + '.' + type;
	var rankingCsv = rankingCsvArr[key];
	if (rankingCsv == undefined || rankingCsv == null) {
		var URL = null;
		if (period == key_weekly) {
			URL = getWeeklyDataURL(type);
		} else if (period == key_monthly) {
			URL = getMonthlyDataURL(type);
		} else {
			alert("【ERROR】petiod must be " + key_weekly + " or " + key_monthly + " but " + period);
		}
		var xmlhttp = createHttpRequest();
		if (xmlhttp == null) {
//			alert('【ERROR】XMLHttpRequest is null. getIndexTxtできませんでした');
			return;
		}
		// リクエスト開始
		xmlhttp.open("GET", URL, false);
		xmlhttp.send(null);
		if (xmlhttp.readyState == 4) {	//readyState値は4で受信完了
			if (xmlhttp.status == 200) {
				//受信したCSVをパース
				var csvData = xmlhttp.responseText;
				//csvファイルを行ごとに配列に格納
				var lf = String.fromCharCode(10);//改行コード：lf（10）
				var lineArr = csvData.split(lf);//csvファイルの一行ずつのデータを格納する配列
				var csvArr = new Array();//lineData[x]をさらに区切ってcsvデータを2次元配列に格納
				//csvデータを二次元配列化
				for (var i = 0; i < lineArr.length; i++){
					var lineData = lineArr[i].split(',');
					if (lineData != ""){
						csvArr[i]=lineData;//csvArr[personXXX or cardXXX][読まれた数]
						csvArr[i][1]-=0;//読まれた数を数値化
					}
				}
				//読まれた数（csvArr[i][1]の数）で降順にソート
				csvArr.sort(sortImpl);
				// メモリに格納
				rankingCsv = csvArr;
				rankingCsvArr[key] = rankingCsv;
			}
		}
	}
	return rankingCsv;
}

/*
 * ============================================================================ 
 */

/**
 * 指定されたperiodとtypeのランキングをlimitだけロードする
 * @param period
 * @param type
 * @param start
 * @return
 */
function showRanking(period, type, start) {
	initHTML(period, type);
	var csvArr = getRankingCsv(period, type);
	if (csvArr == null || csvArr.length == 0) {
		appendRankingHTML(period, type, null, null, null, "ランキングデータがありません。");
		if( type == key_author ){
			initReadingHTML( period );
		}
		return;
	}
	// ソートされた順でlimitまで取得
	var rankCount = 0;
	var rankValue = 0;
	for (var i = 0; i < csvArr.length && ( limit == -1 || i < (start + limit) ); i++) {
		if (rankValue == 0 || rankValue > csvArr[i][1]) {
			rankCount += 1;
			rankValue = csvArr[i][1];
		}

		if (start <= i) {
			if (type == key_card) {
				// カードIDのデータ取得
				var cardID = csvArr[i][0];
				var personID = matchPersonID(cardID);
				var tagID = period + '.' + type + '.' + cardID;
				var mssg = '取得中...';
				appendRankingHTML(period, type, rankCount, rankValue, tagID, mssg);
				if (async) {
					var load = "loadCardData('" + personID + "','" + cardID + "','" + tagID + "','" + async + "');";
					setTimeout(load, TIMEOUT);
				} else {
					loadCardData(personID, cardID, tagID, async);
				}
			} else if (type == key_author) {
				// 著者IDのデータ取得
				var personID = csvArr[i][0];
				var tagID = period + '.' + type + '.' + personID;
				var mssg = '取得中...';
				appendRankingHTML(period, type, rankCount, rankValue, tagID, mssg);
				if (async) {
					var load = "loadPersonData('" + personID + "','" + tagID + "','" + async + "');";
					setTimeout(load, TIMEOUT);
				} else {
					loadPersonData(personID, tagID, async);
				}
			} else {
				alert("【ERROR】type must be " + key_card + " or " + key_author + " but " + type);
			}
		}
	}

	//閲覧数の合計を出す
	if ( type == key_author ){
		appendWeeklyReadingHTML( period  )
	}		

	var prevStart = start - limit;
	var nextStart = start + limit;
	if (nextStart > csvArr.length) {
		nextStart = -1;
	}
	if (navi) {
		appendNaviHTML(period, type, prevStart, nextStart);
	}
}

function sortImpl(a, b) {
	if(a[1] == b[1]){
		if(a[0] > b[0]){
			return -1;
		}else{
			return 1;
		}
	}	
	if(a[1] > b[1]){
		return -1;
	}else{
		return 1;
	}
}

/*
 * ============================================================================ 
 */

var indexTxtArr = null;
/*
 * index.txtを取得する 
 */
function getIndexTxt() {
	if (indexTxtArr == null) {
		indexTxtArr = new Array(); 
		//Ajax
		var indexURL = DATA_DIR_URL + "/index.txt";//index.txtのURL
		var xmlhttp = createHttpRequest();
		if (xmlhttp == null) {
//			alert('【ERROR】XMLHttpRequest is null. getIndexTxtできませんでした');
			return;
		}
	
		xmlhttp.open("GET", indexURL, false);
		xmlhttp.send(null);
		if (xmlhttp.readyState == 4) {	//readyState値は4で受信完了
			if (xmlhttp.status == 200) {
				var indexData = xmlhttp.responseText;
				var lf = String.fromCharCode(10);//改行コード：lf（10）
				var lineArr = indexData.split(lf);//改行で区切って格納
				//csvデータを二次元配列化
				for (var i = 0; i < lineArr.length; i++){
					var lineData = lineArr[i].split(',');
					if (lineData != ""){
						indexTxtArr[i]=lineData; //[cardID][著者名ID][翻訳者ID]
					}
				}
			} else {
//				alert('【getIndexTxt ERROR】HTTP ResponseCode = ' + xmlhttp.status);
				return;
			}
		}
	}
	return indexTxtArr;
}

/**
 * @param cardID
 * @return personID
 */
function matchPersonID(cardID) {
	var indexTxt = getIndexTxt();
	for (var i = 0; i < indexTxt.length; i++) {
		if (indexTxt[i][0] == cardID) {
			return indexTxt[i][1];
		}
	}
	return null;
}

/**
 * @param personID
 * @param tagID
 * @return 著者名を非同期で取得して、指定されたtagIDの要素に記載
 */
function loadPersonData(personID, tagID, async) {
	var personXmlURL = DATA_DIR_URL + "/works/"+personID+".xml";//personXXX.xmlのURL
	var xmlhttp = createHttpRequest();
	if (xmlhttp == null) {
//		alert('【ERROR】XMLHttpRequest is null. getPersonXmlできませんでした');
		return;
	}
	//受信時に起動するイベント
	var callback = function() { 
		if (xmlhttp.readyState == 4) {	//readyState値は4で受信完了
			if (xmlhttp.status == 200) {
				//person.xmlを受け取り、XML処理で書籍の詳細をゲット！
				var xmlData = xmlhttp.responseXML;
				var rNode = xmlData.documentElement;//root nodeオブジェクト
				var rNodeChilds = rNode.childNodes;//root nodeの子ノード	
				// xml要素の子ノードでループする	
				for (var i = 0; i < rNodeChilds.length; i++) {
					if (rNodeChilds[i].nodeType == 1 && rNodeChilds[i].nodeName == "person") {//子ノード名:person
					// person要素の子ノードでループする
						var personChilds = rNodeChilds[i].childNodes;
						for (var j=0; j < personChilds.length; j++){
							// personの子ノードが要素ノードかつノード名nameなら処理
							if (personChilds[j].nodeType == 1 && personChilds[j].nodeName == 'name'){
								// Firefox のときの処理
								var person = personChilds[j].textContent;//作者名を取得
								// Firefox以外のブラウザの処理
								if (person == undefined){
									person = personChilds[j].text;
								}
								// 指定されたtagIDの要素に記載
								var tag = document.getElementById(tagID);
								if ( ! tag) {
									return;
								}
								if (tagID.substr(tagID.length - 2, tagID.length) == '_a') {
									tag.title = tag.title + '／' + person;
									return;
								}
								var a = document.createElement('a');
								a.href = getJnlpUrl(personID, null, person);
								a.innerHTML = person;
								a.id = tagID + '_a';
								a.title = person;
								tag.innerHTML = '';
								tag.appendChild(a);
								return;
							}
						}
					}
				}
			}
		}
	}
	xmlhttp.onreadystatechange = callback;
	xmlhttp.open("GET", personXmlURL, async);
	xmlhttp.send(null);
	if ( ! async) {
		callback();
	}
}

/**
 * @param personID
 * @param cardID
 * @param tagID
 * @return 著者名を非同期で取得して、指定されたtagIDの要素に記載
 */
function loadCardData(personID, cardID, tagID, async) {
	var personXmlURL = DATA_DIR_URL + "/works/"+personID+".xml";//personXXX.xmlのURL
	var xmlhttp = createHttpRequest();
	if (xmlhttp == null) {
//		alert('【ERROR】XMLHttpRequest is null. getPersonXmlできませんでした');
		return;
	}
	//受信時に起動するイベント
	var callback = function() { 
		if (xmlhttp.readyState == 4) {	//readyState値は4で受信完了
			if (xmlhttp.status == 200) {
				//person.xmlを受け取り、XML処理で書籍の詳細をゲット！
				var xmlData = xmlhttp.responseXML;
				var rNode = xmlData.documentElement;//root nodeオブジェクト
				var rNodeChilds = rNode.childNodes;//root nodeの子ノード	

				// xml要素の子ノードでループする	
				for (var i = 0; i < rNodeChilds.length; i++) {
					if (rNodeChilds[i].nodeType == 1 && rNodeChilds[i].nodeName == "data") {//子ノード名:data
					// data要素の子ノードでループする
						var dataChilds = rNodeChilds[i].childNodes;//deta要素の子ノード
						for (var j=0; j < dataChilds.length; j++){
							// Firefox のときの処理
							var dataChildID = dataChilds[j].textContent; //dataの子要素のid要素のテキストを取得
							// Firefox以外のブラウザの処理
							if (dataChildID == undefined){
								dataChildID = dataChilds[j].text;
							}
							// dataの子ノードが要素ノードかつノード名idかつidがcardIDなら処理
							if (dataChilds[j].nodeType == 1 && dataChilds[j].nodeName == 'id' && dataChildID == cardID){
								for (var k=j+1; k<dataChilds.length; k++){
									if (dataChilds[k].nodeType == 1 && dataChilds[k].nodeName == 'title'){
										var titleChilds = dataChilds[k].childNodes;//titleの子ノード
										for (var l=0; l<titleChilds.length; l++){
											if (titleChilds[l].nodeType == 1 && titleChilds[l].nodeName == 'name'){
												// Firefox のときの処理
												var card = titleChilds[l].textContent;//作品名を取得
												// Firefox以外のブラウザの処理
												if (card == undefined){
													card = titleChilds[l].text;
												}
												// 指定されたtagIDの要素に記載
												var tag = document.getElementById(tagID);
												if ( ! tag) {
													return;
												}
												var a = document.createElement('a');
												a.href = getJnlpUrl(personID, cardID, card);
												a.innerHTML = card;
												a.id = tagID + '_a';
												a.title = card;
												tag.innerHTML = '';
												tag.appendChild(a);
												// 作品名のリンクのtitleに著者名を入れる
												//著者名を書き出し
												var authorTagID = tagID + ".author";
												if (async) {
													var load = "loadPersonData('" + personID + "','" + a.id + "','" + async + "');";
													setTimeout(load, TIMEOUT);
												} else {
													loadPersonData(personID, a.id, async);
												}
												return;
											}
										}
									}
								}
							}
						}
					}
				}
			} else {
//				alert('【getCardData ERROR】HTTP ResponseCode = ' + xmlhttp.status);
				return;
			}
		}
	}
	xmlhttp.onreadystatechange = callback;
	xmlhttp.open("GET", personXmlURL, async);
	xmlhttp.send(null);
	if ( ! async) {
		callback();
	}
}

/*
 * ============================================================================ 
 */


/**
 * 指定されたperiodとtypeのタグ内のHTMLを初期化
 * @param period
 * @param type
 * @return なし
 */
function initHTML(period, type) {
	var tagid = getRankingTagID(period, type);
	document.getElementById(tagid).innerHTML = '<table><tbody id="' + tagid + '.tbody"></tbody></table>';
}

/**
 * 指定されたperiodとtypeのタグ内のHTMLに指定されたrankCount,rankValue,URL,mssgの行を追加
 * @param period
 * @param type
 * @param rankCount 順位 1,2,3...
 * @param rankValue 件数
 * @param tagID 著者名または作品名を表示するタグにつけるid
 * @param mssg 表示する著者名または作品名
 * @return なし
 */
function appendRankingHTML(period, type, rankCount, rankValue, tagID, mssg) {
	var tagid = getRankingTagID(period, type) + '.tbody';
	var tr = document.createElement('tr');
	var td_rank = document.createElement('td');
	if (rankCount != null) {
		td_rank.className = 'ranking_rank ranking_rank_' + rankCount;
		td_rank.innerHTML = rankCount + '位(' + rankValue + ')';
	}
	tr.appendChild(td_rank);
	var td_name = document.createElement('td');
	if (tagID != null) {
		td_name.id = tagID;
	}
	if (rankCount != null) {
		td_name.className = 'ranking_name ranking_rank_' + rankCount;
	}
	td_name.innerHTML = mssg;
	tr.appendChild(td_name);
	document.getElementById(tagid).appendChild(tr);
}

/**
 * 指定されたperiodとtypeのタグ内のHTMLに指定されたrankCount,rankValue,URL,mssgの行を追加
 * @param period
 * @param type
 * @param prevStart
 * @param nextStart
 * @return なし
 */
function appendNaviHTML(period, type, prevStart, nextStart) {
	var tagid = getRankingTagID(period, type) + '.tbody';
	var tr = document.createElement('tr');
	var td_prev = document.createElement('td');
	td_prev.className = 'ranking_navi_prev';
	if (prevStart >= 0) {
		var a_prev = document.createElement('a');
		a_prev.href = 'javascript:showRanking(\'' + period + '\', \'' + type + '\', ' + prevStart + ');';
		a_prev.innerHTML = '&lt;&nbsp;high';
		td_prev.appendChild(a_prev);
	} else {
		td_prev.innerHTML = '&lt;&nbsp;high';
	}
	tr.appendChild(td_prev);
	var td_next = document.createElement('td');
	td_next.className = 'ranking_navi_next';
	if (nextStart >= 0) {
		var a_next = document.createElement('a');
		a_next.href = 'javascript:showRanking(\'' + period + '\', \'' + type + '\', ' + nextStart + ');';
		a_next.innerHTML = 'low&nbsp;&gt;';
		td_next.appendChild(a_next);
	} else {
		td_next.innerHTML = 'low&nbsp;&gt;';
	}
	tr.appendChild(td_next);
	document.getElementById(tagid).appendChild(tr);
}

/**
 * 月間ランキングの年月の期間をHTMLに表示
 */
function appendMonthlyDateHTML() {
	//HTMLにいつのランキングかを表示
	var monthlyDateTag = document.getElementById(getDateTagID(key_monthly));
	monthlyDateTag.innerHTML = monthly_year + "年" + (monthly_month - 0) + "月";
	if (navi) {
		var a_prev = '&nbsp;<a href="javascript:prevMonth();">&lt;&nbsp;older</a>&nbsp;';
		var a_next = '&nbsp;<a href="javascript:nextMonth();">newer&nbsp;&gt;</a>&nbsp;';
		monthlyDateTag.innerHTML = a_prev + monthlyDateTag.innerHTML + a_next;
	}
}

/**
 * 週間ランキングの年月日の期間をHTMLに表示
 */
function appendWeeklyDateHTML() {
	// ランキング集計開始日
	var startYear = weekly_year;
	var startMonth = weekly_month - 0; // 数値化
	var startDate = weekly_date - 0; // 数値化
	
	// ランキング集計終了日
	var endDt = new Date(startYear, startMonth - 1, startDate + 6);
	var endYear = endDt.getFullYear();
	var endMonth = endDt.getMonth() + 1;
	var endDate = endDt.getDate();

	//HTMLにいつのランキングかを表示
	var weeklyDateTag = document.getElementById(getDateTagID(key_weekly));
	weeklyDateTag.innerHTML = startYear + "年" + startMonth + "月" + startDate + "日 - " + endYear + "年" + endMonth + "月" + endDate +"日";
	
	if (navi) {
		var a_prev = '&nbsp;<a href="javascript:prevWeek();">&lt;&nbsp;older</a>&nbsp;';
		var a_next = '&nbsp;<a href="javascript:nextWeek();">newer&nbsp;&gt;</a>&nbsp;';
		weeklyDateTag.innerHTML = a_prev + weeklyDateTag.innerHTML + a_next;
	}
}

/*
 * ============================================================================ 
 */

var readingWeekly_id = "reading.weekly";
var monthly_id = "reading.monthly";

/**
 * ランキングの読書総数をHTMLに表示（著者別ランキングから取得）
 * @param period
 * @return なし
 */
function appendWeeklyReadingHTML(period) {
	var rankingCsv = getRankingCsv(period, key_author);

	var reading = 0;
	//読まれた数を全部足す
	for (var i = 0; i < rankingCsv.length; i++){
		reading = reading + rankingCsv[i][1];
	}

	//HTMLに表示する
	document.getElementById("reading." + period).innerHTML = reading;
}

/**
 * ランキングの読書総数のHTMLを初期化
 * @param period
 * @return なし
 */
function initReadingHTML( period ){
	//閲覧数を初期化（0にする）
	document.getElementById("reading." + period).innerHTML = "0";
}


/*
 * ============================================================================ 
 */
/**
 * 最新のコメントをcomment_limitだけロードする
 * @param start
 * @return
 */
function showComment(start) {
	initCommentHTML();
	var csvArr = getCommentDataArr(start);//最新コメントデータを2次元配列として格納したArrayを取得
	//csvArr[x][0]タイムスタンプ
	//csvArr[x][1]cardID
	//csvArr[x][2]何文字目からコメントがついているか
	//csvArr[x][3]コメントの文字数
	//csvArr[x][4]コメント者名
	//csvArr[x][5]コメント内容
	
	if (csvArr == null || csvArr.length == 0) {
		appendCommentHTML(null, null, null, null, null, null, "コメントデータがありません。", null, null);
		if (comment_navi) {
			appendCommentNaviHTML(start, false);
		}
		return;
	}
	// csvArr からデータを取得してHTMLに書き出し
	for (var i = 0; i < csvArr.length; i++) {
		var cardID = csvArr[i][1];// cardIDを取得
		var personID = matchPersonID(cardID);//cardIDから著者IDを取得
		var tagID = key_comment + "." + i;//コメントデータを書き出すHTMLの大元のID
		var mssg = '取得中...';
		//タイムスタンプをミリ秒→YYYY/MM/DD HH:mm に直す
		var times = csvArr[i][0];
		var date = getCommentDate(times);
		//コメント者名、コメント内容、コメント日時を書き出し
		var position = csvArr[i][2];
		var name = csvArr[i][4];
		var contents = csvArr[i][5];
		appendCommentHTML(date, times, position, name, contents, tagID, mssg, cardID, personID);
		//作品名を書き出し
		var cardTagID = tagID + ".card";
		if (comment_async) {
			var load = "loadCardData('" + personID + "','" + cardID + "','" + cardTagID + "','" + comment_async + "');";
			setTimeout(load, TIMEOUT);
		} else {
			loadCardData(personID, cardID, cardTagID, comment_async);
		}
		//著者名を書き出し
		var authorTagID = tagID + ".author";
		if (comment_async) {
			var load = "loadPersonData('" + personID + "','" + authorTagID + "','" + comment_async + "');";
			setTimeout(load, TIMEOUT);
		} else {
			loadPersonData(personID, authorTagID, comment_async);
		}
	}
	if (comment_navi) {
		appendCommentNaviHTML(start, true);
	}
}

/*
 * ============================================================================ 
 */

/**
 * commentのタグ内のHTMLを初期化
 * @return なし
 */
function initCommentHTML() {
	var tagid = key_comment + "." + key_list;
	document.getElementById(tagid).innerHTML = '<ul id="' + tagid + '.ul"></ul>';
}

var commentCsvArr = new Array();
var comment_key = 'comment';

/**
 * 最新のコメントデータを格納したArrayを取得する。
 * 一度読み込んだコメントはキャッシュとしてフィールドに保持する。
 * @param start 件数。0が最新。
 * @return 最新コメントのArray
 */

function getCommentDataArr(start) {
	var commentCsv = commentCsvArr[comment_key];
	if (commentCsv == undefined || commentCsv == null) {
		commentCsvArr = new Array();
		var fileArr = getCommentTxt();//コメントデータのファイル名を格納した配列を取得
		if (fileArr == null) {
			return commentCsvArr;
		}
		var count = 0;
		var index = 0;
		for (var fileArrIndex = 0; fileArrIndex < fileArr.length; fileArrIndex++){
			//コメントデータのテキストを読み込む
			var URL = DATA_DIR_URL + "/comment/" + fileArr[fileArrIndex];//fileArr[0]が最新のデータ
			//var URL = DATA_DIR_URL + '/comment/comment.1276239776.txt';
			var xmlhttp = createHttpRequest();
			if (xmlhttp == null) {
				alert('【ERROR】XMLHttpRequest is null. getCommentDataArrできませんでした');
				return;
			}
			// リクエスト開始
			xmlhttp.open("GET", URL, false);
			xmlhttp.send(null);
			if (xmlhttp.readyState == 4) {	//readyState値は4で受信完了
				if (xmlhttp.status == 200) {
					//受信したCSVをパース
					var commentCsvData = xmlhttp.responseText;
					//csvファイルを行ごとに配列に格納
					var lf = String.fromCharCode(10);//改行コード：lf（10）
					var commentLineArr_orig = commentCsvData.split(lf);//csvファイルの一行ずつのデータを格納した配列
					var commentLineArr = commentLineArr_orig.reverse();//データを最新順に並び替え
					var ht = String.fromCharCode(9);//文字タブコード：ht（9）
					//最新コメント順に、comment_limitまで（データが満たない場合は全ての行）データをタブで区切って2次元配列に格納
					for (var i = 0; i < commentLineArr.length; i++){
					var arr = commentLineArr[i].split(ht);//タブで区切ってarrに格納
						if (arr.length < 6) {//6 commentLineArr[i]の要素の数（comment.xxxxxxxxxx.txt のデータの数）
							continue;
						}
						if (start <= count) {
							commentCsvArr[index] = arr;
							index++;
						}
						count++;
						if (count >= start + comment_limit){
							return commentCsvArr;
						}
					}
				}
			}
		}
	}
	return commentCsvArr;
}


/**
 * コメントデータのtxtファイル名を取得
 * @param なし
 * @return URLを返す
 */ 
function getCommentTxt(){
	var URL = DATA_DIR_URL + '/comment/?C=N;O=D';
	//var URL = DATA_DIR_URL + '/comment/comment.1276239776.txt';
	var xmlhttp = createHttpRequest();
	if (xmlhttp == null) {
		alert('【ERROR】XMLHttpRequest is null. getCommentTxtできませんでした');
		return;
	}
	// リクエスト開始
	xmlhttp.open("GET", URL, false);
	xmlhttp.send(null);
	if (xmlhttp.readyState == 4) {	//readyState値は4で受信完了
		if (xmlhttp.status == 200) {
			//受信したCSVをパース
			var commentTxt = xmlhttp.responseText;
			//comment.xxxxxxxxxx.txtという文字列があったら上から順に抜き出して配列に格納
			var patern = key_comment + "\\." +  "\\d{10}" + "\\.txt";
			var txtURL = new RegExp(patern, "g");//正規表現の文字列を作成　g:最後まで検索させるオプション
			var commentTxtURLArr = commentTxt.match(txtURL);//comment.[数字10桁].txtという文字列があったら抜き出す
			//commentTxtURLArr[偶数] = hrefタグから抜き出した文字列
			//commentTxtURLArr[奇数] = web表示用のテキストから抜き出した文字列
			//上記2つのURLは重複するので、偶数番号の配列に格納されているデータを削除する
			if (commentTxtURLArr) {
				for (var i = 0; i < commentTxtURLArr.length; i++){
					if ((i % 2) == 0){
						commentTxtURLArr.splice(i,1);
					}
				}
			}
		}
	}
	return commentTxtURLArr;
	//return commentTxtURLArr[0];
}

/**
 * commentLineArr を2次元配列化し、最新のコメント→古いコメントになるようにデータを格納
 * @param commentLineArr comment.*.txt を1行ごとに格納した配列
 * @return commentLineArr をタブで区切って2次元配列にした配列
 */
function getCommentArr(commentLineArr){
	var commentArr = new Array();//commentLineArrをさらに区切って2次元配列にするための配列を作成
	var ht = String.fromCharCode(9);//文字タブコード：ht（9）
	//最新コメント順にデータを格納
	for (var i = 0; i < commentLineArr.length; i++){
		var arr = commentLineArr[i].split(ht);
		commentArr[i] = arr;
	}
	return commentArr;
}

/**
 * コメントのあったタイムスタンプをミリ秒→YYYY/MM/DD HH:mm に直す
 * @param milliseconds コメント日時
 * @return YYYY/MM/DD HH:mm
 */ 
function getCommentDate(milliseconds){
	var milli = new Date();
	milli.setTime(milliseconds);
	var year = milli.getFullYear();
	var month = milli.getMonth() +1;
	var date = milli.getDate();
	var hours = milli.getHours();
	var minutes = milli.getMinutes();
	
	return year + "/" + month + "/" + date + "/" + " " + hours + ":" + minutes;
}

/**
 * HTMLにコメント用の作品・著者名、コメント者名、コメント内容の行を追加
 * @param date コメント日時
 * @param times コメント日時
 * @param position コメント開始位置
 * @param name コメント者名
 * @param contents コメント内容
 * @param tagID 表示するタグにつけるid
 * @param mssg 表示する作品名または著者名
 * @param cardID 作品ID
 * @param personID 著者ID
 * @return なし
 */ 
function appendCommentHTML(date, times, position, name, contents, tagID, mssg, cardID, personID) {
	var tagid = key_comment + '.' + key_list + '.ul';//タグの行を追加するid comment.list.ul
	if (tagID == null) {
		document.getElementById(tagid).innerHTML = mssg;
		return;
	}
	
	var ul = document.createElement('ul');//ulを作成
	ul.className = key_comment + '_ul'; //ulのclass名を作成 comment_ul

	//コメント者名用のliを作成
	var li_name = document.createElement('li');
	li_name.className = key_comment + '_name';	//liのclass名を作成 comment_name

	if ( name == undefined || name == null || name == '' ){
		name = "名無しさん";
		li_name.innerHTML = name;//名前の記入がなければ「名無しさん」としてli内に書き出し	
	} else {
		li_name.innerHTML = name;//li内に書き出し	
	}

	//日付用のspanを作成
	var span_date = document.createElement('spandiv');
	span_date.className = 'span_' + key_comment + '_date';//日付用spanのclass名を作成 span_comment_date
	span_date.innerHTML = date;
	
	ul.appendChild(li_name);//ulにli_name(li)を追加
	li_name.appendChild(span_date);//li_name(li)にspan_date(span)を追加
	
	//コメント用のliを作成
	var li_contents = document.createElement('li');
	li_contents.className = key_comment + '_contents';	//liのclass名を作成 comment_contents
	// コメントデータ用
	var span_data = document.createElement('span');	//コメントリンク用のタグを作成
	span_data.id = tagID + ".data";
	span_data.innerHTML = contents;
	// コメントリンク用
	var span_link = document.createElement('span');	//コメントリンク用のタグを作成
	span_link.id = tagID + ".link";
	var a_link = document.createElement('a');
	a_link.href = getJnlpUrl(personID, cardID, contents, position, times);
	var img_link = document.createElement('img');
	img_link.src = COMMENT_ICON_URL;
	a_link.appendChild(img_link);
	span_link.appendChild(a_link);
	li_contents.appendChild(span_data);
	li_contents.appendChild(span_link);
	ul.appendChild(li_contents);//ulにli_contents(li)を追加	
	
	//作品名・著者名用のliを作成
	var li_book = document.createElement('li');
	li_book.className = key_comment + '_book';	//liのclass名を作成 comment_book
	
	//作品名・著者名表示用spanを作成
	var span_card = document.createElement('span');	//作品名表示用のタグを作成
	var span_slash = document.createElement('span');	//作品名と著者名を区切るための斜線用のタグを作成
	var span_author = document.createElement('span');	//著者名表示用のタグを作成
	
	//URL用idを作成
	span_card.id = tagID + ".card";
	span_slash.id = tagID + ".slash";
	span_author.id = tagID + ".author";
	span_card.innerHTML = mssg;//書き出し
	span_slash.innerHTML = "／";	
	span_author.innerHTML = mssg;//書き出し

	ul.appendChild(li_book);//ulにli_book(li)を追加
	li_book.appendChild(span_card);//li_book(li)にspan_card(span)を追加
	li_book.appendChild(span_slash);//li_book(li)にspan_slash(span)を追加
	li_book.appendChild(span_author);//li_book(li)にspan_author(span)を追加
		
	//hrを作成
	var hr = document.createElement('hr');
	ul.appendChild(hr);//ulにhrを追加	
		
	document.getElementById(tagid).appendChild(ul);
}

function appendCommentNaviHTML(curStart, hasOlder) {
	if (comment_limit == -1) {
		return;
	}
	var listTagID = key_comment + '.' + key_list;
	var listTag = document.getElementById(listTagID);
	var table_navi = document.createElement('table');
	listTag.appendChild(table_navi);
	var tr_navi = document.createElement('tr');
	table_navi.appendChild(tr_navi);
	var td_prev = document.createElement('td');
	td_prev.className = 'ranking_navi_prev';
	tr_navi.appendChild(td_prev);
	var td_next = document.createElement('td');
	td_next.className = 'ranking_navi_next';
	tr_navi.appendChild(td_next);
	
	if (hasOlder) {
		var start = curStart + comment_limit;
		var a_prev =  document.createElement('a');
		a_prev.href = 'javascript:showComment(' + start + ');';
		a_prev.innerHTML = '&lt;&nbsp;older';
		td_prev.appendChild(a_prev);
	} else {
		td_prev.innerHTML = '&lt;&nbsp;older';
	}
	
	if (curStart > 0) {
		var start = curStart - comment_limit;
		if (start < 0) {
			start = 0;
		}
		var a_next =  document.createElement('a');
		a_next.href = 'javascript:showComment(' + start + ');';
		a_next.innerHTML = 'newer&nbsp;&gt;';
		td_next.appendChild(a_next);
	} else {
		var a_next =  document.createElement('a');
		a_next.href = 'javascript:showComment(0);';
		a_next.innerHTML = 'reload';
		td_next.appendChild(a_next);
	}
}

/*
 * ============================================================================ 
 */

/**
 * 現在読まれている作品
 * @param move テロップを動かすかどうか。（リロード時の加速回避）
 */
function showNowreading(move) {
	initNowreadingHTML();
	var nowreadingArr = getNowreadingArr();
	if (nowreadingArr == null || nowreadingArr.length == 0) {
		appendNowreadingCardHTML(null, null, "現在読まれている作品はありません。", null);
		appendNowreadingAuthorHTML(null, "現在読まれている作家はありません。", null);
		return;
	}
	for (var i = 0; i < nowreadingArr.length * 2; i++) {
		var i_ = ( i >= nowreadingArr.length ) ? i - nowreadingArr.length : i;
		var personID = nowreadingArr[i_][0];
		var cardID = nowreadingArr[i_][1];
		var nowreadingCardTagID = key_nowreading + '_' + key_card + '_' + i;
		var nowreadingAuthorTagID = key_nowreading + '_' + key_author + '_' + i;
		var mssg = '取得中...';
		appendNowreadingCardHTML(personID, cardID, mssg, nowreadingCardTagID);
		appendNowreadingAuthorHTML(personID, mssg, nowreadingAuthorTagID);
	}
	if (move) {
		setTimeout('moveNowreadingCardHTML(' + (nowreadingArr.length - 1) + ')', 1000);
		setTimeout('moveNowreadingAuthorHTML(' + (nowreadingArr.length - 1) + ')', 1000);
	}
}

/**
 * @return 現在読まれている作品の著者ID、作品IDの2次元配列
 */
function getNowreadingArr(){
	var nowreadingArr = new Array();
	//データのテキストを読み込む
	var URL = DATA_DIR_URL + "/ranking/current.txt";
	var xmlhttp = createHttpRequest();
	if (xmlhttp == null) {
		alert('【ERROR】XMLHttpRequest is null. getNowreadingArrできませんでした');
		return;
	}
	// リクエスト開始
	xmlhttp.open("GET", URL, false);
	xmlhttp.send(null);
	if (xmlhttp.readyState == 4) {	//readyState値は4で受信完了
		if (xmlhttp.status == 200) {
			//受信したCSVをパース
			var nowreadingCsvData = xmlhttp.responseText;
			//csvファイルを行ごとに配列に格納
			var lf = String.fromCharCode(10);//改行コード：lf（10）
			var nowreadingLineArr_orig = nowreadingCsvData.split(lf);//csvファイルの一行ずつのデータを格納した配列
			var nowreadingLineArr = nowreadingLineArr_orig.reverse();//データを最新順に並び替え
			var comma = ',';
			//最新コメント順に、comment_limitまで（データが満たない場合は全ての行）データをタブで区切って2次元配列に格納
			var count = 0;
			for (var i = 0; i < nowreadingLineArr.length; i++){
				var arr = nowreadingLineArr[i].split(comma);//タブで区切ってarrに格納
				if (arr.length != 2) {//2 要素の数（著者ID、作品ID）
					continue;
				}
				nowreadingArr[count] = arr;
				count++;
			}
		}
	}
	return nowreadingArr;
}

/**
 * nowreadingのタグ内のHTMLを初期化
 * @return なし
 */
function initNowreadingHTML() {
	var card_listTagID = key_nowreading + '_' + key_card + '_' + key_list;
	var card_listTag = document.getElementById(card_listTagID);
	if (card_listTag) {
		var card_ulTag = document.createElement('ul');
		card_ulTag.id = key_nowreading + '_' + key_card + '_ul';
		card_listTag.innerHTML = '';
		card_listTag.appendChild(card_ulTag);
	}
	var author_listTagID = key_nowreading + '_' + key_author + '_' + key_list;
	var author_listTag = document.getElementById(author_listTagID);
	if (author_listTag) {
		var author_ulTag = document.createElement('ul');
		author_ulTag.id = key_nowreading + '_' + key_author + '_ul';
		author_listTag.innerHTML = '';
		author_listTag.appendChild(author_ulTag);
	}
}

/**
 * 現在読まれている作品
 * @param personID
 * @param cardID
 * @param mssg
 * @param tagID
 * @return
 */
function appendNowreadingCardHTML(personID, cardID, mssg, tagID) {
	var ulTagID = key_nowreading + '_' + key_card + '_ul';//タグの行を追加するid nowreading.list.ul
	var ulTag = document.getElementById(ulTagID);
	if ( ! ulTag) {
		return;
	}
	if (tagID == null) {
		ulTag.innerHTML = mssg;
		return;
	}
	
	var li_nowreading = document.createElement('li');
	li_nowreading.id = tagID;
	li_nowreading.className = key_nowreading + '_li';
	
	var span_card = document.createElement('span');
	span_card.id = tagID + "_" + key_card;
	span_card.innerHTML = mssg;//書き出し
	li_nowreading.appendChild(span_card);
	ulTag.appendChild(li_nowreading);
	
	li_nowreading.onmouseover = function() { setStopNowreadingCard(true); };
	li_nowreading.onmouseout = function() { setStopNowreadingCard(false); };

	//作品名を書き出し
	if (nowreading_async) {
		var load = "loadCardData('" + personID + "','" + cardID + "','" + span_card.id + "','" + nowreading_async + "');";
		setTimeout(load, TIMEOUT);
	} else {
		loadCardData(personID, cardID, span_card.id, nowreading_async);
	}
}


/**
 * 現在読まれている作品
 * @param personID
 * @param cardID
 * @param mssg
 * @param tagID
 * @return
 */
function appendNowreadingAuthorHTML(personID, mssg, tagID) {
	var ulTagID = key_nowreading + '_' + key_author + '_ul';//タグの行を追加するid nowreading.list.ul
	var ulTag = document.getElementById(ulTagID);
	if ( ! ulTag) {
		return;
	}
	if (tagID == null) {
		ulTag.innerHTML = mssg;
		return;
	}
	
	var li_nowreading = document.createElement('li');
	li_nowreading.id = tagID;
	li_nowreading.className = key_nowreading + '_li';
	
	var span_auhtor = document.createElement('span');
	span_auhtor.id = tagID + "_" + key_author;
	span_auhtor.innerHTML = mssg;//書き出し
	li_nowreading.appendChild(span_auhtor);
	ulTag.appendChild(li_nowreading);
	
	li_nowreading.onmouseover = function() { setStopNowreadingAuthor(true); };
	li_nowreading.onmouseout = function() { setStopNowreadingAuthor(false); };

	//作家名を書き出し
	if (nowreading_async) {
		var load = "loadPersonData('" + personID + "','" + span_auhtor.id + "','" + nowreading_async + "');";
		setTimeout(load, TIMEOUT);
	} else {
		loadPersonData(personID, span_auhtor.id, nowreading_async);
	}
}

function setStopNowreadingCard(val) {
	stopNowreadingCard = val;
}
var stopNowreadingCard = false;

function setStopNowreadingAuthor(val) {
	stopNowreadingAuthor = val;
}
var stopNowreadingAuthor = false;

function moveNowreadingCardHTML(resetIndex) {
	if ( stopNowreadingCard ) {
		setTimeout("moveNowreadingCardHTML(" + resetIndex + ")", 100);
		return;
	}
	var ulTagID = key_nowreading + '_' + key_card + '_ul';
	var resetTagID = key_nowreading + '_' + key_card + '_' + resetIndex;
	moveNowreading_ulTag(ulTagID, resetTagID)
	setTimeout("moveNowreadingCardHTML(" + resetIndex + ")", 50);
}

function moveNowreadingAuthorHTML(resetIndex) {
	if ( stopNowreadingAuthor ) {
		setTimeout("moveNowreadingAuthorHTML(" + resetIndex + ")", 100);
		return;
	}
	var ulTagID = key_nowreading + '_' + key_author + '_ul';
	var resetTagID = key_nowreading + '_' + key_author + '_' + resetIndex;
	moveNowreading_ulTag(ulTagID, resetTagID)
	setTimeout("moveNowreadingAuthorHTML(" + resetIndex + ")", 50);
}

function moveNowreading_ulTag(ulTagID, resetTagID) {
	var ulTag = document.getElementById(ulTagID);
	var resetTag = document.getElementById(resetTagID);
	if ( ! ulTag || ! resetTag ) {
		return;
	}
	var left = ulTag.style.left;
	if ( left ) {
		left = left.replace('px', '');
		left--;
		if ( resetTag.offsetLeft + resetTag.offsetWidth + left <= 0 ) {
			left = 0;
		}
	} else {
		left = 0;
	}
	ulTag.style.left = left + 'px';
}

/*
 * ============================================================================ 
 */
