servletRegionURL = '/servlets/region';
servletStatURL = '/servlets/statistic';
servletCommentURL = '/servlets/comment';
MODE_SS_GDS = 0x0;
MODE_SS_GES = 0x1;
MODE_SC_GC = 0x0;
MODE_SC_PC = 0x1;
MODE_SC_MCAS = 0x2;
MODE_SC_DC = 0x3;

ERROR_NO_FAULT = 0x0;
ERROR_UNKNOWN = 0x7FFF;

function getXMLHttpObject()
{
	try
	{
		// Firefox,	Opera 8.0+,	Safari
		return new XMLHttpRequest();
	}
	catch(e)
	{
		// Internet	Explorer
		try
		{
			return new ActiveXObject('Msxml2.XMLHTTP');
		}
		catch(e)
		{
			try
			{
				return new ActiveXObject('Microsoft.XMLHTTP');
			}
			catch(e)
			{
				return null;
			}
		}
	}
}

function getRegions(iCountryId, iCallbackFunc)
{
	var url = servletRegionURL + '?c=' + iCountryId;
	var req = getXMLHttpObject();

	req.onreadystatechange = function()
	{
		if ((req.readyState == 4) && (req.status == 200))
		{
			iCallbackFunc(parseRegionsMessageXML(req.responseXML));
		}
		else if ((req.readyState == 4) && (req.status != 200))
		{
			if ((req.status >= 12000) && (req.status <= 13000))
			{
				setTimeout('getRegions(' + iCountryId + ',' + iCallbackFunc + ')', 1000);
			}
			else
			{
				iCallbackFunc(makeErrorMessage(req));
			}
		}
	};

	req.open('GET', url, true);
	req.send(null);
}

function parseRegionsMessageXML(iResponse)
{
	var	response = new Response();
    var responseTag = iResponse.getElementsByTagName('response')[0];

	if (responseTag != null)
    {
		response.status = getNodeValue(responseTag, 'status');
		if (response.status != 0)
		{
			response.msg = getNodeValue(responseTag, 'msg');
		}
		else
		{
			var tag = responseTag.getElementsByTagName('regions')[0];
			response.object = new Regions();
			for (var a = 0; a < tag.childNodes.length; a++)
			{
				var regionTag = tag.childNodes[a];
				response.object.region[a] = new Region();
				response.object.region[a].id = getNodeValue(regionTag, 'id');
				response.object.region[a].name = getNodeValue(regionTag, 'name');
			}
		}
	}
	return response;
}

function getDefaultStat(iDate, iMaxWidth, iCallbackFunc)
{
	var url = servletStatURL + '?m=' + MODE_SS_GDS + '&dt=' + iDate + '&mw=' + iMaxWidth;
	var req = getXMLHttpObject();

	req.onreadystatechange = function()
	{
		if ((req.readyState == 4) && (req.status == 200))
		{
			iCallbackFunc(parseDefaultStatMsgXML(req.responseXML));
		}
		else if ((req.readyState == 4) && (req.status != 200))
		{
			if ((req.status >= 12000) && (req.status <= 13000))
			{
				setTimeout('getDefaultStat(' + iDate + ',' + iMaxWidth + ',' + iCallbackFunc + ')', 1000);
			}
			else
			{
				iCallbackFunc(makeErrorMessage(req));
			}
		}
	};

	req.open('GET', url, true);
	req.send(null);
}

function parseDefaultStatMsgXML(iResponse)
{
	var	response = new Response();
	var responseTag = iResponse.getElementsByTagName('response')[0];

	if (responseTag != null)
	{
		response.status = getNodeValue(responseTag, 'status');
		if (response.status != 0)
		{
			response.msg = getNodeValue(responseTag, 'msg');
		}
		else
		{
			var	poll = new Poll();
			var tag;

			poll.text = getNodeValue(responseTag, 'text');

			tag = responseTag.getElementsByTagName('results')[0];
			for (var a = 0; a < tag.childNodes.length; a++)
			{
				var resultTag = tag.childNodes[a];
				var	result = new Result();
				result.text = getNodeValue(resultTag, 'text');
				result.width = getNodeValue(resultTag, 'width');
				result.percent = getNodeValue(resultTag, 'percent');
				poll.result[a] = result;
			}
			response.object = poll;
		}
	}
	return response;
}

function getStat(iDate, iType, iMaxWidth, iCallbackFunc)
{
	var url = servletStatURL + '?m=' + MODE_SS_GES + '&dt=' + iDate + '&t=' + iType + '&mw=' + iMaxWidth;
	var req = getXMLHttpObject();

	req.onreadystatechange = function()
	{
		if ((req.readyState == 4) && (req.status == 200))
		{
			iCallbackFunc(parseStatMsgXML(req.responseXML));
		}
		else if ((req.readyState == 4) && (req.status != 200))
		{
			if ((req.status >= 12000) && (req.status <= 13000))
			{
				setTimeout('getStat(' + iDate + ',' + iType + ',' + iMaxWidth + ',' + iCallbackFunc + ')', 1000);
			}
			else
			{
				iCallbackFunc(makeErrorMessage(req));
			}
		}
	};

	req.open('GET', url, true);
	req.send(null);
}

function parseStatMsgXML(iResponse)
{
	var	response = new Response();
	var responseTag = iResponse.getElementsByTagName('response')[0];

	if (responseTag != null)
	{
		response.status = getNodeValue(responseTag, 'status');
		if (response.status != 0)
		{
			response.msg = getNodeValue(responseTag, 'msg');
		}
		else
		{
			var	stat = new Statistics();
			var tag;

			stat.text = getNodeValue(responseTag, 'text');

			tag = responseTag.getElementsByTagName('answers')[0];
			for (var a = 0; a < tag.childNodes.length; a++)
			{
				var answerTag = tag.childNodes[a];
				var	answer = new Answer();
				var resultsTag;

				answer.text = getNodeValue(answerTag, 'text');
				resultsTag = answerTag.getElementsByTagName('results')[0];
				for (var b = 0; b < resultsTag.childNodes.length; b++)
				{
					var resultTag = resultsTag.childNodes[b];
					var	result = new Result();

					result.text = getNodeValue(resultTag, 'text');
					result.width = getNodeValue(resultTag, 'width');
					result.percent = getNodeValue(resultTag, 'percent');
					answer.result[b] = result;
				}
				stat.answer[a] = answer;
			}
			response.object = stat;
		}
	}
	return response;
}

function getComments(iQuestion, iPage, iCallbackFunc)
{
	var url = servletCommentURL + '?m=' + MODE_SC_GC + '&q=' + iQuestion + '&pg=' + iPage;
	var req = getXMLHttpObject();

	req.onreadystatechange = function()
	{
		if ((req.readyState == 4) && (req.status == 200))
		{
			iCallbackFunc(parseCommentMsgXML(req.responseXML));
		}
		else if ((req.readyState == 4) && (req.status != 200))
		{
			if ((req.status >= 12000) && (req.status <= 13000))
			{
				setTimeout('getComments(' + iQuestion + ',' + iPage + ',' + iCallbackFunc + ')', 1000);
			}
			else
			{
				iCallbackFunc(makeErrorMessage(req));
			}
		}
	};

	req.open('GET', url, true);
	req.send(null);
}

function parseCommentMsgXML(iResponse)
{
	var	response = new Response();
	var responseTag = iResponse.getElementsByTagName('response')[0];

	if (responseTag != null)
	{
		response.status = getNodeValue(responseTag, 'status');
		if (response.status != 0)
		{
			response.msg = getNodeValue(responseTag, 'msg');
		}
		else
		{
			var	comments = new Comments();
			var tag;

			tag = responseTag.getElementsByTagName('comments')[0];
			for (var a = 0; a < tag.childNodes.length; a++)
			{
				var commentTag = tag.childNodes[a];
				var	comment = new Comment();
				comment.id = getNodeValue(commentTag, 'id');
				comment.author = getNodeValue(commentTag, 'author');
				comment.date = getNodeValue(commentTag, 'date');
				comment.text = getNodeValue(commentTag, 'text');
				comment.remove = Number(getNodeValue(commentTag, 'delete'));
				comment.report = Number(getNodeValue(commentTag, 'report'));
				comments.comment[a] = comment;
			}
			response.object = comments;
		}
	}
	return response;
}

function postComment(iQuestion, iText, iCallbackFunc)
{
	var url = servletCommentURL + '?m=' + MODE_SC_PC + '&q=' + iQuestion + '&t=' + encodeURIComponent(iText);
	var req = getXMLHttpObject();

	req.onreadystatechange = function()
	{
		if ((req.readyState == 4) && (req.status == 200))
		{
			iCallbackFunc(parseStatusMessageXML(req.responseXML));
		}
		else if ((req.readyState == 4) && (req.status != 200))
		{
			if ((req.status >= 12000) && (req.status <= 13000))
			{
				setTimeout('postComment(' + iQuestion + ',' + iText + ',' + iCallbackFunc + ')', 1000);
			}
			else
			{
				iCallbackFunc(makeErrorMessage(req));
			}
		}
	};

	req.open('GET', url, true);
	req.send(null);
}

function reportComment(iCommentId, iCallbackFunc)
{
	var url = servletCommentURL + '?m=' + MODE_SC_MCAS + '&id=' + iCommentId;
	var req = getXMLHttpObject();

	req.onreadystatechange = function()
	{
		if ((req.readyState == 4) && (req.status == 200))
		{
			iCallbackFunc(parseStatusMessageXML(req.responseXML), iCommentId);
		}
		else if ((req.readyState == 4) && (req.status != 200))
		{
			if ((req.status >= 12000) && (req.status <= 13000))
			{
				setTimeout('reportComment(' + iCommentId + ',' + iCallbackFunc + ')', 1000);
			}
			else
			{
				iCallbackFunc(makeErrorMessage(req));
			}
		}
	};

	req.open('GET', url, true);
	req.send(null);
}

function deleteComment(iCommentId, iCallbackFunc)
{
	var url = servletCommentURL + '?m=' + MODE_SC_DC + '&id=' + iCommentId;
	var req = getXMLHttpObject();

	req.onreadystatechange = function()
	{
		if ((req.readyState == 4) && (req.status == 200))
		{
			iCallbackFunc(parseStatusMessageXML(req.responseXML), iCommentId);
		}
		else if ((req.readyState == 4) && (req.status != 200))
		{
			if ((req.status >= 12000) && (req.status <= 13000))
			{
				setTimeout('deleteComment(' + iCommentId + ',' + iCallbackFunc + ')', 1000);
			}
			else
			{
				iCallbackFunc(makeErrorMessage(req));
			}
		}
	};

	req.open('GET', url, true);
	req.send(null);
}

function parseStatusMessageXML(iResponse)
{
	var	response = new Response();

	var responseTag = iResponse.getElementsByTagName('response')[0];
	if (responseTag != null)
	{
		response.status = getNodeValue(responseTag,'status');
		response.msg = getNodeValue(responseTag,'msg');
	}
	return response;
}

function makeErrorMessage(iReqObject)
{
	var	response = new Response();

	response.status = iReqObject.status;
	response.msg = 'Unknown error. Status code: ' + iReqObject.status;

	return response;
}

function getNodeValue(iTag, iElementName)
{
	if (iTag == null) return '';
	var	tag = iTag.getElementsByTagName(iElementName)[0];

	if (tag == null) return '';
	if (tag.firstChild == null ) return '';
	return tag.firstChild.data;
}

function Response()
{
	this.status = ERROR_UNKNOWN;
	this.msg = 'Unknown error';
	this.object = null;
}

function Comments()
{
	this.comment = [];
}

function Comment()
{
	this.id = 0;
	this.author = '';
	this.date = '';
	this.text = '';
	this.remove = 0;
	this.report = 0;
}

function Poll()
{
	this.result = [];
	this.text = '';
}

function Result()
{
	this.text = '';
	this.width = 0;
	this.percent = 0;
}

function Statistics()
{
	this.text = '';
	this.answer = [];
}

function Answer()
{
	this.text = '';
	this.result = [];
}

function Regions()
{
	this.region = [];
}

function Region()
{
	this.id = 0;
	this.name = '';
}