1source.com Ads.txt file
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"
/>
<meta name="color-scheme" content="light only" />
<title>1Source, product ingredient safety assessments</title>
<meta name="description" content="1Source is a preventive healthcare platform promoting conscience business practices while enabling the general public to avoid harmful substances in consumable products. A product ingredient safety scanner; The world's first product filter based on personal health conditions." />
<meta property="og:title" content="1Source, product ingredient safety assessments" />
<meta property="og:type" content="website" />
<meta property="og:url" content="https://1source.com//ads.txt" />
<meta property="og:image" content="https://1source.com/image/home-top-vector.jpg" />
<meta property="og:description" content="1Source is a preventive healthcare platform promoting conscience business practices while enabling the general public to avoid harmful substances in consumable products. A product ingredient safety scanner; The world's first product filter based on personal health conditions." />
<link rel="apple-touch-icon" sizes="57x57" href="/favicon/apple-icon-57x57.png" />
<link rel="apple-touch-icon" sizes="60x60" href="/favicon/apple-icon-60x60.png" />
<link rel="apple-touch-icon" sizes="72x72" href="/favicon/apple-icon-72x72.png" />
<link rel="apple-touch-icon" sizes="76x76" href="/favicon/apple-icon-76x76.png" />
<link rel="apple-touch-icon" sizes="114x114" href="/favicon/apple-icon-114x114.png" />
<link rel="apple-touch-icon" sizes="120x120" href="/favicon/apple-icon-120x120.png" />
<link rel="apple-touch-icon" sizes="144x144" href="/favicon/apple-icon-144x144.png" />
<link rel="apple-touch-icon" sizes="152x152" href="/favicon/apple-icon-152x152.png" />
<link rel="apple-touch-icon" sizes="180x180" href="/favicon/apple-icon-180x180.png" />
<link rel="icon" type="image/png" sizes="192x192" href="/favicon/android-icon-192x192.png" />
<link rel="icon" type="image/png" sizes="32x32" href="/favicon/favicon-32x32.png" />
<link rel="icon" type="image/png" sizes="96x96" href="/favicon/favicon-96x96.png" />
<link rel="icon" type="image/png" sizes="16x16" href="/favicon/favicon-16x16.png" />
<link rel="manifest" href="/favicon/manifest.json" />
<meta name="msapplication-TileColor" content="#ffffff" />
<meta name="msapplication-TileImage" content="/favicon/ms-icon-144x144.png" />
<meta name="theme-color" content="#ffffff" />
<link rel="stylesheet" href="/css/font.css" />
<link rel="stylesheet" href="/css/style.css" />
<link rel="stylesheet" href="/css/element.css" />
<link rel="stylesheet" href="/css/modal.css" />
<link rel="stylesheet" href="/css/slider.css" />
<link href="/css/quill.snow.css" rel="stylesheet" />
<link href="/css/uicheckbox.css" rel="stylesheet" />
<link href="/css/uiimageeditorlite.css" rel="stylesheet" />
<link href="/css/UISelectDropdown.css" rel="stylesheet" />
<link rel="stylesheet" href="/module/modal-add-owned-product/modal-add-owned-product.css" />
<link rel="stylesheet" href="/module/modal-image-picker/modal-image-picker.css" />
<link rel="stylesheet" href="/module/modal-image-editor/modal-image-editor.css" />
<link rel="stylesheet" href="/module/modal-thank/modal-thank.css" />
<style>
[data-content] {
opacity: 0;
}
undefined
</style>
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-YE1KBDTB57"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() {
dataLayer.push(arguments);
}
gtag('js', new Date());
gtag('config', 'G-YE1KBDTB57');
</script>
<!-- Apple login -->
<script src="https://appleid.cdn-apple.com/appleauth/static/jsapi/appleid/1/en_US/appleid.auth.js"></script>
</head>
<body>
<!-- dev -->
<div class="dev" style="display: none">Last Update: 2025-04-16</div>
<nav class="menu">
<a href="/">
<img class="logo" src="/image/logo.png" />
<img class="logo-mobile" src="/image/logo-mini.png" />
</a>
<div class="search">
<input
type="text"
name="global"
data-type="global-search"
data-lang="en_US"
autocomplete="off"
placeholder="Product, Ingredient, E-number, Blog"
/>
<input
type="text"
name="global"
data-type="global-search"
data-lang="zh_HK"
autocomplete="off"
placeholder="產品, 成分, 歐盟 E-碼, 文章"
/>
<input
type="text"
name="global"
data-type="global-search"
data-lang="zh_CN"
autocomplete="off"
placeholder="产品, 成分, 欧盟 E-码, 文章"
/>
<input
type="text"
name="global"
data-type="global-search"
data-lang="es"
autocomplete="off"
placeholder="Producto, ingrediente, número E, blog"
/>
<input
type="text"
name="global"
data-type="global-search"
data-lang="fr"
autocomplete="off"
placeholder="Produit, ingrédient, numéro E, blog"
/>
<input
type="text"
name="global"
data-type="global-search"
data-lang="it"
autocomplete="off"
placeholder="Prodotto, ingrediente, numero E, blog"
/>
<input
type="text"
name="global"
data-type="global-search"
data-lang="ko"
autocomplete="off"
placeholder="제품, 성분, E-번호, 블로그"
/>
<input
type="text"
name="global"
data-type="global-search"
data-lang="ja"
autocomplete="off"
placeholder="製品、成分、Eナンバー、ブログ"
/>
<div class="empty-btn"></div>
<div class="search-btn"></div>
<div class="search-results">
<div class="result-title">
<span data-lang="en_US">Products</span>
<span data-lang="zh_HK">產品</span>
<span data-lang="zh_CN">产品</span>
<span data-lang="es">Productos</span>
<span data-lang="fr">Produits</span>
<span data-lang="it">Prodotti</span>
<span data-lang="ko">제품</span>
<span data-lang="ja">製品</span>
</div>
<div class="result-list" name="product"></div>
<div class="result-title">
<span data-lang="en_US">Ingredients</span>
<span data-lang="zh_HK">成分</span>
<span data-lang="zh_CN">成分</span>
<span data-lang="es">Ingredientes</span>
<span data-lang="fr">Ingrédients</span>
<span data-lang="it">Ingredienti</span>
<span data-lang="ko">재료</span>
<span data-lang="ja">材料</span>
</div>
<div class="result-list" name="ingredient"></div>
<div class="result-title">
<span data-lang="en_US">E-Numbers</span>
<span data-lang="zh_HK">歐盟 E-碼</span>
<span data-lang="zh_CN">欧盟 E-码</span>
<span data-lang="es">Números E</span>
<span data-lang="fr">Numéros E</span>
<span data-lang="it">Numeri E</span>
<span data-lang="ko">전자번호</span>
<span data-lang="ja">Eナンバー</span>
</div>
<div class="result-list" name="enumber"></div>
<div class="result-title">
<span data-lang="en_US">Blogs</span>
<span data-lang="zh_HK">文章</span>
<span data-lang="zh_CN">文章</span>
<span data-lang="es">Blogs</span>
<span data-lang="fr">Blogs</span>
<span data-lang="it">Blog</span>
<span data-lang="ko">블로그</span>
<span data-lang="ja">ブログ</span>
</div>
<div class="result-list" name="blog"></div>
<div class="result-title">
<span data-lang="en_US">Authors</span>
<span data-lang="zh_HK">作者</span>
<span data-lang="zh_CN">作者</span>
<span data-lang="es">Autores</span>
<span data-lang="fr">Auteurs</span>
<span data-lang="it">Autori</span>
<span data-lang="ko">저자</span>
<span data-lang="ja">著者</span>
</div>
<div class="result-list" name="author"></div>
</div>
</div>
<div class="menu-list">
<div class="menu-item">
<a>
<span data-lang="en_US">SAFETY</span>
<span data-lang="zh_HK">安全性</span>
<span data-lang="zh_CN">安全性</span>
<span data-lang="es">SEGURIDAD</span>
<span data-lang="fr">SÉCURITÉ</span>
<span data-lang="it">SICUREZZA</span>
<span data-lang="ko">안전</span>
<span data-lang="ja">安全性</span>
<span class="menu-arrow"></span>
</a>
<div class="dropdown">
<!-- <div class="bar"></div> -->
<a href="/products" class="dropdown-item" data-val="product">
<span data-lang="en_US">Product</span>
<span data-lang="zh_HK">產品</span>
<span data-lang="zh_CN">产品</span>
<span data-lang="es">Productos</span>
<span data-lang="fr">Produits</span>
<span data-lang="it">Prodotti</span>
<span data-lang="ko">제품</span>
<span data-lang="ja">製品</span>
</a>
<a href="/ingredients" class="dropdown-item" data-val="ingredient">
<span data-lang="en_US">Ingredient</span>
<span data-lang="zh_HK">成分</span>
<span data-lang="zh_CN">成分</span>
<span data-lang="es">Ingredientes</span>
<span data-lang="fr">Ingrédients</span>
<span data-lang="it">Ingredienti</span>
<span data-lang="ko">재료</span>
<span data-lang="ja">材料</span>
</a>
<a href="/e-numbers" class="dropdown-item" data-val="e-numbers">
<span data-lang="en_US">E-Number</span>
<span data-lang="zh_HK">歐盟 E-碼</span>
<span data-lang="zh_CN">欧盟 E-码</span>
<span data-lang="es">Números E</span>
<span data-lang="fr">Numéros E</span>
<span data-lang="it">Numeri E</span>
<span data-lang="ko">전자번호</span>
<span data-lang="ja">Eナンバー</span>
</a>
<!-- <div class="dropdown-item" data-val="covid"><a href="/covid">KO Covid-19</a></div> -->
</div>
</div>
<div class="menu-item">
<a>
<span data-lang="en_US">ANALYZER</span>
<span data-lang="zh_HK">解碼器</span>
<span data-lang="zh_CN">解码器</span>
<span data-lang="es">ANALIZADOR</span>
<span data-lang="fr">ANALYSEUR</span>
<span data-lang="it">ANALIZZATORE</span>
<span data-lang="ko">분석기</span>
<span data-lang="ja">アナライザ</span>
<span class="menu-arrow"></span>
</a>
<div class="dropdown">
<!-- <div class="bar"></div> -->
<a href="/analyzer" class="dropdown-item" data-val="analyzer">
<span data-lang="en_US">Analyzer</span>
<span data-lang="zh_HK">掃描成分和產品</span>
<span data-lang="zh_CN">扫描成分和产品</span>
<span data-lang="es">Analizador</span>
<span data-lang="fr">Analyseur</span>
<span data-lang="it">Analizzatore</span>
<span data-lang="ko">분석기</span>
<span data-lang="ja">原材料と製品をスキャンする</span>
</a>
<a href="/upload-product" class="dropdown-item" data-val="upload-product">
<span data-lang="en_US">Upload Product</span>
<span data-lang="zh_HK">上載產品</span>
<span data-lang="zh_CN">上传产品</span>
<span data-lang="es">Subir producto</span>
<span data-lang="fr">Télécharger le produit</span>
<span data-lang="it">Carica prodotto</span>
<span data-lang="ko">제품 업로드</span>
<span data-lang="ja">製品をアップロード</span>
</a>
<a href="https://1s.com" class="dropdown-item">
<span data-lang="en_US">1Source App</span>
<span data-lang="zh_HK">App</span>
<span data-lang="zh_CN">App</span>
<span data-lang="es">Aplicación</span>
<span data-lang="fr">Application</span>
<span data-lang="it">Applicazione</span>
<span data-lang="ko">앱</span>
<span data-lang="ja">アプリ</span>
</a>
</div>
</div>
<div class="menu-item" data-val="blog">
<a href="/blog">
<span data-lang="en_US">BLOG</span>
<span data-lang="zh_HK">多元健康</span>
<span data-lang="zh_CN">多元健康</span>
<span data-lang="es">BLOG</span>
<span data-lang="fr">BLOG</span>
<span data-lang="it">BLOG</span>
<span data-lang="ko">블로그</span>
<span data-lang="ja">ブログ</span>
<span class="menu-arrow"></span>
</a>
<div class="dropdown"></div>
</div>
<div class="menu-item" data-val="about">
<a href="/aboutus">
<span data-lang="en_US">ABOUT</span>
<span data-lang="zh_HK">關於</span>
<span data-lang="zh_CN">关于</span>
<span data-lang="es">ACERCA DE</span>
<span data-lang="fr">À PROPOS</span>
<span data-lang="it">DI</span>
<span data-lang="ko">에 대한</span>
<span data-lang="ja">について</span>
</a>
</div>
</div>
<div class="action-list">
<div class="action-group" data-val="account">
<div name="profile" class="action-item">
<img src="/image/icon-profile-grey.png" />
</div>
</div>
<div class="action-group" tabindex="-1">
<div name="lang" class="action-item">
<img src="/image/icon-lang-grey.png" />
</div>
<div class="dropdown">
<div class="lang-item" data-language="en_US">English</div>
<div class="lang-item" data-language="zh_HK">繁體中文</div>
<div class="lang-item" data-language="zh_CN">简体中文</div>
<div class="lang-item" data-language="ja">日本語</div>
<div class="lang-item" data-language="es">Español</div>
<div class="lang-item" data-language="fr">Français</div>
<div class="lang-item" data-language="it">Italiano</div>
<div class="lang-item" data-language="ko">한국어</div>
</div>
</div>
</div>
<!-- mobile menu -->
<div class="icon" name="menu"></div>
<div class="dropdown-menu">
<div class="menu-item active">
<a>
<span data-lang="en_US">SAFETY</span>
<span data-lang="zh_HK">安全性</span>
<span data-lang="zh_CN">安全性</span>
<span data-lang="es">SEGURIDAD</span>
<span data-lang="fr">SÉCURITÉ</span>
<span data-lang="it">SICUREZZA</span>
<span data-lang="ko">안전</span>
<span data-lang="ja">安全性</span>
<span class="menu-arrow"></span>
</a>
<div class="dropdown">
<div class="dropdown-item" data-val="product">
<a href="/products">
<span data-lang="en_US">Product</span>
<span data-lang="zh_HK">產品</span>
<span data-lang="zh_CN">产品</span>
<span data-lang="es">Productos</span>
<span data-lang="fr">Produits</span>
<span data-lang="it">Prodotti</span>
<span data-lang="ko">제품</span>
<span data-lang="ja">製品</span>
</a>
</div>
<div class="dropdown-item" data-val="ingredient">
<a href="/ingredients">
<span data-lang="en_US">Ingredient</span>
<span data-lang="zh_HK">成分</span>
<span data-lang="zh_CN">成分</span>
<span data-lang="es">Ingredientes</span>
<span data-lang="fr">Ingrédients</span>
<span data-lang="it">Ingredienti</span>
<span data-lang="ko">재료</span>
<span data-lang="ja">材料</span>
</a>
</div>
<div class="dropdown-item" data-val="e-numbers">
<a href="/e-numbers">
<span data-lang="en_US">E-Number</span>
<span data-lang="zh_HK">歐盟 E-碼</span>
<span data-lang="zh_CN">欧盟 E-码</span>
<span data-lang="es">Números E</span>
<span data-lang="fr">Numéros E</span>
<span data-lang="it">Numeri E</span>
<span data-lang="ko">전자번호</span>
<span data-lang="ja">Eナンバー</span>
</a>
</div>
</div>
</div>
<div class="menu-item active">
<a>
<span data-lang="en_US">ANALYZER</span>
<span data-lang="zh_HK">解碼器</span>
<span data-lang="zh_CN">解码器</span>
<span data-lang="es">ANALIZADOR</span>
<span data-lang="fr">ANALYSEUR</span>
<span data-lang="it">ANALIZZATORE</span>
<span data-lang="ko">분석기</span>
<span data-lang="ja">アナライザ</span>
<span class="menu-arrow"></span>
</a>
<div class="dropdown">
<div class="dropdown-item" data-val="analyzer">
<a href="/analyzer">
<span data-lang="en_US">Analyzer</span>
<span data-lang="zh_HK">掃描成分和產品</span>
<span data-lang="zh_CN">扫描成分和产品</span>
<span data-lang="es">Analizador</span>
<span data-lang="fr">Analyseur</span>
<span data-lang="it">Analizzatore</span>
<span data-lang="ko">분석기</span>
<span data-lang="ja">原材料と製品をスキャンする</span>
</a>
</div>
<div class="dropdown-item" data-val="upload-product">
<a href="/upload-product">
<span data-lang="en_US">Upload Product</span>
<span data-lang="zh_HK">上載產品</span>
<span data-lang="zh_CN">上传产品</span>
<span data-lang="es">Subir producto</span>
<span data-lang="fr">Télécharger le produit</span>
<span data-lang="it">Carica prodotto</span>
<span data-lang="ko">제품 업로드</span>
<span data-lang="ja">製品をアップロード</span>
</a>
</div>
</div>
</div>
<div class="menu-item" data-val="blog">
<a>
<span data-lang="en_US" onclick="window.location.href = '/blog'">BLOG</span>
<span data-lang="zh_HK" onclick="window.location.href = '/blog'">多元健康</span>
<span data-lang="zh_CN" onclick="window.location.href = '/blog'">多元健康</span>
<span data-lang="es" onclick="window.location.href = '/blog'">BLOG</span>
<span data-lang="fr" onclick="window.location.href = '/blog'">BLOG</span>
<span data-lang="it" onclick="window.location.href = '/blog'">BLOG</span>
<span data-lang="ko" onclick="window.location.href = '/blog'">블로그</span>
<span data-lang="ja" onclick="window.location.href = '/blog'">ブログ</span>
<span class="menu-arrow"></span>
</a>
<div class="dropdown" style="display: none"></div>
</div>
<div class="menu-item" data-val="about">
<a href="/about">
<span data-lang="en_US">ABOUT</span>
<span data-lang="zh_HK">關於</span>
<span data-lang="zh_CN">关于</span>
<span data-lang="es">ACERCA DE</span>
<span data-lang="fr">À PROPOS</span>
<span data-lang="it">DI</span>
<span data-lang="ko">에 대한</span>
<span data-lang="ja">について</span>
</a>
</div>
<div class="menu-item" data-val="account">
<a href="/profile">
<span data-lang="en_US">MY ACCOUNT</span>
<span data-lang="zh_HK">我的賬號</span>
<span data-lang="zh_CN">我的账号</span>
<span data-lang="es">MI CUENTA</span>
<span data-lang="fr">MON COMPTE</span>
<span data-lang="it">IL MIO CONTO</span>
<span data-lang="ko">내 계정</span>
<span data-lang="ja">私のアカウント</span>
</a>
</div>
<div class="menu-item active">
<a>
<span data-lang="en_US">LANGUAGE</span>
<span data-lang="zh_HK">語言</span>
<span data-lang="zh_CN">语言</span>
<span data-lang="es">IDIOMA</span>
<span data-lang="fr">LANGUE</span>
<span data-lang="it">LINGUA</span>
<span data-lang="ko">언어</span>
<span data-lang="ja">言語</span>
<span class="menu-arrow"></span>
</a>
<div class="dropdown">
<div class="dropdown-item lang-item" data-language="en_US"><a>English</a></div>
<div class="dropdown-item lang-item" data-language="zh_HK"><a>繁體中文</a></div>
<div class="dropdown-item lang-item" data-language="zh_CN"><a>简体中文</a></div>
<div class="dropdown-item lang-item" data-language="ja"><a>日本語</a></div>
<div class="dropdown-item lang-item" data-language="es"><a>Español</a></div>
<div class="dropdown-item lang-item" data-language="fr"><a>Français</a></div>
<div class="dropdown-item lang-item" data-language="it"><a>Italiano</a></div>
<div class="dropdown-item lang-item" data-language="ko"><a>한국어</a></div>
</div>
</div>
</div>
</nav>
<!-- Dynamic Content -->
<div class="page"></div>
<div class="modal-container" style="display: none">
<div name="add-owned-product" class="modal"></div>
<div name="image-picker" class="modal">
<div class="modal-top">
<span data-lang="en_US">Choose Image Source</span>
<span data-lang="zh_HK">選擇影像來源</span>
<span data-lang="zh_CN">选择图像源</span>
<span data-lang="es">Elija la fuente de la imagen</span>
<span data-lang="fr">Choisir la source de l'image</span>
<span data-lang="it">Scegli la fonte dell'immagine</span>
<span data-lang="ko">이미지 소스 선택</span>
<span data-lang="ja">画像ソースを選択</span>
</div>
<div class="modal-body">
<div class="tab-row">
<div name="upload" class="tab">
<span data-lang="en_US">Upload Image</span>
<span data-lang="zh_HK">上傳圖片</span>
<span data-lang="zh_CN">上传图片</span>
<span data-lang="es">Subir imagen</span>
<span data-lang="fr">Télécharger l'image</span>
<span data-lang="it">Carica Immagine</span>
<span data-lang="ko">이미지 업로드</span>
<span data-lang="ja">画像をアップロード</span>
</div>
<div name="camera" class="tab">
<span data-lang="en_US">Web Camera</span>
<span data-lang="zh_HK">網路攝影機</span>
<span data-lang="zh_CN">网络摄像头</span>
<span data-lang="es">Cámara web</span>
<span data-lang="fr">Webcam</span>
<span data-lang="it">Webcam</span>
<span data-lang="ko">웹 카메라</span>
<span data-lang="ja">ウェブカメラ</span>
</div>
</div>
<div class="placeholder">
<span data-lang="en_US">Click to upload</span>
<span data-lang="zh_HK">點擊上傳</span>
<span data-lang="zh_CN">点击上传</span>
<span data-lang="es">Haga clic para cargar</span>
<span data-lang="fr">Cliquez pour télécharger</span>
<span data-lang="it">Clicca per caricare</span>
<span data-lang="ko">업로드하려면 클릭하세요.</span>
<span data-lang="ja">クリックしてアップロード</span>
</div>
<div class="video-container">
<video id="image-picker-camera" muted playsinline autoplay></video>
<div class="cursor"></div>
<button type="button" name="submit">
<span data-lang="en_US">Choose Image</span>
<span data-lang="zh_HK">選擇影像</span>
<span data-lang="zh_CN">选择图像</span>
<span data-lang="es">Elija una imagen</span>
<span data-lang="fr">Choisir une image</span>
<span data-lang="it">Scegli Immagine</span>
<span data-lang="ko">이미지 선택</span>
<span data-lang="ja">画像を選択</span>
</button>
</div>
<canvas id="image-picker-canvas" style="display: none"></canvas>
<input name="upload" type="file" style="display: none" accept="image/*" />
</div>
<div class="exit"></div>
</div>
<div name="image-editor" class="modal">
<div class="modal-top">
<span data-lang="en_US">Crop and Confirm Image</span>
<span data-lang="zh_HK">裁切並確認影像</span>
<span data-lang="zh_CN">裁剪并确认图像</span>
<span data-lang="es">Recortar y confirmar la imagen</span>
<span data-lang="fr">Recadrer et confirmer l'image</span>
<span data-lang="it">Ritaglia e conferma l'immagine</span>
<span data-lang="ko">이미지 자르기 및 확인</span>
<span data-lang="ja">画像の切り抜きと確認</span>
</div>
</div>
<div name="thank" class="modal"></div>
</div>
<footer>
<div class="container">
<div class="column">
<div class="title">
<span data-lang="en_US">Quick Links</span>
<span data-lang="zh_HK">快速鏈結</span>
<span data-lang="zh_CN">快速链结</span>
<span data-lang="es">Enlaces rápidos</span>
<span data-lang="fr">Liens rapides</span>
<span data-lang="it">Collegamenti rapidi</span>
<span data-lang="ko">빠른 링크</span>
<span data-lang="ja">クイックリンク</span>
</div>
<ul>
<li class="link">
<a href="/partnerships">
<span data-lang="en_US">Partnerships</span>
<span data-lang="zh_HK">合作機會</span>
<span data-lang="zh_CN">快速鏈結</span>
<span data-lang="es">Asociaciones</span>
<span data-lang="fr">Partenariats</span>
<span data-lang="it">Collaborazioni</span>
<span data-lang="ko">파트너십</span>
<span data-lang="ja">パートナーシップ</span>
</a>
</li>
<li class="link">
<a href="/career">
<span data-lang="en_US">Career Opportunities</span>
<span data-lang="zh_HK">工作機會</span>
<span data-lang="zh_CN">合作机会</span>
<span data-lang="es">Oportunidades profesionales</span>
<span data-lang="fr">Opportunités de carrière</span>
<span data-lang="it">Opportunità di carriera</span>
<span data-lang="ko">경력 기회</span>
<span data-lang="ja">キャリアチャンス</span>
</a>
</li>
<li class="link">
<a href="/write-for-us">
<span data-lang="en_US">Write for us</span>
<span data-lang="zh_HK">為我們寫作</span>
<span data-lang="zh_CN">为我们写作</span>
<span data-lang="es">Escribe para nosotros</span>
<span data-lang="fr">Écrivez pour nous</span>
<span data-lang="it">Scrivi per noi</span>
<span data-lang="ko">우리를 위해 쓰세요</span>
<span data-lang="ja">私たちに書いてください</span>
</a>
</li>
</ul>
</div>
<div class="column">
<div class="row">
<a
href="https://play.google.com/store/apps/details?id=com.onesource.app"
target="_blank"
>
<img class="appstore" src="/image/playstore.png" />
</a>
<a href="https://apps.apple.com/us/app/1source/id1380049254" target="_blank">
<img class="appstore" src="/image/appstore.png" />
</a>
</div>
<div class="socials row" style="width: 100%">
<a
href="https://www.facebook.com/1sourceapp/"
target="_blank"
class="social"
name="facebook"
></a>
<a
href="https://www.instagram.com/1sourceapp/"
target="_blank"
class="social"
name="instagram"
></a>
<a href="mailto:info@1s.com" target="_blank" class="social" name="email"></a>
</div>
</div>
<div class="column">
<div class="title center">
<span data-lang="en_US">Get in Touch with us</span>
<span data-lang="zh_HK">電郵訂閱</span>
<span data-lang="zh_CN">电邮订阅</span>
<span data-lang="es">Ponte en contacto con nosotros</span>
<span data-lang="fr">Contactez-nous</span>
<span data-lang="it">Contattaci</span>
<span data-lang="ko">저희에게 연락하세요</span>
<span data-lang="ja">お問い合わせください</span>
</div>
<div class="subscribe">
<input type="email" name="subscribe" placeholder="you@email.com" />
<div class="email-btn"></div>
</div>
<div class="tnc row">
<input type="checkbox" id="tnc" name="tnc" />
<div class="checkbox-label" data-lang="en_US">
I have read the <a href="/privacy" target="_blank">privacy policy</a> and agree with
it.
</div>
<div class="checkbox-label" for="tnc" data-lang="zh_HK">
我已閱讀並同意<a href="/privacy" target="_blank">隱私政策</a>。
</div>
<div class="checkbox-label" for="tnc" data-lang="zh_CN">
我已阅读并同意<a href="/privacy" target="_blank">隐私政策</a>。
</div>
<div class="checkbox-label" for="tnc" data-lang="es">
He leído la <a href="/privacy" target="_blank">política de privacidad</a> y estoy de
acuerdo con ella.
</div>
<div class="checkbox-label" for="tnc" data-lang="fr">
J'ai lu la <a href="/privacy" target="_blank">politique de confidentialité</a> et je
l'accepte.
</div>
<div class="checkbox-label" for="tnc" data-lang="it">
Ho letto l'<a href="/privacy" target="_blank">informativa sulla privacy</a> e sono
d'accordo.
</div>
<div class="checkbox-label" for="tnc" data-lang="ko">
<a href="/privacy" target="_blank">개인정보처리방침</a>을 읽었으며 동의합니다.
</div>
<div class="checkbox-label" data-lang="ja">
私は読んだ<a href="/?page=privacy" target="_blank">プライバシーポリシー</a>
そしてそれに同意します。
</div>
</div>
</div>
</div>
<div class="copyright">
<span data-lang="en_US">Copyright © 2018-</span>
<span data-lang="zh_HK">1Source Limited版權所有 © 2018-</span>
<span data-lang="zh_CN">一衡科技有限公司版权所有 © 2018-</span>
<span data-lang="es">Derechos de autor © 2018-</span>
<span data-lang="fr">Droits d'auteur © 2018-</span>
<span data-lang="it">Copyright © 2018-</span>
<span data-lang="ko">저작권 © 2018-</span>
<span data-lang="ja">著作権 © 2018-</span>
<script>
document.write(new Date().getFullYear());
</script>
<span data-lang="en_US"> by 1Source Limited. All Rights Reserved.</span>
<span data-lang="zh_HK"> ,保留所有權利。</span>
<span data-lang="zh_CN"> ,保留所有权利。</span>
<span data-lang="es"> por 1Source Limited. Todos los derechos reservados.</span>
<span data-lang="fr"> Par 1Source Limited. Tous droits réservés.</span>
<span data-lang="it"> di 1Source Limited. Tutti i diritti riservati.</span>
<span data-lang="ko"> 1Source Limited에서 제공. 모든 권리 보유.</span>
<span data-lang="ja"> 1Source 有限会社。無断転載を禁じます。</span>
<br />
<span data-lang="en_US"> Last Update on </span>
<span data-lang="zh_HK"> 最後更新 </span>
<span data-lang="zh_CN"> 最后更新 </span>
<span data-lang="es"> Última actualización en</span>
<span data-lang="fr"> Dernière mise à jour le</span>
<span data-lang="it"> Ultimo aggiornamento il</span>
<span data-lang="ko"> 마지막 업데이트 날짜</span>
<span data-lang="ja"> 最終更新日</span>
2025-04-16
</div>
</footer>
<!-- back to top -->
<div class="back-to-top"></div>
<script type="text/javascript" src="/script/config.js"></script>
<script type="text/javascript" src="/js/jquery-1.11.0.js"></script>
<script type="text/javascript" src="/js/quill.js"></script>
<script type="text/javascript" src="/js/html5-qrcode.min.js"></script>
<script type="text/javascript" src="/js/quagga.min.js"></script>
<script type="text/javascript" src="/js/zxing_0.18.6.js"></script>
<!-- <script async src="/js/opencv.js" onload="console.log('OpenCV is ready');" type="text/javascript"></script> -->
<script type="text/javascript" src="/script/webappfoundation.js"></script>
<script type="text/javascript" src="/script/address.js"></script>
<script type="text/javascript" src="/script/cookie.js"></script>
<script type="text/javascript" src="/script/urlconnection.js"></script>
<script type="text/javascript" src="/script/imageprocessor.js"></script>
<script type="text/javascript" src="/script/UIImageEditorLite.js"></script>
<script type="text/javascript" src="/script/kdate.js"></script>
<script type="text/javascript" src="/script/url.js"></script>
<script type="text/javascript" src="/script/util.js"></script>
<script type="text/javascript" src="/script/LoadingListener.js"></script>
<script type="text/javascript" src="/script/LoadingState.js"></script>
<script type="text/javascript" src="/script/BarcodeDecoder.js"></script>
<script type="text/javascript" src="/script/UISelectDropdown.js"></script>
<script type="text/javascript" src="/script/Region.js"></script>
<script
type="text/javascript"
src="/module/modal-add-owned-product/modal-add-owned-product.js"
></script>
<script type="text/javascript" src="/module/modal-image-picker/modal-image-picker.js"></script>
<script type="text/javascript" src="/module/modal-image-editor/modal-image-editor.js"></script>
<script type="text/javascript" src="/module/modal-thank/modal-thank.js"></script>
<!-- Start -->
<script>
/* Global Variables */
let currPage = Address.get('page') || 'home';
let pageApp = false;
let mImageViewerModal,
mAddOwnedProductModal,
mImagePickerModal,
mImageEditorModal,
mThankModal;
let LANG = 'en_US';
let isLoggedIn = false;
let restrictedPath = ['account'];
let searchProductToken = null,
searchIngredientToken = null,
searchEnumberToken = null,
searchBlogToken = null;
let globalSearchInput = $('input[data-type=global-search]');
let globalSearchTimer;
/* Init */
document.addEventListener('DOMContentLoaded', async function () {
// Set language
if (!Cookie.get('lang')) {
let browserLanguage = navigator.language || navigator.userLanguage;
if (
[
'zh',
'zh-TW',
'zh-HK',
'zh-Hans',
'zh-Hans-HK',
'zh-Hans-MO',
'zh-Hans-SG',
'zh-Hant',
'zh-Hant-HK',
'zh-Hant-MO',
'zh-Hant-TW'
].includes(browserLanguage)
) {
Cookie.set('lang', 'zh_HK', 365);
} else if (['zh-Hans-CN', 'zh-CN'].includes(browserLanguage)) {
Cookie.set('lang', 'zh_CN', 365);
} else {
Cookie.set('lang', 'en_US', 365);
}
}
LANG = Cookie.get('lang');
if (URL.get('lang')) {
LANG = URL.get('lang');
}
$('[data-lang]').each(function () {
$(this).attr('data-lang') == Cookie.get('lang')
? $(this).css('opacity', 1)
: $(this).remove();
});
$('nav .button[name=lang] .option').bind('click', function (e) {
Cookie.set('lang', $(this).attr('data-val'), 365);
window.location.reload();
});
let articleCategoryList = [];
if (sessionStorage.getItem('article_parent_category')) {
try {
// articleCategoryList = JSON.parse(sessionStorage.getItem('article_parent_category'));
} catch (e) {}
}
if (articleCategoryList.length == 0) {
let res = await URLConnection.post({
path: 'article/category',
param: {
// is_parent: '1',
}
});
if (res.s) {
articleCategoryList = res.c.category;
sessionStorage.setItem('article_parent_category', JSON.stringify(articleCategoryList));
}
}
let mDom = $('.menu-list .menu-item[data-val=blog]').eq(0);
let mmDom = $('.dropdown-menu .menu-item[data-val=blog]').eq(0);
if (articleCategoryList.length > 0) {
let categoryList = [];
articleCategoryList.forEach((category) => {
const parentId = category.parent_id;
if (!parentId) {
// Category is a root category
categoryList.push(category);
}
});
articleCategoryList.forEach((category) => {
const parentId = category.parent_id;
if ($.isNumeric(parentId)) {
// Category is a subcategory, add it to its parent's sub_category_list
const parentCategory = categoryList.filter((v) => v.id == parentId)[0];
if (parentCategory) {
parentCategory.sub_category_list = parentCategory.sub_category_list || [];
parentCategory.sub_category_list.push(category);
}
}
});
for (let c of categoryList) {
let iDom = $(`
<div class="dropdown-item" data-val="blog">
<a href="/blog?category=${c.id}">${
c[
{
en_US: 'name',
zh_HK: 'name_zho',
zh_CN: 'name_zhs',
es: 'name_es',
fr: 'name_fr',
it: 'name_it',
ko: 'name_ko',
ja: 'name_ja'
}[LANG]
] || c.name
} (${c.article_count})</a>
</div>
`);
if (Array.isArray(c.sub_category_list) && c.sub_category_list.length > 0) {
let jDom = $(`<div class="submenu"></div>`);
for (let s of c.sub_category_list) {
let kDom = $(`
<div class="dropdown-item" data-val="blog">
<a href="/blog?category=${c.id}&subcategory=${s.id}">${
s[
{
en_US: 'name',
zh_HK: 'name_zho',
zh_CN: 'name_zhs',
es: 'name_es',
fr: 'name_fr',
it: 'name_it',
ko: 'name_ko',
ja: 'name_ja'
}[LANG]
] || s.name
} (${s.article_count})</a>
</div>
`);
jDom.append(kDom);
}
iDom.append(jDom);
iDom.addClass('menuitem-arrow');
}
mDom.find('.dropdown').append(iDom);
let jDom = $(`
<div class="dropdown-item" data-val="blog">
<a href="/blog?category=${c.id}">
${
c[
{
en_US: 'name',
zh_HK: 'name_zho',
zh_CN: 'name_zhs',
es: 'name_es',
fr: 'name_fr',
it: 'name_it',
ko: 'name_ko',
ja: 'name_ja'
}[LANG]
] || c.name
} (${c.article_count})
</a>
</div>
`);
if (Array.isArray(c.sub_category_list) && c.sub_category_list.length > 0) {
jDom.find('a').append('<span class="menu-arrow"></span>');
let sDom = $(`<div class="submenu" style="display: none;"></div>`);
for (let s of c.sub_category_list) {
let kDom = $(`
<div class="dropdown-subitem" data-val="blog">
<a href="/blog?category=${c.id}&subcategory=${s.id}">${
s[
{
en_US: 'name',
zh_HK: 'name_zho',
zh_CN: 'name_zhs',
es: 'name_es',
fr: 'name_fr',
it: 'name_it',
ko: 'name_ko',
ja: 'name_ja'
}[LANG]
] || s.name
} (${s.article_count})</a>
</div>
`);
sDom.append(kDom);
}
jDom.append(sDom);
jDom.bind('click', function (e) {
e.stopPropagation();
sDom.slideToggle(200);
});
jDom.find('a').bind('click', function (e) {
e.stopPropagation();
});
}
mmDom.find('.dropdown').append(jDom);
}
// mmDom.children('a').removeAttr('href');
} else {
mDom.find('.dropdown').remove();
mmDom.find('.dropdown').remove();
}
// Language
$('.lang-item').bind('click', function (e) {
if (Cookie.get('lang') != $(this).attr('data-language')) {
Cookie.set('lang', $(this).attr('data-language'), 365);
window.location.reload();
}
});
(async () => {
let res = await URLConnection.post({
path: 'page',
param: {
page: 'menu'
}
});
if (res.s) {
let dom = $('nav.menu').eq(0);
for (let k in res.c.content) {
let text = res.c.content[k];
if (typeof text != 'string') {
continue;
}
dom.find(`[data-content=${k}]`).html(text).css('opacity', 1);
}
}
})();
(async () => {
let res = await URLConnection.post({
path: 'page',
param: {
page: 'footer'
}
});
if (res.s) {
let dom = $('footer').eq(0);
for (let k in res.c.content) {
let text = res.c.content[k];
if (typeof text != 'string') {
continue;
}
dom.find(`[data-content=${k}]`).html(text).css('opacity', 1);
}
}
})();
// Load app
await loadApp();
// Load modal
await loadLayout({
dom: $('.modal[name=add-owned-product]').eq(0),
layout: '/module/modal-add-owned-product/modal-add-owned-product.html'
});
mAddOwnedProductModal = new AddOwnedProductModal({
dom: $('.modal[name=add-owned-product]').eq(0)
});
//await loadLayout({ dom: $('.modal[name=image-picker]').eq(0), layout: "/module/modal-image-picker/modal-image-picker.html" });
mImagePickerModal = new ImagePickerModal({
dom: $('.modal[name=image-picker]').eq(0)
});
await loadLayout({
dom: $('.modal[name=image-editor]').eq(0),
layout: '/module/modal-image-editor/modal-image-editor.html'
});
mImageEditorModal = new ImageEditorModal({
dom: $('.modal[name=image-editor]').eq(0)
});
await loadLayout({
dom: $('.modal[name=thank]').eq(0),
layout: '/module/modal-thank/modal-thank.html'
});
mThankModal = new ThankModal({
dom: $('.modal[name=thank]').eq(0)
});
// Set nav control
setNavCtrl();
// misc
setMisc();
});
async function autoLogin() {
if (Cookie.get('id') && Cookie.get('token')) {
let res = await URLConnection.post({
path: 'user/autologin',
param: {
id: Cookie.get('id'),
token: Cookie.get('token')
}
});
if (res.s) {
return true;
} else {
Cookie.remove('id');
Cookie.remove('token');
return false;
}
}
return false;
}
async function loadApp() {
try {
pageApp = new MyActivity({ dom: $('.page').eq(0) });
} catch (e) {
console.error(e);
}
/*
let pageUrl = window.location.pathname.split('/').pop();
let pageName = {
home: 'home',
about: 'about',
admissions: 'admissions',
belief: 'belief',
curriculum: 'curriculum',
achievement: 'achievement',
activities: 'gallery',
'school-facilities': 'facility',
'contact-us': 'contact',
}[pageUrl];
!pageName ? pageName = 'home' : false;
let res = await URLConnection.post({
path: 'page',
param: {
page: pageName,
},
});
if (res.s) {
dom.find('[data-content]').each(function() {
let iDom = $(this);
let value = res.c.content[iDom.attr('data-content')];
if (value) {
if (iDom.is('a')) {
iDom.attr('href', value);
} else if (iDom.is('iframe')) {
if (value.includes('youtu')) {
iDom.attr('src', 'https://www.youtube.com/embed/' + value.split('/').pop());
} else if (value.includes('.pdf')) {
iDom.attr('src', value + '#toolbar=0');
} else {
iDom.attr('src', value);
}
} else if (iDom.is('img')) {
iDom.attr('src', value);
} else if (iDom.is('image')) {
iDom.attr('xlink:href', value);
} else if (iDom.attr('data-type') == 'background') {
iDom.css('background-image', `url('${value}')`);
} else {
let text = value.replace(/\s\s+/g, function(match) {
return ' '.repeat(match.length);
});
iDom.html(text);
}
}
iDom.css('opacity', '1');
});
}
*/
}
async function setNavCtrl() {
let task = new Promise(function (resolve, reject) {
let nav = $('nav.menu');
let nav_mobile = $('nav.menu-mobile');
let control = nav_mobile.find('.control');
let list = nav_mobile.find('.list');
let subscribe = nav_mobile.find('.subscribe');
let followUs = nav_mobile.find('.follow-us');
let banner = $('.banner');
let page = $('.page');
control.on('click', function (e) {
e.stopPropagation();
if (list.hasClass('active')) {
list.removeClass('active');
subscribe.removeClass('active');
followUs.removeClass('active');
nav_mobile.css({ position: 'relative', 'margin-top': 0 });
// page.css({ display: "inline-flex", opacity: 1 });
} else {
list.addClass('active');
subscribe.addClass('active');
followUs.addClass('active');
nav_mobile.css({
position: 'absolute',
'margin-top': banner.is(':visible') ? banner.outerHeight() + 'px' : 0
});
// page.css({ display: "none", opacity: 0 });
}
});
// Account page
$('.action-item[name=profile]').each(async function () {
let res = await URLConnection.post({
path: 'autologin',
param: {
id: Cookie.get('id'),
token: Cookie.get('token')
}
});
if (res.s) {
$(this).addClass('photo');
res.c.thumbnail ? $(this).find('img').attr('src', res.c.thumbnail) : false;
$(this).bind('click', function () {
window.location.href = '/profile';
});
} else {
$(this).bind('click', function () {
window.location.href = '/login';
});
}
});
resolve(true);
});
try {
let result = await task;
return result;
} catch (e) {
console.log(e);
}
}
async function logout() {
if (!confirm({ en_US: 'Confirm to logout your account?', zh_HK: '確定登出賬號?' }[LANG])) {
return false;
}
let res = await URLConnection.post({
path: 'user/logout',
param: {
id: Cookie.get('id'),
token: Cookie.get('token')
}
});
Cookie.remove('id');
Cookie.remove('token');
window.location.reload();
}
async function createHtmlElement(param) {
let task = new Promise((resolve, reject) => {
let dom = document.createElement(param.tag);
if (param.attr) {
for (let key in param.attr) {
dom.setAttribute(key, param.attr[key]);
}
}
if (param.text) {
dom.innerText = param.text;
}
if (param.html) {
dom.innerHTML = param.html;
}
if (param.class) {
dom.className = param.class;
}
if (param.parent) {
param.parent.appendChild(dom);
}
if (param.referenceNode) {
param.referenceNode.parentNode.insertBefore(dom, param.referenceNode.nextSibling);
}
if (param.parent || param.referenceNode) {
resolve(true);
} else {
reject('No parent or referenceNode');
}
});
try {
let result = await task;
return result;
} catch (e) {
console.log(e);
}
}
async function loadLayout(data) {
let task = new Promise(function (resolve, reject) {
data.dom.load(data.layout + '?' + new Date().getTime(), function () {
resolve(true);
});
});
try {
let result = await task;
return result;
} catch (err) {
console.log(err);
return false;
}
}
async function sleep(timeout) {
let task = new Promise(function (resolve, reject) {
setTimeout(function () {
resolve(true);
}, timeout);
});
try {
let result = await task;
return result;
} catch (e) {
console.log(e);
}
}
async function isFileExist(url) {
if (!url) {
return false;
}
let task = new Promise(function (resolve, reject) {
let xhr = new XMLHttpRequest();
xhr.open('HEAD', url, true);
xhr.onreadystatechange = function () {
if (this.readyState == this.DONE) {
if (this.status == 200) {
resolve(true);
} else {
resolve(false);
}
}
};
xhr.send();
});
try {
let result = await task;
return result;
} catch (e) {
console.log(e);
}
}
async function loadDotSlider(dom, step, includeMargin = false) {
dom.find('.dot').each(function (i) {
$(this)
.unbind('click')
.bind('click', function (e) {
toSlide(i * (step ?? 1));
dom.find('.dot').removeClass('selected');
$(this).addClass('selected');
});
});
function toSlide(n) {
dom.find('.content').animate(
{
scrollLeft: n * dom.find('.content .item').outerWidth(includeMargin)
},
400
);
}
toSlide(0);
}
async function getRemoteImage(url, useProxy = false) {
let task = new Promise((resolve, reject) => {
let googleProxyURL =
'https://images1-focus-opensocial.googleusercontent.com/gadgets/proxy?container=focus&refresh=2592000&url=';
let img = new Image();
img.onload = () => resolve(img);
img.onerror = () => reject();
img.src = useProxy ? googleProxyURL + encodeURIComponent(url) : url;
img.crossOrigin = 'Anonymous';
});
try {
let result = await task;
return result;
} catch (e) {
console.log(e);
}
}
async function setMisc() {
// disclaimer
/*
let disclaimers = $(".disclaimer");
disclaimers.each(function (i, e) {
let dom = $(this);
let html = dom.html();
dom.attr("data-html", html);
dom.html(Util.textAbstract(html, 250));
dom.off("click").on("click", function () {
let iDom = $(this);
let iHtml = iDom.attr("data-html");
let isExpanded = iDom.hasClass("active");
if (isExpanded) {
iDom.removeClass("active");
iDom.html(Util.textAbstract(iHtml, 250));
} else {
iDom.addClass("active");
iDom.html(iHtml);
}
});
});
*/
// global search
$('input[name=global]').bind('keyup', function (e) {
if (e.which == 13) {
$('.search-btn').trigger('click');
} else {
$('.search .empty-btn').css('display', $(this).val().trim() ? 'inline-flex' : 'none');
}
});
$('.search .empty-btn').bind('click', function (e) {
$('input[name=global]').val('');
$('input[name=global]').blur();
$(this).hide();
});
$('.search .search-btn').bind('click', function (e) {
console.log('search clicked');
let query = $('input[name=global]:visible').val().trim().toLowerCase();
if (!query) {
return false;
}
window.location.href = '/products?mode=search&query=' + query;
});
// back to top
$('.back-to-top').on('click', function (e) {
$('html, body').animate({ scrollTop: 0 }, 800);
});
// mobile menu click
$('nav.menu .icon[name=menu]').on('click', function (e) {
let isVisible = $('nav.menu .dropdown-menu').is(':visible');
if (isVisible) {
$('nav.menu').removeClass('fixed');
$('nav.menu .dropdown-menu').slideUp(150);
} else {
$('nav.menu').addClass('fixed');
$('nav.menu .dropdown-menu').slideDown(150);
}
});
$('nav .dropdown-menu .menu-item').on('click', function (e) {
let dropdown = $(this).find('.dropdown');
let isVisible = dropdown.is(':visible');
if (isVisible) {
dropdown.slideUp({
duration: 150
});
$(this).removeClass('active');
} else {
dropdown.slideDown({
duration: 150,
start: function () {
$(this).css({
display: 'inline-flex'
});
}
});
$(this).addClass('active');
}
});
// email subscription
$('footer .checkbox-label').bind('click', function (e) {
$(this).parent().find('input').trigger('click');
});
$('footer .checkbox-label a').bind('click', function (e) {
e.stopPropagation();
});
$('footer input[name=subscribe]').bind('keyup', function (e) {
if (e.which == 13) {
$('footer .email-btn').trigger('click');
}
});
$('footer .email-btn').on('click', async function (e) {
if (
!/^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$/.test(
$('footer input[name=subscribe]').val()
)
) {
alert(
{
en_US: 'Please enter a valid email address',
zh_HK: '請輸入有效的電子郵件地址',
zh_CN: '请输入有效的电子邮件地址',
es: 'Por favor, introduce una dirección de correo electrónico válida',
fr: "S'il vous plaît, mettez une adresse email valide",
it: 'Si prega di inserire un indirizzo email valido',
ko: '유효한 이메일 주소를 입력하세요.',
ja: '有効なメールアドレスを入力してください'
}[LANG]
);
return false;
}
if (!$('footer input[name=tnc]').prop('checked')) {
alert(
{
en_US: 'Please agree to the privacy policies of the website',
zh_HK: '請同意網站的隱私權政策',
zh_CN: '请同意网站的隐私政策',
es: 'Por favor, acepte las políticas de privacidad del sitio web.',
fr: 'Veuillez accepter les politiques de confidentialité du site Web',
it: 'Si prega di accettare le norme sulla privacy del sito web',
ko: '웹사이트의 개인정보 보호정책에 동의해 주세요.',
ja: 'ウェブサイトのプライバシーポリシーに同意してください'
}[LANG]
);
return false;
}
if (
!confirm(
{
en_US: 'Please confirm your email address to continue:',
zh_HK: '請確認您的電子郵件地址以繼續',
zh_CN: '请确认您的电子邮件地址以继续',
es: 'Por favor, confirme su dirección de correo electrónico para continuar:',
fr: 'Veuillez confirmer votre adresse e-mail pour continuer :',
it: 'Per continuare, conferma il tuo indirizzo email:',
ko: '계속하려면 이메일 주소를 확인하세요.',
ja: '続行するにはメールアドレスを確認してください'
}[LANG] +
'\n' +
$('footer input[name=subscribe]').val()
)
) {
return false;
}
$(this).addClass('load');
await new Promise((resolve) => setTimeout(resolve, 1000));
mThankModal.open({
mode: 'subscribe'
});
$('footer input[name=subscribe]').val('');
$('footer input[name=tnc]').prop('checked', false);
$(this).removeClass('load');
});
// share btn
// $(".social[name=facebook]").attr("href", "https://www.facebook.com/sharer/sharer.php?u=" + encodeURIComponent(window.location.href))
$('.social[name=whatsapp]').attr(
'href',
'https://web.whatsapp.com/send?text=' + encodeURIComponent(window.location.href)
);
$('.social[name=twitter]').attr(
'href',
'https://twitter.com/intent/tweet?url=' + encodeURIComponent(window.location.href)
);
// global search
let searchTimeout;
let searchInput = $('input[data-type=global-search]');
let search = searchInput.parent();
searchInput.on('focus', function (e) {
if ($(this).val().trim().length > 0) {
searchInput.trigger('input');
$('.empty-btn').show();
}
});
searchInput.on('blur', function (e) {
console.log($(e.relatedTarget).closest('.search-results').length > 0);
if ($(e.relatedTarget).closest('.search-results').length > 0) {
return;
}
search.find('.search-results').hide();
});
searchInput.on('input', async function (e) {
let query = $(this).val().trim();
debounce(function () {
if (query.length > 0) {
search.find('.search-results').css('display', 'inline-flex');
setSearchPlaceholder('product');
setSearchPlaceholder('ingredient');
setSearchPlaceholder('enumber');
setSearchPlaceholder('blog');
searchProduct(query);
searchIngredient(query);
searchEnumber(query);
searchBlog(query);
} else {
search.find('.search-results').hide();
}
}, 500);
});
function debounce(func, delay = 500) {
clearTimeout(globalSearchTimer);
globalSearchTimer = setTimeout(func, delay);
}
function setSearchPlaceholder(name) {
let searchParent = globalSearchInput.parent();
let dom = searchParent.find(`.result-list[name=${name}]`);
dom.empty();
dom.append($('<div class="result-item"><i>Loading...</i></div>'));
}
async function searchProduct(query) {
const token = Symbol();
searchProductToken = token;
let res = await URLConnection.post({
path: 'product/search-quick',
param: {
query: query
}
});
insertSearchResult(res.s ? res.c.product : false, 'product', query);
}
async function searchIngredient(query) {
const token = Symbol();
searchIngredientToken = token;
let res = await URLConnection.post({
path: 'ingredient/search-quick',
param: {
query: query
}
});
insertSearchResult(res.s ? res.c.ingredient : false, 'ingredient', query);
}
async function searchEnumber(query) {
const token = Symbol();
searchEnumberToken = token;
let res = await URLConnection.post({
path: 'ingredient/e-number/search',
param: {
query: query
}
});
insertSearchResult(res.s ? res.c.enumber : false, 'enumber', query);
}
async function searchBlog(query) {
const token = Symbol();
searchBlogToken = token;
let res = await URLConnection.post({
path: 'article',
param: {
query: query
}
});
console.log(res.c.author_list);
insertSearchResult(res.s ? res.c.author_list : false, 'author', query);
insertSearchResult(res.s ? res.c.article : false, 'blog', query);
}
function insertSearchResult(data, type, query) {
let searchParent = globalSearchInput.parent();
let cDom = searchParent.find(`.result-list[name=${type}]`);
cDom.empty();
if (!data || data.length == 0) {
cDom.append(
`<div class="result-item"><i>${
{
en_US: 'No Data',
zh_HK: '沒有數據',
zh_CN: '没有数据',
es: 'Sin datos',
fr: 'Aucune donnée',
it: 'Nessun dato',
ko: '데이터 없음',
ja: 'データなし'
}[LANG]
}</i></div>`
);
return;
}
for (let i = 0; i < data.length && i < 5; i++) {
let v = data[i];
let link;
let name = v.name;
if (type == 'product') {
link = `/products/${v.slug}`;
} else if (type == 'ingredient') {
link = `/ingredients/${v.slug}`;
if (v.synonym.toLowerCase().includes(query.toLowerCase())) {
name = v.synonym;
}
if (v.synonym_zht.toLowerCase().includes(query.toLowerCase())) {
name = v.synonym_zht;
}
if (v.synonym_zhs.toLowerCase().includes(query.toLowerCase())) {
name = v.synonym_zhs;
}
link += '?synonym=' + name;
} else if (type == 'enumber') {
link = `/ingredients/${v.slug}?synonym=${v.synonym}`;
name = v.synonym;
} else if (type == 'author') {
link = '/blog?author=' + v._id;
name = v.name;
} else if (type == 'blog') {
link = '/blog/' + v.slug;
name = v.title;
}
let iDom = $(
`<a class="result-item" href="${link}">${Util.highlightSearchTerm(name, query)}</a>`
);
cDom.append(iDom);
}
}
}
</script>
<script type="text/javascript" src="/module/page-ads.txt/page-ads.txt.js?t=1753274559523"></script>
<script>
function onOpenCvReady() {
//console.log('OpenCV loaded');
}
</script>
<!-- signin with google -->
<script src="https://accounts.google.com/gsi/client" async defer></script>
</body>
</html>