/** * Magento * * NOTICE OF LICENSE * * This source file is subject to the Academic Free License (AFL 3.0) * that is bundled with this package in the file LICENSE_AFL.txt. * It is also available through the world-wide-web at this URL: * http://opensource.org/licenses/afl-3.0.php * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to license@magento.com so we can send you a copy immediately. * * DISCLAIMER * * Do not edit or add to this file if you wish to upgrade Magento to newer * versions in the future. If you wish to customize Magento for your * needs please refer to http://www.magento.com for more information. * * @category Varien * @package js * @copyright Copyright (c) 2006-2020 Magento, Inc. (http://www.magento.com) * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ var Product = Product || {}; /**************************** PRICE RELOADER ********************************/ Product.OptionsPrice = Class.create(); Product.OptionsPrice.prototype = { initialize: function(config) { this.productId = config.productId; this.priceFormat = config.priceFormat; this.includeTax = config.includeTax; this.defaultTax = config.defaultTax; this.currentTax = config.currentTax; this.productPrice = config.productPrice; this.showIncludeTax = config.showIncludeTax; this.showBothPrices = config.showBothPrices; this.productOldPrice = config.productOldPrice; this.priceInclTax = config.priceInclTax; this.priceExclTax = config.priceExclTax; this.skipCalculate = config.skipCalculate; /** @deprecated after 1.5.1.0 */ this.duplicateIdSuffix = config.idSuffix; this.specialTaxPrice = config.specialTaxPrice; this.tierPrices = config.tierPrices; this.tierPricesInclTax = config.tierPricesInclTax; this.oldPlusDisposition = config.oldPlusDisposition; this.plusDisposition = config.plusDisposition; this.plusDispositionTax = config.plusDispositionTax; this.oldMinusDisposition = config.oldMinusDisposition; this.minusDisposition = config.minusDisposition; this.exclDisposition = config.exclDisposition; this.optionPrices = {}; this.customPrices = {}; this.containers = {}; this.displayZeroPrice = true; this.initPrices(); }, setDuplicateIdSuffix: function(idSuffix) { this.duplicateIdSuffix = idSuffix; }, initPrices: function() { this.containers[0] = 'product-price-' + this.productId; this.containers[1] = 'bundle-price-' + this.productId; this.containers[2] = 'price-including-tax-' + this.productId; this.containers[3] = 'price-excluding-tax-' + this.productId; this.containers[4] = 'old-price-' + this.productId; }, changePrice: function(key, price) { this.optionPrices[key] = price; }, addCustomPrices: function(key, price) { this.customPrices[key] = price; }, getOptionPrices: function() { var price = 0; var nonTaxable = 0; var oldPrice = 0; var priceInclTax = 0; var currentTax = this.currentTax; $H(this.optionPrices).each(function(pair) { if ('undefined' != typeof(pair.value.price) && 'undefined' != typeof(pair.value.oldPrice)) { price += parseFloat(pair.value.price); oldPrice += parseFloat(pair.value.oldPrice); } else if (pair.key == 'nontaxable') { nonTaxable = pair.value; } else if (pair.key == 'priceInclTax') { priceInclTax += pair.value; } else if (pair.key == 'optionsPriceInclTax') { priceInclTax += pair.value * (100 + currentTax) / 100; } else { price += parseFloat(pair.value); oldPrice += parseFloat(pair.value); } }); return [price, nonTaxable, oldPrice, priceInclTax]; }, reload: function() { var price; var formattedPrice; var optionPrices = this.getOptionPrices(); var nonTaxable = optionPrices[1]; var optionOldPrice = optionPrices[2]; var priceInclTax = optionPrices[3]; optionPrices = optionPrices[0]; $H(this.containers).each(function(pair) { var _productPrice; var _plusDisposition; var _minusDisposition; var _priceInclTax; var excl; var incl; var tax; if ($(pair.value) == null) { pair.value = "product-price-weee-" + this.productId; } if ($(pair.value)) { if (pair.value == 'old-price-'+this.productId && this.productOldPrice != this.productPrice) { _productPrice = this.productOldPrice; _plusDisposition = this.oldPlusDisposition; _minusDisposition = this.oldMinusDisposition; } else { _productPrice = this.productPrice; _plusDisposition = this.plusDisposition; _minusDisposition = this.minusDisposition; } _priceInclTax = priceInclTax; if (pair.value == 'old-price-'+this.productId && optionOldPrice !== undefined) { price = optionOldPrice+parseFloat(_productPrice); } else if (this.specialTaxPrice == 'true' && this.priceInclTax !== undefined && this.priceExclTax !== undefined) { price = optionPrices+parseFloat(this.priceExclTax); _priceInclTax += this.priceInclTax; } else { price = optionPrices+parseFloat(_productPrice); _priceInclTax += parseFloat(_productPrice) * (100 + this.currentTax) / 100; } if (this.specialTaxPrice == 'true') { excl = price; incl = _priceInclTax; } else if (this.includeTax == 'true') { // tax = tax included into product price by admin tax = price / (100 + this.defaultTax) * this.defaultTax; excl = price - tax; incl = excl*(1+(this.currentTax/100)); } else { tax = price * (this.currentTax / 100); excl = price; incl = excl + tax; } var subPrice = 0; var subPriceincludeTax = 0; Object.values(this.customPrices).each(function(el){ if (el.excludeTax && el.includeTax) { subPrice += parseFloat(el.excludeTax); subPriceincludeTax += parseFloat(el.includeTax); } else { subPrice += parseFloat(el.price); subPriceincludeTax += parseFloat(el.price); } }); excl += subPrice; incl += subPriceincludeTax; if (typeof this.exclDisposition == 'undefined') { excl += parseFloat(_plusDisposition); } incl += parseFloat(_plusDisposition) + parseFloat(this.plusDispositionTax); excl -= parseFloat(_minusDisposition); incl -= parseFloat(_minusDisposition); //adding nontaxlable part of options excl += parseFloat(nonTaxable); incl += parseFloat(nonTaxable); if (pair.value == 'price-including-tax-'+this.productId) { price = incl; } else if (pair.value == 'price-excluding-tax-'+this.productId) { price = excl; } else if (pair.value == 'old-price-'+this.productId) { if (this.showIncludeTax || this.showBothPrices) { price = incl; } else { price = excl; } } else { if (this.showIncludeTax) { price = incl; } else { price = excl; } } if (price < 0) price = 0; if (price > 0 || this.displayZeroPrice) { formattedPrice = this.formatPrice(price); } else { formattedPrice = ''; } if ($(pair.value).select('.price')[0]) { $(pair.value).select('.price')[0].innerHTML = formattedPrice; if ($(pair.value+this.duplicateIdSuffix) && $(pair.value+this.duplicateIdSuffix).select('.price')[0]) { $(pair.value+this.duplicateIdSuffix).select('.price')[0].innerHTML = formattedPrice; } } else { $(pair.value).innerHTML = formattedPrice; if ($(pair.value+this.duplicateIdSuffix)) { $(pair.value+this.duplicateIdSuffix).innerHTML = formattedPrice; } } }; }.bind(this)); if (typeof(skipTierPricePercentUpdate) === "undefined" && typeof(this.tierPrices) !== "undefined") { for (var i = 0; i < this.tierPrices.length; i++) { $$('.benefit').each(function(el) { var parsePrice = function(html) { var format = this.priceFormat; var decimalSymbol = format.decimalSymbol === undefined ? "," : format.decimalSymbol; var regexStr = '[^0-9-' + decimalSymbol + ']'; //remove all characters except number and decimal symbol html = html.replace(new RegExp(regexStr, 'g'), ''); html = html.replace(decimalSymbol, '.'); return parseFloat(html); }.bind(this); var updateTierPriceInfo = function(priceEl, tierPriceDiff, tierPriceEl, benefitEl) { if (typeof(tierPriceEl) === "undefined") { //tierPrice is not shown, e.g., MAP, no need to update the tier price info return; } var price = parsePrice(priceEl.innerHTML); var tierPrice = price + tierPriceDiff; tierPriceEl.innerHTML = this.formatPrice(tierPrice); var $percent = Selector.findChildElements(benefitEl, ['.percent.tier-' + i]); $percent.each(function(el) { el.innerHTML = Math.ceil(100 - ((100 / price) * tierPrice)); }); }.bind(this); var tierPriceElArray = $$('.tier-price.tier-' + i + ' .price'); if (this.showBothPrices) { var containerExclTax = $(this.containers[3]); var tierPriceExclTaxDiff = this.tierPrices[i]; var tierPriceExclTaxEl = tierPriceElArray[0]; updateTierPriceInfo(containerExclTax, tierPriceExclTaxDiff, tierPriceExclTaxEl, el); var containerInclTax = $(this.containers[2]); var tierPriceInclTaxDiff = this.tierPricesInclTax[i]; var tierPriceInclTaxEl = tierPriceElArray[1]; updateTierPriceInfo(containerInclTax, tierPriceInclTaxDiff, tierPriceInclTaxEl, el); } else if (this.showIncludeTax) { var container = $(this.containers[0]); var tierPriceInclTaxDiff = this.tierPricesInclTax[i]; var tierPriceInclTaxEl = tierPriceElArray[0]; updateTierPriceInfo(container, tierPriceInclTaxDiff, tierPriceInclTaxEl, el); } else { var container = $(this.containers[0]); var tierPriceExclTaxDiff = this.tierPrices[i]; var tierPriceExclTaxEl = tierPriceElArray[0]; updateTierPriceInfo(container, tierPriceExclTaxDiff, tierPriceExclTaxEl, el); } }, this); } } }, formatPrice: function(price) { return formatCurrency(price, this.priceFormat); } };