var req
var user_handler
var req_active
function server_request(url,handler,async,p1,p2,p3) {
	if (req && req_active) {
		alert("SERVER_REQUEST. Выполняется предыдущий запрос. Пожалуйста подождите")
		return
	}
	var numargs = server_request.arguments.length
	if (numargs<3) return
	var qs=[]
	for (var i=3; i<numargs; i++) {
		if (typeof(server_request.arguments[i]) == 'object') {
			for (var k in server_request.arguments[i]) {
//				qs.push(k+'='+encodeURIComponent(server_request.arguments[i][k]))
				qs.push(k+'='+server_request.arguments[i][k])
			}
		} else {
//			qs.push('q'+(i-2)+'='+encodeURIComponent(server_request.arguments[i]))
			qs.push('q'+(i-2)+'='+server_request.arguments[i])
		}
	}
	if (qs.length) url+='?'+qs.join('&')
	if (0 && window.XMLHttpRequest) {
        req = new XMLHttpRequest();
        if (!req) {
        	alert('Ошибка создания объекта XMLHttpRequest')
        }
		req.onreadystatechange = req_handler;
		user_handler = handler;
		req_active=true
		req.open("GET", url, async);
		req.send(null);
    } else if (window.ActiveXObject) {
		req = new ActiveXObject("Microsoft.XMLHTTP");
        if (!req) {
        	alert('Ошибка создания объекта Microsoft.XMLHTTP')
        }
		if (req) {
			req.onreadystatechange = req_handler;
			user_handler = handler;
			req.open("GET", url, async);
			req.send();
		}
	} else {
		alert("Не удалось создать объект Microsoft.XMLHTTP или XMLHttpRequest");
	}
}
function req_handler() {
	ab = window.setTimeout("req.abort()", 5000);
	if (req.readyState == 4) {
		clearTimeout(ab);
		var r
		if ((req.status == 200) && (req.responseText.match(/\s*completed_ok\s*/i) || req.responseText.match(/\s*{\s*/i))) {
			r=parse_reqHandle(req.responseText,true)
			user_handler(req.responseText,r);
		} else {
			alert("Ошибка запроса сервера:\nстатус-"+" "+stat_text(req.readyState)+" "+req.status+" "+req.statusText+"\n"+req.responseText);
			user_handler(false,r,req.responseText);
		}
		req_active=false
	}  
}

function parse_reqHandle(req,skip_warn) {
	var r
	if (req.substr(0,13)=='completed_ok{') {
		r=req.substr(12)
	} else {
		r=req
	}
	var b
	try {
		eval("b="+r)
	} catch(e) {
		if (!skip_warn)	alert("Ошибка в ответе сервера:\n"+r)
		return false
	}
	if (b.alert) alert(b.alert)	/* предупреждение от сервера */
	return b
}

function stat_text(n) {
	switch (n) {
	  	case 0: return "не инициализирован"; break;
		case 1: return "загрузка..."; break;
		case 2: return "загружено"; break;
		case 3: return "в процессе..."; break;
		case 4: return "готово"; break;
		default: return "неизвестное состояние";  
	}
}

