/****************** Ajax 操作类 **********************
 * 对表单数据进行验证操作
 * ajax.submit() -- Post提交整个表单
 * ajax.request() -- Get方式请求
 * 如
  var ajaxurl = "a.aspx";
	var ajax = new Ajax();
	Dialog.ShowProcess();
	ajax.Request("Get",ajaxurl,"",function(xml)
	{
		Dialog.Close();
		if(xml!=null)
		{
			alert(xml);
		}
	});
 *****************************************************/
function Ajax()
{
	//////// 成员定义 ////////
	var _XmlHttp = null;
	var _UserName = null, _UserPassword = null;
	var _RequestHeaders = ({'Count' : 0, 'Items' : {}});

	this.Submit = function (form, callBack, disableCache)
	{
		// 检查参数 form 是否是有效的表单对象的引用(此处的检查较简单)
		if (!form || 'undefined' === typeof(form.tagName) || 'form' !== form.tagName.toString().toLowerCase() || 'undefined' === typeof(form.elements))
		{
			throw new Error('参数 form 不是有效的表单元素的引用！');
		}

		var enctype = form.enctype.toString().toLowerCase();
		if ('multipart/form-data' === enctype)
		{
			throw new Error('不支持带有文件上传功能的表单！');
		}

		// 执行一些初始化操作
		//_InitXmlHttp();

		// 从 form 表单取得要提交的地址
		var url = form.action.toString()
		if ('' === url)						// form.action 未填写
		{
			url = window.location.href;
		}
		else if ('?' === url.charAt(0))	// form.acton 的第一个字符是“?”
		{
			url = window.location.href.replace(window.location.search, '') + url;
		}

		// 从 form 表单取得 method 的值
		var method = form.method.toString().toLowerCase();
		if ('get' != method && 'post' != method)
		{
			method = 'get';
		}

		// 处理 form 表单要提交的数据
		var data = '', seperator = '', ele = null, type = '';
		for (var i = 0; i < form.elements.length; i++)
		{
			ele = form.elements[i];
			if (ele.disabled)
			{
				continue;
			}
			else if ('' === ele.name)
			{
				continue;
			}
			else if ('select' === ele.name && -1 === ele.selectedIndex)
			{
				continue;
			}
			if(ele.type)
			{
			    type = ele.type.toString().toLowerCase();
			    if ('checkbox' === type && !ele.checked)
			    {
				   continue;
			    }
			    else if ('radio' === type && !ele.checked)
		        {
				   continue;
			    }
			}
			data += seperator + ele.name + '=' + escape(ele.value);
			seperator = '&';
		}

		// 设置 Content-Type
		this.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		this.setRequestHeader("If-Modified-Since","0");	// 禁用页面缓存
		// 发送 HTTP 请求
		return this.Request(method, url, data, callBack, disableCache);

	}

	////////  成员方法 ////////
	this.Request = function(method, url, data, callBack, disableCache)
	{
		// 参数合法性判断
		if ('string' !== typeof(method))
		{
			throw new Error('参数 method 必须是一个字符串类型的值！');
		}
		// 参数合法性判断
		if ('string' !== typeof(url))
		{
			throw new Error('参数 url 必须是一个字符串类型的值！');
		}

		// 处理 method 参数
		method = method.toLowerCase();
		if ('get' !== method && 'post' !== method)
		{
			method = 'get';
		}

		// 对于Get请求（或凡涉及到url传递参数的）,被传递的参数都要先经encodeURIComponent方法处理
		// 如果没有用encodeURIComponent处理的话,也会产生乱码
		if('get' === method && null != data && data.length>0)
		{
			var arrStr1 = data.split("&");
			data = "";
			for(var i=0; i<arrStr1.length; i++)
			{
				var arrStr2 = arrStr1[i].split("=");
				if(arrStr2.length == 2)
				{
					var str = arrStr2[0] + "=" + encodeURIComponent(arrStr2[1]);
					data += (""===data) ? str : "&" + str;
				}
			}
		}

		// 执行一些初始化操作
		_Initialize();

		var async = ('function' === typeof(callBack));
		try
		{
			// 判断是否使用异步 XmlHttp 请求，如果是，则设置回调函数
			if (async)
			{
				_XmlHttp.onreadystatechange = function () {
					if (4 == _XmlHttp.readyState)
					{
						callBack(_XmlHttp);
					}
				};
			}
			//alert("url:" + url + "\n\ndate:" + data);

			// 打开 XmlHttp
			if ('get' === method && 'string' === typeof(data) && data.length > 0)
			{
				_XmlHttp.open(method, url + ((-1 === url.indexOf('?')) ? '?' + data : '&' + data), async, _UserName, _UserPassword);
			}
			else
			{
				_XmlHttp.open(method, url, async, _UserName, _UserPassword);
			}

			if (_RequestHeaders.Count > 0)
			{
				for (var key in _RequestHeaders.Items)
				{
					_XmlHttp.setRequestHeader(key, _RequestHeaders.Items[key]);
				}
			}

			// 给http头加上ajax请求标识
			_XmlHttp.setRequestHeader("ajax","1");

			// 如果参数 disableCache 被设置为 true，则不缓存 XmlHttp 请求
			if (true === disableCache)
			{
				_XmlHttp.setRequestHeader('If-Modified-Since', '0');
			}

			if ('undefined' === typeof(data) || '' === data)
			{
				data = null;
			}

			if ('get' === method)
			{
				//_XmlHttp.send(data);
				_XmlHttp.send(null);
			}
			else
			{
				_XmlHttp.send(data);
			}
		}
		catch ($e)
		{
			_XmlHttp.abort();
			throw $e;
		}

		// 如果未设置为异步 XmlHttp 请求，则返回 XmlHttp 实例的引用
		if (!async)
		{
			return _XmlHttp;
		}
	}

	// 设置 HTTP 请求的头
	this.setRequestHeader = function (name, value) {
		// 参数判断
		if ('string' !== typeof(name))
		{
			throw new Error('参数 name 不是合法的字符串类型的变量！');
		}
		if ('string' !== typeof(value))
		{
			throw new Error('参数 value 不是合法的字符串类型的变量！');
		}

		_RequestHeaders.Count = _RequestHeaders.Count + 1;
		_RequestHeaders.Items[name] = value;
	};

	// 手工释放xmlhttp连接
	this.Dispose = function()
	{
		if(null != _XmlHttp)
		{
			_XmlHttp.abort();	// 取消当前请求
			_XmlHttp.onreadystatechange = null; // 取消回调函数
		}
	}

	// 对像初始化，内部方法
	function _Initialize()
	{
		if(null == _XmlHttp)
		{
			_XmlHttp = _CreateXmlHttp();

			if(null == _XmlHttp)
			{
				throw new Error('您的浏览器不支持或未启用 XmlHttp！');
			}
		}
		else
		{
			if (4 == _XmlHttp.readyState)
			{
				_XmlHttp.abort();	// 取消当前请求
				_XmlHttp.onreadystatechange = null; // 取消回调函数
				return _XmlHttp;
			}
		}
	}

	// 创建xmlhttp对象
	function _CreateXmlHttp()
	{
		if (window.XMLHttpRequest)
		{
			return new XMLHttpRequest();
		}
		var msxml = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP']; //window.XMLHttpRequest
		for (var i = 0; i < msxml.length; i++)
		{
			try
			{
				return new ActiveXObject(msxml[i]);
			}
			catch($e)
			{
			}
		}
		return null;
	}
}
