/* * SUMAOU LICENSE * (c) Copyright 2016 Section9 Inc. * * 本ソースコードは全て株式会社9課へと帰属し、 * 無断での複製・変更・再配布を固く禁じます。 * * 規約違反が見つかりました場合はご連絡の上、 * 使用停止とさせて頂きますので何卒ご注意ください。 * * 出来る限り多くの店舗様に低価格で良質なスマホサイトを * ご提供したいと始めたサービスです。 * 恐れ入りますが、ご理解のほど宜しくお願い致します。 *///***************************************************************************** // 全デザイン共通のJS //***************************************************************************** // 日付処理 var dateObj = new Date(); var weekDayList = [ "日", "月", "火", "水", "木", "金", "土" ]; //*************************************************************************** // 設定 //*************************************************************************** var GRIDVIEW_ITEMS_HITS = 6; var GRIDVIEW_ITEMS_HITS_PAGING = 12; var LISTVIEW_ITEMS_HITS = 3; var LISTVIEW_ITEMS_HITS_PAGING = 6; var CAROUSEL_ITEMS_HITS = 20; var SEARCH_ITEMS_HITS = 12; var SEARCH_ITEMS_HITS_PAGING = 6; var API_URL = 'https://api.sumaou.com/20170701/rakuten.php'; var API_BASE_URL = 'https://api.sumaou.com/'; var SUMAOU_ACCOUNT = 'l1xmTO6fziZDFIPZCxfIRVJEry33iDSH'; var API_ACCESS_CODE = 'GTCaLvjJ4h7b4a7eo1zy1HvpvWTmHSQ9'; var STORE_ID = ""; var STORE_ACCOUNT = "myrtille-craft"; var MALL = "楽天店"; // 次のブロックを読み込むまでのインターバル(ミリ秒)。 // 短くすることで素早く読み込むことができるが API への負荷が増加する。 var INTERVAL_NEXT_BLOCK_ACCESS = 100; // ブロックの読み込みに失敗した場合にリトライを行うインターバル(ミリ秒)。 // 短くすることで素早くリトライすることができるが API への負荷が増加する。 var INTERVAL_RETRY_ERROR_BLOCK = 1000; //*************************************************************************** // 変数宣言 //*************************************************************************** //各種APIを呼び出す順番をまとめた変数 accessOrder のインデックス var accessOrderIndex = 0; //現在表示しているページ番号 var itemsPage = { NewUpdate: 1, Point: 1, ReviewCount: 1, PostageFree: 1, ReviewAverage: 1, Random : 1, }; //取得対象となる商品IDのインデックス var itemCodeIndex = { }; //ページ移動中フラグ var pageMoving = { NewUpdate: false, Sale: false, Point: false, ReviewCount: false, PostageFree: false, ReviewAverage: false, Random : false, }; //検索フォーム var searchForm = ''; //検索ワード var searchWord = ''; //ヘッダー追加フラグ var requestHeaderAndFooter = true; //連続エラー回数 var errorCount = 0; //ポイントデータ var pointDataIndex = 0; var pointDataCount = -1; var pointHitCount = 0; // ランダムパーツ var randomMallApiResultSetFormat = { pageCount : 0, // 楽天API:総ページ数 page : 0, // 楽天API:現在のページ番号 count : 0, // 楽天API:検索結果の総商品数 ResultSet : { // YahooAPIの返却値構造 totalResultsAvailable : null, // YahooAPI:検索ヒット総数(未リクエスト=nullとする) totalResultsReturned : 0, // YahooAPI:取得済み商品数 } } var randomMallApiResultSet = {}; // API結果の格納変数 { ELEMENT_NAME : randomMallApiResultSetFormat } var randomItemList = {}; // 取得済み、未表示の商品リスト {ELEMENT_NAME : [goods] } // Yahoo ポイントアッププログラム用の退避データ var yahooPointUpDataList = []; //*************************************************************************** // 読み込み完了時処理 //*************************************************************************** $(function(){ //クリック制御 $(document).on("click", "a[href='#']", function(event) { event.preventDefault(); return false; }); //検索ボタン制御 $('.searchform').submit(function(event) { parentObj = $(this).parent().parent().parent(); no = parentObj.attr("data-no"); ELEMENT_NAME = "#" + parentObj.attr("id"); //サブミット キャンセル event.preventDefault(); //検索ワード保持 searchWord = $(this).find(':text[name="keyword"]').val(); //検索結果ページ クリア itemsPage['Search'+no] = 1; //検索開始 moveBlockSearch(ELEMENT_NAME,no); }); //検索キーワード制御 $('.search-keyword').click(function(event) { if(MALL == "楽天店") { //楽天店 searchWord = $(this).text(); searchForm = $('
'); searchForm.append(''); searchForm.append(''); searchForm.append(''); searchForm.append(''); searchForm.appendTo(document.body); searchForm.submit(); } else { //Yahoo!店 parentObj = $(this).parent().parent().parent().parent(); formObj = parentObj.find("form"); no = parentObj.attr("data-no"); ELEMENT_NAME = "#" + parentObj.attr("id"); if(formObj.hasClass("y_searchform")) { formObj.find("input[name='p']").val($(this).text()); formObj.submit(); formObj.find("input[name='p']").val(""); } else { //サブミット キャンセル event.preventDefault(); //検索ワード保持 searchWord = $(this).text(); //検索結果ページ クリア itemsPage['Search' + no] = 1; //検索開始 moveBlockSearch(ELEMENT_NAME, no); } } }); // タイトルが全角18文字以上の場合 if($(".l-header__container").length > 0 && $(".l-header__container").html().length>=18) $(".l-header__container").addClass("font-1rem"); // 最新情報日付のセット $('.p-newdate').html((dateObj.getMonth()+1)+"月"+(dateObj.getDate())+"日("+weekDayList[ dateObj.getDay() ]+")の最新情報!"); if(MALL == "楽天店") { //ヘッダーリンク書き換え $('.p-navbar__nav li:eq(0) a') .attr("href",'https://item.rakuten.co.jp/' + STORE_ACCOUNT + '/c/') .html('カテゴリ'); if ((typeof rakutenPaySupported !== 'undefined') && rakutenPaySupported) { $('.p-navbar__nav li:eq(1) a') .attr("href", 'https://www.rakuten.co.jp/' + STORE_ACCOUNT + '/info_rpay.html') .html('配送料'); } else { $('.p-navbar__nav li:eq(1) a') .attr("href", 'https://www.rakuten.co.jp/' + STORE_ACCOUNT + '/info2.html') .html('配送料'); } $('.p-navbar__nav li:eq(2) a') .attr("href",'https://my.bookmark.rakuten.co.jp/') .html('お気に入り'); $('.p-navbar__nav li:eq(3) a') .attr("href",'https://sp.basket.step.rakuten.co.jp/rms/mall/bss/cartall/') .html('カート'); //メルマガリンク置き換え $('.p-magazine form').attr('action', 'https://emagazine.rakuten.co.jp/rs'); $('.p-magazine form').append(''); $('.p-magazine form').append(''); $('.p-magazine .p-magazine__email').attr('name', 'email'); $('.p-magazine .p-magazine__c-email').attr('name', 'confirm_email'); //フッターリンク置き換え $('.p-footer_link .info-company a').attr("href",'https://www.rakuten.co.jp/' + STORE_ACCOUNT + '/info.html'); if ((typeof rakutenPaySupported !== 'undefined') && rakutenPaySupported) { $('.p-footer_link .info-payment a').attr("href", 'https://www.rakuten.co.jp/' + STORE_ACCOUNT + '/info_rpay.html'); } else { $('.p-footer_link .info-payment a').attr("href", 'https://www.rakuten.co.jp/' + STORE_ACCOUNT + '/info2.html'); } $('.p-footer_link .info-category a').attr("href",'https://item.rakuten.co.jp/' + STORE_ACCOUNT + '/c/'); $('.p-footer_link .info-contact a').attr("href",'https://ask.step.rakuten.co.jp/inquiry-form/?page=simple-inquiry-top&act=login&shop_id=' + STORE_ID); $('.p-footer_link .info-mall a').attr("href",'https://www.rakuten.co.jp/').text("楽天市場"); //ソーシャルリンク書き換え $('.c-social__facebook__img').attr("href","https://www.facebook.com/share.php?u="+encodeURI("https://www.rakuten.ne.jp/gold/" + STORE_ACCOUNT + "/")); $('.c-social__twitter__img').attr("href","https://twitter.com/share?url="+encodeURI("https://www.rakuten.ne.jp/gold/" + STORE_ACCOUNT + "/")+"&text="+$("title").text()); //検索窓にショップIDセット $('input:hidden[name="sid"]').val(STORE_ID); } else { //ヘッダーリンク書き換え $('.p-navbar__nav li:eq(0) a') .attr("href",'https://store.shopping.yahoo.co.jp/' + STORE_ACCOUNT + '/info.html') .html('店舗情報'); $('.p-navbar__nav li:eq(1) a') .attr("href",'https://store.shopping.yahoo.co.jp/' + STORE_ACCOUNT + '/guide.html') .html('配送料'); $('.p-navbar__nav li:eq(2) a') .attr("href",'https://shopping.yahoo.co.jp/my/watchlist/') .html('お気に入り'); $('.p-navbar__nav li:eq(3) a') .attr("href",'https://order.shopping.yahoo.co.jp/cgi-bin/cart-form?catalog=' + STORE_ACCOUNT ) .html('カート'); //メルマガリンク置き換え $('.p-magazine form').attr('action', 'https://snlweb.shopping.yahoo.co.jp/shp_snl/optin/confirm/' + STORE_ACCOUNT); $('.p-magazine .p-magazine__email').attr('name', 'email'); $('.p-magazine .p-magazine__c-email').attr('name', '_email'); //フッターリンク置き換え $('.p-footer_link .info-company a').attr("href",'https://store.shopping.yahoo.co.jp/' + STORE_ACCOUNT + '/info.html'); $('.p-footer_link .info-payment a').attr("href",'https://store.shopping.yahoo.co.jp/' + STORE_ACCOUNT + '/guide.html'); $('.p-footer_link .info-contact a').attr("href",'https://inform.shopping.yahoo.co.jp/' + STORE_ACCOUNT + '/contact.html'); $('.p-footer_link .info-category').hide(); $('.p-footer_link .info-mall a').attr("href",'https://shopping.yahoo.co.jp/').text("Yahoo!ショッピング"); //ソーシャルリンク書き換え $('.c-social__facebook__img').attr("href","https://www.facebook.com/share.php?u="+encodeURI("https://shopping.geocities.jp/" + STORE_ACCOUNT + "/")); $('.c-social__twitter__img').attr("href","https://twitter.com/share?url="+encodeURI("https://shopping.geocities.jp/" + STORE_ACCOUNT + "/")+"&text="+$("title").text()); } // 時間生成 var datetime = dateObj.getFullYear() * 100000000 + (dateObj.getMonth()+1) * 1000000 + dateObj.getDate() * 10000 + dateObj.getHours() * 100 + dateObj.getMinutes(); $(".c-bnr__item").each(function() { // 両方設定されていない時 if (!$(this).attr("data-start-date") && !$(this).attr("data-end-date")) $(this).show(); // 開始のみ設定されている時 else if ($(this).attr("data-start-date") <= datetime && !$(this).attr("data-end-date")) $(this).show(); // 終了のみ設定されている時 else if (!$(this).attr("data-start-date") && datetime <= $(this).attr("data-end-date")) $(this).show(); // 開始・終了とも設定されている時 else if ($(this).attr("data-start-date") <= datetime && datetime <= $(this).attr("data-end-date")) $(this).show(); else $(this).remove(); }); // if($('.ranking-data-view').length){ // getRankingData(); } }); //*************************************************************************** // 指定された順番に従って各種ブロック処理を実行する。 // 初回起動は HTML 側の「スクリプト制御ブロック」から実行される。 // // [補足] // accessOrder 変数 は HTML 側の「スクリプト制御ブロック」にて // 宣言されている。 //*************************************************************************** function startAccess() { // アップロードモード省略時 if(typeof uploadMode === "undefined") uploadMode = ""; //全ての処理が完了していたら何もしない if (accessOrderIndex >= accessOrder.length) return; //ローディング表示 if (accessOrderIndex == 0) setHtmlLoading(); //各種処理 generateBlock(accessOrder[accessOrderIndex]) .then({}, function(e) { accessOrderIndex++; }) .done(function() { setTimeout(function(){ startAccess(); }, INTERVAL_NEXT_BLOCK_ACCESS); }); } //*************************************************************************** // 指定されたオーダーのブロック処理を実行する。 // // [パラメータ] // pid … パーツIDとNOの配列 // // [戻り値] // Promise オブジェクトを返す。 //*************************************************************************** function generateBlock(pid) { ELEMENT_NAME = "#itemlist_"+pid[0]+"_"+pid[1]; ELEMENT_NO = $(ELEMENT_NAME).attr("data-no"); switch (pid[0]) { case 2: return generateBlockNewUpdate(ELEMENT_NAME,false); case 3: return generateBlockPoint(ELEMENT_NAME,false); case 4: return generateBlockReviewCount(ELEMENT_NAME,false); case 5: return generateBlockPostageFree(ELEMENT_NAME,false); case 6: return generateBlockReviewAverage(ELEMENT_NAME,false); case 7: // 要素を非表示にしておく(パラパラと追加されるため) $(ELEMENT_NAME).find(".c-itemlist__wrap").hide(); return generateBlockBlock(ELEMENT_NAME,ELEMENT_NO,false); case 18: return generateBlockRandom(ELEMENT_NAME,false); default: accessOrderIndex++; return $.Deferred().rejected().promise(); } } //*************************************************************************** // ランダム自動表示 ブロックのページを移動する。 // // [パラメータ] // add … ページ増加数 //*************************************************************************** function moveBlockRandom(ELEMENT_NAME,add) { //既にページ移動中なら何もしない if (pageMoving['Random']) return; pageMoving['Random'] = true; //ローディング表示 $(ELEMENT_NAME).find(".c-itemlist__wrap").html(""); setHtmlLoading(ELEMENT_NAME); //スクロール位置調整 toScroll(ELEMENT_NAME); //ページ増減 itemsPage['Random'] += add; //移動開始 generateBlockRandom(ELEMENT_NAME,true); } //*************************************************************************** // ランダム自動表示 ブロックの HTML を生成する。 // // [パラメータ] // paging … 「次へ」「前へ」を持つページング形式で表示するかどうか //*************************************************************************** function generateBlockRandom(ELEMENT_NAME,paging) { // 複数パーツ対応 // api結果セットにELEMENT_NAMEに該当するキーをセット if(ELEMENT_NAME in randomMallApiResultSet == false) { randomMallApiResultSet[ELEMENT_NAME] = randomMallApiResultSetFormat; } // 商品リストにELEMENT_NAMEに該当するキーをセット if(ELEMENT_NAME in randomItemList == false) { randomItemList[ELEMENT_NAME] = []; } // 商品リストの読み出しオフセット(ページネーション)範囲を特定 var sliceBigin = 0; var sliceEnd = 0; if(uploadMode == "common") var goodsCountPerPage = getCommonPageGoodsCount(ELEMENT_NAME); // 共通コンテンツの表示ページングの商品表示数(定数読み出し) else var goodsCountPerPage = getGoodsCount(ELEMENT_NAME,paging); // 表示ページングの商品表示数(定数読み出し) if(paging){ sliceBigin = (itemsPage['Random'] - 1 ) * goodsCountPerPage; sliceEnd = sliceBigin + goodsCountPerPage; }else{ sliceBigin = 0; sliceEnd = goodsCountPerPage; } // 読み出し済み商品リストから該当範囲をスライスする var displayItemList = randomItemList[ELEMENT_NAME].slice(sliceBigin, sliceEnd); // ページ当たり表示数が確保できず、かつAPIに未読み込みがある場合には、表示処理をスキップ var isDisplay = true; if(displayItemList.length < goodsCountPerPage) { if(MALL=="楽天店") { // 楽天モールの場合 if (randomMallApiResultSet[ELEMENT_NAME]['page'] === 0 || randomMallApiResultSet[ELEMENT_NAME]['page'] < randomMallApiResultSet[ELEMENT_NAME]['pageCount']) { isDisplay = false; } } else { // Yahooモールの場合 if (randomMallApiResultSet[ELEMENT_NAME]['ResultSet']['totalResultsAvailable'] === null || randomMallApiResultSet[ELEMENT_NAME]['ResultSet']['totalResultsReturned'] < randomMallApiResultSet[ELEMENT_NAME]['ResultSet']['totalResultsAvailable']) { isDisplay = false; } } } // ページ当たり表示数が確保できた、もしくは、API未読み込みがない場合は表示処理 if(isDisplay) { // 各モールAPI返却値の構造に擬態する var data = { pageCount : 0, // 楽天API:総ページ数 page : 0, // 楽天API:現在のページ番号 count : 0, // 楽天API:検索結果の総商品数 ResultSet : { // YahooAPIの返却値構造 totalResultsAvailable : 0, // YahooAPI:検索ヒット総数 totalResultsReturned : 0, // YahooAPI:取得済み商品数 } }; if(MALL=="楽天店") { data['pageCount'] = (randomMallApiResultSet[ELEMENT_NAME]['pageCount'] * 30) / goodsCountPerPage; data['count'] = randomMallApiResultSet[ELEMENT_NAME]['count']; data['Items'] = displayItemList; // 商品情報 } else { data['ResultSet']['totalResultsAvailable'] = randomMallApiResultSet[ELEMENT_NAME]['ResultSet']['totalResultsAvailable']; data['ResultSet']['totalResultsReturned'] = displayItemList.length; // generateGoods関数内、商品描画回数で使用 data['ResultSet'][0] = { Result : displayItemList }; } // 表示処理 ---------------------> //ローディング非表示 $(ELEMENT_NAME + ' .loading').html(""); //試用期限が来ていたら、メッセージ追加 if(data.error == 'access deny') { setHtmlItemError(ELEMENT_NAME); //試用期限が来ていなかったら }else{ //商品表示 generateGoods(ELEMENT_NAME, "Random", data, paging); //追加された商品数を取得 var count = $(ELEMENT_NAME).find('div.c-itemlist__wrap a').length; //商品が存在しなかったら、メッセージを追加し、1要素目を非表示 if (count == 1) { setHtmlItemNull(ELEMENT_NAME); } //商品が存在するか、ページング形式なら、ナビゲーション表示 if ((count > 1) || paging) { generateNavigationFromData(ELEMENT_NAME, 'Random', paging, data); } } //ページング形式なら、ページ移動中を解除する if(paging) { pageMoving['Random'] = false; } else { //初期表示形式なら、読み込み対象ブロックを進める accessOrderIndex++; } addGoodsSlick(ELEMENT_NAME); // 終了 return $.Deferred().resolve().promise(); } // end of if(isDisplay) // 読み出し済みパーツリストにスライス範囲がない場合 // APIリクエスト済み、かつ取得可能な商品情報がない場合は処理終了 // 楽天モールの場合 if(randomMallApiResultSet[ELEMENT_NAME]['page'] > 0 && randomMallApiResultSet[ELEMENT_NAME]['page'] == randomMallApiResultSet[ELEMENT_NAME]['pageCount']) { return $.Deferred().resolve().promise(); } // Yahooモールの場合 if(randomMallApiResultSet[ELEMENT_NAME]['ResultSet']['totalResultsAvailable'] !== null && randomMallApiResultSet[ELEMENT_NAME]['ResultSet']['totalResultsAvailable'] == randomMallApiResultSet[ELEMENT_NAME]['ResultSet']['totalResultsReturned']) { return $.Deferred().resolve().promise(); } // apiリクエストのパラメータ生成 var parameter = ''; if(MALL=="楽天店") { parameter = 'sort=standard&imageFlag=1&availability=1'; // 楽天標準ソート、商品画像あり、販売可能商品を指定 parameter += '&hits=30'; // 1ページあたり取得件数(楽天API仕様:1〜30) if(paging) { parameter += '&page=' + (randomMallApiResultSet[ELEMENT_NAME]['page'] + 1); // 取得ページ } } else { parameter = 'sort=' + encodeURIComponent('+score') + '&availability=1&image_size=300'; parameter += '&hits=30'; // 1ページあたり取得件数(YahooAPI仕様:1〜50) if(paging) { parameter += '&offset=' + randomMallApiResultSet[ELEMENT_NAME]['ResultSet']['totalResultsReturned']; } } //apiリクエストを同期的に処理する var deferred = new $.Deferred; //API アクセス開始 $.ajax({ type : 'POST', url : API_URL, data : { sumaou_account : SUMAOU_ACCOUNT, api_access_code : API_ACCESS_CODE, parameter : parameter } }).done(function(data) { //検索結果の商品データを未選択リストに併合、返却パラメータを格納 var resultItemCount = 0; // 取得したアイテム個数 var resultItemList = []; // 取得した商品リスト if(MALL=="楽天店") { resultItemCount = data.Items.length; resultItemList = data.Items; randomMallApiResultSet[ELEMENT_NAME]['pageCount'] = data.pageCount; // 総ページ数 randomMallApiResultSet[ELEMENT_NAME]['page'] = data.page; // 現在ページ番号 randomMallApiResultSet[ELEMENT_NAME]['count'] = data.count; // 検索結果総数 } else { resultItemCount = data.ResultSet.totalResultsReturned; // data.ResultSet[0].Resultがオブジェクト型のため配列に変換 for(var i = 0; i < data.ResultSet.totalResultsReturned; i++) { resultItemList.push(data.ResultSet[0].Result[i]); } randomMallApiResultSet[ELEMENT_NAME]['ResultSet']['totalResultsAvailable'] = data.ResultSet.totalResultsAvailable - 0; // 検索ヒット総数。str->int型にキャスト randomMallApiResultSet[ELEMENT_NAME]['ResultSet']['totalResultsReturned'] += data.ResultSet.totalResultsReturned; // 取得した商品数の累算値を保持する } // 取得結果をランダムに並び替えて保持リストに格納 while(true) { // 取得結果がない場合、もしくは格納が完了したらブレイク if(resultItemList.length == 0) { break; } var tempIndex = Math.floor(Math.random() * resultItemList.length); randomItemList[ELEMENT_NAME].push(resultItemList[tempIndex]); // ランダムに対応する商品を保持リストに追加 resultItemList.splice(tempIndex,1); // 取得結果から削除 } // 取得結果があった場合には再処理する if(resultItemCount > 0) { generateBlockRandom(ELEMENT_NAME,paging); } deferred.resolve(); // 正常終了 }).fail(function(jqXHR, textStatus, errorThrown) { //試用期限が来ていたら if ((jqXHR.responseJSON) && (jqXHR.responseJSON.error != null) && (jqXHR.responseJSON.error == 'access deny')) { //メッセージ追加 setHtmlItemError(ELEMENT_NAME); //ページング形式なら、ページ移動中を解除する if (paging) pageMoving['Random'] = false; //初期表示形式なら、読み込み対象ブロックを進める else accessOrderIndex++; //正常終了 deferred.resolve(); } else { // リトライ処理 setTimeout(function() { generateBlockRandom(ELEMENT_NAME,paging); }, INTERVAL_RETRY_ERROR_BLOCK); } }); //Promise オブジェクトを返す return deferred.promise(); } //*************************************************************************** // 新着・更新アイテム ブロックのページを移動する。 // // [パラメータ] // add … ページ増加数 //*************************************************************************** function moveBlockNewUpdate(ELEMENT_NAME,add) { //既にページ移動中なら何もしない if (pageMoving['NewUpdate']) return; pageMoving['NewUpdate'] = true; //ローディング表示 $(ELEMENT_NAME).find(".c-itemlist__wrap").html(""); setHtmlLoading(ELEMENT_NAME); //スクロール位置調整 toScroll(ELEMENT_NAME); //ページ増減 itemsPage['NewUpdate'] += add; //移動開始 generateBlockNewUpdate(ELEMENT_NAME,true); } //*************************************************************************** // 新着・更新アイテム ブロックの HTML を生成する。 // // [パラメータ] // paging … 「次へ」「前へ」を持つページング形式で表示するかどうか //*************************************************************************** function generateBlockNewUpdate(ELEMENT_NAME,paging) { //Deferred オブジェクト生成 var deferred = new $.Deferred; //パラメータ生成 if(MALL=="楽天店") { var parameter = 'sort=-updateTimestamp&imageFlag=1'; if (paging) parameter += '&hits=' + getGoodsCount(ELEMENT_NAME,paging) + '&page=' + itemsPage['NewUpdate']; else { if(uploadMode=="common") parameter += '&hits=' + getCommonPageGoodsCount(ELEMENT_NAME); else parameter += '&hits=' + getGoodsCount(ELEMENT_NAME); } } else { var parameter = 'sort=' + encodeURIComponent('+score') + '&availability=1&image_size=300'; if (paging) parameter += '&hits=' + getGoodsCount(ELEMENT_NAME,paging) + '&offset=' + (itemsPage['NewUpdate']-1)*getGoodsCount(ELEMENT_NAME,paging); else { if(uploadMode=="common") parameter += '&hits=' + getCommonPageGoodsCount(ELEMENT_NAME); else parameter += '&hits=' + getGoodsCount(ELEMENT_NAME); } } //API アクセス開始 $.ajax({ type: 'POST', url: API_URL, data: { sumaou_account: SUMAOU_ACCOUNT, api_access_code: API_ACCESS_CODE, parameter: parameter } //アクセス成功 }).done(function(data) { //ローディング非表示 $(ELEMENT_NAME + ' .loading').html(""); //試用期限が来ていたら、メッセージ追加 if (data.error == 'access deny') setHtmlItemError(ELEMENT_NAME); //試用期限が来ていなかったら else { //商品表示 generateGoods(ELEMENT_NAME, "NewUpdate", data, paging); //追加された商品数を取得 var count = $(ELEMENT_NAME).find('div.c-itemlist__wrap a').length; //商品が存在しなかったら、メッセージを追加し、1要素目を非表示 if (count == 1) { setHtmlItemNull(ELEMENT_NAME); } //商品が存在するか、ページング形式なら、ナビゲーション表示 if ((count > 1) || paging) generateNavigationFromData(ELEMENT_NAME, 'NewUpdate',paging, data); } //ページング形式なら、ページ移動中を解除する if (paging) pageMoving['NewUpdate'] = false; //初期表示形式なら、読み込み対象ブロックを進める else accessOrderIndex++; //正常終了 deferred.resolve(); addGoodsSlick(ELEMENT_NAME); //アクセス失敗 }).fail(function(jqXHR, textStatus, errorThrown) { //試用期限が来ていたら if ((jqXHR.responseJSON) && (jqXHR.responseJSON.error != null) && (jqXHR.responseJSON.error == 'access deny')) { //メッセージ追加 setHtmlItemError(ELEMENT_NAME); //ページング形式なら、ページ移動中を解除する if (paging) pageMoving['NewUpdate'] = false; //初期表示形式なら、読み込み対象ブロックを進める else accessOrderIndex++; //正常終了 deferred.resolve(); //それ以外ならリトライ } else { setTimeout(function() { generateBlockNewUpdate(ELEMENT_NAME,paging); }, INTERVAL_RETRY_ERROR_BLOCK); } }); //Promise オブジェクトを返す return deferred.promise(); } //*************************************************************************** // ポイント ブロックのページを移動する。 // // [パラメータ] // add … ページ増加数 //*************************************************************************** function moveBlockPoint(ELEMENT_NAME,add) { //既にページ移動中なら何もしない if (pageMoving['Point']) return; pageMoving['Point'] = true; //ローディング表示 $(ELEMENT_NAME).find(".c-itemlist__wrap").html(""); setHtmlLoading(ELEMENT_NAME); //スクロール位置調整 toScroll(ELEMENT_NAME); //ページ増減 itemsPage['Point'] += add; //移動開始 generateBlockPoint(ELEMENT_NAME,true); } //*************************************************************************** // ポイント ブロックの HTML を生成する。 // // [パラメータ] // paging … 「次へ」「前へ」を持つページング形式で表示するかどうか //*************************************************************************** function generateBlockPoint(ELEMENT_NAME,paging) { // パーツ要素にポイント用クラス追加 $(ELEMENT_NAME).addClass("c-pointup"); //Deferred オブジェクト生成 var deferred = new $.Deferred; //パラメータ生成 if(MALL=="楽天店") { var parameter = 'pointRateFlag=1&imageFlag=1'; if (paging) parameter += '&hits=' + getGoodsCount(ELEMENT_NAME,paging) + '&page=' + itemsPage['Point']; else { if(uploadMode=="common") parameter += '&hits=' + getCommonPageGoodsCount(ELEMENT_NAME); else parameter += '&hits=' + getGoodsCount(ELEMENT_NAME); } } else { var hits = 50; if ((pointDataIndex + hits) >= 999) hits = 999 - pointDataIndex; var parameter = 'license=guest&availability=1&offset=' + pointDataIndex + '&hits=' + hits + '&image_size=300'; } //API アクセス開始 $.ajax({ type: 'POST', url: API_URL, data: { sumaou_account: SUMAOU_ACCOUNT, api_access_code: API_ACCESS_CODE, parameter: parameter } //アクセス成功 }).done(function(data) { //ローディング非表示 $(ELEMENT_NAME + ' .loading').html(""); //試用期限が来ていたら、メッセージ追加 if (data.error == 'access deny') //試用期限が来ていなかったら setHtmlItemError(ELEMENT_NAME); else if(MALL=="楽天店") { //商品表示 generateGoods(ELEMENT_NAME, 'Point', data, paging); //追加された商品数を取得 var count = data.count; //商品が存在しなかったら、メッセージを追加 if (count == 0) setHtmlItemNull(ELEMENT_NAME); //商品が存在するか、ページング形式なら、ナビゲーション表示 if ((count > 0) || paging) generateNavigationFromData(ELEMENT_NAME, 'Point', paging, data); } else if(MALL=="Yahoo!店") { if ((data !== undefined) && (data.ResultSet !== undefined) && (data.ResultSet.totalResultsReturned !== undefined)) { //ポイント情報 pointDataIndex += data.ResultSet.totalResultsReturned; pointDataCount = (data.ResultSet.totalResultsAvailable < 999) ? data.ResultSet.totalResultsAvailable : 999; //商品表示 generateGoods(ELEMENT_NAME, 'Point', data, false); //商品検索が最後まで達したか、ヒットしたデータが最大値に達していたら、読み込み対象ブロックを進める if ( uploadMode != "common" && ( (pointDataIndex >= pointDataCount) || (pointHitCount >= getGoodsCount(ELEMENT_NAME)) )) { //商品が一件も存在しなかったら、メッセージを追加 if (pointHitCount == 0) setHtmlItemNull(ELEMENT_NAME); // HTML 出力 $(ELEMENT_NAME).find('div.c-itemlist__wrap').append(yahooPointUpDataList); addGoodsSlick(ELEMENT_NAME); accessOrderIndex++; } else if ( uploadMode == "common" && ( (pointDataIndex >= pointDataCount) || (pointHitCount >= getCommonPageGoodsCount(ELEMENT_NAME)) )) { //商品が一件も存在しなかったら、メッセージを追加 if (pointHitCount == 0) setHtmlItemNull(ELEMENT_NAME); // HTML 出力 $(ELEMENT_NAME).find('div.c-itemlist__wrap').append(yahooPointUpDataList); addGoodsSlick(ELEMENT_NAME); accessOrderIndex++; } else { // リストの生成途中で slick 設定を行ってはいけない。addGoodsSlick をコメントアウト。 //addGoodsSlick(ELEMENT_NAME); //商品が一件も存在しなかったら、メッセージを追加 if (pointHitCount == 0) setHtmlItemNull(ELEMENT_NAME); } } } if (MALL == "楽天店") { //ページング形式なら、ページ移動中を解除する if (paging) pageMoving['Point'] = false; //初期表示形式なら、読み込み対象ブロックを進める else accessOrderIndex++; addGoodsSlick(ELEMENT_NAME); } //正常終了 deferred.resolve(); //アクセス失敗 }).fail(function(jqXHR, textStatus, errorThrown) { //試用期限が来ていたら if ((jqXHR.responseJSON) && (jqXHR.responseJSON.error != null) && (jqXHR.responseJSON.error == 'access deny')) { //メッセージ追加 setHtmlItemError(ELEMENT_NAME); //ページング形式なら、ページ移動中を解除する if (paging) pageMoving['Point'] = false; //初期表示形式なら、読み込み対象ブロックを進める else accessOrderIndex++; //正常終了 deferred.resolve(); //それ以外ならリトライ } else { setTimeout(function() { generateBlockPoint(ELEMENT_NAME,paging); }, INTERVAL_RETRY_ERROR_BLOCK); } }); //Promise オブジェクトを返す return deferred.promise(); } //*************************************************************************** // レビュー件数順ブロックのページを移動する。 // // [パラメータ] // add … ページ増加数 //*************************************************************************** function moveBlockReviewCount(ELEMENT_NAME,add) { //既にページ移動中なら何もしない if (pageMoving['ReviewCount']) return; pageMoving['ReviewCount'] = true; //ローディング表示 $(ELEMENT_NAME).find(".c-itemlist__wrap").html(""); setHtmlLoading(ELEMENT_NAME); //スクロール位置調整 toScroll(ELEMENT_NAME); //ページ増減 itemsPage['ReviewCount'] += add; //移動開始 generateBlockReviewCount(ELEMENT_NAME,true); } //*************************************************************************** // レビュー件数順ブロックの HTML を生成する。 // // [パラメータ] // paging … 「次へ」「前へ」を持つページング形式で表示するかどうか //*************************************************************************** function generateBlockReviewCount(ELEMENT_NAME,paging) { //Deferred オブジェクト生成 var deferred = new $.Deferred; //パラメータ生成 if(MALL=="楽天店") { var parameter = 'sort=' + encodeURIComponent('-reviewCount') + '&availability=1&imageFlag=1'; if (paging) parameter += '&hits=' + getGoodsCount(ELEMENT_NAME,paging) + '&page=' + itemsPage['ReviewCount']; else { if(uploadMode=="common") parameter += '&hits=' + getCommonPageGoodsCount(ELEMENT_NAME); else parameter += '&hits=' + getGoodsCount(ELEMENT_NAME); } } else { var parameter = 'sort=' + encodeURIComponent('-review_count'); if (paging) parameter += '&hits=' + getGoodsCount(ELEMENT_NAME,paging) + '&offset=' + (itemsPage['ReviewCount']-1)*getGoodsCount(ELEMENT_NAME,paging); else { if(uploadMode=="common") parameter += '&hits=' + getCommonPageGoodsCount(ELEMENT_NAME); else parameter += '&hits=' + getGoodsCount(ELEMENT_NAME); } } //API アクセス開始 $.ajax({ type: 'POST', url: API_URL, data: { sumaou_account: SUMAOU_ACCOUNT, api_access_code: API_ACCESS_CODE, parameter: parameter } //アクセス成功 }).done(function(data) { //ローディング非表示 $(ELEMENT_NAME + ' .loading').html(""); //試用期限が来ていたら、メッセージ追加 if (data.error == 'access deny') setHtmlItemError(ELEMENT_NAME); //試用期限が来ていなかったら else { //商品表示 generateGoods(ELEMENT_NAME, 'ReviewCount', data, paging); //追加された商品数を取得 if (MALL=="楽天店") var count = data.count; else var count = data.ResultSet.totalResultsAvailable; //商品が存在しなかったら、メッセージを追加 if (count == 0) setHtmlItemNull(ELEMENT_NAME); //商品が存在するか、ページング形式なら、ナビゲーション表示 if ((count > 0) || paging) generateNavigationFromData(ELEMENT_NAME, 'ReviewCount', paging, data); } //ページング形式なら、ページ移動中を解除する if (paging) pageMoving['ReviewCount'] = false; //初期表示形式なら、読み込み対象ブロックを進める else accessOrderIndex++; addGoodsSlick(ELEMENT_NAME); //正常終了 deferred.resolve(); //アクセス失敗 }).fail(function(jqXHR, textStatus, errorThrown) { //試用期限が来ていたら if ((jqXHR.responseJSON) && (jqXHR.responseJSON.error != null) && (jqXHR.responseJSON.error == 'access deny')) { //メッセージ追加 setHtmlItemError(ELEMENT_NAME); //ページング形式なら、ページ移動中を解除する if (paging) pageMoving['ReviewCount'] = false; //初期表示形式なら、読み込み対象ブロックを進める else accessOrderIndex++; //正常終了 deferred.resolve(); //それ以外ならリトライ } else { setTimeout(function(){ generateBlockReviewCount(ELEMENT_NAME,paging); }, INTERVAL_RETRY_ERROR_BLOCK); } }); //Promise オブジェクトを返す return deferred.promise(); } //*************************************************************************** // 送料無料ブロックのページを移動する。 // // [パラメータ] // add … ページ増加数 //*************************************************************************** function moveBlockPostageFree(ELEMENT_NAME,add) { //既にページ移動中なら何もしない if (pageMoving['PostageFree']) return; pageMoving['PostageFree'] = true; //ローディング表示 $(ELEMENT_NAME).find(".c-itemlist__wrap").html(""); setHtmlLoading(ELEMENT_NAME); //スクロール位置調整 toScroll(ELEMENT_NAME); //ページ増減 itemsPage['PostageFree'] += add; //移動開始 generateBlockPostageFree(ELEMENT_NAME,true); } //*************************************************************************** // 送料無料ブロックの HTML を生成する。 // // [パラメータ] // paging … 「次へ」「前へ」を持つページング形式で表示するかどうか //*************************************************************************** function generateBlockPostageFree(ELEMENT_NAME,paging) { //Deferred オブジェクト生成 var deferred = new $.Deferred; //パラメータ生成 if(MALL=="楽天店") { var parameter = 'postageFlag=1&sort=' + encodeURIComponent('+itemPrice') + '&availability=1&imageFlag=1'; if (paging) parameter += '&hits=' + getGoodsCount(ELEMENT_NAME,paging) + '&page=' + itemsPage['PostageFree']; else { if(uploadMode=="common") parameter += '&hits=' + getCommonPageGoodsCount(ELEMENT_NAME); else parameter += '&hits=' + getGoodsCount(ELEMENT_NAME); } } else { var parameter = 'sort=' + encodeURIComponent('+price') + '&shipping=1&availability=1&image_size=300'; if (paging) parameter += '&hits=' + getGoodsCount(ELEMENT_NAME,paging) + '&offset=' + (itemsPage['PostageFree']-1)*getGoodsCount(ELEMENT_NAME,paging); else { if(uploadMode=="common") parameter += '&hits=' + getCommonPageGoodsCount(ELEMENT_NAME); else parameter += '&hits=' + getGoodsCount(ELEMENT_NAME); } } //API アクセス開始 $.ajax({ type: 'POST', url: API_URL, data: { sumaou_account: SUMAOU_ACCOUNT, api_access_code: API_ACCESS_CODE, parameter: parameter } //アクセス成功 }).done(function(data) { //ローディング非表示 $(ELEMENT_NAME + ' .loading').html(""); //試用期限が来ていたら、メッセージ追加 if (data.error == 'access deny') setHtmlItemError(ELEMENT_NAME); //試用期限が来ていなかったら else { //商品表示 generateGoods(ELEMENT_NAME, 'PostageFree', data, paging); //追加された商品数を取得 if (MALL=="楽天店") var count = data.count; else var count = data.ResultSet.totalResultsAvailable; //商品が存在しなかったら、メッセージを追加 if (count == 0) setHtmlItemNull(ELEMENT_NAME); //商品が存在するか、ページング形式なら、ナビゲーション表示 if ((count > 0) || paging) generateNavigationFromData(ELEMENT_NAME, 'PostageFree', paging, data); } //ページング形式なら、ページ移動中を解除する if (paging) pageMoving['PostageFree'] = false; //初期表示形式なら、読み込み対象ブロックを進める else accessOrderIndex++; addGoodsSlick(ELEMENT_NAME); //正常終了 deferred.resolve(); //アクセス失敗 }).fail(function(jqXHR, textStatus, errorThrown) { //試用期限が来ていたら if ((jqXHR.responseJSON) && (jqXHR.responseJSON.error != null) && (jqXHR.responseJSON.error == 'access deny')) { //メッセージ追加 setHtmlItemError(ELEMENT_NAME); //ページング形式なら、ページ移動中を解除する if (paging) pageMoving['PostageFree'] = false; //初期表示形式なら、読み込み対象ブロックを進める else accessOrderIndex++; //正常終了 deferred.resolve(); //それ以外ならリトライ } else { setTimeout(function(){ generateBlockPostageFree(ELEMENT_NAME,paging); }, INTERVAL_RETRY_ERROR_BLOCK); } }); //Promise オブジェクトを返す return deferred.promise(); } //*************************************************************************** // レビュー平均点順ブロックのページを移動する。 // // [パラメータ] // add … ページ増加数 //*************************************************************************** function moveBlockReviewAverage(ELEMENT_NAME,add) { //既にページ移動中なら何もしない if (pageMoving['ReviewAverage']) return; pageMoving['ReviewAverage'] = true; //ローディング表示 $(ELEMENT_NAME).find(".c-itemlist__wrap").html(""); setHtmlLoading(ELEMENT_NAME); //スクロール位置調整 toScroll(ELEMENT_NAME); //ページ増減 itemsPage['ReviewAverage'] += add; //移動開始 generateBlockReviewAverage(ELEMENT_NAME,true); } //*************************************************************************** // レビュー平均点順ブロックの HTML を生成する。 // // [パラメータ] // paging … 「次へ」「前へ」を持つページング形式で表示するかどうか //*************************************************************************** function generateBlockReviewAverage(ELEMENT_NAME,paging) { //Deferred オブジェクト生成 var deferred = new $.Deferred; //パラメータ生成 if(MALL=="楽天店") { var parameter = 'sort=' + encodeURIComponent('-reviewAverage') + '&availability=1&imageFlag=1'; if (paging) parameter += '&hits=' + getGoodsCount(ELEMENT_NAME,paging) + '&page=' + itemsPage['ReviewAverage']; else { if(uploadMode=="common") parameter += '&hits=' + getCommonPageGoodsCount(ELEMENT_NAME); else parameter += '&hits=' + getGoodsCount(ELEMENT_NAME); } } else { var parameter = 'sort=' + encodeURIComponent('+sold') + '&availability=1&image_size=300'; if (paging) parameter += '&hits=' + getGoodsCount(ELEMENT_NAME,paging) + '&offset=' + (itemsPage['ReviewAverage']-1)*getGoodsCount(ELEMENT_NAME,paging); else { if(uploadMode=="common") parameter += '&hits=' + getCommonPageGoodsCount(ELEMENT_NAME); else parameter += '&hits=' + getGoodsCount(ELEMENT_NAME); } } //API アクセス開始 $.ajax({ type: 'POST', url: API_URL, data: { sumaou_account: SUMAOU_ACCOUNT, api_access_code: API_ACCESS_CODE, parameter: parameter } //アクセス成功 }).done(function(data) { //ローディング非表示 $(ELEMENT_NAME + ' .loading').html(""); //試用期限が来ていたら、メッセージ追加 if (data.error == 'access deny') setHtmlItemError(ELEMENT_NAME); //試用期限が来ていなかったら else { //商品表示 generateGoods(ELEMENT_NAME, 'ReviewAverage', data, paging); //追加された商品数を取得 if (MALL=="楽天店") var count = data.count; else var count = data.ResultSet.totalResultsAvailable; //商品が存在しなかったら、メッセージを追加 if (count == 0) setHtmlItemNull(ELEMENT_NAME); //商品が存在するか、ページング形式なら、ナビゲーション表示 if ((count > 0) || paging) generateNavigationFromData(ELEMENT_NAME, 'ReviewAverage', paging, data); } //ページング形式なら、ページ移動中を解除する if (paging) pageMoving['ReviewAverage'] = false; //初期表示形式なら、読み込み対象ブロックを進める else accessOrderIndex++; addGoodsSlick(ELEMENT_NAME); //正常終了 deferred.resolve(); //アクセス失敗 }).fail(function(jqXHR, textStatus, errorThrown) { //試用期限が来ていたら if ((jqXHR.responseJSON) && (jqXHR.responseJSON.error != null) && (jqXHR.responseJSON.error == 'access deny')) { //メッセージ追加 setHtmlItemError(ELEMENT_NAME); //ページング形式なら、ページ移動中を解除する if (paging) pageMoving['ReviewAverage'] = false; //初期表示形式なら、読み込み対象ブロックを進める else accessOrderIndex++; //正常終了 deferred.resolve(); //それ以外ならリトライ } else { setTimeout(function(){ generateBlockReviewAverage(paging); }, INTERVAL_RETRY_ERROR_BLOCK); } }); //Promise オブジェクトを返す return deferred.promise(); } //*************************************************************************** // 追加ブロックのページを移動する。 // // [パラメータ] // no … 追加ブロックの番号(1 か 2) // add … ページ増加数 // first … 初期ページ移動かどうか // // [補足] // blockKeywords 変数、blockGoods 変数 は // HTML 側の「スクリプト制御ブロック」にて宣言されている。 //*************************************************************************** function moveBlockBlock(ELEMENT_NAME, no, add, first) { //省略引数デフォルト設定 if (first === undefined) first = true; //初期ページ移動なら if (first) { //既にページ移動中なら何もしない if (pageMoving['Block' + no]) return; pageMoving['Block' + no] = true; //ローディング表示 $(ELEMENT_NAME).find("div.c-itemlist__wrap").html("").hide(); setHtmlLoading(ELEMENT_NAME); //スクロール位置調整 toScroll(ELEMENT_NAME); //ページ増減 itemsPage['Block' + no] += add; //キーワードが設定されておらず、商品IDが設定されていたら、参照商品IDを調整 if ((!blockKeywords[no] || (blockKeywords[no].length == 0)) && (blockGoods[no] && blockGoods[no].length > 0)){ if(uploadMode=="common") itemCodeIndex['Block' + no] = (itemsPage['Block' + no] - 1) * getCommonPageGoodsCount(ELEMENT_NAME,first); else itemCodeIndex['Block' + no] = (itemsPage['Block' + no] - 1) * getGoodsCount(ELEMENT_NAME,first); } // キーワードが設定されておらず、商品IDが設定されていたら、参照商品IDを調整 if((typeof specialPageBlockKeywords === 'undefined') || (typeof specialPageBlockKeywords !== 'undefined' && specialPageBlockKeywords[no].length < 1)){ if(typeof specialPageBlockGoods !== 'undefined' && specialPageBlockGoods[no] && specialPageBlockGoods[no].length > 0){ itemCodeIndex['Block' + no] = (itemsPage['Block' + no] - 1) * getSpecialPageGoodsCount(ELEMENT_NAME, first); } } } //アクセス開始 generateBlockBlock(ELEMENT_NAME, no, true) .done(function() { //ページ移動中が解除されていなかったら、アクセスを継続する if (pageMoving['Block' + no]) setTimeout(function(){ moveBlockBlock(ELEMENT_NAME, no, 0, false); }, INTERVAL_NEXT_BLOCK_ACCESS); }); } //*************************************************************************** // 追加ブロックの HTML を生成する。 // // [パラメータ] // no … 追加ブロックの番号 // paging … 「次へ」「前へ」を持つページング形式で表示するかどうか // // [補足] // blockKeywords 変数、blockGoods 変数 は // HTML 側の「スクリプト制御ブロック」にて宣言されている。 //*************************************************************************** function generateBlockBlock(ELEMENT_NAME, no, paging) { //Deferred オブジェクト生成 var deferred = new $.Deferred; //itemsPageがなければ生成 if(itemsPage['Block'+no] === undefined) itemsPage['Block'+no] = 1; //itemCodeIndexがなければ生成 if(itemCodeIndex['Block'+no] === undefined) itemCodeIndex['Block'+no] = 0; //pageMovingがなければ生成 if(pageMoving['Block'+no] === undefined) pageMoving['Block'+no] = false; //処理定義 var access = { //アクセス開始 start: function() { //キーワードが設定されていたら、キーワード検索用のパラメータを生成 if (typeof blockKeywords != "undefined" && blockKeywords[no] && blockKeywords[no].length > 0) { var goods = false; if(MALL=="楽天店") { var parameter = 'keyword=' + encodeURIComponent(blockKeywords[no].join(' ')) + '&sort=-updateTimestamp&availability=1&orFlag=1&imageFlag=1'; if (paging) parameter += '&hits=' + getGoodsCount(ELEMENT_NAME,paging) + '&page=' + itemsPage['Block' + no]; else { if(uploadMode=="common") parameter += '&hits=' + getCommonPageGoodsCount(ELEMENT_NAME); else parameter += '&hits=' + getGoodsCount(ELEMENT_NAME); } // 除外キーワードがある場合 if (typeof blockExcludeKeywords != "undefined" && blockExcludeKeywords[no] && blockExcludeKeywords[no].length > 0) parameter += '&NGKeyword=' + encodeURIComponent(blockExcludeKeywords[no].join(' ')); } else { var excludeKeywords = ""; if(typeof blockExcludeKeywords != "undefined" && blockExcludeKeywords[no] && blockExcludeKeywords[no].length > 0) { // 初回のみ、キーワードパラメータの調整 if(!paging) $.each(blockExcludeKeywords[no],function(i,string) { blockExcludeKeywords[no][i] = "-" + string; }); excludeKeywords = encodeURIComponent(' ' + blockExcludeKeywords[no].join(' ')); } var parameter = 'query=' + encodeURIComponent(blockKeywords[no].join(' ')) + excludeKeywords + '&availability=1&type=any&image_size=300'; if (paging) parameter += '&hits=' + getGoodsCount(ELEMENT_NAME,paging) + '&offset=' + (itemsPage['Block' + no]-1)*getGoodsCount(ELEMENT_NAME,paging); else { if(uploadMode=="common") parameter += '&hits=' + getCommonPageGoodsCount(ELEMENT_NAME); else parameter += '&hits=' + getGoodsCount(ELEMENT_NAME); } } //キーワードが設定されておらず、商品IDが設定されていたら、商品ID検索用のパラメータ生成を行う } else if (typeof blockGoods != "undefined" && blockGoods[no] && blockGoods[no].length > 0) { var goods = true; if(MALL=="楽天店") var parameter = 'itemCode=' + encodeURIComponent(blockGoods[no][itemCodeIndex['Block' + no]]) + '&imageFlag=1&hits=1'; else var parameter = 'itemcode=' + encodeURIComponent(blockGoods[no][itemCodeIndex['Block' + no]]) + '&availability=1&image_size=300'; } else if (typeof specialPageBlockKeywords !== 'undefined' && specialPageBlockKeywords[no] && specialPageBlockKeywords[no].length > 0) { //ページネーションなし //var isHidePager = true; var goods = false; if(MALL=="楽天店") { var parameter = 'keyword=' + encodeURIComponent(specialPageBlockKeywords[no].join(' ')) + '&sort=-updateTimestamp&availability=1&orFlag=1&imageFlag=1'; if(paging){ parameter += '&hits=' + getSpecialPageGoodsCount(ELEMENT_NAME, paging) + '&page=' + itemsPage['Block' + no]; } else { parameter += '&hits=' + getSpecialPageGoodsCount(ELEMENT_NAME); } // 除外キーワードがある場合 if (typeof specialPageBlockExcludeKeywords != "undefined" && specialPageBlockExcludeKeywords[no] && specialPageBlockExcludeKeywords[no].length > 0) parameter += '&NGKeyword=' + encodeURIComponent(specialPageBlockExcludeKeywords[no].join(' ')); } else { var excludeKeywords = ""; if(typeof specialPageBlockExcludeKeywords != "undefined" && specialPageBlockExcludeKeywords[no] && specialPageBlockExcludeKeywords[no].length > 0) { // 初回のみ、キーワードパラメータの調整 if(!paging) $.each(specialPageBlockExcludeKeywords[no],function(i,string) { specialPageBlockExcludeKeywords[no][i] = "-" + string; }); excludeKeywords = encodeURIComponent(' ' + specialPageBlockExcludeKeywords[no].join(' ')); } var parameter = 'query=' + encodeURIComponent(specialPageBlockKeywords[no].join(' ')) + excludeKeywords + '&availability=1&type=any&image_size=300'; if(paging){ parameter += '&hits=' + getSpecialPageGoodsCount(ELEMENT_NAME, paging) + '&offset=' + (itemsPage['Block' + no]-1)*getSpecialPageGoodsCount(ELEMENT_NAME, paging); } else { parameter += '&hits=' + getSpecialPageGoodsCount(ELEMENT_NAME); } } } else if (typeof specialPageBlockGoods !== 'undefined' && specialPageBlockGoods[no] && specialPageBlockGoods[no].length > 0) { //ページネーションなし //var isHidePager = true; var goods = true; if(MALL=="楽天店") { var parameter = 'itemCode=' + encodeURIComponent(specialPageBlockGoods[no][itemCodeIndex['Block' + no]]) + '&imageFlag=1&hits=1'; } else { var parameter = 'itemcode=' + encodeURIComponent(specialPageBlockGoods[no][itemCodeIndex['Block' + no]]) + '&availability=1&image_size=300'; } } //キーワードも商品IDも設定されていなかったら、完了処理を行う else { this.success(); return; } //this オブジェクト保持 var parentThis = this; //API アクセス $.ajax({ type: 'POST', url: API_URL, data: { sumaou_account: SUMAOU_ACCOUNT, api_access_code: API_ACCESS_CODE, parameter: parameter, item_lookup: goods } //アクセス成功 }).done(function(data){ //試用期限が来ていたら、メッセージ追加 if (data.error == 'access deny') { //メッセージ追加 setHtmlItemError(ELEMENT_NAME); //ページング形式なら、ページ移動中を解除する if (paging) pageMoving['Block' + no] = false; //初期表示形式なら、読み込み対象ブロックを進める else accessOrderIndex++; //正常終了 deferred.resolve(); //試用期限が来ていなかったら } else { var goodsCount = 0; if( (typeof specialPageBlockGoods !== 'undefined' && Object.keys(specialPageBlockGoods).length > 0) || (typeof specialPageBlockKeywords !== 'undefined' && Object.keys(specialPageBlockKeywords).length > 0)){ goodsCount = getSpecialPageGoodsCount(ELEMENT_NAME, paging); } else if(uploadMode=="common") { goodsCount = getCommonPageGoodsCount(ELEMENT_NAME); } else { goodsCount = getGoodsCount(ELEMENT_NAME, paging); } //キーワードによる検索か、商品IDによる検索かつ初期表示形式か、商品IDによる検索かつページング形式でヒット数が範囲なら、商品表示 if ((goods == false) || (goods && (paging == false) && itemCodeIndex['Block' + no] < (itemsPage['Block' + no] * goodsCount )) || (goods && paging && (itemCodeIndex['Block' + no] < (itemsPage['Block' + no] * goodsCount )))) generateGoods(ELEMENT_NAME, 'Block' + no, data, paging, $(ELEMENT_NAME).find('div.c-itemlist__wrap a').length); //アクセス完了処理 parentThis.success(goods, data); } //アクセス失敗 }).fail(function(jqXHR, textStatus, errorThrown) { //試用期限が来ていたら if ((jqXHR.responseJSON) && (jqXHR.responseJSON.error != null) && (jqXHR.responseJSON.error == 'access deny')) { //メッセージ追加 setHtmlItemError(ELEMENT_NAME); //ページング形式なら、ページ移動中を解除する if (paging) pageMoving['Block' + no] = false; //初期表示形式なら、読み込み対象ブロックを進める else accessOrderIndex++; //パラメータエラーなら、商品IDが該当しなかったものと判断して、アクセス完了処理を実行する } else if ((jqXHR.responseJSON) && (jqXHR.responseJSON.error != null) && (jqXHR.responseJSON.error_description == 'itemCode is not valid')) parentThis.success(true); //それ以外のエラーならリトライ else { setTimeout(function(){ generateBlockBlock(ELEMENT_NAME,no, paging); }, INTERVAL_RETRY_ERROR_BLOCK); return; } //正常終了 deferred.resolve(); }); }, //アクセス完了 // goods … 商品IDによる検索かどうか。キーワードによる検索の場合は false を指定する。 // data … ヒットしたデータ。 success: function(goods, data) { //省略引数デフォルト設定 if (goods === undefined) goods = false; if (data === undefined) data = null; //商品IDによる検索なら if (goods) { //データが存在しないか、ヒット数が 0 だったら、該当商品IDを削除する if ((data == null) || (MALL == "楽天店" && data.count == 0) || (MALL != "楽天店" && data.ResultSet.totalResultsReturned == 0)){ //blockGoodsとspecialPageBlockGoodsは同時には出力されない前提 if(blockGoods != undefined && blockGoods[no] != undefined){ blockGoods[no].splice(itemCodeIndex['Block' + no], 1); } if(typeof specialPageBlockGoods !== 'undefined'){ if(specialPageBlockGoods[no] != undefined){ specialPageBlockGoods[no].splice(itemCodeIndex['Block' + no], 1); } } //ヒット数が 1 以上なら、商品IDのインデックスを進める } else if(MALL == "楽天店"){ itemCodeIndex['Block' + no] += data.count; } else { itemCodeIndex['Block' + no] += data.ResultSet.totalResultsReturned; } //全ての商品IDの検索が終わっているか、ページング形式かつ現在のページを越えて商品が存在するか、初期表示形式で初期表示件数分の検索が完了したら、 //読み込み対象ブロックを進める if(uploadMode == "common" && blockGoods != undefined && blockGoods[no] != undefined){ if ((itemCodeIndex['Block' + no] >= blockGoods[no].length) || (paging && (itemCodeIndex['Block' + no] >= (itemsPage['Block' + no] * getCommonPageGoodsCount(ELEMENT_NAME) + 1))) || ((paging == false) && (itemCodeIndex['Block' + no] >= getCommonPageGoodsCount(ELEMENT_NAME)))) this.nextOrder(goods, data); } else if(uploadMode != "common" && blockGoods != undefined && blockGoods[no] != undefined){ if ((itemCodeIndex['Block' + no] >= blockGoods[no].length) || (paging && (itemCodeIndex['Block' + no] >= (itemsPage['Block' + no] * getGoodsCount(ELEMENT_NAME,paging) + 1))) || ((paging == false) && (itemCodeIndex['Block' + no] >= getGoodsCount(ELEMENT_NAME,paging)))) this.nextOrder(goods, data); } else if(specialPageBlockGoods != undefined && specialPageBlockGoods[no] != undefined){ if ((itemCodeIndex['Block' + no] >= specialPageBlockGoods[no].length) || (paging && (itemCodeIndex['Block' + no] >= (itemsPage['Block' + no] * getSpecialPageGoodsCount(ELEMENT_NAME,paging) + 1))) || ((paging == false) && (itemCodeIndex['Block' + no] >= getSpecialPageGoodsCount(ELEMENT_NAME,paging) + 1))) // 特集ページデータは「初期表示」なし this.nextOrder(goods, data); } //キーワードによる検索なら、読み込み対象ブロックを進める } else this.nextOrder(goods, data); //正常終了 deferred.resolve(); }, //読み込み対象ブロックを進める。 //ローディングを非表示にし、商品が存在しなかった場合はメッセージを追加する。 //また、必要に応じてナビゲーションを追加する。 // goods … 商品IDによる検索かどうか。キーワードによる検索の場合は false を指定する。 // data … ヒットしたデータ。 nextOrder: function(goods, data) { //ローディング非表示 $(ELEMENT_NAME + ' .loading').html(""); //追加された商品数を取得 var count = $(ELEMENT_NAME).find('div.c-itemlist__wrap a').length; //商品が存在しなかったら、メッセージを追加 if (count == 0) setHtmlItemNull(ELEMENT_NAME); //商品が存在するか、ページング形式なら、商品ナビゲーション追加 if ((count > 0) || paging){ var isSpecialPageData = false; if( (typeof specialPageBlockGoods !== 'undefined' && Object.keys(specialPageBlockGoods).length > 0)){ isSpecialPageData = true; } if (goods) { var goodsCount = 0; var blockGoodsCount = 0; if(isSpecialPageData === true){ goodsCount = getSpecialPageGoodsCount(ELEMENT_NAME, paging); blockGoodsCount = specialPageBlockGoods[no].length; } else if(uploadMode == "common") { goodsCount = getCommonPageGoodsCount(ELEMENT_NAME); blockGoodsCount = blockGoods[no].length; } else { goodsCount = getGoodsCount(ELEMENT_NAME, paging) blockGoodsCount = blockGoods[no].length; } var prev = (itemsPage['Block' + no] > 1); var next = (itemCodeIndex['Block' + no] >= (itemsPage['Block' + no] * goodsCount +1)); var more = (itemsPage['Block' + no]==1 && blockGoodsCount > goodsCount); if(isSpecialPageData === true){ // 特集ページデータの場合は常に paging に true を設定する generateNavigation(ELEMENT_NAME,'Block' + no, more, true, prev, next); } else if(uploadMode === "common"){ // 共通コンテンツの場合は常に paging に falseを設定する generateNavigation(ELEMENT_NAME,'Block' + no, more, false, prev, next); } else { generateNavigation(ELEMENT_NAME,'Block' + no, more, paging, prev, next); } } else if (data != null) if(isSpecialPageData === true){ // 特集ページデータの場合は常に paging に true を設定する generateNavigationFromData(ELEMENT_NAME, 'Block' + no, true, data); } else if(uploadMode === "common"){ // 共通コンテンツの場合は常に paging に falseを設定する generateNavigationFromData(ELEMENT_NAME, 'Block' + no, false, data); } else { generateNavigationFromData(ELEMENT_NAME, 'Block' + no, paging, data); } } //ページング形式なら、ページ移動中を解除する if (paging) pageMoving['Block' + no] = false; //初期表示形式なら、読み込み対象ブロックを進める else accessOrderIndex++; //ブロック要素を表示 $(ELEMENT_NAME).find('div.c-itemlist__wrap').show(); addGoodsSlick(ELEMENT_NAME); } }; //処理開始 access.start(); //Promise オブジェクトを返す return deferred.promise(); } //*************************************************************************** // 検索結果ブロックのページを移動する。 // // [パラメータ] // add … ページ増加数 //*************************************************************************** function moveBlockSearch(ELEMENT_NAME,no,add) { //省略引数デフォルト設定 if (add === undefined) add = 0; //既にページ移動中なら何もしない if (pageMoving['Search'+no]) return; pageMoving['Search'+no] = true; //ヘッダー設定 $('#searchttl').html('

検索結果

'); //ローディング表示 $(ELEMENT_NAME).find(".c-itemlist__wrap").html(""); setHtmlLoading(ELEMENT_NAME); //スクロール位置調整 toScroll(ELEMENT_NAME); //ページ増減 itemsPage['Search'+no] += add; //移動開始 generateBlockSearch(ELEMENT_NAME,no); } //*************************************************************************** // 検索結果ブロックの HTML を生成する。 // // [パラメータ] // paging … 「次へ」「前へ」を持つページング形式で表示するかどうか //*************************************************************************** function generateBlockSearch(ELEMENT_NAME,no){ //itemsPageがなければ生成 if(itemsPage['Search'+no] === undefined) itemsPage['Search'+no] = 1; //itemCodeIndexがなければ生成 if(itemCodeIndex['Search'+no]) itemCodeIndex['Search'+no] = 0; //pageMovingがなければ生成 if(!pageMoving['Search'+no]) pageMoving['Search'+no] = false; // 検索の見出し表示 $(ELEMENT_NAME).find("h2").show(); //Deferred オブジェクト生成 var deferred = new $.Deferred; //パラメータ生成 if(MALL=="楽天店") var parameter = 'keyword=' + encodeURIComponent(searchWord) + '&imageFlag=1&hits=' + SEARCH_ITEMS_HITS + '&page=' + itemsPage['Search'+no]; else var parameter = 'query=' + encodeURIComponent(searchWord) + '&image_size=300&availability=1&hits=' + SEARCH_ITEMS_HITS + '&offset=' + (itemsPage['Search'+no]-1) * SEARCH_ITEMS_HITS; //API アクセス開始 $.ajax({ type: 'POST', url: API_URL, data: { sumaou_account: SUMAOU_ACCOUNT, api_access_code: API_ACCESS_CODE, parameter: parameter } //アクセス成功 }).done(function(data) { //ローディング非表示 $(ELEMENT_NAME + ' .loading').html(""); //試用期限が来ていたら、メッセージ追加 if (data.error == 'access deny') setHtmlItemError(ELEMENT_NAME); //試用期限が来ていなかったら else { //商品一覧要素の表示 $(ELEMENT_NAME+".p-search--col1 .p-itemlist--col3--square").show(); //商品表示 generateGoods(ELEMENT_NAME, 'Search'+no, data, true); //追加された商品数を取得 if (MALL=="楽天店") var count = data.count; else var count = data.ResultSet.totalResultsAvailable; //商品が存在しなかったら、メッセージを追加 if (count == 0) setHtmlItemNull(ELEMENT_NAME); //ナビゲーション表示 generateNavigationFromData(ELEMENT_NAME, 'Search'+no, true, data); } //ページ移動中を解除 pageMoving['Search'+no] = false; //正常終了 deferred.resolve(); //アクセス失敗 }).fail(function(jqXHR, textStatus, errorThrown) { //試用期限が来ていたら、メッセージ追加 if ((jqXHR.responseJSON) && (jqXHR.responseJSON.error != null) && (jqXHR.responseJSON.error == 'access deny')) setHtmlItemError(ELEMENT_NAME); //キーワードエラーなら、メッセージを追加 else if ((jqXHR.responseJSON) && (jqXHR.responseJSON.error != null) && (jqXHR.responseJSON.error_description == 'keyword is not valid')) setHtmlItemNull(ELEMENT_NAME); //それ以外ならリトライ else { setTimeout(function() { generateBlockSearch(ELEMENT_NAME,no); }, INTERVAL_RETRY_ERROR_BLOCK); return; } //ページ移動中を解除 pageMoving['Search'+no] = false; //正常終了 deferred.resolve(); }); //Promise オブジェクトを返す return deferred.promise(); } //*************************************************************************** // 各ブロックの商品リストの HTML を生成する。 // // [パラメータ] // data … 商品データ // paging … 「次へ」「前へ」を持つページング形式で表示するかどうか // position … 開始インデックス //*************************************************************************** function generateGoods(ELEMENT_NAME, name, data, paging, position) { //省略引数デフォルト設定 if (position === undefined) position = 0; if (MALL == "楽天店") { //検索結果データ ループ $.each(data.Items, function(i, items) { //商品データ var item = items.Item; //インデックス var index = position + i; //itemlistの要素をコピー var itemListObj = $(ELEMENT_NAME).find('div.c-itemlist__invisible a').clone(); itemListObj.attr("href",item.itemUrl); // ポイントアップパーツ if(name == "Point") { // ポイントアップ期間に応じた処理 var isPointUp = true; var isPointUpBrfore = false; // 倍付け開始日時を迎えていない場合を検出 var currentTimeStamp = new Date().getTime(); if(item.pointRateStartTime != undefined && item.pointRateStartTime.length > 0){ // 楽天APIの日付フォーマットがchrome以外でDate.parse非対応のため形式変換する // "2017-12-09 13:00" => "2017/12/09 13:00:00 +0900" var pointRateStartTime = item.pointRateStartTime + ':00 +0900'; pointRateStartTime = pointRateStartTime.replace(/-/g, "/"); var pointRateStartTimeStamp = new Date(pointRateStartTime).getTime(); if(currentTimeStamp <= pointRateStartTimeStamp) { isPointUp = false; isPointUpBrfore = true; } } // 倍付け終了日時を超えている場合を検出 if(item.pointRateEndTime != undefined && item.pointRateEndTime.length > 0){ // 楽天APIの日付フォーマットがchrome以外でDate.parse非対応のため形式変換する // "2018-01-09 12:59" => "2018/01/09 12:59:00 +0900" var pointRateEndTime = item.pointRateEndTime + ':00 +0900'; pointRateEndTime = pointRateEndTime.replace(/-/g, "/"); var pointRateEndTimeStamp = new Date(pointRateEndTime).getTime(); if(currentTimeStamp >= pointRateEndTimeStamp) { isPointUp = false; } } // ポイントアップ期間表示の文字列 var pointRateStartTimeStr = ""; // ポイントアップ終了日時の西暦を削除する var pointEndTime = item.pointRateEndTime.slice(5); if(isPointUp) { pointRateStartTimeStr = item.pointRateStartTime.replace(/-/g,"/") + " 〜 " + pointEndTime.replace(/-/g,"/"); } else { if(isPointUpBrfore) { pointRateStartTimeStr = item.pointRateStartTime.replace(/-/g,"/") + " 〜 " + pointEndTime.replace(/-/g,"/"); // イメージ箇所に期間外クラスを付与 itemListObj.find("img").before($('
開始前
')); } else { pointRateStartTimeStr = "ポイントアップは終了しました"; // イメージ箇所に期間終了クラスを付与 itemListObj.find("img").before($('
終了
')); } } // リスト型1(icon-item-list-float)/2(icon-item-list-border)の場合 if($(ELEMENT_NAME).attr("class").match(/p-itemlist--list/)) { // 商品名長さ指定 var itemNameLen = itemListObj.find(".c-itemlist__item__name").data("maxlength"); if(!itemNameLen) itemNameLen = 120; itemListObj.find(".c-itemlist__item__name").html(getGoodsNameTrim(item.itemName,itemNameLen)); itemListObj.find(".c-itemlist__item__price").html(pointRateStartTimeStr); } else { itemListObj.find(".c-itemlist__item__name").html(pointRateStartTimeStr); itemListObj.find(".c-itemlist__item__price").hide(); } } else { // 商品名長さ指定 var itemNameLen = itemListObj.find(".c-itemlist__item__name").data("maxlength"); if(!itemNameLen) itemNameLen = 120; itemListObj.find(".c-itemlist__item__name").html(getGoodsNameTrim(item.itemName,itemNameLen)); // 商品価格 itemListObj.find(".c-itemlist__item__price").html(setComma3(item.itemPrice) + '円'); } var imageUrl = item.mediumImageUrls[0].imageUrl.replace("?_ex=128x128", ""); imageObj = itemListObj.find("img"); imageObj.attr("src",imageUrl + imageObj.attr("src")); // ポイント倍付け pointObj = itemListObj.find(".c-itemlist__item__point"); if (name == 'Point' && item.pointRate > 1) pointObj.html(item.pointRate + "倍 0) reviewObj.html(setComma3(item.reviewCount) + "").css("display","block"); // レビュー高評価 reviewAverageObj = itemListObj.find(".c-itemlist__item__rate"); if (name == 'ReviewAverage' && item.reviewAverage > 0) reviewAverageObj.html("").css("display","block"); //HTML 出力 $(ELEMENT_NAME).find('div.c-itemlist__wrap').append(itemListObj); }); //each } else { //検索結果データ ループ for (var i = 0; i < data.ResultSet.totalResultsReturned; i++) { //インデックス var index = position + i; //商品データ var item = data.ResultSet[0].Result[i]; //itemlistの要素をコピー var itemListObj = $(ELEMENT_NAME).find('div.c-itemlist__invisible a').clone(); itemListObj.attr("href",item.Url); // 商品名長さ指定 var itemNameLen = itemListObj.find(".c-itemlist__item__name").data("maxlength"); if(!itemNameLen) itemNameLen = 120; itemListObj.find(".c-itemlist__item__name").html(getGoodsNameTrim(item.Name,itemNameLen)); // 商品価格 itemListObj.find(".c-itemlist__item__price").html(setComma3(item.Price._value) + '円'); var imageUrl = ''; if (item.ExImage) imageUrl = item.ExImage.Url; if (! imageUrl && item.Image) { imageUrl = item.Image.Medium; if (! imageUrl) imageUrl = item.Image.Small; } imageObj = itemListObj.find("img"); imageObj.attr("src",imageUrl); // ポイント倍付け pointObj = itemListObj.find(".c-itemlist__item__point"); if (name == 'Point') if(item.Point !== undefined && item.Point.Times >= 2) if (uploadMode == "common" && pointHitCount < getCommonPageGoodsCount(ELEMENT_NAME)) { pointObj.html(item.Point.Times+ "倍倍 0) reviewObj.html(setComma3(item.Review.Count) + "").css("display","block"); // レビュー高評価 reviewAverageObj = itemListObj.find(".c-itemlist__item__rate"); if (name == 'ReviewAverage' && item.Review.Rate > 0) { rate = Math.floor(item.Review.Rate * 10)/10; reviewAverageObj.html("").css("display","block"); } if(name == "Point") { // yahoo ポイントアップの場合、直接セットせず、リストに退避する yahooPointUpDataList.push(itemListObj); } else{ //HTML 出力 $(ELEMENT_NAME).find('div.c-itemlist__wrap').append(itemListObj); } } //each } }; //*************************************************************************** // API からの戻り値を参照して、ナビゲーション ブロックの HTML を生成する。 // // [パラメータ] // name … オーダー名 // paging … 「次へ」「前へ」を持つページング形式で表示するかどうか // data … 商品データ //*************************************************************************** function generateNavigationFromData(ELEMENT_NAME, name, paging, data) { //ページング形式なら if (paging) { var prev = (itemsPage[name] > 1); if(MALL=="楽天店") var next = (itemsPage[name] < data.pageCount); else var next = (itemsPage[name] < (data.ResultSet.totalResultsAvailable/getGoodsCount(ELEMENT_NAME,paging))); generateNavigation(ELEMENT_NAME,name, false, paging, prev, next); //初期表示形式なら } else if( uploadMode != "common" && ( (MALL == "楽天店" && data.count > getGoodsCount(ELEMENT_NAME) ) || (MALL == "Yahoo!店" && data.ResultSet.totalResultsAvailable > getGoodsCount(ELEMENT_NAME)) ) ) generateNavigation(ELEMENT_NAME,name, true, paging); } //*************************************************************************** // ナビゲーション ブロックの HTML を生成する。 // // [パラメータ] // name … オーダー名 // more … 「もっと見る」を表示するかどうか // paging … 「次へ」「前へ」を持つページング形式で表示するかどうか // prev … 「前へ」を表示するかどうか(paging が true の場合のみ参照) // next … 「次へ」を表示するかどうか(paging が true の場合のみ参照) //*************************************************************************** function generateNavigation(ELEMENT_NAME,name, more, paging, prev, next) { //省略引数デフォルト設定 if (prev === undefined) prev = false; if (next === undefined) next = false; //追加ブロックなら if (name.substr(0, 5) == 'Block') { //引数に番号情報を追加 var no = name.substr(5) + ', '; //関数名を Block で統一 var functionName = 'Block'; //検索ブロックなら } else if (name.substr(0, 6) == 'Search') { //引数に番号情報を追加 var no = name.substr(6) + ', '; //関数名を Block で統一 var functionName = 'Search'; //その他のブロックなら } else { //引数の追加情報はなし var no = ''; //関数名をオーダー名とする var functionName = name; } $(ELEMENT_NAME).find(".c-pagination").hide(); $(ELEMENT_NAME).find(".c-pagination__preview").hide(); $(ELEMENT_NAME).find(".c-pagination__next").hide(); //ページング形式なら if (paging) { if (prev) $(ELEMENT_NAME).find(".c-pagination__preview").attr("onClick","moveBlock"+functionName+"('"+ELEMENT_NAME + "'," + no + "-1)").show(); if (next) $(ELEMENT_NAME).find(".c-pagination__next").attr("onClick","moveBlock"+functionName+"('"+ELEMENT_NAME + "'," + no + "1)").show(); //ページング形式ではなく、ピックアップ ブロックでも検索結果ブロックでもなかったら、続きを見るリンクを挿入 } else if (more && name != 'Search') { $(ELEMENT_NAME).find(".c-pagination").attr("onClick","moveBlock"+functionName+"('"+ELEMENT_NAME + "'," + no + "0)").show(); } } //*************************************************************************** // 数字(文字列)にカンマを挿入する。 // // [パラメータ] // str … カンマを挿入する数値(文字列) // // [戻り値] // カンマ挿入後の文字列を返す。 //*************************************************************************** function setComma3(str){ var num = new String(str).replace(/,/g, ""); while (num != (num = num.replace(/^(-?\d+)(\d{3})/, "$1,$2"))); return num; } //*************************************************************************** // 指定された位置にスクロールする。 // // [パラメータ] // position … スクロール先の要素名 //*************************************************************************** function toScroll(position) { var offsetTop = $(position).offset().top; $('html, body').scrollTop(offsetTop); } //*************************************************************************** // 対象商品が存在しない文言を、指定されたターゲットに設定する。 // // [パラメータ] // target … 設定先の要素名 //*************************************************************************** function setHtmlItemNull(target) { $(target).find("div.c-itemlist__wrap").html('
対象商品がございません。
'); $(target).find(".p-pagination__btn").hide(); } //*************************************************************************** // 対象商品の読み込みに失敗した際の文言を、指定されたターゲットに設定する。 // // [パラメータ] // target … 設定先の要素名 //*************************************************************************** function setHtmlItemError(target) { $(target).find("div.c-itemlist__wrap").html('
商品を読み込むことができませんでした。
'); $(target).find(".p-pagination__btn").hide(); } //*************************************************************************** // loading クラスに対して、ローディング表示用のコードを設定する。 //*************************************************************************** function setHtmlLoading(target) { var loadingHtml = ''; if(target) $(target).find(".loading").html(loadingHtml); else $(".loading").html(loadingHtml); } //*************************************************************************** // パーツテンプレに応じて、取得件数を変える //*************************************************************************** function getGoodsCount(ELEMENT_NAME,paging) { if($(ELEMENT_NAME).attr("class").match(/p-itemlist--col/)) { if(paging) return GRIDVIEW_ITEMS_HITS_PAGING; else return GRIDVIEW_ITEMS_HITS; } else if($(ELEMENT_NAME).attr("class").match(/p-itemlist--list/)) { if(paging) return LISTVIEW_ITEMS_HITS_PAGING; else return LISTVIEW_ITEMS_HITS; } else if($(ELEMENT_NAME).attr("class").match(/p-carousel/)) { return CAROUSEL_ITEMS_HITS; } else { return SEARCH_ITEMS_HITS; } } //*************************************************************************** // 特集ページ用 パーツテンプレに応じて、取得件数を変える //*************************************************************************** function getSpecialPageGoodsCount(ELEMENT_NAME, paging) { if($(ELEMENT_NAME).attr("class").match(/p-itemlist--col3/)) { // 3x2:30商品 p-itemlist--col3 if(paging){ return 30; } // 初期表示制御なし return 30; } else if($(ELEMENT_NAME).attr("class").match(/p-itemlist--col2/)) { // 2x3:20商品 p-itemlist--col2 if(paging){ return 20; } // 初期表示制御なし return 20; } else if($(ELEMENT_NAME).attr("class").match(/p-carousel/)) { // スライド型:20商品 if(paging){ return 20; } // 初期表示制御なし return 20; } else if($(ELEMENT_NAME).attr("class").match(/p-itemlist--list/)) { // リスト型:20商品 if(paging){ return 20; } // 初期表示制御なし return 20; } // デフォルト return 20; } //*************************************************************************** // 共通コンテンツ用 パーツテンプレに応じて、取得件数を変える //*************************************************************************** function getCommonPageGoodsCount(ELEMENT_NAME) { if($(ELEMENT_NAME).attr("class").match(/p-itemlist--col3/)) { // 3x2:30商品 p-itemlist--col3 // 初期表示制御なし return 30; } else if($(ELEMENT_NAME).attr("class").match(/p-itemlist--col2/)) { // 2x3:20商品 p-itemlist--col2 // 初期表示制御なし return 20; /* スライダー機能不全のため不使用 } else if($(ELEMENT_NAME).attr("class").match(/p-carousel/)) { // スライド型:20商品 // 初期表示制御なし return 20; */ } else if($(ELEMENT_NAME).attr("class").match(/p-itemlist--list/)) { // リスト型:20商品 // 初期表示制御なし return 20; } // デフォルト return 20; } //*************************************************************************** // 商品名をtrimする //*************************************************************************** function getGoodsNameTrim(text,len) { truncation = '...'; var text_array = text.split(''); var count = 0; var str = ''; for (i = 0; i < text_array.length; i++) { var n = escape(text_array[i]); if (n.length < 4) count++; else count += 2; if (count > len) { return str + truncation; } str += text.charAt(i); } return text; } //*************************************************************************** // 商品名をtrimする //*************************************************************************** function addGoodsSlick(ELEMENT_NAME) { //c-carousel__warp を slick if($(ELEMENT_NAME).hasClass("p-carousel--col1")) $(ELEMENT_NAME).find('.c-carousel__wrap').slick({ centerMode: true, centerPadding: '60px', slidesToShow: 1, arrows: false, autoplay: true, autoplaySpeed: 2000, slide: 'a', }); else if($(ELEMENT_NAME).hasClass("p-carousel--col2")) $(ELEMENT_NAME).find('.c-carousel__wrap').slick({ infinite: true, dots: true, dotsClass: 'slick-dots', arrows: false, slidesToShow: 2, slidesToScroll: 2, autoplay: true, autoplaySpeed: 2300 }); else if($(ELEMENT_NAME).hasClass("p-carousel--col3")) $(ELEMENT_NAME).find('.c-carousel__wrap').slick({ infinite: true, dots: true, dotsClass: 'slick-dots', arrows: false, slidesToShow: 3, slidesToScroll: 3, autoplay: true }); var col2_item_height = $(ELEMENT_NAME + ' .c-itemlist__item--col2 .c-itemlist__item__img').width(); var col3_item_height = $(ELEMENT_NAME + ' .c-itemlist__item--col3 .c-itemlist__item__img').width(); $(ELEMENT_NAME + ' .c-itemlist__item--col2 .p-col2-circle__item__img > img').css('height',col2_item_height); $(ELEMENT_NAME + ' .c-itemlist__item--col3 .p-col3-circle__item__img > img').css('height',col3_item_height); } function getRankingData() { var terms = ''; var display = ''; var site = ''; if($('.ranking-data-view').length){ terms = $('.ranking-data-view').attr('data-terms'); display = $('.ranking-data-view').attr('data-display'); site = $('.ranking-data-view').attr('data-site'); } if(terms == '' || terms == undefined || display == '' || display == undefined || site == '' || site == undefined){ return; } //API アクセス開始 $.ajax({ type: 'POST', url: API_BASE_URL + 'ranking/get_data.php', dataType:'json', data: { sumaou_account: SUMAOU_ACCOUNT, api_access_code: API_ACCESS_CODE, terms: terms } }).done(function(data) {//アクセス成功 if(data['result'] != "success"){ // Error //console.log("ERROR"); return false; } if(!data['items'] || data['items'].length < 1){ // ランクインなし。 return; } // var item_array = data['items']; var displayCount = 0; for(var i=0; i parseInt(display)){ // 表示対象外順位 continue; } if (terms.indexOf(item_array[i]['term']) == -1) { // 表示対象外 term continue; } // 実際の表示件数 displayCount++; var $template = $('#template-ranking-item').clone().children(); $template.attr('href', item_array[i]['url']); $template.attr('target', '_blank'); $template.find('.c-itemlist__item__name').text(item_array[i]['title']); $template.find('.c-itemlist__item__img img').attr('src', item_array[i]['imageUrl']); var term = item_array[i]['term']; // 表示用の term 文字列(先頭を大文字) var termText = term.charAt(0).toUpperCase() + term.slice(1); $template.find('.c-itemlist__rank__term').addClass('c-ranking-term--'+term); $template.find('.c-itemlist__rank__term').text(termText); // rate var star = item_array[i]['star'].replace('.','-'); $template.find('.rate').addClass('rate'+star); // review if(item_array[i]['reviewCount'] != ''){ $template.find('.item_review').text('レビュー('+ item_array[i]['reviewCount'] +'件)'); } // rank // [補足] updateMode変数はHTML 側の「スクリプト制御ブロック」にて宣言されている。 var crownImage = ''; if(parseInt(item_array[i]['ranking']) == 1){ if(uploadMode == 'upload' && MALL == "楽天店") { crownImage = 'smp/images/img_ranking/ranking_col1-crown01.png'; } else { crownImage = './images/img_ranking/ranking_col1-crown01.png'; } } else if(parseInt(item_array[i]['ranking']) == 2){ if(uploadMode == 'upload' && MALL == "楽天店") { crownImage = 'smp/images/img_ranking/ranking_col1-crown02.png'; } else { crownImage = './images/img_ranking/ranking_col1-crown02.png'; } } else if(parseInt(item_array[i]['ranking']) == 3){ if(uploadMode == 'upload' && MALL == "楽天店") { crownImage = 'smp/images/img_ranking/ranking_col1-crown03.png'; } else { crownImage = './images/img_ranking/ranking_col1-crown03.png'; } } if(crownImage != ''){ $template.find('.c-itemlist__rank__icon').attr('src', crownImage); } else { $template.find('.c-itemlist__rank__icon').remove(); } $template.find('.c-itemlist__rank__no').text(item_array[i]['ranking']+'位'); $template.find('.c-itemlist__item__price').text(item_array[i]['price']); var prizeDate = item_array[i]['prizeDate']; if(prizeDate){ prizeDate = prizeDate.replace( '更新', '更新
' ); } $template.find('.c-itemlist__item__update').html(prizeDate); $template.find('.c-itemlist__item__breadcrumb').text(item_array[i]['breadcrumbs']); // $('.ranking-data-view .itemlist').append($template); } if(displayCount > 0){ // 要素を表示 $('.ranking-data-view').show(); // 表示件数設定 $('.ranking_item_count').text(displayCount); // scroll 設定 $('.c-wrap.c-itemlist__wrap .itemlist').carouFredSel({ scroll: 1, direction: 'up', auto: {timeoutDuration: 3000, easing: 'swing'}, mousewheel: true, swipe: { onMouse: true, onTouch: true }, items: { height: '100%', visible: { min: 4 } }, }); } }).fail(function(jqXHR, textStatus, errorThrown) {//アクセス失敗 // エラー。要素を削除。 $('.ranking-data-view').remove(); }); }