text: 
  
    /*
     *  Utils for CartoDB App
     */
  
    cdb.Utils = {};
  
  
    /*
     *  Strip html tags from a value.
     *  input ->  string with input text (example: '<a href="#whoknows">Jamon</a> </br> <p>Vamos</p>')
     *  allowed -> allowed html tags in the result (example: '<a>')
     *
     *  return -> '<a href="#whoknows">Jamon</a> Vamos'
     */
  
    cdb.Utils.stripHTML = function(input, allowed) {
      allowed = (((allowed || "") + "").toLowerCase().match(/<[a-z][a-z0-9]*>/g) || []).join('');
      var tags = /<\/?([a-z][a-z0-9]*)\b[^>]*>/gi;
      if (!input || (typeof input != "string")) return '';
      return input.replace(tags, function ($0, $1) {
        return allowed.indexOf('<' + $1.toLowerCase() + '>') > -1 ? $0 : '';
      });
    }
  
  
    /*
     *  Remove events attached in html code.
     *  input ->  string with input text (example: '<a href="#whoknows" onClick="alert('jamon')">Jamon</a>')
     *
     *  return -> '<a href="#whoknows">Jamon</a>'
     */
  
    cdb.Utils.removeHTMLEvents = function(input) {
      if (input) {
        return input.replace(/ on\w+="[^"]*"/g, '');
      } else {
        return '';
      }
    }
  
    /*
     *  Truncate a string
     *  input -> string with input text
     *  length -> length of the output string
     *
     *  return -> true
     */
  
    cdb.Utils.truncate = function(input, length) {
      return input.substr(0, length-1) + (input.length > length ? '&hellip;' : '');
    }
  
  
    /*
     *  Simple regex to check if string is an url/ftp
     *  input ->  string with input text (example: 'https://carto.com')
     *
     *  return -> true
     */
  
    cdb.Utils.isURL = function(input) {
      var urlregex = /^((http|https|ftp)\:\/\/)/g;
      if (input) {
        return urlregex.test(input);
      } else {
        return false;
      }
    }
  
  
    cdb.Utils.encodeURLParams = function(url) {
      if (this.isURL(url)) {
        var urlParts = url.split('?');
        if (urlParts.length > 1) {
          return urlParts[0] + '?' + encodeURIComponent(urlParts[1]);
        } else {
          return url;
        }
      }
      return url;
    }
  
  
    /*
     *  Transform bytes to a readable format, like MB, GB
     *  input ->  34234244
     *
     *  return -> 3 MB
     */
  
    cdb.Utils.readablizeBytes = function(bytes, round) {
      if (!bytes || isNaN(bytes)) {
        return 0;
      }
      var s = ['bytes', 'kB', 'MB', 'GB', 'TB', 'PB'];
      var e = Math.floor(Math.log(bytes)/Math.log(1024));
      var value = (bytes/Math.pow(1024, Math.floor(e))).toFixed(2);
  
      if (round) { value = parseInt(value) }
  
      return value + " " + s[e];
    }
  
    /*
     * isEmpty
     *
     */
    cdb.Utils.isEmpty = function(str) {
      return (!str || 0 === str.length);
    }
  
    /*
     * isBlank
     *
     */
    cdb.Utils.isBlank = function(str) {
      return (!str || /^\s*$/.test(str));
    }
  
    /*
     * formatNumber: adds thousands separators
     * @return a string
     *
     */
    cdb.Utils.formatNumber = function(x) {
      if (!x) return "0";
      var parts = x.toString().split(".");
      parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ",");
      return parts.join(".");
    }
  
    /*
     * rgbToHex
     *
     */
    cdb.Utils.rgbToHex = function(r, g, b) {
  
      function componentToHex(c) {
        var hex = c.toString(16);
        return hex.length == 1 ? "0" + hex : hex;
      }
  
      return "#" + componentToHex(r) + componentToHex(g) + componentToHex(b);
    }
  
    /*
     * hexToRGB
     *
     */
    cdb.Utils.hexToRGB = function(hex) {
  
      var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
  
      return result ? {
        r: parseInt(result[1], 16),
        g: parseInt(result[2], 16),
        b: parseInt(result[3], 16)
      } : null;
  
    }
  
  
    /*
     *  Generate random password
     *
     */
  
    cdb.Utils.genRandomPass = function(length) {
  
      function getRandomNum() {
        // between 0 - 1
        var rndNum = Math.random()
        // rndNum from 0 - 1000
        rndNum = parseInt(rndNum * 1000);
        // rndNum from 33 - 127
        rndNum = (rndNum % 94) + 33;
        return rndNum;
      }
  
      function checkPunc(num) {
        if ((num >=33) && (num <=47)) { return true; }
        if ((num >=58) && (num <=64)) { return true; }
        if ((num >=91) && (num <=96)) { return true; }
        if ((num >=123) && (num <=126)) { return true; }
        return false;
      }
  
      length = isNaN(length) ? "" : length
      var pass = "";
      var randomLength = !length ? true : false;
  
      if (randomLength) {
        length = Math.random();
        length = parseInt(length * 100);
        length = (length % 7) + 6
      }
  
      for (i=0; i < length; i++) {
        numI = getRandomNum();
        while (checkPunc(numI)) { numI = getRandomNum() }
        pass = pass + String.fromCharCode(numI);
      }
  
      return pass;
    }
  
  
    /**
     *  Add leading zeros to numbers
     *
     */
    cdb.Utils.pad = function(num, size) {
      var s = num+"";
      while (s.length < size) s = "0" + s;
      return s;
    }
  
  
    /**
     *  Remove all non-common characters like
     *  spaces, quotes, accents, etc...
     *
     */
    cdb.Utils.sanitizeString = function(str) {
      return str.replace(/[^a-z0-9\s]/gi, '').replace(/[_\s]/g, '-');
    }
  
    /**
     *  Convert long numbers to
     *  readizable numbers.
     *
     */
    cdb.Utils.readizableNumber = function(num) {
      if (num >= 1000000000) return (num / 1000000000).toFixed(1) + 'G';
      if (num >= 1000000) return (num / 1000000).toFixed(1) + 'M';
      if (num >= 1000) return (num / 1000).toFixed(1) + 'K';
      return num;
    }
  
    /**
     *  Get the extension of a string
     *
     */
    cdb.Utils.getFileExtension = function(str) {
      if (!str) return '';
  
      return str.substr(str.lastIndexOf('.') + 1);
    }
  
  
    /**
     *  Get ordinal string from a number
     *
     */
    cdb.Utils.getGetOrdinal = function(n) {
      if (!n) {
        return '';
      }
      var s = ["th","st","nd","rd"];
      var v = n%100;
      return n+(s[(v-20)%10]||s[v]||s[0]);
    }
  
    cdb.Utils.capitalize = function(str) {
      return str.charAt(0).toUpperCase() + str.slice(1);
    };
  
    cdb.Utils.isValidEmail = function(str) {
      var re = /^([^@]+)@([^@]+)\.([^@\.]+)$/i;
      return re.test(str);
    }
  
    /**
     * Similar to _.result, but also allows passing arbitrary arguments to the property if it's function.
     * This makes code more terse  when one just wants to use a value if it's available, no if-checks required.
     *
     * @example Expected output
     *   model.set('something', 'yay');
     *   cdb.Utils.result(model, 'get', 'something') // => 'yay'
     *   cdb.Utils.result(model, 'nonexisting', 'else') // => undefined
     *   cdb.Utils.result(undefinedVar, 'get') // => null
     *
     * @example Of usage
     *  return cdb.Utils.result(model, 'get', 'mightNotExist') === 'OK'
     *
     * @param {*} maybeFn
     * @return {*} Result from called maybeFn if a function, null otherwise
     */
    cdb.Utils.result = function(object, property) {
      if (object == null) return null;
      var value = object[property];
      return _.isFunction(value) ? value.apply(object, Array.prototype.slice.call(arguments, 2)) : value;
    };
  
    /*
     * Returns a (double) quoted table name if needed (if it contains a dash, for example).
     * Coupled to backend lib/carto/table_utils.rb#safe_table_name_quoting.
     * Duplicated at lib/assets/javascripts/builder/helpers/utils.js to make it available for older models.
     */
    cdb.Utils.safeTableNameQuoting = function (table_name) {
      if (table_name === undefined || table_name.indexOf('-') === -1 || table_name[0] === '"' || table_name[table_name.length - 1] === '"') {
        return table_name;
      } else {
        return '"' + table_name + '"';
      }
    };
  