//-----------------------------------------------------------------
//	oXMLHTTP
//-----------------------------------------------------------------
//  Author:       Brent Michelsen
//	Description: 	This class is designed to instantiate the most recent
//                version of the MSXML.dll or use the XMLHttpRequest if IE7.
//
// Parameter 1:	url - string url of the xml file to load
//-----------------------------------------------------------------	
function oXMLHTTP()
{
    var me = this;
    this.debug = false;
    this.doc = null;
    this.docLast = null;
    this.oXML = null;;
    this.log = null;
    
    this.interval = 0;
    this.url = null;
    this.type = "GET";
    this.postData = null;
    this.uid = null;
    this.pwd = null;
    
    this.timer = new Array();
    
    this.callBack = null;
    this.responseType = "text/xml";
    
    this.totalTime = function(){return(me.timer[3].getUTCMS() - me.timer[0].getUTCMS());}
    
    
    this.compare = function()
    {
      var T1 = new Date();
      
      if(me.docLast == null)
      {
         me.docLast = me.doc;
   //      alert("doc null");
         return;
      }
      
      var saveNew = me.doc;      
      var dNew = me.doc.documentElement;
      var nodes = me.docLast.documentElement.selectNodes("//d");
      
      var n = null;
      var o = null;
            
      for(var c=0;c<nodes.length;c++)
      {
         n = nodes.item(c);
         o = dNew.selectNodes("//d[@id='" + n.getAttribute("id") + "'][@value='" + n.getAttribute("value") + "']");
         if(o.length)
         {
            o = o.item(0);
            o.parentNode.removeChild(o);
         }
         else
         {
            me.log.write("CHANGE(" + n.getAttribute("id") + ")");
         }
      }
      me.docLast = me.doc;
      me.doc = saveNew;
//      alert(saveNew.xml);
      
      var T2 = new Date();
      var T3 = parseFloat(T2-T1);
      
      if(me.debug)
      {
         me.log.write("compare(" + T3 + ")");
      }
      
      return;
    };
    
    this.runCallBack = function()
    {
      if(me.callBack)
      {
         if(me.debug == false)
         {
            me.callBack(me);
         }
         else
         {
            if(me.errors)
            {
               try{
                  me.callBack(me);
               }
               catch(err){
                  if(me.debug)
                  {
                     me.log.write("ERROR: Call back function.");
                  }
               }
            }
            else
            {
               me.callBack(me);
            }
         }
         if(!me.interval)
         {
            me = null;
            return;
         }
 //        alert("setTimeout");
         setTimeout(me.open, me.interval);
      }
    };
    
    this.open = function()
    {
    
      me.docLast = me.doc;
      me.doc = null;
      
      if(!me.url)
      {
         if(me.debug)
         {
            me.log.write("Invalid url - Aborting GET");
         }
         return;
      }
      
      me.oXML=null;
                  
      //Create XML HTTP object
      if(!me.oXML)
      {
        me.oXML = me.createXMLHttp();
      }
      
      if(!me.oXML)
      {
        if(me.debug)
        {
         me.log.write("   - Aborting GET");
        }
        return;
      }
      
      var strURL = me.url;
      //Look for QS data      
      if(me.url.indexOf('?') > 0)
      {
        strURL += "&";
      }
      else
      {
         strURL += "?";
      }
      //Add sid to avoid CACHED pages
      strURL += "sid=" + parseInt(Math.random()*10000000000);
      
      if(me.debug)
      {
         me.log.write("open(<a href=\"" + strURL + "\">" + strURL + "</a>) requestType(" + me.type + ")");
      }
      
      me.oXML.onreadystatechange = me.waitOpen;
      
      window.status = "Downloading XML";
      
      me.timer[0] = new Date();
      if(me.uid & me.pwd)
      {
         if(me.debug)
         {
            me.log.write("uid(" + me.uid + ") pwd(" + me.pwd + ")");
         }
        me.oXML.open(me.type, strURL, true, me.uid, me.pwd);
      }
      else
      {
        me.oXML.open(me.type, strURL, true);
      }
   
      return;
    };
    
    this.waitOpen = function()
    {
      if(me.oXML.readyState == 1)
      {
         me.timer[1] = new Date();
         if(me.debug)
         {
            me.log.write("   - Connection Established.");
            me.log.write("   - Sending...");
         }
         me.oXML.onreadystatechange = me.checkStatus;
         me.oXML.send(me.postData);
         me.timer[2] = new Date();
      }
      else
      {
        me.abort();
        return;
      }
      return;
    };
    
    this.abort = function()
    {
      if(!me.oXML){return;}
      if(me.debug)
      {
         me.log.write("   - Aborting GET");
      }
      
      me.oXML.abort();
      return;
    };
  
		this.checkStatus = function()
    {
      if(!me.oXML)
      {
        me.failed();
        return;
      }
      
      if(me.debug)
      {
         me.log.write("   - oXMLHTTP state change(" + me.oXML.readyState + ")");
      }
      if(parseInt(me.oXML.readyState) != 4){return;}
 
      me.timer[3] = new Date();
      
      //Check HTTP status
      switch(me.oXML.status)
      {
         case 200:
            if(me.debug)
            {
               me.log.write("   - HTTP(" + me.oXML.status + ")");
            }
            break;
        
         case 400:
         case 401:
         case 403:
         default:
            if(me.debug)
            {
               me.log.write("   - Download FAILED");
               me.log.write("   - HTTP status(" + me.oXML.status + ") - " + me.oXML.statusText );
               me.log.write("headers(" + me.oXML.getAllResponseHeaders() + ")");
            }
          return;
          break;
      }
      
      //Check for XML Content type      
      if(me.oXML.getResponseHeader("Content-Type") != me.responseType)
      {
         if(me.debug)
         {
            me.log.write("ERROR: Expected document type(" + me.responseType + ") != actual(" + me.oXML.getResponseHeader("Content-Type") + ")");
            me.log.write("headers(" + me.oXML.getAllResponseHeaders() + ")");
         }
         me.abort();
         return;
      }
      
      //Get the doc
      me.doc = me.oXML.responseXML;
      
      //Check for parsing errors
      if(me.doc.parseError.errorCode)
      {
         if(me.debug)
         {
            me.log.write("   - ERROR: Parsing XML document");
            me.log.write("   - CODE(" + me.doc.parseError.errorCode + ") - " + me.doc.parseError.reason );
         }
        return;
      }
      
      if(me.debug)
      {
         me.log.write("SUCCESSFUL DOWNLOAD");
         me.log.write("headers(" + me.oXML.getAllResponseHeaders() + ")");
      }
      
      //-----------------------------------------------------------------
      // This section prints out the timers
      if(me.debug)
      {
         me.log.write("Connection Open(" + (me.timer[1].getUTCMS() - me.timer[0].getUTCMS()) + " ms)");
         me.log.write("Send data(" + (me.timer[2].getUTCMS() - me.timer[1].getUTCMS()) + " ms)");
         me.log.write("get response(" + (me.timer[3].getUTCMS() - me.timer[2].getUTCMS()) + " ms)");
         me.log.write("total time(" + (me.timer[3].getUTCMS() - me.timer[0].getUTCMS()) + " ms)");
      }
      //-----------------------------------------------------------------
      
      //Success Call the Call back function
      if(me.callBack)
      {
         if(me.debug)
         {
            me.log.write("   - running call back");
         }
         setTimeout(me.runCallBack, 500);
      }
      return;
    };
    
    
    this.createXMLHttp = function()
    {
      if(typeof XMLHttpRequest != "undefined")
      {
         if(me.debug)
         {
            me.log.write("XMLHttpRequest object created.");
         }
         return(new XMLHttpRequest());
      }
      else
      {
         try{
            if(window.ActiveXObject)
            {
            
            
               var aVersions = new Array( "Microsoft.XMLHttp",
                                          "MSXML2.XMLHttp.5.0",
                                          "MSXML2.XMLHttp.4.0",
                                          "MSXML2.XMLHttp.3.0",
                                          "MSXML2.XMLHttp"
                                          );
        
               for(var i=0;i<aVersions.length;i++)
               {
                  var oXmlHttp = new ActiveXObject(aVersions[i]);
                  if(me.debug)
                  {
                     me.log.write("   - " + aVersions[i] + " object created.");
                  }
                  return(oXmlHttp);
               }
            }
         }
         catch(err){
            return(new ActiveXObject("Microsoft.XMLHTTP"));
         }     
      }
      
      
      if(me.debug)
      {
         me.log.write("ERROR: Browser does not support AJAX.");
      }
      return(null);
    };
	}
