﻿var AjaxReq = Class.create();

AjaxReq.prototype = {
	
	createXmlHttp: function()
	{
		var xmlhttp;
		try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); }
		catch (e)
		{
			try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); }
			catch (E) { xmlhttp = false; }
		}
		if (!xmlhttp && typeof XMLHttpRequest != 'undefined') { xmlhttp = new XMLHttpRequest(); }
		return xmlhttp;
	},

	initialize: function(url, method, data, callback, needpreloader)
	{
	//alert(url + ', ' + method + ', ' + data + ', ' + callback);
		this.request = this.createXmlHttp();
	if (typeof needpreloader == 'undefined') needpreloader = false;
		var timeout = 30;
		var vars = '';
		if (typeof data == 'string') {vars += data;} else if (data != null) {try {vars += data();} catch(e) {eOutput(e);}}
		vars += '&r=' + new Date().getTime();
		if (method == 'get') { url = url + '?' + vars; }
	//alert(vars + ', ' + url);
		this.request.open(method.toUpperCase(), url, true);
		if (method == 'post') { this.request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); }
		
		var loader = this;
		
		if (needpreloader) this.showPreloader();
		
		this.request.onreadystatechange = function()
		{
	//alert('state='+loader.request.readyState);
			if (loader.request.readyState == 4 && callback)
			{
	//alert('status='+loader.request.status);
	//alert('statusText='+loader.request.statusText);
				if (needpreloader) loader.hidePreloader();
				clearTimeout(loader.requestTimeout);
				if(loader.request.status == 200 || loader.request.status == 302 || loader.request.status == 0)
				{
	//alert(loader.request.getResponseHeader('Content-Type'));
					if (loader.request.getResponseHeader('Content-Type').indexOf('text/xml') != -1)
					{
	//alert(loader.request.responseText);
						callback(loader.request.responseXML);
					}
				}
				else
				{
		      			loader.ajaxError(loader.request.statusText);
	      				clearTimeout(loader.requestTimeout);
				}
			}
		};
		if (method == 'post' && data != null) { this.request.send(vars); }
		else { this.request.send(null); }
		
		// this.requestTimeout = setTimeout( function() { loader.abort(); loader.ajaxError('timeout'); }, timeout*1000 );
		this.requestTimeout = setTimeout( function() { loader.request.abort(); if (needpreloader) loader.hidePreloader(); loader.ajaxError('timeout'); }, timeout*1000 );
	},
	
	showPreloader: function()
	{
		/*if (typeof initWinbox != 'undefined' && initWinbox && typeof Winbox1 == 'undefined') {
			try {
				initWinbox();
			} catch(e) { eOutput(e); }
		}
		if (Winbox1 && typeof Winbox1.start != 'undefined') {
			try {
				Winbox1.start();
			} catch(e) { eOutput(e); }
		}*/
	},
	
	hidePreloader: function()
	{
		/*if (Winbox1 && typeof Winbox1.start != 'undefined') {
			try {
				Winbox1.end();
			} catch(e) { eOutput(e); }
		}*/
	},

	ajaxError: function(status)
	{
		if (status == 'timeout') { alert('Timeout. Please, try again later.'); }
		else { alert('Page error: ' + status); }
	}

};