function ProductClass(productPKey, productCode, productName, productPrice, productReducedPrice, productWeight, variantL1PKey, variantL1Code, variantL1Name, variantL1DeltaPrice, variantL1DeltaWeight, variantL2PKey, variantL2Code, variantL2Name, variantL2DeltaPrice, variantL2DeltaWeight, productPriceElementId, urlProductPriceFragment, productImageElementId, urlProductImageFragment, variantL1TableId, variantL1BaseNameLogoSelectorId, variantL2TableId, variantL2BaseNameLogoSelectorId, cascadeVariantL2ElementId, urlCascadeVariantL2Fragment, variantL1ComboId, variantL2ComboId, productInsertionTimeStamp) 
{ 
  var _product = this;
	
  this.productPKey = productPKey;
  this.productCode = productCode;
  this.productName = productName;
  this.productPrice = productPrice;
  this.productReducedPrice = productReducedPrice;
  this.productWeight = productWeight;
  this.productInsertionTimeStamp = productInsertionTimeStamp;
    
  this.variantL1PKey = variantL1PKey;
  this.variantL1Code = variantL1Code;
  this.variantL1Name = variantL1Name;
  this.variantL1DeltaPrice = variantL1DeltaPrice;
  this.variantL1DeltaWeight = variantL1DeltaWeight;
    
  this.variantL2PKey = variantL2PKey;                  
  this.variantL2Code = variantL2Code;
  this.variantL2Name = variantL2Name;
  this.variantL2DeltaPrice = variantL2DeltaPrice;
  this.variantL2DeltaWeight = variantL2DeltaWeight;
  
  this.productPriceElementId = productPriceElementId;
  this.urlProductPriceFragment = urlProductPriceFragment;
  
  this.productImageElementId = productImageElementId;    
  this.urlProductImageFragment = urlProductImageFragment;
  
  this.variantL1TableId = variantL1TableId;
  this.variantL1BaseNameLogoSelectorId = variantL1BaseNameLogoSelectorId;
  
  this.variantL2TableId = variantL2TableId;
  this.variantL2BaseNameLogoSelectorId = variantL2BaseNameLogoSelectorId;
  
  this.cascadeVariantL2ElementId = cascadeVariantL2ElementId;
  this.urlCascadeVariantL2Fragment = urlCascadeVariantL2Fragment;
  
  this.variantL1ComboId = variantL1ComboId;  
  this.variantL2ComboId = variantL2ComboId;
  
  this.updatePrice = function() 
  {
	if ($(_product.productPriceElementId) != null)
    {              
      new Ajax.Updater(
        _product.productPriceElementId, 
        UIObj.absRoot + '/' + _product.urlProductPriceFragment + UIObj.addJSessionId(), 
        { 
          method: 'post', 
          onFailure: UIObj.failureAjaxUpdater,
          parameters: 
          {
            productPrice: _product.productPrice,
            productReducedPrice: _product.productReducedPrice,
            variantL1DeltaPrice: _product.variantL1DeltaPrice,
            variantL2DeltaPrice: _product.variantL2DeltaPrice
          }, 
          evalScripts: true 
        }
      );  
    }
  }
  
  this.onClickLogoVariantL1 = function (selectedLogoL1,variantL1Code,variantL1PKey,variantL1DeltaPrice,variantL1Name,variantL1DeltaWeight,isL2Cascade,variantL2ViewType) 
  {
    _product.variantL1Code =  variantL1Code;
    _product.variantL1PKey = variantL1PKey;
    _product.variantL1DeltaPrice = variantL1DeltaPrice;
    _product.variantL1Name = variantL1Name;
    _product.variantL1DeltaWeight = variantL1DeltaWeight;
    
    var logoTableNode = $(_product.variantL1TableId);
    var logoTableImages = logoTableNode.getElementsByTagName('img');
    for(var i=0; i<logoTableImages.length; i++)
    {
      if (logoTableImages[i].id.indexOf(_product.variantL1BaseNameLogoSelectorId) != -1)
      {
        logoTableImages[i].style.display='none';
      }  
    }                            
    $(selectedLogoL1).style.display='block';
    
    if (isL2Cascade)
    {
      if ($(_product.cascadeVariantL2ElementId) != null)
      {                                      
        new Ajax.Updater(
          _product.cascadeVariantL2ElementId,
          UIObj.absRoot + '/' + _product.urlCascadeVariantL2Fragment + UIObj.addJSessionId(), 
          {                                                    
            method: 'post', 
            onFailure: UIObj.failureAjaxUpdater,
            parameters: 
            {
              variantViewType2: variantL2ViewType, 
              productCode: _product.productCode, 
              variantL1Code: _product.variantL1Code                     
            }, 
            evalScripts: true
          }
        );
      }
      else
      {
        _product.updatePrice();
      }
    }
    else
    {
      _product.updatePrice();
    }	
    
    if ($(_product.productImageElementId) != null)
    {      
      new Ajax.Updater(
        _product.productImageElementId, 
        UIObj.absRoot + '/' + _product.urlProductImageFragment + UIObj.addJSessionId(), 
        { 
          method: 'post', 
          onFailure: UIObj.failureAjaxUpdater,
          parameters: 
          {
            variantL1PKey: _product.variantL1PKey,
            productPKey: _product.productPKey
          }, 
          evalScripts: true 
        }
      );                                            
    }
  }
  
  this.onChangeComboVariantL1 = function(comboIndexL1,arrayInput1L1,arrayInput2L1,arrayInput3L1,arrayInput4L1,isL2Cascade,variantL2ViewType) 
  {
    _product.variantL1Code =  $(_product.variantL1ComboId)[comboIndexL1].value;
    _product.variantL1DeltaPrice = arrayInput2L1[comboIndexL1];                    
    _product.variantL1PKey = arrayInput1L1[comboIndexL1];
    _product.variantL1Name = arrayInput3L1[comboIndexL1];
    _product.variantL1DeltaWeight = arrayInput4L1[comboIndexL1];
    
    if (isL2Cascade)
    {
      if ($(_product.cascadeVariantL2ElementId) != null)
      {                            
        new Ajax.Updater(
          _product.cascadeVariantL2ElementId,
          UIObj.absRoot + '/' + _product.urlCascadeVariantL2Fragment + UIObj.addJSessionId(), 
          {                                                    
            method: 'post',           
            onFailure: UIObj.failureAjaxUpdater,
            parameters: 
            {
              variantViewType2: variantL2ViewType, 
              productCode: _product.productCode, 
              variantL1Code: _product.variantL1Code                     
            }, 
            evalScripts: true
          }
        );
      }
      else
      {
        _product.updatePrice();
      }
    }
    else
    {
      _product.updatePrice();
    }
   
    if ($(_product.productImageElementId) != null)
    {      
      new Ajax.Updater(
        _product.productImageElementId, 
        UIObj.absRoot + '/' + _product.urlProductImageFragment + UIObj.addJSessionId(), 
        { 
          method: 'post', 
          onFailure: UIObj.failureAjaxUpdater,
          parameters: 
          {
            variantL1PKey: _product.variantL1PKey,
            productPKey: _product.productPKey
          }, 
          evalScripts: true 
        }
      );                                            
    }
  }
  
  this.onClickLogoVariantL2 = function(selectedLogoL1,variantL2Code,variantL2PKey,variantL2DeltaPrice,variantL2Name,variantL2DeltaWeight) 
  {
    _product.variantL2PKey = variantL2PKey;
    _product.variantL2Code = variantL2Code;
    _product.variantL2DeltaPrice = variantL2DeltaPrice;
    _product.variantL2Name = variantL2Name;
    _product.variantL2DeltaWeight = variantL2DeltaWeight;
    
    _product.updatePrice();               
    
    var logoTableNode = $(_product.variantL2TableId);
    var logoTableImages = logoTableNode.getElementsByTagName('img');
    for(var i=0; i<logoTableImages.length; i++)
    {
      if (logoTableImages[i].id.indexOf(_product.variantL2BaseNameLogoSelectorId) != -1)
      {
        logoTableImages[i].style.display='none';
      }  
    }                            
    $(selectedLogoL1).style.display='block';                   
  }
  
  this.onChangeComboVariantL2 = function(comboIndexL2, arrayInput1L2, arrayInput2L2, arrayInput3L2, arrayInput4L2) 
  {
    _product.variantL2PKey = arrayInput1L2[comboIndexL2];
    _product.variantL2Code =  $(_product.variantL2ComboId)[comboIndexL2].value;
    _product.variantL2DeltaPrice = arrayInput2L2[comboIndexL2];                      
    _product.variantL2Name = arrayInput3L2[comboIndexL2];
    _product.variantL2DeltaWeight = arrayInput4L2[comboIndexL2];
    
    _product.updatePrice();
  }
}

function CartClass(cartItemsElementId, urlCartItemsFragment, cartCheckListElementId, urlCartCheckListFragment, cartCheckListWrongFieldsId) 
{
  var _cart = this;
  
  this.cartItemsElementId = cartItemsElementId;
  this.urlCartItemsFragment = urlCartItemsFragment;
  this.cartCheckListElementId = cartCheckListElementId;
  this.urlCartCheckListFragment = urlCartCheckListFragment;
  this.cartCheckListWrongFieldsId = cartCheckListWrongFieldsId;	
  
  this.refresh = function()
  {
	if ($(_cart.cartItemsElementId) != null)
    {          
      new Ajax.Updater(
        _cart.cartItemsElementId, 
        UIObj.absRoot + '/' + _cart.urlCartItemsFragment + UIObj.addJSessionId(), 
        { 
          method: 'post', 
          onFailure: UIObj.failureAjaxUpdater,
          parameters: 
          {
            action: 'refresh'
          }, 
          evalScripts: true
        }
      );        
    }
  }
  
  this.removeItem = function(productPKey, variantL1PKey, variantL2PKey)
  {
    if ($(_cart.cartItemsElementId) != null)
    {          
      new Ajax.Updater(
        _cart.cartItemsElementId,
        UIObj.absRoot + '/' + _cart.urlCartItemsFragment + UIObj.addJSessionId(), 
        { 
          method: 'post', 
          onFailure: UIObj.failureAjaxUpdater,
          parameters: 
          {
            action: 'removeItem',
            productPKey: productPKey,
            variantL1PKey: variantL1PKey,
            variantL2PKey: variantL2PKey          
          }, 
          evalScripts: true
        }
      );        
    }  
  }
  
  this.emptyCart = function()
  {
    if ($(_cart.cartItemsElementId) != null)
    {          
      new Ajax.Updater(
        _cart.cartItemsElementId, 
        UIObj.absRoot + '/' + _cart.urlCartItemsFragment + UIObj.addJSessionId(), 
        { 
          method: 'post', 
          onFailure: UIObj.failureAjaxUpdater,
          parameters: 
          {
            action: 'emptyCart'
          }, 
          evalScripts: true
        }
      );        
    }
  }
  
  this.addItem = function(productPKey,variantL1PKey,variantL2PKey,productAmount,productTotalPrice,productTotalWeight,productName,variantL1Name,variantL2Name,productInsertionTimeStamp)
  {  
    if ($(_cart.cartItemsElementId) != null)
    { 
      new Ajax.Updater(
        _cart.cartItemsElementId, 
        UIObj.absRoot + '/' + _cart.urlCartItemsFragment + UIObj.addJSessionId(), 
        { 
          method: 'post', 
          onFailure: UIObj.failureAjaxUpdater,
          parameters: 
          {
            action: 'addItem',
            productPKey: productPKey,
            variantL1PKey: variantL1PKey,
            variantL2PKey: variantL2PKey,          
            productAmount: productAmount,          
            productTotalPrice: productTotalPrice,
            productTotalWeight: productTotalWeight,
            productName: productName,
            variantL1Name: variantL1Name,
            variantL2Name: variantL2Name,
            productInsertionTimeStamp: productInsertionTimeStamp
          }, 
          evalScripts: true
        }
      );        
    }
  }
  
  this.checklistRefresh = function()
  {
    if ($(_cart.cartCheckListElementId) != null)
    {      
      new Ajax.Updater(
    	_cart.cartCheckListElementId, 
    	UIObj.absRoot + '/' + _cart.urlCartCheckListFragment + UIObj.addJSessionId(), 
        { 
          method: 'post', 
          onFailure: UIObj.failureAjaxUpdater,
          evalScripts: true 
        }
      );
    }
  }
  
  this.checkListRemoveItem = function(productPKey, variantL1PKey, variantL2PKey)
  {
    if ($(_cart.cartCheckListElementId) != null)
    {      
      new Ajax.Updater(
    	_cart.cartCheckListElementId, 
    	UIObj.absRoot + '/' + _cart.urlCartCheckListFragment + UIObj.addJSessionId(), 
        { 
          method: 'post', 
          onFailure: UIObj.failureAjaxUpdater,
          parameters: 
          {
            productPKey: productPKey,
            variantL1PKey: variantL1PKey,
            variantL2PKey: variantL2PKey,
            remove: true
          }, 
          evalScripts: true 
        }
      );
    }
  }
  
  this.checkListChangeAmountItem = function(productPKey, variantL1PKey, variantL2PKey, amount)
  {
    amount = parseInt(amount); 
    if(isNaN(amount) || (amount <= 0))
    {
      _cart.checklistRefresh();
    }
    else
    {
      if ($(_cart.cartCheckListElementId) != null)
      {      
        new Ajax.Updater(
          _cart.cartCheckListElementId, 
          UIObj.absRoot + '/' + _cart.urlCartCheckListFragment + UIObj.addJSessionId(), 
          { 
            method: 'post', 
            onFailure: UIObj.failureAjaxUpdater,            
            parameters: 
            {
              productPKey: productPKey,
              variantL1PKey: variantL1PKey,
              variantL2PKey: variantL2PKey,
              amount: amount
            }, 
            evalScripts: true 
          }
        );
      }        
    }
  }
  
  this.checkOut = function(amountCart, urlCheckOut)
  {
    if (isNaN(amountCart) || (amountCart <= 0))
    {
      if ($(_cart.cartCheckListWrongFieldsId) != null)
      {
        $(_cart.cartCheckListWrongFieldsId).style.display='inLine';
      }
    }
    else
    {
      location.href = urlCheckOut;
    }
  }
}
