/** * 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 Varien * @package js * @copyright Copyright (c) 2013 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 = {}; } /**************************** CONFIGURABLE PRODUCT **************************/ Product.Config = Class.create(); Product.Config.prototype = { initialize: function(config){ this.config = config; this.taxConfig = this.config.taxConfig; if (config.containerId) { this.settings = $$('#' + config.containerId + ' ' + '.super-attribute-select'); } else { this.settings = $$('.super-attribute-select'); } this.state = new Hash(); this.priceTemplate = new Template(this.config.template); this.prices = config.prices; // Set default values from config if (config.defaultValues) { this.values = config.defaultValues; } // Overwrite defaults by url var separatorIndex = window.location.href.indexOf('#'); if (separatorIndex != -1) { var paramsStr = window.location.href.substr(separatorIndex+1); var urlValues = paramsStr.toQueryParams(); if (!this.values) { this.values = {}; } for (var i in urlValues) { this.values[i] = urlValues[i]; } } // Overwrite defaults by inputs values if needed if (config.inputsInitialized) { this.values = {}; this.settings.each(function(element) { if (element.value) { var attributeId = element.id.replace(/[a-z]*/, ''); this.values[attributeId] = element.value; } }.bind(this)); } // Put events to check select reloads this.settings.each(function(element){ Event.observe(element, 'change', this.configure.bind(this)) }.bind(this)); // fill state this.settings.each(function(element){ var attributeId = element.id.replace(/[a-z]*/, ''); if(attributeId && this.config.attributes[attributeId]) { element.config = this.config.attributes[attributeId]; element.attributeId = attributeId; this.state[attributeId] = false; } }.bind(this)) // Init settings dropdown var childSettings = []; for(var i=this.settings.length-1;i>=0;i--){ var prevSetting = this.settings[i-1] ? this.settings[i-1] : false; var nextSetting = this.settings[i+1] ? this.settings[i+1] : false; if (i == 0){ this.fillSelect(this.settings[i]) } else { this.settings[i].disabled = true; } $(this.settings[i]).childSettings = childSettings.clone(); $(this.settings[i]).prevSetting = prevSetting; $(this.settings[i]).nextSetting = nextSetting; childSettings.push(this.settings[i]); } // Set values to inputs this.configureForValues(); document.observe("dom:loaded", this.configureForValues.bind(this)); }, configureForValues: function () { if (this.values) { this.settings.each(function(element){ var attributeId = element.attributeId; element.value = (typeof(this.values[attributeId]) == 'undefined')? '' : this.values[attributeId]; this.configureElement(element); }.bind(this)); } }, configure: function(event){ var element = Event.element(event); this.configureElement(element); }, configureElement : function(element) { this.reloadOptionLabels(element); if(element.value){ this.state[element.config.id] = element.value; if(element.nextSetting){ element.nextSetting.disabled = false; this.fillSelect(element.nextSetting); this.resetChildren(element.nextSetting); } } else { this.resetChildren(element); } this.reloadPrice(); }, reloadOptionLabels: function(element){ var selectedPrice; if(element.options[element.selectedIndex].config && !this.config.stablePrices){ selectedPrice = parseFloat(element.options[element.selectedIndex].config.price) } else{ selectedPrice = 0; } for(var i=0;i-1){ allowedProducts.push(options[i].products[j]); } } } else { allowedProducts = options[i].products.clone(); } if(allowedProducts.size()>0){ options[i].allowedProducts = allowedProducts; element.options[index] = new Option(this.getOptionLabel(options[i], options[i].price), options[i].id); if (typeof options[i].price != 'undefined') { element.options[index].setAttribute('price', options[i].price); } element.options[index].config = options[i]; index++; } } } }, getOptionLabel: function(option, price){ var price = parseFloat(price); if (this.taxConfig.includeTax) { var tax = price / (100 + this.taxConfig.defaultTax) * this.taxConfig.defaultTax; var excl = price - tax; var incl = excl*(1+(this.taxConfig.currentTax/100)); } else { var tax = price * (this.taxConfig.currentTax / 100); var excl = price; var incl = excl + tax; } if (this.taxConfig.showIncludeTax || this.taxConfig.showBothPrices) { price = incl; } else { price = excl; } var str = option.label; if(price){ if (this.taxConfig.showBothPrices) { str+= ' ' + this.formatPrice(excl, true) + ' (' + this.formatPrice(price, true) + ' ' + this.taxConfig.inclTaxTitle + ')'; } else { str+= ' ' + this.formatPrice(price, true); } } return str; }, formatPrice: function(price, showSign){ var str = ''; price = parseFloat(price); if(showSign){ if(price<0){ str+= '-'; price = -price; } else{ str+= '+'; } } var roundedPrice = (Math.round(price*100)/100).toString(); if (this.prices && this.prices[roundedPrice]) { str+= this.prices[roundedPrice]; } else { str+= this.priceTemplate.evaluate({price:price.toFixed(2)}); } return str; }, clearSelect: function(element){ for(var i=element.options.length-1;i>=0;i--){ element.remove(i); } }, getAttributeOptions: function(attributeId){ if(this.config.attributes[attributeId]){ return this.config.attributes[attributeId].options; } }, reloadPrice: function(){ if (this.config.disablePriceReload) { return; } var price = 0; var oldPrice = 0; for(var i=this.settings.length-1;i>=0;i--){ var selected = this.settings[i].options[this.settings[i].selectedIndex]; if(selected.config){ price += parseFloat(selected.config.price); oldPrice += parseFloat(selected.config.oldPrice); } } optionsPrice.changePrice('config', {'price': price, 'oldPrice': oldPrice}); optionsPrice.reload(); return price; if($('product-price-'+this.config.productId)){ $('product-price-'+this.config.productId).innerHTML = price; } this.reloadOldPrice(); }, reloadOldPrice: function(){ if (this.config.disablePriceReload) { return; } if ($('old-price-'+this.config.productId)) { var price = parseFloat(this.config.oldPrice); for(var i=this.settings.length-1;i>=0;i--){ var selected = this.settings[i].options[this.settings[i].selectedIndex]; if(selected.config){ price+= parseFloat(selected.config.price); } } if (price < 0) price = 0; price = this.formatPrice(price); if($('old-price-'+this.config.productId)){ $('old-price-'+this.config.productId).innerHTML = price; } } } }