docs: function(newParams, altUrl) {
          // use layer's url unless altUrl passed in
          var url = (altUrl == null) ? this.url : altUrl;
          
          // create a new params hashtable with all the layer params and the 
          // new params together. then convert to string
          var allParams = OpenLayers.Util.extend({}, this.params);
          allParams = OpenLayers.Util.extend(allParams, newParams);
          var paramsString = OpenLayers.Util.getParameterString(allParams);
          
          // if url is not a string, it should be an array of strings, 
          // in which case we will deterministically select one of them in 
          // order to evenly distribute requests to different urls.
          if (OpenLayers.Util.isArray(url)) {
              url = this.selectUrl(paramsString, url);
          }   
          
          // ignore parameters that are already in the url search string
          var urlParams = OpenLayers.Util.upperCaseObject(
                              OpenLayers.Util.getParameters(url));
          for(var key in allParams) {
              if(key.toUpperCase() in urlParams) {
                  delete allParams[key];
              }
          }
          paramsString = OpenLayers.Util.getParameterString(allParams);
          
          // requestString always starts with url
          var requestString = url;        
  
          // MapServer needs '+' seperating things like bounds/height/width.
          //   Since typically this is URL encoded, we use a slight hack: we
          //  depend on the list-like functionality of getParameterString to
          //  leave ',' only in the case of list items (since otherwise it is
          //  encoded) then do a regular expression replace on the , characters
          //  to '+'
          //
          paramsString = paramsString.replace(/,/g, "+");
          
          if (paramsString != "") {
              var lastServerChar = url.charAt(url.length - 1);
              if ((lastServerChar == "&") || (lastServerChar == "?")) {
                  requestString += paramsString;
              } else {
                  if (url.indexOf('?') == -1) {
                      //serverPath has no ? -- add one
                      requestString += '?' + paramsString;
                  } else {
                      //serverPath contains ?, so must already have paramsString at the end
                      requestString += '&' + paramsString;
                  }
              }
          }
          return requestString;
      }