Source: service/constant.js

/**
 * Generate constants.
 * @namespace constantService
 */

'use strict';

app.factory('constantService', [
  '$log', '$sce', 'constantData', 'messageData',
  function ($log, $sce, constants, messages) {

    messages.get = function (k) {
      if (typeof k === 'string')
        k = k.split('.');
      var m = this;
      for (var i = 0; m && i < k.length; i ++)
        m = m[k[i]];
      return m;
    };
    constants.messages = messages;

    constants.regex = {
      doi: /^(?:[dD][oO][iI]:|[hH][dD][lL]:|(?:http:\/\/)?dx\.doi\.org\/)?(10\.[0-9\.]+\/\S+)\s*$/,
    };

    //

    function invertArray(data) {
      for (var i = 0; i < data.length; i ++)
        data[data[i]] = i;
    }

    constants.releases = Object.keys(constants.release);
    constants.release[-1] = 'UNRELEASED';
    constants.releases.unshift('-1');
    invertArray(constants.permission);
    invertArray(constants.release);
    invertArray(constants.delivery);
    constants.categories = _.sortBy(constants.category, 'id');
    constants.categoryName = _.indexBy(constants.category, 'name');

    /* convenient aliases: */
    constants.permission.VIEW = constants.permission.PUBLIC;
    constants.permission.CONTRIBUTE = constants.permission.EDIT;
    constants.permission.SUPER = constants.permission.length;

    /* backwards compatibility: */
    for (var name in constants.party) {
      var uname = name.toUpperCase();
      var party = constants.party[name];
      if (typeof party === 'object' && name !== uname)
        constants.party[uname] = party.id;
    }

    var msgnot = messages.not;
    for (var c in constants.category) {
      var cat = constants.category[c];
      var n = cat.name;
      cat.not = n in msgnot ? msgnot[n] : 'No ' + n;
      var metrics = _.filter(constants.metric, 'category', cat.id);
      cat.metrics = _.sortBy(metrics, 'id');
      cat.metricName = _.indexBy(metrics, 'name');
      if (cat.metrics[0].type === 'void')
        cat.indicator = cat.metrics[0];
    }

    for (var f in constants.format) {
      var fmt = constants.format[f];
      var m = fmt.mimetype;
      fmt.type = m.slice(0, m.indexOf('/'));
    }

    constants.accessPreset = [
      [constants.permission.NONE,   constants.permission.NONE],
      [constants.permission.PUBLIC, constants.permission.SHARED],
      [constants.permission.PUBLIC, constants.permission.SHARED]
    ];
    constants.accessPreset.parties = [
      constants.party.NOBODY,
      constants.party.ROOT
    ];
    constants.accessPreset.staff = constants.permission.EDIT;

    constants.message = function (key /*, args...*/) {
      var msg = messages.get(key);

      if (msg === undefined) {
        $log.info('Message key [' + key + '] is undefined.');
        return '[' + key + ']';
      }

      var i = 1, l = arguments.length;
      var o;
      if (i < l && typeof arguments[i] === 'object')
        o = arguments[i++];
      else
        o = {};

      var g = o.sce ? $sce.getTrusted.bind($sce, o.sce) : angular.identity;
      for (var n = 0; i < l; i++, n++)
        msg = msg.replace('{' + n + '}', g(arguments[i]), 'g');
      if (o.sce)
        msg = $sce.trustAs(o.sce, msg);

      return msg;
    };

    constants.age = { day: 1, week: 7, year: 365.24219 };
    constants.age.month = constants.age.year / 12;
    constants.age.limit = constants.age.year * 90;

    function deepFreeze(o) {
      Object.freeze(o);
      for (var f in o)
        if (o.hasOwnProperty(f)) {
          var v = o[f];
          if (v instanceof Object && !Object.isFrozen(v))
            deepFreeze(v);
        }
      return o;
    }
    constants.deepFreeze = deepFreeze;

    return deepFreeze(constants);
  }
]);