function CAjax(modeXML)
{
    this.modeXML = modeXML;
    this.http    = false;
    this.after   = false;
    this.tm      = false;
    this.wait    = 10;
    this.rform   = false;
    this.rurl    = false;

    this.fm = new CFreeze();

    var me = this;

    this.setModeXML = function(val)
    {
    	this.modeXML = val;
 	    if (window.ActiveXObject && this.http && this.http.overrideMimeType)
	        this.http.overrideMimeType(val ? 'text/xml' : 'text/html');
    };

    this.init = function()
    {
        if (this.http) return;
        if (window.XMLHttpRequest)
        {
            this.http = new window.XMLHttpRequest();
        }
        else if (window.ActiveXObject)
        {
            try
            {
                this.http = new ActiveXObject("Msxml2.XMLHTTP");
            }
            catch(e)
            {
                try { this.http = new ActiveXObject("Microsoft.XMLHTTP"); }
                catch(e){}
            }
	        if (this.http && this.modeXML && this.http.overrideMimeType)
	            this.http.overrideMimeType('text/xml');
   	    }
    };

    this.req = function(f,after,freeze)
    {        this.init();
        var url;
        if (f.tagName && f.tagName=='FORM')
        {
            url = this.updateUrl(f.action);
        }
        else if(typeof(args)=='object')
        {            this.rform = false;
            url = this.updateUrl(f.url);
            this.rurl = f.url;
        }
        else
        {
            this.rurl = f;
            url = this.updateUrl(f);
        }

        var method = f.method ? f.method.toLowerCase() : 'get';
        this.http.open(method, url);


   	    if(method=='post' && typeof(this.http.setRequestHeader)!='undefined')
   	        this.http.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');


   	    this.http.onreadystatechange = function()
  	    {
	        if (me.http.readyState==4)
	        {
                me.fm.unfreeze();
	            if(me.tm) window.clearTimeout(me.tm);
	            if(after)
	            {
	                if(typeof(after) == 'function')
    	                after(me.modeXML ? me.http.responseXML : me.http.responseText.split('<script')[0]);
    	            else
    	            {    	            	var el = $(after);
    	            	var html = me.http.responseText;
    	            	if (html.indexOf('Location: ')==0)
    	            	{    	            		window.location.href = html.replace('Location: ','');    	            	}
    	            	else
    	            	{
    	            	    html = html.split('<script id="title">setSiteTitle(\'');

        	            	if(html[1])
        	            	{                                setSiteTitle(html[1].split("'")[0]);
                            }

    	                	html = me.http.responseText.split('<script>');
    	            	    if(el) el.innerHTML = html[0];
    	            	    if(html[1])
        	            	{
        	            	   eval(html[1].split('</script>')[0]);
        	            	}

    	            	}
    	            }
	            }
	            me.postRequest(url);
       		}
   	    };

        this.fm.freeze(after,true);
        if(freeze) for(var i in freeze) this.fm.freeze(i,freeze[i]);

        this.tm = window.setTimeout(this.timeoutBreak,this.wait*1000);
        this.http.send(this.serialize(f));
    };

    this.postRequest = function(url)
    {
    };

    this.timeoutBreak = function()
    {       	alert('Время ожидания запроса истекло');
       	me.fm.unfreeze();
    };

    this.serialize = function(args)
    {
        var url = [], j = 0;
        if (args)
        {
            var add = function(name,value)
            {
               	if(el[i].name.indexOf('[]')>0)
               	{
                    name = name.replace('[]','['+j+']');
                    j++;
                }
                url.push(name+'='+encodeURIComponent(value));
            };
            if(args.tagName && args.tagName=='FORM')
            {                var el = args.getElementsByTagName('INPUT');
                var len = el.length;
                for(var i=0;i<len;i++)
                {                	switch(el[i].type.toUpperCase())
                	{                		case 'TEXT': case 'PASSWORD':
                		{                            if(el[i].name) add(el[i].name,el[i].value);
                			break;                		}                		case 'RADIO': case 'CHECKBOX':
                		{
                            if(el[i].name && el[i].checked) add(el[i].name,el[i].value);
                			break;
                		}
                	}
                }
                el = args.getElementsByTagName('TEXTAREA');
                len = el.length;
                for(i=0;i<len;i++)
                {
                    if (el[i].name) add(el[i].name,el[i].value);
                }
                el = args.getElementsByTagName('SELECT');
                len = el.length;
                for(i=0;i<len;i++)
                {
                    if (!el[i].name) continue;
                    if (el[i].multiple)
                    {
                        var opt = el[i].options; var olen = opt.length;
                        for(var k=0;k<olen;k++) if (opt[k].selected)
                            add(el[i].name.replace('[]','')+'['+k+']',opt[k].value);
                    }
                    else add(el[i].name,el[i].value);
                }
            }
            else if(typeof(args)=='object') for(var i in args) switch(i)
            {
                case 'url': case 'method': break;
                default: add(i,args[i]);
            }
            else url = null;
        }
        return url ? url.join('&') : url;
    };

    this.updateUrl = function(url,s)
    {
        var randStr = function(){return 'rand='+parseInt(Math.random()*100000);};
        url = url.split('?');
        if (url[0].substring(url[0].length-1)=='/')
        {
            s = s ? s : 'ajax';
            if (this.modeXML) s = 'x'+s;
            else url[0] = (s=='ajax') ? url[0].replace('/iajax/','/') : url[0].replace('/ajax/','/');
            if (url[0].indexOf('/'+s+'/')<0) url[0] += s+'/';
        }
        return url[1] ? url[0]+'?'+url[1]+'&'+randStr() : url[0]+'?'+randStr();
    };

}


window.ajax = new CAjax();

function aLink(el,id,freeze)
{
    ajax.req(el.href,id,freeze);
    return false;
};


function aForm(f,id,freeze)
{
    ajax.req(f,id,freeze);
    return false;
};



