﻿//CRIOnline 静静的黎明
WebRequest = function()
{
	this.sender;
	this.headers;

	this.setHeader = function(name, value)
	{
		this.headers[name] = value;
	}

	this.removeHeader = function(name)
	{
		delete this.headers[name];
	}

	this.clearHeader = function()
	{
		this.headers = new Object();
	}

	this.get = function(url, callbackFunc, userData)
	{
		this.send("GET", url, true, callbackFunc, "", userData);
	}

	this.post = function(url, calbackFunc, postData, userData)
	{
		this.send("POST", url, true, callbackFunc, postData, userData);
	}

	this.__callbackProcess = function(sender, callbackFunc, userData)
	{
		if (sender.readyState == 4 && typeof callbackFunc == "function")
		{
			callbackFunc(sender, userData);
		}
	}

	this.send = function(method, url, async, callbackFunc, postData, userData)
	{
		try
		{
			var state = this.sender.readyState;

			if (state != 0 && state != 4)
				throw new Error("another request is not complete at current WebRequest instance.");

			var request = this;

			this.sender.open(method.toUpperCase(), url, async);			

			this.sender.onreadystatechange = function()
			{
				request.__callbackProcess(request.sender, callbackFunc, userData);
			}		
			for (var key in this.headers)
			{
				this.sender.setRequestHeader(key, this.headers[key]);
			}
			this.sender.send(postData);
		}
		catch (err)
		{
			this.sender.abort();
			throw new Error("WebRequest Error:" + ((err.description)? err.description : err.toString()));
		}
	}

	this.__init = function()
	{
		var entry;
		if (window.XMLHttpRequest)
		{
			entry = new XMLHttpRequest();
			if (entry.readyState == null)
			{
				entry.readyState = 1;
				entry.addEventListner("onload", function()
				{
					entry.readyState = 4;
					if (typeof entry.onreadystatechange == "function")
					{
						entry.onreadystatechange();
					}
				});
			}
		}
		else if(window.ActiveXObject)
		{
			var xmlHttpTags = ["Msxml2", "Microsoft", "Msxml", "Msxml3"];
			for (var i = 0; i < xmlHttpTags.length; i++)
			{
				try
				{
					entry = new ActiveXObject(xmlHttpTags[i] + ".XMLHTTP");
					break;
				}
				catch(err)
				{}
			}		
		}

		if (entry)
			this.sender = entry;
		else
			throw new Error("HTTPXMLRequest 不支持");

		this.headers = new Object();
		this.setHeader('Content-Type', 'application/x-www-form-urlencoded; charset=utf-8');
	}
	this.__init();
}

var WebRequestPool = 
{
	requests : [],
	getInstanceFromPool : function()
	{
		for (var i = 0, j = this.requests.length; i < j; i++)
		{
			if (this.requests[i].sender.readyState == 0 || this.requests[i].sender.readyState == 4)
				return this.requests[i];
		}
		
		this.requests[this.requests.length] = new WebRequest();
		
		return this.requests[this.requests.length - 1];
	},

	send : function (method, url, async, callbackFunc, postData, userData)
	{	
		var sender = this.getInstanceFromPool();
		sender.send(method, url, async, callbackFunc, postData, userData);
	},

	get : function (url, callbackFunc, userData)
	{
		this.send("GET", url, true, callbackFunc, "", userData);
	},

	post : function (url, callbackFunc, postData, userData)
	{
		this.send("POST", url, true, callbackFunc, postData, userData);
	}
}

function setCookie(sName,sValue,oExpires,sPath,sDomain,bSecure)
     {
        var sCookie= sName + "=" +encodeURIComponent(sValue);
        if(oExpires)
        {
            sCookie += "; expires=" +oExpires.toUTCString();
        }
        if(sPath)
        {
            sCookie += "; path=" + sPath;
        }
        if(sDomain)
        {
            sCookie += "; domain=" + sDomain;
        }
        if(bSecure)
        {
            sCookie += "; secure";
        }
        window.document.cookie=sCookie;
     }
      function getCookie(sName)
     {
        var sRE = "(?:; )?" + sName + "=([^;]*);?";
        var oRE = new RegExp(sRE);
        if(oRE.test(document.cookie))
        {
            return decodeURIComponent (RegExp["$1"]);
        }
        else
        {
            return null;
        }
     }