# File: js/util/ComponentFactory.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", '../util/Util'], factory);
        }
    })(function (require, exports) {
        var Util_1 = require('../util/Util');
        /**
         * A helper class to create multiple instances of the same Component Class from jQuery object that has one or more elements in it.
         *
         * @class ComponentFactory
         * @module StructureJS
         * @submodule util
         * @author Robert S. (www.codeBelt.com)
         * @static
         */
        var ComponentFactory = (function () {
            function ComponentFactory() {
                throw new Error('[ComponentFactory] Do not instantiate the ComponentFactory class because it is a static class.');
            }
            /**
             * Takes a jQuery object that has one or more elements in it and passes a single jQuery element into the constructor of the class that is also being passed in.
             *
             * @method create
             * @param $element {jQuery} One or more jQuery referenced DOM elements.
             * @param ComponentClass {any} The class that you want instantiated.
             * @param [scope=null] {DisplayObjectContainer} This scope (parent object) is needed to instantiate the component/view with the use of the {{#crossLink "DisplayObjectContainer/addChild:method"}}{{/crossLink}} method.
             * @return {Array.<any>} Returns a list of instantiated components/views so you can manage them within the Class that created them.
             * @public
             * @static
             * @example
             *      ComponentFactory.create($('.js-list'), SomeClass, this);
             */
            ComponentFactory.create = function ($elements, ComponentClass, scope) {
                if (scope === void 0) { scope = null; }
                var list = [];
                var component;
                var $element;
                var length = $elements.length;
                var types;
                var componentName;
                for (var i_1 = 0; i_1 < length; i_1++) {
                    $element = $elements.eq(i_1);
                    types = $element.attr('data-sjs-type');
                    if (types === void 0) {
                        // Create the component if there is not a 'data-sjs-type' attribute on the element.
                        component = ComponentFactory._createComponent($element, ComponentClass, scope);
                        list.push(component);
                    }
                    else {
                        // Else if there is already a 'data-sjs-type' attribute then get the type(s).
                        types = types.split(',');
                        componentName = Util_1.default.getName(ComponentClass);
                        // Only create the component if the component type does not already exist.
                        if (types.indexOf(componentName) === -1) {
                            component = ComponentFactory._createComponent($element, ComponentClass, scope);
                            list.push(component);
                        }
                    }
                }
                return list;
            };
            /**
             * Helper method to create the component.
             *
             * @method _createComponent
             * @private
             */
            ComponentFactory._createComponent = function ($element, ComponentClass, scope) {
                var component = new ComponentClass($element);
                // If the class object has the sjsId property then I am assuming it is an instance of the DisplayObject class.
                if (scope !== null && component.hasOwnProperty('sjsId') === true) {
                    scope.addChild(component);
                }
                return component;
            };
            return ComponentFactory;
        })();
        Object.defineProperty(exports, "__esModule", { value: true });
        exports.default = ComponentFactory;
    });