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) {
			if(this.aParams.hasOwnProperty(i)){
				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 1025:
					Acode = 168;
					break;
				case 1105:
					Acode = 184;
					break;
				case 32:
				case 10:
				case 63:
				case 38:
					Acode = Ucode;
					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; 

	}
	
}