docs: function(loc) {
          var data = null,
              x = loc.lon,
              y = loc.lat,
              numRows = this.grid.length;
  
          if (this.map && numRows) {
              var res = this.map.getResolution(),
                  tileWidth = this.tileSize.w,
                  tileHeight = this.tileSize.h,
                  bounds = this.grid[0][0].bounds,
                  left = bounds.left,
                  top = bounds.top;
  
              if (x < left) {
                  // deal with multiple worlds
                  if (this.map.baseLayer.wrapDateLine) {
                      var worldWidth = this.map.getMaxExtent().getWidth();
                      var worldsAway = Math.ceil((left - x) / worldWidth);
                      x += worldWidth * worldsAway;
                  }
              }
              // tile distance to location (fractional number of tiles);
              var dtx = (x - left) / (res * tileWidth);
              var dty = (top - y) / (res * tileHeight);
              // index of tile in grid
              var col = Math.floor(dtx);
              var row = Math.floor(dty);
              if (row >= 0 && row < numRows) {
                  var tile = this.grid[row][col];
                  if (tile) {
                      data = {
                          tile: tile,
                          // pixel index within tile
                          i: Math.floor((dtx - col) * tileWidth),
                          j: Math.floor((dty - row) * tileHeight)
                      };                    
                  }
              }
          }
          return data;
      }