{"version":3,"file":"preloader.js","sources":["../_src/js/util/ismobile.js","../_src/js/util/environment.js","../_src/js/util/gamename.js","../_src/js/util/animationframe.js","../_src/js/util/animation.js","../_src/js/image-loader.js","../_src/js/video-loader.js","../_src/js/youtube-loader.js","../_src/js/preloader.js"],"sourcesContent":["/**\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 * 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;","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 loop;\n let then = Date.now();\n\n const interval = 1000 / this.fps;\n\n if(this.fps < 60) {\n loop = () =>{\n this.requestID = requestAnimationFrame(loop);\n now = Date.now();\n delta = now - then;\n if(delta > interval) {\n then = now - (delta % interval);\n this.animate();\n }\n };\n } else {\n loop = () =>{\n this.requestID = requestAnimationFrame(loop);\n this.animate();\n };\n }\n\n this.requestID = requestAnimationFrame(loop);\n }\n\n stop(){\n cancelAnimationFrame(this.requestID);\n }\n}\n\nexport default AnimationFrame;","import animationframe from './animationframe';\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}","class ImageLoader {\n constructor(url, props){\n this.props = props;\n\n const img = new Image();\n img.src = url;\n\n img.onload = () => this.props._onSuccess('image', `success: ${url}`);\n img.onerror = () => this.props._onFail('image', `fail: ${url}`);\n }\n}\n\nexport default ImageLoader;","class VideoLoader {\n constructor(url, props){\n this.props = props;\n\n const video = document.createElement('video');\n video.src = url;\n\n let checkState = setInterval(() =>{\n if(video.readyState > 2) {\n clearInterval(checkState);\n this.props._onSuccess('video', `success: ${url}`);\n }\n }, 100);\n\n video.onerror = () => this.props._onFail('video', `fail: ${url}`);\n }\n}\n\nexport default VideoLoader;","class YoutubeLoader {\n constructor(id, props){\n this.props = props;\n this.loaded = false;\n\n $(window).on(`canplay.${id}`, () =>{\n this.loaded = true;\n this.props._onSuccess('youtube', `success: ${id}`);\n });\n\n setTimeout(() =>{\n !this.loaded && this.props._onFail('youtube', `fail: ${id}`);\n }, 5 * 1000)\n }\n}\n\nexport default YoutubeLoader;","import detect from './util/detect';\nimport animation from './util/animation';\n\nimport ImageLoader from './image-loader';\nimport VideoLoader from './video-loader';\nimport YoutubeLoader from './youtube-loader';\n\nconst gameName = detect.gamename();\n\nclass Preloader {\n constructor(options){\n this.config = $.extend({\n 'image': [],\n 'video': [],\n 'youtube': [],\n 'theme': [],\n 'comment': '본 페이지는 Chrome/IE10 이상의 1920 x 1080 해상도에 최적화되어 있습니다.',\n 'removeType': 'fadeOut',\n 'delay': 0,\n 'game': ''\n }, options);\n\n this.store = {\n loaded: 0,\n loadFail: 0,\n loadSuccess: 0,\n loadSize: 0,\n progress: 0,\n\n href: '',\n static: '',\n game: '',\n width: 0,\n height: 0,\n isMobile: false,\n animationFrame: false,\n theme: null\n };\n\n this._init();\n }\n\n _init(){\n this.store.href = location.href;\n this.store.loadSize = this.config.image.length + this.config.video.length + this.config.youtube.length;\n this.store.static = '';\n\n switch(detect.environment()) {\n case 'live':\n this.store.static = 'https://wstatic-cdn.plaync.com';\n break;\n\n case 'rc':\n this.store.static = 'https://rc-wstatic.plaync.co.kr';\n break;\n\n case 'local':\n this.store.static = 'http://ui-static.korea.ncsoft.corp';\n break;\n }\n\n this.store.game = this.config.game || gameName.en;\n this.store.isMobile = detect.ismobile();\n\n this._setTheme();\n\n this._loadFile();\n\n this._updateBar();\n }\n\n _setTheme(){\n this.store.theme = {\n \"aion\": [`${this.store.static}/uikit/preloader/v2.0/loader_aion_off.png`, `${this.store.static}/uikit/preloader/v2.0/loader_aion_on.png`, \"#020811\"],\n \"lineage\": [`${this.store.static}/uikit/preloader/v2.0/loader_lineage_off.png`, `${this.store.static}/uikit/preloader/v2.0/loader_lineage_on.png`, \"#020811\"],\n \"lineage2\": [`${this.store.static}/uikit/preloader/v2.0/loader_lineage2_off.png`, `${this.store.static}/uikit/preloader/v2.0/loader_lineage2_on.png`, \"#020811\"],\n \"lineage2classic\": [`${this.store.static}/uikit/preloader/v2.0/loader_lineage2classic_off.png`, `${this.store.static}/uikit/preloader/v2.0/loader_lineage2classic_on.png`, \"#020811\"],\n \"bns\": [`${this.store.static}/uikit/preloader/v2.0/loader_bns_off.png`, `${this.store.static}/uikit/preloader/v2.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;transition-property:height;transition-duration:.5s`\n };\n\n this.config.comment = this.config.comment && !this.store.isMobile ? `
${this.config.comment}
` : '';\n\n return (\n `
\n
\n
\n
\n
\n ${this.config.comment}\n
\n
`\n );\n }\n\n _loadFile(){\n if(this.config.image.length > 0) {\n for(let item of this.config.image) {\n new ImageLoader(`${this.store.static}${item}`, this);\n }\n }\n\n if(this.config.video.length > 0) {\n for(let item of this.config.video) {\n new VideoLoader(item, this);\n }\n }\n\n if(this.config.youtube.length > 0) {\n for(let item of this.config.youtube) {\n new YoutubeLoader(item, this);\n }\n }\n }\n\n _updateBar(){\n let draw = () =>{\n if(this.store.loaded < this.store.loadSize) {\n this.store.progress = this.store.loaded;\n let progressSize = (this.store.progress / this.store.loadSize * 100) >= 100 ? 100 : this.store.progress / this.store.loadSize * 100;\n $('.loader__progress').css({height: progressSize + '%'});\n }\n\n if(this.store.loaded === this.store.loadSize) {\n $('.loader__progress').css({height: 100 + '%'});\n animationId.stop();\n\n $('.loader').delay(200 + this.config.delay)[this.config.removeType](this.config.removeType === 'fadeOut' ? 300 : 0, function(){\n $(this).remove();\n });\n\n $(document).trigger('preLoaded');\n $(document).trigger('preloadend');\n $(window).trigger('resize');\n }\n };\n\n let animationId = new animation.animationframe(draw);\n\n animationId.start();\n };\n\n _onSuccess(type, msg){\n this.store.loadSuccess = this.store.loadSuccess + 1;\n this.store.loaded = this.store.loaded + 1;\n }\n\n _onFail(type, msg){\n console.log(msg);\n this.store.loadFail = this.store.loadFail + 1;\n this.store.loaded = this.store.loaded + 1;\n }\n}\n\nexport default Preloader;"],"names":["agent","navigator","userAgent","toLowerCase","test","href","location","url","gameName","AnimationFrame","animate","fps","requestID","start","now","delta","loop","then","Date","interval","this","requestAnimationFrame","stop","window","mozRequestAnimationFrame","webkitRequestAnimationFrame","msRequestAnimationFrame","f","setTimeout","cancelAnimationFrame","mozCancelAnimationFrame","ImageLoader","props","img","Image","src","onload","_this","_onSuccess","onerror","_onFail","VideoLoader","video","document","createElement","checkState","setInterval","readyState","YoutubeLoader","id","loaded","on","detect","options","config","$","extend","store","_init","loadSize","image","length","youtube","static","game","en","isMobile","_setTheme","_loadFile","_updateBar","theme","e","append","_themeTemplate","target","width","height","w","h","loaderStyle","comment","item","animationId","animation","animationframe","_this2","progress","progressSize","css","delay","removeType","remove","trigger","type","msg","loadSuccess","log","loadFail"],"mappings":"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"}