// (c)2008 Transinsight GmbH - www.transinsight.com - All rights reserved.

function Connection( /* String */url) {
	this.url = url;
	this.headers = {};
	this.body = null;
	this.status = 0;
	this.on_fail = null;
	this.on_finish = null;

	this.establish = Connection_establish;
	this.establishPost = Connection_establishPost;
	this.abort = Connection_abort;
}

function Connection_abort() {
	try {
		this.transport.abort();
	} catch (e) {
	}
}

function Connection_establish(runSynchron) {
	var url = this.url, i, runAsynchron = runSynchron ? false : true;
	try {
		if (this.parameters) {
			var params = [];
			for (i in this.parameters)
				params.push( [ i, encodeURIComponent(this.parameters[i]) ]
						.join('='));
			url = [ url, params.join('&') ].join('?');
		}
		this.transport = Connection_getTransport();
		this.transport.open(this.body ? 'post' : 'get', url, runAsynchron);
		for (i in i < this.headers)
			this.transport.setRequestHeader(i, this.headers[i]);
		// TODO: Timeout anhauen
		this.transport.onreadystatechange = Connection_bind(this,
				Connection_onReadyStateChange);
		this.transport.send(this.body);
		this.active = true;
	} catch (e) {
		Connection_onFail.call(this);
		throw (e);
	}
	if (runSynchron)
		Connection_onReadyStateChange.call(this);
}

function Connection_establishPost(runSynchron) {
	var url = this.url;
	var i;
	var runAsynchron = runSynchron ? false : true;

	try {
		var postData;
		if (this.parameters) {
			var params = [];
			for (key in this.parameters)
				params.push( [ key, encodeURIComponent(this.parameters[key]) ]
						.join('='));
			postData = params.join('&');
		}

		this.transport = Connection_getTransport();
		this.transport.open('post', url, runAsynchron);

		for (i in i < this.headers)
			this.transport.setRequestHeader(i, this.headers[i]);
		this.transport.setRequestHeader("Content-type",
				"application/x-www-form-urlencoded");

		this.transport.onreadystatechange = Connection_bind(this,
				Connection_onReadyStateChange);

		this.transport.send(postData);
		this.active = true;
	} catch (e) {
		Connection_onFail.call(this);
		throw (e);
	}
	if (runSynchron)
		Connection_onReadyStateChange.call(this);
}

function Connection_getTransport() {
	if (window.ActiveXObject)
		try {
			return new ActiveXObject('Msxml2.XMLHTTP');
		} catch (e) {
		}
	if (window.ActiveXObject)
		try {
			return new ActiveXObject('Microsoft.XMLHTTP');
		} catch (e) {
		}
	try {
		return new XMLHttpRequest();
	} catch (e) {
	}
	return null;
}

function Connection_onComplete() {
	var i = 0, h, v;
	this.transport.onreadystatechange = Connection_onReadyStateChange;
	this.active = false;
	this.done = true;
	try {
		this.status = this.transport.status;
		this.success = this.status == undefined || this.status == 0
				|| (this.status >= 200 && this.status < 300);
		this.headers = {};
		this.body = this.transport.responseText;
	} catch (e) {
		Connection_onFail.call(this);
		throw e;
	}
	if (this.success) {
		if (this.on_finish)
			this.on_finish(this);
	} else {
		if (this.on_fail)
			this.on_fail(this);
	}
}

function Connection_onReadyStateChange() {
	if (4 == this.transport.readyState)
		Connection_onComplete.call(this);
}

function Connection_onFail() {
	this.active = false;
	this.done = false;
	this.success = false;
	if (this.on_cancel)
		this.on_cancel(this);
	else if (this.on_fail)
		this.on_fail(this);
}

function Connection_onFail() {
	this.active = false;
	this.done = false;
	this.success = false;
	if (this.on_fail)
		this.on_fail(this);
}

function Connection_bind(object, func) {
	return function(ev) {
		func.call(object, ev);
	}
}
