[ Index ]

PHP Cross Reference of JPSpan 0.4 (beta)

title

Body

[close]

/JPSpan/js/util/ -> pseudoxmlhttp.js (source)

   1  // $Id: pseudoxmlhttp.js,v 1.1 2004/11/17 15:55:03 harryf Exp $
   2  // Status: right now - hopelessly flawed - do not use
   3  // Many ideas taken from JSRS: http://www.ashleyit.com/rs/
   4  
   5  function PseudoXmlHttpRequest() {
   6  
   7      if (!document.createElement) {
   8          throw "document.createElement not supported by "+navigator.userAgent;
   9      };
  10      
  11      this.__browser = this.__getBrowser();
  12  
  13      this.__initContainer();
  14  
  15  
  16  };
  17  
  18  PseudoXmlHttpRequest.prototype = {
  19  
  20      onreadystatechange: function() {
  21          return;
  22      },
  23      
  24      readyState: 1,
  25      
  26      responseText: '',
  27      
  28      status: '200',
  29      
  30      statusText: 'OK',
  31      
  32      abort: function() {
  33          window.clearInterval(this.__responsePollId);
  34          window.clearTimeout(this.__timeoutId);
  35      },
  36      
  37      addEventListener: function() {
  38          throw "addEventListener not supported by PseudoXmlHttpRequest";
  39      },
  40      
  41      dispatchEvent: function() {
  42          throw "dispatchEvent not supported by PseudoXmlHttpRequest";
  43      },
  44      
  45      getAllResponseHeaders: function () {
  46          return this.__responseHeaders;
  47      },
  48      
  49      getResponseHeader: function(name) {
  50          return this.__responseHeaders[name.toLowerCase()];
  51      },
  52      
  53      open: function(method, url, callType) {
  54      
  55          this.readyState = 1;
  56          this.responseText = '';
  57          
  58          method = method.toUpperCase();
  59          
  60          if ( method == 'GET' || method == 'POST' ) {
  61              this.__method = method;
  62          } else {
  63              throw "HTTP method "+method+" not supported";
  64          };
  65          
  66          this.__url = url;
  67  
  68          if ( callType == false ) {
  69              throw "PseudoXmlHttpRequest does not support synchronous calls";
  70          };
  71  
  72      },
  73      
  74      overrideMimeType: function() {
  75          throw "overrideMimeType not supported by PseudoXmlHttpRequest";
  76      },
  77      
  78      removeEventListener: function() {
  79          throw "removeEventListener not supported by PseudoXmlHttpRequest";
  80      },
  81      
  82      send: function(body) {
  83      
  84          this.readyState = 1;
  85          this.responseText = '';
  86          
  87          var form = '';
  88          
  89          // Need to check request headers here for Content-Type: application/x-www-form-urlencoded
  90          if ( this.__method == 'POST' ) {
  91              var args = this.__encodedStringToArgs(body);
  92              form = this.__createRequestForm(args);
  93          } else {
  94              form = this.__createRequestForm();
  95          };
  96          
  97          var requestDoc = (this.__browser == "IE" ) 
  98              ? this.__requestFrame.document : this.__requestFrame.contentDocument;
  99          
 100          requestDoc.open();
 101          requestDoc.write(form);
 102          requestDoc.close();
 103          requestDoc.forms['PseudoXmlHttpForm'].submit();
 104          
 105          var responseDoc = (this.__browser == "IE" ) 
 106              ? this.__responseFrame.document : this.__responseFrame.contentDocument;
 107          var self = this;
 108          
 109          this.__responsePollId = window.setInterval(function() {
 110              try {
 111                  if ( responseDoc.firstChild.innerText.length > 0 ) {
 112                      self.__handleResponse(self,responseDoc.firstChild.innerText);
 113                  }
 114              } catch(e) {}
 115          }, 200);
 116          
 117          this.__timeoutId = window.setTimeout(function() {
 118              window.clearInterval(self.__responsePollId)
 119          }, 30000); // Timeout should be configurable
 120  
 121      },
 122      
 123      setRequestHeader: function(name, value) {
 124          this.__requestHeaders[name.toLowerCase()] = value;
 125      },
 126      
 127      //----------------------------------------------------------------------------------------
 128      
 129      __url: null,
 130      
 131      __method: 'GET',
 132      
 133      __requestHeaders: new Object(),
 134      
 135      __responseHeaders: new Object(),
 136      
 137      __browser: null,
 138      
 139      __requestFrame: null,
 140      
 141      __responseFrame: null,
 142      
 143      __responsePollId: null,
 144      
 145      __timeoutId: null,
 146      
 147      __getBrowser: function() {
 148  
 149          if (document.layers) return "NS";
 150          if (document.all) {
 151              // But is it really IE?
 152              // convert all characters to lowercase to simplify testing
 153              var agt=navigator.userAgent.toLowerCase();
 154              var is_opera = (agt.indexOf("opera") != -1);
 155              var is_konq = (agt.indexOf("konqueror") != -1);
 156              if(is_opera) {
 157                  return "OPR";
 158              } else {
 159                  if(is_konq) {
 160                      return "KONQ";
 161                  } else {
 162                      // Really is IE
 163                      return "IE";
 164                  }
 165              }
 166          }
 167          if (document.getElementById) return "MOZ";
 168          return "OTHER";
 169      },
 170      
 171      __initContainer: function() {
 172          switch( this.__browser ) {
 173  
 174              // -------------------------------------------------------------------------------
 175              case 'NS':
 176                  this.__requestFrame = new Layer(100);
 177                  this.__requestFrame.name = 'PseudoXmlHttpRequestFrame';
 178                  this.__requestFrame.visibility = 'hidden';
 179                  this.__requestFrame.clip.width = 100;
 180                  this.__requestFrame.clip.height = 100;
 181                  
 182                  this.__responseFrame = new Layer(100);
 183                  this.__responseFrame.name = 'PseudoXmlHttpResponseFrame';
 184                  this.__responseFrame.visibility = 'hidden';
 185                  this.__responseFrame.clip.width = 100;
 186                  this.__responseFrame.clip.height = 100;
 187                  break;
 188  
 189              // -------------------------------------------------------------------------------
 190              case 'IE':
 191                  document.body.insertAdjacentHTML( 'afterBegin',
 192                      '<span id="PseudoXmlHttpSpan"></span>' );
 193                  var span = document.all['PseudoXmlHttpSpan'];
 194                  var reqFrame = '<iframe name="PseudoXmlHttpRequestFrame" src=""></iframe>';
 195                  var resFrame = '<iframe name="PseudoXmlHttpResponseFrame" src=""></iframe>';
 196                  span.innerHTML = reqFrame;
 197                  span.innerHTML += resFrame;
 198                  span.style.display = 'none';
 199                  this.__requestFrame = window.frames['PseudoXmlHttpRequestFrame'];
 200                  this.__responseFrame = window.frames['PseudoXmlHttpResponseFrame'];
 201                  break;
 202  
 203              // -------------------------------------------------------------------------------
 204              case 'MOZ':  
 205              case 'OPR':  
 206              case 'KONQ':
 207              
 208                  var span = document.createElement('SPAN');
 209                  span.id = "PseudoXmlHttpSpan";
 210                  span.style.visibility = 'hidden';
 211                  
 212                  var reqFrame = document.createElement('IFRAME');
 213                  reqFrame.name = 'PseudoXmlHttpRequestFrame';
 214                  reqFrame.id = 'PseudoXmlHttpRequestFrame';
 215                  
 216                  var resFrame = document.createElement('IFRAME');
 217                  resFrame.name = 'PseudoXmlHttpResponseFrame';
 218                  resFrame.id = 'PseudoXmlHttpResponseFrame';
 219                  resFrame.onLoad = 'alert("Got here");';
 220                  
 221                  if ( this.__browser == 'OPR' ) {
 222                  
 223                      reqFrame.width = 0;
 224                      reqFrame.height = 0;
 225                      resFrame.width = 0;
 226                      resFrame.height = 0;
 227                      
 228                  } else if ( this.__browser == 'KONQ' ) {
 229                  
 230                      span.style.display = none;
 231                      reqFrame.style.display = none;
 232                      reqFrame.style.visibility = hidden;
 233                      reqFrame.height = 0;
 234                      reqFrame.width = 0;
 235                      resFrame.style.display = none;
 236                      resFrame.style.visibility = hidden;
 237                      resFrame.height = 0;
 238                      resFrame.width = 0;
 239                      
 240                  }
 241                  
 242                  document.body.appendChild( span );
 243  
 244                  span.appendChild(reqFrame);
 245                  span.appendChild(resFrame);
 246                  
 247                  this.__requestFrame = reqFrame;
 248                  this.__responseFrame = resFrame;
 249                  
 250                  break;
 251          }
 252      },
 253      
 254      __createRequestForm: function() {
 255      
 256          var params = new Object();
 257  
 258          if ( arguments[0] ) {
 259              params = arguments[1];
 260          }
 261          
 262          var form = '';
 263          form += '<html><body>';
 264          form += '<form name="PseudoXmlHttpForm" action="'+this.__url+'"';
 265          form += ' method="'+this.__method+'" target="PseudoXmlHttpResponseFrame"';
 266          if ( this.__requestHeaders['accept'] ) {
 267              form += ' accept="'+this.__requestHeaders['accept']+'"';
 268          }
 269          if ( this.__requestHeaders['accept-charset'] ) {
 270              form += ' accept-charset="'+this.__requestHeaders['accept-charset']+'"';
 271          }
 272          if ( this.__method == 'POST' && this.__requestHeaders['content-type'] ) {
 273              form += ' enctype="'+this.__requestHeaders['content-type']+'"';
 274          }
 275          form += '>';
 276          
 277          for ( prop in params ) {
 278              if ( prop == 'var_dump' || prop == 'toPHP' ) {
 279                  continue;
 280              };
 281              form += '<input type="hidden" name="'+prop+'"';
 282              form += 'value="'+params[prop].replace(/'"'/g, '\\"')+'">';
 283          }
 284          
 285          form += '</form></body></html>';
 286          
 287          return form;
 288      },
 289      
 290      __encodedStringToArgs: function(string) {
 291          var fields = string.split('&');
 292          var args = new Object();
 293          for (var i=0;i<fields.length;i++) {
 294              var arg = fields[i].split('=');
 295              args[arg[0]] = arg[1];
 296          };
 297          return args;
 298      },
 299      
 300      __handleResponse: function(self, response) {
 301          window.clearInterval(self.__responsePollId);
 302          window.clearTimeout(self.__timeoutId);
 303          if ( self.__responseFrame.lastModified ) {
 304              self.__responseHeaders['last-modified'] = self.__responseFrame.lastModified;
 305          }
 306          self.__responseHeaders['content-length'] = response.length;
 307          self.readyState = 4;
 308          self.responseText = response;
 309          self.onreadystatechange();
 310      }
 311  
 312  }


Generated: Fri Nov 26 11:42:46 2004 Cross-referenced by PHPXref 0.6