var	servletUserURL = '/servletUser';
var	servletAdURL = '/servletAd';
var	servletRegionsURL = '/servletRegions';
var	servletUAURL = '/servletUA';

var UPLOAD_AD_NOT_STARTED = 0x0;
var UPLOAD_AD_RUNNING = 0x1;
var UPLOAD_AD_COMPLETE = 0x2;
var UPLOAD_AD_ERROR = 0x3;

var RESPONSE_OK = 0x0;
var RESPONSE_ERROR = 0xFFFF;

var MODE_SR_GRAC = 0x0;
var MODE_SR_GC = 0x1;

var MODE_AD_GAOST = 0x1;
var MODE_AD_GAFSU = 0x2;
var MODE_AD_RA = 0x3;
var MODE_AD_SMTO = 0x4;
var MODE_AD_TF = 0x5;

var MODE_SU_GSC = 0x1;
var MODE_SU_ATSC = 0x2;
var	MODE_SU_CLSC = 0x3;
var	MODE_SU_RIFSC = 0x4;
var	MODE_SU_CSC = 0x5;
var	MODE_SU_UUP = 0x6;

var MODE_SET_STATUS = 0x0;
var MODE_GET_STATUS = 0x1;

function initXMLHttp()
{
	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 updateUserPlace(iCityId, iCallbackFunc)
{
	var url = servletUserURL + '?m=' + MODE_SU_UUP + '&c=' + iCityId;
	var req = initXMLHttp();

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

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

function getRegionsAndCities(iRegionId, iCityId, iCallbackFunc)
{
	var url = servletRegionsURL + '?m=' + MODE_SR_GRAC + '&c=' + iCityId;
	var req = initXMLHttp();

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

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

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

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

			var citiesTag = responseTag.getElementsByTagName('cities')[0];
			for (var a = 0; a < citiesTag.childNodes.length; a++)
			{
				var cityTag = citiesTag.childNodes[a];
				var	city = new City();
				city.id = getNodeValue(cityTag, 'id');
				city.name = getNodeValue(cityTag, 'name');
				response.object.city[a] = city;
			}
		}
	}
	return response;
}

function getCities(iRegionId, iCallbackFunc)
{
	var url = servletRegionsURL + '?m=' + MODE_SR_GC + '&r=' + iRegionId;
	var req = initXMLHttp();

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

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

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

	if (responseTag != null)
    {
		response.status = parseInt(getNodeValue(responseTag, 'status'));
		if (response.status != 0)
		{
			response.msg = getNodeValue(responseTag, 'msg');
		}
		else
		{
			var tag = responseTag.getElementsByTagName('cities')[0];
			response.object = new Cities();
			for (var a = 0; a < tag.childNodes.length; a++)
			{
				var cityTag = tag.childNodes[a];
				var	city = new City();
				city.id = getNodeValue(cityTag, 'id');
				city.name = getNodeValue(cityTag, 'name');
				response.object.city[a] = city;
			}
		}
	}
	return response;
}

function getCategoryInfo(iSubcategoryId, iCallbackFunc)
{
	var url = '/servletCats?m=' + MODE_GCI + '&sc=' + iSubcategoryId;
	var req = initXMLHttp();

	req.onreadystatechange = function()
	{
		if ((req.readyState == 4) && (req.status == 200))
		{
			iCallbackFunc(parseCategoryInfoMessageXML(req.responseXML));
		}
		else if ((req.readyState == 4) && (req.status != 200))
		{
			iCallbackFunc(makeErrorMessage(req));
		}
	};

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

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

	if (responseTag != null)
	{
		response.status = parseInt(getNodeValue(responseTag, 'status'));
		if (response.status != 0)
		{
			response.msg = getNodeValue(responseTag, 'msg');
		}
		else
		{
			response.object = getNodeValue(responseTag, 'info');
		}
	}
	return response;
}

function getAdsOfSameType(iAdId, iFromCity, iPage, iCallbackFunc)
{
	var url = servletAdURL + '?m=' + MODE_AD_GAOST + '&id=' + iAdId + '&c=' + iFromCity + '&p=' + iPage;
	var req = initXMLHttp();

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

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

function getAdsFromSameUser(iUserId, iAdId, iFromCity, iPage, iCallbackFunc)
{
	var url = servletAdURL + '?m=' + MODE_AD_GAFSU + '&uid=' + iUserId + '&aid=' + iAdId + '&c=' + iFromCity + '&p=' + iPage;
	var req = initXMLHttp();

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

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

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

	if ( responseTag != null )
    {
		response.status = parseInt(getNodeValue(responseTag, 'status'));
		if (response.status != 0)
		{
			response.msg = getNodeValue(responseTag, 'msg');
		}
		else
		{
			var tag = responseTag.getElementsByTagName('ads')[0];
			response.object = new Ads();
			response.object.hasPrevious = (getNodeValue(responseTag, 'prev') == '1');
			response.object.hasNext = (getNodeValue(responseTag, 'next') == '1');
			for (var a = 0; a < tag.childNodes.length; a++)
			{
				var adTag = tag.childNodes[a];
				response.object.ad[a] = new Ad();
				response.object.ad[a].path = getNodeValue(adTag, 'path');
				response.object.ad[a].headline = getNodeValue(adTag, 'hl');
				response.object.ad[a].distance = getNodeValue(adTag, 'dist');
			}
		}
	}
	return response;
}

function reportAd(iAdId, iMail, iMsg, iCallbackFunc)
{
	var params = 'm=' + MODE_AD_RA + '&id=' + iAdId + '&ml=' + iMail + '&t=' + iMsg;
	var url = servletAdURL;
	var req = initXMLHttp();

	req.onreadystatechange = function()
	{
		if ((req.readyState == 4) && (req.status == 200))
		{
			iCallbackFunc(parseStatMsg(req.responseXML));
		}
		else if ((req.readyState == 4) && (req.status != 200))
		{
			if ((req.status >= 12000) && (req.status <= 13000))
			{
				setTimeout('reportAd(' + iAdId + ',' + iMail + ',' + iMsg + ',' + iCallbackFunc + ')', 1000);
			}
			else
			{
				iCallbackFunc(makeErrorMessage(req));
			}
		}
	};

	req.open('POST', url, 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 sendMailToOwner(iAdId, iName, iMail, iCtrlNum, iText, iCallbackFunc)
{
	var params = 'm=' + MODE_AD_SMTO + '&id=' + iAdId + '&n=' + iName + '&ml=' + iMail + '&cn=' + iCtrlNum + '&t=' + iText;
	var req = initXMLHttp();

	req.onreadystatechange = function()
	{
		if ((req.readyState == 4) && (req.status == 200))
		{
			iCallbackFunc(parseStatMsg(req.responseXML));
		}
		else if ((req.readyState == 4) && (req.status != 200))
		{
			if ((req.status >= 12000) && (req.status <= 13000))
			{
				setTimeout('sendMailToOwner(' + iAdId + ',' + iName + ',' + iMail + ',' + iCtrlNum + ',' + iText + ',' + iCallbackFunc + ')', 1000);
			}
			else
			{
				iCallbackFunc(makeErrorMessage(req));
			}
		}
	};

	req.open('POST', servletAdURL, 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 getUploadStatus(iCallbackFunc)
{
	var url = servletUAURL + '?m=' + MODE_GET_STATUS;
	var req = initXMLHttp();

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

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

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

	var responseTag = iResponse.getElementsByTagName('response')[0];
	if (responseTag != null)
	{
		var		uploadObject = new UploadObject();

		response.status = parseInt(getNodeValue(responseTag,'status'));
		if (response.status == UPLOAD_AD_ERROR)
		{
			response.msg = getNodeValue(responseTag,'msg');
		}
		else
		{
			uploadObject.percent = parseInt(getNodeValue(responseTag,'percent'));
			uploadObject.bytes = getNodeValue(responseTag,'bytes');
			uploadObject.path = getNodeValue(responseTag,'path');
			response.object = uploadObject;
		}
	}
	return response;
}

function setUploadStatus(iCallbackFunc)
{
	var url = servletUAURL + '?m=' + MODE_SET_STATUS;
	var req = initXMLHttp();

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

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

function tipFriends(iAdId, iName, iMailFrom, iFriendsMail, iCallbackFunc)
{
	var params = 'm=' + MODE_AD_TF + '&id=' + iAdId + '&n=' + iName + '&mf=' + iMailFrom + '&fm=' + iFriendsMail;
	var url = servletAdURL;
	var req = initXMLHttp();

	req.onreadystatechange = function()
	{
		if ((req.readyState == 4) && (req.status == 200))
		{
			iCallbackFunc(parseStatMsg(req.responseXML));
		}
		else if ((req.readyState == 4) && (req.status != 200))
		{
			if ((req.status >= 12000) && (req.status <= 13000))
			{
				setTimeout('tipFriends(' + iAdId + ',' + iName + ',' + iMailFrom + ',' + iFriendsMail + ',' + iCallbackFunc + ')', 1000);
			}
			else
			{
				iCallbackFunc(makeErrorMessage(req));
			}
		}
	};

	req.open('POST', url, 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 getShoppingCart(iCallbackFunc)
{
	var url = servletUserURL + '?m=' + MODE_SU_GSC;
	var req = initXMLHttp();

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

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

function addToShoppingCart(iAdCode, iItemType, iCallbackFunc)
{
	var url = servletUserURL + '?m=' + MODE_SU_ATSC + '&ac=' + iAdCode + '&it=' + iItemType;
	var req = initXMLHttp();

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

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

function clearShoppingCart(iCallbackFunc)
{
	var url = servletUserURL + '?m=' + MODE_SU_CLSC;
	var req = initXMLHttp();

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

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

function removeFromShoppingCart(iItemId, iCallbackFunc)
{
	var url = servletUserURL + '?m=' + MODE_SU_RIFSC + '&iid=' + iItemId;
	var req = initXMLHttp();

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

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

function confirmShoppingCart(iCallbackFunc)
{
	var url = servletUserURL + '?m=' + MODE_SU_CSC;
	var req = initXMLHttp();

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

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

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

	if (responseTag != null)
    {
		response.status = parseInt(getNodeValue(responseTag, 'status'));
		if (response.status != 0)
		{
			response.msg = getNodeValue(responseTag, 'msg');
		}
		else
		{
			var tag = responseTag.getElementsByTagName('items')[0];
			if (tag != null)
			{
				response.object = new ShoppingCart();
				response.object.totalPrice = getNodeValue(responseTag, 'tprice');
				for (var a = 0; a < tag.childNodes.length; a++)
				{
					var itemTag = tag.childNodes[a];
					var	item = new Item();
					item.id = getNodeValue(itemTag, 'id');
					item.description = getNodeValue(itemTag, 'desc');
					item.type = parseInt(getNodeValue(itemTag, 'type'));
					item.price = getNodeValue(itemTag, 'price');
					response.object.item[a] = item;
				}
			}
		}
	}
	return response;
}

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

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

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

	response.status = RESPONSE_ERROR;
	response.msg = 'Okänt fel. Felkod: ' + iReqObject.status;

	return response;
}

function Response()
{
	this.status = '1';
	this.msg = 'Okänt fel';
	this.object = null;
}

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

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

function Cities()
{
	this.city = [];
}

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

function Ad()
{
	this.id = 0;
	this.path = '';
	this.headline = '';
	this.distance = 0;
}

function Ads()
{
	this.hasPrevious = false;
	this.hasNext = false;
	this.ad = [];
}

function ShoppingCart()
{
	this.item = [];
	this.totalPrice = 0;
}

function Item()
{
	this.id = 0;
	this.description = '';
	this.type = 0;
	this.price = 0;
}

function UploadObject()
{
	this.percent = 0;
	this.bytes = '';
	this.path = '';
}

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;
}