function mb_ajax()
{
    this.http_request=false;
    this.params=new String();
    this.url="./rc_main.php";
    this.form_name=new String();
    this.required_elements=new Array();
    this.on_response_function=new String();

    this.params=new String();
    this.new_http_request();
}

mb_ajax.prototype.new_http_request=function()
{
    if (window.XMLHttpRequest) // Mozilla, Safari,...
    {
     	this.http_request = new XMLHttpRequest();
   		if (this.http_request.overrideMimeType)
      		this.http_request.overrideMimeType('text/xml');
    }
    else if (window.ActiveXObject) // IE
    {
   	    try {this.http_request = new ActiveXObject("Msxml2.XMLHTTP");}
        catch (e)
        {
            try {this.http_request = new ActiveXObject("Microsoft.XMLHTTP");}
            catch (e) {}
        }
    }

    if (!this.http_request)
    {
        try { mb_error_add_error("mb_ajax: Kann keine XMLHTTP-Instanz erzeugen!"); }
        catch(e) { alert("mb_ajax : Kann keine XMLHTTP-Instanz erzeugen!"); }
        return false;
    }
}

mb_ajax.prototype.send=function()
{
    var http_request=this.http_request;
    var on_response_function=this.on_response_function;
	http_request.open("POST", this.url, true);

    if(this.form_name!="" && document.forms[this.form_name])
        this.get_params();
    else
    {
        try { mb_error_add_error("mb_ajax: Angegebener form_name ("+this.form_name+") existiert nicht!"); }
        catch(e) { alert("mb_ajax : Angegebener form_name ("+this.form_name+") existiert nicht!"); }
        return 0;
    }

    http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded;");
	http_request.setRequestHeader("Content-length", this.params.length);
    http_request.onreadystatechange=on_response;
	http_request.send(this.params);

    function on_response()
    {
        if (http_request.readyState == 4)
    	{
        	if (http_request.status == 200)
    		{
		      	var xmldoc = http_request.responseXML.documentElement;
                var response_text=http_request.responseText.toLowerCase();
                var response_array=new Array();

                if(xmldoc!=null)
                {
                    //get header
                    var header=xmldoc.getElementsByTagName("header");
                    for(var i=0;i< header.length;i++)
                    {
                        var error=header[i].getElementsByTagName("error");
                        for(var j=0;j<error.length;j++)
                        {
                            if(error[j].firstChild)
                            {
                                try {mb_error_add_error(error[j].firstChild.nodeValue);}
                                catch (e) {alert(error[j].firstChild.nodeValue)}
                            }
                        }
                    }

                    //get body
                    var objects=xmldoc.getElementsByTagName("object");
                    for(var i=0;i< objects.length;i++)
                    {
                        var object_array=new Array();
                        var attributes=objects[i].getElementsByTagName("attribute");
                        for(var j=0;j<attributes.length;j++)
                        {
                            if(attributes[j].firstChild)
                            {
                                var attribute=attributes[j].firstChild.nodeValue.split("=");
                                object_array.push(attribute[0], attribute[1]);
                            }
                        }
                        response_array.push(object_array);
                    }
                }
                else
                    response_array[0]=response_text;

                window[on_response_function](response_array);
     		}
    	}
    }
}


mb_ajax.prototype.get_params=function ()
{
    var active_form=document.forms[this.form_name];
    var activeElement;

    for(var i=0;i<this.required_elements.length;i++)
    {
        active_element=this.required_elements[i];
        if(!active_form.elements[active_element])
        {
            try{mb_error_add_error("Field '" + active_element+"' could not be found in form '" + active_form +"'")}
            catch(e) {alert("Field '" + active_element+"' could not be found in form '" + active_form+"'")}
            continue;
        }
        //if is array of fields
        if(active_form.elements[active_element].length)
        {
            //for each field in array
            var k=0;
            for(var j=0;j<active_form.elements[active_element].length;j++)
            {
                if(active_form.elements[active_element][j].tagName.toLowerCase()=="input" && (active_form.elements[active_element][j].type.toLowerCase()=="field" || active_form.elements[active_element][j].type.toLowerCase()=="hidden"))
                {
                    this.params+="&"+active_element+k+"="+this.replace_chars(active_form.elements[active_element][j].value);
                    k++;
                }
                else
                {
                    switch(active_form.elements[active_element][j].tagName.toLowerCase())
                    {
                        case "input":
                            if(active_form.elements[active_element][j].checked==1)
                                this.params+="&"+active_element+"="+this.replace_chars(active_form.elements[active_element][j].value);
                            break;
                        case "option":
                            if(active_form.elements[active_element][j].selected==1)
                            {
                                if(active_form.elements[active_element].multiple==true)
                                {
                                    this.params+="&"+active_element+k+"="+this.replace_chars(active_form.elements[active_element][j].value);
                                    k++;
                                }
                                else
                                    this.params+="&"+active_element+"="+this.replace_chars(active_form.elements[active_element][j].value);
                            }
                            break;
                    }
                }
            }
        }
        else
        {
            switch(active_form.elements[active_element].tagName.toLowerCase())
            {
                case "input":
                    if(active_form.elements[active_element].type.toLowerCase()=="checkbox")
                    {
                        if(active_form.elements[active_element].checked==1)
                            this.params+="&"+active_element+"="+this.replace_chars(active_form.elements[active_element].value);
                    }
                    else
                        this.params+="&"+active_element+"="+this.replace_chars(active_form.elements[active_element].value);
                    break;
                default:
                    this.params+="&"+active_element+"="+this.replace_chars(active_form.elements[active_element].value);
            }
        }
    }
}

mb_ajax.prototype.replace_chars=function(text) //should be substituted in general js
{
    text=text.replace(/%/g, "!prc:")
    text=text.replace(/&/g, "+")
    text=text.replace(/\+/g, "!mpl:")
    text=text.replace(/=/g, "-")
    return text;
}



