﻿Type.registerNamespace("epsilon");

epsilon.attributesBehavior = function(element) {
   epsilon.attributesBehavior.initializeBase(this, [element]);

   this._baseSku = '';
   this._skuChar = '';
   this._basePrice = 0;
   this._attributesCount = 0;
   this._qtyElement = null;
   this._checkInventory = false;

   this._addToCartHelpElement = null;
   this._addToCartSelectionElement = null;
   this._addToCartHelpBaseText = '<b>To buy, select {0}.</b><br />';
   this._addToCartText = '<b>To Buy, Add to Shopping Cart.</b>';
   this._yourSelectionText = '<b>Your Selection:&nbsp;</b>';
   this._outOfStockText = '<b>Sorry, this item is not available.</b>';
   this._andText = 'and';
   this._priceText = '<br /><b>Price:</b> {0}';
   this._targetImageElement = null;
   this._targerLinkElement = null;
   this._localCurrencyFormat = '';

   this._attributeSelectOptions = '';
   this._attributes = new Array();
   this._selectedAttributeItems = new Array();
   this._skus = new Array();
   this._selectedSku = '';
   this._selectedPriceAdd = 0;

   this._isSelectedAttVal = false;
   this._isSkuVal = false;

   this._enabled = false;
   this._disableEl = null;

   this.outOfStokeElement = null;
}

epsilon.attributesBehavior.prototype = {

   dispose: function() {
      epsilon.attributesBehavior.callBaseMethod(this, 'dispose');
   },

   initialize: function() {
      this.set_Enabled(false);
      for (var i = 0; i < this._attributesCount; i++) {
         this._attributes[i] = new Array();
      }
      this._validateSelectedAttribute();
      this._validateSku();      
      this.CanAddToCart();
      epsilon.attributesBehavior.callBaseMethod(this, 'initialize');
   },

   AddAttributeItem: function(idx, text, sku, price, imgUrl, linkUrl) {
      var item = new epsilon.attributeItem();
      item.set_text(text);
      item.set_sku(sku);
      item.set_price(price);
      item.set_imgUrl(imgUrl);
      item.set_linkUrl(linkUrl)
      this._attributes[idx][this._attributes[idx].length] = item;
   },

   AddSkuItem: function(sku, inStock) {
      var item = new epsilon.skuItem();
      item.set_sku(sku);
      item.set_inStock(inStock);
      this._skus[this._skus.length] = item;
   },

   CanAddToCart: function() {
      var isVal = (this._isSelectedAttVal && this._isSkuVal);
      if (isVal) {
         this._qtyElement.disabled = '';
      } else {
         this._qtyElement.disabled = 'disabled';
      }
      return isVal;
   },

   SelectAttributeItem: function(i, x) {
      this._hideOutOfStockLabel();
      this._isSelectedAttVal = false;
      this._isSkuVal = false;
      this._clearSelectedAtributes(i);
      if ((i >= 0) && (x >= 0)) {
         var item = this._attributes[i][x];
         item.set_selected(true);
         if ((this._targetImageElement) && (item.get_imgUrl())) {
            //Sys.Debug.trace(item.get_imgUrl());
            this._targetImageElement.src = item.get_imgUrl();
            this._targerLinkElement.href = item.get_linkUrl();
         }
      }

      this._validateSelectedAttribute();
      this._validateSku();
      this._getPriceChange();

      //finally
      this._setHelpText();
      this._setSelectionText();
   },

   _setHelpText: function() {
      var txt = '';

      if ((this._isSkuVal == false) && (this._isSelectedAttVal == true)) {

      } else if ((this._isSkuVal) && (this._isSelectedAttVal)) {
         txt = this._addToCartText;
      } else if (this._isSelectedAttVal == false) {
         if (this._attributes.length > 0) {
            var optTest = this._attributeSelectOptions.split(',');
            var opt = new Array();
            for (i = 0; i < this._attributes.length; i++) {
               var item = this._getSelectedAtributeItm(i);
               if (item == null)
                  opt[opt.length] = optTest[i];
            }

            for (i = 0; i < opt.length; i++) {
               if (i == opt.length - 2)
                  txt += String.format('{0} {1} ', opt[i], this._andText);
               else
                  txt += opt[i] + ', ';
            }
            txt = String.format(this._addToCartHelpBaseText, txt.substring(0, txt.length - 2));
         }
      }

      this._addToCartHelpElement.innerHTML = txt;
   },

   _getSelectedAtributeItm: function(att) {
      var item = null;
      for (var i = 0; i < this._attributes[att].length; i++) {
         if (this._attributes[att][i].get_selected())
            item = this._attributes[att][i];
      }
      return item;
   },

   _setSelectionText: function() {
      var txt = '';
      for (var i = 0; i < this._selectedAttributeItems.length; i++) {
         if (this._selectedAttributeItems[i] != null) {
            txt += this._selectedAttributeItems[i].get_text() + ', '
         }
      }
      if (txt != '') {
         txt = txt.substring(0, txt.length - 2);
         txt = this._yourSelectionText + txt;
      }

      if ((this.CanAddToCart()) && (this.get_Price() != this._basePrice)) {
         txt = txt + String.format(this._priceText, epsilonCommon.formatCurrency(this.get_Price(), this._localCurrencyFormat));
      }

      if ((this._isSkuVal == false) && (this._isSelectedAttVal == true)) {
         txt = this._outOfStockText + ' ' + txt;
         this._showOutOfStockLabel(txt);
      }
      this._addToCartSelectionElement.innerHTML = txt;
   },


   _hideOutOfStockLabel: function() {
      if (this.outOfStokeElement)
         this.outOfStokeElement.style.display = 'none'; ;
   },

   _showOutOfStockLabel: function(txt) {
      if (this.outOfStokeElement == null) {
         var imgEl = $get('divProductImage');

         this.outOfStokeElement = document.createElement('div');
         this.outOfStokeElement.className = 'outOfStock';
         imgEl.appendChild(this.outOfStokeElement);

         var imgElLocation = Sys.UI.DomElement.getLocation(imgEl);
         var imgElBounds = Sys.UI.DomElement.getBounds(imgEl);

         this.outOfStokeElement.style.width = imgElBounds.width + 'px';
         this.outOfStokeElement.style.height = '50px';
         this.outOfStokeElement.style.left = imgElLocation.x + 'px';
         this.outOfStokeElement.style.top = (imgElLocation.y + 30) + 'px';

      }
      this.outOfStokeElement.style.display = '';
      this.outOfStokeElement.innerHTML = txt;
   },

   _getPriceChange: function() {
      this._selectedPriceAdd = 0;
      for (var i = 0; i < this._selectedAttributeItems.length; i++) {
         if (this._selectedAttributeItems[i] != null) {
            this._selectedPriceAdd += this._selectedAttributeItems[i].get_price();
         }
      }
   },

   _validateSelectedAttribute: function() {
      var isVal = false;
      if (this._attributes.length > 0) {
         this._selectedAttributeItems = new Array();
         for (var i = 0; i < this._attributes.length; i++) {
            this._selectedAttributeItems[i] = null;
            for (var x = 0; x < this._attributes[i].length; x++) {
               var item = this._attributes[i][x];
               isVal = item.get_selected();
               if (item.get_selected())
                  this._selectedAttributeItems[i] = item;
            }
         }
         isVal = true;
         for (var i = 0; ((i < this._selectedAttributeItems.length) && (isVal == true)); i++) {
            isVal = (this._selectedAttributeItems[i] != null);
         }
      } else {
         isVal = true;
      }
      //Sys.Debug.trace('_validateSelectedAttribute: ' + isVal);

      this._isSelectedAttVal = isVal;
   },

   _validateSku: function() {
      var retVal = false;
      this._selectedSku = '';
      for (var i = 0; i < this._selectedAttributeItems.length; i++) {
         if (this._selectedAttributeItems[i] != null) {
            this._selectedSku += this._selectedAttributeItems[i].get_sku() + this._skuChar;
         }
      }
      if (this._checkInventory && (this._selectedAttributeItems.length>0)) {
         var sku = this.get_Sku();
         for (var i = 0; i < this._skus.length; i++) {
            var item = this._skus[i];
            if (item.get_sku() == sku) {
               retVal = item.get_inStock();
               //Sys.Debug.trace('check: ' + item.get_sku());
            }
         }
         
      } else {
         retVal = true;
      }
      //Sys.Debug.trace('_validateSku: ' + retVal);
      this._isSkuVal = retVal;
   },

   _clearSelectedAtributes: function(idx) {
      for (var i = 0; i < this._attributes[idx].length; i++) {
         var item = this._attributes[idx][i];
         item.set_selected(false);
      }
   },


   set_Enabled: function(val) {
      if (val) {
         this._validateSelectedAttribute();
         this._validateSku();
         this._setHelpText();
      }

      this._enabled = val;
      if (val == true) {
         this._disableEl.style.display = 'none';
      } else {
         if (this._disableEl) {
            this._disableEl.style.display = '';
         } else {
            var el = this.get_element();

            var elLocation = Sys.UI.DomElement.getLocation(el);
            var elBounds = Sys.UI.DomElement.getBounds(el);

            var div = document.createElement('div');
            div.className = 'overlay';

            div.style.width = elBounds.width + 'px';
            div.style.height = elBounds.height + 'px';
            div.style.left = elLocation.x + 'px';
            div.style.top = elLocation.y + 'px';

            this._disableEl = div;
            el.appendChild(div);
         }
      }
   },
   get_Enabled: function() { return this._enabled; },

   get_Price: function() { return this._basePrice + this._selectedPriceAdd; },

   get_Sku: function() {
      var str = '';
      if (this._selectedSku == '') {
         str = this._baseSku;
      } else {
         str = this._baseSku + this._skuChar + this._selectedSku;
         str = str.substring(0, str.length - 1);
      }
      return str;
   },

   set_BaseSku: function(count) { this._baseSku = count; },
   get_BaseSku: function() { return this._baseSku; },

   set_SkuChar: function(val) { this._skuChar = val; },
   get_SkuChar: function() { return this._skuChar; },

   set_BasePrice: function(val) { this._basePrice = val; },
   get_BasePrice: function() { return this._basePrice },

   set_YourSelectionText: function(val) { this._yourSelectionText = val; },
   get_YourSelectionText: function() { return this._yourSelectionText; },

   set_OutOfStockText: function(val) { this._outOfStockText = val; },
   get_OutOfStockText: function() { return this._outOfStockText; },

   set_AttributesCount: function(val) { this._attributesCount = val; },
   get_AttributesCount: function() { return this._attributesCount; },

   set_QtyElement: function(el) { this._qtyElement = el; },
   get_QtyElement: function() { return this._qtyElement; },

   set_AddToCartHelpElement: function(el) { this._addToCartHelpElement = el; },
   get_AddToCartHelpElement: function() { return this._addToCartHelpElement; },

   set_AddToCartSelectionElement: function(el) { this._addToCartSelectionElement = el; },
   get_AddToCartSelectionElement: function() { return this._addToCartSelectionElement; },

   set_AddToCartText: function(val) { this._addToCartText = val; },
   get_AddToCartText: function() { return this._addToCartText; },

   set_AddToCartHelpBaseText: function(val) { this._addToCartHelpBaseText = val; },
   get_AddToCartHelpBaseText: function() { return this._addToCartHelpBaseText; },

   set_AndText: function(val) { this._andText = val; },
   get_AndText: function() { return this._andText; },

   set_PriceText: function(val) { this._priceText = val; },
   get_PriceText: function() { return this._priceText; },

   set_AttributeSelectOptions: function(val) { this._attributeSelectOptions = val; },
   get_AttributeSelectOptions: function() { return this._attributeSelectOptions; },

   set_TargetImageElement: function(val) { this._targetImageElement = val; },
   get_TargetImageElement: function() { return this._targetImageElement; },

   set_TargerLinkElement: function(el) { this._targerLinkElement = el; },
   get_TargerLinkElement: function() { return this._targerLinkElement; },

   set_CheckInventory: function(val) { this._checkInventory = val; },
   get_CheckInventory: function() { return this._checkInventory; },

   set_LocalCurrencyFormat: function(val) { this._localCurrencyFormat = val; },
   get_LocalCurrencyFormat: function() { return this._localCurrencyFormat; }

}
epsilon.attributesBehavior.registerClass('epsilon.attributesBehavior', Sys.UI.Control);


epsilon.attributeItem = function() {
   epsilon.attributeItem.initializeBase(this);
   this._text = '';
   this._sku = '';
   this._price = 0;
   this._imgUrl = '';
   this._linkUrl = '';
   this._selected = false;
}

epsilon.attributeItem.prototype = {

   set_text: function(val) { this._text = val; },
   get_text: function() { return this._text; },

   set_sku: function(val) { this._sku = val; },
   get_sku: function() { return this._sku; },

   set_price: function(val) { this._price = val; },
   get_price: function() { return this._price; },

   set_imgUrl: function(val) { this._imgUrl = val; },
   get_imgUrl: function() { return this._imgUrl; },
   
   set_linkUrl: function(val) { this._linkUrl = val; },
   get_linkUrl: function() { return this._linkUrl; },
   
   set_selected: function(val) { this._selected = val; },
   get_selected: function() { return this._selected; }
}
epsilon.attributeItem.registerClass('epsilon.attributeItem', Sys.Component);

epsilon.skuItem = function() {
   epsilon.skuItem.initializeBase(this);
   this._sku = '';
   this._inStock = true;
}

epsilon.skuItem.prototype = {
   set_sku: function(val) {this._sku = val;},
   get_sku: function() {return this._sku;},
   
   set_inStock: function(val) {this._inStock = val;},
   get_inStock: function() {return this._inStock;}
}
epsilon.skuItem.registerClass('epsilon.skuItem', Sys.Component);
if (typeof(Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();

