var ajax = new ajaxObject();

function ajaxObject()
{
	 
		var urlStr = "";
		var methodType = "POST";
		var requestXMLStr;
		var callbackMethod = "";
		var callbackMethodOnError = "";
		var headerMap = new map();
		var requestMap = new map();
// Added By Azhar Khan On 29 July 2008
		var paramsStr="";
		var http;
		
		
		init();
		

		
		this.url=setURL;
		this.method =setMethod;
		this.headerParam = getHeaderParameters;
		this.requestParam = getRequestParameters;
		this.requestXML = setRequestXML;
		this.callbackHandler=setCallbackHandler;
		this.callbackHandlerOnError=setCallbackHandlerOnError;		
		this.execute = executeRequest ;
		this.responseHeader = getResponseHeader;



// Added By Azhar Khan On 29 July 2008
// Modified By Azhar Khan On 05 August 2008 - Method Switching Added(POST or GET)
		this.params = setParams;

		function setParams(paramsVal)
		{
			paramsStr = paramsVal;
		}
//////////////////////////////////////



		function setURL(urlVal)
		{
			urlStr = urlVal;
		}

		function setMethod(methodVal)
		{
			methodType = methodVal;
		}
		
		function setRequestXML(requestXMLVal)
		{
			requestXMLStr = requestXMLVal;
		}

		function setCallbackHandler(callbackHandlerVal)
		{
			callbackMethod = callbackHandlerVal;
		}
		function setCallbackHandlerOnError(callbackHandlerValOnError)
		{
			callbackMethodOnError = callbackHandlerValOnError;
		}		

		function getHeaderParameters()
		{
			return headerMap;
		}

		function getRequestParameters()
		{
			return requestMap;
		}

		
		
/* ======================================================================
	Function	: init
	Input		: 
	Explanation : Responsible to create object of HTTP REQUEST
	========================================================================== */
		function init() 
		{
				
				try
				{
					
					if (window.XMLHttpRequest) 
					{				
						http = new XMLHttpRequest(); // Firefox, Safari
						if(http.overrideMimeType)
							http.overrideMimeType('text/xml');
						//alert("window.XMLHttpRequest created successfully");

					}
					else if (window.ActiveXObject) 
					{
						http = new ActiveXObject("Microsoft.XMLHTTP"); // Internet Explorer 
						//alert("window.ActiveXObject created successfully");
					}
				}
				catch(Exception)
				{
					//alert("Error Came over Here");
					throw new Error('Error : Error while initializing ajax for application');
				}

				
				//return xmlhttp;
		}
		
/* ======================================================================
	Function	: executeRequest
	Input		: 
	Explanation : Responsible for sending request to server
	========================================================================== */
		function executeRequest()
		{
					try
					{
//						methodType = "POST";	

// Added By Azhar Khan On 05 August 2008
						if(methodType=='GET')
							urlStr = urlStr + "?" +paramsStr;
//						alert(methodType+" "+urlStr);	
						http.open(methodType,urlStr, true);
						
						setRequestHeader();
						http.onreadystatechange = handleHttpResponse;
						var request = setRequestParameter();
						http.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
// Added By Azhar Khan On 29 July 2008
						http.setRequestHeader('Content-length', paramsStr.length);
						http.setRequestHeader("Request-Ajax", "XMLHttpRequest");
//						http.setRequestHeader('Connection', 'close'); // This Rises A Big Delay In IE6 (A Big Bug)
//						alert("METHOD::"+methodType+"::REQUEST::"+request+"::PARAMS::"+paramsStr+"::URL::"+urlStr);
//////////////////////////////////////		
						if(methodType=='GET')
							http.send(null); // Modified By Azhar Khan On 05 August 2008
						else
							http.send(paramsStr); // Modified By Azhar Khan On 05 August 2008

						//setTimeout("doNothing()", 1000);
						
					}
					catch(Exception)
					{
						alert(Exception);
						throw new Error('Error : Error while invoking request');
					}
		}

        function doNothing()
        {
        }
         

		
		function setRequestHeader()
		{
			for(var i=0;i<headerMap.size;i++)
			{
					http.setRequestHeader(headerMap.keys[i] , headerMap.keys[i] );
			}
		}

/* ======================================================================
	Function	: setRequestParameter
	Input		: 
	Explanation : Responsible to  set request parameter
	========================================================================== */


		function setRequestParameter()
		{
			var request ="";

			if(requestXMLStr!=null)
			{
					request = requestXMLStr;
					return request;
			}
			
			for(var i=0;i<requestMap.size;i++)
			{

				request  = request  + "" + requestMap.keys[i] + "=" + requestMap.values[i] + "&";
					
			}
			
			if(request!="")
			{
					request = request.substring(0,request.length-1);
			}
			else
			{
					request = null;
			}
			
			return request;
		}

/* ======================================================================
	Function	: map
	Input		: 
	Explanation : responsible for setting key value pair for request
	========================================================================== */
		
		function map()
		{
			var gKeys = new Array();
			var gValues = new Array();
			
			
			this.keys = gKeys;
			this.values = gValues;
			this.size = 0;
			this.put = setMapEntry;
			this.get = getMapEntry;

			function setMapEntry(key , value)
			{
					gKeys[gKeys.length]  = key;
					gValues[gValues.length] = value;
					this.size++;
			}
			
			function getMapEntry(keyParam)
			{
				
				for(var i=0;i<this.size;i++)
				{
					if(gKeys[i]==keyParam)
					return gValues[i];
				}

				return "";
			}
		
		}
		

/* ======================================================================
	Function	: handleHttpResponse
	Input		: 
	Explanation : Responsible for  handle response that will come from server 
	========================================================================== */

		function handleHttpResponse() 
		{
			try
			{
				if (http.readyState == 4) 
				{
					if (http.status == 200) 
					{  
						try
						{
							var responseText = "";
							var contentType = http.getResponseHeader("Content-Type");
							var message = http.responseXML;
							var headers = http.getAllResponseHeaders();
							//alert(headers); 
							if(contentType!=null && contentType.indexOf("xml")!=-1)
							{
								responseText = message.xml;
								alert("message.xml :"+responseText); 
							}
							//else if(message!=null && message.xml!="")
							//{
							//	responseText = message.xml;
							//	alert("message.xml1 :"+responseText); 
							//}	
							else if(contentType!=null && contentType.indexOf("html")!=-1)
							{
								responseText= http.responseText;
								//alert("Undefined Value :"+responseText); 
							}
							else
							{
								responseText= http.responseText;
								//alert("Undefined Value1 :"+responseText); 
							}
							//alert("response");
							//alert(responseText);
							//alert("responseText :"+responseText);
							responseText = escape(responseText);
							var responseHeaders = escape(headers);
							
							eval(""+callbackMethod+"(\""+responseText+"\",\""+responseHeaders+"\")");
						}
						catch(e)
						{
							alert("An error occurred while processing your request. Please Refresh This Page");
						}
					} 
					else
					{
						alert("ERROR getting response Text ["+http.status+"]");
						throw new Error('Error : Not able to retrieve response from Specified url');
					}
				} 
			}
			catch (e)
			{
				alert('Error : Not able to retrieve response from Specified url Please contact System Administrator'+e);
				if(callbackMethodOnError!="")
				eval(""+callbackMethodOnError+"(e)");
				//alert("An exception occurred in the script in ajax.js handleHttpResponse(). \nError name: " + e.name + ". Error message: " + e.message); 
				throw new Error('Error : Not able to retrieve response from Specified url');
			}
		}


		function getResponseHeader(headers)
		{
			
			headers = unescape(headers);
			var responseHeaderMap = new map();

			var obj=headers.split("\n");
			
			for(var i=0;i<obj.length;i++)
			{
				var headerStr = obj[i];
				var index = headerStr.indexOf(":");	
				if(index!=-1)
				{
					var key = headerStr.substring(0,index);
					var val = headerStr.substring(index+1,headerStr.length);
					responseHeaderMap.put(key,val);
				}
			}

			return responseHeaderMap;
		}
}

function invoke()
{
	   
    if(!arguments[0])
	return;

	if(!arguments[1])
	return;
		var ajax = new ajaxObject();
	ajax.url(arguments[0]+"&div_id="+arguments[1])
	
	ajax.callbackHandler("callback")
	ajax.execute();
}

function cleanString(divid)
{
	  
   var allChars="abcdefghijklmnopqrstuvwxyzABCEDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
   var retString = "";
   var workString= "";
   var tempString= "";
   var len = divid.length;
   for(j = 0 ; j < len ; j++)
   {
       workString = divid;    
	   tempString = workString.substring(j,j+1);
	   var index = allChars.indexOf(tempString);
	   if (index > -1 )
	      retString = retString + tempString;

   }
   return retString;
}

function callback(res,headers)
{
	 res = unescape(res);
	 var div_id = ajax.responseHeader(headers).get("div_id");
	try
	{
	     div_id =  cleanString(div_id);
	     var divobject= document.getElementById(div_id);
		 if( divobject != null ){
			  divobject.innerHTML = res;
		 }
	}
	catch(Exception)
	{
		alert(Exception);
	}
}



