
var attackevasive = 1;
var requestQueue = new Array();
var clientStack = new Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0);

var Client = function (receiveType, waitId) {
	for(var stackIndex = 0; stackIndex < clientStack.length && clientStack[stackIndex] != 0; stackIndex++) {
		clientStack[stackIndex] = 1;
	}
	
	var clt = new Object();
	
	clt.loading = "Мгдижа...";
	clt.receiveType = isdefined(receiveType) ? receiveType : "XML";
	clt.wait = waitId ? $(waitId) : null;
	
	clt.resultHandle = null;
	clt.sendString = "";
	clt.targetUrl = "";
	clt.stackIndex = 0;
	
	clt.stackIndex = stackIndex;
	clt.XMLHttpRequest = null;
	
	clt.setLoading = function(loadstring) {
		if (isdefined(loadString) && loadstring != "" && loadstring != null)
			clt.loading = loadstring;
	}
	
	clt.setReceiveType = function (rcvType) {
		clt.receiveType = rcvType;
	}
	
	clt.setWait = function (waitId) {
		clt.wait = $(waitId);
	}
	
	clt.newXMLHttpRequest = function () {
		var request = false;
		
		if(window.XMLHttpRequest) {
			try {
				request = new XMLHttpRequest();
			} catch(e){
				alert("error: " + e);
			}
			
			if(request.overrideMimeType) {
				request.overrideMimeType('text/xml');
			}
			
		} else if(window.ActiveXObject) {
			var versions = ['Microsoft.XMLHTTP', 'MSXML.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.7.0', 'Msxml2.XMLHTTP.6.0', 'Msxml2.XMLHTTP.5.0', 'Msxml2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP'];
			for(var i=0; i<versions.length; i++) {
				try {
					request = new ActiveXObject(versions[i]);
					
					if(request) {
						return request;
					}
				} catch(e) {
					alert("error: " + e);
				}
			}
		}
		
		return request;
	}
	
	clt.XMLHttpRequest = clt.newXMLHttpRequest();
	
	clt.showLoading = function () {
		if( clt.wait && (clt.XMLHttpRequest.readyState != 4 || clt.XMLHttpRequest.status != 200) ) {
			setDisplay(clt.wait, '');
			clt.wait.innerHTML = "<span>" + clt.loading + "</span>";
		}
	}
	
	clt.processHandle = function() {
		if(clt.XMLHttpRequest.readyState == 4 && clt.XMLHttpRequest.status == 200) {
			for(k in requestQueue) {
				if(requestQueue[k] == clt.targetUrl) {
					requestQueue[k] = null;
				}
			}
			
			if(clt.wait) setDisplay(clt.wait, 'none');
			
			if(clt.receiveType.toUpperCase() == 'HTML') {
				clt.resultHandle(clt.XMLHttpRequest.responseText, clt);
			} else if(clt.receiveType.toUpperCase() == 'XML') {
				try{
					clt.resultHandle(clt.XMLHttpRequest.responseXML.lastChild.firstChild.nodeValue, clt);
				} catch(e) {
					alert(e.name);
				}
			}
			
			clientStack[clt.stackIndex] = 0;
		}
	}
	
	clt.get = function (targetUrl, resultHandle) {
		setTimeout(function(){clt.showLoading();}, 100);
		
		if(inArray(targetUrl, requestQueue)) {
			return false;
		} else {
			requestQueue.push(targetUrl);
		}
		
		clt.targetUrl = targetUrl;
		clt.XMLHttpRequest.onreadystatechange = clt.processHandle;
		clt.resultHandle = resultHandle;
		
		var delay = attackevasive & 1 ? (clt.stackIndex + 1) * 1001 : 100;
		
		if(window.XMLHttpRequest) {
			setTimeout(
				function() {
					clt.XMLHttpRequest.open('GET', clt.targetUrl);
					clt.XMLHttpRequest.send(null);
				},
				delay
			);
		} else {
			setTimeout(function(){
				clt.XMLHttpRequest.open("GET", targetUrl, true);
				clt.XMLHttpRequest.send();},
				delay
			);
		}
		
	}
	
	clt.post = function(targetUrl, sendString, resultHandle) {
		setTimeout(function(){clt.showLoading();}, 100);

		if(inArray(targetUrl, requestQueue)) {
			return false;
		} else {
			requestQueue.push(targetUrl);
		}
	
		clt.targetUrl = targetUrl;
		clt.sendString = sendString;
		clt.XMLHttpRequest.onreadystatechange = clt.processHandle;
		clt.resultHandle = resultHandle;
		clt.XMLHttpRequest.open('POST', targetUrl);
		clt.XMLHttpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		clt.XMLHttpRequest.send(clt.sendString);
	}
	
	return clt;
	
}

var URL = function(url) {
	this.url = url;
	
	this.get = function(paramName) {
		var reg = new RegExp("(\\?|&)" + paramName + "=([^&]*)(\\s|&|$)", "gi");
		
		if (reg.test(this.url)){
			return RegExp.$2;
		}
	
		return 'undefined';
	}
}

function $(id) {
	return document.getElementById(id);
}

function isdefined(variable)
{
	try {
		return typeof(variable) == 'undefined' ? false : true;
	} catch (e) {
		return false;
	}
}

function setDisplay(obj, displayStyle) {
	obj.style.display = displayStyle;
}

function inArray(needle, haystack) {
	if(typeof needle == 'string' || typeof needle == 'number') {
		for(var i in haystack) {
			if(haystack[i] == needle) {
					return true;
			}
		}
	}
	return false;
}
