public function quoteProductAddAfter($observer)
 {
     $helper = Mage::helper('customoptions');
     if (!$helper->isEnabled() || !$helper->isOptionSkuPolicyEnabled() || !$helper->isOptionSkuPolicyApplyToCart()) {
         return $this;
     }
     $configSkuPolicy = $helper->getOptionSkuPolicyDefault();
     $items = $observer->getEvent()->getItems();
     foreach ($items as $item) {
         $itemChangesFlag = false;
         $itemRemoveFlag = false;
         $product = $item->getProduct();
         // if bad magento))
         if (is_null($product->getHasOptions())) {
             $product->load($product->getId());
         }
         if (!$product->getHasOptions()) {
             continue;
         }
         $productSkuPolicy = $helper->getProductSkuPolicy($product);
         if ($productSkuPolicy == 0) {
             $productSkuPolicy = $configSkuPolicy;
         }
         $post = $helper->getInfoBuyRequest($product);
         if (isset($post['options'])) {
             $options = $post['options'];
         } else {
             $options = false;
         }
         if ($options) {
             foreach ($options as $optionId => $value) {
                 $optionModel = $product->getOptionById($optionId);
                 if (!$optionModel) {
                     continue;
                 }
                 $optionModel->setProduct($product);
                 $customoptionsIsOnetime = $optionModel->getCustomoptionsIsOnetime();
                 $skuPolicy = $optionModel->getSkuPolicy();
                 // or $productSkuPolicy = Grouped
                 if ($skuPolicy == 0 || $productSkuPolicy == 3) {
                     $skuPolicy = $productSkuPolicy;
                 }
                 if ($skuPolicy == 1) {
                     continue;
                 }
                 switch ($optionModel->getType()) {
                     case 'drop_down':
                     case 'radio':
                     case 'checkbox':
                     case 'multiple':
                     case 'swatch':
                     case 'multiswatch':
                     case 'hidden':
                         if (is_array($value)) {
                             $optionTypeIds = $value;
                         } else {
                             $optionTypeIds = explode(',', $value);
                         }
                         foreach ($optionTypeIds as $index => $optionTypeId) {
                             if (!$optionTypeId) {
                                 continue;
                             }
                             $valueModel = $optionModel->getValueById($optionTypeId);
                             $sku = $valueModel->getSku();
                             if (!$sku) {
                                 continue;
                             }
                             $productIdBySku = $helper->getProductIdBySku($sku);
                             if (!$productIdBySku) {
                                 continue;
                             }
                             if ($skuPolicy == 2 || $skuPolicy == 3) {
                                 // Independent, Grouped
                                 // add new product by $productIdBySku
                                 if (isset($post['options_' . $optionId . '_qty'])) {
                                     $optionQty = intval($post['options_' . $optionId . '_qty']);
                                 } elseif (isset($post['options_' . $optionId . '_' . $optionTypeId . '_qty'])) {
                                     $optionQty = intval($post['options_' . $optionId . '_' . $optionTypeId . '_qty']);
                                 } else {
                                     $optionQty = 1;
                                 }
                                 $optionTotalQty = $customoptionsIsOnetime ? $optionQty : $optionQty * $item->getQty();
                                 $request = new Varien_Object();
                                 $request->setQty($optionTotalQty);
                                 $optionResourceModel = $optionModel->getResource();
                                 $request->setSkuPolicyName($optionResourceModel->getValueTitle($optionTypeId, $item->getStoreId()));
                                 if ($helper->isWeightEnabled()) {
                                     $request->setSkuPolicyWeight($valueModel->getWeight());
                                 }
                                 if ($helper->isCostEnabled()) {
                                     $request->setSkuPolicyCost($valueModel->getCost());
                                 }
                                 //$item->getQuote() or Mage::getSingleton('checkout/cart')
                                 $result = $item->getQuote()->addProduct(Mage::getModel('catalog/product')->setStoreId($item->getStoreId())->load($productIdBySku), $request);
                                 if (!is_object($result)) {
                                     continue;
                                 }
                                 // remove option or optionValue from item
                                 if (is_array($value)) {
                                     unset($value[$index]);
                                 } else {
                                     $value = '';
                                 }
                                 if ($value) {
                                     // if remove optionValue
                                     $post['options'][$optionId] = $value;
                                     $itemOption = $item->getOptionByCode('option_' . $optionId);
                                     $itemOption->setValue(is_array($value) ? implode(',', $value) : $value);
                                     $item->addOption($itemOption);
                                 } else {
                                     // if remove option
                                     unset($post['options'][$optionId]);
                                     $item->removeOption('option_' . $optionId);
                                     $itemOptionIds = $item->getOptionByCode('option_ids');
                                     $optionIds = $itemOptionIds->getValue();
                                     if ($optionIds) {
                                         $optionIds = explode(',', $optionIds);
                                         $i = array_search($optionId, $optionIds);
                                         if ($i !== false) {
                                             unset($optionIds[$i]);
                                         }
                                         if ($optionIds) {
                                             $optionIds = implode(',', $optionIds);
                                         }
                                     }
                                     if ($optionIds) {
                                         $itemOptionIds->setValue($optionIds);
                                         $item->addOption($itemOptionIds);
                                     } else {
                                         $item->removeOption('option_ids');
                                     }
                                 }
                                 $infoBuyRequest = $item->getOptionByCode('info_buyRequest');
                                 $infoBuyRequest->setValue(serialize($post));
                                 $item->addOption($infoBuyRequest);
                                 // end remove option from item
                                 $itemChangesFlag = true;
                                 if ($skuPolicy == 3) {
                                     $itemRemoveFlag = true;
                                 }
                             } elseif ($skuPolicy == 4) {
                                 $infoBuyRequest = $item->getOptionByCode('info_buyRequest');
                                 $post['sku_policy_sku'] = $sku;
                                 $infoBuyRequest->setValue(serialize($post));
                                 $item->addOption($infoBuyRequest);
                             }
                         }
                         break;
                     default:
                         if (!$value) {
                             continue;
                         }
                         $sku = $optionModel->getSku();
                         if (!$sku) {
                             continue;
                         }
                         $productIdBySku = $helper->getProductIdBySku($sku);
                         if (!$productIdBySku) {
                             continue;
                         }
                         if ($skuPolicy == 2 || $skuPolicy == 3) {
                             // Independent, Grouped
                             // add new product by $productIdBySku
                             $optionTotalQty = $customoptionsIsOnetime ? 1 : $item->getQty();
                             $request = new Varien_Object();
                             $request->setQty($optionTotalQty);
                             $optionResourceModel = $optionModel->getResource();
                             $request->setSkuPolicyName($optionResourceModel->getTitle($optionId, $item->getStoreId()));
                             //$item->getQuote() or Mage::getSingleton('checkout/cart')
                             $result = $item->getQuote()->addProduct(Mage::getModel('catalog/product')->setStoreId($item->getStoreId())->load($productIdBySku));
                             if (!is_object($result)) {
                                 continue;
                             }
                             // remove option from item
                             unset($post['options'][$optionId]);
                             $item->removeOption('option_' . $optionId);
                             $itemOptionIds = $item->getOptionByCode('option_ids');
                             $optionIds = $itemOptionIds->getValue();
                             if ($optionIds) {
                                 $optionIds = explode(',', $optionIds);
                                 $i = array_search($optionId, $optionIds);
                                 if ($i !== false) {
                                     unset($optionIds[$i]);
                                 }
                                 if ($optionIds) {
                                     $optionIds = implode(',', $optionIds);
                                 }
                             }
                             if ($optionIds) {
                                 $itemOptionIds->setValue($optionIds);
                                 $item->addOption($itemOptionIds);
                             } else {
                                 $item->removeOption('option_ids');
                             }
                             $infoBuyRequest = $item->getOptionByCode('info_buyRequest');
                             $infoBuyRequest->setValue(serialize($post));
                             $item->addOption($infoBuyRequest);
                             // end remove option from item
                             $itemChangesFlag = true;
                             if ($skuPolicy == 3) {
                                 $itemRemoveFlag = true;
                             }
                         } elseif ($skuPolicy == 4) {
                             $infoBuyRequest = $item->getOptionByCode('info_buyRequest');
                             $post['sku_policy_sku'] = $sku;
                             $infoBuyRequest->setValue(serialize($post));
                             $item->addOption($infoBuyRequest);
                         }
                         break;
                 }
             }
         }
         if ($itemRemoveFlag) {
             $itemsCollection = $item->getQuote()->getItemsCollection();
             foreach ($itemsCollection as $key => $itm) {
                 if ($itm === $item) {
                     $itemsCollection->removeItemByKey($key);
                 }
             }
         } elseif ($itemChangesFlag) {
             // update item
             $quote = $item->getQuote();
             $itemsCollection = $quote->getItemsCollection();
             $itemRemoveFlag = false;
             foreach ($itemsCollection as $key => $itm) {
                 if ($itm->getProductId() == $item->getProductId() && $itm !== $item) {
                     // get current $item - $options
                     if (isset($post['options'])) {
                         $options = $post['options'];
                     } else {
                         $options = false;
                     }
                     // get other $itm - $optns
                     $prdct = $itm->getProduct();
                     // if bad magento))
                     if (is_null($prdct->getHasOptions())) {
                         $prdct->load($prdct->getId());
                     }
                     $optns = false;
                     if ($prdct->getHasOptions()) {
                         $post = $helper->getInfoBuyRequest($prdct);
                         if (isset($post['options'])) {
                             $optns = $post['options'];
                         }
                     }
                     // compare options
                     if ($optns === $options) {
                         $itm->setQty($itm->getQty() + $item->getQty());
                         $itemRemoveFlag = true;
                     }
                 }
                 if ($itemRemoveFlag && $itm === $item) {
                     $itemsCollection->removeItemByKey($key);
                 }
             }
         }
     }
 }