var Ajax = {
	options: {
		method:			'post',
      	contentType:	'application/x-www-form-urlencoded',
      	encoding:		'UTF-8',
      	parameters:		'',
      	callback: 		null,
      	evalJS:			true
	},
	
	request: function(url, options) {
		options = Ajax.mergeOptions(options || {});
    	options.method = options.method.toUpperCase();
    	
    	var complete = false;
		var transport = Ajax.createTransport();
		if (!transport) return false;
		
		var params = options.parameters;
		if (params = Ajax.toQueryString(params)) {
      		// when GET, append parameters to URL
      		if (options.method == 'GET')
        		url += (url.indexOf('?') > -1 ? '&' : '?') + params;
      		else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent))
        		params += '&_=';
    	}
		
		try {
      		if (options.method == 'GET') {
        		transport.open('GET', url, true);
        		params = '';
      		} else {
        		transport.open('POST', url, true);
        		transport.setRequestHeader('Method', 'POST ' + url + ' HTTP/1.1');
        		transport.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=' + options.encoding);
      		}
      		
      		transport.onreadystatechange = function() {
        		if (transport.readyState == 4 && !complete) {
          			complete = true;
          			if (options.callback != null && typeof options.callback == 'function') {
          				options.callback(transport, options.parameters);
          			}
          			
          			var contentType = transport.getResponseHeader('Content-type') || null;
      				if (options.evalJS && contentType && contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i)) { 
        				try {
      						eval(transport.responseText || '');
    					} catch (e) {}
      				}
        		}
        	};
      		transport.send(params);
    	} catch(e) { alert(e); return false; }
    	return true;
	},
	
	mergeOptions: function(source) {
  		var result = {}
  		
  		for (var property in Ajax.options)
    		result[property] = Ajax.options[property];
  		
  		for (var property in source)
    		result[property] = source[property];
  		return result;
	},
	
	isArray: function(object) {
    	return object != null && typeof object == "object" &&
      		'splice' in object && 'join' in object;
  	},
	
	toQueryString: function(obj) {
		if (typeof obj != 'object') return null;
		
		function toQueryPair(_key, _value) {
			if (typeof _value == 'undefined') return _key + '=';
			return _key + '=' + encodeURIComponent(_value == null ? '' : String(_value));
		}

		var t = [];
		for(var key in obj) {
			var value = obj[key];
			key = encodeURIComponent(key);
			
			if(value && Ajax.isArray(value)) {
				var t2 = [];
				for (var i=0, len=value.length; i<len; i++) {
					t2[t2.length] = toQueryPair(key, value[i]);
				}
				t[t.length] = t2.join('&');
			} else {
				t[t.length] = toQueryPair(key, value);
			}
		}
		
		return t.join('&');
	},
	
	createTransport: function() {
		var transport = null;
		var XMLHTTP_PROGIDS = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0'];
		try { transport = new XMLHttpRequest(); } catch(e) {}
	    if(!transport) {
			for(var i=0; i<3; ++i) {
				var progid = XMLHTTP_PROGIDS[i];
				try {
					transport = new ActiveXObject(progid);
				} catch(e) {}
				if(transport) { break; }
			}
		}
		if(!transport) { return null; }
		return transport;
	}
};
