XHRFactory = (function(){
 var stack = new Array();
 var _msxml_progid = [
		'MSXML2.XMLHTTP.3.0',
		'MSXML2.XMLHTTP',
		'Microsoft.XMLHTTP'
		];

 var nullFunction = function() {}; 
 function createXHR()
 {
	var obj;
	try
	{
		obj = new XMLHttpRequest();
	}
	catch(e)
	{

		obj = new ActiveXObject('Microsoft.XMLHTTP');

	}
	finally
	{
		return obj;
	}
 }

 for (var i = 0; i < GENERAL_SETTINGS.POOL_MAX_SIZE; i++) {
  stack.push(createXHR());
 }

 return ({
  release:function(xhr){
   xhr.onreadystatechange = nullFunction;
   stack.push(xhr);
  },
  getInstance:function() 
  {
  	if( GENERAL_SETTINGS[ "POOLING_ENABLED"] )
	{
	   if (stack.length < 1)
	   {
	    return createXHR();
	   } else {
	    return stack.pop();
	   }
	}
	else
	{
		 if (window.XMLHttpRequest)
		 {
       		return new XMLHttpRequest();
	     }
		 else if (window.ActiveXObject) {
       		return new ActiveXObject('Microsoft.XMLHTTP')
		 }
	}

  },

  toString:function(){
   return "stack size = " + stack.length;
  }
 });
})();


 Request = {};

Request.send = function(url, method, data, handler, handlerParams,urlencoded,async) {
	var req;
	req = XHRFactory.getInstance();
	if(typeof async=='undefined' || async==null){
		async=true;
	}
	if( method.toLowerCase() == "get" && data != "" && data != null )
		url = url + "?" + data;

	req.onreadystatechange = function() {
		if (req.readyState == 4) {
			if (req.status < 400) {
				if(handler != null)
					handler( req, handlerParams );
				req = null;

			} else {
			}
		}
	}
	if (method=="POST") {
		req.open("POST", url, async);
		if (urlencoded) req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		req.send("" + data);
	} else if(method=="PUT") {
		req.open("PUT", url, async);
		if (urlencoded) req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		req.send("" + data);
	} else if(method=="DELETE"){
		req.open("DELETE", url, async);
		req.send(null);
	}else{
		req.open("GET", url, async);
		req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		req.send(null);
	}

	return req;
}


Framework.redirectPUT    = Framework.serverPath+"/put/";
Framework.redirectDelete = Framework.serverPath+"/delete/";


Request.sendPOST = function(url, data, responseHandler, args) {
	if(undefined == data)
	data = '';
	Request.send(url, "POST", data,responseHandler, args, true);
}
Request.sendGET = function(url, responseHandler, args) {
	return Request.send(url, "GET", null,  responseHandler, args);
}
Request.sendGETSync = function(url, responseHandler, args) {
	return Request.send(url, "GET", null,  responseHandler, args,null,false);
}

Request.sendPUT = function(url, responseHandler, args) {
	if(undefined == args)
	args = '';
	if(Browser.isSafari){
	return Request.send(Framework.redirectPUT + url, "POST", "",responseHandler, args, true);
	}
	else{
	return Request.send(url, "PUT", "",responseHandler, args, true);
	}
}
Request.sendDEL = function(url, responseHandler, args) {
	if(undefined == args)
	args = '';
	if(Browser.isSafari){
	return Request.send(Framework.redirectDelete + url, "POST","", responseHandler, args);
	}
	else{
	return Request.send(url, "DELETE", "",responseHandler, args);
	}
}





function myHandler( req, handlerParams )
{
}


function evalResponseScripts( req )
{
	var div = document.createElement("DIV");
	div.innerHTML = root.responseText;

	evalResponseScriptsHelper( div )
}

function evalResponseScriptsHelper( root )
{
	if( root.tagName.toLowerCase == "script" )
	{
		eval( root.innerHTML );
		return;
	}
	var childs = root.childNodes;
	var size = childs.length;
	if( size == 0 )
		return;

	for(var i=0; i<size; i++) {
		evalResponseScriptsHelper( root );
	}
}

function connectGET( url , params , handler, handlerParams )
{
	url = unescape(url);

	if( params != null )
	{
		for( var i=0; i<params.length; i++ )
			 url +=  "/" + params[i];
	}
	Request.sendGET( url, handler, handlerParams );
}

function connectPOST( url , params , handler, handlerParams )
{
	url = unescape(url);

	if( params != null )
	{
		for( var i=0; i<params.length; i++ )
			  url +=  "/" + params[i];
	}
	Request.sendPOST( url, null, handler, handlerParams );
}
