j(
  function(event) {
    // {{{ 画像 - クリック - 商品画像サムネイル
    j('#article-images ol li img').click(
      function(event) {
        var index = j(this).attr('src').sub(/^.*item_image\/\d+\/(\d)\/.*$/, '#{1}');
        j('#article-images p img').attr('src', j('#article-images p img').attr('src').sub(/^(.*)\/(\d)\/(.*)$/, '#{1}/' + index + '/#{3}'));
      }
    );
    // }}}

    // {{{ レビュー制御の事前準備
    var current_order = 'id_d';
    var current_page = 0;
    var processing = false;
    j('#review div.reviews').css(
      {
        'height': j('#review div.reviews').height()
      }
    );
    j('#review div.reviews table.review-table').css(
      {
        'position': 'absolute'
        , 'top': 0
      }
    );
    // }}}

    // {{{ 関数 - レビューの箱サイズ変更
    var f_resize_review_box = function() {
      j('#review div.reviews').animate(
        {
          'height': j('#review div.reviews table.review-table.displayed').height()
        }
        , 500
        , 'linear'
        , f_bottom_reposition
      );
    };
    // }}}

    // {{{ 関数 - レビュー表示
    var f_display_review = function(order, page, vector) {
      // {{{ 多重起動防止
      if (processing) {
        return;
      }
      processing = true;
      // }}}

      // {{{ 初期化
      if (!order) {
        order = current_order;
      }
      if (Object.isUndefined(page)) {
        // 0 が渡され得るので、undefined との比較を行う
        page = current_page;
      }
      if (Object.isUndefined(vector)) {
        vector = 'reset';
      }
      var sort_order_label_list = {
        'id_d': '新しい順'
        , 'id_a': '古い順'
        , 'rating_d': '評価が高い順'
        , 'rating_a': '評価が低い順'
      }
      // }}}

      // {{{ 関数 - レビュー1件分のタグを構築
      var f_create_review_tag = function(review, index) {
        var star = '';
        for (var i = 0; i < review.rating; i++) {
          star += '&#x2605;';
        }
        var tr = '<tr class="article-review-' + review.id + ' index-' + index + (index % 2 == 0 ? ' background-color-light' : '') + '">';
        var tag = '';
        tag += tr;
        tag += '<td class="inline-left star"><p>' + star + '</p></td>';
        tag += '<td class="inline-left name"><p>by&nbsp;<span class="reviewer">' + review.name + '</span>&nbsp;(' + review.aetas_label + '&nbsp;' + review.gender_label + ')&nbsp;</p></td>';
        tag += '<td class="inline-left date"><p><span class="dtreviewed">' + review.created_at + '</span></p></td>';
        tag += '<td class="inline-right allege"><p><img src="http://image.moshimo.com/static/img/mp/article/icon/report.gif" class="inline-middle icon-report"><a href="/article/' + _variables.article_id + '/review/allege?article_review_id=' + review.id + '&amp;shop_id=' + _variables.shop_id + '&signature=' + _variables.signature + '">報告する</a></p></td>';
        tag += '</tr>';
        if (review.article_group_id) {
          tag += tr;
          tag += '<td class="inline-left article-name" colspan="4">';
          tag += '<p>';
          if (review.article_id != _variables.article_id) {
            tag += '<img src="http://image.moshimo.com/static/img/mp/article/icon/similar.gif" width="55" height="15" alt="類似商品" />&nbsp;';
          }
          tag += '<a href="/article/' + review.article_id + '?shop_id=' + _variables.shop_id + '&amp;signature=' + _variables.signature + '">' + review.article_name + '</a>';
          tag += '</p>';
          tag += '</td>';
          tag += '</tr>';
        }
        tag += tr;
        tag += '<td class="inline-left review" colspan="4"><span class="description">';
        if (review.review.length > 100) {
          tag += review.review.substr(0, 100).gsub(/\r\n|\r|\n/, '<br />') + '...&nbsp;' + '<a href="#" class="read-all">&gt;&gt;&nbsp;全部読む</a>';
        } else {
          tag += review.review.gsub(/\r\n|\r|\n/, '<br />');
        }
        tag += '</span></td>';
        tag += '</tr>';
        return tag;
      };
      // }}}

      // {{{ 関数 - 並び順処理
      var f_assemble_sort_order = function() {
        j('#review .review-sort a.current').removeClass('current').removeClass('background-color-medium');
        j('#review .review-sort a.anchor-review-sort-' + order).addClass('current').addClass('background-color-medium');
        j('#review .sort-order-label').text(sort_order_label_list[order]);
      };
      // }}}

      // {{{ 関数 - ページャ処理
      var f_assemble_pager = function() {
        if (page == 0) {
          j('#review .move a.previous').addClass('disabled');
        } else {
          j('#review .move a.previous').removeClass('disabled');
        }
        if (page == Math.floor(_variables.article_review_count / 5)) {
          j('#review .move a.next').addClass('disabled');
        } else {
          j('#review .move a.next').removeClass('disabled');
        }
        j('#review .move span.display-number-from').text(page * 5 + 1);
        j('#review .move span.display-number-to').text(page * 5 + 5 > _variables.article_review_count ? _variables.article_review_count : page * 5 + 5);
      };
      // }}}

      // {{{ Ajax - ページ切替・並び順変更
      j.ajax(
        {
          url: '/article/ajax/review/search'
          , data: 'order=' + order + '&page=' + page + '&article_id=' + _variables.article_id
        }
      ).success(
        function(data) {
          if (!data.result) {
            return;
          }

          // {{{ 追加するテーブルを構築
          var j_table_displayed = j('#review table.review-table.displayed');
          var j_table_appending = j('<table class="temporary review-table block-center" cellpadding="0" cellspacing="0" border="0"><tbody></tbody></table>');
          j_table_appending.css(
            {
              'position': 'absolute'
              , 'top': 0
            }
          ).hide();
          j.each(
            data.article_review_list
            , function(index, review) {
              j_table_appending.find('tbody').append(j(f_create_review_tag(review, page * 5 + index)));
            }
          );
          // }}}

          if (vector == 'reset') {
            // {{{ テーブルの入れ替え
            j_table_displayed.hide(
              'blind'
              , {}
              , 1000
              , function() {
                j_table_displayed.remove();
                j_table_appending.removeClass('temporary').addClass('displayed').appendTo(j('#review div.reviews')).show(
                  'blind'
                  , {}
                  , 1000
                  , function() {
                    f_resize_review_box();
                    f_assemble_sort_order();
                    f_assemble_pager();
                    current_order = order;
                    current_page = page;
                    processing = false;
                  }
                );
              }
            );
            // }}}
          } else {
            // {{{ 追加したテーブルの整頓
            var move_distance = 0;
            var operator = '';
            if (vector == 'positive') {
              // 正の方向への追加
              j('#review div.reviews').append(j_table_appending);
              j_table_appending.css(
                {
                  'top': j_table_displayed.height()
                }
              ).show();
              move_distance = j_table_displayed.height();
              operator = '-=';
            } else if (vector == 'negative') {
              // 負の方向への追加
              j('#review div.reviews').prepend(j_table_appending);
              j_table_appending.css(
                {
                  'top': j_table_appending.height() * -1
                }
              ).show();
              move_distance = j_table_appending.height();
              operator = '+=';
            }
            // }}}

            // {{{ アニメーションによるページ切替
            j('#review table.review-table').animate(
              {
                'top': operator + move_distance
              }
              , 1000
              , 'easeOutBounce'
              , function() {
                j_table_displayed.remove();
                j_table_appending.css(
                  {
                    'top': 0
                  }
                ).removeClass('temporary').addClass('displayed');

                f_resize_review_box();
                f_assemble_sort_order();
                f_assemble_pager();
                current_order = order;
                current_page = page;
                processing = false;
              }
            );
            // }}}
          }
        }
      );
      // }}}
    };
    // }}}

    // {{{ リンク - クリック - カートに入れるボタン
    j('p.cart-add-button a').click(
      function(event) {
        event.preventDefault();
        j(this).parents('form').submit();
      }
    );
    // }}}

    // {{{ リンク - クリック - 全部読む
    j('#review a.read-all').live(
      'click'
      , function(event) {
        event.preventDefault();
        var j_tr = j(this).parents('tr');
        var article_review_id = j_tr.attr('class').sub(/^.*article-review-(\d+).*$/, '#{1}');
        j.ajax(
          {
            url: '/article/ajax/review/get'
            , data: 'article_review_id=' + article_review_id
          }
        ).success(
          function(data) {
            if (!data.result) {
              return;
            }
            j_tr.find('td.review span.description').html(data.article_review.review.gsub(/\r\n|\r|\n/, '<br />'));
            f_resize_review_box();
          }
        );
      }
    );
    // }}}

    // {{{ リンク - クリック - 並び順
    j('#review .review-sort a').click(
      function(event) {
        event.preventDefault();
        var order = j(this).attr('class').sub(/^.*anchor-review-sort-([^ ]+).*$/, '#{1}');
        if (order == current_order) {
          return;
        }
        f_display_review(order, 0);
      }
    );
    // }}}

    // {{{ リンク - クリック - 前の5件
    j('#review .move a.previous').click(
      function(event) {
        event.preventDefault();
        if (current_page == 0) {
          return;
        }
        f_display_review(false, current_page - 1, 'negative');
      }
    );
    // }}}

    // {{{ リンク - クリック - 次の5件
    j('#review .move a.next').click(
      function(event) {
        event.preventDefault();
        if (current_page == Math.floor(_variables.article_review_count / 5)) {
          return;
        }
        f_display_review(false, current_page + 1, 'positive');
      }
    );
    // }}}

    // {{{ セレクトボックス - 変更 - 関連商品
    j('select.related-article-list').change(
      function(event) {
        var article_id = j(this).find('option:selected').val();
        if (!article_id) {
          return;
        }
        location.href = '/article/' + article_id + '?shop_id=' + _variables.shop_id + '&signature=' + _variables.signature;
      }
    );
    // }}}

    // {{{ 終売時の商品検索窓

    // {{{ 商品検索 - Induce テキスト
    j('#finish-search-form input[name="words"]').induce('商品の検索');
    // }}}

    // {{{ 商品検索 - Induce テキスト
    j('#finish-search-form-top input[name="words"]').induce('商品の検索');
    // }}}

    // {{{ 商品検索 - Induce テキスト
    j('#finish-search-form-bottom input[name="words"]').induce('商品の検索');
    // }}}


    // {{{ 商品検索 - 検索ボタンクリック
    j('#button-finish-search-execute').click(
      function(event) {
        event.preventDefault();
        j(this).parents('form').submit();
      }
    );
    // }}}

    // {{{ 商品検索 - 検索ボタン表示トグル
    j('#button-image-finish-search-execute').switchImage();
    // }}}

    // }}}

    // {{{ レガシーなブラウザだとフッタの表示がズレるので、対応する
    if (j.B.legacy) {
      var reposition_count = 0;
      var t_reposition_interval = setInterval(
        function() {
          f_bottom_reposition();
          ++reposition_count;
          if (reposition_count > 10) {
            clearInterval(t_reposition_interval);
          }
        }
        , 1000
      );
    }
    // }}}
    
    // {{{ ブックマーク・共有ボタンクリック
    j('ul.anchor-box li.bookmark a.social-btn').click(
      function (event) {
        event.preventDefault();
        j(this).closest('li').find('div.social-box').slideToggle();
      }
    );
    // }}}
    
  }
);

