var ayncReq = null;
var mustReloadPageAfterLoginLogoff = false;
document.queryString = "";
function initAsyncRequest( key, url, x, y, postData )
{
	if (url)
		document.queryString = url;
	else 
		url = document.queryString;
	ayncReq = new asyncRequest( key, url, x, y, postData );
}
function asyncRequest( _key, _url, _x, _y, _postData )
{
   this.key = _key; 
   this.reqUrl = _url; 
   this.x = _x; 
   this.y = _y; 
   this.postData = _postData;
}
//function InitializeXMLHttpRequest(req)
//{
//    if (req != null)
//       req.abort();
//	try{ 
//		req=new ActiveXObject("Msxml2.XMLHTTP"); }
//	catch(e){    
//		try { req=new ActiveXObject("Microsoft.XMLHTTP"); }
//		catch(oc){ req=null;}
//	}
//	if(!req && typeof XMLHttpRequest!="undefined")
//		req = new XMLHttpRequest();
//	return req;	
//}

		function InitializeXMLHttpRequest(xmlhttp) 
		{
			if (xmlhttp != null)
				xmlhttp.abort();
		    // try to create the XMLHTTP object with several ways.
		    if (typeof XMLHttpRequest != 'undefined')
		    {
		        // IE7, Fiefox, Safari, ...
		        var xmlhttp = new XMLHttpRequest();
		        return xmlhttp;
		    }
		    else if(window.ActiveXObject)
		    {
		        // IE
		        var aVersions = ["MSXML2.XMLHttp", "Microsoft.XMLHttp", "MSXML2.XMLHttp.4.0", "MSXML2.XMLHttp.3.0", "MSXML2.XMLHttp.5.0"];
		        for (var i = 0; i < aVersions.length; i++) 
		        {
		            try 
		            {
		                var xmlhttp = new ActiveXObject(aVersions[i]);
		                return xmlhttp;
		            } 
		            catch (oError) 
		            {
				        //Do nothing
		            }
				}
		    }
			// unable to create an XMLHTTP-Object
		} 


function checkForLoaderExists() {
	var loaderid = 'ajaxloader';
	var loaderimgid = 'ajaxloaderimg';
	var loader = document.getElementById(loaderid);
	var loaderimg = document.getElementById(loaderimgid);
	if ( !loader || !loaderimg ) {
		if ( loader ) {
			document.body.removeChild( loader );
		}	
		if ( loaderimg ) {
			document.body.removeChild( loaderimg );
		}	
		loader = document.createElement('div');
		loader.setAttribute('id', loaderid);
		loader.style.display = 'none';
		var img = new Image();
		img.src = 'images/loading.gif';
		var progressimage = document.createElement('img');
		progressimage.src = img.src;
		progressimage.id = loaderimgid;
		progressimage.style.display = 'none';
		document.body.appendChild(progressimage);
		document.body.appendChild(loader);
	}
}

function showProgress(x, y) {
	checkForLoaderExists();
	var loaderid = 'ajaxloader';
	var loaderimgid = 'ajaxloaderimg';
	var loader = document.getElementById(loaderid);
	var loaderimg = document.getElementById(loaderimgid);
	if ( loader && loaderimg ) {
		var page = new PageSize();
		loader.style.display = 'block';
		loader.style.top = '0px';
		loader.style.left = '0px';
		loader.style.bottom = '0px';
		loader.style.height = page.h + 'px';
//		loader.style.height = (window.scrollMaxY || document.body.scrollHeight || document.documentElement.scrollHeight || 0) + 'px';
//		loader.style.height = document.body.scrollHeight + 'px';
		loader.style.width = page.w + 'px';
//		loader.style.width = document.body.scrollWidth + 'px';
		loader.style.zIndex = 1001;
//		for(var i=0; i<loader.childNodes.length; i++) {
//			var child = loader.childNodes[i];
//			if (child.tagName == "IMG") {
//				child.style.position = "absolute";
//				child.style.left = (x - child.offsetWidth/2) + 'px';
//				child.style.top = (y - child.offsetHeight) + 'px';
//                break;
//			}
//		}
		loaderimg.style.display = 'block';
		loaderimg.style.position = "absolute";
		var dx = window.scrollX || document.documentElement.scrollLeft|| document.body.scrollLeft  || 0;
		var dy = window.scrollY || document.body.scrollTop || document.documentElement.scrollTop || 0;
//		loaderimg.style.left = (x - loaderimg.offsetWidth/2) + 'px';
//		loaderimg.style.top = (dy + y - loaderimg.offsetHeight/2) + 'px';
		loaderimg.style.left = (document.body.clientWidth/2 + dx - loaderimg.offsetWidth/2) + 'px';
		loaderimg.style.top = (document.body.clientHeight/2 + dy - loaderimg.offsetHeight/2) + 'px';
		loaderimg.style.zIndex = 1002;
//		if( document.body.scrollHeight ){
//			document.getElementById("indexalert").style.height = document.body.scrollHeight;
//		}else{
//			document.getElementById("indexalert").style.height = document.getElementById("alertheight").style.top;
//		}
	}
}
function hideLoader() {
	var loaderid = 'ajaxloader';
	var loaderimgid = 'ajaxloaderimg';
	var loader = document.getElementById(loaderid);
	var loaderimg = document.getElementById(loaderimgid);
	if ( loader ) {
		loader.style.display = 'none';
	}	
	if ( loaderimg ) {
		loaderimg.style.display = 'none';
	}	
}

var xmlReq;

function requestData(sender)
{
	var url = "utils.php";
	if ( sender.postData ) {
		url += "?sb=" + sender.key + "&ts=" + ( new Date() ).getMilliseconds(); 
	} else {
		url += "?sb=" + sender.key + "&" + sender.reqUrl + "&x=" + sender.x + "&y=" + sender.y + "&documentQS=" + Base64.encode(document.queryString) + "&ts=" + ( new Date() ).getMilliseconds();
	}
	xmlReq = InitializeXMLHttpRequest(xmlReq);
	xmlReq.onreadystatechange = requestData_processresult;
	if ( sender.postData ) {
		xmlReq.open('POST', url, true);
		var parameters = "";
		if (sender.reqUrl)
			parameters += sender.reqUrl + "&";
		parameters += sender.postData + "&x=" + sender.x + "&y=" + sender.y;
		xmlReq.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		xmlReq.setRequestHeader("Content-length", parameters.length);
		xmlReq.setRequestHeader("Connection", "close");
		xmlReq.send(parameters);
	} else {
		xmlReq.open('GET', url, true);
		xmlReq.send(null);
	}
    return false;
}    

function initialRequest()
{
//	hideLoader();
	showProgress(ayncReq.x, ayncReq.y);
	requestData(ayncReq);
}

function initialRequestWithProgress()
{
	showProgress(ayncReq.x, ayncReq.y);
	requestData(ayncReq);
}

function requestData_processresult()
{
	if (xmlReq.readyState == 4) {
		if (xmlReq.status == 200) {
			completeRequest( xmlReq.responseText );
//			var responseText = xmlReq.responseText;
//			if(responseText != null && responseText != "") {
//				var respData = responseText.split("~~~~~");
//				if( respData && respData.length && respData.length > 0 ) {
//					var evl = respData[0].split("~~~");
//					var htmls = null;
//					if ( respData.length > 1 ) {
//						htmls = respData[1].split("~~~");
//					}
//					if (evl && evl.length && evl.length > 0) {
//						for( i = 0; i < evl.length; i++ ) {
//							try {
//								eval(evl[i]);
//							} catch (err) {
////								alert(err);
//							}
//						}
//					}
//				}
//			}
			xmlReq.abort();
			xmlReq = null;
			hideLoader();
		}
	}
}
function PageQuery(q) {
	if( q.length > 1 ) 
		if ( q.indexOf("?") == 0 )
			this.q = q.substring(1, q.length);
		else 
			this.q = q;
	else { 
		this.q = null;
		return false;
	}
	this.keyValuePairs = new Array();
	if(q) {
		var qq = this.q.split("&");
		if (qq) {
			for(var i=0; i < qq.length; i++) {
				this.keyValuePairs[i] = qq[i];
			}
		}
	}
	this.getKeyValuePairs = function() { return this.keyValuePairs; }
	this.getValue = function(s) {
		for(var j=0; j < this.keyValuePairs.length; j++) {
			if(this.keyValuePairs[j].split("=")[0] == s) {
				var val = this.keyValuePairs[j].substring(s.length + 1, this.keyValuePairs[j].length)
				//return this.keyValuePairs[j].split("=")[1];
				return val;
			}
		}
		return false;
	}
	this.getParameters = function() {
		var a = new Array(this.getLength());
		for(var j=0; j < this.keyValuePairs.length; j++) {
			a[j] = this.keyValuePairs[j].split("=")[0];
		}
		return a;
	}
	this.getLength = function() { 
		return this.keyValuePairs.length; 
	}
}
function queryString(key){
	var page = new PageQuery(window.location.search);
	return unescape(page.getValue(key));
}
function initialRequestLink( ev, sb ) {
	var evt = Event.getEvent(ev);
	if ( !evt )
		return false;
	var targ = null;
	if (evt.target) 
		targ = evt.target
	else if (evt.srcElement) 
		targ = evt.srcElement
	if (targ.nodeType == 3) // defeat Safari bug
		targ = targ.parentNode
	if ( !targ )
		return;
	if ( targ.tagName == "IMG" )
		targ = targ.parentNode;
	var href = targ.href;
	var pos = href.indexOf("?");
	if(pos > -1)
		href = href.substring(pos + 1, href.length);
	if ( document.queryString ) {
		var page = new PageQuery(document.queryString);
		var npage = new PageQuery(href);
		if ( page.getParameters && npage.getParameters && page.getValue ) {
			pars = page.getParameters();
			npars = npage.getParameters();
			if ( pars && npars ) {
				for( i = 0; i < pars.length; i++ ) {
					if ( pars[i] == 'sb')
					continue;
					if (npars.indexOf(pars[i]) == -1) {
						href += "&" + pars[i] + "=" + page.getValue(pars[i]);
					}
				}
			}
		}
	}
//	document.queryString = href;
	initAsyncRequest( sb, href, evt.clientX, evt.clientY, null );
	initialRequest();
}

function add_to_history( value) {
	var ancors=document.getElementById( "ancors" );
	if( !ancors ) {
		ancor_conteiner_init();
		add_to_history( value );
		return;
	}
	ancors.appendChild( document.createElement( '<a name="'+value+'">' ) );
	location="#"+value;   
}
function ancor_conteiner_init() {
	appendHTML(document.body,'<span id="ancors" style="display:none;" ></span>');
}
function startRequest() {
	return true;
}

function completeRequest( response ) {
	var responseText = Base64.decode( response );
	if(responseText != null && responseText != "") {
		var respData = responseText.split("~~~~~");
		if( respData && respData.length && respData.length > 0 ) {
			var evl = respData[0].split("~~~");
			var htmls = null;
			if ( respData.length > 1 ) {
				htmls = respData[1].split("~~~");
			}
			if (evl && evl.length && evl.length > 0) {
				for( i = 0; i < evl.length; i++ ) {
					try {
						eval(evl[i]);
					} catch (err) {
								alert(err);
					}
				}
			}
		}
	}
}
function playGame( id, ev ) {
	var reqUrl = "game_id=" + id; 
	initAsyncRequest( 'playgame', null, ev.clientX, ev.clientY, reqUrl );
	initialRequest();
}
function playPopup( id, ev ) {
	var reqUrl = "game_id=" + id;
	initAsyncRequest( 'playpopup', null, ev.clientX, ev.clientY, reqUrl );
	initialRequest();
}
function uploadPopup( id, gid, ev, reload ) {
	var reqUrl = "task_id=" + id;
	if ( gid )
		reqUrl += "&game_id=" + gid;
	if ( reload )
		reqUrl += "&reload=1";
	initAsyncRequest( 'playuploadpopup', null, ev.clientX, ev.clientY, reqUrl );
	initialRequest();
}

AsyncUpload = {
	createFrame : function(formElement, completeCallback) {
		var frameName = 'f' + Math.floor(Math.random() * 99999);
		var divElement = document.createElement('DIV');
		divElement.innerHTML = '<iframe style="display:none" src="about:blank" id="'+frameName+'" name="'+frameName+'" onload="AsyncUpload.documentLoaded(\''+frameName+'\')"></iframe>';
		document.body.appendChild(divElement);
		
		var frameElement = document.getElementById(frameName);
		if (completeCallback && typeof(completeCallback) == 'function') {
			frameElement.completeCallback = completeCallback;
		}
		formElement.setAttribute('target', frameName);
	},
	documentLoaded : function(elementID) {
		var frameElement = document.getElementById(elementID);
		if (frameElement.contentDocument) {
			var documentElement = frameElement.contentDocument;
		} else if (frameElement.contentWindow) {
			var documentElement = frameElement.contentWindow.document;
		} else {
			var documentElement = window.frames[elementID].document;
		}
		if (documentElement.location.href == "about:blank") {
			return;
        }
		if (typeof(frameElement.completeCallback) == 'function') {
			frameElement.completeCallback( documentElement.body.innerHTML );
		}
	},
	submitForm : function(formElement, startCallback, completeCallback) {
		AsyncUpload.createFrame(formElement, completeCallback);
		if (startCallback && typeof(startCallback) == 'function') {
			return startCallback();
		} else {
			return true;
		}
	}
}