text: /**
   * KAbel_BundlePlus
   *
   * NOTICE OF LICENSE
   *
   * This source file is subject to a BSD 3-Clause License
   * that is bundled with this package in the file LICENSE_BSD_NU.txt.
   * It is also available through the world-wide-web at this URL:
   * http://www1.unl.edu/wdn/wiki/Software_License
   *
   * @category    design
   * @package     base_default
   * @copyright   Copyright (c) 2012 Regents of the University of Nebraska (http://www.nebraska.edu/)
   * @license     http://www1.unl.edu/wdn/wiki/Software_License  BSD 3-Clause License
   */
  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);
                      }
                  }
                  if (selection.value != '') {
                  	if (selection.checked && this.config.options[parts[2]].selections[selection.value].customQty == 1) {
                          this.showQtyInput(parts[2] + '-' + selection.value, this.config.options[parts[2]].selections[selection.value].qty, true);
                  	} else if (this.config.options[parts[2]].selections[selection.value].customQty == 1) {
                          this.showQtyInput(parts[2] + '-' + selection.value, '0', false);
                  	}
                  }
              }
              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);
          }
          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]);
                  }
              }
          }
  
          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;
          if (this.config.options[optionId].selections[selectionId].customQty == 1) {
              if (this.config['options'][optionId].isMulti) {
              	if ($('bundle-option-' + optionId + '-' + selectionId + '-qty-input')) {
              		qty = $('bundle-option-' + optionId + '-' + selectionId + '-qty-input').value;
              	} else {
              		qty = 1;
              	}
              } else {
  	        	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;
                  }
              }
          } 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;
              newPrice = (Math.round(newPrice*100)/100).toString();
              price = Math.min(newPrice, price);
          }
  
          selection = this.config.options[optionId].selections[selectionId];
          if (selection.priceInclTax !== undefined) {
              priceInclTax = selection.priceInclTax;
              price = selection.priceExclTax !== undefined ? selection.priceExclTax : selection.price;
          } else {
              priceInclTax = price;
          }
  
          var result = new Array(price*qty, disposition*qty, priceInclTax*qty);
          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();
          } else if (parts[3] != 'qty') {
          	selectionId = parts[3];
          	this.config.options[optionId].selections[selectionId].qty = element.value*1;
          	this.reloadPrice();
          }
      },
      
      changeOptionSelectionQty: 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];
          selectionId = parts[3];
              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');
              }
          }
      }
  };
  