function $(id)
{	return document.getElementById(id);}

function aLink(el, f, p)
{	if (!window.ajax) window.ajax = new CAjax();
    if (typeof(p)=='undefined')
	    window.ajax.req(el.href, f);
	else
        window.ajax.req(el.href, new f(p));
	return false;}

function aForm(el, f, p)
{	if (!window.ajax) window.ajax = new CAjax();
    if (typeof(p)=='undefined')
	    window.ajax.req(el, f);
    else
        window.ajax.req(el, new f(p));
	return false;}

function CAjax(modeXML)
{
    this.modeXML = modeXML;
    this.http    = false;
    this.after   = false;
    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.xreq = function(url,xml,after)
    {
        this.init();
        this.http.open('post', url);
        this.http.setRequestHeader('Content-type', 'text/xml');
        this.http.onreadystatechange = function()
  	    {
	        if (me.http.readyState==4)
	        {
                if(typeof(after) == 'object' && typeof(after.after) == 'function')
   	                after.after(me.modeXML ? me.http.responseXML : me.http.responseText);
                else if(after) after(me.modeXML ? me.http.responseXML : me.http.responseText);
       		}
   	    };
        this.http.send(xml);
    };

    this.ureq = function(f,after)
    {        this.req(f,after,true);
    }

    this.req = function(f,after,finalUrl)
    {
        this.init();
        if (f.tagName && f.tagName=='FORM') url = f.action;
        else if(typeof(f)=='object') url = f.url;
        else url = f;

        if(finalUrl) url += '?rand='+parseInt(Math.random()*100000); else url = this.updateUrl(url);

        var method = f.method ? f.method.toLowerCase() : 'get';

        if (method == 'get' && typeof(f)=='object')
        {
        	url += '&'+this.serialize(f);
        }

        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)
	        {
	            if(after)
	            {
	                if(typeof(after) == 'object' && typeof(after.after) == 'function')
    	                after.after(me.modeXML ? me.http.responseXML : me.http.responseText);
	                else if(typeof(after) == 'function')
    	                after(me.modeXML ? me.http.responseXML : me.http.responseText);
    	            else
    	            {
    	            	if (html && html.indexOf('Location: ')==0)
    	            		window.location.href = html.replace('Location: ','');
    	            	else
    	            	{
        	            	var el = $(after);
    	            	    if(el) el.innerHTML = html[0];
    	            	}
    	            }
	            }
   	            if (!me.modeXML)
   	            {
                    var html = me.http.responseText.split('<script>');
                    var len = html.length;
                    for(var i=1;i<len;i++) eval(html[i].split('</script>')[0]);

   	                html = me.http.responseText.split('<script ');
   	                len = html.length;
   	                for(var i=1;i<len;i++)
   	                {
   	                    var st = trim(html[i].split('</script>')[0]).replace('>','').split(' ');
   	                    var ln = st.length, ar = {}, e;
                        for(var j=0;j<ln;j++)
                        {
                        	if(st[j].indexOf('="')==-1) continue;
                        	e = st[j].split('="');
                        	ar[trim(e[0])] = e[1].split('"')[0];
                        }
                       	if(typeof(ar.src)=='undefined') continue;
                        e = document.createElement('script');
	                    for(j in ar) e[j] = ar[j];
	                    e.id = ar.onload ? trim(ar.onload) : trim(ar.src);
	                    if(ar.onload)
	                    {
                            if(document.all && !window.opera)
                                e.onload = function(){};
                            else
                                e.onload = function(){eval(this.id)};
                       	}
                       	$_($(e.id));
	                    document.body.appendChild(e);
   	                }
                }
       		}
   	    };
        this.http.send( method=='get' ? null : this.serialize(f) );
    };

    this.serialize = function(args)
    {
        var url = [], j = 0;
        if (args)
        {
            var add = function(name,value)
            {
               	if (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': case 'HIDDEN':
                		{
                            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)
    {
        var randStr = function(){return 'rand='+parseInt(Math.random()*100000);};
        url = url.split('?');
        var x = this.modeXML ? '/?=x&' : '/?=&';
        return url[0] + (url[1] ? x+url[1]+'&'+randStr() : x + randStr());
    };

}






