﻿/*
 
*  内部版本号 1.0 


*  最后修改日期 2008-2-28
*  作者 梁逸晨 kvspas@gmail.com

*  该程序是ajax访问类,提供了六种访问办法: 1-同步获取文本 2-同步获取XML 3-异步获取文本  4-异步获取XML 5-获取缓存文本  6-获取缓存XML
*  该程序配套有服务端代理文件,用于访问异域的数据.

*  程序可以任意修改,传播和散布,但请保留以上信息,这些注释信息并不会影响程序的执行效率.

    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 )，作为开发者，我可以保证这六个接口今后永远不会改变。

*/



var gineGrid = function(){
 
 this.ajaxGLOBAL = null;
}



gineGrid.version = "1.0.00.2008.2.28";


var HttpRequest = function()
{
    return Try.these(
      function() {return new XMLHttpRequest()},
      function() {return new ActiveXObject('Msxml2.XMLHTTP')},
      function() {return new ActiveXObject('Microsoft.XMLHTTP')}
    ) || false;
}

var Try = {
  these: function() {
    var returnValue;

    for (var i = 0, length = arguments.length; i < length; i++) {
      var lambda = arguments[i];
      try {
        returnValue = lambda();
        break;
      } catch (e) { }
    }

    return returnValue;
  }
};

//读取缓存文本
gineGrid.prototype.cacheText = function(i,u,P){

  this.eAA(true,i,u,"Text",true,P);
}
//读取缓存XML
gineGrid.prototype.cacheXML = function(i,u,P){
 
  this.eAA(true,i,u,"XML",true,P);
}
//读取文本
gineGrid.prototype.ajaxText = function(i,u,p){
  this.eAT(i,u,p);
}
//读取XML
gineGrid.prototype.ajaxXML = function(i,u,p){
 
  this.eAX(i,u,p);
}
//同步读取文本
gineGrid.prototype.loadText = function(u,p){

  return this.ajaxT(u,p);
}
//同步读取XML
gineGrid.prototype.loadXML = function(u,p){
 
  return this.ajaxX(u,p);
}

gineGrid.prototype.eAT = function(i,u,P){

  this.eAA(false,i,u,"Text",true,P);
}

gineGrid.prototype.eAX = function(i,u,P){
 
  this.eAA(false,i,u,"XML",true,P);
}

gineGrid.prototype.ajaxT = function(u,P){

  return this.eAA(false,{},u,"Text",false,P).responseText;this.eAA = null;ajaxfree(this.eAA);
}

gineGrid.prototype.ajaxX = function(u,P){
 
  return this.eAA(false,{},u,"XML",false,P).responseXML;this.eAA = null;ajaxfree(this.eAA);
}

gineGrid.prototype.url = null;


function   ajaxfree(a)   
{   
  a=null;   
  return  ajaxnull;
     
  function ajaxnull()
  {   
  }   
}   

//警告！不要在项目中直接使用这个函数
//参数：是否读取缓存（true表示读取缓存文件|false则保证每次都重新请求）、回调函数、URL、文本或XML、同步或异步、POST参数
gineGrid.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);
                    CollectGarbage();
                } 
                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 ;
  }
var net = new gineGrid();
