API Docs for: 0.1.0
Show:

File: src\Background.js

/**
 @module L.PtvLayer
 **/
L.PtvLayer = L.PtvLayer || {};

/**
 Provides the PTV Background TileLayer class.
 @class L.PtvLayer.Background
 @extends L.TileLayer
 @params {XMapClient} client XMapClient object
 @params {Object} options The options object
 @params {String} [options.format] The image format used in tile requests.
 @params {String} [options.beforeSend] Function to be called before sending the request with the request object given as first parameter. The (modified) request object must be returned.
 @params {String} [options.errorTileUrl] The image to display when requests fail.
 @constructor
 **/
L.PtvLayer.Background = L.TileLayer.extend({

  _client: null,

  /**
   Default options used in this class.
   @property options
   @type Object
   **/
  options: {
    /**
     The image format used in tile requests.
     @property options.format
     @type String
     @default "PNG"
     **/
    format: 'PNG',
	
	/**
     Function to be called before sending the request with the request object given as first parameter. The (modified) request object must be returned.
     @property options.beforeSend
     @type function
     @default null
     **/
    beforeSend: null,

    /**
     The image to display when requests fail.
     @property options.errorTileUrl
     @type String
     @default "tile-error.png"
     **/
    errorTileUrl: 'tile-error.png',

    /**
     If set to true, the tiles just won't load outside the world width (-180 to 180 longitude) instead of repeating.
     @property options.noWrap
     @type boolean
     @default true
     **/
    noWrap: true,

    /**
     The world bounds for PTV Maps.
     @property options.bounds
     @type L.LatLngBounds
     @default [[85.0, -178.965000], [-66.5, 178.965000]]
     **/
    bounds: new L.LatLngBounds([[85.0, -178.965000], [-66.5, 178.965000]]),

    /**
     Minimum zoom number.
     @property options.minZoom
     @type boolean
     @default true
     **/
    minZoom: 2
  },

  /**
   Constructor
   @method L.PtvLayer.Background
   @param {XMapClient} client optional XMapClient object
   @param {Object} options optional options object
   **/
  initialize: function(client, options) {
    this._client = client;
    if (typeof client !== 'object' ) {
      if (typeof XMapClient !== 'function') {
        throw Error('The XMapClient object is not accessible globally. Have you loaded "xmap-client.js" properly?');
      } else {
        this._client = new XMapClient(null, 5);
      }
	}
    L.Util.setOptions(this, options);
  },

  onAdd: function(map) {
    L.TileLayer.prototype.onAdd.call(this, map);
    if ( typeof this._client.cancelPendingRequests === 'function') {
      map.on('zoomstart', this._client.cancelPendingRequests);
    }
  },

  onRemove: function(map) {
    L.TileLayer.prototype.onAdd.call(this, map);
    if ( typeof this._client.cancelPendingRequests === 'function') {
      map.off('zoomstart', this._client.cancelPendingRequests);
    }
  },

  /**
   Loads a specific tile and shows the result when finished.
   @method _loadTile
   @private
   @param {DOMElement} tile The tile dom img element
   @param {Point} tilePoint The tile point
   **/
  _loadTile: function(tile, tilePoint) {
    tile._layer = this;
    tile.onload = this._tileOnLoad;
    tile.onerror = this._tileOnError;

    var tileUrl = this._requestTile(tile, tilePoint);
  },

  /**
   Requests a specific tile from the server.
   @method _requestTile
   @private
   @param {DOMElement} tile The tile dom img element
   @param {Point} tilePoint The tile point
   **/
  _requestTile: function(tile, tilePoint) {
    var self = this, map = this._map, crs = map.options.crs, tileSize = this.options.tileSize, zoom = this._map.getZoom(), nwPoint = tilePoint.multiplyBy(tileSize), sePoint = nwPoint.add(new L.Point(tileSize, tileSize)), nw = crs.project(map.unproject(nwPoint, zoom)), se = crs.project(map.unproject(sePoint, zoom)), bbox = new L.LatLngBounds([se.y, nw.x], [nw.y, se.x]);

    var mapSection = {
      leftTop: {
        "$type": "Point",
        point: {
          "$type": "PlainPoint",
          x: bbox.getNorthWest().lng,
          y: bbox.getNorthWest().lat
        }
      },
      rightBottom: {
        "$type": "Point",
        point: {
          "$type": "PlainPoint",
          x: bbox.getSouthEast().lng,
          y: bbox.getSouthEast().lat
        }
      }
    };
	
    var mapParams = {
      showScale: false,
      useMiles: false
    };
	
    var imageInfo = {
      format: this.options.format,
      width: tileSize,
      height: tileSize
    };
	
	var layers = [];
	var includeImageInResponse = true;
	
    var callerContext = {
      properties: [{
        key: "Profile",
        value: "ajax-bg"
      }, {
        key: "CoordFormat",
        value: "PTV_MERCATOR"
      }]
    };
	
	if (typeof this.options.beforeSend === "function") {
		var req = this.options.beforeSend({ mapSection: mapSection, mapParams: mapParams, imageInfo: imageInfo, layers: layers, includeImageInResponse: includeImageInResponse, callerContext: callerContext });
		mapSection = req.mapSection;
		mapParams = req.mapParams;
		imageInfo = req.imageInfo;
		layers = req.layers;
		includeImageInResponse = req.includeImageInResponse;
		callerContext = req.callerContext;
	}

    var cb = (function(tile) {
      return function(resp, error) {
        if (!error && resp) {
          tile.src = L.PtvUtils.createDataURI(resp.image.rawImage);
        } else {
          tile.src = self.options.errorTileUrl;
          console.log(error.errorMessage);
        }
      };
    })(tile);

    this._client.renderMapBoundingBox(mapSection, mapParams, imageInfo, layers, includeImageInResponse, callerContext, cb);
  }
});

L.PtvLayer.background = function(client, options) {
  return new L.PtvLayer.Background(client, options);
};