CartoDB/cartodb20

View on GitHub
lib/assets/javascripts/builder/data/custom-baselayer-model.js

Summary

Maintainability
B
6 hrs
Test Coverage
/* global Image */

var Backbone = require('backbone');
var _ = require('underscore');

module.exports = Backbone.Model.extend({

  getAttributes: function () {
    return JSON.parse(JSON.stringify(this.attributes));
  },

  _generateClassName: function (urlTemplate) {
    if (urlTemplate) {
      return urlTemplate.replace(/\s+/g, '').replace(/[^a-zA-Z_0-9 ]/g, '').toLowerCase();
    } else return '';
  },

  parse: function (data) {
    var attrs = {};

    _.extend(attrs, data.options, {
      id: data.id,
      className: this._generateClassName(data.options.urlTemplate),
      type: 'Tiled',
      order: data.order,
      parent_id: data.parent_id
    });

    return attrs;
  },

  toJSON: function () {
    var layerOptions = _.clone(_.omit(this.attributes, ['order', 'id']));
    var json = {
      kind: 'tiled',
      options: layerOptions,
      order: this.get('order'),
      id: this.id
    };

    return json;
  },

  getValue: function () {
    return this.get('val');
  },

  /**
   * validateTemplateURL - Validates current urlTemplate of layer.
   *
   * @param {Object} callbacks with success and error functions defined to be called depending on validation outcome.
   */
  validateTemplateURL: function (callbacks) {
    var subdomains = ['a', 'b', 'c'];
    var image = new Image();
    image.onload = callbacks.success;
    image.onerror = callbacks.error;
    image.src = this.get('urlTemplate').replace(/\{s\}/g, function () {
      return subdomains[Math.floor(Math.random() * 3)];
    })
      .replace(/\{x\}/g, '0')
      .replace(/\{y\}/g, '0')
      .replace(/\{z\}/g, '0');
  }

});