(function (window, document, $, miniShop2Config) { var miniShop2 = miniShop2 || {}; miniShop2Config.callbacksObjectTemplate = function () { return { // return false to prevent send data before: [], response: { success: [], error: [] }, ajax: { done: [], fail: [], always: [] } } }; miniShop2.Callbacks = miniShop2Config.Callbacks = { Cart: { add: miniShop2Config.callbacksObjectTemplate(), remove: miniShop2Config.callbacksObjectTemplate(), change: miniShop2Config.callbacksObjectTemplate(), clean: miniShop2Config.callbacksObjectTemplate() }, Order: { add: miniShop2Config.callbacksObjectTemplate(), getcost: miniShop2Config.callbacksObjectTemplate(), clean: miniShop2Config.callbacksObjectTemplate(), submit: miniShop2Config.callbacksObjectTemplate(), getrequired: miniShop2Config.callbacksObjectTemplate() }, }; miniShop2.Callbacks.add = function (path, name, func) { if (typeof func != 'function') { return false; } path = path.split('.'); var obj = miniShop2.Callbacks; for (var i = 0; i < path.length; i++) { if (obj[path[i]] == undefined) { return false; } obj = obj[path[i]]; } if (typeof obj != 'object') { obj = [obj]; } if (name != undefined) { obj[name] = func; } else { obj.push(func); } return true; }; miniShop2.Callbacks.remove = function (path, name) { path = path.split('.'); var obj = miniShop2.Callbacks; for (var i = 0; i < path.length; i++) { if (obj[path[i]] == undefined) { return false; } obj = obj[path[i]]; } if (obj[name] != undefined) { delete obj[name]; return true; } return false; }; miniShop2.ajaxProgress = false; miniShop2.setup = function () { // selectors & $objects this.actionName = 'ms2_action'; this.action = ':submit[name=' + this.actionName + ']'; this.form = '.ms2_form'; this.$doc = $(document); this.sendData = { $form: null, action: null, formData: null }; this.timeout = 300; }; miniShop2.initialize = function () { miniShop2.setup(); // Indicator of active ajax request //noinspection JSUnresolvedFunction miniShop2.$doc .ajaxStart(function () { miniShop2.ajaxProgress = true; }) .ajaxStop(function () { miniShop2.ajaxProgress = false; }) .on('submit', miniShop2.form, function (e) { e.preventDefault(); var $form = $(this); var action = $form.find(miniShop2.action).val(); if (action) { var formData = $form.serializeArray(); formData.push({ name: miniShop2.actionName, value: action }); miniShop2.sendData = { $form: $form, action: action, formData: formData }; miniShop2.controller(); } }); miniShop2.Cart.initialize(); miniShop2.Message.initialize(); miniShop2.Order.initialize(); miniShop2.Gallery.initialize(); }; miniShop2.controller = function () { var self = this; switch (self.sendData.action) { case 'cart/add': miniShop2.Cart.add(); break; case 'cart/remove': miniShop2.Cart.remove(); break; case 'cart/change': miniShop2.Cart.change(); break; case 'cart/clean': miniShop2.Cart.clean(); break; case 'order/submit': miniShop2.Order.submit(); break; case 'order/clean': miniShop2.Order.clean(); break; default: return; } }; miniShop2.send = function (data, callbacks, userCallbacks) { var runCallback = function (callback, bind) { if (typeof callback == 'function') { return callback.apply(bind, Array.prototype.slice.call(arguments, 2)); } else if (typeof callback == 'object') { for (var i in callback) { if (callback.hasOwnProperty(i)) { var response = callback[i].apply(bind, Array.prototype.slice.call(arguments, 2)); if (response === false) { return false; } } } } return true; }; // set context if ($.isArray(data)) { data.push({ name: 'ctx', value: miniShop2Config.ctx }); } else if ($.isPlainObject(data)) { data.ctx = miniShop2Config.ctx; } else if (typeof data == 'string') { data += '&ctx=' + miniShop2Config.ctx; } // set action url var formActionUrl = (miniShop2.sendData.$form) ? miniShop2.sendData.$form.attr('action') : false; var url = (formActionUrl) ? formActionUrl : (miniShop2Config.actionUrl) ? miniShop2Config.actionUrl : document.location.href; // set request method var formMethod = (miniShop2.sendData.$form) ? miniShop2.sendData.$form.attr('method') : false; var method = (formMethod) ? formMethod : 'post'; // callback before if (runCallback(callbacks.before) === false || runCallback(userCallbacks.before) === false) { return; } // send var xhr = function (callbacks, userCallbacks) { return $[method](url, data, function (response) { if (response.success) { if (response.message) { miniShop2.Message.success(response.message); } runCallback(callbacks.response.success, miniShop2, response); runCallback(userCallbacks.response.success, miniShop2, response); } else { miniShop2.Message.error(response.message); runCallback(callbacks.response.error, miniShop2, response); runCallback(userCallbacks.response.error, miniShop2, response); } }, 'json').done(function () { runCallback(callbacks.ajax.done, miniShop2, xhr); runCallback(userCallbacks.ajax.done, miniShop2, xhr); }).fail(function () { runCallback(callbacks.ajax.fail, miniShop2, xhr); runCallback(userCallbacks.ajax.fail, miniShop2, xhr); }).always(function () { runCallback(callbacks.ajax.always, miniShop2, xhr); runCallback(userCallbacks.ajax.always, miniShop2, xhr); }); }(callbacks, userCallbacks); }; miniShop2.Cart = { callbacks: { add: miniShop2Config.callbacksObjectTemplate(), remove: miniShop2Config.callbacksObjectTemplate(), change: miniShop2Config.callbacksObjectTemplate(), clean: miniShop2Config.callbacksObjectTemplate() }, setup: function () { miniShop2.Cart.cart = '#msCart'; miniShop2.Cart.miniCart = '#msMiniCart'; miniShop2.Cart.miniCartNotEmptyClass = 'full'; miniShop2.Cart.countInput = 'input[name=count]'; miniShop2.Cart.totalWeight = '.ms2_total_weight'; miniShop2.Cart.totalCount = '.ms2_total_count'; miniShop2.Cart.totalCost = '.ms2_total_cost'; }, initialize: function () { miniShop2.Cart.setup(); if (!$(miniShop2.Cart.cart).length) { return; } miniShop2.$doc.on('change', miniShop2.Cart.cart + ' ' + miniShop2.Cart.countInput, function () { if (!!$(this).val()) { $(this).closest(miniShop2.form).submit(); } }); }, add: function () { var callbacks = miniShop2.Cart.callbacks; callbacks.add.response.success = function (response) { this.Cart.status(response.data); }; miniShop2.send(miniShop2.sendData.formData, miniShop2.Cart.callbacks.add, miniShop2.Callbacks.Cart.add); }, remove: function () { var callbacks = miniShop2.Cart.callbacks; callbacks.remove.response.success = function (response) { this.Cart.remove_position(miniShop2.Utils.getValueFromSerializedArray('key')); this.Cart.status(response.data); }; miniShop2.send(miniShop2.sendData.formData, miniShop2.Cart.callbacks.remove, miniShop2.Callbacks.Cart.remove); }, change: function () { var callbacks = miniShop2.Cart.callbacks; callbacks.change.response.success = function (response) { if (typeof(response.data.key) == 'undefined') { this.Cart.remove_position(miniShop2.Utils.getValueFromSerializedArray('key')); } else { $('#' + miniShop2.Utils.getValueFromSerializedArray('key')).find(''); } this.Cart.status(response.data); }; miniShop2.send(miniShop2.sendData.formData, miniShop2.Cart.callbacks.change, miniShop2.Callbacks.Cart.change); }, status: function (status) { if (status['total_count'] < 1) { location.reload(); } else { //var $cart = $(miniShop2.Cart.cart); var $miniCart = $(miniShop2.Cart.miniCart); if (status['total_count'] > 0 && !$miniCart.hasClass(miniShop2.Cart.miniCartNotEmptyClass)) { $miniCart.addClass(miniShop2.Cart.miniCartNotEmptyClass); } $(miniShop2.Cart.totalWeight).text(miniShop2.Utils.formatWeight(status['total_weight'])); $(miniShop2.Cart.totalCount).text(status['total_count']); $(miniShop2.Cart.totalCost).text(miniShop2.Utils.formatPrice(status['total_cost'])); if ($(miniShop2.Order.orderCost, miniShop2.Order.order).length) { miniShop2.Order.getcost(); } } }, clean: function () { var callbacks = miniShop2.Cart.callbacks; callbacks.clean.response.success = function (response) { this.Cart.status(response.data); }; miniShop2.send(miniShop2.sendData.formData, miniShop2.Cart.callbacks.clean, miniShop2.Callbacks.Cart.clean); }, remove_position: function (key) { $('#' + key).remove(); } }; miniShop2.Gallery = { setup: function () { miniShop2.Gallery.gallery = $('#msGallery'); miniShop2.Gallery.files = miniShop2.Gallery.gallery.find('.fotorama'); }, initialize: function () { miniShop2.Gallery.setup(); if (miniShop2.Gallery.files.length) { $('', { rel: 'stylesheet', type: 'text/css', href: miniShop2Config.cssUrl + 'lib/fotorama.min.css', }).appendTo('head'); $('