# File: js/util/TemplateFactory.js

    (function (factory) {
        if (typeof module === 'object' && typeof module.exports === 'object') {
            var v = factory(require, exports); if (v !== undefined) module.exports = v;
        }
        else if (typeof define === 'function' && define.amd) {
            define(["require", "exports", './StringUtil'], factory);
        }
    })(function (require, exports) {
        var StringUtil_1 = require('./StringUtil');
        /**
         * A helper class to provide a convenient and consistent way to render templates.
         *
         * @class TemplateFactory
         * @module StructureJS
         * @submodule util
         * @requires StringUtil
         * @requires Handlebars
         * @author Robert S. (www.codeBelt.com)
         * @static
         */
        var TemplateFactory = (function () {
            function TemplateFactory() {
                throw new Error('[TemplateFactory] Do not instantiate the TemplateFactory class because it is a static class.');
            }
            /**
             * Creates a template.
             *
             * @method create
             * @param templatePath {any}
             * @param [data=any]
             * @returns {string}
             * @public
             * @static
             * @example
             *      TemplateFactory.create('templateName', {some: 'data'});
             */
            TemplateFactory.create = function (templatePath, data) {
                if (data === void 0) { data = null; }
                //Checks the first character to see if it is a '.' or '#'.
                var regex = /^([.#])(.+)/;
                var template = null;
                var isFunctionTemplate = typeof templatePath === 'function';
                var isClassOrIdName = regex.test(templatePath);
                if (isFunctionTemplate) {
                    template = templatePath(data);
                }
                else if (isClassOrIdName) {
                    // Remove pound sign from the id name.
                    templatePath = templatePath.substring(1);
                    var htmlString = document.getElementById(templatePath).innerHTML;
                    htmlString = StringUtil_1.default.removeLeadingTrailingWhitespace(htmlString);
                    if (TemplateFactory.templateEngine == TemplateFactory.UNDERSCORE) {
                        // Underscore Template:
                        var templateMethod = window['_'].template(htmlString);
                        template = templateMethod(data);
                    }
                    else {
                        // Handlebars Template
                        var templateMethod = Handlebars.compile(htmlString);
                        template = templateMethod(data);
                    }
                }
                else {
                    var templateObj = window[TemplateFactory.templateNamespace];
                    if (!templateObj) {
                        // Returns null because the template namespace is not found.
                        return null;
                    }
                    var templateFunction = templateObj[templatePath];
                    if (templateFunction) {
                        // The templatePath gets a function storage in the associative array.
                        // We call the function by passing in the data as the argument.
                        template = templateFunction(data);
                    }
                }
                return template;
            };
            /**
             * A constant value for using Underscore or Lodash templates.
             *
             * @property UNDERSCORE
             * @type {string}
             * @public
             * @final
             * @static
             */
            TemplateFactory.UNDERSCORE = 'underscore';
            /**
             * A constant value for using Handlebars templates. This is the default template engine.
             *
             * @property HANDLEBARS
             * @type {string}
             * @public
             * @final
             * @static
             */
            TemplateFactory.HANDLEBARS = 'handlebars';
            /**
             * Sets the template engine type for this TemplateFactory class. The default is TemplateFactory.HANDLEBARS
             *
             * @property templateEngine
             * @type {string}
             * @default TemplateFactory.HANDLEBARS
             * @public
             * @static
             */
            TemplateFactory.templateEngine = TemplateFactory.HANDLEBARS;
            /**
             * The global namespace for pre-compiled templates.
             *
             * @property templateNamespace
             * @type {string}
             * @default 'JST'
             * @public
             * @static
             */
            TemplateFactory.templateNamespace = 'JST';
            return TemplateFactory;
        })();
        Object.defineProperty(exports, "__esModule", { value: true });
        exports.default = TemplateFactory;
    });