// problem.js v.1.1.0
// Copyright (c) 2009 K.Seki
// -- get one problem from server

var currMap = null;
var currMobileMap = null;
var mobileMapCopied = null;
var problemCopy = null;
var goals = new Array();
var nGoals;
var playerX;
var playerY;
var nSettledInitial;

function getMaxLevel()
{
	var req = new XMLHttpRequest();
	var r = 0;
	
	req.onreadystatechange = function()
	{
		if (req.readyState == 4)
		{
		if (req.status == 200) // received
		{
			if (req.responseXML == null)
			{
				window.alert(req.responseText);
				r = -1;
				return -1;
			}
			
			var resp = req.responseXML;
			var root = resp.getElementsByTagName('max');
			var item = root.item(0);
			var val = item.firstChild.nodeValue;
			r = Number(val);
		}
		else
		{
			window.alert("Server-side error.");
			r = -1;
        	return -1; // server error
		}
    } else {
		// "通信中...";
	}
  }
  
  req.open('GET', 'maxlevel.php', false);
  req.send(null);
	
  return r;
}

function getLevel(n)
{
	var req = new XMLHttpRequest();
	
	req.onreadystatechange = function()
	{
		if (req.readyState == 4)
		{
		if (req.status == 200) // received
		{
			if (req.responseXML == null)
			{
				window.alert(req.responseText);
				return -1;
			}
			setProblem(req.responseXML);
		}
		else
		{
			window.alert("Server-side error.");
        	return -1; // server error
		}
    } else {
    	;
		// "通信中...";
	}
  }
  
  req.open('GET', 'gamelevel.php?level=' + n, false);
  req.send(null);
	
  return 0;
}

function setProblem(resp)
{
	nGoals = 0;
	nSettled = 0;
	var root = resp.getElementsByTagName('level');
	if (root.length == 0) return 0;
	
//	var node = root.item(0);
	var node = resp.getElementsByTagName('nrows');
	var item = node.item(0);
	var nRows = item.firstChild.nodeValue;
	
	var buff = new Array(nRows);
	
	var i,j;
	node = resp.getElementsByTagName('row');
	var nCols = 0;
	
	for (i=0; i<nRows; i++)
	{
		item = node.item(i);
		buff[i] = item.getAttribute('value');
		if (nCols < buff[i].length)
			nCols = buff[i].length;
	}
		
	if (currMap) delete currMap;
	if (currMobileMap) delete currMobileMap;
	if (mobileMapCopied) delete mobileMapCopied;
	if (goals) delete goals;
	
	
	
	var c, g, len;
	currMap = new Array(nRows);
	currMobileMap = new Array(nRows);
	mobileMapCopied = new Array(nRows);
	goals = new Array();
	
	for (i=0; i<nRows; i++)
	{
		currMap[i] = new Array(nCols);
		currMobileMap[i] = new Array(nCols);
		mobileMapCopied[i] = new Array(nCols);
		
		len = buff[i].length;
		
		for (j=0; j<nCols; j++)
		{
			currMobileMap[i][j] = -1;
			if (j >= len)
			{
				currMap[i][j] = kOuter;
				continue;
			}
			c = buff[i].charAt(j);
			if (c == '#')
				currMap[i][j] = kWall;
			else if (c == '.')
				currMap[i][j] = kFloor;
			else if (c == 'o')
			{
				currMap[i][j] = kGoal;
				nGoals++;
			}
			else if (c == '*')
			{
				currMap[i][j] = kFloor;
				currMobileMap[i][j] = kBox;
				mobileMapCopied[i][j] = kBox;
			}
			else if (c == '@') // box on a goal
			{
				currMap[i][j] = kGoal;
				nGoals++;
				currMobileMap[i][j] = kBox;
				mobileMapCopied[i][j] = kBox;
				nSettled++;
			}
			else if (c == 's')
			{
				currMap[i][j] = kFloor;
				currMobileMap[i][j] = kPlayer;
				mobileMapCopied[i][j] = kPlayer;
				playerLoc.setXY(j, i);
				playerX = j;
				playerY = i;
			}
			else if (c == '$') // player on a goal
			{
				currMap[i][j] = kGoal;
				nGoals++;
				currMobileMap[i][j] = kPlayer;
				mobileMapCopied[i][j] = kPlayer;
				playerLoc.setXY(j, i);
				playerX = j;
				playerY = i;
			}
			else
				currMap[i][j] = kOuter;
		}
	}
	
	nSettledInitial = nSettled;
}

function resetProblem()
{
	var i,j;
	var nRows = currMobileMap.length;
	var nCols = currMobileMap[0].length;
	
	for (i=0; i<nRows; i++)
		for (j=0; j<nCols; j++)
			currMobileMap[i][j] = mobileMapCopied[i][j];
	
	nSettled = nSettledInitial;
	playerLoc.setXY(playerX, playerY);
}

function getNodeValue(currNode, name)
{
	var node = currNode.getElementsByName(name).item(0);
	return node.firstChild.nodeValue;
}