function Ajax(target) {
	var status = 0;
	var url = null;
	var req = null;
	var inProgress = false;
	var isComplete = false;
	var oThis = this;

	this.submit = function(method, _url, parameters) {
        req = null;
		url = _url;
		status = 0;
		inProgress = true;
		isComplete = false;
		method = method.toUpperCase();

		if (window.XMLHttpRequest) {
			req = new XMLHttpRequest();
        }
		else if (window.ActiveXObject) {
			req = new ActiveXObject("Microsoft.XMLHTTP");
		}

		if (req == null) {
            if (oThis.onFailure) {
                oThis.onFailure();
            }

            return;
		}

        req.onreadystatechange = function() {
            if (req.readyState == 4) {
                status = req.status;
                inProgress = false;
                isComplete = true;

                if (status == 200) {
                    if (oThis.onComplete) {
                        oThis.onComplete(req.responseText, req.responseXML, target);
                    }
                }
                else {
                    if (oThis.onFailure) {
                        oThis.onFailure();
                    }
                }
            }
            else if (req.readyState == 1) {
                if (oThis.inProgress) {
                    oThis.inProgress();
                }
            }
        }

        req.open(method, url, true);
		req.setRequestHeader("Pragma", "no-cache");
		req.setRequestHeader("Cache-control", "no-cache");

		if (method == "POST") {
			req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
			req.setRequestHeader("Content-length", ((parameters == null) ? 0 : parameters.length));
			req.send(parameters);
        }
		else {
            req.send(null);
		}
	}

	this.abort = function(){
		onComplete = null;
		req.abort();
	}

	this.getStatus = function() {
		return status;
	}

	this.onComplete = function(responseText, responseXML, target) {}

	this.inProgress = function() {}

    this.onFailure = function() {}

    this.submitForm = function(form, newAction) {
		var method = form.method.toUpperCase();
		var action = (newAction) ? newAction : form.action;
		var parameters = "";

		for (var i = 0; i < form.elements.length; i++) {
			var e = form.elements[i];

			if ((e.type == "text") || (e.type == "password") || (e.type == "hidden") || (e.type == "textarea")) {
				parameters += e.name+"="+e.value+"&";
			}
			else if (e.type == "select-one") {
				parameters += e.name+"="+e.options[e.options.selectedIndex].value+"&";
			}
			else if (((e.type == "radio") || (e.type == "checkbox")) && (e.checked)) {
				parameters += e.name+"="+e.value+"&";
			}
		}
		
		if (parameters.charAt(parameters.length-1) == '&') {
			parameters = parameters.substring(0, parameters.length-1);
		}

		if (method == "GET") {
			action += ((action.indexOf("?") == -1) ? "?" : "&") + parameters;
		}

		this.submit(method, action, parameters);
	}
}