; $(window).on('resize scroll', function() { f_shopFadeImageAlmostInViewport(); }) $(document) .on('click', '.product-view-info .submit-product button:not(.disabled)', function(evt){ evt.preventDefault(); var _this = this; addProduct(_this, function(valid){ if(valid) f_productAddedAnimation(_this); }, 'cart') }) .on('click', '.fltr-product-compare>a:not([data-item])', function(evt){ evt.preventDefault(); var _this = this; addProduct(_this, function(valid){}, 'compare') }) .on('click', '.fltr-product-compare>a[data-item]', function(evt){ evt.preventDefault(); var _this = this; var id = this._attr_get('data-item') $('#compare, #menucompare').each(function(){$(this).data('plugin_Compare').removeItem(id)}) }) .on('change', '.product-amount', function(evt){ evt.preventDefault(); if(evt.target.value == ''){ evt.target.value = 1; }else if(evt.target.value > 10){ evt.target.value = 10; }else if(evt.target.value < 1){ evt.target.value = 1; } var btn = _STDO.get('a[href]', this.parentNode)[0]; var href = '/checkout?n=' + btn._attr_get('data-id') + '&a=' + evt.target.value; btn._attr_set('href', href) }) .on('click', '#cust_signout', function(evt){ evt.preventDefault(); shopSignout(function(){ history.pushState("", document.title, window.location.pathname + window.location.search); window.location.reload(); }) }) .on('click', '[id^=addons-] .shop-products-item', function(evt){ evt.preventDefault(); var parent = this.closest('[id^=addons-]') var price = Number(this._attr_get('price')) var selected = this._clss_has('selected') var $checkbox = _STDO.get('.shop-checkbox [type="checkbox"]', this)[0] var $price = _STDO.get('.addon-total-price', parent)[0] var totalprice = Number($price._attr_get('price')); if(selected){ this._clss_remove('selected') $checkbox._attr_remove('checked') totalprice = totalprice - price }else{ this._clss_add('selected') $checkbox._attr_set('checked', 'checked') totalprice = totalprice + price } if(totalprice < 0){ totalprice = 0 } $price._html_set('€ ' + f_moneyformat(totalprice)) $price._attr_set('price', totalprice) }) var createPromptInput = function(name, type, value, pre){ pre = pre || false; var parent; var attributes = { 'type': type || 'text', id: name, class: 'form-control' + (name == 'dateto' || name == 'date_from' ? ' half' : ''), name: name, step: '1', value: value || "", onkeypress: (type == "number" ? "return event.charCode >= 32 && event.charCode <= 57" : "") } if(pre){ parent = _STDO.create('div', { class: 'input-group' }) parent._el_appnd(_STDO.create('span', { class: 'input-group-addon', html: pre })) parent._el_appnd(_STDO.create('input', attributes)) }else{ parent = _STDO.create('input', attributes) } return parent; } var checkPromptTime = function(_this){ var value = moment(_STDO.get('#date' + _this.data.for).value + ' ' + _this.value, 'DD-MM-YYYY HH:mm') if(value < _this.data.min){ _this.value = _this.data.prev }else{ _this.data.prev = _this.value var $other = _STDO.get('#date' + (_this.data.for == 'from' ? 'to' : 'from')) var $otherTime = _STDO.get('#date' + (_this.data.for == 'from' ? 'to' : 'from') + '_t') var other = moment($other.value + ' ' + $otherTime.value, 'DD-MM-YYYY HH:mm') if(_this.data.for == 'from'){ $otherTime.data.min = value if(other < value){ $otherTime.value = _this.value $otherTime.data.prev = _this.value } } } } var validateField = function($el, self){ var _self = this; var field = $el.attr('data-field'); var val = $el.val(); var valid = false; self = self || false var parent = self ? $el : $el.parent(); if(field === 'street' || field === 'city' || field === 'country' || field === 'date' || field === 'time') { if(val && val != '') valid = true; } else if(field === 'name') { var re = /.+ .+/; if(val.match(re)) valid = true; } else if(field === 'phone') { var re = /.+/; if(val.match(re)) valid = true; } else if(field === 'memo') { var re = /.?/; if(val.match(re)) valid = true; } else if(field === 'email') { var re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/i; if(val != '' && val.match(re)) valid = true; } else if(field === 'number') { var re = /^[0-9-]{1,5}[a-z]*$/i; if(val != '' && val.match(re)) valid = true; } else if(field === 'postal') { var re = /^[0-9]{4,}[\s]?[a-z]*$/i if(val != '' && re.test(val)){ valid = true; } } else if(field === 'password') { var re = /^.{6,}$/ if(val != '' && re.test(val)) valid = true; } if(valid){ parent.removeClass('err').addClass('suc'); parent.find('i.validate').removeClass('fa-times').addClass('fa-check') } else{ parent.removeClass('suc').addClass('err'); parent.find('i.validate').removeClass('fa-check').addClass('fa-times') } return valid; } var shopAuthorize = function(email, password, callback){ var url = '/api/SHOP/AJAX/customer'; var empty = [], invalid = [], message = ''; var isEmpty = function(str){ return (!str || /^\s*$/.test(str)); } if(isEmpty(email)){ empty.push('email') } if(isEmpty(password)){ empty.push('password') } // if(!email.match(/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/i)){ // invalid.push('email') // } // if(password.length < 4){ // invalid.push('password') // } // if(empty.length > 0) // message = empty.join(' & ') + ' ' + _STDO.lng.get('shop-login-'+(empty.length == 1 ? 'is' : 'are')+'Empty') // if(invalid.length > 0) // message = invalid.join(' & ') + ' ' + _STDO.lng.get('shop-login-'+(invalid.length == 1 ? 'is' : 'are')+'Invalid') if(!isEmpty(message)){ callback(message); }else{ var aParam = { 'action': 'authorize', 'param': { 'email': email, 'password': password } } _STDO.ajx(url, aParam, function(data){ callback(data); }, true); } } var shopRegister = function(values, callback){ var url = '/api/SHOP/AJAX/customer'; $.post({ url: url, noLoading: true, data: { 'action': 'register', 'param': values }, dataType: 'json', success: function(data){ callback(data); } }) } var shopSignout = function(callback){ var url = '/api/SHOP/AJAX/customer'; var aParam = { 'action': 'signout' } _STDO.ajx(url, aParam, function(data){ callback(data); }, true); } var shopForgot = function(email, callback){ var url = '/api/SHOP/AJAX/customer'; var empty = [], invalid = [], message = ''; var isEmpty = function(str){ return (!str || /^\s*$/.test(str)); } if(isEmpty(email)){ empty.push('email') } if(!isEmpty(message)){ callback(message); }else{ var aParam = { 'action': 'forgot', 'param': { 'email': email } } _STDO.ajx(url, aParam, function(data){ callback(data); }, true); } } var _f_shopFotoFadeIn = function(selector, size, container){ container = container || _STDO.get('body')[0]; var items = _STDO.get(selector, container); _STDO.loop(items, function(i, fade){ var base = fade._attr_get('data-base'); var src = fade._attr_get('data-src'); var alt = fade._attr_get('data-alt'); var has = _STDO.get('img', fade).length > 0; if(!has && base && base != 'undefined' && src && src != 'false' && src != 'undefined'){ var parts = src.split('.'); var obj = document.createElement('object'); obj.setAttribute('type', 'image/png') var img = new Image(); img.style.opacity = "0"; img._attr_set('alt', alt); img.src = base + '/' + src; obj.onload = function(){ this._el_fade('in') } // img.onerror = function(){ // var dflt = base + '/' + parts[parts.length-2] + '.' + parts[parts.length-1] // if(this.src != dflt) // this.src = dflt; // } fade._el_appnd(obj._el_appnd(img)); obj.setAttribute('data', (base + '/' + parts[parts.length-2] + (size ? '@' + size : '') + '.' + parts[parts.length-1])) } }) } var f_shopFadeImageAlmostInViewport = function() { var hiddenImages = _STDO.get('img.shop-image:not(.loaded)') if(hiddenImages.length > 0){ _STDO.loop(hiddenImages, function(i, el){ if(f_isElementAlmostInViewport(el)){ el._clss_add('loaded') var src = el._attr_get('data-src') el.src = src } }) } } var f_shopGetImageSrc = function(image, size){ var base = image._attr_get('data-base'); var src = image._attr_get('data-src'); if(base && base != 'undefined' && src && src != 'false' && src != 'undefined'){ var parts = src.split('.'); return base + '/' + parts[parts.length-2] + (size ? '@' + size : '') + '.' + parts[parts.length-1]; } return '' } var f_shopInitImages =function(selector, size, container){ container = container || _STDO.get('body')[0]; var items = _STDO.get(selector, container); _STDO.loop(items, function(i, fade){ var alt = fade._attr_get('data-alt'); var src = f_shopGetImageSrc(fade); var has = _STDO.get('img', fade).length > 0; if(!has && src !== ''){ var img = new Image(); img.style.opacity = "0"; img._clss_add('shop-image'); img._attr_set('data-src', src); img._attr_set('alt', alt); img.onload = function(){ fade._clss_remove('loading') this._el_fade('in') } fade._el_appnd(img) setTimeout(function(){ if(!img._clss_has('loaded')){ fade._clss_add('loading') } }, 500) } }) f_shopFadeImageAlmostInViewport(); } var resetAddons = function(parent){ var _self = this; var addons = _STDO.get('.addon-select .shop-products-item.selected', parent) var $price = _STDO.get('.addon-total-price', parent)[0] $price._html_set('€ ' + f_moneyformat(0)) $price._attr_set('price', 0) _STDO.loop(addons, function(i, $el){ var $checkbox = _STDO.get('.shop-checkbox [type="checkbox"]', $el)[0] $el._clss_remove('selected') $checkbox._attr_remove('checked') }) } var addProduct = function(el, cb, target, forceBuy){ var param; var valid = true; forceBuy = forceBuy || false target = target || 'cart' var selector = '#' + target + ', #menu' + target + ', #inline' + target var ucfirst = target.charAt(0).toUpperCase() + target.slice(1) if(el instanceof Element || el instanceof HTMLDocument){ var parent = el.closest('.product-view-info'); var id = el._attr_get('id') var action = forceBuy ? 'buy' : el._attr_get('action') var req = _STDO.get('[id^="req-"]', parent); var amount = _STDO.get('[id^="amount-"]', parent); var variant = _STDO.get('.variant-select>button.active[value]', parent); var addons = _STDO.get('.addon-select .shop-products-item.selected', parent); param = { prod_number: id.split('add-').reverse()[0], requiredItems: {}, amount: '1' } if(target === 'cart'){ if(variant.length){ param.variant = variant[0]._attr_get('value'); }else{ var variantSelect = _STDO.get('.variant-select>select', parent); if(variantSelect.length > 0){ param.variant = variantSelect[0].value }else{ variant = _STDO.get('.variant-select>button:not(.disabled)[value]', parent); if(variant.length){ param.variant = variant[0]._attr_get('value'); } } } if(addons && addons.length){ param.addons = [] _STDO.loop(addons, function(i, $el){ param.addons.push($el._attr_get('prod')); }) } for(var i = 0; i < req.length; i++){ var selected = req[i].options[req[i].selectedIndex]; var keyval = selected.value.split('|'); if(keyval.length > 1){ param.requiredItems[keyval[0]] = keyval[1]; req[i]._clss_remove('redBorder'); } else{ req[i]._clss_add('redBorder'); valid = false; } } if(amount && amount.length > 0 && !isNaN(amount[0].value) && amount[0].value > 0){ param.amount = amount[0].value } } }else{ var action = forceBuy ? 'buy' : undefined param = el } if(!valid){ cb(valid); }else{ if(param.prod_number && param.prod_number != ''){ if(action === 'buy'){ param.clear = 'true'; } var aParam = { 'action': 'addProduct', 'param': param } _STDO.ajx('/api/SHOP/AJAX/cart?target='+target, aParam, function(data, all){ if(action === 'buy'){ window.location.href = '/checkout'; }else{ var fn = 'set' + ucfirst $(selector).each(function(){$(this).data('plugin_' + ucfirst)[fn](data.items)}) if(target === 'cart'){ _STDO.loop(req, function(i, val){ val.selectedIndex = 0; }) if(amount && amount.length > 0){ amount[0].value = '1'; } if(addons && addons.length){ // $('#product-view').data('plugin_View').resetAddons() resetAddons(parent) } var wizard = $('#wizard'); if(wizard.length > 0){ var $plugin = wizard.data('plugin_Wizard') $plugin.getWizardStep(0) } if(all.product){ f_gtagEvent('add_to_cart', {}, [all.product]); } } cb(valid); } }, true); }else{ cb(valid); } } } var f_productAddedAnimation = function(btn){ var spans = btn.getElementsByTagName('span') btn.disabled = true; btn.style.width = btn.offsetWidth + 'px'; spans[0]._el_fade('out', 100, function () { spans[0].style.display = 'none'; spans[1]._el_fade('in', 300, function () { setTimeout(function () { spans[1]._el_fade('out', 100, function () { spans[1].style.display = 'none'; spans[0]._el_fade('in', 300, function () { btn.disabled = false; btn.style.width = ''; }, true) }) }, 1800) }, true) }) } var f_sortableTable = function($table, sortedBy){ sortedBy = sortedBy || false; var getCellValue = function(tr, idx){ return tr.children[idx]._attr_get('value') || tr.children[idx].innerText || tr.children[idx].textContent; } var comparer = function(idx, asc) { return function(a, b) { return function(v1, v2) { return v1 !== '' && v2 !== '' && !isNaN(v1) && !isNaN(v2) ? v1 - v2 : v1.toString().localeCompare(v2); }(getCellValue(asc ? a : b, idx), getCellValue(asc ? b : a, idx)); } }; var sortTh = function(th){ var $tbody = _STDO.get('tbody', $table)[0] var $icon = _STDO.get('i', th)[0] _STDO.loop($table.querySelectorAll('th.sortable>i'), function(j, icon){ icon._clss_remove('fa-sort-up') icon._clss_remove('fa-sort-down') if(icon == $icon){ icon._clss_remove('fa-sort')._clss_add('fa-sort-' + (th.asc ? 'up' : 'down')) }else{ icon._clss_add('fa-sort') } }) Array.prototype.slice.call(_STDO.get('tr', $tbody)) .sort(comparer(Array.prototype.slice.call(th.parentNode.children).indexOf(th), th.asc = !th.asc)) .forEach(function(tr) { $tbody.appendChild(tr) }); } _STDO.loop($table.querySelectorAll('th.sortable'), function(i, th) { th._el_appnd(_STDO.create('i', {'class': 'fa fa-sort'})) th.addEventListener('click', function(){ sortTh(th) }); if(th._attr_get('key') === sortedBy){ sortTh(th) } }); } var f_newModal = function(format, isFor, defaultBtns){ var modal = format === 'small' ? 'cms' : 'edit'; var selector = 'sog_' + modal + 'Modal'; $('.' + selector + ' h1').html(''); $('.' + selector + ' .tabs').html(''); $('.' + selector + ' .tab-content').html(''); var $modal = $('#' + selector).modal({ backdrop: 'static', keyboard: false }); if (!defaultBtns) { $('.' + selector + ' .modal-buttons').attr('invisible', '').hide(); $('.' + selector + ' .shop-buttons').show(); } $modal.addClass(isFor) $modal.on('hidden.bs.modal', function() { $(this).removeClass(isFor) $('.' + selector + ' .shop-buttons').hide(); $('.' + selector + ' .modal-buttons').removeAttr('invisible').show(); }) } var f_getProdData = function(prod){ try{ return JSON.parse((!prod.hasOwnProperty('prod_data') || prod.prod_data == '' ? '{}' : prod.prod_data)) || {}; } catch(err){ return {} } } var f_moneyformat = function(number){ return Number(number).toLocaleString("nl-NL", {minimumFractionDigits: 2, maximumFractionDigits: 2}) } var f_gtagEvent = function(type, content, items){ if(typeof gtag === 'function'){ if(items && items.length > 0){ if(!content || Array.isArray(content)){ content = {} } content.items = [] _STDO.loop(items, function(i, v){ content.items.push({ id: v.prod_number, name: v.prod_name, price: v.price_incl_btw, quantity: (v.amount && v.amount != '' ? v.amount : "1") }) }) } gtag('event', type, content); } } /* // _ _ _ _ // ___| |_ ___(_) _| | ___ _ __ | | // / __) _) __) |/ _ |/ _ \| /_ `| | // \__ \ |_| _)| | (_| | (_) | | | | |_ // (___/\__)___)_|\__/_|\___(_)| |_|___) // */ /* ___ _ __ __ ___ / _) /_ `/_ `/ __) | (_| | | | | \__ \ \___)_| |_| |_(___/ _ ___ ___ __ _ _ _ _ ___| |_ / __)/ _ \/ _\ | ___ | | | | | | __) _ \ \__ \ (_)| (_| |(___)| \_/ \_/ | _)| |_)| (___/\___/\__ | \___/\__/|___)_\__/ (___/ */ ;(function ($, window, document, undefined) { "use strict"; var pluginName = "Filter", defaults = { filters: {}, ajax_url: "/api/SHOP/AJAX/main", imagesMap: "/SHOP/DATA_APP/IMAGES/", noImg: "/SHOP/data/wizard-no-image.png", chunkTimer: 100, scrollTimer: false, page: 1, range: [], lastPage: false, productsLoaded: false, pagCode64: window.btoa( (document.body._attr_get("data-pag_code") || "").toUpperCase(), ), btw: "incl", prodUrl: "/product/{prod}", payment: false, rentshop: false, compare: false, manualstock: false, stocklabel: false, filterId: "", horizontal: false, defaultOrdering: "", }; function Plugin(element, options) { this.element = element; this.$element = $(element); this.filters = _STDO.get(".shop-filter-filters", element)[0]; this.products = _STDO.get(".shop-filter-products .products", element)[0]; this.tags = _STDO.get(".filter-tags>div:nth-child(3)", element)[0]; this.pager = _STDO.get(".shop-filter-products .pager", element)[0]; this.settings = $.extend({}, defaults, options); this.settings.filterId = element.closest("[obj-id]")._attr_get("obj-id"); this.settings.horizontal = this.products._clss_has("horizontal"); this._name = pluginName; this.init(); return this; } $.extend(Plugin.prototype, { init: function () { var _self = this; var json = JSON.parse(_self.element._attr_get("fltrs")); _self.settings.filters = Object.keys(json).length > 0 ? json : {}; _self.settings.page = _self.element._attr_get("page"); _self.settings.btw = _self.element._attr_get("data-btw"); _self.settings.prodUrl = _self.element._attr_get("base"); _self.settings.defaultOrdering = _self.element._attr_get("order"); _self.element._attr_remove("fltrs"); _self.element._attr_remove("base"); _self.element._attr_remove("order"); _self.setOptions(); _self.createProducts(true, false); _self.bindEvents(); _self.initRangefilter(); _self.scrollControl(); }, bindEvents: function () { var _self = this; _self.$element .on( "change", ".shop-filter-filters input[type=checkbox]", function (evt) { var keyval = this.value.split("|"); //keyval[0] = keyval[0].replace(/\s/g, '-') sessionStorage.removeItem(_self.settings.pagCode64); _self.controlUrl(keyval, evt.target.checked); _self.controlFilters(keyval, evt.target.checked); _self.settings.page = 1; _STDO.url.remove("page"); _self.createProducts(true, true); }, ) .on("change", "input[fltr-pricerange]", function (evt) { var idx = this.getAttribute("fltr-pricerange"); $("#fltr-pricerange").slider("values", idx, this.value); var key = idx == "0" ? "p_from" : "p_till"; //key = key.replace(/\s/g, '-') var keyval = [key, this.value]; var add = key == "p_from" ? this.value > _self.settings.range[idx] : this.value < _self.settings.range[idx]; sessionStorage.removeItem(_self.settings.pagCode64); _self.controlUrl(keyval, add); _self.controlFilters(keyval, add); _self.settings.page = 1; _STDO.url.remove("page"); _self.createProducts(true, true); }) .on("change", ".ordering>select", function (evt) { var key = "o", value = this.options[this.selectedIndex].value; //key = key.replace(/\s/g, '-') var keyval = [key, value]; var add = value !== _self.settings.defaultOrdering; sessionStorage.removeItem(_self.settings.pagCode64); _self.controlUrl(keyval, add); _self.controlFilters(keyval, add); _self.settings.page = 1; _STDO.url.remove("page"); _self.createProducts(true, true); }) .on("click", ".options .view>button:not(.active)", function (evt) { _self.setOption("view", this._attr_get("action")); }) .on("click", ".shop-filter-products .filter-tag", function (evt) { var keyval = this._attr_get("value"); var aKeyval = keyval.split("|"); //aKeyval[0] = aKeyval[0].replace(/\s/g, '-') if (aKeyval[0] == "p_from" || aKeyval[0] == "p_till") _self.unsetRange([aKeyval[0]]); else _self.uncheckInputs('input[value="' + keyval + '"]', _self.element); sessionStorage.removeItem(_self.settings.pagCode64); _self.controlUrl(aKeyval, false); _self.controlFilters(aKeyval, false); _self.settings.page = 1; _STDO.url.remove("page"); _self.createProducts(true, true); }) .on("click", ".shop-filter-products .filter-tags>a", function (evt) { evt.preventDefault(); sessionStorage.removeItem(_self.settings.pagCode64); _self.unsetRange(["p_from", "p_till"]); _self.uncheckInputs(".collapse input", _self.element); _self.settings.filters = {}; _self.settings.page = 1; var ord = _STDO.url.get("o"); _STDO.url.remove(false, false); if (ord) { _STDO.url.set("o", ord); } _self.createProducts(true, true); }) .on("click", ".pager>li:not(.disabled):not(.active)", function (evt) { evt.preventDefault(); if (this._clss_has("nxt")) _self.settings.page = +_self.settings.page + 1; else if (this._clss_has("prv")) _self.settings.page = +_self.settings.page - 1; else _self.settings.page = this._attr_get("key"); _self.createProducts(false, true); }) .on("click", ".fltr-product", function (evt) { if ( evt.target._clss_has("addCartItem") || evt.target._clss_has("fa-cart-arrow-down") ) evt.preventDefault(); }) .on("mouseenter", ".fltr-product-photo", function (evt) { var _this = this; var empty = _STDO.get(".empty", _this).length > 0; if (!empty) { setTimeout(function () { // f_shopFotoFadeIn('.fltr-product-thumbs', false, _this) f_shopInitImages(".fltr-product-thumbs", false, _this); }, 100); } }) .on("mouseenter", ".fltr-product-thumbs", function (evt) { if (!this._clss_has("active")) { var thumb = _STDO.get("img", this)[0]; var fade = _STDO.get( ".fltr-fotoFadeIn", evt.target.closest(".fltr-product-photo"), )[0]; var img = _STDO.get("img", fade)[0]; var parent = _STDO.get("img", this)[0].parentNode; img.src = thumb.src; _STDO.loop( _STDO.get(".fltr-product-thumbs", this.parentNode.parentNode), function (i, item) { item._clss_remove("active"); }, ); this._clss_add("active"); } }) .on("input", ".fltr-search input", function (evt) { var value = evt.target.value; var items = _STDO.get( "input[value]", evt.target.closest(".collapse"), ); if (value.length > 0) { _STDO.loop(items, function (i, v) { if (v.value.indexOf(value) >= 0) { v.parentNode.parentNode.style.display = ""; } else { v.parentNode.parentNode.style.display = "none"; } }); } else { _STDO.loop(items, function (i, v) { v.parentNode.parentNode.style.display = ""; }); } }) .on("click", ".fltr-search i.fa-times", function (evt) { var $input = _STDO.get( "input", evt.target.closest(".fltr-search"), )[0]; $input.value = ""; $($input).trigger("input"); }); $(document).on("click", ".siteNavbar a", function (e) { sessionStorage.removeItem(_self.settings.pagCode64); // var hash = this._attr_get('href') // if(hash.indexOf('http') === -1 && (hash.indexOf('a_') > -1 || hash.indexOf('p_') > -1)){ // } }); }, controlFilters: function (keyval, add) { var _self = this; var set = false; if ( !add && (keyval[0] == "p_from" || keyval[0] == "p_till" || keyval[0] == "o" || keyval[0] == "s" || keyval[0] == "search") ) { delete _self.settings.filters[keyval[0]]; set = true; } for (var key in _self.settings.filters) { if (key == keyval[0]) { var idx = _self.settings.filters[key].indexOf(keyval[1]); if (add) { if ( keyval[0] == "p_from" || keyval[0] == "p_till" || keyval[0] == "o" || keyval[0] == "s" || keyval[0] == "search" ) _self.settings.filters[key] = [keyval[1]]; else if (idx == -1) _self.settings.filters[key].push(keyval[1]); } else { if (idx > -1) _self.settings.filters[key].splice(idx, 1); if (_self.settings.filters[key].length <= 0) delete _self.settings.filters[key]; } set = true; break; } } //console.log(_self.settings.filters) if (!set) _self.settings.filters[keyval[0]] = [keyval[1]]; }, controlTags: function () { var _self = this; _self.tags._html_set(""); var filters = _self.settings.filters; var opacity, cnt = 0; if (Object.keys(filters).length > 0) { for (var key in filters) { var values = [], keyval = ""; if (key == "search") { values = [filters[key].join(" ")]; } else { values = filters[key]; } for (var i = 0; i < values.length; i++) { var prfx = "", keyval = key + "|" + values[i], name = false; if (key != "o") { if (key == "search") { prfx = ' '; values[i] = values[i].replace(/--/g, " "); } else if (key == "p_from") { prfx = "€ > "; } else if (key == "p_till") { prfx = "€ < "; } else if (key == "s") { prfx = ' '; name = _STDO.lng.get("stock-filter-only-available-short", true); } var tag = _self.createTag( keyval, prfx + (name ? name : values[i]), ); cnt++; _self.tags._el_appnd(tag); } } } } _STDO.get(".filter-tags")[0].style.opacity = cnt <= 0 ? 0 : 1; }, controlUrl: function (keyval, selected) { var _self = this; var key = keyval[0]; var active = _STDO.url.get(key); if ( key == "p_from" || key == "p_till" || key == "s" || key == "o" || key == "search" ) { _STDO.url.remove(key); active = false; } if (selected) { if (!active || active == null || active.indexOf(keyval[1]) === -1) { if (active) _STDO.url.set(key, active + "." + keyval[1]); else _STDO.url.set(key, keyval[1]); } } else { if (active && active.indexOf(keyval[1]) > -1) { var newvalue = active .replace(keyval[1], "") .replace(/^\.?|\.?$/g, ""); if (newvalue != "") _STDO.url.set(key, newvalue); else _STDO.url.remove(key); } } }, createProducts: function (init, totop) { var _self = this; init = init || false; totop = totop || false; _self.settings.productsLoaded = false; _self.getProducts(function (data) { _self.products._html_set(""); for (var i = 0; i < data.length; i++) { var product = _self.createProduct(data[i]); _self.products._el_appnd(product); } // f_shopFotoFadeIn('.shop-filter-products .products .fltr-fotoFadeIn', false); f_shopInitImages( ".shop-filter-products .products .fltr-fotoFadeIn", false, ); _self.scrollIfNeeded(totop); _self.settings.productsLoaded = true; }, init); _self.controlTags(); }, createProduct: function (data) { var _self = this; var aPhotos = []; var inStock = data.stock; // console.log(data) if (data.photo_listagg) { aPhotos = data.photo_listagg.split("|"); aPhotos.sort(function (a, b) { var a_ord = a.split(":")[2]; var b_ord = b.split(":")[2]; return (a_ord ? a_ord : 9999) - (b_ord ? b_ord : 0); }); } // if(_self.settings.manualstock && data.prod_data != ''){ // var proddata = {} // try{ // proddata = JSON.parse(data.prod_data); // }catch (err){ // console.log('Wrong product data object', err); // } // inStock = proddata.stock // } var btw = _self.settings.btw === "excl" ? "_" + _self.settings.btw : ""; var price_is_zero = !data.price || data.price == "" || +data.price <= 0; // var discount = _self.settings.payment && data.pdis_discount != '' && data.pdis_discount_type != '' && data.price != data.org_price; var discount = data.pdis_discount != "" && data.pdis_discount_type != "" && data.price != data.org_price; if (!price_is_zero && discount) { var discountLine; if (data.pdis_discount_type === "VAL") discountLine = "- € " + f_moneyformat(data.pdis_discount); else if (data.pdis_discount_type === "PRC") discountLine = "-" + Math.floor(data.pdis_discount) + "%"; } var photos = _STDO.create("div", { class: "fltr-product-photos " + (aPhotos.length > 1 ? "" : "empty"), }); for (var i = 0; i < aPhotos.length && i < 4; i++) photos._el_appnd( _STDO .create() ._el_appnd( _STDO.create("span", { class: "fltr-product-thumbs" + (i == 0 ? " active" : ""), "data-base": _self.settings.imagesMap + data.prod_number, "data-src": aPhotos[i].split(":")[0], }), ), ); var base = _self.settings.imagesMap + data.prod_number; var url = _self.settings.prodUrl .replace( "{prod}", encodeURIComponent( data.prod_url == "" ? data.prod_number : data.prod_url, ), ) .replace("{prod_nr}", data.prod_number); var product = _STDO.create("a", { class: "fltr-product" + (discount ? " discount" : "") + (price_is_zero ? " no-price" : ""), href: url, data: data, id: data.prod_number, }); product._el_appnd( _STDO .create("div", { class: "fltr-product-photo" }) ._el_appnd( _STDO.create("span", { class: "fltr-fotoFadeIn", "data-base": aPhotos.length > 0 ? base : "", "data-src": aPhotos.length > 0 ? aPhotos[0].split(":")[0] : "", }), ) ._el_appnd(photos), ); var info = _STDO.create("div", { class: "fltr-product-info" }); product._el_appnd(info); info._el_appnd( _STDO.create("div", { class: "fltr-product-name", html: data.prod_name, }), ); if (!inStock && _self.settings.manualstock) { info._el_appnd( _STDO.create("small", { class: "fltr-product-price text-muted textDanger", html: _self.settings.rentshop ? _STDO.lng.get("product-rented-out", true) : _STDO.lng.get("product-sold-out", true), }), ); } else if (!price_is_zero) { info._el_appnd( _STDO.create("div", { class: "fltr-product-price", html: discount ? "€ " + f_moneyformat(data["price" + btw]) + "
€ " + f_moneyformat(data["org_price" + btw]) + "" : "€ " + f_moneyformat(data["price" + btw]), }), ); } info._el_appnd( _STDO.create("div", { class: "fltr-product-description", html: "" + (data.prod_short_description != "" ? data.prod_short_description : data.prod_description) + "", }), ); if (_self.settings.compare) { info._el_appnd( _STDO.create("div", { class: "fltr-product-compare", html: ' ' + _STDO.lng.get("compare-product", true) + "", }), ); } if (discount) product._el_appnd( _STDO.create("span", { class: "fltr-product-discount-badge", html: discountLine, }), ); return product; }, createTag: function (keyval, value) { var _self = this; var $tag = _STDO .create("a", { class: "filter-tag", value: keyval }) ._el_appnd(_STDO.create("span", { html: value })) ._el_appnd(_STDO.create("i", { class: "fa fa-times" })); return $tag; }, getProducts: function (cb, init) { var _self = this; init = init || false; var aParam = { c: "product", a: "filterProducts", p: { filters: _self.settings.filters, page: _self.settings.page, init: init ? "init" : init, range: _self.settings.range.length > 0, filterId: _self.settings.filterId, }, }; _self.toggleLoaders("disable"); _STDO.ajx( _self.settings.ajax_url, aParam, function (data) { _self.settings.payment = data.hasOwnProperty("payment") ? data.payment : false; _self.settings.rentshop = data.hasOwnProperty("rentshop") ? data.rentshop : false; _self.settings.compare = data.hasOwnProperty("compare") ? data.compare : false; _self.settings.manualstock = data.hasOwnProperty("manualstock") ? data.manualstock : false; _self.settings.stocklabel = data.hasOwnProperty("stocklabel") ? data.stocklabel : false; if ( _self.settings.payment && _self.settings.range.length == 0 && init && "pricerange" in data ) _self.pricerange(data.pricerange); _self.pagination( data.hasOwnProperty("last") && data.last != false && init ? data.last : false, ); cb(data.products); // cb(_self.settings.products.slice((4 * (_self.settings.page - 1)), 4)) _self.toggleLoaders("enable"); }, true, ); }, setOptions: function () { var _self = this; for (var i = 0; i < sessionStorage.length; i++) { var key = sessionStorage.key(i); var needle = window.Org + "_set-"; if (key.lastIndexOf(needle, 0) === 0) { _self.setOption( key.split("-").reverse()[0], sessionStorage.getItem(key), ); } } }, setOption: function (mode, action) { var _self = this; var $options = _STDO.get( ".options", _STDO.get(".shop-filter-products", _self.element)[0], )[0]; if ($options) { switch (mode) { case "view": var $parent = _STDO.get(".view", $options)[0]; if ($parent) { _STDO.get(".view .active", $parent)[0]._clss_remove("active"); if (action === "horizontal") { _self.products._clss_remove("blocks"); _self.products._clss_add("horizontal"); } else { _self.products._clss_remove("horizontal"); _self.products._clss_add("blocks"); } _STDO .get('.view button[action="' + action + '"]')[0] ._clss_add("active"); } break; } sessionStorage.setItem(window.Org + "_set-" + mode, action); } }, initRangefilter: function () { var _self = this; var $fltr = _STDO.get("#collapsePrice"); if ($fltr) { var $inp1 = _STDO.get('[fltr-pricerange="0"]', $fltr)[0]; var $inp2 = _STDO.get('[fltr-pricerange="1"]', $fltr)[0]; $("#fltr-pricerange").slider({ range: true, min: 0, max: 0, step: 1, // values: [ 0, 0 ], slide: function (event, ui) { $inp1.value = ui.values[0]; $inp2.value = ui.values[1]; }, change: function (event, ui) { if (event.originalEvent) { var keyvalfrom = ["p_from", ui.values[0]], keyvaltill = ["p_till", ui.values[1]]; $inp1.value = ui.values[0]; $inp2.value = ui.values[1]; var addfrom = ui.values[0] > _self.settings.range[0]; var addtill = ui.values[1] < _self.settings.range[1]; _self.controlUrl(keyvalfrom, addfrom); _self.controlFilters(keyvalfrom, addfrom); _self.controlUrl(keyvaltill, addtill); _self.controlFilters(keyvaltill, addtill); _self.settings.page = 1; _STDO.url.remove("page"); _self.createProducts(true, true); } }, }); } }, pagination: function (last) { var _self = this; last = last || false; var pager = _self.pager; var prv, txt, nxt; if (last) { //init _self.settings.lastPage = last; _self.pager._html_set(""); if (last > 1) { prv = _STDO.create("li", { class: "prv", html: '', }); pager._el_appnd(prv); var language = document.documentElement._attr_get("lang"); txt = _STDO.create("span", { html: _STDO.lng.get("page-page", true) + " " + _self.settings.page + " " + _STDO.lng.get("page-from", true) + " " + last, }); pager._el_appnd(txt); nxt = _STDO.create("li", { class: "nxt", html: '', }); pager._el_appnd(nxt); } } else { prv = _STDO.get(".prv", pager)[0]; nxt = _STDO.get(".nxt", pager)[0]; _STDO .get("span", _STDO.get("span", pager)[0])[0] ._html_set(_self.settings.page); } if (prv && nxt) { var state = { filters: _self.settings.filters, page: _self.settings.page, }; if (_self.settings.page <= 1) { prv._clss_add("disabled"); _STDO.url.remove("page"); } else { prv._clss_remove("disabled"); _STDO.url.set("page", _self.settings.page); } if (_self.settings.page >= _self.settings.lastPage) nxt._clss_add("disabled"); else nxt._clss_remove("disabled"); } }, pricerange: function (range) { var _self = this; var $slider = $("#fltr-pricerange"), from = +range[0], till = +range[1]; if ($slider.length > 0) { _self.settings.range = [from, till]; $slider.slider("option", "min", from); $slider.slider("option", "max", till); var p_from = _STDO.url.get("p_from") || from; var p_till = _STDO.url.get("p_till") || till; $slider.slider("values", [p_from, p_till]); var $fltr = _STDO.get("#collapsePrice"); var $inp1 = _STDO.get('[fltr-pricerange="0"]', $fltr)[0]; var $inp2 = _STDO.get('[fltr-pricerange="1"]', $fltr)[0]; var onchnge = function () { if (this.value < p_from) this.value = p_from; else if (this.value > p_till) this.value = p_till; }; $inp1.value = p_from; $inp1.min = p_from; $inp1.max = p_till; $inp1.onchange = onchnge; $inp2.value = p_till; $inp2.min = p_from; $inp2.max = p_till; $inp2.onchange = onchnge; } }, scrollIfNeeded: function (totop) { var _self = this; totop = totop || false; var offset = false; if (totop) { var bodyRect = document.body.getBoundingClientRect(), elemRect = _self.element .closest("[object-parent]") .getBoundingClientRect(); offset = elemRect.top < 0 ? elemRect.top - bodyRect.top : false; } else { var storage = sessionStorage.getItem(_self.settings.pagCode64); offset = storage ? storage : false; } if (offset) window.scrollTo(0, offset); }, scrollControl: function () { var _self = this; window.addEventListener("load", function (e) { _self.settings.loadTime = e.timeStamp; }); window.addEventListener( "scroll", function (e) { if ( !_self.settings.loadTime || e.timeStamp - _self.settings.loadTime < 100 ) return; window.clearTimeout(_self.settings.scrollTimer); _self.settings.scrollTimer = setTimeout(function () { var offset = (window.pageYOffset || document.documentElement.scrollTop) - (document.documentElement.clientTop || 0); if (offset > 0) sessionStorage.setItem(_self.settings.pagCode64, offset); else sessionStorage.removeItem(_self.settings.pagCode64); }, 150); }, false, ); }, toggleLoaders: function (action) { var _self = this; var $filters = _self.filters; var $products = _self.products.parentElement; if ($filters) if (action === "disable") $filters._clss_add("loading"); else if (action === "enable") $filters._clss_remove("loading"); if ($products) if (action === "disable") $products._clss_add("loading"); else if (action === "enable") $products._clss_remove("loading"); }, uncheckInputs: function (selector, parent) { var _self = this; parent = parent || document; var inputs = _STDO.get(selector, parent); for (var i = 0; i < inputs.length; i++) inputs[i].checked = false; }, unsetRange: function (unset) { var _self = this; var $fltr = _STDO.get("#collapsePrice"); if ($fltr) { _STDO.loop(unset, function (i, v) { var idx = v == "p_from" ? 0 : 1; $("#fltr-pricerange").slider( "values", idx, _self.settings.range[idx], ); _STDO.get('[fltr-pricerange="' + idx + '"]', $fltr)[0].value = _self.settings.range[idx]; }); } }, }); $.fn[pluginName] = function (options) { var args = arguments; return this.each(function () { if (!$.data(this, "plugin_" + pluginName)) $.data(this, "plugin_" + pluginName, new Plugin(this, options)); }); }; $(".shop-filter").Filter(); })(jQuery, window, document); /* _ _ _ _ ___| |_ ___(_) _| | ___ _ __ | | __/ __| _| __| |/ _ |/ _ \_| /_ `| |___ [__\__ \ |_| _|| | (_| | (_) )| | | | |_ _] (___/\__|___|_|\__/_|\___(_)_| |_|___) ___ _ __ __ ___ / _| / \/ `/ __| ( (_| | | | | \__ \ \___/_| |_| |_|___/ _ _ _ _ ___| |_ ___(_) _| | ___ _ __ | | / __| _| __| |/ _ |/ _ \ | /_ `| | \__ \ |_| _|| | (_| | (_) || | | | |_ |___/\__|___|_|\__/_|\___(_)_| |_|___| */ ; (function ($, window, document, undefined) { "use strict"; var pluginName = "Wizard", defaults = { ajx_url: { wizard: '/api/SHOP/AJAX/main', cart: '/api/SHOP/AJAX/cart?target=cart', customer: '/api/SHOP/AJAX/customer', discount: '/api/SHOP/AJAX/discount' }, index: 0, servicepoints: {}, servicepointSelected: 0, country: 'NL', latlng: {}, markers: {}, activeTab: '', activeBilling: '', mapInitialized: false } function Plugin(element, options) { this.element = element; this.$element = $(element); this.settings = $.extend({}, defaults, options); this._name = pluginName; this.init(); return this; } $.extend(Plugin.prototype, { init: function(){ var _self = this; _self.$header = $('#wizard-header'); _self.$body = $('#wizard-body'); _self.header = _STDO.get('#wizard-header'); _self.err = _STDO.get('#wizard-err'); _self.body = _STDO.get('#wizard-body'); _self.settings.index = _self.element._attr_get('data-index'); _self.getWizardStep(_self.settings.index); _self.bindEvents(); _self.resetUrl(); }, bindEvents: function(){ var _self = this; _self.$header .on("click", "li.active", function(evt){ evt.preventDefault(); }) .on("click", "li:not(.active)", function(evt){ evt.preventDefault(); var idx = this._attr_get('data-index')//(_self.settings.index > $(this).index() ? idx + ($(this).index()+1) - (_self.settings.index+1): (_self.settings.index+1) - ($(this).index()+1)); if($(this).is('.complete')) //|| _self.$header.find('li[data-index="'+(+idx-1)+'"]').is('.active') _self.getWizardStep(idx, $(this).is('.complete')); }) _self.$body .on("click", ".right>button", function(evt){ evt.preventDefault(); _self.getWizardStep(); }) .on("change", "div.wizard-card-item.form input", function(){ validateField($(this)); }) .on("click", ".wizard-card-item .shop-product-amount .input-group-addon", function(evt){ evt.preventDefault(); var action = this._attr_get('action'); var input = _STDO.get('.form-control', this.parentNode)[0]; input.value = (action == 'plus' ? +input.value +1 : +input.value -1) $(input).trigger('change') }) .on("submit", ".discount #discount-form", function(evt){ evt.preventDefault(); _self.useDiscount(evt.target); }) .on("click", ".discounts i[data-code]", function(evt){ evt.preventDefault(); _self.removeDiscount(evt.target); }) .on("click", "[class*=o-]>h3>i", function(evt){ evt.preventDefault(); var parent = this.closest('.wizard-card-item') var idx = parent._el_mtch('.o-cart') ? 0 : (parent._el_mtch('.o-addresses') ? 1 : 2); _self.getWizardStep(idx, true); }) .on("change", ".wizard-card-item .shop-product-amount input", function(evt){ var id = evt.target.closest('.wizard-card-item[id]').id; if(evt.target.value == '') evt.target.value = '1'; _self.updateAmount(id, evt.target.value); }) .on("input", ".discount input", function(evt){ var value = this.value.toUpperCase().replace(/[^A-Z0-9]/g, '-'); if(value.length >= 50){ value = value.substr(0, 50); } evt.target.value = value var btn = _STDO.get('button', evt.target.parentNode)[0]; var message = _STDO.get('span', evt.target.parentNode)[0]; btn._el_shw(); message._el_hde(); if(value.length > 0){ btn._clss_remove('disabled') }else{ btn._clss_add('disabled') } }) .on("change", "#wizard-login input[placeholder]", function(){ _STDO.get('#login-message')._html_set(''); }) .on("submit", "#wizard-login", function(evt){ var values = $(this).serializeArray(); evt.preventDefault(); var param = []; var btn = _STDO.get('input[type=submit]', this)[0]; for(var i = 0; i < values.length; i++){ param[values[i].name] = values[i].value; } _STDO.btn.loading(btn); shopAuthorize(param.email, param.password, function(message){ if(typeof message === "object"){ //oke _self.getWizardStep(1, true); _STDO.get('#login-message')._html_set(''); var menucustitem = _STDO.get('#menucust') if(menucustitem){ var menuitem = _STDO.get('a', menucustitem) if(menuitem && menuitem.length > 0){ menuitem[0] ._html_set('') ._el_appnd(_STDO.create('i', {'class': 'fa fa-fw fa-lg fa-user'})) ._el_appnd(document.createTextNode(message.cust_name)) } } }else{ _STDO.get('#login-message')._html_set(message); _STDO.btn.loading(btn, true); _self.scrollToTop(); } }) }) .on("click", ".shop-signout", function(evt){ evt.preventDefault(); shopSignout(function(){ _self.getWizardStep(1, true, 'back'); var menuitem = _STDO.get('a', _STDO.get('#menucust')) if(menuitem && menuitem.length > 0){ menuitem[0] ._html_set('') ._el_appnd(_STDO.create('i', {'class': 'fa fa-fw fa-lg fa-user'})) ._el_appnd(document.createTextNode(_STDO.lng.get('login', true))) } }) }) .on("click", "#continue, #back, #register", function(evt){ evt.preventDefault(); _self.getWizardStep(1, (this.id == 'back'), this.id); }) .on("click", ".editaddricon", function(evt){ evt.preventDefault(); _self.toggleForms(this); }) .on("click", ".editaddr>input[type=button]:not(.disabled)", function(evt){ evt.preventDefault(); _self.editAddress(this); }) .on("click", ".newaddr>input[type=button]:not(.disabled)", function(evt){ evt.preventDefault(); _self.newAddress(this); }) .on("change", "input[name*=wrdaddr]", function(evt){ evt.preventDefault(); _self.toggleForms(this); var addrs = _STDO.get('.a-wrap', this.closest('.addresses')); _STDO.loop(addrs, function(i, v){ v._clss_add('disabled'); }) _STDO.get('.a-wrap', this.closest('.addr'))[0]._clss_remove('disabled'); _self.settings.servicepointSelected = 0 if(this.closest('.billing')){ _self.settings.servicepoints = {} _self.settings.markers = {} _self.settings.activeBilling = this.value _self.refreshServicePoint() }else{ if(this.closest('.wzrd-service-point-item')){ var id = this.id _self.settings.servicepointSelected = id } } }) .on("click", "#register-submit", function(evt){ evt.preventDefault(); var _this = this; var values = false; var $form = _self.$body.find('div.wizard-card-item.form'); var $fields = $form.find('input[type], select'); if(!_self.validateFields($fields)){ return false; }else{ values = $fields.serializeArray() } _STDO.btn.loading(_this); shopRegister(values, function(data){ _STDO.btn.loading(_this, true); _STDO.get('#wizard-err')._html_set(''); if(!data.suc){ _STDO.get('#wizard-err')._html_set(data.msg); }else{ if(data.msg == ''){ _self.getWizardStep(1, true); }else{ var wrapper = _this.closest('.login') var message = _STDO.create('span', {'class': 'register-message', html: data.msg}) wrapper._html_set(''); wrapper._el_appnd(message); _self.scrollToTop(); } } }) }) .on("click", ".remove-item", function(evt){ evt.preventDefault(); var number = evt.target.closest('.wizard-card-item').id $('#cart, #menucart, #inlinecart').each(function(){$(this).data('plugin_Cart').removeItem(number)}) }) .on("shown.bs.tab", ".addr-navigation>.nav>li>a", function(evt){ _self.settings.activeTab = this.getAttribute('href').substring(1) _self.refreshServicePoint() }) .on("click", ".wzrd-service-point-item .fa-map-marker", function(evt){ var point = this.closest('.wzrd-service-point-item').data.point var marker = _self.settings.markers[point.id] var latLng = marker.getPosition(); _self.map.panTo(latLng); new google.maps.event.trigger(marker, 'click'); _self.removePopover() }) .on("click", ".wzrd-service-point-item .fa-ellipsis-h", function(evt){ var point = this.closest('.wzrd-service-point-item').data.point var $openingtimes = _STDO.create('table', {'class': 'wizard-opening-times'}) for(var key in point.openingtimes){ var $row = _STDO.create('tr') $row._el_appnd(_STDO.create('td', {'html': '' + _STDO.lng.get('weekday-' + key, true) + ''})) $row._el_appnd(_STDO.create('td', {'html': (point.openingtimes[key].length && point.openingtimes[key][0] !== '00:00 - 00:00' ? point.openingtimes[key][0] : ''+_STDO.lng.get('openingtimes-closed', true)+'')})) $openingtimes._el_appnd($row) } var _this = $(this) _self.removePopover() _self.popover = _this.popover({ content: $openingtimes.outerHTML, html: true, container: 'body' }); if(_this.is('[aria-describedby]')){ _self.removePopover() }else{ _self.popover.popover('show'); } }) }, refreshServicePoint: function(){ var _self = this if(_self.settings.activeBilling != '' && _self.settings.activeTab === 'wzrd-tab-service'){ if(_self.infowindow){ _self.infowindow.close() } $.post({ url: _self.settings.ajx_url.wizard, data: { 'c': 'wizard', 'a': 'getFullAddress', 'p': { id: _self.settings.activeBilling } }, noLoading: true, dataType: 'json', success: function(data){ if(!data.err){ _self.settings.country = data.suc.addr_country var send = { address: data.suc.addr_address1, number: data.suc.addr_address2, place: data.suc.addr_city } f_getLatLng(send, function(latlng){ if(latlng){ _self.latlng = new google.maps.LatLng(latlng.lat, latlng.lng); if(_self.settings.mapInitialized){ _self.map.setCenter(_self.latlng); }else{ _self.initMap() } }else{ console.log('Invalid address'); } }) } } }) } }, initMap: function(){ var _self = this _self.$tab = _STDO.get('#' + _self.settings.activeTab); _self.$tab.innerHTML = '' var $wrapper = _STDO.create('div', {'id': 'wzrd-service-map'}); var $side = _STDO.create('div', {'class': 'points shop-select-list'}) _self.$pointsList = _STDO.create('ul') $side._el_appnd(_self.$pointsList) var $map = _STDO.create('div', {'class': 'map'}) $wrapper._el_appnd($side) $wrapper._el_appnd($map) _self.$tab._el_appnd($wrapper) _self.map = new google.maps.Map($map, { center: _self.latlng, zoom: 12, streetViewControl: false, gestureHandling: "cooperative", mapTypeId: google.maps.MapTypeId.ROADMAP }); _self.infowindow = new google.maps.InfoWindow({ content: '', maxWidth: 250 }); google.maps.event.addDomListener(window, 'resize', function(){ var center = map.getCenter(); google.maps.event.trigger(_self.map, "resize"); _self.map.setCenter(center); }); google.maps.event.addListenerOnce(_self.map, 'idle', function(){ _self.settings.mapInitialized = true }); google.maps.event.addDomListener(_self.map, 'idle', function(){ var bounds = _self.map.getBounds(); var ne = bounds.getNorthEast(); var sw = bounds.getSouthWest(); var center = _self.latlng; _self.getServicePoints(center, ne, sw); }); }, getServicePoints: function(center, northeast, southwest){ var _self = this; $.post({ url: _self.settings.ajx_url.wizard, data: { 'c': 'wizard', 'a': 'getServicePoints', 'p': { country: _self.settings.country, center: [center.lat, center.lng], northeast: [northeast.lat(), northeast.lng()], southwest: [southwest.lat(), southwest.lng()] } }, noLoading: true, dataType: 'json', success: function(data){ _self.setServicePoints(data['suc']) var $points = $('#wzrd-service-map .points') $points.off('scroll') $points.scroll(function(){ _self.removePopover() }) } }) }, setServicePoints: function(points){ var _self = this _self.$pointsList.innerHTML = '' _self.$pointsList.scrollTop = 0; for(var i = 0; i < points.length; i++){ if(!_self.settings.servicepoints.hasOwnProperty(points[i].id)){ _self.settings.servicepoints[points[i].id] = points[i] var latlng = new google.maps.LatLng(points[i].marker.latitude, points[i].marker.longitude); _self.settings.markers[points[i].id] = new google.maps.Marker({ position: latlng, map: _self.map }) google.maps.event.addListener(_self.settings.markers[points[i].id], 'click', (function(marker, i) { return function() { var $html = '
'; $html += '' + points[i].distance + ' - ' + points[i].address.carrier.toUpperCase() + ''; $html += '' + points[i].name + ''; $html += '

' + points[i].address.addr_address1 + ' ' + points[i].address.addr_address2; $html += ',
' + points[i].address.addr_zip + ' ' + points[i].address.addr_city + '

'; $html += ''; $html += '
'; _self.infowindow.setContent($html); _self.infowindow.open(_self.map, marker); } })(_self.settings.markers[points[i].id], i)) } _self.$pointsList._el_appnd(_self.createServicePointItem(points[i])) } }, removePopover: function(){ var _self = this; if(_self.popover){ _self.popover.popover('destroy') _self.popover = undefined } }, createServicePointItem: function(point){ var _self = this; var selected = _self.settings.servicepointSelected == point.id var $item = _STDO.create('li', {'class': 'wzrd-service-point-item addr', data: {point: point}}) var $head = _STDO.create('div', {'class': 'head'}) $head._el_appnd(_STDO.create('small', {'html': point.distance})) $head._el_appnd(_STDO.create('small', {'html': (point.address.carrier ? point.address.carrier.toUpperCase() : '')})) $item._el_appnd($head) $item._el_appnd(_STDO.create('i', {'class': 'fa fa-map-marker'})) $item._el_appnd(_STDO.create('i', {'class': 'fa fa-ellipsis-h'})) var $input = _STDO.create('input', {'type': 'radio', 'id': point.id, 'name': 'wrdaddr-DELIVERY', value: JSON.stringify(point.address)}) if(selected){ $input.checked = true } $item ._el_appnd(_STDO.create('div') ._el_appnd(_STDO.create('label', {'class': 'shop-radio xs', 'id': 'point-' + point.id}) ._el_appnd($input) ._el_appnd(_STDO.create('span')))) var $address = _STDO.create('div', {'class': 'a-wrap' + (selected ? '' : ' disabled')}) $address._el_appnd(_STDO.create('strong', {'html': point.name})) $address._el_appnd(_STDO.create('span', {'html': point.address.addr_address1 + ' ' + point.address.addr_address2})) $address._el_appnd(_STDO.create('span', {'html': point.address.addr_zip + ' ' + point.address.addr_city})) $item._el_appnd(_STDO.create('div')._el_appnd($address)) return $item }, editAddress: function(_this){ var _self = this; var parent = _this.closest('.addr'); var $fields = _STDO.get('input[data-field], select[data-field]', parent); var radio = _STDO.get('.shop-radio input', parent)[0]; var mode = parent.closest('.addrtitle')._el_mtch('.billing') ? 'billing' : 'shipping'; if(!_self.validateFields($($fields))){ return false; }else{ _this._clss_add('disabled'); var tmp = $($fields).serializeArray(); var values = {}; _STDO.loop(tmp, function(i, v){ values[v.name] = v.value; }) var aParam = { 'action': 'editAddress', 'param': { id: parent.getAttribute('id'), rel: parent.getAttribute('rel'), values: values, active: radio.checked, mode: mode } } _STDO.ajx(_self.settings.ajx_url.customer, aParam, function(data){ parent._attr_set('rel', data[0]); parent._attr_set('id', data[1]); radio.value = data[1]; var $addr = _STDO.get('.address', parent)[0]; var lines = _STDO.get('span', $addr); lines[0]._html_set(values['wzrdnamestreet'] + ' ' + values['wzrdnamenumber']) lines[1]._html_set(values['wzrdnamepostal'] + ' ' + values['wzrdnamecity']) if(lines[2] && data[2]){ lines[2]._html_set(data[2]) } _self.toggleForms(_this); _this._clss_remove('disabled'); }) } }, newAddress: function(_this){ var _self = this; var parent = _this.closest('.addr'); var $fields = _STDO.get('input[data-field], select[data-field]', parent); var mode = parent.closest('.addrtitle')._el_mtch('.billing') ? 'billing' : 'shipping'; if(!_self.validateFields($($fields))){ return false; }else{ _this._clss_add('disabled'); var tmp = $($fields).serializeArray(); var values = {}; _STDO.loop(tmp, function(i, v){ values[v.name] = v.value; }) var aParam = { 'action': 'newAddress', 'param': { values: values, mode: mode } } _STDO.ajx(_self.settings.ajx_url.customer, aParam, function(data){ _self.getWizardStep(1, false, 'new_'+mode+'_'+data[1]); }) } }, getWizardStep: function(idx, complete, data){ var _self = this; data = data || false; idx = typeof idx == "undefined" ? (+_self.settings.index + 1) : idx; complete = complete || false; var values = false; if(_self.settings.index == 1 && !complete){// var $form = _self.$body.find(':not(.editaddr):not(.newaddr)>div.wizard-card-item.form'); var $fields = $form.find('input[data-field]:not(.openinghours):not(.extrafield), select[data-field]:not(.openinghours):not(.extrafield)'); var $deliveryFields = $form.find('.openinghours') var $extrafields = $form.find('.extrafield') if($fields.length > 0){ if(($deliveryFields.length > 0 && !_self.validateFields($deliveryFields)) || ($extrafields.length > 0 && !_self.validateFields($extrafields)) || !_self.validateFields($fields)){ return false; }else{ var $allFields = $().add($fields).add($deliveryFields).add($extrafields) values = $allFields.serializeArray() var shipping = _self.$body.find('input[name="wrdaddr-DELIVERY"]:checked') if(shipping.length > 0){ values.push({name: 'shipping', value: (shipping[0] ? shipping[0].value : '') }) } } }else if(_self.$body.find('.addresses').length > 0){ if(!_self.validateFields($deliveryFields) || !_self.validateFields($extrafields)){ return false; } var billing = _self.$body.find('input[name="wrdaddr-HOME"]:checked') var shipping = _self.$body.find('input[name="wrdaddr-DELIVERY"]:checked') values = []; values.push([{key: 'billing', value: (billing[0] ? billing[0].value : '') }]) if(shipping.length > 0){ values.push([{key: 'shipping', value: (shipping[0] ? shipping[0].value : '') }]) }else{ if(_self.$body.find('input[name="wrdaddr-DELIVERY"]').length === 0){ values.push([{key: 'shipping', value: (billing[0] ? billing[0].value : '') }]) } } $deliveryFields.each(function(i, $deliveryField){ values.push([{key: $deliveryField._attr_get('name'), value: $deliveryField.value }]) }) $extrafields.each(function(i, $extraField){ values.push([{key: $extraField._attr_get('name'), value: $extraField.value }]) }) } }else if(_self.settings.index == 2 && !complete){ var method = _self.$body.find('input[name="wrdmethod"]:checked')[0]; if(method){ var field = _STDO.get('#' + method.value); values = [{key: method.value, value: (field ? field.value : "") }] } }else if(_self.settings.index == 3 && !complete){ var $field = _self.$body.find('.o-memo.wizard-card-item input[data-field]'); if($field.length > 0){ if(!_self.validateFields($field)){ return false; }else{ values = $field.serializeArray() } } } _self.err._html_set(''); _self.settings.mapInitialized = false _self.element._clss_add('loading'); $.post({ url: _self.settings.ajx_url.wizard, noLoading: true, data: { 'c': 'wizard', 'a': 'getWizardStep', 'p': { 'idx': idx, 'complete': complete, 'values': values, 'data': data } }, dataType: 'json', success: function(data){ if(data.suc.body == 'payment'){ window.location.href = './SHOP/index.php?a=payment'; }else{ var body = data.suc.body; var step = data.suc.header; var err = data.suc.err; if(typeof err != "undefined"){ _self.err._html_set(err) // _STDO.get('.right>button', _self.body)[0].style.display = 'none'; }else{ var left = _STDO.get('.left', _self.body)[0] _self.header._html_set(step) _STDO.get('.title', _self.body)[0]._html_set(body.title) left._html_set(body.left) _STDO.get('.right', _self.body)[0]._html_set(body.right) if(body.right == ''){ left._clss_remove('col-sm-9'); left._clss_add('col-sm-offset-1'); left._clss_add('col-sm-10'); }else{ left._clss_remove('col-sm-offset-1'); left._clss_remove('col-sm-10'); left._clss_add('col-sm-9'); } _self.settings.index = idx; } // f_initSelect('#wizard-body'); var $billing = _self.$body.find('.billing .addr input:checked') if($billing.length > 0){ _self.settings.servicepoints = {} _self.settings.markers = {} _self.settings.servicepointSelected = 0 _self.settings.activeBilling = $billing[0].value var active = _self.$body.find('.shipping .addr-navigation li.active>a') if(active.length > 0){ _self.settings.activeTab = active[0].getAttribute('href').substring(1) var value = active[0].getAttribute('value') active[0].removeAttribute('value') if(value != '' && !isNaN(value)){ _self.settings.servicepointSelected = +value } _self.refreshServicePoint() } } _self.initOpeningFields() _self.initExtraFields() _self.element._clss_remove('loading'); _self.scrollToTop(); $('#cart, #menucart, #inlinecart').each(function(){$(this).data('plugin_Cart').getCartItems()}) } } }) }, initExtraFields: function(){ var _self = this var $startdate = _STDO.get('[name="extrafield_startdate"]', _self.$body[0]) if($startdate.length){ $startdate = $startdate[0] $startdate.addEventListener('click', function(){ f_datePicker($startdate, { dateFormat: 'dd/mm/yy', minDate: moment().add(1, 'days').toDate() }) }) } }, initOpeningFields: function(){ var _self = this var $date = _STDO.get('[name="wzrdnamedate"]', _self.$body[0]) var $time = _STDO.get('[name="wzrdnametime"]', _self.$body[0]) if($date.length && $time.length){ $date = $date[0] $time = $time[0] var openings = JSON.parse($date._attr_get('data-openinghours')); var setHours = function(date, selected){ selected = selected || false var momentdate = moment(date, 'DD/MM/YYYY') var day = momentdate.day(); var datetime = momentdate.format('YYYYMMDD'); var times = openings.hasOwnProperty(day) ? openings[day] : openings.hasOwnProperty(datetime) ? openings[datetime] : false if(times){ $time.innerHTML = '' _STDO.loop(times, function(i, time){ var $option = _STDO.create('option', {'html': time, value: time}); if(selected && selected === time){ $option._attr_set('selected', 'selected'); } $time._el_appnd($option) }) } } $date.addEventListener('click', function(){ f_datePicker($date, { dateFormat: 'dd/mm/yy', minDate: new Date(), beforeShowDay: function(date) { var day = date.getDay(); var datetime = moment(date).format('YYYYMMDD'); return [openings.hasOwnProperty(day) || openings.hasOwnProperty(datetime), ''] }, onSelect: function(date, picker){ setHours(date) } }) }) if($date.value != '' && $time._attr_get('value') != ''){ setHours($date.value, $time._attr_get('value')) } } }, resetUrl: function(){ _STDO.url.remove('a') _STDO.url.remove('n') }, scrollToTop: function(){ var bodyRect = document.body.getBoundingClientRect(), elemRect = _STDO.get('#wizard-header').getBoundingClientRect(); var offset = elemRect.top < 70 ? elemRect.top - bodyRect.top : false; if(offset) window.scrollTo(0, (offset - 70)); }, toggleForms: function(_this){ var _self = this; var edit = _this._el_mtch('.editaddricon') var $forms = _STDO.get('.editaddr:not(.collapse)', _this.closest('.login')) var $addrs = _STDO.get('.address', _this.closest('.login')) for(var i = 0; i < $forms.length; i++){ $forms[i].style.display = 'none'; } for(var i = 0; i < $addrs.length; i++){ $addrs[i].parentNode.style.width = 'calc(100% - 40px)'; var radio = _STDO.get('.shop-radio', $addrs[i].closest('.addr'))[0].parentNode; radio.style.display = ''; $addrs[i].style.display = ''; } if(edit){ //||(_this.checked && _this.value == 'new') var $form = _STDO.get('.editaddr', _this.closest('.addr'))[0]; $form.style.display = ''; var $addr = _STDO.get('.address', _this.closest('.addr'))[0]; $addr.parentNode.style.width = '100%'; $addr.style.display = 'none'; var radio = _STDO.get('.shop-radio', _this.closest('.addr'))[0].parentNode; radio.style.display = 'none'; } }, updateAmount: function(id, value){ var _self = this; var item = _STDO.get('#'+id); var aParam = { 'action': 'updateAmount', 'param': { id: id, amount: value } } _STDO.ajx(_self.settings.ajx_url.cart, aParam, function(data){ // var aPrice = _STDO.get('.price>span', item); // var $shipping = _STDO.get('.wizard-card-item.total .shipping') // if($shipping.length > 0){ // $shipping[0]._html_set('€ '+f_moneyformat(data.shipping)); // } // var $total = _STDO.get('.wizard-card-item.total .total-price') // if($total.length > 0){ // $total[0]._html_set('€ '+f_moneyformat(data.totalPrice)); // } // var $subtotal = _STDO.get('.wizard-card-item.total .subtotal-price') // if($subtotal.length > 0){ // $subtotal[0]._html_set('€ '+f_moneyformat(data.subTotalPrice)); // } // if(data.item){ // var $cartitemAmount = _STDO.get('#item-amount-' + data.item.item_number) // if($cartitemAmount){ // $cartitemAmount.value = data.item.amount // } // } // var $discounts = _STDO.get('.wizard-card-item.discounts [class^=disc-]') // _STDO.loop($discounts, function(i, d){ // d.parentNode._clss_add('o') // d.parentNode.previousSibling._clss_add('o') // }) // // $discounts._html_set('') // _STDO.loop(data.discounts, function(i, discount){ // var $discount = _STDO.get('.wizard-card-item.discounts .disc-' + discount.id) // if($discount.length > 0){ // $discount[0].parentNode._clss_remove('o') // $discount[0].parentNode.previousSibling._clss_remove('o') // $discount[0]._html_set('€ '+f_moneyformat(discount.value_eur)); // } // }) // var $discounts = _STDO.get('.wizard-card-item.discounts .o') // _STDO.loop($discounts, function(i, old){ // _STDO.remove(old) // }) if(data.count == 0){ _self.resetUrl(); window.location.reload(); }else{ $('#cart, #menucart, #inlinecart').each(function(){$(this).data('plugin_Cart').getCartItems()}) _self.getWizardStep(_self.settings.index, false); } // if(data.count == 0){ // _self.resetUrl(); // window.location.reload(); // }else{ // if(data.removed){ // _STDO.remove(_STDO.get('#'+data.removed)) // }else{ // var newPrice = data.item.amount * data.item.price_incl_btw; // var newOriginalPrice = data.item.amount * data.item.price_incl_btw_org; // aPrice[0]._html_set('€ ' + f_moneyformat(newPrice)); // if(aPrice.length > 1){ // aPrice[1]._html_set('€ ' + f_moneyformat(newOriginalPrice)); // } // } // $('#cart, #menucart').each(function(){$(this).data('plugin_Cart').getCartItems()}) // } }, true); }, useDiscount: function(target){ var _self = this; var input = _STDO.get('input', target)[0] var message = _STDO.get('span', target)[0] var button = _STDO.get('button', target)[0] var value = input.value var original = button._html_get(); button._html_set(original + '')._clss_add('disabled'); input._clss_add('disabled'); var aParam = { 'action': 'useDiscount', 'param': { code: value } } _STDO.ajx(_self.settings.ajx_url.cart, aParam, function(data){ if(data.message){ input.value = ''; input._clss_remove('disabled'); button._html_set(original)._el_hde() message._html_set(data.message)._el_shw() }else{ _self.getWizardStep(_self.settings.index, true); // button._html_set(original)._clss_remove('disabled'); // input._clss_remove('disabled'); } }, true); }, removeDiscount: function(target){ var _self = this; var code = target._attr_get('data-code'); var aParam = { 'action': 'removeDiscount', 'param': { code: code } } _STDO.ajx(_self.settings.ajx_url.cart, aParam, function(data){ if(data){ _self.getWizardStep(_self.settings.index, true); } }, true); }, validateFields: function($fields){ var _self = this; var valid = true; $fields.each(function(){ if(!validateField($(this)) && valid){ valid = false; } }) return valid; } }); $.fn[pluginName] = function ( options ) { var args = arguments; return this.each(function () { if (!$.data(this, 'plugin_' + pluginName)) $.data(this, 'plugin_' + pluginName, new Plugin( this, options )); }); }; $('#wizard').Wizard(); })(jQuery, window, document); ; (function ($, window, document, undefined) { "use strict"; var pluginName = "Cart", defaults = { count: 0, prevAmount: 0, rentshop: false, view: false, ajx_url: { cart: '/api/SHOP/AJAX/cart?target=cart' } } function Plugin(element, options) { this.element = element; this.$element = $(element); this.settings = $.extend({}, defaults, options); this._name = pluginName; this.init(); return this; } $.extend(Plugin.prototype, { init: function(){ var _self = this; _self.cart = _self.element _self.$cart = _self.$element if(_self.cart){ setTimeout(function(){ _self.getCartItems(); }, 2000); } _self.bindEvents(); }, bindEvents: function(){ var _self = this; _self.$cart .on("click", ".cart-item-footer > a", function(evt){ evt.preventDefault(); var data = this.closest('.cart-item')._data_get(); _self.removeItem(data.item_number); }) }, removeItem: function(id){ var _self = this; var aParam = { 'action': 'removeItem', 'param': { id: id, all: false } } _STDO.ajx(_self.settings.ajx_url.cart, aParam, function(data, all){ $('#cart, #menucart, #inlinecart').each(function(){$(this).data('plugin_Cart').setCart(data.items)}) if(all.product){ f_gtagEvent('remove_from_cart', {}, [all.product]); } var wizard = $('#wizard'); if(wizard.length > 0){ if(data.length > 0){ var $plugin = wizard.data('plugin_Wizard') $plugin.getWizardStep(0) }else{ _STDO.url.remove('a') _STDO.url.remove('n') window.location.reload(false); } } }, true); }, getCartItems: function(){ var _self = this; $.post({ url: _self.settings.ajx_url.cart, data: {'action': 'getCart'}, dataType: 'json', noLoading: true, success: function(data){ _self.settings.rentshop = data.rentshop _self.settings.view = data.view $('#cart, #menucart, #inlinecart').each(function(){$(this).data('plugin_Cart').setCart(data.items)}) } }) }, setCart: function(cart){ var _self = this; var count = 0; var label = f_sttngsLng('amount-label'); if(label == ''){ label = _STDO.lng.get('default-amount-label', true); } var $cart = _STDO.create('div'); for(var i = 0; i < cart.length; i++){ count = count + (1 * +cart[i].amount); var img = _STDO.create('img', {'src': './SHOP/data/wizard-no-image.png'}); if(cart[i].photos_sorted.length > 0){ var firstImage = cart[i].photos_sorted[0] var base = 'SHOP/DATA_APP/IMAGES/' + cart[i].prod_number if(firstImage != ''){ img.src = base + '/' + firstImage.split(':')[0]; }else{ img.src = './SHOP/data/wizard-no-image.png'; } } var displayAttr = {}; var attributes = cart[i].attributes != '' ? JSON.parse(cart[i].attributes) : []; for(var a = 0; a < attributes.length; a++) if(cart[i].required_attribute_id.indexOf(+attributes[a].ID) >= 0) displayAttr[attributes[a].Attribute] = attributes[a].Values[Object.keys(attributes[a].Values)[0]].Value; var $item = _STDO.create('div', {class: 'cart-item shop-products-item' + (cart[i].prod_type === 'ADDON' ? ' addon' : ''), data: cart[i]}) ._el_appnd(img) var $name = cart[i].prod_type === 'CAT' && _self.settings.view ? _STDO.create('a', {href: '/product/'+encodeURIComponent(cart[i].prod_url), html: cart[i].prod_name}) : _STDO.create('span', {html: cart[i].prod_name}) var $info = _STDO.create('div', {class: 'cart-item-info shop-products-item-info'}) ._el_appnd(_STDO.create('span', {class: 'title' }) ._el_appnd($name)) $info._el_appnd(_STDO.create('span', {class: 'description', html: (cart[i].prod_short_description != "" ? cart[i].prod_short_description : cart[i].prod_description)})) if(cart[i].variant){ $info._el_appnd(_STDO.create('span', {class: 'cart-attribute shop-products-item-info-attribute', html: cart[i].variant.name})) } if(cart[i].prod_type === 'CAT'){ $info._el_appnd(_STDO.create('span', {class: 'cart-attribute shop-products-item-info-attribute', html: label + ': ' + cart[i].amount})) } for(var r in displayAttr){ $info._el_appnd(_STDO.create('span', {class: 'cart-attribute shop-products-item-info-attribute', html: r + ': ' + displayAttr[r]})) } var price = +cart[i].price_incl_btw * +cart[i].amount; var discount = cart[i].price_incl_btw_org != cart[i].price_incl_btw_org var original = discount ? +cart[i].price_incl_btw_org * +cart[i].amount : false; $item._el_appnd($info); $item._el_appnd(_STDO.create('div', {class: 'cart-item-price'}) ._el_appnd( _STDO.create('span', {class: 'price', html: '' + (cart[i].in_stock || cart[i].is_extend ? ('€ ' + f_moneyformat(price) + (discount ? '
€ '+f_moneyformat(original) : '')) : ('' + (_self.settings.rentshop ? _STDO.lng.get('product-rented-out', true) : _STDO.lng.get('product-sold-out', true)) + '')) + ''}) )) ._el_appnd(_STDO.create('div', {class: 'cart-item-footer'}) ._el_appnd(_STDO.create('a', {href: '#', html: _STDO.lng.get('verwijder', true)}))) $cart._el_appnd($item); } if(cart.length < 1){ $cart._el_appnd(_STDO.create('small', {'html': '' + _STDO.lng.get('empty-cart-placeholder', true) + ''})) } var products = _STDO.get('.products', _self.cart)[0]; var badge = _STDO.get('.icon>span, .dropdown-toggle>span', _self.cart)[0]; if(badge){ if(count > 0){ products.style.display = 'block'; _self.cart._clss_remove('empty'); badge._html_set(count); badge._el_fade('in'); }else{ products.style.display = 'none'; _self.cart._clss_add('empty'); badge._html_set(''); badge._el_fade('out'); } } var wrapper = _STDO.get('.products-itms', products)[0]; wrapper._html_set(''); wrapper._el_appnd($cart); } }); $.fn[pluginName] = function ( options ) { var args = arguments; return this.each(function () { if (!$.data(this, 'plugin_' + pluginName)) $.data(this, 'plugin_' + pluginName, new Plugin( this, options )); }); }; $('#cart, #menucart, #inlinecart').Cart(); })(jQuery, window, document); ; (function ($, window, document, undefined) { "use strict"; var pluginName = "Compare", defaults = { count: 0, prevAmount: 0, ajx_url: { compare: '/api/SHOP/AJAX/cart?target=compare' } } function Plugin(element, options) { this.element = element; this.$element = $(element); this.settings = $.extend({}, defaults, options); this._name = pluginName; this.init(); return this; } $.extend(Plugin.prototype, { init: function(){ var _self = this; _self.compare = _self.element _self.$compare = _self.$element if(_self.compare){ _self.getCompareItems(); } _self.bindEvents(); }, bindEvents: function(){ var _self = this; _self.$compare .on("click", ".cart-item-footer > a", function(evt){ evt.preventDefault(); var data = this.closest('.cart-item')._data_get(); _self.removeItem(data.item_number); }) }, removeItem: function(id){ var _self = this; var aParam = { 'action': 'removeItem', 'param': { id: id, all: false } } _STDO.ajx(_self.settings.ajx_url.compare, aParam, function(data){ var $btn = _STDO.get('.fltr-product-compare>a[data-item="'+id+'"]') if($btn){ $btn[0]._attr_remove('data-item') $btn[0]._html_set(' '+_STDO.lng.get('compare-product', true)) } $('#compare, #menucompare').each(function(){$(this).data('plugin_Compare').setCompare(data.items)}) }, true); }, getCompareItems: function(){ var _self = this; $.post({ url: _self.settings.ajx_url.compare, data: {'action': 'getCompare'}, dataType: 'json', noLoading: true, success: function(data){ $('#compare, #menucompare').each(function(){$(this).data('plugin_Compare').setCompare(data.items)}) } }) }, setCompare: function(compare){ var _self = this; var count = 0; var compareproducts = [] var $compare = _STDO.create('div'); for(var i = 0; i < compare.length; i++){ compareproducts.push(compare[i].prod_number) var $prd = _STDO.get('#'+compare[i].prod_number); if($prd){ var $btn = _STDO.get('.fltr-product-compare>a', $prd) if($btn){ $btn[0]._attr_set('data-item', compare[i].item_number) $btn[0]._html_set(' '+_STDO.lng.get('remove-compare-product', true)) } } count++; var img = _STDO.create('img'); if(compare[i].photos != ''){ var firstImage = compare[i].photos.split('|').sort(function(a, b){ return a.charCodeAt(a.length - 1) - b.charCodeAt(b.length - 1) })[0]; var base = 'SHOP/DATA_APP/IMAGES/' + compare[i].prod_number img.src = base + '/' + firstImage.split(':')[0]; } var displayAttr = {}; var attributes = compare[i].attributes != '' ? JSON.parse(compare[i].attributes) : []; for(var a = 0; a < attributes.length; a++) if(compare[i].required_attribute_id.indexOf(+attributes[a].ID) >= 0) displayAttr[attributes[a].Attribute] = attributes[a].Values[Object.keys(attributes[a].Values)[0]].Value; var $item = _STDO.create('div', {class: 'cart-item', data: compare[i]}) ._el_appnd(img) var $info = _STDO.create('div', {class: 'cart-item-info'}) ._el_appnd(_STDO.create('span', {class: 'title' }) ._el_appnd(_STDO.create('a', {href: '/product/' + encodeURIComponent(cart[i].prod_name), html: compare[i].prod_name}))) $info._el_appnd(_STDO.create('span', {class: 'description', html: (compare[i].prod_short_description != "" ? compare[i].prod_short_description : compare[i].prod_description)})) var price = +compare[i].price_incl_btw; var discount = compare[i].price_incl_btw_org != compare[i].price_incl_btw_org var original = discount ? +compare[i].price_incl_btw_org : false; $item._el_appnd($info); $item._el_appnd(_STDO.create('div', {class: 'cart-item-price'}) ._el_appnd( _STDO.create('span', {class: 'price', html: '€ ' + f_moneyformat(price) + (discount ? '
€ '+f_moneyformat(original)+'' : '')}) )) ._el_appnd(_STDO.create('div', {class: 'cart-item-footer'}) ._el_appnd(_STDO.create('a', {href: '#', html: _STDO.lng.get('verwijder', true)}))) $compare._el_appnd($item); } var products = _STDO.get('.products', _self.compare)[0]; var badge = _STDO.get('.icon>span, .dropdown-toggle>span', _self.compare)[0]; var submit = _STDO.get('.products .products-ftr .sitebtn', _self.compare)[0]; if(count > 0){ products.style.display = 'block'; _self.compare._clss_remove('empty'); badge._html_set(count); badge._el_fade('in'); submit.href = submit.href.split('?')[0] + '?compare=' + compareproducts.join('-') }else{ products.style.display = 'none'; _self.compare._clss_add('empty'); badge._html_set(''); badge._el_fade('out'); submit.href = submit.href.split('?')[0] } var wrapper = _STDO.get('.products-itms', products)[0]; wrapper._html_set(''); wrapper._el_appnd($compare); } }); $.fn[pluginName] = function ( options ) { var args = arguments; return this.each(function () { if (!$.data(this, 'plugin_' + pluginName)) $.data(this, 'plugin_' + pluginName, new Plugin( this, options )); }); }; $('#menucompare').Compare(); })(jQuery, window, document); ; (function ($, window, document, undefined) { "use strict"; var pluginName = "Customer", defaults = { ajx_url: { customer: '/api/SHOP/AJAX/customer' }, curData: false, tabData: {}, maxRentPeriod: false } function Plugin(element, options) { this.element = element; this.$element = $(element); this.element = element; this.settings = $.extend({}, defaults, options); this._name = pluginName; this.init(); return this; } $.extend(Plugin.prototype, { init: function(){ var _self = this; var sttngs = f_sttngs(); if(sttngs['shop-max-extend'] != '' && sttngs['shop-max-extend'] != 'false'){ _self.settings.maxRentPeriod = sttngs['shop-max-extend'] } _self.bindEvents(); var url = window.location.toString(); if (url.match('#') && url.split('#')[1] != '') { $('a[href="#cust_' + url.split('#')[1] + '"]').tab('show'); }else{ $('a[data-toggle="pill"]').eq(0).tab('show'); } }, bindEvents: function(){ var _self = this; _self.$element .on('show.bs.tab', 'a[data-toggle="pill"]', function (evt) { _STDO.get('.title', _STDO.get('#customer-body'))[0].innerHTML = evt.target.innerText _self.getContent(evt.target.hash.replace('#cust_', '')); }) .on('shown.bs.tab', 'a[data-toggle="pill"]', function (evt) { history.replaceState({}, '', window.location.origin + window.location.pathname + evt.target.hash.replace('cust_', '')) }) .on("submit", "#customer-login>form.login", function(evt){ var values = $(this).serializeArray(); evt.preventDefault(); var param = []; var btn = _STDO.get('input[type=submit]', this)[0]; for(var i = 0; i < values.length; i++){ param[values[i].name] = values[i].value; } _STDO.btn.loading(btn); shopAuthorize(param.email, param.password, function(message){ if(typeof message === "object"){ //oke _STDO.get('#login-message')._html_set(''); if(param.from){ window.location = param.from }else{ window.location.reload(); } }else{ _STDO.get('#login-message')._html_set(message); _STDO.btn.loading(btn, true); } }) }) .on("submit", "#customer-login>form.forgot", function(evt){ var values = $(this).serializeArray(); evt.preventDefault(); var param = []; var btn = _STDO.get('input[type=submit]', this)[0]; for(var i = 0; i < values.length; i++){ param[values[i].name] = values[i].value; } _STDO.btn.loading(btn); shopForgot(param.email, function(message){ if(message == false){ //oke _STDO.get('#login-message')._html_set(_STDO.lng.get('customerForgotMailSend', true)); _STDO.btn.loading(btn, true); _STDO.get('input[name=email]', this)[0]._clss_add('disabled'); btn._clss_add('disabled'); }else{ _STDO.get('#login-message')._html_set(message); _STDO.btn.loading(btn, true); } }) }) .on('submit', "#customer-login>form.reset", function(evt){ evt.preventDefault(); _self.resetPassword(this); }) .on('change', '#cust_profile input[type=text]', function(evt){ var btn = _STDO.get('.form-control[type=submit].disabled', this.closest('.form'))[0] if(btn) btn._clss_remove('disabled'); }) .on('submit', '#cust_profile>div>form', function(evt){ evt.preventDefault(); _self.changeProfile(this); }) .on('submit', '#passcollapse>form', function(evt){ evt.preventDefault(); _self.changePassword(this); }) .on('submit', '#removecollapse>form', function(evt){ evt.preventDefault(); _self.removeCustomer(this); }) .on('click', "#cust_orders .form-control:not(.disabled)", function(evt){ evt.preventDefault(); if(_self.settings.curData){ var wrapper = _STDO.get('#cust_orders'); var action = this._attr_get('action'); wrapper._html_set(''); wrapper._el_appnd(_self.setContent.orders(_self.settings.curData, action)); } }) .on('hidden.bs.collapse', '#passcollapse, #removecollapse', function () { $(this).find('input:not([type=submit])').val('') $(this).find('span.err').remove() }) .on("input", ".customer-extendproducts .shop-product-amount .form-control", function(evt){ evt.preventDefault(); var $min = _STDO.get('[action="min"]', this.parentNode)[0] var $plus = _STDO.get('[action="plus"]', this.parentNode)[0] $min._clss_remove('disabled') $plus._clss_remove('disabled') if(_self.settings.maxRentPeriod){ if(this.value >= _self.settings.maxRentPeriod){ this.value = _self.settings.maxRentPeriod $plus._clss_add('disabled') } } if(this.value <= 1 && this.value != ''){ this.value = 1 $min._clss_add('disabled') } }) .on("click", ".customer-extendproducts .shop-product-amount .input-group-addon", function(evt){ evt.preventDefault(); var action = this._attr_get('action'); var input = _STDO.get('.form-control', this.parentNode)[0]; var value = (action == 'plus' ? +input.value +1 : +input.value -1) input.value = (value < 1 ? 1 : value) $(input).trigger('input') }) .on("click", ".customer-extendproducts .col-xs-3>.sitebtn", function(evt){ evt.preventDefault(); var btn = this btn._clss_add('disabled') var parent = btn.closest('.customer-extendproduct') var input = _STDO.get('.shop-product-amount input', parent)[0] var data = parent.data var required = [] var attrs = JSON.parse(data.product.ordl_attributes) _STDO.loop(attrs, function(i, attr){ required.push(attr.ID) }) addProduct({ prod_number: data.product.prod_number, attributes: JSON.stringify(attrs), required: required.join(','), amount: input.value, variant: data.product.vat_number }, function(added){ input.value = '1' btn._clss_remove('disabled') // f_productAddedAnimation(btn) }, 'cart', true) }) }, getContent: function(type){ var _self = this; if(_self.settings.tabData.hasOwnProperty(type)){ var $content = _STDO.get('#cust_' + type); _self.settings.curData = _self.settings.tabData[type]; $content._html_set(''); $content._el_appnd(_self.setContent[type](_self.settings.curData)); $(".customer-extendproducts .shop-product-amount .form-control").trigger('input') }else{ _self.element._clss_add('loading'); var aParam = { 'action': 'getContent', 'param': { 'type': type, 'param': { 'full': true } } } _STDO.ajx(_self.settings.ajx_url.customer, aParam, function(data){ var $content = _STDO.get('#cust_' + type); _self.settings.curData = data; _self.settings.tabData[type] = data $content._html_set(''); $content._el_appnd(_self.setContent[type](data)); $(".customer-extendproducts .shop-product-amount .form-control").trigger('input') _self.element._clss_remove('loading'); }, true); } }, changeProfile: function(e){ var _self = this; var values = false; var valid = true; var $e = $(e); $e.find('input[id^=cust_]').each(function(){ if(!validateField($(this)) && valid){ valid = false; } }) if(!valid){ return false; }else{ values = $e.serializeArray() var aParam = { 'action': 'editCustomer', 'param': { 'values': values } } _STDO.ajx(_self.settings.ajx_url.customer, aParam, function(data){ if(data){ delete _self.settings.tabData.profile; _self.getContent('profile'); } }, true); } }, resetPassword: function(e){ var _self = this; var $e = $(e); var key = $e.find('[name=key]') var new_p = $e.find('[name=password]') var confirm_p = $e.find('[name=confirm]') var aParam = { 'action': 'resetPassword', 'param': { 'key': key.val(), 'password': new_p.val(), 'confirm': confirm_p.val(), } } _STDO.ajx(_self.settings.ajx_url.customer, aParam, function(data){ if(!data.message){ window.location = '/customer'; }else{ _STDO.get('#login-message')._html_set(data.message) } }, true); }, changePassword: function(e){ var _self = this; var $e = $(e); var old_p = $e.find('[name=old]') var new_p = $e.find('[name=new]') var confirm_p = $e.find('[name=confirm]') var aParam = { 'action': 'changePassword', 'param': { 'old': old_p.val(), 'new': new_p.val(), 'confirm': confirm_p.val(), } } _STDO.ajx(_self.settings.ajx_url.customer, aParam, function(data){ if(!data.message){ delete _self.settings.tabData.profile; _self.getContent('profile'); }else{ $e.find('span.err').remove(); $e.prepend(''+data.message+'') } }, true); }, removeCustomer: function(e){ var _self = this; var $e = $(e); var remove = $e.find('[name=remove]') var aParam = { 'action': 'removeCustomer', 'param': { 'remove': remove.val() } } _STDO.ajx(_self.settings.ajx_url.customer, aParam, function(data){ if(!data.message){ window.location.reload(); }else{ $e.find('span.err').remove(); $e.prepend(''+data.message+'') } }, true); }, setContent: { profile: function(data){ var $container = _STDO.create() var $form = _STDO.create('form') $container._el_appnd($form) _STDO.loop(data.customer, function(k, v){ if(v && k != 'cust_number' && k != 'cust_email'){ $form ._el_appnd(_STDO.create('div', {'class': 'form-group'}) ._el_appnd(_STDO.create('label', {'for': k, 'html': _STDO.lng.get('profile-info-' + k, true) })) ._el_appnd(_STDO.create('input', {'type': 'text', 'data-field': k.replace('cust_', ''), 'name': k, 'class': 'form-control', 'id': k, 'value': v }))) } }) $form._el_appnd(_STDO.create('div', {'class': 'form-group buttons'})._el_appnd(_STDO.create('button', { 'type': 'submit', 'class': 'form-control disabled', 'html': _STDO.lng.get('profile-info-opslaan', true)} ))) if(data.member){ var isActive = moment().isBetween(moment(data.member.memb_from), moment(data.member.memb_till)) $container._el_appnd(_STDO.create('p', {'class': 'text-muted text-center text-italic', html: '' + (isActive ? _STDO.lng.get('profile-info-membership-active', true) : _STDO.lng.get('profile-info-membership-inactive', true)) + ' ' + moment(data.member.memb_till).format("DD-MM-YYYY HH:mm") + ''})) } var $password = _STDO.create('div', {'class': 'form-group'}) $password ._el_appnd(_STDO.create('input', {'type': 'button', 'class': 'form-control actions', 'id': 'password', 'value': _STDO.lng.get('profile-info-changepassword', true), 'data-toggle': "collapse", 'data-target': "#passcollapse", 'aria-expanded': "false", 'aria-controls': "passcollapse"})) ._el_appnd(_STDO.create('div', {'class': 'collapse', id: 'passcollapse'}) ._el_appnd(_STDO.create('form', { }) ._el_appnd(_STDO.create('input', {'type': 'password', 'data-field': 'password', 'name': 'old', 'class': 'form-control', placeholder: _STDO.lng.get('profile-info-oldpass', true) })) ._el_appnd(_STDO.create('input', {'type': 'password', 'data-field': 'password','name': 'new', 'class': 'form-control', placeholder: _STDO.lng.get('profile-info-newpass', true) })) ._el_appnd(_STDO.create('input', {'type': 'password', 'data-field': 'password','name': 'confirm', 'class': 'form-control', placeholder: _STDO.lng.get('profile-info-confirmpass', true) })) ._el_appnd(_STDO.create('input', {'type': 'submit', 'class': 'form-control', value: _STDO.lng.get('profile-info-submitpass', true) })))) $container._el_appnd($password); var $remove = _STDO.create('div', {'class': 'form-group'}) $remove ._el_appnd(_STDO.create('input', {'type': 'button', 'class': 'form-control actions', 'id': 'removeaccount', 'value': _STDO.lng.get('profile-info-removeaccount', true), 'data-toggle': "collapse", 'data-target': "#removecollapse", 'aria-expanded': "false", 'aria-controls': "removecollapse"})) ._el_appnd(_STDO.create('div', {'class': 'collapse', id: 'removecollapse'}) ._el_appnd(_STDO.create('form', { }) ._el_appnd(_STDO.create('input', {'type': 'text', 'name': 'remove', 'data-field': 'text','class': 'form-control', placeholder: data.message, 'title': data.message })) ._el_appnd(_STDO.create('input', {'type': 'submit', 'class': 'form-control', value: _STDO.lng.get('profile-info-submitpass', true) })))) $container._el_appnd($remove); return $container; }, orders: function(data, page){ page = page || 1; var items_on_page = 8; //console.log(data); var $container = _STDO.create('div', {'class': 'customer-orders'}); var $orders = _STDO.create() $container._el_appnd($orders); var $orderHeader = _STDO.create('div', {'class': 'customer-order header'}) ._el_appnd(_STDO.create('span', {'html': _STDO.lng.get('customer-order-ord', true) })) ._el_appnd(_STDO.create('span', {'html': _STDO.lng.get('customer-order-date', true) })) ._el_appnd(_STDO.create('span', {'html': _STDO.lng.get('customer-order-state', true) })) ._el_appnd(_STDO.create('span', {'html': _STDO.lng.get('customer-order-price', true) })) $orders._el_appnd($orderHeader); var maxPage = Math.ceil(data.orders.length / items_on_page); var start = (page - 1) * items_on_page; var label = f_sttngsLng('amount-label'); if(label == ''){ label = _STDO.lng.get('default-amount-label'); } for(var i = start; (i < (start + items_on_page) && i < data.orders.length); i++){ var order = data.orders[i]; var $order = _STDO.create('div', {'class': 'customer-order'}) ._el_appnd(_STDO.create('span', {'data-toggle': 'collapse', 'data-target': '#collapse_' + order.ord_number, 'html': order.ord_number})) ._el_appnd(_STDO.create('span', {'html': moment(order.ord_date).format("DD-MM-YYYY")}))//.toLocaleDateString("nl-NL") ._el_appnd(_STDO.create('span', {'html': (order.ordp_status != '' ? _STDO.lng.get('status-' + order.ordp_status, true) : '')})) ._el_appnd(_STDO.create('span', {'html': '€ ' + f_moneyformat(order.total_price)})) var $collapse = _STDO.create('div', {'id': 'collapse_' + order.ord_number, 'class': 'collapse'}) var $collapseInner = _STDO.create('div') var $table = _STDO.create('table'); var $header = _STDO.create('tr') ._el_appnd(_STDO.create('th', {'html': label})) ._el_appnd(_STDO.create('th', {'html': _STDO.lng.get('mail-thead-product', true)})) ._el_appnd(_STDO.create('th', {'html': _STDO.lng.get('mail-thead-subtotal', true)})) ._el_appnd(_STDO.create('th', {'html': _STDO.lng.get('mail-thead-total', true)})) $table._el_appnd($header) _STDO.loop(order.products, function(i, prod){ var $product = _STDO.create('tr') ._el_appnd(_STDO.create('td', {'html': prod.prod_amount})) ._el_appnd(_STDO.create('td', {'html': (prod.prod_type == 'CAT' ? (prod.ordl_data && prod.ordl_data.extend ? '' + _STDO.lng.get('prd-is-extend', true) + '' : '') + '' + prod.prod_name + '' + (prod.variant ? ' - ' + prod.variant.name + '' : '') : prod.prod_name)})) ._el_appnd(_STDO.create('td', {'html': '€ ' + f_moneyformat(prod.price_incl_btw)})) ._el_appnd(_STDO.create('td', {'html': '€ ' + f_moneyformat((prod.prod_amount * prod.price_incl_btw))})) $table._el_appnd($product) }) _STDO.loop(order.discounts, function(i, discount){ var $discount = _STDO.create('tr', {'class': 'discount'}) ._el_appnd(_STDO.create('td')) ._el_appnd(_STDO.create('td', {'colspan': '2', 'html': '' + _STDO.lng.get('discount-title', true) + ' ' + discount.code + ' (' + (discount.value_type == 'PRC' ? parseFloat(discount.value).toFixed(0) + '%' : '€ ' + f_moneyformat(discount.value)) + ')'})) ._el_appnd(_STDO.create('td', {'html': '€ ' + f_moneyformat(discount.value_eur) + ''})) $table._el_appnd($discount) }) var $subtotal = _STDO.create('tr', {'class': 'subtotal'}) ._el_appnd(_STDO.create('td', {'colspan': '3', 'html': _STDO.lng.get('subtotal', true)})) ._el_appnd(_STDO.create('td', {'html': '€ ' + f_moneyformat(order.subtotal)})) var $shippings = _STDO.create('tr', {'class': 'shippings'}) ._el_appnd(_STDO.create('td', {'colspan': '3', 'html': _STDO.lng.get('shippingcosts', true)})) ._el_appnd(_STDO.create('td', {'html': '€ ' + f_moneyformat(order.shippingcosts)})) var $total = _STDO.create('tr', {'class': 'total'}) ._el_appnd(_STDO.create('td', {'colspan': '3', 'html': _STDO.lng.get('total', true)})) ._el_appnd(_STDO.create('td', {'html': '€ ' + f_moneyformat(order.total_price)})) $table._el_appnd($subtotal) $table._el_appnd($shippings) $table._el_appnd($total) $collapseInner._el_appnd($table); $collapse._el_appnd($collapseInner); $order._el_appnd($collapse); $orders._el_appnd($order); } var $buttons = _STDO.create('div', {'class': 'customer-buttons'}); $buttons._el_appnd(_STDO.create('button', {'class': 'form-control' + (page > 1 ? '' : ' disabled'), 'html': '<', 'action': (+page -1)})); $buttons._el_appnd(_STDO.create('small', { 'html': page + ' / ' + maxPage})); $buttons._el_appnd(_STDO.create('button', {'class': 'form-control' + (page < maxPage ? '' : ' disabled'), 'html': '>', 'action': (+page +1)})); $container._el_appnd($buttons); return $container; }, privatepages: function(data){ var $container = _STDO.create('div', {'class': 'customer-privatepages'}); if(data.pages.length === 0){ $container._el_appnd(_STDO.create('span', {'class': 'no-pages', html: _STDO.lng.get('no-private-pages', true)})); } _STDO.loop(data.pages, function(i, page){ var meta = (page.meta_json ? page.meta_json.PROPERTY : false) var $page = _STDO.create('a', {'class': 'customer-privatepage', 'href': '/' + page.pag_code, 'target': '_self' }) ._el_appnd(_STDO.create('div', {'class': 'row'}) ._el_appnd(_STDO.create('div', {'class': 'col-xs-2'}) ._el_appnd(_STDO.create('img', { 'src': (meta && meta.METADATA3 != '' ? meta.METADATA3 : './SHOP/data/wizard-no-image.png') }))) ._el_appnd(_STDO.create('div', {'class': 'col-xs-10'}) ._el_appnd(_STDO.create('h5', {html: (meta && meta.METADATA1 != '' ? meta.METADATA1 : page.pag_code) + ' (' + (window.location.protocol + '//' + window.location.hostname + '/' + page.pag_code + ')')})) ._el_appnd(_STDO.create('p', {html: (meta && meta.METADATA2 != '' ? meta.METADATA2 : '')})))); $container._el_appnd($page); }) return $container; }, extendproducts: function(data){ var $container = _STDO.create('div', {'class': 'customer-extendproducts'}); var language = document.documentElement._attr_get('lang'); var label = f_sttngsLng('amount-label'); if(label == ''){ label = _STDO.lng.get('default-amount-label', true); } if(data.length === 0){ $container._el_appnd(_STDO.create('span', {'class': 'no-extend-products', html: _STDO.lng.get('no-extend-products', true)})); } _STDO.loop(data, function(i, element){ var prd = element.full_product var $img = _STDO.create('img', {'src': './SHOP/data/wizard-no-image.png'}); if(prd.photos_sorted.length > 0){ var firstImage = prd.photos_sorted[0] var base = 'SHOP/DATA_APP/IMAGES/' + prd.prod_number if(firstImage != ''){ $img.src = base + '/' + firstImage.split(':')[0]; }else{ $img.src = './SHOP/data/wizard-no-image.png'; } } var $attrs = _STDO.create('p') var attributes = element.product.ordl_attributes != '' ? JSON.parse(element.product.ordl_attributes) : []; for(var a = 0; a < attributes.length; a++){ if(attributes[a].MakeChoice == 'YES'){ $attrs._el_appnd(_STDO.create('small', {'html': attributes[a].Attribute + ': ' + attributes[a].Values[0].Value})) } } var input = _STDO.create('input', {'class': 'form-control', 'type': 'text', 'oninput': 'this.value = this.value.replace(/[^0-9.]/g, \'\'); this.value = this.value.replace(/(\..*)\./g, \'$1\');', 'value': '1'}) var $amount = _STDO.create('div', {'class': 'shop-product-amount'}) ._el_appnd(_STDO.create('span', {'class': 'amount-label', 'html': label})) ._el_appnd(_STDO.create('div', {'class': 'input-group'}) ._el_appnd(_STDO.create('span', {'class': 'input-group-addon sitebtn', 'action': 'min', 'html': ''})) ._el_appnd(input) ._el_appnd(_STDO.create('span', {'class': 'input-group-addon sitebtn', 'action': 'plus', 'html': ''}))) var $prd = _STDO.create('div', {'class': 'customer-extendproduct', data: element }) ._el_appnd(_STDO.create('div', {'class': 'row'}) ._el_appnd(_STDO.create('div', {'class': 'col-xs-2'}) ._el_appnd($img)) ._el_appnd(_STDO.create('div', {'class': 'col-xs-7'}) ._el_appnd(_STDO.create('h5', {html: '' + prd.prod_name + (element.product.variant ? ' - ' + element.product.variant.name + '' : '') + ''})) ._el_appnd(_STDO.create('p', {html: prd.prod_short_description})) ._el_appnd($attrs)) ._el_appnd(_STDO.create('div', {'class': 'col-xs-3'}) ._el_appnd($amount) ._el_appnd(_STDO.create('button', {'class': 'sitebtn', 'html': '' + _STDO.lng.get('extend-product', true) + '', 'id': 'add-' + prd.prod_number})))) $container._el_appnd($prd); }) return $container; } } }); $.fn[pluginName] = function ( options ) { var args = arguments; return this.each(function () { if (!$.data(this, 'plugin_' + pluginName)) $.data(this, 'plugin_' + pluginName, new Plugin( this, options )); }); }; $('#customer').Customer(); })(jQuery, window, document); /* _ _ _ _ ___| |_ ___(_) _| | ___ _ __ | | __/ __| _| __| |/ _ |/ _ \_| /_ `| |___ [__\__ \ |_| _|| | (_| | (_) )| | | | |_ _] (___/\__|___|_|\__/_|\___(_)_| |_|___) ___ _ __ __ ___ / _| / \/ `/ __| ( (_| | | | | \__ \ \___/_| |_| |_|___/ _ _ _ _ ___| |_ ___(_) _| | ___ _ __ | | / __| _| __| |/ _ |/ _ \ | /_ `| | \__ \ |_| _|| | (_| | (_) || | | | |_ |___/\__|___|_|\__/_|\___(_)_| |_|___| */ ; (function ($, window, document, undefined) { "use strict"; var pluginName = "View", defaults = { scaleZoom: 1.8, cmsOffset: (cms ? 50 : 0), photos: [], active: 0, // addonTotalPrice: 0 } function Plugin(element, options) { this.element = element; this.$element = $(element); this.preview = _STDO.get('#product-view-preview'); this.settings = $.extend({}, defaults, options); this._name = pluginName; this.init(); return this; } $.extend(Plugin.prototype, { init: function(){ var _self = this; _self.bindEvents(); var $photos = _STDO.get('.img-thumbs .product-fotoFadeIn', this.element); if($photos.length > 0){ _self.settings.photos = Array.prototype.slice.call($photos) } // f_shopFotoFadeIn('[id="product-view-preview"]', false); // f_shopFotoFadeIn('.product-fotoFadeIn', false, _self.element); f_shopInitImages('[id="product-view-preview"]', false); f_shopInitImages('.product-fotoFadeIn', false, _self.element); }, bindEvents: function(){ var _self = this; _self.$element .on('click', '.product-view-photos .img-thumbs .product-fotoFadeIn', function(evt){ evt.preventDefault(); if(evt.target.tagName === 'IMG'){ _self.setImage(_self.settings.photos.indexOf(this)); } }) .on('click', '.product-view-photos .img-preview .img-preview-nav>div.left, .product-view-photos .img-preview .img-preview-nav>div.right', function(evt){ evt.preventDefault(); var newIdx; if(this._el_mtch('.left')){ newIdx = (_self.settings.active == 0 ? (_self.settings.photos.length-1) : (_self.settings.active-1)) }else{ newIdx = (_self.settings.active === (_self.settings.photos.length-1) ? 0 : (_self.settings.active+1)) } _self.setImage(newIdx); }) .on('click', '.product-view-photos #product-view-preview', function(evt){ evt.preventDefault(); if(this._clss_has('zoom')){ this._clss_remove('zoom'); _STDO.get('img', this)[0].style.transform = 'scale(1)'; }else{ this._clss_add('zoom'); _STDO.get('img', this)[0].style.transform = 'scale('+_self.settings.scaleZoom+')'; } }) .on('click', '.variant-select>button', function(evt){ evt.preventDefault(); var siblings = _STDO.get('button.active', this.parentNode); _STDO.loop(siblings, function(i, sib){ sib._clss_remove('active') }) this._clss_add('active') }) .on('input', '.amount-select input[id^=amount-]', function(evt){ this.value = _self.validateAmountInput(this.value) }) .on('click', '.amount-select .input-group-btn>.sitebtn', function(evt){ evt.preventDefault(); var input = _STDO.get('input[id^=amount-]', this.closest('.input-group'))[0]; var action = this._attr_get('action') input.value = (action === 'min' ? Number(input.value) - 1 : Number(input.value) + 1) input.value = _self.validateAmountInput(input.value) }) .on('mouseover', '.product-view-photos #product-view-preview.zoom', function(evt){ // evt.preventDefault(); _STDO.get('img', this)[0].style.transform = 'scale('+_self.settings.scaleZoom+')'; }) .on('mouseout', '.product-view-photos #product-view-preview.zoom', function(evt){ // evt.preventDefault(); }) .on('mousemove', '.product-view-photos #product-view-preview', function(evt){ // evt.preventDefault(); var bodyRect = document.body.getBoundingClientRect(); var elemRect = this.getBoundingClientRect(); var offsetTop = elemRect.top - bodyRect.top + _self.settings.cmsOffset; _STDO.get('img', this)[0].style.transformOrigin = ((evt.pageX - elemRect.left) / elemRect.width) * 100 + '% ' + ((evt.pageY - offsetTop) / elemRect.height) * 100 +'%'; }) }, validateAmountInput: function(value){ if(value == '0'){ value = '1' } return value.replace(/[^0-9.]/g, '').replace(/(\..*)\./g, '$1'); }, // setAddonPrice: function(){ // var _self = this; // var $price = _STDO.get('[id=addons-toggle]>.addon-total-price')[0] // if(_self.settings.addonTotalPrice < 0){ // _self.settings.addonTotalPrice = 0 // } // $price._html_set('€ ' + f_moneyformat(_self.settings.addonTotalPrice)) // }, // resetAddons: function(){ // var _self = this; // var addons = _STDO.get('.addon-select .shop-products-item.selected', _self.element) // _self.settings.addonTotalPrice = 0 // _self.setAddonPrice(); // _STDO.loop(addons, function(i, $el){ // var $checkbox = _STDO.get('.shop-checkbox [type="checkbox"]', $el)[0] // $el._clss_remove('selected') // $checkbox._attr_remove('checked') // }) // }, setImage: function(idx){ var _self = this; var $item = _self.settings.photos[idx] var preview = _STDO.get('img', _self.preview)[0]; preview.src = $item._attr_get('data-base') + '/' + $item._attr_get('data-src'); _STDO.loop(_self.settings.photos, function(i, el){ el._clss_remove('active') }) $item._clss_add('active') var $enlargeItems = _STDO.get('.featherlight-photo', _self.element); _STDO.loop($enlargeItems, function(i, el){ el._clss_remove('active') }) if($enlargeItems.length > idx){ $enlargeItems[idx]._clss_add('active') } _self.settings.active = idx } }); $.fn[pluginName] = function ( options ) { var args = arguments; return this.each(function () { if (!$.data(this, 'plugin_' + pluginName)) $.data(this, 'plugin_' + pluginName, new Plugin( this, options )); }); }; $('#product-view').View(); })(jQuery, window, document);