/**
 * カート制御用JavaScript
 *
 */

/**
 * cart Object
 *
 */
var cart = {

    /**
     * products
     * Cookieに残す商品情報
     * Cookieにサイズ制限があるためカート内商品情報のみCookieに残す
     *
     */
    products: [],

    /**
     * merged
     * 商品情報を商品ごとにマージした情報
     *
     */
    merged: {},

    /**
     * Ajaxで取得する商品情報のキャッシュ
     *
     *
     */
    productsCache: {},

    /**
     * catrs/viewで削除された商品
     *
     */
    removed: [],

    /**
     * gifts
     * Cookieに残すギフト対象商品情報
     * Cookieにサイズ制限があるためカート内商品情報のみCookieに残す
     *
     */
    gifts: {},

    /**
     * separatedIds
     * お届け先を分けた商品情報
     * catrs/multi_address_and_paymentで使用する
     *
     */
    separatedIds: {},

    /**
     * total_price
     * 合計金額
     *
     */
    total_price: 0,

    /**
     * initialize
     * ページ表示時の初期化処理
     * Cookie情報からself.productsをセットする
     * @deferred true
     *
     */
    initialize: function(){
        //$.cookie('products',null);
        var self = this;
        return $.deferred
            .next(function () {
                      // self.products
                      if (global.session.products != undefined && global.session.products instanceof Array && global.session.products.length > 0) {
                          self.products = global.session.products;

                          if (self.products == null) {
                              self.products = [];
                          }

                          // Cookieに保持
                          var cookie_products = [];
                          self.products.map(function(i) {
                                                if (i) {//nullの場合を排除
                                                    cookie_products.push(i.id);
                                                }
                                            });
                          var str = $.toJSON(cookie_products);
                          $.cookie('products', str, {expires:30, path:'/'});
                          return true;
                      } else {
                          return self.getProducts();
                      }
                  })
            .next(function () {
                      // G&Mの商品とわける
                      var len = self.products.length;
                      for (j = len -1; j >= 0; j--) {
                          if (self.products[j]) {
                              if (self.products[j].is_guestandme == ((is_gm) ? '0' : '1')) {
                                  self.products.splice(j,1);
                              }
                          }
                      }
                  })
            .next(function () {
                      debug('self.renderHeaderInfo');
                      self.renderHeaderInfo();
                      self.renderProgressBar();
                  })
            .next(function () {
                      // self.removed
                      self.removed = ($.cookie('removed')) ? $.secureEvalJSON($.cookie('removed')) : [];
                      // self.gifts
                      self.gifts = ($.cookie('gifts')) ? $.secureEvalJSON($.cookie('gifts')) : {};

                      // self.separatedIds
                      self.separatedIds = ($('input#separated_ids_json_str').val()) ? $.secureEvalJSON($('input#separated_ids_json_str').val()) : {};
                      if (global.session.productsCache != undefined && global.session.productsCache.length > 0) {
                          debug('use cache productsCache');
                          global.session.productsCache.map(function(i) {
                                                               self.productsCache[i.Product.id] = i;
                                                           });
                          return true;
                      } else {
                          var ids = [];
                          self.products.map(function(i){
                                                ids.push(i.id);
                                            });
                          //getProductsForCache
                          self.getProductsForCache(ids);
                      }

                      self.removed.map(function(i){

                                       });

                  })
            .next(function () {
                      // Add Event
                      $('.addCartBtn').live('click',function() {
                                                self.addCartFront(this);
                                            });
                      // Add Event
                      $('.addRelatedProduct').live('click',function() {
                                                       var elm = this;
                                                       $.deferred
                                                           .next(function() {
                                                                     return self.addCartFront(elm);
                                                                 })
                                                           .next(function() {
                                                                     self.renderCart();
                                                                 });
                                                   });
                  })
            .next(function () {
                      debug(self.products,'self.products');
                      debug(self.gifts,'self.gifts');
                  })
            .error(function (e) {
                       debug(e);
                       var option = {
                           error_type:'session',
                           file:'carts.js',
                           line:0
                       }
                       error_handler('Initialize Error:' + e, option);
                   });
    },

    /**
     * frontInitialize
     *
     * @deferred true
     */
    frontInitialize: function() {
        var self = this;
        return $.deferred
            .next(function () {
                      // Add Event
                      $('.addCartBtn').live('click',function() {
                                                self.addCartFront(this);
                                            });
                      // Add Event
                      $('.addRelatedProduct').live('click',function() {
                                                       var elm = this;
                                                       $.deferred
                                                           .next(function() {
                                                                     return self.addCartFront(elm);
                                                                 })
                                                           .next(function() {
                                                                     self.renderCart();
                                                                 });
                                                   });
                  })
            .next(function () {
                      // self.products
                      if (global.session.products != undefined && global.session.products instanceof Array && global.session.products.length > 0) {
                          self.products = global.session.products;

                          // Cookieに保持
                          var cookie_products = [];
                          self.products.map(function(i) {
                                                cookie_products.push(i.id);
                                            });
                          var str = $.toJSON(cookie_products);

                          $.cookie('products', str, {expires:30, path:'/'});
                          return true;
                      } else {
                          return self.getProducts();
                      }
                  })
            .next(function () {
                      debug('self.renderHeaderInfo');
                      self.renderHeaderInfo();
                  })
            .next(function () {
                      debug(self.products,'self.products');
                      debug(self.gifts,'self.gifts');
                  })
            .error(function (e) {
                       debug(e);
                       var option = {
                           error_type:'session',
                           file:'carts.js',
                           line:0
                       };
                       error_handler('Initialize Error:' + e, option);
                   });
    },

    /**
     * getProducts
     *
     * @deferred true
     */
    getProducts: function() {
        var self = this;
        var url = global.baseUrl + 'carts/getProducts';

        // Cookieから情報取得を試みる
        var cookie_products;
        try {
            cookie_products = ($.cookie('products')) ? $.secureEvalJSON($.cookie('products')) : null;
        } catch (e){
            debug(e);
            cookie_products = [];
        }
        if (cookie_products) {
            self.revertProducts(cookie_products);
        } else {
            return $.ajax({
                              type:'GET',
                              url:url,
                              cache:false,
                              success:function(res) {
                                  return res;
                              },
                              error:function(res) {
                                  $.deferred.ng('getProducts Ajax Error:' + res);
                              }
                          })
                .next(function(res) {
                          if (res == 'Error') {
                              $.deferred.ng('getProducts Responce Error');
                          }
                          //parse JSON response
                          try {
                              self.products = $.secureEvalJSON(res);

                              var len = self.products.length;

                              // Guest&ME 判定
                              for (j = len -1; j >= 0; j--) {
                                  if (is_gm) {
                                      if (self.products[j].is_guestandme == 0) {
                                          self.products.splice(j,1);
                                      }
                                  } else {
                                      if (self.products[j].is_guestandme == 1) {
                                          self.products.splice(j,1);
                                      }
                                  }
                              }

                              // Cookieに保持
                              $.cookie('products',res,{expires:30, path:'/'});
                              return true;
                          } catch (e) {
                              $.deferred.ng('getProducts JSON Error' + e);
                          }
                      });
        }
    },

    /**
     * revertProducts
     * セッション情報がなくCookieだけしか保持していない場合に発動
     *
     * @param Array ids
     */
    revertProducts: function(ids) {
        var self = this;
        var url = global.baseUrl + 'carts/revertProducts/' + $.toJSON(ids);

        return $.ajax({
                          type:'GET',
                          url:url,
                          cache:false,
                          async:false, //確実に情報を取得するため同期にしている
                          success:function(res) {
                              if (res == 'Error') {
                                  debug(__('Error:getProductsForCache'));
                                  return false;
                              }

                              //parse JSON response
                              try {
                                  productsObj = $.secureEvalJSON(res);
                                  debug(productsObj,'productsObj');
                              } catch (e) {
                                  debug(e, 'getProductsForCache');
                                  debug(__('Error:getProductsForCache'));
                                  return false;
                              }
                              if (productsObj == []) {
                                  return false;
                              }
                              self.products = productsObj;
                              return true;
                          },
                          error:function(res) {
                              debug(__('Error:getProductsForCache'));
                              return false;
                          }
                      });
    },

    /**
     * setProducts
     *
     */
    setProducts: function() {
        var self = this;
        // self.productsからcookieに保存するため不必要な情報を抜く
        var cookie_products = [];
        self.products.map(function(i) {
                              if (i) {
                                  cookie_products.push(i.id);
                              }
                          });
        var str = $.toJSON(cookie_products);
        $.cookie('products', str, {expires:30, path:'/'});
        str = $.toJSON(self.products);
        var url = global.baseUrl + 'carts/setProducts';
        $.ajax({
                   type:'POST',
                   url:url,
                   cache:false,
                   data:{
                       products:str
                   },
                   async:false,
                   success:function(res) {
                       if (res == 'Error') {
                           debug(__('Error:setProducts'));
                           return false;
                       }
                       self.renderHeaderInfo();
                       return true;
                   },
                   error:function(res) {
                       debug(__('Error:setProducts'));
                       return false;
                   }
               });
    },

    /**
     * renderProgressBar
     * ギフト指定のボタン切り替え
     *
     * @deferred false
     */
    renderProgressBar: function() {
        var self = this;
        var is_gift = false;
        self.products.forEach(function (product) {
                                  if (product.g == 1) {
                                      is_gift = true;
                                  }
                              });
        if (self.products.length == 0 && $.cookie('is_gift') == '1') {
            is_gift = true;
        }
        debug(is_gift, 'is_gift');
        if (is_gift) {
            $('.progressBar-gift').show();

            // ギフト指定のボタン切り替え
            $(".button-to-wrapping").show();
            $(".button-to-purchase-conf").hide();

            $.cookie('is_gift','1',{expires:30, path:'/'});
        } else {
            $('.progressBar-cart').show();

            // ギフト指定のボタン切り替え
            $(".button-to-wrapping").hide();
            $(".button-to-purchase-conf").show();

            $.cookie('is_gift','0',{expires:30, path:'/'});
        }

    },

    /**
     * renderHeaderInfo
     * ヘッダー情報に価格を組み込む
     *
     * @deferred false
     */
    renderHeaderInfo: function() {
        var self = this;
        var count = 0;
        var total_price = 0;
        var mem_total_price = 0;
        var carriage_free = 0;
        self.products.forEach(function (product) {
                                  if (product.is_guestandme == 0) {
                                      count++;
                                      total_price += parseInt(product.t_inc);
                                      mem_total_price += parseInt(product.m_t_inc);
                                      if (parseInt(product.c_free) == 1) {
                                          carriage_free = 1;
                                      }
                                  }
                              });

        /**
         *  headerへのレンダリング
         */
        $('span#header_products_count').text(count);

        if (count == 0) {
            $('#orderDetails-fukidashi').hide();
        } else {
            $('#orderDetails-fukidashi').show();
        }

        if (total_price < 5000) {
            $('span#free_countdown').text(commaNumber(5000 - total_price));
            $('#header_free').hide();
            $('#header_free_countdown').show();
        } else {
            $('#header_free').show();
            $('#header_free_countdown').hide();
        }

        if (is_web_member) {
            $('span#header_total_price').text(commaNumber(mem_total_price));
        } else {
            $('span#header_total_price').text(commaNumber(total_price));
        }

        if (carriage_free == 1) {
            $('#header_free').show();
            $('#header_free_countdown').hide();
        }

        // carts/view
        // carts/customer_info
        if ((total_price - mem_total_price) == 0) {
            $('#web_member_notice').show();
            $('#mem_discount_notice').hide();
        } else  {
            $('#web_member_notice').hide();
            $('#mem_discount_notice').show();
            $('span#member_discount').text(commaNumber(total_price - mem_total_price));
        }
    },

    /**
     * clearProducts
     *
     */
    clearProducts: function() {
        var self = this;
        var str = $.toJSON(self.products);
        var url = global.baseUrl + 'carts/clearProducts';
        $.ajax({
                   type:'POST',
                   url:url,
                   cache:false,
                   timeout:5000,
                   success:function(res) {
                       if (res == 'Error') {
                           debug(__('Error:setProducts'));
                           return false;
                       }
                       cart.products = [];
                       return true;
                   },
                   error:function(res) {
                       debug(__('Error:setProducts'));
                       return false;
                   }
               });
    },

    /**
     * getProductsForCache
     *
     * @param Array ids
     */
    getProductsForCache: function(ids){
        if (!$.isArray(ids)) {
            return false;
        }
        var self = this;
        debug(ids,'ids');
        //get product info for cache
        var url = global.baseUrl + 'products/getProductsForCache/' + $.toJSON(ids);
        $.ajax({
                   type:'GET',
                   url:url,
                   cache:false,
                   async:false, //確実に情報を取得するため同期にしている
                   success:function(res) {
                       if (res == 'Error') {
                           debug(__('Error:getProductsForCache'));
                           return false;
                       }

                       //parse JSON response
                       try {
                           productsObj = $.secureEvalJSON(res);
                           debug(productsObj,'productsObj');
                       } catch (e) {
                           debug(e, 'getProductsForCache');
                           debug(__('Error:getProductsForCache'));
                           return false;
                       }
                       if (productsObj == []) {
                           return false;
                       }
                       productsObj.map(function(i) {
                                           self.productsCache[i.Product.id] = i;
                                       });
                       return true;
                   },
                   error:function(res) {
                       debug(__('Error:getProductsForCache'));
                       return false;
                   }
               });

        return true;
    },

    /**
     * addCartFront
     *
     * @deferred true
     */
    addCartFront: function(elm) {
        var self = this;
        return $.deferred
            .next(function () {
                      var id = $(elm).attr('id').replace(/addCartBtn_/,'');
                      debug(id,'id');
                      var uniq_name = id.replace(/_.+$/,'');

                      if ($('#addCartAsGift_' + id) && uniq_name) {
                          if ($('#addCartAsGift_' + id).attr('checked')) {
                              return self.addCartAsGift(uniq_name);
                          } else {
                              return self.addCart(uniq_name);
                          }
                      } else {
                          return self.addCart(uniq_name);
                      }
                  })
            .next(function() {
                      self.renderHeaderInfo();
                  });
    },

    /**
     * addCart
     * カートに商品情報をいれるための関数
     * onClickで使用されることを想定する
     *
     * @param Integer product_id
     *
     */
    addCart: function(product_id,is_gift) {
        var self = this;
        if (is_gift) {
            is_gift = 1;
        } else {
            is_gift = 0;
        }

        //get product info
        var url = global.baseUrl + 'carts/addCart/' + product_id + '/' + is_gift;
        return $.ajax({
                          type:'GET',
                          url:url,
                          cache:false,
                          timeout:10000,
                          success:function(res) {
                              return res
                          },
                          error:function(res) {
                              //show flash message
                              self.showFlashMessage(__('Error:Add Cart'));
                              return res;
                          }
                      })
            .next(function(res) {
                      if (res == 'Error') {
                          self.showFlashMessage(__('Error:Add Cart'));
                          return false;
                      }
                      if (res == 'disabled') {
                          self.showFlashMessage(__('Error:Disabled Product'));
                          return false;
                      }

                      //parse JSON response
                      try {
                          productObj = $.secureEvalJSON(res);
                      } catch (e) {
                          self.showFlashMessage(__('Error:Add Cart'));
                          return false;
                      }

                      //push product
                      var result = self.pushProduct(productObj);
                      if (result === true) {
                          if (is_gift == 1) {
                              self.pushGift(productObj.id);
                          }

                          //show flash message
                          self.showFlashMessage(__('Add Cart'), true);
                          return res;
                      } else {
                          switch (result) {
                          case 'family_limit_product_exist':
                              self.showFlashMessage(__('Error:Family Limit', false));
                              break;
                          case 'limit_over_product_exist':
                              self.showFlashMessage(__('Error:Limit Over', false));
                              break;
                          default:
                              break;
                          }
                          return false;
                      }
                  })
            .next(function(res) {
                      self.setProducts();
                  })
            .error(function(e) {
                       var option = {
                           file:'cart.js',
                           line:0,
                           error_type:'ajax'
                       }
                       error_handler('addCart Error:' + e, option);
                   });
    },

    /**
     * addCartAsGift
     * カートにギフト商品情報をいれるための関数
     *
     * @param Integer product_id
     * @deferred true
     *
     */
    addCartAsGift: function(product_id) {
        var self = this;
        return self.addCart(product_id,true);
    },

    /**
     * addCartWithCache
     * 主にカート操作中に使用する商品情報追加メソッド
     * productsCacheを使用する
     *
     * @param Integer product_id
     * @param Integer count
     */
    addCartWithCache: function(product_id, count, is_gift) {
        var self = this;
        if (!count) {
            count = 1;
        }
        if (is_gift) {
            is_gift = 1;
        } else {
            is_gift = 0;
        }
        if (self.productsCache[product_id]){
            for (i = 0; i < count; i++) {
                // MEMO:models/product.php Product::getProductForCart()と取得データ情報を合わせる
                self.pushProduct({id:product_id,
                                  f:(self.productsCache[product_id].Product.family_limit_flag) ? self.productsCache[product_id].Product.family_limit_flag : 0,
                                  p_upcell:self.productsCache[product_id].Product.periodical_upsell_product_id,
                                  /*
                                   r_1:self.productsCache[product_id].Product.related_product_id_1,
                                   r_2:self.productsCache[product_id].Product.related_product_id_2,
                                   r_3:self.productsCache[product_id].Product.related_product_id_3,
                                   r_4:self.productsCache[product_id].Product.related_product_id_4,
                                   r_5:self.productsCache[product_id].Product.related_product_id_5,
                                   r_6:self.productsCache[product_id].Product.related_product_id_6,
                                   r_7:self.productsCache[product_id].Product.related_product_id_7,
                                   r_8:self.productsCache[product_id].Product.related_product_id_8,
                                   r_9:self.productsCache[product_id].Product.related_product_id_9,
                                   r_10:self.productsCache[product_id].Product.related_product_id_10,
                                   */
                                  c_free:self.productsCache[product_id].MBaseCommodity.CARRIAGE_FREE,
                                  t_inc:self.productsCache[product_id].MBaseCommodity.TANKA_INC,
                                  m_t_inc:self.productsCache[product_id].MBaseCommodity.MEM_TANKA_INC,
                                  is_guestandme:self.productsCache[product_id].Product.is_guestandme
                                 });
            }
            self.setProducts();
        } else {
            //get product info
            var url = global.baseUrl + 'carts/addCart/' + product_id + '/' + is_gift;
            $.ajax({
                       type:'GET',
                       url:url,
                       cache:false,
                       async:false,
                       success:function(res) {
                           if (res == 'Error') {
                               self.showFlashMessage(__('Error:Add Cart'));
                               return false;
                           }

                           //parse JSON response
                           try {
                               productObj = $.secureEvalJSON(res);
                           } catch (e) {
                               debug(e);
                               self.showFlashMessage(__('Error:Add Cart'));
                               return false;
                           }

                           //push product
                           var family_limit_product_exist = false;
                           for (i = 0; i < count; i++) {
                               if (self.pushProduct(productObj)) {

                               } else {
                                   family_limit_product_exist = true;
                               }
                               self.setProducts();
                           }

                           if (family_limit_product_exist) {
                               return false;
                           } else {
                               return true;
                           }
                       },
                       error:function(res) {
                           //show flash message
                           self.showFlashMessage(__('Error:Add Cart'));
                           return false;
                       }
                   });
        }
    },

    /**
     * addCartAndJump
     * カートに追加しつつカート画面に遷移させる
     *
     */
    addCartAndJump: function(product_id, count, is_gift) {
        var self = this;
        $.deferred
            .next(function () {
                      self.addCartWithCache(product_id,count,is_gift);
                  })
            .next(function () {
                      location.href = global.baseUrl + 'carts/view';
                  });
    },

    /**
     * pushProduct
     * cart.productsと$.cookie('products')に商品情報を追加するオブジェクトメソッド
     * カートに商品情報を追加する場合は全てこのメソッドを通過すること
     * Cookieにサイズ制限があるためカート内商品情報のみCookieに残す
     *
     * @param Object obj 商品情報オブジェクト
     */
    pushProduct: function(obj) {
        var self = this;
        var family_limit_product_exist = false;
        var limit_over_product_exist = false;

        if (obj.f && obj.f == 1) {
            self.products.map(function(i) {
                                  if (i.id == obj.id) {
                                      family_limit_product_exist = true;
                                  }
                              });
        }

        if (obj.limit_no && obj.limit_no == 0) {
            limit_over_product_exist = true;
        }
        if (family_limit_product_exist) {
            return 'family_limit_product_exist';
        } else if (limit_over_product_exist) {
            return 'limit_over_product_exist';
        } else {
            self.products.push(obj);

            self.products.map(function(i) {
                                  delete i.delivery_to;
                              });
            return true;
        }
    },

    /**
     * pushGift
     * cart.productsと$.cookie('gifts')に商品情報を追加するオブジェクトメソッド
     * カートにギフト商品情報を追加する場合は全てこのメソッドを通過すること
     * Cookieにサイズ制限があるためカート内商品情報のみCookieに残す
     *
     * @param Integer product_id
     */
    pushGift: function(product_id) {
        var self = this;
        var str = $.cookie('gifts');
        str = (str) ? str : "{}";
        self.gifts = $.secureEvalJSON(str);
        self.gifts[product_id] = true;
        str = $.toJSON(self.gifts);
        $.cookie('gifts',str,{expires:30, path:'/'});
        //console.log($.cookie('gifts'));
    },

    /**
     * changeProductCount
     * self.productsの商品情報の数を変更するオブジェクトメソッド
     * ただし、順番を代えないようにする必要がある
     *
     */
    changeProductCount: function(product_id, count) {
        var self = this;
        var len = self.products.length;

        var current_count = 0;
        for (i = 0; i < len; i++){
            if (self.products[i].id == product_id) {
                current_count++;
            }
        }

        if (count > current_count) {
            self.addCartWithCache(product_id, count - current_count);
        } else {
            remove_count = current_count - count;
            for (j = len -1; j >= 0; j--) {
                if (self.products[j].id == product_id && remove_count > 0) {
                    self.products.splice(j,1);
                    remove_count--;
                }
            }
        }

        self.setProducts();
    },

    /**
     * changeProducts
     * 商品情報を定期アップセル商品に入れ替える
     *
     */
    changeProducts: function(from,to) {
        debug(from,'from');
        debug(to,'to');

        var self = this;

        var len = self.products.length;

        var current_count = 0;
        for (i = 0; i < len; i++){
            if (self.products[i].id == from) {
                current_count++;
            }
        }

        self.addCartWithCache(to, current_count);

        remove_count = current_count;
        for (j = len -1; j >= 0; j--) {
            if (self.products[j].id == from && remove_count > 0) {
                self.products.splice(j,1);
                remove_count--;
            }
        }

        self.setProducts();

    },

    /**
     * pushSeparatedIds
     * cart.separatedIdsに商品情報を追加するオブジェクトメソッド
     * カートのお届け先をわける場合は全てこのメソッドを通過すること
     * Cookieにサイズ制限があるためカート内商品情報のみCookieに残す
     *
     */
    pushSeparatedIds: function(product_id) {
        var self = this;
        self.separatedIds[product_id] = 'separated';

        //str = $.toJSON(self.separatedIds);
        //$.cookie('separatedIds',str,{path:'/'});
    },

    /**
     * renderRemovedProduct
     *
     */
    renderRemovedProduct: function() {
        var self = this;
        var len = self.removed.length;

        debug(self.removed,'self.removed');
        debug(self.productsCache,'self.productsCache');

        // Guest&ME 判定
        for (j = len -1; j >= 0; j--) {
            if (is_gm) {
                if (self.removed[j].is_guestandme == 0) {
                    self.removed.splice(j,1);
                }
            } else {
                if (self.removed[j].is_guestandme == 1) {
                    self.removed.splice(j,1);
                }
            }
        }

        self.removed.forEach(function(product) {
                                 if (product) {
                                     if (!self.productsCache[product.id]) {
                                         self.getProductsForCache([product.id]);
                                     }
                                 }
                             });



        $("#removeProduct").setTemplateElement('template_removed');
        $("#removeProduct").processTemplate({ 'removed': self.removed, 'productsCache':self.productsCache, 'is_member':is_member });

        // for IE
        var cartObj = $(".cart-back-item");
        $("#removeProduct").html('');
        $("#removeProduct").append(cartObj);

        debug('render.remove ok');
        if (len == 0) {
            $('#cart-back').hide();
        } else {
            $('#cart-back').show();
        }

        self.renderCart();
    },

    /**
     * addCartFromRemoved
     *
     *
     * @param Integer product_id
     *
     */
    addCartFromRemoved: function(product_id) {
        var self = this;
        var removedObj = null;

        var len = self.removed.length;
        for (j = len -1; j >= 0; j--) {
            if (self.removed[j].id == product_id) {
                self.removed.splice(j,1);
            }
        }
        str = $.toJSON(self.removed);
        $.cookie('removed',str,{path:'/'});

        self.addCartWithCache(product_id, 1);
        self.renderRemovedProduct();
    },

    /**
     * clearCookie
     *
     */
    clearCookie: function() {
        var self = this;
        $.deferred
            .next(function () {
                      self.products = [];
                      self.gifts = {};
                      self.removed = [];
                  })
            .next(function () {
                      return self.clearProducts();
                  })
            .next(function () {
                      $.cookie('products',null,{path:'/'});
                      $.cookie('gifts',null,{path:'/'});
                      $.cookie('removed',null,{path:'/'});
                      $.cookie('include_flag',null,{path:'/'});//既存定期同梱フラグ
                      $.cookie('separate?',null,{path:'/'});//新規定期、通常商品別お届けフラグ
                  });
    },

    /**
     * _renderSelect
     * 数量変更用のselectボックス作成用
     * IE対策
     *
     *
     */
    _renderSelect: function(product_id, count) {
        var self = this;
        return $('<select>').attr({id:'cart_item_count_' + product_id})
            .change(function() {
                        var product_id = $(this).attr('id').replace(/cart_item_count_/,'');
                        var count = $(this).val();
                        self.removeProduct(product_id);
                        self.addCartWithCache(product_id, count);
                        self.renderCart();
                    })
            .html((function(){
                       var options = '';
                       for (j = 1; j <= 20; j++) {
                           options += '<option value="' + j + '" ' + ((count == j) ? 'selected' : '') + '>' + j + '</option>';
                       }
                       return options;
                   })());
    },

    /**
     * showFlashMessage
     * 主に商品をカートに入れた際に呼び出すFlashメッセージ
     *
     * @param String message 商品追加メッセージ
     */
    showFlashMessage: function(message, addlink) {

        var target = $('div#addedCart');
        target.hide();

        var url = global.baseUrl + 'carts/view';

        var link = ((addlink) ?
                    '<a href="' + url + '">'
                    + '<img src="' + global.baseUrl + 'img/addedCart/btn_addedCart.gif" alt="買い物かごを見る" width="187" height="28"></a>'
                    : '');

        target.html('');
        target.html('<table cellspacing="0">'
                    + '<tr>'
                    + '<td class="addedText"><p>' + message + '</p></td>'
                    + '<td align="center" class="addedButton">'
                    + link
                    + '</td>'
                    + '</tr>'
                    + '</table>'
                   );

        $.deferred
            .next(function () {
                    $('html,body').animate({ scrollTop: 0 }, 'slow', '', function() {
                        target.fadeIn('slow');
                    });
                });

    }
}
