(function (root, factory) { var api = factory(); if (typeof module === 'object' && module.exports) { module.exports = api; } if (root) { root.TaberebaBookmarkletReceiver = api; } }(typeof window !== 'undefined' ? window : globalThis, function () { 'use strict'; var prefix = '#tabereba_shop='; function validPayload(payload) { var keys = payload && typeof payload === 'object' ? Object.keys(payload).sort() : []; return keys.join(',') === 'bookmarklet_version,hotpepper_url,schema_version,service,shop_id,source' && payload.service === 'tabereba' && payload.schema_version === 1 && payload.bookmarklet_version === '1.0.0' && payload.source === 'hotpepper_gourmet' && typeof payload.shop_id === 'string' && /^J[0-9]{9}$/.test(payload.shop_id) && typeof payload.hotpepper_url === 'string' && payload.hotpepper_url.length <= 2048; } function decode(hash) { hash = String(hash || ''); if (hash.indexOf(prefix) !== 0 || hash.length > 4096) { return {success: false, message: '店舗データが見つからないか、サイズが上限を超えています。'}; } var encoded = hash.slice(prefix.length); if (!/^[A-Za-z0-9_-]+$/.test(encoded)) { return {success: false, message: '店舗データの形式が正しくありません。'}; } try { var base64 = encoded.replace(/-/g, '+').replace(/_/g, '/') + '='.repeat((4 - encoded.length % 4) % 4); var binary = atob(base64); var bytes = Uint8Array.from(binary, function (character) { return character.charCodeAt(0); }); var json = new TextDecoder('utf-8', {fatal: true}).decode(bytes); var payload = JSON.parse(json); if (!validPayload(payload)) { throw new Error('invalid payload'); } return {success: true, message: '', json: json, payload: payload}; } catch (error) { return {success: false, message: '店舗データを読み取れませんでした。通常検索をご利用ください。'}; } } function receive(windowObject, documentObject) { var hash = String(windowObject.location.hash || ''); if (hash.indexOf(prefix) !== 0) { return {handled: false, success: true}; } var result = decode(hash); try { windowObject.history.replaceState(null, documentObject.title, windowObject.location.pathname + windowObject.location.search); } catch (error) {} if (!result.success) { windowObject.alert(result.message); return {handled: true, success: false}; } var form = documentObject.createElement('form'); form.method = 'post'; form.action = 'index.php#tb-link-generator'; var settings = ''; try { settings = windowObject.localStorage.getItem('tabereba_settings_v1') || ''; } catch (error) {} var fields = {bookmarklet_payload: result.json, user_settings_json: settings}; Object.keys(fields).forEach(function (name) { var input = documentObject.createElement('input'); input.type = 'hidden'; input.name = name; input.value = fields[name]; form.appendChild(input); }); documentObject.body.appendChild(form); form.submit(); return {handled: true, success: true}; } if (typeof window !== 'undefined' && typeof document !== 'undefined') { receive(window, document); } return {decode: decode, receive: receive}; }));