/*
Tetris Game by Xie Yong (nsxy@163.net)
Modifications by DynamicDrive.com for interface enhancements
For this script, visit http://www.dynamicdrive.com
DynamicDrive.comのシンプルテトリスに、連続遊戯及び、ハイスコア機能、
得点表示位置変更などを加えた改造テトリスです。
付属のハイスコアＣＧＩと連動することで、得点が記録できます。
SupportBrowser IE,NN7.0,Opera7.0,Safari,Mozilla
MacIE,Opera6.x,NN4.xはサポートされていません
Modifications by This is it!
*/

/* ハイスコアＣＧＩを使用しない場合は0にしてください */
var witc=1;

/* ハイスコアＣＧＩのURLまたはパスを記入してください */
var url = "./highscore.cgi";

/* これ以下はハイスコアを記録させない */
var low_score = 1000;

/* JavaScriptに自信のない方は下記以降いじらないでください */

var n_IncStep = 10;
var curBlcok,nextBlock;
var arr_curBlock = new Array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
var curX,curY;
var speed=1;
var maxspeed=99;
var clr_per_line=5;
var fouce=0;
var tripre=0;
var doubre=0;
var inputname;
var pause=0;
var gameover=0;
var colors = new Array("#999999","#0000FF","#80FFFF","#80FF80","#FFFF00","#FF8000","#FF00FF","#FF0000");
var cid;
var ncid;

var blocks = new Array("tt_O1","tt_T2","tt_Z1","tt_S1","tt_L1","tt_J1","tt_I2");
var bid;
var killedlines=0;
var infobar_flag = 0;

var tt_O1 = new Array(0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0);
var tt_O2 = new Array(0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0);
var tt_O3 = new Array(0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0);
var tt_O4 = new Array(0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0);

var tt_T1 = new Array(0,0,0,0,0,1,0,0,1,1,0,0,0,1,0,0);
var tt_T2 = new Array(0,0,0,0,0,0,0,0,1,1,1,0,0,1,0,0);
var tt_T3 = new Array(0,0,0,0,0,1,0,0,0,1,1,0,0,1,0,0);
var tt_T4 = new Array(0,0,0,0,0,1,0,0,1,1,1,0,0,0,0,0);

var tt_Z1 = new Array(0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0);
var tt_Z2 = new Array(0,0,0,0,0,0,1,0,0,1,1,0,0,1,0,0);
var tt_Z3 = new Array(0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0);
var tt_Z4 = new Array(0,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0);

var tt_S1 = new Array(0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0);
var tt_S2 = new Array(0,0,0,0,0,1,0,0,0,1,1,0,0,0,1,0);
var tt_S3 = new Array(0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0);
var tt_S4 = new Array(0,1,0,0,0,1,1,0,0,0,1,0,0,0,0,0);

var tt_L1 = new Array(0,1,0,0,0,1,0,0,0,1,1,0,0,0,0,0);
var tt_L2 = new Array(0,0,0,0,0,0,1,0,1,1,1,0,0,0,0,0);
var tt_L3 = new Array(0,0,0,0,0,1,1,0,0,0,1,0,0,0,1,0);
var tt_L4 = new Array(0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0);

var tt_J1 = new Array(0,0,1,0,0,0,1,0,0,1,1,0,0,0,0,0);
var tt_J2 = new Array(0,0,0,0,1,1,1,0,0,0,1,0,0,0,0,0);
var tt_J3 = new Array(0,0,0,0,0,1,1,0,0,1,0,0,0,1,0,0);
var tt_J4 = new Array(0,0,0,0,0,1,0,0,0,1,1,1,0,0,0,0);

var tt_I1 = new Array(0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0);
var tt_I2 = new Array(0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1);
var tt_I3 = new Array(0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0);
var tt_I4 = new Array(0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1);
var table = new Array(
		1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,
		1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,
		1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,
		1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,
		1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,
		1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,
		1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,
		1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,
		1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,
		1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,
		1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,
		1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,
		1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,
		1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,
		1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,
		1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,
		1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,
		1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,
		1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,
		1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,
		1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,
		1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,
                1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
		1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1);
var tmpt=table;
var offflag=0;
var startflag = 0;
function dimension2(row,col,num){
	var i = row * num + col;
	return (this[i]);
}

Array.prototype.getd = dimension2;

function ShowBlock(x,y,block_type,color){
	var cart_rows = document.getElementById("block_tbl").rows;
	for (var i=0;i<cart_rows.length;i++){
		var cart_cell = document.getElementById("block_tbl").rows[i].cells;
		for (var j=0;j<cart_cell.length;j++){		
			var d2 = i * 4 + j;
			if (block_type[d2]==1){
				document.getElementById("block_tbl").rows.item(i).cells.item(j).style.background = color;
			}
			else{
				document.getElementById("block_tbl").rows.item(i).cells.item(j).style.background = "transparent";
			}
		}
	}
	document.getElementById("block_div").style.left = x;
	document.getElementById("block_div").style.top = y;
}
function NexBlock(x_new,y_new,block_type_new,color_new){
	var obj_rows = document.getElementById("nblock_tbl").rows;
	for (var l=0;l<obj_rows.length;l++){
		var obj_cell = document.getElementById("nblock_tbl").rows[l].cells;
		var obj_row = document.getElementById("nblock_tbl").rows[l];
		for (var m=0;m<obj_cell.length;m++){
			var g2 = l * obj_cell.length + m;
			if (block_type_new[g2]==1){
				obj_row.cells.item(m).style.background = color_new;
			}
			else{
				obj_row.cells.item(m).style.background = "transparent";
			}
		}
	}
}
function new_block(x,y,block_type_new,color_new){
	var obj2_rows = document.getElementById("nblock_tbl").rows;
	var obj2_cell = document.getElementById("nblock_tbl").rows[0].cells;

	for (var i=0;i<obj2_rows.length;i++){
		document.getElementById("nblock_tbl").deleteRow(i);
		newRow2 = document.getElementById("nblock_tbl").insertRow(i);
		for (var j=0;j<obj2_cell.length;j++){
			newCell2 = newRow2.insertCell(j);
			var g2 = i * obj2_cell.length + j;
			if (block_type_new[g2]==1){
				newCell2.style.background = color_new;
				newCell2.style.width = 10;
				newCell2.style.height = 10;
			}
			else{
				newCell2.style.background="transparent";
				newCell2.style.width = 10;
				newCell2.style.height = 10;
			}
		}
	}
}
function Change(inc){
	var type = curBlock.substr(0,4);
	var num = curBlock.substr(curBlock.length-1);
	num = parseInt(num) + inc;
	if (num>4||num<1) num -= 4*inc;
	type += num;
	eval("arr_tmp = " + type + ";");
	if (CanMove(curX,curY,arr_tmp)){
		curBlock = type;
		eval("arr_curBlock = " + curBlock + ";");
		var ch_left = parseInt(document.getElementById("block_div").style.left);
		var ch_top = parseInt(document.getElementById("block_div").style.top);
		eval("ShowBlock(ch_left,ch_top," + curBlock + ",colors[" + cid + "]);");
	}
}

function CanMove(x,y,block){
	for (i=0;i<4;i++){
		for (j=0;j<4;j++){
			if (block.getd(i,j,4)&table.getd(y/n_IncStep+i,x/n_IncStep+j,16)) return false;
		}
	}
	return true;
}

function NewBlock(){
	curBlock = nextBlock;
	cid = ncid;
	bid = Math.round(Math.random()*(blocks.length-1));
	ncid = Math.round(Math.random()*(colors.length-1));
	nextBlock = blocks[bid];
	eval("arr_curBlock = " + curBlock + ";");
	eval("ShowBlock(60,20," + curBlock + ",colors[" + cid + "]);");
	if(!window.opera){
		eval("NexBlock(200,140," + nextBlock + ",colors[" + ncid + "]);");
	}
	else{
		eval("new_block(200,140," + nextBlock + ",colors[" + ncid + "]);");
	}
}

function SaveBlock(){
	for (i=0;i<4;i++){
		for (j=0;j<4;j++){
			table[(curY/n_IncStep+i)*16+curX/n_IncStep+j]|=arr_curBlock[i*4+j];
			if (arr_curBlock[i*4+j]==1){
				if ((curY/n_IncStep+i<22)&&(curX/n_IncStep+j>1)&&(curX/n_IncStep+j<14)){
			document.getElementById("table_tbl").rows.item(curY/n_IncStep+i).cells.item(curX/n_IncStep+j).style.background = colors[cid];}}
			if (table[(curY/n_IncStep+i)*16+curX/n_IncStep+j]!=1){
					document.getElementById("table_tbl").rows.item(curY/n_IncStep+i).cells.item(curX/n_IncStep+j).style.background = "black";}
		}
	}
}

function DelLine(line){
	for(i=line;i>0;i--){
		for(j=2;j<14;j++){
			table[i*16+j]=table[(i-1)*16+j];
		}
	}
	document.getElementById("table_tbl").deleteRow(line);
	newRow = document.getElementById("table_tbl").insertRow(0);
	newRow.style.background="black";
	for (i=0;i<16;i++){
		newCell = newRow.insertCell(i);
		if (i<2||i>13) {
			newCell.style.background="orange";
			newCell.style.width = 10;
			newCell.style.height = 10;
		}
		else{
			newCell.style.background="black";
			newCell.style.width = 10;
			newCell.style.height = 10;
		}
	}
	killedlines++;
	document.getElementById("cll").innerHTML=parseInt(document.getElementById("cll").innerHTML)+1;
}

function DelLines(){
	var c,d,i,j;
	d=0;
	curY=parseInt(document.getElementById("block_div").style.top);
	for(i=((curY/10)+3);i>((curY/10)-1);i--){
		c=0;
		for(j=2;j<14;j++){
			if (isNaN(table[i*16+j])||i==22) break;
			c+=table[i*16+j];
		}
		if(c==12){
			DelLine(i);
			i++;
			d++;
		}
	}
	if (d>0){
		if(d==4) { fouce++;}
		if(d==3) { tripre++;}
		if(d==2) { doubre++;}
		document.getElementById("sco").innerHTML=parseInt(document.getElementById("sco").innerHTML)+d*d*36*10;
		document.getElementById("fop").innerHTML=fouce;
		document.getElementById("trp").innerHTML=tripre;
		document.getElementById("dop").innerHTML=doubre;
	}
}

function Lucifer(){
	for(var i=2;i<14;i++){
		if (table[48+i]==1) return true;
	}
	return false;
}

function GameOver(){
	gameover=1;
	clearInterval(gameInterval);
	document.getElementById("infobar2_div").innerHTML = "Game Over";
	startflag = 0;
	var scor= parseInt(document.getElementById("sco").innerHTML);
	if(witc==1 && (scor > low_score)) {
	flag=confirm("スコアを記録しますか？");
	if(flag){
		inputname=prompt("名前を入力してね♪","");
		inputcheck();
		if(document.all) { trash_delete();}
		register();
		document.charset='shift_jis';
		document.regscore.submit();
		//initreg();
	}
	else{
		retable();
	}
	}
	else{
		retable();
	}
}
function trash_delete(){
	inputname = escape(inputname);
	pos = inputname.indexOf("%00");
	if(pos != -1){
		inputname = inputname.substr(0,pos);
	}
	inputname = unescape(inputname); 

}
function inputcheck(){
	while(!inputname){
		inputname = prompt("名前を入力してね♪","");
	}
}

function getKEYCODE(e){  
	if(document.all)  return  event.keyCode
	else if(document.getElementById) {
            return (e.keyCode!=0)?e.keyCode:e.charCode
	}
	else { alert("キーコードが取得できません");}
}
function document_onkeydown(e) {
	if (gameover==1) return;
	curX = parseInt(document.getElementById("block_div").style.left);
	curY = parseInt(document.getElementById("block_div").style.top);
	switch (getKEYCODE(e)){
		case 106:
			if (CanMove(curX-n_IncStep,curY,arr_curBlock)){
				var new_106 = parseInt(document.getElementById("block_div").style.left) - n_IncStep;
				document.getElementById("block_div").style.left = new_106;
			}
			break;
		case 105:
			Change(1);
			break;
		case 108:
			if (CanMove(curX+n_IncStep,curY,arr_curBlock)){
				var new_108 = parseInt(document.getElementById("block_div").style.left) + n_IncStep;
				document.getElementById("block_div").style.left = new_108;
			}
			break;
		case 107:
			if (CanMove(curX,curY+n_IncStep,arr_curBlock)){
				var new_107 = parseInt(document.getElementById("block_div").style.top) + n_IncStep;
				document.getElementById("block_div").style.top = new_107;
			}
			else{
				SaveBlock();
				document.regscore.fake.value="";
				DelLines();
				if (Lucifer()){
					GameOver();
					break;
					return;
				}
				document.getElementById("sco").innerHTML=parseInt(document.getElementById("sco").innerHTML)+20;
				NewBlock();
			}
			break;
		/* case 32:
			if (pause==0){
				clearInterval(gameInterval);
				pause=1;
			}
			else{
				gameInterval=window.setInterval("Handle_Interval()",500-(speed*4));
				pause=0;
			}
			break;
		*/
		case 90:		
			Change(1);
			break;
		case 88:	
			Change(-1);
			break;
		default:

	}
}

function Handle_Interval(){
	curX = parseInt(document.getElementById("block_div").style.left);
	curY = parseInt(document.getElementById("block_div").style.top);
	if(infobar_flag>0){
		infobar_flag++;
	}
	if(infobar_flag>10){
		document.getElementById("infobar2_div").innerHTML = "";
		infobar_flag = 0;
	}
	document.regscore.fake.focus();
	if (CanMove(curX,curY+n_IncStep,arr_curBlock)){
		var new_x = parseInt(document.getElementById("block_div").style.top) + n_IncStep;
		document.getElementById("block_div").style.top = new_x;
	}
	else{
		SaveBlock();
		document.regscore.fake.value="";
		DelLines();
		if (Lucifer()){
			GameOver();
			return;
		}
		document.getElementById("sco").innerHTML=parseInt(document.getElementById("sco").innerHTML)+20;
		NewBlock();
	}
	if (killedlines>=clr_per_line){
		killedlines-=clr_per_line;
		if (speed<maxspeed){
			speed++;
			document.getElementById("infobar2_div").innerHTML = "Level UP";
			infobar_flag = 1;
		}
		else{
			speed=maxspeed;
		}
		document.getElementById("spd").innerHTML=speed;
		clearInterval(gameInterval);
		gameInterval=setInterval("Handle_Interval()",500-(speed*4));
	}
}
function retable() {
if (document.getElementById){
	var htmlstr="<table id=table_tbl border=0 cellspacing=0 cellpadding=0>";
	document.getElementById("retable").innerHTML="";
	for (var i=0;i<22;i++){
		for (var j=2;j<14;j++){
		var d2 = i * 16 + j;
		table[d2]= 0;}
	}
	for (var i=0;i<24;i++){
		htmlstr +="<tr>";
		for (var j=0;j<16;j++){
			var d2 = i * 16 + j;
			if (table[d2]==1)
			htmlstr +="<td style=\"background:orange;height:10;width:10;\"></td>"
;
			else
			htmlstr +="<td style=\"background:black;height:10;width:10;\"></td>";
		}
		htmlstr +="</tr>";
	}
	document.getElementById("retable").innerHTML= htmlstr +"</table>";
	ncid = Math.round(Math.random()*(colors.length-1));
	bid = Math.round(Math.random()*(blocks.length-1));
	nextBlock = blocks[bid];
	NewBlock();
}
}


