function  onException(e) {
    alert("Error No:" + e.number+ "," + e.name + "," +e.description);
    return false;
}

function donothing(){}

function xmlhttp()
{
	//ResponseType = ['responseText', 'responseXML', 'responseStream', 'responseBody' ];
	//Events       = ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];
	var xconn, bComplete = false;
	
	this.request = function( sUrl, oReq ){
		/*	oReq {
				method:get|post,async:true|false, parameters:,requestHeaders:,
				onReadyState:,onLoading:,onLoaded:,onInteractive:,onComplete:,
				onException:,onStatus:,onSuccess:,onFail:
		     }
		*/  	
		if(window.XMLHttpRequest){
			xconn = new XMLHttpRequest();
		}
		// Ö§³ÖActiveX
		else if(window.ActiveXObject){
			try{
				xconn = new ActiveXObject("Msxml2.XMLHTTP");
			}
			catch(e){
				xconn = new ActiveXObject("Microsoft.XMLHTTP");
			}
		}

		//alert("xconn="+xconn);
/*
		try { 
			xconn = new ActiveXObject("Msxml2.XMLHTTP"); 
		}catch (e) { 
			try {
				xconn = new ActiveXObject("Microsoft.XMLHTTP");
			}catch (e) {
				try { 
					xconn = new XMLHttpRequest(); 
				}catch (e) {
					xconn = false;
				}
			}
		}
*/
		if (!xconn){
			//log4.info( "xconn is null or false" );
			 return false;
		}
		bComplete = false;
		if( !oReq.method ) oReq.method = "GET";
		oReq.method = oReq.method.toUpperCase();
		async = true;
		if( oReq.async == undefined ) async = true;
		else if( oReq.async == false || oReq.sync ==true )
			async = false;
		parameters = oReq.parameters || '';
	    if (parameters.length > 0)
	    	parameters += '&_ajax=1';
		try {
			aUrl = sUrl;
			if ( oReq.method == "GET"){
			    if (parameters.length > 0){
					aUrl += ( sUrl.match(/\?/) ? '&' : '?') + parameters;
				}
		    	parameters = "";
			}
			//alert( "aUrl:" + aUrl );
			//log4.info( "aUrl:" + aUrl );
			//alert("xconn="+xconn);
	    	xconn.open( oReq.method, aUrl, async );
			if( async){
				xconn.onreadystatechange = function(){
					try{
						state = xconn.readyState;
						//alert( "state:" + state );
						//log4.info( "state:" + state );
						(oReq.onReadyState||donothing)( xconn, oReq);
						
						if ( state == 1 && !bComplete){
							(oReq.onLoading||donothing)(xconn, oReq);
						}
						else if ( state == 2 && !bComplete){
							(oReq.onLoaded||donothing)(xconn, oReq);
						}
						else if ( state == 3 && !bComplete){
							(oReq.onInteractive||donothing)(xconn, oReq);
						}
						else if ( state == 4 && !bComplete){
							bComplete = true;
							(oReq.onComplete||donothing)(xconn, oReq);
							retstatus = xconn.status;
							if( retstatus != undefined ){
								(oReq.onStatus||donothing)( xconn, oReq);
							}
							if( retstatus == undefined || retstatus == 0 || (retstatus >= 200 && retstatus < 300) ){
								(oReq.onSuccess||donothing)(xconn, oReq);
							}
							else{
								(oReq.onFail||donothing)(xconn, oReq);
							}
							//xconn.onreadystatechange = donothing;
						}
					}
					catch(e){
						(oReq.onException||onException)(e);
					}
				};
			}
			this.setRequestHeaders( sUrl, oReq );
			xconn.send( parameters );
			//alert("ok");
			if( !async ){
				//try{
					(oReq.onComplete||donothing)(xconn, oReq);
					retstatus = xconn.status;
					if( retstatus != "undefined" ){
						(oReq.onStatus||donothing)( xconn, oReq);
					}
					if( retstatus == undefined || retstatus == 0 || (retstatus >= 200 && retstatus < 300) ){
						(oReq.onSuccess||donothing)(xconn, oReq);
					}
					else{
						(oReq.onFail||donothing)(xconn, oReq);
					}
				//}
				//catch(zz){
				//	(oReq.onException||onException)(zz);
				//}
			}
		}
		catch(z) { 
			return (oReq.onException||onException)(z);
		}
		return true;
	};
	
	this.setRequestHeaders=function( sUrl, oReq ) {
		var requestHeaders = ['X-Requested-With', 'XMLHttpRequest'];
		//var requestHeaders = ['X-Requested-With', 'XMLHttpRequest','If-Modified-Since','0'];
		
		if( oReq.method == 'POST') {
			requestHeaders.push('Content-type', 'application/x-www-form-urlencoded');
			requestHeaders.push("Method", "POST "+sUrl+" HTTP/1.1");
			if( xconn.overrideMimeType)
				requestHeaders.push('Connection', 'close');
		}
		if (oReq.requestHeaders)
			requestHeaders = requestHeaders.concat( oReq.requestHeaders);
		for (var i = 0; i < requestHeaders.length; i += 2)
			xconn.setRequestHeader(requestHeaders[i], requestHeaders[i+1]);
	};
	this.loadJson = function( module, jsUrl, fCallBack, enableCache ){
		idstr = "jsonId_"+module;
		var elm=document.getElementById(idstr);
		if( elm && enableCache ){
			elm.src = jsUrl + (jsUrl.indexOf("?")>0?"&":"?") +"loadJson="+(new Date().getTime());
		}
		else{
			if( elm ){
				elm.parentNode.removeChild(elm);
			}
			elm = document.createElement("script");
			elm.id=idstr;
			document.body.appendChild(elm);
			elm.src =  jsUrl + (jsUrl.indexOf("?")>0?"&":"?") +"loadJson="+(new Date().getTime());
		}
		var repeat = 0;
		setTimeout( function(){fCallBack();} , 500 );

	};
	return this;
}
