PageSourceSearch

https://nishi2.jp/wp/wp-content/cache/autoptimize/js/autoptimize_single_5089aee9b9b8ced4b07c3d8ee09b3f62.js

js nishi2.jp collected 2026-10-02 06:13:38 UTC 8,013 bytes, 81 lines download raw bytes

1(function(){'use strict';document.addEventListener('DOMContentLoaded',function(){initNotificationDialog();});function initNotificationDialog(){if(typeof Notification!=='undefined'&&Notification.permission==='granted'&&window.n2pnSupport&&window.n2pnSupport.isPushSupported){var subscribedTopics=localStorage.getItem('n2pn_subscribed_topics');var fcmToken=localStorage.getItem('n2pn_fcm_token');if(!subscribedTopics||JSON.parse(subscribedTopics).length===0||!fcmToken){autoSubscribeGrantedUser();}
2localStorage.setItem('n2pn_dialog_shown','true');document.cookie='n2pn_shown=1; max-age=31536000; path=/';return;}
3var ua=navigator.userAgent;if(/FBAN|FBAV|Twitter|Line\/|Instagram|GSA\//.test(ua)||(ua.indexOf('Safari')===-1&&/iPhone|iPad|iPod|Android/.test(ua))){return;}
4if(document.cookie.indexOf('n2pn_dismissed=1')!==-1){return;}
5var dismissedUntil=localStorage.getItem('n2pn_dialog_dismissed_until');if(dismissedUntil&&Date.now()<parseInt(dismissedUntil,10)){return;}
6if(document.cookie.indexOf('n2pn_shown=1')!==-1){return;}
7if(localStorage.getItem('n2pn_dialog_shown')==='true'){return;}
8if(window.n2pnSupport&&window.n2pnSupport.isIOS&&!window.n2pnSupport.isStandalone){setTimeout(showIOSInstallDialog,3000);return;}
9if(window.n2pnSupport&&!window.n2pnSupport.isPushSupported){return;}
10setTimeout(showNotificationDialog,3000);}
11async function autoSubscribeGrantedUser(){var waitCount=0;while(!window.n2pnPush&&waitCount<20){await new Promise(function(r){setTimeout(r,500);});waitCount++;}
12if(!window.n2pnPush||!window.n2pnPush.refreshToken)return;try{var token=await window.n2pnPush.refreshToken();if(token){var allTopics=getAllTopics();var success=await window.n2pnPush.subscribe(allTopics);if(success){localStorage.setItem('n2pn_subscribed_topics',JSON.stringify(allTopics));console.log('自動購読完了(過去バグ救済)');}}}catch(e){console.error('自動購読エラー:',e);}}
13function showNotificationDialog(){const dialog=document.getElementById('n2pn-notification-dialog');if(dialog){dialog.classList.add('active');}}
14function hideNotificationDialog(){const dialog=document.getElementById('n2pn-notification-dialog');if(dialog){dialog.classList.remove('active');}}
15window.n2pnAllowNotifications=async function(){const button=document.getElementById('n2pn-allow-button');const originalText=button.textContent;try{button.disabled=true;button.textContent='処理中...';const token=await window.n2pnPush.requestPermission();if(token){const allTopics=getAllTopics();const success=await window.n2pnPush.subscribe(allTopics);if(success){localStorage.setItem('n2pn_subscribed_topics',JSON.stringify(allTopics));localStorage.setItem('n2pn_dialog_shown','true');document.cookie='n2pn_shown=1; max-age=31536000; path=/';hideNotificationDialog();showSuccessMessage('通知設定が完了しました!');}else{throw new Error('購読に失敗しました');}}}catch(error){console.error('通知許可エラー:',error);alert('通知の設定に失敗しました。もう一度お試しください。');button.disabled=false;button.textContent=originalText;}};window.n2pnDenyNotifications=function(){var oneMonth=30*24*60*60*1000;localStorage.setItem('n2pn_dialog_dismissed_until',String(Date.now()+oneMonth));document.cookie='n2pn_dismissed=1; max-age=2592000; path=/';hideNotificationDialog();};function getAllTopics(){const topics=[];const areaTopics=['nishinomiya-kitaguchi-area','shukugawa-kurakuenkuchi-area','koshien-koshienhama-area','hanshin-nishinomiya-area','naruo-takasu-komatsu-area','koshienguchi-area','jr-nishinomiya-area','imazu-hanshin-kokudou-area','koroen-hamawaki-yougai-area','hirota-taisha-uegahara-area','mondoyakujin-hinonokuchi-area','nigawa-kotoen-area','koyouen-kurakuen-area','yamaguchi-najio-namaze-area','nishinomiyahama-area'];const categoryTopics=['open-close','gourmet','event','topic','town','quiz','nishi2news','shop','realestate','politics','gov-info','hazard','job','sport','accident-crime','feature-report'];return[...areaTopics,...categoryTopics];}
16function showSuccessMessage(message){const messageDiv=document.createElement('div');messageDiv.style.cssText=`
17            position: fixed;
18            top: 24px;
19            right: 24px;
20            background: #4CAF50;
21            color: white;
22            padding: 16px 24px;
23            border-radius: 8px;
24            box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
25            z-index: 1000000;
26            animation: n2pn-fade-in 0.3s ease-out;
27        `;messageDiv.textContent=message;document.body.appendChild(messageDiv);setTimeout(()=>{messageDiv.style.animation='n2pn-fade-in 0.3s ease-out reverse';setTimeout(()=>{document.body.removeChild(messageDiv);},300);},3000);}
28function showIOSInstallDialog(){const dialog=document.getElementById('n2pn-notification-dialog');if(!dialog)return;const content=dialog.querySelector('.n2pn-dialog-content');if(!content)return;content.innerHTML=`
29            <div class="n2pn-dialog-header">
30                <div class="n2pn-dialog-icon">
31                    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="#2196F3">
32                        <path d="M12 22c1.1 0 2-.9 2-2h-4c0 1.1.89 2 2 2zm6-6v-5c0-3.07-1.64-5.64-4.5-6.32V4c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68C7.63 5.36 6 7.92 6 11v5l-2 2v1h16v-1l-2-2z"/>
33                    </svg>
34                </div>
35                <h2 class="n2pn-dialog-title">通知を受け取るには</h2>
36                <p class="n2pn-dialog-description">
37                    iPhoneで通知を受け取るには、ホーム画面への追加が必要です。
38                </p>
39            </div>
40            <div class="n2pn-dialog-body">
41                <div class="n2pn-ios-steps">
42                    <div class="n2pn-ios-step">
43                        <span class="n2pn-ios-step-num">1</span>
44                        <span>画面下の <strong>共有ボタン</strong>(□↑)をタップ</span>
45                    </div>
46                    <div class="n2pn-ios-step">
47                        <span class="n2pn-ios-step-num">2</span>
48                        <span><strong>「ホーム画面に追加」</strong>をタップ</span>
49                    </div>
50                    <div class="n2pn-ios-step">
51                        <span class="n2pn-ios-step-num">3</span>
52                        <span>ホーム画面のアイコンからサイトを開く</span>
53                    </div>
54                    <div class="n2pn-ios-step">
55                        <span class="n2pn-ios-step-num">4</span>
56                        <span>通知許可のダイアログが表示されます</span>
57                    </div>
58                </div>
59            </div>
60            <div class="n2pn-dialog-footer">
61                <button type="button" class="n2pn-button n2pn-button-primary" onclick="n2pnDenyNotifications()" style="width:100%;">
62                    OK
63                </button>
64            </div>
65        `;if(!document.getElementById('n2pn-ios-style')){const style=document.createElement('style');style.id='n2pn-ios-style';style.textContent=`
66                .n2pn-ios-steps { padding: 8px 0; }
67                .n2pn-ios-step {
68                    display: flex; align-items: center; gap: 12px;
69                    padding: 12px 0; border-bottom: 1px solid #f0f0f0;
70                    font-size: 15px; line-height: 1.5;
71                }
72                .n2pn-ios-step:last-child { border-bottom: none; }
73                .n2pn-ios-step-num {
74                    flex-shrink: 0; width: 28px; height: 28px;
75                    background: #2196F3; color: #fff; border-radius: 50%;
76                    display: flex; align-items: center; justify-content: center;
77                    font-size: 14px; font-weight: 700;
78                }
79            `;document.head.appendChild(style);}
80dialog.classList.add('active');}
81document.addEventListener('click',function(e){const dialog=document.getElementById('n2pn-notification-dialog');if(e.target===dialog){n2pnDenyNotifications();}});})();

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.