if(typeof DomUtil=="undefined") throw new Error("page must reference util.js");

function HttpReadyStates()
{
  if(typeof HttpReadyStates.__initialized=="undefined")
  {
    HttpReadyStates.UNINITIALIZED=0;
    HttpReadyStates.LOADING=1;
    HttpReadyStates.LOADED=2;
    HttpReadyStates.INTERACTIVE=3;
    HttpReadyStates.COMPLETE=4;    
    HttpReadyStates.__initialized=true;
  }
} new HttpReadyStates(); // self initialize

function XmlDom()
{
  if(typeof XmlDom.__initialized=="undefined")
  {
    if(window.ActiveXObject)
    { // IE-specific
      XmlDom.prototype.createDocument=function()
      {
        var result=null;
        var signatures=["MSXML2.DOMDocument.5.0","MSXML2.DOMDocument.4.0","MSXML2.DOMDocument.3.0","MSXML2.DOMDocument","Microsoft.XmlDom"];
        for(var i=0;i<signatures.length;i++)
        {
          try
          {
            result=new ActiveXObject(signatures[i]);
          }
          catch(err)
          { // Ignore, try next activeX
          }
        }
        if(!result)throw new Error("XML DOM not supported on this browser");        
        return result;
      }            
    }
    else if(document.implementation&&document.implementation.createDocument)
    { // W3C Standard, leveled to simulate IE functionality
      Node.prototype.__defineGetter__("xml",function(){return new XMLSerializer().serializeToString(this,"text/xml");});
      Document.prototype.readyState=HttpReadyStates.UNINITIALIZED;
      Document.prototype.onreadystatechange=null;
      Document.prototype.__changeReadyState__=function(value)
      {
        this.readyState=value;
        if(typeof this.onreadystatechange=="function")
        {
          this.onreadystatechange();
        }
      }
      Document.prototype.__initError__=function()
      {
        this.parseError.errorCode=0;
        this.parseError.filepos=-1;
        this.parseError.line=-1;
        this.parseError.linepos=-1;
        this.parseError.reason=null;
        this.parseError.srcText=null;
        this.parseError.url=null;        
      }
      Document.prototype.__checkForErrors__=function()
      {
        if(this.documentElement.tagName=="parsererror")
        {
          var reerr=/>([\s\S]*?)Location:([\s\S]*?)Line Number (\d+), Column (\d+):<sourcetext>([\s\S]*?)(?:\-*\^)/;
          reerr.test(this.xml);
          this.parseError.errorCode=-999999;
          this.parseError.reason=RegExp.$1;
          this.parseError.url=RegExp.$2;
          this.parseError.line=parseInt(RegExp.$3);
          this.parseError.linepos=parseInt(RegExp.$4);
          this.parseError.srcText=RegExp.$5;
        }
      }
      Document.prototype.loadXML=function(xmlStr)
      {
        this.__initError__();
        this.__changeReadyState__(HttpReadyStates.LOADING);
        var parser=new DOMParser();
        var xmlDom=parser.parseFromString(xmlStr,"text/xml");
        while(this.firstChild)
        {
          this.removeChild(this.firstChild);
        }
        for(var i=0;i<xmlDom.childNodes.length;++i)
        {
          var node=this.importNode(xmlDom.childNodes[i],true);
          this.appendChild(node);
        }
        this.__checkForErrors__();
        this.__changeReadyState__(HttpReadyStates.COMPLETE);
      }
      Document.prototype.__load__=Document.prototype.load;
      Document.prototype.load=function(url)
      {
        this.__initError__();
        this.__changeReadyState__(HttpReadyStates.LOADING);
        this.__load__(url);
      }
      XmlDom.prototype.createDocument=function()
      {
        var result=document.implementation.createDocument("","",null);
        result.addEventListener("load",function(){
          this.__initError__();
          this.__changeReadyState__(HttpReadyStates.COMPLETE);
          },false);
        result.parseError={
          valueOf:function(){return this.errorCode;},
          toString:function(){return this.errorCode.toString();}
          };
        result.__initError__();
        return result;
      }
    }
    else
    {
      XmlDom.prototype.createDocument=function()
      {
        throw new Error("XML DOM not supported on this browser");        
      }
    }
    XmlDom.__initialized=true;
  }
}

if(typeof XMLHttpRequest=="undefined"&&window.ActiveXObject)
{
  function XMLHttpRequest()
  {
    var result=null;
    var signatures=["MSXML2.XMLHTTP.5.0","MSXML2.XMLHTTP.4.0","MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP","Microsoft.XMLHTTP"];
    for(var i=0;!result&&i<signatures.length;i++)
    {
      try
      {
        result=new ActiveXObject(signatures[i]);
      }
      catch(err)
      { // Ignore, try next activeX
      }
    }
    if(!result)throw new Error("XML HTTP not supported on this browser");        
    return result;
  }
}

function HttpResult(httpRequest,onsuccess,onfailure)
{
  this.request=(httpRequest)?httpRequest:null;
  this.onsuccess=(onsuccess)?onsuccess:null;
  this.onfailure=(onfailure)?onfailure:null;
  this.readyState=(this.request)?this.request.readyState:HttpReadyStates.UNINITIALIZED;  
  this.responseText=null;
  this.status=0;
  this.statusText=null;
  if(typeof HttpResult.__initialized=="undefined")
  {      
    HttpResult.prototype.getAllResponseHeaders=function()
    {
    }              
    HttpResult.prototype.getResponseHeader=function(headerName)
    {
    }              
    HttpResult.prototype.isComplete=function()
    {
      return this.readyState=HttpReadyStates.COMPLETE;
    }
    HttpResult.prototype.__setComplete__=function(status,statusText,resultText)
    {
      this.status=status;
      this.statusText=statusText;
      this.resultText=resultText;
      if(this.readyState==HttpReadyStates.COMPLETE)
      {
        if(this.status>=200&&this.status<=300)
        {
          if(this.onsuccess)this.onsuccess(this);
        }
        else if(this.onfailure)this.onfailure(this);
      }
    }    
    HttpResult.__initialized=true;
  }
}

function HttpUtil()
{
  if(typeof HttpUtil.__initialized=="undefined")
  {
    HttpUtil.prototype.appendUrlParam=function(url,name,value)
    {
      url+=(url.indexOf("?")==-1)?"?":"&";
      return url+encodeURIComponent(name)+"="+encodeURIComponent(value);
    }
    HttpUtil.prototype.appendPostParam=function(params,name,value)
    {
      if(params.length>0)
      {
        params+="&";
      }
      return params+encodeURIComponent(name)+"="+encodeURIComponent(value);      
    }
    if(typeof XMLHttpRequest=="object"||window.ActiveXObject)
    {      
      HttpUtil.prototype.get=function(url,onsuccess,onfailure)
      {
        if(typeof url!="string") throw new TypeError("url must be a string");
        if(typeof onsuccess!="function") throw new TypeError("onsuccess must be a function");        
        if(onfailure&&typeof onfailure!="function") throw new TypeError("onfailure must be a function");        
        var request=new XMLHttpRequest();
        var result=new HttpResult(request,onsuccess,onfailure);
        request.open("get",url,true);
        request.onreadystatechange=function()
          {
            result.readyState=request.readyState;
            if(request.readyState==HttpReadyStates.COMPLETE)
            {
              result.__setComplete__(request.status,request.statusText,request.responseText);
            }          
          }
        request.send(null);
        return result;
      }
      HttpUtil.prototype.post=function(url,params,onsuccess,onfailure)
      {
        var request=new XMLHttpRequest();
        var result=new HttpResult(request,onsuccess,onfailure);
        request.open("post",url,true);
        request.setRequestHeader("Content-Type","application/x-www-form-urlencoded");          
        request.onreadystatechange=function()
          {
            result.readyState=request.readyState;
            if(request.readyState==HttpReadyStates.COMPLETE)
            {
              result.__setComplete__(request.status,request.statusText,request.responseText);
            }          
          }
        request.send(params);
        return result;
      }
    }
    else if(navigator.javaEnabled()&&typeof java!="undefined"&&typeof java.net!="undefined")    
    {
      HttpUtil.prototype.get=function(url,callback,handback)
      {
        setTimeout(new function(){HttpUtil.__get__(url,callback,handback);});     
      }
      HttpUtil.prototype.__get__=function(url,callback,handback)
      {
        var jurl=new java.net.URL(url);
        var jstream=jurl.openStream();
        var jreader=new java.io.BufferedReader(new java.io.InputStreamReader(jstream));
        var responstText=new StringBuilder(), ln;
        while(ln=jreader.readLine())
        {
          responseText.append(ln).append("\n");
        }
        callback(responseText.toString(),handback);
        reader.close();
      }
      HttpUtil.prototype.post=function(url,params,callback,handback)
      {
        setTimeout(new function(){HttpUtil.__post__(url,params,callback,handback);});
      }
      HttpUtil.prototype.__post__=function(url,params,callback,handback)
      {
        var jurl=new java.net.URL(url);
        var jconn=jurl.openConnection();        
        jconn.setDoInput(true);
        jconn.setDoOutput(true);
        jconn.setUseCaches(false);
        jconn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");          
        var joutput=new java.io.DataOutputStream(jconn.getOutputStream());          
        joutput.writeBytes(params);
        joutput.flush();
        joutput.close();
        var responstText=new StringBuilder(), ln;
        var jinput=new java.io.DataInputStream(jconn.getInputStream());
        while(ln=jinput.readLine())
        {
          responseText.append(ln).append("\n");
        }
        callback(responseText.toString(),handback);
        jinput.close();
      }
    }
    HttpUtil.__initialized=true;
  }
}
var HttpUtil=new HttpUtil();

