/*
 * Copyright 2006 OST-SYSTEMS. All rights reserved.
 */

function XMLHttpRequestFirefox() {
  this.request = new top.window.XMLHttpRequest();
  this.allowSend = false;
  this.asynch = true;
  this.readyState = 0;
  this.onreadystatechange = null;
  this.onload = null;
  this.status = 0;
  this.statusText = null;
  this.responseXML = null;
  this.responseText = null;
  
  var defaultRequestHandler = function(_self) {
    if (window.netscape) {
      netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
      netscape.security.PrivilegeManager.enablePrivilege("UniversalFileRead");
    }
    _self.readyState = _self.request.readyState;
    if (_self.readyState == 4) {
      try {
        _self.status = _self.request.status;
        _self.statusText = _self.request.statusText;
        _self.responseXML = _self.request.responseXML;
        _self.responseText = _self.request.responseText;
      }
      catch (e) {
        _self.status = 500;
        _self.statusText = "Connection refused";        
      }  
      if (_self.onreadystatechange != null) {
        _self.onreadystatechange();
      }
      if (_self.onload != null) {
        event = new Object();
        event.target = _self.request;
        _self.onload(event);
      }
    }    
  }
  
  var setRequestHandler = function(_self) {
    _self.request.onreadystatechange = function() {
      defaultRequestHandler(_self);
    }  
  }
  
  this.checkOpen = function(url) {
    var value = widgetsHelper.getWidgetValue(this.widgetId, "HasNetworkAccess");
    if (value == null || !eval(value)) {
      return false;
    }   
    value = widgetsHelper.getWidgetValue(this.widgetId, "HectorNetworkAccess");
    if (value != null && !eval(value)) {
      return false;
    }   
    var index = url.indexOf("/", 8);
    if (index > 0) {
      url = url.substring(0, index);
    }
    /*
    value = widgetsHelper.getWidgetValue(this.widgetId, "NetWorkURL:" + url);
    var allowed = false;
    if (value != null) {
      allowed = eval(value);
    }
    else {  
      allowed = confirm("Accessing " + url + " ?");
      if (confirm("Save Choice for " + url + " ?")) {
        widgetsHelper.storeWidgetKey(this.widgetId, "NetWorkURL:" + url, "" + allowed);
      }  
    }
    return allowed;
    */
    return true;
  }

  this.open = function(method, url, asynch) {
    addError("Open URL: " + url);
    if (window.netscape) {
      netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
      netscape.security.PrivilegeManager.enablePrivilege("UniversalFileRead");
    }
    setRequestHandler(this);  
    try {
      if (url.indexOf("http") == 0 || url.indexOf("ftp") == 0) {
        if (!this.checkOpen(url)) {
          addError("Open blocked");
          return;          
        }
        try {
          this.allowSend = true;
          if (asynch != null) {
            this.request.open(method, url, asynch);
            this.asynch = asynch;
            return;
          }
          return this.request.open(method, url);
        }
        catch (e1) {   
          addError("Using Proxy:" + e1);
          var result = null; 
          if (asynch != null) {
            result = this.request.open(method, "http://localhost:8080/Hector/Proxy", asynch);
            this.asynch = asynch;
          }
          else {
            result = this.request.open(method, "http://localhost:8080/Hector/Proxy");
          }  
          this.request.setRequestHeader("url", url);
          return result;
        }  
      }
      else {
        addError("Local dir: " + this.path + url);
        if (asynch != null) {
          var result = this.request.open(method, this.path + url, asynch);
          this.asynch = asynch;
          return result;
        }  
        return this.request.open(method, this.path + url);
      }
    }  
    catch(e) {
      addError("Open failed: " + e);
      throw e;
    }
  }
  
  this.abort = function() {
    return this.request.abort();
  }
  
  this.overrideMimeType = function(type) {
    if (this.request.overrideMimeType) {
	    return this.request.overrideMimeType(type);
	  }
  }
  
  this.setRequestHeader = function(key, value) {
    try {
      this.request.setRequestHeader(key, value);
    }
    catch (e) {
      parent.addError("setRequestHeader failed: " + e);
    }  
  }
  
  this.send = function(param) {
    try {
      if (window.netscape) {
        netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
        netscape.security.PrivilegeManager.enablePrivilege("UniversalFileRead");
      }      
      if (param) {
        var result = this.request.send(param);
        if (!this.asynch) {
          defaultRequestHandler(this);
        }
        return result;
      }
      var result = this.request.send(null);  
      if (!this.asynch) {
        defaultRequestHandler(this);
      }
      return result;  
    }
    catch (e) {
      parent.addError("Send Error: " + e);
      //throw e;
    }  
  }
  
  this.getResponseHeader = function(key) {
    return this.request.getResponseHeader(key);
  }  

  this.getAllResponseHeaders = function() {
    return this.request.getAllResponseHeaders(key);
  }
}

