﻿//CRIOnline 静静的黎明

var HttpRequest ={
	_entries : new Array(),

	_getEntryInstance : function ()
	{
		for(var i = 0, j = this._entries.length; i < j; i++)
		{
			if(this._entries[i].readyState == 0 || this._entries[i].readyState == 4)
			{
				return this._entries[i];
			}
		}
		this._entries[this._entries.length] = this._createEntry();
		
		return this._entries[this._entries.length - 1];
	},

	_createEntry : 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();
					}
				});
			}
			return entry;
		}
		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");
					return entry;
				}
				catch(err)
				{}
			}
			throw new Error("浏览器不支持 XML Request.");			
		}
	},

	_analysisParams : function (responseXML)
	{
		
		var status = false, service, message, itemNodes = [];
		try
		{
			if(responseXML == null) 	
				throw new Error("没有回应文档");

			var err = responseXML.parseError;

			if(err && err.errorCode != null && err.errorCode != 0) 
				throw new Error("服务器回应文档错误: " + err.reason);

			if(responseXML.documentElement.nodeName == "rss")
			{
				status = true;
				message = "200";
				service = responseXML.selectSingleNode("/rss/channel/podcast:module").text;						
				itemNodes = responseXML.selectNodes("/rss/channel/item");
			}
			else if(responseXML.documentElement.nodeName == "response")
			{
				var errNode = responseXML.selectSingleNode("/response/error");
				status = (errNode.text == "0");		
				service = responseXML.documentElement.getAttribute("service");
				message = responseXML.selectSingleNode("/response/message").text;
			}
			else
			{
				throw new Error("未识别的回应文档格式");
			}	
		}
		catch(err)
		{
			message = (err.description)? err.description : err.toString();
		}

		return [service, status, message, itemNodes];
	},

	_getTickCount : function()
	{
		return new Date().getTime().toString();
	},

	_initUrlQueryString : function (url, querys, method)
	{
		var queryString = ""; 
		if(querys == null) 
		{
			querys = new NetBlog.NameValueCollection();
		}
		
		if(method == "GET")
		{
			querys.set("_tick", this._getTickCount());
		}

		var keys = querys.allKeys();
		for(var i = 0; i < keys.length; i++)
		{
			//queryString += ((i == 0)? "" : "&");
			//queryString += keys[i] + "=" + encodeURIComponent(querys.get(keys[i]));
			var key = keys[i];
			var values = querys.getValues(key);
			for(var j = 0; j < values.length; j++)
			{
				queryString += ((i == 0 && j == 0)? "" : "&");
				queryString += key + "=" + encodeURIComponent(values[j]);
			}
		}

		return queryString;
	},

	_sendCallback : function (entry, callbackFunc, analysisParams, userData)
	{
		if(entry.readyState == 4)
		{
			if(entry.status == "200")
			{
				if(typeof callbackFunc == "function")
				{
					if(analysisParams != null)
					{
						var args = analysisParams(entry.responseXML);
						callbackFunc(args[0], args[1], args[2], args[3], userData);
					}
					else
						callbackFunc(entry.responseXML, userData);
				}
			}
			else
			{
				(analysisParams != null)? callbackFunc("Unknown", false, "服务器回应错误:" + entry.statusText, null, userData) : callbackFunc(null, userData, "服务器回应错误:" + entry.statusText);
			}
		}
	},

	send : function (method, url, isAsync, querys, callbackFunc, userData, an)
	{

		var entry = this._getEntryInstance();
		
		try
		{
			method = method.toUpperCase();

			var postData = "";			
			var queryString = this._initUrlQueryString(url, querys, method);			
			

			switch(method)
			{
				case "GET":
					url= url + ((url.indexOf("?") == -1)? "?" : "&") +  queryString;		
					break;
	
				case "POST":
					url = url + ((url.indexOf("?") == -1)? "?" : "&") + "_tick=" + this._getTickCount();
					postData = queryString;
					break;

				case "HEAD":
					break;	
				
				default:
					throw new Error("不支持该模式");	
			}
			
			entry.open(method, url, isAsync);
	
			var callbackProcess = this._sendCallback;
			var analysisParams = ((an == true) ? this._analysisParams : null);
			entry.onreadystatechange =  function()
			{
				callbackProcess(entry, callbackFunc, analysisParams, userData);
			} 	

			entry.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=utf-8');
			entry.send(postData);
		}
		catch(err)
		{
			entry.abort();
			(an)? callbackFunc("Unknown", false, "发送错误: " + err.description, null, userData) : callbackFunc(null, userData, "发送错误:" + err.description);
		}
	},

	get : function(url, isAsync,  querys, callbackFunc, userData, an)
	{
		this.send("GET", url, isAsync, querys, callbackFunc, userData,  an)
	},

	post : function(url, isAsync, querys, callbackFunc, userData,  an)
	{
		this.send("POST", url, isAsync, querys, callbackFunc, userData,  an)
	},

	asyncGet : function(url, querys, callbackFunc, userData,  an)
	{
		this.get(url, true, querys, callbackFunc, userData,  an);
	},
	
	asyncPost: function(url, querys, callbackFunc, userData,  an)
	{
		this.post(url, true, querys, callbackFunc, userData,  an);
	}
}
window.HttpRequest = HttpRequest;