1(function (window, document, $, miniShop2Config) { 2 var miniShop2 = miniShop2 || {}; 3 miniShop2Config.callbacksObjectTemplate = function () { 4 return { 5 // return false to prevent send data 6 before: [], 7 response: { 8 success: [], 9 error: [] 10 }, 11 ajax: { 12 done: [], 13 fail: [], 14 always: [] 15 } 16 } 17 }; 18 miniShop2.Callbacks = miniShop2Config.Callbacks = { 19 Cart: { 20 add: miniShop2Config.callbacksObjectTemplate(), 21 remove: miniShop2Config.callbacksObjectTemplate(), 22 change: miniShop2Config.callbacksObjectTemplate(), 23 clean: miniShop2Config.callbacksObjectTemplate() 24 }, 25 Order: { 26 add: miniShop2Config.callbacksObjectTemplate(), 27 getcost: miniShop2Config.callbacksObjectTemplate(), 28 clean: miniShop2Config.callbacksObjectTemplate(), 29 submit: miniShop2Config.callbacksObjectTemplate(), 30 getrequired: miniShop2Config.callbacksObjectTemplate() 31 }, 32 }; 33 miniShop2.Callbacks.add = function (path, name, func) { 34 if (typeof func != 'function') { 35 return false; 36 } 37 path = path.split('.'); 38 var obj = miniShop2.Callbacks; 39 for (var i = 0; i < path.length; i++) { 40 if (obj[path[i]] == undefined) { 41 return false; 42 } 43 obj = obj[path[i]]; 44 } 45 if (typeof obj != 'object') { 46 obj = [obj]; 47 } 48 if (name != undefined) { 49 obj[name] = func; 50 } else { 51 obj.push(func); 52 } 53 return true; 54 }; 55 miniShop2.Callbacks.remove = function (path, name) { 56 path = path.split('.'); 57 var obj = miniShop2.Callbacks; 58 for (var i = 0; i < path.length; i++) { 59 if (obj[path[i]] == undefined) { 60 return false; 61 } 62 obj = obj[path[i]]; 63 } 64 if (obj[name] != undefined) { 65 delete obj[name]; 66 return true; 67 } 68 return false; 69 }; 70 miniShop2.ajaxProgress = false; 71 miniShop2.setup = function () { 72 // selectors & $objects 73 this.actionName = 'ms2_action'; 74 this.action = ':submit[name=' + this.actionName + ']'; 75 this.form = '.ms2_form'; 76 this.$doc = $(document); 77 78 this.sendData = { 79 $form: null, 80 action: null, 81 formData: null 82 }; 83 84 this.timeout = 300; 85 }; 86 miniShop2.initialize = function () { 87 miniShop2.setup(); 88 // Indicator of active ajax request 89 90 //noinspection JSUnresolvedFunction 91 miniShop2.$doc 92 .ajaxStart(function () { 93 miniShop2.ajaxProgress = true; 94 }) 95 .ajaxStop(function () { 96 miniShop2.ajaxProgress = false; 97 }) 98 .on('submit', miniShop2.form, function (e) { 99 e.preventDefault(); 100 var $form = $(this); 101 var action = $form.find(miniShop2.action).val(); 102 103 if (action) { 104 var formData = $form.serializeArray(); 105 formData.push({ 106 name: miniShop2.actionName, 107 value: action 108 }); 109 miniShop2.sendData = { 110 $form: $form, 111 action: action, 112 formData: formData 113 }; 114 miniShop2.controller(); 115 } 116 }); 117 miniShop2.Cart.initialize(); 118 miniShop2.Message.initialize(); 119 miniShop2.Order.initialize(); 120 }; 121 miniShop2.controller = function () { 122 var self = this; 123 switch (self.sendData.action) { 124 case 'cart/add': 125 miniShop2.Cart.add(); 126 break; 127 case 'cart/remove': 128 miniShop2.Cart.remove(); 129 break; 130 case 'cart/change': 131 miniShop2.Cart.change(); 132 break; 133 case 'cart/clean': 134 miniShop2.Cart.clean(); 135 break; 136 case 'order/submit': 137 miniShop2.Order.submit(); 138 break; 139 case 'order/clean': 140 miniShop2.Order.clean(); 141 break; 142 default: 143 return; 144 } 145 }; 146 miniShop2.send = function (data, callbacks, userCallbacks) { 147 var runCallback = function (callback, bind) { 148 if (typeof callback == 'function') { 149 return callback.apply(bind, Array.prototype.slice.call(arguments, 2)); 150 } else if (typeof callback == 'object') { 151 for (var i in callback) { 152 if (callback.hasOwnProperty(i)) { 153 var response = callback[i].apply(bind, Array.prototype.slice.call(arguments, 2)); 154 if (response === false) { 155 return false;
156 } 157 } 158 } 159 } 160 return true; 161 }; 162 // set context 163 if ($.isArray(data)) { 164 data.push({ 165 name: 'ctx', 166 value: miniShop2Config.ctx 167 }); 168 } else if ($.isPlainObject(data)) { 169 data.ctx = miniShop2Config.ctx; 170 } else if (typeof data == 'string') { 171 data += '&ctx=' + miniShop2Config.ctx; 172 } 173 174 // set action url 175 var formActionUrl = (miniShop2.sendData.$form) 176 ? miniShop2.sendData.$form.attr('action') 177 : false; 178 var url = (formActionUrl) 179 ? formActionUrl 180 : (miniShop2Config.actionUrl) 181 ? miniShop2Config.actionUrl 182 : document.location.href; 183 // set request method 184 var formMethod = (miniShop2.sendData.$form) 185 ? miniShop2.sendData.$form.attr('method') 186 : false; 187 var method = (formMethod) 188 ? formMethod 189 : 'post'; 190 191 // callback before 192 if (runCallback(callbacks.before) === false || runCallback(userCallbacks.before) === false) { 193 return; 194 } 195 // send 196 var xhr = function (callbacks, userCallbacks) { 197 return $[method](url, data, function (response) { 198 if (response.success) { 199 if (response.message) { 200 miniShop2.Message.success(response.message); 201 } 202 runCallback(callbacks.response.success, miniShop2, response); 203 runCallback(userCallbacks.response.success, miniShop2, response); 204 } else { 205 miniShop2.Message.error(response.message); 206 runCallback(callbacks.response.error, miniShop2, response); 207 runCallback(userCallbacks.response.error, miniShop2, response); 208 } 209 }, 'json').done(function () { 210 runCallback(callbacks.ajax.done, miniShop2, xhr); 211 runCallback(userCallbacks.ajax.done, miniShop2, xhr); 212 }).fail(function () { 213 runCallback(callbacks.ajax.fail, miniShop2, xhr); 214 runCallback(userCallbacks.ajax.fail, miniShop2, xhr); 215 }).always(function () { 216 runCallback(callbacks.ajax.always, miniShop2, xhr); 217 runCallback(userCallbacks.ajax.always, miniShop2, xhr); 218 }); 219 }(callbacks, userCallbacks); 220 }; 221 222 miniShop2.Cart = { 223 callbacks: { 224 add: miniShop2Config.callbacksObjectTemplate(), 225 remove: miniShop2Config.callbacksObjectTemplate(), 226 change: miniShop2Config.callbacksObjectTemplate(), 227 clean: miniShop2Config.callbacksObjectTemplate() 228 }, 229 setup: function () { 230 miniShop2.Cart.cart = '#msCart'; 231 miniShop2.Cart.miniCart = '#msMiniCart'; 232 miniShop2.Cart.miniCartClass = '.msMiniCart'; 233 miniShop2.Cart.miniCartNotEmptyClass = 'full'; 234 miniShop2.Cart.countInput = 'input[name=count]'; 235 miniShop2.Cart.totalWeight = '.ms2_total_weight'; 236 miniShop2.Cart.totalCount = '.ms2_total_count'; 237 miniShop2.Cart.totalCost = '.ms2_total_cost'; 238 miniShop2.Cart.totalDiscount = '.ms2_total_discount'; 239 miniShop2.Cart.cost = '.ms2_cost'; 240 }, 241 initialize: function () { 242 miniShop2.Cart.setup(); 243 if (!$(miniShop2.Cart.cart).length) { 244 return; 245 } 246 miniShop2.$doc.on('change', miniShop2.Cart.cart + ' ' + miniShop2.Cart.countInput, function () { 247 if (!!$(this).val()) { 248 $(this).closest(miniShop2.form).submit(); 249 } 250 }); 251 }, 252 add: function () { 253 var callbacks = miniShop2.Cart.callbacks; 254 callbacks.add.response.success = function (response) { 255 this.Cart.status(response.data); 256 }; 257 miniShop2.send(miniShop2.sendData.formData, miniShop2.Cart.callbacks.add, miniShop2.Callbacks.Cart.add); 258 }, 259 remove: function () { 260 var callbacks = miniShop2.Cart.callbacks; 261 callbacks.remove.response.success = function (response) { 262 this.Cart.remove_position(miniShop2.Utils.getValueFromSerializedArray('key')); 263 this.Cart.status(response.data); 264 }; 265 miniShop2.send(miniShop2.sendData.formData, miniShop2.Cart.callbacks.remove, miniShop2.Callbacks.Cart.remove); 266 }, 267 change: function () { 268 var callbacks = miniShop2.Cart.callbacks; 269 callbacks.change.response.success = function (response) { 270 if (typeof (response.data.key) == 'undefined') { 271 this.Cart.remove_position(miniShop2.Utils.getValueFromSerializedArray('key')); 272 } else { 273 $('#' + miniShop2.Utils.getValueFromSerializedArray('key')).find(''); 274 } 275 this.Cart.status(response.data); 276 }; 277 miniShop2.send(miniShop2.sendData.formData, miniShop2.Cart.callbacks.change, miniShop2.Callbacks.Cart.change); 278 }, 279 status: function (status) { 280 if (status['total_count'] < 1) { 281 location.reload(); 282 } else { 283 //var $cart = $(miniShop2.Cart.cart); 284 var $miniCarts = $(miniShop2.Cart.miniCart).add(miniShop2.Cart.miniCartClass); 285 if (status['total_count'] > 0 && $miniCarts.length > 0) { 286 $miniCarts.each(function (index, cart) { 287 if (!$(cart).hasClass(miniShop2.Cart.miniCartNotEmptyClass)) { 288 $(cart).addClass(miniShop2.Cart.miniCartNotEmptyClass); 289 } 290 }); 291 } 292 $(miniShop2.Cart.totalWeight).text(miniShop2.Utils.formatWeight(status['total_weight'])); 293 $(miniShop2.Cart.totalCount).text(status['total_count']); 294 $(miniShop2.Cart.totalCost).text(miniShop2.Utils.formatPrice(status['total_cost'])); 295 $(miniShop2.Cart.totalDiscount).text(miniShop2.Utils.formatPrice(status['total_discount'])); 296 if (typeof(status['cost']) === 'number') { 297 $(miniShop2.Cart.cost, '#' + status['key']).text(miniShop2.Utils.formatPrice(status['cost'])); 298 } 299 if ($(miniShop2.Order.orderCost, miniShop2.Order.order).length) { 300 miniShop2.Order.getcost(); 301 } 302 } 303 }, 304 clean: function () { 305 var callbacks = miniShop2.Cart.callbacks; 306 callbacks.clean.response.success = function (response) { 307 this.Cart.status(response.data); 308 }; 309 310 miniShop2.send(miniShop2.sendData.formData, miniShop2.Cart.callbacks.clean, miniShop2.Callbacks.Cart.clean); 311 }, 312 remove_position: function (key) { 313 $('#' + key).remove(); 314 } 315 }; 316 317 miniShop2.Order = { 318 callbacks: { 319 add: miniShop2Config.callbacksObjectTemplate(), 320 getcost: miniShop2Config.callbacksObjectTemplate(), 321 clean: miniShop2Config.callbacksObjectTemplate(), 322 submit: miniShop2Config.callbacksObjectTemplate(), 323 getrequired: miniShop2Config.callbacksObjectTemplate() 324 }, 325 setup: function () { 326 miniShop2.Order.order = '#msOrder'; 327 miniShop2.Order.deliveries = '#deliveries'; 328 miniShop2.Order.payments = '#payments'; 329 miniShop2.Order.deliveryInput = 'input[name="delivery"]'; 330 miniShop2.Order.inputParent = '.input-parent'; 331 miniShop2.Order.paymentInput = 'input[name="payment"]'; 332 miniShop2.Order.paymentInputUniquePrefix = 'input#payment_'; 333 miniShop2.Order.deliveryInputUniquePrefix = 'input#delivery_'; 334 miniShop2.Order.orderCost = '#ms2_order_cost'; 335 miniShop2.Order.cartCost = '#ms2_order_cart_cost'; 336 miniShop2.Order.deliveryCost = '#ms2_order_delivery_cost'; 337 }, 338 initialize: function () { 339 miniShop2.Order.setup(); 340 if ($(miniShop2.Order.order).length) { 341 miniShop2.$doc 342 .on('click', miniShop2.Order.order + ' [name="' + miniShop2.actionName + '"][value="order/clean"]', function (e) { 343 miniShop2.Order.clean(); 344 e.preventDefault(); 345 }) 346 .on('change', miniShop2.Order.order + ' input,' + miniShop2.Order.order + ' textarea', function () { 347 var $this = $(this); 348 var key = $this.attr('name'); 349 if (!key) return; 350 var value = $this.val(); 351 miniShop2.Order.add(key, value); 352 }); 353 var $deliveryInputChecked = $(miniShop2.Order.deliveryInput + ':checked', miniShop2.Order.order); 354 $deliveryInputChecked.trigger('change'); 355 } 356 }, 357 updatePayments: function (payments) { 358 var $paymentInputs = $(miniShop2.Order.paymentInput, miniShop2.Order.order); 359 $paymentInputs.attr('disabled', true).prop('disabled', true).closest(miniShop2.Order.inputParent).hide(); 360 if (payments.length > 0) { 361 for (var i in payments) { 362 if (payments.hasOwnProperty(i)) { 363 $paymentInputs.filter(miniShop2.Order.paymentInputUniquePrefix + payments[i]).attr('disabled', false).prop('disabled', false).closest(miniShop2.Order.inputParent).show(); 364 } 365 } 366 } 367 if ($paymentInputs.filter(':visible:checked').length == 0) { 368 $paymentInputs.filter(':visible:first').trigger('click'); 369 } 370 }, 371 add: function (key, value) { 372 var callbacks = miniShop2.Order.callbacks; 373 var old_value = value; 374 callbacks.add.response.success = function (response) { 375 (function (key, value, old_value) { 376 var $field = $('[name="' + key + '"]', miniShop2.Order.order); 377 switch (key) { 378 case 'delivery': 379 $field = $(miniShop2.Order.deliveryInputUniquePrefix + response.data[key]); 380 if (response.data[key] != old_value) { 381 $field.trigger('click'); 382 } else { 383 miniShop2.Order.getrequired(value); 384 miniShop2.Order.updatePayments($field.data('payments')); 385 miniShop2.Order.getcost(); 386 } 387 break; 388 case 'payment': 389 $field = $(miniShop2.Order.paymentInputUniquePrefix + response.data[key]); 390 if (response.data[key] != old_value) { 391 $field.trigger('click'); 392 } else { 393 miniShop2.Order.getcost(); 394 } 395 break; 396 //default: 397 } 398 $field.val(response.data[key]).removeClass('error').closest(miniShop2.Order.inputParent).removeClass('error'); 399 })(key, value, old_value); 400 }; 401 callbacks.add.response.error = function () { 402 (function (key) { 403 var $field = $('[name="' + key + '"]', miniShop2.Order.order); 404 if ($field.attr('type') == 'checkbox' || $field.attr('type') == 'radio') { 405 $field.closest(miniShop2.Order.inputParent).addClass('error'); 406 } else { 407 $field.addClass('error'); 408 } 409 })(key); 410 }; 411 412 var data = { 413 key: key, 414 value: value 415 }; 416 data[miniShop2.actionName] = 'order/add'; 417 miniShop2.send(data, miniShop2.Order.callbacks.add, miniShop2.Callbacks.Order.add); 418 }, 419 getcost: function () { 420 var callbacks = miniShop2.Order.callbacks; 421 callbacks.getcost.response.success = function (response) { 422 $(miniShop2.Order.orderCost, miniShop2.Order.order).text(miniShop2.Utils.formatPrice(response.data['cost'])); 423 $(miniShop2.Order.cartCost, miniShop2.Order.order).text(miniShop2.Utils.formatPrice(response.data['cart_cost'])); 424 $(miniShop2.Order.deliveryCost, miniShop2.Order.order).text(miniShop2.Utils.formatPrice(response.data['delivery_cost'])); 425 }; 426 var data = {}; 427 data[miniShop2.actionName] = 'order/getcost'; 428 miniShop2.send(data, miniShop2.Order.callbacks.getcost, miniShop2.Callbacks.Order.getcost); 429 }, 430 clean: function () { 431 var callbacks = miniShop2.Order.callbacks; 432 callbacks.clean.response.success = function () { 433 location.reload(); 434 }; 435 436 var data = {}; 437 data[miniShop2.actionName] = 'order/clean'; 438 miniShop2.send(data, miniShop2.Order.callbacks.clean, miniShop2.Callbacks.Order.clean); 439 }, 440 submit: function () { 441 miniShop2.Message.close(); 442 443 // Checking for active ajax request 444 if (miniShop2.ajaxProgress) { 445 //noinspection JSUnresolvedFunction 446 miniShop2.$doc.ajaxComplete(function () { 447 miniShop2.ajaxProgress = false;
448 miniShop2.$doc.unbind('ajaxComplete'); 449 miniShop2.Order.submit(); 450 }); 451 return false; 452 } 453 454 var callbacks = miniShop2.Order.callbacks; 455 callbacks.submit.before = function () { 456 $(':button, a', miniShop2.Order.order).attr('disabled', true).prop('disabled', true); 457 }; 458 callbacks.submit.response.success = function (response) { 459 if (response.data['redirect']) { 460 document.location.href = response.data['redirect']; 461 } else if (response.data['msorder']) { 462 document.location.href = document.location.origin + document.location.pathname 463 + (document.location.search ? document.location.search + '&' : '?') 464 + 'msorder=' + response.data['msorder']; 465 } else { 466 location.reload(); 467 } 468 }; 469 callbacks.submit.response.error = function (response) { 470 setTimeout((function () { 471 $(':button, a', miniShop2.Order.order).attr('disabled', false).prop('disabled', false); 472 }.bind(this)), 3 * miniShop2.timeout); 473 $('[name]', miniShop2.Order.order).removeClass('error').closest(miniShop2.Order.inputParent).removeClass('error'); 474 for (var i in response.data) { 475 if (response.data.hasOwnProperty(i)) { 476 var key = response.data[i]; 477 //var $field = $('[name="' + response.data[i] + '"]', miniShop2.Order.order); 478 //$field.addClass('error').closest(miniShop2.Order.inputParent).addClass('error'); 479 var $field = $('[name="' + key + '"]', miniShop2.Order.order); 480 if ($field.attr('type') == 'checkbox' || $field.attr('type') == 'radio') { 481 $field.closest(miniShop2.Order.inputParent).addClass('error'); 482 } else { 483 $field.addClass('error'); 484 } 485 } 486 } 487 }; 488 return miniShop2.send(miniShop2.sendData.formData, miniShop2.Order.callbacks.submit, miniShop2.Callbacks.Order.submit); 489 }, 490 getrequired: function (value) { 491 var callbacks = miniShop2.Order.callbacks; 492 callbacks.getrequired.response.success = function (response) { 493 $('[name]', miniShop2.Order.order).removeClass('required').closest(miniShop2.Order.inputParent).removeClass('required'); 494 var requires = response.data['requires']; 495 for (var i = 0, length = requires.length; i < length; i++) { 496 $('[name=' + requires[i] + ']', miniShop2.Order.order).addClass('required').closest(miniShop2.Order.inputParent).addClass('required'); 497 } 498 }; 499 callbacks.getrequired.response.error = function () { 500 $('[name]', miniShop2.Order.order).removeClass('required').closest(miniShop2.Order.inputParent).removeClass('required'); 501 }; 502 503 var data = { 504 id: value 505 }; 506 data[miniShop2.actionName] = 'order/getrequired'; 507 miniShop2.send(data, miniShop2.Order.callbacks.getrequired, miniShop2.Callbacks.Order.getrequired); 508 } 509 }; 510 511 miniShop2.Message = { 512 initialize: function () { 513 }, 514 close: function () { 515 }, 516 show: function (message) { 517 if (message != '') { 518 alert(message); 519 } 520 }, 521 success: function (message) { 522 }, 523 error: function (message) { 524 }, 525 info: function (message) { 526 } 527 }; 528 529 miniShop2.Utils = { 530 empty: function (val) { 531 return (typeof (val) == 'undefined' || val == 0 || val === null || val === false || (typeof (val) == 'string' && val.replace(/\s+/g, '') == '') || (typeof (val) == 'object' && val.length == 0)); 532 }, 533 formatPrice: function (price) { 534 var pf = miniShop2Config.price_format; 535 price = this.number_format(price, pf[0], pf[1], pf[2]); 536 537 if (miniShop2Config.price_format_no_zeros && pf[0] > 0) { 538 price = price.replace(/(0+)$/, ''); 539 price = price.replace(/[^0-9]$/, ''); 540 } 541 542 return price; 543 }, 544 formatWeight: function (weight) { 545 var wf = miniShop2Config.weight_format; 546 weight = this.number_format(weight, wf[0], wf[1], wf[2]); 547 548 if (miniShop2Config.weight_format_no_zeros && wf[0] > 0) { 549 weight = weight.replace(/(0+)$/, ''); 550 weight = weight.replace(/[^0-9]$/, ''); 551 } 552 553 return weight; 554 }, 555 // Format a number with grouped thousands, 556 number_format: function (number, decimals, dec_point, thousands_sep) { 557 // original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com) 558 // improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) 559 // bugfix by: Michael White (http://crestidg.com) 560 var i, j, kw, kd, km; 561 562 // input sanitation & defaults 563 if (isNaN(decimals = Math.abs(decimals))) { 564 decimals = 2; 565 } 566 if (dec_point == undefined) { 567 dec_point = ','; 568 } 569 if (thousands_sep == undefined) { 570 thousands_sep = '.'; 571 } 572 573 i = parseInt(number = (+number || 0).toFixed(decimals)) + ''; 574 575 if ((j = i.length) > 3) { 576 j = j % 3; 577 } else { 578 j = 0; 579 } 580 581 km = j 582 ? i.substr(0, j) + thousands_sep 583 : ''; 584 kw = i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + thousands_sep); 585 kd = (decimals 586 ? dec_point + Math.abs(number - i).toFixed(decimals).replace(/-/, '0').slice(2) 587 : ''); 588 589 return km + kw + kd; 590 }, 591 getValueFromSerializedArray: function (name, arr) { 592 if (!$.isArray(arr)) { 593 arr = miniShop2.sendData.formData; 594 } 595 for (var i = 0, length = arr.length; i < length; i++) { 596 if (arr[i].name == name) { 597 return arr[i].value; 598 } 599 } 600 return null; 601 } 602 }; 603 604 $(document).ready(function ($) { 605 miniShop2.initialize(); 606 var html = $('html'); 607 html.removeClass('no-js'); 608 if (!html.hasClass('js')) { 609 html.addClass('js'); 610 } 611 }); 612 613 window.miniShop2 = miniShop2; 614})(window, document, jQuery, miniShop2Config);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.