

function noAjax()
{
	alert(GetLanguage("NO_AJAX"));
}

function getXhr()
{
	if (window.XMLHttpRequest)
	{
		xhr = new XMLHttpRequest();
	
		// Avoid a Safari Bug
		if (xhr.overrideMimeType)
		{
			xhr.overrideMimeType("text/xml");
		}
	}
	else
	{
		if (window.ActiveXObject)
		{
			try
			{
				// Try to load object on Internet Explorer
				xhr = new ActiveXObject("Msxml2.XMLHTTP");
			}
			catch (e)
			{
				try
				{
					// Try to load object for another version of Internet Explorer
					xhr = new ActiveXObject("Microsoft.XMLHTTP");
				}
				catch (e)
				{
					// The browser does not support XMLHttpRequest
					noAjax();
					xhr = false;
				}
			}
		}
		else
		{
			// The browser does not support XMLHttpRequest
			noAjax();
			xhr = false;
		}
	}
	
	return xhr;
}

function getObject(Id)
{
	if (document.getElementById) return document.getElementById(Id);
	if (document.layers) return document.layers[Id];
	if (document.all) return document.all[Id];
	return null;
}

var xhr = null;

var needNetwork  = false;
var needBrand    = false;
var needModel    = false;
var needProvider = false;
var needPIN      = false;
var needKBH      = false;
var needMEP      = false;
var needPRD      = false;
var needType     = false;
var needLocks    = 0;
var imeiOnly     = false;
var allowOther   = false;
var SMS          = false;

function ajaxSetTool(ToolID)
{
	getObject("trBrand").style.display = "none";
	getObject("trModel").style.display = "none";
	getObject("trModelOther").style.display = "none";
	getObject("trCountry").style.display = "none";
	getObject("trNetwork").style.display = "none";
	getObject("trProvider").style.display = "none";
	getObject("trPIN").style.display = "none";
	getObject("trKBH").style.display = "none";
	getObject("trMEP").style.display = "none";
	getObject("trPRD").style.display = "none";
	getObject("trType").style.display = "none";
	getObject("trLock").style.display = "none";
	getObject("trSMS").style.display = "none";
	getObject("divMessage").style.display = "none";
	getObject("delayDiv").style.display = "none";
	getObject("statusDiv").style.display = "none";
	getObject("originDatabase").style.display = "none";
	getObject("originCalculator").style.display = "none";
	
	getObject("brandRequired").style.visibility = "hidden";
	getObject("modelRequired").style.visibility = "hidden";
	getObject("countryRequired").style.visibility = "hidden";
	getObject("networkRequired").style.visibility = "hidden";
	getObject("providerRequired").style.visibility = "hidden";
	getObject("pinRequired").style.visibility = "hidden";
	getObject("kbhRequired").style.visibility = "hidden";
	getObject("mepRequired").style.visibility = "hidden";
	getObject("prdRequired").style.visibility = "hidden";
	getObject("typeRequired").style.visibility = "hidden";
	getObject("locksRequired").style.visibility = "hidden";
	
	if (ToolID != "")
	{
		// Show Loading
		getObject("trLoading").style.visibility = "visible";
		
		if (xhr)
		{
			if (xhr.readyState != 0)
			{
				xhr.onreadystatechange = function() {};
				xhr.abort();
			}
		}
		else
		{
			xhr = getXhr();
		}
		
		xhr.open("GET", "/ajax/tool.xml.php?ID=" + ToolID, true);
		xhr.onreadystatechange = function()
		{
			if (xhr.readyState == 4 && xhr.responseXML)
			{
				// Needs
				needNetwork  = (xhr.responseXML.getElementsByTagName("needNetwork" )[0].firstChild.data == "true");
				needBrand    = (xhr.responseXML.getElementsByTagName("needBrand"   )[0].firstChild.data == "true");
				needModel    = (xhr.responseXML.getElementsByTagName("needModel"   )[0].firstChild.data == "true");
				needProvider = (xhr.responseXML.getElementsByTagName("needProvider")[0].firstChild.data == "true");
				needPIN      = (xhr.responseXML.getElementsByTagName("needPIN"     )[0].firstChild.data == "true");
				needKBH      = (xhr.responseXML.getElementsByTagName("needKBH"     )[0].firstChild.data == "true");
				needMEP      = (xhr.responseXML.getElementsByTagName("needMEP"     )[0].firstChild.data == "true");
				needPRD      = (xhr.responseXML.getElementsByTagName("needPRD"     )[0].firstChild.data == "true");
				needType     = (xhr.responseXML.getElementsByTagName("needType"    )[0].firstChild.data == "true");
				needLocks    = parseInt(xhr.responseXML.getElementsByTagName("needLocks")[0].firstChild.data);
				imeiOnly     = (xhr.responseXML.getElementsByTagName("imeiOnly"    )[0].firstChild.data == "true");
				allowOther   = (xhr.responseXML.getElementsByTagName("allowOther"  )[0].firstChild.data == "true");
				SMS          = (xhr.responseXML.getElementsByTagName("SMS"         )[0].firstChild.data == "true");
				origin       = (xhr.responseXML.getElementsByTagName("origin"      )[0].firstChild.data);
				
				var message = xhr.responseXML.getElementsByTagName("message")[0];
				
				if (message.hasChildNodes())
				{
					var messageContent = document.getElementById("messageContent");
					while (messageContent.hasChildNodes()) messageContent.removeChild(messageContent.firstChild);
					
					var msg = message.firstChild.data;
					msg = msg.replace(new RegExp('\\{LiveHelp\\}', 'g'), '<a href="#" onclick="openLiveHelp(); return false;"><img src="/img/mini-live-help.gif" width="72" height="20" border="0" align="absmiddle" /></a>');
					msg = msg.replace("\r\n", "\n");
					msg = msg.replace("\r", "\n");
					msg = msg.split("\n");
					
					for (var key in msg)
					{
						messageContent.appendChild(document.createTextNode(msg[key]));
						if (key != msg.length - 1) messageContent.appendChild(document.createElement('br'));
					}
					
					messageContent.innerHTML = messageContent.innerHTML.replace(new RegExp("(http://[^\\s<]+)", "ig"), '<a href="$1" target="_blank">$1</a>');
					
					getObject("divMessage").style.display = "";
				}
				
				// Tool supports SMS ?
				if (SMS)
				{
					getObject("trSMS").style.display = "";
				}
				
				switch (origin)
				{
					case "Database": getObject("originDatabase").style.display = ""; break;
					case "Calculator": getObject("originCalculator").style.display = ""; break;
				}
				
				// Network
				if (needNetwork)
				{
					var countries = xhr.responseXML.getElementsByTagName("country");
					
					if (countries)
					{
						for (var i=document.forms["order"].CountryID.options.length - 1; i>=0; i--)
						{
							document.forms["order"].CountryID.options[i] = null;
						}
						
						document.forms["order"].CountryID.options[0] = new Option("---", "");
						
						for (var i=0; i<countries.length; i++)
						{
							document.forms["order"].CountryID.options[i+1] = new Option(countries[i].firstChild.data, countries[i].attributes[0].nodeValue);
						}
						
						getObject("trCountry").style.display = "";
						
						if (! imeiOnly) {
							getObject("countryRequired").style.visibility = "visible";
							getObject("networkRequired").style.visibility = "visible";
						}
					}
				}

				// Brands
				if (needBrand)
				{
					var brands = xhr.responseXML.getElementsByTagName("brand");
					
					if (brands)
					{
						for (var i=document.forms["order"].BrandID.options.length - 1; i>=0; i--)
						{
							document.forms["order"].BrandID.options[i] = null;
						}
						
						document.forms["order"].BrandID.options[0] = new Option("---", "");
						
						for (var i=0; i<brands.length; i++)
						{
							document.forms["order"].BrandID.options[i+1] = new Option(brands[i].firstChild.data, brands[i].attributes[0].nodeValue);
						}
						
						getObject("trBrand").style.display = "";

						if (! imeiOnly) {
							getObject("brandRequired").style.visibility = "visible";
							getObject("modelRequired").style.visibility = "visible";
						}
					}
				}
				
				// Models
				if (!needBrand && needModel)
				{
					var models = xhr.responseXML.getElementsByTagName("model");
					
					if (models)
					{
						for (var i=document.forms["order"].ModelID.options.length - 1; i>=0; i--)
						{
							document.forms["order"].ModelID.options[i] = null;
						}
						
						document.forms["order"].ModelID.options[0] = new Option("---", "");
						
						for (var i=0; i<models.length; i++)
						{
							document.forms["order"].ModelID.options[i+1] = new Option(models[i].firstChild.data, models[i].attributes[0].nodeValue);
						}
						
						getObject("trModel").style.display = "";
						
						if (! imeiOnly) {
							getObject("modelRequired").style.visibility = "visible";
						}
					}
				}
				
				if (needProvider)
				{
					getObject("trProvider").style.display = "";
					if (! imeiOnly) getObject("providerRequired").style.visibility = "visible";
				}
				
				if (needPIN)
				{
					getObject("trPIN").style.display = "";
					if (! imeiOnly) getObject("pinRequired").style.visibility = "visible";
				}

				if (needKBH)
				{
					getObject("trKBH").style.display = "";
					if (! imeiOnly) getObject("kbhRequired").style.visibility = "visible";
				}

				if (needMEP)
				{
					getObject("trMEP").style.display = "";
					if (! imeiOnly) getObject("mepRequired").style.visibility = "visible";
				}

				if (needPRD)
				{
					getObject("trPRD").style.display = "";
					if (! imeiOnly) getObject("prdRequired").style.visibility = "visible";
				}
				
				if (needType)
				{
					getObject("trType").style.display = "";
					if (! imeiOnly) getObject("typeRequired").style.visibility = "visible";
				}

				if (needLocks)
				{
					getObject("trLock").style.display = "";
					if (! imeiOnly) getObject("locksRequired").style.visibility = "visible";
				}
				
				/* Provider status */
				var status = xhr.responseXML.getElementsByTagName("status");
				status = (status.length > 0) ? status[0].firstChild.data : null;
				var statusCode = xhr.responseXML.getElementsByTagName("status.code");
				statusCode = (statusCode.length > 0) ? statusCode[0].firstChild.data : null;
				
				if (statusCode != 'Online' && statusCode != 'Down')
				{
					/* Delivery time */
					var deliveryUnit = xhr.responseXML.getElementsByTagName("deliveryUnit")[0].firstChild.data;
					var deliveryMin = parseInt(xhr.responseXML.getElementsByTagName("deliveryMin")[0].firstChild.data);
					var deliveryMax = parseInt(xhr.responseXML.getElementsByTagName("deliveryMax")[0].firstChild.data);
					
					var delayDiv = getObject("delayDiv");
					var delayTxt = null;
					
					while (delayDiv.hasChildNodes()) delayDiv.removeChild(delayDiv.firstChild);
					
					if (deliveryUnit == "Instant")
					{
						delayTxt = GetLanguage("DELIVERY_TIME") + " : " + GetLanguage(deliveryUnit);
					}
					else if (deliveryMax == deliveryMin)
					{
						if (deliveryMax != 0)
						{
							delayTxt = GetLanguage("DELIVERY_TIME") + " : " + deliveryMax.toString() + " " + GetLanguage(deliveryUnit + (deliveryMax > 1 ? "s" : ""));
						}
					}
					else if (deliveryMax > deliveryMin)
					{
						delayTxt = GetLanguage("DELIVERY_TIME") + " : " + deliveryMin.toString() + " " + GetLanguage("TO") + " " + deliveryMax.toString() + " " + GetLanguage(deliveryUnit + (deliveryMax > 1 ? "s" : ""));
					}
					
					if (delayTxt != null)
					{
						delayDiv.appendChild(document.createTextNode(delayTxt));
						delayDiv.style.display = "";
					}
				}

				if (status)
				{
					/* Empty div */
					while (statusDiv.hasChildNodes()) statusDiv.removeChild(statusDiv.firstChild);
					
					/* Set background color */
					var color;
					switch (statusCode)
					{
						case 'Online' : color = '#DDFFDD'; break;
						case 'Down' : color = '#FFDDDD'; break;
						default: color = '#FFFFDD';
					}
					setCssProp(statusDiv, 'background-color', color);

					/* Set text */
					var text = document.createTextNode(status);
					statusDiv.appendChild(text);
					statusDiv.style.display = "";
				}
				
				// Hide Loading
				getObject("trLoading").style.visibility = "hidden";
				
				// For the assistant pop up
				window.loaded = true;
			}
		}
		xhr.send(null);
	}
	
	removeMobilePhoto();
}

function ajaxSetBrand(BrandID, ToolID)
{
	if (needModel)
	{
		getObject("trModel").style.display = "none";
		getObject("trModelOther").style.display = "none";
		
		if (BrandID != "")
		{
			// Show Loading
			getObject("trLoading").style.visibility = "visible";
			
			if (xhr)
			{
				if (xhr.readyState != 0)
				{
					xhr.onreadystatechange = function() {};
					xhr.abort();
				}
			}
			else
			{
				xhr = getXhr();
			}
			
			xhr.open("GET", "/ajax/brand.xml.php?ID=" + BrandID + "&ToolID=" + ToolID, true);
			xhr.onreadystatechange = function()
			{
				if (xhr.readyState == 4 && xhr.responseXML)
				{
					var models = xhr.responseXML.getElementsByTagName("model");
					
					if (models)
					{	
						for (var i=document.forms["order"].ModelID.options.length - 1; i>=0; i--)
						{
							document.forms["order"].ModelID.options[i] = null;
						}
						
						document.forms["order"].ModelID.options[0] = new Option("---", "");
						
						for (var i=0; i<models.length; i++)
						{
							document.forms["order"].ModelID.options[i+1] = new Option(models[i].firstChild.data, models[i].attributes[0].nodeValue);
						}
						
						if (allowOther)
						{
							document.forms["order"].ModelID.options[i+1] = new Option(GetLanguage("OTHER"), "0");
							setCssProp(document.forms["order"].ModelID.options[i+1], "background-color", "#FFCC66");
						}
						
						getObject("trModel").style.display = "";
					}
	
					// Hide Loading
					getObject("trLoading").style.visibility = "hidden";
					
					window.loaded = true;
				}
			}
			xhr.send(null);
		}
	}
	
	removeMobilePhoto();
}

function ajaxSetModel(ModelID)
{
	getObject("trModelOther").style.display = ((ModelID == "0") ? "" : "none");
	loadMobilePhoto(ModelID);
}

function ajaxSetCountry(CountryID, ToolID)
{
	getObject("trNetwork").style.display = "none";
	
	if (CountryID != "")
	{
		// Show Loading
		getObject("trLoading").style.visibility = "visible";
		
		if (xhr)
		{
			if (xhr.readyState != 0)
			{
				xhr.onreadystatechange = function() {};
				xhr.abort();
			}
		}
		else
		{
			xhr = getXhr();
		}
		
		xhr.open("GET", "/ajax/country.xml.php?ID=" + CountryID + "&ToolID=" + ToolID, true);
		xhr.onreadystatechange = function()
		{
			if (xhr.readyState == 4 && xhr.responseXML)
			{
				var networks = xhr.responseXML.getElementsByTagName("network");
				
				if (networks)
				{	
					for (var i=document.forms["order"].NetworkID.options.length - 1; i>=0; i--)
					{
						document.forms["order"].NetworkID.options[i] = null;
					}
					
					document.forms["order"].NetworkID.options[0] = new Option("---", "");
					
					for (var i=0; i<networks.length; i++)
					{
						document.forms["order"].NetworkID.options[i+1] = new Option(networks[i].firstChild.data, networks[i].attributes[0].nodeValue);
					}
						
					getObject("trNetwork").style.display = "";
				}

				// Hide Loading
				getObject("trLoading").style.visibility = "hidden";
				
				window.loaded = true;
			}
		}
		xhr.send(null);
	}
}

function ajaxSubmitFormImei()
{
	with(document.forms["order"])
	{
		var matches = IMEI.value.match(/[0-9]+/g);
		if (! matches) {
			alert(GetLanguage("ENTER_IMEI"));
			return false;
		}
		var invalid = new Array();
		var unsure = new Array();
		for (var i=0; i<matches.length; i++) {
			if (! jsCheckIMEI(matches[i], false)) invalid[invalid.length] = matches[i];
			if (! jsCheckIMEI(matches[i], true)) unsure[unsure.length] = matches[i];
		}
		if (invalid.length) {
			alert(GetLanguage("INVALID_IMEI_NEW").replace("%s", invalid.join("\r\n")));
			return false;
		}
		if (ToolID.selectedIndex <= 0)
		{
			alert(GetLanguage("SELECT_TOOL"));
			return false;
		}
		if (! imeiOnly)
		{
			if (needBrand)
			{
				if (BrandID.selectedIndex <= 0)
				{
					alert(GetLanguage("SELECT_BRAND"));
					return false;
				}
			}
			if (needModel)
			{
				if (ModelID.selectedIndex <= 0)
				{
					alert(GetLanguage("SELECT_MODEL"));
					return false;
				}
				if (ModelID.value == 0)
				{
					if (jsTrim(ModelOther.value) == "")
					{
						alert(GetLanguage("ENTER_MODEL"));
						return false;
					}
				}
			}
			if (needNetwork)
			{
				if (CountryID.selectedIndex <= 0)
				{
					alert(GetLanguage("SELECT_COUNTRY"));
					return false;
				}
				if (NetworkID.selectedIndex <= 0)
				{
					alert(GetLanguage("SELECT_NETWORK"));
					return false;
				}
			}
			if (needProvider)
			{
				if (ProviderID.value != "" || ! imeiOnly)
				{
					if (! jsCheckProviderID(ProviderID.value))
					{
						alert(GetLanguage("INVALID_PROVIDER_ID"));
						return false;
					}
				}
			}
			if (needPIN)
			{
				if (jsTrim(PIN.value) == "")
				{
					alert(GetLanguage("ENTER_PIN"));
					return false;
				}
			}
			if (needKBH)
			{
				if (jsTrim(KBH.value) == "")
				{
					alert(GetLanguage("ENTER_KBH"));
					return false;
				}
			}
			if (needMEP)
			{
				if (! jsCheck_MEP_PRD('MEP', MEP.value))
				{
					alert(GetLanguage("CHECK_MEP"));
					return false;
				}
			}
			if (needPRD)
			{
				if (! jsCheck_MEP_PRD('PRD', PRD.value))
				{
					alert(GetLanguage("CHECK_PRD"));
					return false;
				}
			}
			if (needType)
			{
				if (jsTrim(PhoneType.value) == "" || jsTrim(PhoneType.value) == "RM-")
				{
					alert(GetLanguage("ENTER_TYPE"));
					return false;
				}
			}
			if (needLocks)
			{
				var locks = 0;
				for (var i=0; ; i++)
				{
					var obj = document.getElementById("Lock" + i);
					if (! obj) break;
					if (obj.checked) locks++;
				}
				
				if (locks != needLocks)
				{
					alert(GetLanguage("WRONG_NUMBER_LOCKS"));
					return false;
				}
			}
		}
		if (jsTrim(Email.value) != "")
		{
			if (! jsCheckEmail(jsTrim(Email.value)))
			{
				alert(GetLanguage("INVALID_EMAIL"));
				return false;
			}
		}
		if (SMS)
		{
			var r = new RegExp("^(\\+[0-9]{5,})?$", "");

			if (! r.test(jsTrim(GSM.value)))
			{
				alert(GetLanguage("INVALID_PHONE"));
				return false;
			}
		}
		if (unsure.length) {
			if (! confirm(GetLanguage("INVALID_IMEI_CONFIRM_NEW").replace("%s", unsure.join("\r\n"))))
				return false;
		}
	}

	document.getElementById("submit").disabled = true;
	return true;
}

function ajaxChangeFieldState(field, enabled)
{
	getObject("TdIco" + field + "Off").style.display = (enabled ? "none" : "");
	getObject("TdTxt" + field + "Off").style.display = (enabled ? "none" : "");
	getObject("TdIco" + field + "On").style.display = (enabled ? "" : "none");
	getObject("TdTxt" + field + "On").style.display = (enabled ? "" : "none");
}

var needSerial = false;
var needLogin = false;

var serialPattern = null;

function ajaxSetCableServer(ServerID)
{
	getObject("trIcons").style.display = "none";
	getObject("trSerial").style.display = "none";
	getObject("trLogin").style.display = "none";
	getObject("trEmail").style.display = "none";
	getObject("MobilesFieldset").style.display = "none";
	serialPattern = null;
	
	if (ServerID != "")
	{
		// Show Loading
		getObject("trLoading").style.visibility = "visible";
		
		if (xhr)
		{
			if (xhr.readyState != 0)
			{
				xhr.onreadystatechange = function() {};
				xhr.abort();
			}
		}
		else
		{
			xhr = getXhr();
		}
		
		xhr.open("GET", "/ajax/cable.xml.php?ServerID=" + ServerID, true);
		xhr.onreadystatechange = function()
		{
			if (xhr.readyState == 4 && xhr.responseXML)
			{
				var softwarename = xhr.responseXML.getElementsByTagName("softwarename");
				var softwareurl = xhr.responseXML.getElementsByTagName("softwareurl");
				var userguideurl = xhr.responseXML.getElementsByTagName("userguideurl");
				
				needSerial = (xhr.responseXML.getElementsByTagName("needSerial")[0].firstChild.data == "true");
				needLogin = (xhr.responseXML.getElementsByTagName("needLogin")[0].firstChild.data == "true");
				needEmail = (xhr.responseXML.getElementsByTagName("needEmail")[0].firstChild.data == "true");
				
				if (softwarename && softwareurl && userguideurl)
				{
					if (softwareurl[0].hasChildNodes())
					{
						getObject("Software").setAttribute("href", softwareurl[0].firstChild.data);
						getObject("Software").setAttribute("title", softwarename[0].hasChildNodes() ? softwarename[0].firstChild.data : "");
					}
					ajaxChangeFieldState("Download", softwareurl[0].hasChildNodes());
					
					if (userguideurl[0].hasChildNodes())
					{
						getObject("UserGuide").setAttribute("href", userguideurl[0].firstChild.data);
					}
					ajaxChangeFieldState("Info", userguideurl[0].hasChildNodes());
					
					if (needSerial)
					{
						getObject("trSerial").style.display = "";
					}
					if (needLogin)
					{
						getObject("trLogin").style.display = "";
					}
					if (needEmail)
					{
						getObject("trEmail").style.display = "";
					}
				}
				
				if (needSerial)
				{
					var serialPatternCI = (xhr.responseXML.getElementsByTagName("serialpatternci")[0].firstChild.data == "true");
					serialPattern = new RegExp(xhr.responseXML.getElementsByTagName("serialpattern")[0].firstChild.data, serialPatternCI ? "i" : "");
				}
				
				// Show compatible mobiles
				var brands = xhr.responseXML.getElementsByTagName("brand");
				var colors = new Array("#F4F4F6", "#FBFBFC");
				var k = 0;
				
				if (brands.length > 0)
				{
					var Html = '<table cellpadding="5" cellspacing="1" border="0" bgcolor="#CCCCCC">';
	
					for (var i=0; i<brands.length; i++)
					{
						Html += '<tr bgcolor="' + colors[k^=1] + '">';
						Html += '<td>';
						if (brands[i].getAttribute("logo")) Html += '<img src="' + brands[i].getAttribute("logo") + '" width="16" height="16" hspace="3" align="absmiddle" />';
						Html += jsXmlEntities(brands[i].getAttribute("name")) + '</td>';
						Html += '<td>';
						
						var mobiles = brands[i].getElementsByTagName("mobile");
						var models = new Array();
						
						for (var j=0; j<mobiles.length; j++)
						{
							models.push('<a href="' + mobiles[j].attributes[0].nodeValue + '">' + jsXmlEntities(mobiles[j].firstChild.data) + '</a>');
						}
						
						Html += models.join(" &middot; ");
						
						Html += '</td>';
						Html += '</tr>';
					}

					Html += '</table>';

					getObject("MobilesDiv").innerHTML = Html;
					getObject("MobilesAnchor").setAttribute("href", xhr.responseXML.getElementsByTagName("featuresurl")[0].firstChild.data);
					getObject("MobilesFieldset").style.display = "";
				}
				ajaxChangeFieldState("Phone", brands.length > 0);
				
				// Show icons
				getObject("trIcons").style.display = "";
				
				// Hide Loading
				getObject("trLoading").style.visibility = "hidden";
			}
		}
		xhr.send(null);
	}
}

var fileNamePattern = null;

function ajaxSetFileServer(ServerID)
{
	getObject("trIcons").style.display = "none";
	getObject("MobilesFieldset").style.display = "none";
	fileNamePattern = null;
	
	if (ServerID != "")
	{
		// Show Loading
		getObject("trLoading").style.visibility = "visible";
		
		if (xhr)
		{
			if (xhr.readyState != 0)
			{
				xhr.onreadystatechange = function() {};
				xhr.abort();
			}
		}
		else
		{
			xhr = getXhr();
		}
		
		xhr.open("GET", "/ajax/file.xml.php?ServerID=" + ServerID, true);
		xhr.onreadystatechange = function()
		{
			if (xhr.readyState == 4 && xhr.responseXML)
			{
				var softwarename = xhr.responseXML.getElementsByTagName("softwarename");
				var softwareurl = xhr.responseXML.getElementsByTagName("softwareurl");
				var userguideurl = xhr.responseXML.getElementsByTagName("userguideurl");

				if (softwarename && softwareurl && userguideurl)
				{
					if (softwareurl[0].hasChildNodes())
					{
						getObject("Software").setAttribute("href", softwareurl[0].firstChild.data);
						getObject("Software").setAttribute("title", softwarename[0].hasChildNodes() ? softwarename[0].firstChild.data : "");
					}
					ajaxChangeFieldState("Download", softwareurl[0].hasChildNodes());
					
					if (userguideurl[0].hasChildNodes())
					{
						getObject("UserGuide").setAttribute("href", userguideurl[0].firstChild.data);
					}
					ajaxChangeFieldState("Info", userguideurl[0].hasChildNodes());
				}
				
				var fileNamePatternCI = (xhr.responseXML.getElementsByTagName("filenamepatternci")[0].firstChild.data == "true");
				fileNamePattern = new RegExp(xhr.responseXML.getElementsByTagName("filenamepattern")[0].firstChild.data, fileNamePatternCI ? "i" : "");

				// Show compatible mobiles
				var brands = xhr.responseXML.getElementsByTagName("brand");
				var colors = new Array("#F4F4F6", "#FBFBFC");
				var k = 0;
				
				if (brands.length > 0)
				{
					var Html = '<table cellpadding="5" cellspacing="1" border="0" bgcolor="#CCCCCC">';
	
					for (var i=0; i<brands.length; i++)
					{
						Html += '<tr bgcolor="' + colors[k^=1] + '">';
						Html += '<td>';
						if (brands[i].getAttribute("logo")) Html += '<img src="' + brands[i].getAttribute("logo") + '" width="16" height="16" hspace="3" align="absmiddle" />';
						Html += jsXmlEntities(brands[i].getAttribute("name")) + '</td>';
						Html += '<td>';
						
						var mobiles = brands[i].getElementsByTagName("mobile");
						var models = new Array();
						
						for (var j=0; j<mobiles.length; j++)
						{
							models.push('<a href="' + mobiles[j].attributes[0].nodeValue + '">' + jsXmlEntities(mobiles[j].firstChild.data) + '</a>');
						}
						
						Html += models.join(" &middot; ");
						
						Html += '</td>';
						Html += '</tr>';
					}

					Html += '</table>';

					getObject("MobilesDiv").innerHTML = Html;
					getObject("MobilesAnchor").setAttribute("href", xhr.responseXML.getElementsByTagName("featuresurl")[0].firstChild.data);
					getObject("MobilesFieldset").style.display = "";
				}
				ajaxChangeFieldState("Phone", brands.length > 0);
				
				// Show icons
				getObject("trIcons").style.display = "";

				// Hide Loading
				getObject("trLoading").style.visibility = "hidden";
			}
		}
		xhr.send(null);
	}
}

var needIMEI = false;
var needNumber = false;
var needPhone = false;

var SpyphoneCredits = new Array();
var SpyphoneNeeded = new Array();
var SpyphoneFull = null;

var SpyphoneDescription = new Array();

function ajaxRecomputeSpyphoneCheckboxes(CheckBox)
{
	var Credits = 0.0;
	var Ptr;
	var i;

	/* Initialization */
	if (! CheckBox)
	{
		for (var i = 0; i < SpyphoneCredits.length; i++)
		{
			Ptr = getObject("Options" + i);
	
			if (SpyphoneNeeded[i])
			{
				/* Check & disable needed checkboxes */
				Ptr.checked = true;
				Ptr.disabled = true;
			}
			else
			{
				/* Add events to non-needed checkboxes */
				if (! Ptr.onclick)
				{
					Ptr.onclick = function(e) {
						ajaxRecomputeSpyphoneCheckboxes(this);
					}
				}
			}
		}
	}

	/* "Full" option exists & is checked : check & disable every other checkbox, get full price */
	if ((SpyphoneFull != null) && getObject("Options" + SpyphoneFull).checked)
	{
		for (i = 0 ; i < SpyphoneCredits.length; i++)
		{
			if (i != SpyphoneFull)
			{
				Ptr = getObject("Options" + i);
				Ptr.checked = true;
				Ptr.disabled = true;
			}
		}
		
		Credits = SpyphoneCredits[SpyphoneFull];
	}
	
	/* Calculate price for selected items */
	else
	{
		/* "Full options" checkbox just unchecked ? */
		var UncheckFull = CheckBox && (CheckBox.getAttribute("id") == "Options" + SpyphoneFull);

		for (var i = 0; i < SpyphoneCredits.length; i++)
		{
			Ptr = getObject("Options" + i);

			/* Uncheck & enable non-needed checkboxes when unchecking the Full Options checkbox */
			if (! SpyphoneNeeded[i])
			{
				if (UncheckFull)
				{
					Ptr.checked = false;
					Ptr.disabled = false;
				}
			}

			if (Ptr.checked)
			{
				/* Item selected : add credits */
				Credits += SpyphoneCredits[i];
			}
		}
	}

	document.getElementById("CreditsSpan").innerHTML = "<b>" + Credits + "</b> " + GetLanguage("CREDITS");
}

function ajaxSetSpyphoneServer(ServerID, LangID)
{
	var i;

	getObject("trIMEI").style.display = "none";
	getObject("trNumber").style.display = "none";
	getObject("trOptions").style.display = "none";
	getObject("trTotal").style.display = "none";
	getObject("trModel").style.display = "none";
	
	if (ServerID != "")
	{
		// Show Loading
		getObject("trLoading").style.visibility = "visible";
		
		if (xhr)
		{
			if (xhr.readyState != 0)
			{
				xhr.onreadystatechange = function() {};
				xhr.abort();
			}
		}
		else
		{
			xhr = getXhr();
		}
		
		xhr.open("GET", "/ajax/spyphone.xml.php?ServerID=" + ServerID + "&LangID=" + LangID, true);
		xhr.onreadystatechange = function()
		{
			if (xhr.readyState == 4 && xhr.responseXML)
			{
				needIMEI = (xhr.responseXML.getElementsByTagName("needIMEI")[0].firstChild.data == "true");
				needNumber = (xhr.responseXML.getElementsByTagName("needNumber")[0].firstChild.data == "true");
				
				var nbOptions = xhr.responseXML.getElementsByTagName("option").length;
				
				var SpyId          = xhr.responseXML.getElementsByTagName("id");
				var SpyCredits     = xhr.responseXML.getElementsByTagName("credits");
				var SpyNeeded      = xhr.responseXML.getElementsByTagName("needed");
				var SpyFull        = xhr.responseXML.getElementsByTagName("full");
				var SpyName        = xhr.responseXML.getElementsByTagName("name");
				var SpyDescription = xhr.responseXML.getElementsByTagName("description");
				var SpyFullDescription = xhr.responseXML.getElementsByTagName("full-description");
				
				while (SpyphoneCredits.length) SpyphoneCredits.pop();
				while (SpyphoneNeeded.length) SpyphoneNeeded.pop();
				while (SpyphoneDescription.length) SpyphoneDescription.pop();

				SpyphoneFull = null;
				
				var Html = '<table cellpadding="3" cellspacing="0" border="0">';
				
				for (i = 0; i < nbOptions; i++)
				{
					SpyphoneCredits[i] = parseFloat(SpyCredits[i].firstChild.data);
					SpyphoneNeeded[i] = (SpyNeeded[i].firstChild.data == "true");
					SpyphoneDescription[i] = (SpyFullDescription[i].hasChildNodes() ? SpyFullDescription[i].firstChild.data : "");

					if (SpyFull[i].firstChild.data == "true")
					{
						SpyphoneFull = i;
					}
				}

				for (i = 0; i < nbOptions; i++)
				{
					Html += '<tr>';
					Html += '<td valign="top"><input type="checkbox" name="Options[]" id="Options' + i + '" value="' + SpyId[i].firstChild.data + '" /></td>';
					Html += '<td valign="top" style="padding-top: 5px;">';
					Html += '<label for="Options' + i + '">';

					if (i == SpyphoneFull) Html += '<b>';
					Html += SpyName[i].firstChild.data;
					if (i == SpyphoneFull) Html += '</b>';
					
					// Add the price, except if the only possible option is the Full option
					if (! SpyphoneNeeded[SpyphoneFull])
					{
						if (SpyphoneCredits[i] == 0.0)
						{
							Html += ' (' + GetLanguage("FREE") + ')';
						}
						else
						{
							Html += ' (' + parseFloat(SpyCredits[i].firstChild.data).toString() + ' ' + GetLanguage("CREDITS") + ')';
						}
					}

					if (SpyDescription[i].hasChildNodes())
					{
						Html += '<br />';
						Html += '<span class="small gray">' + SpyDescription[i].firstChild.data + '</span>';
					}
					Html += '</label>';
					if (SpyphoneDescription[i] != "")
					{
						Html += '<br />';
						Html += '<span class="moreInfo" onclick="ajaxShowSpyphoneOptionDescription(this, ' + i + ');">' + GetLanguage("MORE_INFO") + '</span>';
					}
					Html += '</td>';
					Html += '</tr>';
				}
				
				Html += '</table>';
				
				document.getElementById("OptionsTd").innerHTML = Html;
				ajaxRecomputeSpyphoneCheckboxes();

				for (i=document.forms["order"].ModelID.options.length - 1; i>=0; i--)
				{
					document.forms["order"].ModelID.options[i] = null;
				}

				var Models = xhr.responseXML.getElementsByTagName("model");
				needPhone = (Models.length > 0);
				
				if (needPhone)
				{
					document.forms["order"].ModelID.options[0] = new Option("---", "");
					
					for (i=0; i<Models.length; i++)
					{
						document.forms["order"].ModelID.options[i+1] = new Option(Models[i].firstChild.data, Models[i].attributes[0].nodeValue);
					}
	
					getObject("trModel").style.display = "";
				}

				if (needIMEI)
				{
					getObject("trIMEI").style.display = "";
				}
				
				if (needNumber)
				{
					getObject("trNumber").style.display = "";
				}
				
				getObject("trOptions").style.display = "";
				getObject("trTotal").style.display = "";
				
				// Hide Loading
				getObject("trLoading").style.visibility = "hidden";
			}
		}
		xhr.send(null);
	}
}

function ajaxShowSpyphoneOptionDescription(parent, index)
{
	var floatDiv = document.createElement("div");

	floatDiv.className = "spyHelpBox";
	setCssProp(floatDiv, "left", getAbsoluteLeft(parent) + "px");
	setCssProp(floatDiv, "top", getAbsoluteTop(parent) + "px");
	floatDiv.innerHTML = SpyphoneDescription[index];
	
	document.body.appendChild(floatDiv);
	
	floatDiv.onclick = function (e)
	{
		document.body.removeChild(e ? e.target : event.srcElement);
	}
}

function ajaxSubmitFormCableServer()
{
	with(document.forms["order"])
	{
		if (ServerID.selectedIndex <= 0)
		{
			alert(GetLanguage("SELECT_SERVER"));
			return false;
		}
		
		if (needSerial)
		{
			if (jsTrim(SerialNumber.value) == "")
			{
				alert(GetLanguage("ENTER_SERIAL_NUMBER"));
				return false;
			}

			if (! serialPattern)
			{
				// Ajax did not finish loading ...
				return false;
			}
	
			if (! serialPattern.test(jsTrim(SerialNumber.value)))
			{
				alert(GetLanguage("INVALID_SERIAL_NUMBER"));
				return false;
			}
		}

		if (needLogin)
		{
			if (jsTrim(Login.value) == "")
			{
				alert(GetLanguage("ENTER_LOGIN"));
				return false;
			}
		}
		
		if (needEmail)
		{
			if (jsTrim(AccountEmail.value) == "")
			{
				alert(GetLanguage("ENTER_EMAIL"));
				return false;
			}
			
			if (! jsCheckEmail(jsTrim(AccountEmail.value)))
			{
				alert(GetLanguage("INVALID_EMAIL"));
				return false;
			}
		}
	}

	document.getElementById("cableSubmit").disabled = true;
	return true;
}

function ajaxSubmitFormFileServer()
{
	with(document.forms["order"])
	{
		if (ServerID.selectedIndex <= 0)
		{
			alert(GetLanguage("SELECT_SERVER"));
			return false;
		}
		if (File.value == "")
		{
			alert(GetLanguage("SELECT_FILE"));
			return false;
		}
		
		if (! fileNamePattern)
		{
			// Ajax did not finish loading ...
			return false;
		}

		var Path = File.value.split(/[\/\\]+/);

		if (! fileNamePattern.test(Path[Path.length-1]))
		{
			alert(GetLanguage("INVALID_FILENAME"));
			return false;
		}
	}

	document.getElementById("fileSubmit").disabled = true;
	return true;
}

function ajaxSubmitFormSpyphoneServer()
{
	with (document.forms["order"])
	{
		if (ServerID.selectedIndex <= 0)
		{
			alert(GetLanguage("SELECT_TOOL"));
			return false;
		}

		if (needIMEI)
		{
			if (! jsCheckIMEI(IMEI.value, true))
			{
				alert(GetLanguage("INVALID_IMEI"));
				return false;
			}
		}

		if (needPhone)
		{
			if (ModelID.selectedIndex <= 0)
			{
				alert(GetLanguage("SELECT_MODEL"));
				return false;
			}
		}

		if (needNumber)
		{
			var r = new RegExp("^\\+[0-9]{5,}$", "");

			if (! r.test(jsTrim(PhoneNumber.value)))
			{
				alert(GetLanguage("INVALID_PHONE"));
				return false;
			}
		}
	}
	
	var Checked = false;

	for (var i = 0 ; i < SpyphoneCredits.length; i++)
	{
		if (getObject("Options" + i).checked)
		{
			Checked = true;
			break;
		}
	}
	
	if (! Checked)
	{
		alert(GetLanguage("NO_BOX_CHECKED"));
		return false;
	}

	document.getElementById("spyphoneSubmit").disabled = true;
	return true;
}

function ajaxSetFeaturesBrand(BrandID)
{
	getObject("Model").style.display = "none";

	if (BrandID != "")
	{
		getObject("Loading").style.display = "";
		
		if (xhr)
		{
			if (xhr.readyState != 0)
			{
				xhr.onreadystatechange = function() {};
				xhr.abort();
			}
		}
		else
		{
			xhr = getXhr();
		}
		
		xhr.open("GET", "/ajax/models.xml.php?BrandID=" + BrandID, true);
		xhr.onreadystatechange = function()
		{
			if (xhr.readyState == 4 && xhr.responseXML)
			{
				var models = xhr.responseXML.getElementsByTagName("model");
				
				if (models)
				{
					var Model = getObject("Model");

					Model.options.length = 1;
					
					for (var i=0; i<models.length; i++)
					{
						Model.options[i+1] = new Option(models[i].firstChild.data, models[i].getAttribute("url"));
					}
					
					getObject("Model").style.display = "";
				}

				// Hide Loading
				getObject("Loading").style.display = "none";
			}
		}
		xhr.send(null);
	}
	else
	{
		getObject("Loading").style.display = "none";
	}
}

function ajaxAutoSelectTool(ToolID, BrandID, ModelID)
{
	if (window.loaded)
	{
		if (ToolID)
		{
			window.loaded = false;
			document.order.ToolID.value = ToolID;
			document.order.ToolID.onchange();
		}
	
		ajaxAutoSelectBrand(BrandID, ModelID);
	}
	else setTimeout(function() { ajaxAutoSelectTool(ToolID, BrandID, ModelID); }, 10);
}

function ajaxAutoSelectBrand(BrandID, ModelID)
{
	if (window.loaded)
	{
		if (BrandID)
		{
			window.loaded = false;
			document.order.BrandID.value = BrandID;
			document.order.BrandID.onchange();
		}

		ajaxAutoSelectModel(ModelID);
	}
	else setTimeout(function() { ajaxAutoSelectBrand(BrandID, ModelID); }, 10);
}

function ajaxAutoSelectModel(ModelID)
{
	if (window.loaded)
	{
		if (ModelID)
		{
			window.loaded = false;
			document.order.ModelID.value = ModelID;
			document.order.ModelID.onchange();
		}
	}
	else setTimeout(function() { ajaxAutoSelectModel(ModelID); }, 10);
}

function ajaxLoadTransferHistory(CustomerID)
{
	var tr = getObject("L" + CustomerID);
	
	// Row currently displayed ?
	var visible = (tr.style.display != "none");
	
	// Change row display
	tr.style.display = (visible ? "none" : "");
	
	if (! visible)
	{
		if (xhr)
		{
			if (xhr.readyState != 0)
			{
				xhr.onreadystatechange = function() {};
				xhr.abort();
			}
		}
		else xhr = getXhr();
		
		xhr.open("GET", "/ajax/transfer-history.xml.php?CustomerID=" + CustomerID, true);
		xhr.onreadystatechange = function()
		{
			if (xhr.readyState == 4 && xhr.responseXML)
			{
				// Get a reference to the <td>
				var id = xhr.responseXML.getElementsByTagName("customer")[0].getAttribute("id");
				var td = getObject("L" + id).getElementsByTagName("td")[0];

				// Get transfers list
				var transfer = xhr.responseXML.getElementsByTagName("transfer");
				
				var Html = '';

				if (transfer.length == 0) Html = '<i class="small black">' + GetLanguage("ACCOUNT_NO_HISTORY") + '</i>';
				else
				{
					var Html = '<ul class="transfer">';
					
					for (var i=0; i<transfer.length; i++)
					{
						Html += '<li>';
						Html += '<span style="float: left; text-align: left;">' + transfer[i].getAttribute("date") + '</span>';
						Html += '<span style="float: right; text-align: right;"><b>' + transfer[i].getAttribute("credits") + '</b> ' + GetLanguage("CREDITS") + '</span>';
						Html += '</li>';
					}
					
					Html += '</ul>';
				}
				
				td.innerHTML = Html;
			}
		}
		xhr.send(null);
	}
}
