SLOG.library("SLOG.Ajax", [], function() {

SLOG.Ajax = {
	get: function (uri, params, callback, xml, noStamp) {

		if("undefined" == typeof(noStamp)) {
			noStamp = false;
		}
		if("undefined" == typeof(xml)) {
			noStamp = false;
		}

		var ajax = null;
	
		if("undefined" != typeof(ActiveXObject)) {
			ajax = new ActiveXObject("Microsoft.XMLHTTP");
		}
		else {
			ajax = new XMLHttpRequest();
		}
	
		ajax.onreadystatechange = function() {
			if(ajax.readyState == SLOG.Ajax.STATE_READY) {
				if(callback)
					(callback)(params, xml ? ajax.responseXML : ajax.responseText);
			}
		}
	
		var AMP = String.fromCharCode(38);
		var queryString = '';
		for(param in params)
			queryString += (queryString != '' ? AMP : '') + param + '=' + escape(params[param]);
	
		ajax.open("GET", uri + "?" + queryString + (noStamp ? "" : AMP + "SLOG-Ajax=" + Math.random()), true);
		ajax.send(null);
	},

	getHTML: function(uri, params, callback) {
		SLOG.Ajax.get(
			uri, 
			params, 
			function(params, response) {
				if("undefined" != typeof(callback)) {
					if(null != callback) {
						(callback) (params, response);
					}
				}
			}
		);
	},

	getJS: function(uri, params, callback) {
		SLOG.Ajax.get(
			uri, 
			params, 
			function(params, response) {
				//Apparently, the response string passed to the Function constructor
				//must not start with a \n...
				response = response.replace(/^\n*/, '');

				var fn = new Function("return " + response + ";");
				if("undefined" != typeof(callback)) {
					if(null != callback) {
						(callback) (params, fn());
					}
				}
			}
		);
	},

	getXML: function(uri, params, callback) {
		SLOG.Ajax.get(uri, params, callback, true, true);
	},

	STATE_READY: 4,

	/**
	 * http://www.webtoolkit.info/javascript-url-decode-encode.html
	 * @param string URL to url-encode
	 * @return string
	 */
	urlEncode : function (string) {

		string = string.replace(/\r\n/g, "\n");
		var utftext = "";

		for(var n = 0; n < string.length; n++) {
			var c = string.charCodeAt(n);

			if(c < 128) {
				utftext += String.fromCharCode(c);
			}
			else if((c > 127) && (c < 2048)) {
				utftext += String.fromCharCode((c >> 6) | 192);
				utftext += String.fromCharCode((c & 63) | 128);
			}
			else {
				utftext += String.fromCharCode((c >> 12) | 224);
				utftext += String.fromCharCode(((c >> 6) & 63) | 128);
				utftext += String.fromCharCode((c & 63) | 128);
			}

		}

		return escape(utftext);
	},

	utf8Decode: function(utftext) {
		utftext = unescape(utftext);

		var string = "";
		var i = 0;
		var c = c1 = c2 = 0;

		while ( i < utftext.length ) {

			c = utftext.charCodeAt(i);

			if (c < 128) {
				string += String.fromCharCode(c);
				i++;
			}
			else if((c > 191) && (c < 224)) {
				c2 = utftext.charCodeAt(i+1);
				string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
				i += 2;
			}
			else {
				c2 = utftext.charCodeAt(i+1);
				c3 = utftext.charCodeAt(i+2);
				string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
				i += 3;
			}

		}
		return string; 		
	}

};


});