#include "./SceneCommon.txt"

let CONFIG = "CONFIG";
let CNF_NAME = "CNF_NAME";

@Initialize
{
	SetAutoDeleteObject(true);
	LoadReplayList();
	
	T_Background_2(0,0,100);
	T_Black;
	ascent(j in -3..4)
	{
		ascent(i in -3..4)
		{
			T_Background(i*0.5,j*0.5,5);
		}
	}
	
	T_Title();
	T_ReplayIndexSelection();
}

@MainLoop
{
	yield;
}

@Finalize
{
}

let MENU_INDEX_SELECTION = 1;
let MENU_NAME_ENTRY = 2;
let menuMode = MENU_INDEX_SELECTION;

task T_Title
{
	let objText = CreateTextObject(14,14,24,"vCۑI");
}

task T_ReplayIndexSelection()
{
	let cursorY = 0;
	let page = 0;
	let countMaxItem = REPLAY_INDEX_DIGIT_MAX - REPLAY_INDEX_DIGIT_MIN + 1;
	let countItemPerPage = 16;
	let pageMax = trunc((countMaxItem - 1) / countItemPerPage);
	pageMax = max(pageMax,1);
	let lastPageMaxCursorY = trunc(countMaxItem / countItemPerPage);
	
	task TMenuItem(let itemY)
	{
		let objText = CreateTextObject(14,13+39 + 25 * itemY,18,"");
		let oldPage = -1;
		while(menuMode == MENU_INDEX_SELECTION)
		{
			if(page != oldPage)
			{
				let index = page * countItemPerPage + itemY + 1;
				let text = "";
				if(IsValidReplayIndex(index))
				{
					text = rtos("000",GetReplayInfo(index,REPLAY_COMMENT)) ~ " ";
					text = text ~ vtos("-8s",GetReplayInfo(index,REPLAY_USER_NAME)) ~ " ";
					text = text ~ rtos("0000000000000",GetReplayInfo(index,REPLAY_TOTAL_SCORE)) ~ " ";
					text = text ~ vtos("-8s",GetReplayInfo(index,REPLAY_PLAYER_NAME)) ~ " ";
					text = text ~ vtos("03.2f",GetReplayInfo(index,REPLAY_FPS_AVERAGE)) ~ "fps ";
					text = text ~ GetReplayInfo(index,REPLAY_DATE_TIME) ~ " ";
				}
				else
				{
					text = text ~ "No Data";
				}
				ObjText_SetText(objText,text);
				oldPage = page;
			}
			
			if(page == pageMax && itemY >= lastPageMaxCursorY)
			{
				Obj_SetVisible(objText,false);
			}
			else
			{
				Obj_SetVisible(objText,true);
			}
			if(cursorY == itemY)
			{
//				ObjText_SetFontBorderType(objText,BORDER_FULL);
				ObjRender_SetColor(objText,255,255,255);
				ObjText_SetFontSize(objText,18);
			}
			else
			{
//				ObjText_SetFontBorderType(objText,BORDER_NONE);
				ObjRender_SetColor(objText,150,150,150);
				ObjText_SetFontSize(objText,16);
			}
			yield;
		}
		Obj_Delete(objText);
	}
	
	ascent(let iItem in 0 .. countItemPerPage)
	{
		TMenuItem(iItem);
	}
	
	// L[ԂZbg܂őҋ@
	while(GetVirtualKeyState(VK_OK) != KEY_FREE){	yield;	}
	
	// L[
	let frameKeyHold = 0;	// L[ςȂt[
	PageDraw;
	
	while(menuMode == MENU_INDEX_SELECTION)
	{
		//
		if(GetVirtualKeyState(VK_OK) == KEY_PULL)
		{
			menuMode = MENU_NAME_ENTRY;
			let index = page * countItemPerPage + cursorY + 1;
			TNameEntry(index);
			break;
		}
		//J[\ړ
		if(GetVirtualKeyState(VK_UP) == KEY_PUSH || GetVirtualKeyState(VK_UP) == KEY_HOLD)
		{
			frameKeyHold++;
			if(GetVirtualKeyState(VK_UP) == KEY_PUSH ||
				frameKeyHold == 20 ||
				 (frameKeyHold > 20 && (frameKeyHold % 8 == 0)))
			{
				cursorY--;
			}
		}
		else if(GetVirtualKeyState(VK_DOWN) == KEY_PUSH || GetVirtualKeyState(VK_DOWN) == KEY_HOLD)
		{
			frameKeyHold++;
			if(GetVirtualKeyState(VK_DOWN) == KEY_PUSH ||
				frameKeyHold == 20 ||
				 (frameKeyHold > 20 && (frameKeyHold % 8 == 0)))
			{
				cursorY++;
			}
		}
		else if(GetVirtualKeyState(VK_LEFT) == KEY_PUSH || GetVirtualKeyState(VK_LEFT) == KEY_HOLD)
		{
			frameKeyHold++;
			if(GetVirtualKeyState(VK_LEFT) == KEY_PUSH ||
				frameKeyHold == 20 ||
				 (frameKeyHold > 20 && (frameKeyHold % 8 == 0)))
			{
				page--;
			}
		}
		else if(GetVirtualKeyState(VK_RIGHT) == KEY_PUSH || GetVirtualKeyState(VK_RIGHT) == KEY_HOLD)
		{
			frameKeyHold++;
			if(GetVirtualKeyState(VK_RIGHT) == KEY_PUSH ||
				frameKeyHold == 20 ||
				 (frameKeyHold > 20 && (frameKeyHold % 8 == 0)))
			{
				page++;
			}
		}
		else
		{
			frameKeyHold = 0;
		}
		
		if(page < 0)
		{
			page = pageMax;
		}
		else if(page > pageMax)
		{
			page = 0;
		}
		
		if(page != pageMax)
		{
			if(cursorY < 0)
			{
				cursorY = countItemPerPage - 1;
			}
			else if(cursorY >= countItemPerPage)
			{
				cursorY = 0;
			}
		}
		else
		{
			if(cursorY < 0)
			{
				cursorY = lastPageMaxCursorY - 1;
			}
			else if(cursorY >= lastPageMaxCursorY)
			{
				cursorY = 0;
			}
		}
		
		yield;
	}
	
	task PageDraw
	{
		let objText = CreateTextObject(480,14,24,"Page@"~"1 / "~IntToString(pageMax+1));
		loop
		{
			ObjText_SetText(objText,"Page@"~IntToString(page+1)~" / "~IntToString(pageMax+1));
		yield;
		}
	}
}

task TNameEntry(let replayIndex)
{
	let strTextIn = 
	[
		["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P"],
		["Q","R","S","T","U","V","W","X","Y","Z",".",",",":",";","_","@"],
		["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p"],
		["q","r","s","t","u","v","w","x","y","z","+","-","/","*","=","%"],
		["0","1","2","3","4","5","6","7","8","9","0","!","?","'","\"","$"],
		["(",")","{","}","[","]","<",">","&","#","|","~","^"," "," ","I"]
	];
	
	let strTextView = 
	[
		["`","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o"],
		["p","q","r","s","t","u","v","w","x","y","D","C","F","G","Q",""],
		["","","","","","","","","","","","","","","",""],
		["","","","","","","","","","","{","|","^","","",""],
		["O","P","Q","R","S","T","U","V","W","X","O","I","H","f","h",""],
		["i","j","o","p","m","n","","","","","b","`","O"," "," ","I"]
	];
	
	let cursorX = 0;
	let cursorY = 0;
	let maxCursorX = length(strTextIn[0]);
	let maxCursorY = length(strTextIn);
	
	task TMenuItem(let itemX,let itemY)
	{
		let objText = CreateTextObject(120 + itemX * 24,200 + itemY * 24,22,strTextView[itemY][itemX]);
		
		while(menuMode == MENU_NAME_ENTRY)
		{
			if(itemX == cursorX && itemY == cursorY)
			{
//				ObjText_SetFontBorderType(objText,BORDER_FULL);
				ObjRender_SetColor(objText,255,255,255);
			}
			else
			{
//				ObjText_SetFontBorderType(objText,BORDER_NONE);
				ObjRender_SetColor(objText,150,150,150);
			}
			yield;
		}
		Obj_Delete(objText);
	}
	
	ascent(let iY in 0..maxCursorY)
	{
		ascent(let iX in 0 .. maxCursorX)
		{
			TMenuItem(iX, iY);
		}
	}
	
	// L[ԂZbg܂őҋ@
	while(GetVirtualKeyState(VK_OK) != KEY_FREE){	yield;	}
	
	// ͍ςݕ
	let userName = GetAreaCommonData(CONFIG,CNF_NAME,"");	//TODO
	let objName = CreateTextObject(160,96,28,"");
	let CursorAngle = 90;
	
	task TNameCursor()
	{
		let objCursor = CreateTextObject(0,96,28,"_");
		while(menuMode == MENU_NAME_ENTRY)
		{
			let nameLength = length(userName);
			ObjRender_SetX(objCursor,160 + nameLength * 15);
			Obj_SetVisible(objCursor,nameLength < 8);
			ObjRender_SetAlpha(objCursor,200+55*cos(CursorAngle));
			CursorAngle += 2;
			yield;
		}
		Obj_Delete(objCursor);
	}
	TNameCursor;
	
	// L[
	let frameKeyHold = 0;	// L[ςȂt[
	
	while(menuMode == MENU_NAME_ENTRY)
	{
		if(GetVirtualKeyState(VK_OK) == KEY_PULL)
		{
			// 
			let nameLength = length(userName);
			if(cursorX == maxCursorX-1 && cursorY == maxCursorY-1)
			{
				// IL[
				if(nameLength == 0)
				{
					userName = "No Name";
				}
				else
				{
					let ID=IntToString(GetCommonData("SpellCardID",0));
					SetAreaCommonData(CONFIG,CNF_NAME,userName);
					SetReplayInfo(REPLAY_COMMENT,ID);
					SaveReplay(replayIndex, userName);
					SetScriptResult(RESULT_END);
					CloseScript(GetOwnScriptID());
					return;
				}
			}
			else if(nameLength < 8)
			{
				userName = userName ~ strTextIn[cursorY][cursorX];
			}
		}
		if(GetVirtualKeyState(VK_CANCEL) == KEY_PULL)
		{
			// LZ
			let nameLength = length(userName);
			if(nameLength > 0)
			{
				userName = userName[0..nameLength-1];
			}
		}
		ObjText_SetText(objName, userName);
		
		// J[\ړ
		if(GetVirtualKeyState(VK_UP) == KEY_PUSH || GetVirtualKeyState(VK_UP) == KEY_HOLD)
		{
			frameKeyHold++;
			if(GetVirtualKeyState(VK_UP) == KEY_PUSH ||
				frameKeyHold == 20 ||
				 (frameKeyHold > 20 && (frameKeyHold % 10 == 0)))
			{
				cursorY--;
			}
		}
		else if(GetVirtualKeyState(VK_DOWN) == KEY_PUSH || GetVirtualKeyState(VK_DOWN) == KEY_HOLD)
		{
			frameKeyHold++;
			if(GetVirtualKeyState(VK_DOWN) == KEY_PUSH ||
				frameKeyHold == 20 ||
				 (frameKeyHold > 20 && (frameKeyHold % 10 == 0)))
			{
				cursorY++;
			}
		}
		else if(GetVirtualKeyState(VK_LEFT) == KEY_PUSH || GetVirtualKeyState(VK_LEFT) == KEY_HOLD)
		{
			frameKeyHold++;
			if(GetVirtualKeyState(VK_LEFT) == KEY_PUSH ||
				frameKeyHold == 20 ||
				 (frameKeyHold > 20 && (frameKeyHold % 10 == 0)))
			{
				cursorX--;
			}
		}
		else if(GetVirtualKeyState(VK_RIGHT) == KEY_PUSH || GetVirtualKeyState(VK_RIGHT) == KEY_HOLD)
		{
			frameKeyHold++;
			if(GetVirtualKeyState(VK_RIGHT) == KEY_PUSH ||
				frameKeyHold == 20 ||
				 (frameKeyHold > 20 && (frameKeyHold % 10 == 0)))
			{
				cursorX++;
			}
		}
		else
		{
			frameKeyHold = 0;
		}
		
		if(cursorX < 0)
		{
			cursorX = maxCursorX - 1;
		}
		else if(cursorX >= maxCursorX)
		{
			cursorX = 0;
		}
		
		if(cursorY < 0)
		{
			cursorY = maxCursorY - 1;
		}
		else if(cursorY >= maxCursorY)
		{
			cursorY = 0;
		}
		
		yield;
	}
}
