﻿/*
 
*  版本号 1.0.20081014 


*  最后修改日期 2008-10-14
*  作者 梁逸晨 
	
	http://www.kvspas.com
	ajax@kvspas.com
	
   
*  该程序是ajax访问类,提供了六种访问办法: 1-同步获取文本 2-同步获取XML 3-异步获取文本  4-异步获取XML 5-获取缓存文本  6-获取缓存XML
*  该程序配套有服务端代理文件,用于访问异域的数据.

*  程序可以任意修改,传播和散布,但请保留以上信息,这些注释信息并不会影响程序的执行效率.

	2008-10-14 : 优化了XMLHTTP的创建过程，减去了原先不必要的try--catch
				 项目重新命名为 Kvspas.Ajax 。原有的旧名称 ginegrid不要了。
				 默认实例修改为 Kvspas.Ajax.static ， net虽然保留，但是不建议继续使用，因为有可能在大型项目中遭遇重定义。

    2008-5-20  ：修正了IE6下面创建XMLHTTP对象失败的问题，原因是创建组件存在判断错误。

    2008-2-28  ：优化了执行效率。有效解决了内存泄露。正式项目化，发布为1.0版本。

    2007-11-5  ：增加了读取文件错误的提示

    2007-10-24 ：两个异步功能加入访问缓存文件的办法，更节约了带宽。
                 增加了六个新的接口，cacheText和cacheXML用于访问缓存文本和缓存XML
                 为了增加可读性，
                 ajaxText对应早期的eAT
                 ajaxXML对应早期的eAX
                 loadText对应早期的ajaxT
                 loadXML对应早期的ajaxX
                 
                 早期的四个函数仍然可以使用，但是不推荐使用，因为大项目中需要可读性清晰的接口
                 

    2007-10-23 ：去除了最先版本的跨域功能，因为考虑到这个类有可能在远程调用，今后会考虑通过别的办法来实现 
                 直接在文档末尾初始化了对象，从而使得文档可以独立作为加载类使用，不再需要加载附属的js文件。
            
    2007-9-30  ：去除了MSXML5和MSXML4，避免不必要的try,在vista普及后再添加回去（2008年2月注：以后不再需要ActiveX组件了，IE7中可以直接使用XMLHttpRequest）。



    重要提示：虽然可以从本源码中发掘到eAA函数也可以执行同样的功能，但是请不要在您的项目中使用它，因为今后每一个版本升级，我都有可能会改变它或者撤销它。
    
    很遗憾javascript不可以设置private关键字，所以我只能通过这段注释来告诉您：不要直接使用eAA函数！
   
    应该只使用说明文档中描述的六个接口(cacheText 、cacheXML 、ajaxText 、ajaxXML 、loadText 、loadXML )，作为开发者，我可以保证这六个接口今后永远不会改变。

*/

if(!window.Kvspas)
{
	window.Kvspas = {};	
}

Kvspas.Ajax = function(){
 
 this.ajaxGLOBAL = null;
}
Kvspas.Ajax.static = null;


Kvspas.Ajax.version = "1.0.20081014";


var HttpRequest = function()
{
    var xmldoc = null;
	
    if(window.XMLHttpRequest){
        xmldoc = new XMLHttpRequest();
        if(xmldoc.overrideMimeType){
	
            xmldoc.overrideMimeType("text/xml");
        }

    }else 
	{
		xmldoc = new ActiveXObject("Microsoft.XMLHTTP");
	}
	return xmldoc || false;
}



//读取缓存文本
Kvspas.Ajax.prototype.cacheText = function(i,u,P){

  this.eAA(true,i,u,"Text",true,P);
}
//读取缓存XML
Kvspas.Ajax.prototype.cacheXML = function(i,u,P){
 
  this.eAA(true,i,u,"XML",true,P);
}
//读取文本
Kvspas.Ajax.prototype.ajaxText = function(i,u,p){

  this.eAT(i,u,p);
}
//读取XML
Kvspas.Ajax.prototype.ajaxXML = function(i,u,p){
 
  this.eAX(i,u,p);
}
//同步读取文本
Kvspas.Ajax.prototype.loadText = function(u,p){

  return this.ajaxT(u,p);
}
//同步读取XML
Kvspas.Ajax.prototype.loadXML = function(u,p){
 
  return this.ajaxX(u,p);
}

Kvspas.Ajax.prototype.eAT = function(i,u,P){

  this.eAA(false,i,u,"Text",true,P);
}

Kvspas.Ajax.prototype.eAX = function(i,u,P){
 
  this.eAA(false,i,u,"XML",true,P);
}

Kvspas.Ajax.prototype.ajaxT = function(u,P){

  return this.eAA(false,{},u,"Text",false,P).responseText;this.eAA = null;ajaxfree(this.eAA);
}

Kvspas.Ajax.prototype.ajaxX = function(u,P){
 
  return this.eAA(false,{},u,"XML",false,P).responseXML;this.eAA = null;ajaxfree(this.eAA);
}

Kvspas.Ajax.prototype.url = null;


function   ajaxfree(a)   
{   
  a=null; 
     
  function ajaxnull()
  {   
  }     
  
  return  ajaxnull;
}   

//警告！不要在项目中直接使用这个函数
//参数：是否读取缓存（true表示读取缓存文件|false则保证每次都重新请求）、回调函数、URL、文本或XML、同步或异步、POST参数
Kvspas.Ajax.prototype.eAA = function(cache,it,u,rt,asy,sv){
     
    var st  = "GET";
    var s = "";
    
    if(sv)
    { 
      s  = sv ;
      st  = "POST";
     
     }
    
    var eA = HttpRequest();
    
    if(asy)//保证了异步模式才会设置这个函数，主要是为了设置内存释放的执行点。
    {
        eA.onreadystatechange = function(){

            if(eA.readyState==4){
              
       //可以在这里添加更多的状态码判断信息,一般没有这个必要.会加大运算量.
       
                if (eA.status == 200) {
                  
                    if(rt=="Text"){o(eA.responseText);}
                    else if(rt=="XML"){o(eA.responseXML);}
                    ajaxfree(eA);
					try
					{
                    	CollectGarbage();
					}
					catch(e){}
				} 
                else 
                {
                    document.write("<p>执行错误，错误状态码："+eA.status+"</p><p>详细信息：</p>");
                    document.write(eA.responseText);
                }
            }

        }
    }
    
    var o = function(v){
    
        this.ajaxGLOBAL = v;
    
        if(typeof(it)=="function"){ it.call();}
        else
        {it = v;}
        eA = null;//内存释放，异步专用，如果没有上面的if(asy),则该步骤会导致同步模式在返回消息前便失效。
        
    }
    
    if(u.indexOf('?') > -1)
    { 
        u+="&rd=";
    }

    else{u+="?rd=";}
      
    if(!cache){
        u += Math.round(Math.random()*10000)*Math.round(Math.random()*10000) ;
    }
    
    this.url = u;
   
   eA.open(st,u,asy); 
   eA.setRequestHeader("content-length",s.length); 
   eA.setRequestHeader("content-type","application/x-www-form-urlencoded");
   
   eA.send(s);
   
        return eA ;
  }

Kvspas.Ajax.static = new Kvspas.Ajax();
var net = Kvspas.Ajax.static;