text: /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
   * full list of contributors). Published under the 2-clause BSD license.
   * See license.txt in the OpenLayers distribution or repository for the
   * full text of the license. */
  
  
  /**
   * @requires OpenLayers/Layer/Grid.js
   * @requires OpenLayers/Layer/KaMap.js
   */
  
  /**
   * Class: OpenLayers.Layer.KaMapCache
   * 
   * This class is designed to talk directly to a web-accessible ka-Map
   * cache generated by the precache2.php script.
   * 
   * To create a a new KaMapCache layer, you must indicate also the "i" parameter
   * (that will be used to calculate the file extension), and another special
   * parameter, object names "metaTileSize", with "h" (height) and "w" (width)
   * properties.
   * 
   *     // Create a new kaMapCache layer. 
   *     var kamap_base = new OpenLayers.Layer.KaMapCache(
   *         "Satellite",
   *         "http://www.example.org/web/acessible/cache",
   *         {g: "satellite", map: "world", i: 'png24', metaTileSize: {w: 5, h: 5} }
   *       );
   *    
   *     // Create an kaMapCache overlay layer (using "isBaseLayer: false"). 
   *     // Forces the output to be a "gif", using the "i" parameter.
   *     var kamap_overlay = new OpenLayers.Layer.KaMapCache(
   *         "Streets",
   *         "http://www.example.org/web/acessible/cache",
   *         {g: "streets", map: "world", i: "gif", metaTileSize: {w: 5, h: 5} },
   *         {isBaseLayer: false}
   *       );
   *
   * The cache URLs must look like: 
   *   var/cache/World/50000/Group_Name/def/t-440320/l20480
   * 
   * This means that the cache generated via tile.php will *not* work with
   *     this class, and should instead use the KaMap layer.
   *
   * More information is available in Ticket #1518.
   * 
   * Inherits from:
   *  - <OpenLayers.Layer.KaMap>
   *  - <OpenLayers.Layer.Grid>
   */
  OpenLayers.Layer.KaMapCache = OpenLayers.Class(OpenLayers.Layer.KaMap, {
  
      /**
       * Constant: IMAGE_EXTENSIONS
       * {Object} Simple hash map to convert format to extension.
       */
      IMAGE_EXTENSIONS: {
          'jpeg': 'jpg',
          'gif' : 'gif',
          'png' : 'png',
          'png8' : 'png',
          'png24' : 'png',
          'dithered' : 'png'
      },
      
      /**
       * Constant: DEFAULT_FORMAT
       * {Object} Simple hash map to convert format to extension.
       */
      DEFAULT_FORMAT: 'jpeg',
      
      /**
       * Constructor: OpenLayers.Layer.KaMapCache
       * 
       * Parameters:
       * name - {String}
       * url - {String}
       * params - {Object} Parameters to be sent to the HTTP server in the
       *    query string for the tile. The format can be set via the 'i'
       *    parameter (defaults to jpg) , and the map should be set via 
       *    the 'map' parameter. It has been reported that ka-Map may behave
       *    inconsistently if your format parameter does not match the format
       *    parameter configured in your config.php. (See ticket #327 for more
       *    information.)
       * options - {Object} Additional options for the layer. Any of the 
       *     APIProperties listed on this layer, and any layer types it
       *     extends, can be overridden through the options parameter. 
       */
      initialize: function(name, url, params, options) {
          OpenLayers.Layer.KaMap.prototype.initialize.apply(this, arguments);
          this.extension = this.IMAGE_EXTENSIONS[this.params.i.toLowerCase() || this.DEFAULT_FORMAT];
      },
  
      /**
       * Method: getURL
       * 
       * Parameters:
       * bounds - {<OpenLayers.Bounds>} 
       * 
       * Returns:
       * {String} A string with the layer's url and parameters and also the 
       *          passed-in bounds and appropriate tile size specified as 
       *          parameters
       */
      getURL: function (bounds) {
          bounds = this.adjustBounds(bounds);
          var mapRes = this.map.getResolution();
          var scale = Math.round((this.map.getScale() * 10000)) / 10000;
          var pX = Math.round(bounds.left / mapRes);
          var pY = -Math.round(bounds.top / mapRes);
  
          var metaX = Math.floor(pX / this.tileSize.w / this.params.metaTileSize.w) * this.tileSize.w * this.params.metaTileSize.w;
          var metaY = Math.floor(pY / this.tileSize.h / this.params.metaTileSize.h) * this.tileSize.h * this.params.metaTileSize.h;
      
          var components = [
              "/",
              this.params.map,
              "/",
              scale,
              "/",
              this.params.g.replace(/\s/g, '_'),
              "/def/t", 
              metaY,
              "/l",
              metaX,
              "/t",
              pY,
              "l",
              pX,
              ".",
              this.extension
            ];
  
          var url = this.url;
  
          if (OpenLayers.Util.isArray(url)) {
              url = this.selectUrl(components.join(''), url);
          }
          return url + components.join("");
      },
  
      CLASS_NAME: "OpenLayers.Layer.KaMapCache"
  });
  