// Ajax
function getXmlHttp() {
    try {
        return new XMLHttpRequest();
    } catch (exA) {
        try {
            return new ActiveXObject('Msxml2.XMLHTTP');
        } catch (exB) {
            try {
                return new ActiveXObject('Microsoft.XMLHTTP');
            } catch (exC) {
                return null;
            }
        }
    }
}

var Ajax = function () {
	this.parms = [];
	this.pipe = null;
	var GET = 'GET';
	var POST = 'POST';
	
	this.pipe = getXmlHttp();
	if (!this.pipe) {
		alert("cannot get a pipe");
	}
	
	this.get = function (url, callback, extraData) {
		url = this.prepareUrl(url);
		//alert("GET: " + url + " END");
		return this.send(GET, null, url, callback, extraData);
	};
	this.post = function (url, callback, extraData) {
		var query = this.prepareQuery();
		//alert("POST " + query + " END");
		return this.send(POST, query, url, callback, extraData);
	};
	this.send = function (method, query, url, callback, extraData) {
		if (callback) return this.sendAsync(method, query, url, callback, extraData);
			else if (url) return this.sendSync(method, query, url);
			else return null;  
		};
		this.sendSync = function (method, query, url) {
		this.pipe.open(method, url, false);
		this.submit(method, query);
		return this.pipe.responseText;
	};
	this.sendAsync = function (method, query, url, callback, extraData) {
		this.cb = callback;
		this.data = extraData;
		var self = this;
		this.pipe.open(method, url, true);
		this.pipe.onreadystatechange = function() {
			if (self.pipe.readyState == 4) {
				if (self.cb != null) self.cb(self.pipe.responseText, self.data, self.pipe);
			}
		};
		this.submit(method, query);
	};
	this.submit = function (method, query) {
		if (method == POST) this.pipe.setRequestHeader('Content-Type',  'application/x-www-form-urlencoded');
		this.pipe.send(query);
		this.reset();
	};
	this.prepareUrl = function (url) {
		url += (/\?/.test(url)) ? '&' : '?';
		return url + this.prepareQuery();
	};
	this.prepareQuery = function () {
		var parms = this.parms;
		var len = parms.length;
		var query = '';
		for (var i = 0; i < len; i++) query += (parms[i].k + '=' + parms[i].v + '&'); 
		return query + 'Ajax=' + new Date().getTime();
	};
	this.add = function (key, value) {
		if (value == null) value = ''; 
		this.parms.push({k:key, v:value});
	};
	this.reset = function () {
		this.parms = [];
	};
};
