Your IP : 3.21.163.234


Current Path : /home/bitrix/ext_www/home-comfort.in.ua/bitrix/js/main/core/
Upload File :
Current File : /home/bitrix/ext_www/home-comfort.in.ua/bitrix/js/main/core/core_frame_cache.js

(function (window)
{
	if (window.BX.frameCache) return;

	var BX = window.BX;
	var localStorageKey = "compositeCache";
	var localStorageKeyPullConfig = "pullConfigCache";
	var lolalStorageTTL = 1440;
	var compositeMessageIds = ["bitrix_sessid", "USER_ID", "SERVER_TIME", "USER_TZ_OFFSET", "USER_TZ_AUTO"];
	var compositeDataFile = "/bitrix/tools/composite_data.php";
	var sessidWasUpdated = false;

	BX.frameCache = function()
	{
	};

	if (BX.browser.IsIE8())
	{
		BX.frameCache.localStorage = new BX.localStorageIE8();
	}
	else if (typeof(localStorage) !== "undefined")
	{
		BX.frameCache.localStorage = new BX.localStorage();
	}
	else
	{
		BX.frameCache.localStorage = {
			set : BX.DoNothing,
			get : function() { return null; },
			remove : BX.DoNothing
		};
	}

	BX.frameCache.localStorage.prefix = function()
	{
		return "bx-";
	};

	BX.frameCache.init = function()
	{
		this.cacheDataBase = null;
		this.tableParams =
		{
			tableName: "composite",
			fields: [
				{name: "id", unique: true},
				"content",
				"hash",
				"props"
			]
		};

		this.frameData = null;
		if (BX.type.isString(window.frameDataString) && window.frameDataString.length > 0)
		{
			BX.frameCache.onFrameDataReceived(window.frameDataString);
		}

		this.vars = window.frameCacheVars ? window.frameCacheVars : {
			page_url: "",
			params: {},
			storageBlocks: []
		};

		this.lastReplacedBlocks = false;

		//local storage warming up
		var lsCache = BX.frameCache.localStorage.get(localStorageKey) || {};
		for (var i = 0; i < compositeMessageIds.length; i++)
		{
			var messageId = compositeMessageIds[i];
			if (typeof(BX.message[messageId]) != "undefined")
			{
				lsCache[messageId] = BX.message[messageId];
			}
		}
		BX.frameCache.localStorage.set(localStorageKey, lsCache, lolalStorageTTL);

		BX.addCustomEvent("onBXMessageNotFound", function(mess)
		{
			if (BX.util.in_array(mess, compositeMessageIds))
			{
				var cache = BX.frameCache.localStorage.get(localStorageKey);
				if (cache && typeof(cache[mess]) != "undefined")
				{
					BX.message[mess] = cache[mess];
				}
				else
				{
					BX.frameCache.getCompositeMessages();
				}
			}
		});

		if (!window.frameUpdateInvoked)
		{
			this.update(false);
			window.frameUpdateInvoked = true;
		}

		if (window.frameRequestStart)
		{
			BX.ready(function() {
				BX.onCustomEvent("onCacheDataRequestStart");
				BX.frameCache.tryUpdateSessid();
			});
		}

		if (window.frameRequestFail)
		{
			BX.ready(function() {
				setTimeout(function() {
					BX.onCustomEvent("onFrameDataRequestFail", [window.frameRequestFail]);
				}, 0);
			});
		}

		BX.frameCache.insertBanner();
	};

	BX.frameCache.getCompositeMessages = function()
	{
		try {
			BX.ajax({
				method: "GET",
				dataType: "json",
				url: compositeDataFile,
				async : false,
				data:  '',
				onsuccess: function(json)
				{
					BX.frameCache.setCompositeVars(json);
				}
			});
		}
		catch (exeption)
		{
			BX.debug("Composite sync request failed.");
		}
	};

	BX.frameCache.setCompositeVars = function(vars)
	{
		if (!vars)
		{
			return;
		}
		else if (vars.lang)
		{
			vars = vars.lang;
		}

		var lsCache = BX.frameCache.localStorage.get(localStorageKey) || {};
		for (var name in vars)
		{
			if (vars.hasOwnProperty(name))
			{
				BX.message[name] = vars[name];

				if (BX.util.in_array(name, compositeMessageIds))
				{
					lsCache[name] = vars[name];
				}
			}
		}

		BX.frameCache.localStorage.set(localStorageKey, lsCache, lolalStorageTTL);
	};

	/**
	 * @param {object} vars
	 * @param {object} [vars.pull] - pull configuration
	 */
	BX.frameCache.setPullConfigVars = function(vars)
	{
		if (!vars || !vars.pull)
		{
			return;
		}

		var cachedPullConfig = BX.frameCache.localStorage.get(localStorageKeyPullConfig);
		var isPullChannelsHaveBeenChanged = false;

		if(cachedPullConfig != null)
		{
			var channels = vars.pull.CHANNEL_ID.split("/");
			var cachedChannels = cachedPullConfig.CHANNEL_ID.split("/");
			isPullChannelsHaveBeenChanged = ((channels[0] != cachedChannels[0]) || (channels[1] != cachedChannels[1]))
		}
		else
		{
			isPullChannelsHaveBeenChanged = true;
		}

		var dt = vars.pull.CHANNEL_DT.split("/");
		var nearChannelExpireTime = Math.min(parseInt(dt[0]),parseInt(dt[1]))+43200;
		var currentTime = Math.round((new Date).getTime() / 1000);
		var ttl = nearChannelExpireTime - currentTime;

		BX.frameCache.localStorage.set(localStorageKeyPullConfig, vars.pull, ttl);

		if(isPullChannelsHaveBeenChanged)
		{
			BX.onCustomEvent("pullConfigHasBeenChanged", [vars.pull]);
		}
	};



	BX.frameCache.getPullConfig = function()
	{
		if(this.frameData && this.frameData.pull)
			return this.frameData.pull;
		else
		{
			return BX.frameCache.localStorage.get(localStorageKeyPullConfig);
		}
	};

	BX.frameCache.processData = function(block)
	{
		if (!block)
		{
			return;
		}

		var container = null;
		var dynamicStart = null;
		var dynamicEnd = null;

		var autoContainerPrefix = "bxdynamic_";
		if (block.ID.substr(0, autoContainerPrefix.length) === autoContainerPrefix)
		{
			dynamicStart = BX(block.ID + "_start");
			dynamicEnd = BX(block.ID + "_end");
			if (!dynamicStart || !dynamicEnd)
			{
				BX.debug("Dynamic area " + block.ID + " was not found");
				return;
			}
		}
		else
		{
			container = BX(block.ID);
			if (!container)
			{
				BX.debug("Container " + block.ID + " was not found");
				return;
			}
		}

		var htmlWasInserted = false;
		var scriptsLoaded = false;
		var assets = getAssets();
		processCSS(insertHTML);
		processStrings();
		processExternalJS(processInlineJS);

		function processCSS(callback)
		{
			var styles = assets.styles;
			if (BX.type.isArray(block.PROPS.CSS) && block.PROPS.CSS.length > 0)
			{
				styles = BX.util.array_merge(block.PROPS.CSS, styles);
			}

			styles.length > 0 ? BX.load(styles, callback) : callback();
		}

		function insertHTML()
		{
			if (container)
			{
				if (block.PROPS.USE_ANIMATION)
				{
					container.style.opacity = 0;
					container.innerHTML = block.CONTENT;
					(new BX.easing({
						duration : 1500,
						start : { opacity: 0 },
						finish : { opacity: 100 },
						transition : BX.easing.makeEaseOut(BX.easing.transitions.quart),
						step : function(state){
							container.style.opacity = state.opacity / 100;
						},
						complete : function() {
							container.style.cssText = '';
						}
					})).animate();
				}
				else
				{
					container.innerHTML = block.CONTENT;
				}
			}
			else
			{
				BX.frameCache.removeNodes(dynamicStart, dynamicEnd);
				dynamicStart.insertAdjacentHTML("afterEnd", block.CONTENT);
			}

			htmlWasInserted = true;
			if (scriptsLoaded)
			{
				processInlineJS();
			}
		}

		function processStrings()
		{
			BX.evalGlobal(assets.inlineJS.join(";"));
		}

		function getAssets()
		{
			var result = { styles: [], inlineJS: [], externalJS: []};
			if (!BX.type.isArray(block.PROPS.STRINGS) || block.PROPS.STRINGS.length < 1)
			{
				return result;
			}

			var parts = BX.processHTML(block.PROPS.STRINGS.join(""), false);
			for (var i = 0, l = parts.SCRIPT.length; i < l; i++)
			{
				var script = parts.SCRIPT[i];
				if (script.isInternal)
				{
					result.inlineJS.push(script.JS);
				}
				else
				{
					result.externalJS.push(script.JS);
				}
			}

			result.styles = parts.STYLE;

			return result;
		}

		function processExternalJS(callback)
		{
			var scripts = assets.externalJS;
			if (BX.type.isArray(block.PROPS.JS) && block.PROPS.JS.length > 0)
			{
				scripts = BX.util.array_merge(scripts, block.PROPS.JS);
			}
			scripts.length > 0 ? BX.load(scripts, callback) : callback();
		}

		function processInlineJS()
		{
			scriptsLoaded = true;
			if (htmlWasInserted)
			{
				BX.ajax.processRequestData(block.CONTENT, {scriptsRunFirst: false, dataType: "HTML"});
			}

			if (BX.type.isArray(block.PROPS.BUNDLE_JS))
			{
				BX.setJSList(block.PROPS.BUNDLE_JS);
			}

			if (BX.type.isArray(block.PROPS.BUNDLE_CSS))
			{
				BX.setCSSList(block.PROPS.BUNDLE_CSS);
			}
		}
	};

	BX.frameCache.removeNodes = function(fromElement, toElement)
	{
		var startFound = false;
		var parent = fromElement.parentNode;
		var nodes = Array.prototype.slice.call(parent.childNodes);
		for (var i = 0, length = nodes.length; i < length; i++)
		{
			if (startFound)
			{
				if (nodes[i] === toElement)
				{
					break;
				}
				else
				{
					parent.removeChild(nodes[i]);
				}
			}
			else if (nodes[i] === fromElement)
			{
				startFound = true;
			}
		}
	};

	BX.frameCache.update = function(makeRequest, noInvoke)
	{
		noInvoke = !!noInvoke;
		makeRequest = typeof(makeRequest) == "undefined" ? true : makeRequest;
		if (makeRequest)
		{
			this.requestData();
		}

		if (!noInvoke)
		{
			BX.ready(BX.proxy(function() {
				if (!this.frameData)
				{
					this.invokeCache();
				}
			}, this));
		}
	};

	BX.frameCache.invokeCache = function()
	{
		//getting caching dynamic blocks
		if (this.vars.storageBlocks && this.vars.storageBlocks.length > 0)
		{
			BX.onCustomEvent(this, "onCacheInvokeBefore", [this.vars.storageBlocks]);
			this.readCacheWithID(this.vars.storageBlocks, BX.proxy(this.insertFromCache, this));
		}
	};

	BX.frameCache.handleResponse = function(json)
	{
		if (json == null)
			return;

		BX.onCustomEvent("onFrameDataReceivedBefore", [json]);

		if (json.dynamicBlocks && json.dynamicBlocks.length > 0)//we have dynamic blocks
		{
			this.insertBlocks(json.dynamicBlocks, false);
			this.writeCache(json.dynamicBlocks);
		}

		BX.onCustomEvent("onFrameDataReceived", [json]);

		if (json.isManifestUpdated == "1" && this.vars.CACHE_MODE === "APPCACHE")//the manifest has been changed
		{
			window.applicationCache.update();
		}

		if (json.htmlCacheChanged === true && this.vars.CACHE_MODE === "HTMLCACHE")
		{
			BX.onCustomEvent("onHtmlCacheChanged", [json]);
		}

		if (BX.type.isArray(json.spread))
		{
			for (var i = 0; i < json.spread.length; i++)
			{
				new Image().src = json.spread[i];
			}
		}

	};

	BX.frameCache.requestData = function()
	{
		var headers = [
			{ name: "BX-ACTION-TYPE", value: "get_dynamic" },
			{ name: "BX-REF", value: document.referrer },
			{ name: "BX-CACHE-MODE", value: this.vars.CACHE_MODE }
		];

		if (this.vars.CACHE_MODE === "APPCACHE")
		{
			headers.push({ name: "BX-APPCACHE-PARAMS", value: JSON.stringify(this.vars.PARAMS) });
			headers.push({ name: "BX-APPCACHE-URL", value: this.vars.PAGE_URL ? this.vars.PAGE_URL : "" });
		}

		BX.onCustomEvent("onCacheDataRequestStart");

		var requestURI = window.location.href;
		var index = requestURI.indexOf("#");
		if (index > 0)
		{
			requestURI = requestURI.substring(0, index);
		}
		requestURI += (requestURI.indexOf("?") >= 0 ? "&" : "?") + "bxrand=" + new Date().getTime();

		BX.ajax({
			timeout: 60,
			method: "GET",
			url: requestURI,
			data: {},
			headers: headers,
			skipBxHeader : true,
			processData: false,
			onsuccess: BX.proxy(BX.frameCache.onFrameDataReceived, this),
			onfailure: function()
			{
				var response = {
					error: true,
					reason: "bad_response",
					url : requestURI,
					xhr: this.xhr,
					status: this.xhr ? this.xhr.status : 0
				};

				BX.onCustomEvent("onFrameDataRequestFail", [response]);
			}
		});
	};

	BX.frameCache.onFrameDataReceived = function(response)
	{
		var result = null;
		try
		{
			eval("result = " + response);
			this.frameData = result;
		}
		catch (e)
		{
			BX.ready(function() {
				setTimeout(function() {
					BX.onCustomEvent("onFrameDataRequestFail", [{
						error: true,
						reason: "bad_eval",
						response: response
					}]);
				}, 0);
			});

			return;
		}

		if (this.frameData && BX.type.isNotEmptyString(this.frameData.redirect_url))
		{
			window.location = this.frameData.redirect_url;
			return;
		}

		if (this.frameData && this.frameData.error === true)
		{
			BX.ready(BX.proxy(function() {
				setTimeout(BX.proxy(function() {
					BX.onCustomEvent("onFrameDataRequestFail", [this.frameData]);
				}, this), 0);
			}, this));

			return;
		}

		BX.frameCache.setCompositeVars(this.frameData);
		BX.frameCache.setPullConfigVars(this.frameData);
		BX.ready(BX.proxy(function() {
			this.handleResponse(this.frameData);
			this.tryUpdateSessid();
		}, this));
	};

	BX.frameCache.insertFromCache = function(resultSet, transaction)
	{
		if (!this.frameData)
		{
			var items = resultSet.items;
			if (items.length > 0)
			{
				for (var i = 0; i < items.length; i++)
				{
					items[i].PROPS = JSON.parse(items[i].PROPS);
				}

				this.insertBlocks(items, true);
			}

			BX.onCustomEvent(this, "onCacheInvokeAfter", [this.vars.storageBlocks, resultSet]);
		}
	};

	BX.frameCache.insertBlocks = function(blocks, fromCache)
	{
		var useHash = this.lastReplacedBlocks.length != 0;

		for (var i = 0; i < blocks.length; i++)
		{
			var block = blocks[i];
			BX.onCustomEvent("onBeforeDynamicBlockUpdate", [block, fromCache]);

			if (block.PROPS.AUTO_UPDATE === false)
			{
				continue;
			}

			var skip = false;
			if (useHash)
			{
				for (var j = 0; j < this.lastReplacedBlocks.length; j++)
				{
					if (this.lastReplacedBlocks[j].ID == block.ID && this.lastReplacedBlocks[j].HASH == block.HASH)
					{
						skip = true;
						break;
					}
				}
			}

			if (!skip)
			{
				this.processData(block)
			}
		}

		BX.onCustomEvent("onFrameDataProcessed", [blocks, fromCache]);
		this.lastReplacedBlocks = blocks;
	};

	BX.frameCache.writeCache = function(blocks)
	{
		for (var i = 0; i < blocks.length; i++)
		{
			if (blocks[i].PROPS.USE_BROWSER_STORAGE === true)
			{
				this.writeCacheWithID(
					blocks[i].ID,
					blocks[i].CONTENT,
					blocks[i].HASH,
					JSON.stringify(blocks[i].PROPS)
				);
			}
		}
	};

	BX.frameCache.openDatabase = function()
	{
		var isDatabaseOpened = (this.cacheDataBase != null);

		if(!isDatabaseOpened)
		{
			this.cacheDataBase = BX.dataBase.create({
				name: "Database",
				displayName: "BXCacheBase",
				capacity: 1024 * 1024 * 4,
				version: "1.0"
			});

			if(this.cacheDataBase != null)
			{
				this.cacheDataBase.createTable(this.tableParams);
				isDatabaseOpened = true;
			}
		}

		return isDatabaseOpened;
	};

	BX.frameCache.writeCacheWithID = function(id, content, hash, props)
	{
		if(BX.frameCache.openDatabase())
		{
			if (typeof props == "object")
			{
				props = JSON.stringify(props)
			}

			this.cacheDataBase.getRows(
				{
					tableName: this.tableParams.tableName,
					filter: {id: id},
					success: BX.proxy(
						function(res)
						{
							if (res.items.length > 0)
							{
								this.cacheDataBase.updateRows(
									{
										tableName: this.tableParams.tableName,
										updateFields: {
											content: content,
											hash: hash,
											props : props
										},
										filter: {
											id: id
										},
										fail:function(e){
											//console.error("Update cache error: ", e);
										}

									}
								);
							}
							else
							{
								this.cacheDataBase.addRow(
									{
										tableName: this.tableParams.tableName,
										insertFields:
										{
											id: id,
											content: content,
											hash: hash,
											props : props
										}
									}
								);
							}

						}, this),
					fail: BX.proxy(function(e)
					{
						this.cacheDataBase.addRow
						(
							{
								tableName: this.tableParams.tableName,
								insertFields: {
									id: id,
									content: content,
									hash: hash,
									props : props
								},
								fail: function(error)
								{
									//console.error("Add cache error: ", error);
								}
							}
						);
					}, this)
				}
			);
		}


	};

	BX.frameCache.readCacheWithID = function(id, callback)
	{
		if(BX.frameCache.openDatabase())
		{
			this.cacheDataBase.getRows
			(
				{
					tableName: this.tableParams.tableName,
					filter: {id: id},
					success: BX.proxy(callback, this)
				}
			);
		}
		else if(typeof callback != "undefined")
		{
			callback({items:[]});
		}

	};

	BX.frameCache.insertBanner = function()
	{
		if (!this.vars.banner || !BX.type.isNotEmptyString(this.vars.banner.text))
		{
			return;
		}

		BX.ready(BX.proxy(function() {
			var banner = BX.create("a", {
				props : {
					className : "bx-composite-btn" + (
						BX.type.isNotEmptyString(this.vars.banner.style) ?
						" bx-btn-" + this.vars.banner.style :
						""
					),
					href : this.vars.banner.url
				},
				attrs : {
					target : "_blank"
				},
				text : this.vars.banner.text
			});

			if (BX.type.isNotEmptyString(this.vars.banner.bgcolor))
			{
				banner.style.backgroundColor = this.vars.banner.bgcolor;
				if (BX.util.in_array(this.vars.banner.bgcolor.toUpperCase(), ["#FFF", "#FFFFFF", "WHITE"]))
				{
					BX.addClass(banner, "bx-btn-border");
				}
			}

			var container = BX("bx-composite-banner");
			if (container)
			{
				container.appendChild(banner);
			}
			else
			{
				BX.addClass(banner, "bx-composite-btn-fixed");
				document.body.appendChild(BX.create("div", {
					style : { position: "relative" },
					children: [ banner ]
				}));
			}
		}, this));
	};

	BX.frameCache.tryUpdateSessid = function()
	{
		if (sessidWasUpdated)
		{
			return;
		}

		var name = "bitrix_sessid";
		var sessid = false;

		if (typeof(BX.message[name]) != "undefined")
		{
			sessid = BX.message[name];
		}
		else
		{
			var cache = BX.frameCache.localStorage.get(localStorageKey) || {};
			if (typeof(cache[name]) != "undefined")
			{
				sessid = cache[name];
			}
		}

		if (sessid !== false)
		{
			sessidWasUpdated = true;
			this.updateSessid(sessid);
		}
	};

	BX.frameCache.updateSessid = function(sessid)
	{
		var inputs = document.getElementsByName("sessid");
		for (var i = 0; i < inputs.length; i++)
		{
			inputs[i].value = sessid;
		}
	};

	//initialize
	BX.frameCache.init();

})(window);