/*
    Модуль для работы с HTTRequest-ом
*/
function Request(id)
{
	this.Id = null;
	if(id)
	{
		this.Id = id;
		$server.Requests.push(this);
	}
	this.Request = $server.CreateRequest();
    this.Preloader = new Preloader();
    this.Stop = function()
    {
		this.Request.onreadystatechange = function(){};
		this.Request.abort();
    }
    this.Send = function(url,onSuccess,onError,postData,text) 
    {		
        this.Preloader.Begin(text);
	    var req = this.Request;
	    if (!req) return;
	    this.Stop();
	    var method = (postData) ? "POST" : "GET";
	    req.open(method,url,true);
	    if(req.overrideMimeType)
			req.overrideMimeType("text/plain");
	    req.setRequestHeader('User-Agent','XMLHTTP/1.0');
	    if (postData)
		    req.setRequestHeader('Content-type','application/x-www-form-urlencoded');	
		var _load = this.Preloader;
		if(postData == null)
			postData = "";
	    req.onreadystatechange = function () 
	    {
			if (req.readyState != 4) { return; }
			else
			{
				try
				{
					if (req.status != 200 && req.status != 304) 
					{
						_load.End(true);
						onError(req);
						return;
					}
				}
				catch(e)
				{
					onError(req);
					return;
				}
				_load.End(false);
				onSuccess(req);
			}
	    }
	    if (req.readyState == 4) return;
	    req.send(postData);
    }
}
function Preloader()
{
    this.Type = $server.Preloader.Type.ShowHide;
    this.Text = 
    {
        BeginRequest:"",
        Success:"Успешно!",
        Error:"Ошибка!"
    }
    this.Panel = null;
    this.PanelClassName = "PreloaderPanel";
    this.TextPanel = null;
    this.Begin = function(text)
    {
        if(this.Panel == null)
        {
            this.Panel = document.createElement("div");
            this.Panel.className = this.PanelClassName;
            this.TextPanel = document.createElement("div");
            $global.SetText(this.TextPanel, this.Text.BeginRequest);
            this.Panel.appendChild(this.TextPanel);
            document.body.appendChild(this.Panel);
        }
        if(this.Type == $server.Preloader.Type.SetText)
        {
            $global.SetText(this.TextPanel, this.Text.BeginRequest);
        }
        $global.Display.Clear(this.Panel);
        if(this.TextPanel && text)
			this.TextPanel.innerHTML = text;
    }
    this.End = function(error)
    {
        if(this.Type == $server.Preloader.Type.ShowHide)
        {
            this.Panel.style.display = "none";
        }
        else
        {
            if(error)
                $global.SetText(this.Panel, this.Text.Error);
            else
                $global.SetText(this.Panel, this.Text.Success);
        }
    }
}
var $server = 
{
	Requests:new Array(),
    Preloader:{
        Type:{
            ShowHide:"0",
            SetText:"1"
        }
    },
    GetRequest:function(id)
    {
		var result = null;
		for(var i=0;i<this.Requests.length;i++)
		{
			if(this.Requests[i].Id == id)
			{
				result = this.Requests[i];
				break;
			}
		}
		if(result == null)
			result = new Request(id);
		return result;
    },
    HttpFactories:[
        function () {return new XMLHttpRequest()},
	    function () {return new ActiveXObject("Msxml2.XMLHTTP")},
	    function () {return new ActiveXObject("Msxml3.XMLHTTP")},
	    function () {return new ActiveXObject("Microsoft.XMLHTTP")}
    ],
    CreateRequest:function() 
    {
	    var xmlhttp = false;
	    for (var i=0;i<$server.HttpFactories.length;i++) 
	    {
		    try 
		    {
			    xmlhttp = $server.HttpFactories[i]();
		    }
		    catch (e) 
		    {
			    continue;
		    }
		    break;
	    }
	    return xmlhttp;
    },
    Send:function(url, success, error, postData)
    {
        var req = new Request();
        req.Send(url, success, error, postData);
    }
}