{"version":3,"file":"promo.js","sources":["../src/message/message.js","../src/animation/animationfame.js","../src/animation/animation.js","../src/util/trim.js","../src/util/removespace.js","../src/util/getwheeldirection.js","../src/util/ispreventtime.js","../src/cookie/setcookie.js","../src/cookie/cookie.js","../src/cookie/getcookie.js","../src/cookie/delcookie.js","../src/detect/ismobile.js","../src/detect/nowbrowser.js","../src/detect/vendorprefix.js","../src/detect/environment.js","../src/detect/gamename.js","../src/detect/detect.js","../src/lazyload/loadjs.js","../src/lazyload/loadcss.js","../src/layer/layer.js","../src/player/youtubeplayer.js","../src/player/videoplayer.js","../src/player/player.js","../src/preloader/preloader.js","../src/scenebox/scenebox.js","../src/cnb/cnb.js","../src/trace/trace.js","../src/share/facebook.js","../src/share/twitter.js","../src/share/kakaostory.js","../src/share/kakaotalk.js","../src/share/googleplus.js","../src/share/line.js","../src/share/share.js","../src/promo.js","../src/comment/comment.js"],"sourcesContent":["$(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});","class 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 then = Date.now();\n let interval = 1000 / this.fps;\n let loop;\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;","import animationframe from './animationfame';\n\nwindow.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\nexport default {\n animationframe\n}","/**\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 str\n * @returns {*|void|string|XML}\n */\n\nconst removeSpace = (str) =>{\n return str.replace(/\\s/gi, '');\n};\n\nexport default removeSpace;","/**\n * 마우스휠 이벤트 방향 감지\n *\n * @param e - mouse wheel event(mousewheel DOMMouseScroll)\n * @returns {number} - Return direction(up: -1 , down: 1)\n * @example\n *\n * $(window).on('mousewheel DOMMouseScroll', function(e){\n * getWheelDirection(e)\n * });\n *\n */\n\nconst getWheelDirection = (e) =>{\n if(e.type === \"DOMMouseScroll\") return e.originalEvent.detail > 0 ? 1 : -1;\n if(e.originalEvent.wheelDeltaY) return e.originalEvent.wheelDeltaY > 0 ? -1 : 1;\n return e.originalEvent.wheelDelta > 0 ? -1 : 1;\n};\n\nexport default getWheelDirection;","/**\n * 일정시간 동안 false를 반환\n *\n * @param diffTime - 기준시간\n * @param to - true를 얻기 위한 기준시간 부터 경과 시간(1/1000 s)\n * @returns {boolean}\n */\nconst isPreventTime = (diffTime, to = 1500) =>{\n return (new Date().getTime() - diffTime) < to;\n};\n\nexport default isPreventTime;","/**\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 util from '../util/util';\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 util.trim($(this).attr('data-cookie').split(',')[0]),\n util.trim($(this).attr('data-cookie').split(',')[1]),\n !!$(this).attr('data-cookie').split(',')[2] ? Number(util.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;","/**\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;","/**\n * 현재 브라우저 종류 체크\n * @param agent(navigator.userAgent)\n * @returns {*}\n */\nconst nowBrowser = (agent = navigator.userAgent.toLowerCase()) =>{\n let trident = agent.match(/trident\\/(\\d.\\d)/i);\n\n if(trident !== null) {\n if(trident[1] === \"7.0\") return \"IE\" + 11;\n if(trident[1] === \"6.0\") return \"IE\" + 10;\n if(trident[1] === \"5.0\") return \"IE\" + 9;\n if(trident[1] === \"4.0\") return \"IE\" + 8;\n }\n\n if(navigator.appName === 'Microsoft Internet Explorer') return \"IE\" + 7;\n\n if(agent.indexOf(\"edge\") !== -1) return 'Edge';\n if(agent.indexOf(\"chrome\") !== -1) return 'Chrome';\n if(agent.indexOf(\"opera\") !== -1) return 'Opera';\n if(agent.indexOf(\"firefox\") !== -1) return 'Firefox';\n if(agent.indexOf(\"safari\") !== -1) return 'Safari';\n};\n\nexport default nowBrowser;","import nowbrowser from './nowbrowser';\n\n/**\n * vendor prefix 설정\n * @param now\n * @returns {*}\n */\nconst vendorPrefix = (now = nowbrowser()) =>{\n let prefix = {\n IE11: '-ms-',\n IE10: '-ms-',\n IE9: '-ms-',\n Chrome: '-webkit-',\n Opera: '-o-',\n Firefox: '-moz-',\n Safari: '-webkit-',\n };\n\n return prefix[now];\n};\n\nexport default vendorPrefix;","/**\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;","/**\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 ismobile from './ismobile';\nimport nowbrowser from './nowbrowser';\nimport vendorprefix from './vendorprefix';\nimport environment from './environment';\nimport gamename from './gamename';\n\nexport default {\n ismobile,\n nowbrowser,\n vendorprefix,\n environment,\n gamename,\n info: {\n ismobile: ismobile(),\n nowbrowser: nowbrowser(),\n vendorprefix: vendorprefix(),\n environment: environment(),\n game: gamename()\n }\n};","const loadJs = (src, callback) =>{\n let 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;","const loadCss = (src, callback) =>{\n let 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 lazyload from '../lazyload/lazyload';\n\nlazyload.js('https://wstatic-cdn.plaync.com/common/js/uikit/modal/ModalPopup.min.js');\n\nlet openedLayer;\nlet body = $('body');\n\n$(document).on('click.promo.layer', '[data-layer=\"middle\"]', function(e){\n e.preventDefault();\n let targetName = this.hash || $(e.target).data('href');\n\n if(!body.data(`layerData${targetName}`)) {\n let data = new nc.ui.Modal({\n isBackdropClickClose: true,\n isEsc: true,\n backdropCss: {'opacity': $(e.target).data('opacity') || '0.8'},\n content: $(this.hash || $(e.target).data('href'))\n });\n body.data(`layerData${targetName}`, data);\n }\n openedLayer = body.data(`layerData${targetName}`);\n body.data(`layerData${targetName}`).show();\n});\n\n$(document).on('click.promo.layer', '[data-layer=\"top\"]', function(e){\n e.preventDefault();\n\n let targetName = this.hash || $(e.target).data('href');\n\n if(!body.data(`layerData${targetName}`)) {\n let data = new nc.ui.Modal({\n isBackdropClickClose: true,\n isEsc: true,\n backdropCss: {'opacity': $(e.target).data('opacity') || '0.8'},\n content: $(this.hash || $(e.target).data('href')),\n top: 'auto',\n isMove: true\n });\n body.data(`layerData${targetName}`, data);\n }\n openedLayer = body.data(`layerData${targetName}`);\n body.data(`layerData${targetName}`).show();\n});\n\n$(document).on('click.promo.layer', '[data-layer=\"close\"]', function(e){\n e.preventDefault();\n\n openedLayer.hide();\n});\n\nlet open = (selector, position = 'middle') =>{\n let targetName = selector;\n\n if(!body.data(`layerData${targetName}`)) {\n let data = new nc.ui.Modal({\n isBackdropClickClose: true,\n isEsc: true,\n top: `${position === 'middle' ? 0 : 'auto'}`,\n isMove: `${position !== 'middle'}`,\n backdropCss: {'opacity': $(targetName).data('opacity') || '0.8'},\n content: $(targetName)\n });\n body.data(`layerData${targetName}`, data);\n }\n openedLayer = body.data(`layerData${targetName}`);\n body.data(`layerData${targetName}`).show();\n};\n\nlet close = () =>{\n openedLayer.hide();\n};\n\nexport default {\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 $.getScript(\"https://www.youtube.com/iframe_api\");\n\n let check = setInterval(() =>{\n if(window.YT && window.YT.Player) {\n clearInterval(check);\n this._setPlayer();\n }\n }, 100);\n }\n\n _setPlayer(){\n this._renderPlayer();\n\n this.player = new 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 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 './youtubeplayer';\nimport VideoPlayer from './videoplayer';\nimport lazyLoad from '../lazyload/lazyload'\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\n if(window.playerCss) {\n this.init();\n } else {\n window.playerCss = true;\n lazyLoad.css('https://wstatic-cdn.plaync.com/promo/common/js/v2.0/player.css', () =>{\n this.init();\n });\n }\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;","import animation from '../animation/animation';\nimport detect from '../detect/detect';\n\nconst gameName = detect.gamename();\n\nclass Preloader {\n constructor(options){\n this.config = {\n ...{\n 'drawSize': 1,\n 'resourcePath': '',\n 'theme': [],\n 'preLoadList': [],\n 'comment': '본 페이지는 Chrome/IE10 이상의 1920 x 1080 해상도에 최적화되어 있습니다.',\n 'removeType': 'fadeOut',\n 'delay': 0,\n 'game': false\n }, ...options\n };\n\n this.store = {\n loadingIndex: 0,\n loadFail: 0,\n loadSuccess: 0,\n progress: 0,\n href: '',\n static: '',\n loadSize: '',\n game: '',\n width: 0,\n height: 0,\n isMobile: false,\n animationFrame: false,\n theme: null\n };\n\n this._onSuccess = this._onSuccess.bind(this);\n this._onFail = this._onFail.bind(this);\n this._init();\n }\n\n _init(){\n this.store.href = location.href;\n this.store.loadSize = this.config.preLoadList.length;\n this.store.static = '';\n\n switch(detect.environment()) {\n case 'live':\n this.store.static = 'https://wstatic-cdn.plaync.com';\n\n break;\n\n case 'rc':\n this.store.static = 'https://rc-wstatic.plaync.co.kr';\n\n break;\n\n case 'local':\n this.store.static = 'http://ui-static.korea.ncsoft.corp';\n break;\n }\n\n this.store.game = this.config.game;\n this.store.isMobile = detect.ismobile();\n this._setTheme();\n this._loadFile();\n this._updateBar();\n }\n\n _setTheme(){\n this.store.theme = {\n \"aion\": [`${this.store.static}/uikit/preloader/v1.0/loader_aion_off.png`, `${this.store.static}/uikit/preloader/v1.0/loader_aion_on.png`, \"#020811\"],\n \"lineage\": [`${this.store.static}/uikit/preloader/v1.0/loader_lineage_off.png`, `${this.store.static}/uikit/preloader/v1.0/loader_lineage_on.png`, \"#020811\"],\n \"lineage2\": [`${this.store.static}/uikit/preloader/v1.0/loader_lineage2_off.png`, `${this.store.static}/uikit/preloader/v1.0/loader_lineage2_on.png`, \"#020811\"],\n \"lineage2classic\": [`${this.store.static}/uikit/preloader/v1.0/loader_lineage2classic_off.png`, `${this.store.static}/uikit/preloader/v1.0/loader_lineage2classic_on.png`, \"#020811\"],\n \"bns\": [`${this.store.static}/uikit/preloader/v1.0/loader_bns_off.png`, `${this.store.static}/uikit/preloader/v1.0/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;`\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 for(let item of this.config.preLoadList) {\n let img = new Image();\n img.onload = this._onSuccess;\n img.onerror = this._onFail;\n img.src = `${this.store.static}${this.config.resourcePath}${item}`;\n }\n }\n\n _updateBar(){\n let draw = () =>{\n if(this.store.progress < this.store.loadingIndex) {\n this.store.progress = this.store.progress + this.config.drawSize;\n\n let progressSize = (this.store.progress / this.store.loadSize * 100) >= 100 ? 100 : this.store.progress / this.store.loadSize * 100;\n\n $('.loader__progress').css({height: progressSize + '%'});\n }\n\n if(this.store.progress >= this.store.loadSize) {\n animationId.stop();\n\n $('.loader').delay(this.config.delay)[this.config.removeType](this.config.removeType === 'fadeOut' ? 300 : 0, function(){\n $(this).remove();\n });\n\n $(document).trigger('preLoaded');\n }\n };\n\n let animationId = new animation.animationframe(draw);\n\n animationId.start();\n };\n\n _onSuccess(){\n this.store.loadSuccess = this.store.loadSuccess + 1;\n this.store.loadingIndex = this.store.loadingIndex + 1;\n }\n\n _onFail(){\n this.store.loadFail = this.store.loadFail + 1;\n this.store.loadingIndex = this.store.loadingIndex + 1;\n }\n}\n\nexport default Preloader;","import util from '../util/util';\n\nclass SceneBox {\n constructor(_option){\n if(!_option) {\n throw new TypeError(\"sceneBox module Need option object\");\n }\n\n this.context = $(_option.selector);\n\n this.config = $.extend({\n selector: \"\",\n changeSpeed: 1,\n render: 0,\n renderDelay: 0,\n noRender: false,\n onStartCallback: null,\n onCompleteCallback: null,\n linkButton: \"[data-scene-link] a\"\n }, _option);\n\n this.detect = {\n state: {\n introPlay: false,\n nowLayout: 0,\n lastWheelTime: new Date().getTime()\n },\n dimension: {\n containerWidth: 0,\n containerHeight: 0\n },\n sceneList: null,\n sceneSize: 0,\n sceneLayoutObj: [],\n sceneLayoutName: [],\n sceneDetailAnimation: {},\n touch: {\n distanceX: 0,\n distanceY: 0,\n startX: 0,\n startPointX: 0,\n startPointY: 0,\n end: true\n }\n };\n\n this.detect.sceneList = this.context.find(\"[data-scene]\");\n this.detect.sceneSize = this.detect.sceneList.length;\n\n this._setEvent();\n this._detectContextSize();\n\n for(let i = 0, max = this.detect.sceneSize - 1; i <= max; i++) {\n this.detect.sceneLayoutObj.push($(this.detect.sceneList[i]));\n this.detect.sceneLayoutName.push($(this.detect.sceneList[i]).attr(\"data-scene\"));\n }\n\n const to = $.inArray($(location.hash).attr(\"data-scene\"), this.detect.sceneLayoutName) > -1 ? $.inArray($(location.hash).attr(\"data-scene\"), this.detect.sceneLayoutName) : this.config.render;\n\n if(!this.config.noRender) {\n setTimeout(() =>{\n this.render(to, true);\n }, this.config.renderDelay * 1000);\n }\n }\n\n _setEvent(){\n $(window).on(\"hashchange.ui.scenebox\", () =>{\n if($.inArray($(location.hash).attr(\"data-scene\"), this.detect.sceneLayoutName) < 0) return;\n this.render($.inArray($(location.hash).attr(\"data-scene\"), this.detect.sceneLayoutName));\n });\n\n $(window).on(\"resize.ui.scenebox\", (e) =>{\n this._resize(e);\n });\n\n $(document).on(\"click.ui.scenebox\", this.config.linkButton, (e) =>{\n this._link(e);\n });\n\n if(\"ontouchstart\" in window) {\n this.context.on(\"touchstart.ui.scenebox\", (e) =>{\n e.stopPropagation();\n this._touchStart(e);\n });\n this.context.on(\"touchmove.ui.scenebox\", (e) =>{\n e.stopPropagation();\n this._touchMove(e);\n });\n this.context.on(\"touchend.ui.scenebox touchcancel.ui.scenebox\", (e) =>{\n e.stopPropagation();\n this._touchEnd(e);\n });\n } else {\n this.context.on(\"mousewheel.ui.scenebox DOMMouseScroll.ui.scenebox\", (e) =>{\n e.stopPropagation();\n this._wheel(e);\n });\n }\n }\n\n _detectContextSize(){\n this.detect.dimension.containerWidth = this.context[0].offsetWidth;\n this.detect.dimension.containerHeight = this.context[0].offsetHeight;\n }\n\n _resize(){\n this._detectContextSize();\n TweenMax.set($(\".now\", this.context), {clip: `rect(0, ${this.detect.dimension.containerWidth}, ${this.detect.dimension.containerHeight}, 0)`});\n TweenMax.set($(\"[data-scene-change=\\\"show\\\"]\", this.context), {clip: `rect(0, ${this.detect.dimension.containerWidth}, ${this.detect.dimension.containerHeight}, 0)`});\n }\n\n _onStart(to, after, before, action){\n this.detect.state.nowLayout = to;\n\n $(\".now\", this.context).removeClass(\"now\");\n $(\".before\", this.context).removeClass(\"before\");\n\n if(action === \"play\") {\n after.addClass(\"now\");\n before.addClass(\"before\");\n }\n\n if(action === \"reverse\") {\n after.addClass(\"before\");\n before.addClass(\"now\");\n }\n\n if(this.config.onStartCallback) {\n this.config.onStartCallback();\n }\n }\n\n _onComplete(after, before, action){\n if(action === \"reverse\") {\n $(\".now\", this.context).removeClass(\"now\");\n $(\".before\", this.context).removeClass(\"before\");\n after.addClass(\"now\");\n before.addClass(\"before\");\n }\n\n if(this.config.onCompleteCallback) {\n this.config.onCompleteCallback();\n }\n\n if(!this.detect.state.introPlay) {\n this.detect.state.introPlay = true;\n }\n }\n\n _touchStart(e){\n const point = e.originalEvent.touches ? e.originalEvent.touches[0] : e.originalEvent;\n\n this.detect.touch.distanceX = 0;\n this.detect.touch.distanceY = 0;\n this.detect.touch.startPointX = point.pageX;\n this.detect.touch.startPointY = point.pageY;\n }\n\n _touchMove(e){\n if(!this.detect.touch.end) return;\n this.detect.touch.end = false;\n\n if(util.ispreventtime(this.detect.state.lastWheelTime)) return;\n this.detect.state.lastWheelTime = new Date().getTime();\n\n this.context.css({\"pointer-events\": \"none\"});\n\n const point = e.originalEvent.touches ? e.originalEvent.touches[0] : e.originalEvent;\n\n this.detect.touch.distanceX += point.pageX - this.detect.touch.startPointX;\n this.detect.touch.distanceY += point.pageY - this.detect.touch.startPointY;\n\n if(Math.abs(this.detect.touch.distanceY) < 5) return;\n\n const directionY = this.detect.touch.distanceY > 0 ? -1 : 1;\n\n if(this.detect.state.nowLayout + directionY < 0 || this.detect.state.nowLayout + directionY > this.detect.sceneSize - 1) return;\n\n this.render(this.detect.state.nowLayout + directionY);\n }\n\n _touchEnd(){\n this.context.css({\"pointer-events\": \"auto\"});\n this.detect.touch.end = true;\n }\n\n _wheel(e){\n if(util.ispreventtime(this.detect.state.lastWheelTime)) return;\n this.detect.state.lastWheelTime = new Date().getTime();\n\n const direction = util.getwheeldirection(e);\n\n if(this.detect.state.nowLayout + direction < 0 || this.detect.state.nowLayout + direction > this.detect.sceneSize - 1) return;\n\n this.render(this.detect.state.nowLayout + direction);\n }\n\n _link(e){\n e.preventDefault();\n\n const target = $(e.target).attr(\"data-scene-link\") ? $(e.target).attr(\"data-scene-link\") : e.target.hash,\n idx = $.inArray($(target).attr(\"data-scene\"), this.detect.sceneLayoutName);\n\n if((idx - this.detect.nowLayout) === 0) return;\n\n this.render(idx);\n }\n\n _play(to, noAnimation){\n const after = this.detect.sceneLayoutObj[to],\n before = this.detect.sceneLayoutObj[this.detect.state.nowLayout],\n width = this.detect.dimension.containerWidth,\n height = this.detect.dimension.containerHeight,\n speed = this.config.changeSpeed;\n\n let toValue = (...value) =>{\n return {\n [value[0]]: value[1],\n onStart: this._onStart,\n onComplete: this._onComplete,\n onStartParams: [to, after, before, \"play\"],\n onCompleteParams: [after, before, \"play\"],\n callbackScope: this,\n ease: Quint.easeInOut\n };\n };\n\n switch(after.attr(\"data-scene-change\")) {\n case \"top\":\n TweenMax.fromTo(after, noAnimation ? 0.1 : speed,\n {clip: `rect(0, ${width}, 0, 0)`}, toValue(\"clip\", `rect(0, ${width}, ${height}, 0)`)\n );\n break;\n\n case \"bottom\":\n TweenMax.fromTo(after, noAnimation ? 0.1 : speed,\n {clip: `rect(${height}, ${width}, ${height}, 0)`}, toValue(\"clip\", `rect(0, ${width}, ${height}, 0)`)\n );\n break;\n\n case \"left\":\n TweenMax.fromTo(after, noAnimation ? 0.1 : speed,\n {clip: `rect(0, 0,${height}, 0)`}, toValue(\"clip\", `rect(0, ${width}, ${height}, 0)`)\n );\n break;\n\n case \"right\":\n TweenMax.fromTo(after, noAnimation ? 0.1 : speed,\n {clip: `rect(0, ${width}, ${height}, ${width})`}, toValue(\"clip\", `rect(0, ${width}, ${height}, 0)`)\n );\n break;\n\n case \"square\":\n TweenMax.fromTo(after, noAnimation ? 0.1 : speed,\n {clip: `rect(${height / 2}, ${width / 2}, ${height / 2}, ${width / 2})`}, toValue(\"clip\", `rect(0, ${width}, ${height}, 0)`)\n );\n break;\n\n case \"openY\":\n TweenMax.fromTo(after, noAnimation ? 0.1 : speed,\n {clip: `rect(0, ${width / 2}, ${height}, ${width / 2})`}, toValue(\"clip\", `rect(0, ${width}, ${height}, 0)`)\n );\n break;\n\n case \"openX\":\n TweenMax.fromTo(after, noAnimation ? 0.1 : speed,\n {clip: `rect(${height / 2}, ${width}, ${height / 2}, 0)`}, toValue(\"clip\", `rect(0, ${width}, ${height}, 0)`)\n );\n break;\n\n case \"show\":\n TweenMax.from(after, .1, toValue(\"opacity\", 0));\n break;\n\n case \"fade\":\n after.css({opacity: \"\"});\n TweenMax.from(after, noAnimation ? 0.1 : speed, toValue(\"opacity\", 0));\n break;\n }\n }\n\n _reverse(to){\n const after = this.detect.sceneLayoutObj[to],\n before = this.detect.sceneLayoutObj[this.detect.state.nowLayout],\n width = this.detect.dimension.containerWidth,\n height = this.detect.dimension.containerHeight,\n speed = this.config.changeSpeed;\n\n let toValue = (...value) =>{\n return {\n [value[0]]: value[1],\n onStart: this._onStart,\n onComplete: this._onComplete,\n onStartParams: [to, after, before, \"reverse\"],\n onCompleteParams: [after, before, \"reverse\"],\n callbackScope: this,\n ease: Quint.easeInOut\n };\n };\n\n switch(after.attr(\"data-scene-change\")) {\n case \"top\":\n case \"bottom\":\n case \"left\":\n case \"right\":\n case \"square\":\n case \"openY\":\n case \"openX\":\n TweenMax.set(after, {clip: `rect(0, ${width}, ${height}, 0)`});\n break;\n\n case \"show\":\n case \"fade\":\n TweenMax.set(after, {opacity: 1});\n break;\n }\n\n switch(before.attr(\"data-scene-change\")) {\n case \"top\":\n TweenMax.fromTo(before, speed,\n {clip: `rect(0, ${width} , ${height}, 0)`}, toValue(\"clip\", `rect(0, ${width}, 0, 0)`)\n );\n break;\n\n case \"bottom\":\n TweenMax.fromTo(before, speed,\n {clip: `rect(0, ${width} , ${height}, 0)`}, toValue(\"clip\", `rect(${height}, ${width}, ${height}, 0)`)\n );\n break;\n\n case \"left\":\n TweenMax.fromTo(before, speed,\n {clip: `rect(0, ${width}, ${height}, 0)`}, toValue(\"clip\", `rect(0, 0, ${height}, 0)`)\n );\n break;\n\n case \"right\":\n TweenMax.fromTo(before, speed,\n {clip: `rect(0, ${width}, ${height}, 0)`}, toValue(\"clip\", `rect(0, ${width}, ${height}, ${width})`)\n );\n break;\n\n case \"square\":\n TweenMax.fromTo(before, speed,\n {clip: `rect(0, ${width}, ${height}, 0)`}, toValue(\"clip\", `rect(${height / 2}, ${width / 2}, ${height / 2}, ${width / 2})`)\n );\n break;\n\n case \"openY\":\n TweenMax.fromTo(before, speed,\n {clip: `rect(0, ${width}, ${height}, 0)`}, toValue(\"clip\", `rect(0, ${width / 2}, ${height}, ${width / 2})`)\n );\n break;\n\n case \"openX\":\n TweenMax.fromTo(before, speed,\n {clip: `rect(0, ${width}, ${height}, 0)`}, toValue(\"clip\", `rect(${height / 2}, ${width}, ${height / 2}, 0)`)\n );\n break;\n\n case \"fade\":\n TweenMax.to(before, speed, toValue(\"opacity\", 0));\n break;\n\n case \"show\":\n TweenMax.from(before, .1, toValue(\"opacity\", 1));\n break;\n }\n }\n\n setDetailAnimation(sceneName, queue){\n this.detect.sceneDetailAnimation[sceneName] = queue;\n }\n\n render(to, noAnimation){\n if(typeof to === \"string\") {\n to = $.inArray($(to).attr(\"data-scene\"), this.detect.sceneLayoutName);\n }\n\n let queue = this.detect.sceneDetailAnimation[this.detect.sceneLayoutName[to]];\n\n if(this.detect.state.introPlay && to === this.detect.state.nowLayout) return;\n\n if(to >= this.detect.state.nowLayout) {\n this._play(to, noAnimation);\n\n if(to === 0 && !this.detect.state.introPlay) {\n if(queue) {\n queue.play ? queue.play(\"intro\") : queue();\n }\n return;\n }\n\n if(queue) {\n queue.play ? queue.play(0) : queue();\n }\n\n } else {\n this._reverse(to);\n if(queue) {\n queue.play ? queue.play(\"start\") : queue();\n }\n }\n }\n\n get state(){\n return this.detect.state;\n }\n}\n\nexport default SceneBox;","import detect from '../detect/detect';\n\nconst gameInfo = detect.gamename();\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};\nconst apiPath = api[detect.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 \"isShow\": false\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\": 102,\n \"height\": 46,\n \"marginTop\": 5\n }\n },\n \"medium\": {\n \"path\": options.image.medium,\n \"style\": {\n \"width\": 102,\n \"height\": 46,\n \"marginTop\": 5\n }\n },\n \"sticky\": {\n \"path\": options.image.mediumSticky,\n \"style\": {\n \"width\": 102,\n \"height\": 46,\n \"marginTop\": 5\n }\n },\n \"lnb\": {\n \"path\": options.image.lnb,\n \"style\": {\n \"width\": 102,\n \"height\": 46,\n \"marginTop\": 5\n }\n }\n };\n } else {\n cnbConfig.bi.image = {\n \"path\": options.image,\n \"style\": {\n \"width\": 102,\n \"height\": 46,\n \"marginTop\": 5\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}\n\nexport default Cnb;","import util from '../util/util';\nimport detect from '../detect/detect';\n\nlet pageTitle = util.removespace(document.title).split(':plaync')[0];\nlet gameName = detect.gamename();\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 * 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 lazyload from '../lazyload/lazyload';\nimport trim from '../util/trim';\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 lazyload.js('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;","import util from '../util/util';\nimport trace from '../trace/trace';\nimport detect from '../detect/detect';\nimport facebook from './facebook';\nimport twitter from './twitter';\nimport kakaostory from './kakaostory';\nimport kakaotalk from './kakaotalk';\nimport googleplus from './googleplus';\nimport line from './line';\n\nlet pageTitle = util.removespace(document.title).split(':plaync')[0];\nlet gameName = detect.gamename();\n\n$(document).on('click.promo.share', '[data-share]', function(e){\n e.preventDefault();\n\n let shareType = util.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\n trace(`/${gameName.ko}/이벤트프로모션/${pageTitle}/${shareType}`);\n});\n\nexport default {\n facebook,\n twitter,\n kakaostory,\n kakaotalk,\n googleplus,\n line\n};","import './message/message';\nimport animation from './animation/animation';\nimport cookie from './cookie/cookie';\nimport detect from './detect/detect';\nimport layer from './layer/layer';\nimport lazyload from './lazyload/lazyload';\nimport player from './player/player';\nimport preloader from './preloader/preloader';\nimport scenebox from './scenebox/scenebox';\nimport cnb from './cnb/cnb';\nimport comment from './comment/comment';\nimport share from './share/share';\nimport trace from './trace/trace';\nimport util from './util/util';\n\nif(!window.TweenMax) {\n lazyload.js('https://wstatic-cdn.plaync.com/vendor/greensock/v1.19.1/TweenMax.min.js');\n}\n\nexport default {\n animation,\n cnb,\n comment,\n cookie,\n detect,\n layer,\n lazyload,\n player,\n preloader,\n scenebox,\n share,\n trace,\n util\n}","import detect from '../detect/detect';\nimport lazyload from '../lazyload/lazyload';\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 lazyload.css(nccommunityCss);\n\n let articleId = typeof options.articleId === 'object' ? options.articleId[detect.environment()] : options.articleId;\n\n let config = {\n board: 'promotioncomment',\n isMyProfile: false,\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 lazyload.js(nccommunityJs, function(){\n let _comment = new ui.ncCommunity.CommentSingle($(options.el), config);\n _comment.get();\n });\n }\n}\n\nexport default PromoComment;"],"names":["$","document","on","e","preventDefault","alertMessage","this","attr","replace","AnimationFrame","animate","fps","requestID","now","delta","then","Date","interval","loop","requestAnimationFrame","window","mozRequestAnimationFrame","webkitRequestAnimationFrame","msRequestAnimationFrame","f","setTimeout","cancelAnimationFrame","mozCancelAnimationFrame","trim","str","String","prototype","type","originalEvent","detail","wheelDeltaY","wheelDelta","diffTime","to","getTime","setCookie","key","value","expires","setDate","getDate","end","Math","floor","setHours","getHours","setMinutes","getMinutes","setSeconds","getSeconds","day","hour","min","sec","cookie","domain","substring","indexOf","toUTCString","util","split","Number","location","href","compare","cookies","i","length","isMobile","agent","navigator","userAgent","toLowerCase","test","nowBrowser","trident","match","appName","vendorPrefix","nowbrowser","environment","getGameName","url","gameName","ismobile","vendorprefix","gamename","src","callback","script","createElement","setAttribute","readyState","onreadystatechange","onload","getElementsByTagName","appendChild","css","js","openedLayer","body","targetName","hash","target","data","nc","ui","Modal","opacity","show","hide","selector","position","YoutubePlayer","_option","TypeError","querySelector","context","player","config","extend","playerId","videoId","state","template","DOM","dimension","_handleStateChange","bind","_handleReady","_animationFrame","YT","Player","_setPlayer","getScript","check","setInterval","_renderPlayer","autoPlay","_detectDom","_detectDimension","_setMovieSize","append","poster","cover","controls","find","progress","progressBar","play","pause","width","progressLeft","getBoundingClientRect","left","contextWidth","offsetWidth","contextHeight","offsetHeight","setWidth","setHeight","seek","_this2","clientX","getDuration","isPlay","_handleProgressUpdate","isControlShow","timer","addClass","removeClass","coverClick","isReady","trigger","_setEvent","mute","PlayerState","PLAYING","_this3","animationFrame","_handlePlayUpdate","fadeOut","PAUSED","CUED","ENDED","getCurrentTime","bar","reqId","doFunc","call","isTouchInit","playVideo","stopVideo","pauseVideo","unMute","t","seekTo","VideoPlayer","lastIndexOf","video","load","videoWidth","videoHeight","_this","duration","firstPlay","one","off","currentTime","muted","extName","log","playerCss","init","stop","Preloader","detect","options","store","_onSuccess","_onFail","_init","loadSize","preLoadList","static","game","_setTheme","_loadFile","_updateBar","theme","img","Image","_themeTemplate","height","w","h","loaderStyle","comment","loader","con","item","onerror","resourcePath","animationId","animation","animationframe","loadingIndex","drawSize","progressSize","delay","removeType","remove","start","loadSuccess","loadFail","SceneBox","sceneList","sceneSize","_detectContextSize","max","sceneLayoutObj","push","sceneLayoutName","inArray","render","noRender","renderDelay","_resize","linkButton","_link","stopPropagation","_touchStart","_touchMove","_touchEnd","_wheel","containerWidth","containerHeight","set","clip","after","before","action","nowLayout","onStartCallback","onCompleteCallback","introPlay","point","touches","touch","distanceX","distanceY","startPointX","pageX","startPointY","pageY","ispreventtime","lastWheelTime","pointer-events","abs","directionY","direction","getwheeldirection","idx","noAnimation","speed","changeSpeed","toValue","_onStart","_onComplete","Quint","easeInOut","fromTo","from","_this4","sceneName","queue","sceneDetailAnimation","_play","_reverse","gameInfo","apiPath","pageTitle","removespace","title","trace","clickTraceStr","_trk_clickTrace","param1","param2","ko","shareFacebook","shareUrl","encodeURIComponent","open","shareTwitter","text","shareKakaoStory","shareKakaoTalk","content","settings","shareText","imageSrc","imageWidth","imageHeight","buttonText","kakaoKey","loc","getKey","Kakao","Link","sendTalkLink","shareGooglePlus","shareLine","shareType","TweenMax","cnbConfig","en","babelHelpers.typeof","image","bi","large","medium","mediumSticky","lnb","header","color","ajax","withCredentials","done","userData","isLogin","login","cnb","articleId","isPaging","replay","size","_path","commentPlaceholder","ncCommunity","CommentSingle","el","get"],"mappings":"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"}