var Ajax = {

	READY_STATE_UNITIALIZED : 0,
	READY_STATE_LOADING     : 1,
	READY_STATE_LOADED      : 2,
	READY_STATE_INTERACTIVE : 3,
	READY_STATE_COMPLETE    : 4,
	
	defaultOptions : {		
		bIgnoreCache : true		
		},
	
	Loader : function(
		oObject,
		sUrl,
		sMethod,
		aParams,
		aOptions
		) {
	
		this.oObject = oObject;
		this.sUrl = sUrl;
		this.sMethod = sMethod;
		this.aParams = aParams || [];
		this.aOptions = {
			bIgnoreCache : (aOptions && aOptions.bIgnoreCache? true : false)			
		};
	
	}
	
}

Ajax.Loader.prototype = {
	
	getTransport : function() {
		
		var oTransport;
			
		if(window.XMLHttpRequest) {
			oTransport = new XMLHttpRequest();
		}
		else if(window.ActiveXObject) {			
		
			try {
				oTransport = new ActiveXObject('Msxml2.XMLHTTP');
			}
			catch(oError) {
				oTransport = new ActiveXObject('Microsoft.XMLHTTP');
			}
			
		}
			
		return oTransport;
		
	},
	
	send : function() {
	
		var
			sQueryParams = '',
			bParamFirst = true,
			sUid = this.generateUid()
			;
					
		for(var i in this.aParams) {		
			
			sQueryParams += (bParamFirst? '' : '&') + i + '=' + this.encode(this.aParams[i]);
			bParamFirst = false;
			
		}			
			
		var oRequest = this.getTransport();
		
		if(oRequest) {
		
			oRequest.open(
				this.sMethod,
				this.sUrl + (this.aOptions.bIgnoreCache? '?uid=' + sUid : ''),
				true
				);
			
			oRequest.setRequestHeader(
				'Content-type',
				'application/x-www-form-urlencoded'
				);							
			
			var oThis = this;
		
			oRequest.onreadystatechange = function() {
		
				oThis.handleResponse(oRequest);
		
			}
			
			oRequest.send(sQueryParams);
			
			return sUid;
			
		}
		
	},
	
	handleResponse : function(oRequest) {
	
		//try {
		
			if(oRequest.readyState == Ajax.READY_STATE_COMPLETE) {				
		
				if(this.success(oRequest)) {
					
					if(this.oObject.ajaxUpdate) {						
						this.oObject.ajaxUpdate(oRequest);
					}
				
				}
				else {
				
					if(this.oObject.ajaxError) {								
						this.oObject.ajaxError(oRequest);
					}
			
				}
		
			}
		
		//}
		//catch(oException) {}
	
	},
	
	success : function(oRequest) {
	
		return oRequest.status == 0 ||
			(oRequest.status >= 200 && oRequest.status < 300);
	
	},
	
	generateUid : function() {
	
		var sUid = '';
	
		for(var i = 0; i < 4; i++) {	
			sUid += (i > 0? '-' : '') + Math.floor(Math.random() * 9999);	
		}	
	
		return sUid;
		
	},
	
	encode : function(sValue) { 
  
		var
			text = "",
			Ucode,
			ExitValue,
			s;
  
		for(var i = 0; i < sValue.length; i++) { 
  
			s = sValue.charAt(i);
			var Acode = 0;
			Ucode = s.charCodeAt(0);
		
			switch (Ucode){
				case 09: // \t
				case 10: // \n
				case 32: // space
				case 38: // &
				case 63: // ?
				case 171: // «
				case 187: // »
					Acode = Ucode;
					break;
				case 1025: // ¨
					Acode = 168;
					break;
				case 1105: // ¸
					Acode = 184;
					break;
				case 8211: // –
					Acode = 150;
					break;
				case 8212: // —
					Acode = 151;
					break;
				case 8216: // ‘
					Acode = 145;
					break;
				case 8217: // ’
					Acode = 146;
					break;
				case 8220: // “
					Acode = 147;
					break;
				case 8221: // ”
					Acode = 148;
					break;
				case 8226: // •
					Acode = 149;
					break;
				case 8218: // ‚
					Acode = 130;
					break;
				case 8222: // „
					Acode = 132;
					break;
				case 8230: // …
					Acode = 133;
					break;

				default: // [à-ÿÀ-ß]
					if(Ucode > 1039 && Ucode < 1104) { 
						Acode = Ucode-848;
					}
					break;
			}
			if ( Acode != 0 ){
				var encoded = Acode.toString(16).toUpperCase();
				ExitValue = "%" + ((encoded.length == 1) ? "0":"") + encoded;
			} else {
				ExitValue = s;
			}
     
			text = text + ExitValue;

		}      
		
		return text; 

	}
	
}