﻿function Ajax(echoFunction, responseType){//version 1.1.0

this.address='';
this.request=null;
this.response=null;
this.callingMethod='';
this.responseType=(typeof(responseType)=='string' && responseType.toLowerCase()=='responsexml ')?
	'responseXML':'responseText';
this.echoFunction=echoFunction||null;

/********* M E T H O D *********/
this.initialize=function(){
this.response=null;
this.callingMethod='';
if(!this.request){
	if(window['XMLHttpRequest']){/*IE7, Mozillas*/ try{this.request=new XMLHttpRequest();}catch(e){this.request=null;}; }
	else if(window['ActiveXObject']){/*IE<IE7*/
	var ajaxMSversions=[
		/*'Msxml2.DOMDocument.5.0', 'Msxml2.DOMDocument.4.0', 'Msxml2.DOMDocument.3.0', 'MSXML2.DOMDocument',*/ 'Msxml2.XMLHTTP', 'Microsoft.XMLHTTP'
	];
		for(var v=0; v<ajaxMSversions.length; v++){
			try{this.request=new ActiveXObject(ajaxMSversions[v]); return this.request;}catch(e){this.request=null;};
		}
	}
	else if(window['createRequest']){ try{this.request=window.createRequest();}catch(e){this.request=null;}; }
	else{alert('XMLHTTP not enabled. Impossible to proceed.');}
};
return this.request;
}

function setOptions(opt)
{
   var a
   for(i=0;i<opt.length;i++)  
   {
      if (i==0){
          a = opt[i];
      }
      else{
          a += "&"+opt[i];
      }
   }
   
   return a;
}

/********* M E T H O D *********/
this.get=this.send=function(address,query, responseType, echoFunction)
{
if(!address || !this.initialize()){return false;};
this.callingMethod='GET';
this.responseType=this.responseType;
this.address=address;

//var query=this.options;
//query=query.replace(/\?/, '');
//query=unescape(query);
this.request.open('GET', ('/Services.asmx/' + address + '?' + setOptions(query)), true);
this.request.setRequestHeader('Content-Type', 'text/xml');
if(typeof(echoFunction)!="function"){this.request.onreadystatechange=this.echo(this);/*currying*/}
else{this.request.onreadystatechange=echoFunction;};
this.request.send(null)
}

/********* M E T H O D *********/
this.post=function(address, send, echoFunction, responseType){
if(!address || !this.initialize()){return false;};
this.callingMethod='POST';
this.responseType=responseType||this.responseType;
send=send||'';
send=unescape(send);
this.request.open('POST', address, true);
this.request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
if(typeof(echoFunction)!="function"){this.request.onreadystatechange=this.echo(this);/*currying*/}
else{this.request.onreadystatechange=echoFunction;};
this.request.send(send);
}

/********* M E T H O D *********/
this.head=function(address, send, echoFunction){
if(!address || !this.initialize()){return false;};
this.callingMethod='HEAD';
send=send||'';
this.request.open('HEAD', address, true);
this.request.setRequestHeader('Content-Type', 'text/xml');
if(typeof(echoFunction)!="function"){this.request.onreadystatechange=this.echo(this);/*currying*/}
else{this.request.onreadystatechange=echoFunction;};
this.request.send((send||null));
}

/********* M E T H O D *********/
this.error=function(statusError){
   
    if(statusError){
        this.response=(this.request && this.request.status)? this.address + ':There was a problem with the request\r\nstatus: ' + this.request.status + ' (' + this.request.statusText +')\r\nmessage: ' + this.request.responseText: 'Ajax Error: Requested document may be temporarily unavailable';
//        alert(this.response);
        return this.response;
    }
    else{return false;};
}

    /********* M E T H O D *********/
    this.echo=function(ajaxInstance){

        return function(){//currying
	        if(ajaxInstance.request.readyState==4 || ajaxInstance.request.readyState=='complete'){
        		
		        if(ajaxInstance.request.status==200){
        		
		            return ajaxInstance.echoFunction(ajaxInstance.request.responseXML);
        		     
			        if(typeof(ajaxInstance.echoFunction)=="function")
			        {
			            if(ajaxInstance.responseType.toLowerCase()=='responsexml')
			            {
			                return ajaxInstance.echoFunction(ajaxInstance.responseXML);
			            }
			            else
			            {
			                return ajaxInstance.echoFunction(ajaxInstance.response);
			            }
			        };/*no function passed as parameter: a default behaviour:*/
        			
		            return ajaxInstance.response;
		            
		        }
		        else{
		            return ajaxInstance.error(1);
		        };
	        }
	        else{return ajaxInstance.error(0);};
        }
        
    }
}

var ajax=new Ajax(); //a bonus instance is ready!

