Your IP : 3.22.68.238


Current Path : /var/www/www-root/data/www/info.monolith-realty.ru/bitrix/js/main/loadext/
Upload File :
Current File : /var/www/www-root/data/www/info.monolith-realty.ru/bitrix/js/main/loadext/extension.js

;(function() {
	"use strict";

	if (
		(!BX || !!BX && typeof BX.namespace !== "function") ||
		(!!BX && !!BX.LoadExt && !!BX.LoadExt.Extension)
	)
	{
		return;
	}

	BX.namespace("BX.LoadExt");

	var STATE_SCHEDULED = "scheduled";
	var STATE_LOADED = "loaded";
	var STATE_LOAD = "load";
	var STATE_ERROR = "error";

	/**
	 * Reduces inline scripts
	 *
	 * @param {Array} accumulator
	 * @param {Object} item
	 * @return {Array.<String>}
	 */
	function inlineScriptsReducer(accumulator, item)
	{
		return (item.isInternal && accumulator.push(item.JS)), accumulator;
	}

	/**
	 * Reduces external scripts
	 *
	 * @param {Array} accumulator
	 * @param {Object} item
	 * @return {Array.<String>}
	 */
	function externalScriptsReducer(accumulator, item)
	{
		return (!item.isInternal && accumulator.push(item.JS)), accumulator;
	}

	/**
	 * Prepares result
	 *
	 * @param {String} html
	 * @return {{SCRIPT: Object[], STYLE: String[]}}
	 */
	function prepareResult(html)
	{
		return BX.type.isString(html) ? BX.processHTML(html) : {SCRIPT: [], STYLE: []};
	}

	/**
	 * Makes iterable
	 *
	 * @param {String|String[]} value
	 * @return {String[]}
	 */
	function makeIterable(value)
	{
		if (BX.type.isArray(value))
		{
			return value;
		}

		if (BX.type.isString(value))
		{
			return [value];
		}

		return [];
	}

	/**
	 * Loads all items
	 *
	 * @param {String[]|String} items
	 * @return {Promise}
	 */
	function loadAll(items)
	{
		items = makeIterable(items);

		if (!items.length)
		{
			return Promise.resolve();
		}

		return new Promise(function(resolve) {
			BX.load(items, resolve);
		}.bind(this))
	}

	/**
	 * Implements interface for works with extension
	 *
	 * @param {Object} data
	 * @return {TypeError}
	 * @constructor
	 */
	BX.LoadExt.Extension = function(data)
	{
		if (!BX.type.isPlainObject(data))
		{
			return new TypeError("data is not object");
		}

		this.name = data.extension;
		this.state = data.html ? STATE_SCHEDULED : STATE_ERROR;
		var result = prepareResult(data.html);
		this.inlineScripts = result.SCRIPT.reduce(inlineScriptsReducer, []);
		this.externalScripts = result.SCRIPT.reduce(externalScriptsReducer, []);
		this.externalStyles = result.STYLE;
	};

	BX.LoadExt.Extension.prototype = {
		/**
		 * Loads extension assets
		 *
		 * @return {Promise<BX.LoadExt.Extension>}
		 */
		load: function()
		{
			if (this.state === STATE_ERROR)
			{
				this.loadPromise = this.loadPromise || Promise.resolve(this);
				console.warn("Extension", this.name, "not found");
			}

			if (!this.loadPromise && this.state)
			{
				this.state = STATE_LOAD;
				this.inlineScripts.forEach(BX.evalGlobal);

				this.loadPromise = Promise
					.all([
						loadAll(this.externalScripts),
						loadAll(this.externalStyles)
					])
					.then(function() {
						this.state = STATE_LOADED;
						return this;
					}.bind(this));
			}

			return this.loadPromise;
		}
	}
})();