Your IP : 3.144.48.157


Current Path : /home/bitrix/ext_www/klimatlend.ua/bitrix/js/main/core/
Upload File :
Current File : /home/bitrix/ext_www/klimatlend.ua/bitrix/js/main/core/core_uf.js

;(function()
{
	'use strict';

	BX.namespace('BX.Main.UF');

	if(typeof BX.Main.UF.Manager !== 'undefined')
	{
		return;
	}

	var fieldStack = {};

	/**
	 * Dynamic form manager. Initilized as singleton below
	 *
	 * @constructor
	 */

	BX.Main.UF.Manager = function()
	{
		this.mode = this.mode || '';
		this.ajaxUrl = '/bitrix/tools/uf.php';
	};


	BX.Main.UF.Manager.getEdit = function(param, callback)
	{
		return BX.Main.UF.EditManager.get(param, callback);
	};

	BX.Main.UF.Manager.getView = function(param, callback)
	{
		return BX.Main.UF.ViewManager.get(param, callback);
	};

	BX.Main.UF.Manager.prototype.get = function(param, callback)
	{
		if(!this.mode)
		{
			this.displayError([
				'No mode set. Use BX.UF.EditManager or BX.UF.ViewManager'
			]);

			return;
		}

		return this.query(this.mode, {
			FIELDS: param.FIELDS,
			FORM: param.FORM || '',
			CONTEXT: param.CONTEXT || ''
		}, callback);
	};

	BX.Main.UF.Manager.prototype.add = function(param, callback)
	{
		if(!this.mode)
		{
			this.displayError([
				'No mode set. Use BX.UF.EditManager or BX.UF.ViewManager'
			]);

			return;
		}

		return this.query(this.mode, {
			action: 'add',
			FIELDS: param.FIELDS,
			FORM: param.FORM || ''
		}, callback);
	};

	BX.Main.UF.Manager.prototype.update = function(param, callback)
	{
		if(!this.mode)
		{
			this.displayError([
				'No mode set. Use BX.UF.EditManager or BX.UF.ViewManager'
			]);

			return;
		}

		return this.query(this.mode, {
			action: 'update',
			FIELDS: param.FIELDS,
			FORM: param.FORM || ''
		}, callback);
	};

	BX.Main.UF.Manager.prototype.delete = function(param, callback)
	{
		if(!this.mode)
		{
			this.displayError([
				'No mode set. Use BX.UF.EditManager or BX.UF.ViewManager'
			]);

			return;
		}

		return this.query(this.mode, {
			action: 'delete',
			FIELDS: param.FIELDS,
			FORM: param.FORM || ''
		}, callback);
	};

	BX.Main.UF.Manager.prototype.query = function(mode, param, callback)
	{
		BX.ajax({
			dataType: 'json',
			url: this.ajaxUrl,
			method: 'POST',
			data: this.prepareQuery(mode, param),
			onsuccess: this.queryCallback(callback)
		});
	};

	BX.Main.UF.Manager.prototype.prepareQuery = function(mode, param)
	{
		var p = param||{};

		p.mode = mode;
		p.lang = BX.message('LANGUAGE_ID')||'';
		p.tpl = BX.message('UF_SITE_TPL')||'';
		p.tpls = BX.message('UF_SITE_TPL_SIGN')||'';
		p.sessid = BX.bitrix_sessid();

		return p;
	};

	BX.Main.UF.Manager.prototype.queryCallback = function(callback)
	{
		var processResult = BX.proxy(this.processResult, this);
		return function(result)
		{
			processResult(result, callback);
		}
	};

	BX.Main.UF.Manager.prototype.processResult = function(result, callback)
	{
		var asset = '';
		if(BX.type.isArray(result.ASSET))
		{
			asset += result.ASSET.join('\n');
		}

		if(!!result.ERROR)
		{
			this.displayError(result.ERROR);
		}

		return BX.html(null, asset).then(function()
		{
			if(!!callback)
			{
				callback(result.FIELD);
			}
		});
	};

	BX.Main.UF.Manager.prototype.displayError = function(errorList)
	{
		for(var i in errorList)
		{
			if(errorList.hasOwnProperty(i))
			{
				console.error(errorList[i]);
			}
		}
	};

	BX.Main.UF.Manager.prototype.registerField = function(field, fieldDescription, node)
	{
		fieldStack[field] = {
			FIELD: fieldDescription,
			NODE: node
		};
	};

	BX.Main.UF.Manager.prototype.unRegisterField = function(field)
	{
		if(!!fieldStack[field])
		{
			delete fieldStack[field];
		}
	};


	BX.Main.UF.ViewManager = function()
	{
		BX.Main.UF.ViewManager.superclass.constructor.apply(this, arguments);

		this.mode = 'view';
	};
	BX.extend(BX.Main.UF.ViewManager, BX.Main.UF.Manager);

	BX.Main.UF.EditManager = function()
	{
		BX.Main.UF.EditManager.superclass.constructor.apply(this, arguments);

		this.mode = 'edit';
	};
	BX.extend(BX.Main.UF.EditManager, BX.Main.UF.Manager);

	BX.Main.UF.EditManager.prototype.validate = function(fieldList, callback)
	{
		if(fieldList.length > 0)
		{
			var request = [];
			for(var i = 0; i < fieldList.length; i++)
			{
				var value = BX.Main.UF.Factory.getValue(fieldList[i]);
				if(value !== null)
				{
					request.push({
						'ENTITY_ID': fieldStack[fieldList[i]].FIELD.ENTITY_ID,
						'FIELD': fieldStack[fieldList[i]].FIELD.FIELD,
						'ENTITY_VALUE_ID': fieldStack[fieldList[i]].FIELD.ENTITY_VALUE_ID,
						'VALUE': value
					});
				}
			}

			return this.query(this.mode, {
				action: 'validate',
				FIELDS: request
			}, callback);
		}
		else
		{
			this.queryCallback(callback)({'FIELD':[]});
		}
	};

	/**
	 * Base type handler class. Will be initialized in Factory.
	 *
	 * @constructor
	 */

	BX.Main.UF.BaseType = function()
	{
	};

	BX.Main.UF.BaseType.prototype.addRow = function(fieldName, thisButton)
	{
		var element = thisButton.parentNode.getElementsByTagName('span');
		if(element && element.length > 0 && element[0])
		{
			var parentElement = element[0].parentNode; // parent
			var newNode = this.getClone(element[element.length - 1], fieldName);

			if(parentElement === thisButton.parentNode)
			{
				parentElement.insertBefore(newNode, thisButton);
			}
			else
			{
				parentElement.appendChild(newNode);
			}
		}
	};

	BX.Main.UF.BaseType.prototype.getClone = function(node, fieldName)
	{
		var newNode = node.cloneNode(true);

		var inputList = this.findInput(newNode, fieldName);
		for(var i = 0; i < inputList.length; i++)
		{
			inputList[i].value = '';
		}

		return newNode;
	};

	BX.Main.UF.BaseType.prototype.findInput = function(node, fieldName)
	{
		return BX.findChildren(node, {
			tagName: /INPUT|TEXTAREA|SELECT/i,
			attribute: {
				name: fieldName
			}
		}, true);
	};

	BX.Main.UF.BaseType.prototype.isEmpty = function(field)
	{
		var node = this.getNode(field),
			fieldName = field + (
				fieldStack[field].FIELD.MULTIPLE === 'Y'
				? '[]'
				: ''
			);

		if(!BX.isNodeInDom(node))
		{
			console.error('Node for field ' + field + ' is already removed from DOM');
		}

		var nodeList = this.findInput(node, fieldName);

		if(nodeList.length <= 0)
		{
			console.error('Unable to find field ' + field + ' in the registered node');
		}
		else
		{
			for(var i = 0; i < nodeList.length; i++)
			{
				if(nodeList[i].value !== '')
				{
					return false;
				}
			}
		}

		return true;
	};

	BX.Main.UF.BaseType.prototype.getValue = function(field)
	{
		var node = this.getNode(field),
			fieldName = field + (
					fieldStack[field].FIELD.MULTIPLE === 'Y'
						? '[]'
						: ''
				),
			value = fieldStack[field].FIELD.MULTIPLE === 'Y' ? [] : '';

		if(!BX.isNodeInDom(node))
		{
			console.error('Node for field ' + field + ' is already removed from DOM');
		}
		var nodeList = this.findInput(node, fieldName);

		if(nodeList.length <= 0)
		{
			console.error('Unable to find field ' + field + ' in the registered node');
		}
		else
		{
			for(var i = 0; i < nodeList.length; i++)
			{
				if(
					nodeList[i].tagName === 'INPUT'
					&& (nodeList[i].type === 'radio' || nodeList[i].type === 'checkbox')
					&& !nodeList[i].checked
				)
				{
					continue;
				}

				if(fieldStack[field].FIELD.MULTIPLE === 'Y')
				{
					value.push(nodeList[i].value);
				}
				else
				{
					value = nodeList[i].value;
					break;
				}
			}
		}

		return value;
	};

	BX.Main.UF.BaseType.prototype.focus = function(field)
	{
		var node = this.getNode(field),
			fieldName = field + (
					fieldStack[field].FIELD.MULTIPLE === 'Y'
						? '[]'
						: ''
				);

		if(!BX.isNodeInDom(node))
		{
			console.error('Node for field ' + field + ' is already removed from DOM');
		}
		var nodeList = this.findInput(node, fieldName);

		if(nodeList.length > 0)
		{
			BX.focus(nodeList[0]);
		}
	};

	BX.Main.UF.BaseType.prototype.getNode = function(field)
	{
		return fieldStack[field].NODE;
	};

	/**
	 * Integer type handler class. Will be initialized in Factory.
	 *
	 * @constructor
	 */
	BX.Main.UF.TypeBoolean = function()
	{
	};
	BX.extend(BX.Main.UF.TypeBoolean, BX.Main.UF.BaseType);

	BX.Main.UF.TypeBoolean.USER_TYPE_ID = 'boolean';

	BX.Main.UF.TypeBoolean.prototype.isEmpty = function(field)
	{
		return false;
	};

	/**
	 * Integer type handler class. Will be initialized in Factory.
	 *
	 * @constructor
	 */
	BX.Main.UF.TypeInteger = function()
	{
	};
	BX.extend(BX.Main.UF.TypeInteger, BX.Main.UF.BaseType);

	BX.Main.UF.TypeInteger.USER_TYPE_ID = 'integer';

	/**
	 * Double type handler class. Will be initialized in Factory.
	 *
	 * @constructor
	 */
	BX.Main.UF.TypeDouble = function()
	{
	};
	BX.extend(BX.Main.UF.TypeDouble, BX.Main.UF.BaseType);

	BX.Main.UF.TypeDouble.USER_TYPE_ID = 'double';

	/**
	 * String type handler class. Will be initialized in Factory.
	 *
	 * @constructor
	 */
	BX.Main.UF.TypeSting = function()
	{
	};
	BX.extend(BX.Main.UF.TypeSting, BX.Main.UF.BaseType);

	BX.Main.UF.TypeSting.USER_TYPE_ID = 'string';

	/**
	 * URL type handler class. Will be initialized in Factory.
	 *
	 * @constructor
	 */
	BX.Main.UF.TypeUrl = function()
	{
	};
	BX.extend(BX.Main.UF.TypeUrl, BX.Main.UF.BaseType);

	BX.Main.UF.TypeUrl.USER_TYPE_ID = 'url';

	/**
	 * Formatted string type handler class. Will be initialized in Factory.
	 *
	 * @constructor
	 */
	BX.Main.UF.TypeStingFormatted = function()
	{
	};
	BX.extend(BX.Main.UF.TypeStingFormatted, BX.Main.UF.TypeSting);

	BX.Main.UF.TypeStingFormatted.USER_TYPE_ID = 'string_formatted';


	/**
	 * Enumeration type handler class. Will be initialized in Factory.
	 *
	 * @constructor
	 */
	BX.Main.UF.TypeEnumeration = function()
	{
	};
	BX.extend(BX.Main.UF.TypeEnumeration, BX.Main.UF.BaseType);

	BX.Main.UF.TypeEnumeration.USER_TYPE_ID = 'enumeration';

	BX.Main.UF.TypeEnumeration.prototype.findInput = function(node, fieldName)
	{
		var inputList = BX.Main.UF.TypeEnumeration.superclass.findInput.apply(this, arguments);

		if(inputList.length > 0)
		{
			for(var i = 0; i < inputList.length; i++)
			{
				if(inputList[i].tagName === 'INPUT' && inputList[i].type === 'hidden' && inputList.length > 1)
				{
					delete inputList[i];
					break;
				}
			}
		}

		return BX.util.array_values(inputList);
	};

	BX.Main.UF.TypeEnumeration.prototype.focus = function(field)
	{
		if(fieldStack[field] && fieldStack[field].FIELD.SETTINGS.DISPLAY === 'UI')
		{
			BX.fireEvent(BX(fieldStack[field].FIELD.FIELD + '_control').firstChild, 'focus');
		}
		else
		{
			BX.Main.UF.TypeEnumeration.superclass.focus.apply(this, arguments);
		}
	};

	/**
	 * Date type handler class. Will be initialized in Factory.
	 *
	 * @constructor
	 */
	BX.Main.UF.TypeDate = function()
	{
	};
	BX.extend(BX.Main.UF.TypeDate, BX.Main.UF.BaseType);

	BX.Main.UF.TypeDate.USER_TYPE_ID = 'date';

	BX.Main.UF.TypeDate.prototype.focus = function(field)
	{
		var fieldName = field + (
			fieldStack[field].FIELD.MULTIPLE === 'Y'
				? '[]'
				: ''
		);
		var inputList = this.findInput(this.getNode(field), fieldName);

		if(inputList.length > 0)
		{
			BX.fireEvent(inputList[0], 'click');
		}

		BX.Main.UF.TypeDate.superclass.focus.apply(this, arguments);
	};

	/**
	 * Datetime type handler class. Will be initialized in Factory.
	 *
	 * @constructor
	 */
	BX.Main.UF.TypeDateTime = function()
	{
	};
	BX.extend(BX.Main.UF.TypeDateTime, BX.Main.UF.TypeDate);

	BX.Main.UF.TypeDateTime.USER_TYPE_ID = 'datetime';

	/**
	 * Datetime type handler class. Will be initialized in Factory.
	 *
	 * @constructor
	 */
	BX.Main.UF.TypeFile = function()
	{
	};
	BX.extend(BX.Main.UF.TypeFile, BX.Main.UF.BaseType);

	BX.Main.UF.TypeFile.USER_TYPE_ID = 'file';

	BX.Main.UF.TypeFile.prototype.findInput = function(node, fieldName)
	{
		var inputList = BX.Main.UF.TypeFile.superclass.findInput.apply(this, arguments);

		if(inputList.length <= 0)
		{
			inputList = BX.findChildren(node, {
				tagName: /INPUT/i,
				attribute: {
					type: 'file',
					name: /^bxu_files/
				}
			}, true);
		}

		return inputList;
	};

	BX.Main.UF.TypeFile.prototype.getValue = function(field)
	{
		var
			baseValue = BX.Main.UF.TypeFile.superclass.getValue.apply(this, arguments),
			node = fieldStack[field].NODE,
			deletedNodeList = [],
			i;

		if(fieldStack[field].FIELD.MULTIPLE === 'Y')
		{
			var deletedFieldName = field + '_del[]';

			if(BX.type.isArray(baseValue) && baseValue.length > 0)
			{
				deletedNodeList = BX.Main.UF.TypeFile.superclass.findInput.apply(this, [node, deletedFieldName]);

				for(i = 0; i < deletedNodeList.length; i++)
				{
					var pos = BX.util.array_search(deletedNodeList[i].value, baseValue);
					if(pos >= 0)
					{
						baseValue[pos] = {'old_id': deletedNodeList[i].value, 'del': 'Y', 'tmp_name': ''};
					}
				}
			}

			return BX.util.array_values(baseValue);
		}
		else if(baseValue > 0)
		{
			var deletedFieldName = field + '_del';

			deletedNodeList = BX.Main.UF.TypeFile.superclass.findInput.apply(this, [node, deletedFieldName]);

			for(i = 0; i < deletedNodeList.length; i++)
			{
				if(baseValue == deletedNodeList[i].value)
				{
					baseValue = {'old_id': baseValue, 'del': 'Y', 'tmp_name': ''};
					break;
				}
			}

			return baseValue;
		}
	};


	/**
	 * Type handler Factory singleton. Will be initialized below.
	 *
	 * @constructor
	 */
	BX.Main.UF.Factory = function()
	{
		this.defaultTypeHandler = BX.Main.UF.BaseType;

		this.typeHandlerList = {};
		this.objectCollection = {};
	};

	BX.Main.UF.Factory.prototype.setTypeHandler = function(type, handlerClass)
	{
		this.typeHandlerList[type] = handlerClass;
		if(typeof this.objectCollection[type] !== 'undefined')
		{
			delete this.objectCollection[type];
		}
	};

	BX.Main.UF.Factory.prototype.get = function(type)
	{
		if(typeof this.objectCollection[type] === 'undefined')
		{
			this.objectCollection[type] = this.getObject(type);
		}

		return this.objectCollection[type];
	};

	BX.Main.UF.Factory.prototype.getObject = function(type)
	{
		return new (this.typeHandlerList[type]||this.defaultTypeHandler);
	};

	BX.Main.UF.Factory.prototype.getFieldObject = function(field)
	{
		if(typeof fieldStack[field] === 'undefined')
		{
			console.error('Field ' + field + 'is not registered. Use BX.Main.UF.Factory.registerField to register');

			return null;
		}

		return this.get(fieldStack[field]['FIELD']['USER_TYPE_ID']);
	};

	BX.Main.UF.Factory.prototype.isEmpty = function(field)
	{
		if(typeof fieldStack[field] === 'undefined')
		{
			console.error('Field ' + field + 'is not registered. Use BX.Main.UF.Factory.registerField to register');

			return true;
		}

		return this.get(fieldStack[field]['FIELD']['USER_TYPE_ID']).isEmpty(field);
	};

	BX.Main.UF.Factory.prototype.getValue = function(field)
	{
		if(typeof fieldStack[field] === 'undefined')
		{
			console.error('Field ' + field + 'is not registered. Use BX.Main.UF.Factory.registerField to register');

			return null;
		}

		return this.get(fieldStack[field]['FIELD']['USER_TYPE_ID']).getValue(field);
	};

	BX.Main.UF.Factory.prototype.focus = function(field)
	{
		if(typeof fieldStack[field] === 'undefined')
		{
			console.error('Field ' + field + 'is not registered. Use BX.Main.UF.Factory.registerField to register');
		}

		return this.get(fieldStack[field]['FIELD']['USER_TYPE_ID']).focus(field);
	};

	/**
	 * Singletons initialization
	 */

	BX.Main.UF.EditManager = new BX.Main.UF.EditManager();
	BX.Main.UF.ViewManager = new BX.Main.UF.ViewManager();
	BX.Main.UF.Factory = new BX.Main.UF.Factory();

	BX.Main.UF.Factory.setTypeHandler(BX.Main.UF.TypeBoolean.USER_TYPE_ID, BX.Main.UF.TypeBoolean);
	BX.Main.UF.Factory.setTypeHandler(BX.Main.UF.TypeInteger.USER_TYPE_ID, BX.Main.UF.TypeInteger);
	BX.Main.UF.Factory.setTypeHandler(BX.Main.UF.TypeDouble.USER_TYPE_ID, BX.Main.UF.TypeDouble);
	BX.Main.UF.Factory.setTypeHandler(BX.Main.UF.TypeSting.USER_TYPE_ID, BX.Main.UF.TypeSting);
	BX.Main.UF.Factory.setTypeHandler(BX.Main.UF.TypeStingFormatted.USER_TYPE_ID, BX.Main.UF.TypeStingFormatted);
	BX.Main.UF.Factory.setTypeHandler(BX.Main.UF.TypeEnumeration.USER_TYPE_ID, BX.Main.UF.TypeEnumeration);
	BX.Main.UF.Factory.setTypeHandler(BX.Main.UF.TypeFile.USER_TYPE_ID, BX.Main.UF.TypeFile);
	BX.Main.UF.Factory.setTypeHandler(BX.Main.UF.TypeDate.USER_TYPE_ID, BX.Main.UF.TypeDate);
	BX.Main.UF.Factory.setTypeHandler(BX.Main.UF.TypeDateTime.USER_TYPE_ID, BX.Main.UF.TypeDateTime);
})();