{"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.plaync.co.kr/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 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 './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.plaync.co.kr/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 if(gameName.en === 'lineage') {\n this.store.static = 'https://wstatic.plaync.co.kr';\n } else {\n this.store.static = 'http://static.plaync.co.kr';\n }\n\n break;\n\n case 'rc':\n if(gameName.en === 'lineage') {\n this.store.static = 'https://rc-wstatic.plaync.co.kr';\n } else {\n this.store.static = 'http://rc.static.plaync.co.kr';\n }\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/loader_aion_off.png`, `${this.store.static}/uikit/preloader/v1/loader_aion_on.png`, \"#020811\"],\n \"lineage\": [`${this.store.static}/uikit/preloader/v1/loader_lineage_off.png`, `${this.store.static}/uikit/preloader/v1/loader_lineage_on.png`, \"#020811\"],\n \"lineage2\": [`${this.store.static}/uikit/preloader/v1/loader_lineage2_off.png`, `${this.store.static}/uikit/preloader/v1/loader_lineage2_on.png`, \"#020811\"],\n \"lineage2classic\": [`${this.store.static}/uikit/preloader/v1/loader_lineage2classic_off.png`, `${this.store.static}/uikit/preloader/v1/loader_lineage2classic_on.png`, \"#020811\"],\n \"bns\": [`${this.store.static}/uikit/preloader/v1/loader_bns_off.png`, `${this.store.static}/uikit/preloader/v1/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};\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[detect.environment()];\nconst couponPath = coupon[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 \"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\": 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.plaync.co.kr/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","loadYoutubeApi","tag","firstScriptTag","parentNode","insertBefore","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","detect","Preloader","options","store","_onSuccess","_onFail","_init","loadSize","preLoadList","static","en","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","couponPath","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","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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"}