
// JavaScript Document

var g_url = "server_script/load_rank_list.php";
var rank_request;
var limited_delay_time = undefined;

var g_game_count = 4;

var rank_list_id = new Array(g_game_count);

rank_list_id[1] = {top:"tetris_rank_top", month:"tetris_rank_month", week:"tetris_rank_week"};
rank_list_id[2] = {top:"tball_rank_top", month:"tball_rank_month", week:"tball_rank_week"};
rank_list_id[3] = {top:"mahjong_rank_top", month:"mahjong_rank_month", week:"mahjong_rank_week"};

var rank_month_title_id = [0,"tetris-title-month", "tball-title-month", "mahjong-title-month" ];
var rank_week_title_id = [0,"tetris-title-week", "tball-title-week", "mahjong-title-week" ];

var rank_list_btn = new Array(g_game_count);

var btn_top_id = {left:"tetris_rank_top_left", right:"tetris_rank_top_right" };
var btn_month_id = {left:"tetris_rank_month_left", right:"tetris_rank_month_right" };
var btn_week_id = {left:"tetris_rank_week_left", right:"tetris_rank_week_right" };
var rank_btn_id = {top:btn_top_id, month:btn_month_id, week:btn_week_id };

rank_list_btn[1] = rank_btn_id;

var btn_top_id = {left:"tball_rank_top_left", right:"tball_rank_top_right" };
var btn_month_id = {left:"tball_rank_month_left", right:"tball_rank_month_right" };
var btn_week_id = {left:"tball_rank_week_left", right:"tball_rank_week_right" };
var rank_btn_id = {top:btn_top_id, month:btn_month_id, week:btn_week_id };

rank_list_btn[2] = rank_btn_id;

var btn_top_id = {left:"mahjong_rank_top_left", right:"mahjong_rank_top_right" };
var btn_month_id = {left:"mahjong_rank_month_left", right:"mahjong_rank_month_right" };
var btn_week_id = {left:"mahjong_rank_week_left", right:"mahjong_rank_week_right" };
var rank_btn_id = {top:btn_top_id, month:btn_month_id, week:btn_week_id };

rank_list_btn[3] = rank_btn_id;

function enableControl(flag) {

	if (flag) {
	
		var strLeftPre1 = '<a style="cursor:pointer;" onclick="clickListBtn(';
		var strLeftPre2 = ');" onMouseOut="MM_swapImgRestore()" onMouseOver="MM_swapImage(\'img_';
		var strLeftMid = '\',\'\',\'images/rank_bullet/left_arrow_over.png\',1)"><img src="images/rank_bullet/left_arrow.png" name="img_';
		var strLeftPost = '" width="16" height="15" border="0" alt="이전" title=';
		var strLeftEnd = ' /></a>';
		
		if (isIE7 == true) { strLeftEnd += "&nbsp;"; }
		
		var strRightPre1 = '<a style="cursor:pointer;" onclick="clickListBtn(';
		var strRightPre2 = ');" onMouseOut="MM_swapImgRestore()" onMouseOver="MM_swapImage(\'img_';
		var strRightMid = '\',\'\',\'images/rank_bullet/right_arrow_over.png\',1)"><img src="images/rank_bullet/right_arrow.png" name="img_';
		var strRightPost = '" width="16" height="15" border="0" alt="다음" title=';
		var strRightEnd = ' /></a>';
		
		for (var i=1; i<rank_list_btn.length; i++) {
		
			var strID = "";
			var strTitle = "";
			
			// Top Players 500
			var index = rank_list[i].top.index;
			var limit = rank_list[i].top.limit;
			
			if (index < limit-1) {
				strTitle = rank_list[i].top.start[index+1] + "위~" + rank_list[i].top.end[index+1] + "위";
				strID = rank_list_btn[i].top.left;
				document.getElementById(strID).innerHTML = strLeftPre1 + i + "," + 0 + ", " + true + strLeftPre2 + strID + strLeftMid + strID + strLeftPost + strTitle + strLeftEnd;
			}			
			if (index > 0) {
				strTitle = rank_list[i].top.start[index-1] + "위~" + rank_list[i].top.end[index-1] + "위";
				strID = rank_list_btn[i].top.right;
				document.getElementById(strID).innerHTML = strRightPre1 + i + "," + 0 + ", " + false + strRightPre2 + strID + strRightMid + strID + strRightPost + strTitle + strRightEnd;
			}
			
			// 월간 랭킹
			var index = rank_list[i].month.index;
			var limit = rank_list[i].month.limit;

			if (index < limit-1) {
				strTitle = (2000 + parseInt(rank_list[i].month.year[index+1],10)) + "년&nbsp;" + rank_list[i].month.month[index+1] + "월";
				strID = rank_list_btn[i].month.left;
				document.getElementById(strID).innerHTML = strLeftPre1 + i + "," + 1 + ", " + true + strLeftPre2 + strID + strLeftMid + strID + strLeftPost + strTitle + strLeftEnd;
			}			
			if (index > 0) {
				strTitle =(2000 + parseInt(rank_list[i].month.year[index-1],10)) + "년&nbsp;" + rank_list[i].month.month[index-1] + "월";
				strID = rank_list_btn[i].month.right;
				document.getElementById(strID).innerHTML = strRightPre1 + i + "," + 1 + ", " + false + strRightPre2 + strID + strRightMid + strID + strRightPost + strTitle + strRightEnd;
			}

			// 주간 랭킹
			var index = rank_list[i].week.index;
			var limit = rank_list[i].week.limit;

			if (index < limit-1) {
				strTitle = (2000 + parseInt(rank_list[i].week.year[index+1],10)) + "년&nbsp;" + rank_list[i].week.week[index+1] + "주차";
				strID = rank_list_btn[i].week.left;
				document.getElementById(strID).innerHTML = strLeftPre1 + i + "," + 2 + ", " + true + strLeftPre2 + strID + strLeftMid + strID + strLeftPost + strTitle + strLeftEnd;
			}			
			if (index > 0) {
				strTitle = (2000 + parseInt(rank_list[i].week.year[index-1],10)) + "년&nbsp;" + rank_list[i].week.week[index-1] + "주차";
				strID = rank_list_btn[i].week.right;
				document.getElementById(strID).innerHTML = strRightPre1 + i + "," + 2 + ", " + false + strRightPre2 + strID + strRightMid + strID + strRightPost + strTitle + strRightEnd;
			}
		}
	
	}
	else {
		var strLeft = '<img src="images/rank_bullet/left_arrow_x.png" width="16" height="15" border="0" alt="이전" title="" />';
		var strRight = '<img src="images/rank_bullet/right_arrow_x.png" width="16" height="15" border="0" alt="다음" title="" />';
		
		if (isIE7 == true) { strLeft += "&nbsp;"; }
		
		for (var i=1; i<rank_list_btn.length; i++) {
			document.getElementById(rank_list_btn[i].top.left).innerHTML = strLeft;
			document.getElementById(rank_list_btn[i].month.left).innerHTML = strLeft;
			document.getElementById(rank_list_btn[i].week.left).innerHTML = strLeft;
	
			document.getElementById(rank_list_btn[i].top.right).innerHTML = strRight;
			document.getElementById(rank_list_btn[i].month.right).innerHTML = strRight;
			document.getElementById(rank_list_btn[i].week.right).innerHTML = strRight;
		}
	}
}

function getRankTotal() {

	rank_request = getXmlHttpObject();
	
	if (rank_request == null){
		alert ("Your browser does not support AJAX!");
  		return;
	}

	enableControl(false);

	var url = g_url;

	url += ("?sid=" + (new Date()).getTime()); // 캐시방지코드!
	
	rank_request.onreadystatechange = stateChanged;
	rank_request.open("GET", url, true);
	rank_request.send(null);
	
	limited_delay_time = setTimeout(function() {
							limited_delay_time = undefined;
							rank_request.abort();
							var str = "<div class='warning'>데이타 불러오기가 실패했습니다!<br />Error : time over</div>";
							setAjaxMessage(str);
							
							enableControl(true);
						},
						1000 * 20); // 20초간 기다린다
	
}

function stateChanged() {

	if (rank_request.readyState == 4) {
		
		if (limited_delay_time != undefined) {
			clearTimeout(limited_delay_time);
			limited_delay_time = undefined;
		}
		
		if (rank_request.status == 200) {
			makeRankTable();
			
			enableControl(true);
		}
		else {
			var str = "<div class='warning'>데이타 불러오기가 실패했습니다!<br />Error : " + rank_request.status + " " + rank_request.statusText + "</div>";
			setAjaxMessage(str);
			
			enableControl(true);
		}
	}
	else {
		var str = '<img src="images/ajax-loader.gif" />';

		setAjaxMessage(str);
	}
}

function setRankList(ranklist, game_style, rank_type ) {
		
	var now = new Date();
	var today = now.getTime();
		
	var num = ranklist.length;
	
	var id = "";
	
	switch(rank_type) {
		case 0: newdays = 7; id = rank_list_id[game_style].top; break;
		case 1: newdays = 3; id = rank_list_id[game_style].month; break;
		case 2: newdays = 1; id = rank_list_id[game_style].week; break;
	}
	
	var str = "";

	for (var i=0; i<10; i++) {
		
		if (i>=num) {
			str += '<a class="rank-item"><span class="rank-name">&nbsp;</span></a> ';
				
			// <a title="aaaa1" class="rank-item"><span class = "rank-no-6">&nbsp;</span><span class="rank-name">롤링</span><span class="rank-msg">&nbsp;</span></a> 

		}
		else {
		
			//  랭킹500 데이타 중 비어있는 원소들이 존재한다.
			if (ranklist[i].score == 0) {
				str += '<a class="rank-item"><span class="rank-name">&nbsp;</span></a> ';
				continue;
			}
			
			var top_rank_img = 0;
			
			if (rank_type == 0) {
				top_rank_img = rank_list[game_style].top.index * 10;
			}
		
			var rank_image = "images/rank_bullet/rank_bullet_" + (i + 1 + top_rank_img) + ".gif";
			
			// 테리팡에서 사용하는 이름, 코멘트 문자열을 html로 제대로 표시되게 한다.
			var name = setHtmlString(ranklist[i].name);
				
			now.setTime(ranklist[i].w_time * 1000);

			var tooltip = name + "&nbsp;" + ranklist[i].score + "점&nbsp;" + getDateString(now);				
						
			str += '<a title=' + tooltip + ' class="rank-item"><span style="width:15px; letter-spacing:5px; background:url(' + rank_image + ') no-repeat 0; " >&nbsp;&nbsp;</span><span class="rank-name">' + 
					name + '</span>'; 
				
			var newdays_title = "";

			switch(newdays) {
				case 1: newdays_title = "24시간이내&nbsp;랭크된&nbsp;플레이어"; break;
				case 3: newdays_title = "3일이내&nbsp;랭크된&nbsp;플레이어"; break;
				case 7: newdays_title = "일주일이내&nbsp;랭크된&nbsp;플레이어"; break;
				default: newdays_title = "24시간이내&nbsp;랭크된&nbsp;플레이어"; break;
			}

			if ((today - now.getTime()) <= 86400000 * newdays) {
				str += '<span class="rank-msg">&nbsp;<img src="images/rank_bullet/new_bullet.gif" title=' + newdays_title + ' /></span></a>';
			}
			else {
				str += "</a>";
			}
		}
	}

	document.getElementById(id).innerHTML = str;
	
}



var rank_list = new Array(10);

function makeRankTable() {


	var result = rank_request.responseText;

	var start_index = result.indexOf("no"); // 성공이라면 no 필드가 존재한다!
	
 	if (start_index != -1) {
	
		var str = "";
		
		var myrank = eval( '(' + result + ')');
	
		for (var i=1; i<myrank.list_start_pos.length; i++) {

			////////////////////////////////////////////////////
			// Top Players 500
			////////////////////////////////////////////////////

			var total_count = 500 - myrank.list_start_pos[i][0]; // top players 500 전체 개수

			var count = Math.min(total_count, 50); // 50위 까지만 리스트 한다!

			var limit = Math.ceil(count/10);

			var start = new Array(limit);

			var end = new Array(limit);

			for (var n=0; n<limit; n++) {

				start[n] = n * 10 + 1;
				end[n] = (n + 1) * 10;
			}
			
			var t = {index:0, limit:limit, start:start, end:end };

			////////////////////////////////////////////////////
			//  월간 랭킹
			////////////////////////////////////////////////////
			
			limit = 12; // 12개월 즉, 1년치 정보
			
			var year = new Array(limit);
			var month = new Array(limit);

			var y = myrank.month_year[i];
			var m = myrank.month_now[i];
			
			year[0] = y;
			month[0] = m;
			
			var start_pos = myrank.list_start_pos[i][1] * 100 + myrank.list_start_pos[i][2];
			
			for (var n=1; n<limit; n++) {
				
				m--;
				
				if (m<1) {
					m = 12;
					y--;
				}
				
				year[n] = y;
				month[n] = m;
				
				var val = y * 100 + m;

				if (start_pos > val) {
					limit = n;
					break;
				}
			}

			var m = {index:0, limit:limit, year:year, month:month };
			
			////////////////////////////////////////////////////
			//  주간 랭킹
			////////////////////////////////////////////////////
			
			limit = 30; // 30주, 약 7개월치 정보
			
			var year = new Array(limit);
			var week = new Array(limit);

			var y = myrank.week_year[i];
			var w = myrank.week_now[i];
			
			year[0] = y;
			week[0] = w;
			
			var start_pos = myrank.list_start_pos[i][3] * 100 + myrank.list_start_pos[i][4];
			
			for (var n=1; n<limit; n++) {
				
				w--;
				
				if (w<1) {
					y--;
					w = getWeekCount( 2000 + y );
				}
				
				year[n] = y;
				week[n] = w;
				
				var val = y * 100 + w;

				if (start_pos > val) {
					limit = n;
					break;
				}
			}
			
			var w = {index:0, limit:limit, year:year, week:week };
			
			rank_list[i] = {top:t, month:m, week:w};
		}

		for (var i=1; i<g_game_count; i++) {
	
			var str = (parseInt(myrank.month_year[i],10) + 2000) + "년&nbsp;" + myrank.month_now[i] + "월&nbsp;순위";
			
			var str_link = "flash_game.html?game_style=" + i + "&game_page=0&rank_type=1&start_index=" + 0 + "&start_year=" + myrank.month_year[i] + "&start_pos=" + myrank.month_now[i];
			
			document.getElementById(rank_month_title_id[i]).innerHTML = '<a href="' + str_link + '"><span title="' + str + ' 자세히 보기" style="Cursor:Pointer;">' + str + '</span></a>';
			
			str_link = "flash_game.html?game_style=" + i + "&game_page=0&rank_type=2&start_index=" + 0 + "&start_year=" + myrank.week_year[i] + "&start_pos=" + myrank.week_now[i];
			
			document.getElementById(rank_week_title_id[i]).innerHTML = '<a href="' + str_link + '">' + getWeekTitle(myrank.week_year[i], myrank.week_now[i]) + '</a>';
		}
		
		// 사천성 Top Players 500
		setRankList(myrank.rank_top_mahjong, 3, 0);
		
		// 사천성 월간 랭킹
		setRankList(myrank.rank_month_mahjong, 3, 1);

		// 사천성 주간 랭킹
		setRankList(myrank.rank_week_mahjong, 3, 2);
		
		
		// 벽돌깨기 Top Players 500
		setRankList(myrank.rank_top_tball, 2, 0);

		// 벽돌깨기 월간 랭킹
		setRankList(myrank.rank_month_tball, 2, 1);
		
		// 벽돌깨기 주간 랭킹
		setRankList(myrank.rank_week_tball, 2, 2);


		// 테트리스 Top Players 500
		setRankList(myrank.rank_top_tetris, 1, 0);
		
		// 테트리스 월간 랭킹
		setRankList(myrank.rank_month_tetris, 1, 1);
				
		// 테트리스 주간 랭킹
		setRankList(myrank.rank_week_tetris, 1, 2);

	}
	else { // 에러처리
		var find_start = result.indexOf("query_result=");
		if (find_start != -1) {

			if (result.indexOf("data_error", find_start) != -1) {
				var str = "<div class='warning'>올바른 매개변수가 아닙니다!<br />Error : arguments error</div>";

				setAjaxMessage(str);
			}
			if (result.indexOf("db_error", find_start) != -1) {
				var str = "<div class='warning'>데이타베이스 엑세스에 실패했습니다!<br />Error : database error</div>";

				setAjaxMessage(str);
			}
		}
	}
	
}

function setAjaxMessage(str) {

	document.getElementById("mahjong_rank_top").innerHTML = str;
	document.getElementById("mahjong_rank_month").innerHTML = str;
	document.getElementById("mahjong_rank_week").innerHTML = str;

	document.getElementById("tball_rank_top").innerHTML = str;
	document.getElementById("tball_rank_month").innerHTML = str;
	document.getElementById("tball_rank_week").innerHTML = str;

	document.getElementById("tetris_rank_top").innerHTML = str;
	document.getElementById("tetris_rank_month").innerHTML = str;
	document.getElementById("tetris_rank_week").innerHTML = str;
}



///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 개별 랭크 불러오기
///////////////////////////////////////////////////////////////////////////////////////////////////////////////

var g_rank_url = "server_script/load_rank_page.php";
var g_game_style = 1;
var g_rank_type = 0;

function clickListBtn(game_style, rank_type, isLeft) {

	// 여기서 Ajax 전송한다!

	var type_index = 0;
	var value1 = 0;
	var value2 = 0;
	
	// Top Players 500
	if (rank_type == 0) {
		if (isLeft==true) {
			rank_list[game_style].top.index++;
			
			if (rank_list[game_style].top.index >= rank_list[game_style].top.limit) rank_list[game_style].top.index = rank_list[game_style].top.limit - 1;
		}
		else {
			rank_list[game_style].top.index--;
			
			if (rank_list[game_style].top.index < 0) rank_list[game_style].top.index = 0;	
		}
		
		type_index = rank_list[game_style].top.index;
		
		value1 = rank_list[game_style].top.start[rank_list[game_style].top.index];
		value2 = rank_list[game_style].top.end[rank_list[game_style].top.index];
	}
	
	// 월간 랭킹
	if (rank_type == 1) {
		if (isLeft==true) {
			rank_list[game_style].month.index++;
			
			if (rank_list[game_style].month.index >= rank_list[game_style].month.limit) rank_list[game_style].month.index = rank_list[game_style].month.limit - 1;
		}
		else {
			rank_list[game_style].month.index--;

			if (rank_list[game_style].month.index < 0) rank_list[game_style].month.index = 0;	
		}

		type_index = rank_list[game_style].month.index;

		value1 = rank_list[game_style].month.year[rank_list[game_style].month.index];
		value2 = rank_list[game_style].month.month[rank_list[game_style].month.index];
	}
	
	// 주간 랭킹
	if (rank_type == 2) {
		if (isLeft==true) {
			rank_list[game_style].week.index++;

			if (rank_list[game_style].week.index >= rank_list[game_style].week.limit) rank_list[game_style].week.index = rank_list[game_style].week.limit - 1;
		}
		else {
			rank_list[game_style].week.index--;

			if (rank_list[game_style].week.index < 0) rank_list[game_style].week.index = 0;	
		}
		
		type_index = rank_list[game_style].week.index;
		
		value1 = rank_list[game_style].week.year[rank_list[game_style].week.index];
		value2 = rank_list[game_style].week.week[rank_list[game_style].week.index];
	}	
		
	getRankList(game_style, rank_type, type_index, value1, value2);
}

function getRankList(game_style, rank_type, type_index, value1, value2) {

	rank_request = getXmlHttpObject();
	
	if (rank_request == null){
		alert ("Your browser does not support AJAX!");
  		return;
	}

	enableControl(false);

	g_game_style = game_style;
	g_rank_type = rank_type;
	
	var page_index = 0;
	if (rank_type == 0) page_index = type_index;

	var url = g_rank_url;

	url += ("?game_style=" + game_style);
	url += ("&rank_type=" + rank_type);
	url += ("&type_index=" + type_index);
	url += ("&page_index=" + page_index);
	url += ("&page_count=10");
	url += ("&value1=" + value1);
	url += ("&value2=" + value2);
	url += ("&sid=" + (new Date()).getTime()); // 캐시방지코드!
	
	rank_request.onreadystatechange = stateChangedList;
	rank_request.open("GET", url, true);
	rank_request.send(null);

	limited_delay_time = setTimeout(function() {
							limited_delay_time = undefined;
							rank_request.abort();
							var str = "<div class='warning'>데이타 불러오기가 실패했습니다!<br />Error : time over</div>";

							showAjaxError(str);
							
							enableControl(true);
						},
						1000 * 20); // 20초간 기다린다
	
}

function stateChangedList() {

	if (rank_request.readyState == 4) {
		
		if (limited_delay_time != undefined) {
			clearTimeout(limited_delay_time);
			limited_delay_time = undefined;
		}
		
		if (rank_request.status == 200) {

			 makeRankPage();
			
			enableControl(true);
		}
		else {
			var str = "<div class='warning'>데이타 불러오기가 실패했습니다!<br />Error : " + rank_request.status + " " + rank_request.statusText + "</div>";
			showAjaxError(str);
			
			enableControl(true);
		}
	}
	else {
		var str = '<br /><br /><span align="center">&nbsp;&nbsp;&nbsp;&nbsp;<img src="images/ajax-loader.gif" /></span><br /><br />';

		showAjaxError(str);
	}
}


function makeRankPage() {

	var result = rank_request.responseText;
	
	var start_index = result.indexOf("game_style"); // 성공이라면 game_style 필드가 존재한다!

 	if (start_index != -1) {

		var str = "";
		
		var myrank = eval( '(' + result + ')');

		var game_style = parseInt(myrank.game_style,10);
		var rank_type = parseInt(myrank.rank_type,10);
		var type_index = parseInt(myrank.type_index,10);
		
		var value1 = parseInt(myrank.value1,10);
		var value2 = parseInt(myrank.value2,10);
		
		////////////////////////////////////////////////////
		// Top Players 500
		////////////////////////////////////////////////////

		if (rank_type == 0) {
			rank_list[game_style].top.index = type_index;
		}
		
		////////////////////////////////////////////////////
		//  월간 랭킹
		////////////////////////////////////////////////////

		if (rank_type == 1) {
			
			rank_list[game_style].month.index = type_index;
			
			var str = (parseInt(value1,10) + 2000) + "년&nbsp;" + value2 + "월&nbsp;순위";				
				
			var str_link = "flash_game.html?game_style=" + game_style + "&game_page=0&rank_type=1&start_index=" + type_index + "&start_year=" + value1 + "&start_pos=" + value2;
			
			document.getElementById(rank_month_title_id[game_style]).innerHTML = '<a href="' + str_link + '"><span title="' + str + ' 자세히 보기" style="cursor:pointer;">' + str + '</span></a>';
		}
		
		////////////////////////////////////////////////////
		//  주간 랭킹
		////////////////////////////////////////////////////

		if (rank_type == 2) {
			
			rank_list[game_style].week.index = type_index;	
			
			var str_link = "flash_game.html?game_style=" + game_style + "&game_page=0&rank_type=2&start_index=" + type_index + "&start_year=" + value1 + "&start_pos=" + value2;
			
			document.getElementById(rank_week_title_id[game_style]).innerHTML = '<a href="' + str_link + '">' + getWeekTitle(value1, value2) + '</a>';
		}		
			
		setRankList(myrank.array_list , game_style, rank_type);

	}
	else { // 에러처리
		
		var find_start = result.indexOf("query_result=");
		if (find_start != -1) {

			if (result.indexOf("data_error", find_start) != -1) {
				var str = "<div class='warning'>올바른 매개변수가 아닙니다!<br />Error : arguments error</div>";

				showAjaxError(str);
			}
			if (result.indexOf("db_error", find_start) != -1) {
				var str = "<div class='warning'>데이타베이스 엑세스에 실패했습니다!<br />Error : database error</div>";

				showAjaxError(str);
			}
		}
	}
}

function showAjaxError(str) {

	var strID = "";

	switch (g_rank_type) {
		
		case 0: strID = rank_list_id[g_game_style].top; break;
		case 1: strID = rank_list_id[g_game_style].month; break;
		case 2: strID = rank_list_id[g_game_style].week; break;
	}

	document.getElementById(strID).innerHTML = str;
}
