{"version":3,"file":"js/common.lib.js","mappings":"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","sources":["webpack://tchb-health-2/./src/scripts/Main.ts","webpack://tchb-health-2/./src/scripts/components/RwdPicture.ts","webpack://tchb-health-2/./src/scripts/components/Compoents.ts","webpack://tchb-health-2/./src/scripts/components/ComponentBase.ts","webpack://tchb-health-2/./src/scripts/components/common/Nav.ts","webpack://tchb-health-2/./src/scripts/components/common/PageRoot.ts","webpack://tchb-health-2/./src/scripts/components/popups/PhotoViewer.ts","webpack://tchb-health-2/./src/scripts/components/common/SectionQA.ts","webpack://tchb-health-2/./src/scripts/components/common/ShoppingPanel.ts","webpack://tchb-health-2/./src/scripts/components/common/StickBtnBuy.ts","webpack://tchb-health-2/./src/scripts/components/popups/EZAlert.ts","webpack://tchb-health-2/./src/scripts/components/popups/PopupBase.ts","webpack://tchb-health-2/./src/scripts/components/popups/Popups.ts","webpack://tchb-health-2/./src/scripts/ts/AjvProxy.ts","webpack://tchb-health-2/./src/scripts/ts/ApiProxy.ts","webpack://tchb-health-2/./src/scripts/ts/GlobalSetting.ts","webpack://tchb-health-2/./src/scripts/ts/Tools.ts","webpack://tchb-health-2/./src/scripts/ts/sframe/Geom.ts","webpack://tchb-health-2/./src/scripts/ts/sframe/ScrollListener.ts","webpack://tchb-health-2/./src/scripts/ts/sframe/Utility.ts","webpack://tchb-health-2/./src/scripts/ts/sframe/ViewportRoot.ts","webpack://tchb-health-2/./src/scripts/ts/sframe/Viewport.ts"],"sourcesContent":["import Nav from \"@components/common/Nav\";\r\nimport PageRoot from \"@/src/scripts/components/common/PageRoot\";\r\nimport Components from \"@components/Compoents\";\r\nimport Popups from \"@components/popups/Popups\";\r\nimport ApiProxy from \"@ts/ApiProxy\";\r\nimport GS from \"@ts/GlobalSetting\";\r\nimport { ScrollListener } from \"@ts/sframe/ScrollListener\";\r\nimport Utility from \"@ts/sframe/Utility\";\r\nimport ViewportRoot from \"@ts/sframe/ViewportRoot\";\r\nimport Tools from \"@ts/Tools\";\r\n\r\nimport { gsap } from \"gsap\";\r\nimport { ScrollToPlugin } from \"gsap/ScrollToPlugin\";\r\nimport AjvProxy from \"./ts/AjvProxy\";\r\ngsap.registerPlugin(ScrollToPlugin);\r\n\r\n\r\n\r\nconst self: any =\r\n{\r\n layoutOn: false,\r\n\r\n init: () =>\r\n {\r\n // self.build();\r\n\r\n GS.init();\r\n // let prefix = GS.setting.testEnv ? \"\" : \"/\";\r\n // $(`#shared-popups`).load(prefix + \"shared-popups.html\", (responseTxt, statusTxt, xhr) =>\r\n // {\r\n // self.build();\r\n // });\r\n\r\n self.build();\r\n },\r\n\r\n build: function ()\r\n {\r\n AjvProxy.init();\r\n\r\n ApiProxy.setApiPath(GS.setting.apiPath);\r\n ApiProxy.setApiExtension(GS.setting.apiExt);\r\n if (GS.setting.testEnv) {\r\n ApiProxy.setSimplateDelay(500);\r\n }\r\n\r\n window.EZ = {};\r\n\r\n Tools.init();\r\n Tools.completeLinks($('body'));\r\n\r\n window.addEventListener(\"resize\", () =>\r\n {\r\n ViewportRoot.update();\r\n });\r\n\r\n if (Utility.urlParams.layout) {\r\n $(\"body\").toggleClass(\"layout-mode\", true);\r\n if (Utility.urlParams.popup) {\r\n $(\"body\").toggleClass(\"popup-layout-mode\", true);\r\n }\r\n self.isLayoutOn = true;\r\n }\r\n\r\n if (self.preInitPage) self.preInitPage();\r\n\r\n\r\n PageRoot.init(true);\r\n Components.init();\r\n Popups.init();\r\n\r\n if (self.initPage) self.initPage();\r\n\r\n ScrollListener.active();\r\n ViewportRoot.emitter.addListener(\"updated\", () =>\r\n {\r\n ScrollListener.update();\r\n\r\n if (self.isLayoutOn && ViewportRoot.changed) {\r\n var ext = (ViewportRoot.index == 0) ? \".m.jpg\" : \".jpg\";\r\n $(\"#layout\").html(\"\");\r\n }\r\n });\r\n \r\n\r\n ViewportRoot.update();\r\n\r\n $('[lazy-loading=\"pending\"]').attr(\"lazy-loading\", \"done\");\r\n\r\n },\r\n\r\n setupGtag: ()=>\r\n {\r\n let gaId = window._gtag_id_;\r\n\r\n let $gtagEvents = $(`[gtag_event][gtag_event!=\"page_view\"]`);\r\n\r\n // console.log($gtagEvents.length); \r\n\r\n $gtagEvents.on(\"click\", function(event:JQuery.ClickEvent)\r\n {\r\n // event.preventDefault();\r\n // console.log(this); \r\n let eventName = this.getAttribute(\"gtag_event\"),\r\n eventLabel = this.getAttribute(\"event_label\");\r\n\r\n // console.log(`event name: ${eventName}, event label: ${eventLabel}`);\r\n\r\n window.gtag(\"event\", eventName, {\"event_label\": eventLabel});\r\n });\r\n\r\n\r\n let listenerId = \"gtag-pageview\",\r\n $markers = $(\"marker\"),\r\n totalMarkers = $markers.length,\r\n numTriggered = 0;\r\n \r\n // console.log($markers.length);\r\n\r\n ScrollListener.addListener(listenerId, ()=>\r\n {\r\n $markers.each((index, elem: HTMLElement)=>\r\n {\r\n ///@ts-ignore\r\n if(elem._triggered === true) return;\r\n let result = ScrollListener.testDom(elem, 0, 0);\r\n\r\n \r\n if (result.topInside && result.bottomInside) {\r\n ///@ts-ignore\r\n elem._triggered = true;\r\n \r\n let pageTitle = elem.getAttribute(\"page_title\"),\r\n pagePath = elem.getAttribute(\"page_path\");\r\n \r\n // console.log(`page title: ${pageTitle}, page path: ${pagePath}`);\r\n \r\n window.gtag(\"config\", gaId, {\"page_title\": pageTitle, \"page_path\": pagePath});\r\n window.gtag(\"event\", \"page_view\", {\"page_title\": pageTitle, \"page_location\": pagePath});\r\n\r\n numTriggered++;\r\n\r\n if(numTriggered >= totalMarkers)\r\n {\r\n ScrollListener.removeListener(listenerId);\r\n // console.log(`all pageview event triggered`);\r\n }\r\n }\r\n })\r\n });\r\n\r\n },\r\n\r\n preInitPage: null,\r\n initPage: null\r\n};\r\n\r\nwindow.addEventListener('load', () =>\r\n{\r\n self.init();\r\n});\r\n\r\n\r\nexport default self;\r\n\r\nconsole.log(\"\");\r\n","import ComponentBase from \"@components/ComponentBase\";\r\nimport { ComponentElem } from \"@components/interfaces\";\r\n\r\nexport default class RwdPicture extends ComponentBase\r\n{\r\n manualLoaded: boolean = true;\r\n\r\n constructor(elem: ComponentElem)\r\n {\r\n super(elem);\r\n\r\n this.manualLoaded = (this.$root.attr(\"lazy-loading\") === \"manual\")? false: true;\r\n \r\n }\r\n\r\n load(onload?: Function)\r\n {\r\n let img = this.$root.find(`img`)[0],\r\n $souces = this.$root.find(\"source\");\r\n\r\n $.each($souces, (index, sourceElem)=>\r\n {\r\n sourceElem.setAttribute(\"srcset\", sourceElem.dataset[\"srcset\"]);\r\n });\r\n\r\n img.src = img.dataset.src;\r\n\r\n img.onload = ()=>\r\n {\r\n // console.log(\"image loaded\");\r\n // console.log(img.currentSrc);\r\n\r\n this.$root.attr(\"lazy-loading\", \"done\");\r\n\r\n this.manualLoaded = true;\r\n \r\n if(onload) onload.call(null);\r\n\r\n img.onload = null;\r\n }\r\n }\r\n}","import RwdPicture from \"./RwdPicture\";\r\nimport ShoppingPanel from \"./common/ShoppingPanel\";\r\nimport StickBtnBuy from \"./common/StickBtnBuy\";\r\nimport { ComponentDefineDic, ComponentElem } from \"./interfaces\";\r\n\r\nlet _componentDic: ComponentDefineDic =\r\n{\r\n \"rwd-picture\": RwdPicture,\r\n \"shopping-panel\": ShoppingPanel,\r\n \"stick-btn-buy\": StickBtnBuy,\r\n}\r\n\r\nexport default class Components\r\n{\r\n static init()\r\n { \r\n Components.bindScripts(null, true);\r\n Components.seekAndBind(\"collapse-wrapper\");\r\n }\r\n\r\n static bindScripts(targetElem?: HTMLElement, catchSamples: boolean = false)\r\n {\r\n let $doms: JQuery = targetElem ? $(targetElem).find('[component]') : $('[component]');\r\n\r\n // 先抓取樣本\r\n if (catchSamples) {\r\n $.each($doms, (index: Number, elem: HTMLElement) =>\r\n {\r\n let componentName: string = elem.getAttribute('component');\r\n // console.log(componentName);\r\n if (_componentDic[componentName]) {\r\n let obj = _componentDic[componentName];\r\n let componentClass: any = obj.componentClass? obj.componentClass: obj;\r\n\r\n if (elem.getAttribute(\"is-sample\") === \"true\") {\r\n // console.log(componentName);\r\n\r\n elem.removeAttribute(\"is-sample\");\r\n $(elem).detach();\r\n\r\n if (!componentClass.$sample) {\r\n componentClass.$sample = $(elem).clone();\r\n let $doms = componentClass.$sample.find('[is-sample=\"true\"]');\r\n $.each($doms, (index, childElem) =>\r\n {\r\n childElem.removeAttribute(\"is-sample\");\r\n // $(childElem).detach();\r\n });\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n // 再綁定程式\r\n $.each($doms, (index: Number, elem: HTMLElement) =>\r\n {\r\n // true: 手動\r\n let manualBind: string = elem.getAttribute(\"manual-bind\");\r\n\r\n\r\n ///@ts-ignore\r\n if (elem._component) {\r\n // 忽略重複綁定 (因為引進了依賴綁定 relyList 的邏輯)\r\n // let componentName: string = elem.getAttribute('component');\r\n // console.log(`script for component[${componentName}] is alreay bind`);\r\n }\r\n else if (manualBind !== \"true\") {\r\n let componentName: string = elem.getAttribute('component');\r\n\r\n if (_componentDic[componentName]) {\r\n // console.log(componentName);\r\n\r\n let obj = _componentDic[componentName];\r\n\r\n this.bindScripts(elem); // 先掃描內部元素\r\n \r\n let componentClass: any = obj.componentClass? obj.componentClass: obj;\r\n new componentClass(elem);\r\n }\r\n }\r\n });\r\n }\r\n\r\n static seekAndBind(componentName: string)\r\n {\r\n let elemList = $(`[component=\"${componentName}\"]`).toArray(),\r\n obj = _componentDic[componentName];\r\n\r\n if (obj) {\r\n elemList.forEach((elem: ComponentElem, index)=>\r\n {\r\n let componentClass: any = obj.componentClass? obj.componentClass: obj;\r\n new componentClass(elem);\r\n // new obj.componentClass(elem); \r\n });\r\n }\r\n }\r\n\r\n\r\n static registComponents(dic: ComponentDefineDic)\r\n {\r\n _componentDic = Object.assign({}, dic, _componentDic);\r\n // console.log(_componentDic);\r\n }\r\n}","import { ComponentElem } from \"./interfaces\";\r\nimport {gsap} from \"gsap\";\r\n\r\nexport default class ComponentBase\r\n{\r\n static $sample: JQuery;\r\n\r\n static relyOthers: boolean = false;\r\n\r\n static createElem()\r\n {\r\n return this.$sample.clone()[0] as ComponentElem;\r\n }\r\n\r\n $root: JQuery;\r\n\r\n constructor(elem: ComponentElem)\r\n {\r\n this.$root = $(elem);\r\n elem._component = this;\r\n }\r\n\r\n appendTo($target: JQuery){\r\n $target.append(this.$root);\r\n gsap.from(this.$root, {duration:.2, opacity: 0});\r\n }\r\n\r\n seekComponentByName(componentName: string): any\r\n {\r\n return this.seekComponent(`[component=\"${componentName}\"]`);\r\n }\r\n\r\n seekComponentById(id: string): any\r\n {\r\n return this.seekComponent(`#${id}`);\r\n }\r\n\r\n seekComponentByField(field: string): any\r\n {\r\n return this.seekComponent(`[data-field=\"${field}\"]`);\r\n }\r\n\r\n seekComponentByClass(className: string): any\r\n {\r\n return this.seekComponent(`.${className}`);\r\n }\r\n\r\n seekComponent(query: string): any\r\n {\r\n let result = (this.$root.find(query)[0])\r\n \r\n if(!result)\r\n {\r\n console.error(`can't fint element with query: ${query}`);\r\n return null;\r\n }\r\n else if(!result._component)\r\n {\r\n console.error(`element with query: ${query} don't have component`);\r\n return null;\r\n }\r\n\r\n return result._component;\r\n }\r\n}","import ViewportRoot from \"../../ts/sframe/ViewportRoot\";\r\nimport PhotoViewer from \"../popups/PhotoViewer\";\r\nimport Popups from \"../popups/Popups\";\r\n\r\n\r\nlet $root: JQuery,\r\n $userIcon: JQuery\r\n\r\nlet _isInit = false,\r\n _isNavOpen: boolean = false;\r\n\r\nexport default class Nav\r\n{\r\n static init()\r\n {\r\n $root = $('nav');\r\n _isInit = true;\r\n\r\n $root.find(\".menu-trigger\").on(\"click\", (event: JQuery.ClickEvent) =>\r\n {\r\n event.preventDefault();\r\n\r\n // Popups.to(\"photo-viewer\");\r\n PhotoViewer.instance.showSinglePhoto(\"./static/images/photo-examples/1.png\");\r\n\r\n });\r\n\r\n $root.find(\".nav-trigger\").on(\"click\", function (event: Event)\r\n {\r\n event.preventDefault();\r\n\r\n _isNavOpen = !_isNavOpen;\r\n $root.attr(\"is-open\", _isNavOpen ? \"true\" : \"false\");\r\n });\r\n\r\n $root.find(\"[smooth-scroll]\").on(\"click\", (event:JQuery.ClickEvent)=>\r\n {\r\n event.preventDefault();\r\n \r\n _isNavOpen = false;\r\n $root.attr(\"is-open\", \"false\");\r\n });\r\n }\r\n\r\n static isInit() { return _isInit; }\r\n\r\n static resize(scale: number = 1)\r\n {\r\n if (scale === 1) {\r\n $root.css({\r\n \"transform\": \"\",\r\n \"transformOrigin\": \"\"\r\n })\r\n }\r\n else {\r\n $root.css({\r\n \"transform\": `scale(${scale})`,\r\n \"transformOrigin\": \"0 0\"\r\n })\r\n\r\n }\r\n }\r\n}","/*****\r\n * 未處理:\r\n * scrolllock true 時, 螢幕寬度再度改變的處置\r\n */\r\n\r\nimport GS from \"@ts/GlobalSetting\";\r\nimport ViewportRoot from \"@ts/sframe/ViewportRoot\";\r\nimport Nav from \"./Nav\";\r\nimport ShoppingPanel from \"./ShoppingPanel\";\r\nimport StickBtnBuy from \"./StickBtnBuy\";\r\nimport gsap from \"gsap\";\r\nimport { Emitter } from \"strict-event-emitter\";\r\n\r\nlet $root: JQuery,\r\n $scrollWrapper: JQuery,\r\n $pageContent: JQuery,\r\n $sectionWrapper: JQuery,\r\n $footer: JQuery;\r\n\r\nlet _isScrollLocking: boolean = false;\r\n\r\nlet _oldScrollTop: number,\r\n _oldScrollLeft: number;\r\n\r\nlet _scaleInMiddleMode = false,\r\n _contentScaleRate = 1;\r\n\r\nclass PageRoot\r\n{\r\n static emitter: Emitter<{updated: [scale: number]}>;\r\n\r\n static init(scaleInMiddleMode: boolean = false)\r\n {\r\n _scaleInMiddleMode = scaleInMiddleMode;\r\n\r\n $root = $(\"#page-root\")\r\n $scrollWrapper = $root.find(\".scroll-wrapper\")\r\n $pageContent = $root.find(\"#page-content\");\r\n $sectionWrapper = $root.find(\"#section-wrapper\");\r\n\r\n this.emitter = new Emitter();\r\n\r\n // $footer = $(\"footer\");\r\n\r\n // ViewportRoot.emitter.on(\"majorChanged\", ()=>\r\n // {\r\n // let minHeight = ViewportRoot.height - $footer.height() - GS.getNavHeight(); \r\n // $sectionWrapper.css(\"min-height\", minHeight > 0? minHeight: \"\");\r\n // });\r\n \r\n\r\n Nav.init();\r\n \r\n $(\"a[smooth-scroll]\").on(\"click\", function(event:JQuery.ClickEvent)\r\n {\r\n event.preventDefault();\r\n gsap.to(window, {duration: 1, scrollTo: {y: this.getAttribute(\"href\"), offsetY: GS.getNavHeight()}});\r\n // gsap.to(window, {duration: 1, scrollTo: 0 });\r\n return;\r\n });\r\n\r\n if (_scaleInMiddleMode) {\r\n ViewportRoot.emitter.on(\"updated\", () =>\r\n {\r\n _contentScaleRate = updateHeight();\r\n Nav.resize(_contentScaleRate);\r\n StickBtnBuy.instance.resize(_contentScaleRate);\r\n ShoppingPanel.instance.resize(_contentScaleRate);\r\n \r\n // console.log(`content scale rate: ${_contentScaleRate}`);\r\n this.emitter.emit(\"updated\", _contentScaleRate);\r\n });\r\n }\r\n }\r\n\r\n static toggleScrollLock(lockOn: boolean)\r\n {\r\n if (lockOn === _isScrollLocking) return;\r\n _isScrollLocking = lockOn;\r\n\r\n if (_isScrollLocking) {\r\n _oldScrollTop = window.scrollY;\r\n _oldScrollLeft = window.scrollX;\r\n \r\n\r\n $root.attr(\"scoll-locking\", \"true\")\r\n $scrollWrapper.css(\"left\", -_oldScrollLeft)\r\n $scrollWrapper.css(\"top\", -_oldScrollTop)\r\n }\r\n else {\r\n $root.attr(\"scoll-locking\", \"false\")\r\n\r\n window.scrollTo(_oldScrollLeft, _oldScrollTop)\r\n $scrollWrapper.css(\"left\", \"\")\r\n $scrollWrapper.css(\"top\", \"\")\r\n }\r\n }\r\n\r\n}\r\n\r\nfunction updateHeight()\r\n{\r\n let vp = ViewportRoot;\r\n\r\n let scale = 1;\r\n\r\n if (vp.index === 1) {\r\n let minWidth = vp.ranges[1];\r\n\r\n scale = vp.width / minWidth;\r\n\r\n let rawHeight = $pageContent.height(),\r\n newHeight = rawHeight * scale;\r\n \r\n\r\n $pageContent.css({\r\n \"transform\": \"scale(\" + scale + \")\"\r\n });\r\n\r\n $root.css({\r\n \"height\": newHeight,\r\n \"width\": \"\",\r\n \"min-width\": \"auto\"\r\n });\r\n }\r\n else {\r\n $pageContent.css({\r\n \"transform\": \"\"\r\n });\r\n\r\n $root.css({\r\n \"height\": \"\",\r\n \"width\": \"\",\r\n \"min-width\": \"\"\r\n });\r\n }\r\n\r\n return scale;\r\n}\r\n\r\nexport default PageRoot;","import { ComponentElem } from \"@components/interfaces\";\r\nimport PopupBase from \"./PopupBase\";\r\nimport Popups from \"./Popups\";\r\nimport { gsap } from \"gsap\";\r\nimport ViewportRoot from \"@ts/sframe/ViewportRoot\";\r\nimport Geom from \"@ts/sframe/Geom\";\r\n\r\nexport default class PhotoViewer extends PopupBase\r\n{\r\n static instance: PhotoViewer;\r\n\r\n coverColor: string = `rgba(6, 7, 7, 0.9)`;\r\n\r\n dataList: any[];\r\n\r\n currentIndex: number;\r\n isImageOnLoading: boolean = false;\r\n\r\n $content: JQuery;\r\n $image: JQuery;\r\n $btnPrev: JQuery;\r\n $btnNext: JQuery;\r\n\r\n img: HTMLImageElement;\r\n\r\n constructor(elem: ComponentElem)\r\n {\r\n super(elem);\r\n\r\n PhotoViewer.instance = this;\r\n\r\n this.$content = this.$root.find(\".content\");\r\n this.$image = this.$root.find(\".image\");\r\n\r\n this.$btnPrev = this.$root.find(\".btn-prev\").on(\"click\", (event: Event) =>\r\n {\r\n event.preventDefault();\r\n\r\n this.changeIndex(this.currentIndex - 1);\r\n });\r\n\r\n this.$btnNext = this.$root.find(\".btn-next\").on(\"click\", (event: Event) =>\r\n {\r\n event.preventDefault();\r\n\r\n this.changeIndex(this.currentIndex + 1);\r\n });\r\n }\r\n\r\n\r\n showSinglePhoto(src: string)\r\n {\r\n let dataList = [{ \"image_src\": src }];\r\n this.showPhoto(0, dataList);\r\n }\r\n\r\n showPhoto(index: number, dataList: any[])\r\n {\r\n this.dataList = dataList;\r\n\r\n this.currentIndex = -1;\r\n this.updateDots();\r\n this.changeIndex(index);\r\n Popups.to(\"photo-viewer\");\r\n }\r\n\r\n updateDots()\r\n {\r\n let $dotWrapper = this.$root.find(\".wrapper\").empty();\r\n if(this.dataList.length > 1)\r\n { \r\n this.dataList.forEach((data, index)=>\r\n {\r\n let $dot = $(`
`);\r\n $dotWrapper.append($dot);\r\n $dot.on(\"click\", (event:Event)=>\r\n {\r\n event.preventDefault();\r\n this.changeIndex(index);\r\n });\r\n });\r\n }\r\n }\r\n\r\n changeIndex(index: number)\r\n {\r\n if (this.isImageOnLoading) return;\r\n if (!this.dataList) return;\r\n if (index < 0) return;\r\n if (index >= this.dataList.length) return;\r\n if(index === this.currentIndex) return;\r\n\r\n this.currentIndex = index;\r\n\r\n this.$btnPrev[0].setAttribute(\"disabled\", (index === 0) ? \"true\" : \"false\");\r\n this.$btnNext[0].setAttribute(\"disabled\", (index >= (this.dataList.length - 1)) ? \"true\" : \"false\");\r\n\r\n if(this.dataList.length > 1)\r\n {\r\n let $dots = this.$root.find(\".dot\").attr(\"focused\", \"false\");\r\n $dots[index].setAttribute(\"focused\", \"true\");\r\n }\r\n\r\n this.changeImage();\r\n }\r\n\r\n changeImage()\r\n {\r\n gsap.killTweensOf(this.$image);\r\n gsap.set(this.$image, { opacity: 0 });\r\n\r\n this.isImageOnLoading = true;\r\n\r\n let img = this.img = new Image();\r\n img.onload = ()=>\r\n {\r\n this.isImageOnLoading = false;\r\n this.$image.css(\"background-image\", \"url(\" + img.src + \")\");\r\n this.updateSize();\r\n\r\n };\r\n\r\n img.onerror = ()=>\r\n {\r\n this.isImageOnLoading = false;\r\n this.img = null;\r\n }\r\n\r\n img.src = this.dataList[this.currentIndex][\"image_src\"];\r\n\r\n ViewportRoot.emitter.addListener(\"updated\", ()=>\r\n {\r\n if(!this.isOnStage) return;\r\n this.updateSize();\r\n });\r\n }\r\n\r\n updateSize()\r\n {\r\n if (this.isImageOnLoading || !this.img) return;\r\n\r\n let bleedX = 70,\r\n bleedY = 40,\r\n maxWidth = ViewportRoot.width - bleedX * 2,\r\n maxHeight = ViewportRoot.height - bleedY * 2,\r\n bound = Geom.caculateContain(maxWidth, maxHeight, this.img.width, this.img.height);\r\n\r\n if (bound.ratio > 1) {\r\n bound.width = this.img.width;\r\n bound.height = this.img.height;\r\n }\r\n\r\n gsap.to(this.$content, { duration: .25, width: bound.width, height: bound.height });\r\n gsap.to(this.$image, { duration: .25, opacity: 1, delay: .25 });\r\n\r\n }\r\n}","import ComponentBase from \"@components/ComponentBase\";\r\nimport { ComponentElem } from \"@components/interfaces\";\r\n\r\nexport default class SectionQA extends ComponentBase\r\n{\r\n private _sendGtagEvents: boolean = false;\r\n private _gtagEventName: string = \"\";\r\n private _gtagEventLabel: string = \"\";\r\n\r\n\r\n constructor(elem: ComponentElem)\r\n {\r\n super(elem);\r\n\r\n if(this.$root.attr(\"send-gtag_events\") === \"true\")\r\n {\r\n this._sendGtagEvents = true;\r\n this._gtagEventName = this.$root.attr(\"event_name\");\r\n this._gtagEventLabel = this.$root.attr(\"event_label\");\r\n }\r\n\r\n this._setupQuestions();\r\n }\r\n\r\n private _setupQuestions()\r\n {\r\n let $questionList = this.$root.find(\".question\");\r\n $questionList.each((index, elem)=>\r\n {\r\n let $question = $(elem),\r\n askIndex = $question.find(\".ask\").attr(\"index\"),\r\n isOpen = elem.getAttribute(\"is-open\") === \"true\",\r\n $ask = $question.find(\".ask\"),\r\n $answer = $question.find(\".answer\"),\r\n $answerWrapper = $answer.find(\".wrapper\");\r\n\r\n $ask.on(\"click\", (event:JQuery.ClickEvent)=>\r\n {\r\n event.preventDefault();\r\n isOpen = !isOpen;\r\n \r\n if(this._sendGtagEvents)\r\n {\r\n window.gtag(\"event\", this._gtagEventName + askIndex, {event_label: this._gtagEventLabel + askIndex});\r\n }\r\n \r\n update();\r\n });\r\n\r\n update();\r\n\r\n function update() {\r\n \r\n elem.setAttribute(\"is-open\", isOpen? \"true\": \"false\");\r\n if(isOpen)\r\n {\r\n let maxHeight = $answerWrapper.height();\r\n $answer.css(\"max-height\", maxHeight);\r\n }\r\n else\r\n {\r\n $answer.css(\"max-height\", \"0\");\r\n }\r\n }\r\n \r\n });\r\n }\r\n}","import ComponentBase from \"@components/ComponentBase\";\r\nimport { ComponentElem } from \"@components/interfaces\";\r\nimport { log } from \"console\";\r\nimport { Viewport } from \"../../ts/sframe/Viewport\";\r\nimport ViewportRoot from \"../../ts/sframe/ViewportRoot\";\r\n\r\nlet _isShoppingOpen = false;\r\n\r\nexport default class ShoppingPanel extends ComponentBase\r\n{\r\n $shoppingContent: JQuery;\r\n $shoppingTrigger: JQuery;\r\n\r\n private _isShoppingOpen: boolean;\r\n\r\n static instance: ShoppingPanel;\r\n\r\n constructor(elem: ComponentElem)\r\n {\r\n super(elem);\r\n\r\n this.$shoppingContent = this.$root.find(\".content\");\r\n\r\n this.$shoppingTrigger = this.$root.find(\".trigger\").on(\"click\", (event: Event) =>\r\n {\r\n event.preventDefault();\r\n\r\n _isShoppingOpen = !_isShoppingOpen;\r\n this.$root.attr(\"is-open\", _isShoppingOpen ? \"true\" : \"false\");\r\n this._resizeShopping();\r\n });\r\n\r\n // ViewportRoot.emitter.on(\"updated\", () =>\r\n // {\r\n // this._resizeShopping();\r\n // })\r\n\r\n ShoppingPanel.instance = this;\r\n\r\n }\r\n\r\n resize(scale: number)\r\n {\r\n \r\n\r\n if (scale === 1) {\r\n this.$shoppingTrigger.css\r\n ({\r\n \"transform\": \"\",\r\n \"margin-right\": \"\"\r\n });\r\n }\r\n else {\r\n this.$shoppingTrigger.css\r\n ({\r\n \"transform\": \"scale(\" + scale + \")\",\r\n // \"margin-right\": -(1 - triggerScale) * 90\r\n });\r\n }\r\n }\r\n\r\n\r\n private _resizeShopping()\r\n {\r\n let vp = ViewportRoot;\r\n\r\n let scale = 1,\r\n triggerScale = 1;\r\n\r\n const thehold1 = 460,\r\n thehold2 = 960;\r\n\r\n if (vp.width <= thehold1) {\r\n scale = vp.width / thehold1;\r\n triggerScale = vp.width / thehold2;\r\n }\r\n else if (vp.width <= thehold2) {\r\n triggerScale = vp.width / thehold2;\r\n }\r\n\r\n if (scale === 1) {\r\n this.$shoppingContent.css\r\n ({\r\n \"transform\": \"\"\r\n });\r\n\r\n this.$shoppingTrigger.css\r\n ({\r\n \"left\": \"\",\r\n });\r\n }\r\n else {\r\n this.$shoppingContent.css\r\n ({\r\n \"transform\": \"scale(\" + scale + \")\"\r\n });\r\n\r\n if (_isShoppingOpen) {\r\n this.$shoppingTrigger.css\r\n ({\r\n \"left\": (thehold1 - vp.width),\r\n });\r\n }\r\n else {\r\n this.$shoppingTrigger.css\r\n ({\r\n \"left\": \"\",\r\n });\r\n }\r\n }\r\n\r\n // if (triggerScale === 1) {\r\n // this.$shoppingTrigger.css\r\n // ({\r\n // \"transform\": \"\",\r\n // \"margin-right\": \"\"\r\n // });\r\n // }\r\n // else {\r\n // this.$shoppingTrigger.css\r\n // ({\r\n // \"transform\": \"scale(\" + triggerScale + \")\",\r\n // // \"margin-right\": -(1 - triggerScale) * 90\r\n // });\r\n // }\r\n }\r\n}","import ComponentBase from \"@components/ComponentBase\";\r\nimport { ComponentElem } from \"@components/interfaces\";\r\n\r\nexport default class StickBtnBuy extends ComponentBase\r\n{\r\n static instance: StickBtnBuy;\r\n\r\n constructor(elem: ComponentElem)\r\n {\r\n super(elem);\r\n StickBtnBuy.instance = this; \r\n }\r\n\r\n resize(scale: number = 1)\r\n {\r\n if(scale === 1)\r\n {\r\n this.$root.css({\r\n \"transform\": \"\"\r\n })\r\n }\r\n else\r\n {\r\n this.$root.css({\r\n \"transform\": `scale(${scale})`\r\n })\r\n\r\n }\r\n }\r\n}","import { ComponentElem } from \"@components/interfaces\";\r\nimport PopupBase from \"./PopupBase\";\r\nimport Popups from \"./Popups\";\r\nimport { gsap } from \"gsap\";\r\n\r\n// const TEXT_LINE_HEIGHT_PC = 26,\r\n// TEXT_LINE_HEIGHT_MOBILE = 32;\r\n\r\nconst TEXT_THEHOLD = 38;\r\n\r\ntype MyOptions =\r\n {\r\n complexTitle?: string,\r\n title?: string,\r\n text?: string,\r\n mode?: string,\r\n cancelLabel?: string | false,\r\n confirmLabel?: string,\r\n autoClose?: boolean,\r\n closeByCover?: boolean,\r\n closeByX?: boolean,\r\n resolveAtStart?: boolean,\r\n theme?: \"default\" | \"eula\" | \"title-with-line\"\r\n }\r\n\r\nlet $pending = $(`
`),\r\n _isPending = false;\r\n\r\nexport default class EZAlert extends PopupBase\r\n{\r\n static instance: EZAlert;\r\n\r\n autoClose_cover: boolean = false;\r\n\r\n static pending(text: string | boolean = \"請稍候\", cb?: Function)\r\n {\r\n if (text === false) {\r\n if (!_isPending) return;\r\n _isPending = false;\r\n gsap.killTweensOf($pending);\r\n gsap.to($pending, {\r\n duration: .05, opacity: 0, onComplete: () =>\r\n {\r\n $pending.detach();\r\n if (cb) cb();\r\n }\r\n });\r\n }\r\n else {\r\n if (_isPending) return;\r\n _isPending = true;\r\n $pending.find(\".text\").text(text);\r\n $(`body`).append($pending);\r\n gsap.killTweensOf($pending);\r\n gsap.set($pending, { opacity: 0 });\r\n gsap.to($pending, {\r\n duration: .2, opacity: 1, onComplete: () =>\r\n {\r\n if (cb) cb();\r\n }\r\n });\r\n\r\n }\r\n }\r\n\r\n /**\r\n * \r\n * @param title 標題\r\n * @param text 內文\r\n * @param autoClose 是否自動執行關閉(當關閉後需要呼叫另一個 popup 時, 設定為 false 避免背景黑底閃爍)\r\n * @param resolveAtStart 決定 promise 在關閉前還是關閉後 resolve\r\n * @param closePending 自動關閉 pending 狀態\r\n * @returns \r\n */\r\n static alert(title?: string, text?: string, autoClose: boolean = true, resolveAtStart: boolean = true, closePending: boolean = true)\r\n {\r\n if (closePending) this.pending(false);\r\n return this.instance.alert(title, text, undefined, autoClose, resolveAtStart);\r\n }\r\n\r\n static alertJSON(title: string, jsonObj: any)\r\n {\r\n\r\n let text = JSON.stringify(jsonObj, undefined, 2);\r\n text = `
${text}
`;\r\n\r\n return EZAlert.alert(title, text);\r\n }\r\n\r\n constructor(elem: ComponentElem)\r\n {\r\n super(elem);\r\n EZAlert.instance = this;\r\n\r\n this.$root.find(\".btn-close\").on(\"click\", (event:JQuery.ClickEvent)=>\r\n {\r\n event.preventDefault();\r\n \r\n Popups.close();\r\n });\r\n\r\n window.EZ.alert = (title: string, text: string) =>\r\n {\r\n return EZAlert.alert(title, text);\r\n };\r\n\r\n window.EZ.alertJSON = (title: string, obj: any) =>\r\n {\r\n return EZAlert.alertJSON(title, obj);\r\n };\r\n }\r\n\r\n show(options: MyOptions)\r\n {\r\n let complexTitle = options.complexTitle,\r\n title = options.title,\r\n text = options.text;\r\n\r\n if (!title && !text) throw new Error(`title 和 text 不能皆為空值`);\r\n\r\n options.theme = options.theme || \"default\";\r\n options.closeByCover = options.closeByCover === true? true: false;\r\n\r\n this.autoClose_cover = options.closeByCover;\r\n\r\n this.$root.find(\".btn-close\").css(\"display\", options.closeByX === true? \"block\": \"none\");\r\n \r\n\r\n let detailMode = \"all\";\r\n if (!title) detailMode = \"text-only\";\r\n if (!text) detailMode = \"title-only\";\r\n if (complexTitle) detailMode = \"complex\";\r\n\r\n this.$root.attr(\"detail-mode\", detailMode);\r\n this.$root.attr(\"mode\", options.mode);\r\n\r\n\r\n this.$root.attr(\"theme\", options.theme);\r\n\r\n this.$root.find(\".btn-cancel\").text(options.cancelLabel).css(\"display\", options.cancelLabel === false? \"none\": \"\");\r\n this.$root.find(\".btn-confirm\").text(options.confirmLabel);\r\n\r\n let noButtons = (options.mode === \"alert\" && options.cancelLabel === false);\r\n this.$root.find(\".buttons\").css(\"display\", noButtons? \"none\": \"\");\r\n\r\n let $text = this.$root.find(\".text\"),\r\n $title = this.$root.find(\".title\"),\r\n $complexTitle = this.$root.find(\".complex-title\");\r\n\r\n $title.text(title ? title : \"\");\r\n $text[0].innerHTML = (text ? text : \"\");\r\n\r\n $complexTitle.text(complexTitle? complexTitle: \"\");\r\n\r\n let thehold = detailMode === \"complex\"? 38: TEXT_THEHOLD;\r\n\r\n if (text && options.theme === \"default\") {\r\n this.$root.css(\"visibility\", \"hidden\");\r\n $(\"#popups\").append(this.$root); \r\n \r\n let isSingleLine = $text.height() <= thehold;\r\n this.$root.css(\"visibility\", \"\").detach();\r\n\r\n $text.css(\"text-align\", isSingleLine ? \"center\" : \"\");\r\n }\r\n else {\r\n $text.css(\"text-align\", \"\");\r\n }\r\n\r\n Popups.to(\"ez-alert\");\r\n\r\n return new Promise((resolve) =>\r\n {\r\n this.$root.find(\".btn-cancel\").off().on(\"click\", (event: Event) =>\r\n {\r\n event.preventDefault();\r\n\r\n if (options.autoClose) {\r\n if (options.resolveAtStart) {\r\n Popups.close();\r\n resolve(false);\r\n }\r\n else {\r\n Popups.close().then(()=>\r\n {\r\n resolve(false);\r\n });\r\n }\r\n }\r\n else {\r\n resolve(false);\r\n }\r\n });\r\n\r\n this.$root.find(\".btn-confirm\").off().on(\"click\", (event: Event) =>\r\n {\r\n event.preventDefault();\r\n\r\n if (options.autoClose) {\r\n if (options.resolveAtStart) {\r\n Popups.close();\r\n resolve(true);\r\n }\r\n else {\r\n Popups.close().then(()=>\r\n {\r\n resolve(true);\r\n });\r\n }\r\n }\r\n else {\r\n resolve(true);\r\n }\r\n });\r\n\r\n });\r\n }\r\n\r\n confirm(title?: string, text?: string, cancelLabel: string | false = \"取消\", confirmLabel: string = \"確認\", autoClose: boolean = true, resolveAtStart: boolean = true, options?: MyOptions)\r\n {\r\n options = Object.assign({}, { mode: \"confirm\", cancelLabel: cancelLabel, confirmLabel: confirmLabel, autoClose: autoClose, resolveAtStart: resolveAtStart, title: title, text: text }, options);\r\n return this.show(options);\r\n }\r\n\r\n alert(title?: string, text?: string, cancelLabel: string | false = \"OK\", autoClose: boolean = true, resolveAtStart: boolean = true, options?: MyOptions)\r\n {\r\n options = Object.assign({}, { mode: \"alert\", cancelLabel: cancelLabel, autoClose: autoClose, resolveAtStart: resolveAtStart, title: title, text: text }, options);\r\n return this.show(options);\r\n }\r\n\r\n complexConfirm(complexTitle: string, title?: string, text?: string, cancelLabel: string = \"取消\", confirmLabel: string = \"確認\", options?: MyOptions)\r\n {\r\n let outputOptions: MyOptions = {\r\n mode: \"confirm\",\r\n title: title,\r\n text: text,\r\n complexTitle: complexTitle,\r\n cancelLabel: cancelLabel,\r\n confirmLabel: confirmLabel,\r\n autoClose: true,\r\n resolveAtStart: true\r\n };\r\n\r\n outputOptions = Object.assign({}, outputOptions, options);\r\n\r\n return this.show(outputOptions);\r\n }\r\n}","import { Common } from \"@components/common/CommonTypes\";\r\nimport ComponentBase from \"@components/ComponentBase\";\r\nimport { ComponentElem } from \"@components/interfaces\";\r\nimport Popups from \"./Popups\";\r\n\r\nexport default class PopupBase extends ComponentBase\r\n{\r\n popupId: string = \"\";\r\n\r\n isOnStage: boolean = false;\r\n\r\n autoClose_popup: boolean = false;\r\n autoClose_menu: boolean = true;\r\n autoClose_cover: boolean = true;\r\n\r\n coverColor: string = `rgba(6, 7, 7, 0.5)`;\r\n\r\n popupAlign: Common.Align = 5;\r\n\r\n $root: JQuery;\r\n\r\n constructor(elem: ComponentElem)\r\n {\r\n super(elem);\r\n this.$root.detach();\r\n }\r\n\r\n toMe()\r\n {\r\n window._ez_popup_to_(this.popupId);\r\n }\r\n\r\n setMinWidth?: {(width: number): void};\r\n clearDropdownSetting?: {(): void};\r\n}","import { ComponentElem } from \"@components/interfaces\";\r\nimport ViewportRoot from \"@ts/sframe/ViewportRoot\";\r\nimport gsap from \"gsap\";\r\nimport Pages from \"../common/PageRoot\";\r\nimport { PopupDefineDic, PopupDefine } from \"@components/interfaces\";\r\nimport PhotoViewer from \"./PhotoViewer\";\r\n\r\nlet $root: JQuery,\r\n $cover: JQuery,\r\n $dropdownMenus: JQuery,\r\n $dropdownMenusCover: JQuery,\r\n _isLocking: boolean = false,\r\n _currentPopup: string = \"\",\r\n _currentMenu: string = \"\",\r\n _setBackPopup: string = undefined;\r\n\r\n\r\nlet _popupDic: PopupDefineDic =\r\n{\r\n};\r\n\r\ntype MenuOptions = {\r\n position?: \"absolute\" | \"sticky\" | \"popup\",\r\n align?: \"left\" | \"center\" | \"right\"\r\n offsetTop?: number,\r\n offsetLeft?: number\r\n};\r\n\r\nlet _popupTl: any;\r\n\r\nclass Popups\r\n{\r\n static init()\r\n {\r\n window._ez_popup_to_ = (id: string) =>\r\n {\r\n Popups.to(id);\r\n };\r\n\r\n this.registComponents({\r\n // \"photo-viewer\": PhotoViewer,\r\n });\r\n\r\n $root = $(\"#popups\");\r\n $cover = $root.find(\".cover\").on(\"click\", (event: Event) =>\r\n {\r\n event.preventDefault();\r\n if (_currentPopup && _popupDic[_currentPopup].instance.autoClose_cover) {\r\n this.close();\r\n }\r\n });\r\n\r\n updateActive();\r\n\r\n for (const key in _popupDic) {\r\n if (Object.prototype.hasOwnProperty.call(_popupDic, key)) {\r\n let obj: PopupDefine = _popupDic[key],\r\n elem = document.querySelector(`[popup-id=\"${key}\"]`) as ComponentElem;\r\n if (!elem) throw new Error(`popup element for [${key}] is not exist\\n(可能是未在頁面中加入對應的模板)`);\r\n\r\n // console.log(key);\r\n // console.log(obj.componentClass);\r\n\r\n let componentClass: any = obj.componentClass? obj.componentClass: obj;\r\n obj.instance = new componentClass(elem);\r\n obj.instance.popupId = key;\r\n\r\n }\r\n }\r\n\r\n $dropdownMenus = $(\"#dropdown-menus\");\r\n $dropdownMenusCover = $dropdownMenus.find(\".cover\").on(\"click\", (event: Event) =>\r\n {\r\n event.preventDefault();\r\n this.closeMenu();\r\n });\r\n\r\n ViewportRoot.emitter.addListener(\"updated\", () =>\r\n {\r\n if (ViewportRoot.isMajorChange) onMajorViewportChange();\r\n });\r\n\r\n $root.attr(\"init\", \"true\");\r\n\r\n $(\"#shared-popups\").detach();\r\n }\r\n\r\n static getInstance(popupName: string)\r\n {\r\n if(!_popupDic[popupName]) return null;\r\n return _popupDic[popupName].instance;\r\n }\r\n\r\n static to(targetPopup: string = \"\", setBackPopup?: string)\r\n {\r\n // if (_isLocking) return;\r\n if (_isLocking && _popupTl) _popupTl.progress(1);\r\n\r\n if (targetPopup === _currentPopup) return\r\n if (!_popupDic[targetPopup] && targetPopup !== \"\") throw new Error(`popup [${targetPopup}] 不存在`);\r\n\r\n return new Promise((resolve) =>\r\n {\r\n _isLocking = true;\r\n\r\n _setBackPopup = setBackPopup;\r\n\r\n const duration = .15,\r\n ease = \"power2.out\",\r\n offset = 50;\r\n\r\n let oldPopup = _currentPopup\r\n _currentPopup = targetPopup;\r\n\r\n let tl = _popupTl = gsap.timeline();\r\n\r\n if (oldPopup === \"\") updateActive();\r\n\r\n if (oldPopup === \"\") {\r\n tl.to($cover, { duration: .2, opacity: 1 }, 0);\r\n }\r\n\r\n if (oldPopup !== \"\") {\r\n let obj: PopupDefine = _popupDic[oldPopup]; \r\n\r\n if (obj.instance.popupAlign === 4) tl.to(obj.instance.$root, { duration: duration, x: -offset, opacity: 0, ease: ease }, 0);\r\n else if (obj.instance.popupAlign === 8) tl.to(obj.instance.$root, { duration: duration, y: offset, opacity: 0, ease: ease }, 0);\r\n else tl.to(obj.instance.$root, { duration: duration, y: -offset, opacity: 0, ease: ease }, 0);\r\n\r\n tl.add(() =>\r\n {\r\n obj.instance.isOnStage = false;\r\n obj.instance.$root.attr(\"style\", \"\").detach();\r\n });\r\n } \r\n\r\n if (_currentPopup !== \"\") {\r\n let obj: PopupDefine = _popupDic[_currentPopup];\r\n\r\n tl.add(() =>\r\n {\r\n $cover.css(\"background-color\", obj.instance.coverColor);\r\n \r\n $root.attr(\"content-align\", obj.instance.popupAlign);\r\n obj.instance.isOnStage = true;\r\n $root.append(obj.instance.$root);\r\n });\r\n\r\n\r\n tl.addLabel(\"contentIn\");\r\n\r\n if (obj.instance.popupAlign === 4) {\r\n tl.set(obj.instance.$root, { duration: duration, x: -offset, opacity: 0 }, \"contentIn\");\r\n tl.to(obj.instance.$root, { duration: duration, x: 0, opacity: 1, ease: ease }, \"contentIn\");\r\n }\r\n else {\r\n tl.set(obj.instance.$root, { duration: duration, y: offset, opacity: 0 }, \"contentIn\");\r\n tl.to(obj.instance.$root, { duration: duration, y: 0, opacity: 1, ease: ease }, \"contentIn\");\r\n }\r\n }\r\n\r\n if (_currentPopup === \"\") {\r\n tl.to($cover, { duration: .2, opacity: 0 }, \"contentIn\");\r\n }\r\n\r\n tl.add(() =>\r\n {\r\n updateActive();\r\n _isLocking = false;\r\n\r\n // if(cb) cb();\r\n resolve(true);\r\n });\r\n });\r\n\r\n\r\n\r\n }\r\n\r\n static openMenu(targetPopup: string = \"\", targetElem?: HTMLElement, options?: MenuOptions)\r\n {\r\n if (targetPopup === _currentMenu) return;\r\n\r\n let defaultOptions: MenuOptions = {\r\n position: \"absolute\",\r\n align: \"center\",\r\n offsetTop: 10,\r\n offsetLeft: 0\r\n };\r\n\r\n options = {\r\n ...defaultOptions,\r\n ...options\r\n };\r\n\r\n // console.log(`target: ${targetPopup}`);\r\n // console.log(targetElem);\r\n\r\n if (targetPopup === \"\" && _currentMenu) {\r\n\r\n removeMenu();\r\n _currentMenu = \"\";\r\n }\r\n else {\r\n _currentMenu = targetPopup;\r\n\r\n\r\n if (options.position === \"sticky\") {\r\n\r\n let rect = targetElem.getBoundingClientRect(),\r\n top = rect.top + rect.height + options.offsetTop,\r\n left = rect.left + window.scrollX + options.offsetLeft;\r\n\r\n completeMenu(rect, left, top, options);\r\n }\r\n else if (options.position === \"absolute\") {\r\n\r\n let rect = targetElem.getBoundingClientRect(),\r\n top = rect.top + window.scrollY + rect.height + options.offsetTop,\r\n dx = Math.max(0, (ViewportRoot.width - ViewportRoot.getScrollbarWidth() - 1280) * .5),\r\n left = rect.left + window.scrollX - dx + options.offsetLeft;\r\n\r\n // console.log(ViewportRoot.scrollbarWidth);\r\n\r\n\r\n completeMenu(rect, left, top, options);\r\n }\r\n }\r\n }\r\n\r\n static openMenuAsPopup(targetPopup: string = \"\")\r\n {\r\n if (targetPopup === _currentMenu) return;\r\n _currentMenu = targetPopup;\r\n\r\n $dropdownMenus.attr(\"active\", \"true\");\r\n\r\n let obj = _popupDic[_currentMenu],\r\n $popup = obj.instance.$root;\r\n\r\n // $popup.attr(\"mode\", \"menu\");\r\n\r\n\r\n let $cover = $dropdownMenus.find(\".cover\");\r\n\r\n $dropdownMenus.attr(\"position\", \"popup\").append($popup);\r\n\r\n let tl = gsap.timeline();\r\n tl.set($dropdownMenus, { opacity: 1 });\r\n tl.set($cover, { opacity: 0 });\r\n tl.set($popup, { y: 40 });\r\n tl.to($cover, { duration: .15, opacity: 1 });\r\n tl.to($popup, { duration: .2, y: 0 }, 0);\r\n\r\n // gsap.from($cover, { duration: .15, opacity: 0 });\r\n // gsap.from($popup, { duration: .15, y: 20, delay: .1 });\r\n }\r\n\r\n static close()\r\n {\r\n if (_setBackPopup) {\r\n let string = _setBackPopup;\r\n _setBackPopup = undefined;\r\n return this.to(string);\r\n }\r\n else {\r\n return this.to(\"\");\r\n }\r\n }\r\n\r\n static closeMenu()\r\n {\r\n this.openMenu(\"\");\r\n }\r\n\r\n static registComponents(dic: PopupDefineDic)\r\n {\r\n _popupDic = Object.assign({}, dic, _popupDic);\r\n }\r\n}\r\n\r\nfunction onMajorViewportChange()\r\n{\r\n if (_currentMenu) {\r\n let obj = _popupDic[_currentMenu];\r\n if (obj.instance.autoClose_menu) Popups.closeMenu();\r\n }\r\n\r\n if (_currentPopup) {\r\n let obj = _popupDic[_currentPopup];\r\n if (obj.instance.autoClose_popup) Popups.close();\r\n }\r\n}\r\n\r\nfunction completeMenu(rect: DOMRect, left: number, top: number, options: MenuOptions): void\r\n{\r\n $dropdownMenus.attr(\"active\", \"true\");\r\n\r\n let obj = _popupDic[_currentMenu],\r\n $popup = obj.instance.$root;\r\n if (obj.instance.setMinWidth) obj.instance.setMinWidth(rect.width);\r\n\r\n $popup.attr(\"mode\", \"menu\");\r\n\r\n $dropdownMenus.attr(\"position\", options.position).append($popup)\r\n\r\n let width = $popup.width();\r\n\r\n\r\n switch (options.align) {\r\n\r\n case \"center\":\r\n left = left + rect.width * .5 - width * .5;\r\n break;\r\n\r\n case \"right\":\r\n left = left + rect.width - width;\r\n break;\r\n }\r\n\r\n // gsap.from($popup, {duration: .15, transformOrigin: \"center top\", scaleX: \".8\", ease: \"power1.out\"});\r\n gsap.set($dropdownMenus, { opacity: 1 });\r\n gsap.from($popup, { duration: .15, opacity: 0, ease: \"power1.out\" });\r\n\r\n if (options.position === \"sticky\") {\r\n let vpWidth = Math.max(ViewportRoot.width, 1440);\r\n\r\n $popup.css({\r\n \"left\": \"50%\",\r\n \"margin-left\": left - vpWidth * .5,\r\n \"top\": top + \"px\"\r\n });\r\n }\r\n else {\r\n $popup.css({\r\n \"left\": left + \"px\",\r\n \"top\": top + \"px\"\r\n });\r\n }\r\n}\r\n\r\nfunction removeMenu()\r\n{\r\n\r\n let obj = _popupDic[_currentMenu];\r\n\r\n // let tl = gsap.timeline();\r\n\r\n // tl.to($dropdownMenus, { duration: .15, opacity: 0 });\r\n\r\n // tl.add(() =>\r\n // {\r\n\r\n $dropdownMenus.attr(\"active\", \"false\").attr(\"position\", \"\");\r\n\r\n\r\n if (obj) {\r\n if (obj.instance.clearDropdownSetting) obj.instance.clearDropdownSetting();\r\n\r\n obj.instance.$root.attr(\"style\", \"\").detach().attr(\"mode\", \"popup\");\r\n }\r\n\r\n // });\r\n}\r\n\r\nfunction updateActive()\r\n{\r\n let isActive = _currentPopup !== \"\";\r\n $root.attr(\"active\", isActive ? \"true\" : \"false\");\r\n Pages.toggleScrollLock(isActive);\r\n}\r\n\r\nexport default Popups;","// import error_schema from \"@schema/error.json\";\r\n// import response_message_schema from \"@schema/response-message.json\";\r\n// import phone_schema from \"@schema/phone.json\";\r\n// import country_schema from \"@schema/country.json\";\r\n// import address_schema from \"@schema/address.json\";\r\n// import gender_schema from \"@schema/gender.json\";\r\n// import paging_info_schema from \"@schema/paging-info.json\";\r\n// import next_url_schema from \"@schema/next_url.json\";\r\n// import coupon_schema from \"@schema/coupon.json\";\r\n// import basic_info from \"@schema/basic-info.json\";\r\n// import passenger_info from \"@schema/passenger-info.json\";\r\n// import platform_schema from \"@schema/platform.json\";\r\n// import photo_schema from \"@schema/photo.json\";\r\n\r\nimport Ajv, { JSONSchemaType } from \"ajv\";\r\nimport addFormats from \"ajv-formats\";\r\n\r\n\r\nlet _ajv: Ajv;\r\n\r\nlet AjvProxy =\r\n{\r\n init()\r\n {\r\n _ajv = new Ajv({ coerceTypes: \"array\" });\r\n // _ajv.addSchema(error_schema);\r\n\r\n addFormats(_ajv, [\"email\"]);\r\n addFormats(_ajv, [\"date\"]);\r\n\r\n // AjvProxy.addSchema(error_schema);\r\n // AjvProxy.addSchema(response_message_schema);\r\n // AjvProxy.addSchema(phone_schema);\r\n // AjvProxy.addSchema(country_schema);\r\n // AjvProxy.addSchema(address_schema);\r\n // AjvProxy.addSchema(gender_schema);\r\n // AjvProxy.addSchema(next_url_schema);\r\n // AjvProxy.addSchema(paging_info_schema);\r\n // AjvProxy.addSchema(coupon_schema);\r\n // AjvProxy.addSchema(basic_info);\r\n // AjvProxy.addSchema(passenger_info);\r\n // AjvProxy.addSchema(platform_schema);\r\n // AjvProxy.addSchema(photo_schema);\r\n\r\n // SchemaTest.test();\r\n },\r\n\r\n addSchema(schema: any, name?: string)\r\n {\r\n if (!name) name = schema[\"$id\"];\r\n\r\n\r\n\r\n if (!_ajv.getSchema(name)) {\r\n _ajv.addSchema(schema, name);\r\n // console.log(\"add \" + name);\r\n // console.log(schema);\r\n }\r\n },\r\n\r\n validate(schemaJson: any, jsonData: any, coerceTypes: any = \"array\"): { data: DataType, error?: any }\r\n {\r\n _ajv.opts.coerceTypes = coerceTypes; \r\n\r\n try {\r\n\r\n let schemaId: string = schemaJson[\"$id\"];\r\n\r\n AjvProxy.addSchema(schemaJson, schemaId);\r\n let validate = _ajv.getSchema(schemaId);\r\n\r\n // console.log(validate.schema);\r\n // console.log(\"validae \" + schemaId);\r\n\r\n if (validate(jsonData)) {\r\n return { data: jsonData as DataType };\r\n }\r\n else {\r\n console.error(`JSON Schema [${schemaId}] 驗證失敗:\\n=> ` + validate.errors[0].message, { jsonData: jsonData, errors: validate.errors });\r\n console.dir(validate.errors[0]);\r\n\r\n return { error: { jsonData: jsonData, errors: validate.errors, message: `JSON Schema [${schemaId}] 驗證失敗` }, data: jsonData as DataType };\r\n }\r\n }\r\n catch (e) {\r\n console.error(e);\r\n return { error: e, data: null };\r\n }\r\n }\r\n}\r\n\r\nexport default AjvProxy;","// import { Utility } from \"./sframe/Utility\";\r\n\r\nimport { Common } from \"@components/common/CommonTypes\";\r\nimport EZAlert from \"@root/components/popups/EZAlert\";\r\n\r\nimport GS from \"./GlobalSetting\";\r\nimport AjvProxy from \"@root/ts/AjvProxy\";\r\n\r\nlet _testData: any,\r\n _apiResponseAfterfixs: any = {};\r\n\r\nlet _apiExtension = \"\",\r\n _apiPath = \"./api/\",\r\n _method = \"POST\",\r\n _alwaysCompleteWithError = true,\r\n _useTestDataIfExist = true,\r\n _simulateDelay = 1,\r\n _dataType = \"json\",\r\n _logSendingData = false;\r\n\r\nlet _token: string = \"\";\r\n\r\nexport interface ApiProxyOptions\r\n{\r\n testDataName?: string | boolean;\r\n method?: string;\r\n async?: boolean;\r\n completeWithError?: boolean;\r\n sendAsJsonText?: boolean;\r\n simDelay?: number;\r\n schema?: any;\r\n exampleIndex?: number;\r\n userPending?: boolean;\r\n}\r\n\r\nlet _fetchedPageData: any = {};\r\n\r\nlet ApiProxy = {\r\n\r\n getCommonPageData(): Common.CommonPageData\r\n {\r\n return ApiProxy.getPageData(\"common-page-data\");\r\n },\r\n\r\n // getPageData(): any\r\n // {\r\n // return ApiProxy.getDataFromHtml(\"page-data\");\r\n // },\r\n\r\n // convertPageData(id: string, converter?: any): any\r\n // {\r\n // if (_fetchedPageData[id]) return _fetchedPageData[id];\r\n // _fetchedPageData[id] = converter? converter(ApiProxy.getPageDataString(id)): JSON.parse(ApiProxy.getPageDataString(id));\r\n // return _fetchedPageData[id];\r\n // },\r\n\r\n getPageDataString(id: string): string\r\n {\r\n let elem = document.getElementById(id);\r\n if(!elem) return null;\r\n\r\n let jsonString = elem.innerHTML as string;\r\n jsonString = jsonString.replace(/\\\\\"|\"(?:\\\\\"|[^\"])*\"|(\\/\\/.*|\\/\\*[\\s\\S]*?\\*\\/)/g, (m, g) => g ? \"\" : m);\r\n return jsonString;\r\n },\r\n\r\n validatePageData(id: string = \"page-data\", schema?: any)\r\n {\r\n let string = ApiProxy.getPageDataString(id);\r\n let obj = JSON.parse(string);\r\n let result = AjvProxy.validate(schema, obj);\r\n if (!result.error) {\r\n obj = result.data;\r\n }\r\n\r\n _fetchedPageData[id] = obj;\r\n\r\n return _fetchedPageData[id];\r\n },\r\n\r\n getPageData(id: string = \"page-data\")\r\n {\r\n if (_fetchedPageData[id]) return _fetchedPageData[id];\r\n _fetchedPageData[id] = JSON.parse(ApiProxy.getPageDataString(id));\r\n\r\n // console.log(_fetchedPageData[id]);\r\n\r\n return _fetchedPageData[id];\r\n },\r\n\r\n logPageData(id: string = \"page-data\")\r\n {\r\n let data = ApiProxy.getPageData(id);\r\n data = JSON.parse(JSON.stringify(data)); // 快照物件當前狀態, 否則 console log 出的資料可能會後被後來的程式變動過\r\n console.log(data);\r\n },\r\n\r\n /**\r\n * 快速呼叫 api\r\n * @param apiName \r\n * @param params \r\n * @param autoClosePending \r\n * @param options \r\n * @returns \r\n */\r\n quickCall: (apiName: string, params: any, autoClosePending: boolean = true, options?: ApiProxyOptions): Promise =>\r\n {\r\n return new Promise((resolve) =>\r\n {\r\n EZAlert.pending(true);\r\n\r\n // let op = Object.assign({ simDelay: 800 }, options);\r\n let op = Object.assign({}, options);\r\n\r\n ApiProxy.callApi(apiName, params, op).then((result) =>\r\n {\r\n (autoClosePending) ? EZAlert.pending(false, () => { resolve(result) }) : resolve(result);\r\n // if(autoClosePending) EZAlert.pending(false);\r\n // resolve(result);\r\n\r\n }).catch((error: any) =>\r\n {\r\n console.error(error);\r\n EZAlert.pending(false);\r\n EZAlert.alert(error.message);\r\n });\r\n });\r\n },\r\n\r\n /**\r\n * 快速呼叫 api (不使用 pending 畫面)\r\n * @param apiName \r\n * @param params \r\n * @param options \r\n * @returns \r\n */\r\n quickCall2: (apiName: string, params: any, options?: ApiProxyOptions): Promise =>\r\n {\r\n return new Promise((resolve) =>\r\n {\r\n let op = Object.assign({}, options);\r\n\r\n ApiProxy.callApi(apiName, params, op).then((result) =>\r\n {\r\n resolve(result);\r\n\r\n }).catch((error: any) =>\r\n {\r\n console.error(error);\r\n EZAlert.alert(error.message);\r\n });\r\n });\r\n },\r\n\r\n callApi: function (apiName: string, params: any = {}, options: ApiProxyOptions = undefined): Promise\r\n {\r\n return new Promise((resolve, reject) =>\r\n {\r\n if (params && _logSendingData) {\r\n console.log(\"=== API[\" + apiName + \"] sending ===\");\r\n console.log(params);\r\n }\r\n\r\n options = Object.assign({ simDelay: _simulateDelay }, options);\r\n\r\n var testDataName = options.testDataName,\r\n method = options.method || _method,\r\n async = options.async === undefined ? true : options.async === undefined,\r\n completeWithError = options.completeWithError || _alwaysCompleteWithError;\r\n\r\n if (testDataName === undefined) {\r\n testDataName = _useTestDataIfExist;\r\n }\r\n\r\n if (testDataName !== false) {\r\n if (!testDataName || testDataName === true) testDataName = apiName;\r\n }\r\n\r\n if (options.schema) {\r\n let sendSchema = options.schema.properties.send;\r\n sendSchema[\"$id\"] = \"/\" + apiName + \".send\";\r\n\r\n if (options.schema.definitions) sendSchema.definitions = options.schema.definitions;\r\n\r\n let validatedResult = AjvProxy.validate(sendSchema, params, false);\r\n if (validatedResult.error) {\r\n reject(validatedResult.error);\r\n return;\r\n }\r\n } \r\n\r\n if (_testData && testDataName && _testData[testDataName]) {\r\n\r\n ApiProxy.applyTestSendData(apiName, params);\r\n\r\n var response = _testData[testDataName].response;\r\n\r\n if (!response) {\r\n console.error(\"[\" + testDataName + \"] not exist in test data\");\r\n }\r\n else {\r\n (options.simDelay === 0) ? complete(response) : setTimeout(function () { complete(response); }, options.simDelay);\r\n }\r\n }\r\n else if (GS.setting.useApiSchemaData && options.schema && options.schema.properties && options.schema.properties.response && options.schema.properties.response.examples) {\r\n\r\n let exampleIndex = options.exampleIndex || 0,\r\n response = options.schema.properties.response.examples[exampleIndex];\r\n\r\n (options.simDelay === 0) ? complete(response) : setTimeout(function () { complete(response); }, options.simDelay);\r\n }\r\n else {\r\n (options.simDelay === 0) ? sendApi() : setTimeout(function () { sendApi(); }, options.simDelay);\r\n }\r\n\r\n function sendApi()\r\n {\r\n let afterFix = getAfterfix(apiName),\r\n apiUrl = _apiPath + apiName + afterFix + _apiExtension;\r\n\r\n let sendingObj: any =\r\n {\r\n url: apiUrl,\r\n crossDomain: true,\r\n type: method,\r\n async: async,\r\n dataType: _dataType,\r\n\r\n // headers: {\"Authorization\": _token},\r\n\r\n data: JSON.stringify(params),\r\n contentType: 'application/json'\r\n };\r\n\r\n $.ajax\r\n (sendingObj)\r\n .done(complete)\r\n .fail((event) =>\r\n {\r\n if (!async) return;\r\n\r\n console.log(\"API: [\" + apiName + \"] 無法取得伺服器回應\");\r\n console.log(event);\r\n\r\n if (completeWithError) {\r\n reject({ message: \"API: [\" + apiName + \"] 無法取得伺服器回應\" });\r\n }\r\n });\r\n\r\n }\r\n\r\n function complete(response: any)\r\n {\r\n //if(!_cachedData[apiName]) _cachedData[apiName] = response;\r\n\r\n // console.log(response); \r\n\r\n if (options.schema) {\r\n let responseSchema = options.schema.properties.response;\r\n responseSchema[\"$id\"] = \"/\" + apiName + \".response\";\r\n\r\n if (options.schema.definitions) responseSchema.definitions = options.schema.definitions;\r\n\r\n let validatedResult = AjvProxy.validate(responseSchema, params);\r\n if (validatedResult.error) {\r\n reject(validatedResult.error);\r\n return;\r\n }\r\n }\r\n\r\n\r\n if (response.error) {\r\n\r\n if (typeof response.error === \"string\") response.error = { message: response.error };\r\n\r\n console.log(\"api [\" + apiName + \"] error: \" + response.error.message);\r\n\r\n if (completeWithError) {\r\n reject(response.error);\r\n }\r\n }\r\n else {\r\n resolve(response);\r\n }\r\n }\r\n });\r\n },\r\n\r\n applyTestData: function (testData: any)\r\n {\r\n _testData = testData;\r\n },\r\n\r\n getApiPath: function ()\r\n {\r\n return _apiPath;\r\n },\r\n\r\n setApiPath: function (path: string)\r\n {\r\n _apiPath = path;\r\n },\r\n\r\n setApiExtension: function (ext: string)\r\n {\r\n _apiExtension = ext;\r\n },\r\n\r\n setMethod: function (method: string)\r\n {\r\n _method = method;\r\n },\r\n\r\n getMethod: function ()\r\n {\r\n return _method;\r\n },\r\n\r\n setToken(token: string)\r\n {\r\n _token = \"Bearer \" + token;\r\n },\r\n\r\n setLogSendingData: function (b: boolean)\r\n {\r\n _logSendingData = b;\r\n },\r\n\r\n setSimplateDelay: (delay: number) =>\r\n {\r\n _simulateDelay = delay;\r\n },\r\n\r\n /**\r\n * 改變測試 api 回應的資料\r\n *\r\n * @param {string} apiName\r\n * @param {*} params\r\n */\r\n resetTestData: (apiName: string, params: any) =>\r\n {\r\n if (_testData && _testData[apiName] && _testData[apiName].reset) {\r\n _testData[apiName].reset(params);\r\n }\r\n },\r\n\r\n /**\r\n * 依據 sendData 改變測試 api 回應的資料\r\n *\r\n * @param {string} apiName\r\n * @param {*} sendData\r\n */\r\n applyTestSendData: (apiName: string, sendData: any) =>\r\n {\r\n if (_testData && _testData[apiName] && _testData[apiName].applySendData) {\r\n _testData[apiName].applySendData(sendData);\r\n }\r\n },\r\n\r\n setApiResponseAfterfix(apiName: string, afterFix: string)\r\n {\r\n _apiResponseAfterfixs[apiName] = \".\" + afterFix;\r\n }\r\n};\r\n\r\nfunction getAfterfix(apiName: string)\r\n{\r\n let s = _apiResponseAfterfixs[apiName] ? _apiResponseAfterfixs[apiName] : \".response\";\r\n return GS.setting.useApiSchemaData ? s : \"\";\r\n}\r\n\r\nexport default ApiProxy;","import ViewportRoot, { getViewportName, ViewportIndex } from \"./sframe/ViewportRoot\";\r\nimport ApiProxy from \"./ApiProxy\";\r\n\r\nenum StyleModes\r\n{\r\n mobie = 0,\r\n pc = 1,\r\n default = 1\r\n}\r\n\r\nexport enum Direction\r\n{\r\n TopLeft = 7,\r\n Top = 8,\r\n TopRight = 9,\r\n Left = 4,\r\n Center = 5,\r\n Right = 6,\r\n BottomLeft = 1,\r\n Bottom = 2,\r\n BottomRight = 3\r\n}\r\n\r\nconst _localSetting =\r\n{\r\n testEnv: \"local\",\r\n useApiSchemaData: true,\r\n logSendingData: true,\r\n apiPath: \"./static/api-data/\",\r\n apiExt: \".json\",\r\n};\r\n\r\nconst _testSetting =\r\n{\r\n testEnv: \"hikaru-test\",\r\n useApiSchemaData: true,\r\n logSendingData: true,\r\n apiPath: \"./static/api-data/\",\r\n apiExt: \".json\"\r\n};\r\n\r\n\r\nexport default class GS\r\n{\r\n static setting = {\r\n testEnv: \"\",\r\n useApiSchemaData: false,\r\n logSendingData: false,\r\n apiPath: \"/api/frontend/\",\r\n apiExt: \"\"\r\n };\r\n\r\n static reviewMaxRating: number = 5;\r\n\r\n static search = \r\n {\r\n keywordMaxLength: 20,\r\n pageSize: 10,\r\n getQueryUrl: (queryString: string)=>\r\n {\r\n return ApiProxy.getCommonPageData().search_page_path + \"?\" + queryString\r\n }\r\n }\r\n\r\n static ezpointRatio = \r\n {\r\n pointToCash: .1,\r\n priceToPoint: .02\r\n };\r\n\r\n static ezpointToCash(value: number)\r\n {\r\n return Math.floor(GS.ezpointRatio.pointToCash * value);\r\n }\r\n\r\n static priceToEzpoint(value: number)\r\n {\r\n return Math.round(GS.ezpointRatio.priceToPoint * value);\r\n }\r\n\r\n static SPORTS_VOUCHER_BONUS_RATE: number = .2;\r\n\r\n static getSportsVoucherBonus(amount: number)\r\n {\r\n return Math.ceil(amount * this.SPORTS_VOUCHER_BONUS_RATE);\r\n }\r\n\r\n static DATE_FORMAT: string = \"YYYY-MM-DD\";\r\n\r\n static DEFAULT_COUNTRY: string = \"tw\";\r\n\r\n static navHeight = {\r\n 0: 80,\r\n 1: 80\r\n };\r\n\r\n static init()\r\n {\r\n if (window.location.host === \"local.savorks.com\") {\r\n $.extend(this.setting, _localSetting);\r\n }\r\n else if (window.location.host === \"www.hikaru.com.tw\") {\r\n $.extend(this.setting, _testSetting);\r\n }\r\n\r\n ApiProxy.setLogSendingData(this.setting.logSendingData);\r\n }\r\n\r\n static getNavHeight()\r\n {\r\n let i: StyleModes = ViewportRoot.index,\r\n v = this.navHeight[i];\r\n return v === undefined ? this.navHeight[StyleModes.default] : v;\r\n }\r\n}","import ComponentBase from \"@root/components/ComponentBase\";\r\nimport Popups from \"../components/popups/Popups\";\r\nimport GS from \"./GlobalSetting\";\r\nimport { gsap } from \"gsap\";\r\nimport { ComponentElem } from \"@root/components/interfaces\";\r\nimport { Common } from \"@root/components/common/CommonTypes\";\r\nimport { getViewportName } from \"./sframe/ViewportRoot\";\r\nimport EZAlert from \"../components/popups/EZAlert\";\r\n\r\nlet _customStyleElem: HTMLElement;\r\n\r\nlet Tools =\r\n{\r\n init: () =>\r\n {\r\n window.EZ.Tools = Tools;\r\n\r\n if (!_customStyleElem) _customStyleElem = document.createElement('style');\r\n _customStyleElem.id = 'custom-page-style';\r\n $('head').append(_customStyleElem);\r\n },\r\n\r\n /**\r\n * 檢查是字串內容是否可以轉化為數字\r\n *\r\n * @param {string} str\r\n * @return {*} {boolean}\r\n */\r\n isNumeric: (str: string): boolean => \r\n {\r\n if (typeof str != \"string\") return false;\r\n ///@ts-ignore\r\n return !isNaN(str) && !isNaN(parseFloat(str));\r\n },\r\n\r\n stringReplaceBetween(s: string, start: number, length: number, replaceString: string)\r\n {\r\n return s.substring(0, start) + replaceString + s.substring(start + length);\r\n },\r\n\r\n combineName(firstName: string, surname: string): string\r\n {\r\n if (firstName) {\r\n if (firstName.match(/[\\u4e00-\\u9fa5]/g)) {\r\n return surname ?\r\n surname + firstName :\r\n firstName;\r\n }\r\n else {\r\n return surname ?\r\n firstName + \" \" + surname :\r\n firstName;\r\n }\r\n }\r\n else {\r\n return null;\r\n }\r\n },\r\n\r\n createLazyLoadImage(src: string)\r\n {\r\n let img = new Image();\r\n img.setAttribute(\"lazy-loading\", \"manual\");\r\n img.onload = () =>\r\n {\r\n img.setAttribute(\"lazy-loading\", \"done\");\r\n };\r\n img.src = src;\r\n return img;\r\n },\r\n\r\n formatDateString(dateString: string, format: string = 'YYYY/MM/DD')\r\n {\r\n ///@ts-ignore\r\n let date = moment(dateString);\r\n return date.format(format);\r\n },\r\n\r\n getAvatarName(name: string)\r\n {\r\n name = name.replace(/ +/g, ' ');\r\n let length = 2;\r\n\r\n // let r = name.match(/\\p{Script=Han}+|\\p{Script=Latin}+/gu);\r\n // 符合中文的文字\r\n let r = name.match(/[\\u4e00-\\u9fa5]/g);\r\n console.log(r);\r\n\r\n if (r) {\r\n if (r.length === 2 || r.length === 3) {\r\n name = r[r.length - 2] + r[r.length - 1];\r\n }\r\n else {\r\n name = r[0];\r\n length = 1;\r\n }\r\n }\r\n else {\r\n // let array = name.match(/\\p{Script=Han}+|\\p{Script=Latin}+/gu);\r\n // console.log(array);\r\n\r\n name = name[0];\r\n }\r\n\r\n return name;\r\n\r\n // return `https://ui-avatars.com/api/?length=${length}&${name}`;\r\n },\r\n\r\n // generateAvatar(text: any, foregroundColor: any = \"#ffffff\", backgroundColor: any = \"#000000\")\r\n // {\r\n // const canvas = document.createElement(\"canvas\");\r\n // const context = canvas.getContext(\"2d\");\r\n\r\n // canvas.width = 200;\r\n // canvas.height = 200;\r\n\r\n // // Draw background\r\n // context.fillStyle = backgroundColor;\r\n // context.fillRect(0, 0, canvas.width, canvas.height);\r\n\r\n // // Draw text\r\n // context.font = \"bold 100px Assistant\";\r\n // context.fillStyle = foregroundColor;\r\n // context.textAlign = \"center\";\r\n // context.textBaseline = \"middle\";\r\n // context.fillText(text, canvas.width / 2, canvas.height / 2);\r\n\r\n // return canvas.toDataURL(\"image/png\");\r\n // },\r\n\r\n completeLinks($container: any)\r\n {\r\n let $elems = $container.find('[popup-to]');\r\n $.each($elems, (index: number, elem: HTMLElement) =>\r\n {\r\n $(elem).on(\"click\", (event: Event) =>\r\n {\r\n event.preventDefault();\r\n Popups.to(elem.getAttribute(\"popup-to\"));\r\n });\r\n });\r\n\r\n $elems = $container.find(`[deeplink]`);\r\n $.each($elems, (index: number, elem: HTMLElement) =>\r\n {\r\n $(elem).on(\"click\", (event: Event) =>\r\n {\r\n event.preventDefault();\r\n\r\n let target = elem.getAttribute(\"deeplink\"),\r\n offsetY = GS.getNavHeight();\r\n gsap.to(window, { duration: .5, scrollTo: { y: target, offsetY: offsetY } });\r\n });\r\n });\r\n },\r\n\r\n\r\n\r\n seekComponentByName(componentName: string, $elem?: JQuery): any\r\n {\r\n return Tools.seekComponent(`[component=\"${componentName}\"]`, $elem);\r\n },\r\n\r\n seekComponentById(id: string, $elem?: JQuery): any\r\n {\r\n return Tools.seekComponent(`#${id}`, $elem);\r\n },\r\n\r\n seekComponentByClass(className: string, $elem?: JQuery): any\r\n {\r\n return Tools.seekComponent(`.${className}`, $elem);\r\n },\r\n\r\n seekComponentElem($elem: JQuery, componentName: string): ComponentElem\r\n {\r\n return ($elem.find(`[component=\"${componentName}\"]`)[0]);\r\n },\r\n\r\n seekComponent(query: string, $elem?: JQuery): any\r\n {\r\n if (!$elem) $elem = $(`body`);\r\n return ($elem.find(query)[0])._component;\r\n },\r\n\r\n\r\n removeBetweenArrays(targetList: any[], sourceList: any[])\r\n {\r\n targetList.forEach((target: any) =>\r\n {\r\n sourceList.forEach((source, index, obj) =>\r\n {\r\n if (target === source) {\r\n obj.splice(index, 1);\r\n }\r\n });\r\n });\r\n },\r\n\r\n formatNumber(num: string | number)\r\n {\r\n if (typeof num === \"string\") {\r\n return parseInt(num).toLocaleString(\"zh-tw\");\r\n }\r\n else {\r\n return (num).toLocaleString(\"zh-tw\");\r\n }\r\n\r\n },\r\n\r\n testRectOverlap(rectA: DOMRect, rectB: DOMRect)\r\n {\r\n return (rectA.left < rectB.right && rectA.right > rectB.left &&\r\n rectA.top < rectB.bottom && rectA.bottom > rectB.top);\r\n },\r\n\r\n testRectOverlapY(rectA: DOMRect, rectB: DOMRect)\r\n {\r\n return (\r\n rectA.top < rectB.bottom && rectA.bottom > rectB.top);\r\n },\r\n\r\n addCustomStyle(query: string, styles: string, isMobile: boolean = false)\r\n {\r\n if (isMobile) _customStyleElem.innerHTML = _customStyleElem.innerHTML + \"@media(max-width: 640px){\" + query + \"{\" + styles + \"}}\" + '\\n';\r\n else _customStyleElem.innerHTML = _customStyleElem.innerHTML + query + \"{\" + styles + \"}\" + '\\n';\r\n },\r\n\r\n // 功能完整版\r\n addCustomStyle_2(id: string, query: string, styles: string, isMobile: boolean = false, isReplace: boolean = true)\r\n {\r\n let elem = $(`#${id}`)[0];\r\n\r\n if (!elem) {\r\n elem = document.createElement('style');\r\n elem.id = id;\r\n $('head').append(elem);\r\n }\r\n\r\n let newHtml = isMobile ? \"@media(max-width: 640px){\" + query + \"{\" + styles + \"}}\" + '\\n' : query + \"{\" + styles + \"}\" + '\\n';\r\n elem.innerHTML = isReplace ? newHtml : elem.innerHTML + newHtml;\r\n },\r\n\r\n\r\n /**\r\n * 捲動到目標 HTMLElement\r\n *\r\n * @param {HTMLElement} elem\r\n * @param {{mobile:number, pc:number}} [offset={mobile: 20, pc: 20}]\r\n */\r\n scrollToElement(elemOrId: HTMLElement | string, offset: { mobile: number, pc: number } | number = { mobile: 0, pc: 0 }): void\r\n {\r\n\r\n let navHeight = GS.getNavHeight(),\r\n ///@ts-ignore\r\n basiceOffset = typeof offset === \"number\" ? offset : ((getViewportName() === \"mobile\" ? offset.mobile : offset.pc)),\r\n offsetY = navHeight + basiceOffset;\r\n\r\n if (typeof elemOrId === \"string\") elemOrId = \"#\" + elemOrId;\r\n\r\n\r\n gsap.to(window, { duration: .5, scrollTo: { y: elemOrId, offsetY: offsetY } });\r\n },\r\n\r\n listToDic(list: any[], key?: string)\r\n {\r\n let dic: any = {},\r\n obj: any;\r\n\r\n if (key) {\r\n for (let i = 0; i < list.length; i++) {\r\n obj = list[i];\r\n dic[obj[key]] = obj;\r\n }\r\n }\r\n else {\r\n for (let i = 0; i < list.length; i++) {\r\n obj = list[i];\r\n dic[obj] = obj;\r\n }\r\n }\r\n\r\n return dic;\r\n },\r\n\r\n\r\n\r\n splitText: function (dom: any)\r\n {\r\n // gsap.set(dom, {perspective: 400});\r\n\r\n // console.log(dom);\r\n\r\n var string = dom.innerText;\r\n dom.innerHTML = \"\";\r\n\r\n //console.log(dom);\r\n //console.log(string);\r\n\r\n var i,\r\n char: string,\r\n charDom,\r\n array = [];\r\n\r\n for (i = 0; i < string.length; i++) {\r\n charDom = document.createElement(\"span\");\r\n char = string.slice(i, i + 1);\r\n\r\n // console.log(`${char}: ${char.charCodeAt(0)}`);\r\n\r\n if (char === \" \") {\r\n charDom.innerHTML = \" \";\r\n }\r\n else if(char.charCodeAt(0) === 10)\r\n { \r\n // charDom.innerHTML = `
`;\r\n charDom = document.createElement(\"br\");\r\n }\r\n else {\r\n charDom.innerHTML = char;\r\n }\r\n\r\n $(charDom).css\r\n ({\r\n \"display\": \"inline-block\",\r\n \"position\": \"relative\"\r\n });\r\n\r\n dom.appendChild(charDom);\r\n\r\n array.push(charDom);\r\n }\r\n\r\n return array;\r\n },\r\n\r\n /**\r\n * 轉換 json 內容為布林值\r\n *\r\n * @param {*} value\r\n * @return {*} {boolean}\r\n */\r\n parseBoolean(value: any): boolean\r\n {\r\n if (value === true) return true;\r\n if (value === \"true\") return true;\r\n return false;\r\n },\r\n\r\n parseInt(value: any): number\r\n {\r\n return parseInt(value);\r\n },\r\n\r\n parseFloat(value: any): number\r\n {\r\n return parseFloat(value);\r\n },\r\n\r\n parseDate(value: string | moment.Moment, addSpace: boolean = true): string\r\n {\r\n /// @ts-ignore\r\n let date: moment.Moment = typeof value === \"string\" ? moment(value, GS.DATE_FORMAT) : value;\r\n let result = addSpace ? date.format(\"YYYY / MM / DD\") : date.format(\"YYYY/MM/DD\");\r\n return result;\r\n },\r\n\r\n parseValue(value: string, valueType: string)\r\n {\r\n let v: any = value;\r\n if (valueType === \"int\") v = Tools.parseInt(value);\r\n else if (valueType === \"float\") v = Tools.parseFloat(value);\r\n else if (valueType === \"boolean\") v = Tools.parseBoolean(value);\r\n else if (valueType === \"gender\") v = value === \"male\" ? \"男\" : \"女\";\r\n else if (valueType === \"date\") v = Tools.parseDate(value);\r\n else if (valueType === \"date2\") v = Tools.parseDate(value, false);\r\n\r\n return v;\r\n },\r\n\r\n updateValue($target: JQuery, valueName: string, value: string | number, valueType: string = \"string\")\r\n {\r\n let v: any = Tools.parseValue(String(value), valueType);\r\n\r\n $target.find(`[data-value=\"${valueName}\"]`).text(v);\r\n },\r\n\r\n getFullName(firstName: string, surname: string)\r\n {\r\n let reg = /[^\\u4e00-\\u9fa5]/,\r\n isNotChinese = reg.test(firstName);\r\n\r\n return isNotChinese ?\r\n firstName + \" \" + surname :\r\n surname + \"\" + firstName;\r\n },\r\n\r\n /**\r\n * 取出 localStorage 資料 (資料以 json字串 儲存, 取出後將轉換為 json物件)\r\n * @param name 物件名稱\r\n * @returns \r\n */\r\n getLocalStorageObj(name: string)\r\n {\r\n let objString: string = localStorage.getItem(name),\r\n obj: any;\r\n\r\n try {\r\n obj = JSON.parse(objString);\r\n }\r\n catch (e) { }\r\n\r\n if (!obj || typeof obj !== \"object\") obj = {};\r\n\r\n return obj;\r\n },\r\n\r\n /**\r\n * 儲存 localStorage 資料 (資料將被轉換成 json字串 後儲存)\r\n * @param name 物件名稱\r\n * @param obj 資料\r\n */\r\n saveLocalStorageObj(name: string, obj: any)\r\n {\r\n localStorage.setItem(name, JSON.stringify(obj));\r\n },\r\n\r\n isLocalStorageAvailable()\r\n {\r\n var test = 'test';\r\n try {\r\n localStorage.setItem(test, test);\r\n localStorage.removeItem(test);\r\n return true;\r\n } catch (e) {\r\n EZAlert.alert(\"提示\", `本網站需要使用瀏覽器的localStorage,未啟用將無法使用部分功能`);\r\n return false;\r\n }\r\n },\r\n\r\n shake(elem: HTMLElement)\r\n {\r\n let duration = .1,\r\n ease = \"quad.inOut\"\r\n\r\n gsap.to(elem, {\r\n duration: duration,\r\n x: -7,\r\n ease: ease\r\n });\r\n gsap.to(elem, {\r\n duration: duration,\r\n repeat: 4,\r\n x: 7,\r\n yoyo: true,\r\n delay: .1,\r\n ease: ease,\r\n clearProps: \"transform\"\r\n });\r\n // gsap.to(elem, {\r\n // duration: duration,\r\n // x: 0,\r\n // delay: .1 * 4\r\n // });\r\n },\r\n\r\n // 限制 input 輸入字元\r\n setInputFilter(textbox: Element, inputFilter: (value: string) => boolean, errMsg: string): void\r\n {\r\n [\"input\", \"keydown\", \"keyup\", \"mousedown\", \"mouseup\", \"select\", \"contextmenu\", \"drop\", \"focusout\"].forEach(function (event)\r\n {\r\n textbox.addEventListener(event, function (this: (HTMLInputElement | HTMLTextAreaElement) & { oldValue: string; oldSelectionStart: number | null, oldSelectionEnd: number | null })\r\n {\r\n if (inputFilter(this.value)) {\r\n this.oldValue = this.value;\r\n this.oldSelectionStart = this.selectionStart;\r\n this.oldSelectionEnd = this.selectionEnd;\r\n }\r\n else if (Object.prototype.hasOwnProperty.call(this, \"oldValue\")) {\r\n this.value = this.oldValue;\r\n\r\n if (this.oldSelectionStart !== null &&\r\n this.oldSelectionEnd !== null) {\r\n this.setSelectionRange(this.oldSelectionStart, this.oldSelectionEnd);\r\n }\r\n }\r\n else {\r\n this.value = \"\";\r\n }\r\n });\r\n });\r\n }\r\n};\r\n\r\nexport default Tools;","let Geom = {\r\n caculateContain: function (containerWidth: number, containerHeight: number, contentWidth: number, contentHeight: number)\r\n {\r\n var containerRatio = containerWidth / containerHeight,\r\n contentRatio = contentWidth / contentHeight,\r\n width, height;\r\n\r\n if (contentRatio > containerRatio) {\r\n width = containerWidth;\r\n height = width / contentRatio;\r\n }\r\n else {\r\n height = containerHeight;\r\n width = height * contentRatio;\r\n }\r\n\r\n return { width: width, height: height, ratio: width / contentWidth };\r\n },\r\n\r\n caculateCover: function (containerWidth: number, containerHeight: number, contentWidth: number, contentHeight: number)\r\n {\r\n var containerRatio = containerWidth / containerHeight,\r\n contentRatio = contentWidth / contentHeight,\r\n width, height;\r\n\r\n if (contentRatio > containerRatio) {\r\n height = containerHeight;\r\n width = height * contentRatio;\r\n }\r\n else {\r\n width = containerWidth;\r\n height = width / contentRatio;\r\n }\r\n\r\n var ratio = width / contentWidth;\r\n\r\n var tw = containerWidth / ratio,\r\n th = containerHeight / ratio;\r\n var contentCenterBound =\r\n {\r\n x: (contentWidth - tw) * .5,\r\n y: (contentHeight - th) * .5,\r\n width: tw,\r\n height: th\r\n };\r\n\r\n //console.log(contentCenterBound);\r\n\r\n return { width: width, height: height, ratio: ratio, contentCenterBound: contentCenterBound };\r\n }\r\n};\r\n\r\nexport default Geom;","/* change log\r\n 1.0.1\r\n 支援 addListener 和 removeListener\r\n 移除 bind, 統一由 listener 回應捲動事件\r\n 1.0.2\r\n 新增 update 方法, 強制更新狀態\r\n 改變 testDom 方法的判定\r\n 新增 testDomFromMiddle 方法, 類似 testDom, 但是判定內容以判定目標的中間為準\r\n 1.0.3\r\n 新增 getPosition 方法, 取用目前 window scrollTop 和 scrollLeft\r\n 1.0.4\r\n testDomFromMiddle 新增 containerSizeScale 參數, 決定判斷容器的大小\r\n 1.0.5\r\n scroll height 取得方式變更\r\n 1.0.7\r\n 更換成 typescript, 移置 sframe namespace\r\n */\r\n\r\nimport gsap from \"gsap\";\r\nimport Utility from \"./Utility\";\r\n\r\n\r\nvar _isLocking = false,\r\n _listenerDic: { [key: string]: Function } = {},\r\n _scrollBound =\r\n {\r\n top: 0,\r\n left: 0,\r\n width: 0,\r\n height: 0\r\n },\r\n _tweenDic = { scrollTop: 0, scrollLeft: 0 };\r\n\r\nvar self =\r\n{\r\n _isActive: false,\r\n\r\n init: function ()\r\n {\r\n window.scrollTo(0, 0);\r\n\r\n return self;\r\n },\r\n\r\n addListener: function (id: string, func: Function)\r\n {\r\n _listenerDic[id] = func;\r\n\r\n return self;\r\n },\r\n\r\n removeListener: function (id: string)\r\n {\r\n delete _listenerDic[id];\r\n\r\n return self;\r\n },\r\n\r\n active: function ()\r\n {\r\n self._isActive = true;\r\n\r\n window.addEventListener(\"scroll\", onScroll);\r\n\r\n updateScrollTop();\r\n\r\n return self;\r\n },\r\n\r\n disactive: function ()\r\n {\r\n self._isActive = false;\r\n window.removeEventListener(\"scroll\", onScroll);\r\n\r\n return self;\r\n },\r\n\r\n // topOffset and bottomOffset 代表檢測內容的上下偏移 (1.0.1版為容器的上下偏移)\r\n testDom: function (dom: HTMLElement, topOffset: number, bottomOffset: number)\r\n {\r\n var bound = dom.getBoundingClientRect();\r\n\r\n if (topOffset === undefined) topOffset = 0;\r\n if (bottomOffset === undefined) bottomOffset = 0;\r\n\r\n var top = 0,\r\n bottom = _scrollBound.height;\r\n\r\n var boundTop = bound.top + topOffset,\r\n boundBottom = bound.bottom + bottomOffset;\r\n\r\n var topInside = (boundTop >= top && boundTop <= bottom),\r\n bottomInside = (boundBottom >= top && boundBottom <= bottom);\r\n\r\n return {\r\n bound: bound,\r\n topInside: topInside,\r\n bottomInside: bottomInside\r\n };\r\n },\r\n\r\n // 測試目標 boundingClientRect 中線是否進入 viewport 中\r\n testDomFromMiddle: function (dom: HTMLElement, topOffset: number = 0, bottomOffset: number = 0)\r\n {\r\n var bound = dom.getBoundingClientRect();\r\n\r\n if (topOffset === undefined) topOffset = 0;\r\n if (bottomOffset === undefined) bottomOffset = 0;\r\n\r\n var top = 0,\r\n bottom = _scrollBound.height;\r\n\r\n var boundMiddle = bound.top + bound.height * .5,\r\n boundTop = boundMiddle + topOffset,\r\n boundBottom = boundMiddle + bottomOffset;\r\n\r\n // console.log(bound);\r\n // console.log(top);\r\n // console.log(bottom);\r\n // console.log(boundMiddle);\r\n\r\n var topInside = (boundTop >= top && boundTop <= bottom),\r\n bottomInside = (boundBottom >= top && boundBottom <= bottom);\r\n\r\n return {\r\n bound: bound,\r\n topInside: topInside,\r\n bottomInside: bottomInside,\r\n bothInside: topInside && bottomInside,\r\n test: _scrollBound.height\r\n };\r\n },\r\n\r\n // 測試目標 boundingClientRect 是否包含 viewport 中線\r\n testDomContainScreenMiddle: function (dom: HTMLElement)\r\n {\r\n var bound = dom.getBoundingClientRect(),\r\n screenMiddleY = _scrollBound.height * .5;\r\n\r\n return (bound.top <= screenMiddleY) && (bound.top + bound.height >= screenMiddleY);\r\n },\r\n\r\n scrollTo: function (targetTop: number, cb: Function, __speed: number)\r\n {\r\n\r\n var speed = __speed ? __speed : 1000,\r\n //dy = Math.abs(targetTop - _tweenDic.scrollTop),\r\n dy = Math.abs(targetTop - $(window).scrollTop()),\r\n duration = Math.min(.8, dy / speed);\r\n\r\n gsap.killTweensOf(_tweenDic);\r\n _tweenDic.scrollTop = $(window).scrollTop();\r\n\r\n gsap.to(_tweenDic, {\r\n duration: duration, scrollTop: targetTop, onStart: function ()\r\n {\r\n }, onUpdate: function ()\r\n {\r\n //console.log(_tweenDic.scrollTop + \" : \" + $(window).scrollTop());\r\n window.scrollTo($(window).scrollLeft(), _tweenDic.scrollTop);\r\n //$(window).scrollTop(_tweenDic.scrollTop);\r\n\r\n }, onComplete: cb as gsap.Callback\r\n });\r\n },\r\n\r\n update: function (specId?: string)\r\n {\r\n updateScrollTop(true, specId);\r\n },\r\n\r\n getPosition: function ()\r\n {\r\n return _tweenDic;\r\n }\r\n};\r\n\r\nfunction onScroll(evt: Event){\r\n updateScrollTop();\r\n}\r\n\r\nfunction updateScrollTop(forceExecute?: boolean, specId?: string)\r\n{\r\n if (!forceExecute && _isLocking) return;\r\n if (!forceExecute && !self._isActive) return;\r\n\r\n var doc = document.documentElement;\r\n _scrollBound.left = (window.pageXOffset || doc.scrollLeft) - (doc.clientLeft || 0);\r\n _scrollBound.top = (window.pageYOffset || doc.scrollTop) - (doc.clientTop || 0);\r\n _scrollBound.width = $(window).width();\r\n\r\n // _scrollBound.height = $(window).height();\r\n _scrollBound.height = window.innerHeight;\r\n\r\n if (Utility.getMobileOperatingSystem() == \"iOS\") {\r\n _scrollBound.height = document.documentElement.clientHeight;\r\n }\r\n\r\n // console.log(_scrollBound.top);\r\n // console.log(\"t: \" + (window.pageYOffset || document.documentElement.scrollTop));\r\n\r\n _tweenDic.scrollTop = $(window).scrollTop();\r\n _tweenDic.scrollLeft = $(window).scrollLeft();\r\n\r\n //if(_cbOnScrolling) _cbOnScrolling.call(null, _scrollBound);\r\n var id, func;\r\n for (id in _listenerDic) {\r\n func = _listenerDic[id];\r\n if (specId) {\r\n if (specId === id) {\r\n func.call(null, _scrollBound);\r\n }\r\n }\r\n else {\r\n func.call(null, _scrollBound);\r\n }\r\n }\r\n};\r\n\r\nexport var ScrollListener = self;\r\n\r\n\r\n","/** Utility\r\n *\r\n * 2019/9/3 v0.0.17\r\n * 新增 Utility.realStringLength 方法\r\n * 新增 Utility.getMobileOperatingSystem 方法\r\n * 新增 PatternSamples[\"invoice\"] 發票號碼正規式\r\n *\r\n * 2019/12/12 v0.0.18\r\n * 新增 Utility.openWindowInCenter 方法\r\n * 新增 Utility.isWebview 方法, 判別是否是 webview 瀏覽器 (line / facebook app)\r\n *\r\n * 2020/07/05\r\n * 新增 detectIE 方法, 判別IE版本\r\n * \r\n * 2020/12/21\r\n * 語法整理\r\n * 新增 isMobile 方法, 判別是否為 mobile 平台\r\n * 抽離 PatternSamples 合集到另一個檔案\r\n * analysisUrl 方法改名為 isUrl\r\n * \r\n * 2021/03/25\r\n * 改寫成 typescript, 移至 sframe namespace\r\n * \r\n * 2021/11/02\r\n * 新增 copyTextToClipboard 方法, 複製文字到剪貼簿\r\n * \r\n * \r\n * 2023/4/5\r\n * 新增 adjustUrlParams 方法, 調整 url query\r\n * \r\n * **/\r\n\r\nvar _mobileSystem: string;\r\n\r\nlet self;\r\n\r\nlet Utility = self =\r\n{\r\n detectIE: function (): boolean | number\r\n {\r\n var ua = window.navigator.userAgent;\r\n\r\n var msie = ua.indexOf('MSIE ');\r\n if (msie > 0) {\r\n // IE 10 or older => return version number\r\n return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);\r\n }\r\n\r\n var trident = ua.indexOf('Trident/');\r\n if (trident > 0) {\r\n // IE 11 => return version number\r\n var rv = ua.indexOf('rv:');\r\n return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);\r\n }\r\n\r\n var edge = ua.indexOf('Edge/');\r\n if (edge > 0) {\r\n // Edge (IE 12+) => return version number\r\n return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);\r\n }\r\n\r\n // other browser\r\n return false;\r\n },\r\n\r\n /**\r\n * 檢查字串是否為網址\r\n * @param url 網址\r\n * @returns\r\n */\r\n isUrl: function (url: string): boolean\r\n {\r\n var pattern = /^((http[s]?|ftp):\\/)?\\/?([^:\\/\\s]+)((\\/\\w+)*\\/)([\\w\\-\\.]+[^#?\\s]+)(.*)?(#[\\w\\-]+)?$/;\r\n return Boolean(url.match(pattern));\r\n },\r\n\r\n /**\r\n * 取得當前當前網址路徑含檔名.副檔名\r\n * @returns \r\n */\r\n getPathWithFilename: function (): string\r\n {\r\n return window.location.href.replace(window.location.search, '').replace(window.location.hash, '').replace(\"?\", '');\r\n },\r\n\r\n /**\r\n * 取得網址路徑(不包含檔名)\r\n * @param url 網址\r\n * @returns \r\n */\r\n getPath: function (url?: string): string\r\n {\r\n if (!url) url = window.location.href;\r\n\r\n var string = url.indexOf('?') == -1 ? url : url.substr(0, url.indexOf('?'));\r\n\r\n if (string.indexOf('#') !== -1) {\r\n string = string.substr(0, string.indexOf('#'));\r\n }\r\n\r\n var array = string.split(\"/\");\r\n var lastPart = array[array.length - 1];\r\n if (lastPart.indexOf(\".\") !== -1) array.pop();\r\n\r\n string = array.join(\"/\");\r\n\r\n\r\n while (string.length && string.charAt(string.length - 1) == \"/\") {\r\n string = string.slice(0, string.length - 1);\r\n }\r\n\r\n string += \"/\";\r\n\r\n return string;\r\n },\r\n\r\n /**\r\n * 取得網址通訊協定(https, https ...)\r\n * @param url 網址\r\n * @returns \r\n */\r\n getProtocol: function (url: string): string\r\n {\r\n if (!url) url = window.location.href;\r\n return url.split(\"/\")[0];\r\n },\r\n\r\n /**\r\n * 網址參數 (此方法將快取一開始的網址, 如欲取得目前的網址參數, 請改用 getCurrentUrlParams)\r\n */\r\n urlParams: (function ()\r\n {\r\n return getUrlParams();\r\n\r\n }()) as { [key: string]: string },\r\n\r\n getCurrentUrlParams()\r\n {\r\n return getUrlParams();\r\n },\r\n\r\n replaceUrlParams(newQuery?: string, keepState: boolean = true)\r\n {\r\n let currentUrl = window.location.href.split(`?`)[0];\r\n // console.log(currentUrl);\r\n\r\n var newUrl = newQuery ? currentUrl + \"?\" + newQuery : currentUrl;\r\n keepState? window.history.replaceState({}, document.title, newUrl): window.history.pushState({}, document.title, newUrl);\r\n },\r\n\r\n adjustUrlParams(removingList?: string[], addingDic?: {[key:string]:string})\r\n {\r\n if (!window.history) return;\r\n\r\n let params = Utility.getCurrentUrlParams(),\r\n string = \"\",\r\n key,\r\n k,\r\n i = 0;\r\n\r\n for (key in params) {\r\n let flag = false;\r\n\r\n if (removingList) {\r\n for (k = 0; k < removingList.length; k++) {\r\n let removingKey: string = removingList[k];\r\n if (key === removingKey) flag = true;\r\n }\r\n }\r\n\r\n\r\n if (addingDic && addingDic[key]) flag = true;\r\n\r\n if (flag) continue;\r\n\r\n if (i === 0) {\r\n string += (\"?\" + key + \"=\" + params[key]);\r\n }\r\n else {\r\n string += (\"&\" + key + \"=\" + params[key]);\r\n }\r\n\r\n i++;\r\n }\r\n\r\n\r\n if (addingDic) {\r\n for (key in addingDic) {\r\n if (string === \"\") {\r\n string += (\"?\" + key + \"=\" + addingDic[key]);\r\n }\r\n else {\r\n string += (\"&\" + key + \"=\" + addingDic[key]);\r\n }\r\n }\r\n }\r\n\r\n var newUrl = Utility.getPathWithFilename() + string;\r\n window.history.replaceState({}, document.title, newUrl);\r\n\r\n return newUrl;\r\n },\r\n\r\n /**\r\n * @returns boolean, 當前網址是否為本機網址\r\n */\r\n isLocalhost: (): boolean =>\r\n {\r\n var address = window.location.toString().split(\"/\")[2];\r\n return (address == \"localhost\" || address.split(\".\")[0] == \"192\");\r\n },\r\n\r\n /**\r\n * \r\n * @returns boolean, 裝置是否為 ios\r\n */\r\n isiOS: function (): boolean\r\n {\r\n return [\r\n 'iPad Simulator',\r\n 'iPhone Simulator',\r\n 'iPod Simulator',\r\n 'iPad',\r\n 'iPhone',\r\n 'iPod'\r\n ].includes(navigator.platform)\r\n // iPad on iOS 13 detection\r\n || (navigator.userAgent.includes(\"Mac\") && \"ontouchend\" in document)\r\n },\r\n\r\n /**\r\n * 把字串中的全形字當兩個字元長度計算, 回應字串總長度\r\n * @param string\r\n * @returns \r\n */\r\n getRealStringLength: function (string: string): number\r\n {\r\n return string.replace(/[^\\x00-\\xff]/g, \"**\").length;\r\n },\r\n\r\n /**\r\n * 平台判定 (此語法版本可能過舊)\r\n * @returns \r\n */\r\n getMobileOperatingSystem: function ()\r\n {\r\n if (_mobileSystem) return _mobileSystem;\r\n\r\n var userAgent = navigator.userAgent || navigator.vendor;\r\n\r\n _mobileSystem = \"unknown\"\r\n\r\n if (/windows phone/i.test(userAgent)) {\r\n _mobileSystem = \"Windows Phone\";\r\n }\r\n\r\n if (/android/i.test(userAgent)) {\r\n _mobileSystem = \"Android\";\r\n }\r\n\r\n //@ts-ignore\r\n if (/iPad|iPhone|iPod/.test(userAgent) && !window.MSStream) {\r\n\r\n _mobileSystem = \"iOS\";\r\n }\r\n\r\n return _mobileSystem;\r\n },\r\n\r\n /**\r\n * @returns boolean, 裝置是否為 mobile\r\n */\r\n isMobile: function (): boolean\r\n {\r\n return (typeof window.orientation !== \"undefined\") || (navigator.userAgent.indexOf('IEMobile') !== -1);\r\n },\r\n\r\n /**\r\n * @returns boolean, 裝置是否為 app 內建瀏覽器(webview)?\r\n */\r\n isWebview: function (): boolean\r\n {\r\n var u = navigator.userAgent,\r\n ua = navigator.userAgent.toLowerCase(),\r\n weixinMatch = ua.match(/MicroMessenger/i),\r\n isLineApp = u.indexOf(\"Line\") > -1, // Line 內建瀏覽器\r\n isFbApp = u.indexOf(\"FBAV\") > -1, // FB App 內建瀏覽器\r\n isWeixinApp = weixinMatch !== null // 微信內建瀏覽器\r\n\r\n return !!(isLineApp || isFbApp || isWeixinApp);\r\n },\r\n\r\n\r\n /**\r\n * 在螢幕中央打開新視窗\r\n * @param url\r\n * @param title\r\n * @param w 視窗寬度\r\n * @param h 視窗高度\r\n */\r\n openWindowInCenter: function (url: string, title: string, w: number, h: number)\r\n {\r\n // Fixes dual-screen position Most browsers Firefox\r\n var dualScreenLeft = window.screenLeft != undefined ? window.screenLeft : window.screenX;\r\n var dualScreenTop = window.screenTop != undefined ? window.screenTop : window.screenY;\r\n\r\n var width = window.innerWidth ? window.innerWidth : document.documentElement.clientWidth ? document.documentElement.clientWidth : screen.width;\r\n var height = window.innerHeight ? window.innerHeight : document.documentElement.clientHeight ? document.documentElement.clientHeight : screen.height;\r\n\r\n var systemZoom = width / window.screen.availWidth;\r\n var left = (width - w) / 2 / systemZoom + dualScreenLeft;\r\n var top = (height - h) / 2 / systemZoom + dualScreenTop;\r\n //var string = ', width=' + w / systemZoom + ', height=' + h / systemZoom + ', top=' + top + ', left=' + left;\r\n var string = ', width=' + w + ', height=' + h + ', top=' + top + ', left=' + left;\r\n\r\n //var newWindow = window.open(url, title, 'scrollbars=yes' + string);\r\n var newWindow = window.open(url, title, \"toolbar=yes,location=yes,directories=no,status=no,menubar=yes,scrollbars=yes,resizable=yes, copyhistory=yes\" + string);\r\n\r\n // Puts focus on the newWindow \r\n ///@ts-ignore\r\n if (window.focus) newWindow.focus();\r\n },\r\n\r\n copyTextToClipboard(text: string, cb?: (success: boolean) => void)\r\n {\r\n if (!navigator.clipboard) {\r\n fallbackCopyTextToClipboard(text, cb);\r\n return;\r\n }\r\n navigator.clipboard.writeText(text).then(function ()\r\n {\r\n // console.log('Async: Copying to clipboard was successful!');\r\n if (cb) cb.call(null, true);\r\n }, function (err)\r\n {\r\n // console.error('Async: Could not copy text: ', err);\r\n if (cb) cb.call(null, false);\r\n });\r\n }\r\n};\r\n\r\nexport default Utility;\r\n\r\n\r\n\r\nfunction fallbackCopyTextToClipboard(text: string, cb?: (success: boolean) => void)\r\n{\r\n var textArea = document.createElement(\"textarea\");\r\n textArea.value = text;\r\n\r\n // Avoid scrolling to bottom\r\n textArea.style.top = \"-600px\";\r\n textArea.style.left = \"-600px\";\r\n // textArea.style.display = \"none\";\r\n textArea.style.position = \"fixed\";\r\n\r\n\r\n document.body.appendChild(textArea);\r\n textArea.focus();\r\n textArea.select();\r\n\r\n try {\r\n var successful = document.execCommand('copy');\r\n // var msg = successful ? 'successful' : 'unsuccessful';\r\n // console.log('Fallback: Copying text command was ' + msg);\r\n if (cb) cb.call(null, successful);\r\n\r\n } catch (err) {\r\n if (cb) cb.call(null, false);\r\n }\r\n\r\n document.body.removeChild(textArea);\r\n}\r\n\r\n\r\nfunction getUrlParams()\r\n{\r\n var url = window.location.href;\r\n \r\n var paramString = url.split(\"?\")[1];\r\n if (!paramString) { return {}; }\r\n paramString = paramString.split(\"#\")[0];\r\n var urlParams: { [key: string]: string } = {};\r\n var array = paramString.split(\"&\");\r\n\r\n for (var i = 0; i < array.length; i++) {\r\n var array2 = array[i].split(\"=\");\r\n urlParams[array2[0]] = decodeURIComponent(array2[1]);\r\n }\r\n\r\n return urlParams;\r\n}","import GS from \"../GlobalSetting\";\r\nimport { Viewport } from \"./Viewport\";\r\n\r\n\r\nconst MOBILE_WIDTH = 640;\r\nconst SCALE_WIDTH = 1280;\r\nconst MAX_WIDTH = 1920;\r\n\r\nlet ViewportRoot = new Viewport([MOBILE_WIDTH, SCALE_WIDTH, MAX_WIDTH]);\r\n\r\nexport enum ViewportIndex{\r\n mobile = 0,\r\n pc = 1\r\n}\r\n\r\nexport function getViewportName()\r\n{ \r\n return ViewportRoot.index === 0? \"mobile\": \"pc\";\r\n}\r\n\r\nexport default ViewportRoot;","import { Emitter } from \"strict-event-emitter\";\r\n\r\nexport class Viewport\r\n{\r\n /** 代表目前畫面寬度對應到哪個 ranges 設定(例如 index=0 表示目前畫面寬度介於 0~{ranges[0]} 之間的值) */\r\n index: number = -1;\r\n width: number = 0;\r\n height: number = 0;\r\n changed: boolean = false;\r\n isMajorChange: boolean = false;\r\n ranges: number[];\r\n // scrollbarWidth: number = 0;\r\n\r\n containerWidth: number = 0;\r\n containerHeight: number = 0;\r\n\r\n boundingRect: DOMRect;\r\n\r\n intervalId: number = -1;\r\n\r\n emitter: Emitter<{updated: [viewport: Viewport<{}>], majorChanged: [viewport: Viewport<{}>]}>;\r\n\r\n constructor(ranges?: number[])\r\n { \r\n this.ranges = ranges === undefined ? [640, 1200, 2000] : ranges;\r\n this.emitter = new Emitter();\r\n }\r\n\r\n update()\r\n {\r\n let oldIndex = this.index;\r\n\r\n this.width = window.innerWidth;\r\n this.height = window.innerHeight;\r\n\r\n for (var i = 0; i < this.ranges.length; i++) {\r\n let viewportWidth = this.ranges[i];\r\n if (this.width <= viewportWidth) {\r\n break;\r\n }\r\n }\r\n\r\n this.index = i;\r\n this.changed = (oldIndex !== this.index);\r\n this.isMajorChange = (this.changed && (oldIndex === 0 || this.index === 0)) || oldIndex === -1;\r\n\r\n // if(this.index === 0)\r\n // {\r\n // this.scrollbarWidth = 0;\r\n // }\r\n // else\r\n // {\r\n // this.scrollbarWidth = window.innerWidth - document.body.clientWidth;\r\n // }\r\n\r\n this.boundingRect = new DOMRect(0, 0, this.width, this.height);\r\n\r\n this.emitter.emit(\"updated\", this);\r\n if(this.isMajorChange) this.emitter.emit(\"majorChanged\", this);\r\n }\r\n\r\n test(v: TTT){\r\n console.log(v);\r\n }\r\n\r\n getScrollbarWidth()\r\n {\r\n return this.index === 0? 0: window.innerWidth - document.body.clientWidth;\r\n }\r\n\r\n setRegularUpdate(booleanOrDuration: Boolean | Number = 1, onSizeChanged?: Function)\r\n {\r\n let self = this;\r\n\r\n if (booleanOrDuration === false) {\r\n window.clearInterval(this.intervalId);\r\n }\r\n else {\r\n if (booleanOrDuration === true) booleanOrDuration = 1;\r\n\r\n let duration: number = booleanOrDuration === true ? 1 : booleanOrDuration as number;\r\n\r\n if (self.needUpdate()) onSizeChanged.call(null);\r\n\r\n this.intervalId = window.setInterval(() =>\r\n {\r\n if (self.needUpdate()) onSizeChanged.call(null);\r\n\r\n }, duration * 1000);\r\n }\r\n }\r\n\r\n rsetZoomLevel(width?: number): void\r\n {\r\n if (width === undefined) width = this.ranges[0];\r\n\r\n let clientWidth = screen.width,\r\n mobileWidth = width,\r\n scale = clientWidth / mobileWidth;\r\n\r\n $('meta[name=viewport]').remove();\r\n $('head').append('');\r\n\r\n $('meta[name=viewport]').remove();\r\n $('head').append('');\r\n }\r\n\r\n needUpdate(): boolean\r\n {\r\n return (this.width !== window.innerWidth || this.height !== window.innerHeight);\r\n }\r\n\r\n toString(): string\r\n {\r\n return \"w: \" + this.width + \", height: \" + this.height;\r\n }\r\n}"],"names":["registerPlugin","self","layoutOn","init","build","setApiPath","setting","apiPath","setApiExtension","apiExt","testEnv","setSimplateDelay","window","EZ","completeLinks","$","addEventListener","update","urlParams","layout","toggleClass","popup","isLayoutOn","preInitPage","initPage","active","emitter","addListener","changed","ext","index","html","attr","setupGtag","gaId","_gtag_id_","on","event","eventName","this","getAttribute","eventLabel","gtag","listenerId","$markers","totalMarkers","length","numTriggered","each","elem","_triggered","result","testDom","topInside","bottomInside","pageTitle","pagePath","removeListener","console","log","manualLoaded","$root","load","onload","img","find","$souces","sourceElem","setAttribute","dataset","src","call","ComponentBase","_componentDic","ShoppingPanel","StickBtnBuy","Components","bindScripts","seekAndBind","targetElem","catchSamples","$doms","componentName","obj","componentClass","removeAttribute","detach","$sample","clone","childElem","manualBind","_component","elemList","toArray","forEach","registComponents","dic","Object","assign","createElem","appendTo","$target","append","from","duration","opacity","seekComponentByName","seekComponent","seekComponentById","id","seekComponentByField","field","seekComponentByClass","className","query","error","relyOthers","$scrollWrapper","$pageContent","_oldScrollTop","_oldScrollLeft","coverColor","isImageOnLoading","PhotoViewer","instance","$content","$image","$btnPrev","preventDefault","changeIndex","currentIndex","$btnNext","showSinglePhoto","dataList","showPhoto","updateDots","Popups","to","$dotWrapper","empty","data","$dot","changeImage","gsap","killTweensOf","set","Image","css","updateSize","onerror","ViewportRoot","isOnStage","maxWidth","width","bleedX","maxHeight","height","bleedY","bound","Geom","caculateContain","ratio","delay","PopupBase","_isInit","_isNavOpen","isInit","resize","scale","_isScrollLocking","_scaleInMiddleMode","_contentScaleRate","scaleInMiddleMode","Emitter","scrollTo","y","offsetY","getNavHeight","vp","minWidth","ranges","newHeight","updateHeight","emit","toggleScrollLock","lockOn","scrollY","scrollX","_sendGtagEvents","_gtagEventName","_gtagEventLabel","_setupQuestions","$question","askIndex","isOpen","$ask","$answer","$answerWrapper","event_label","_isShoppingOpen","$shoppingContent","$shoppingTrigger","_resizeShopping","$pending","_isPending","autoClose_cover","EZAlert","close","alert","title","text","alertJSON","pending","cb","onComplete","autoClose","resolveAtStart","closePending","undefined","jsonObj","JSON","stringify","show","options","complexTitle","Error","theme","closeByCover","closeByX","detailMode","mode","cancelLabel","confirmLabel","noButtons","$text","$title","$complexTitle","innerHTML","isSingleLine","Promise","resolve","off","then","confirm","complexConfirm","outputOptions","popupId","autoClose_popup","autoClose_menu","popupAlign","toMe","_ez_popup_to_","$cover","$dropdownMenus","_popupTl","_isLocking","_currentPopup","_currentMenu","_setBackPopup","_popupDic","key","updateActive","prototype","hasOwnProperty","document","querySelector","closeMenu","isMajorChange","onMajorViewportChange","getInstance","popupName","targetPopup","setBackPopup","progress","ease","oldPopup","tl","timeline","x","add","addLabel","openMenu","position","align","offsetTop","offsetLeft","clearDropdownSetting","rect","getBoundingClientRect","top","completeMenu","left","dx","Math","max","getScrollbarWidth","openMenuAsPopup","$popup","string","setMinWidth","vpWidth","isActive","_ajv","AjvProxy","coerceTypes","addSchema","schema","name","getSchema","validate","schemaJson","jsonData","opts","schemaId","errors","message","dir","e","_testData","_apiResponseAfterfixs","_apiExtension","_apiPath","_method","_simulateDelay","_logSendingData","_fetchedPageData","ApiProxy","getCommonPageData","getPageData","getPageDataString","getElementById","jsonString","replace","m","g","validatePageData","parse","logPageData","quickCall","apiName","params","autoClosePending","op","callApi","catch","quickCall2","reject","testDataName","simDelay","method","async","completeWithError","sendSchema","properties","send","definitions","validatedResult","applyTestSendData","response","complete","setTimeout","useApiSchemaData","examples","exampleIndex","sendApi","afterFix","s","getAfterfix","sendingObj","url","crossDomain","type","dataType","contentType","ajax","done","fail","responseSchema","applyTestData","testData","getApiPath","path","setMethod","getMethod","setToken","token","setLogSendingData","b","resetTestData","reset","sendData","applySendData","setApiResponseAfterfix","StyleModes","Direction","_localSetting","logSendingData","_testSetting","ezpointToCash","value","floor","GS","ezpointRatio","pointToCash","priceToEzpoint","round","priceToPoint","getSportsVoucherBonus","amount","ceil","SPORTS_VOUCHER_BONUS_RATE","location","host","extend","i","v","navHeight","default","reviewMaxRating","search","keywordMaxLength","pageSize","getQueryUrl","queryString","search_page_path","DATE_FORMAT","DEFAULT_COUNTRY","_customStyleElem","Tools","createElement","isNumeric","str","isNaN","parseFloat","stringReplaceBetween","start","replaceString","substring","combineName","firstName","surname","match","createLazyLoadImage","formatDateString","dateString","format","moment","getAvatarName","r","$container","$elems","target","$elem","seekComponentElem","removeBetweenArrays","targetList","sourceList","source","splice","formatNumber","num","parseInt","toLocaleString","testRectOverlap","rectA","rectB","right","bottom","testRectOverlapY","addCustomStyle","styles","isMobile","addCustomStyle_2","isReplace","newHtml","scrollToElement","elemOrId","offset","mobile","pc","listToDic","list","splitText","dom","innerText","char","charDom","array","slice","charCodeAt","appendChild","push","parseBoolean","parseDate","addSpace","date","parseValue","valueType","updateValue","valueName","String","getFullName","test","getLocalStorageObj","objString","localStorage","getItem","saveLocalStorageObj","setItem","isLocalStorageAvailable","removeItem","shake","repeat","yoyo","clearProps","setInputFilter","textbox","inputFilter","errMsg","oldValue","oldSelectionStart","selectionStart","oldSelectionEnd","selectionEnd","setSelectionRange","containerWidth","containerHeight","contentWidth","contentHeight","contentRatio","caculateCover","tw","th","contentCenterBound","_listenerDic","_scrollBound","_tweenDic","scrollTop","scrollLeft","_isActive","func","onScroll","updateScrollTop","disactive","removeEventListener","topOffset","bottomOffset","boundTop","boundBottom","testDomFromMiddle","boundMiddle","bothInside","testDomContainScreenMiddle","screenMiddleY","targetTop","__speed","speed","dy","abs","min","onStart","onUpdate","specId","getPosition","evt","forceExecute","doc","documentElement","pageXOffset","clientLeft","pageYOffset","clientTop","innerHeight","getMobileOperatingSystem","clientHeight","ScrollListener","_mobileSystem","Utility","detectIE","ua","navigator","userAgent","msie","indexOf","rv","edge","isUrl","Boolean","getPathWithFilename","href","hash","getPath","substr","split","pop","join","charAt","getProtocol","getUrlParams","getCurrentUrlParams","replaceUrlParams","newQuery","keepState","currentUrl","newUrl","history","replaceState","pushState","adjustUrlParams","removingList","addingDic","k","flag","isLocalhost","address","toString","isiOS","includes","platform","getRealStringLength","vendor","MSStream","orientation","isWebview","u","weixinMatch","toLowerCase","isLineApp","isFbApp","openWindowInCenter","w","h","dualScreenLeft","screenLeft","screenX","dualScreenTop","screenTop","screenY","innerWidth","clientWidth","screen","systemZoom","availWidth","newWindow","open","focus","copyTextToClipboard","clipboard","writeText","err","textArea","style","body","select","successful","execCommand","removeChild","fallbackCopyTextToClipboard","paramString","array2","decodeURIComponent","ViewportIndex","intervalId","oldIndex","viewportWidth","boundingRect","DOMRect","setRegularUpdate","booleanOrDuration","onSizeChanged","clearInterval","needUpdate","setInterval","rsetZoomLevel","remove","getViewportName"],"sourceRoot":""}