{"version":3,"file":"promokit.js","sources":["../_src/message/message-alert.js","../_src/util/isMobile.js","../_src/message/message.js","../_src/message/message-landscape.js","../_src/util/removeSpace.js","../_src/util/gameName.js","../_src/trace/trace.js","../_src/util/trim.js","../_src/cookie/setcookie.js","../_src/cookie/cookie.js","../_src/cookie/getcookie.js","../_src/cookie/delcookie.js","../_src/layer/layer.js","../_src/player/youtube-player.js","../_src/player/video-player.js","../_src/player/player.js","../_src/util/environment.js","../_src/util/animationFrame.js","../_src/preloader/image-loader.js","../_src/preloader/video-loader.js","../_src/preloader/youtube-loader.js","../_src/preloader/preloader.js","../_src/cnb/cnb.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/googleplus.js","../_src/share/js/line.js","../_src/util/isOs.js","../_src/share/js/copyurl.js","../_src/share/js/share.js","../_src/comment/comment.js","../_src/util/loadCss.js","../_src/promokit.js","../_src/remote/remote.js"],"sourcesContent":["const messageAlert = () =>{\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};\n\nexport default messageAlert;\n","/**\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 messageAlert from \"./message-alert\";\nimport messageLandscape from './message-landscape';\n\nimport isMobile from '../util/isMobile';\n\nmessageAlert();\nisMobile() && messageLandscape();","const template = `
\n
\n
\n

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

\n

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

\n
\n
\n
`;\n\nconst messageLandscape = () =>{\n $('body').append(template);\n};\n\nexport default messageLandscape;","/**\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 return gameName;\n};\n\nexport default getGameName;","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 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 * @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(\n trim($(this).attr('data-cookie').split(',')[0]),\n trim($(this).attr('data-cookie').split(',')[1]),\n !!$(this).attr('data-cookie').split(',')[2] ? Number(trim($(this).attr('data-cookie').split(',')[2])) : 1\n );\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 * 브라우저 쿠키 추출\n * @param key\n * @returns {*}\n */\nconst getCookie = (key) =>{\n if(!document.cookie) {\n return;\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;","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;","export 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 this.DOM.LAYER = $(`
\n
\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.odd(event);\n }\n}\n\nlet layerMap = {};\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 window.activeLayer && window.activeLayer.close();\n};\n\nlet open = (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};","class YoutubePlayer {\n constructor(_option){\n if(!_option && typeof(_option) !== 'object') {\n throw new TypeError(\"Player module need object type option\");\n }\n\n if(_option && !document.querySelector(_option.selector)) {\n throw new TypeError(`no ${_option.selector} DOM Element`);\n }\n\n this.context = $(_option.selector);\n\n this.player = null;\n\n this.config = $.extend({\n fps: 60,\n videoId: '',\n playerId: '',\n mute: false,\n autoPlay: false,\n loop: false,\n controls: false,\n coverClick: false\n }, _option);\n\n this.config.playerId = `${_option.selector.replace(/^#/, '')}__${this.config.videoId}`;\n\n this.state = {\n isPlay: false,\n isControlShow: true,\n animationFrame: 0,\n timer: null,\n isReady: false,\n isTouchInit: false\n };\n\n this.template = {\n player: `
`,\n controls: `
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t \t\t
\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t
`,\n cover: `
`,\n poster: `
`\n };\n\n this.DOM = {\n controls: null,\n progress: null,\n progressBar: null,\n poster: null,\n play: null,\n pause: null\n };\n\n this.dimension = {\n progress: 0,\n progressLeft: 0,\n };\n\n this._handleStateChange = this._handleStateChange.bind(this);\n this._handleReady = this._handleReady.bind(this);\n this._animationFrame = this._animationFrame.bind(this);\n }\n\n init(){\n if(window.YT && window.YT.Player) {\n this._setPlayer();\n return;\n }\n\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 this._setPlayer();\n }\n }, 200);\n\n }\n\n _setPlayer(){\n this._renderPlayer();\n\n this.player = new window.YT.Player(this.config.playerId, {\n width: '100%',\n height: '100%',\n videoId: this.config.videoId,\n playerVars: {\n modestbranding: 1,\n rel: 0,\n showinfo: 0,\n controls: 0,\n playsinline: 1,\n autoplay: this.config.autoPlay === true ? 1 : 0,\n loop: this.config.loop === true ? 1 : 0,\n playlist: this.config.loop === true ? this.config.videoId : ''\n },\n events: {\n onStateChange: this._handleStateChange,\n onReady: this._handleReady\n }\n });\n\n this._detectDom();\n this._detectDimension();\n this._setMovieSize();\n }\n\n _renderPlayer(){\n this.context.append(this.template.player);\n this.context.append(this.template.poster);\n this.context.append(this.template.cover);\n this.config.controls && this.context.append(this.template.controls);\n }\n\n _detectDom(){\n this.DOM.poster = this.context.find('.player__poster');\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 }\n }\n\n _detectDimension(){\n if(this.config.controls) {\n this.dimension.progress = this.DOM.progress.width();\n this.dimension.progressLeft = this.DOM.progress[0].getBoundingClientRect().left;\n }\n }\n\n _setMovieSize(){\n let contextWidth = this.context[0].offsetWidth;\n let contextHeight = this.context[0].offsetHeight;\n let setWidth = 0;\n let setHeight = 0;\n\n if((contextWidth / contextHeight) < (1280 / 720)) {\n setWidth = contextHeight * 1280 / 720;\n setHeight = contextHeight;\n } else {\n setWidth = contextWidth;\n setHeight = contextWidth * 720 / 1280;\n }\n\n $(`#${this.config.playerId}`).css({\n width: setWidth,\n height: setHeight\n });\n }\n\n _setEvent(){\n if(this.config.controls) {\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.dimension.progress - (e.clientX - this.dimension.progressLeft)) / this.dimension.progress) * this.player.getDuration());\n\n if(!this.state.isPlay) {\n this._handleProgressUpdate((e.clientX - this.dimension.progressLeft) / this.dimension.progress);\n }\n });\n\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 } 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__controls', () =>{\n if(!this.state.isPlay) return;\n clearTimeout(this.state.timer);\n this.DOM.controls.removeClass('player__controls_hide');\n });\n\n this.context.on('mouseout', '.player__controls', () =>{\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\n if(this.config.coverClick) {\n this.context.on('click', '.player__cover', () =>{\n this.state.isPlay ? this.pause() : this.play();\n });\n }\n\n $(window).on('resize.player', () =>{\n this.config.controls && this._detectDimension();\n this._setMovieSize();\n });\n }\n\n _handleReady(){\n this.state.isReady = true;\n $(window).trigger(`canplay.${this.config.selector.replace(/^([#.])/, '')}`);\n $(window).trigger(`canplay.${this.config.videoId}`);\n\n this._setMovieSize();\n this._setEvent();\n $('#' + this.config.playerId).addClass('isReady');\n\n if(this.config.mute) {\n this.mute();\n }\n }\n\n _handleStateChange(e){\n switch(e.data) {\n case YT.PlayerState.PLAYING:\n if(this.state.isPlay) return;\n this.state.isPlay = true;\n\n if(this.config.controls) {\n this.DOM.play.removeClass('player__play_show');\n this.DOM.pause.addClass('player__pause_show');\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\n this._animationFrame(this.state.animationFrame, this._handlePlayUpdate, e);\n\n this.DOM.poster.fadeOut();\n break;\n\n case YT.PlayerState.PAUSED:\n cancelAnimationFrame(this.state.animationFrame);\n this.state.isPlay = false;\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\n this.state.isControlShow = true;\n }\n break;\n\n case YT.PlayerState.CUED:\n cancelAnimationFrame(this.state.animationFrame);\n this.state.isPlay = false;\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\n this.state.isControlShow = true;\n }\n\n this.DOM.poster.show();\n\n if(this.config.controls) {\n this._handleProgressUpdate(0, 0);\n }\n\n break;\n\n case YT.PlayerState.ENDED:\n cancelAnimationFrame(this.state.animationFrame);\n this.state.isPlay = false;\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\n this.state.isControlShow = true;\n }\n\n this.DOM.poster.show();\n\n $(window).trigger(`end.${this.config.selector.replace(/^#/, '')}`);\n\n break;\n }\n }\n\n _handlePlayUpdate(e){\n this.config.controls && this._handleProgressUpdate(e.target.getCurrentTime() / this.player.getDuration());\n }\n\n _handleProgressUpdate(bar){\n this.DOM.progressBar.css({\n 'transform': `scale(${bar > 1 ? 1 : bar}, 1)`\n });\n }\n\n _animationFrame(reqId, doFunc, e){\n let loop = () =>{\n doFunc.call(this, e);\n this.state.isPlay && (reqId = requestAnimationFrame(loop));\n };\n\n loop();\n };\n\n setTouchInit(){\n this.state.isTouchInit = true;\n }\n\n play(){\n this.state.isReady && !this.state.isPlay && this.player.playVideo();\n }\n\n stop(){\n this.player.stopVideo();\n }\n\n pause(){\n this.player.pauseVideo();\n }\n\n mute(){\n this.player.mute();\n }\n\n unMute(){\n this.player.unMute();\n }\n\n seek(t){\n this.player.seekTo(t);\n }\n\n}\n\nexport default YoutubePlayer;","class VideoPlayer {\n constructor(_option){\n if(!_option && typeof(_option) !== 'object') {\n throw new TypeError(\"Player module need object type option\");\n }\n\n if(_option && !document.querySelector(_option.selector)) {\n throw new TypeError(`no ${_option.selector} DOM Element`);\n }\n\n this.context = $(_option.selector);\n\n this.player = null;\n\n this.config = $.extend({\n fps: 60,\n videoId: '',\n playerId: '',\n mute: false,\n autoPlay: false,\n loop: false,\n controls: false,\n coverClick: false,\n poster: false\n }, _option);\n\n this.config.playerId = `${_option.selector.replace(/^#/, '')}__screen`;\n\n this.state = {\n isPlay: false,\n isControlShow: true,\n animationFrame: 0,\n timer: 0,\n isReady: false,\n firstPlay: false\n };\n\n this.template = {\n player: `\n\t\t\t\t\t`,\n controls: `
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t \t\t
\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t
`,\n cover: `
`,\n poster: `
`\n };\n\n this.DOM = {\n controls: null,\n progress: null,\n progressBar: null,\n play: null,\n pause: null,\n poster: false\n };\n\n this.dimension = {\n progress: 0,\n progressLeft: 0,\n };\n\n this._handleStateChange = this._handleStateChange.bind(this);\n this._handleReady = this._handleReady.bind(this);\n this._animationFrame = this._animationFrame.bind(this);\n }\n\n init(){\n this._setPlayer();\n }\n\n _setPlayer(){\n this._renderPlayer();\n this.video = $('#' + this.config.playerId)[0];\n this.video.load();\n\n this._detectDom();\n this._detectDimension();\n\n $(this.video).on('canplay', this._handleReady);\n }\n\n _renderPlayer(){\n this.context.append(this.template.player);\n this.context.append(this.template.cover);\n this.config.poster && this.context.append(this.template.poster);\n this.config.controls && this.context.append(this.template.controls);\n }\n\n _detectDom(){\n this.DOM.poster = this.config.poster && this.context.find('.player__poster');\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 }\n }\n\n _detectDimension(){\n if(this.config.controls) {\n this.dimension.progress = this.DOM.progress.width();\n this.dimension.progressLeft = this.DOM.progress[0].getBoundingClientRect().left;\n }\n }\n\n _setMovieSize(){\n const contextWidth = this.context[0].offsetWidth;\n const contextHeight = this.context[0].offsetHeight;\n\n const videoWidth = this.video.videoWidth;\n const videoHeight = this.video.videoHeight;\n\n let setWidth = 0;\n let setHeight = 0;\n\n if((contextWidth / contextHeight) < (videoWidth / videoHeight)) {\n setWidth = contextHeight * videoWidth / videoHeight;\n setHeight = contextHeight;\n } else {\n setWidth = contextWidth;\n setHeight = contextWidth * videoHeight / videoWidth;\n }\n\n $(`#${this.config.playerId}`).css({\n width: setWidth,\n height: setHeight\n });\n }\n\n _setEvent(){\n if(this.config.controls) {\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.dimension.progress - (e.clientX - this.dimension.progressLeft)) / this.dimension.progress) * this.video.duration);\n\n if(!this.state.isPlay) {\n this._handleProgressUpdate((e.clientX - this.dimension.progressLeft) / this.dimension.progress);\n }\n\n this.state.firstPlay || this.play();\n });\n\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 } 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__controls', () =>{\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__controls', () =>{\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\n if(this.config.coverClick) {\n this.context.on('click', '.player__cover', () =>{\n this.state.isPlay ? this.pause() : this.play();\n });\n }\n\n $(window).on('resize.player', () =>{\n this.config.controls && this._detectDimension();\n this._setMovieSize();\n });\n\n $(this.video).on('ended', () =>{\n this._handleStateChange('end');\n });\n\n $(this.video).on('play', () =>{\n this._handleStateChange('play');\n });\n\n if(this.config.autoPlay) {\n $(this.video).one('playing', () =>{\n this._handleStateChange('play');\n });\n }\n\n $(this.video).on('timeupdate', () =>{\n this.config.poster && this.DOM.poster.hide();\n });\n\n $(this.video).on('pause', () =>{\n this._handleStateChange('pause');\n });\n\n $(this.video).on('durationchange', (e) =>{\n this._setMovieSize();\n });\n }\n\n _handleReady(){\n this.state.isReady = true;\n $(this.video).off('canplay');\n $(window).trigger(`canplay.${this.config.selector.replace(/^#/, '')}`);\n\n this._setMovieSize();\n this._setEvent();\n $(this.video).addClass('isReady');\n\n this.config.mute && this.mute();\n\n if(this.config.autoPlay) {\n this.play();\n }\n }\n\n _handleStateChange(state){\n switch(state) {\n case 'play':\n this.state.firstPlay = this.state.firstPlay || true;\n\n if(this.state.isPlay) return;\n this.state.isPlay = true;\n\n if(this.config.controls) {\n\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\n this._animationFrame(this.state.animationFrame, this._handlePlayUpdate, this.config.fps);\n break;\n\n case 'pause':\n this.state.isPlay = false;\n cancelAnimationFrame(this.state.animationFrame);\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 break;\n\n case 'end':\n this.state.isPlay = false;\n cancelAnimationFrame(this.state.animationFrame);\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 this.video.pause();\n\n $(window).trigger(`end.${this.config.selector.replace(/^#/, '')}`);\n\n this.config.loop ? this.play() : this.config.poster && this.DOM.poster.show();\n break;\n }\n }\n\n _handlePlayUpdate(){\n this.config.controls && this._handleProgressUpdate(this.video.currentTime / this.video.duration);\n }\n\n _handleProgressUpdate(bar){\n this.DOM.progressBar.css({\n 'transform': `scale3d(${bar > 1 ? 1 : bar}, 1,1 )`\n });\n }\n\n _animationFrame(reqId, doFunc){\n const loop = () =>{\n doFunc.call(this);\n this.state.isPlay && (reqId = requestAnimationFrame(loop));\n };\n loop();\n }\n\n play(){\n this.state.isReady && !this.state.isPlay && this.video.play();\n }\n\n stop(){\n this.video.pause();\n this.video.currentTime = 0;\n this._handlePlayUpdate();\n }\n\n pause(){\n this.video.pause();\n }\n\n mute(){\n this.video.muted = true;\n }\n\n unMute(){\n this.video.muted = false;\n }\n\n seek(t){\n this.video.currentTime = t;\n }\n}\n\nexport default VideoPlayer;","import YoutubePlayer from './youtube-player';\nimport VideoPlayer from './video-player';\n\nclass Player {\n constructor(_option){\n let extName = _option.videoId.substring(_option.videoId.lastIndexOf('.', _option.videoId.length)).toLowerCase();\n\n if(extName === '.mp4' || extName === '.webm') {\n this.player = new VideoPlayer(_option);\n } else {\n this.player = new YoutubePlayer(_option);\n }\n\n if(_option.autoPlay) {\n if(navigator.userAgent.match(/SamsungBrowser/)) {\n $(document).one(`click.player.autoPlay`, 'body', () =>{\n console.log('body click');\n this.play();\n });\n } else {\n $(document).one(`touchstart.player.autoPlay`, 'body', () =>{\n this.play();\n });\n }\n }\n this.init();\n }\n\n init(){\n this.player.init();\n }\n\n play(){\n this.player.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\nexport default Player;","/**\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;","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 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}/uikit/preloader/v2.2/loader_aion_off.png`, `${this.store.static}/uikit/preloader/v2.2/loader_aion_on.png`, \"#020811\"],\n \"lineage\": [`${this.store.static}/uikit/preloader/v2.2/loader_lineage_off.png`, `${this.store.static}/uikit/preloader/v2.2/loader_lineage_on.png`, \"#020811\"],\n \"lineage2\": [`${this.store.static}/uikit/preloader/v2.2/loader_lineage2_off.png`, `${this.store.static}/uikit/preloader/v2.2/loader_lineage2_on.png`, \"#020811\"],\n \"lineage2classic\": [`${this.store.static}/uikit/preloader/v2.2/loader_lineage2classic_off.png`, `${this.store.static}/uikit/preloader/v2.2/loader_lineage2classic_on.png`, \"#020811\"],\n \"bns\": [`${this.store.static}/uikit/preloader/v2.2/loader_bns_off.png`, `${this.store.static}/uikit/preloader/v2.2/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;","import gamename from '../util/gameName';\nimport environment from '../util/environment';\n\nconst gameInfo = gamename();\n\nconst api = {\n local: 'http://opdev.api.lineage.plaync.com',\n rc: 'https://rc-apilineage.plaync.com',\n live: 'https://api-lineage.plaync.com'\n};\n\nconst coupon = {\n local: 'http://lineagenshop.plaync.com/lineage/coupon/popup/couponProfileRegisterForm?gameCode=31',\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\nconst apiPath = api[environment()];\nconst couponPath = coupon[environment()];\n\nclass Cnb {\n constructor(options){\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: couponPath\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': {\n 'width': 82,\n 'height': 26,\n 'marginTop': 15\n }\n },\n 'medium': {\n 'path': options.image.medium,\n 'style': {\n 'width': 82,\n 'height': 26,\n 'marginTop': 15\n }\n },\n 'sticky': {\n 'path': options.image.mediumSticky,\n 'style': {\n 'width': 82,\n 'height': 26,\n 'marginTop': 15\n }\n },\n 'lnb': {\n 'path': options.image.lnb,\n 'style': {\n 'width': 82,\n 'height': 26,\n 'marginTop': 15\n }\n }\n };\n } else {\n cnbConfig.bi.image = {\n 'path': options.image,\n 'style': {\n 'width': 82,\n 'height': 26,\n 'marginTop': 15\n }\n };\n }\n \n cnbConfig.header = options.color;\n \n $.ajax({\n url: `${apiPath}/api/main/cnb/userData`,\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 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 \n window.openPopupUnban = function (url){\n openPopup(url, 580, 370, 'unban', 1, 1);\n return false;\n };\n \n }\n}\n\nexport default Cnb;","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 = {\n ...{\n shareUrl: location.href,\n shareText: trim(document.title.split(/\\:\\s+plaync/)[0]),\n buttonText: '자세히 보기',\n imageSrc: document.querySelector('[property=\"og:image\"]').content,\n imageWidth: 300,\n imageHeight: 157\n }, ...options\n };\n\n const getKey = (loc) =>{\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(/mxm.plaync.co/.test(loc)) {\n return '40481a2626902d33625a1522661be8b8';\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 label: config.shareText,\n image: {\n src: config.imageSrc,\n width: config.imageWidth,\n height: config.imageHeight\n },\n webButton: {\n text: config.buttonText,\n url: config.shareUrl\n }\n };\n\n let kakaoKey = getKey(config.url);\n\n if(window.Kakao) {\n window.Kakao.init(kakaoKey);\n window.Kakao.Link.sendTalkLink(settings);\n return;\n }\n\n loadJs('https://developers.kakao.com/sdk/js/kakao.min.js', () =>{\n window.Kakao.init(kakaoKey);\n window.Kakao.Link.sendTalkLink(settings);\n });\n};\n\nexport default shareKakaoTalk;","/**\n * google plus 공유하기\n * https://developers.google.com/+/web/share/#share-link\n * @param shareUrl\n */\nlet shareGooglePlus = (shareUrl = location.href) =>{\n let url = \"https://plus.google.com/share?url=\" + encodeURIComponent(shareUrl);\n\n window.open(url);\n};\n\nexport default shareGooglePlus;","/**\n * line 공유하기\n * @param shareUrl\n */\nlet shareLine = (shareUrl = location.href) =>{\n let url = `https://lineit.line.me/share/ui?url=${encodeURIComponent(shareUrl)}`;\n window.open(url);\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';\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 alert('URL 복사가 완료 되었습니다.')\n};\n\nexport default copyUrl;\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 googleplus from './googleplus';\nimport line from './line';\nimport copyurl from './copyurl';\n\nlet pageTitle = removespace(document.title).split(':plaync')[0];\n\nconst getShareBox = (list) =>{\n let button = '';\n for(let i = 0, max = list.length; i < max; i++) {\n button += `${list[i]} 공유하기`;\n }\n return `
${button}
`;\n};\n\n$('.share').each(function(){\n $(this).append(getShareBox(['facebook', 'twitter', 'googleplus', 'kakaotalk', 'line', 'url']));\n\n if(isMobile()) {\n $(this).addClass('share--mobile');\n }\n});\n\nconst resetPosition = (shareArea) =>{\n let DOM_SHARE = shareArea;\n let DOM_SHARELIST = DOM_SHARE.find('.share__list');\n let listWidth = DOM_SHARELIST.width();\n let screenWidth = $(window).width();\n let buttonWidth = DOM_SHARE.find('.share__toggle').width();\n let offsetLeft = DOM_SHARE.offset().left;\n let offsetRight = offsetLeft + buttonWidth;\n\n let position = {left: `${(-listWidth / 2) + (buttonWidth / 2)}px`};\n\n if(offsetLeft + (buttonWidth / 2) < screenWidth / 2) {\n if((buttonWidth / 2 - 12) <= -offsetLeft + (screenWidth - listWidth) / 2) {\n position = {left: -offsetLeft};\n } else {\n position = {left: -offsetLeft + (screenWidth - listWidth) / 2};\n }\n }\n\n if(offsetLeft + (buttonWidth / 2) > screenWidth / 2) {\n if(buttonWidth / 2 - 12 <= -(screenWidth - offsetRight) + (screenWidth - listWidth) / 2) {\n position = {right: -(screenWidth - offsetRight)};\n } else {\n position = {right: -(screenWidth - offsetRight) + (screenWidth - listWidth) / 2};\n }\n }\n\n DOM_SHARELIST.css(position);\n};\n\n$(document).on(isMobile() ? 'touchstart.promo.share' : 'click.promo.share', (e) =>{\n if(/(share__button|share__list|share__toggle)/i.test(e.target.className)) return;\n\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(shareUrl);\n break;\n\n case 'googleplus':\n googleplus(shareUrl);\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\nexport default {\n facebook,\n twitter,\n kakaostory,\n kakaotalk,\n googleplus,\n line,\n copyurl\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;","import './message/message';\nimport './trace/trace';\n\nimport cookie from './cookie/cookie';\nimport * as layer from './layer/layer';\nimport Player from './player/player';\nimport Preloader from './preloader/preloader';\nimport Cnb from './cnb/cnb';\nimport Comment from './comment/comment';\nimport share from './share/js/share';\nimport remote from './remote/remote';\n\nexport default {\n Cnb,\n Comment,\n cookie,\n ...layer,\n Player,\n Preloader,\n share,\n remote\n}","var remote = function(opts){\n\n var $wrap = $(opts.element),\n $gnb = $wrap.find($(\"[data-remote='wrap']\")).children(\"[data-list='list']\"),\n $snb = $gnb.find(\"[data-list='list']\"),\n $con = $(\"[data-contents='con']\"), $scon = $(\"[data-contents='scon']\"), $btnArrow = $(\"[data-btn='arrow']\");\n\n var resizeTimer, isMobile, resizeWidth, _settings = true, gnbNum, snbNum, removeChk = false, scChk = false;\n\n arrowSlide();\n controls();\n\n function controls(){\n if(opts.quick) {\n $gnb.children(\"a\").on(\"click\", function(e){\n var hash = $(this).attr(\"href\"), reStr = hash.replace(/#/g, \"\");\n listSlide(reStr);\n });\n\n $snb.children(\"a\").on(\"click\", function(e){\n var hash = $(this).attr(\"href\"), reStr = hash.replace(/#/g, \"\");\n listSlide(reStr);\n });\n }\n\n $(window).on(\"resize\", function(){\n isMobile = (window.matchMedia(\"(min-width:769px)\").matches) ? false : true;\n resizeWidth = $wrap.outerWidth();\n clearTimeout(resizeTimer);\n resizeTimer = setTimeout(function() {\n if(opts.show){\n opts.show = false;\n arrowSlide();\n }else{\n mobileMask();\n }\n scrollAction();\n }, 0);\n }).resize();\n\n $(window).on(\"scroll\", function(){\n if(scChk){\n scrollAction();\n }\n scChk = true;\n return false;\n });\n\n $btnArrow.on(\"click\", function(e){\n arrowSlide();\n });\n\n $(document).on(\"click\", \"[data-remote='mask']\", function(e){\n arrowSlide();\n });\n };\n\n function scrollAction(){\n var scltop = $(window).scrollTop();\n if(!isMobile){\n if(scltop >= opts.top - opts.fix) {\n $wrap.addClass(\"fix\").css({top:opts.fix});\n }else{\n $wrap.removeClass(\"fix\").css({top:opts.top});\n }\n }else{\n $wrap.removeClass(\"fix\").css({top:\"\"});\n }\n\n quickAnchor(scltop)\n }\n\n function quickAnchor(scltop){\n var firstTop = $con.eq(0).offset().top,\n lastBottom = $con.eq($con.length - 1).offset().top + $con.eq($con.length - 1).height(),\n endScroll = $(window).scrollTop() == $(document).height() - $(window).height();\n for(var i = 0, len = $con.length; i < len; i++) {\n var conTop = $con.eq(i).offset().top;\n if(conTop <= scltop) {\n gnbNum = i;\n for(var j = 0, slen = $con.eq(i).children($scon).length; j < slen; j++) {\n var sconTop = $con.eq(i).children($scon).eq(j).offset().top;\n if(sconTop <= scltop) {\n snbNum = j;\n }\n }\n }\n removeChk = (scltop < firstTop || scltop > lastBottom) ? true : false;\n }\n\n if(opts.quick) {\n if(!removeChk) {\n $gnb.removeClass(\"active\");\n $gnb.find($snb).removeClass(\"active\");\n if(endScroll){\n $gnb.eq($gnb.length-1).addClass(\"active\");\n $gnb.eq($gnb.length-1).find($snb).eq($gnb.eq($gnb.length-1).find($snb).length-1).addClass(\"active\");\n }else{\n $gnb.eq(gnbNum).addClass(\"active\");\n $gnb.eq(gnbNum).find($snb).eq(snbNum).addClass(\"active\");\n }\n } else {\n $gnb.removeClass(\"active\");\n $gnb.find($snb).removeClass(\"active\");\n }\n }\n\n remoteShowHide();\n }\n\n function remoteShowHide(){\n if(!removeChk){\n $wrap.css({display:\"block\"});\n }else{\n if(isMobile){\n opts.show = false;\n }else{\n opts.show = (opts.show) ? false : true;\n }\n arrowSlide();\n $wrap.css({display:\"none\"});\n }\n }\n\n function arrowSlide(){\n if(opts.show) {\n $wrap.stop().animate({right:0}, 250).find($btnArrow).addClass(\"on\");\n opts.show = false;\n }else{\n $wrap.stop().animate({right:-resizeWidth}, 250).find($btnArrow).removeClass(\"on\");\n opts.show = true;\n }\n mobileMask();\n }\n\n function mobileMask(){\n $(\"#mask\").remove();\n if(isMobile){\n if(!opts.show){\n $wrap.before($(\"
\"));\n $(\"body, html\").css({height:\"auto\", overflow:\"hidden\"});\n }else{\n $(\"body, html\").css({height:\"\", overflow:\"\"});\n }\n }else{\n $(\"body, html\").css({height:\"\", overflow:\"\"});\n }\n }\n\n function listSlide(id){\n var conOffset = $(\"[data-id='\" + id + \"']\").offset().top;\n $(\"html, body\").stop().animate({scrollTop: conOffset}, opts.cspeed);\n if(isMobile){\n arrowSlide();\n }\n }\n};\n\nexport default remote;"],"names":["isMobile","agent","navigator","userAgent","toLowerCase","test","document","on","e","preventDefault","alertMessage","$","this","attr","replace","append","removeSpace","str","getGameName","url","location","href","gameName","pageTitle","removespace","title","split","trace","clickTraceStr","_trk_clickTrace","param1","param2","log","gamename","ko","trim","String","prototype","setCookie","key","value","expires","now","Date","setDate","getDate","end","Math","floor","setHours","getHours","setMinutes","getMinutes","setSeconds","getSeconds","day","hour","min","sec","cookie","domain","substring","indexOf","toUTCString","Number","compare","cookies","i","length","Layer","options","config","state","el","DOM","EVENT","open","bind","close","_init","_setLayer","_setLayerContents","_setLayerBackDrop","_addEvent","LAYER","name","appendTo","contents","LAYERCONTENTS","find","empty","CONTENTS","css","padding","BACKDROP","dimClickClose","target","is","_this","esc","keyCode","isActive","event","removeClass","fadeOut","fade","duration","HTML","_this2","BODY","scrollTop","offsetTop","trigger","addClass","htmlTop","bodyTop","fadeIn","window","OPENSTART","_toggleLayer","OPENEND","dim","_toggleBackdrop","activeLayer","CLOSESTART","CLOSEEND","callback","odd","layerMap","each","id","hash","data","layer","YoutubePlayer","_option","TypeError","querySelector","selector","context","player","extend","playerId","videoId","template","dimension","_handleStateChange","_handleReady","_animationFrame","YT","Player","_setPlayer","loadYoutubeApi","tag","createElement","src","firstScriptTag","getElementsByTagName","parentNode","insertBefore","check","setInterval","_renderPlayer","autoPlay","loop","_detectDom","_detectDimension","_setMovieSize","poster","cover","controls","progress","progressBar","play","pause","width","progressLeft","getBoundingClientRect","left","contextWidth","offsetWidth","contextHeight","offsetHeight","setWidth","setHeight","seek","clientX","getDuration","isPlay","_handleProgressUpdate","isControlShow","timer","setTimeout","coverClick","isReady","_setEvent","mute","PlayerState","PLAYING","_this3","animationFrame","_handlePlayUpdate","PAUSED","CUED","show","ENDED","getCurrentTime","bar","reqId","doFunc","call","requestAnimationFrame","isTouchInit","playVideo","stopVideo","pauseVideo","unMute","t","seekTo","VideoPlayer","lastIndexOf","video","load","videoWidth","videoHeight","firstPlay","one","hide","off","fps","currentTime","muted","extName","match","init","stop","environment","mozRequestAnimationFrame","webkitRequestAnimationFrame","msRequestAnimationFrame","f","cancelAnimationFrame","mozCancelAnimationFrame","requestID","AnimationFrame","animate","delta","then","interval","ImageLoader","props","img","Image","onload","_onSuccess","onerror","_onFail","VideoLoader","checkState","readyState","YoutubeLoader","loaded","Preloader","store","loadSize","image","youtube","resourcePath","static","game","en","ismobile","_setTheme","_loadFile","_updateBar","theme","_themeTemplate","height","w","h","loaderStyle","comment","item","animationId","animationframe","progressSize","delay","removeType","remove","start","type","msg","loadSuccess","loadFail","gameInfo","apiPath","couponPath","loadJs","script","setAttribute","onreadystatechange","appendChild","shareFacebook","shareUrl","encodeURIComponent","shareTwitter","text","shareKakaoStory","shareKakaoTalk","loc","content","settings","shareText","imageSrc","imageWidth","imageHeight","buttonText","kakaoKey","Kakao","Link","sendTalkLink","shareGooglePlus","shareLine","isOs","findBrowser","copyUrl","getSelection","removeAllRanges","urlField","range","createRange","selectNode","addRange","execCommand","list","button","max","getShareBox","className","hasClass","toggleClass","shareArea","DOM_SHARE","DOM_SHARELIST","listWidth","screenWidth","buttonWidth","offsetLeft","offset","offsetRight","position","right","closest","shareType","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","size","_path","commentPlaceholder","ui","ncCommunity","CommentSingle","get","opts","resizeTimer","resizeWidth","gnbNum","snbNum","$wrap","element","$gnb","children","$snb","$con","$scon","$btnArrow","removeChk","scChk","quick","reStr","matchMedia","matches","outerWidth","resize","scrollAction","scltop","top","fix","firstTop","eq","lastBottom","endScroll","len","conTop","j","slen","sconTop","display","arrowSlide","mobileMask","overflow","before","listSlide","conOffset","cspeed"],"mappings":"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"}