function JWF_AJAX(){
  this.dataString = "";
  this.responseText=false;
  this.responseType="text";//text | xml
  this.xmlDoc = false;
  this.errText="";
  this.callBack=false;
  this.asyn=false;
}
//获取XMLHttpObject对象
JWF_AJAX.prototype.getXmlHttpObject = function(){
   try{
     // Firefox, Opera 8.0+, Safari
      this.xmlHttp=new XMLHttpRequest();
      if (this.xmlHttp.overrideMimeType){
         this.xmlHttp.overrideMimeType("text/xml");
      }
    }catch (e){
      // Internet Explorer
      try{
        this.xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
      }catch (e){
        try{
             this.xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
           } catch (e) {
             alert("Your browser don't support AJAX");
             this.xmlHttp = false;
           }
      }
    }
}
JWF_AJAX.prototype.sendData = function(url,method,params){
    try{
      var loadTip = document.getElementById("load_tips");
      if(loadTip){
      loadTip.style.display="block";
      }
      var request = this;
      if(params!=""){
              params += "&ajax=yes";
      }else{
              params = "ajax=yes";
      }
      request.getXmlHttpObject();
      if(request.xmlHttp){
        if(method.toUpperCase()=="GET"){
          request.xmlHttp.open("GET", url, request.asyn);
        }else{
          request.xmlHttp.open("POST", url, request.asyn);
          request.xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
          request.xmlHttp.setRequestHeader("Content-length", params.length);
          request.xmlHttp.setRequestHeader("Cache-Control", "no-cache");
          request.xmlHttp.setRequestHeader("Pragma", "no-cache");
          request.xmlHttp.setRequestHeader("Expires", "-1");
          request.xmlHttp.setRequestHeader("Connection", "close");
        }

        request.xmlHttp.onreadystatechange = function() {//Call a function when the state changes.
          if(request.xmlHttp.readyState == 4 ) {
                     if(request.xmlHttp.status == 200){
                       request.responseText = request.xmlHttp.responseText;
                       if(request.responseText.indexOf("<?xml")>=0){
                         request.responseType="xml";
                         var aa = request.loadXMLString(request.responseText);
                         request.xmlDoc = aa.documentElement;
                       }else{
                         request.responseType="text";
                       }
                       if(request.asyn==true){
                         if(request.responseType=="text"){
                           request.callBack(request.responseText);
                         }else{
                           request.callBack(request.xmlDoc);
                         }
                       }
                     }else{
                          request.errText = request.xmlHttp.status+":"+request.xmlHttp.statusText;
                     }
                     delete request.xmlHttp;
                     request.dataString = "";
                     if(loadTip){
                        loadTip.style.display="none";
                     }
          }
        }

        if(method.toUpperCase()=="GET"){
          request.xmlHttp.send(null);
        }else{
          request.xmlHttp.send(params);
        }
      }
    }catch(e){
      request.errText = request.xmlHttp.status+":"+request.xmlHttp.statusText;
    }
}
//set asyn
JWF_AJAX.prototype.setAsyn = function(asy){
  this.asyn = asy;
}
//set callback func
JWF_AJAX.prototype.setCallBack = function(callbackFunc){
  this.callBack = callbackFunc;
}


JWF_AJAX.prototype.sendAction = function(url,method,data,action){
  this.sendData(url,method,data+(data==""?"":"&")+"action="+action);
}
//func format:getData(const|var|func,....)
JWF_AJAX.prototype.callFunc = function(func){
  var p1 = func.indexOf("(");
  var p2 = func.indexOf(")");
  var data = false;
  if(p1>0 && p2>0 && p2>p1){
    var fname = func.substring(0,p1);
     data = "action=callFunc&func_name="+fname;
    if(p1+1!=p2){
      var param = func.substring(p1+1,p2);
      var params = param.split(",");
      for(var i=0;i<params.length;i++){
        data += "&func_param="+eval(params[i]);
      }
    }
  }else{
    data = "action=callFunc&func_name="+fname;
  }
  if(data){
    var u = document.URL;
    if(u.indexOf("?")>0){
            u = u.substring(0,u.indexOf("?"));
    }
    this.sendData(u,"post",data);
  }
}
/*---------------------------------------------------------------
下面的方法在sendData之后调用,用于获取页面某一表达式的值
如果asyn=true,那么下面函数必须在callBack function内部调用
*/
JWF_AJAX.prototype.getIniValue = function(id) {
  if(this.xmlDoc){
    var x=this.xmlDoc.getElementsByTagName("ini")
    return this.getValue(x,id);
  }
  return "";
}
JWF_AJAX.prototype.getEditValue = function(id) {
  if(this.xmlDoc){
    var x=this.xmlDoc.getElementsByTagName("edit")
    return this.getValue(x,id);
  }
  return "";
}
//国际化标签
JWF_AJAX.prototype.getMessage = function(id) {
  if(this.xmlDoc){
    var x=this.xmlDoc.getElementsByTagName("message")
    return this.getValue(x,id);
  }
  return "";
}
JWF_AJAX.prototype.getDataList = function(id) {
  if(this.xmlDoc){
    var x=this.xmlDoc.getElementsByTagName("datalist")
    return this.getValue(x,id);
  }
  return "";
}
JWF_AJAX.prototype.getFuncValue = function(id) {
  if(this.xmlDoc){
    var x=this.xmlDoc.getElementsByTagName("func")
    return this.getValue(x,id);
  }
  return "";
}
JWF_AJAX.prototype.getUrl = function(id) {
  if(this.xmlDoc){
    var x=this.xmlDoc.getElementsByTagName("url")
    return this.getValue(x,id);
  }
  return "";
}
JWF_AJAX.prototype.getCache = function(id) {
  if(this.xmlDoc){
    var x=this.xmlDoc.getElementsByTagName("cache")
    return this.getValue(x,id);
  }
  return "";
}
JWF_AJAX.prototype.getSessionValue = function(id) {
  if(this.xmlDoc){
    var x=this.xmlDoc.getElementsByTagName("session")
    return this.getValue(x,id);
  }
  return "";
}
JWF_AJAX.prototype.getParameter = function(id) {
  if(this.xmlDoc){
    var x=this.xmlDoc.getElementsByTagName("parameter")
    return this.getValue(x,id);
  }
  return "";
}
JWF_AJAX.prototype.getContext = function(id) {
  if(this.xmlDoc){
    var x=this.xmlDoc.getElementsByTagName("context")
    return this.getValue(x,id);
  }
  return "";
}
JWF_AJAX.prototype.getImport = function(id) {
  if(this.xmlDoc){
    var x=this.xmlDoc.getElementsByTagName("import")
    return this.getValue(x,id);
  }
  return "";
}
JWF_AJAX.prototype.getTemplate = function(id) {
  if(this.xmlDoc){
    var x=this.xmlDoc.getElementsByTagName("template")
    return this.getValue(x,id);
  }
  return "";
}
JWF_AJAX.prototype.getVelocity = function(id) {
  if(this.xmlDoc){
    var x=this.xmlDoc.getElementsByTagName("velocity")
    return this.getValue(x,id);
  }
  return "";
}
JWF_AJAX.prototype.getProperty = function(id) {
  if(this.xmlDoc){
    var x=this.xmlDoc.getElementsByTagName("prop")
    return this.getValue(x,id);
  }
  return "";
}
JWF_AJAX.prototype.getAttribute = function(id) {
  if(this.xmlDoc){
    var x=this.xmlDoc.getElementsByTagName("attribute")
    return this.getValue(x,id);
  }
  return "";
}
JWF_AJAX.prototype.getStyle = function(id) {
  if(this.xmlDoc){
    var x=this.xmlDoc.getElementsByTagName("style")
    return this.getValue(x,id);
  }
  return "";
}
JWF_AJAX.prototype.getTotal = function(id) {
  if(this.xmlDoc){
    var x=this.xmlDoc.getElementsByTagName("total")
    return this.getValue(x,id);
  }
  return "";
}
JWF_AJAX.prototype.getExp = function(id) {
  if(this.xmlDoc){
    var x=this.xmlDoc.getElementsByTagName("exp")
    return this.getValue(x,id);
  }
  return "";
}
JWF_AJAX.prototype.getActionErrors = function() {
  if(this.xmlDoc){
    var x=this.xmlDoc.getElementsByTagName("error")
    return this.getValue(x,"logic");
  }
  return "";
}
JWF_AJAX.prototype.getSuccessPage = function() {
  if(this.xmlDoc){
    var x=this.xmlDoc.getElementsByTagName("forward")
    return this.getValue(x,"success");
  }
  return "";
}
JWF_AJAX.prototype.getFailPage = function() {
  if(this.xmlDoc){
    var x=this.xmlDoc.getElementsByTagName("forward")
    return this.getValue(x,"fail");
  }
  return "";
}
JWF_AJAX.prototype.getPaging = function(id) {
  if(this.xmlDoc){
    var x=this.xmlDoc.getElementsByTagName("paging")
    return this.getValue(x,id);
  }
  return "";
}
//--------------------------------------------------------
JWF_AJAX.prototype.getValue = function(x,id) {
  for (var i=0;x!=null&&i<x.length;i++)
  {
    if(unescape(x[i].getAttribute("id"))==id){
      if(x[i].childNodes[0]){
              var v = x[i].childNodes[0].nodeValue;
              if(v!="")v = unescape(v);
              return   v;
      }
    }
  }
  return "";
}
//下面的方法在sendData之后调用,用于获取页面某一表达式的值
JWF_AJAX.prototype.pagingList = function(pageid){
  this.setTBody(pageid);
  this.setPaging();
}
JWF_AJAX.prototype.setTBody = function(pageid){
      var tbody = document.getElementById(pageid);
      var d = this.getDataList("list.mark");
      if(d=="")d = "&nbsp;";
      tbody.parentNode.outerHTML  = tbody.parentNode.outerHTML.replace(tbody.innerHTML,d);
}
JWF_AJAX.prototype.setPaging = function(){
     document.getElementById("list.pages").innerHTML = this.getPaging("list.pages");
     document.getElementById("list.records").innerHTML = this.getPaging("list.records");
     document.getElementById("list.turn").innerHTML = this.getPaging("list.turn");
}
//获取form需要提交的数据,组成配对
JWF_AJAX.prototype.addParam = function(name, value) {
        this.dataString += (this.dataString.length > 0 ? "&" : "")
            + name + "="//escape(name).replace(/\+/g, "%2B")
            + value;//escape(value ? value : "").replace(/\+/g, "%2B")
}

JWF_AJAX.prototype.getFormData = function (form) {
    var elemArray = form.elements;
    for (var i = 0; i < elemArray.length; i++) {
        var element = elemArray[i];
        var elemType = element.type.toUpperCase();
        var elemName = element.name;
        if (elemName) {
            if (elemType == "TEXT" || elemType == "TEXTAREA"  || elemType == "PASSWORD" || elemType == "HIDDEN")
                this.addParam(elemName, element.value);
            else if (elemType == "CHECKBOX" && element.checked)
                this.addParam(elemName, element.value ? element.value : "On");
            else if (elemType == "RADIO" && element.checked)
                this.addParam(elemName, element.value);
            else if (elemType.indexOf("SELECT") != -1)
                for (var j = 0; j < element.options.length; j++) {
                    var option = element.options[j];
                    if (option.selected)
                        this.addParam(elemName,option.value ? option.value : option.text);
                }
        }
    }
}
JWF_AJAX.prototype.forward = function () {
  var spage = this.getSuccessPage();
  var fpage = this.getFailPage();
  if(spage!=""){
    location.replace(spage);
  }else if(fpage!=""){
    location.replace(fpage);
  }
}
//提交数据
JWF_AJAX.prototype.submitForm = function (form) {

    var method = form.method ? form.method.toUpperCase() : "GET";
    var action = form.action ? form.action : document.URL;
    this.getFormData(form);
    var data = this.dataString;

    var url = action;
    if (data && method == "GET"){
       if(url.endsWith("?")||url.endsWith("&")){
         url += data;
       }else if(url.indexOf("?")>=0){
         url += "&" + data;
       }else{
         url += "?" + data;
       }
    }
    this.sendData(url,method,data);

}

var jwf_ajax = new JWF_AJAX();
JWF_AJAX.prototype.loadXMLUrl = function (docUrl){
   var doc = false;
    if (window.ActiveXObject){//Internet Explorer
        var ActiveIds = ['MSXML2.XMLDOM', 'Microsoft.XMLDOM', 'MSXML.XMLDOM', 'MSXML3.XMLDOM'];
        for (var len = ActiveIds.length, i = 0; i < len; i++){
            var id = ActiveIds[i];
            try{
                doc = new ActiveXObject(id);
                doc.async = false;
                doc.setProperty('SelectionLanguage', 'XPath');
                doc.load(docUrl);
                break;
            }catch (e){}finally{
                if (doc && doc.parseError && doc.parseError.errorCode != 0){
                    this.errText = doc.parseError.reason+docUrl;
                }
            }
        }
    }else if (document.implementation && document.implementation.createDocument) {
        // This is the W3C standard way to do it
        doc = document.implementation.createDocument("","", null);
        doc.load(docUrl);
    }
    return doc;
}

JWF_AJAX.prototype.loadXMLString = function (xmlString){
    var doc = false;
    //parse xmlString
    var sp = xmlString.indexOf("<?xml");
    if(sp>0){
        xmlString = xmlString.substring(sp,xmlString.length);
    }
    var ep = xmlString.indexOf("</data>");
    if( (ep+7)!=xmlString.length){
      xmlString = xmlString.substring(0,ep+7);
    }
    if (window.ActiveXObject){//Internet Explorer
        var ActiveIds = ['MSXML2.XMLDOM', 'Microsoft.XMLDOM', 'MSXML.XMLDOM', 'MSXML3.XMLDOM'];
        for (var len = ActiveIds.length, i = 0; i < len; i++){
            var id = ActiveIds[i];
            try{
                doc = new ActiveXObject(id);
                doc.async = false;
                doc.setProperty('SelectionLanguage', 'XPath');
                doc.loadXML(xmlString);
                break;
            }catch (e){}finally{
                if (doc && doc.parseError && doc.parseError.errorCode != 0){
                    this.errText = doc.parseError.reason+xmlString;
                }
            }
        }
    }else if (typeof DOMParser != 'undefined'){
        var parser = new DOMParser();
        doc = parser.parseFromString(xmlString, 'text/xml');
        if (doc.documentElement.nodeName == 'parsererror'){
            this.errText = doc.documentElement.firstChild.nodeValue;
        }
    }else{ return false; }

    return doc;
}


