/***********************************
(c) by Marc Arzt, ActiveCreate GmbH
************************************/

function callInProgress (xmlhttp) {
	switch (xmlhttp.readyState) {
		case 1: case 2: case 3:
			return true;
			break;
		// Case 4 and 0
		default:
			return false;
			break;
	}
}





//************************

	Ajax.Request.prototype.abort = function() {
		// prevent and state change callbacks from being issued
		this.transport.onreadystatechange = Prototype.emptyFunction;
		// abort the XHR
		this.transport.abort();
		// update the request counter
		Ajax.activeRequestCount--;
	};	
	
	

	var AjaxQueueObject = Class.create({
		initialize: function(url, parameter, onsuccess, retry, tag, timeout, cancelfunc, asynchronous) {
			this.url  = url;
			this.parameter = parameter;
			this.onsuccess = onsuccess;
			this.request = null;
			this.retry  = retry;
			this.tag  = tag;
			this.timeout = timeout;
			this.processed = false;
			this.requesttime = undefined;
			this.cancelfunc = cancelfunc;
			this.asynchronous = asynchronous;
		}
	});
	
	var ajaxqueue = new Array();
	var ajaxmanagercount = 0;
	var currentajaxrequest = undefined;
	
	function ajaxmanagerpush(url, parameter, onsuccess, tag, timeout, cancelfunc){
		if (tag === undefined){
			tag = '';
		}else{
			//remove all elements from the queue with the same tag
			ajaxmanagerkilltag(tag);
		}
		if (timeout === undefined) timeout = 25000;
		ajaxqueue.push(new AjaxQueueObject(url, parameter, onsuccess, 0, tag, timeout, cancelfunc, true));
		ajaxManager();
	}
	
	function ajaxmanagerpushSynchronous(url, parameter, onsuccess, tag, timeout, cancelfunc){
		if (tag === undefined){
			tag = '';
		}else{
			//remove all elements from the queue with the same tag
			ajaxmanagerkilltag(tag);
		}
		if (timeout === undefined) timeout = 25000;
		ajaxqueue.push(new AjaxQueueObject(url, parameter, onsuccess, 0, tag, timeout, cancelfunc, false));
		ajaxManager();
	}
	
	function ajaxmanagerkilltag(tag){
		for (var i = 0; ajaxqueue.length; i++){
			try{
				if (ajaxqueue[i].tag == tag){
					ajaxqueue[i].tag = 'deleted';
				}
			}catch(err){
				break;
			}
		}
	}
	
	var ajaxmanagerunload = false;
	function ajaxmanagerunload(){
		ajaxmanagerunload = true;
	}
	
	function ajaxManager(){
		
		if (ajaxmanagerunload) return;
		
		if (ajaxqueue.length > 0 && (currentajaxrequest === undefined || currentajaxrequest.processed)){
			ajaxmanagercount = 0;
			try{
				currentajaxrequest = ajaxqueue.shift();
				if (currentajaxrequest.tag == 'deleted'){
					ajaxManager();
				}
				currentajaxrequest.requesttime = new Date();
				 //if (user_id == 2) alert(currentajaxrequest.url + ' ' + currentajaxrequest.parameter);
				currentajaxrequest.request = new Ajax.Request(
					currentajaxrequest.url,
					{
						method: 'post', 
						asynchronous: currentajaxrequest.asynchronous,
						parameters: currentajaxrequest.parameter,
						onSuccess: ajaxResponse,
						onFailure: ajaxFailure,
						onException: ajaxException,
						onCreate: ajaxCreate,
						onComplete: ajaxComplete
					});

					currentajaxrequest.request.onreadystatechange = currentajaxrequest.request.onStateChange.bind(currentajaxrequest.request);
			}catch(ex){
				try { if (user_id == 2) alert('ajaxManager: ' + exception); } catch(e){}
			}
		}
	}
	
	function ajaxException(request, exception){
		if (ajaxmanagerunload) return;
		try { if (user_id == 2) alert('ajaxException: ' + exception); } catch(e){}
		ajaxFailure(request);
	}
	
	//failure, try it again...
	function ajaxFailure(request){
		if (ajaxmanagerunload) return;
		//if (currentajaxrequest.processed) return;
		try{
			if (currentajaxrequest.retry < 5){
				var param = currentajaxrequest.parameter;	
				if (param.length > 0) param += '&';
				param += 'retry=' + (currentajaxrequest.retry + 1);
				ajaxqueue.unshift(new AjaxQueueObject(currentajaxrequest.url, param, currentajaxrequest.onsuccess, currentajaxrequest.retry + 1, currentajaxrequest.tag, currentajaxrequest.retry));
			}else{
				try{if (user_id == 2) alert('ajaxFailure retry = 5');}catch(e){}
				//breakAjaxRequest(currentajaxrequest.url);
				try{
					if (cancelfunc !== undefined) currentajaxrequest.cancelfunc();
				}catch(e){}
			}
		}catch(ex){
			try{if (user_id == 2) alert('ajaxFailure: ' + ex);}catch(e){}
		}
		currentajaxrequest.processed = true;
		ajaxManager();
	}

	function ajaxResponse(request){
		if (Ajax.activeRequestCount < 0) {
			Ajax.activeRequestCount = 0;
		}
		currentajaxrequest.onsuccess(request);
//		currentajaxrequest.processed = true;
//		ajaxManager();
	}
	
	function ajaxCreate (request) {
		if (ajaxmanagerunload) return;
		var t = currentajaxrequest.timeout;
		if (maxrequesttime * 2 > t) t = maxrequesttime * 2;
		if (t < 5000) t = 5000;
		request['timeoutId'] = window.setTimeout(
			function() {
				// If we have hit the timeout and the AJAX request is active, abort it and let the user know
				if (callInProgress(request.transport)) {
					request.transport.abort();
					maxrequesttime *= 2;
					if (maxrequesttime > 30000) maxrequesttime = 30000;
					//try{if (user_id == 2) alert('ajaxCreate: timeout');}catch(e){}
					ajaxFailure(request);
				}
			},
			t
		);
	}
	
	function ajaxComplete (request) {
		// Clear the timeout, the request completed ok
		window.clearTimeout(request['timeoutId']);
		var now = new Date();
		var t = now.getTime() - currentajaxrequest.requesttime.getTime();
		if (t > maxrequesttime) maxrequesttime = t;
		if (maxrequesttime > 30000) maxrequesttime = 30000;
		if (t*2 < maxrequesttime) maxrequesttime *= 0.9;
//		if (user_id == 2) alert(maxrequesttime + ' ' + t);
		maxrequesttime = Math.round(maxrequesttime);
		currentajaxrequest.processed = true;
		ajaxManager();
	}

	
	function breakAjaxRequest(url){
		if (url == baseUrl + '/shoutbox/ajaxsaveentry/') document.getElementById('shoutboxSubmitButton').disabled = false;
	}




function storeToSession(id, url){
	savediv(0, 0.5);
	window.setTimeout('storeToSessionTimed(\'' + id + '\', \'' + url + '\')',300);
}



function storeToSessionTimed(id, url){
	document.getElementById('cachearea').value = getCacheValues();
	document.getElementById('cacheid').value = id;
	document.getElementById('cacheredirect').value = url;
	document.cacheform.submit();
}



function fetchFromSession(id){
	var param = new Array();
	param[0] = new Object();
	param[0]['id'] = id;
	var paramjson = param.toJSON().urlSave2();
	ajaxmanagerpush(baseUrl + '/index/ajaxfetchfromsession/', 'param=' + paramjson, 
		function(request){
			if (request.responseText.length > 7){
//				try{
					var res = request.responseText;//.myEvalJSON();
					setCacheValues(res);
//				}catch(ex){
//					cacheNotFound();
//				}
			}else{
				cacheNotFound();
			}
	}, id, 5000);
}

function getUnreadMailCount(){
	//ajaxmanagerpush(baseUrl + '/message/ajaxgetunreadcount/', 'mrt='+maxrequesttime, getUnreadMailCountResponse, 'getUnreadMailCount', 5000);
	//ajaxmanagerpushjQ(baseUrl + '/message/ajaxgetunreadcount/', 'mrt='+maxrequesttime, getUnreadMailCountResponse);
	ajaxmanagerpushjQ(baseUrl + '/message/ajaxgetunreadcount/', {mrt: maxrequesttime}, getUnreadMailCountResponse);
}

function getUnreadMailCountResponse(request){
	//var v = parseInt(request.responseText);
	var v = parseInt(request);
	var inner = '';
	if (!isNaN(v)){
		unreadcount = v;
		if (v > 0){
			inner = '(' + v + ')';
			document.title = unreadcount + ' ungelesen | ' + mytitle;
		}
	}
	document.getElementById('unreadmails').innerHTML = inner;
	setTimeout("getUnreadMailCount()", 180000);
	
	v = null;
	inner = null;
	
}



/*******************************************************
 * jQuery Ajax
 */

//create an ajaxmanager named someAjaxProfileName
var managedAjax = jQuery.manageAjax.create('myAjaxManager', {
	queue: true, 
	cacheResponse: false,
	preventDoubbleRequests: false,
	maxRequests: 1
});

function ajaxmanagerpushjQ(url, parameter, onsuccess, tag, timeout, cancelfunc){
	
	managedAjax.add(
			{
				  type: 'POST',
				  url: url,
				  data: parameter,
				  success: onsuccess
				}
			);
/*
	jQuery.ajax({
		  type: 'POST',
		  url: url,
		  data: parameter,
		  success: onsuccess
		});
*/	
//	jQuery.post(url, parameter, onsuccess);

	
	/*
	if (tag === undefined){
		tag = '';
	}else{
		//remove all elements from the queue with the same tag
		ajaxmanagerkilltag(tag);
	}
	if (timeout === undefined) timeout = 25000;
	ajaxqueue.push(new AjaxQueueObject(url, parameter, onsuccess, 0, tag, timeout, cancelfunc, true));
	ajaxManager();*/
}

