/**
 * cart.js
 *
 * @description カート制御用基本js
 * カート追加及びカートレンダリングについての基本機能を提供する
 *
 * @require jquery
 * @require jquery-jsdeferred
 * @require jquery-jtemplate
 */

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

    /**
     * products
     * @description カート内商品情報プロパティ
     */
    products: [],

    /**
     * merged
     * @description 商品情報を商品ごとにマージした情報プロパティ
     */
    merged: {},

    /**
     * productsCache
     * @description Ajaxで取得する商品情報のキャッシュプロパティ
     * 商品の必要な商品情報をキャッシュする
     */
    productsCache: {},

    /**
     * removed
     * @description catrs/viewで削除された商品のキャッシュプロパティ
     */
    removed: [],

    /**
     * gifts
     * @description 対象商品情報プロパティ
     */
    gifts: {},

	/**
     * obis
	 *
	 * bekewl 2011/02/13 追加
	 *
     * @description デコ帯設定商品情報プロパティ
     */
    obis: {},

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

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

    /**
     * initialize
     * @description ページ表示時の初期化処理
     * Cookie情報からself.productsをセットする
     * @deferred true
     */
    initialize: function(){
        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の商品の表示有無をis_gmから判定して分ける
                       *  is_gm: 0:通常 1:G&M商品
                       *
                       */
                      var len = self.products.length;
                      for (j = len -1; j >= 0; j--) {
                          if (self.products[j]) {
							  // イシュア対応 カート内商品のショップ別対応
							  if (shopCode != self.products[j].shop_code) {
								  self.products.splice(j,1);
							  } else {
								  if (self.products[j].is_guestandme == ((is_gm) ? '0' : '1')) {
									  self.products.splice(j,1);
								  }
							  }
                          }
                      }
                  })
            .next(function () {
                      /**
                       * ヘッダーのカート情報のレンダリング
                       * カートのプログレスバーのレンダリング
                       */
                      self.renderHeaderInfo();
                      self.renderProgressBar();
                  })
            .next(function () {
                      /**
                       *  各情報源を取得・整形
                       */
                      self.removed = ($.cookie('removed')) ? $.secureEvalJSON($.cookie('removed')) : [];
                      self.gifts = ($.cookie('gifts')) ? $.secureEvalJSON($.cookie('gifts')) : {};

                      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);
                      }
                  })
            .next(function () {
                      /**
                       * イベント追加
                       */
                      $('.addCartBtn').live('click',function() {
												// bekewl 第2パラメータ true：scroll、false：popup
												self.addCartFront(this, false);
                                            });

                      $('.addRelatedProduct').live('click',function() {
                                                       var elm = this;
                                                       $.deferred
                                                           .next(function() {
																	 // bekewl 第2パラメータ true：scroll、false：popup
																	 return self.addCartFront(elm, true);
                                                                 })
                                                           .next(function() {
                                                                     self.renderCart();
                                                                 });
                                                   });
                      // bekewl -------------------->>
					  // ポップアップの表示
					  self.showPopup();

					  // ポップアップ画面を閉じる
					  $('.popupClose').live('click',function() {
							                    setTimeout($.unblockUI, 1);
						                    });
                      // bekewl --------------------//
                  })
            .error(function (e) {
                       /**
                        * エラーハンドリング
                        */
                       debug(e);
                       var option = {
                           error_type:'session',
                           file:'carts.js',
                           line:0
                       }
                       error_handler('Initialize Error:' + e, option);
                   });
    },

    /**
     * frontInitialize
     * @description フロント(カート以外)での初期化処理
     * @deferred true
     */
    frontInitialize: function() {
        var self = this;
        return $.deferred
            .next(function () {
                      /**
                       * イベント追加
                       */
                      $('.addCartBtn').live('click',function() {
												// bekewl 第2パラメータ true：scroll、false：popup
                                                self.addCartFront(this, false);
                                            });

                      $('.addRelatedProduct').live('click',function() {
                                                       var elm = this;
                                                       $.deferred
                                                           .next(function() {
																	 // bekewl 第2パラメータ true：scroll、false：popup
																	 return self.addCartFront(elm, true);
                                                                 })
                                                           .next(function() {
                                                                     self.renderCart();
                                                                 });
                                                   });
                      // bekewl -------------------->>
					  // ポップアップの表示
					  self.showPopup();

					  // 買い物を続ける場合、商品数量を更新後、ポップアップ画面を閉じる
					  $('.popupClose').live('click',function() {
							                    var id  = $('#popupProductId').html();
							                    var num = $('#popupProductNum').html();
							                    self.changeProductCount(id, num);
							                    setTimeout($.unblockUI, 1);
						                    });

					  // 買い物かごへ進む
					  $('.popupToCart').live('click',function() {
							                     var id  = $('#popupProductId').html();
							                     var num = $('#popupProductNum').html();
							                     self.changeProductCount(id, num);
						                     });

					  // 数量カウントダウン
					  $('#countDown').live('click',function() {
							                   var num = $('#popupProductNum').html();
							                   num = self.cntProduct(num, false);
							                   $('#popupProductNum').html(num);
						                   });

					  // 数量カウントアップ
					  $('#countUp').live('click',function() {
							                 var num = $('#popupProductNum').html();
							                 num = self.cntProduct(num, true);
							                 $('#popupProductNum').html(num);
						                 });
                      // bekewl --------------------//
                  })
            .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 () {
                      /**
                       * ヘッダーのカート情報のレンダリング
                       */
                      self.renderHeaderInfo();
                  })
            .error(function (e) {
                       /**
                        * エラーハンドリング
                        */
                       debug(e);
                       var option = {
                           error_type:'session',
                           file:'carts.js',
                           line:0
                       };
                       error_handler('Initialize Error:' + e, option);
                   });
    },

    /**
     * getProducts
     * @description 商品情報を取得
     * @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;

                              // G&M 判定
                              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);
                                      }
                                  }
                                  if (self.products[j].is_guestandme == 2) {
                                      self.products.splice(j,1);
                                  }
                              }

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

    /**
     * revertProducts
     * @description 商品情報の復帰
     * セッション情報がなく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') {
                                  return false;
                              }

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

    /**
     * setProducts
     * @description 商品情報をCookieとSession(use Ajax)にセットする
     * @deferred false
     */
    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
     * @description カートのプログレスバー及びギフト指定のボタン切り替え
     * @deferred false
     */
    renderProgressBar: function() {
        var self = this;
		var is_gift = false;
		var cookie_gifts = $.cookie('gifts') ? $.secureEvalJSON($.cookie('gifts')) : {};

		for(var i in cookie_gifts)
		{
			if(cookie_gifts[i])
			{
				is_gift = true;
				break;
			}
		}

        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
     * @description ヘッダー情報に価格を組み込む
     * @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) {
                                  /**
                                   * PCのみ使用
                                   * is_guestandme: 0 PC / 1 G&M only / 2 PC & G&M
                                   */
								  // イシュア対応 カート情報
                                  if (product.shop_code == shopCode && product.is_guestandme == 0 || product.is_guestandme == 2) {
                                      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
     * @description カート内の商品情報を削除
     * @deferred false
     */
    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') {
                           return false;
                       }
                       cart.products = [];
                       return true;
                   },
                   error:function(res) {
                       return false;
                   }
               });
    },

    /**
     * getProductsForCache
     * @description 商品詳細情報のキャッシュを作成
     * @param Array ids
     * @deferred false
     */
    getProductsForCache: function(ids){
        if (!$.isArray(ids)) {
            return false;
        }
        var self = this;

        //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') {
                           return false;
                       }

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

        return true;
    },

    /**
     * addCartFront
     * @description フロントでの商品追加
     *
     * @deferred true
	 * @param     elm
	 * @param     type true:scroll表示、false：popup表示
     */
    addCartFront: function(elm,type) {
        var self = this;
        return $.deferred
            .next(function () {
                      var id = $(elm).attr('id').replace(/addCartBtn_/,'');

                      var uniq_name = id.replace(/_.+$/,'');

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

    /**
     * addCart
     * @description カートに商品情報をいれるための関数
     * onClickで使用されることを想定する
     *
     * @param Integer product_id
     * @param Integer is_gift 0:PC 1:G&M
     * @param Integer type
     * @deferred true
     */
    addCart: function(product_id, is_gift, type) {
        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 + '/' + shopCode;
        return $.ajax({
                          type:'GET',
                          url:url,
                          cache:false,
                          timeout:10000,
                          success:function(res) {
                              return res
                          },
                          error:function(res) {
                              //show flash message
							  self.popupCart(__('Error:Add Cart'), false);
                              return res;
                          }
                      })
            .next(function(res) {
                      if (res == 'Error') {
						  self.popupCart(__('Error:Add Cart'), false);
                          return false;
                      }
                      if (res == 'disabled') {
						  self.popupCart(__('Error:Disabled Product'), false);
                          return false;
                      }

                      if (res == 'max') {
						  self.popupCart(__('Error:Max Product'), false);
                          return false;
                      }

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

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

                          // type=true時は元仕様のscroll表示。それ以外はポップアップ
						  if (type) {
							  //show flash message
							  self.showFlashMessage(__('Add Cart'), true);
						  } else {
							  self.popupCart(__('Add Cart'), productObj.id);
						  }
                          return res;
                      } else {
                          switch (result) {
                          case 'family_limit_product_exist':
                              //                              self.showFlashMessage(__('Error:Family Limit', false));
							  self.popupCart(__('Error:Family Limit', false));
                              break;
                          case 'limit_over_product_exist':
                              //                              self.showFlashMessage(__('Error:Limit Over', false));
							  self.popupCart(__('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
     * @description カートにギフト商品情報をいれるための関数
     *
     * @param Integer product_id
     * @deferred true
     */
    addCartAsGift: function(product_id) {
        var self = this;
        return self.addCart(product_id,true,false);
    },

    /**
     * addCartWithCache
     * 主にカート操作中に使用する商品情報追加メソッド
     * productsCacheを使用する
     *
     * @param Integer product_id
     * @param Integer count
     */
    addCartWithCache: function(product_id, count, is_gift, saveLogFlg) {
        var self = this;
		var result;

        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()と取得データ情報を合わせる
                result = 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,
                                  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,
								  shop_code:self.productsCache[product_id].Product.shop_code
                                 });

				// カートインに成功したらログを残す（saveLogFlg = 1のときのみ）
				if (saveLogFlg == 1 && result == true) {
					self.saveAnalysisLogForCartIn(self.productsCache[product_id].Product.product_code, shopCode);
				}
            }
            self.setProducts();
        } else {
            //get product info
            var url = global.baseUrl + 'carts/addCart/' + product_id + '/' + is_gift + '/' + shopCode;
            $.ajax({
                       type:'GET',
                       url:url,
                       cache:false,
                       async:false,
                       success:function(res) {
                           if (res == 'Error') {
                               //                               self.showFlashMessage(__('Error:Add Cart'));
							   self.popupCart(__('Error:Add Cart'), false);
                               return false;
                           }

                           //parse JSON response
                           try {
                               productObj = $.secureEvalJSON(res);
                           } catch (e) {
                               debug(e);
							   self.popupCart(__('Error:Add Cart'), false);
                               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.popupCart(__('Error:Add Cart'), false);
                           return false;
                       }
                   });
        }
    },

    /**
     * addCartAndJump
     * @description カートに追加しつつカート画面に遷移させる
     * @deferred false;
     */
    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 + shopPrefix + 'carts/view';
                  });
    },

    /**
     * pushProduct
     * @description 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) {
            var limit_no = obj.limit_no;
            self.products.map(function(i) {
                                  if (i.id == obj.id) {
                                      limit_no--;
                                  }
                              });
            if (limit_no < 1) {
                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
     * @description 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
     * @description 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();
        }

//        self.setProducts();
    },

    /**
     * changeProducts
     * @description 商品情報を定期アップセル商品に入れ替える
     *
     */
    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, 0, 1);

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

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

    /**
     * renderRemovedProduct
     * @description カートから削除した商品をカート下にレンダリングする
     *
     */
    renderRemovedProduct: function() {
        var self = this;
        var len = self.removed.length;

        // G&M 判定
        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
     * @description カートから削除済みの商品情報を再カートインする
     * @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
     * @description Cookie情報のクリア
     */
    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
     * @description 数量変更用のselectボックス作成用
     * IE対策のため$.html()を使用
     * @param Integer product_id
     * @param Integer count
     */
    _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 <= 40; j++) {
                           options += '<option value="' + j + '" ' + ((count == j) ? 'selected' : '') + '>' + j + '</option>';
                       }
                       return options;
                   })());
    },

    /**
     * showFlashMessage
     * @description 主に商品をカートに入れた際に呼び出すFlashメッセージ
     *
     * @param String message 商品追加メッセージ
     * @param Boolean addLink リンクを追加するかどうか
     */
    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');
                                             });
                  });
    },

    // bekewl -------------------->>
    /**
     * popupCart
     * カートインポップアップの表示
     *
     * @param message 商品追加メッセージ
	 * @param id      商品ID
     */
    popupCart: function(message, id) {
		var self = this;
		var div  = '' ;

		// id が取得できた場合、数量変更画面を表示
		if (id)
		{
			div = '#popupCart';

			// 商品情報
			if (!self.productsCache[id]) {
				self.getProductsForCache([id]);
			}
			var product = self.productsCache[id];

			// カート内数量
			var num = 0;
			self.products.forEach(function(cartProduct){
				if (cartProduct.id == id) {
					num++;
				}
			});

			// 表示項目のセット
			$('#popupProductId').html(id);
			$('#popupProductTitle').html(product.MBaseCommodity.PROD_NAME);

			// キャンペーン価格
			if (product.MBaseCommodity.BASE_TANKA_INC && product.MBaseCommodity.is_discount)
			{
				$('#popupProductPrice').html(commaNumber(parseInt(product.MBaseCommodity.BASE_TANKA_INC)));
//				$('#popupProductDiscountPrice').html(commaNumber(parseInt(product.MBaseCommodity.BASE_MEM_TANKA_INC)));
				if (is_member) {
					$('#popupProductDiscountPrice').html(commaNumber(parseInt(product.MBaseCommodity.MEM_TANKA_INC)));
				} else {
					$('#popupProductDiscountPrice').html(commaNumber(parseInt(product.MBaseCommodity.TANKA_INC)));
				}
				$('#popupProductDiscountTitle').html('特別価格');
			}
			// 通常価格
			else
			{
				$('#popupProductPrice').html(commaNumber(parseInt(product.MBaseCommodity.TANKA_INC)));
				$('#popupProductDiscountPrice').html(commaNumber(parseInt(product.MBaseCommodity.MEM_TANKA_INC)));
				$('#popupProductDiscountTitle').html('WEB会員価格');
			}

			// 商品値引きのメッセージ表示
			var NEBIKI = 0;
			if (is_member) {
				if (product.MBaseCommodity.MEM_TANKA_NEBIKI) {
					NEBIKI = product.MBaseCommodity.MEM_TANKA_NEBIKI;
				}
			} else {
				if (product.MBaseCommodity.TANKA_NEBIKI) {
					NEBIKI = commaNumber(parseInt(product.MBaseCommodity.TANKA_NEBIKI));
				}
			}

			if (NEBIKI > 0) {
				var campaignMsg = product.MBaseCommodity.CAMPAIGN_NAME + 'の価格が適用されました<br />';
				$('#popupCampaignMsg').html(campaignMsg + NEBIKI + '円引き');
			}
			
			$('#popupProductNum').html(num);
			$('#popupSubject').html(message);
			$('#popupProductImage').empty();
			if (product.Product.thumbnail_img_path) {
				$('#popupProductImage').append('<img src="' + global.baseUrl + product.Product.thumbnail_img_path + '" alt="" width="62" height="62" />');
			}
		}
		// id が取得できない場合はメッセージのみ表示
		else
		{
			div = '#popupMessage';
			$('#message').html(message);
		}

		// ポップアップカート表示
		$.extend($.blockUI.defaults.overlayCSS, {backgroundColor: '#ffffff'});
		$.extend($.blockUI.defaults.css, {border:'none', textAlign: 'left', cursor: 'auto', top: '30%'});
		$.blockUI({ message: $(div), fadeIn: 500});

		// 背景をクリックしてポップアップを閉じる
		$('.blockOverlay').attr('title', 'お買い物を続ける').click(function() {
			                                                           var id  = $('#popupProductId').html();
			                                                           var num = $('#popupProductNum').html();
			                                                           self.changeProductCount(id, num);
			                                                           setTimeout($.unblockUI, 1);
		                                                           });
    },

	/**
     * cntProduct
     * 数量変更
     *
     * @param  num   現在数量
	 * @param  type  true: カウントアップ、 false：カウントダウン
	 * @return num   変更後の数量
	 */
	cntProduct: function(num, type) {
		if (type) {
			num++;
		} else {
			num--;
		}

		if(num < 0) {
			num = 0;
		} else if (num > 40) {
			num = 40;
		}

		return num;
	},

	/**
     * showPopup
     * ポップアップ表示
     *
	 */
	showPopup: function() {

		///////////////////////////////////
		// 数量変更ポップアップ
		///////////////////////////////////
		
		
		// イシュア対応 
		if(shopCode == "0001"){
		var templateCart =
            '<div class="inner">\
	        <span id="popupProductId" style="display: none;"></span>\
	        <div class="title"><img src="' + global.baseUrl + 'img/cartin-popup/ttl_cartin_popup_issua.jpg" alt="以下の商品が買い物かごに入りました。（数量が0の時には入りません）" width="446" height="40" /></div>\
	        <div class="item clearfix">\
		    <p class="image" id="popupProductImage"></p>\
		    <dl class="data">\
			<dt id="popupProductTitle"></dt>\
			<dd>\
				販売価格：<span id="popupProductPrice"></span>円<br />\
				<span id="popupProductDiscountTitle"></span>：<span id="popupProductDiscountPrice"></span>円<br />\
				<span id="popupCampaignMsg"></span>\
			</dd>\
		    </dl>\
		    <div class="operate">\
			<div class="amount">\
			<p id="popupProductNum"><span>数量：</span>1</p>\
			<div>\
			<a href="javascript:void(0);" id="countUp"><img src="' + global.baseUrl + 'img/cartin-popup/btn_add.jpg" alt="1つ増やす" width="20" height="14" /></a>\
			<a href="javascript:void(0);" id="countDown"><img src="' + global.baseUrl + 'img/cartin-popup/btn_reduce.jpg" alt="1つ減らす" width="20" height="14" /></a>\
			</div>\
			</div>\
			<p class="move"><a href="' + global.baseUrl + 'carts/issua_view" class="popupToCart"><img src="' + global.baseUrl + 'img/cartin-popup/btn_move_cart_issua.jpg" alt="買い物かごへ進む" width="154" height="42" /></a></p>\
		    </div>\
		    <div class="clear"></div>\
	        </div>\
	        <div class="continue">\
		    <img src="' + global.baseUrl + 'img/cartin-popup/img_lion_issua.jpg" alt="引き続きお買い物をお楽しみいただく場合は「お買い物を続ける」をクリックしてください" width="420" height="82" />\
		    <a href="javascript:void(0);" class="popupClose"><img src="' + global.baseUrl + 'img/cartin-popup/btn_continue.jpg" alt="お買物を続ける" width="124" height="30" /></a>\
	        </div>\
            </div>';
            
		} else {
		
		var templateCart =
            '<div class="inner">\
	        <span id="popupProductId" style="display: none;"></span>\
	        <div class="title"><img src="' + global.baseUrl + 'img/cartin-popup/ttl_cartin_popup.jpg" alt="以下の商品が買い物かごに入りました。（数量が0の時には入りません）" width="446" height="40" /></div>\
	        <div class="item clearfix">\
		    <p class="image" id="popupProductImage"></p>\
		    <dl class="data">\
			<dt id="popupProductTitle"></dt>\
			<dd>\
				販売価格：<span id="popupProductPrice"></span>円<br />\
				<span id="popupProductDiscountTitle"></span>：<span id="popupProductDiscountPrice"></span>円<br />\
				<span id="popupCampaignMsg"></span>\
			</dd>\
		    </dl>\
		    <div class="operate">\
			<div class="amount">\
			<p id="popupProductNum"><span>数量：</span>1</p>\
			<div>\
			<a href="javascript:void(0);" id="countUp"><img src="' + global.baseUrl + 'img/cartin-popup/btn_add.jpg" alt="1つ増やす" width="20" height="14" /></a>\
			<a href="javascript:void(0);" id="countDown"><img src="' + global.baseUrl + 'img/cartin-popup/btn_reduce.jpg" alt="1つ減らす" width="20" height="14" /></a>\
			</div>\
			</div>\
			<p class="move"><a href="' + global.baseUrl + 'carts/view" class="popupToCart"><img src="' + global.baseUrl + 'img/cartin-popup/btn_move_cart.jpg" alt="買い物かごへ進む" width="154" height="42" /></a></p>\
		    </div>\
		    <div class="clear"></div>\
	        </div>\
	        <div class="continue">\
		    <img src="' + global.baseUrl + 'img/cartin-popup/img_lion.jpg" alt="引き続きお買い物をお楽しみいただく場合は「お買い物を続ける」をクリックしてください" width="420" height="82" />\
		    <a href="javascript:void(0);" class="popupClose"><img src="' + global.baseUrl + 'img/cartin-popup/btn_continue.jpg" alt="お買物を続ける" width="124" height="30" /></a>\
	        </div>\
            </div>';
		}
		

		$('body').append('<div id="popupCart" class="cartPopup" style="display:none;"></div>');
		$('#popupCart').html(templateCart);


		///////////////////////////////////
		// メッセージ表示ポップアップ
		///////////////////////////////////
		
		if(shopCode == "0001"){
		var templateMessage =
            '<div class="inner">\
	        <div style="background:#FF7ABD; padding:5px;">\
		    <p id="message" style="color:#fff; font-weight:bold;"></p>\
	        </div>\
	        <div class="continue">\
		    <img src="' + global.baseUrl + 'img/cartin-popup/img_lion_issua.jpg" alt="引き続きお買い物をお楽しみいただく場合は「お買い物を続ける」をクリックしてください" width="420" height="82" />\
		    <a href="javascript:void(0);" class="popupClose"><img src="' + global.baseUrl + 'img/cartin-popup/btn_continue.jpg" alt="お買物を続ける" width="124" height="30" /></a>\
	        </div>\
            </div>';
		} else {
		var templateMessage =
            '<div class="inner">\
	        <div style="background:#f60; padding:5px;">\
		    <p id="message" style="color:#fff; font-weight:bold;"></p>\
	        </div>\
	        <div class="continue">\
		    <img src="' + global.baseUrl + 'img/cartin-popup/img_lion.jpg" alt="引き続きお買い物をお楽しみいただく場合は「お買い物を続ける」をクリックしてください" width="420" height="82" />\
		    <a href="javascript:void(0);" class="popupClose"><img src="' + global.baseUrl + 'img/cartin-popup/btn_continue.jpg" alt="お買物を続ける" width="124" height="30" /></a>\
	        </div>\
            </div>';
		}


		$('body').append('<div id="popupMessage" class="cartPopup" style="display:none;"></div>');
		$('#popupMessage').html(templateMessage);
	},

	saveAnalysisLogForCartIn : function(product_code, shopCodeParams) {
		var self = this;

		//get product info
        var url = global.baseUrl + 'carts/saveAnalysisLogForCartIn/' + product_code + '/' + shopCodeParams;

		$.ajax({
			type: 'POST',
			url: url,
			cache:false,
            async:false,
			success: function() {
				// 成功した場合の後処理が必要あればここに追記
			},
			error: function() {
				// 失敗した場合の後処理が必要あればここに追記
			}
		});

		return;
	}

    // bekewl --------------------//
}

