//创建一个Http类
//Author:LiJunjie
//Date:	2007-04-17
//Email:lijunjie1982@yahoo.com.cn
//===========================说明====================================
//1.该类是从XMLHttpRequest到IE支持的http,从IE的高版本到低版本创建的
//2.类的第一部分相当于初始化函数,第二部分提供了一种返回一个对象的方法
//3.该类不仅可以new出来一个功能很强的http,而且自身还可以使用自己的方法
//	创建一个和自己本质相同的http对象
//4.该类的最大特点是解决了编码问题,简单实用
//5.该类的又一特点就是可以查看创建的http的版本信息
//6.该类的缺点是不能创建一个指定版本的http
//7.提示:不同版本的http返回的xmldoc对象的方法和属性多少是有差别的
//8.该类仅采用异步的http调用
//9.该类不提供返回信息的处理函数,自己判断并进行错误处理
//10.get和post方法的参数是一个参数的简单http的函数
//11.addURLParam和addPostParam的参数是一个集合对象{name:val,name2:val2}
//===================================================================
if(typeof HTTP_INC=='undefined'){		//防止重包含
	function Http(){
		var G_version;	
		var G_http;
		if(typeof XMLHttpRequest!="undefined"){
			G_http = new XMLHttpRequest;
			G_version = "XMLHttpRequest";
		}else if(typeof ActiveXObject!="undefined"){
			var a,h,c="MSXML2.XMLHTTP",b="MICROSOFT.XMLHTTP",i=[c+".5.0",c+".4.0",c+".3.0",c,b+".1.0",b+".1",b];
			for(a=0;h=i[a++];){
				try{
					if(typeof(new ActiveXObject(h))  == "object"){
						G_version = h;
						G_http = new ActiveXObject(h);
					}
				}catch(d){}
			}
		}else{
			G_version = '未能创建http对象';
			G_http = null;
		}
	
	
		return  {
			sURL 	: '',		//请求的url,必须的
			sParams	: '',		//post参数,可选的,但不要直接赋值,请使用下面的方法
			version : G_version,//http的版本号
			http	: G_http,	//内部httprequest对象
			async	: true,
			//定义http的get方法
			get : function(onReadyStateChange){
				try{
					this.http.open("GET",this.sURL,this.async);	//在firefox中,此处可能引起跨域调用异常
				}catch(e){alert(e);}
				var temp_http = this.http;
				//如果是异步请求
				if(this.async){
					this.http.onreadystatechange = function(){ 
						onReadyStateChange(temp_http);
					}
				}
				this.http.send(null);
				//如果是同步请求
				if(!this.async && this.http.readyState == 4 && this.http.status == 200){
					return temp_http;
				}else{
					return {};
				}
			},
			
			//定义http的post方法
			post : function(onReadyStateChange){
				try{
					this.http.open("POST",this.sURL,this.async);//在firefox中,此处可能引起跨域调用异常
				}catch(e){alert(e);}
				var temp_http = this.http;
				this.http.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=GB2312");
				//如果是异步请求
				if(this.async){
					this.http.onreadystatechange = function(){ 
						onReadyStateChange(temp_http);
					}
				}
				this.http.send(this.sParams);	
				//如果是同步请求
				if(!this.async && this.http.readyState == 4 && this.http.status == 200){
					return temp_http;
				}else{
					return {};
				}
			},
		
			//构造get字符串
			addURLParam :function(obj){		
				for(var name in obj){
					//if(typeof obj[name] != 'string' && typeof obj[name] != 'number') continue;	//只要字符串和整数,忘记为什么这么做了,就注释掉了
					this.sURL += (this.sURL.indexOf("?") == -1?"?":"&");
					this.sURL += encodeURIComponent(name)+ "=" + encodeURIComponent(obj[name]);
				}
			},
			//构造post字符串
			addPostParam : function (obj){	
				for(var name in obj){
					//if(typeof obj[name] != 'string' && typeof obj[name] != 'number') continue;	//只要字符串和整数
					this.sParams += this.sParams.length>0?'&':'';
					this.sParams += encodeURIComponent(name)+ "=" + encodeURIComponent(obj[name]);
					
				}
			},
			//创建一个和自身本质相同的http对象
			createXMLHttpRequest : function(){
				if(typeof XMLHttpRequest!="undefined"){
					return new XMLHttpRequest
				}else if(typeof ActiveXObject!="undefined"){
					var a,h,c="MSXML2.XMLHTTP",b="MICROSOFT.XMLHTTP",i=[c+".5.0",c+".4.0",c+".3.0",c,b+".1.0",b+".1",b];
					for(a=0;h=i[a++];){
						try{
							if(typeof(new ActiveXObject(h))  == "object"){
								this.version = h;
								this.http =  new ActiveXObject(h);
								return this;
							}
						}catch(d){}
					}
				}
				this.version = '未能创建http对象';
				this.http =  null;
				return this;
			}
			
		}
	}


	function $(idname){
		if(document.getElementById){ 
			return document.getElementById(idname); 
		}else if(document.all) { 
			return document.all[idname];
		}else if(document.layers) {
			return document.layers[idname];	
		}else{
			return null; 
		}
	}
	function trim(str)
	{
		return str.replace(/(^\s*)|(\s*$)/g, "");
	}
	function ltrim(str)
	{
		return str.replace(/(^\s*)/g, "");
	}
	function rtrim(str)
	{
		return str.replace(/(\s*$)/g, "");
	}

	/**计算指定的输入框还能输入多少个字
 * 
 */
function writeLeave(formElement, objShow, maxl)
{
	//formElement.value=ltrim(formElement.value);
	if(getStringLen(formElement.value,1) > maxl)
	{
		formElement.value =cutString(formElement.value,maxl,1);
		try
		{
			objShow.value = 0;
		}catch (e){}
		try
		{
			objShow.innerHTML=0;
		}catch (e){}
	}
	else
	{
		try
		{
			objShow.value = maxl - getStringLen(formElement.value,1);
		}catch (e){}
		try
		{
			objShow.innerHTML=maxl - getStringLen(formElement.value,1);
		}catch (e){}

	}
}

/**
 * 字符串截取
 * 
 * 待处理的串str
 * 截取长度 cutLentth
 * 汉字的长度 备用
 * 
 */
function cutString(str,cutLentth,gbkLen)
{
	return str.substring(0,cutLentth);
}

/**
 * 计算给定字符串的长度
 * 
 * str字符串
 * 一个汉字的长度 gbkLen（当前不可用，将来用）
 */
function getStringLen(str,gbkLen)
{
	str = ltrim(str);
	if(2==gbkLen)
	{
		str=str.replace(/[^\x00-\xff]/g,"**");
	}
	return str.length;
}


/**
 * 获取同一个className的所有object
 */
$class = function(className, parentElement) 
{
  var children = ($(parentElement) || document).getElementsByTagName('*');
  var ret =[];
  for (var i=0;i<children.length;i++)
  {
      if (children[i].className.match(new RegExp("(^|\\s)" + className + "(\\s|$)")))
      {
          ret.push(children[i]);
      }
  }
  return ret;
}


	HTTP_INC = true;
}