/***
* WebWizardHTTPRequest
*
* WebWizardHTTPRequest Object will add a capability in web wizard to request any 
* contents/ file/xml/.aspx etc asynchronously from server using JavaScript. 
* The object is capable of firing events on completion or rejection of request; 
* Object supports both GET and POST request methods.  
* Using this object we can reduce the number of resources expensive frames from within WebWizard or 
* probably can achieve frame free architecture in future if inter-frame communication gets more 
* restricted as announced by leading browser venders for security reasons.  
* This object is a wrapper around different Vender Specific modern technologies of xml (AJAX) requests.
*
* Object is Now capable of calling .net webservices. please see example 3 below.
* 
* By: Ejaz Arain
*
* Example Usage 
* 

//Exmple 1
	var AsyncRequest = new WebWizardHTTPRequest("text");
	AsyncRequest.ResponseListner=myListener;  //please see defecation of my listener  below 
	AsyncRequest.SendRequest('note.html','');
	AsyncRequest.SendRequest('myform.aspx',''); 

//Example 2
	var AsyncRequest2 = new WebWizardHTTPRequest("xml");
	AsyncRequest2.ResponseListner="myListener();"; //please see defecation of my listener  below 
	AsyncRequest2.SendRequest('note.xml','');
	AsyncRequest2.SendRequest('myform.aspx',''); 

//Example 3 Calling a .net webservice	
	var AsyncRequest = new WebWizardHTTPRequest("text");
	AsyncRequest.ResponseListner=myListener;  //please see defecation of my listener  below 
	var v = 'SYSTEM';
	v= "UserName="+encodeURI(v)
	AsyncRequest1.SendRequest("Admin_User_Accounts_helper.asmx/UserExists",v);

//	Listener function should have 3 parameters 
//		@response: the response recived from server,
//			  Will be text if request type is text
//			  Will be XML Dom Object if 	request type if XML
//			  Null If request is failed
//	@State:
//	@Status:  Status of response 200 for success 404 not found etc.
	function myListener(response,state,status){
		alert(response);
		alert(state);
		alert(status);
	}
* 
*
*/

/*
* Constructor Function accepts a request type a string [xml|text|html] 
*/
function  WebWizardHTTPRequest(requestType)
{
	this.req=false;
	this.ResponseListner=null;
	this.requestType=requestType;	
	this.CreateRequestObject=_CreateRequestObject;
	this.ProcessReqChange=_processReqChange;
	this.SendRequest=_SendRequest;
	this.requester=null;
	var _proto=this;

	//member function responsible for requesting contents of the url 
	function _SendRequest(url,contents,asynch) 
	{
		if(asynch == null)
		{
			asynch = true;
		}
		
		contents=(contents)?contents:"";
		_proto.CreateRequestObject(asynch);
	
		if(_proto.requester)
		{
			var _req= _proto.requester;
			if(contents.length>0)
			{
				_req.open('POST', url, asynch);
				_req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
				_req.setRequestHeader("Content-length", contents.length);
				//_req.setRequestHeader("Connection", "close");
				_req.send(contents);
			}else
			{
				//_req.setRequestHeader("Connection", "close");
				_req.open("GET", url, asynch);
				return _req.send();
			}
			if(!asynch)
			{
				return _req.responseText;
			}
		}
	}

	function _CreateRequestObject(asynch)
	{
		var _req = false;
		if(window.XMLHttpRequest) // branch for native XMLHttpRequest object
		{
    		try 
    		{
				_req = new XMLHttpRequest();
			}
			catch(e) 
			{
				_req = false;
			}
		
		} 
		else if(window.ActiveXObject) // branch for IE/Windows ActiveX version
		{
       		try 
       		{
        		_req = new ActiveXObject("Msxml2.XMLHTTP");
      		} 
      		catch(e) 
      		{
        		try 
        		{
          			_req = new ActiveXObject("Microsoft.XMLHTTP");
        		}
        		catch(e) 
        		{
          			_req = false;
        		}
			}
		}
		if(_req && asynch) 
		{
			_req.onreadystatechange = _proto.ProcessReqChange;
		}	
		_proto.requester=_req;
		return _req;
	}
		
	function _processReqChange () 
	{
		var uninitialized=0;
		var loading =1;
		var loaded=2;
		var interactive=3;	
		var complete=4;
		var _reqest=_proto.requester;//(_proto.requester)?_proto.requester:(this.requester)?this.requester:
		
		if (_reqest.readyState == complete) 
		{
			_proto.ResponseListner=(typeof(_proto.ResponseListner) == 'string')? new Function('response','state','status',_proto.ResponseListner) : ((typeof(_proto.ResponseListner) == 'function')? _proto.ResponseListner : null);			
			if(_proto.ResponseListner!=null)
			{
				if (_reqest.status == 200) 
				{
					if(_proto.requestType)
					{
						if(_proto.requestType=='xml'||_proto.requestType=='XML')
						{
							_proto.ResponseListner(_reqest.responseXML, _reqest.readyState,_reqest.status);
						}
						else	
						{
							_proto.ResponseListner(_reqest.responseText, _reqest.readyState,_reqest.status);
						}
					}
				}
				else
				{
					_proto.ResponseListner(null, _reqest.readyState,_reqest.status);
				}
			}	
		}
	}
}
