﻿var ajaxFactory =
{
    counter: 0,

    createAjax : function ()
    {
        //  创建XMLHttpRequset对象 
        var ajaxObj = new Object();
        
        ajaxObj.URL = '';
        
        //默认Loading图标
        ajaxObj.icon = 'images/ajax-loader.gif';
        
        if  (window.ActiveXObject)
        {
            ajaxObj.req = new ActiveXObject("Microsoft.XMLHTTP");
        }
        else
        {
            ajaxObj.req = new XMLHttpRequest();
        }
        
        ajaxObj.go = function(url, method, data)
        {
	        ajaxObj.req.onreadystatechange = function()
	        {
	            var tt = ajaxObj.req.readyState;
		        if (ajaxObj.req.readyState == 4)
		        {
		            //清除Loading图标
		            AjaxPool.RemoveLoadIcon(ajaxObj.elementLoad)
		            
			        if (ajaxObj.req.status == 200)
			        {
				        (method=="POST") ? ajaxObj.callBack(ajaxObj) : ajaxObj.callBack(ajaxObj,data);
			        }
			        else
			        {
			            ajaxObj.callBackFaild(ajaxObj);
			        }
		        }
	        }
        	
        	//加载Loading图标
        	AjaxPool.AddOnLoadIcon(ajaxObj);
        	
        	//添加url随机数
        	//避免浏览器缓存
        	url = AjaxPool.UrlRandom(url);
        	
	        if (method=="POST")
	        {
		        ajaxObj.req.open("POST", url, true);
		        ajaxObj.req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		        ajaxObj.req.send(data);
	        }
	        else
	        {		
		        ajaxObj.req.open("GET", url, true);
		        ajaxObj.req.setRequestHeader("Content-Type","text/xml") 
		        ajaxObj.req.send(null);
	        }
        }
        
        return ajaxObj;
    },

    activateAjax : function(ajaxObj)
    {   
        ajaxObj.activated = true;
    },

    passivateAjax : function (ajaxObj)
    {
        //  重置XMLHttpRequset对象 
        ajaxObj.callBack = {};
        ajaxObj.callBackFaild = {};
        ajaxObj.req.onreadystatechange = {} ;
        ajaxObj.req.abort();
        ajaxObj.elementLoad = null;
    },
    
    destroyAjax : function(ajaxObj)
    {
        ajaxObj.destroyed = true;
    }
}

function AjaxPool(factory)
{
	this._factory = factory;
	this._idlePool = []; 
	this._activePool = []; 
}

AjaxPool.prototype.borrowAjax = function(callBack, callBackFaild)
{
	var object = null;
	var idlePool = this._idlePool;
	var factory = this._factory;
	if (idlePool.length > 0)
	{
		object = idlePool.pop();
	}
	else
	{
		object = factory.createAjax();
	}
	
	if (object != null)
	{
		object.callBack = callBack;
		object.callBackFaild = callBackFaild;

		this._activePool.push(object);
		if (factory.activateAjax)
		{
			factory.activateAjax(object);
		}
	}
	return object;
}

AjaxPool.prototype.returnAjax = function (ajaxObject)
{
	function indexOf(array, object)
	{
		for (var i = 0; i < array.length; i++)
		{
			if (array[i] == ajaxObject) return i;
		}
		return -1;
	}
	
	if (ajaxObject != null)
	{
		var activePool = this._activePool;
		var factory = this._factory;
	
		var i = indexOf(activePool, ajaxObject);
		if (i < 0) return;
		
		if (factory.passivateAjax)
		{
			factory.passivateAjax(ajaxObject);
		}
		
		activePool.splice(i, 1);
		this._idlePool.push(ajaxObject);
	}
}

AjaxPool.prototype.getNumActive = function()
{
	return this._activePool.length;
}

AjaxPool.prototype.getNumIdle = function()
{
	return this._idlePool.length;
}

AjaxPool.prototype.destroy = function()
{
	var factory = this._factory;
	
	var activePool = this._activePool;
	for (var i = 0; i < activePool.length; i++)
	{
		this._destroyObject(activePool[i]);
	}
	
	var idlePool = this._idlePool;
	for (var i = 0; i < idlePool.length; i++)
	{
		this._destroyObject(idlePool[i]);
	}
	
	this._idlePool = null; 
	this._activePool = null; 
	this._poolableObjectFactory = null;

}

AjaxPool.prototype._destroyObject = function(ajaxObject)
{
	var factory = this._factory;
	if (factory.destroyAjax)
	{
		factory.destroyAjax(ajaxObject);
	}
}

AjaxPool.RemoveLoadIcon = function(elementLoad)
{
    if (elementLoad)
    {
        var childCount = elementLoad.childNodes.length;
        for (var i = childCount - 1; i >= 0; i--)
        {
            elementLoad.removeChild(elementLoad.childNodes[i]);
        }
    }
}

AjaxPool.AddOnLoadIcon = function(ajaxObj)
{
    if (ajaxObj.elementLoad)
    {
        var loadIcon = document.createElement('img');
        loadIcon.src = ajaxObj.icon;
        ajaxObj.elementLoad.appendChild(loadIcon);
    }
}

AjaxPool.UrlRandom = function(url)
{
    if (url.indexOf('?') == -1)
        url += '?rax=' + Math.random();
    else
        url += '&rax=' + Math.random();
    return url;
}