/* * 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('