/** * 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@magentocommerce.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.magentocommerce.com for more information. * * @category design * @package base_default * @copyright Copyright (c) 2014 Magento Inc. (http://www.magentocommerce.com) * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ if(typeof Product=='undefined') { var Product = {}; } /**************************** BUNDLE PRODUCT **************************/ Product.Bundle = Class.create(); Product.Bundle.prototype = { initialize: function(config){ this.config = config; // Set preconfigured values for correct price base calculation if (config.defaultValues) { for (var option in config.defaultValues) { if (this.config['options'][option].isMulti) { var selected = new Array(); for (var i = 0; i < config.defaultValues[option].length; i++) { selected.push(config.defaultValues[option][i]); } this.config.selected[option] = selected; } else { this.config.selected[option] = new Array(config.defaultValues[option] + ""); } } } this.reloadPrice(); }, changeSelection: function(selection){ var parts = selection.id.split('-'); if (this.config['options'][parts[2]].isMulti) { selected = new Array(); if (selection.tagName == 'SELECT') { for (var i = 0; i < selection.options.length; i++) { if (selection.options[i].selected && selection.options[i].value != '') { selected.push(selection.options[i].value); } } } else if (selection.tagName == 'INPUT') { selector = parts[0]+'-'+parts[1]+'-'+parts[2]; selections = $$('.'+selector); for (var i = 0; i < selections.length; i++) { if (selections[i].checked && selections[i].value != '') { selected.push(selections[i].value); } } } this.config.selected[parts[2]] = selected; } else { if (selection.value != '') { this.config.selected[parts[2]] = new Array(selection.value); } else { this.config.selected[parts[2]] = new Array(); } this.populateQty(parts[2], selection.value); var tierPriceElement = $('bundle-option-' + parts[2] + '-tier-prices'), tierPriceHtml = ''; if (selection.value != '' && this.config.options[parts[2]].selections[selection.value].customQty == 1) { tierPriceHtml = this.config.options[parts[2]].selections[selection.value].tierPriceHtml; } tierPriceElement.update(tierPriceHtml); } this.reloadPrice(); }, reloadPrice: function() { var calculatedPrice = 0; var dispositionPrice = 0; var includeTaxPrice = 0; for (var option in this.config.selected) { if (this.config.options[option]) { for (var i=0; i < this.config.selected[option].length; i++) { var prices = this.selectionPrice(option, this.config.selected[option][i]); calculatedPrice += Number(prices[0]); dispositionPrice += Number(prices[1]); includeTaxPrice += Number(prices[2]); } } } //Tax is calculated in a different way for the the TOTAL BASED method //We round the taxes at the end. Hence we do the same for consistency //This variable is set in the bundle.phtml if (taxCalcMethod == CACL_TOTAL_BASE) { var calculatedPriceFormatted = calculatedPrice.toFixed(10); var includeTaxPriceFormatted = includeTaxPrice.toFixed(10); var tax = includeTaxPriceFormatted - calculatedPriceFormatted; calculatedPrice = includeTaxPrice - Math.round(tax * 100) / 100; } //make sure that the prices are all rounded to two digits //this is needed when tax calculation is based on total for dynamic //price bundle product. For fixed price bundle product, the rounding //needs to be done after option price is added to base price if (this.config.priceType == '0') { calculatedPrice = Math.round(calculatedPrice*100)/100; dispositionPrice = Math.round(dispositionPrice*100)/100; includeTaxPrice = Math.round(includeTaxPrice*100)/100; } var event = $(document).fire('bundle:reload-price', { price: calculatedPrice, priceInclTax: includeTaxPrice, dispositionPrice: dispositionPrice, bundle: this }); if (!event.noReloadPrice) { optionsPrice.specialTaxPrice = 'true'; optionsPrice.changePrice('bundle', calculatedPrice); optionsPrice.changePrice('nontaxable', dispositionPrice); optionsPrice.changePrice('priceInclTax', includeTaxPrice); optionsPrice.reload(); } return calculatedPrice; }, selectionPrice: function(optionId, selectionId) { if (selectionId == '' || selectionId == 'none') { return 0; } var qty = null; var tierPriceInclTax, tierPriceExclTax; if (this.config.options[optionId].selections[selectionId].customQty == 1 && !this.config['options'][optionId].isMulti) { if ($('bundle-option-' + optionId + '-qty-input')) { qty = $('bundle-option-' + optionId + '-qty-input').value; } else { qty = 1; } } else { qty = this.config.options[optionId].selections[selectionId].qty; } if (this.config.priceType == '0') { price = this.config.options[optionId].selections[selectionId].price; tierPrice = this.config.options[optionId].selections[selectionId].tierPrice; for (var i=0; i < tierPrice.length; i++) { if (Number(tierPrice[i].price_qty) <= qty && Number(tierPrice[i].price) <= price) { price = tierPrice[i].price; tierPriceInclTax = tierPrice[i].priceInclTax; tierPriceExclTax = tierPrice[i].priceExclTax; } } } else { selection = this.config.options[optionId].selections[selectionId]; if (selection.priceType == '0') { price = selection.priceValue; } else { price = (this.config.basePrice*selection.priceValue)/100; } } //price += this.config.options[optionId].selections[selectionId].plusDisposition; //price -= this.config.options[optionId].selections[selectionId].minusDisposition; //return price*qty; var disposition = this.config.options[optionId].selections[selectionId].plusDisposition + this.config.options[optionId].selections[selectionId].minusDisposition; if (this.config.specialPrice) { newPrice = (price*this.config.specialPrice)/100; price = Math.min(newPrice, price); } selection = this.config.options[optionId].selections[selectionId]; if (tierPriceInclTax !== undefined && tierPriceExclTax !== undefined) { priceInclTax = tierPriceInclTax; price = tierPriceExclTax; } else if (selection.priceInclTax !== undefined) { priceInclTax = selection.priceInclTax; price = selection.priceExclTax !== undefined ? selection.priceExclTax : selection.price; } else { priceInclTax = price; } if (this.config.priceType == '1' || taxCalcMethod == CACL_TOTAL_BASE) { var result = new Array(price*qty, disposition*qty, priceInclTax*qty); return result; } else if (taxCalcMethod == CACL_UNIT_BASE) { price = (Math.round(price*100)/100).toString(); disposition = (Math.round(disposition*100)/100).toString(); priceInclTax = (Math.round(priceInclTax*100)/100).toString(); var result = new Array(price*qty, disposition*qty, priceInclTax*qty); return result; } else { //taxCalcMethod == CACL_ROW_BASE) price = (Math.round(price*qty*100)/100).toString(); disposition = (Math.round(disposition*qty*100)/100).toString(); priceInclTax = (Math.round(priceInclTax*qty*100)/100).toString(); var result = new Array(price, disposition, priceInclTax); return result; } }, populateQty: function(optionId, selectionId){ if (selectionId == '' || selectionId == 'none') { this.showQtyInput(optionId, '0', false); return; } if (this.config.options[optionId].selections[selectionId].customQty == 1) { this.showQtyInput(optionId, this.config.options[optionId].selections[selectionId].qty, true); } else { this.showQtyInput(optionId, this.config.options[optionId].selections[selectionId].qty, false); } }, showQtyInput: function(optionId, value, canEdit) { elem = $('bundle-option-' + optionId + '-qty-input'); elem.value = value; elem.disabled = !canEdit; if (canEdit) { elem.removeClassName('qty-disabled'); } else { elem.addClassName('qty-disabled'); } }, changeOptionQty: function (element, event) { var checkQty = true; if (typeof(event) != 'undefined') { if (event.keyCode == 8 || event.keyCode == 46) { checkQty = false; } } if (checkQty && (Number(element.value) == 0 || isNaN(Number(element.value)))) { element.value = 1; } parts = element.id.split('-'); optionId = parts[2]; if (!this.config['options'][optionId].isMulti) { selectionId = this.config.selected[optionId][0]; this.config.options[optionId].selections[selectionId].qty = element.value*1; this.reloadPrice(); } }, validationCallback: function (elmId, result){ if (elmId == undefined || $(elmId) == undefined) { return; } var container = $(elmId).up('ul.options-list'); if (typeof container != 'undefined') { if (result == 'failed') { container.removeClassName('validation-passed'); container.addClassName('validation-failed'); } else { container.removeClassName('validation-failed'); container.addClassName('validation-passed'); } } } }