var intervalToCheckForChange = 100; // in milliseconds, 300 = 0.3sec
var request;
var	statusDivJS;
var	isAvailableDivJS;
var	domainInput;
var	extensionInput;
var domainsAvailableInput;
var isInProgress = false;
var prevCheckValue = ".com";
var whatDomainDivJS;
var intStartCheck;
var isLoaded = false;
var intFailedResponse;
var timesError = 0;
function checkDomain()
{
	if (isInProgress) return;
	isInProgress = true;
	if (extensionInput == null)
	{
		prevCheckValue = domainInput.value;
		if (domainInput.value.indexOf(".") < 0)
		{
			statusDivJS.innerHTML = "<span style='color:red;'>Enter the TLD (e.g: "+domainInput.value+".COM)<\/span>";
			isInProgress = false;
			return;
		}
	}
	else if (extensionInput != null)
	{
		prevCheckValue = domainInput.value+"."+extensionInput.value;
		if (domainInput.value.indexOf(".") > 0)
		{
			prevCheckValue = domainInput.value;
			selExtensions = document.getElementById("extension");
			tryExt = prevCheckValue.substr(domainInput.value.indexOf(".")+1);
			tryExt = tryExt.toUpperCase();
			var isFoundValid = false;
			for (var i =0; i < selExtensions.length; i++)
			{
				if (selExtensions.options[i].text.toUpperCase() == tryExt)
				{
					selExtensions.options[i].selected = true;
					isFoundValid = true;
					break;
				}
			}
			if (!isFoundValid)
			{
				statusDivJS.innerHTML = "<span style='color:red;'>."+tryExt+" is not supported.<\/span>";
				isInProgress = false;
				return;
			}
		}
	}
	else
	{
		return;
	}
	re = new RegExp("^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)*[a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?$");
	if (prevCheckValue.match(re) == null)
	{
		statusDivJS.innerHTML = "<span style='color:red;'>Invalid Domain (Letters, numbers and hypens only) <\/span>";
		isInProgress = false;
		return;
	}
	statusDivJS.innerHTML = "<span style='color:green;'><img src='../images/prg.gif' height='16' width='16' alt='in progress'>Checking "+prevCheckValue+" ( <a href='#' onClick='abortRequest();return false;'>Abort<\/a> / <a href='#' onClick='retryRequest();return false;'>Retry<\/a> )<\/span>";
	if (window.XMLHttpRequest) { // Mozilla, Safari, ...
		request = new XMLHttpRequest();
	}
	else if (window.ActiveXObject) { // IE
		request = new ActiveXObject("Microsoft.XMLHTTP");
	}
	var requestUrl = "include/domaincheck.php?aj=&ma="+Math.random()+"&domain="+prevCheckValue;
	//document.location.href = requestUrl;return;
	request.open("GET",requestUrl,true);
	request.onreadystatechange = processResponse;
	intFailedResponse = setTimeout("failedResponse()",15000);
	try {request.send(null); }
	catch (e)
	{
		timesError++;
		statusDivJS.innerHTML = "<span style='color:red;'>Error connecting to server ("+timesError+"x)<\/span>";
	}
}
function failedResponse()
{
	if (!isInProgress) return;
	isInProgress = false;
	timesError++;
	statusDivJS.innerHTML = "<span style='color:red;'>Error connecting to server ("+timesError+"x)(<a href='#' onClick='checkDomain();return false;'>Retry<\/a>)<\/span>";
	request.abort();
	request = null;
}
function retryRequest()
{
	if (!isInProgress) return;
	request.abort();
	isInProgress = false;
	request = null;
	statusDivJS.innerHTML = "<span style='color:red;'>Retrying<\/span>";
	checkDomain();
}
function abortRequest()
{
	if (!isInProgress) return;
	request.abort();
	isInProgress = false;
	request = null;
	statusDivJS.innerHTML = "<span style='color:red;'>Aborted<\/span>";
}
function updateDomainTld(tldBox)
{
	var domainText = domainInput.value;
	if (domainText.indexOf('.') == -1) return;
	domainText = domainText.substr(domainText,domainText.indexOf('.'));
	domainInput.value = domainText + "." + tldBox.value;
}
function processResponse()
{
	statusDivJS = document.getElementById("statusDiv");
	if (request.readyState == 4)
	{
		clearTimeout(intFailedResponse);
		var requestXML = request.responseXML;
		if ((requestXML != null) && (typeof(requestXML) == "object") && (requestXML.getElementsByTagName("domainname")[0] != null))
		{
			statusDivJS.innerHTML = "Done (<a href='#' onClick='checkDomain();return false;'>Force Check<\/a>)";
			isInProgress = false;
			var domain = requestXML.getElementsByTagName("domainname")[0].firstChild.data;
			var available = requestXML.getElementsByTagName("available")[0].firstChild.data;
			var errorMsg = "";
			if (requestXML.getElementsByTagName("errorMsg")[0].firstChild != null)
				errorMsg = requestXML.getElementsByTagName("errorMsg")[0].firstChild.data;
			if (available == "true")
			{
				statusDivJS.innerHTML = "<span style='color:green;'>Domain is available!</span>";
				available = "<span style='color:green;'><b>YES<\/b><\/span>	";
				if (domainsAvailableInput.value.indexOf(domain +" ") == -1)
					domainsAvailableInput.value = domainsAvailableInput.value + domain +" \n";
			}
			else
			{
				statusDivJS.innerHTML = "Domain <a href='http://www."+prevCheckValue+"'>"+prevCheckValue+"</a> is already taken.";
				available = "<span style='color:red;'>NO<\/span>";
			}
			if (errorMsg != "")
			{
				statusDivJS.innerHTML = "<span style='color:red;'>"+errorMsg+"</span> (<a href='#' onClick='checkDomain();return false;'>Retry<\/a>)";
			}
			whatDomainDivJS.innerHTML = domain;
			isAvailableDivJS.innerHTML = available;
		}
		else
		{
			failedResponse();
			return;
		}
	}
	else if (request.readyState == 3)
	{
		statusDivJS.innerHTML = "Request sent...";
	}
}
function checkForChange()
{
	if (!isLoaded) return;
	if (domainInput.value == '') return;
	clearTimeout(intStartCheck);
	if (extensionInput != null)
	{
		if ((prevCheckValue != (domainInput.value+'.'+extensionInput.value))
			&&  (prevCheckValue != domainInput.value))
		{
			intStartCheck = setTimeout("checkDomain()",intervalToCheckForChange);
		}
		else
		{
			return;
		}
	}
	else if (prevCheckValue != (domainInput.value))
	{
		intStartCheck = setTimeout("checkDomain()",intervalToCheckForChange);
	}
}
function bodyonLoad()
{
	statusDivJS = document.getElementById("statusDiv");
	isAvailableDivJS = document.getElementById("isAvailableDiv");
	domainInput =  document.getElementById("domain");
	extensionInput =  document.getElementById("extension");
	domainsAvailableInput = document.getElementById("domainsAvailable");
	whatDomainDivJS = document.getElementById("whatDomainDiv");
	isLoaded = true;
	setInterval("checkForChange()",intervalToCheckForChange);
}
//Generator done by Bootstrike at http://www.bootstrike.com/PHPAJAXDomainCheck/
function startGenerator()
{
	minChars = parseInt(document.getElementById("characters").value);
	maxChars = parseInt(document.getElementById("characters2").value);
	if (minChars == "") { alert("Invalid minimum characters!"); return; }
	if (isNaN(minChars)) { alert("Invalid minimum characters!"); return; }
	if (minChars < 0) { alert("Minimum characters a negative number?"); return; }
	if (maxChars == "") { alert("Invalid maximum characters!"); return; }
	if (isNaN(maxChars)) { alert("Invalid maximum characters!"); return; }
	if (maxChars < 0) { alert("Maximum characters a negative number?"); return; }
	if (maxChars < minChars) { alert("Maximum characters less than minimum characters?"); return; }
	withNumbers = document.getElementById("withNumbers").value;
	withHypens = document.getElementById("withHypens").value;
	genTextAreaInput = document.getElementById("genTextArea");
	tldExt = "."+document.getElementById("extensionGen").value;
	statusGenerateDiv = document.getElementById("statusGenerate");
	if (withNumbers == 0) //without num
		arrayToUse = chars;
	else if (withNumbers == 1) //with nums
		arrayToUse = charsnums;
	else if (withNumbers == 2) // with only nums
		arrayToUse = nums;
	if (withHypens == 0) //without hyp bootstrike
	{
		onlyHypens = false;
		withHypens = false;
	}
	else if (withHypens == 1)  //with hyp bootstrike
	{
		onlyHypens = false;
		withHypens = true;
	}
	else if (withHypens == 2)  // with only hyp bootstrike
	{
		onlyHypens = true;
		withHypens = true;
	}
	if ((maxChars == 4) && (withNumbers < 2) && (!onlyHypens) && (!confirm("WARNING: This will take very VERY long depending on your CPU speed. \n\nWe recommend closing other browser windows and starting a new one just for this action.\n\nProceed?"))) return;
	statusGenerateDiv.innerHTML = "<div style='color:red'>Processing... it is normal for your browser to 'hang'. Be patient!<\/div>";
	setTimeout("completeGenerator1()",250);
}
function completeGenerator1()
{
	genStr = generate();
	statusGenerateDiv.innerHTML = "<div style='color:red'>Putting to textarea... <\/div>";
	setTimeout("completeBootstrike()",250);
}
function completeBootstrike()
{
	genTextAreaInput.value = genStr;
	statusGenerateDiv.innerHTML = "Completed.";
}
//the main engine - http://www.bootstrike.com/PHPAJAXDomainCheck/
function generate()
{
	genStr = "";
	for (var i = 0; i < arrayToUse.length; i++)
	{
		if ((minChars < 2) && (!onlyHypens))
			genStr += arrayToUse[i] + tldExt + "\n";
		if (maxChars > 1)
		{
			for (var j = 0; j < arrayToUse.length; j++)
			{
				if ((minChars < 3) && (!onlyHypens))
					genStr += arrayToUse[i] + arrayToUse[j] + tldExt + "\n";
				if (maxChars > 2)
				{
					for (var x = 0; x < arrayToUse.length; x++)
					{
						if (minChars < 4)
						{
							if (!onlyHypens)
								genStr += arrayToUse[i] + arrayToUse[j] + arrayToUse[x] + tldExt + "\n";
							if (withHypens && x == 1)
							{
								genStr += arrayToUse[i] + hypen + arrayToUse[j] + tldExt + "\n";
							}
						}
						if (maxChars > 3)
						{
							for (var y = 0; y < arrayToUse.length; y++)
							{
								if (minChars < 5)
								{
									if (!onlyHypens)
										genStr += arrayToUse[i] + arrayToUse[j] + arrayToUse[x] + arrayToUse[y] + tldExt + "\n";
									if (withHypens && y == 1)
									{
										genStr += arrayToUse[i] + hypen + arrayToUse[j] + arrayToUse[x] + tldExt + "\n";
										genStr += arrayToUse[i] + arrayToUse[j] + hypen + arrayToUse[x] + tldExt + "\n";
									}
								}
							}
						}
					}
				}
			}
		}
	}
	return genStr;
}

/* for random generator */
var genStr = "";
var chars = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'];
var charsnums = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9'];
var nums = ['0','1','2','3','4','5','6','7','8','9'];
var bootstrike = ['0','1','2','3','4','5','6','7','8','9'];
var hypen = "-";
var	withNumbers;
var	withHypens;
var	tldExt;
var	minChars;
var	maxChars;
var genTextAreaInput;
var arrayToUse;
var onlyHypens;

