/**
 * @return {boolean}
 */
Nette.validators.ArtfocusFormsValidators_validateMinDate = function (elem, min, value) {
	if (!Nette.validators.ArtfocusFormsValidators_validateDate(elem, min, value)) {
		return false;
	}
	return min <= value;
};

/**
 * @return {boolean}
 */
Nette.validators.ArtfocusFormsValidators_validateMaxDate = function (elem, max, value) {
	if (!Nette.validators.ArtfocusFormsValidators_validateDate(elem, max, value)) {
		return false;
	}
	return value <= max;
};

/**
 * @return {boolean}
 */
Nette.validators.ArtfocusFormsValidators_validateDate = function (elem, arg, value) {
	d = new Date(value.replace(/-/g, "/"));
	if (Object.prototype.toString.call(d) !== "[object Date]") {
		return false;
	}
	return !isNaN(d.getTime());
};

/**
 * @return {boolean}
 */
Nette.validators.ArtfocusFormsValidators_validateMultiplier = function (elem, arg, value) {
	return (value % arg) === 0;
};

/**
 * @return {boolean}
 */
Nette.validators.ArtfocusFormsValidators_validatePhone = function (elem, country, value) {
	var patterns = {
		'czech': /^((\+|00)420\s?)?([1-9]\d{2}\s?)(\d{3}\s?){2}$/,
		'slovak': /^((\+|00)421|0)\s?([1-9]\d{2}\s?)(\d{3}\s?){2}$/,
		'czsk': /^(((\+|00)42[01])|0)?\s?([1-9]\d{2}\s?)(\d{3}\s?){2}$/,
		'hungary': /^(((\+|00)36)|06)\s?(((\d{3}\s?){3})|((1|([2-9][0-9]))\s?\d{4}\s?\d{3}))$/,
		'poland': /^((\+|00)48\s?)?(((\d{3}\s?){3})|(\d{2}\s?\d{3}\s?\d{2}\s?\d{2}))$/,
		'germany': /^((\+|00)49\s?\d{9}\d?\d?|0([1-9]\d{2})[\s\-]?\d{6}\d?\d?)$/,
		'austria': /^((\+|00)43|0)\s?[1-9](\d+\s?)+$/,
		'deat': /^((\+|00)49\s?\d{9}\d?\d?|0([1-9]\d{2})[\s\-]?\d{6}\d?\d?)$|^((\+|00)43|0)\s?[1-9](\d+\s?)+$/,
	};

	if (country in patterns) {
		return !!value.match(patterns[country]);
	}

	return false;
};

/**
 * @return {boolean}
 */
Nette.validators.ArtfocusFormsValidators_validateZip = function (elem, country, value) {
	var patterns = {
		'czech': /^[1-7]\d{2}\s?\d{2}$/,
		'slovak': /^[089]\d{2}\s?\d{2}$/,
		'czsk': /^\d{3}\s?\d{2}$/,
		'hungary': /^[1-9]\d{3}$/,
		'poland': /^\d{2}[\-\s]?\d{3}$/,
		'germany': /^(D\-|DE\-)?\d{5}$/,
		'austria': /^\d{4}$/,
		'deat': /^((D\-|DE\-)?\d{5})$|^(\d{4})$/,
	};

	if (country in patterns) {
		return !!value.match(patterns[country]);
	}

	return false;
};

/**
 * @return {boolean}
 */
Nette.validators.ArtfocusFormsValidators_validateIco = function (elem, simple, value) {
	if (!!value.match(/^\d{8}$/)) {
		if (simple) {
			return true;
		} else {
			var suma = 0;
			var digits = value.split("");
			var weight = 0;
			for (var i = 0; i < digits.length - 1; i++) {
				weight = digits.length - i;
				suma = suma + weight * parseInt(digits[i]);
			}

			var mod = suma % 11;
			var check = (11 - mod) % 10;

			return check === parseInt(digits[digits.length - 1]);
		}
	}
	return false;
};

// Antispam Control
var netteFormsAntispam = function ($el) {
	$('.aspm-control', $el).val('').hide();
};
netteFormsAntispam($('body'));

var afterDisable = new Event('afterDisable');
var afterEnable = new Event('afterEnable');
var beforeFill = new Event('beforeFill');
var afterFill = new Event('afterFill');

// Dependent Select
var dependentInputs = function ($el) {
	let commonParent = null;
	$('.dependent-select-child', $el).each(function (a, b, c) {
		var child = $(this);
		var parent = $('#' + child.data('parent-input'));
		if (parent.prop('type') === 'text') {
			// text input handles enter as only change, so form is not submitted
			parent.on('keydown', function (ev) {
				if (ev.keyCode === 13) {
					ev.preventDefault();
					$(this)[0].blur();
				}
			});
		}
		parent.on('change', function () {
			var thisParent = $(this);
			var parentIds = getParentDataRecursively(thisParent);

			if (commonParent && thisParent.attr('id') === commonParent.attr('id')) {
				return;
			} else {
				commonParent = thisParent;
			}

			var options = thisParent.data('children-options');
			if (options) {
				// static options (no ajax)
				for (var childId in options) {
					var child = $('#' + childId);
					fillSelect(child, options[childId]);
				}
			} else if (thisParent.val() !== '') {
				// dynamic options, loaded from server's endpoint
				thisParent.attr('disabled', true);
				thisParent.css('opacity', '0.5');
				thisParent[0].dispatchEvent(afterDisable);

				$.ajax({
					type: 'post',
					url: thisParent.data('dependent-endpoint'),
					data: JSON.stringify(parentIds),
				}).done(function (data) {
					commonParent = null;

					thisParent.removeAttr('disabled');
					thisParent.css('opacity', '1');
					thisParent[0].focus();
					thisParent[0].dispatchEvent(afterEnable);

					for (var childId in data.pairs) {
						var child = $('#' + childId);
						if (child.length) {
							child[0].dispatchEvent(beforeFill);
							fillSelect(child, data.pairs[childId]);
							child[0].dispatchEvent(afterFill);
						}
					}
				});
			}
		});

		var getParentDataRecursively = function (parent) {
			var data = {};
			while (parent.length) {
				data[parent.attr('id')] = {};
				data[parent.attr('id')].values = parent.val();
				data[parent.attr('id')].data = parent.data('dependent-request-data');

				parent = $('#' + parent.data('parent-input'));
			}

			return data;
		};

		var fillSelect = function (select, options) {
			select.html('');
			for (var id in options) {
				var el = $('<option>', {
					value: id,
					text: options[id]
				});
				select.append(el);
			}
		};
	});
};
dependentInputs($('body'));

var ImageUpload;
(function (ImageUpload_1) {
    var ImageUpload = (function () {
        function ImageUpload(selectors, namespace) {
            this.selectors = selectors;
            this.namespace = namespace;
            this.createObjects();
            this.attachEventHandlers();
            this.init();
        }
        ImageUpload.prototype.createObject = function (selector) {
            return $(selector + '[data-image-upload-name=' + this.namespace + ']');
        };
        ImageUpload.prototype.createObjects = function () {
            this.objects = {
                choose: this.createObject(this.selectors.choose),
                remove: this.createObject(this.selectors.remove),
                upload: this.createObject(this.selectors.upload),
                preview: this.createObject(this.selectors.preview),
                path: this.createObject(this.selectors.path)
            };
        };
        ImageUpload.prototype.attachEventHandlers = function () {
            var _this = this;
            this.objects.choose.on('click', function (e) {
                e.preventDefault();
                _this.objects.upload.trigger('click');
            });
            this.objects.remove.on('click', function (e) {
                e.preventDefault();
                _this.cleanAll();
            });
            this.objects.upload.on('click', function (e) {
                _this.cleanAll();
            });
        };
        ImageUpload.prototype.cleanAll = function () {
            this.hide(this.objects.choose);
            this.hide(this.objects.remove);
            this.hide(this.objects.preview);
            this.hide(this.objects.path);
            this.show(this.objects.upload);
            this.objects.path.val('');
        };
        ImageUpload.prototype.hide = function (object) {
            object.hide();
        };
        ImageUpload.prototype.show = function (object) {
            object.show();
        };
        ImageUpload.prototype.init = function () {
            this.hide(this.objects.path);
            if (this.objects.path.val()) {
                this.hide(this.objects.upload);
            }
            else {
                this.cleanAll();
            }
        };
        return ImageUpload;
    }());
    var selectors = {
        choose: '.image-upload-choose',
        remove: '.image-upload-remove',
        upload: '.image-upload-upload',
        preview: '.image-upload-preview',
        path: '.image-upload-path'
    };
    $(selectors.upload).each(function () {
        new ImageUpload(selectors, this.getAttribute('data-image-upload-name'));
    });
})(ImageUpload || (ImageUpload = {}));
//# sourceMappingURL=imageUpload.js.map
var AfFileUpload;
(function (AfFileUpload_1) {
    var AfFileUpload = (function () {
        function AfFileUpload(element) {
            this.element = element;
            this.init();
        }
        AfFileUpload.load = function () {
            $('.file-upload-upload').each(function () {
                new AfFileUpload($(this));
            });
        };
        AfFileUpload.prototype.init = function () {
            if (this.element.data('uploaded')) {
                var element_1 = this.element;
                element_1.hide();
                element_1.siblings('.file-upload-remove').on('click', function () {
                    element_1.show();
                    element_1.siblings('.file-upload-path').val(null);
                    element_1.siblings().not('.file-upload-path').hide();
                });
            }
            else {
                this.element.siblings().not('.file-upload-path').hide();
            }
        };
        return AfFileUpload;
    }());
    AfFileUpload_1.AfFileUpload = AfFileUpload;
    AfFileUpload.load();
})(AfFileUpload || (AfFileUpload = {}));
//# sourceMappingURL=fileUpload.js.map
// _fid= remove
(function ($, undefined) {

	// Is History API reliably supported? (based on Modernizr & PJAX)
	if (!(window.history && history.pushState && window.history.replaceState
		&& !navigator.userAgent.match(/((iPod|iPhone|iPad).+\bOS\s+[1-4]|WebApps\/.+CFNetwork)/))) return;

	// thx to @ic (http://forum.nette.org/cs/profile.php?id=1985, http://forum.nette.org/cs/4405-flash-zpravicky-bez-fid-v-url#p43713)
	$.nette.ext('fidRemove', {
		init: function () {
			var that = this;
			setTimeout(function () {
				var url = window.location.toString();
				var pos = url.indexOf('_fid=');
				if (pos !== -1) {
					window.history.replaceState({}, null, that.removeFid(url, pos));
				}
			}, this.timeout);
		}
	}, {
		timeout: 3000,
		removeFid: function (url, pos) {
			url = url.substr(0, pos) + url.substr(pos + 9);
			if ((url.substr(pos - 1, 1) === '?') || (url.substr(pos - 1, 1) === '&')) {
				url = url.substr(0, pos - 1) + url.substr(pos);
			}
			return url;
		}
	});

})(jQuery);

// URL replace by request
(function ($, undefined) {

	$.nette.ext('location.request', {
		success: function (payload, status, xhr, settings) {
			if (payload.urlPushNoRequest === undefined && payload.replace === undefined && payload.urlHistory  !== 'noChange' && settings.urlHistory !== 'noChange') {
				if (settings.url && settings.nette && this.isEnabled(settings.nette.el)) {
					var url = settings.url;

					var isForm = settings.nette.form;
					if (isForm && settings.nette.form.get(0).method === 'get') {
						url += '?' + settings.data;
					}

					this.pushUrl(url);
				}
			}
		}
	}, {
		hasHistoryApi: function () {
			return window.history && history.pushState && history.replaceState;
		},
		isEnabled: function ($el) {
			return $el.is('[data-ajax-change-location]') || $el.parents().is('[data-ajax-change-location]');
		},
		replaceUrl: function (url) {
			if (this.hasHistoryApi) {
				history.replaceState({
					nette: true,
					href: url
				}, document.title, url);
			}
		},
		pushUrl: function (url) {
			if (this.hasHistoryApi) {
				history.replaceState({reload: window.location.href}, "", window.location.href);
				history.pushState({
					nette: true,
					reload: url
				}, document.title, url);
			}
		}
	});

})(jQuery);

// URL replace + change by response
(function ($, undefined) {

	$.nette.ext('location.response', {
		success: function (payload) {
			if (payload.replace) {
				this.replaceUrl(payload.replace);
				this.fetch(payload.replace);
				return false;
			}
			if (payload.urlReplaceNoRequest) {
				this.replaceUrl(payload.urlReplaceNoRequest);
			}
			if (payload.urlPushNoRequest) {
				window.history.replaceState({reload: window.location.href}, "", window.location.href);
				window.history.pushState({reload: payload.urlPushNoRequest}, "", payload.urlPushNoRequest);
				if (window.location.hash) {
					var scrollToEl = $(window.location.hash);
					if (scrollToEl.length) {
						$('html, body').animate({
							scrollTop: scrollToEl.offset().top
						}, 600);
					}
				}
			}
		}
	}, {
		hasHistoryApi: function () {
			return window.history && history.pushState && history.replaceState;
		},
		replaceUrl: function (url) {
			if (this.hasHistoryApi) {
				history.replaceState({
					nette: true,
					reload: url
				}, document.title, url);
			}
		},
		fetch: function (url) {
			$.nette.ajax({
				url: url,
				urlHistory: 'noChange',
				validate: {
					keys: false
				}
			});
		}
	});

})(jQuery);

$(window).on('popstate', function (e) {
	if (e.originalEvent.state && e.originalEvent.state.reload) {
		$.nette.ajax({url: e.originalEvent.state.reload});
	}
});

// Element ID scrolling (hash in URL)
(function ($, undefined) {

	$.nette.ext('hashScroll', {
		success: function (payload, status, jqXHR, settings) {
			var url = settings.url || '';
			var m = url.match(/#(.+)/);
			if (!m) {
				return;
			}

			var $el = this.find(m[0]);
			if (!$el) {
				return;
			}

			this.scroll($el);
		}
	}, {
		find: function (selector) {
			return $('body').find(selector);
		},
		scroll: function ($el) {
			if ($.artfocus.doScroll) {
				$.artfocus.doScroll($el);
			} else {
				this.scroll($el);
			}
		},
		doScroll: function ($el) {
			$('html, body').animate({
				scrollTop: $el.offset().top
			}, 'slow');
		}
	});

})(jQuery);

// Product list filter LastClick
(function ($, undefined) {
	$.nette.ext('filter.lastClick', {
		success: function (payload, status, jqXHR, settings) {
			var lastClick = payload.lastClick;
			if (lastClick) {
				console.log(lastClick);

				console.log('#filter-' + lastClick);
				var panel = $('#filter-' + lastClick);
				//var section = $('#filter-' + lastClick).parent().find('.title a');
				panel.addClass('in');
				$('#filter-more').addClass('in');
			}
		}
	});

})(jQuery);

/// <reference path="jquery.d.ts" />
var LazyImage;
(function (LazyImage_1) {
    var LazyImage = (function () {
        function LazyImage(selector, tresshold) {
            var _this = this;
            if (tresshold === void 0) { tresshold = 200; }
            this.tresshold = tresshold;
            this.elements = [];
            this.attributesMap = {
                'data-srcset': 'srcset',
                'data-src': 'src'
            };
            this.attachListeners = function () {
                var callback = new Throttle(_this.tryCreateImages);
                window.addEventListener('resize', callback.invoke);
                window.addEventListener('scroll', callback.invoke);
                callback.invoke();
            };
            this.tryCreateImages = function () {
                _this.elements.forEach(function (element, key) {
                    if (_this.canBeCreated(element)) {
                        _this.createImage(element);
                        delete _this.elements[key];
                    }
                });
            };
            this.canBeCreated = function (element) {
                var viewport = {};
                viewport.top = _this.window.scrollTop();
                viewport.bottom = viewport.top + _this.window.height() + _this.tresshold;
                var image = {};
                image.top = element.offset().top;
                image.bottom = image.top + element.outerHeight();
                var topMatches = ((image.top >= viewport.top) && (image.top <= viewport.bottom));
                var bottomMatches = ((image.bottom >= viewport.top) && (image.bottom <= viewport.bottom));
                return topMatches || bottomMatches;
            };
            this.createImage = function (element) {
                $.each(_this.attributesMap, function (from, to) {
                    var attr = element[0].attributes[from];
                    if (attr) {
                        element.attr(to, attr.value);
                    }
                });
                element.css('visibility', 'visible').hide().fadeIn(200);
            };
            this.window = $(window);
            $.each(document.querySelectorAll(selector), function (key, node) {
                var element = $(node);
                if (!element.data('lazy-image')) {
                    element.data('lazy-image', true);
                    element.css('visibility', 'hidden');
                    _this.elements.push(element);
                }
            });
            this.attachListeners();
        }
        return LazyImage;
    })();
    LazyImage_1.LazyImage = LazyImage;
    var Throttle = (function () {
        function Throttle(callback) {
            var _this = this;
            this.callback = callback;
            this.inProgress = false;
            this.setThrottle = function (seconds) {
                _this.throttle = seconds;
            };
            this.invoke = function () {
                if (_this.inProgress) {
                    return;
                }
                _this.inProgress = true;
                _this.timer = setTimeout(function () {
                    _this.callback();
                    _this.inProgress = false;
                }, _this.throttle);
            };
            this.setThrottle(1000 / 15); // 15fps
        }
        return Throttle;
    })();
})(LazyImage || (LazyImage = {}));
//# sourceMappingURL=lazyImage.js.map
$.artfocus = $.artfocus || {};

/**
 * Checks if the current device is touch.
 * @returns {Boolean}
 */
$.artfocus.isTouch = function () {
	return ('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch ||
		(typeof(navigator.msMaxTouchPoints) !== 'undefined' && (navigator.msMaxTouchPoints > 0));
};

/**
 * Checks if the current device is mobile.
 * @returns {Boolean}
 */
$.artfocus.isMobile = function () {
	return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
};

/**
 * Loads JS.
 * @param path
 * @param onload
 */
$.artfocus.loadScript = function (path, onload) {
	var i = document.createElement('script');
	i.src = path;
	i.onload = onload;

	document.getElementsByTagName('head')[0].appendChild(i);
};

/**
 * Loads CSS.
 * @param path
 */
$.artfocus.loadStyle = function (path) {
	var i = document.createElement('link');
	i.rel = 'stylesheet';
	i.type = 'text/css';
	i.href = path;

	document.getElementsByTagName('head')[0].appendChild(i);
};

/**
 * @param number
 * @param width
 * @returns {string}
 */
$.artfocus.zeroFill = function (number, width) {
	width -= number.toString().length;
	if (width > 0) {
		return new Array(width + (/\./.test(number) ? 2 : 1)).join('0') + number;
	}
	return number + ""; // always return a string
};

/**
 * Gets birth date form czech personal number.
 * @param {String} personalNumber Personal number in format YYMMDD/XXXXXX
 * @returns {Boolean|String}
 */
$.artfocus.personalNumberToDate = function (personalNumber) {
	var matches = personalNumber.match(/^([0-9]{2})([0-9]{2})([0-9]{2})\/([0-9]{3,4})$/);
	if (matches) {
		var date = ((matches[4].length) < 4 || matches[1] >= 54 ? "19" : "20");
		date += matches[1] + "-" + $.artfocus.zeroFill(matches[2] % 50, 2) + "-" + matches[3];
		return date;
	}
	return false;
};

/**
 * Returns a global variable content or default value if variable not exists.
 * @param {string} variable
 * @param {*} defaultValue
 * @returns {*}
 */
$.artfocus.global = function (variable, defaultValue) {
	return (typeof window[variable] !== 'undefined' ? window[variable] : defaultValue);
};

/**
 * Plural: three forms, special cases for 1 and 2, 3, 4.
 * @param {int} count
 * @param {string|array} first
 * @param {string} second
 * @param {string} third
 * @returns {string}
 */
$.artfocus.plural = function (count, first, second, third) {
	var args = [];
	if (typeof first !== "array" && typeof first !== "object") {
		args[0] = first;
		args[1] = second || args[0];
		args[2] = third || args[1];
	} else {
		args[0] = first[0];
		args[1] = first[1] || args[0];
		args[2] = first[2] || args[1];
	}

	if (count >= 2 && count <= 4) {
		return args[1];
	} else if (count === 1) {
		return args[0];
	} else {
		return args[2];
	}
};

// after ajax
(function ($) {
	var live = function () {
		var self = this;
		var $body = $('body');
		var callbacks = [];

		// add callback
		this.add = function (callback) {
			callbacks.push(callback);
		};

		// trigger all set callbacks
		this.trigger = function ($el, type) {
			for (var i in callbacks) {
				callbacks[i]($el, type);
			}
		};

		// document ready
		$(function () {
			self.trigger($body, 'ready');
		});

		// after snippet draw
		$.nette.ext('artfocus.spinner', {
			init: function () {
				var snippets = this.ext('snippets', true);
				snippets.after(function ($el) {
					self.trigger($el, 'ajax');
				});
			},
			start: function (jqXHR, settings) {
				// create ajax loader animation
				var $ajaxContainer = self.getAjaxContainerFromSettings(settings);
				self.createLoader($ajaxContainer);
			},
			complete: function (jqXHR, status, settings) {
				// clean-up ajax loader animation
				var $ajaxContainer = self.getAjaxContainerFromSettings(settings);
				if (!$ajaxContainer) {
					$ajaxContainer = self.getOuterAjaxContainerFromNewHtml(settings);
				}
				if ($ajaxContainer) {
					$ajaxContainer.removeClass('ajaxloading').find('.ajaxloader').remove();
				}
			}
		});

		// custom loader callers
		$body.on('submit', 'form[data-ajax-container]', function () {
			var $this = $(this);
			var $ajaxContainer = self.getAjaxContainer($this);
			self.createLoader(($ajaxContainer) ? $ajaxContainer : $this);
		});

		$body.on('click', 'a[data-ajax-container]', function () {
			var $ajaxContainer = self.getAjaxContainer($(this));
			self.createLoader($ajaxContainer);
		});

		$body.on('change', 'select[data-ajax-container]', function () {
			var $ajaxContainer = self.getAjaxContainer($(this));
			self.createLoader($ajaxContainer);
		});

		$body.on('change', 'input:radio[data-ajax-container]', function () {
			var $ajaxContainer = self.getAjaxContainer($(this));
			self.createLoader($ajaxContainer);
		});

		$body.on('change', 'input:checkbox[data-ajax-container]', function () {
			var $ajaxContainer = self.getAjaxContainer($(this));
			self.createLoader($ajaxContainer);
		});

		// factories & builders
		this.createLoader = function ($ajaxContainer) {
			if (!$ajaxContainer) {
				return;
			}

			var $ajaxLoader = self.getAjaxLoader();
			$ajaxContainer.prepend($ajaxLoader).addClass('ajaxloading');

			$ajaxLoader.css({
				position: 'absolute',
				marginTop: ($ajaxContainer.height() / 2) - ($ajaxLoader.height() / 2),
				marginLeft: ($ajaxContainer.width() / 2) - ($ajaxLoader.width() / 2)
			});
		};

		this.getAjaxLoader = function () {
			var loader = '';
			for (var i = 1; i <= 8; i++) {
				loader += '<div class="ajaxloader_' + i + '"></div>';
			}

			return $('<div class="ajaxloader">' + loader + '</div>');
		};

		this.getAjaxContainer = function (el) {
			if (el) {
				var selector = el.data('ajax-container');
				if (typeof selector === 'undefined') {
					return self.getClosestAjaxContainer(el);
				}

				if (selector === '' || selector.match(/^(self|this)$/)) {
					return el;
				}

				if (selector) {
					return $(selector);
				}
			}

			return false;
		};

		this.getClosestAjaxContainer = function (el) {
			var closest = el.closest('[data-ajax-container]');
			return (closest.length) ? self.getAjaxContainer(closest) : false;
		};

		this.getElementFromSettings = function (settings) {
			return (settings.nette) ?
				(settings.nette.form || settings.nette.el) :
				settings.el;
		};

		this.getAjaxContainerFromSettings = function (settings) {
			var el = self.getElementFromSettings(settings);
			return self.getAjaxContainer(el);
		};

		/**
		 * Finds data-ajax-container even if is not inside snippet element and is defined only by data-ajax-container=""
		 * @param settings
		 * @returns {JQuery|boolean}
		 */
		this.getOuterAjaxContainerFromNewHtml = function (settings) {
			var el = self.getElementFromSettings(settings);
			if (el && el[0]) {
				if (el[0].id) {
					var ajaxContainer = self.getAjaxContainer($('#' + el[0].id));
					if (ajaxContainer) {
						return ajaxContainer;
					} else {
						console.log('could not find element with ID: ' + el[0].id);
						return false;
					}
				} else {
					console.log('can not remove ajax spinner from ajax-container without html ID');
					return false;
				}
			}
		};
	};

	$.artfocus.live = new live();
})(jQuery);

// geo positions
// requires: <script src="//maps.googleapis.com/maps/api/js?key={$settings->get('address.apiKey')}"></script>
$.artfocus.geoPositions = {
	fromAddress: function (address, callback) {
		var geocoder = new google.maps.Geocoder();
		geocoder.geocode({'address': address}, function (results, status) {
			var positions = $.artfocus.geoPositions._processStatus(results, status);
			callback(positions);
		});
	},
	_processStatus: function (results, status) {
		if (status == google.maps.GeocoderStatus.OK) {
			return {
				latitude: results[0].geometry.location.lat(),
				longitude: results[0].geometry.location.lng()
			};
		}

		console.error("Geocode was not successful for the following reason: " + status);
		return false;
	}
};

// auto-submit
$(function () {
	$('body').on('change', '.auto-submit', function (e) {
		if (e.target.type === 'radio') {
			if (!e.target.checked) {
				return;
			}
		}
		$(this).parents('form').submit();
	});
});

$.artfocus = $.artfocus || {};

/**
 * On change toggle class 'hide' on elements with class defined as a value of "data-showhide".
 * @param {jQuery} scope
 */
$.artfocus.showHide = function (scope) {
	var selector = '[data-showhide]';

	var process = function (obj) {
		var $obj = $(obj);
		var $showHide = $('.' + $obj.data('showhide'));
		$showHide.toggleClass('hide');
	};

	var run = function () {
		$(selector, scope).on('click', function (e) {
			process(this);
			if ($(this).prop('tagName') === 'A') {
				e.preventDefault();
			}
		});
		$('input[type=checkbox]' + selector).add('input[type=radio]' + selector).each(function () {
			if ($(selector, scope).is(':checked')) {
				process(this);
			}
		});
	};

	run();
};

/* FILTER PRICE SLIDER works without this, but with this it doesn't work
   see: www/artcms/js/filter.slider.js
 */
/**
 * Updates values between range and number inputs
 * @param {jQuery} scope
 */
/*
$.artfocus.sliders = function (scope) {
	var selector = 'input[data-connected-with]';
	$(selector, scope).each(function () {
		var $source = $(this);
		var $target = $('#' + $source.data('connected-with'));

		$([$source, $target]).each(function () {
			var $this = this;
			var $that = ($this === $source) ? $target : $source;

			$this.on('change', function () {
				if ($this.data('artfocus-sliders-trigger')) {
					$this.removeData('artfocus-sliders-trigger');
					return;
				}
				$that.val($this.val());
				$that.data('artfocus-sliders-trigger', true).trigger('change');
			});
		});
	});

	$(selector).trigger('change');
};
*/
/**
 * Creates better tooltips.
 * @param {string} selector
 * @param {jQuery} scope
 */
$.artfocus.tooltips = function (selector, scope) {
	selector = selector || '[title][title!=""]';
	var tooltipClass = 'artfocus-tooltip';

	$(selector, scope).each(function () {
		var $this = $(this);
		var $body = $('body');
		var $afTooltip = $('<div class="' + tooltipClass + '" style="display: none;">' + $this.prop('title') + '</div>');

		$this.removeAttr('title');
		$body.prepend($afTooltip);

		$this.on('mouseenter', function () {
			$afTooltip.show();
		});
		$this.on('mousemove', function (e) {
			$afTooltip.offset({
				left: e.pageX + 15,
				top: e.pageY + 10
			});
		});
		$this.on('mouseleave', function () {
			$afTooltip.hide();
		});
	});
};

/** overlinks
 * @param {string} selector
 * @param {jQuery} scope
 */
$.artfocus.overlink = function (selector, scope) {
	selector = selector || '.overlink';
	$(selector, scope).not('a').each(function () {
		var $this = $(this);
		var $firstLink = $this.find('a:first');
		var $newContent = $('<a>').attr('href', $firstLink.attr('href')).html($this.html()).attr('class', $this.attr('class'));
		$this.replaceWith($newContent);
	});
};

/** change URL
 * @param {string} selector
 * @param {jQuery} scope
 */
$.artfocus.changeUrl = function (selector, scope) {
	var defaultSelector = '[data-change-location]';
	var deprecatedSelector = '.change-url'; // @deprecated
	selector = selector || defaultSelector + ', ' + deprecatedSelector;

	$(selector, scope).on('change', function () {
		var $this = $(this);

		if ($this.is('select')) {
			$this = $('option:selected', $this);
		}

		var url = $this.attr('data-change-location');

		if (!url) {
			url = $this.attr('data-location');
		}

		// @deprecated
		if (!url) {
			url = $this.attr('data-url');
		}

		if (url && isAjax($this)) {
			$.nette.ajax({
				url: url,
				el: $this
			});
		} else if (url) {
			window.location.href = url;
		} else {
			console.error('Attribute `data-change-location` is not defined or is empty.');
		}
	});

	var isAjax = function ($el) {
		return ($el.hasClass('ajax') || $el.parents('.ajax').length) && $.nette && $.nette.ajax;
	};
};

/**
 * Countdowns time.
 */
$.artfocus.countdown = function () {
	var selector = ".countdown";
	var objects = {};
	setInterval(function () {
		$(selector).each(function () {
			initCountdownObjects(this);
			if (getTotalTime()) {
				minusSecond();
			}
		});
	}, 1000);

	var initCountdownObjects = function (obj) {
		var $obj = $(obj);
		objects = {
			days: $obj.find(".days"),
			daysWord: $obj.find(".daysWord"),
			hours: $obj.find(".hours"),
			minutes: $obj.find(".minutes"),
			seconds: $obj.find(".seconds")
		};
	};

	var getTotalTime = function () {
		var seconds = parseInt(objects.seconds.text());
		var minutes = parseInt(objects.minutes.text());
		var hours = parseInt(objects.hours.text());
		var days = parseInt(objects.days.text());
		return seconds + hours + minutes + hours + days;
	};

	var minusSecond = function () {
		var seconds = objects.seconds.text() - 1;
		if (seconds < 0) {
			seconds = 59;
			minusMinute();
		}
		objects.seconds.text($.artfocus.zeroFill(seconds, 2));
	};

	var minusMinute = function () {
		var minutes = objects.minutes.text() - 1;
		if (minutes < 0) {
			minutes = 59;
			minusHour();
		}
		objects.minutes.text($.artfocus.zeroFill(minutes, 2));
	};

	var minusHour = function () {
		var hours = objects.hours.text() - 1;
		if (hours < 0) {
			hours = 23;
			minusDay();
		}
		objects.hours.text($.artfocus.zeroFill(hours, 2));
	};

	var minusDay = function () {
		var days = objects.days.text() - 1;
		if (days < 0) {
			days = 0;
		}
		var daysWord = objects.daysWord.data("plural");
		objects.daysWord.text($.artfocus.plural(days, daysWord));
		objects.days.text(days);
	};
};

// pair selects
$.artfocus.pairSelects = function ($el) {
	let dataSelector = 'data-pair-select';
	let lastClickId = null;
	let pairSelectInputs = $('select[' + dataSelector + ']', $el);
	if ('ontouchstart' in window) {
		// TOUCH
		pairSelectInputs.each((n,element) => {
			// SELECT ALL SELECTED
			if (!element.id.includes('_source')) {
				for (var i = 0; i < element.options.length; i++) {
					element.options[i].selected = true;
				}
			}
		});
		pairSelectInputs.on('change', function () {
			// let's do the work
			let $pair = $('#' + $(this).attr(dataSelector));
			let i = 0;
			if (this.id.includes('_source')) {
				// add to selected
				for (i; i < this.options.length; i++) {
					if (this.options[i].selected) {
						doMoveOption($pair, $(this.options[i]), true);
					}
				}
			} else {
				// remove from selected
				for (i; i < this.options.length; i++) {
					if (!this.options[i].selected) {
						doMoveOption($pair, $(this.options[i]), false);
					}
				}
			}
		});
	} else {
		// MOUSE
		pairSelectInputs.on('click', function (ev) {
			let clickTarget = $(ev.target);
			if (clickTarget.val() !== lastClickId) {
				lastClickId = $(ev.target).val();
				setTimeout(function () {
					lastClickId = null;
				}, 500);
				return;
			}
			lastClickId = null;
			var $this = $(this);
			var $pair = $('#' + $this.attr(dataSelector));

			doMoveOption($pair, clickTarget, false);
		});
	}

	function doMoveOption($pair, clickTarget, selected) {
		if (!$pair.prop('id').includes('_source') && clickTarget.prop('disabled')) {
			alert('Tuto položku nelze použít.');
		} else {
			$pair.append(clickTarget);
			$('option', $pair).prop('selected', selected);
		}
	}

	$('form', $el).on('submit', function () {
		$('select[' + dataSelector + '] option', $(this)).prop('selected', true);
	});

	$('.pair-select-overlay').remove();
};

// IFRAME z-index fix (YouTube)
$.artfocus.iframeZindexFix = function (selector) {
	selector = selector || 'iframe';
	$(selector).each(function () {
		var $this = $(this);
		var url = $this.attr("src");
		var queryAnd = ($this.attr("src").indexOf("?") > 0) ? "&" : "?";

		$this.attr({
			"src": url + queryAnd + "wmode=transparent",
			"wmode": "Opaque"
		});
	});
};

// scrolling
$.artfocus.scrollTo = function (selector) {
	selector = selector || '.scroll-to';

	$('body').on('click', selector, function () {
		var $this = $(this);
		var target = $this.attr('data-target') || $this.attr('href');

		$.artfocus.doScroll($(target));
		return false;
	});
};

$.artfocus.doScroll = function ($target) {
	if ($target.length) {
		$('html, body').animate({
			scrollTop: $target.offset().top
		}, 'slow');
	}
};

/**
 * @param options
 */
$.artfocus.requiredStar = function (options) {
	options = $.extend({
		'context': $('body'),
		'class': 'star',
		'content': ' *'
	}, options);

	var appendStar = function ($label) {
		if ($label.data('has-star')) {
			return;
		}

		var $star = $('<span>')
			.attr('class', options['class']) // IE8 & 'class'
			.html(options.content);

		$label.data('has-star', true).append($star);
	};

	$('form:not(.no-stars) [required]', options.context)
		.not('input[type=checkbox], input[type=radio]')
		.each(function () {
			var $label = options.context.find('label[for="' + this.getAttribute('id') + '"]');
			appendStar($label);
		});

	appendStar($('.required-star', options.context));
};

/**
 * Money formatter.
 * @param {Number} number
 * @param {string|null} [symbol]
 * @param {Number|null} [decimals]
 * @returns {string}
 *
 * TODO Format currency also by current locale, not only by currency symbol.
 */
$.artfocus.money = function (number, symbol, decimals) {
	if ((typeof symbol === 'undefined') || symbol === null) {
		symbol = $.artfocus.moneyConfig.symbol;
	}
	if (typeof decimals === 'undefined' || decimals === null) {
		decimals = $.artfocus.moneyConfig.decimals;
	}

	switch (symbol) {
		case 'CZK':
			return $.artfocus.numberFormat(number, decimals, ',', ' ') + ' Kč';
		case 'PLN':
			return $.artfocus.numberFormat(number, decimals, ',', ' ') + ' zł';
		case 'EUR':
			return '€ ' + $.artfocus.numberFormat(number, decimals, '.', ',');
		case 'USD':
			return '$' + $.artfocus.numberFormat(number, decimals, ',', ' ');
		case 'GBP':
			return '£' + $.artfocus.numberFormat(number, decimals, '.', ',');
		case 'HUF':
			return $.artfocus.numberFormat(number, decimals, ',', ' ') + ' Ft';
		default:
			return symbol + ' ' + $.artfocus.numberFormat(number, decimals, '.', ',');
	}
};

$.artfocus.moneyConfig = $.artfocus.moneyConfig || {};
$.artfocus.moneyConfig.symbol = $.artfocus.moneyConfig.symbol || $.artfocus.global('AF_MONEY_SYMBOL', 'CZK');
$.artfocus.moneyConfig.decimals = $.artfocus.moneyConfig.decimals || $.artfocus.global('AF_MONEY_DECIMALS', 2);

$.artfocus.numberFormat = function (number, decimals, dec_point, thousands_sep) {
	//  discuss at: http://phpjs.org/functions/number_format/
	// original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
	// improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
	// improved by: davook
	// improved by: Brett Zamir (http://brett-zamir.me)
	// improved by: Brett Zamir (http://brett-zamir.me)
	// improved by: Theriault
	// improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
	// bugfixed by: Michael White (http://getsprink.com)
	// bugfixed by: Benjamin Lupton
	// bugfixed by: Allan Jensen (http://www.winternet.no)
	// bugfixed by: Howard Yeend
	// bugfixed by: Diogo Resende
	// bugfixed by: Rival
	// bugfixed by: Brett Zamir (http://brett-zamir.me)
	//  revised by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
	//  revised by: Luke Smith (http://lucassmith.name)
	//    input by: Kheang Hok Chin (http://www.distantia.ca/)
	//    input by: Jay Klehr
	//    input by: Amir Habibi (http://www.residence-mixte.com/)
	//    input by: Amirouche
	//   example 1: number_format(1234.56);
	//   returns 1: '1,235'
	//   example 2: number_format(1234.56, 2, ',', ' ');
	//   returns 2: '1 234,56'
	//   example 3: number_format(1234.5678, 2, '.', '');
	//   returns 3: '1234.57'
	//   example 4: number_format(67, 2, ',', '.');
	//   returns 4: '67,00'
	//   example 5: number_format(1000);
	//   returns 5: '1,000'
	//   example 6: number_format(67.311, 2);
	//   returns 6: '67.31'
	//   example 7: number_format(1000.55, 1);
	//   returns 7: '1,000.6'
	//   example 8: number_format(67000, 5, ',', '.');
	//   returns 8: '67.000,00000'
	//   example 9: number_format(0.9, 0);
	//   returns 9: '1'
	//  example 10: number_format('1.20', 2);
	//  returns 10: '1.20'
	//  example 11: number_format('1.20', 4);
	//  returns 11: '1.2000'
	//  example 12: number_format('1.2000', 3);
	//  returns 12: '1.200'
	//  example 13: number_format('1 000,50', 2, '.', ' ');
	//  returns 13: '100 050.00'
	//  example 14: number_format(1e-8, 8, '.', '');
	//  returns 14: '0.00000001'

	number = (number + '')
		.replace(/[^0-9+\-Ee.]/g, '');
	var n = !isFinite(+number) ? 0 : +number,
		prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),
		sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep,
		dec = (typeof dec_point === 'undefined') ? '.' : dec_point,
		s = '',
		toFixedFix = function (n, prec) {
			var k = Math.pow(10, prec);
			return '' + (Math.round(n * k) / k)
				.toFixed(prec);
		};
	// Fix for IE parseFloat(0.55).toFixed(0) = 0;
	s = (prec ? toFixedFix(n, prec) : '' + Math.round(n))
		.split('.');
	if (s[0].length > 3) {
		s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep);
	}
	if ((s[1] || '')
		.length < prec) {
		s[1] = s[1] || '';
		s[1] += new Array(prec - s[1].length + 1)
			.join('0');
	}
	return s.join(dec);
};

(function () {
	var $body = $('body');
	var language = $('html').attr('lang');

	var initDateTimePicker = function () {
		$.artfocus.live.add(runDateTimePicker);
		runDateTimePicker($body);
	};

	var runDateTimePicker = function ($el) {
		$('input[data-toggle="datetime-picker"]', $el).each(function () {
			var $this = $(this);

			var config = {
				autoclose: true,
				language: language
			};

			var minDate = createDateFromString($this.attr('min'));
			if (minDate) {
				config.startDate = minDate;
			}

			var maxDate = createDateFromString($this.attr('max'));
			if (maxDate) {
				config.endDate = maxDate;
			}

			var type = $this.attr('type');
			if (type === 'text' || !Modernizr.inputtypes[type]) {
				$this.val(normalizeDateTimeValue($this.val()));

				// Skip for time-only. Not implemented.
				if (type === 'time') {
					return;
				}

				$this.datetimepicker(config);
			}
		});
	};

	var normalizeDateTimeValue = function (s) {
		// Eg. 2015-12-31T10:15:36, @see https://www.w3.org/TR/html-markup/input.datetime-local.html
		var m = s.match(/^([\d]{4})-([\d]{2})-([\d]{2})T([\d]{2}):([\d]{2}):([\d]{2})/);

		if (m) {
			// Eg. 2015-12-31 10:15:36
			return m[1] + '-' + m[2] + '-' + m[3] + ' ' + m[4] + ':' + m[5] + ':' + m[6];
		}

		return s;
	};

	var createDateFromString = function (s) {
		if (!s) {
			return null;
		}

		var d = null;
		if (s.substr(2, 1) === ':') {
			var data = $.extend([0, 0, 0, 0], s.split(':'));

			d = new Date();
			d.setHours(data[0], data[1], data[2], data[3]);

		} else {
			d = new Date(s);
		}

		return d;
	};

	$.artfocus.loadScript(
		'/components/node_modules/@yarn/smalot-bootstrap-datetimepicker/js/bootstrap-datetimepicker.js',
		function () {
			if (language !== 'en') {
				$.artfocus.loadScript(
					'/components/node_modules/@yarn/smalot-bootstrap-datetimepicker/js/locales/bootstrap-datetimepicker.' + language + '.js',
					initDateTimePicker
				);

			} else {
				initDateTimePicker();
			}
		}
	);
})();

$.ajaxSetup({cache: false}); // otherwise browser can show JSON instead of the page

// Internet Explorer 10 in Windows 8 and Windows Phone 8
// @see http://timkadlec.com/2013/01/windows-phone-8-and-device-width/
if (navigator.userAgent.match(/IEMobile\/10\.0/)) {
	var msViewportStyle = document.createElement("style");
	msViewportStyle.appendChild(
		document.createTextNode(
			"@-ms-viewport{width:auto!important}"
		)
	);
	document.getElementsByTagName("head")[0].appendChild(msViewportStyle);
}

// Load functions
$.artfocus.scrollTo();

// Application startup/ajax change
$.artfocus.live.add(function ($el, type) {
	if (type !== 'ready') {
		netteFormsAntispam($el);
		dependentInputs($el);
		$.artfocus.pairSelects($el);
		AfFileUpload.AfFileUpload.load();

		// re-init bootstrap
		$('[data-toggle="toggle"]', $el).each(function () {
			if (typeof $(this).bootstrapToggle === 'function') {
				$(this).bootstrapToggle();
			}
		});
	}

	// Load functions
	$.artfocus.showHide($el);
	//$.artfocus.sliders($el);
	$.artfocus.tooltips('.tooltip', $el);
	$.artfocus.overlink(null, $el);
	$.artfocus.changeUrl(null, $el);

	// Automatic scrolling
	var $scroll = $('.scroll', $el);
	if ($scroll.length) {
		$.artfocus.doScroll($el);
	}

	// Prevent # links to be processed by default
	$('a[href="#"]', $el).on('click', function (e) {
		e.preventDefault();
	});

	// Enable protected e-mails
	$('.protected-email', $el).each(function () {
		var regex = /\(a\)/;
		var mapObj = {
			'\(a\)':'@',
			'%28a%29':'@', //in the case browser or JS converts (a) to %28a%29
			'http:\/\/': 'mailto:',
			'\/': ''
		};

		if (this.href) {
			this.href = this.href.replace(/\(a\)|%28a%29|http:\/\/|\//g, function(matched){
				return mapObj[matched];
			});
		}

		this.innerHTML = this.innerHTML.replace(regex, '@');
	});

	// Bot-protected links
	$('[data-protected-href]', $el).each(function () {
		this.href = this.getAttribute('data-protected-href');
		this.rel = 'nofollow';
	});

	// Analytics tracking
	$('a[data-analytics-track]', $el).on('click', function () {
		if (typeof ga == 'function') {
			var url = this.getAttribute('data-analytics-track');
			if (url.substr(0, 1) !== '/') {
				url = '/' + url;
			}

			ga('send', 'pageview', '/_track' + url);

		} else {
			console.warn("Function 'ga' is not defined. Tracking is disabled.");
		}
	});

	// remove hash at the end of the url after 5 sec
	// so on step back in browser the page is not scrolled
	setTimeout(function () {
		if (window.location.hash) {
			history.replaceState("", document.title, window.location.pathname + window.location.search);
		}
	}, 5000);
});

$.nette.ext('forms', {
	init: function () {
		var snippets;
		if (!window.Nette || !(snippets = this.ext('snippets'))) return;

		snippets.after(function ($el) {
			$el.find('form').each(function () {
				window.Nette.initForm(this);
			});
		});
	},
	prepare: function (settings) {
		this.beforeQueue.fire(settings);

		if (settings.stop) {
			return false;
		}

		var analyze = settings.nette;
		if (!analyze || !analyze.form) return;
		var e = analyze.e;
		var originalData = settings.data || {};
		var data = {};

		if (analyze.isSubmit) {
			data[analyze.el.attr('name')] = analyze.el.val() || '';
		} else if (analyze.isImage) {
			var offset = analyze.el.offset();
			var name = analyze.el.attr('name');
			var dataOffset = [Math.max(0, e.pageX - offset.left), Math.max(0, e.pageY - offset.top)];

			if (name.indexOf('[', 0) !== -1) { // inside a container
				data[name] = dataOffset;
			} else {
				data[name + '.x'] = dataOffset[0];
				data[name + '.y'] = dataOffset[1];
			}
		}

		// https://developer.mozilla.org/en-US/docs/Web/Guide/Using_FormData_Objects#Sending_files_using_a_FormData_object
		var formMethod = analyze.form.attr('method');
		if (formMethod && formMethod.toLowerCase() === 'post' && 'FormData' in window) {
			var formData = new FormData(analyze.form[0]);
			for (var i in data) {
				formData.append(i, data[i]);
			}

			if (typeof originalData !== 'string') {
				for (var i in originalData) {
					formData.append(i, originalData[i]);
				}
			}

			// remove empty file inputs as these causes Safari 11 to stall
			// https://stackoverflow.com/questions/49672992/ajax-request-fails-when-sending-formdata-including-empty-file-input-in-safari
			if (formData.entries && navigator.userAgent.match(/version\/11(\.[0-9]*)? safari/i)) {
				// for old browsers not supporting ES6, only ES5, like IE11, substitution for "for.. of" is this complex:
				// http://kangax.github.io/compat-table/es6/
				// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of
				// https://stackoverflow.com/a/39670438
				// ToDo after nobody uses IE11, revert this commit
				var _iteratorNormalCompletion = true;
				var _didIteratorError = false;
				var _iteratorError = undefined;

				try {
					for (var _iterator = formData.entries()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
						var pair = _step.value;

						if (pair[1] instanceof File && pair[1].name === '' && pair[1].size === 0) {
							formData.delete(pair[0]);
						}
					}
				} catch (err) {
					_didIteratorError = true;
					_iteratorError = err;
				} finally {
					try {
						if (!_iteratorNormalCompletion && _iterator.return) {
							_iterator.return();
						}
					} finally {
						if (_didIteratorError) {
							throw _iteratorError;
						}
					}
				}
			}
			// /for.. of
			// /remove empty file inputs as these causes Safari 11 to stall

			settings.data = formData;
			settings.processData = false;
			settings.contentType = false;
		} else {
			if (typeof originalData !== 'string') {
				originalData = $.param(originalData);
			}
			data = $.param(data);
			settings.data = analyze.form.serialize() + (data ? '&' + data : '') + '&' + originalData;
		}
	}
}, {
	beforeQueue: $.Callbacks(),
	before: function (callback) {
		this.beforeQueue.add(callback);
	}
});

$.nette.init(); // init plugin

/**
 * Copyright © 2016 Jaroslav Hranička <hranicka@outlook.com>
 *     Requires jQuery, jQuery UI (slider).
 */
$.artfocus.live.add(function ($el, type) {
	if ($('.slider-range', $el).length === 0) {
		return;
	}

	var $min = $('.filter .price-min', $el);
	var $max = $('.filter .price-max', $el);

	if (!$min.val()) {
		$min.val($min.attr('min'));
	}
	if (!$max.val()) {
		$max.val($max.attr('max'));
	}

	var $minPlaceholder = $('.filter .price-min-placeholder', $el);
	var $maxPlaceholder = $('.filter .price-max-placeholder', $el);

	var commafy = function(val) {
		return String(val).split("").reverse().join("")
			.replace(/(.{3}\B)/g, "$1,")
			.split("").reverse().join("");
	};

	var exponentize = function (val) {
		var toPresent = parseFloat($min.val());

		var priceMin = parseFloat($min.attr('min'));
		var priceMax = parseFloat($max.attr('max'));

		if (val <= 20) {
			toPresent = priceMin + (val / 20) * (priceMax - priceMin) * 0.1;
		} else if (val <= 80) {
			toPresent = priceMin + (priceMax - priceMin) * 0.1 + (val - 20) / 60 * (priceMax - priceMin) * 0.6;
		} else {
			toPresent = priceMin + (priceMax - priceMin) * 0.7 + (val - 80) / 20 * (priceMax - priceMin) * 0.3;
		}
		return Math.round(toPresent);
	};

	var logarithmize = function (val) {
		var toPresent;

		var priceMin = parseFloat($min.attr('min'));
		var priceMax = parseFloat($max.attr('max'));

		var range = priceMax - priceMin;

		if (val <= priceMin + range * 0.1) {
			//20% <-> 10 %
			toPresent = 200 * (val - priceMin) / range;
		} else if (val <= priceMin + range * 0.7) {
			//80% <-> 70 %
			toPresent = 20 + 100 * (val - priceMin - 0.1 * range) / range;
		} else {
			toPresent = 80 + 20 / 0.3 * (val - priceMin - 0.7 * range) / (priceMax - priceMin);
		}
		return Math.round(toPresent);
	};

	var refresh = function (min, max) {
		$min.val(min);
		$max.val(max);

		$minPlaceholder.text(commafy(min));
		$maxPlaceholder.text(commafy(max));
	};

	var init = function ($el) {
		$el.slider({
			range: true,
			min: parseFloat(0),
			max: parseFloat(100),
			values: [
				parseFloat(logarithmize($min.val())),
				parseFloat(logarithmize($max.val()))
			],
			slide: function (event, ui) {
				refresh(exponentize(ui.values[0]), exponentize(ui.values[1]));
			},
			change: function (event, ui) {
				$el.parents('form').find('.submittedByPrice').val(1);
				$el.parents('form').submit();
			}
		});
	};

	init($('.slider-range', $el));

	$('.auto-price-submit', $el).on('change', function () {
		$(this).parents('form').find('.submittedByPrice').val(1);
		$(this).parents('form').submit();
	});

	refresh(
		parseFloat($min.val()),
		parseFloat($max.val())
	);

});

/**
 * Copyright © 2021 Artfocus <webdesign@artfocus.cz>
 * @author Pavel Kovács <kovacs@artfocus.cz>
 */

jQuery.prototype.lazyMenu = function($openingClass, options) {
	var settings = $.extend({
		timeout: 200,
		beforeOpen: function(element) {},
	}, options);
	let $opened;
	let $timer;
	this.hover(
		function () {
			clearTimeout($timer);
			let $item = $(this);
			$timer = setTimeout(function () {
				if ($opened) {
					$opened.removeClass($openingClass);
				}
				$opened = $item;
				settings.beforeOpen($item);
				$opened.addClass($openingClass); }, settings.timeout);
		},
		function () {
			clearTimeout($timer);
			let $item = $(this);
			$timer = setTimeout(function () {
				$item.removeClass($openingClass);
				}, settings.timeout);
		}
	);
}

jQuery.prototype.moreBtn = function ($basicUrl, options) {
	var settings = $.extend({
		itemsSnippetName: 'products',
		paginationSnippetName: 'pagination',
		paginationSnippet2Name: 'pagination2',
		appendPageHandle: 'appendPage',
		onPageCounterSelector: '.paging .onpage',
		btnWaitingClass: 'waiting',
		itemsCounterSelector: '.products .sg-product-item',
	}, options);
	var $busy = false;
	const $keyRegExp = /^snippet--(\w+)$/;
	this.on('click', function () {
		if ($busy) {
			return false;
		}
		$busy = true;
		$(this).addClass('waiting');

		$.get($basicUrl, function (data) {
			if (data.activeUrl) {
				history.pushState({}, 'title', data.activeUrl);
				$basicUrl = data.activeUrl + '&do=' + settings.appendPageHandle;
			}

			$.each(data.snippets, function ($key, $value) {
				let $match = $key.match($keyRegExp);
				if ($match) {
					let $snippetName = $match[1];
					if ($snippetName === settings.itemsSnippetName) {
						$('#' + $key).append($value);
					} else if ($snippetName === settings.paginationSnippetName) {
						$('#' + $key).html($value);
					} else if ($snippetName === settings.paginationSnippet2Name) {
						$('#' + $key).html($value);
					}
				}
			});

			$(settings.onPageCounterSelector).text(parseInt($(settings.itemsCounterSelector).length));
			$busy = false;
		});
	});
	$(settings.onPageCounterSelector).text(parseInt($(settings.itemsCounterSelector).length));
};

jQuery.prototype.addAjaxLoader = function (options) {
	var settings = $.extend({
		loadingClass: 'ajaxloading',
		loaderClass: 'ajaxloader',
		innerElementsCount: 8,
	}, options);

	this.getAjaxLoader = function () {
		var loader = '';
		for (var i = 1; i <= settings.innerElementsCount; i++) {
			loader += '<div class="' + settings.loaderClass + '_' + i + '"></div>';
		}

		return $('<div class="' + settings.loaderClass + '">' + loader + '</div>');
	};

	var $ajaxLoader = this.getAjaxLoader();
	$(this).css('position', 'relative');
	$(this).append($ajaxLoader).addClass(settings.loadingClass);

	$ajaxLoader.css({
		position: 'absolute',
		top: 0,
		left: 0,
		marginTop: ($(this).height() / 2) - ($ajaxLoader.height() / 2),
		marginLeft: ($(this).width() / 2) - ($ajaxLoader.width() / 2)
	});
}

jQuery.prototype.removeAjaxLoader = function (options) {
	var settings = $.extend({
		loadingClass: 'ajaxloading',
		loaderClass: 'ajaxloader',
	}, options);

	$(this).find('.' + settings.loaderClass).remove();
	$(this).removeClass(settings.loadingClass);
};

jQuery.prototype.disableFilter = function () {
	var $inputs = $(this).find('input:radio, input:checkbox');
	$inputs.prop( "disabled", true );
	var $iCheckHelperElements = $(this).parent().find('.iCheck-helper');
	if ($iCheckHelperElements.length > 0) {
		$inputs.each(function () {
			$(this).parent().addClass('disabled');
		});
	}

	$inputs.each(function () {
		if ($(this).is(':checked')) {
			let $hiddenInput = $('<input type="hidden" />');
			$hiddenInput.attr('name', $(this).attr('name'));
			$hiddenInput.attr('value', $(this).attr('value'));
			$(this).append($hiddenInput);
		}
	});
};
/**
 * Functions that are called after:
 * - document ready: $el = $('body)
 * - ajax success event: $el = $(<snippetElement>)
 */
$.artfocus.live.add(function ($el, type) {
	$.artfocus.requiredStar({
		options: {
			'context': $el
		}
	});

	$('a.lb, a.mb', $el).swipebox({
		selector: 'a.lb, a.mb',
		useCSS : true, // false will force the use of jQuery for animations
		useSVG : true, // false to force the use of png for buttons
		initialIndexOnArray : 0, // which image index to init when a array is passed
		hideCloseButtonOnMobile : false, // true will hide the close button on mobile devices
		removeBarsOnMobile : true, // false will show top bar on mobile devices
		hideBarsDelay : 0, // delay before hiding bars on desktop 0 = OFF
		videoMaxWidth : 1140, // videos max width
		beforeOpen: function () {}, // called before opening
		afterOpen: function () {
			// FIX so tap on cross on mobile will not click on item below
			var $selectorClose = $("#swipebox-close");
			var clickAction = "touchend click";

			$selectorClose.off(clickAction);

			$selectorClose.on(clickAction, function (event) {
				event.preventDefault();
				event.stopPropagation();

				$.swipebox.close();
			});
		}, // called after opening
		afterClose: function () {}, // called after closing
		loopAtEnd: false // true will return to the first image after the last image is reached
	});
	$('li:not(.bx-clone) a.bxlb', $el).swipebox();

	new LazyImage.LazyImage('[data-src], [data-srcset]');

	// form custom inputs vs. Nette forms
	$('input:checkbox[data-nette-rules]', $el).on('ifChanged', function (event) {
		var event;
		if (typeof (Event) === 'function') {
			event = new Event('change');
		} else {
			event = document.createEvent('Event');
			event.initEvent('change', true, true);
		}
		$(this).get(0).dispatchEvent(event);
	});
});

$(function () {
	$('.cookie-law .close').on('click', function () {
		var $wrapper = $('.cookie-law-wrapper');
		$wrapper.fadeOut(function () {
			//$wrapper.remove(); do not remove
		});

		Cookies('cookie-law-confirm', true, {expires: Infinity});
		return false;
	});
});

