%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /home/bitrix/www/bitrix/templates/landing24/assets/js/helpers/
Upload File :
Create Path :
Current File : //home/bitrix/www/bitrix/templates/landing24/assets/js/helpers/carousel_helper.js

;(function ()
{
	"use strict";

	BX.namespace("BX.Landing.SliderHelper");

	BX.Landing.SliderHelper.activeClass = 'slick-initialized';

	/**
	 * Check activity and init slider if needed
	 */
	// todo: add options
	BX.Landing.SliderHelper.init = function (event, action)
	{
		action = action ? action : 'init';

		var relativeSelector = BX.Landing.SliderHelper.makeCarouselRelativeSelector(event);
		var nodes = event.block.querySelectorAll(relativeSelector);
		if (nodes.length > 0 && !BX.Landing.SliderHelper.isSliderActive(nodes))
		{
			BX.Landing.SliderHelper.initBase(relativeSelector);
			BX.Landing.SliderHelper.goToSlide(event, action);
		}
	};

	BX.Landing.SliderHelper.destroy = function (event)
	{
		var relativeSelector = BX.Landing.SliderHelper.makeCarouselRelativeSelector(event);
		var nodes = event.block.querySelectorAll(relativeSelector);
		if (nodes.length > 0 && BX.Landing.SliderHelper.isSliderActive(nodes))
		{
			// save current slide number
			event.block.slickCurrentSlide = $(relativeSelector).slick("slickCurrentSlide");

			$(relativeSelector).slick('unslick');
		}
	};


	BX.Landing.SliderHelper.isSliderActive = function (nodes)
	{
		var result = false;
		Object.keys(nodes).forEach(function (name)
		{
			if (BX.hasClass(nodes[name], BX.Landing.SliderHelper.activeClass))
			{
				result = true;
			}
		});

		return result;
	};


	/**
	 * Base slider initialization slider without options
	 */
	BX.Landing.SliderHelper.initBase = function (selector)
	{
		$.HSCore.components.HSCarousel.init(selector, {accessibility: false});

		// in editor mode infinity scroll will be create cloned slides - we not need them
		if (BX.Landing.getMode() == 'edit')
		{
			$(selector).slick('slickSetOption', 'infinite', false, true);
		}
	};


	/**
	 * For current event find all parents sliders and return relative (from block id) selector.
	 * If exist some parents sliders - return comma separated selectors.
	 * For sliders get maximal selector (use all classes) to maximum unique.
	 *
	 * @param event
	 * @param carouselClass
	 * @returns {*|string}
	 */
	BX.Landing.SliderHelper.makeCarouselRelativeSelector = function (event, carouselClass)
	{
		// cached value
		if (event.block.carouselRelativeSelector)
		{
			return event.block.carouselRelativeSelector;
		}

		carouselClass = carouselClass || "js-carousel";
		var carouselSelectors = [];

		if (event.block)
		{
			// event may fire on nodes or on card or on selector of deleted card.
			var eventNodes = [];
			if (event.card)
			{
				//card may be outside of the slider (when undo). Find same cards by selector
				eventNodes = event.block.querySelectorAll('.' + event.card.className.split(/\s+/).join('.'));
				// eventNodes = [event.card];
			}
			else if (event.node)
			{
				eventNodes = event.node;
			}
			else if (event.data && event.data.selector)	//selector of deleted card
			{
				eventNodes = event.block.querySelectorAll(event.data.selector.split("@")[0]);
			}

			// convert to array
			if (!BX.type.isArray(eventNodes))
			{
				eventNodes = [eventNodes];
			}

			// fore each event node find parent and take his selector
			eventNodes.forEach(function (n)
			{
				var currCarousel = BX.findParent(n, {className: carouselClass}),
					currSelector = '';
				if (currCarousel)
				{
					// remove slick-classes, because them will may be deleted if slider destroyed
					currCarousel.classList.forEach(function (cl)
					{
						if (cl.indexOf('slick-') == -1)
						{
							currSelector += '.' + cl;
						}
					});

					if (carouselSelectors[carouselSelectors.length - 1] != currSelector)
					{
						carouselSelectors.push(currSelector);
					}
				}
			});
		}

		// if nothing find - use DEFAULT selector
		if (carouselSelectors.length == 0)
		{
			carouselSelectors = ['.' + carouselClass];
		}

		// add BLOCK ID to relative
		carouselSelectors.forEach(function (s, i)
		{
			carouselSelectors[i] = event.makeRelativeSelector(s);
		});

		// todo: make correctly multiply slider selector
		// cache selector
		event.block.carouselRelativeSelector = carouselSelectors.join(',');

		return event.block.carouselRelativeSelector;
	};


	BX.Landing.SliderHelper.goToSlide = function (event, action)
	{
		if (!action)
		{
			return;
		}

		var relativeSelector = BX.Landing.SliderHelper.makeCarouselRelativeSelector(event);
		var currSlideNumber = parseInt(event.block.slickCurrentSlide);

		// for multiple row sliders need use parent container as slide
		var slideContainer = event.card;
		if(
			event.block.querySelector(relativeSelector).dataset.rows &&
			parseInt(event.block.querySelector(relativeSelector).dataset.rows) > 1
		)
		{
			slideContainer = BX.findParent(event.card, {className: 'slick-slide'});
		}
		if (slideContainer)
		{
			var newSlideNumber = parseInt(slideContainer.dataset.slickIndex);
		}

		switch (action)
		{
			case 'add' :
				BX.Landing.SliderHelper.goToNewSlideAfterAdd(relativeSelector, currSlideNumber, newSlideNumber);
				break;

			case 'remove':
				BX.Landing.SliderHelper.goToNewSlideAfterRemove(relativeSelector, currSlideNumber, newSlideNumber);
				break;

			case 'update':
				BX.Landing.SliderHelper.goToSlideAfterUpdate(relativeSelector, currSlideNumber);
				break;

			default:
		}
	};

	/**
	 * Move slider to new slide after add card.
	 *
	 * @param carouselSelector
	 * @param currSlideNumber
	 * @param newSlideNumber
	 */
	BX.Landing.SliderHelper.goToNewSlideAfterAdd = function (carouselSelector, currSlideNumber, newSlideNumber)
	{

		// BX.Landing.SliderHelper.goToNewSlideAfterAdd(relativeSelector, currSlideNumber, newSlideNumber);
		// currSlideNumber = parseInt(currSlideNumber);
		// newSlideNumber = parseInt(newSlideNumber);
		if (BX.type.isNumber(newSlideNumber) && BX.type.isNumber(currSlideNumber))
		{
			// if new slide in visible area - stay on current slide, else - go to next element (one step)
			var slidesToShow = $(carouselSelector).slick('slickGetOption', 'slidesToShow');
			slidesToShow = slidesToShow === true ? 1 : slidesToShow; //slidesToShow can be 'true'
			if ((newSlideNumber - currSlideNumber) >= slidesToShow)
			{
				$(carouselSelector).slick('slickGoTo', currSlideNumber, true);
				$(carouselSelector).slick('slickGoTo', currSlideNumber + 1, false);
			}
			else
			{
				$(carouselSelector).slick('slickGoTo', currSlideNumber, true);
			}
		}
	};


	/**
	 * Move slider to new slide after remove. Stay on current position or move to previously slide, if was removed last element
	 *
	 * @param carouselSelector
	 * @param currSlideNumber
	 * @param newSlideNumber
	 */
	BX.Landing.SliderHelper.goToNewSlideAfterRemove = function (carouselSelector, currSlideNumber, newSlideNumber)
	{
		if (BX.type.isNumber(newSlideNumber) && BX.type.isNumber(currSlideNumber))
		{
			$(carouselSelector).slick('slickGoTo', Math.min(currSlideNumber, newSlideNumber), true);
		}
	}


	BX.Landing.SliderHelper.goToSlideAfterUpdate = function (carouselSelector, currSlideNumber)
	{
		if (BX.type.isNumber(currSlideNumber))
		{
			$(carouselSelector).slick('slickGoTo', currSlideNumber, true);
		}
	}
})();

Zerion Mini Shell 1.0