{"version":3,"file":"promokit.js","sources":["../../src/util/removeSpace.js","../../src/util/gameName.js","../../src/trace/trace.js","../../src/util/isMobile.js","../../src/layer/js/layer.js","../../src/message/js/message-notice.js","../../src/message/js/message-confirm.js","../../src/message/js/message.js","../../src/message/js/message-landscape.js","../../src/util/trim.js","../../src/cookie/getcookie.js","../../src/cookie/setcookie.js","../../src/cookie/cookie.js","../../src/cookie/delcookie.js","../../src/util/animationFrame.js","../../src/player/js/player-youtube.js","../../src/player/js/player-video.js","../../src/player/js/util/gif-reader.js","../../src/player/js/player-gif.js","../../src/player/js/util/get-template.js","../../src/player/js/util/loader-player.js","../../src/player/js/player.js","../../src/sequenceplayer/js/sequenceplayer.js","../../src/util/environment.js","../../src/preloader/js/image-loader.js","../../src/preloader/js/video-loader.js","../../src/preloader/js/youtube-loader.js","../../src/preloader/js/preloader.js","../../src/util/loadJs.js","../../src/share/js/facebook.js","../../src/share/js/twitter.js","../../src/share/js/kakaostory.js","../../src/share/js/kakaotalk.js","../../src/share/js/line.js","../../src/util/isOs.js","../../src/share/js/copyurl.js","../../src/cnb/cnb.js","../../src/share/js/share.js","../../src/remote/js/remote.js","../../src/plugin/js/plugin.js","../../src/swipers/js/swipers.js","../../src/coupon/coupon.js","../../src/util/util.js","../../src/promokit.js","../../src/comment/comment.js","../../src/util/loadCss.js"],"sourcesContent":["/**\n * 공백 제거\n * @param str\n * @returns {*|void|string|XML}\n */\n\nconst removeSpace = (str) =>{\n return str.replace(/\\s/gi, '');\n};\n\nexport default removeSpace;","/**\n * get game name\n * @param url\n * @returns {*}\n */\nconst getGameName = (url = location.href) =>{\n let gameName = '';\n\n if(/aion\\.plaync\\.com/.test(url)) {\n gameName = {\n 'en': 'aion',\n 'ko': '아이온'\n };\n }\n\n if(/lineage\\.plaync\\.com/.test(url)) {\n gameName = {\n 'en': 'lineage',\n 'ko': '리니지'\n };\n }\n\n if(/lineage2\\.plaync\\.com/.test(url)) {\n gameName = {\n 'en': 'lineage2',\n 'ko': '리니지2'\n };\n }\n\n if(/lineage2\\.plaync\\.com\\/classic/.test(url) || /lineage2\\.plaync\\.com\\/promo\\/lineage2classic/.test(url)) {\n gameName = {\n 'en': 'lineage2classic',\n 'ko': '리니지2클래식'\n };\n }\n\n if(/bns\\.plaync\\.com/.test(url)) {\n gameName = {\n 'en': 'bns',\n 'ko': '블소'\n };\n }\n\n if(/event\\.plaync\\.com/.test(url)) {\n gameName = {\n 'en': 'event',\n 'ko': '통합이벤트'\n };\n }\n\n return gameName;\n};\n\nexport default getGameName;\n","import removespace from '../util/removeSpace';\nimport gamename from '../util/gameName';\n\nlet pageTitle = removespace(document.title).split(':plaync')[0];\n\n/**\n * trk click Trace logger\n * @param clickTraceStr\n */\nconst trace = (clickTraceStr) =>{\n if(typeof _trk_clickTrace !== 'function') {\n window._trk_clickTrace = function(param1, param2){\n console.log(`_trk_clickTrace('${param1}','${param2}')`);\n };\n }\n\n _trk_clickTrace('EVT', clickTraceStr);\n};\n\n$(document).on('click.promo.trace', '[data-trace]', function(){\n trace(`/${gamename().ko}/이벤트프로모션/${pageTitle}/${$(this).attr('data-trace')}`);\n});\n\nexport default trace;","/**\n * 모바일 브라우저 인지 체크\n * @param agent\n * @returns {boolean}\n */\nconst isMobile = (agent = navigator.userAgent.toLowerCase()) =>{\n return /(android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini)/i.test(agent);\n};\n\nexport default isMobile;","import isMobile from \"../../util/isMobile\";\n\nexport class Layer {\n constructor(options){\n this.config = {\n ...{\n \"el\": \"\",\n \"name\": \"promo-layer\",\n \"duration\": 300,\n \"fade\": false,\n \"esc\": false,\n \"padding\": 20,\n \"dim\": false,\n \"dimClickClose\": false,\n \"onStartOpen\": false,\n \"onStartClose\": false,\n \"onCompleteOpen\": false,\n \"onCompleteClose\": false\n }, ...options\n };\n\n this.state = {\n isActive: false,\n openTarget: $(this.config.el),\n offsetTop: 0\n };\n\n this.DOM = {\n HTML: $(\"html\"),\n BODY: $(\"body\"),\n LAYER: false,\n LAYERCONTENTS: false,\n CONTENTS: false,\n BACKDROP: false,\n TEMPLATE: false\n };\n\n this.EVENT = {\n OPENSTART: \"layeropenstart\",\n OPENEND: \"layeropenend\",\n CLOSESTART: \"layerclosestart\",\n CLOSEEND: \"layercloseend\"\n };\n\n this.open = this.open.bind(this);\n this.close = this.close.bind(this);\n\n this._init();\n }\n\n _init(){\n this._setLayer();\n this._setLayerContents($(`${this.config.el}`));\n this._setLayerBackDrop();\n this._addEvent();\n }\n\n _setLayer(){\n\n this.DOM.LAYER = $(`
\n
\n
\n
`);\n\n if(isMobile()){\n this.DOM.LAYER.addClass(\"mobile\");\n }\n\n this.DOM.LAYER = $(this.DOM.LAYER).appendTo(\"body\");\n }\n\n _setLayerContents(contents){\n this.DOM.LAYERCONTENTS = this.DOM.LAYER.find(`.${this.config.name}__contents`);\n this.DOM.LAYERCONTENTS.empty();\n this.DOM.LAYERCONTENTS.append(contents);\n this.DOM.CONTENTS = $(contents);\n\n this.DOM.CONTENTS.css({\n \"margin-top\": `${this.config.padding}px`,\n \"margin-bottom\": `${this.config.padding}px`\n });\n }\n\n _setLayerBackDrop(){\n this.DOM.BACKDROP = $(this.DOM.LAYER).find(`.${this.config.name}__dim`);\n }\n\n _addEvent(){\n if(this.config.dimClickClose){\n\n $(this.DOM.LAYER).find(`.${this.config.name}__contents`).on(\"click.ui.layer\", (e) =>{\n if($(e.target).is(`.${this.config.name}__contents`)){\n this.close();\n }\n });\n }\n\n if(this.config.esc){\n $(document).on(\"keyup.ui.layer\", (e) =>{\n if(e.keyCode === 27){\n this.close();\n }\n });\n }\n\n }\n\n _toggleLayer(isActive, event){\n if(isActive){\n this.DOM.LAYERCONTENTS.removeClass(`${this.config.name}__contents_active`);\n\n this.DOM.LAYER.fadeOut(this.config.fade ? this.config.duration : 0, () =>{\n this.DOM.HTML.removeClass(`${this.config.name}_open`);\n this.DOM.BODY.removeClass(`${this.config.name}_open`);\n $(\"html, body\").scrollTop(this.state.offsetTop);\n this.DOM.LAYER.trigger(event);\n });\n\n return;\n }\n\n setTimeout(() =>{\n this.DOM.LAYERCONTENTS.addClass(`${this.config.name}__contents_active`);\n }, 1);\n\n let htmlTop = this.DOM.HTML.scrollTop();\n let bodyTop = this.DOM.BODY.scrollTop();\n\n if(htmlTop < 1 && bodyTop < 0){\n this.state.offsetTop = 0;\n } else {\n this.state.offsetTop = htmlTop > 0 ? htmlTop : bodyTop;\n }\n\n this.DOM.HTML.addClass(`${this.config.name}_open`);\n this.DOM.BODY.addClass(`${this.config.name}_open`);\n\n this.DOM.LAYER.fadeIn(this.config.fade ? this.config.duration : 0, () =>{\n $(window).trigger(\"resize\");\n this.DOM.LAYER.trigger(event);\n });\n }\n\n _toggleBackdrop(isActive){\n if(isActive){\n this.DOM.BACKDROP.fadeOut(this.config.fade ? this.config.duration : 0);\n return;\n }\n\n this.DOM.BACKDROP.fadeIn(this.config.fade ? this.config.duration : 0);\n }\n\n open(contents){\n contents && this._setLayerContents(contents);\n\n if(this.state.isActive) return;\n this.state.isActive = true;\n this.DOM.LAYER.trigger(this.EVENT.OPENSTART);\n this._toggleLayer(false, this.EVENT.OPENEND);\n this.config.dim && this._toggleBackdrop(false);\n window.activeLayer = this;\n }\n\n close(){\n if(!this.state.isActive) return;\n this.state.isActive = false;\n this.DOM.LAYER.trigger(this.EVENT.CLOSESTART);\n this._toggleLayer(true, this.EVENT.CLOSEEND);\n this.config.dim && this._toggleBackdrop(true);\n }\n\n on(event, callback){\n this.DOM.LAYER.on(event, callback);\n }\n\n off(event){\n this.DOM.LAYER.off(event);\n }\n}\n\nlet layerMap = {};\nlet openedLayerId = \"\";\n\n$(\"[data-layer='open']\").each(function (){\n let id = $(this)[0].hash || $(this).data(\"href\");\n $(this).data(\"layerId\", id);\n\n layerMap[id] = new Layer({\n \"el\": id,\n \"fade\": true,\n \"esc\": true,\n \"dim\": true,\n \"dimClickClose\": true\n });\n});\n\nlet close = () =>{\n layerMap[openedLayerId].close();\n};\n\nlet open = (id) =>{\n openedLayerId = id;\n window.activeLayer && window.activeLayer.close();\n layerMap[id].open();\n};\n\n$(document).on(\"click.promo.layer\", \"[data-layer='open']\", function (e){\n e.preventDefault();\n window.activeLayer && window.activeLayer.close();\n open($(this).data(\"layerId\"));\n});\n\n$(document).on(\"click.promo.layer\", \"[data-layer='close']\", function (e){\n e.preventDefault();\n close();\n});\n\nexport let layer = {\n open,\n close\n};","import {Layer} from '../../layer/js/layer';\n\nclass MessageNotice extends Layer {\n constructor(options){\n super(options);\n this.resolve = false;\n this.addEvent();\n }\n\n openMessage(msg = '메세지를 입력해주세요.', resolve){\n const template = `
\n
\n
\n

${msg}

\n
\n \n
\n \n
\n
\n
`;\n\n this.resolve = resolve;\n this.open(template);\n }\n\n closeMessage(run){\n run && run();\n this.resolve = false;\n this.close();\n }\n\n addEvent(){\n $(document).on('click', '.message__button--check', (e) =>{\n e.preventDefault();\n this.closeMessage(this.resolve);\n });\n }\n}\n\nexport default MessageNotice;\n","import {Layer} from '../../layer/js/layer';\n\nclass MessageConfirm extends Layer {\n constructor(options){\n super(options);\n this.resolve = false;\n this.reject = false;\n this.addEvent();\n }\n\n openConfirm(msg = '메세지를 입력해주세요.', resolve, reject){\n const template = `
\n
\n
\n

${msg}

\n
\n \n
\n \n \n
\n
\n
`;\n\n this.resolve = resolve;\n this.reject = reject;\n\n this.open(template);\n }\n\n closeConfirm(run){\n run && run();\n this.resolve = false;\n this.reject = false;\n this.close();\n }\n\n addEvent(){\n $(document).on('click', '.message__button--cancel', (e) =>{\n e.preventDefault();\n this.closeConfirm(this.reject);\n });\n\n $(document).on('click', '.message__button--confirm', (e) =>{\n e.preventDefault();\n this.closeConfirm(this.resolve);\n });\n }\n}\n\nexport default MessageConfirm;\n","import MessageNotice from './message-notice';\nimport MessageConfirm from './message-confirm';\nimport messageLandscape from './message-landscape';\nimport isMobile from '../../util/isMobile';\n\nisMobile() && messageLandscape();\n\nconst message = new MessageNotice({\n 'data': '',\n 'fade': true,\n 'esc': true,\n 'dim': true\n});\n\nconst confirm = new MessageConfirm({\n 'data': '',\n 'fade': true,\n 'esc': true,\n 'dim': true\n});\n\nexport const openMessage = (str, resolve) => {\n message.openMessage(str, resolve);\n};\n\nexport const closeMessage = () => {\n message.closeMessage();\n};\n\nexport const openConfirm = (str, resolve, reject) => {\n confirm.openConfirm(str, resolve, reject);\n};\n\nexport const closeConfirm = (reject) => {\n confirm.closeConfirm(reject);\n};\n\n$(document).on('click.promo.alert', '[data-alert]', function(e) {\n e.preventDefault();\n let alertMessage = $(this).attr('data-alert').replace(/\\\\n/, '\\n');\n alert(alertMessage);\n});\n\n$(document).on('click.promo.message', '[data-message]', function(e) {\n e.preventDefault();\n let str = $(this).attr('data-message').replace(/\\\\n/, '\\n');\n message.openMessage(str);\n});\n","const template = `
\n
\n

세로 모드만 지원되는 페이지 입니다.

\n

화면을 세로로 전환시켜주세요.

\n
\n
`;\n\nconst messageLandscape = () =>{\n $('body').append(template);\n};\n\nexport default messageLandscape","/**\n * 문자 앞 뒤 공백 제거\n * @param str\n * @returns {string|XML}\n */\nconst trim = (str) =>{\n if(String.prototype.trim) {\n return str.trim();\n }\n\n return str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n};\n\nexport default trim;","/**\n * 브라우저 쿠키 추출\n * @param key\n * @returns {*}\n */\nconst getCookie = (key) =>{\n if(!document.cookie) {\n return false;\n }\n\n let cookies = document.cookie.replace(/\\s+/gi, '').split(\";\");\n\n for(let i = 0, compare, length = cookies.length; i < length; i++) {\n compare = cookies[i].split(\"=\");\n if(key === compare[0]) {\n return compare [1];\n }\n }\n};\n\nexport default getCookie;","/**\n * 브라우저 쿠키 설정\n * @param key\n * @param value\n * @param expires ( Number:1~365, String: '2017/12/23 23:59:59', Object:{'day': 1, 'hour': 23, 'min': 59, 'sec': 59} )\n */\nconst setCookie = (key, value, expires = 1) =>{\n let now = new Date();\n\n switch(typeof expires) {\n case 'number':\n now.setDate(now.getDate() + expires);\n break;\n\n case 'string':\n let end = new Date(expires) - now;\n now.setDate(now.getDate() + Math.floor(( end / (1000 * 60 * 60 * 24))));\n now.setHours(now.getHours() + Math.floor(( end % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)));\n now.setMinutes(now.getMinutes() + Math.floor(( end % (1000 * 60 * 60)) / (1000 * 60)));\n now.setSeconds(now.getSeconds() + Math.floor(( end % (1000 * 60)) / 1000));\n break;\n\n case 'object':\n now.setDate(now.getDate() + expires.day);\n now.setHours(now.getHours() + expires.hour);\n now.setMinutes(now.getMinutes() + expires.min);\n now.setSeconds(now.getSeconds() + expires.sec);\n break;\n }\n\n document.cookie = key + '=' + value + ';path=/;' + 'domain=' + document.domain.substring(document.domain.indexOf(\".plaync\") + 1) + ';expires=' + now.toUTCString();\n};\n\nexport default setCookie;","import trim from '../util/trim';\nimport getcookie from './getcookie';\nimport setcookie from './setcookie';\nimport delcookie from './delcookie';\n\n$(document).on('click.promo.cookie', '[data-cookie]', function(e) {\n e.preventDefault();\n\n setcookie($(this).attr('data-cookie').split(',')[0], $(this).attr('data-cookie').split(',')[1], !!$(this).attr('data-cookie').split(',')[2] ? Number($(this).attr('data-cookie').split(',')[2]) : 1);\n\n if ($(this).attr('data-redirect')) {\n document.location.href = $(this).attr('data-redirect');\n }\n});\n\nexport default {\n getcookie,\n setcookie,\n delcookie\n};\n","import setcookie from './setcookie';\n\n/**\n * 브라우저 쿠키 삭제\n * @param key\n */\nconst delCookie = (key) =>{\n if(!document.cookie) {\n return;\n }\n\n setcookie(key, null, -1);\n};\n\nexport default delCookie;","window.requestAnimationFrame = window.requestAnimationFrame\n || window.mozRequestAnimationFrame\n || window.webkitRequestAnimationFrame\n || window.msRequestAnimationFrame\n || function(f){\n return setTimeout(f, 1000 / 60)\n };\n\nwindow.cancelAnimationFrame = window.cancelAnimationFrame\n || window.mozCancelAnimationFrame\n || function(requestID){\n clearTimeout(requestID)\n };\n\nclass AnimationFrame {\n constructor(animate, fps = 60){\n this.requestID = 0;\n this.fps = fps;\n this.animate = animate;\n }\n\n start(){\n let now;\n let delta;\n let loop;\n let then = Date.now();\n\n const interval = 1000 / this.fps;\n\n if(this.fps < 60) {\n loop = () =>{\n this.requestID = requestAnimationFrame(loop);\n now = Date.now();\n delta = now - then;\n if(delta > interval) {\n then = now - (delta % interval);\n this.animate();\n }\n };\n } else {\n loop = () =>{\n this.requestID = requestAnimationFrame(loop);\n this.animate();\n };\n }\n\n this.requestID = requestAnimationFrame(loop);\n }\n\n stop(){\n cancelAnimationFrame(this.requestID);\n }\n}\n\nexport default AnimationFrame;","class YoutubePlayer {\n constructor(props, template) {\n this.context = props.context;\n this.context.append(template);\n\n this.context.find('.player__context').attr('id', props.config.playerId);\n props.config.hideLoading || props.context.find('.player__loading-spinner').addClass('player__loading-spinner--show');\n\n this.source = new window.YT.Player(props.config.playerId, {\n width: '100%',\n height: '100%',\n videoId: props.config.videoId,\n playerVars: {\n modestbranding: 1,\n rel: 0,\n showinfo: 0,\n controls: 0,\n playsinline: 1,\n autoplay: props.config.autoPlay === true ? 1 : 0,\n loop: props.config.loop === true ? 1 : 0,\n playlist: props.config.loop === true ? props.config.videoId : '',\n },\n });\n\n this.oldEvent = -1;\n this.source.addEventListener('onReady', () => this._handleReady());\n }\n\n _setEvent() {\n const Event = {\n 0: 'end',\n 1: 'play',\n 2: 'pause'\n };\n\n this.source.addEventListener('onStateChange', e => {\n if (e.data === 3 || e.data === this.oldEvent) {\n return;\n }\n\n this.oldEvent = e.data;\n\n let eventName = Event[`${e.data}`];\n eventName && this.context.trigger(eventName);\n });\n }\n\n _handleReady() {\n this.context.trigger('canplay');\n this._setEvent();\n }\n\n play() {\n this.source.playVideo();\n }\n\n stop() {\n this.source.stopVideo();\n }\n\n pause() {\n this.source.pauseVideo();\n }\n\n mute() {\n this.source.mute();\n }\n\n unMute() {\n this.source.unMute();\n }\n\n seek(t) {\n this.source.seekTo(t);\n }\n\n getDuration() {\n return this.source.getDuration();\n }\n\n getCurrent() {\n return this.source.getCurrentTime();\n }\n}\n\nexport default YoutubePlayer;","class VideoPlayer {\n constructor(props, template) {\n this.context = props.context;\n this.context.append(template);\n\n props.config.hideLoading || props.context.find('.player__loading-spinner').addClass('player__loading-spinner--show');\n\n this.source = this.context.find(`#${props.config.playerId}`)[0];\n\n $(this.source).on('canplaythrough', () => this._handleReady());\n\n this.source.load();\n }\n\n _setEvent() {\n $(this.source).on('ended', () => {\n this.context.trigger('end');\n });\n\n $(this.source).on('play', () => {\n this.context.trigger('play');\n });\n\n $(this.source).on('timeupdate', () => {\n this.context.trigger('timeupdate');\n });\n\n $(this.source).on('pause', () => {\n this.context.trigger('pause');\n });\n\n $(this.source).on('durationchange', () => {\n this.context.trigger('durationchange');\n });\n }\n\n _handleReady() {\n $(this.source).off('canplaythrough');\n this.context.trigger('canplay');\n this._setEvent();\n }\n\n play() {\n this.source.play();\n }\n\n stop() {\n this.source.pause();\n this.source.currentTime = 0;\n this.context.trigger('stop');\n }\n\n pause() {\n this.source.pause();\n }\n\n mute() {\n this.source.muted = true;\n }\n\n unMute() {\n this.source.muted = false;\n }\n\n seek(t) {\n this.source.currentTime = t;\n }\n\n getDuration() {\n return this.source.duration;\n }\n\n getCurrent() {\n return this.source.currentTime;\n }\n}\n\nexport default VideoPlayer;","// (c) Dean McNamee , 2013.\n//\n// https://github.com/deanm/omggif\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to\n// deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n// sell copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n// IN THE SOFTWARE.\n//\n// omggif is a JavaScript implementation of a GIF 89a encoder and decoder,\n// including animation and compression. It does not rely on any specific\n// underlying system, so should run in the browser, Node, or Plask.\n\nexport function GifReader(buf){\n var p = 0;\n\n // - Header (GIF87a or GIF89a).\n if(buf[p++] !== 0x47 || buf[p++] !== 0x49 || buf[p++] !== 0x46 ||\n buf[p++] !== 0x38 || (buf[p++] + 1 & 0xfd) !== 0x38 || buf[p++] !== 0x61) {\n throw \"Invalid GIF 87a/89a header.\";\n }\n\n // - Logical Screen Descriptor.\n var width = buf[p++] | buf[p++] << 8;\n var height = buf[p++] | buf[p++] << 8;\n var pf0 = buf[p++]; // .\n var global_palette_flag = pf0 >> 7;\n var num_global_colors_pow2 = pf0 & 0x7;\n var num_global_colors = 1 << (num_global_colors_pow2 + 1);\n var background = buf[p++];\n buf[p++]; // Pixel aspect ratio (unused?).\n\n var global_palette_offset = null;\n\n if(global_palette_flag) {\n global_palette_offset = p;\n p += num_global_colors * 3; // Seek past palette.\n }\n\n var no_eof = true;\n\n var frames = [];\n\n var delay = 0;\n var transparent_index = null;\n var disposal = 0; // 0 - No disposal specified.\n var loop_count = null;\n\n this.width = width;\n this.height = height;\n\n while(no_eof && p < buf.length) {\n switch(buf[p++]) {\n case 0x21: // Graphics Control Extension Block\n switch(buf[p++]) {\n case 0xff: // Application specific block\n // Try if it's a Netscape block (with animation loop counter).\n if(buf[p] !== 0x0b || // 21 FF already read, check block size.\n // NETSCAPE2.0\n buf[p + 1] == 0x4e && buf[p + 2] == 0x45 && buf[p + 3] == 0x54 &&\n buf[p + 4] == 0x53 && buf[p + 5] == 0x43 && buf[p + 6] == 0x41 &&\n buf[p + 7] == 0x50 && buf[p + 8] == 0x45 && buf[p + 9] == 0x32 &&\n buf[p + 10] == 0x2e && buf[p + 11] == 0x30 &&\n // Sub-block\n buf[p + 12] == 0x03 && buf[p + 13] == 0x01 && buf[p + 16] == 0) {\n p += 14;\n loop_count = buf[p++] | buf[p++] << 8;\n p++; // Skip terminator.\n } else { // We don't know what it is, just try to get past it.\n p += 12;\n while(true) { // Seek through subblocks.\n var block_size = buf[p++];\n if(block_size === 0) break;\n p += block_size;\n }\n }\n break;\n\n case 0xf9: // Graphics Control Extension\n if(buf[p++] !== 0x4 || buf[p + 4] !== 0)\n throw \"Invalid graphics extension block.\";\n var pf1 = buf[p++];\n delay = buf[p++] | buf[p++] << 8;\n transparent_index = buf[p++];\n if((pf1 & 1) === 0) transparent_index = null;\n disposal = pf1 >> 2 & 0x7;\n p++; // Skip terminator.\n break;\n\n case 0xfe: // Comment Extension.\n while(true) { // Seek through subblocks.\n var block_size = buf[p++];\n if(block_size === 0) break;\n // console.log(buf.slice(p, p+block_size).toString('ascii'));\n p += block_size;\n }\n break;\n\n default:\n throw \"Unknown graphic control label: 0x\" + buf[p - 1].toString(16);\n }\n break;\n\n case 0x2c: // Image Descriptor.\n var x = buf[p++] | buf[p++] << 8;\n var y = buf[p++] | buf[p++] << 8;\n var w = buf[p++] | buf[p++] << 8;\n var h = buf[p++] | buf[p++] << 8;\n var pf2 = buf[p++];\n var local_palette_flag = pf2 >> 7;\n var interlace_flag = pf2 >> 6 & 1;\n var num_local_colors_pow2 = pf2 & 0x7;\n var num_local_colors = 1 << (num_local_colors_pow2 + 1);\n var palette_offset = global_palette_offset;\n var has_local_palette = false;\n if(local_palette_flag) {\n var has_local_palette = true;\n palette_offset = p; // Override with local palette.\n p += num_local_colors * 3; // Seek past palette.\n }\n\n var data_offset = p;\n\n p++; // codesize\n while(true) {\n var block_size = buf[p++];\n if(block_size === 0) break;\n p += block_size;\n }\n\n frames.push({\n x: x, y: y, width: w, height: h,\n has_local_palette: has_local_palette,\n palette_offset: palette_offset,\n data_offset: data_offset,\n data_length: p - data_offset,\n transparent_index: transparent_index,\n interlaced: !!interlace_flag,\n delay: delay,\n disposal: disposal\n });\n break;\n\n case 0x3b: // Trailer Marker (end of file).\n no_eof = false;\n break;\n\n default:\n throw \"Unknown gif block: 0x\" + buf[p - 1].toString(16);\n }\n }\n\n this.numFrames = function(){\n return frames.length;\n };\n\n this.loopCount = function(){\n return loop_count;\n };\n\n this.frameInfo = function(frame_num){\n if(frame_num < 0 || frame_num >= frames.length)\n throw \"Frame index out of range.\";\n return frames[frame_num];\n };\n\n this.decodeAndBlitFrameRGBA = function(frame_num, pixels){\n var frame = this.frameInfo(frame_num);\n var num_pixels = frame.width * frame.height;\n var index_stream = new Uint8Array(num_pixels); // At most 8-bit indices.\n GifReaderLZWOutputIndexStream(\n buf, frame.data_offset, index_stream, num_pixels);\n var palette_offset = frame.palette_offset;\n\n // NOTE(deanm): It seems to be much faster to compare index to 256 than\n // to === null. Not sure why, but CompareStub_EQ_STRICT shows up high in\n // the profile, not sure if it's related to using a Uint8Array.\n var trans = frame.transparent_index;\n if(trans === null) trans = 256;\n\n // We are possibly just blitting to a portion of the entire frame.\n // That is a subrect within the framerect, so the additional pixels\n // must be skipped over after we finished a scanline.\n var framewidth = frame.width;\n var framestride = width - framewidth;\n var xleft = framewidth; // Number of subrect pixels left in scanline.\n\n // Output indicies of the top left and bottom right corners of the subrect.\n var opbeg = ((frame.y * width) + frame.x) * 4;\n var opend = ((frame.y + frame.height) * width + frame.x) * 4;\n var op = opbeg;\n\n var scanstride = framestride * 4;\n\n // Use scanstride to skip past the rows when interlacing. This is skipping\n // 7 rows for the first two passes, then 3 then 1.\n if(frame.interlaced === true) {\n scanstride += width * 4 * 7; // Pass 1.\n }\n\n var interlaceskip = 8; // Tracking the row interval in the current pass.\n\n for(var i = 0, il = index_stream.length; i < il; ++i) {\n var index = index_stream[i];\n\n if(xleft === 0) { // Beginning of new scan line\n op += scanstride;\n xleft = framewidth;\n if(op >= opend) { // Catch the wrap to switch passes when interlacing.\n scanstride = framestride * 4 + width * 4 * (interlaceskip - 1);\n // interlaceskip / 2 * 4 is interlaceskip << 1.\n op = opbeg + (framewidth + framestride) * (interlaceskip << 1);\n interlaceskip >>= 1;\n }\n }\n\n if(index === trans) {\n op += 4;\n } else {\n var r = buf[palette_offset + index * 3];\n var g = buf[palette_offset + index * 3 + 1];\n var b = buf[palette_offset + index * 3 + 2];\n pixels[op++] = r;\n pixels[op++] = g;\n pixels[op++] = b;\n pixels[op++] = 255;\n }\n --xleft;\n }\n };\n}\n\nfunction GifReaderLZWOutputIndexStream(code_stream, p, output, output_length){\n var min_code_size = code_stream[p++];\n\n var clear_code = 1 << min_code_size;\n var eoi_code = clear_code + 1;\n var next_code = eoi_code + 1;\n\n var cur_code_size = min_code_size + 1; // Number of bits per code.\n // NOTE: This shares the same name as the encoder, but has a different\n // meaning here. Here this masks each code coming from the code stream.\n var code_mask = (1 << cur_code_size) - 1;\n var cur_shift = 0;\n var cur = 0;\n\n var op = 0; // Output pointer.\n\n var subblock_size = code_stream[p++];\n\n // TODO(deanm): Would using a TypedArray be any faster? At least it would\n // solve the fast mode / backing store uncertainty.\n // var code_table = Array(4096);\n var code_table = new Int32Array(4096); // Can be signed, we only use 20 bits.\n\n var prev_code = null; // Track code-1.\n\n while(true) {\n // Read up to two bytes, making sure we always 12-bits for max sized code.\n while(cur_shift < 16) {\n if(subblock_size === 0) break; // No more data to be read.\n\n cur |= code_stream[p++] << cur_shift;\n cur_shift += 8;\n\n if(subblock_size === 1) { // Never let it get to 0 to hold logic above.\n subblock_size = code_stream[p++]; // Next subblock.\n } else {\n --subblock_size;\n }\n }\n\n // TODO(deanm): We should never really get here, we should have received\n // and EOI.\n if(cur_shift < cur_code_size)\n break;\n\n var code = cur & code_mask;\n cur >>= cur_code_size;\n cur_shift -= cur_code_size;\n\n // TODO(deanm): Maybe should check that the first code was a clear code,\n // at least this is what you're supposed to do. But actually our encoder\n // now doesn't emit a clear code first anyway.\n if(code === clear_code) {\n // We don't actually have to clear the table. This could be a good idea\n // for greater error checking, but we don't really do any anyway. We\n // will just track it with next_code and overwrite old entries.\n\n next_code = eoi_code + 1;\n cur_code_size = min_code_size + 1;\n code_mask = (1 << cur_code_size) - 1;\n\n // Don't update prev_code ?\n prev_code = null;\n continue;\n } else if(code === eoi_code) {\n break;\n }\n\n // We have a similar situation as the decoder, where we want to store\n // variable length entries (code table entries), but we want to do in a\n // faster manner than an array of arrays. The code below stores sort of a\n // linked list within the code table, and then \"chases\" through it to\n // construct the dictionary entries. When a new entry is created, just the\n // last byte is stored, and the rest (prefix) of the entry is only\n // referenced by its table entry. Then the code chases through the\n // prefixes until it reaches a single byte code. We have to chase twice,\n // first to compute the length, and then to actually copy the data to the\n // output (backwards, since we know the length). The alternative would be\n // storing something in an intermediate stack, but that doesn't make any\n // more sense. I implemented an approach where it also stored the length\n // in the code table, although it's a bit tricky because you run out of\n // bits (12 + 12 + 8), but I didn't measure much improvements (the table\n // entries are generally not the long). Even when I created benchmarks for\n // very long table entries the complexity did not seem worth it.\n // The code table stores the prefix entry in 12 bits and then the suffix\n // byte in 8 bits, so each entry is 20 bits.\n\n var chase_code = code < next_code ? code : prev_code;\n\n // Chase what we will output, either {CODE} or {CODE-1}.\n var chase_length = 0;\n var chase = chase_code;\n while(chase > clear_code) {\n chase = code_table[chase] >> 8;\n ++chase_length;\n }\n\n var k = chase;\n\n var op_end = op + chase_length + (chase_code !== code ? 1 : 0);\n if(op_end > output_length) {\n console.log(\"Warning, gif stream longer than expected.\");\n return;\n }\n\n // Already have the first byte from the chase, might as well write it fast.\n output[op++] = k;\n\n op += chase_length;\n var b = op; // Track pointer, writing backwards.\n\n if(chase_code !== code) // The case of emitting {CODE-1} + k.\n output[op++] = k;\n\n chase = chase_code;\n while(chase_length--) {\n chase = code_table[chase];\n output[--b] = chase & 0xff; // Write backwards.\n chase >>= 8; // Pull down to the prefix code.\n }\n\n if(prev_code !== null && next_code < 4096) {\n code_table[next_code++] = prev_code << 8 | k;\n // TODO(deanm): Figure out this clearing vs code growth logic better. I\n // have an feeling that it should just happen somewhere else, for now it\n // is awkward between when we grow past the max and then hit a clear code.\n // For now just check if we hit the max 12-bits (then a clear code should\n // follow, also of course encoded in 12-bits).\n if(next_code >= code_mask + 1 && cur_code_size < 12) {\n ++cur_code_size;\n code_mask = code_mask << 1 | 1;\n }\n }\n\n prev_code = code;\n }\n\n if(op !== output_length) {\n console.log(\"Warning, gif stream shorter than expected.\");\n }\n\n return output;\n}","import {GifReader} from './util/gif-reader';\nimport AnimationFrame from '../../util/animationFrame';\n\nclass GifPlayer {\n constructor(props, template) {\n this.context = props.context;\n this.context.append(template);\n\n props.config.hideLoading || props.context.find('.player__loading-spinner').addClass('player__loading-spinner--show');\n\n this.screen = this.context.find(`#${props.config.playerId}`);\n\n this.context.find('.player__context').append(this.screen);\n this.cxt = this.screen[0].getContext('2d');\n this.source = {\n videoWidth: 0,\n videoHeight: 0,\n };\n this.state = {\n fps: props.config.gifFps || 20,\n frames: [],\n animationFrame: {},\n isPlay: false,\n nowFrame: 0,\n totalFrame: 0,\n };\n this.loadGIF(props.config.videoId);\n }\n\n loadGIF(src) {\n let oReq = new XMLHttpRequest();\n oReq.open('GET', src, true);\n oReq.responseType = 'arraybuffer';\n oReq.onload = () => {\n let arrayBuffer = oReq.response;\n if (arrayBuffer) {\n this._handleReady(new GifReader(new Uint8Array(arrayBuffer)));\n }\n };\n oReq.send(null);\n }\n\n _decode(source, i) {\n let info = source.frameInfo(i);\n\n let imageData = this.cxt.createImageData(info.width, info.height);\n\n source.decodeAndBlitFrameRGBA(i, imageData.data);\n\n return imageData;\n }\n\n _handleReady(source) {\n this.gif = source;\n let sourceInfo = source.frameInfo(0);\n this.state.totalFrame = source.numFrames();\n this.source.videoWidth = sourceInfo.width;\n this.source.videoHeight = sourceInfo.height;\n\n $(this.screen).attr({\n 'width': sourceInfo.width,\n 'height': sourceInfo.height,\n });\n\n this.state.frames[0] = this._decode(source, 0);\n this.cxt.putImageData(this.state.frames[0], 0, 0);\n\n this.context.trigger('canplay');\n }\n\n _render(q) {\n this.state.frames[q] = this.state.frames[q] || this._decode(this.gif, q);\n this.cxt.clearRect(0, 0, this.source.videoWidth, this.source.videoHeight);\n this.cxt.putImageData(this.state.frames[q], 0, 0);\n this.state.nowFrame = q + 1;\n }\n\n play(to) {\n if (this.state.isPlay) return;\n this.state.isPlay = true;\n to > -1 && this.seek(to);\n\n if (this.state.nowFrame >= this.state.totalFrame) {\n this.state.nowFrame = 0;\n }\n\n this.context.trigger(`play`);\n\n this.state.animationFrame = new AnimationFrame(() => {\n if (this.state.nowFrame >= this.state.totalFrame) {\n this.state.isPlay = false;\n this.state.animationFrame.stop();\n this.context.trigger(`end`);\n return;\n }\n this._render(this.state.nowFrame);\n }, this.state.fps);\n this.state.animationFrame.start();\n }\n\n stop() {\n this.context.trigger(`stop`);\n this.state.isPlay = false;\n this.state.animationFrame && this.state.animationFrame.stop();\n this._render(0);\n }\n\n pause() {\n this.state.isPlay = false;\n this.state.animationFrame && this.state.animationFrame.stop();\n this.context.trigger(`pause`);\n }\n\n mute() {\n\n }\n\n unMute() {\n\n }\n\n seek(to) {\n this.state.nowFrame = Math.floor(to);\n this._render(this.state.nowFrame);\n this.context.trigger(`seek`);\n }\n\n getDuration() {\n return this.state.totalFrame;\n }\n\n getCurrent() {\n return this.state.nowFrame;\n }\n}\n\nexport default GifPlayer;","const getTemplate = (options) => {\n let controls = options.controls ?\n `
\n
\n
\n
\n \n \n
` : \"\";\n \n let background = () => {\n if(options.poster){\n return `
`;\n }\n if(options.type === \"youtube\"){\n return `
`;\n }\n return `
`;\n };\n \n let source = () => {\n if(options.type === \"video\"){\n return ``;\n }\n if(options.type === \"youtube\"){\n return `
`;\n }\n if(options.type === \"gif\"){\n return ``;\n }\n };\n \n return `
\n ${source()}\n
\n
\n ${background()}\n ${controls}\n
`;\n};\n\nexport default getTemplate;\n","import PlayerYoutube from '../player-youtube';\nimport PlayerVideo from '../player-video';\nimport PlayerGif from '../player-gif';\nimport GetTemplate from './get-template';\n\nconst playerList = {\n video: PlayerVideo,\n youtube: PlayerYoutube,\n gif: PlayerGif,\n};\n\nconst loadPlayer = (props) => {\n let sourceType = props.sourceType;\n\n let template = GetTemplate({poster: props.config.poster, controls: props.config.controls, type: props.sourceType, videoId: props.config.videoId, playerId: props.config.playerId, mute:props.config.mute});\n\n if (sourceType === 'youtube') {\n if (!window.loadYoutubeApi) {\n window.loadYoutubeApi = true;\n const tag = document.createElement('script');\n tag.src = 'https://www.youtube.com/iframe_api';\n const firstScriptTag = document.getElementsByTagName('script')[0];\n firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n }\n\n let check = setInterval(() => {\n if (window.YT && window.YT.Player) {\n clearInterval(check);\n props.player = new playerList[sourceType](props, template);\n }\n }, 200);\n\n return;\n }\n\n props.player = new playerList[sourceType](props, template);\n};\n\nexport default loadPlayer;\n","import AnimationFrame from '../../util/animationFrame';\n\nimport isMobile from '../../util/isMobile';\nimport setcookie from '../../cookie/setcookie';\nimport getcookie from '../../cookie/getcookie';\n\nimport MessageConfirm from '../../message/js/message-confirm';\n\nimport loadPlayer from './util/loader-player';\n\nconst message = new MessageConfirm({\n 'data': '',\n 'fade': true,\n 'esc': true,\n 'dim': true,\n 'name': 'promo-video-message'\n});\n\nclass Player {\n constructor(_option) {\n if (!_option && typeof (_option) !== 'object') {\n throw new TypeError(\n 'Player module need object type option');\n }\n if (_option && !document.querySelector(_option.selector)) {\n throw new TypeError(\n `no ${_option.selector} DOM Element`);\n }\n\n this.config = $.extend({\n videoId: '',\n playerId: `${_option.selector.replace(/^#/, '')}__screen`,\n mute: false,\n autoPlay: false,\n loop: false,\n controls: false,\n coverClick: false,\n poster: '',\n hideLoading: false\n }, _option);\n this.context = $(_option.selector);\n this.player = null;\n this.sourceType = '';\n this.state = {\n isPlay: false,\n startQ: false,\n isReady: false,\n seek: 0\n };\n\n this._init();\n }\n\n _init() {\n this.source = '';\n this.playerContext = false;\n this.DOM = {\n progress: null,\n progressBar: null,\n poster: false,\n controls: null,\n play: null,\n pause: null\n };\n this.state = {\n isPlay: false,\n isControlShow: true,\n progress: 0,\n progressLeft: 0,\n timer: 0,\n duration: 0\n };\n\n this.sourceType = this._getPlayerType(this.config.videoId.substring(this.config.videoId.lastIndexOf('.', this.config.videoId.length)).toLowerCase());\n\n this.animationFrame = new AnimationFrame(this._handleTimeUpdate.bind(this));\n\n this.context.on('play', () => {\n this.state.isPlay = true;\n this.animationFrame.start();\n\n if (this.config.controls) {\n this.DOM.play.removeClass('player__play_show');\n this.DOM.pause.addClass('player__pause_show');\n\n this.state.timer = setTimeout(() => {\n if (!this.state.isPlay) return;\n this.DOM.controls.addClass('player__controls_hide');\n }, 1000);\n\n this.state.isControlShow = false;\n }\n this.DOM.poster.fadeOut();\n });\n\n this.context.on('pause', () => {\n this.state.isPlay = false;\n this.animationFrame.stop();\n\n this.seek(this.getCurrentTime());\n\n if (this.config.controls) {\n this.DOM.play.addClass('player__play_show');\n this.DOM.pause.removeClass('player__pause_show');\n this.DOM.controls.removeClass('player__controls_hide');\n this.state.isControlShow = true;\n }\n });\n\n this.context.on('end', () => {\n this.state.isPlay = false;\n this.stop();\n this.animationFrame.stop();\n\n if (this.config.loop) {\n this.play();\n return;\n }\n\n this.DOM.poster.show();\n\n if (this.config.controls) {\n this.DOM.play.addClass('player__play_show');\n this.DOM.pause.removeClass('player__pause_show');\n this.DOM.controls.removeClass('player__controls_hide');\n this.state.isControlShow = true;\n }\n });\n\n this.context.on('canplay', () => {\n this.context.off('canplay');\n this.state.duration = this.getDuration();\n\n this.context.find('.player__loading-spinner').removeClass('player__loading-spinner--show');\n this.context.find('.player--hide').removeClass('player--hide');\n\n this.source = this.player.source;\n this.playerContext = $(`#${this.config.playerId}`);\n this.playerContext.css(this._getMovieSize(this.context[0].offsetWidth, this.context[0].offsetHeight, this.source.videoWidth, this.source.videoHeight));\n this.playerContext.css(this._getMovieSize(this.context[0].offsetWidth, this.context[0].offsetHeight, this.source.videoWidth, this.source.videoHeight));\n\n this._detectDom();\n this._controller();\n\n this.playerContext.addClass('isReady');\n\n this.state.isReady = true;\n this.config.mute && this.player.mute();\n this.config.autoPlay && this.autoplay(isMobile());\n });\n\n $(window).on('resize.player', () => {\n this.state.isReady && this.config.controls && this._detectDimension();\n this.playerContext && this.playerContext.css(this._getMovieSize(this.context[0].offsetWidth, this.context[0].offsetHeight, this.source.videoWidth, this.source.videoHeight));\n });\n\n loadPlayer(this);\n\n return false;\n }\n\n _controller() {\n if (this.config.controls) {\n this.context.on('mousemove', (e) => {\n if (!this.state.isPlay) return;\n\n if (e.target === this.DOM.progress[0] || e.target === this.DOM.progressBar[0] || e.target === this.DOM.play[0] || e.target === this.DOM.pause[0]) return;\n\n if (!this.state.isControlShow) {\n this.state.isControlShow = true;\n\n this.DOM.controls.removeClass('player__controls_hide');\n }\n else {\n clearTimeout(this.state.timer);\n\n this.state.timer = setTimeout(() => {\n if (!this.state.isPlay) return;\n this.state.isControlShow = false;\n\n this.DOM.controls.addClass('player__controls_hide');\n }, 1000);\n }\n });\n\n this.context.on('mouseover', '.player__progress', () => {\n if (!this.state.isPlay) return;\n\n clearTimeout(this.state.timer);\n\n this.DOM.controls.removeClass('player__controls_hide');\n });\n\n this.context.on('mouseout', '.player__progress', () => {\n if (!this.state.isPlay) return;\n\n clearTimeout(this.state.timer);\n\n this.state.timer = setTimeout(() => {\n if (!this.state.isPlay) return;\n this.state.isControlShow = false;\n\n this.DOM.controls.addClass('player__controls_hide');\n }, 1000);\n });\n\n this.context.on('click', '.player__play', () => {\n this.play();\n });\n\n this.context.on('click', '.player__pause', () => {\n this.pause();\n });\n\n this.context.on('click', '.player__progress', (e) => {\n this.seek((1 - (this.state.progress - (e.clientX - this.state.progressLeft)) / this.state.progress) * (this.state.duration == 0 ? this.getDuration() : this.state.duration));\n this.play();\n });\n }\n\n if (this.config.coverClick) {\n this.context.on('click', '.player__cover', () => {\n this.state.isPlay ? this.pause() : this.play();\n });\n }\n }\n\n _detectDom() {\n this.DOM.poster = this.context.find('.player__poster');\n this.DOM.spinner = this.context.find('.player__loading-spinner');\n\n if (this.config.controls) {\n this.DOM.controls = this.context.find('.player__controls');\n this.DOM.progress = this.context.find('.player__progress');\n this.DOM.progressBar = this.context.find('.player__progress-bar');\n this.DOM.play = this.context.find('.player__play');\n this.DOM.pause = this.context.find('.player__pause');\n this._detectDimension();\n }\n }\n\n _detectDimension() {\n this.state.progress = this.DOM.progress.width();\n this.state.progressLeft = this.DOM.progress[0].getBoundingClientRect().left;\n }\n\n _handleTimeUpdate() {\n if (!this.config.controls) return;\n this.state.duration = this.getDuration();\n\n const bar = (this.getCurrentTime() / this.getDuration()).toFixed(6);\n\n this.DOM.progressBar.css({\n 'transform': `scaleX(${bar > 1 ? 1 : bar})`\n });\n }\n\n _getPlayerType(fileType) {\n if (fileType === '.mp4') {\n return 'video';\n }\n else {\n if (fileType === '.gif') {\n return 'gif';\n }\n else {\n return 'youtube';\n }\n }\n }\n\n _getMovieSize(contextWidth, contextHeight, videoWidth = 1280, videoHeight = 720) {\n let setWidth = 0;\n let setHeight = 0;\n\n if ((contextWidth / contextHeight) < (videoWidth / videoHeight)) {\n setWidth = contextHeight * videoWidth / videoHeight;\n setHeight = contextHeight;\n }\n else {\n setWidth = contextWidth;\n setHeight = contextWidth * videoHeight / videoWidth;\n }\n\n return {\n width: setWidth,\n height: setHeight\n };\n }\n\n play() {\n if (this.state.isPlay) return;\n\n if (isMobile()) {\n if (getcookie('promoPlayer')) {\n this.player.play();\n }\n else {\n message.openConfirm('WI-FI 모드가 아닌 경우,
데이터 요금이 발생될 수 있습니다.', () => {\n this.player.play();\n setcookie('promoPlayer', true, 1);\n });\n }\n }\n else {\n this.player.play();\n }\n }\n\n autoplay(isMobile) {\n if (isMobile) return;\n this.play();\n }\n\n stop() {\n this.player.stop();\n }\n\n pause() {\n this.player.pause();\n }\n\n mute() {\n this.player.mute();\n }\n\n unMute() {\n this.player.unMute();\n }\n\n seek(t) {\n this.player.seek(t);\n }\n\n getDuration() {\n return this.player.getDuration();\n }\n\n getCurrentTime() {\n return this.player.getCurrent();\n }\n\n on(e, eventListener) {\n this.context.on(e, eventListener);\n }\n\n off(e) {\n this.context.off(e);\n }\n\n get isPlay() {\n return this.state.isPlay;\n }\n}\n\nexport default Player;\n","import AnimationFrame from '../../util/animationFrame';\n\nclass SequencePlayer {\n constructor(_option){\n if(_option && !document.querySelector(_option.el)) {\n throw new TypeError(`no ${_option.el} DOM Element`);\n }\n\n this.context = $(_option.el);\n\n this.config = $.extend({\n path: '',\n prefix: 'sequence_',\n type: 'png',\n loop: false,\n autoPlay: false,\n delay: 0,\n fps: 60,\n frame: 0,\n preDecode: false\n }, _option);\n\n this.state = {\n animationFrame: false,\n isPlay: false,\n fps: this.config.fps,\n nowFrame: 0,\n totalFrame: this.config.frame\n };\n\n this.loadCount = 0;\n this.screenWidth = 0;\n this.screenHeight = 0;\n this.sequence = [];\n\n this.canvas = $(``);\n\n this._setCanvas();\n }\n\n _setCanvas(){\n this.context.append(this.canvas);\n this.canvasContext = this.canvas[0].getContext('2d');\n this._loadData();\n }\n\n _loadData(i = 0){\n const img = new Image();\n img.src = `${this.config.path}/${this.config.prefix}${i}.${this.config.type}`;\n img.onload = () => this._loadComplete(img);\n }\n\n _loadComplete(img){\n this.sequence.push(img);\n this.loadCount += 1;\n\n if(this.loadCount < 2) {\n this.screenWidth = this.sequence[0].width;\n this.screenHeight = this.sequence[0].height;\n\n this.canvas.attr({\n width: this.screenWidth,\n height: this.screenHeight,\n });\n\n if(this.config.preDecode) {\n this.canvas.css({\n display: 'none'\n });\n }\n }\n\n if(this.config.preDecode) {\n this.canvasContext.drawImage(img, 0, 0);\n }\n\n if(this.loadCount < this.state.totalFrame) {\n this._loadData(this.loadCount);\n return;\n }\n\n this._handleReady();\n }\n\n _handleReady(){\n this.screenWidth = this.sequence[0].width;\n this.screenHeight = this.sequence[0].height;\n\n if(this.config.preDecode) {\n this.canvasContext.clearRect(0, 0, this.screenWidth, this.screenHeight);\n this.canvas.css({\n display: 'block'\n });\n }\n\n this.context.trigger('ready');\n\n this.config.autoPlay && setTimeout(() =>{\n this.play();\n }, this.config.delay);\n }\n\n _render(q){\n this.canvasContext.clearRect(0, 0, this.screenWidth, this.screenHeight);\n this.canvasContext.drawImage(this.sequence[q], 0, 0);\n this.state.nowFrame = q + 1;\n }\n\n play(to){\n if(this.state.isPlay) return;\n this.state.isPlay = true;\n to > -1 && this.seek(to);\n this.context.trigger(`play`);\n\n this.state.animationFrame = new AnimationFrame(() =>{\n if(this.state.nowFrame >= this.state.totalFrame) {\n this.state.isPlay = false;\n this.state.animationFrame.stop();\n this.context.trigger(`end`);\n this.config.loop && this.play(0);\n return;\n }\n this._render(this.state.nowFrame);\n }, this.state.fps);\n this.state.animationFrame.start();\n }\n\n pause(){\n this.state.isPlay = false;\n this.state.animationFrame && this.state.animationFrame.stop();\n this.context.trigger(`pause`);\n }\n\n stop(){\n this.state.isPlay = false;\n this.state.animationFrame && this.state.animationFrame.stop();\n this._render(0);\n this.context.trigger(`stop`);\n }\n\n seek(to){\n this.state.nowFrame = to;\n this._render(this.state.nowFrame);\n this.context.trigger(`seek`);\n }\n\n on(event, func){\n this.context.on(event, func);\n }\n\n off(event){\n this.context.off(event);\n }\n\n get info(){\n return this.state;\n }\n}\n\nexport default SequencePlayer;","/**\n * get environment\n * @param href\n * @returns {*}\n */\nconst environment = (href = location.href) =>{\n let here;\n\n if(/rc\\./i.test(href) || /rc-/i.test(href)) {\n here = 'rc';\n }\n else if(/local|localhost|opdev|ui-static|file:/i.test(href)) {\n here = 'local';\n }\n else {\n here = 'live';\n }\n\n return here;\n};\n\nexport default environment;","class ImageLoader {\n constructor(url, props){\n this.props = props;\n\n const img = new Image();\n img.src = url;\n\n img.onload = () => this.props._onSuccess('image', `success: ${url}`);\n img.onerror = () => this.props._onFail('image', `fail: ${url}`);\n }\n}\n\nexport default ImageLoader;","class VideoLoader {\n constructor(url, props){\n this.props = props;\n\n const video = document.createElement('video');\n video.src = url;\n\n let checkState = setInterval(() =>{\n if(video.readyState > 2) {\n clearInterval(checkState);\n this.props._onSuccess('video', `success: ${url}`);\n }\n }, 100);\n\n video.onerror = () => this.props._onFail('video', `fail: ${url}`);\n }\n}\n\nexport default VideoLoader;","class YoutubeLoader {\n constructor(id, props){\n this.props = props;\n this.loaded = false;\n\n $(window).on(`canplay.${id}`, () =>{\n this.loaded = true;\n this.props._onSuccess('youtube', `success: ${id}`);\n });\n\n setTimeout(() =>{\n !this.loaded && this.props._onFail('youtube', `fail: ${id}`);\n }, 5 * 1000)\n }\n}\n\nexport default YoutubeLoader;","import gamename from '../../util/gameName';\nimport ismobile from '../../util/isMobile';\nimport environment from '../../util/environment';\nimport animationframe from '../../util/animationFrame';\n\nimport ImageLoader from './image-loader';\nimport VideoLoader from './video-loader';\nimport YoutubeLoader from './youtube-loader';\n\nclass Preloader {\n constructor(options){\n this.config = $.extend({\n 'image': [],\n 'video': [],\n 'youtube': [],\n 'theme': [],\n 'comment': '본 페이지는 Chrome/IE10 이상의 1920 x 1080 해상도에 최적화되어 있습니다.',\n 'removeType': 'fadeOut',\n 'resourcePath': '',\n 'delay': 0,\n 'game': ''\n }, options);\n\n this.store = {\n loaded: 0,\n loadFail: 0,\n loadSuccess: 0,\n loadSize: 0,\n progress: 0,\n\n href: '',\n static: '',\n game: '',\n width: 0,\n height: 0,\n isMobile: false,\n animationFrame: false,\n theme: null\n };\n\n this._init();\n }\n\n _init(){\n this.store.href = location.href;\n this.store.loadSize = this.config.image.length + this.config.video.length + this.config.youtube.length;\n\n if(this.config.resourcePath.length > 0) {\n this.store.static = this.config.resourcePath;\n } else {\n switch(environment()) {\n case 'live':\n this.store.static = 'https://wstatic-cdn.plaync.com';\n break;\n\n case 'rc':\n this.store.static = 'https://rc-wstatic.plaync.co.kr';\n break;\n\n case 'local':\n this.store.static = 'http://ui-static.korea.ncsoft.corp';\n break;\n }\n }\n\n this.store.game = this.config.game || gamename().en;\n this.store.isMobile = ismobile();\n\n this._setTheme();\n\n this._loadFile();\n\n this._updateBar();\n }\n\n _setTheme(){\n this.store.theme = {\n \"aion\": [`${this.store.static}/promokit/v1.1/img/loader_aion_off.png`, `${this.store.static}/promokit/v1.1/img/loader_aion_on.png`, \"#020811\"],\n \"lineage\": [`${this.store.static}/promokit/v1.1/img/loader_lineage_off.png`, `${this.store.static}/promokit/v1.1/img/loader_lineage_on.png`, \"#020811\"],\n \"lineage2\": [`${this.store.static}/promokit/v1.1/img/loader_lineage2_off.png`, `${this.store.static}/promokit/v1.1/img/loader_lineage2_on.png`, \"#020811\"],\n \"lineage2classic\": [`${this.store.static}/promokit/v1.1/img/loader_lineage2classic_off.png`, `${this.store.static}/promokit/v1.1/img/loader_lineage2classic_on.png`, \"#020811\"],\n \"bns\": [`${this.store.static}/promokit/v1.1/img/loader_bns_off.png`, `${this.store.static}/promokit/v1.1/img/loader_bns_on.png`, \"#020811\"],\n };\n\n this.store.theme = [\n this.config.theme[0] ? `${this.store.static}${this.config.theme[0]}` : this.store.theme[this.store.game][0],\n this.config.theme[1] ? `${this.store.static}${this.config.theme[1]}` : this.store.theme[this.store.game][1],\n this.config.theme[2] || this.store.theme[this.store.game][2]\n ];\n\n let img = new Image();\n\n img.onload = (e) =>{\n $('body').append(this._themeTemplate(this.store.isMobile ? e.target.width / 2 : e.target.width, this.store.isMobile ? e.target.height / 2 : e.target.height));\n };\n\n img.src = this.store.theme[0];\n }\n\n _themeTemplate(w, h){\n let loaderStyle = {\n loader: `background:${this.store.theme[2]}; position:fixed; top:0; bottom:0; left:0; right:0; z-index:10000;`,\n con: `position:absolute; top:50%; left:50%; transform:translate(-50%, -50%); text-align:center;`,\n bar: `background:url(${this.store.theme[0]}) 50% 100% no-repeat; width:${w}px; height:${h}px; background-size:cover; position:relative; display:inline-block;`,\n progress: `background:url(${this.store.theme[1]}) 50% 100% no-repeat;background-size:cover; position:absolute; left:0; bottom:0; width:100%; height:0;transition-property:height;transition-duration:.5s`\n };\n\n this.config.comment = this.config.comment && !this.store.isMobile ? `
${this.config.comment}
` : '';\n\n return (\n `
\n
\n
\n
\n
\n ${this.config.comment}\n
\n
`\n );\n }\n\n _loadFile(){\n if(this.config.image.length > 0) {\n for(let item of this.config.image) {\n new ImageLoader(`${this.store.static}${item}`, this);\n }\n }\n\n if(this.config.video.length > 0) {\n for(let item of this.config.video) {\n new VideoLoader(item, this);\n }\n }\n\n if(this.config.youtube.length > 0) {\n for(let item of this.config.youtube) {\n new YoutubeLoader(item, this);\n }\n }\n }\n\n _updateBar(){\n let draw = () =>{\n if(this.store.loaded < this.store.loadSize) {\n this.store.progress = this.store.loaded;\n let progressSize = (this.store.progress / this.store.loadSize * 100) >= 100 ? 100 : this.store.progress / this.store.loadSize * 100;\n $('.loader__progress').css({height: progressSize + '%'});\n }\n\n if(this.store.loaded === this.store.loadSize) {\n $('.loader__progress').css({height: 100 + '%'});\n animationId.stop();\n\n $('.loader').delay(200 + this.config.delay)[this.config.removeType](this.config.removeType === 'fadeOut' ? 300 : 0, function(){\n $(this).remove();\n });\n\n $(document).trigger('preLoaded');\n $(document).trigger('preloadend');\n $(window).trigger('resize');\n }\n };\n\n let animationId = new animationframe(draw);\n\n animationId.start();\n };\n\n _onSuccess(type, msg){\n this.store.loadSuccess = this.store.loadSuccess + 1;\n this.store.loaded = this.store.loaded + 1;\n }\n\n _onFail(type, msg){\n console.log(msg);\n this.store.loadFail = this.store.loadFail + 1;\n this.store.loaded = this.store.loaded + 1;\n }\n}\n\nexport default Preloader;","const loadJs = (src, callback) =>{\n const script = document.createElement('script');\n\n script.setAttribute('src', src);\n\n if(script.readyState) {\n script.onreadystatechange = function(){\n if(script.readyState === \"loaded\" || script.readyState === \"complete\") {\n script.onreadystatechange = null;\n callback && callback();\n }\n }\n } else {\n script.onload = function(){\n callback && callback();\n };\n }\n\n document.getElementsByTagName('head')[0].appendChild(script);\n\n return false;\n};\n\nexport default loadJs;","/**\n * facebook 공유하기\n * @param shareUrl\n */\nlet shareFacebook = (shareUrl = location.href) =>{\n let url = \"https://www.facebook.com/sharer.php?u=\" + encodeURIComponent(shareUrl);\n\n window.open(url);\n};\n\nexport default shareFacebook;","/**\n * twitter 공유하기\n * https://dev.twitter.com/web/tweet-button/web-intent\n * @param shareUrl\n * @param text\n */\nlet shareTwitter = (shareUrl = location.href, text = document.title) =>{\n let url = `https://twitter.com/intent/tweet?url=${encodeURIComponent(shareUrl)}&text=${encodeURIComponent(text)}`;\n\n window.open(url);\n};\n\nexport default shareTwitter;","/**\n * kakao story 공유하기\n * @param shareUrl\n */\nlet shareKakaoStory = (shareUrl = location.href) =>{\n let shareWindowName = 'kakaoStoryShare';\n let url = 'https://story.kakao.com/share?url=' + encodeURIComponent(shareUrl);\n\n window.open(url, shareWindowName, 'width=530, height=480, resizable=no, scrollbars=no, status=no');\n};\n\nexport default shareKakaoStory;","import trim from '../../util/trim'\nimport loadJs from '../../util/loadJs'\n\n/**\n * kakao talk 공유하기\n * @param options\n */\nconst shareKakaoTalk = (options) =>{\n let config = Object.assign({\n shareUrl: location.href,\n shareTitle: trim(document.title.split(/\\:\\s+plaync/)[0]),\n shareDescription: document.querySelector('[property=\"og:description\"]') ? document.querySelector('[property=\"og:description\"]').content : document.querySelector('[name=\"description\"]').content,\n imageSrc: document.querySelector('[property=\"og:image\"]').content,\n imageWidth: 300,\n imageHeight: 157,\n buttonText: '자세히 보기'\n }, options);\n\n const getKey = (loc) =>{\n\n if(/bns.plaync.co/.test(loc)) {\n return '7a41aad1eebf7e5b4b68db7204aeb574';\n }\n\n else if(/lineage.plaync.co/.test(loc)) {\n return 'cc821832de1815dfefd89696a8328808';\n }\n\n else if(/lineagem.plaync.co/.test(loc)) {\n return 'cc821832de1815dfefd89696a8328808';\n }\n\n else if(/lineage2.plaync.co/.test(loc)) {\n return '5c2686ba412a29a8fb2942339184d320';\n }\n\n else if(/aion.plaync.co/.test(loc) || /aionnew.plaync.co/.test(loc)) {\n return '6c3e99b13fbec7bc6c4d699de19d8e3a';\n }\n\n else if(/event.plaync.co/.test(loc)) {\n return '938e491a6a7a61dee6ad1293a191d999';\n }\n\n else if(/pangyam.plaync.co/.test(loc)) {\n return 'fed893c76cbaa6fe574a28bb723c4906';\n }\n\n else if(/power.plaync.co/.test(loc)) {\n return 'b18b4f83affd1baa323d43cb76ccde55';\n }\n\n else if(/fb.plaync.co/.test(loc)) {\n return '938e491a6a7a61dee6ad1293a191d999';\n }\n\n else if(/plaync.co/.test(loc) || /asia.nc.com/.test(loc)) {\n return '787f3aa15494fd0879123c1cce573c9b';\n }\n\n return 'address error';\n };\n \n let settings = {\n objectType: 'feed',\n content: {\n title: config.shareTitle,\n description: config.shareDescription,\n \n imageUrl: config.imageSrc,\n imageWidth: config.imageWidth,\n imageHeight: config.imageHeight,\n \n link: {\n webUrl: config.shareUrl,\n mobileWebUrl: config.shareUrl\n }\n \n },\n buttonTitle: config.buttonText\n };\n\n let kakaoKey = getKey(config.shareUrl);\n \n if(window.Kakao) {\n Kakao.cleanup();\n window.Kakao.init(kakaoKey);\n window.Kakao.Link.sendDefault(settings);\n return;\n }\n \n loadJs('https://developers.kakao.com/sdk/js/kakao.min.js', () =>{\n Kakao.cleanup();\n window.Kakao.init(kakaoKey);\n window.Kakao.Link.sendDefault(settings);\n });\n};\n\nexport default shareKakaoTalk;","/**\n * line 공유하기\n * @param shareUrl\n */\nlet shareLine = (shareUrl = location.href) =>{\n let url = `${encodeURIComponent(shareUrl)}`;\n let title = $('[property=\"og:title\"]').attr('content');\n\n window.open(`http://line.me/R/msg/text/?${title} ${url}`);\n\n};\n\nexport default shareLine;","/**\n * isOs\n * @param findBrowser\n * @param agent\n * @returns {boolean}\n */\n\nconst isOs = (findBrowser, agent = navigator.userAgent.toLowerCase()) =>{\n return agent.indexOf(findBrowser) !== -1;\n};\n\nexport default isOs;","import isOs from '../../util/isOs';\nimport isMobile from '../../util/isMobile';\nimport {openMessage} from '../../message/js/message';\n\n/**\n *\n * URL 공유하기\n * @param shareUrl\n */\nlet copyUrl = (shareUrl = location.href) =>{\n window.getSelection().removeAllRanges();\n\n $('#shareUrl').remove();\n\n $('body').append(`${shareUrl}`);\n\n let urlField = document.querySelector('#shareUrl');\n let range = document.createRange();\n\n range.selectNode(urlField);\n window.getSelection().addRange(range);\n document.execCommand('copy');\n\n if(isOs('samsung') || isOs('lg')) return;\n\n if(isMobile()) {\n openMessage('URL 복사가 완료 되었습니다.');\n } else {\n alert('URL 복사가 완료 되었습니다.');\n }\n\n};\n\nexport default copyUrl;\n","import gamename from \"../util/gameName\";\nimport environment from \"../util/environment\";\n\nconst localUserData = {\n \"locale\": \"ko-KR\",\n \"now\": \"2018-10-10T14:03:16.750+09:00\",\n \"site\": \"lineage1\",\n \"guid\": \"\",\n \"uesAccountType\": \"gameAccount\",\n \"ncAccount\": {\n \"name\": \"\",\n \"profileImage\": \"\",\n \"url\": \"\",\n \"target\": \"\"\n },\n \"gameAccount\": {\n \"name\": \"\",\n \"profileImage\": \"\",\n \"url\": \"\",\n \"subData\": []\n },\n \"nshop\": {\n \"nCoin\": \"0\",\n \"coupon\": \"0\"\n },\n \"login\": false,\n \"accountState\": []\n};\n\nconst api = {\n lineage: {\n local: \"\",\n rc: \"https://rc-apilineage.plaync.com/api/main/cnb/userData\",\n live: \"https://api-lineage.plaync.com/api/main/cnb/userData\"\n },\n aion: {\n local: \"\",\n rc: \"http://rc-api.aion.plaync.com/webcontents/v2/cnb/userData\",\n live: \"http://api-aion.plaync.com/webcontents/v2/cnb/userData\"\n }\n};\n\nconst coupon = {\n lineage: {\n local: \"\",\n rc: \"http://rc.lineagenshop.plaync.com/lineage/coupon/popup/couponProfileRegisterForm?gameCode=31\",\n live: \"http://lineagenshop.plaync.com/lineage/coupon/popup/couponProfileRegisterForm?gameCode=31\"\n },\n aion: {\n local: \"\",\n rc: \"http://rc.aionnshop.plaync.com/aion/coupon/popup/couponProfileRegisterForm?gameCode=27\",\n live: \"http://aionnshop.plaync.com/aion/coupon/popup/couponProfileRegisterForm?gameCode=27\"\n }\n};\n\nconst size = {\n lineage: {\n \"width\": 82,\n \"height\": 26,\n \"marginTop\": 15\n },\n aion: {\n \"width\": 81,\n \"height\": 30,\n \"marginTop\": 13\n }\n};\n\nclass Cnb {\n constructor(options){\n const gameInfo = gamename();\n const lan = environment();\n const apiUrl = api[gameInfo.en][lan];\n const couponUrl = coupon[gameInfo.en][lan];\n const style = size[gameInfo.en];\n \n let cnbConfig = {\n \"type\": \"B\",\n \"bi\": {\n \"title\": `${gameInfo.en}`,\n \"url\": \"/\",\n \"image\": {}\n },\n \"header\": {\n \"large\": \"rgba(16,16,16,0.8)\",\n \"medium\": \"rgba(16,16,16,0.8)\",\n \"mediumSticky\": \"#5c443b\",\n \"lnb\": \"#c69c7c\"\n },\n \"useLeftMenu\": true,\n \"useJoinMenu\": true,\n \"joinURL\": `http://search.plaync.com/${gameInfo.en}/index.jsp`,\n \"useGameStart\": \"mobileGameDown\",\n \"gameStart\": {\n \"markUp\": \"다운로드\"\n },\n \"mobileGameDown\": {\n \"showAndro\": true,\n \"showIos\": true,\n \"appName\": \"\",\n \"iosAppLink\": \"\",\n \"androAppLink\": \"\"\n },\n \"search\": {\n \"isShow\": false,\n \"destUrl\": `http://search.plaync.com/${gameInfo.en}/index.jsp`,\n \"site\": `${gameInfo.en}`,\n \"callback\": \"suggestKeyword\",\n \"collection\": `${gameInfo.en}1query`,\n \"display\": 10,\n \"pos\": \"lnb\",\n \"where\": `${gameInfo.en}^tsearch`\n },\n \"lnbData\": [],\n \"active\": {\n \"d1\": 0,\n \"d2\": 0\n },\n \"shortCut\": {\n enterCoupon: {\n url: couponUrl\n }\n },\n \"appDownloadData\": {\n \"isShow\": false,\n \"appList\": []\n },\n \"loginFN\": \"GNBLogin\",\n \"logoutFN\": \"GNBLogout\",\n \"useCharChangeMenu\": false,\n \"charChangeFN\": \"characterChange\"\n };\n \n if(typeof options.image === \"object\"){\n cnbConfig.bi.image = {\n \"large\": {\n \"path\": options.image.large,\n \"style\": style\n },\n \"medium\": {\n \"path\": options.image.medium,\n \"style\": style\n },\n \"sticky\": {\n \"path\": options.image.mediumSticky,\n \"style\": style\n },\n \"lnb\": {\n \"path\": options.image.lnb,\n \"style\": style\n }\n };\n } else {\n cnbConfig.bi.image = {\n \"path\": options.image,\n \"style\": style\n };\n }\n \n cnbConfig.header = options.color;\n \n if(!apiUrl){\n let data = localUserData;\n window.userData = data;\n window.userData.isLogin = data.login;\n window.cnb.start(cnbConfig);\n } else {\n $.ajax({\n url: apiUrl,\n xhrFields: {withCredentials: true}\n }).done(function (data){\n window.userData = data;\n window.userData.isLogin = data.login;\n window.cnb.start(cnbConfig);\n });\n }\n \n //제제계정 본인확인 팝업\n window.openPopup = function (obj, objWidth, objHeight, objName, objScroll, deny, objFull, addParam){\n try {\n if(objScroll !== 1 && objScroll !== 0 && objScroll !== \"1\" && objScroll !== \"0\"){\n var objScrollCopy = objScroll;\n objScroll = objName;\n objName = objScrollCopy;\n }\n \n if(typeof(obj) == \"string\"){\n var setup = \"width=\" + objWidth + \",height=\" + objHeight + \",toolbar=no,location=no,status=no,menubar=no,top=20,left=20,scrollbars=\" + objScroll + \",resizable=no\";\n if(objName == \"\" || !objName) objName = \"popup\";\n if(objFull) setup = \"fullscreen=1,scrollbars=0\";\n \n var win = window.open(obj, objName, setup);\n if(win != null) win.focus();\n \n return win;\n }\n \n if(!objName) objName = \"popup\";\n if(!objScroll) objScroll = \"auto\";\n \n var url = addParam ? obj.href + \"?\" + addParam : obj.href;\n var setup = \"width=\" + objWidth + \",height=\" + objHeight + \",toolbar=no,location=no,status=no,menubar=no,top=20,left=20,scrollbars=\" + objScroll + \",resizable=no\";\n \n if(objFull) setup = \"fullscreen=1,scrollbars=0\";\n var win = window.open(url, objName, setup);\n \n if(deny){\n if(win == null){\n alert(\"팝업 차단을 해제하여 주시기 바랍니다.\");\n } else {\n win.focus();\n }\n }\n \n return win;\n \n } catch (e) {\n //\n }\n };\n window.openPopupUnban = function (url){\n openPopup(url, 580, 370, \"unban\", 1, 1);\n return false;\n };\n }\n}\n\nexport default Cnb;\n","import removespace from '../../util/removeSpace';\nimport trim from '../../util/trim';\nimport gamename from '../../util/gameName';\nimport isMobile from '../../util/isMobile';\nimport trace from '../../trace/trace';\n\nimport facebook from './facebook';\nimport twitter from './twitter';\nimport kakaostory from './kakaostory';\nimport kakaotalk from './kakaotalk';\nimport line from './line';\nimport copyurl from './copyurl';\n\nconst init = () => {\n let pageTitle = removespace(document.title).split(':plaync')[0];\n\n const getShareBox = (list) => {\n let button = '';\n for (let i = 0, max = list.length; i < max; i++) {\n button += `${list[i]} 공유하기`;\n }\n return `\n
${button}
`;\n };\n\n $('.share').each(function() {\n $(this).append(getShareBox(['facebook', 'twitter', 'kakaotalk', 'line', 'url']));\n\n if (isMobile()) {\n $(this).addClass('share--mobile');\n }\n });\n\n const resetPosition = (shareArea) => {\n let dom_share = shareArea;\n let dom_shareList = dom_share.find('.share__list');\n\n let width_list = dom_shareList.width();\n let width_screen = $('body').width();\n let width_button = dom_share.find('.share__toggle').width();\n\n let value_adjust = (width_list - width_button) / 2;\n\n let offset_shareLeft = dom_share.offset().left;\n let offset_shareRight = offset_shareLeft + width_button;\n let offset_shareCenter = offset_shareLeft + (width_button / 2);\n\n let offset_shareListLeft = offset_shareLeft - value_adjust;\n let offset_shareListRight = offset_shareRight + value_adjust;\n\n let offset_screenLeft = 0;\n let offset_screenRight = width_screen;\n let offset_screenCenter = width_screen / 2;\n\n let position_shareList = -value_adjust;\n let position_shareListLeft = offset_screenLeft;\n let position_shareListRight = -value_adjust * 2;\n let position_shareListCenter = -value_adjust + (offset_screenCenter - offset_shareCenter);\n\n if (offset_shareListLeft < 0) {\n position_shareList = position_shareListLeft;\n }\n\n if (offset_shareListRight > offset_screenRight) {\n position_shareList = position_shareListRight;\n }\n\n if (position_shareListLeft > position_shareListCenter && position_shareListRight < position_shareListCenter) {\n position_shareList = position_shareListCenter;\n }\n\n dom_shareList.css({left: position_shareList});\n };\n\n $(document).off(isMobile() ? 'touchstart.promo.share' : 'click.promo.share');\n $(document).off('click.promo.share', '.share__toggle');\n $(document).off('click.promo.share', '[data-share]');\n\n $(document).on(isMobile() ? 'touchstart.promo.share' : 'click.promo.share', (e) => {\n if (/(svg)/i.test(e.target.tagName) && e.target.className.baseVal === 'share__toggle-icon') return;\n if (/(share__button|share__list|share__toggle|share__toggle_off|share__toggle_on|share__toggle-path)/i.test(e.target.className)) return;\n $('.share__toggle').removeClass('share__toggle--active');\n });\n\n $(document).on('click.promo.share', '.share__toggle', function(e) {\n e.preventDefault();\n if (!$(this).hasClass('share__toggle--active')) {\n $('.share__toggle').removeClass('share__toggle--active');\n }\n\n $(this).toggleClass('share__toggle--active');\n\n resetPosition($(this).closest('.share'));\n });\n\n $(document).on('click.promo.share', '[data-share]', function(e) {\n e.preventDefault();\n\n let shareType = trim($(this).attr('data-share'));\n let shareUrl = $(this).attr('data-share-url');\n\n switch (shareType) {\n case 'facebook':\n facebook(shareUrl);\n break;\n case 'twitter':\n twitter(shareUrl);\n break;\n\n case 'kakaostory':\n kakaostory(shareUrl);\n break;\n\n case 'kakaotalk':\n kakaotalk();\n break;\n\n case 'line':\n line(shareUrl);\n break;\n\n case 'url':\n copyurl(shareUrl);\n break;\n }\n\n trace(`/${gamename().ko}/이벤트프로모션/${pageTitle}/${shareType}`);\n });\n};\n\nexport default {\n facebook,\n twitter,\n kakaostory,\n kakaotalk,\n line,\n copyurl,\n init\n};\n","function Remote(opts) {\n this.opts = opts;\n\n this.$wrap = $(opts.element);\n this.$gnb = this.$wrap.find($(\"[data-remote='wrap']\")).children(\"[data-list='list']\");\n this.$snb = this.$gnb.find(\"[data-list='list']\");\n this.$cnb = this.$wrap.find($(\"[data-remote='wrap']\")).find(\"[data-list='list']\");\n this.$cnbli = this.$wrap.find($(\"[data-remote='wrap']\")).find(\"li\");\n this.$con = $(\"[data-contents='con']\");\n this.$scon = $(\"[data-contents='scon']\");\n this.$btnArrow = $(\"[data-btn='arrow']\");\n\n this.state = {\n isMobile: false,\n resizeWidth: false,\n gnbNum: false,\n snbNum: false,\n removeChk: false,\n scrollTop: $(window).scrollTop(),\n scrollTopSave: false,\n scChk: true\n };\n\n this.arrowSlide();\n this.controls();\n}\n\nRemote.prototype = {\n controls: function () {\n var context = this;\n if (this.opts.quick) {\n this.$gnb.children(\"a\").on(\"click\", function () {\n var hash = $(this).attr(\"href\"),\n reStr = hash.replace(/#/g, \"\");\n\n context.mobileBodyFix();\n context.listSlide(reStr);\n });\n\n this.$snb.children(\"a\").on(\"click\", function () {\n var hash = $(this).attr(\"href\"),\n reStr = hash.replace(/#/g, \"\");\n\n context.mobileBodyFix();\n context.listSlide(reStr);\n });\n } else {\n if (!this.opts.type) {\n this.$gnb.children(\"a\").on(\"click\", () => {\n this.mobileBodyFix();\n if (this.state.isMobile) {\n this.arrowSlide();\n }\n });\n } else {\n this.$cnbli.children(\"a\").on(\"click\", () => {\n this.mobileBodyFix();\n if (this.state.isMobile) {\n this.arrowSlide();\n }\n });\n }\n }\n\n $(window).on(\"resize\", () => {\n this.state.isMobile = (!window.matchMedia(\"(min-width:769px)\").matches);\n this.state.resizeWidth = this.$wrap.outerWidth();\n if (this.opts.show) {\n this.opts.show = false;\n this.arrowSlide();\n } else {\n this.mobileMask();\n }\n this.scrollAction();\n }).resize();\n\n $(window).on(\"scroll\", () => {\n if (this.state.isMobile) {\n if (!this.state.scChk) return false;\n }\n this.state.scrollTop = $(window).scrollTop();\n this.scrollAction();\n });\n\n this.$btnArrow.on(\"click\", () => {\n this.mobileBodyFix();\n this.arrowSlide();\n });\n\n $(document).on(\"click\", \"[data-remote='mask']\", () => {\n this.mobileBodyFix();\n this.arrowSlide();\n });\n },\n\n navAnchor: function (num) {\n if (!this.opts.type) {\n this.$gnb.removeClass(\"active\");\n this.$gnb.eq(num).addClass(\"active\");\n } else {\n this.$cnb.parent(\"ul\").parent(\"li\").removeClass(\"active\");\n this.$cnb.removeClass(\"active\");\n this.$cnb.eq(num).parent(\"ul\").parent(\"li\").addClass(\"active\");\n this.$cnb.eq(num).addClass(\"active\");\n }\n },\n\n scrollAction: function () {\n var scltop = $(window).scrollTop();\n if (!this.state.isMobile) {\n if (scltop >= this.opts.top - this.opts.fix) {\n this.$wrap.addClass(\"fix\").css({top: this.opts.fix});\n } else {\n this.$wrap.removeClass(\"fix\").css({top: this.opts.top});\n }\n } else {\n this.$wrap.removeClass(\"fix\").css({top: \"\"});\n }\n\n this.quickAnchor(scltop)\n },\n\n quickAnchor: function (scltop) {\n if (this.opts.quick) {\n var firstTop = this.$con.eq(0).offset().top,\n // lastBottom = this.$con.eq(this.$con.length - 1).offset().top + this.$con.eq(this.$con.length - 1).height(),\n endScroll = $(window).scrollTop() === $(document).height() - $(window).height();\n if(this.opts.margin!=undefined) firstTop = this.distinction(firstTop);\n for (var i = 0, len = this.$con.length; i < len; i++) {\n var conTop = this.$con.eq(i).offset().top;\n if(this.opts.margin!=undefined) conTop = this.distinction(conTop);\n if (conTop <= scltop) {\n this.state.gnbNum = i;\n for (var j = 0, slen = this.$con.eq(i).children(this.$scon).length; j < slen; j++) {\n var sconTop = this.$con.eq(i).children(this.$scon).eq(j).offset().top;\n if(this.opts.margin!=undefined) sconTop = this.distinction(sconTop);\n if (sconTop <= scltop) {\n this.state.snbNum = j;\n }\n }\n }\n // removeChk = (scltop < firstTop || scltop > lastBottom) ? true : false;\n this.state.removeChk = (scltop < firstTop);\n }\n\n if (!this.state.removeChk) {\n this.$gnb.removeClass(\"active\");\n this.$gnb.find(this.$snb).removeClass(\"active\");\n if (endScroll) {\n this.$gnb.eq(this.$gnb.length - 1).addClass(\"active\");\n this.$gnb.eq(this.$gnb.length - 1).find(this.$snb).eq(this.$gnb.eq(this.$gnb.length - 1).find(this.$snb).length - 1).addClass(\"active\");\n } else {\n this.$gnb.eq(this.state.gnbNum).addClass(\"active\");\n this.$gnb.eq(this.state.gnbNum).find(this.$snb).eq(this.state.snbNum).addClass(\"active\");\n }\n } else {\n this.$gnb.removeClass(\"active\");\n this.$gnb.find(this.$snb).removeClass(\"active\");\n }\n }\n\n this.remoteShowHide();\n },\n\n remoteShowHide: function () {\n if (!this.state.removeChk) {\n this.$wrap.css({display: \"block\"});\n } else {\n if (this.state.isMobile) {\n this.opts.show = false;\n } else {\n this.opts.show = (!this.opts.show);\n }\n this.arrowSlide();\n this.$wrap.css({display: \"none\"});\n }\n },\n\n arrowSlide: function () {\n if (this.opts.show) {\n this.$wrap.stop().animate({right: 0}, 250).find(this.$btnArrow).addClass(\"on\");\n this.state.scChk = false;\n this.opts.show = false;\n } else {\n this.$wrap.stop().animate({right: -this.state.resizeWidth}, 250).find(this.$btnArrow).removeClass(\"on\");\n this.state.scChk = true;\n this.opts.show = true;\n }\n this.mobileMask();\n },\n\n mobileBodyFix: function () {\n if (this.opts.show) {\n this.state.scrollTopSave = this.state.scrollTop;\n if (this.state.isMobile) {\n $(\"body\").css({height: \"auto\", position: \"fixed\", overflow: \"hidden\", marginTop: -this.state.scrollTop});\n }\n } else {\n if (this.state.isMobile) {\n $(\"body\").css({height: \"\", position: \"\", overflow: \"\", marginTop: \"\"});\n $(\"html, body\").scrollTop(this.state.scrollTopSave);\n }\n }\n },\n\n mobileMask: function () {\n $(\"#mobileMask\").remove();\n if (this.state.isMobile) {\n if (!this.opts.show) {\n this.$wrap.before($(\"
\"));\n $(\"html\").css({height: \"auto\", overflow: \"hidden\"});\n } else {\n $(\"html\").css({height: \"\", overflow: \"\"});\n }\n } else {\n $(\"html\").css({height: \"\", overflow: \"\"});\n $(\"body\").css({height: \"\", position: \"\", overflow: \"\", marginTop: \"\"});\n }\n },\n\n listSlide(id) {\n var conOffset = $(\"[data-id='\" + id + \"']\").offset().top;\n if(this.opts.margin!=undefined) conOffset = this.distinction(conOffset);\n $(\"html, body\").stop().animate({scrollTop:conOffset}, this.opts.cspeed);\n if (this.state.isMobile) {\n this.arrowSlide();\n }\n },\n\n distinction(flag){\n flag = (0Top');\n\n this.$topBtn =$('[data-goTop *= \"goTop\"]');\n this.$caution = $('.toggle-caution');\n this.$window = $(window);\n this.currentPos = this.$window.scrollTop();\n this.startPoint = $('#header').height();\n\n this.init();\n };\n TopBtn.prototype.init = function(){\n this.positionChk();\n this.scrollEvt();\n this.goTopEvt();\n };\n TopBtn.prototype.positionChk = function(){\n if(this.currentPos >= this.startPoint) {\n this.$topBtn.css({top:'auto'}).show().addClass('fix');\n }else{\n this.$topBtn.hide();\n }\n };\n TopBtn.prototype.scrollEvt = function(){\n var that = this;\n this.$window.on('scroll',function(){\n var nowPos = $(this).scrollTop();\n\n if(nowPos >= that.startPoint){\n that.$topBtn.fadeIn();\n }else{\n that.$topBtn.fadeOut();\n }\n\n that.$topBtn.css({top:'auto'}).removeClass('stay').addClass('fix');\n });\n };\n TopBtn.prototype.goTopEvt = function(){\n this.$topBtn.on('click', function(e){\n e.preventDefault();\n $('html, body').stop()\n .animate({\n scrollTop : 0\n },800);\n });\n };\n\n function Folding(target, isVisible){\n this.$caution = target;\n this.$panel = this.$caution.find('.disc-wrap');\n this.$foldingBtn = $('.btn-arrow');\n this.$isNext = target.next().is('#footer');\n this.$viewHeight = 0;\n\n this.init(isVisible);\n }\n Folding.prototype.init = function( isVisible ){\n\n this.$viewHeight = (this.$panel.outerHeight()+ $('#footer').outerHeight()) - $(window).height();\n\n if(isVisible){\n this.$caution.addClass('show');\n this.$panel.show();\n }\n\n this.toggleEvt();\n };\n Folding.prototype.toggleEvt = function(){\n\n var that = this;\n\n this.$foldingBtn.on('click', function(){\n\n if(that.$caution.hasClass('show')) {\n that.$caution.removeClass('show');\n that.$panel.slideUp();\n }else{\n that.$caution.addClass('show');\n that.$panel.slideDown();\n\n if(that.$isNext && that.$viewHeight < 0) {\n $('html, body').stop()\n .animate({\n scrollTop: $(document).height() + $(window).height()\n }, 1000);\n }\n }\n });\n };\n\n function FullHeader(target){\n var $window = $(window);\n var h = $window.height();\n\n target.css({\n 'background-size': 'cover'\n });\n\n target.height(h);\n\n $(window).resize(function(){\n target.height($window.height());\n });\n };\n\n function FixHeader(target){\n this.$window = $(window);\n this.$coverHeight = null;\n this.$value = null;\n this.$header = target;\n\n target.css({\n 'position':'fixed',\n 'background-size': 'cover',\n 'width': '100%',\n 'top':0\n });\n\n\n var that =this;\n\n this.init();\n\n this.$window.resize(function(){\n that.screenChk();\n });\n\n this.$window.scroll(function(e){\n var scrollY = e.currentTarget.scrollY;\n\n that.$value = (that.$coverHeight - (scrollY)) / that.$coverHeight;\n\n if (that.$value >= 0) {\n that.$header.css('opacity',that.$value);\n }\n\n if(scrollY >= that.$coverHeight){\n that.$value = 0;\n that.$header.css('opacity',0);\n }\n });\n\n };\n\n FixHeader.prototype.init = function(){\n this.screenChk();\n };\n\n FixHeader.prototype.screenChk = function(){\n this.$coverHeight = this.$window.height();\n this.$value = (this.$coverHeight - (this.$window.scrollTop())) / this.$coverHeight;\n\n this.$header.height(this.$coverHeight).css('opacity',this.$value);\n\n $('[data-fix = \"fix\"]').css({'margin-top':this.$coverHeight});\n };\n\n function CoachMarks(settings){\n\n if(!getCookie('CoachMarkInfo')) {\n\n if(settings.direction === 'vertical'){\n $('body').append('
상하로 이동하세요.
');\n }\n else{\n $('body').append('
좌우로 이동하세요.
');\n }\n\n var $guide = $('.guide');\n\n setTimeout(function(){\n if( $guide.length ) $guide.fadeOut(function(){\n $(this).remove()\n });\n }, 2000);\n\n $(window).on('touchstart',function(){\n $guide.fadeOut(function(){\n $(this).remove()\n });\n });\n\n if(settings.cookie) {\n setCookie('CoachMarkInfo', true);\n }\n }\n\n };\n\n $.fn.TopBtn = function(){\n new TopBtn($(this));\n return this;\n };\n\n $.fn.Folding = function(options){\n var settings = $.extend({open:false},options);\n new Folding($(this), settings.open);\n return this;\n };\n\n $.fn.FullHeader = function(){\n if (isMobile()) {\n new FullHeader($(this));\n return this;\n }\n };\n\n $.fn.FixHeader = function(){\n if (isMobile()){\n new FixHeader($(this));\n return this;\n }\n\n };\n\n $.fn.CoachMark = function(options){\n var settings = $.extend({direction:'vertical',cookie:false},options);\n if (isMobile()) {\n new CoachMarks(settings);\n return this;\n }\n };\n\n};\n\nexport default plugin;","import Setcookie from '../../cookie/setcookie';\nimport Getcookie from '../../cookie/getcookie';\nimport Remote from '../../remote/js/remote';\n\n\nconst swipers = (function(){\n let set, addEvent, lastPage;\n let mySwiper,maxLength, remote;\n\n set = function(direction){\n if( !direction ) direction = 'horizontal';\n mySwiper = new Swiper('#main-swiper', {\n direction: direction, // horizontal & vertical\n effect: 'coverflow',\n grabCursor: true,\n centeredSlides: true,\n slidesPerView: 'auto',\n coverflowEffect: {rotate: 50, stretch: 0, depth: 100, modifier: 1, slideShadows : false,},\n hashNavigation: {watchState: true},\n pagination: {el: '#contents > .swiper-pagination', type: 'fraction',},\n });\n maxLength = mySwiper.slides.length -1;\n\n if( !Getcookie('SliderGuideCookie') ){\n let tag;\n direction == 'vertical' ? tag = '
' : tag = '
';\n $('#main-swiper .swiper-slide-active').append( tag );\n Setcookie('SliderGuideCookie', true);\n }\n };\n lastPage = function(){\n // last Page 일때 footer영역 보여주기\n mySwiper.activeIndex == maxLength ? $('#footer').show() : $('#footer').hide();\n };\n addEvent = function(){\n mySwiper.once('slideChange', function () {\n if( $('.guide').length ) $('.guide').remove();\n });\n mySwiper.on('slideChange', function (e) {\n remote.navAnchor( mySwiper.activeIndex ); //리모트메뉴 active변경\n lastPage();\n });\n setTimeout(function(){\n // 가이드가 있을 경우 2초 뒤에 삭제\n if( $('#main-swiper .guide').length ) $('#main-swiper .guide').fadeOut(1000, function(){\n $(this).remove();\n });\n }, 2000);\n };\n return{\n init: function(direction){\n\n $('html').addClass('swipers');\n remote = new Remote({\n element:\"#remoteMenu\", // element\n type:'custom',\n top:0, // 기본 상단에서 떨어진 값\n fix:0, // 스크롤시 상단에서 떨어진 값\n show:false, // true : 보이기 / false : 숨기기\n quick:false // true : 퀵메뉴 / flase : 네비게이션\n });\n set(direction);\n lastPage();\n addEvent();\n remote.navAnchor( mySwiper.activeIndex );\n },\n\n on: function(event, callback){\n mySwiper.on(event, callback);\n },\n }\n})();\n\nexport default swipers;","import loadJs from '../util/loadJs';\n\nexport const couponInit = () => {\n const couponUrl = {\n op: 'https://op-wstatic.plaync.com/nshop/common/nshop_provide.js',\n sb: 'https://sb-wstatic.plaync.com/nshop/common/nshop_provide.js',\n rc: 'https://rc-wstatic.plaync.co.kr/nshop/common/nshop_provide.js',\n live: 'https://wstatic-cdn.plaync.com/nshop/common/nshop_provide.js'\n };\n\n const href = location.href;\n let lan = 'live';\n\n if (href.match(/^http[s]?:\\/\\/(localhost|local)+.*/i)) {\n lan = 'op';\n }\n else if (href.match(/^http[s]?:\\/\\/(opdev\\.|op-|opdev-)+.*/i)) {\n lan = 'op';\n }\n else if (href.match(/^http[s]?:\\/\\/(sb\\.|sb-)+.*/i)) {\n lan = 'sb';\n }\n else if (href.match(/^http[s]?:\\/\\/(rc\\.|rc-)+.*/i)) {\n lan = 'rc';\n }\n\n if (!window.nshop) {\n loadJs(couponUrl[lan]);\n }\n\n $(document).on('click.promo.coupon', '[data-coupon]', function(e) {\n e.preventDefault();\n window.nshop.coupon.page();\n });\n};\n\nexport const coupon = () => {\n window.nshop.coupon.page();\n};\n","import isMobile from '../util/isMobile';\n\nexport default {\n isMobile\n};","import './trace/trace';\n\nimport * as message from './message/js/message';\nimport cookie from './cookie/cookie';\nimport * as layer from './layer/js/layer';\nimport Player from './player/js/player';\nimport Sequenceplayer from './sequenceplayer/js/sequenceplayer';\nimport Preloader from './preloader/js/preloader';\nimport Cnb from './cnb/cnb';\nimport Comment from './comment/comment';\nimport share from './share/js/share';\nimport {coupon, couponInit} from './coupon/coupon';\nimport remote from './remote/js/remote';\nimport plugin from './plugin/js/plugin';\nimport util from './util/util';\nimport swipers from './swipers/js/swipers';\n\nplugin();\nshare.init();\ncouponInit();\n\nexport default {\n Cnb,\n Comment,\n cookie,\n ...layer,\n ...message,\n Player,\n Sequenceplayer,\n Preloader,\n share,\n coupon,\n remote,\n util,\n swipers\n};\n","import environment from '../util/environment';\nimport loadCss from '../util/loadCss';\nimport loadJs from '../util/loadJs';\n\nlet nccommunityJs = 'https://wstatic-cdn.plaync.com/uikit/nccommunity/js/index.js';\nlet nccommunityCss = 'https://wstatic-cdn.plaync.com/uikit/nccommunity/css/comment.css';\n\nclass PromoComment {\n constructor(options){\n loadCss(nccommunityCss);\n\n let articleId = typeof options.articleId === 'object' ? options.articleId[environment()] : options.articleId;\n\n let config = {\n board: 'promotioncomment',\n isMyProfile: false,\n isNcAccount: true,\n isShowCommentOrderType: false,\n articleId: articleId,\n isPaging: typeof options.isPaging === 'undefined' ? true : options.isPaging,\n isNoReply: !options.replay,\n commentListSize: options.size || 5,\n commentTextMaxCount: options.max || 300,\n apiPath: options.apiPath || '/events/api/'\n };\n\n window.userData = options.userData;\n window._path = config.apiPath;\n\n if(options.max && options.max !== 300) {\n config.commentPlaceholder = '댓글은 ' + options.max + '자 까지 작성 가능합니다.';\n }\n\n loadJs(nccommunityJs, function(){\n let _comment = new ui.ncCommunity.CommentSingle($(options.el), config);\n _comment.get();\n });\n }\n}\n\nexport default PromoComment;","const loadCss = (src, callback) =>{\n const css = document.createElement('link');\n\n css.setAttribute('rel', 'stylesheet');\n css.setAttribute('href', src);\n\n\n if(css.readyState) {\n css.onreadystatechange = function(){\n if(css.readyState === \"loaded\" || css.readyState === \"complete\") {\n css.onreadystatechange = null;\n callback && callback();\n }\n }\n } else {\n css.onload = function(){\n callback && callback();\n };\n }\n\n document.getElementsByTagName('head')[0].appendChild(css);\n};\n\nexport default loadCss;"],"names":["removeSpace","str","replace","getGameName","url","location","href","gameName","test","trace","clickTraceStr","_trk_clickTrace","param1","param2","log","pageTitle","removespace","document","title","split","$","on","gamename","ko","this","attr","isMobile","agent","navigator","userAgent","toLowerCase","Layer","_setLayer","_setLayerContents","config","el","_setLayerBackDrop","_addEvent","DOM","LAYER","name","addClass","appendTo","contents","LAYERCONTENTS","find","empty","append","CONTENTS","css","padding","BACKDROP","dimClickClose","e","target","is","_this","close","esc","keyCode","isActive","event","removeClass","fadeOut","fade","duration","HTML","_this2","BODY","scrollTop","state","offsetTop","trigger","htmlTop","bodyTop","fadeIn","window","EVENT","OPENSTART","_toggleLayer","OPENEND","dim","_toggleBackdrop","activeLayer","CLOSESTART","CLOSEEND","callback","off","options","open","bind","_init","layerMap","openedLayerId","each","id","hash","data","preventDefault","layer","MessageNotice","template","resolve","run","closeMessage","addEvent","MessageConfirm","reject","closeConfirm","openMessage","message","confirm","alertMessage","trim","String","prototype","getCookie","key","cookie","compare","cookies","i","length","setCookie","value","expires","now","Date","setDate","getDate","end","Math","floor","setHours","getHours","setMinutes","getMinutes","setSeconds","getSeconds","day","hour","min","sec","domain","substring","indexOf","toUTCString","openConfirm","Number","requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","msRequestAnimationFrame","f","setTimeout","cancelAnimationFrame","mozCancelAnimationFrame","requestID","AnimationFrame","delta","loop","then","interval","fps","animate","YoutubePlayer","Event","source","addEventListener","eventName","oldEvent","context","_setEvent","playVideo","stopVideo","pauseVideo","mute","unMute","t","seekTo","getDuration","getCurrentTime","props","playerId","hideLoading","YT","Player","videoId","autoPlay","_handleReady","VideoPlayer","play","pause","currentTime","muted","load","GifReader","buf","p","width","height","pf0","global_palette_flag","num_global_colors","global_palette_offset","no_eof","frames","delay","transparent_index","disposal","loop_count","block_size","pf1","toString","x","y","w","h","pf2","interlace_flag","palette_offset","has_local_palette","data_offset","push","numFrames","loopCount","frameInfo","frame_num","decodeAndBlitFrameRGBA","pixels","frame","num_pixels","index_stream","Uint8Array","code_stream","output","output_length","min_code_size","clear_code","eoi_code","next_code","cur_code_size","code_mask","cur_shift","cur","op","subblock_size","code_table","Int32Array","prev_code","code","chase_code","chase_length","chase","k","b","trans","framewidth","framestride","xleft","opbeg","opend","scanstride","interlaced","interlaceskip","il","r","g","index","GifPlayer","src","oReq","XMLHttpRequest","responseType","onload","arrayBuffer","response","send","info","imageData","cxt","createImageData","sourceInfo","gif","totalFrame","videoWidth","videoHeight","screen","_decode","putImageData","q","clearRect","nowFrame","to","isPlay","seek","animationFrame","stop","_render","start","getContext","gifFps","loadGIF","playerList","PlayerVideo","PlayerYoutube","PlayerGif","controls","tag","firstScriptTag","check","sourceType","playerContext","_getPlayerType","lastIndexOf","_handleTimeUpdate","timer","isControlShow","poster","show","player","_getMovieSize","offsetWidth","offsetHeight","_detectDom","_controller","isReady","autoplay","_detectDimension","type","loadYoutubeApi","createElement","getElementsByTagName","parentNode","insertBefore","setInterval","progress","progressBar","clientX","progressLeft","coverClick","spinner","getBoundingClientRect","left","bar","toFixed","fileType","contextWidth","contextHeight","setWidth","setHeight","getcookie","getCurrent","eventListener","_option","TypeError","querySelector","selector","extend","SequencePlayer","canvas","canvasContext","_loadData","img","Image","path","prefix","_loadComplete","sequence","loadCount","screenWidth","screenHeight","preDecode","drawImage","_this3","func","_setCanvas","environment","ImageLoader","_onSuccess","onerror","_onFail","VideoLoader","video","checkState","readyState","YoutubeLoader","loaded","Preloader","store","loadSize","image","youtube","resourcePath","static","game","en","ismobile","_setTheme","_loadFile","_updateBar","theme","_themeTemplate","loaderStyle","comment","animationId","animationframe","progressSize","removeType","remove","loadSuccess","msg","loadFail","loadJs","script","setAttribute","onreadystatechange","appendChild","shareFacebook","shareUrl","encodeURIComponent","shareTwitter","text","shareKakaoStory","shareKakaoTalk","loc","Object","assign","content","settings","shareTitle","shareDescription","imageSrc","imageWidth","imageHeight","buttonText","kakaoKey","Kakao","cleanup","init","Link","sendDefault","shareLine","isOs","findBrowser","copyUrl","getSelection","removeAllRanges","urlField","range","createRange","selectNode","addRange","execCommand","localUserData","api","coupon","size","list","button","max","getShareBox","tagName","className","baseVal","shareArea","dom_share","dom_shareList","width_list","width_screen","width_button","value_adjust","offset_shareLeft","position_shareList","position_shareListRight","position_shareListCenter","hasClass","toggleClass","closest","offset","shareType","Remote","opts","$wrap","element","$gnb","children","$snb","$cnb","$cnbli","$con","$scon","$btnArrow","arrowSlide","quick","reStr","mobileBodyFix","listSlide","matchMedia","matches","resizeWidth","outerWidth","mobileMask","scrollAction","resize","scChk","num","parent","eq","scltop","top","fix","quickAnchor","firstTop","undefined","margin","distinction","len","conTop","gnbNum","j","slen","sconTop","snbNum","removeChk","endScroll","remoteShowHide","display","right","scrollTopSave","position","overflow","marginTop","before","conOffset","cspeed","flag","abs","ceil","mySwiper","maxLength","remote","lan","swipers","direction","Swiper","rotate","stretch","depth","modifier","slideShadows","watchState","slides","Getcookie","activeIndex","hide","once","navAnchor","TopBtn","$topBtn","$caution","$window","currentPos","startPoint","Folding","isVisible","$panel","$foldingBtn","$isNext","next","$viewHeight","FullHeader","FixHeader","$coverHeight","$value","$header","that","screenChk","scroll","scrollY","currentTarget","CoachMarks","$guide","positionChk","scrollEvt","goTopEvt","outerHeight","toggleEvt","slideUp","slideDown","margin-top","fn","CoachMark","share","match","nshop","page","gameInfo","apiUrl","couponUrl","style","cnbConfig","babelHelpers.typeof","bi","large","medium","mediumSticky","lnb","header","color","ajax","withCredentials","done","userData","isLogin","login","cnb","openPopup","obj","objWidth","objHeight","objName","objScroll","deny","objFull","addParam","objScrollCopy","setup","win","focus","openPopupUnban","articleId","isPaging","replay","apiPath","_path","commentPlaceholder","ui","ncCommunity","CommentSingle","get"],"mappings":"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"}