/**
 * © All rights reserved • Tous droits réservés • Zyros (www.zyros.ca)
 * You aren't allowed to use, copy or modify this script.
 * 
 * www.zyros.ca
 * 
 * -Web Design, Web Hosting, Software Engineering, Internet Marketing
 * -Design Web, Hébergement, Conception logicielle et de sites, Marketing Internet
 */
var ListPlayers = new Array();
ListPlayers[0] = new Array();
ListPlayers[1] = new Array();
ListPlayers[2] = new Array();
ListPlayers[3] = new Array();
var pid_panels = new Array(-1,-1,-1,-1,-1,-1);
var ListTeam = new Array("spectator","pharaoh","king","citizen");
var bHost = false;
var bEnableChat = true;
var connected = true;
var thetime = null;
var win_mtetris = null;
var mtetris_url = null;
var xhr_mtetris_cmd = null;
var xhr_mtetris_status = null;
var xhr_mtetris_send = null;
var my_team = -1;
var TimeID = null;
var timeoutid_get = null;
var timeoutid_chat = null;
var winner_data = -1;
var bGameStarted = false;
var bWantChat = false;
var ListMoves = "";
var send_separator = "*";
var param_separator = ":";
//svar panels = new Array(null,null,null,null,null,null);
var spectator_panel = null;
var spectator_panel_playerid = null;
var spectator_panel_team = null;
var spectator_panel_username = null;
var bSendGameOver = false;
var item_max_each = 9;
var item_win_chance_good_item = 60;
var timeout_select = 4000;
var item_win_chance_line = 25;
var item_win_chance_level = 30;
var item_win_chance_pyramadis = 75;
var item_win_each_type_perc = new Array();
item_win_each_type_perc[0] = new Array(1,15);
item_win_each_type_perc[1] = new Array(16,30);
item_win_each_type_perc[2] = new Array(31,65);
item_win_each_type_perc[3] = new Array(66,100);
item_win_each_type_perc[4] = new Array(0,0);
item_win_each_type_perc[5] = new Array(0,0);
item_win_each_type_perc[6] = new Array(0,0);
var item_qty = new Array(0,0,0,0,0,0,0,0,0,0,0,0,0,0);
var click_itemid = null;
var timeoutid_item = null;
var my_immunity = false;
var bPause = false;
var arr_s_move = null;
var timeout_img = new Array(null,null,null,null,null,null,null);
var bimage = new Array(null,null,null,null,null,null,null);
var bSendMatrix = false;
var timeout_matrix = null;
var bReceivedGameOver = false;
var ScoreForLine = 50;
var ScorePerBlock = 1;
var ScoreForNewLevel = 100;
var ScorePyramadis = 1000;
var RatioScoreGold = 800;
var RatioScoreStone = 450;
var InitSpeed = 650;
var SpeedInc = 30;
var bEndGame = true;
var bGameStarted = false;
var gold = 0;
var stone = 0;
var game_gold = 0;
var game_stone = 0;

function OpenMultiTetris(url,password){
	mtetris_url = url;
	if(password.length){
		input = prompt(LANG_PASSWORD,"");
		if(input && md5(input) == password)
			OpenWinMultiTetris(mtetris_url+"/"+input);
		else if(input)
			alert(LANG_INVALID_PASSWORD);
	}else
		OpenWinMultiTetris(mtetris_url);
}
function EmptyGameVars(){
	EmptyMoves();
}
function EmptyMoves(){
	ListMoves = "";
}
function GetRandomPosx(){
	return (Math.floor(Math.random()*12));
}
function AddLine(){
	ListMoves += (ListMoves?send_separator:"")+"a,"+my_team+","+GetRandomPosx();
}
function RemoveLine(y){
	ListMoves += (ListMoves?send_separator:"")+"r,"+y;
}
function AddMove(id_block,id_rotation,posx,posy){
	ListMoves += (ListMoves?send_separator:"")+"m,"+id_block+","+id_rotation+","+posx+","+posy;
}
function AddItemToSend(itemid,player_id,params){
	ListMoves += (ListMoves?send_separator:"")+"i,"+itemid+","+player_id+(params?","+params:"");
}
function GetMoves(){
	return ListMoves;
}
function ForgetItemClick(display){
	UpdateItemImage(click_itemid,"");
	click_itemid = null;
	if(display)
		UpdateSystemDiv(LANG_INVALID_TARGET2);
}
function SetClickUser(click_id){
	var player_id = null;
	if(click_id == 1)
		player_id = -1;
	else if(pid_panels[click_id-2] != null)
		player_id = pid_panels[click_id-2];
	ClickUser(player_id);
}
function ClickUser(player_id){
	if(!bGameStarted || spectator_panel_playerid || bPause || player_id == null || click_itemid == null){
		click_itemid = null;
		return false;
	}
	UpdateItemImage(click_itemid,"");
	clearTimeout(timeoutid_item);
	if(click_itemid == 1){
		click_itemid = null;
		clearTimeout(timeoutid_item);
		UpdateSystemDiv(LANG_INVALID_TARGET4);
		return false;
	}
	if(click_itemid){
		var user = "";
		var team = "";
		if(player_id == -1){
			if(spectator_panel != null && spectator_panel_playerid != null)
				player_id = spectator_panel_playerid;
			else{
				if(click_itemid<=7){
					PanelApplyItemToUser(click_itemid, null);
					if((click_itemid == 2 || click_itemid == 4) && my_immunity == false){
						UpdateImmunityImg(true);
						my_immunity = true;
					}
				}
				player_id = my_playerid;
			}
		}
		/*if items is evil, we can send to ennemis only*/
		var i,j,bStop=false;
		for(j=1;j<4;j++){
			for(i=0;i<ListPlayers[j].length;i++){
				if(ListPlayers[j][i].playerid == player_id){
					user = ListPlayers[j][i].username;
					team = j;
					if(team == my_team && click_itemid >=8){
						UpdateSystemDiv(LANG_INVALID_TARGET);
						clearTimeout(timeoutid_item);
						click_itemid = null;
						return false;
					}
					bStop = true;
					break;
				}
			}
			if(bStop)
				break;
		}
		if(click_itemid){
			var src = img_src_base_dir+"item"+click_itemid+".png";
			var col = "";
			if(click_itemid<=7)
				col = "#18950b";
			else
				col = "#cf3112";
			user = "<span class=\"mtetris_"+ListTeam[team]+"\">"+user+"</span>";
			var str = "<table cellspacing=\"1\"><tr valign=\"top\"><td><img src=\""+src+"\" alt=\""+label_items[click_itemid-1]+"\" title=\""+label_items[click_itemid-1]+"\" width=\"16\" height=\"15\"/></td><td style=\"font-size:11px;color:"+col+"\">"+label_items[click_itemid-1]+" "+LANG_TO+" "+user+"</td></tr></table>";
			UpdateSystemDiv(str);
			DecItem(click_itemid);
			PrepareSendItem(player_id,click_itemid);
			click_itemid = null;
		}else
			UpdateSystemDiv(LANG_INVALID_TARGET3);
	}else
		UpdateSystemDiv(LANG_INVALID_TARGET3);
}
function ParseItemInfo(info){
	var i,params = "";
	for(i=0;i<info.length;i++)
		params += (params?param_separator:"") + info[i];
	return params;
}
function GetMeteoroidRandInfo(){
	/*editable*/
	var radius_min = 2;
	var radius_max = 3;
	var rand_radius = GetRandRange(radius_min,radius_max);
	var arr = new Array();

	arr[0] = GetRandRange(rand_radius,XQtyBlocks-rand_radius-1);
	arr[1] = GetRandRange(15,YQtyBlocks-rand_radius-1);
	arr[2] = rand_radius;
	return arr;
}
function GetVolcanRandInfo(){
	/*editable*/
	var lines_add_min = 1;
	var lines_add_max = 2;
	var holes_min = 2;
	var holes_max = 3;

	var arr = new Array(),arr_px,px;
	var holes,i,k,bFound;
	var total_lines = GetRandRange(lines_add_min,lines_add_max);
	for(i=0; i<total_lines; i++){
		holes = GetRandRange(holes_min,holes_max);
		arr.push(holes);
		arr_px = new Array();
		do{
			bFound = false;
			px = GetRandRange(0,XQtyBlocks-1);
			for(k=0; k<arr_px.length; k++){
				if(arr_px[k] == px){
					bFound = true;
					break;
				}
			}
			if(bFound == false)
				arr_px.push(px);
		}while(arr_px.length < holes);
		for(k=0; k<arr_px.length; k++)
			arr.push(arr_px[k]);
	}
	return arr;
}
function GetLightningRandInfo(){
	/*editable*/
	var width_min = 1;
	var width_max = 2;
	var height_min = 2;
	var height_max = 5;
	var arr = new Array();

	var width = GetRandRange(width_min,width_max);

	arr[0] = GetRandRange(0,XQtyBlocks-width-1);
	arr[1] = width;
	arr[2] = GetRandRange(height_min,height_max);
	return arr;
}
function GetAcidRandInfo(){
	/*editable*/
	var holes_min = 0;
	var holes_max = 3;
	
	var arr = new Array();
	for(var i=0; i<XQtyBlocks; i++)
		arr.push(GetRandRange(holes_min,holes_max));
	return arr;
}
function PrepareSendItem(player_id,itemid){
	var params = "",temp = "";
	/*param_separator*/
	if(itemid>7){
		/*meteoroid => cx:cy:radius*/
		if(itemid == 8){
			params = GetMeteoroidRandInfo();
		/*lightning => px:width:height*/
		}else if(itemid == 9){
			params = GetLightningRandInfo();
		/*volcanic larva =>line1:px_hole_a:px_hole_b:px_hole_c:line2:..etc*/
		}else if(itemid == 10){
			params =GetVolcanRandInfo();
		/*acid rain => qty_holes[XQtyBlocks]*/
		}else if(itemid == 11){
			params = GetAcidRandInfo();
		}
		if(params){
			for(var i=0;i<params.length; i++)
				temp += (temp?param_separator:"")+params[i];
			params = temp;
		}
	}
	AddItemToSend(itemid,player_id,params);
}
function ApplyItem(itemid){
	if(!bGameStarted || spectator_panel_playerid || bPause)
		return false;
	if(click_itemid != null)
		UpdateItemImage(click_itemid,"");
	if(click_itemid == 1 && itemid != 1){
		click_itemid = null;
		clearTimeout(timeoutid_item);
		if(item_qty[itemid-1]<9){
			DecItem(1);
			AddItem(itemid);
		}
	}else{
		if(item_qty[itemid-1]){
			UpdateItemImage(itemid,"_select");
			click_itemid = itemid;
			clearTimeout(timeoutid_item);
			timeoutid_item = setTimeout("ForgetItemClick(true)",timeout_select);
			if(itemid != 1)
				UpdateSystemDiv("<b>"+label_items[itemid-1]+":</b> "+LANG_CLICK_TARGET);
			else
				UpdateSystemDiv("<b>"+label_items[itemid-1]+":</b> "+LANG_INVALID_TARGET_I);
		}else
			UpdateSystemDiv("<b>"+label_items[itemid-1]+":</b> "+LANG_NO_ITEM_MSG);
	}
}
function UpdateItemImage(itemid,type){
	if(itemid>=1)
		document.getElementById("img_item_"+itemid).src = "/m/i/games/multi_tetris/bg/item"+itemid+type+".png";
}
function GetItemSrc(itemid){
	if(click_itemid == itemid)
		return "/m/i/games/multi_tetris/bg/item"+itemid+"_select.png";
	else if(item_qty[itemid-1])
		return "/m/i/games/multi_tetris/bg/item"+itemid+".png";
	else
		return "/m/i/games/multi_tetris/bg/item"+itemid+"_disabled.png";
}
function bItemWin(p){
	var rnd = GetRandPerct();
	return (rnd<=p);
}
function DecItem(item_id){
	var item_index = item_id-1;
	var before = item_qty[item_index];
	item_qty[item_index]--;
	if(item_qty[item_index]<0)
		item_qty[item_index] = 0;
	if(before >=1 && item_qty[item_index] == 0)
		UpdateItemImage(item_id,"_disabled");
	document.getElementById("item"+item_id).innerHTML = item_qty[item_index];
}
function AddItem(item_id){
	var item_index = item_id-1;
	var before = item_qty[item_index];
	item_qty[item_index]++;
	if(before == 0 && item_qty[item_index] == 1)
		UpdateItemImage(item_id,"");
	document.getElementById("item"+item_id).innerHTML = item_qty[item_index];
	var src = img_src_base_dir+"item"+item_id+".png";
	var col = "";
	if(item_id<=4)
		col = "#18950b";
	else
		col = "#cf3112";		
	var str = "<table cellspacing=\"1\"><tr valign=\"top\"><td><img src=\""+src+"\" alt=\""+label_items[item_index]+"\" title=\""+label_items[item_index]+"\" width=\"16\" height=\"15\"/></td><td style=\"font-size:11px;color:"+col+"\">"+label_items[item_index]+"</td></tr></table>";
	UpdateSystemDiv(str);
}
function ProcessItemWin(p){
	if(bItemWin(p)){
		var item_id = ChooseItemWin();
		if(item_qty[item_id-1] < item_max_each)
			AddItem(item_id);
	}
}
function GetRandPerct(){
	return Math.ceil(Math.random()*100);
}
function ChooseItemWin(){
	var item_type;
	var p = GetRandPerct();
	if(p<item_win_chance_good_item)
		item_type = 1;
	else
		item_type = 2;
	var item_id = 0;
	for(var i=0;i<7;i++){
		if(p >= item_win_each_type_perc[i][0] && p <= item_win_each_type_perc[i][1]){
			item_id = (i+1)+7*(item_type-1);
			break;
		}
	}
	return item_id;
}
function OpenWinMultiTetris(url){
	var wind_w = 791;
	var wind_h = 551;
	var pos_x = 0;
	var pos_y = 0;
	var pos_y = (screen.height/2)-(wind_h/2);
	var pos_x = (screen.width/2)-(wind_w/2);
	if(win_mtetris && !win_mtetris.closed)
		win_mtetris.close();
	win_mtetris = window.open(url,"PyramadisMultiTetris","top="+pos_y+",left="+pos_x+",width="+wind_w+",height="+wind_h+",toolbar=no,location=no,directories=no,status=no,menubar=0,scrollbars=no,resizable=no");
}
function PeriodicGetCmd(){
	if(connected){
		SendGetCmd();
		timeoutid_get = setTimeout("PeriodicGetCmd()",TimeGetCmd);
	}
}
function OnFocusChat(obj){
	bWantChat = true;
}
function OnBlurChat(obj){
	bWantChat = false;	
}
function CountTeams(){
	var total_teams = 0;
	for(var i=1;i<4;i++){
		if(ListPlayers[i].length != 0)
			total_teams++;
	}
	return total_teams;
}
function CountPlayers(){
	var total_players = 0;
	for(var i=1;i<4;i++)
		total_players += ListPlayers[i].length;
	return total_players;
}
function CountNoTeamPlayers(){
	return ListPlayers[1].length;
}
function ProcessOnStart(){
	/*can we start?*/
	if((has_teams && CountTeams() > 1) || (has_teams && CountPlayers()==1)){
		SendStartCmd();
		if(document.getElementById("div_button_start"))
			document.getElementById("div_button_start").innerHTML = "";
	}else{
		GetTheTime();
		UpdateSystemDiv(thetime+" "+LANG_ERR_NO_OPPONENT);
	}
}
function DisplayGameStartMsg(){
	GetTheTime();
	UpdateSystemDiv(thetime+" <b>"+LANG_GAME_STARTED+"</b>");
}
function ClearSystemDiv(){
	document.getElementById("system_box").innerHTML = "";
}
function ToggleHostGUI(){
	if(bHost)
		document.getElementById("div_button_start").innerHTML = "<input type=\"button\" class=\"button\" id=\"tetris_button\" onclick=\"document.key.down.focus();ProcessOnStart()\" value=\""+LANG_START+"\"/> ";
}
function SendGameOver(){
	bSendGameOver = true;
}
function EnableChat(){
	bEnableChat = true;
}
function GetUsername(pid){
	var i,j;
	for(j=0;j<4;j++){
		for(i=0;i<ListPlayers[j].length;i++){
			if(ListPlayers[j][i].playerid == pid)
				return ListPlayers[j][i].username;
		}
	}
	return "";
}
function GetPlayerid(p_username){
	var i,j;
	for(j=0;j<4;j++){
		for(i=0;i<ListPlayers[j].length;i++){
			if(ListPlayers[j][i].username == p_username)
				return ListPlayers[j][i].playerid;
		}
	}
	return -1;
}
function ReplaceBadWords(str){
	var words = new Array(/fuck/gi,/bitch/gi,/asshole/gi,/cunt/gi,/shit/gi,/idiot/gi,/salope/gi,/criss/gi,/pute/gi,/puta/gi,/tabarnack/gi,/tabarnac/gi,/esti/gi,/asti/gi,/osti/gi,/calis/gi);
	for(var i=0;i<words.length;i++)
		str = str.replace(words[i],"****");
	return str;
}
function GetPlayerCount(){
	return (ListPlayers[0].length + ListPlayers[1].length+ListPlayers[2].length+ListPlayers[3].length);
}
function ApplyRestartGame(){
	if(bHost){
		if((has_teams && CountTeams() > 1) || (has_teams && CountPlayers()==1)){
			SendRestartCmd();
			if(document.getElementById("div_button_start"))
				document.getElementById("div_button_start").innerHTML = "";
		}else{
			GetTheTime();
			UpdateSystemDiv(thetime+" "+LANG_ERR_NO_OPPONENT);
		}
	}else
		DisplayInvalidCmd();
}
function DisplayHelp(){
	var temp;
	temp = "<b>"+LANG_AVAIL_CMD+"</b><br/>";
	temp += "<table cellspacing=\"1\" cellpadding=\"1\">";
	var ALT = "<span class=\"s_key\">ALT</span>";
	var ITEMS_GOOD = "<span class=\"i_good\">"+LANG_ITEMS_GOOD+":</span>";
	var ITEMS_EVIL = "<span class=\"i_evil\">"+LANG_ITEMS_EVIL+":</span>";
	temp += "<tr valign=\"top\"><td class=\"small\"><b><u>"+LANG_CMD_ALL+"</u></b></td><td class=\"small\">/clear ("+ALT+"+C)<br/>/help<br/>/items<br/>/smiley<br/>/status</td></tr>";
	temp += "<tr valign=\"top\"><td class=\"small\"><b><u>"+LANG_CMD_HOST+"</u></b></td><td class=\"small\">/pause ("+ALT+"+P)<br/>/restart ("+ALT+"+R)<br/>/start ("+ALT+"+S)<br/>/stop ("+ALT+"+S)</td></tr>";
	temp += "<tr valign=\"top\"><td class=\"small\"><b><u>"+LANG_HOTKEYS+"</u></b></td><td class=\"small\">ESC ("+LANG_CANCEL+")<br/>"+ITEMS_GOOD+"<br/>1-7 (items) + 1-7 ("+LANG_USER_TYPES["p"]+")<br/>"+ITEMS_EVIL+"<br/>"+ALT+" + 1-7 (items) + 1-7 ("+LANG_USER_TYPES["p"]+")</td></tr>";
	temp += "</table>";
	UpdateChatDiv(temp);		
}
function DisplayItems(){
	var temp;
	var src,item_index,item_id;

	temp = "<b>"+LANG_ITEMS_HELP+"</b><br/><br/>";	
	temp += label_info_items_use;
	for(item_id=1;item_id<=8;item_id++){
		item_index = item_id-1;
		src = img_src_base_dir+"item"+item_id+".png";
		var col = "";
		if(item_id<=4)
			col = "#18950b";
		else
			col = "#cf3112";
		temp += "<table cellspacing=\"1\" cellpadding=\"1\"><tr valign=\"top\"><td><img src=\""+src+"\" alt=\""+label_items[item_index]+"\" title=\""+label_items[item_index]+"\" width=\"16\" height=\"15\"/></td><td style=\"font-size:11px;color:"+col+"\"><b>"+label_items[item_index]+":</b> "+label_info_items[item_index]+"</td></tr></table>";
	}
	UpdateChatDiv(temp);	
}
function DisplaySmiley(){
	var temp = "<b>"+LANG_SMILEY_CMD+"</b><br/>";
	temp += "<table cellspacing=\"1\" cellpadding=\"1\">";
	var arr = new Array(":)",";)",":|",":(",":o",":p","b)",":D",":@");
	for(var i=0; i<arr.length; i++)
		temp += "<tr><td>"+get_smiley_image(i)+"</td><td> </td><td>"+arr[i]+"</td></tr>";
	temp += "</table>";
	UpdateChatDiv(temp);
}
function DisplayClear(){
	document.getElementById("chat_message").innerHTML = "";
	document.getElementById("system_box").innerHTML = "";
}
function DisplayInvalidCmd(){
	UpdateChatDiv(LANG_INVALID_CMD);
}
function ApplyStopGame(){
	if(bHost)
		SendStopCmd();
	else
		DisplayInvalidCmd();
}
function ApplyPauseGame(){
	if(bHost){
		if(bGameStarted)
			SendPauseCmd();
		else
			UpdateSystemDiv(thetime+" "+LANG_ERR_PAUSE);
	}else
		DisplayInvalidCmd();
}
function ApplyChatStartGame(){
	if(bHost)
		ProcessOnStart();
	else
		DisplayInvalidCmd();
}
function ProcessPauseCmd(data){
	var ar_param = data.split("\t");
	if(ar_param[1] == "1")
		bPause = true;
	else
		bPause = false;
	TogglePause();
}
function TogglePause(){
	if(bPause == false){
		bPause = true;
		clearTimeout(TimeID);
		GetTheTime();
		UpdateSystemDiv(thetime+" <b>"+LANG_HOST_PAUSE+"</b>");
	}else{
		bPause = false;
		UpdateSystemDiv(thetime+" <b>"+LANG_HOST_PAUSE_OFF+"</b>");		
		if(my_team != 0)
			GameInProgress();
	}
}
function GetSendChat(){	
	if(bEnableChat){
		GetTheTime();
		if(connected){
			var temp = null;
			var str = document.getElementById("input_chat").value;			
			document.getElementById("input_chat").value = "";
			bEnableChat = false;
			timeoutid_chat = setTimeout("EnableChat()",TimeChatInterv);
			if(str.length){
				if(str == "/status")
					DisplayStatus();
				else if(str == "/restart")
					ApplyRestartGame();
				else if(str == "/stop")			
					ApplyStopGame();
				else if(str == "/start")			
					ApplyChatStartGame();
				else if(str == "/help")			
					DisplayHelp();
				else if(str == "/test"){
				}
				else if(str == "/items")			
					DisplayItems();
				else if(str == "/smiley")			
					DisplaySmiley();
				else if(str == "/clear")
					DisplayClear();
				else if(str == "/pause")
					ApplyPauseGame();
				else{
					/*take out the \n & \t if some1 copy paste.. bad boy!*/
					str = str.replace(/\n/gi,"");
					str = str.replace(/\t/gi,"");

					/*HTML*/
					temp = ReplaceBadWords(str);
					temp = temp.replace(/&/gi,"&#38;");
					temp = temp.replace(/</gi,"&#60;");
					temp = temp.replace(/>/gi,"&#62;");
					temp = temp.replace(/\//gi,"&#47;");
					
					DisplayChat(my_username,temp);
					/*if we have at least 2 players... otherwise dont send to server*/		
					if(GetPlayerCount() > 1){
						str = str.replace(/&/gi,"%26");
						str = str.replace(/[+]/gi,"%2B");
						SendChat(str);
					}
				}
			}
		}else{
			UpdateSystemDiv(LANG_NOT_CONNECTED);
			document.getElementById("input_chat").value = "";
		}
	}
}
function VerifyChatKeyPressChat(ev){
	var keyPress = document.all?event.keyCode:ev.which;
	var evtobj = window.event?event:ev;
	/*enter*/
	if(keyPress == 13){
		GetSendChat();
		if(bGameStarted)
			document.key.down.focus();
	/*alt*/
	}else if(evtobj.altKey){
		/*c*/
		if(keyPress==67)
			DisplayClear();
		/*p*/
		else if(keyPress==80)
			ApplyPauseGame();
		/*r*/
		else if(keyPress==82)
			ApplyRestartGame();
		/*s*/
		else if(keyPress==83){
			if(!bGameStarted)
				ApplyChatStartGame();
			else
				ApplyStopGame();
		}
	}else if(keyPress == 27)
		ForgetItemClick(false);
}

function VerifyKeyPressGame(ev){
	var keyPress = document.all?event.keyCode:ev.which;
	var evtobj = window.event?event:ev;
	/*alt*/
	if(evtobj.altKey){
		/*c*/
		if(keyPress==67){
			DisplayClear();
			return;
		/*p*/
		}else if(keyPress==80){
			ApplyPauseGame();
			return;
		/*r*/
		}else if(keyPress==82){
			ApplyRestartGame();
			return;
		/*s*/
		}else if(keyPress==83){
			if(!bGameStarted)
				ApplyChatStartGame();
			else
				ApplyStopGame();
			return;
		}
	}
	if(!bGameStarted || my_team==0 || bPause) return;
	/*49 == 1*/
	if(keyPress >= 49 && keyPress <= 52){
		if(click_itemid && click_itemid != 1)
			SetClickUser(keyPress-48);
		else
			ApplyItem(keyPress-48+(evtobj.altKey?7:0));
	}else if(keyPress == 27)
		ForgetItemClick(false);
	/*left*/
	if(keyPress == 37 || keyPress == 65)
	if(MoveShape(0,-1,0,posy,posx)) posx--;
	
	/*right*/
	if(keyPress == 39 || keyPress == 68)
	if(MoveShape(0,1,0,posy,posx)) posx++;
	/*top*/
	if(keyPress == 38 || keyPress == 87) MoveShape(0,0,-1,posy,posx)
	/*bottom*/
	if(keyPress == 40 || keyPress == 83){
		/*move pos_y_inc*/
		for(i=0;i<PosYLoop;i++){
			if(MoveShape(1,0,0,posy,posx))
				posy++;
			else
				break;
		}
	}
	/*space bar*/
	if(keyPress == 32){
		while(MoveShape(1,0,0,posy,posx))
			posy++;
	}	
}
function ProcessChatCmd(data){
	var ar_param = data.split("\t");
	if(ar_param[1] != my_playerid)
		DisplayChat(GetUsername(ar_param[1]),ar_param[2]);
}
function GetTheTime(){
	thetime = new Date();
	var Hours,Mins,Secs;
	Hours = thetime.getHours();
	if(Hours < 10)
		Hours = "0" + Hours;
	Mins = thetime.getMinutes();
	if(Mins < 10)
		Mins = "0" + Mins;
	Secs = thetime.getSeconds();
	if(Secs < 10)
		Secs = "0" + Secs;
	thetime = "<span class=\"thetime\">"+Hours + ":" + Mins+ ":" + Secs+"</span>";
}
function GetTeam(username){
	var i,j;
	for(j=0;j<4;j++){
		for(i=0;i<ListPlayers[j].length;i++){
			if(ListPlayers[j][i].username == username)
				return ListTeam[j];
		}
	}
}
function get_smiley_image(code){
	var src = "/m/i/i/smiley/";
	var img;
	if(code == 0)
		img = "smile.gif";
	else if(code == 1)
		img = "wink.gif";
	else if(code == 2)
		img = "frown.gif";
	else if(code == 3)
		img = "sad.gif";
	else if(code == 4)
		img = "shock.gif";
	else if(code == 5)
		img = "pfft.gif";
	else if(code == 6)
		img = "cool.gif";
	else if(code == 7)
		img = "grin.gif";
	else if(code == 8)
		img = "angry.gif";
	src += img;
	return "<img src=\""+src+"\" alt=\"\" width=\"15\" height=\"15\"/>";
}
function replace_smiley(txt){
	var arr_smiley = new Array(":[)]",";[)]",":[|]",":[(]",":o",":p","b[)]",":D",":[@]");
	var rex;
	for(var i=0;i<arr_smiley.length; i++){
		rex = new RegExp(arr_smiley[i],"gi");
		txt = txt.replace(rex,get_smiley_image(i));
	}
	return txt;
}
function DisplayChat(username,str){
	str = replace_smiley(str);
	UpdateChatDiv(thetime+" &lt;<span class=\"mtetris_"+GetTeam(username)+"\">"+username+"</span>&gt; "+str,"chat");
}
function ProcessGetUsers(data){
	GetTheTime();
	var ar_list = data.split("\t");
	for(var i=0;i<ar_list.length;i++){
		var ar_user = ar_list[i].split(",");
		/*add users*/
		if(ar_user.length == 4){
			/*check if im host*/
			if(my_playerid == ar_user[0] && ar_user[2] == "h"){
				bHost = true;
				ToggleHostGUI();
			}
			/*playerid,username,type,team*/
			AddPlayer(ar_user[0],ar_user[1],ar_user[2],ar_user[3]);
		/*spectator joined*/
		}else if(ar_user == "g"){
			bSendMatrix = true;
			ProcessGameStartCmd();
		}
	}
	timeoutid_get = setTimeout("PeriodicGetCmd()",TimeGetCmd);
	UpdateAllTeamPanels();
}
function DisplayStatus(){
	var temp = "<table cellspacing=\"0\" cellpadding=\"0\"><tr><td class=\"s_title\">Id</td><td class=\"s_title\">User</td><td class=\"s_title\">Type</td><td class=\"s_title\">Team</td></tr>";
	var i,j;
	for(j=1;j<4;j++){
		for(i=0;i<ListPlayers[j].length;i++){
			t_team = LANG_USER_TEAMS[j][1].toLowerCase();
			temp += "<tr><td class=\"s_cell1\">"+ListPlayers[j][i].playerid+"</td><td class=\"s_cell1\">"+ListPlayers[j][i].username+"</td><td class=\"s_cell1\">"+LANG_USER_TYPES[ListPlayers[j][i].type]+"</td><td class=\"s_cell1\">"+t_team+"</td></tr>";
		}
	}
	j = 0;
	for(i=0;i<ListPlayers[j].length;i++){
		t_team = "-";
		temp += "<tr><td class=\"s_cell1\">"+ListPlayers[j][i].playerid+"</td><td class=\"s_cell1\">"+ListPlayers[j][i].username+"</td><td class=\"s_cell1\">"+LANG_USER_TYPES[ListPlayers[j][i].type]+"</td><td class=\"s_cell1\">"+t_team+"</td></tr>";
	}
	temp += "</table>";
	UpdateChatDiv(temp);
}
function CloseWindow(){
	connected = false;
	window.close();
}
function ProcessOnQuit(){
	CloseWindow();
}
function ProcessOnSave(){
	if((gold+game_gold) || (stone+game_stone)){
		SendSaveResources(gold+game_gold,stone+game_stone);
		gold = 0;
		game_gold = 0;
		stone = 0;
		game_stone = 0;
		game_score = 0;
		UpdateScore();
		UpdateSystemDiv(LANG_RESSOURCES_SAVED);
	}else
		UpdateSystemDiv(LANG_NO_RESSOURCES);
}
/*
function PanelStartNewGame(){
	for(var i=1;i<=6;i++){
		if(panels[i] != null)
			panels[i].StartNewGame();
	}
	if(spectator_panel != null){
		spectator_panel.StartNewGame();
		spectator_panel.AddUsernameTop(spectator_panel_username);
	}
}*/
function GetPanelFromPlayer(playerid){
	for(var i=0;i<6;i++){
		if(pid_panels[i] == playerid)
			return (i+1);
	}
	return 0;
}
/*
function PanelAddBlock(playerid,blockid,rotation,posx,posy){
	var pid = GetPanelFromPlayer(playerid);
	if(pid && panels[pid] != null)
		panels[pid].AddBlock(blockid,rotation,posx,posy);
	else if(spectator_panel_playerid == playerid)
		spectator_panel.AddBlock(blockid,rotation,posx,posy);
}*/
function ProcessGameStartCmd(){
	EmptyAllImages();
	bReceivedGameOver = false;
	bGameStarted = true;
	winner_data = -1;
	UpdateImmunityImg(false);
	my_immunity = false;
	ClearSystemDiv();
	DisplayGameStartMsg();
	EmptyGameVars();
	UpdateAllTeamPanels();
	/*not a spectator*/
	ApplyStartGame();
	ApplyUsernameSpectPanel();
}
function ProcessJoinCmd(data){
	var ar_param = data.split("\t");
	/*playerid,username,type,team*/
	AddPlayer(ar_param[1],ar_param[2],ar_param[3],ar_param[4]);
	UpdateSystemDiv(thetime+" <span class=\"mtetris_"+GetTeam(ar_param[2])+"\">"+ar_param[2]+"</span> "+LANG_HAS_JOINED);
}
function AdjustMaxY(maxy,adj,blocksy){
	maxy += adj;
	if(maxy < 0)
		maxy = 0;
	else if(maxy>blocksy-1)
		maxy = blocksy-1;
	return maxy;
}
function ProcessAddLinesCmd(data){
	/*playerid,lines*/
	var ar_param = data.split("\t");
	/*total,team,posx*/
	var ar_lines = ar_param[2].split(",");
	var i,j,pid;
	/*add lines for each players not in this team*/
	for(j=1;j<4;j++){
		if(j != Number(ar_lines[0])){
			for(i=0;i<ListPlayers[j].length;i++){
				pid = GetPanelFromPlayer(ListPlayers[j][i].playerid);
				if(pid != 0 && panels[pid] != null)
					panels[pid].AddLinesToUser(1,ar_lines[1]);
			}
		}
	}
	/*add lines to main gui if we spectate*/
	/*or to our game panel*/
	if((spectator_panel_team != null && spectator_panel_team != ar_lines[0]) || (spectator_panel_team == null && my_team != ar_lines[0]))
		AddLinesToUser(1,ar_lines[1]);
}
function IsInArray(value,array){
	for(var i=0; i<array.length; i++){
		if(array[i] == value)
			return true;
	}
	return false;
}
function ProcessRemoveLineCmd(data){
	/*playerid,liney*/
	var ar_param = data.split("\t");
	if(IsInArray(ar_param[1],pid_panels) && spectator_panel_playerid != ar_param[1])
		panels[GetPanelFromPlayer(ar_param[1])].RemoveFullLine(ar_param[2]);
	else if(spectator_panel_playerid == ar_param[1])
		spectator_panel.RemoveFullLine(ar_param[2]);
}
function ProcessItemsCmd(data){
	/*playerid,items*/
	var ar_param = data.split("\t");
	var ar_items = ar_param[2].split("*");
	var split_d,split_p,i;
	for(i=0;i<ar_items.length;i++){
		/*itemid,target,params*/
		split_d = ar_items[i].split(",");
		if(split_d[2] != null)
			split_p = split_d[2].split(param_separator);
		else
			split_p = null;
		ApplyItemToUser(ar_param[1],split_d[1],split_d[0],split_p);
	}
}
function CheckImageLoaded(pid){
	if(bimage[pid].complete){
		var div_id = "div_img_p"+pid;
		if(spectator_panel_playerid == null){
			if(pid != 0)
				document.getElementById("player"+pid+"_container").innerHTML = "<div style=\"position:absolute;top:0px;left:0px;display:none\" id=\""+div_id+"\"><a href=\"#\" onclick=\"SetClickUser("+(pid+1)+")\" onmouseout=\"document.getElementById('"+div_id+"').style.display = 'none'\" class=\"n\"><img src=\"/m/i/games/multi_tetris/tetris_target.gif\" width=\"86\" height=\"184\" border=\"0\" alt=\"\"/></a></div><a href=\"#\" class=\"n\" onclick=\"ClickUser("+pid+")\" onmouseover=\"if(bGameStarted)document.getElementById('"+div_id+"').style.display = 'block'\"><img src=\""+bimage[pid].src+"\" width=\"84\" height=\"182\" style=\"border:1px #7b5715 solid\" alt=\"\"/></a>";
			else
				document.getElementById("div_image_spect").innerHTML = "<img src=\""+bimage[pid].src+"\" width=\"180\" height=\"390\" style=\"border:1px #7b5715 solid\" alt=\"\"/>";
		}else{
			if(pid != 0)
				document.getElementById("player"+pid+"_container").innerHTML = "<img src=\""+bimage[pid].src+"\" width=\"84\" height=\"182\" style=\"border:1px #7b5715 solid\" alt=\"\"/>";
			else
				document.getElementById("div_image_spect").innerHTML = "<img src=\""+bimage[pid].src+"\" width=\"180\" height=\"390\" style=\"border:1px #7b5715 solid\" alt=\"\"/>";
		}
	}else
		timeout_img[pid] = setTimeout("CheckImageLoaded("+pid+")",100);
}
function GetPlayerNumber(pid,bHost){
	if((pid == my_playerid && spectator_panel_playerid==null) ||(bHost &&spectator_panel_playerid!=null))
		return 1;
	else{
		var ar_patch = new Array(2,4,6,3,5,7);
		for(var i=0;i<6;i++){
			if(pid_panels[i] == pid)
				return ar_patch[i];
		}
	}
	return 0;
}
function EmptyAllImages(){
	for(var i=1;i<=6;i++)
		document.getElementById("player"+i+"_container").innerHTML = "";
	document.getElementById("div_image_spect").innerHTML = "";
}
function ProcessMatrixCmd(data){
	/*playerid,matrix*/
	var ar_param = data.split("\t"),pid;
	if(spectator_panel_playerid == ar_param[1]){
		pid = 0;
		clearTimeout(timeout_img[pid]);
		bimage[pid] = new Image();
		bimage[pid].src = "/multi_tetris_img.php?n=1&matrix="+ar_param[2];
		CheckImageLoaded(pid);	
	}else{
		pid = GetPanelFromPlayer(ar_param[1]);
		if(pid >0){
			clearTimeout(timeout_img[pid]);
			bimage[pid] = new Image();
			bimage[pid].src = "/multi_tetris_img.php?matrix="+ar_param[2];
			CheckImageLoaded(pid);
		}
	}
}
function DisplayImmunityMsg(){
	var src = my_immunity?img_immunity_on:img_immunity_off;
	var txt = my_immunity?LANG_IMMUNITY_ON:LANG_IMMUNITY_OFF;
	var col = my_immunity?"#18950b":"#858585";
	var str = "<table cellspacing=\"1\"><tr valign=\"top\"><td><img src=\""+src+"\" alt=\"\" width=\"16\" height=\"15\"/></td><td style=\"font-size:11px;color:"+col+"\">"+txt+"</td></tr></table>";
	UpdateSystemDiv(str);
}
function UpdateImmunityImg(bImmunity){
	document.getElementById("img_immunity").src = bImmunity?img_immunity_on:img_immunity_off;	
}
function DisplayTargetImmuned(to_playerid,bImmunity){
	if(bImmunity){
		var username = GetUsername(to_playerid);
		var team = GetTeam(username);
		var user = "<span class=\"mtetris_"+ListTeam[team]+"\">"+username+"</span>";
		var str = "<span style=\"color:#cf3112\">"+LANG_FAIL+" "+user+" "+LANG_WAS_IMMUNE+"</span>";
		UpdateSystemDiv(str);
	}		
}
function SetAsNumbers(params){
	if(!params) return params;
	for(var i=0; i<params.length; i++)
		params[i] = Number(params[i]);
	return params;
}
function ApplyItemToUser(from_playerid, to_playerid, item_id, params){
	/*to myself (we already did it)*/
	if(from_playerid == to_playerid && to_playerid == my_playerid)
		return;
	var bImmunity = params == "immunity";
	/*if we are the target*/
	params = SetAsNumbers(params);
	if((spectator_panel != null && spectator_panel_playerid == to_playerid) || (spectator_panel_playerid == null && my_playerid == to_playerid)){
		if(bImmunity == false)
			PanelApplyItemToUser(item_id, params);
		if((item_id == 2 || item_id == 4) && my_immunity == false){
			UpdateImmunityImg(true);
			my_immunity = true;
		}else if(my_immunity && item_id > 7){
			UpdateImmunityImg(false);
			my_immunity = false;
		}
		/*Display only for spectator if its something from me to me*/
		if(spectator_panel_playerid != null || from_playerid != to_playerid){
			var src = img_src_base_dir+"item"+item_id+".png";
			var col = "";
			if(item_id <= 7)
				col = "#18950b";
			else
				col = "#cf3112";
			var team = spectator_panel_team?spectator_panel_team:my_team;
			var user = "<span class=\"mtetris_"+ListTeam[team]+"\">"+GetUsername(from_playerid)+"</span>";
			var str = "<table cellspacing=\"1\"><tr valign=\"top\"><td><img src=\""+src+"\" alt=\""+label_items[item_id-1]+"\" title=\""+label_items[item_id-1]+"\" width=\"16\" height=\"15\"/></td><td style=\"font-size:11px;color:"+col+"\">"+label_items[item_id-1]+" "+LANG_FROM+" "+user+"</td></tr></table>";
			UpdateSystemDiv(str);
		}
	}else{
		var pid = GetPanelFromPlayer(to_playerid);
		DisplayTargetImmuned(to_playerid,bImmunity);
	}
}
function ProcessDisconnectCmd(data){
	var ar_param = data.split("\t");
	/*playerid*/
	var t_username = GetUsername(ar_param[1]);
	if(t_username.length){
		UpdateSystemDiv(thetime+" <span class=\"mtetris_"+GetTeam(t_username)+"\">"+t_username+"</span> "+LANG_HAS_QUIT);
		DeletePlayer(t_username);
		DeletePlayerFromPanels(ar_param[1]);
		CheckDisconnectUser(ar_param[1],LANG_NOT_CONNECTED);
	}
}
function DeletePlayerFromPanels(playerid){
	for(var i=0;i<6;i++){
		if(pid_panels[i] == playerid){
			pid_panels[i] = -1;
			SetupPanels();
			break;
		}
	}
}
function ProcessKickCmd(data){
	var ar_param = data.split("\t");
	/*playerid*/
	var t_username = GetUsername(ar_param[1]);
	UpdateSystemDiv(thetime+" <span class=\"mtetris_"+GetTeam(t_username)+"\">"+t_username+"</span> "+LANG_IS_KICKED);
	DeletePlayer(t_username);
	DeletePlayerFromPanels(ar_param[1]);
	CheckDisconnectUser(ar_param[1],LANG_MSG_KICKED);
}
function ProcessBanCmd(data){
	var ar_param = data.split("\t");
	/*playerid*/
	var t_username = GetUsername(ar_param[1]);
	UpdateSystemDiv(thetime+" <span class=\"mtetris_"+GetTeam(t_username)+"\">"+t_username+"</span> "+LANG_IS_BANNED);
	DeletePlayer(t_username);
	DeletePlayerFromPanels(ar_param[1]);
	CheckDisconnectUser(ar_param[1],LANG_MSG_BANNED);
}
function ClearTimeouts(){
	clearTimeout(timeoutid_get);
	clearTimeout(timeoutid_chat);
}
function CheckDisconnectUser(pid, msg){
	if(pid == my_playerid){
		connected = false;
		ClearTimeouts();
		alert(msg);
		CloseWindow();
	}
}
function ApplyPlayersResultPanels(bLose){
	var i,j;
	for(j=1;j<4;j++){
		for(i=0;i<ListPlayers[j].length;i++){
			if(ListPlayers[j][i].playerid != my_playerid && spectator_panel_playerid != ListPlayers[j][i].playerid){
				if(has_teams){
					if(winner_data == j)
						document.getElementById("player"+ListPlayers[j][i].panel+"_container").innerHTML += "<div class=\"player_win\"></div>";
					else
						document.getElementById("player"+ListPlayers[j][i].panel+"_container").innerHTML += "<div class=\"player_game_over\"></div>";					
				}else if(winner_data == ListPlayers[j][i].playerid)
					document.getElementById("player"+ListPlayers[j][i].panel+"_container").innerHTML += "<div class=\"player_win\"></div>";
				else
					document.getElementById("player"+ListPlayers[j][i].panel+"_container").innerHTML += "<div class=\"player_game_over\"></div>";	
			}
		}
	}
}
function ProcessReceivedGameOver(){
	var el = document.createElement("div");
	if(spectator_panel_playerid==null){
		if(has_teams){
			if(winner_data == my_team)
				el.className = "me_win";
			else
				el.className = "me_game_over";
		}else if(winner_data == my_playerid)
			el.className = "me_win";
		else
			el.className = "me_game_over";
	}else{
		if(has_teams){
			if(winner_data == spectator_panel_team)
				el.className = "me_win";
			else
				el.className = "me_game_over";
		}else if(winner_data == spectator_panel_playerid)
			el.className = "me_win";
		else
			el.className = "me_game_over";
	}
	EmptyAllImages();
	document.getElementById("div_image_spect").appendChild(el);
	ApplyPlayersResultPanels();
}
function ApplyGameOver(){
	bEndGame = true;
	clearTimeout(TimeID);
	game_score = 0;
	gold += game_gold;
	stone += game_stone;
	UpdateScore();
}
function ProcessGameOverCmd(data){
	var ar_param = data.split("\t");
	/*team OR playerid if no team*/
	winner_data = ar_param[1];
	bGameStarted = false;
	bPause = false;
	bSendMatrix = false;
	bReceivedGameOver = true;
	clearTimeout(timeout_matrix);
	ProcessReceivedGameOver();
	ApplyGameOver();
	UpdateSystemDiv(thetime+ " <b>"+LANG_GAME_FINISHED+"</b>");
	if(bHost){
		if(document.getElementById("div_button_start"))
			document.getElementById("div_button_start").innerHTML = "<input type=\"button\" class=\"button\" id=\"tetris_button\" onclick=\"document.key.down.focus();ProcessOnStart()\" value=\""+LANG_START+"\"/>";
	}
}
function ProcessSwitchCmd(data){
	var ar_param = data.split("\t");
	/*playerid,newteam*/
	var t_username = GetUsername(ar_param[1]);
	UpdateTeam(ar_param[2],t_username);
	var temp = LANG_IS_NOW_WITH+" "+LANG_USER_TEAMS[ar_param[2]][1].toLowerCase()+".";
	UpdateSystemDiv(thetime+" <span class=\"mtetris_"+GetTeam(t_username)+"\">"+t_username+"</span> "+temp);

	if(ar_param[1] == my_playerid)
		ClearNextAndBoard();
}
function GetSpectatorPlayerMatrix(){
	if(bSendMatrix){
		bSendMatrix = false;
		timeout_matrix = setTimeout("EnableSendMatrix()",timeout_enable_matrix);
		return "&matrix=s";
	}
	return "";
}
function GetPlayerMatrix(){
	if(bSendMatrix){
		bSendMatrix = false;
		var rows,cols,matrix="";
		for(rows=0;rows<YQtyBlocks;rows++){
			for(cols=0;cols<XQtyBlocks;cols++){
				if(BoardBlocks[rows][cols]!=null)
					matrix += BoardBlocks[rows][cols].no;
				else
					matrix += 0;
			}
		}
		timeout_matrix = setTimeout("EnableSendMatrix()",timeout_enable_matrix);
		return "&matrix="+matrix;
	}
	return "";
}
function EnableSendMatrix(){
	bSendMatrix = true;
}
function ProcessSwitchTypeCmd(data){
	var ar_param = data.split("\t");
	/*playerid,newtype*/
	var t_username = GetUsername(ar_param[1]);
	UpdateType(ar_param[2],t_username);
	if(ar_param[2] == "h" && my_username == t_username)
		bHost = true;
	else
		bHost = false;
	if(my_username == t_username)
		ToggleHostGUI();
	UpdateSystemDiv(thetime+" <span class=\"mtetris_"+GetTeam(t_username)+"\">"+t_username+"</span> "+LANG_IS_NOW_HOST);
}
function ProcessExitCmd(){
	connected = false;
	alert(LANG_MSG_EXIT);
	CloseWindow();
}
function CleanPlayerPanel(){
	for(i=1;i<=6;i++)
		document.getElementById("player"+i+"_container").innerHTML = "";
}
function InitGame(){
	var tbl,tb,cols,rows,row,col;
	board = document.getElementById("games_tetris");
	next = document.getElementById("next");
	if(board == null)
		return false;
	document.key.down.focus();
	document.key.down.onkeydown = VerifyKeyPressGame;
}
function GameOver(){
	bEndGame = true;
	UpdateSystemDiv(LANG_GAME_OVER);
	SendGameOver();
	ApplyGameOver();
}
function ApplyStartGame(){
	clearTimeout(TimeID);
	bGameStarted = true;
	StartNewGame();
}
function ClearNextAndBoard(){
	/*make sure to remove next and board elements*/
	var last;
	while(next.hasChildNodes())
		next.removeChild(next.lastChild);
	while(board.hasChildNodes()){
		last = board.lastChild;
		if(last.id != "div_button_start" && last.id != "div_image_spect")
			board.removeChild(last);
		else
			break;
	}
}
function ClearAllLines(){
	var rows,cols;
	for(rows=0;rows<YQtyBlocks;rows++){
		for(cols=0;cols<XQtyBlocks;cols++){
			if(BoardBlocks[rows][cols]!=null){
				board.removeChild(BoardBlocks[rows][cols]);
				BoardBlocks[rows][cols]= null;
			}
		}
	}
}
function ClearSomeLines(qty){
	var rows,cols;
	var start = YQtyBlocks-1;
	var stop = start-qty;
	var cols_null;
	/*remove bottom qty lines*/
	for(rows=start; rows>stop; rows--){
		cols_null = 0;
		for(cols=0; cols<XQtyBlocks; cols++){
			if(BoardBlocks[rows][cols]!=null){
				board.removeChild(BoardBlocks[rows][cols]);
				BoardBlocks[rows][cols]= null;
			}else
				cols_null++;
		}
		if(cols_null >= XQtyBlocks)
			break;
	}	
	/*apply translation to others*/
	for(rows=stop; rows>=0; rows--){
		cols_null = 0;
		for(cols=0; cols<XQtyBlocks; cols++){
			if(BoardBlocks[rows][cols] != null){
				BoardBlocks[rows][cols].style.top = (BoardBlocks[rows][cols].offsetTop + (SizeB + SizePadding)*qty)+"px";
				BoardBlocks[rows+qty][cols] = BoardBlocks[rows][cols];
				BoardBlocks[rows][cols]= null;
			}else
				cols_null++;
		}
		if(cols_null >= XQtyBlocks)
			break;
	}
}
function AddLinesToUser(cnt_line,pos_x){
	clearTimeout(TimeID);
	var arr_pos = new Array();
	var i;
	for(i=0; i<XQtyBlocks; i++)
		arr_pos[i] = YQtyBlocks;
	if(cnt_line>1){
		for(i=0;i<cnt_line;i++)
			AddTheLine(pos_x[i],arr_pos);
	}else
		AddTheLine(pos_x,arr_pos);
	MoveCurrentShapeUp(arr_pos);
	GameInProgress();
}
function AddTheLine(px,arr_pos){
	var rows,cols;
	for(rows=0;rows<YQtyBlocks;rows++){
		for(cols=0;cols<XQtyBlocks;cols++){
			if(rows){
				if(BoardBlocks[rows][cols]!=null){
					BoardBlocks[rows][cols].style.top = (BoardBlocks[rows][cols].offsetTop - SizeB - SizePadding)+"px";
					BoardBlocks[rows-1][cols] = BoardBlocks[rows][cols];
					BoardBlocks[rows][cols]= null;
					if(rows-1<arr_pos[cols])
						arr_pos[cols] = rows-1;
				}
			}else if(BoardBlocks[rows][cols]!=null)
				board.removeChild(BoardBlocks[rows][cols]);
		}
	}
	var new_block = null;
	var py = YQtyBlocks-1;
	var shape_id;
	rows = py;
	for(cols=0;cols<XQtyBlocks;cols++){
		if(cols != px){
			/*y,x,py,px,coul*/
			shape_id = Math.floor(Math.random()*shapes.length);
			new_block = new block(0,0,py,cols,shape_id+1);
			BoardBlocks[rows][cols] = new_block.el;
			board.appendChild(new_block.el);
		}
	}
}
function AddClickDiv(){
	var el = document.createElement("div");
	el.style.position = "absolute";
	el.style.top = "0px";
	el.style.left = "0px";
	el.style.width = "180px";
	el.style.height = "390px";
	el.style.zIndex = 5;
	el.style.fontSize = "0px";
	el.innerHTML = "<a href=\"#\" class=\"n\" style=\"cursor:hand\"><table width=\"100%\" cellspacing=\"0\" cellpadding=\"0\"><tr><td width=\"180\" height=\"390\">&nbsp;</td></tr></table></a>";
	el.onclick = function(){ClickUser(-1);};
	el.onmouseover = function(){if(bGameStarted)this.style.backgroundImage = 'url(/m/i/games/multi_tetris/tetris_target.gif)';};
	el.onmouseout = function(){this.style.backgroundImage = 'url(/m/s.gif)';};
	board.appendChild(el);
}
function StartNewGame(){
	var i;
	ClearNextAndBoard();
	bEndGame = false;
	bSendMatrix = false;
	clearTimeout(timeout_matrix);
	timeout_matrix = setTimeout("EnableSendMatrix()",timeout_enable_matrix);
	if(my_team == 0)
		return;
	AddClickDiv();
	InitBlocks();
	posx = ((XQtyBlocks / 2)-2);
	Speed = InitSpeed;
	level = 1;
	score = 0;
	game_score = 0;
	line = 0;
 	pyramadis = 0;
	UpdateScore();
	/*not a spectator*/
	ShapeNext = new shape(Math.floor(Math.random()*shapes.length),1,0,next);
	shape_id = Math.floor(Math.random()*shapes.length);
	/*horz bar*/
	if(shape_id == 5)
		posy = -1;
	else
		posy = 0;
	ShapeCurrent = new shape(shape_id,posy,posx,board);
	GameInProgress();
}
function ProcessGetCmd(ar_list_cmd){
	GetTheTime();
	/*skip 1st (cmd)*/
	for(var i=1;i<ar_list_cmd.length;i++){
		if(ar_list_cmd[i].length){
			first_char = ar_list_cmd[i].charAt(0);
			if(first_char == 't'){
				ProcessMatrixCmd(ar_list_cmd[i]);	
			}else if(first_char == 'c'){
				lineid++;
				ProcessChatCmd(ar_list_cmd[i]);
			}else if(first_char == 'i'){
				lineid++;
				ProcessItemsCmd(ar_list_cmd[i]);
			}else if(first_char == 'j'){
				lineid++;
				ProcessJoinCmd(ar_list_cmd[i]);
				UpdateAllTeamPanels();
				CleanPlayerPanel();
			}else if(first_char == 'd'){
				lineid++;
				ProcessDisconnectCmd(ar_list_cmd[i]);			
				UpdateAllTeamPanels();
				CleanPlayerPanel();
			}else if(first_char == 'k'){
				lineid++;
				ProcessKickCmd(ar_list_cmd[i]);				
			}else if(first_char == 'b'){
				lineid++;
				ProcessBanCmd(ar_list_cmd[i]);	
				UpdateAllTeamPanels();	
				CleanPlayerPanel();		
			}else if(first_char == 's'){
				lineid++;
				ProcessSwitchCmd(ar_list_cmd[i]);
				SetPlayersPanelsForTeams();
				UpdateAllTeamPanels();
				CleanPlayerPanel();	
			}else if(first_char == 'p'){
				lineid++;
				ProcessSwitchTypeCmd(ar_list_cmd[i]);				
			}else if(first_char == 'x'){
				lineid++;
				ProcessExitCmd();				
			}else if(first_char == 'g'){
				lineid++;
				ProcessGameStartCmd();
			}else if(first_char == 'o'){
				lineid++;
				ProcessGameOverCmd(ar_list_cmd[i]);
				UpdateAllTeamPanels();
			}else if(first_char == 'l'){
				lineid++;
				ProcessAddLinesCmd(ar_list_cmd[i]);				
			}else if(first_char == 'r'){
				lineid++;
				ProcessRemoveLineCmd(ar_list_cmd[i]);				
			}else if(first_char == 'a'){
				lineid++;
				ProcessPauseCmd(ar_list_cmd[i]);				
			}
		}
	}
}
function ApplyMeteoroid(params){
	/*meteoroid => cx:cy:radius*/
	var cx = params[0];
	var cy = params[1];
	var radius = params[2];
	var start_x = cx - radius;
	var end_x = cx + radius;
	var start_y,end_y,incy=0,signy=1,delta;
	var rows,cols;
	if(start_x < 0)
		start_x = 0;
	if(end_x > XQtyBlocks-1)
		end_x = XQtyBlocks-1;
	for(cols=start_x; cols<=end_x; cols++){
		delta = radius-Math.abs(cols-cx);
		rows = cy;
		start_y = rows - delta;
		end_y = rows + delta;
		if(start_y < 0)
			start_y = 0;
		if(end_y > YQtyBlocks-1)
			end_y = YQtyBlocks-1;
		for(rows=start_y; rows<=end_y; rows++){
			if(BoardBlocks[rows][cols] != null){				
				board.removeChild(BoardBlocks[rows][cols]);
				BoardBlocks[rows][cols] = null;
			}
		}
	}
}
function ApplyLightning(params){
	/*lightning => px:width:height*/
	var rows,cols;
	var start_x=params[0];
	var end_x=start_x+params[1]-1;
	var cnt,bFirstFound;
	var height = params[2];
	for(cols=start_x; cols<end_x+1;cols++){
		bFirstFound = false;
		cnt = 0;
		for(rows=0;rows<YQtyBlocks;rows++){
			if(BoardBlocks[rows][cols] != null){		
				board.removeChild(BoardBlocks[rows][cols]);
				BoardBlocks[rows][cols] = null;
				bFirstFound = true;
			}
			if(bFirstFound)
				cnt++;
			if(cnt >= height)
				break;
		}
	}
}
function IsInArray(value,array){
	for(var i=0; i<array.length; i++){
		if(array[i] == value)
			return true;
	}
	return false;
}
function GetRandRange(min,max){
	return (Math.floor(Math.random()*(max+1-min,max))+min);
}
function ApplyVolcan(params){
	/*volcanic larva =>line1:px_hole_a:px_hole_b:px_hole_c:line2:..etc*/
	var holes,rows,cols,i,arr_temp,start_y;
	var bHasLine = true,new_block;
	var index = 0,cnt,randx;
	var arr_pos = new Array();
	do{
		if((holes=params[index]) != null){
			index++;
			arr_temp = new Array();
			for(i=0;i<holes;i++){
				arr_temp.push(params[index]);
				index++;
			}
			for(cols=0; cols<XQtyBlocks;cols++){
				if(IsInArray(cols,arr_temp) == false){
					arr_pos[cols] = YQtyBlocks;
					for(rows=0; rows<YQtyBlocks;rows++){
						if(BoardBlocks[rows][cols] != null){
							if(rows-1>0){
								new_block = new block(0,0,rows-1,cols,2,SizeB,SizePadding);
								BoardBlocks[rows-1][cols] = new_block.el;
								board.appendChild(new_block.el);
								if(rows-1 < arr_pos[cols])
									arr_pos[cols] = rows-1;
							}
							break;
						}else if(rows == YQtyBlocks-1){
							new_block = new block(0,0,rows,cols,2,SizeB,SizePadding);
							BoardBlocks[rows][cols] = new_block.el;
							board.appendChild(new_block.el);
							if(rows < arr_pos[cols])
								arr_pos[cols] = rows;
						}
					}						
				}
			}
		}else
			bHasLine = false;
	}while(bHasLine);
	/*make sure we don't have complete lines*/
	for(rows=YQtyBlocks;rows>0;rows--){
		cnt = 0;
		for(cols=0;cols<XQtyBlocks;cols++){
			if(BoardBlocks[rows] && BoardBlocks[rows][cols] != null)
				cnt++;
			else
				break;
		}
		if(cnt == XQtyBlocks){
			randx = XQtyBlocks-1;
			board.removeChild(BoardBlocks[rows][randx]);
			BoardBlocks[rows][randx] = null;
		}
	}
	return arr_pos;
}
function ApplyAcid(params){
	/*acid rain => qty_holes[XQtyBlocks]*/
	var rows,cols,bStarted,cnt;
	for(cols=0; cols<XQtyBlocks;cols++){
		if(params[cols]){
			bStarted = false;
			cnt = 0;
			for(rows=0; rows<YQtyBlocks;rows++){
				if(BoardBlocks[rows][cols] != null){
					bStarted = true;
					board.removeChild(BoardBlocks[rows][cols]);
					BoardBlocks[rows][cols] = null;
				}
				if(bStarted)
					cnt++;
				if(cnt >= params[cols])
					break;
			}
		}
	}
}
function PanelApplyItemToUser(item_id, params){
	clearTimeout(TimeID);
	if(item_id == 2)
		ClearAllLines();
	else if(item_id == 3)
		ClearSomeLines(3);
	else if(item_id == 8)
		ApplyMeteoroid(params);
	else if(item_id == 9)
		ApplyLightning(params);
	else if(item_id == 10){
		var arr_pos = ApplyVolcan(params);
		MoveCurrentShapeUp(arr_pos);
	}
	else if(item_id == 11)
		ApplyAcid(params);
	GameInProgress();
}
function UpdateChatDiv(str,type){
	var objDiv = document.getElementById("chat_message");
	objDiv.innerHTML += "<div class=\"chat\">"+str + "</div>";
	objDiv.scrollTop = objDiv.scrollHeight;
}
function UpdateSystemDiv(str){
	var objDiv = document.getElementById("system_box");
	objDiv.innerHTML += "<div class=\"system\">"+str + "</div>";
	objDiv.scrollTop = objDiv.scrollHeight;
}
function player(p,u,t){
	this.playerid = p;
	this.username = u;
	this.type = t;
	this.panel = 0;
}
function SwitchPlayer(team,username,div){
	if(team.length){
		if(team == "kick" && bHost){
			SendKick(username);
		}else if(team == "ban" && bHost){
			SendBan(username);
		}else if(team.length && (team == 0 || bHost)){
			SendSwitchTeam(team,username);
		}
		div.disabled = true;
	}else{
		div.options[0].selected = true;
	}
}
function PlayeridExists(pid){
	var i,j;
	for(j=0;j<4;j++){
		for(i=0;i<ListPlayers[j].length;i++){
			if(ListPlayers[j][i].playerid == pid)
				return true;
		}
	}
	return false;
}
function UpdateMyGUI(team){		
	my_team = team;

	/*I become spectator
	update my panel to switch it to player panel*/
	if(team == 0){
		/*empty actual panel*/
		ClearNextAndBoard();
		InitGame();
	}	
	spectator_panel_playerid = null;
	spectator_panel_username = null;
	spectator_panel_team = null;
}
/*put my teamates close to me*/
function SetPlayersPanelsForTeams(){
	var panels_take = new Array(6);
	var my_friends_panel_setup = new Array(1,4,2,5,3,6);
	var i,j,k,bStop=false,the_team,the_username;
	/*if im spectator, choose host to view in main panel*/
	if(my_team == 0){
		for(j=1;j<4;j++){
			for(i=0;i<ListPlayers[j].length;i++){
				if(ListPlayers[j][i].type == "h"){
					spectator_panel_playerid = ListPlayers[j][i].playerid;
					spectator_panel_username = ListPlayers[j][i].username;
					spectator_panel_team = j;
					the_team = spectator_panel_team;
					the_username = ListPlayers[j][i].username;
					bStop = true;
					break;
				}
			}
			if(bStop)
				break;
		}
	}else{
		the_team = my_team;
		the_username = my_username;
	}
	/*once for teamates*/
	for(j=0;j<6;j++)
		pid_panels[j] = -1;
	for(i=0;i<ListPlayers[the_team].length;i++){
		if(ListPlayers[the_team][i].username != the_username){
			for(j=0;j<6;j++){
				if(my_friends_panel_setup[j]){
					ListPlayers[the_team][i].panel = my_friends_panel_setup[j];
					pid_panels[my_friends_panel_setup[j]-1] = ListPlayers[the_team][i].playerid;
					my_friends_panel_setup[j] = false;
					break;
				}
			}
		}
	}
	/*another for others (not spectator)*/
	for(k=1;k<4;k++){
		if(k != the_team){
			for(i=0;i<ListPlayers[k].length;i++){
				for(j=0;j<6;j++){
					if(my_friends_panel_setup[j]){
						ListPlayers[k][i].panel = my_friends_panel_setup[j];
						pid_panels[my_friends_panel_setup[j]-1] = ListPlayers[k][i].playerid;
						my_friends_panel_setup[j] = false;
						break;
					}
				}
			}
		}
	}
}
function UpdateGUIPanels(){
	var panel_updated = new Array(false,false,false,false,false,false);
	var i,j;
	for(j=1;j<4;j++){
		for(i=0;i<ListPlayers[j].length;i++){
			if(ListPlayers[j][i].username != my_username && spectator_panel_playerid != ListPlayers[j][i].playerid){
				document.getElementById("player"+ListPlayers[j][i].panel+"_title").className = "players_title_"+ListTeam[j];
				document.getElementById("player"+ListPlayers[j][i].panel+"_title").innerHTML = ListPlayers[j][i].username;
				document.getElementById("player"+ListPlayers[j][i].panel+"_container").className = "players_container_block";
				panel_updated[ListPlayers[j][i].panel-1] = true;			
			}
		}
	}
	var ar_patch = new Array(2,4,6,3,5,7);
	for(i=0;i<6;i++){
		if(panel_updated[i]==false){
			document.getElementById("player"+(i+1)+"_title").className = "players_title";
			document.getElementById("player"+(i+1)+"_title").innerHTML = "#"+ar_patch[i];
			document.getElementById("player"+(i+1)+"_container").className = "players_container";		
		}
	}
	ApplyUsernameSpectPanel();
}
function ApplyUsernameSpectPanel(){
	if(spectator_panel_playerid != null){
		var el = document.createElement("div");
		el.className = "players_title_"+ListTeam[spectator_panel_team];
		el.innerHTML = spectator_panel_username;
		el.style.position = "absolute";
		el.style.top = "0px";
		el.style.width = "180px";
		el.style.textAlign = "center";
		el.style.zIndex = "4";
		board.appendChild(el);
	/*	spectator_panel.ClearAll();
		spectator_panel.InitGameSpectator();
		spectator_panel.AddUsernameTop(spectator_panel_username);*/
	}
}
function UpdateScore(){
	document.getElementById("tetris_points").innerHTML = score;
	document.getElementById("tetris_level").innerHTML = level;
	document.getElementById("tetris_lines").innerHTML = line;
	document.getElementById("tetris_pyramadis").innerHTML = pyramadis;
	game_gold = Math.floor(game_score/RatioScoreGold);
	game_stone = Math.floor(game_score/RatioScoreStone);	
	document.getElementById("tetris_gold").innerHTML = gold+game_gold;
	document.getElementById("tetris_stone").innerHTML = stone+game_stone;
}
function UpdateTeam(team,username){
	/*update my gui*/
	if(username == my_username)
		UpdateMyGUI(team);
	var i,j,team_update=-1;
	/*find username*/
	for(j=0;j<4;j++){
		for(i=0;i<ListPlayers[j].length;i++){
			/*found and not moving to same team again*/
			if(ListPlayers[j][i].username == username && j != team){
				/*place in new team*/
				ListPlayers[team][ListPlayers[team].length] = ListPlayers[j][i];
				delete ListPlayers[j][i];
				team_update = j;
				break;
			}
		}
	}
	/*update team list for proper index*/
	if(team_update != -1){
		var index = 0;
		var ListPlayersTemp = new Array();
		for(i=0;i<ListPlayers[team_update].length;i++){
			if(ListPlayers[team_update][i] != null){
				ListPlayersTemp[index] = new player(ListPlayers[team_update][i].playerid, ListPlayers[team_update][i].username, ListPlayers[team_update][i].type);
				index++;
			}
		}
		ListPlayers[team_update] = ListPlayersTemp;
	}
	SetPlayersPanelsForTeams();
	UpdateGUIPanels();
}
function UpdateType(type,username){
	var i,j;
	for(j=0;j<4;j++){
		for(i=0;i<ListPlayers[j].length;i++){
			if(ListPlayers[j][i].username == username){
				ListPlayers[j][i].type = type;
				break;
			}
		}
	}
}
function DeletePlayer(username){
	var i,j;
	for(j=0;j<4;j++){
		for(i=0;i<ListPlayers[j].length;i++){
			if(ListPlayers[j][i].username == username){
				delete ListPlayers[j][i];
				break;
			}
		}
	}
	var ListPlayersTemp = new Array();
	ListPlayersTemp[0] = new Array();
	ListPlayersTemp[1] = new Array();
	ListPlayersTemp[2] = new Array();
	ListPlayersTemp[3] = new Array();
	
	var index;
	for(j=0;j<4;j++){
		index = 0;
		for(i=0;i<ListPlayers[j].length;i++){
			if(ListPlayers[j][i] != null){
				ListPlayersTemp[j][index] = new player(ListPlayers[j][i].playerid, ListPlayers[j][i].username, ListPlayers[j][i].type);
				index++;
			}
		}
	}
	ListPlayers = ListPlayersTemp;	
}
function UpdateAllTeamPanels(){
	for(var i=0;i<ListTeam.length;i++)
		document.getElementById('mtetris_'+ListTeam[i]).innerHTML = GetPlayers(i);
}
function GetPlayers(team){
	var temp = "",host_str;
	var i,j;
	for(i=0;i<ListPlayers[team].length;i++){
		host_str = (ListPlayers[team][i].type == "h"?"&bull;":"");
		var player_number = GetPlayerNumber(ListPlayers[team][i].playerid, ListPlayers[team][i].type == "h");
		if(player_number)
			player_number = " #"+player_number;
		else 
			player_number = "";
		if(!bGameStarted){
			if(bHost){
				temp += "<select class=\"mtetris\" id=\""+ListPlayers[team][i].username+"\" onchange=\"SwitchPlayer(this.value,this.id,this)\">";
				temp += "<option>"+ListPlayers[team][i].username+host_str+player_number+"</option>";
				temp += "<option value=\"\"></option>";
				
				for(j=1;j<LANG_USER_TEAMS.length;j++){
					if(LANG_USER_TEAMS[j][0] != team)
						temp += "<option value=\""+LANG_USER_TEAMS[j][0]+"\">&raquo; "+LANG_USER_TEAMS[j][1]+"</option>";
				}
				/*Add spectators*/
				if(LANG_USER_TEAMS[0][0] != team)
					temp += "<option value=\""+LANG_USER_TEAMS[0][0]+"\">&raquo; "+LANG_USER_TEAMS[0][1]+"</option>";
				if(ListPlayers[team][i].playerid != my_playerid){
					temp += "<option value=\"\"></option>";			
					temp += "<option value=\"kick\">&raquo; "+LANG_KICK+"</option>";
					temp += "<option value=\"ban\">&raquo; "+LANG_BAN+"</option>";
				}
				temp += "</select>";
			}else if(ListPlayers[team][i].playerid == my_playerid && LANG_USER_TEAMS[0][0] != team){
				temp += "<select class=\"mtetris\" id=\""+ListPlayers[team][i].username+"\" onchange=\"SwitchPlayer(this.value,this.id,this)\">";
				temp += "<option>"+ListPlayers[team][i].username+host_str+player_number+"</option>";
				temp += "<option value=\"\"></option>";
				temp += "<option value=\""+LANG_USER_TEAMS[0][0]+"\">&raquo; "+LANG_USER_TEAMS[0][1]+"</option>";
				temp += "</select>";
			}else
				temp += "<div style=\"height:14px\">"+ListPlayers[team][i].username+host_str+player_number+"</div>";
		}else
			temp += "<div style=\"height:14px\">"+ListPlayers[team][i].username+host_str+player_number+"</div>";
	}
	return temp;
}
function SetupPanels(){
	if(!bGameStarted){
		SetPlayersPanelsForTeams();
		UpdateGUIPanels();
	}
}
function AddPlayer(p_playerid,p_username,type,team){
	if(PlayeridExists(p_playerid) == false){
		var temp = GetPlayers(team),host_str;
		host_str = (type == "h"?"&bull;":"");
		var player_number = GetPlayerNumber(p_playerid,type=="h");
		if(player_number)
			player_number = " #"+player_number;
		else 
			player_number = "";
		ListPlayers[team][ListPlayers[team].length] = new player(p_playerid,p_username,type);
		if(!bGameStarted){
			if(bHost){
				temp += "<select class=\"mtetris\" id=\""+p_username+"\" onchange=\"SwitchPlayer(this.value,this.id,this)\">";
				temp += "<option>"+p_username+host_str+player_number+"</option>";
				temp += "<option value=\"\"></option>";
				for(var i=1;i<LANG_USER_TEAMS.length;i++){
					if(LANG_USER_TEAMS[i][0] != team)
						temp += "<option value=\""+LANG_USER_TEAMS[i][0]+"\">&raquo; "+LANG_USER_TEAMS[i][1]+"</option>";
				}
				/*Add spectators*/
				if(LANG_USER_TEAMS[0][0] != team)
					temp += "<option value=\""+LANG_USER_TEAMS[0][0]+"\">&raquo; "+LANG_USER_TEAMS[0][1]+"</option>";
				if(my_playerid != p_playerid){
					temp += "<option value=\"\"></option>";			
					temp += "<option value=\"kick\">&raquo; "+LANG_KICK+"</option>";
					temp += "<option value=\"ban\">&raquo; "+LANG_BAN+"</option>";
				}
				temp += "</select>";
			}else if(p_playerid == my_playerid && LANG_USER_TEAMS[0][0] != team){
				temp += "<select class=\"mtetris\" id=\""+p_username+"\" onchange=\"SwitchPlayer(this.value,this.id,this)\">";
				temp += "<option>"+p_username+host_str+player_number+"</option>";
				temp += "<option value=\"\"></option>";
				temp += "<option value=\""+LANG_USER_TEAMS[0][0]+"\">&raquo; "+LANG_USER_TEAMS[0][1]+"</option>";
				temp += "</select>";
			}else
				temp += "<div style=\"height:14px\">"+p_username+host_str+player_number+"</div>";
		}else
			temp += "<div style=\"height:14px\">"+p_username+host_str+player_number+"</div>";
		if(p_username == my_username)
			UpdateMyGUI(team);
		document.getElementById('mtetris_'+ListTeam[team]).innerHTML = temp;
	}
	if(my_team != -1 && !bGameStarted)
		SetupPanels();
}
