docs: function readyStateChangeHandler(readyState){
      var xhr = this.xhr;
  
      // reset send delay timer
      this.sendDelayTimer_ = clearTimeout(this.sendDelayTimer_);
  
      if (!xhr)
        return;
  
      if (typeof readyState != 'number')
        readyState = xhr.readyState;
  
      // BUGFIX: IE & Gecko fire OPEN readyState twice
      if (readyState == this.prevReadyState_)
        return;
  
      this.prevReadyState_ = readyState;
  
      /** @cut */ if (this.debug)
      /** @cut */   basis.dev.log('State: (' + readyState + ') ' + ['UNSENT', 'OPENED', 'HEADERS_RECEIVED', 'LOADING', 'DONE'][readyState]);
  
      // dispatch self event
      this.emit_readyStateChanged(readyState);
  
      if (readyState == STATE_DONE)
      {
        // clean event handler
        xhr.onreadystatechange = basis.fn.$undef;
        // xhr.onabort = basis.fn.$undef;
  
        // delay process response since abort event fires after readyStateChanged
        this.clearTimeout();
        this.timer_ = setTimeout(processResponse.bind(this), 10);
  
        return;
      }
  
      // set new state
      this.setState(STATE.PROCESSING);
    }