<!--


//
// ニコニコ愛されキャラ選手権ランキング表示用関数
//
// ※IEのみの対応
//


//###############################################################################################
//###############################################################################################
//#
//#  定数
//#


var IsFHalf               = 0;				// 前後半戦フラグ
var TotalPointCount       = 0;				// 総ポイント数
var RecentPointSpeed      = 0;				// 直近分速計数
var ThumbFromNicoVideo    = 0;				// サムネイルをニコニコ動画から取得するか
var BorderlineMode        = 15;				// 足きり基準の算定方法
											// 13 : BorderlineRanking の BorderlinePercent
											// 15 : ΣBorderlineRanking の BorderlinePercent
var BorderlineRanking     = 15;				// 足きりの基準ポイント数のランク
var BorderlinePercent     = 0.00;			// 足きりポイント数算出割合
var BorderlinePointBase   = 0;				// 足きりの基準ポイント数
var BorderlinePoint       = 0;				// 足きりポイント数 (このポイント数以下のキャラは失格)
var BorderlineShowMessage = 0;				// 足きりラインメッセージを表示するか
var BorderlineShowExpect  = 0;				// 足きりラインの予想ポイント数メッセージを表示するか
var LuckyRanking          = 0;				// シード獲得のラッキーランキング
var SimplyDisplay         = 100;				// 簡易表示 (この順位未満)
var SortSpan              = 0;				// データのソート期間
var SortType              = 0;				// データのソート対象
var ViewCate              = 0;				// データの表示キャラ
var ViewFrom              = -1;				// データの表示所属
var ViewType              = 0;				// データの表示方法
var VnoList               = new Array();	// chrdatのキー(動画ID)リスト

var ChrLst                = new Array();	// chrdatのキー(動画ID)リスト
var FavLst;									// お気に入りキャラクタリスト

var ChrNumRankingC        = 0;				// 前回集計できたキャラクタの数
var ChrNumRankingP        = 0;				// 今回集計できたキャラクタの数
var PickUpFlag            = 1;				// 順位上昇キャラクタのピックアップ表示をするか

//+++++ 表示データ +++++//
var SORTSPAN_ALL          = 0;
var SORTSPAN_FH           = 1;
var SORTSPAN_LH           = 2;
var SORTSPAN_RECENT       = 3;

var SORTTYPE_POINT        = 0;
var SORTTYPE_PPM          = 1;

var VIEWCATE_ALL          = 0;
var VIEWCATE_MYLIST       = 1;
var VIEWCATE_SEED         = 2;
var VIEWCATE_NORMAL       = 3;
var VIEWCATE_NEW          = 4;
var VIEWCATE_RETURN       = 5;
var VIEWCATE_FROM         = 6;

var VIEWTYPE_THUMB        = 0;
var VIEWTYPE_SIMPLE       = 1;
var VIEWTYPE_TEXT         = 2;
var VIEWTYPE_GRAPH        = 3;
var VIEWTYPE_FROM         = 4;
var VIEWTYPE_EX1          = 5;



//+++++ データ参照用値 +++++//
var DAT_VNO      = 0;
var DAT_ENTRY    = 1;
var DAT_ETYPE    = 2;
var DAT_FROM     = 3;
var DAT_NAME     = 4;
var DAT_SRVTIME  = 5;
var DAT_CORNUM   = 6;
var DAT_FHCORNUM = 7;
var DAT_MYLIST   = 8;
var DAT_PTST     = 9;
var DAT_PTSF     = 10;
var DAT_PTSL     = 11;
var DAT_PTSC     = 12;
var DAT_PTSP     = 13;
var DAT_SPDT     = 14;
var DAT_SPDF     = 15;
var DAT_SPDL     = 16;
var DAT_SPDC     = 17;
var DAT_FLGT     = 18;
var DAT_FLGP     = 19;



//###############################################################################################
//###############################################################################################
//#
//#  関数
//#


/****************************************************************************
 * Name			:RandomShien												*
 * Description	:ランダムに支援動画を開く関数								*
 * Return value	:															*
 * Argument:																*
 *   trg		:動画を開くウィンドウ名										*
 ****************************************************************************/
function RandomShien(trg)
{
	var t;
	var lnk;

	if(ChrLst.length > 0){
		if(trg == undefined){	t = "_top";		}
		else if(trg == ""){		t = "_top";		}
		else{					t = trg;		}
		lnk = "http://www.nicovideo.jp/watch/" + ChrLst[Math.floor(Math.random()*ChrLst.length)].vno;
		window.open(lnk, t);
	}

	return false;
}



/****************************************************************************
 * Name			:GetThumbURL												*
 * Description	:動画IDからサムネイルURLを取得する関数						*
 * Return value	:															*
 * Argument:																*
 *   vid		:動画ID														*
 ****************************************************************************/
function GetThumbURL(vid)
{
	if(ThumbFromNicoVideo)
		return ("http://tn-skr.smilevideo.jp/smile?i=" + vid.substr(2,vid.length-2));
	return ("./thumb/" + vid + ".jpg");
}



/****************************************************************************
 * Name			:sortfunc_***												*
 * Description	:集計されたランキングデータをソートする関数					*
 * Return value	:															*
 * Argument:																*
 ****************************************************************************/
function sortfunc_PtsTA(a, b){	return (a.ptst-b.ptst);	}		// 合計ポイント数（昇順）
function sortfunc_PtsTD(a, b){	return (b.ptst-a.ptst);	}		// 合計ポイント数（降順）
function sortfunc_PtsPA(a, b){	return (a.ptsp-b.ptsp);	}		// 前回集計ポイント数（昇順）
function sortfunc_PtsPD(a, b){	return (b.ptsp-a.ptsp);	}		// 前回集計ポイント数（降順）



//###############################################################################################
//###############################################################################################
//#
//#  ランキング出力関連関数
//#



/****************************************************************************
 * Name			:InitRankingPage											*
 * Description	:ランキングページの初期化関数								*
 * Return value	:															*
 * Argument:																*
 ****************************************************************************/
function InitRankingPage()
{
	var i, j;
	var vno;
	var v = "";
	var rps_chr = 0;

	//+++++ URL付加データ取得 +++++//
	var argv = ReadParse();
	for(i = 0; i < argv.length; i++){
		if(argv[i].key == "span"){
			     if(argv[i].val == "f")		SortSpan = SORTSPAN_FH;
			else if(argv[i].val == "l")		SortSpan = SORTSPAN_LH;
			else if(argv[i].val == "r")		SortSpan = SORTSPAN_RECENT;
			else							SortSpan = SORTSPAN_ALL;
		}
		else if(argv[i].key == "type"){
			     if(argv[i].val == "v")		SortType = SORTTYPE_PPM;
			else							SortType = SORTTYPE_POINT;
		}
		else if(argv[i].key == "cate"){
			     if(argv[i].val == "m")		ViewCate = VIEWCATE_MYLIST;
			else if(argv[i].val == "s")		ViewCate = VIEWCATE_SEED;
			else if(argv[i].val == "c")		ViewCate = VIEWCATE_NORMAL;
			else if(argv[i].val == "n")		ViewCate = VIEWCATE_NEW;
			else if(argv[i].val == "r")		ViewCate = VIEWCATE_RETURN;
			else if(argv[i].val == "f")		ViewCate = VIEWCATE_FROM;
			else							ViewCate = VIEWCATE_ALL;
		}
		else if(argv[i].key == "from"){
			v = unescape(argv[i].val);
			for(j = 0; j < ViewFromList.length; j++){
				if(v == ViewFromList[j]){
					ViewFrom = j;
					break;
				}
			}
		}
		else if(argv[i].key == "view"){
			     if(argv[i].val == "s")		ViewType = VIEWTYPE_SIMPLE;
			else if(argv[i].val == "t")		ViewType = VIEWTYPE_TEXT;
			else if(argv[i].val == "f")		ViewType = VIEWTYPE_FROM;
			else if(argv[i].val == "g")		ViewType = VIEWTYPE_GRAPH;
			else if(argv[i].val == "e1")	ViewType = VIEWTYPE_EX1;
			else							ViewType = VIEWTYPE_THUMB;
		}
	}
	if(ViewFrom >= 0)
		ViewCate = VIEWCATE_FROM;

	switch(ViewType){
	case VIEWTYPE_FROM:
	case VIEWTYPE_EX1:
		SortSpan = SORTSPAN_ALL;
		SortType = SORTTYPE_POINT;
		ViewCate = VIEWCATE_ALL;
		ViewFrom = -1;
		break;

	case VIEWTYPE_TEXT:
	case VIEWTYPE_GRAPH:
		SortSpan = SORTSPAN_ALL;
		SortType = SORTTYPE_POINT;
		break;
	}
	
	//+++++ キャラクタリストの初期化 +++++//
	InitCharacterList();

	//+++++ 各キャラクタのデータ計算 +++++//
	for(i = 0; i < ChrLst.length; i++){
		//----- データ計算 -----//
		vno = ChrLst[i].vno;
		chrdat[vno].Calc = chrdatCalc;
		chrdat[vno].Calc();

		//----- 前半戦の有無フラグ -----//
		if(chrdat[vno].fhflag)
			IsFHalf = 1;

		//----- 全キャラ合計コメント数 -----//
		TotalPointCount += chrdat[vno].ptst;


		if((chrdat[vno].cdat.sdate == cdate) && (chrdat[vno].ldat.sdate == (cdate-itime))){
			RecentPointSpeed += chrdat[vno].ptsc;
			rps_chr++;
		}
	}

	//+++++ 総ポイント数補正 (念のため) +++++//
	if(TotalPointCount < 0)
		TotalPointCount = 0;

	//+++++ 直近分速合計数算出 +++++//
	if((RecentPointSpeed < 0) || (rps_chr != ChrLst.length))
		RecentPointSpeed = 0;
	else
		RecentPointSpeed = Math.floor(RecentPointSpeed/itime*60);

	//+++++ 足きりライン +++++//
	{
		//----- ポイント数順でソート -----//
		SortCharacterList(DAT_PTST, 0);

		//----- 足きりポイント数算出 -----//
		switch(BorderlineMode){
		case 13:
			if(BorderlineRanking > 0){
				if(ChrLst.length > BorderlineRanking)
					BorderlinePointBase = ChrLst[BorderlineRanking-1].val;
				else
					BorderlinePointBase = ChrLst[ChrLst.length-1].val;
				BorderlinePoint = Math.ceil(BorderlinePointBase * BorderlinePercent);
			}
			else
				BorderlinePoint = 0;
			break;

		case 15:
			if(BorderlineRanking > 0){
				BorderlinePointBase = 0;
				for(i = 0; i < ChrLst.length; i++){
					if(ChrLst[i].rnk > BorderlineRanking)
						break;
					BorderlinePointBase += ChrLst[i].val;
				}
				if(i)
					BorderlinePointBase = Math.ceil(BorderlinePointBase / i);
				else
					BorderlinePointBase = 0;
				BorderlinePoint = Math.ceil(BorderlinePointBase * BorderlinePercent);
			}
			else
				BorderlinePoint = 0;
			break;

		default:
			BorderlinePoint = 0;
			BorderlineShowExpect = 0;
			break;
		}
	}

	//+++++ マイリスト読み込み +++++//
	LoadMyList();

	//+++++ カテゴリが「すべて」以外の場合は全表示 +++++//
	if(ViewCate != VIEWCATE_ALL)
		SimplyDisplay = ChrLst.length;

	//+++++ リンク・スタイル修正 +++++//
	{
		var link_span = "";
		var link_type = "";
		var link_cate = "";
		var link_from = "";
		var link_view = "";

		//----- 期間 -----//
		document.getElementById("sort_type_ppm").className   = "sw_1";
		document.getElementById("sort_type_point").className = "sw_1";
		switch(SortType){
		case SORTTYPE_PPM:	link_type = "&type=v";		break;
		default:			link_type = "";				break;
		}
		if((ViewType != VIEWTYPE_TEXT) &&
		   (ViewType != VIEWTYPE_FROM) &&
		   (ViewType != VIEWTYPE_GRAPH) &&
		   (ViewType != VIEWTYPE_EX1)){
			switch(SortType){
			case SORTTYPE_PPM:	document.getElementById("sort_type_ppm").className   = "sw_0";		break;
			default:			document.getElementById("sort_type_point").className = "sw_0";		break;
			}
		}

		//----- 対象 -----//
		document.getElementById("sort_span_all").className    = "sw_1";
		document.getElementById("sort_span_fh").className     = "sw_1";
		document.getElementById("sort_span_lh").className     = "sw_1";
		document.getElementById("sort_span_recent").className = "sw_1";
		switch(SortSpan){
		case SORTSPAN_FH:		link_span = (IsFHalf?"&span=f":"");		break;
		case SORTSPAN_LH:		link_span = (IsFHalf?"&span=l":"");		break;
		case SORTSPAN_RECENT:	link_span = "&span=r";					break;
		default:				link_span = "";							break;
		}
		if((ViewType != VIEWTYPE_TEXT) &&
		   (ViewType != VIEWTYPE_FROM) &&
		   (ViewType != VIEWTYPE_GRAPH) &&
		   (ViewType != VIEWTYPE_EX1)){
			switch(SortSpan){
			case SORTSPAN_FH:		document.getElementById("sort_span_fh").className     = "sw_0";		break;
			case SORTSPAN_LH:		document.getElementById("sort_span_lh").className     = "sw_0";		break;
			case SORTSPAN_RECENT:	document.getElementById("sort_span_recent").className = "sw_0";		break;
			default:				document.getElementById("sort_span_all").className    = "sw_0";		break;
			}
		}

		//----- 表示 -----//
		document.getElementById("view_type_thumb").className  = "sw_1";
		document.getElementById("view_type_simple").className = "sw_1";
		document.getElementById("view_type_graph").className  = "sw_1";
		document.getElementById("view_type_from").className   = "sw_1";
		document.getElementById("view_type_ex1").className    = "sw_1";
		switch(ViewType){
		case VIEWTYPE_SIMPLE:	link_view = "&view=s";	document.getElementById("view_type_simple").className = "sw_0";		break;
		case VIEWTYPE_FROM:		link_view = "&view=f";	document.getElementById("view_type_from").className   = "sw_0";		break;
		case VIEWTYPE_EX1:		link_view = "&view=e1";	document.getElementById("view_type_ex1").className    = "sw_0";		break;
		case VIEWTYPE_GRAPH:	link_view = "&view=g";	document.getElementById("view_type_graph").className  = "sw_0";		break;
		default:				link_view = "";			document.getElementById("view_type_thumb").className  = "sw_0";		break;
		}

		//----- カテゴリ -----//
		document.getElementById("view_cate_all").className    = "tab_a1";
		document.getElementById("view_cate_mylist").className = "tab_a1";
		document.getElementById("view_cate_seed").className   = "tab_a1";
		document.getElementById("view_cate_normal").className = "tab_a1";
		document.getElementById("view_cate_new").className    = "tab_a1";
		document.getElementById("view_cate_return").className = "tab_a1";
		switch(ViewCate){
		case VIEWCATE_MYLIST:	link_cate = "&cate=m";	document.getElementById("view_cate_mylist").className = "tab_a0";		break;
		case VIEWCATE_SEED:		link_cate = "&cate=s";	document.getElementById("view_cate_seed").className   = "tab_a0";		break;
		case VIEWCATE_NORMAL:	link_cate = "&cate=c";	document.getElementById("view_cate_normal").className = "tab_a0";		break;
		case VIEWCATE_NEW:		link_cate = "&cate=n";	document.getElementById("view_cate_new").className    = "tab_a0";		break;
		case VIEWCATE_RETURN:	link_cate = "&cate=r";	document.getElementById("view_cate_return").className = "tab_a0";		break;
		case VIEWCATE_FROM:		link_cate = "";																					break;
		default:				link_cate = "";			document.getElementById("view_cate_all").className    = "tab_a0";		break;
		}
		//----- 作品名 -----//
		if(ViewFrom >= 0)
			link_from = "&from=" + escape(ViewFromList[ViewFrom]);
		else
			link_from = "";

		str  = "";
		for(i = 0; i < ViewFromList.length; i++)
			str += "<A href='?from=" + escape(ViewFromList[i]) + link_span + link_type + link_cate + link_view + "' " + ((i==ViewFrom)?"class='tab_a0'":"class='tab_a1'") + "><DIV class='tab_L'><DIV class='tab_R'>" + ViewFromList[i] + "</DIV></DIV></A>";
		SetText("ranking_from", str);

		//----- リンク変更 -----//
		document.getElementById("sort_span_all").href    += link_type + link_cate + link_from + (((ViewType==VIEWTYPE_FROM)||(ViewType==VIEWTYPE_GRAPH)||(ViewType==VIEWTYPE_EX1))?"":link_view);
		document.getElementById("sort_span_fh").href     += link_type + link_cate + link_from + (((ViewType==VIEWTYPE_FROM)||(ViewType==VIEWTYPE_GRAPH)||(ViewType==VIEWTYPE_EX1))?"":link_view);
		document.getElementById("sort_span_lh").href     += link_type + link_cate + link_from + (((ViewType==VIEWTYPE_FROM)||(ViewType==VIEWTYPE_GRAPH)||(ViewType==VIEWTYPE_EX1))?"":link_view);
		document.getElementById("sort_span_recent").href += link_type + link_cate + link_from + (((ViewType==VIEWTYPE_FROM)||(ViewType==VIEWTYPE_GRAPH)||(ViewType==VIEWTYPE_EX1))?"":link_view);

		document.getElementById("sort_type_point").href  += link_span + link_cate + link_from + (((ViewType==VIEWTYPE_FROM)||(ViewType==VIEWTYPE_GRAPH)||(ViewType==VIEWTYPE_EX1))?"":link_view);
		document.getElementById("sort_type_ppm").href    += link_span + link_cate + link_from + (((ViewType==VIEWTYPE_FROM)||(ViewType==VIEWTYPE_GRAPH)||(ViewType==VIEWTYPE_EX1))?"":link_view);

		document.getElementById("view_cate_all").href    += link_span + link_type + link_view;
		document.getElementById("view_cate_mylist").href += link_span + link_type + link_view;
		document.getElementById("view_cate_seed").href   += link_span + link_type + link_view;
		document.getElementById("view_cate_normal").href += link_span + link_type + link_view;
		document.getElementById("view_cate_new").href    += link_span + link_type + link_view;
		document.getElementById("view_cate_return").href += link_span + link_type + link_view;

		document.getElementById("view_type_thumb").href  += link_type + link_span + link_cate + link_from;
		document.getElementById("view_type_simple").href += link_type + link_span + link_cate + link_from;
		document.getElementById("view_type_graph").href  += link_type + link_span + link_cate + link_from;
		document.getElementById("view_type_from").href   += link_type + link_span + link_cate + link_from;
		document.getElementById("view_type_ex1").href    += link_type + link_span + link_cate + link_from;
	}

	//+++++ 期間のリンクを削る +++++//
	if(!IsFHalf){
		SetText("txt_sort_span_fh", "");
		SetText("txt_sort_span_lh", "");
	}

	//+++++ 確定キャラ数 +++++//
	ChrNumRankingC = 0;
	ChrNumRankingP = 0;
	for(i = 0; i < ChrLst.length; i++){
		if(chrdat[ChrLst[i].vno].flgt) ChrNumRankingC++;
		if(chrdat[ChrLst[i].vno].flgp) ChrNumRankingP++;
	}
	if((ChrLst.length > ChrNumRankingC+2) || (ChrLst.length > ChrNumRankingP+2))
		PickUpFlag = 0;
	if((cdate <= (sdate+itime)) || (edate <= cdate))
		PickUpFlag = 0;
	if((SortSpan != SORTSPAN_ALL) || (SortType != SORTTYPE_POINT))
		PickUpFlag = 0;

	//+++++ 前回集計ポイントランキング算出 +++++//
	if(PickUpFlag){
		SortCharacterList(DAT_PTSP, 0);
		for(i = 0; i < ChrLst.length; i++)
			ChrLst[i].rnkp = ChrLst[i].rnk;
	}
	else{
		for(i = 0; i < ChrLst.length; i++)
			ChrLst[i].rnkp = 0;
	}
}



/****************************************************************************
 * Name			:PrintRanking												*
 * Description	:ランキングを表示・出力する関数								*
 * Return value	:															*
 * Argument:																*
 ****************************************************************************/
function PrintRanking()
{
	var i, j;
	var str = "";
	var str2 = "";
	var vno;
	var rnk;

	//+++++ ランキングメイン部分 +++++//
	switch(ViewType){
	case VIEWTYPE_SIMPLE:		PrintRankingSimple();	break;
	case VIEWTYPE_TEXT:			PrintRankingText();		break;
	case VIEWTYPE_GRAPH:		PrintRankingGraph();	break;
	case VIEWTYPE_FROM:			PrintRankingFrom();		break;
	case VIEWTYPE_EX1:			PrintRankingKouhaku();	break;
	case VIEWTYPE_THUMB:
	default:					PrintRankingThumb();	break;
	}

	//+++++ タイトル +++++//
	SetText("ranking_title", title);

	//+++++ 期間 +++++//
	str  = "";
	if(fhsdate && fhedate)
		str += "前半：" + Date2String(fhsdate*1000, "YYYY年M月D日 h時") + " 〜 " + Date2String(fhedate*1000, "YYYY年M月D日 h時") + "<BR>後半：";
	str += Date2String(sdate*1000, "YYYY年M月D日 h時") + " 〜 " + Date2String(edate*1000, "YYYY年M月D日 h時");
	SetText("ranking_term", str);

	//+++++ 集計時刻 +++++//
	str  = "<STRONG style='font-size:16px; font-weight:bold; color:#C33; text-decoration:underline;'>" + Date2String(cdate*1000, "YYYY年M月D日 h時m分") + "</STRONG>　のデータです ( " + Math.floor(itime/60) + "分間隔更新 )。";
//	str += "<SPAN style='color:#AAA;'>全" + ChrLst.length + "キャラ中、今回" + ChrNumRankingC + "キャラ確定、前回" + ChrNumRankingP + "キャラ確定</SPAN>";
	SetText("ranking_date", str);

	//+++++ 足きり +++++//
	str = "";
	if(rdate >= edate)
		BorderlineShowExpect = 0;

	if(BorderlineShowMessage && (BorderlinePoint > 0)){
		if(BorderlineShowExpect)
			str += "─ 足切ライン ─<BR>現在： ";
		else
			str += "足切ライン： ";

		switch(BorderlineMode){
		case 13:
			str += "第 " + BorderlineRanking + " 位ポイント " + itoad(BorderlinePointBase);
			str += " × " + Math.floor(BorderlinePercent*100) + "％";
			str += " ＝ <SPAN style='color:#F00; font-weight:bold;'>" + itoad(BorderlinePoint) + "</SPAN> ポイント未満";
			break;

		case 15:
			str += "第 " + BorderlineRanking + " 位までのポイント平均 " + itoad(BorderlinePointBase);
			str += " × " + Math.floor(BorderlinePercent*100) + "％";
			str += " ＝ <SPAN style='color:#F00; font-weight:bold;'>" + itoad(BorderlinePoint) + "</SPAN> ポイント未満";
			break;
		}

		if(BorderlineShowExpect){
			var ct = Math.floor((cdate-sdate)/60);
			var ft = Math.floor((edate-sdate)/60);
			if(IsFHalf){
				ct += Math.floor((fhedate-fhsdate)/60);
				ft += Math.floor((fhedate-fhsdate)/60);
			}
			str += "<BR>予想： ";
			str += itoad(BorderlinePoint);
			str += " × " + itoad(ft) + "/"  + itoad(ct) + "分";
			str += " ＝ <SPAN style='color:#F00; font-weight:bold;'>" + itoad(Math.floor(BorderlinePoint*ft/ct)) + "</SPAN> ポイント未満";
		}
	}
	SetText("ranking_border", str);

	//+++++ 参戦キャラクタ数 +++++//
	SetText("sumchr", itoad(ChrLst.length)+"キャラ");

	//+++++ 総コメント数 +++++//
	SetText("sumcmt", itoad(TotalPointCount)+" pts.");
	if(RecentPointSpeed)
		SetText("sumspd", itoad(RecentPointSpeed)+" p/min");

	//+++++ ラッキー順位キャラの広告 +++++//
	str = "";
	for(i = 0; i < LuckyCMRanking.length; i++){
		rnk  = LuckyCMRanking[i].rnk;
		str2 = ((LuckyCMRanking[i].str == undefined) ? "" : " ("+LuckyCMRanking[i].str+")");

		switch(rnk){
		case -1:	rnk = ChrLst.length - 1;					break;
		case -2:	rnk = Math.floor((ChrLst.length+1) / 2);	break;
		}

		if((rnk < 0) || (ChrLst.length <= (rnk-1)))
			continue;

		for(j = rnk-1; j < ChrLst.length; j++){
			if(ChrLst[j].rnk != rnk)
				break;
			vno = ChrLst[j].vno;			

			switch(LuckyCMRanking[i].style){
			case 1:		str += "<DIV class='thumb_frm_rank_1' style='width:312px; margin-bottom:4px;'>";	break;
			case 2:		str += "<DIV class='thumb_frm_rank_2' style='width:312px; margin-bottom:4px;'>";	break;
			default:	str += "<DIV class='thumb_frm'        style='width:312px; margin-bottom:4px;'>";	break;
			}
			str += "<TABLE border='0' cellpadding='0' cellspacing='0'>";
			str += "<TR>";
			str += "<TD valign='top'>";
			str += "<A href='http://www.nicovideo.jp/watch/" + vno + "' target='_blank'>";
			str += "<IMG alt='" + chrdat[vno].name + "' src='" + GetThumbURL(vno) + "' width='80' height='60' style='border:solid 2px #333;'>";
			str += "</A>";
			str += "</TD>";
			str += "<TD width='100%' style='padding-left:4px;'>";
			str += "<P class='TXT12' style='line-height:26px;'><STRONG style='color:#355;'><SPAN style='font-size:24px;'>" + rnk + "</SPAN>位</STRONG>" + str2 + "</P>";
			str += "<P class='TXT12'><A href='http://www.nicovideo.jp/watch/" + vno + "' target='_blank' class='video'>" + chrdat[vno].name + "</A></P>";
			str += "<P class='TXT12'>" + chrdat[vno].from + "</P>";
			str += "</TD>";
			str += "</TR>";
			str += "</TABLE>";
			str += "</DIV>";
		}
	}
	if(str != "")
		SetText("ranking_lucky", str);


	//+++++ 順位上昇中キャラの広告 +++++//
	for(i = 0; i < ChrLst.length; i++)
		ChrLst[i].val = ((ChrLst[i].rnkp <= 0) ? -9999 : (ChrLst[i].rnkp - ChrLst[i].rnk));
	ChrLst.sort(SortCharacterListFuncID);

	str = "";
	str += "<TABLE width='312' border='0' cellpadding='0' cellspacing='4'>";
	for(i = 0; i < ChrLst.length; i++){
		if(ChrLst[i].val <= 0)
			break;

		vno = ChrLst[i].vno;

		str += "<TR>";
		str += "<TD>";
		if(ChrLst[i].val >= 4)
			str += "<DIV class='thumb_frm_rank_2' style='width:60px; padding:2px;'>";
		else if(ChrLst[i].val >= 1)
			str += "<DIV class='thumb_frm_rank_1' style='width:60px; padding:2px;'>";
		else
			str += "<DIV class='thumb_frm' style='width:60px; padding:2px;'>";
		str += "<A href='http://www.nicovideo.jp/watch/" + vno + "' target='_blank'>";
		str += "<IMG alt='" + chrdat[vno].name + "' src='" + GetThumbURL(vno) + "' width='48' height='36' style='border:solid 2px #333;'>";
		str += "</A>";
		str += "</DIV>";
		str += "</TD>";
		str += "<TD width='100%'>";
		str += "<P class='TXT12'>";
		str += "<STRONG> ＋" + ChrLst[i].val + "位( " + ChrLst[i].rnkp + " → " + ChrLst[i].rnk + " )</STRONG><BR>";
		str += "<A href='http://www.nicovideo.jp/watch/" + vno + "' target='_blank' class='video'>" + chrdat[vno].name + "</A>";
		str += "</P>";
		str += "</TD>";
		str += "</TR>";
		str += "<TR><TD colspan='2' class='dot_1'><IMG src='./image/1.gif' alt='' width='1' height='1'></TD></TR>";
	}
	if(i == 0)
		str += "<TR><TD><P class='TXT12'>抽出できませんでした。別の期間、対象、表示を試すか次回集計まで待ってみるです。。。</P></TD></TR>";
	str += "</TABLE>";

	SetText("ranking_ksk", str);
}



/****************************************************************************
 * Name			:PrintRankingSimple											*
 * Description	:ランキングをテキスト(簡易表示)で表示する関数				*
 * Return value	:															*
 * Argument:																*
 ****************************************************************************/
function PrintRankingSimple()
{
	var tmp = SimplyDisplay;
	SimplyDisplay = 0;
	PrintRankingThumb();
	SimplyDisplay = tmp;
}



/****************************************************************************
 * Name			:PrintRankingThumb											*
 * Description	:ランキングをサムネイルで表示する関数						*
 * Return value	:															*
 * Argument:																*
 ****************************************************************************/
function PrintRankingThumb()
{
	var i;
	var exist_flag = 0;
	var rnkold = 0;
	var str = "";

	//+++++ ソート +++++//
	switch(SortType){
	case SORTTYPE_PPM:
		switch(SortSpan){
		case SORTSPAN_FH:		SortCharacterList(DAT_SPDF, 0);		break;
		case SORTSPAN_LH:		SortCharacterList(DAT_SPDL, 0);		break;
		case SORTSPAN_RECENT:	SortCharacterList(DAT_SPDC, 0);		break;
		default:				SortCharacterList(DAT_SPDT, 0);		break;
		}
		break;

	default:
		switch(SortSpan){
		case SORTSPAN_FH:		SortCharacterList(DAT_PTSF, 0);		break;
		case SORTSPAN_LH:		SortCharacterList(DAT_PTSL, 0);		break;
		case SORTSPAN_RECENT:	SortCharacterList(DAT_PTSC, 0);		break;
		default:				SortCharacterList(DAT_PTST, 0);		break;
		}
	}

	//+++++ 詳細表示 +++++//
	for(i = 0; i < ChrLst.length; i++){
		v = ChrLst[i].vno;

		if((ViewCate == VIEWCATE_MYLIST) && (!chrdat[v].mylist))
			continue;
		if((ViewCate == VIEWCATE_SEED)   && (chrdat[v].etype != 1))
			continue;
		if((ViewCate == VIEWCATE_NORMAL) && (chrdat[v].etype != 2))
			continue;
		if((ViewCate == VIEWCATE_NEW)    && (chrdat[v].etype != 3))
			continue;
		if((ViewCate == VIEWCATE_RETURN) && (chrdat[v].etype != 4))
			continue;

		if(ViewFrom >= 0){
			if(chrdat[v].from.indexOf(ViewFromList[ViewFrom]) == -1)
				continue;
		}

		exist_flag = 1;

		if(ChrLst[i].rnk <= SimplyDisplay){
			str += chrdat[v].Print(ChrLst[i].rnk, rnkold, ChrLst[i].dif, ChrLst[i].rnkp);
			rnkold = ChrLst[i].rnk;
		}
		else
			break;
	}

	//+++++ 簡易表示 +++++//
	for(; i < ChrLst.length; i++){
		v = ChrLst[i].vno;

		if((ViewCate == VIEWCATE_MYLIST) && (!chrdat[v].mylist))
			continue;
		if((ViewCate == VIEWCATE_SEED)   && (chrdat[v].etype != 1))
			continue;
		if((ViewCate == VIEWCATE_NORMAL) && (chrdat[v].etype != 2))
			continue;
		if((ViewCate == VIEWCATE_NEW)    && (chrdat[v].etype != 3))
			continue;
		if((ViewCate == VIEWCATE_RETURN) && (chrdat[v].etype != 4))
			continue;

		if(ViewFrom >= 0){
			if(chrdat[v].from.indexOf(ViewFromList[ViewFrom]) == -1)
				continue;
		}

		exist_flag = 1;

		str += chrdat[v].PrintSimple(ChrLst[i].rnk, rnkold, ChrLst[i].dif, ChrLst[i].rnkp);
		rnkold = ChrLst[i].rnk;
	}

	//+++++ エラー表示 +++++//
	if(exist_flag == 0)
		str += PrintRankingError();

	SetText("rnkmain", str);
}



/****************************************************************************
 * Name			:PrintRankingText											*
 * Description	:ランキングをテキストで表示する関数							*
 * Return value	:															*
 * Argument:																*
 ****************************************************************************/
function PrintRankingText()
{
	var i;
	var v;
	var exist_flag = 0;
	var str = "";
	var rnk;
	var maskflag;

	//+++++ ソート +++++//
	SortCharacterList(DAT_PTST, 0);

	//+++++ 出力 +++++//
	str += "<TABLE width='664' border='0' cellspacing='0' cellpadding='4' summary='結果' class='mb16auto'>";
	str += "<TR><TD class='TXT12'>";
	for(rnkold = 0, i = 0; i < ChrLst.length; i++){
		v = ChrLst[i].vno;

		if((ViewCate == VIEWCATE_MYLIST) && (!chrdat[v].mylist))
			continue;
		if((ViewCate == VIEWCATE_SEED)   && (chrdat[v].etype != 1))
			continue;
		if((ViewCate == VIEWCATE_NORMAL) && (chrdat[v].etype != 2))
			continue;
		if((ViewCate == VIEWCATE_NEW)    && (chrdat[v].etype != 3))
			continue;
		if((ViewCate == VIEWCATE_RETURN) && (chrdat[v].etype != 4))
			continue;

		if(ViewFrom >= 0){
			if(chrdat[v].from.indexOf(ViewFromList[ViewFrom]) == -1)
				continue;
		}

		exist_flag = 1;

		//----- マスク設定 -----//
		if(maskmode){
			maskflag = 0;
			for(i = 0; i < msklst.length; i++){
				if(rnk == msklst[i]){
					maskflag = 1;
					break;
				}
			}
			if(!maskflag){
				for(i = 0; i < msklst_id.length; i++){
					if(this.vno == msklst_id[i]){
						maskflag = 1;
						break;
					}
				}
			}
			if(((maskmode > 0) && maskflag) || ((maskmode < 0) && !maskflag))
				maskflag = 0;
			else
				maskflag = 1;
		}
		else
			maskflag = 0;

		//----- 出力文字列作成 -----//
		str += ((ChrLst[i].rnk!=rnkold)?ChrLst[i].rnk:"〃") + "&nbsp;&nbsp;&nbsp;";

		if(chrdat[v].srvtime < chrdat[v].edat.sdate)
			flag = (chrdat[v].fhflag ? (chrdat[v].fhsdat.flag && chrdat[v].sdat.flag) : chrdat[v].sdat.flag);
		else
			flag = (chrdat[v].fhflag ? (chrdat[v].fhsdat.flag && chrdat[v].fhedat.flag && chrdat[v].sdat.flag && chrdat[v].edat.flag) : (chrdat[v].sdat.flag && chrdat[v].edat.flag));
		str += itoad(chrdat[v].ptst);
		if(!flag)
			str += "?";

		str += "&nbsp;&nbsp;&nbsp;"

		flag = (chrdat[v].cdat.flag && chrdat[v].ldat.flag);
		str += "(" + itoad(chrdat[v].spdc);
		if(!flag)
			str += "?";
		str += ")";
		str += "&nbsp;&nbsp;&nbsp;"

		if(!maskflag)
			str += chrdat[v].name;
		else
			str += "?????";

		str += "<BR>";

		rnkold = ChrLst[i].rnk;
	}

	//+++++ エラー表示 +++++//
	if(exist_flag == 0)
		str += PrintRankingError();
	else
		str += "</TD></TR>";

	str += "</TABLE>";

	SetText("rnkmain", str);
}



/****************************************************************************
 * Name			:PrintRankingFrom											*
 * Description	:ランキングを陣作品単位(簡易表示)で表示する関数				*
 * Return value	:															*
 * Argument:																*
 ****************************************************************************/
function PrintRankingFrom()
{
	var i, j;
	var vno;
	var str = "";
	var rnk;
	var datcur;
	var datold;
	var rnkold;
	var exist_flag = 0;
	var rnkfrm = new Array(ViewFromList.length);

	//+++++ データセット +++++//
	for(i = 0; i < ViewFromList.length; i++){
		rnkfrm[i]        = new Object();
		rnkfrm[i].from   = ViewFromList[i];
		rnkfrm[i].chrnum = 0;
		rnkfrm[i].spdc   = 0;
		rnkfrm[i].ptst   = 0;
		rnkfrm[i].rnk    = 0;
		rnkfrm[i].dif    = 0;
	}
	for(i = 0; i < ChrLst.length; i++){
		vno = ChrLst[i].vno;

		for(j = 0; j < rnkfrm.length; j++){
			if(chrdat[vno].from.indexOf(rnkfrm[j].from) != -1){
				rnkfrm[j].chrnum += 1;
				rnkfrm[j].spdc   += chrdat[vno].spdc;
				rnkfrm[j].ptst   += chrdat[vno].ptst;
				break;
			}
		}
	}

	//+++++ ソート +++++//
	rnkfrm.sort(sortfunc_PtsTD);

	//+++++ ランキング +++++//
	rnkfrm[0].rnk = 1;
	rnkfrm[0].dff = 0;
	datold = rnkfrm[0].ptst;
	for(rnk = 1, i = 1; i < rnkfrm.length; i++){
		datcur = rnkfrm[i].ptst;
		if(datcur == datold){
			rnkfrm[i].rnk = rnkfrm[i-1].rnk;
			rnkfrm[i].dif = rnkfrm[i-1].dff;
		}
		else{
			rnkfrm[i].rnk = i + 1;
			rnkfrm[i].dif = datcur - datold;
		}
		datold = datcur;
	}

	str = "<TABLE width='664' border='0' cellspacing='0' cellpadding='4' summary='結果' class='mb16auto'>";
	for(i = 0; i < rnkfrm.length; i++){
		if(rnkfrm[i].chrnum == 0)
			continue;

		if(exist_flag == 0){
			str += "<TR valign='bottom'>";
			str += "<TD nowrap class='rank_nums' style='width:35px;'>&nbsp;</TD>";
			str += "<TD nowrap class='TXT12' style='font-weight:bold; text-align:right'>&nbsp;合計ﾎﾟｲﾝﾄ</TD>";
			str += "<TD nowrap class='TXT12' style='font-weight:bold; text-align:right'>&nbsp;ﾎﾟｲﾝﾄ差</TD>";
			str += "<TD nowrap class='TXT12' style='font-weight:bold; text-align:right'>&nbsp;平均ﾎﾟｲﾝﾄ</TD>";
			str += "<TD nowrap class='TXT12' style='font-weight:bold; text-align:right'>&nbsp;直近分速計</TD>";
			str += "<TD nowrap class='TXT12' style='font-weight:bold; text-align:right'>&nbsp;ｷｬﾗ数</TD>";
			str += "<TD nowrap class='TXT12'>&nbsp;</TD>";
			str += "</TR>";
			str += "<TR><TD colspan='7'>";
			str += "<DIV class='dot_1'><IMG src='./image/1.gif' alt='' width='1' height='1'></DIV>";
			str += "</TD></TR>";
		}
		exist_flag = 1;

		str += "<TR valign='bottom'>";
		str += "<TD class='rank_nums' nowrap style='width:50px;'>";
		str += "<P style='font-size:32px; line-height:28px; letter-spacing:-3px;'>" + ((rnkfrm[i].rnk!=rnkold)?rnkfrm[i].rnk:"〃") + "&nbsp;</P>";
		str += "</TD>";

		str += "<TD nowrap style='width:70px; text-align:right; font-weight:bold;'>";
		str += "<P class='TXT12' style='color:#666;'>" + itoad(rnkfrm[i].ptst) + "</P>";
		str += "</TD>";
		str += "<TD nowrap style='width:70px; text-align:right;'>";
		str += "<P class='TXT12' style='color:#AAA;'>";
		if(i)
			str += itoad(rnkfrm[i].dif);
		else
			str += "&nbsp;";
		str += "&nbsp;</P>";
		str += "</TD>";
		str += "<TD nowrap style='width:70px; text-align:right; font-weight:bold;'>";
		str += "<P class='TXT12' style='color:#666;'>" + itoad(Math.floor(rnkfrm[i].ptst/rnkfrm[i].chrnum)) + "</P>";
		str += "</TD>";

		str += "<TD nowrap style='width:70px; text-align:right;'>";
		str += "<P class='TXT12' style='color:#666;'>" + itoad(rnkfrm[i].spdc) + "&nbsp;</P>";
		str += "</TD>";

		str += "<TD nowrap style='width:50px; text-align:right;'>";
		str += "<P class='TXT12' style='color:#666;'>" + itoad(rnkfrm[i].chrnum) + " ｷｬﾗ&nbsp;</P>";
		str += "</TD>";

		str += "<TD style='padding:4px 4px 0px 4px;' valign='bottom'>";
		str += "<P class='TXT12' style='line-height:24px;'>";
		str += "<A href='./ranking.shtml?from=" + escape(rnkfrm[i].from) + "' class='video'><SPAN style='font-size:18px;'>" + rnkfrm[i].from + "</SPAN></A>";
		str += "</P>";
		str += "</TD>";

		str += "</TR>";
		str += "<TR><TD colspan='7'>";
		str += "<DIV class='dot_1'><IMG src='./image/1.gif' alt='' width='1' height='1'></DIV>";
		str += "</TD></TR>";

		rnkold = rnkfrm[i].rnk;
	}

	//+++++ エラー表示 +++++//
	if(exist_flag == 0)
		str += PrintRankingError();

	str += "</TABLE>";

	SetText("rnkmain", str);
}



/****************************************************************************
 * Name			:PrintRankingGraph											*
 * Description	:ランキングをグラフで表示する関数							*
 * Return value	:															*
 * Argument:																*
 ****************************************************************************/
function PrintRankingGraph()
{
	var i;
	var v;
	var row;
	var imin, imax;
	var exist_flag = 0;
	var str = "";
	var rnk;
	var maskflag;

	var dx;
	var ptsmaxt = 0;
	var ptsxmax = 0;
	var spdmaxc = 0;
	var spdxmax = 0;

	//+++++ ポイント数、直近分速最大値の算出 +++++//
	for(i = 0; i < ChrLst.length; i++){
		v = ChrLst[i].vno;

		if(chrdat[v].entry){
			if(chrdat[v].ptst > ptsmaxt)		ptsmaxt = chrdat[v].ptst;
			if(chrdat[v].spdc > spdmaxc)		spdmaxc = chrdat[v].spdc;
		}
	}

	//+++++ グラフ横軸最大値算出 +++++//
	if(ptsmaxt){
		dx = Math.floor(Math.LOG10E*Math.log(ptsmaxt));
		dx = Math.pow(10, dx);
		while(ptsxmax < ptsmaxt)
			ptsxmax += dx;
	}
	if(spdmaxc){
		dx = Math.floor(Math.LOG10E*Math.log(spdmaxc));
		dx = Math.pow(10, dx);
		while(spdxmax < spdmaxc)
			spdxmax += dx;
	}

	//+++++ ソート +++++//
	SortCharacterList(DAT_PTST, 0);

	//+++++ 出力 +++++//
	str += "<TABLE width='664' border='0' cellspacing='0' cellpadding='4' summary='結果' class='mb16auto'>";
	for(rnkold = 0, i = 0, row = 0; i < ChrLst.length; i++){
		v = ChrLst[i].vno;

		if((ViewCate == VIEWCATE_MYLIST) && (!chrdat[v].mylist))
			continue;
		if((ViewCate == VIEWCATE_SEED)   && (chrdat[v].etype != 1))
			continue;
		if((ViewCate == VIEWCATE_NORMAL) && (chrdat[v].etype != 2))
			continue;
		if((ViewCate == VIEWCATE_NEW)    && (chrdat[v].etype != 3))
			continue;
		if((ViewCate == VIEWCATE_RETURN) && (chrdat[v].etype != 4))
			continue;

		if(ViewFrom >= 0){
			if(chrdat[v].from.indexOf(ViewFromList[ViewFrom]) == -1)
				continue;
		}

		if(exist_flag == 0){
			str += "<TR valign='bottom'>";
			str += "<TD nowrap class='rank_nums' style='width:35px;'>&nbsp;</TD>";
			str += "<TD nowrap class='rank_nums' style='width:15px;'>&nbsp;</TD>";
			str += "<TD nowrap class='TXT12'>&nbsp;</TD>";
			str += "<TD nowrap class='TXT12' style='width:320px; text-align:left; font-weight:bold; padding-left:0px;'>&nbsp;合計ポイント (pts.)</TD>";
			str += "<TD nowrap class='TXT12' style='width:120px; text-align:left; font-weight:bold; padding-left:0px;'>&nbsp;直近分速 (p/min)</TD>";
			str += "</TR>";
		}

		exist_flag = 1;
		row++;

		//----- マスク設定 -----//
		if(maskmode){
			maskflag = 0;
			for(i = 0; i < msklst.length; i++){
				if(rnk == msklst[i]){
					maskflag = 1;
					break;
				}
			}
			if(!maskflag){
				for(i = 0; i < msklst_id.length; i++){
					if(this.vno == msklst_id[i]){
						maskflag = 1;
						break;
					}
				}
			}
			if(((maskmode > 0) && maskflag) || ((maskmode < 0) && !maskflag))
				maskflag = 0;
			else
				maskflag = 1;
		}
		else
			maskflag = 0;

		//----- 出力文字列作成 -----//
		str += "<TR valign='bottom' style='background-color:";
		if(chrdat[v].srvtime < cdate)
			str += ((Math.floor((row+4)/5)%2) ? "#FFC" : "#F7F7B7");
		else
			str += ((Math.floor((row+4)/5)%2) ? "#FFF" : "#F7F7F7");
		str += ";'>";
		str += "<TD class='rank_nums' nowrap style='width:35px; "+ (((ChrLst[i].rnk!=LuckyRanking)&&(chrdat[v].ptst<BorderlinePoint))?"color:#FCC;":"") + "'>";
		str += "<P>" + ((ChrLst[i].rnk!=rnkold)?ChrLst[i].rnk:"〃") + "&nbsp;</P>";
		str += "</TD>";

		str += "<TD class='rank_stat' nowrap style='width:15px;'>";
		if(PickUpFlag){
			var rnkup = ChrLst[i].rnkp - ChrLst[i].rnk;
			if(rnkup >= 4)			str += "<IMG src='./image/ranking/arrow_8.gif'>";
			else if(rnkup > 0)		str += "<IMG src='./image/ranking/arrow_9.gif'>";
			else if(rnkup <= -4)	str += "<IMG src='./image/ranking/arrow_2.gif'>";
			else if(rnkup < 0)		str += "<IMG src='./image/ranking/arrow_3.gif'>";
			else					str += "&nbsp;";
		}
		else
			str += "&nbsp;";
		str += "</TD>";

		if(!maskflag)
			str += "<TD><P class='TXT12' nowrap><A href='http://www.nicovideo.jp/watch/" + chrdat[v].vno + "' target='_blank' class='video'>" + chrdat[v].name + "</A></P></TD>";
		else
			str += "<TD><P class='TXT12' nowrap><IMG src='./image/ranking/secret_from_s.gif'></P></TD>";

		str += "<TD nowrap style='width:320px; text-align:left; font-weight:bold; padding-left:0px; border-left:solid 1px #CCC;'>";
		var wp = Math.floor(chrdat[v].ptst/ptsxmax*310);
		if(wp >= 70)
			str += "<P nowrap class='TXT12' style='color:#FFF; background:#FFF url(\"./image/ranking/graph_bar.gif\") repeat-x; width:" + wp + "px; height:16px; overflow:hidden;'>";
		else{
			str += "<P nowrap class='TXT12' style='height:16px;'>";
			str += "<SPAN style='display:inline-block; background:#FFF url(\"./image/ranking/graph_bar.gif\") repeat-x; width:" + wp + "px;'>&nbsp;</SPAN>";
		}
		str += "&nbsp;"
		if(chrdat[v].srvtime < chrdat[v].edat.sdate){
			flag = (chrdat[v].fhflag ? (chrdat[v].fhsdat.flag && chrdat[v].sdat.flag) : chrdat[v].sdat.flag);
			if(flag)
				str += itoad(chrdat[v].ptst);
			else
				str += "<SPAN style='color:#AAA; font-weight:normal;'>(" + itoad(chrdat[v].ptst) + ")</SPAN>";
		}
		else{
			flag = (chrdat[v].fhflag ? (chrdat[v].fhsdat.flag && chrdat[v].fhedat.flag && chrdat[v].sdat.flag && chrdat[v].edat.flag) : (chrdat[v].sdat.flag && chrdat[v].edat.flag));
			if(flag)
				str += "<SPAN style='color:#F90;'>★</SPAN>&nbsp;" +itoad(chrdat[v].ptst);
			else
				str += "<SPAN style='color:#AAA; font-weight:normal;'>(" + itoad(chrdat[v].ptst) + ")</SPAN>";
		}
		str += "</P>";
		str += "</TD>";

		str += "<TD nowrap style='width:110px; text-align:left; font-weight:bold; padding-left:0px; border-left:solid 1px #CCC;'>";
		var ws = Math.floor(chrdat[v].spdc/spdxmax*100);
		if(ws >= 40)
			str += "<P nowrap class='TXT12' style='color:#FFF; background:#FFF url(\"./image/ranking/graph_bar.gif\") repeat-x; width:" + ws + "px; height:16px; overflow:hidden;'>";
		else{
			str += "<P nowrap class='TXT12' style='height:16px;'>";
			str += "<SPAN style='display:inline-block; background:#FFF url(\"./image/ranking/graph_bar.gif\") repeat-x; width:" + ws + "px;'>&nbsp;</SPAN>";
		}
		str += "&nbsp;"
		flag = (chrdat[v].cdat.flag && chrdat[v].ldat.flag);
		if(flag)
			str += itoad(chrdat[v].spdc);
		else
			str += "<SPAN style='color:#AAA; font-weight:normal;'>(" + itoad(chrdat[v].spdc) + ")</SPAN>";
		str += "</P>";
		str += "</TD>";
		str += "</TR>";

		rnkold = ChrLst[i].rnk;
	}

	//+++++ エラー表示 +++++//
	if(exist_flag == 0)
		str += PrintRankingError();

	str += "</TABLE>";

	SetText("rnkmain", str);
}


/****************************************************************************
 * Name			:PrintRankingKouhaku										*
 * Description	:ランキングを紅白グループで表示する関数						*
 *				 chrdat[].param==1 : 紅組									*
 *				 chrdat[].param==2 : 白組									*
 * Return value	:															*
 * Argument:																*
 ****************************************************************************/
function PrintRankingKouhaku()
{
	var str;
	str = "<TABLE width='664' border='0' cellspacing='0' cellpadding='4' summary='結果' class='mb16auto'>";
	str += PrintRankingError();
	str += "</TABLE>";
	SetText("rnkmain", str);
	return;

	var i, j;
	var vno;
	var str = "";
	var r_ptst   = 0;
	var r_chrnum = 0;
	var r_chrstr = "";
	var w_ptst   = 0;
	var w_chrnum = 0;
	var w_chrstr = "";

	//+++++ ポイント数順でソート +++++//
	SortCharacterList(DAT_PTST, 0);

	//+++++ データ整理 +++++//
	r_chrstr = "<TABLE width='320' border='0' cellspacing='0' cellpadding='4' style='border:dashed 1px #CCC;'>";
	w_chrstr = "<TABLE width='320' border='0' cellspacing='0' cellpadding='4' style='border:dashed 1px #CCC;'>";
	for(i = 0; i < ChrLst.length; i++){
		vno = ChrLst[i].vno;

		if(chrdat[vno].param == 1){
			r_ptst += chrdat[vno].ptst;
			r_chrnum++;
			r_chrstr += "<TR>";
			r_chrstr += "<TD class='TXT12' style='text-align:right; width:25px;'>" + r_chrnum + "&nbsp;</TD>";
			r_chrstr += "<TD class='TXT12' style='text-align:right; width:80px;'>" + itoad(chrdat[vno].ptst) + " pts.</TD>";
			r_chrstr += "<TD class='TXT14' style='text-align:left;'><A href='http://www.nicovideo.jp/watch/" + vno + "' target='_blank' class='video'>" + chrdat[vno].name + "</TD>";
			r_chrstr += "</TR>";
		}
		else if(chrdat[vno].param == 2){
			w_ptst += chrdat[vno].ptst;
			w_chrnum++;
			w_chrstr += "<TR>";
			w_chrstr += "<TD class='TXT12' style='text-align:right; width:25px;'>" + w_chrnum + "&nbsp;</TD>";
			w_chrstr += "<TD class='TXT12' style='text-align:right; width:80px;'>" + itoad(chrdat[vno].ptst) + " pts.</TD>";
			w_chrstr += "<TD class='TXT14' style='text-align:left;'><A href='http://www.nicovideo.jp/watch/" + vno + "' target='_blank' class='video'>" + chrdat[vno].name + "</TD>";
			w_chrstr += "</TR>";
		}
	}

	r_chrstr += "<TR><TD>&nbsp;</TD><TD>&nbsp;</TD><TD class='TXT12' style='text-align:left; color:#AAA;'>（計 " + r_chrnum + " キャラ）</TD></TABLE>";
	w_chrstr += "<TR><TD>&nbsp;</TD><TD>&nbsp;</TD><TD class='TXT12' style='text-align:left; color:#AAA;'>（計 " + w_chrnum + " キャラ）</TD></TABLE>";

	//+++++ 出力 +++++//
	str += "<BR>";
	str += "<TABLE border='0' cellspacing='0' cellpadding='4' summary='結果' class='mb16auto' style='text-align:center;'>";
	str += "<TR>";
	str += "<TD style='width:320px;'><IMG src='./image/ranking/kouhaku_r.gif' alt='紅'></TD>";
	str += "<TD style='width:320px;'><IMG src='./image/ranking/kouhaku_w.gif' alt='白'></TD>";
	str += "</TR>";
	str += "<TR>";
	str += "<TD style='font-size:36px;'>" + itoad(r_ptst) + "点</TD>";
	str += "<TD style='font-size:36px;'>" + itoad(w_ptst) + "点</TD>";
	str += "</TR>";
	str += "<TR>";
	str += "<TD valign='top'>" + r_chrstr + "</TD>";
	str += "<TD valign='top'>" + w_chrstr + "</TD>";
	str += "</TR>";
	str += "</TABLE>";
	str += "<BR>";
	str += "<DIV class='TXT12'>";
	str += "組分け手順<BR>";
	str += "<OL style='list-style-type:decimal; margin-left:2em;'>";
	str += "<LI>今回参加キャラ総数が奇数の場合、前回参加キャラの前回結果が最下位のキャラを除外する。<BR>（支援者の方、申し訳ございません）</LI>";
	str += "<LI>前回参加したキャラを前回結果の上位から順に紅組、白組とする。</LI>";
	str += "<LI>前回参加していないキャラを投稿日時の早いキャラから順に2.に続いて振り分ける。</LI>";
	str += "</OL>";
	str += "</DIV>";

	SetText("rnkmain", str);
}


/****************************************************************************
 * Name			:PrintRankingError											*
 * Description	:ランキングのエラーを出力するメソッド						*
 * Return value	:エラーランキング表文字列									*
 * Argument:																*
 ****************************************************************************/
function PrintRankingError()
{
	var str = "";

	/* ver.1 *
	str += "<TR><TD style='text-align:center;'>";
	str += "<DIV class='mb16p4'><H1>ランキングエラー</H1></DIV>";
	str += "<DIV class='mb16p4'><P class='TXT12'>選択された項目は表示できません。<BR>ランキングに該当するキャラがいないか、現在アクセスできない可能性があります。</P></DIV>";
	if(ViewCate == VIEWCATE_MYLIST)
		str += "<DIV class='mb16p4'><P class='TXT12'>お気に入りキャラは　<A href='./mylist.shtml'>コチラ</A>　で登録できます。</P></DIV>";
	str += "</TD></TR>";
/**/

	/* ver.2 */
	str += "<DIV class='mb16p4'>";
	str += "<DIV style='width:664px; height:8px; background:url(\"./image/ranking/error_frm_top.gif\") norepeat top;'><IMG src='./image/1.gif' width=1 height=1></DIV>";
	str += "<DIV style='width:664px; background:url(\"./image/ranking/error_frm_mid.gif\") norepeat top; padding:14px;'>";
	str += "<H3>申し訳ございません。ご指定いただいたランキングのデータは、<BR>プレミアム会員にご登録いただいた方でもご覧いただけません。</H3>";
	str += "<P class='TXT12' style='margin-top:8px;'><SPAN style='color:#09C; text-decoration:underline;'>&gt; プレミアム会員登録へ</SPAN><BR>";
	str += "<BR>";
	str += "※ランキングに該当するキャラがいないか、現在アクセスできない可能性があります。</P>";
	str += "</DIV>";
	str += "<DIV style='width:664px; height:8px; background:url(\"./image/ranking/error_frm_btm.gif\") norepeat bottom;'><IMG src='./image/1.gif' width=1 height=1></DIV>";
/**/
	
	return str;
}




//###############################################################################################
//###############################################################################################
//#
//#  キャラクタリスト関連関数
//#



/****************************************************************************
 * Name			:InitCharacterList											*
 * Description	:参加キャラクタのリストを初期化する関数						*
 * Return value	:															*
 * Argument:																*
 ****************************************************************************/
function InitCharacterList()
{
	var vno;
	var pos;

	//+++++ 現在のリストを破棄 +++++//
	if(ChrLst != undefined){
		ChrLst = {};
		ChrLst = new Array();
	}

	//+++++ キャラクタリスト作成 +++++//
	for(vno in chrdat){
		//----- 動画番号登録 -----//
		chrdat[vno].vno = vno;

		//----- 不参加キャラ除外 -----//
		if(!chrdat[vno].entry)
			continue;

		//----- コメント集計日時の異なるキャラを除外 -----//
		if((chrdat[vno].sdat.sdate != sdate) || (chrdat[vno].edat.sdate != edate))
			continue;

		//----- 登録 -----//
		pos = ChrLst.length;
		ChrLst[pos]     = new Object();
		ChrLst[pos].vno = vno;
		ChrLst[pos].val = 0;
		ChrLst[pos].dif = 0;
		ChrLst[pos].rnk = 0;
		ChrLst[pos].rnk2= 0;		// 前回集計時ランキング
	}
}



/****************************************************************************
 * Name			:SortCharacterList											*
 * Description	:参加キャラクタのリストを指定データでソートする関数			*
 * Return value	:															*
 * Argument:																*
 *   item		:ソート項目 (DAT_VNO, DAT_FROM, …)							*
 *   order		:ソート順 (0:昇順, 0以外:降順)								*
 ****************************************************************************/
function SortCharacterList(item, order)
{
	var i;
	var numflag;
	var valold;
	var valcur;
	var rnk;

	//+++++ データセット +++++//
	switch(item){
	case DAT_VNO:		for(i = 0; i < ChrLst.length; i++){		ChrLst[i].val = chrdat[ChrLst[i].vno].vno;		}	numflag = 0;	break;
	case DAT_FROM:		for(i = 0; i < ChrLst.length; i++){		ChrLst[i].val = chrdat[ChrLst[i].vno].from;		}	numflag = 0;	break;
	case DAT_NAME:		for(i = 0; i < ChrLst.length; i++){		ChrLst[i].val = chrdat[ChrLst[i].vno].name;		}	numflag = 0;	break;
	case DAT_PTST:		for(i = 0; i < ChrLst.length; i++){		ChrLst[i].val = chrdat[ChrLst[i].vno].ptst;		}	numflag = 1;	break;
	case DAT_PTSF:		for(i = 0; i < ChrLst.length; i++){		ChrLst[i].val = chrdat[ChrLst[i].vno].ptsf;		}	numflag = 1;	break;
	case DAT_PTSL:		for(i = 0; i < ChrLst.length; i++){		ChrLst[i].val = chrdat[ChrLst[i].vno].ptsl;		}	numflag = 1;	break;
	case DAT_PTSC:		for(i = 0; i < ChrLst.length; i++){		ChrLst[i].val = chrdat[ChrLst[i].vno].ptsc;		}	numflag = 1;	break;
	case DAT_PTSP:		for(i = 0; i < ChrLst.length; i++){		ChrLst[i].val = chrdat[ChrLst[i].vno].ptsp;		}	numflag = 1;	break;
	case DAT_SPDT:		for(i = 0; i < ChrLst.length; i++){		ChrLst[i].val = chrdat[ChrLst[i].vno].spdt;		}	numflag = 1;	break;
	case DAT_SPDF:		for(i = 0; i < ChrLst.length; i++){		ChrLst[i].val = chrdat[ChrLst[i].vno].spdf;		}	numflag = 1;	break;
	case DAT_SPDL:		for(i = 0; i < ChrLst.length; i++){		ChrLst[i].val = chrdat[ChrLst[i].vno].spdl;		}	numflag = 1;	break;
	case DAT_SPDC:		for(i = 0; i < ChrLst.length; i++){		ChrLst[i].val = chrdat[ChrLst[i].vno].spdc;		}	numflag = 1;	break;
	case DAT_FLGT:		for(i = 0; i < ChrLst.length; i++){		ChrLst[i].val = chrdat[ChrLst[i].vno].spdc;		}	numflag = 1;	break;
	case DAT_FLGP:		for(i = 0; i < ChrLst.length; i++){		ChrLst[i].val = chrdat[ChrLst[i].vno].flgt;		}	numflag = 1;	break;
	default:			for(i = 0; i < ChrLst.length; i++){		ChrLst[i].val = chrdat[ChrLst[i].vno].flgp;		}	numflag = 1;	break;
	}

	//+++++ ソート、順位付け +++++//
	if(numflag){
		//----- ソート -----//
		if(order)
			ChrLst.sort(SortCharacterListFuncIA);
		else
			ChrLst.sort(SortCharacterListFuncID);

		//----- 順位付け -----//
		ChrLst[0].rnk = 1;
		ChrLst[0].dif = 0;
		valold = ChrLst[0].val
		for(rnk = 1, i = 1; i < ChrLst.length; i++){
			valcur = ChrLst[i].val;
			if(valcur == valold){
				ChrLst[i].rnk = ChrLst[i-1].rnk;
				ChrLst[i].dif = ChrLst[i-1].dif;
			}
			else{
				ChrLst[i].rnk = i + 1;
				ChrLst[i].dif = valcur - valold;
			}
			valold = valcur;
		}
	}
	else{
		//----- ソート -----//
		if(order)
			ChrLst.sort(SortCharacterListFuncSA);
		else
			ChrLst.sort(SortCharacterListFuncSD);

		//----- 順位付け -----//
		ChrLst[0].rnk = 1;
		ChrLst[0].dif = 0;
		valold = ChrLst[0].val
		for(rnk = 1, i = 1; i < ChrLst.length; i++){
			valcur = ChrLst[i].val;
			if(valcur == valold)
				ChrLst[i].rnk = ChrLst[i-1].rnk;
			else
				ChrLst[i].rnk = i + 1;
			ChrLst[i].dif = 0;
			valold = valcur;
		}
	}
}



/****************************************************************************
 * Name			:SortCharacterListFunc**									*
 * Description	:SortCharacterList() 用ソート関数							*
 * Return value	:															*
 * Argument:																*
 *   a			:第１項目													*
 *   b			:第２項目													*
 ****************************************************************************/
function SortCharacterListFuncIA(a, b){		return (a.val-b.val);			}		// 数値、昇順
function SortCharacterListFuncID(a, b){		return (b.val-a.val);			}		// 数値、降順
function SortCharacterListFuncSA(a, b){		return strcmp(a.val, b.val);	}		// 文字列、昇順
function SortCharacterListFuncSD(a, b){		return strcmp(b.val, a.val);	}		// 文字列、降順



//###############################################################################################
//###############################################################################################
//#
//#  トップページ関連関数
//#



/****************************************************************************
 * Name			:InitTopPage												*
 * Description	:トップページの初期化関数									*
 * Return value	:															*
 * Argument:																*
 ****************************************************************************/
function InitTopPage()
{
	//+++++ キャラクタリストの初期化 +++++//
	InitCharacterList();
}



/****************************************************************************
 * Name			:PrintTopPage												*
 * Description	:トップページの出力関数										*
 * Return value	:															*
 * Argument:																*
 ****************************************************************************/
function PrintTopPage()
{
	var i, imax;
	var vno;
	var str = "";

	str += "<TABLE cellspacing='0' cellpadding='0' border='0' summary='' class='tag_table'>";
	str += "<TR>";
	str += "<TD><A class='tag_b0' href='./ranking.shtml'><DIV class='tag_b'>すべて</DIV></A></TD>";
	for(i = 0; i < ViewFromList.length; i++){
		str += "<TD><A class='tag_b1' href='./ranking.shtml?from=" + escape(ViewFromList[i]) + "'><DIV class='tag_b'>" + ViewFromList[i] + "</DIV></A></TD>";

		if((i%6) == 4)
			str += "</TR><TR>";
	}

	str += "</TR>"
	str += "</TABLE>";

	SetText("tag_table", str);

	str  = "";
	str += "<TABLE border='0' cellpadding='4' cellspacing='0' summary='' style='margin:0 auto 8px;'>";
	str += "<TR valign='top' align='center'>";

	if(ChrLst.length > 0){
		ChrLst = ShuffleArray(ChrLst);
		imax = Math.min(ChrLst.length, 5);
		for(i = 0; i < imax; i++){
			vno = ChrLst[i].vno;

			str += "<TD width='140px' class='TXT10'>";
			str += "<A href='http://www.nicovideo.jp/watch/" + vno + "'>";
			str += "<IMG alt='" + chrdat[vno].name + "' src='" + GetThumbURL(vno) + "' width='80' height='60' style='border:solid 1px #333;'><BR>";
			str += chrdat[vno].name;
			str += "</A>";
			str += "</TD>";
		}
	}
	str += "</TR>";
	str += "</TABLE>";

	SetText("randomshien", str);
}



//###############################################################################################
//###############################################################################################
//#
//#  マイリスト関連関数
//#



/****************************************************************************
 * Name			:InitMyListPage												*
 * Description	:マイリストページの初期化関数								*
 * Return value	:															*
 * Argument:																*
 ****************************************************************************/
function InitMyListPage()
{
	var i, j;
	var vno;

	//+++++ キャラクタリストの初期化 +++++//
	InitCharacterList();

	//+++++ 各キャラクタのデータ計算 +++++//
	for(i = 0; i < ChrLst.length; i++){
		//----- データ計算 -----//
		vno = ChrLst[i].vno;
		chrdat[vno].Calc = chrdatCalc;
		chrdat[vno].Calc();

		//----- 前半戦の有無フラグ -----//
		if(chrdat[vno].fhflag)
			IsFHalf = 1;

		//----- 全キャラ合計コメント数 -----//
		TotalPointCount += chrdat[vno].ptst;
	}

	//+++++ マイリスト読み込み +++++//
	LoadMyList();
}



/****************************************************************************
 * Name			:LoadMyList													*
 * Description	:マイリストを Cookie から読み込む関数						*
 * Return value	:															*
 * Argument:																*
 ****************************************************************************/
function LoadMyList()
{
	var i , j;

	//+++++ マイリスト呼び出し +++++//
	var myliststr = GetCookie("AiSARE_MYLIST");
	FavLst = myliststr.split(",");

	//+++++ マイリスト登録確認 +++++//
	for(i = 0; i < ChrLst.length; i++){
		for(j = 0; j < FavLst.length; j++){
			if(ChrLst[i].vno == FavLst[j]){
				chrdat[ChrLst[i].vno].mylist = 1;
				break;
			}
		}
	}
}



/****************************************************************************
 * Name			:SaveMyList													*
 * Description	:マイリストを Cookie に書き込む関数							*
 * Return value	:															*
 * Argument:																*
 ****************************************************************************/
function SaveMyList()
{
	var str = "";
	for(var i = 0; i < ChrLst.length; i++){
		if(chrdat[ChrLst[i].vno].mylist)
			str += ChrLst[i].vno + ",";
	}
	if(str.charAt(str.length-1) == ",")
		str = str.substr(0, str.length-1);
	SetCookie("AiSARE_MYLIST", str);
}



/****************************************************************************
 * Name			:AddMyList													*
 * Description	:マイリストにキャラクタを追加する関数						*
 * Return value	:															*
 * Argument:																*
 *   pos		:ChrLst内でのキャラクタ位置									*
 ****************************************************************************/
function AddMyList(pos)
{
	chrdat[ChrLst[pos].vno].mylist = 1;
	SaveMyList();
}



/****************************************************************************
 * Name			:DeleteMyList												*
 * Description	:マイリストからキャラクタを削除する関数						*
 * Return value	:															*
 * Argument:																*
 *   pos		:ChrLst内でのキャラクタ位置									*
 ****************************************************************************/
function DeleteMyList(pos)
{
	chrdat[ChrLst[pos].vno].mylist = 0;
	SaveMyList();
}



/****************************************************************************
 * Name			:PrintMyList												*
 * Description	:キャラクタリスト一覧を出力する関数							*
 * Return value	:															*
 * Argument:																*
 ****************************************************************************/
function PrintMyList()
{
	var c, i;
	var v;

	//+++++ ソート +++++//
	var srt = document.sort.sort.value;
	     if(srt == "pt_d")		SortCharacterList(DAT_VNO, 1);		// 投稿日時が新しい順
	else if(srt == "pt_a")		SortCharacterList(DAT_VNO, 0);		// 投稿日時が古い順
	else if(srt == "bl_a")		SortCharacterList(DAT_FROM, 1);		// 所属昇順
	else if(srt == "bl_d")		SortCharacterList(DAT_FROM, 0);		// 所属降順
	else if(srt == "cn_a")		SortCharacterList(DAT_NAME, 1);		// キャラ名昇順
	else if(srt == "cn_d")		SortCharacterList(DAT_NAME, 0);		// キャラ名降順

	//+++++ お気に入り追加／削除表 +++++//
	var str = "";
	str += "<TABLE width='640' border='0' cellpadding='4' cellspacing='0' summary='一覧' class='zebra_table' style='margin:0px auto;'>";
	for(c = 0, i = 0; i < ChrLst.length; i++){
		v = ChrLst[i].vno;

		str += "<TR class='" + ((c%2)?"even":"odd") + "'>";
		str += "<TD>";
		str += "<DIV style='margin-top:4px;'><A href='http://www.nicovideo.jp/watch/" + v + "'>";
		str += "<IMG alt='" + chrdat[v].name + "' src='" + GetThumbURL(v) + "' width='80' height='60' class='thumb_img'></A>";
		str += "</DIV>";
		str += "</TD>";

		str += "<TD width='100%'>";
		str += "<P class='TXT12'>";
		str += "<IMG style='margin-bottom:4px;' alt='AiSARE' src='./image/from_AiSARE.gif'><BR>";
		str += "<STRONG>" + chrdat[v].from + "</STRONG><BR>";
		str += "<H3 style='margin:4px 0px;'>" + (chrdat[v].mylist ? "<SPAN style='color:#F90;'>★</SPAN>":"") + "&nbsp;<A class='video' href='http://www.nicovideo.jp/watch/" + v + "'><SPAN style='font-size:18px;'>" + chrdat[v].name + "</SPAN></A></H3>";
		str += "<P class='TXT12'></P>";
		str += "</TD>";
		str += "<TD style='width:54px; text-align:left;'><INPUT type='submit' class='submit' " + ( chrdat[v].mylist ? " disabled ": "") + " onClick='AddMyList(\"" + i + "\");    PrintMyList();' value='追加'></TD>";
		str += "<TD style='width:54px; text-align:left;'><INPUT type='submit' class='submit' " + (!chrdat[v].mylist ? " disabled ": "") + " onClick='DeleteMyList(\"" + i + "\"); PrintMyList();' value='削除'></TD>";
		str += "</TR>";

		c++;
	}
	str += "</TABLE>";

	SetText("mylmain", str);

	//+++++ 参戦キャラクタ数 +++++//
	SetText("sumchr", itoad(ChrLst.length));

	//+++++ 総コメント数 +++++//
	SetText("sumcmt", itoad(TotalPointCount));
}



//###############################################################################################
//###############################################################################################
//#
//#  キャラクタデータ関連関数
//#



/****************************************************************************
 * Name			:chrdatCalc													*
 * Description	:キャラクタのポイントデータ等を計算するメソッド				*
 * Parent		:chrdat														*
 * Return value	:															*
 * Argument:																*
 ****************************************************************************/
function chrdatCalc()
{
	var i;
	var pts;
	var spd;
	var pdate;

//	this.vno
//	this.entry
//	this.etype
//	this.from
//	this.name
//	this.srvtime
//	this.cornum
//	this.sdat
//	this.edat
//	this.cdat
//	this.ldat
//	this.fhcornum
//	this.fhsdat
//	this.fhedat
	this.mylist = 0;			// マイリスト登録
	this.fhflag = 0;			// 前半集計結果があるか
	this.ptst   = 0;			// 合計ポイント数
	this.ptsf   = 0;			// 前半ポイント数
	this.ptsl   = 0;			// 後半ポイント数
	this.ptsc   = 0;			// 直近ポイント数
	this.ptsp   = 0;			// 前回集計ポイント数
	this.spdt   = 0;			// 合計分速
	this.spdf   = 0;			// 前半分速
	this.spdl   = 0;			// 後半分速
	this.spdc   = 0;			// 直近分速
	this.flgt   = 1;			// 合計ポイントが確定値か
	this.flgp   = 1;			// 前回集計ポイントが確定値か
	this.Get          = chrdatGet;			// データ取得メソッド
	this.Print        = chrdatPrint;		// データ出力メソッド
	this.PrintBeta2   = chrdatPrintBeta2;	// データ出力メソッド
	this.PrintSimple  = chrdatPrintSimple;	// データ出力メソッド


	//+++++ 前後半戦判定 +++++//
	this.fhflag = ((this.fhsdat && this.fhedat) ? 1 : 0);
	if(this.fhcornum == undefined)
		this.fhcornum = 0;

	//+++++ ポイント数算出 +++++//
	{
		//----- 現在データ計算 -----//
		if(this.srvtime < this.edat.sdate){
			pts = this.cdat.no - this.sdat.no + this.cornum;
			this.flgt = ((this.cdat.flag && this.sdat.flag) ? 1 : 0);
		}
		else{
			pts = this.edat.no - this.sdat.no + this.cornum;
			this.flgt = ((this.edat.flag && this.sdat.flag) ? 1 : 0);
		}

		//----- 前後半戦データ振り分け -----//
		if(this.fhflag){
			this.ptsf = this.fhedat.no - this.fhsdat.no + this.fhcornum;
			this.ptsl = pts;
			this.flgt = ((this.fhedat.flag && this.fhsdat.flag) ? 1 : 0);
		}
		else{
			this.ptsf = pts;
			this.ptsl = 0;
		}

		//----- 合計ポイント数 -----//
		this.ptst = this.ptsf + this.ptsl;

		//----- 直近ポイント数計算 -----//
		if(this.cdat.cdate && this.ldat.cdate)
			this.ptsc = this.cdat.no - this.ldat.no;
		else
			this.ptsc = 0;

		//----- 前回ポイント数 -----//
		if(this.ldat.sdate == (cdate-itime)){
			this.flgp = ((this.ldat.flag && this.sdat.flag) ? 1 : 0);
			if(this.fhflag){
				this.flgp = ((this.flgp && this.fhedat.flag && this.fhsdat.flag) ? 1 : 0);
				this.ptsp = this.ldat.no - this.sdat.no + this.cornum + this.ptsf;
			}
			else
				this.ptsp = this.ldat.no - this.sdat.no + this.cornum;
		}
		else{
			this.ptsp = 0;
			this.flgp = 0;
		}

		//----- 補正 -----//
		if(this.ptst < 0)	this.ptst = 0;
		if(this.ptsf < 0)	this.ptsf = 0;
		if(this.ptsl < 0)	this.ptsl = 0;
		if(this.ptsc < 0)	this.ptsc = 0;
		if(this.ptsp < 0)	this.ptsp = 0;
	}

	//+++++ 分速算出 +++++//
	{
		var totaltime = 0;

		//----- 現在データ -----//
		if(this.srvtime < this.edat.sdate){
			if(this.sdat.sdate != this.cdat.sdate){
				spd = Math.floor((this.cdat.no-this.sdat.no)/(this.cdat.sdate-this.sdat.sdate)*60);
				totaltime += this.cdat.sdate-this.sdat.sdate;
			}
			else
				spd = 0;
		}
		else{
			if(this.sdat.sdate != this.edat.sdate){
				spd = Math.floor((this.edat.no-this.sdat.no)/(this.edat.sdate-this.sdat.sdate)*60);
				totaltime += this.edat.sdate - this.sdat.sdate;
			}
			else
				spd = 0;
		}

		//----- 前後半戦データ振り分け -----//
		if(this.fhflag){
			if(this.fhsdat.sdate != this.fhedat.sdate){
				this.spdf = Math.floor((this.fhedat.no-this.fhsdat.no)/(this.fhedat.sdate-this.fhsdat.sdate)*60);
				totaltime += this.fhedat.sdate - this.fhsdat.sdate;
			}
			else
				this.spdf = 0;
			this.spdl = spd;
		}
		else{
			this.spdf = spd;
			this.spdl = 0;
		}

		//----- 合計分速 -----//
		if(totaltime)
			this.spdt = Math.floor(this.ptst/totaltime*60);
		else
			this.spdt = 0;

		//----- 直近分度計算 -----//
		if(this.cdat.sdate && this.ldat.sdate && (this.cdat.sdate != this.ldat.sdate))
			this.spdc = Math.floor((this.ldat.no-this.cdat.no)/(this.ldat.sdate-this.cdat.sdate)*60);
		else
			this.spdc = 0;

		//----- 念のため補正 -----//
		if(this.spdt < 0)	this.spdt = 0;
		if(this.spdf < 0)	this.spdf = 0;
		if(this.spdl < 0)	this.spdl = 0;
		if(this.spdc < 0)	this.spdc = 0;
	}
}



/****************************************************************************
 * Name			:chrdatGet													*
 * Description	:キャラクタのポイントデータ等を取得するメソッド				*
 * Parent		:chrdat														*
 * Return value	:SortType, SortSpan に対応したデータ						*
 * Argument:																*
 ****************************************************************************/
function chrdatGet()
{
	switch(SortType){
	case SORTTYPE_PPM:
		switch(SortSpan){
		case SORTSPAN_FH:		return this.spdf;		break;
		case SORTSPAN_LH:		return this.spdl;		break;
		case SORTSPAN_RECENT:	return this.spdc;		break;
		default:				return this.spdt;		break;
		}
		break;

	default:
		switch(SortSpan){
		case SORTSPAN_FH:		return this.ptsf;		break;
		case SORTSPAN_LH:		return this.ptsl;		break;
		case SORTSPAN_RECENT:	return this.ptsc;		break;
		default:				return this.ptst;		break;
		}
	}
	return 0;
}



/****************************************************************************
 * Name			:chrdatPrint												*
 * Description	:キャラクタデータを表出力するメソッド						*
 * Parent		:chrdat														*
 * Return value	:SortType, SortSpan に対応したデータ						*
 * Argument:																*
 *   rnk		:出力キャラの順位											*
 *   rnkabv		:出力キャラの１つ上の順位									*
 *   dif		:出力キャラと１つ上の順位のキャラの値の差					*
 * note			:グローバル変数 BorderlinePoint, LuckRanking を使用			*
 ****************************************************************************/
function chrdatPrint(rnk, rnkabv, dif, rnk2)
{
	return this.PrintBeta2(rnk, rnkabv, dif, rnk2);
}


/****************************************************************************
 * Name			:chrdatPrintBeta2											*
 * Description	:キャラクタデータを表出力するメソッド						*
 *				 ニコニコ動画（ββ）形式									*
 * Parent		:chrdat														*
 * Return value	:SortType, SortSpan に対応したデータ						*
 * Argument:																*
 *   rnk		:出力キャラの順位											*
 *   rnkabv		:出力キャラの１つ上の順位									*
 *   dif		:出力キャラと１つ上の順位のキャラの値の差					*
 *   rnkp		:出力キャラの前回順位										*
 * note			:グローバル変数 BorderlinePoint, LuckRanking を使用			*
 ****************************************************************************/
function chrdatPrintBeta2(rnk, rnkabv, dif, rnkp)
{
	var i;
	var str = "";
	var pts = (this.fhflag ? this.ptsl : this.ptsf);
	var rnkup = rnkp - rnk;
	var maskflag = 0;
	var dataflag = 0;

	//+++++ マスク設定 +++++//
	if(maskmode){
		maskflag = 0;
		for(i = 0; i < msklst.length; i++){
			if(rnk == msklst[i]){
				maskflag = 1;
				break;
			}
		}
		if(!maskflag){
			for(i = 0; i < msklst_id.length; i++){
				if(this.vno == msklst_id[i]){
					maskflag = 1;
					break;
				}
			}
		}
		if(((maskmode > 0) && maskflag) || ((maskmode < 0) && !maskflag))
			maskflag = 0;
		else
			maskflag = 1;
	}
	else
		maskflag = 0;

	//+++++ データの信頼性 +++++//
	if(this.srvtime < this.edat.sdate){
		switch(SortSpan){
		case SORTSPAN_FH:		dataflag = (this.fhflag ? this.fhsdat.flag : this.sdat.flag);						break;
		case SORTSPAN_LH:		dataflag = (this.fhflag ? this.sdat.flag : 1);										break;
		case SORTSPAN_RECENT:	dataflag = (this.cdat.flag && this.ldat.flag);										break;
		default:				dataflag = (this.fhflag ? (this.fhsdat.flag && this.sdat.flag) : this.sdat.flag);	break;
		}
	}
	else{
		switch(SortSpan){
		case SORTSPAN_FH:		dataflag = (this.fhflag ? (this.fhsdat.flag && this.fhedat.flag) : (this.sdat.flag && this.edat.flag));											break;
		case SORTSPAN_LH:		dataflag = (this.fhflag ? (this.sdat.flag && this.edat.flag) : 1);																				break;
		case SORTSPAN_RECENT:	dataflag = (this.cdat.flag && this.ldat.flag);																									break;
		default:				dataflag = (this.fhflag ? (this.fhsdat.flag && this.fhedat.flag && this.sdat.flag && this.edat.flag) : (this.sdat.flag && this.edat.flag));		break;
		}
	}

	//+++++ 出力文字列作成 +++++//
	str += "<DIV style='width:664px; padding:3px; margin:2px 0px; " + ((this.srvtime<cdate)?"background-color:#FF8;":"") + "'>";
	str += "<TABLE width='660' border='0' cellspacing='0' cellpadding='0' class='ranking_data' style='margin:0px;'>";
	str += "<TR height='32' valigh='bottom'>";
	str += "<TD style='padding-right:8px;'>";
	str += "<STRONG style='color:#455;'>";
	str += "<SPAN style='font-size:200%; " + (((this.rnk!=LuckyRanking)&&(this.ptst<BorderlinePoint))?"color:#FCC;":"") + "'>" + ((rnk!=rnkabv)?rnk:"〃") + "</SPAN>位";
	if(dataflag)
		str += " ( " + itoad(this.Get()) + " ) ";
	else
		str += " ( <SPAN style='color:#888;'>" + itoad(this.Get()) + " ? </SPAN> ) ";
	str += "</STRONG>&nbsp;&nbsp;&nbsp;";
	if(rnk > 1)
		str += "<SPAN style='color:#888;'>" + itoad(dif) + ((SortType==SORTTYPE_PPM)?" pts./min.":" pts.") + "</SPAN>";
	else
		str += "&nbsp;";
	str += "</TD>";
	if(rnkup >= 1){
		str += "<TD valign='bottom' align='right' style='padding-bottom:3px; padding-right:6px;'>";
		if(rnkup >= 5)		str += "<IMG style='margin:1px;' src='./image/ranking/up_g.gif'>";
		if(rnkup >= 4)		str += "<IMG style='margin:1px;' src='./image/ranking/up_g.gif'>";
		if(rnkup >= 3)		str += "<IMG style='margin:1px;' src='./image/ranking/up_" + ((rnkup>3)?"g":"s") + ".gif'>";
		if(rnkup >= 2)		str += "<IMG style='margin:1px;' src='./image/ranking/up_" + ((rnkup>3)?"g":"s") + ".gif'>";
		if(rnkup >= 1)		str += "<IMG style='margin:1px;' src='./image/ranking/up_" + ((rnkup>3)?"g":"s") + ".gif'>";
		str += "</TD>";
		str += "<TD valign='bottom' width='180' align='right' style='padding-bottom:3px; background:#FFF url(\"../image/ranking/up_bg.gif\") no-repeat; color:#FFF;'>";
		str += "前回集計からの上昇順位： <STRONG>" + rnkup + "</STRONG>";
		str += "&nbsp;&nbsp;";
		str += "</TD>";
	}
	str += "</TR>";
	str += "</TABLE>";

	str += "<TABLE width='660' border='0' cellspacing='4' cellpadding='0' ";
	if(rnkup >= 4)			str += "class='ranking_frm2'>";
	else if(rnkup >= 1)		str += "class='ranking_frm1'>";
	else					str += "class='ranking_frm'>";
	str += "<TR valign='top'>";
	str += "<TD>";
	str += "<P><IMG src='./image/from_AiSARE.gif' alt='AiSARE'></P>";
	str += "<P style='margin:2px 0;'>";
	str += "<A href='http://www.nicovideo.jp/watch/" + this.vno + "' target='_blank'>";
	str += "<IMG alt='" + this.name + "' src='" + GetThumbURL(this.vno) + "' width='96' height='72' class='thumb_img'>";
	str += "</A>";
	str += "</P>";
	str += "</TD>";
	str += "<TD width='100%' style='padding-left:4px;'>";
	str += "<P class='TXT12'>";
	str += "<STRONG>" + Date2String(((this.srvtime<this.edat.sdate)?this.cdat.sdate:this.edat.sdate)*1000, "YYYY年MM月DD日 hh:mm:ss") + "</STRONG> 集計<BR>";
	str += "枠：<STRONG>";
	switch(this.etype){
	case 1:		str += "シード";	break;
	case 2:		str += "通常";		break;
	case 3:		str += "新規";		break;
	case 4:		str += "復帰";		break;
	default:	str += "その他";	break;
	} 
	str += "</STRONG>　ポイント：<STRONG>" + itoad(this.ptst) + "</STRONG>　直近分速：<STRONG>" + itoad(this.spdc) + "</STRONG>";
	str += "</P>";
	str += "<H3 style='font-size:18px; margin:6px 0px;'><A class='video' href='http://www.nicovideo.jp/watch/" + this.vno + "' target='_blank'>" + this.name + "</A></H3>";
	str += "<P class='TXT12'>" + this.from + "</P>";
	str += "</TD>";
	str += "<TD nowrap style='text-align:right; vertical-align:bottom; width:210px;'>";

// コメント番号表 (ここから)
		str += "<TABLE border='0' cellspacing='0' cellpadding='0' class='TXT12' style='color:#666;'>";
		str += "<TR>";

		if(this.fhflag){
			str += "<TD class='info1'>前&nbsp;&nbsp;半&nbsp;&nbsp;</TD>";
			str += "<TD class='info1'>後&nbsp;&nbsp;半&nbsp;&nbsp;</TD>";
		}
		else
			str += "<TD class='info2'>&nbsp;</TD>";
		str += "<TD class='info2'>&nbsp;</TD>";
		str += "</TR>";


		if(this.srvtime < this.edat.sdate){
			str += "<TR>";
			if(this.fhflag)
				str += "<TD class='info1'>" + (this.fhedat.flag?"":"<SPAN style='color:#AAA;'>(") + itoad(this.fhedat.no) + (this.fhedat.flag?"&nbsp;":")") + "</TD>";
			str += "<TD class='info1'>" + (this.cdat.flag?"":"<SPAN style='color:#AAA;'>(") + itoad(this.cdat.no) + (this.cdat.flag?"&nbsp;":")") + "</TD>";
			str += "<TD class='info2'>：現在番</TD>";
			str += "</TR>";
		}
		else{
			str += "<TR>";
			if(this.fhflag)
				str += "<TD class='info1'>" + (this.fhedat.flag?"":"<SPAN style='color:#AAA;'>(") + itoad(this.fhedat.no) + (this.fhedat.flag?"&nbsp;":")") + "</TD>";
			str += "<TD class='info1'>" + (this.edat.flag?"":"<SPAN style='color:#AAA;'>(") + itoad(this.edat.no) + (this.edat.flag?"&nbsp;":")") + "</TD>";
			str += "<TD class='info2'>：終了番</TD>";
			str += "</TR>";
		}

		str += "<TR>";
		if(this.fhflag)
			str += "<TD class='info1'>" + (this.fhsdat.flag?"":"<SPAN style='color:#AAA;'>(") + itoad(this.fhsdat.no) + (this.fhsdat.flag?"&nbsp;":")") + "</TD>";
		str += "<TD class='info1'>" + (this.sdat.flag?"":"<SPAN style='color:#AAA;'>(") + itoad(this.sdat.no) + (this.sdat.flag?"&nbsp;":")") + "</TD>";
		str += "<TD class='info2'>：開始番</TD>";
		str += "</TR>";
		if(this.cornum || this.fhcornum){
			str += "<TR>";
			if(this.fhflag)
				str += "<TD class='info1'>" + itoad(this.fhcornum) + "&nbsp;</TD>";
			str += "<TD class='info1'>" + itoad(this.cornum) + "&nbsp;</TD>";
			str += "<TD class='info2'>：補正</TD>";
			str += "</TR>";
		}

		str += "<TR>";
		if(this.fhflag)
			str += "<TD class='info1' style='border-top:solid 1px #CCC;'>" + ((this.fhsdat.flag&&this.fhedat.flag)?"":"<SPAN style='color:#AAA;'>(") + itoad(this.ptsf) + ((this.fhsdat.flag&&this.fhsdat.flag)?"&nbsp;":")") + "</TD>";
		str += "<TD class='info1' style='border-top:solid 1px #CCC;'>";
		if(this.srv < this.edat.sdate){
			if(this.sdat.flag)
				str += itoad(pts) + "&nbsp;";
			else
				str += "<SPAN style='color:#AAA; font-weight:normal;'>(" + itoad(pts) + ")</SPAN>";
		}
		else{
			if((this.sdat.flag) && (this.cdat.flag))
				str += itoad(pts) + "&nbsp;";
			else
				str += "<SPAN style='color:#AAA; font-weight:normal;'>(" + itoad(pts) + ")</SPAN>";
		}
		str += "</TD>";
		str += "<TD class='info2' style='border-top:solid 1px #CCC;'>：ﾎﾟｲﾝﾄ</TD>";
		str += "</TR>";
		str += "</TABLE>";
// コメント番号表 (ここまで)

	str += "</TD>";
	str += "</TR>";
	str += "</TABLE>";
	str += "</DIV>";

	return str;
}


/****************************************************************************
 * Name			:chrdatPrintSimple											*
 * Description	:キャラクタデータを簡易表出力するメソッド					*
 * Parent		:chrdat														*
 * Return value	:SortType, SortSpan に対応したデータ						*
 * Argument:																*
 *   rnk		:出力キャラの順位											*
 *   rnkabv		:出力キャラの１つ上の順位									*
 *   dif		:出力キャラと１つ上の順位のキャラの値の差					*
 *   rnkp		:出力キャラの前回順位										*
 * note			:グローバル変数 BorderlinePoint, LuckRanking を使用			*
 ****************************************************************************/
function chrdatPrintSimple(rnk, rnkabv, dif, rnkp)
{
	var i;
	var str = "";
	var pts = (this.fhflag ? this.ptsl : this.ptsf);
	var rnkup = rnkp - rnk;
	var maskflag = 0;
	var dataflag = 0;

	//+++++ マスク設定 +++++//
	if(maskmode){
		maskflag = 0;
		for(i = 0; i < msklst.length; i++){
			if(rnk == msklst[i]){
				maskflag = 1;
				break;
			}
		}
		if(!maskflag){
			for(i = 0; i < msklst_id.length; i++){
				if(this.vno == msklst_id[i]){
					maskflag = 1;
					break;
				}
			}
		}
		if(((maskmode > 0) && maskflag) || ((maskmode < 0) && !maskflag))
			maskflag = 0;
		else
			maskflag = 1;
	}
	else
		maskflag = 0;

	//+++++ データの信頼性 +++++//
	if(this.srvtime < this.edat.sdate){
		switch(SortSpan){
		case SORTSPAN_FH:		dataflag = (this.fhflag ? this.fhsdat.flag : this.sdat.flag);						break;
		case SORTSPAN_LH:		dataflag = (this.fhflag ? this.sdat.flag : 1);										break;
		case SORTSPAN_RECENT:	dataflag = (this.cdat.flag && this.ldat.flag);										break;
		default:				dataflag = (this.fhflag ? (this.fhsdat.flag && this.sdat.flag) : this.sdat.flag);	break;
		}
	}
	else{
		switch(SortSpan){
		case SORTSPAN_FH:		dataflag = (this.fhflag ? (this.fhsdat.flag && this.fhedat.flag) : (this.sdat.flag && this.edat.flag));											break;
		case SORTSPAN_LH:		dataflag = (this.fhflag ? (this.sdat.flag && this.edat.flag) : 1);																				break;
		case SORTSPAN_RECENT:	dataflag = (this.cdat.flag && this.ldat.flag);																									break;
		default:				dataflag = (this.fhflag ? (this.fhsdat.flag && this.fhedat.flag && this.sdat.flag && this.edat.flag) : (this.sdat.flag && this.edat.flag));		break;
		}
	}

	//+++++ 出力文字列作成 +++++//
	str += "<DIV style='width:664px; padding:3px; margin:2px 0px; " + ((this.srvtime<cdate)?"background-color:#FF8;":"") + "'>";
	str += "<TABLE width='660' border='0' cellspacing='2' cellpadding='0' style='font-size:12px;' ";
	if(rnkup >= 4)			str += "class='ranking_s_frm2'>";
	else if(rnkup >= 1)		str += "class='ranking_s_frm1'>";
	else					str += "class='ranking_s_frm'>";
	str += "<TR valign='bottom'>";
	str += "<TD width='50' style='text-align:right;'>";
	str += "<SPAN style='font-size:200%; " + (((this.rnk!=LuckyRanking)&&(this.ptst<BorderlinePoint))?"color:#FCC;":"") + "'>" + ((rnk!=rnkabv)?rnk:"〃") + "</SPAN>";
	str += "</TD>";
	str += "<TD width='100' style='text-align:right;'>";
	if(dataflag)
		str += "<STRONG>" + itoad(this.Get()) + "</STRONG>";
	else
		str += "<SPAN style='color:#888;'>" + itoad(this.Get()) + " ? </SPAN>";
	str += ((SortType==SORTTYPE_PPM)?" pts./min.":" pts.")
	str += "<BR>";
	if(rnk > 1)
		str += "<SPAN style='color:#888;'>" + itoad(dif) + "</SPAN>";
	else
		str += "&nbsp;";
	str += "</TD>";

	str += "<TD style='padding-left:8px;'>";
	str += "<H3 style='font-size:16px; margin:4px 0px;'><A class='video' href='http://www.nicovideo.jp/watch/" + this.vno + "' target='_blank'>" + this.name + "</A></H3>";
	str += "<P class='TXT12'>" + this.from + "</P>";

	str += "</TD>";




	str += "<TD nowrap style='text-align:right; vertical-align:bottom; width:230px;'>";

// コメント番号表 (ここから)
		str += "<TABLE border='0' cellspacing='0' cellpadding='0' class='TXT12' style='color:#666;'>";
		str += "<TR>";

		if(this.fhflag){
			str += "<TD class='info2e'>" + ((this.fhsdat.flag&&this.fhedat.flag)?"":"<SPAN style='color:#AAA;'>(") + itoad(this.ptsf) + ((this.fhsdat.flag&&this.fhsdat.flag)?"&nbsp;":")") + "</TD>";
			str += "<TD class='info3e'>";
			str += "<IMG src='./image/ranking/cmtinfo_detail.gif' alt='";
			str += (this.fhedat.flag?"":"(") + itoad(this.fhedat.no) + (this.fhedat.flag?"":")");
			str += "&nbsp;-&nbsp;";
			str += (this.fhsdat.flag?"":"(") + itoad(this.fhsdat.no) + (this.fhsdat.flag?"":")");
			if(this.fhcornum){
				str += "&nbsp;+&nbsp;";
				str += itoad(this.fhcornum);
			}
			str += "&nbsp;=&nbsp;";
			str += ((this.fhsdat.flag&&this.fhedat.flag)?"":"(") + itoad(this.ptsf) + ((this.fhsdat.flag&&this.fhsdat.flag)?"":")");
			str += "'></TD>";
			str += "<TD class='info3e'>&nbsp;&nbsp;＋</TD>";
			str += "<TD class='info2e'>";
			if(this.srv < this.edat.sdate){
				if(this.sdat.flag)
					str += itoad(pts) + "&nbsp;";
				else
					str += "<SPAN style='color:#AAA; font-weight:normal;'>(" + itoad(pts) + ")</SPAN>";
			}
			else{
				if((this.sdat.flag) && (this.cdat.flag))
					str += itoad(pts) + "&nbsp;";
				else
					str += "<SPAN style='color:#AAA; font-weight:normal;'>(" + itoad(pts) + ")</SPAN>";
			}
			str += "</TD>";
		}
		else{
			str += "<TD class='info2e'>&nbsp;</TD>";
			str += "<TD class='info3e'>&nbsp;</TD>";
			str += "<TD class='info3e'>&nbsp;</TD>";
			str += "<TD class='info2e'>&nbsp;</TD>";
		}

		str += "<TD class='info3e'>";
		str += "<IMG src='./image/ranking/cmtinfo_detail.gif' alt='";
		if(this.srvtime < this.edat.sdate)
			str += (this.cdat.flag?"":"(") + itoad(this.cdat.no) + (this.cdat.flag?"":")");
		else
			str += (this.edat.flag?"":"(") + itoad(this.edat.no) + (this.edat.flag?"":")");
		str += "&nbsp;-&nbsp;";
		str += (this.sdat.flag?"":"(") + itoad(this.sdat.no) + (this.sdat.flag?"":")");
		if(this.cornum){
			str += "&nbsp;+&nbsp;";
			str += itoad(this.cornum);
		}
		str += "&nbsp;=&nbsp;";
		if(this.srv < this.edat.sdate){
			if(this.sdat.flag)
				str += itoad(pts);
			else
				str += "(" + itoad(pts) + ")";
		}
		else{
			if((this.sdat.flag) && (this.cdat.flag))
				str += itoad(pts);
			else
				str += "(" + itoad(pts) + ")";
		}
		str += "'></TD>";

		str += "</TR>";
		str += "</TABLE>";

// コメント番号表 (ここまで)

	str += "</TD>";
	str += "</TR>";
	if(rnkup >= 1){
		str += "</TR>";
		str += "<TD colspan=3 style='padding:2px 8px 4px 8px; text-align:left;'><IMG src='./image/ranking/up_" + ((rnkup>5)?5:rnkup) + ".gif'></TD>";
		str += "<TD style='padding:2px 8px 4px 8px; text-align:right;' class='TXT12'>前回集計からの上昇順位： <STRONG>" + rnkup + "</STRONG></TD>";
	}
	str += "</TABLE>";
	str += "</DIV>";

	return str;
}


//-->

