PageSourceSearch

https://tower.jp/javascript/suggest_search.js?202506160000

js tower.jp collected 2026-09-24 08:33:31 UTC 18,075 bytes, 495 lines download raw bytes

1//var search_yes = false;
2$w(document).ready(function () {
3    var text_bak = null;
4    var text = $w("#searchTxt01");
5
6    //if (text.attr("value") == "" || text.attr("value") == null || search_yes == false) {
7    if (text.val() == "" || text.val() == null) {
8        Visiblity("suggestPopupBox01", "none");
9        // $w('.innerR02').hide();
10    }
11
12    // 20160901 redminexxx mod wellstone start
13    var SUBMIT_WAIT = 200;
14    //var SUBMIT_WAIT = 200;
15    // 20160901 redminexxx mod wellstone end
16    var submitWaitTimerId = null;
17    var lastAjaxPromise = null;
18    var lastAjaxPromiseItem = null;
19
20    // unload時に通信を中止(1回だけ登録)
21    if (!window.__unloadHandlerRegistered__) {
22        window.__unloadHandlerRegistered__ = true;
23        window.addEventListener('beforeunload', function () {
24            if (lastAjaxPromise && typeof lastAjaxPromise.abort === 'function') {
25                lastAjaxPromise.abort();
26            }
27            if (lastAjaxPromiseItem && typeof lastAjaxPromiseItem.abort === 'function') {
28                lastAjaxPromiseItem.abort();
29            }
30        });
31    }
32
33    text.keyup(function (e) {
34        //20141010 redmine256 add hakuta start
35        var key = e.which ? e.which : e.keycode;
36        switch (key) {
37            case 38:
38            case 40:
39                if ($w('#suggestPopupBox01').css('display') == 'none') {
40                    break;
41                }
42            case 27:
43            case 37:
44            case 39:
45                return;
46        }
47        //20141010 redmine256 add hakuta end
48
49        if (submitWaitTimerId != null) {
50            clearTimeout(submitWaitTimerId);
51        }
52
53        var that = this;
54        var val = $w(that).val();
55        /*if ($w("input#hdnDisplaySuggestFlg").val() == "true") {*/
56        if (val == "" || val == null) {
57
58            text_bak = null;
59            $w(that).val("");
60            text.text("");
61            Visiblity("suggestPopupBox01", "none");
62            // 20250124 karlpark suggest
63            $w('.TOL-suggest-detail-PC-close-button').css('display', 'none');
64
65        } else if ((val != text_bak) || (($w('#suggestPopupBox01').css('display') == 'none') && (key == 38 || key == 40))) {
66            submitWaitTimerId = setTimeout(function () {
67                submitWaitTimerId = null;
68
69                //20141201 redmine492 add hakuta start
70                var nlkakko = 0;
71                var nrkakko = 0;
72                var slkakko = "";
73                var srkakko = "";
74
75                slkakko = val.match(/\[/g);
76                srkakko = val.match(/\]/g);
77
78                nlkakko = slkakko ? slkakko.length : 0
79                nrkakko = srkakko ? srkakko.length : 0
80
81                if (nlkakko != nrkakko) {
82                    val = val.split('[').join('');
83                    val = val.split(']').join('');
84                }
85                //20141201 redmine492 add hakuta end
86
87                if (lastAjaxPromise) {
88                    lastAjaxPromise.abort();
89                }
90
91                // 20241205 karlpark suggest start
92                lastAjaxPromise = $w.ajax({
93                    url: "/Components/SearchTowerWeb/search/item/ajax/ark.aspx",
94                    //url: "/search/item/ajax/ark.aspx",
95                    data: { query: val, convert: "fw", target: "view", charset: "", datatype: "", cdnPrefix: "" },
96                    type: 'POST',
97                    cache: false,
98                    dataType: 'json',
99                    success: function (data) {
100                        lastAjaxPromise = null;
101
102                        /* アーティスト情報を調べるのデータを設定 */
103                        $w(".TOL-header-PC-Suggest-inner-artist-name").html(CreateInnerL01(data, escapeSelectorString(val),replaceSearchStr(val)));
104                        /* アーティスト名から商品を探すのデータを設定 */
105                        $w(".TOL-header-PC-Suggest-inner-title").html(CreateInnerL02(data, escapeSelectorStr
105ing(val)));
106                        /* 商品フォーマットを指定して探すのデータを設定 */
107                        $w(".TOL-header-PC-Suggest-inner-artist-info").html(CreateInnerL04(data, escapeSelectorString(val)));
108                        /* 関連記事を探すのデータを設定 */
109                        $w(".TOL-header-PC-Suggest-inner-connect").html(CreateInnerL05(data, escapeSelectorString(val)));
110                        /* 出品から探すのデータを設定 */
111                        $w(".TOL-header-PC-Suggest-inner-listing").html(CreateInnerL06(data, escapeSelectorString(val)));
112
113                        // 20250205 karlpark SI254 
114                        Setlive01_06();
115                    }
116                });
117                if (lastAjaxPromiseItem) {
118                    lastAjaxPromiseItem.abort();
119                }
120                lastAjaxPromiseItem = $w.ajax({
121                    url: "/Components/SearchTowerWeb/search/item/ajax/ark.aspx",
122                    //url: "/search/item/ajax/ark.aspx",
123                    data: { query: val, convert: "fw", target: "product", charset: "", datatype: "", cdnPrefix: "" },
124                    type: 'POST',
125                    cache: false,
126                    dataType: 'json',
127                    success: function (data) {
128                        lastAjaxPromiseItem = null;
129                        /* タイトルから商品を探すのデータを設定 */
130                        $w(".TOL-header-PC-Suggest-inner-item").html(CreateInnerL03(data, escapeSelectorString(val)));
131
132                        // 20250205 karlpark SI254
133                        Setlive03();
134
135                        val = $w(that).val();
136                        if (val == "" || val == null) {
137                            Visiblity("suggestPopupBox01", "none");
138                            // 20250124 karlpark suggest
139                            $w('.TOL-suggest-detail-PC-close-button').css('display', 'none');
140                        } else {
141                            Visiblity("suggestPopupBox01", "block");
142                            // 20250124 karlpark suggest
143                            $w('.TOL-suggest-detail-PC-close-button').css('display', 'block');
144                        }
145                    }
146                });
147                // 20241205 karlpark suggest end
148
149                text_bak = val;
150            }, SUBMIT_WAIT);
151        }
152    });
153
154    // 20250124 karlpark suggest start
155    $w('.TOL-suggest-detail-PC-close-button').on("click", function () {
156        text.val("");
157        $w('.TOL-suggest-detail-PC-close-button').css('display', 'none');
158        Visiblity("suggestPopupBox01", "none");
159    });
160    // 20250124 karlpark suggest end
161
162    // 20250127 karlpark suggest 
163    loadMpSetting();
164});
165
166// 20241205 karlpark suggest start
167// アーティスト情報を調べる
168function CreateInnerL01(jsData, str, strUrl) {
169    var s = "<div class='section-label-title-container'>"
170        + "<span class='text-size-16 is-text-gray is-bold '>アーティストを検索する</span></div>";
171
172    s += "<ul>";
173
174    var cnt = 0;
175    var vartist_name = "";
176    var vartist_tmp = "";
177    var vartist_id = "";
178
179    var currentPath = "/artist/";
180    var currentPath_adv = "/search/artist/";
181
182    if (jsData != null) {
183
184        var infos = jsData.ArtistInfoList;
185
186        for (var i in infos) {
187            cnt++;
188
189            vartist_name = "";
190            vartist_tmp = "";
191            vartist_id = "";
192
193            vartist_tmp = infos[i].Artist_name_with_html.match(/\.|\[/);
194
195            if (vartist_tmp != null) {
196                vartist_name = infos[i].Artist_name_limited;
197            } else {
198                vartist_name = infos[i].Artist_name_with_html;
199            }
200
201            vartist_id = infos[i].Artist_id;
202
203            s += `<li><a href='${currentPath}${vartist_id}'>${vartist_name}</a></li>`;
204            if (cnt > 5) {
205                break;
206            }
207        }
208    }
209
210    s += "</ul>";
211
212    s += `<hr class="TOL-header-PC-Suggest_hr"><div class="TOL-header-PC-Suggest_p">`
213        + `<a class="text-size-12" href='${currentPath_adv}${strUrl}'>`
214        + `「${str}」を含むアーティストを検索&nbsp></a></div>`;
215
216    return s;
217}
218
219// アーティスト名から商品を探す
220function CreateInnerL02(jsData, str) {
221    var s = "<div class='section-label-title-container'>"
222        + "<span class='text-size-16 is-text-gray is-bold '>アーティスト名から商品を探す</span></div>";
223
224    s += "<ul>";
225
226    var cnt = 0;
227    var name = "";
228    var id = "";
229
230    // 20250117 karlpark readmine#119619
231    var currentPath = "/item/";
232    var currentPath_adv = "/search/advanced/item/search?artistName=";
233    var addPath = "&detailSearch=on&detailSearchType=item&displayAllTab=off&kid=psg05";
234
235    if (jsData != null) {
236
237        var artInfos = jsData.ArtistInfoList;
238
239        // 検索結果のアーティストがある場合
240        if (Object.keys(artInfos).length > 0) {
241            var infos = artInfos[0].ItemInfoList;
242            // 20250117 karlpark redmine#119622, redmine#119395
243            var artistName = artInfos[0].Artist_name_with_html;
244
245            for (var i in infos) {
246                cnt++;
247
248                name = infos[i].Item_name;
249                // 20250121 karlpark redmine#119619
250                id = infos[i].Item_id;
251
252                // 20250117 karlpark readmine#119619
253                s += `<li><a href='${currentPath}${id}'>${name}(${artistName})</a></li>`;
254                if (cnt > 5) {
255                    break;
256                }
257            }
258        }
259    }
260
261    s += "</ul>";
262
263    s += `<hr class="TOL-header-PC-Suggest_hr"><div class="TOL-header-PC-Suggest_p">`
264        + `<a class="text-size-12" href='${currentPath_adv}${str}${addPath}&kid=psg01'>`
265        + `アーティスト名「${str}」で商品を検索&nbsp></a></div>`;
266
267    return s;
268}
269
270// タイトルから商品を探す
271function CreateInnerL03(jsData, str) {
272    var s = "<div class='section-label-title-container'>"
273        + "<span class='text-size-16 is-text-gray is-bold'>タイトルから商品を探す</span></div>";
274
275    s += "<ul>";
276
277    var cnt = 0;
278    var vartist_name = "";
279
280    // 20250124 karlpark suggest
281    var currentPath = "/search/advanced/item/search?titleName=";
282    var addPath = "&detailSearch=on&detailSearchType=item&displayAllTab=off";
283
284    if (jsData != null) {
285
286        var infos = jsData.ArtistInfoList;
287
288        for (var i in infos) {
289            cnt++;
290
291            vartist_name = infos[i].Artist_name_with_html;
292
293            // 20250124 karlpark suggest
294            s += `<li><a href='${currentPath}` + escapeSelectorString(encodeSearchStr($w("<div/>").html(infos[i].Artist_name).text()))
295                + `'>${vartist_name}</a></li>`;
296            if (cnt > 5) {
297                break;
298            }
299        }
300    }
301
302    s += "</ul>";
303
304    s += `<hr class="TOL-header-PC-Suggest_hr"><div class="TOL-header-PC-Suggest_p">`
305        + `<a class="text-size-12" href='${currentPath}${str}${addPath}&kid=psg06'>`
306        + `タイトルに「${str}」を含む商品を検索&nbsp></a></div>`;
307
308    return s;
309}
310
311// 商品フォーマットを指定して探す
312function CreateInnerL04(jsData, str) {
313    var s = "<div class='section-label-title-container'>"
314        + "<span class='text-size-16 is-text-gray is-bold'>商品フォーマットを指定して探す</span></div>";
315
316    s += "<ul>";
317
318    var cnt = 0;
319    var name = "";
320    var id = "";
321
322    var currentPath = "/search/item/";
323
324    if (jsData != null) {
325
326        var artInfos = jsData.ArtistInfoList;
327
328        // 検索結果のアーティストがある場合
329        if (Object.keys(artInfos).length > 0) {
330            var infos = artInfos[0].FormatInfo;
331            // 20250117 karlpark redmine#119622, redmine#119395
332            var artistNameHtml = artInfos[0].Artist_name_with_html;
333            // 20250218 karlpark SI276
334            var artistName = escapeSelectorString(encodeSearchStr(artInfos[0].Artist_name));
335
336            for (var i in infos) {
337                cnt++;
338
339                name = infos[i].Format_name;
340                id = infos[i].Format_code;
341
342                // 20250117 karlpark redmine#119622, redmine#119395
343                s += `<li><a href='${currentPath}${artistName}?recondition=True&format=${id}'>${artistNameHtml}&nbsp;${name}</a></li>`;
344                if (cnt > 5) {
345                    break;
346                }
347            }
348            // 20250117 karlpark redmine#119425
349            s += "</ul>";
350        } else {
351            // 20250117 karlpark redmine#119425
352            // アーティストがなければフォーマット行は非表示
353            s = "";
354        }
355    }
356
357    return s;
358}
359
360// 関連記事を探す
361function CreateInnerL05(jsData, str) {
362    var s = "<div class='section-label-title-container'>"
363        + "<span class='text-size-16 is-text-gray is-bold'>関連記事を探す</span></div>";
364
365    s += "<div><ul>";
366
367    var currentPath = "/search/article/";
368
369    if (jsData != null) {
370        var artInfos = jsData.ArtistInfoList;
371
372        if (Object.keys(artInfos).length > 0) {
373            var infos = artInfos[0];
374            // 20250117 karlpark redmine#119353
375            // 20250218 karlpark SI276
376            var name = escapeSelectorString(encodeSearchStr(infos.Artist_name));
377
378            // 20250128 karlpark SI239
379            s += `<li><div class='TOL-header-PC-Suggest-liKeyword'><a href='${currentPath}${name}'><span>`
380                + `${infos.Artist_name_with_html}</span></a></div></li>`;
381        
382            // 20250117 karlpark redmine#119425
383            s += "</ul></div>";
384        } else {
385            // 20250117 karlpark redmine#119425
386            // アーティストがなければ関連記事を探す行は非表示
387            s = "";
388        }
389    }
390
391    return s;
392}
393
394// 出品から探す
395function CreateInnerL06(jsData, str) {
396    var s = "<div class='section-label-title-container'>"
397        + "<span class='text-size-16 is-text-gray is-bold'>出品から探す</span></div>";
398
399    if (jsData != null) {
400        s += `<div class="TOL-header-PC-Suggest_p">`
401            + `<a class="text-size-12" href='${mpData.baseUrl}/search?keyword=${str}'>`
402            + `「${str}」でマーケットプレイスを検索<img src="/img24/newwindow_icon.svg"></a></div>`;
403    }
404
405    return s;
406}
407// 20241205 karlpark suggest end
408
409// 20250205 karlpark SI254 start
410// ark.aspxのtarget=viewの結果に対する、マウス遷移時の選択イベント
411function Setlive01_06() {
412    var a_tags = ['TOL-header-PC-Suggest-inner-artist-name', 'TOL-header-PC-Suggest-inner-title',
413        'TOL-header-PC-Suggest-inner-artist-info', 'TOL-header-PC-Suggest-inner-connect',
414        'TOL-header-PC-Suggest-inner-listing'];
415
416    a_tags.forEach(function (className) {
417        var a_tag = $w(`.${className} a`);
418        a_tag.each(function () {
419            $w(this).live("mouseover", function () {
420                // 全選択クリア
421                $w('.TOL-header-PC-Suggest-Area a').removeClass('active');
422                $w(this).addClass('active');
423            });
424        });
425    });
426}
427
428// ark.aspxのtarget=productの結果に対する、マウス遷移時の選択イベント
429function Setlive03() {
430    var a_tag = $w('.TOL-header-PC-Suggest-inner-item a');
431    a_tag.each(function () {
432        $w(this).live("mouseover", function () {
433            // 全選択クリア
434            $w('.TOL-header-PC-Suggest-Area a').removeClass('active');
435            $w(this).addClass('active');
436        });
437    });
438}
439
440// 20250205 karlpark SI254 end
441
442function Visiblity(ctrlName, value) {
443    $w("#" + ctrlName).css("display", value);
444}
445//20200806 redmine48546 mod kimura start
446function escapeSelectorString(val) {
447    return val
448        .replace(/&/g, '&amp;')
449        .replace(/</g, '&lt;')
450        .replace(/>/g, '&gt;')
451        .replace(/"/g, '&quot;')
452        .replace(/'/g, '&#39;');
453}
454//20200806 redmine48546 mod kimura end
455
456function replaceSearchStr(str) {
457    // str = replAll(str, ' ', '%20');
458    str = replAll(str, '!', '!');
459    str = replAll(str, '"', '”');
460    str = replAll(str, '#', '#');
461    str = replAll(str, '$', '$'); // RFC2396:URL使用不可
462    str = replAll(str, '%', '%');
463    str = replAll(str, '&', '&'); // RFC2396:URL使用不可
464    str = replAll(str, '\'', '’');
465    str = replAll(str, '(', '(');
466    str = replAll(str, ')', ')');
467    str = replAll(str, '*', '*');
468    str = replAll(str, '+', '+'); // RFC2396:URL使用不可
469    str = replAll(str, ',', ','); // RFC2396:URL使用不可
470    str = replAll(str, '-', '-');
471    str = replAll(str, '.', '.');
472    str = replAll(str, '/', '/'); // RFC2396:URL使用不可
473
474    str = replAll(str, ':', ':'); // RFC2396:URL使用不可
475    str = replAll(str, ';', ';'); // RFC2396:URL使用不可
476    str = replAll(str, '<', '<');
477    str = replAll(str, '=', '='); // RFC2396:URL使用不可
478    str = replAll(str, '>', '>');
479    str = replAll(str, '?', '?'); // RFC2396:URL使用不可
480    str = replAll(str, '@', '@'); // RFC2396:URL使用不可
481
482    str = replAll(str, '[', 'ï¼»');
483    str = replAll(str, '\\', 'ï¿¥');
484    str = replAll(str, ']', 'ï¼½');
485    str = replAll(str, '^', 'ï¼¾');
486    str = replAll(str, '_', '_');
487    str = replAll(str, '`', '‘');
488
489    str = replAll(str, '{', '{');
490    str = replAll(str, '|', '|');
491    str = replAll(str, '}', '}');
492    str = replAll(str, '~', '~');
493
494    return str;
495}

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.