servletWordURL = '/servletWord';
MODE_SW_GASW = 0x0;
MODE_SW_RT = 0x2;
MODE_SW_GOW = 0x3;
MODE_SW_GOM = 0x4;
MODE_SW_GONW = 0x5;
MODE_SW_GRD = 0x6;

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 getOwnerWords(iPage, iCallbackFunc)
{
	var url = servletWordURL + '?m=' + MODE_SW_GOW + '&pg=' + iPage;
	var req = getXMLHttpObject();

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

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

function getOwnerNotifiedWords(iPage, iCallbackFunc)
{
	var url = servletWordURL + '?m=' + MODE_SW_GONW + '&pg=' + iPage;
	var req = getXMLHttpObject();

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

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

function parseOwnerWordsMessageXML(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	words = new Words();
			var tag;

			words.pageStart = getNodeValue(responseTag, 'pagestart');
			words.pageEnd = getNodeValue(responseTag, 'pageend');

			tag = responseTag.getElementsByTagName('words')[0];
			for (var a = 0; a < tag.childNodes.length; a++)
			{
				var wordTag = tag.childNodes[a];
				var	word = new Word();
				word.id = getNodeValue(wordTag, 'id');
				word.name = getNodeValue(wordTag, 'name');
				word.readdir = getNodeValue(wordTag, 'readdir');
				words.word[a] = word;
			}
			response.object = words;
		}
	}
	return response;
}

function getOwnerMappings(iPage, iCallbackFunc)
{
	var url = servletWordURL + '?m=' + MODE_SW_GOM + '&pg=' + iPage;
	var req = getXMLHttpObject();

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

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

function parseOwnerMapsMessageXML(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	mappings = new Mappings();
			var tag;

			mappings.pageStart = getNodeValue(responseTag, 'pagestart');
			mappings.pageEnd = getNodeValue(responseTag, 'pageend');

			tag = responseTag.getElementsByTagName('mappings')[0];
			for (var a = 0; a < tag.childNodes.length; a++)
			{
				var mappingTag = tag.childNodes[a];
				var	mapping = new Mapping();
				mapping.id = getNodeValue(mappingTag, 'id');
				mapping.name = getNodeValue(mappingTag, 'name');
				mapping.readdir = getNodeValue(mappingTag, 'readdir');
				mapping.enId = getNodeValue(mappingTag, 'enid');
				mapping.enName = getNodeValue(mappingTag, 'enname');
				mappings.mapping[a] = mapping;
			}
			response.object = mappings;
		}
	}
	return response;
}

function getAddSearchWords(iWord, iLangCode, iCallbackFunc)
{
	var params = 'm=' + MODE_SW_GASW + '&w=' + iWord + '&lc=' + iLangCode;
	var req = getXMLHttpObject();

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

	req.open('POST', servletWordURL, true);
	req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=utf-8');
	req.setRequestHeader('Content-Length', params.length);
	req.setRequestHeader('Connection', 'close');
	req.send(params);
}

function parseAddSearchWordsMessageXML(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('words')[0];
			response.object = new Words();
			for (var a = 0; a < tag.childNodes.length; a++)
			{
				var wordTag = tag.childNodes[a];
				var	word = new Word();
				word.id = getNodeValue(wordTag, 'id');
				word.name = getNodeValue(wordTag, 'name');
				word.text = getNodeValue(wordTag, 'text');
				word.readdir = getNodeValue(wordTag, 'readdir');
				response.object.word[a] = word;
			}
		}
	}
	return response;
}

function reportTranslation(iFromWordId, iToWordId, iText, iCallbackFunc)
{
	// TODO: Encode iText in some way...
	var params = 'm=' + MODE_SW_RT + '&fwid=' + iFromWordId + '&twid=' + iToWordId + '&t=' + 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('reportTranslation(' + iFromWordId + ',' + iToWordId + ',' + iText + ',' + iCallbackFunc + ')', 1000);
			}
			else
			{
				iCallbackFunc(makeErrorMessage(req));
			}
		}
	};

	req.open('POST', servletWordURL, true);
	req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=utf-8');
	req.setRequestHeader('Content-Length', params.length);
	req.setRequestHeader('Connection', 'close');
	req.send(params);
}

function getReadingDirection(iLangCode, iCallbackFunc)
{
	var url = servletWordURL + '?m=' + MODE_SW_GRD + '&l=' + iLangCode;
	var req = getXMLHttpObject();

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

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

function parseReadingDirectionMessageXML(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
		{
			response.object = getNodeValue(responseTag, 'readdir');
		}
	}
	return response;
}

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 Words()
{
	this.word = [];
	this.pageStart = 0;
	this.pageEnd = 0;
}

function Word()
{
	this.id = 0;
	this.name = '';
	this.text = '';
	this.readdir = 'ltr';
}

function Mappings()
{
	this.mapping = [];
	this.pageStart = 0;
	this.pageEnd = 0;
}

function Mapping()
{
	this.id = 0;
	this.name = '';
	this.readdir = 'ltr';
	this.enId = 0;
	this.enName = '';
}