docs: function( url, data, noEvents ) {
              var state, href, hash, popstateEvent,
                  isPopStateEvent = $.event.special.navigate.isPushStateEnabled();
  
              // Get the url as it would look squashed on to the current resolution url
              href = path.squash( url );
  
              // sort out what the hash sould be from the url
              hash = this.hash( url, href );
  
              // Here we prevent the next hash change or popstate event from doing any
              // history management. In the case of hashchange we don't swallow it
              // if there will be no hashchange fired (since that won't reset the value)
              // and will swallow the following hashchange
              if ( noEvents && hash !== path.stripHash(path.parseLocation().hash) ) {
                  this.preventNextHashChange = noEvents;
              }
  
              // IMPORTANT in the case where popstate is supported the event will be triggered
              //      directly, stopping further execution - ie, interupting the flow of this
              //      method call to fire bindings at this expression. Below the navigate method
              //      there is a binding to catch this event and stop its propagation.
              //
              //      We then trigger a new popstate event on the window with a null state
              //      so that the navigate events can conclude their work properly
              //
              // if the url is a path we want to preserve the query params that are available on
              // the current url.
              this.preventHashAssignPopState = true;
              window.location.hash = hash;
  
              // If popstate is enabled and the browser triggers `popstate` events when the hash
              // is set (this often happens immediately in browsers like Chrome), then the
              // this flag will be set to false already. If it's a browser that does not trigger
              // a `popstate` on hash assignement or `replaceState` then we need avoid the branch
              // that swallows the event created by the popstate generated by the hash assignment
              // At the time of this writing this happens with Opera 12 and some version of IE
              this.preventHashAssignPopState = false;
  
              state = $.extend({
                  url: href,
                  hash: hash,
                  title: document.title
              }, data);
  
              if ( isPopStateEvent ) {
                  popstateEvent = new $.Event( "popstate" );
                  popstateEvent.originalEvent = {
                      type: "popstate",
                      state: null
                  };
  
                  this.squash( url, state );
  
                  // Trigger a new faux popstate event to replace the one that we
                  // caught that was triggered by the hash setting above.
                  if ( !noEvents ) {
                      this.ignorePopState = true;
                      $.mobile.window.trigger( popstateEvent );
                  }
              }
  
              // record the history entry so that the information can be included
              // in hashchange event driven navigate events in a similar fashion to
              // the state that's provided by popstate
              this.history.add( state.url, state );
          }