%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /home/bitrix/www/bitrix/js/ui/viewer/
Upload File :
Create Path :
Current File : /home/bitrix/www/bitrix/js/ui/viewer/ui.viewer.item.js

;(function () {

	'use strict';

	BX.namespace('BX.UI.Viewer');

	BX.UI.Viewer.Item = function(options)
	{
		options = options || {};

		this.controller = null;
		this.title = options.title;
		this.src = options.src;
		this.actions = options.actions;
		this.contentType = options.contentType;
		this.isLoaded = false;
		this.isLoading = false;
		this.sourceNode = null;
		this.layout = {
			container: null
		};

		this.init();
	};

	BX.UI.Viewer.Item.prototype =
	{
		setController: function (controller)
		{
			if (!(controller instanceof BX.UI.Viewer.Controller))
			{
				throw new Error("BX.UI.Viewer.Item: 'controller' has to be instance of BX.UI.Viewer.Controller.");
			}

			this.controller = controller;
		},

		/**
		 * @param {HTMLElement} node
		 */
		setPropertiesByNode: function (node)
		{
			this.title = node.dataset.title || node.title || node.alt;
			this.src = node.dataset.src;
			this.actions = node.dataset.actions? JSON.parse(node.dataset.actions) : undefined;
		},

		/**
		 * @param {HTMLElement} node
		 */
		bindSourceNode: function (node)
		{
			this.sourceNode = node;
		},

		init: function ()
		{},

		reload: function ()
		{
			this.isLoaded = false;
			this.isLoading = false;

			return this.load();
		},

		load: function ()
		{
			var promise = new BX.Promise();

			if (this.isLoaded)
			{
				promise.fulfill(this);

				return promise;
			}
			if (this.isLoading)
			{
				return this._loadPromise;
			}

			this.isLoading = true;
			this._loadPromise = this.loadData().then(function(item){
				this.isLoaded = true;
				this.isLoading = false;

				return item;
			}.bind(this)).catch(function (reason) {
				this.isLoaded = false;
				this.isLoading = false;

				var promise = new BX.Promise();
				promise.reject(reason);

				return promise;
			}.bind(this));

			return this._loadPromise;
		},

		getTitle: function()
		{
			return this.title;
		},

		getActions: function()
		{
			if (typeof this.actions === 'undefined')
			{
				return [{
					type: 'download'
				}];
			}

			return this.actions;
		},

		/**
		 * @returns {BX.Promise}
		 */
		loadData: function ()
		{
			var promise = new BX.Promise();
			promise.setAutoResolve(true);
			promise.fulfill(this);

			return promise;
		},

		render: function ()
		{},

		afterRender: function ()
		{}
	};

	/**
	 * @extends {BX.UI.Viewer.Item}
	 * @param options
	 * @constructor
	 */
	BX.UI.Viewer.Image = function (options)
	{
		options = options || {};

		BX.UI.Viewer.Item.apply(this, arguments);

		this.resizedSrc = options.resizedSrc;
		this.width = options.width;
		this.height = options.height;
		this.imageNode = null;
		this.layout = {
			container: null
		}
	};

	BX.UI.Viewer.Image.prototype =
	{
		__proto__: BX.UI.Viewer.Item.prototype,
		constructor: BX.UI.Viewer.Item,

		/**
		 * @param {HTMLElement} node
		 */
		setPropertiesByNode: function (node)
		{
			BX.UI.Viewer.Item.prototype.setPropertiesByNode.apply(this, arguments);

			this.resizedSrc = node.src;
			this.src = node.dataset.src || node.src;
			this.width = node.dataset.width;
			this.height = node.dataset.height;
		},

		loadData: function ()
		{
			var promise = new BX.Promise();

			if (!this.resizedSrc)
			{
				var xhr = new XMLHttpRequest();
				xhr.responseType = 'blob';
				xhr.onreadystatechange = function () {
					if(xhr.readyState !== XMLHttpRequest.DONE)
					{
						return;
					}
					if ((xhr.status === 200 || xhr.status === 0) && xhr.response)
					{
						this.resizedSrc = URL.createObjectURL(xhr.response);
						this.imageNode = new Image();
						this.imageNode.src = this.resizedSrc;

						promise.fulfill(this);
					}
					else
					{
						promise.reject({
							item: this,
							type: 'error'
						});
					}

				}.bind(this);
				xhr.open('GET', BX.util.add_url_param(this.src, {ts: 'bxviewer'}), true);
				xhr.setRequestHeader('BX-Viewer-image', 'x');
				xhr.send();
			}
			else
			{
				this.imageNode = new Image();
				this.imageNode.onload = function () {
					promise.fulfill(this);
				}.bind(this);
				this.imageNode.onerror = this.imageNode.onabort = function (event) {
					promise.reject({
						item: this,
						type: 'error'
					});
				}.bind(this);

				this.imageNode.src = this.resizedSrc;
			}

			return promise;
		},

		render: function ()
		{
			var item = document.createDocumentFragment();

			item.appendChild(this.imageNode);

			if (this.title)
			{
				item.appendChild(BX.create('div', {
					props: {
						className: 'viewer-inner-fullsize'
					},
					children: [
						BX.create('a', {
							props: {
								href: BX.util.add_url_param(this.src, {ts: 'bxviewer', ibxShowImage: 1}),
								target: '_blank'
							},
							text: BX.message('JS_UI_VIEWER_IMAGE_VIEW_FULL_SIZE')
						})
					]
				}));
			}

			this.imageNode.alt = this.title;

			return item;
		}
	};


	/**
	 * @extends {BX.UI.Viewer.Item}
	 * @param options
	 * @constructor
	 */
	BX.UI.Viewer.PlainText = function (options)
	{
		options = options || {};

		BX.UI.Viewer.Item.apply(this, arguments);

		this.content = options.content;
	};

	BX.UI.Viewer.PlainText.prototype =
	{
		__proto__: BX.UI.Viewer.Item.prototype,
		constructor: BX.UI.Viewer.Item,

		/**
		 * @param {HTMLElement} node
		 */
		setPropertiesByNode: function (node)
		{
			BX.UI.Viewer.Item.prototype.setPropertiesByNode.apply(this, arguments);

			this.content = node.dataset.content;
		},

		render: function ()
		{
			var contentNode = BX.create('span', {
				text: this.content
			});

			contentNode.style.fontSize = '18px';
			contentNode.style.color = 'white';

			return contentNode;
		}
	};

	/**
	 * @extends {BX.UI.Viewer.PlainText}
	 * @param options
	 * @constructor
	 */
	BX.UI.Viewer.Unknown = function (options)
	{
		options = options || {};

		BX.UI.Viewer.Item.apply(this, arguments);
	};

	BX.UI.Viewer.Unknown.prototype =
	{
		__proto__: BX.UI.Viewer.PlainText.prototype,
		constructor: BX.UI.Viewer.PlainText,

		/**
		 * @param {HTMLElement} node
		 */
		setPropertiesByNode: function (node)
		{
			BX.UI.Viewer.Item.prototype.setPropertiesByNode.apply(this, arguments);

			this.content = 'Unknown type';
		}
	};

	/**
	 * @extends {BX.UI.Viewer.Item}
	 * @param options
	 * @constructor
	 */
	BX.UI.Viewer.Video = function (options)
	{
		options = options || {};

		BX.UI.Viewer.Item.apply(this, arguments);

		this.player = null;
		if (this.src)
		{
			this.playerId = 'playerId_' + this.hashCode(this.src) + (Math.floor(Math.random() * Math.floor(10000)));
		}
		this.sources = [];
		this.transFormationPromise = null;
	};

	BX.UI.Viewer.Video.prototype =
	{
		__proto__: BX.UI.Viewer.Item.prototype,
		constructor: BX.UI.Viewer.Item,

		/**
		 * @param {HTMLElement} node
		 */
		setPropertiesByNode: function (node)
		{
			BX.UI.Viewer.Item.prototype.setPropertiesByNode.apply(this, arguments);

			this.playerId = 'playerId_' + this.hashCode(this.src) + (Math.floor(Math.random() * Math.floor(10000)));
		},

		hashCode: function (string)
		{
			var h = 0, l = string.length, i = 0;
			if (l > 0)
			{
				while (i < l)
					h = (h << 5) - h + string.charCodeAt(i++) | 0;
			}
			return h;
		},

		init: function () 
		{
			BX.addCustomEvent('onPullEvent', function (moduleId, command, params) {
				if (moduleId === 'main' && command === 'transformationComplete')
				{
					if (this.transFormationPromise)
					{
						this.loadData().then(function(){
							this.transFormationPromise.fulfill(this);
						}.bind(this));
					}
				}
			}.bind(this));

			BX.addCustomEvent('PlayerManager.Player:onAfterInit', function(player)
			{
				if (player.id !== this.playerId)
				{
					return;
				}

				if (player.vjsPlayer.error())
				{
					console.log('forceTransformation');
					this.forceTransformation = true;
					this.controller.reload(this);
				}

			}.bind(this));
		},

		loadData: function ()
		{
			var promise = new BX.Promise();

			var headers = [
				{
					name: 'BX-Viewer-src',
					value: this.src
				}
			];

			headers.push({
				name: this.forceTransformation? 'BX-Viewer-force-transformation' : 'BX-Viewer',
				value: 'video'
			});

			var ajaxPromise = BX.ajax.promise({
				url: BX.util.add_url_param(this.src, {ts: 'bxviewer'}),
				method: 'GET',
				dataType: 'json',
				headers: headers
			});

			ajaxPromise.then(function (response) {
				if (!response || !response.data)
				{
					promise.reject({
						item: this,
						type: 'error'
					});

					return;
				}

				if(response.data.pullTag)
				{
					BX.PULL.extendWatch(response.data.pullTag);
					this.transFormationPromise = promise;
				}
				else
				{
					if (response.data.data)
					{
						this.width = response.data.data.width;
						this.height = response.data.data.height;
						this.sources = response.data.data.sources;
					}

					if (response.data.html)
					{
						var html = BX.processHTML(response.data.html);

						BX.load(html.STYLE, function(){
							BX.ajax.processScripts(html.SCRIPT, undefined, function(){
								promise.fulfill(this);
							}.bind(this));
						}.bind(this));
					}
				}
			}.bind(this));

			return promise;
		},

		render: function ()
		{
			this.player = new BX.Fileman.Player(this.playerId, {
				width: this.width,
				height: this.height,
				sources: this.sources
			});

			return this.player.createElement();
		},

		afterRender: function()
		{
			this.player.init();
		}
	};

	/**
	 * @extends {BX.UI.Viewer.Item}
	 * @param options
	 * @constructor
	 */
	BX.UI.Viewer.Document = function (options)
	{
		BX.UI.Viewer.Item.apply(this, arguments);
		this.contentNode = null;
		this.previewHtml = null;
		this.previewScriptToProcess = null;
		this.transFormationPromise = null;
	};

	BX.UI.Viewer.Document.prototype =
	{
		__proto__: BX.UI.Viewer.Item.prototype,
		constructor: BX.UI.Viewer.Item,

		/**
		 * @param {HTMLElement} node
		 */
		setPropertiesByNode: function (node)
		{
			BX.UI.Viewer.Item.prototype.setPropertiesByNode.apply(this, arguments);
		},

		init: function()
		{
			BX.addCustomEvent('onPullEvent', function (moduleId, command, params) {
				if (moduleId === 'main' && command === 'transformationComplete')
				{
					if (this.transFormationPromise)
					{
						this.loadData().then(function(){
							this.transFormationPromise.fulfill(this);
						}.bind(this));
					}
				}
			}.bind(this));

		},

		loadData: function ()
		{
			var promise = new BX.Promise();
			if (this.previewHtml)
			{
				this.processPreviewHtml(this.previewHtml);
				promise.fulfill(this);

				return promise;
			}

			var ajaxPromise = BX.ajax.promise({
				url: BX.util.add_url_param(this.src, {ts: 'bxviewer'}),
				method: 'GET',
				dataType: 'json',
				headers: [
					{
						name: 'BX-Viewer-src',
						value: this.src
					},
					{
						name: 'BX-Viewer',
						value: 'document'
					}
				]
			});

			ajaxPromise.then(function (response) {
				if (!response || !response.data)
				{
					promise.reject({
						item: this,
						type: 'error'
					});

					return;
				}

				if(response.data.pullTag)
				{
					BX.PULL.extendWatch(response.data.pullTag);
					this.transFormationPromise = promise;
				}

				if(response.data.html)
				{
					this.previewHtml = response.data.html;
					this.processPreviewHtml(response.data.html);
					promise.fulfill(this);
				}
			}.bind(this));

			return promise;
		},

		processPreviewHtml: function (previewHtml)
		{
			var html = BX.processHTML(previewHtml);

			if (!this.contentNode)
			{
				this.contentNode = BX.create('div', {
					html: html.HTML
				});
			}

			if (!!html.SCRIPT)
			{
				this.previewScriptToProcess = html.SCRIPT;
			}
		},

		render: function ()
		{
			return this.contentNode;
		},

		afterRender: function ()
		{
			if (this.previewScriptToProcess)
			{
				BX.ajax.processScripts(this.previewScriptToProcess);
			}
		}
	};

})();

Zerion Mini Shell 1.0