{"version":3,"sources":["webpack:///search/search-realtime-keyword.js","webpack:///webpack/bootstrap 3d8e493d9d2f3cc969c4","webpack:///./_src/js/utils/util.js","webpack:///./_src/js/search/search-realtime-keyword.js","webpack:///./_src/js/search/realtimeKeyword/RealtimeKeyword.js","webpack:///(webpack)/buildin/global.js","webpack:///./_src/js/model/model.js","webpack:///./_src/js/vendor/tram-v0.8.3/tram.js"],"names":["modules","__webpack_require__","moduleId","installedModules","exports","module","i","l","call","m","c","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","__webpack_exports__","truthy","isDefined","not","isNotDefined","getFirstObjectHasProperty","namespace","ua","window","navigator","userAgent","test","obj","isString","exec","location","hostname","constructor","String","isObject","isFunction","Function","isRegExp","RegExp","func","TypeError","$ele","length","arrayHasObjects","propertyKey","findPropertyValueOrRegex","Array","isArray","result","max","parent","ns","parts","split","value","__WEBPACK_IMPORTED_MODULE_0__realtimeKeyword_RealtimeKeyword__","__WEBPACK_IMPORTED_MODULE_1__utils_util__","$","global","require","nc","lineage","searchRealtimeKeyword","options","Error","keyword","popularKeyword","data","pos","RealtimeKeyword","service","wrap","serverId","alias","init","jQuery","_classCallCheck","instance","Constructor","__WEBPACK_IMPORTED_MODULE_0__utils_util__","_createClass","defineProperties","target","props","descriptor","writable","key","protoProps","staticProps","this","_","INTERVAL_ROLLING_ITEMS","option","extend","rollingWrap","rollingKeywordWrap","rollingItemInterval","rollingItemIndex","listWrap","listKeywordWrap","uniqueId","Date","now","proxy","clickDocumentEventHandler","list","setInstance","item","tpl","queryStr","encodeURIComponent","index","updown","rank","url","_alias","getListTpl","empty","append","setRollingKeywords","setToggleBtn","setWrapVisible","items","tram","set","position","top","left","y","height","changeItem","setRollingKeywordInterval","flag","clearInterval","setInterval","activateIndex","keywordWrapHeight","prevItemIndex","prevItem","activateItem","stop","add","start","on","evt","preventDefault","isListWrapVisible","is","setDocumentEventHandler","addClass","showListWrap","removeClass","show","hide","document","off","type","toggleBtn","keywordList","contains","g","eval","e","PET_NECKLACE_ID","_typeof","Symbol","iterator","element","Tram","Bare","toDashed","string","replace","letter","toLowerCase","hexToRgb","hex","parseInt","slice","rgbToHex","r","b","toString","noop","typeWarning","exp","val","warn","unitWarning","from","to","validTime","current","safe","undefined","milli","seconds","parseFloat","msg","config","debug","console","compact","array","push","P","ownProperty","f","BareConstructor","_superclass","definition","C","self","apply","arguments","extensions","_super","proto","mixin","def","open","ext","easing","ease","t","ts","tc","ease-in","ease-out","ease-in-out","linear","ease-in-quad","ease-out-quad","ease-in-out-quad","ease-in-cubic","ease-out-cubic","ease-in-out-cubic","ease-in-quart","ease-out-quart","ease-in-out-quart","ease-in-quint","ease-out-quint","ease-in-out-quint","ease-in-sine","Math","cos","PI","ease-out-sine","sin","ease-in-out-sine","ease-in-expo","pow","ease-out-expo","ease-in-out-expo","ease-in-circ","sqrt","ease-out-circ","ease-in-out-circ","ease-in-back","ease-out-back","ease-in-out-back","clamped","doc","win","dataKey","unitRegex","capsRegex","typeColor","typeLength","typeLenPerc","typeAngle","emptyTrans","allowAuto","space","testDiv","createElement","domPrefixes","cssPrefixes","testFeature","prop","style","dom","css","domProp","domSuffix","words","charAt","toUpperCase","support","bind","transform","transition","backface","timing","timingProp","x","enterFrame","frame","raf","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","callback","setTimeout","timeNow","perf","performance","perfNow","webkitNow","msNow","mozNow","Transition","settings","propertyMap","weak","Class","$el","fromQueue","queueArgs","optionType","timer","destroy","queue","active","Delay","duration","context","complete","next","redraw","timespan","eachProp","span","animate","extras","wait","updateStyles","found","styles","nextStyle","time","then","args","queued","shift","values","stopProp","setProp","setExtras","display","el","offsetHeight","removeData","upstream","join","collection","ejector","autoAdd","matches","transformMap","chain","method","children","eachChild","count","keepInherited","fallback","getStyle","hideBackface","setStyle","factory","$elems","each","Property","getAuto","oldVal","update","newVal","validEase","cssToHex","defaults","delay","prefixed","auto","unit","defaultUnit","angle","defaultAngle","convert","tween","Tween","warnType","number","original","Color","supr","Scroll","Transform","convertEach","perspective","MultiTween","temp","out","indexOf","addRender","tweenList","renderLoop","render","removeRender","rest","inArray","concat","round","factor","interpolate","end","begin","change","format","autoplay","play","delta","startRGB","endRGB","endHex","fromUnit","tweens","alive","agentTests","testString","pattern","fn","color","background","outline-color","border-color","border-top-color","border-right-color","border-bottom-color","border-left-color","border-width","border-top-width","border-right-width","border-bottom-width","border-left-width","border-spacing","letter-spacing","margin","margin-top","margin-right","margin-bottom","margin-left","padding","padding-top","padding-right","padding-bottom","padding-left","outline-width","opacity","right","bottom","font-size","text-indent","word-spacing","width","min-width","max-width","min-height","max-height","line-height","scroll-top","scroll-left","rotate","rotateX","rotateY","scale","scaleX","scaleY","skew","skewX","skewY","z","rotateZ","scaleZ"],"mappings":"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","file":"search/search-realtime-keyword.js","sourcesContent":["/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 1);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* unused harmony export ua */\n/* unused harmony export locationOriginRegex */\n/* unused harmony export isIE */\n/* unused harmony export isEdge */\n/* unused harmony export isOpera */\n/* unused harmony export isChrome */\n/* unused harmony export isIOS */\n/* unused harmony export isAndroid */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"f\", function() { return truthy; });\n/* unused harmony export falsy */\n/* unused harmony export existy */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return isDefined; });\n/* unused harmony export isRc */\n/* unused harmony export isInteger */\n/* unused harmony export isString */\n/* unused harmony export isNumber */\n/* unused harmony export isBoolean */\n/* unused harmony export isObject */\n/* unused harmony export isFunction */\n/* unused harmony export isRegExp */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"e\", function() { return not; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return isNotDefined; });\n/* unused harmony export parseInt10 */\n/* unused harmony export parseStrIntToInt */\n/* unused harmony export removeElementInArray */\n/* unused harmony export allOf */\n/* unused harmony export anyOf */\n/* unused harmony export getDefined */\n/* unused harmony export notSingleEle */\n/* unused harmony export each */\n/* unused harmony export getFileExtension */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return getFirstObjectHasProperty; });\n/* unused harmony export getObjectHasProperty */\n/* unused harmony export overlappedConditionSortByProperty */\n/* unused harmony export getPositionFromTranslateStr */\n/* unused harmony export isIndexInLoop */\n/* unused harmony export getLoopedLastIndex */\n/* unused harmony export getReverseLoopedFirstIndex */\n/* unused harmony export getResolution */\n/* unused harmony export isPhoneResolution */\n/* unused harmony export isTabletResolution */\n/* unused harmony export isMobileResolution */\n/* unused harmony export numberWithCommas */\n/* unused harmony export getUriParams */\n/* unused harmony export getUriCombinedParams */\n/* unused harmony export getHashParams */\n/* unused harmony export getHashCombinedParams */\n/* unused harmony export getObjForPagination */\n/* unused harmony export getDivideIntStrByThousandUnit */\n/* unused harmony export getMarketPriceStr */\n/* unused harmony export getEmphasizedStrByQuery */\n/* unused harmony export getSeparatedDateStr */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return namespace; });\n/* unused harmony export template */\n/* unused harmony export getUrlAddCategoryIdByArticle */\n/* unused harmony export getChangedStats */\n/* unused harmony export getPlusElixirPointByLevel */\n/* unused harmony export isLevelCanConsumeElixirStat */\n/* unused harmony export isLevelGetElixirPoint */\n/* unused harmony export getStatMaxByLevel */\n/* unused harmony export isWarrior */\n/* unused harmony export getClassName */\n/* unused harmony export removeEquipInEquips */\n/* unused harmony export isPetNecklace */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__model_model__ = __webpack_require__(5);\n/*\r\n * common utils\r\n */\n\n\n\nvar ua = window.navigator.userAgent;\n\nvar locationOriginRegex = /^(https?:\\/\\/)?([\\da-z\\.-]+)\\.([a-z\\.]{2,6})/;\n\nvar isIE = function () {\n return (/msie/i.test(ua) || /trident/i.test(ua)\n );\n}();\n\nvar isEdge = function isEdge(userAgent) {\n return (/Gecko/i.test(userAgent) && /Edge/i.test(userAgent)\n );\n};\n\nvar isOpera = function isOpera(userAgent) {\n return (/Opera/i.test(userAgent) || /OPR\\//i.test(userAgent)\n );\n};\n\nvar isChrome = function isChrome(userAgent) {\n return !isEdge(userAgent) && !isOpera(userAgent) && /Chrome/i.test(userAgent);\n};\n\nvar isIOS = function isIOS(userAgent) {\n return (/iPad|iPhone|iPod/.test(userAgent) && !window.MSStream\n );\n};\n\nvar isAndroid = function isAndroid(userAgent) {\n return (/android/i.test(userAgent)\n );\n};\n\nvar truthy = function truthy(object) {\n return !!object;\n};\n\nvar falsy = function falsy(object) {\n return !!!object;\n};\n\nvar existy = function existy(obj) {\n return obj != null;\n};\n\nvar isDefined = function isDefined(obj) {\n var flag = true;\n if (obj === null || typeof obj === 'undefined') return false;\n return flag;\n};\n\nvar isRc = function () {\n return isDefined(/^rc-/.exec(location.hostname));\n}();\n\nvar isInteger = function isInteger(obj) {\n if (!isDefined(obj) || obj.constructor !== Number) return false;\n\n // https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger\n return isFinite(obj) && Math.floor(obj) === obj;\n};\n\nvar isString = function isString(obj) {\n if (!isDefined(obj)) return false;\n return obj.constructor === String;\n};\n\nvar isNumber = function isNumber(obj) {\n if (!isDefined(obj)) return false;\n return obj.constructor === Number;\n};\n\nvar isBoolean = function isBoolean(obj) {\n if (!isDefined(obj)) return false;\n return obj.constructor === Boolean;\n};\n\nvar isObject = function isObject(obj) {\n if (!isDefined(obj)) return false;\n return obj.constructor === Object;\n};\n\nvar isFunction = function isFunction(obj) {\n if (!isDefined(obj)) return false;\n return obj.constructor === Function;\n};\n\nvar isRegExp = function isRegExp(obj) {\n if (!isDefined(obj)) return false;\n return obj.constructor === RegExp;\n};\n\nvar not = function not(func) {\n if (!isFunction(func)) throw new TypeError('func parameter type of not() must be Function.');\n\n return function (object) {\n return !func(object);\n };\n};\n\nvar isNotDefined = not(isDefined);\n\nvar parseInt10 = function parseInt10(number) {\n return parseInt(number, 10);\n};\n\nvar parseStrIntToInt = function parseStrIntToInt(strIntOrInt) {\n var val = strIntOrInt;\n\n if (!isDefined(val)) return 0;\n if (typeof val === 'number') return val;\n\n return parseInt10(val.split(',').join(''));\n};\n\nvar removeElementInArray = function removeElementInArray(arr, target) {\n if (!Array.isArray(arr)) throw new TypeError('arr parameter type of removeElementInArray() must be Array.');\n\n var clonedArr = arr.slice(0),\n index = clonedArr.indexOf(target);\n\n if (index >= 0) clonedArr.splice(index, 1);\n\n return clonedArr;\n};\n\nvar allOf = function allOf() /*args*/{\n var args = Array.prototype.slice.call(arguments);\n\n return args.every(function (val) {\n return val === true;\n });\n};\n\nvar anyOf = function anyOf() /*args*/{\n var args = Array.prototype.slice.call(arguments);\n\n return args.some(function (val) {\n return val === true;\n });\n};\n\nvar getDefined = function getDefined(val, defaultVal) {\n return isDefined(val) ? val : defaultVal;\n};\n\nvar notSingleEle = not(function ($ele) {\n return $ele.length === 1;\n});\n\nvar each = function each(dataCanLoop, func, context) {\n var _context = existy(context) ? context : null;\n\n if (!(Array.isArray(dataCanLoop) || isString(dataCanLoop))) throw new TypeError('dataCanLoop parameter type of each() must be Array or String.');\n\n var result = false;\n for (var i = 0, max = dataCanLoop.length; i < max; i++) {\n result = func.call(_context, dataCanLoop[i]);\n if (result === false) break;\n }\n};\n\nvar getFileExtension = function getFileExtension(fileName) {\n if (!isString(fileName)) throw new TypeError('getFileExtension() requires String parameter.');\n\n if (fileName.length <= 0) return '';\n\n var lastDotIndex = fileName.lastIndexOf('.'),\n extension = fileName.substr(lastDotIndex + 1);\n\n return extension;\n};\n\nvar getFirstObjectHasProperty = function getFirstObjectHasProperty(arrayHasObjects, propertyKey, findPropertyValueOrRegex) {\n if (!Array.isArray(arrayHasObjects) || arrayHasObjects.length <= 0) return null;\n if (!isString(propertyKey)) return null;\n\n var obj = void 0,\n result = null;\n for (var i = 0, max = arrayHasObjects.length; i < max; ++i) {\n obj = arrayHasObjects[i];\n if (!obj.hasOwnProperty(propertyKey)) continue;\n\n if (isRegExp(findPropertyValueOrRegex)) {\n if (findPropertyValueOrRegex.test(obj[propertyKey])) {\n result = obj;\n break;\n }\n } else {\n if (obj[propertyKey] === findPropertyValueOrRegex) {\n result = obj;\n break;\n }\n }\n }\n return result;\n};\n\nvar getObjectHasProperty = function getObjectHasProperty(arrayHasObjects, propertyKey) {\n if (!Array.isArray(arrayHasObjects) || arrayHasObjects.length <= 0) return null;\n if (!isString(propertyKey)) return null;\n var obj = void 0,\n result = null;\n\n each(arrayHasObjects, function (obj) {\n if (obj.hasOwnProperty(propertyKey)) result = obj[propertyKey];\n });\n // console.log( '=> util.js getObjectHasProperty() result : ', propertyKey, result );\n return result;\n};\n\nvar overlappedConditionSortByProperty = function sortByProp(_datas, _conditions, _conditionIndex) {\n var datas = Array.prototype.slice.call(_datas);\n\n if (!_conditions || _conditions.constructor !== Array || _conditions.length < 0) return datas;\n\n var conditionIndex = _conditionIndex >= 0 ? _conditionIndex : 0,\n condition = _conditions[conditionIndex];\n\n if (conditionIndex <= 0) datas.sort(condition.func);\n\n if (_conditions.length <= 1) return datas;\n\n if (conditionIndex < _conditions.length - 1) {\n var prevProperty = condition.property,\n nextConditionIndex = conditionIndex + 1,\n nextCondition = _conditions[nextConditionIndex];\n\n var memoObj = {},\n memoArr = [],\n arr = [];\n\n var obj = void 0,\n prop = void 0;\n for (var i = 0, max = datas.length; i < max; i++) {\n obj = datas[i];\n prop = String(obj[prevProperty]);\n\n if (!memoObj[prop]) {\n memoObj[prop] = [];\n memoArr.push(memoObj[prop]);\n }\n\n arr = memoObj[prop];\n arr.push(obj);\n }\n\n for (var j = 0, len = memoArr.length; j < len; j++) {\n arr = memoArr[j];\n arr.sort(nextCondition.func);\n\n memoArr[j] = overlappedConditionSortByProperty(arr, _conditions, nextConditionIndex);\n }\n\n var resultArr = memoArr.reduce(function (acc, curVal, curIndex, array) {\n return acc.concat(curVal);\n });\n\n return resultArr;\n }\n\n return datas;\n};\n\nvar getPositionFromTranslateStr = function getPositionFromTranslateStr(str) {\n var obj = { x: 0, y: 0 };\n if (!isDefined(str)) return obj;\n\n var values = str.match(/[+-]?(\\d*\\.)?\\d+/g);\n if (values.length <= 0) return obj;\n\n if (/translateX/g.test(str)) {\n obj.x = parseFloat(values[0]);\n return obj;\n }\n\n if (/translateY/g.test(str)) {\n obj.y = parseFloat(values[0]);\n return obj;\n }\n\n obj.x = parseFloat(values[0]);\n if (values.length > 1) obj.y = parseFloat(values[1]);\n\n return obj;\n};\n\nvar isIndexInLoop = function isIndexInLoop(totalLength, loopGap, firstIndex, searchIndex) {\n var args = Array.prototype.slice.call(arguments);\n if (args.length < 4) throw Error('isIndexInLoop function requires 4 arguments.');\n\n if (!isInteger(totalLength) || !isInteger(loopGap) || !isInteger(firstIndex) || !isInteger(searchIndex)) {\n throw Error('arguments must be Integer Number.');\n }\n if (totalLength < 1 || firstIndex < 1) {\n throw Error('totalLength and startIndex can not smaller than 1.');\n }\n if (loopGap > totalLength) {\n throw Error('loopGap can not bigger than totalLength.');\n }\n\n var index = firstIndex;\n for (var i = 0; i < loopGap; i++) {\n if (index === searchIndex) return true;\n index = index + 1 > totalLength ? 1 : index + 1;\n }\n\n return false;\n};\n\nvar getLoopedLastIndex = function getLoopedLastIndex(totalLength, loopGap, firstIndex) {\n var args = Array.prototype.slice.call(arguments);\n if (args.length < 3) throw Error('getLoopedLastIndex function requires 3 arguments.');\n\n if (!isInteger(totalLength) || !isInteger(loopGap) || !isInteger(firstIndex)) {\n throw Error('arguments must be Integer Number.');\n }\n if (totalLength < 1 || firstIndex < 1) {\n throw Error('totalLength and firstIndex can not smaller than 1.');\n }\n if (loopGap > totalLength || firstIndex > totalLength) {\n throw Error('loopGap and firstIndex can not bigger than totalLength.');\n }\n\n var index = firstIndex;\n for (var i = 0; i < loopGap - 1; i++) {\n index++;\n if (index > totalLength) index = 1;\n }\n return index;\n};\n\nvar getReverseLoopedFirstIndex = function getReverseLoopedFirstIndex(totalLength, loopGap, lastIndex) {\n var args = Array.prototype.slice.call(arguments);\n if (args.length < 3) throw Error('getReverseLoopedFirstIndex function requires 3 arguments.');\n\n if (!isInteger(totalLength) || !isInteger(loopGap) || !isInteger(lastIndex)) {\n throw Error('arguments must be Integer Number.');\n }\n if (totalLength < 1 || lastIndex < 1) {\n throw Error('totalLength and lastIndex can not smaller than 1.');\n }\n if (loopGap > totalLength || lastIndex > totalLength) {\n throw Error('loopGap and lastIndex can not bigger than totalLength.');\n }\n\n var index = lastIndex;\n for (var i = 0; i < loopGap - 1; i++) {\n index = index - 1 < 1 ? totalLength : index - 1;\n }\n\n return index;\n};\n\nvar getResolution = function getResolution() {\n var breakpoint = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { tablet: 640, pc: 960, max: 1260 };\n var global = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : window;\n\n var resolution = '';\n if (breakpoint.max && global.innerWidth >= breakpoint.max) {\n resolution = 'max';\n } else if (breakpoint.pc && global.innerWidth >= breakpoint.pc) {\n resolution = 'pc';\n } else if (breakpoint.tablet && global.innerWidth >= breakpoint.tablet) {\n resolution = 'tablet';\n } else {\n resolution = 'phone';\n }\n\n return resolution;\n};\n\nvar isPhoneResolution = function isPhoneResolution(resolution) {\n return resolution === 'phone';\n};\n\nvar isTabletResolution = function isTabletResolution(resolution) {\n return resolution === 'tablet';\n};\n\nvar isMobileResolution = function isMobileResolution(resolution) {\n return resolution === 'phone' || resolution === 'tablet';\n};\n\n// http://stackoverflow.com/questions/2901102/how-to-print-a-number-with-commas-as-thousands-separators-in-javascript\nvar numberWithCommas = function numberWithCommas(number) {\n return number.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n};\n\nvar getUriParams = function getUriParams(uri) {\n if (uri.length < 1) return null;\n var str = uri.split('#')[0];\n\n var tmpArr = str.split('?');\n if (tmpArr.length < 2) return null;\n\n var paramStr = tmpArr[1],\n params = paramStr.split('&');\n\n var keyValueArr = void 0,\n obj = {};\n for (var i = 0, max = params.length; i < max; ++i) {\n keyValueArr = params[i].split('=');\n if (keyValueArr.length > 1) obj[keyValueArr[0]] = keyValueArr[1];\n\n // if (keyValueArr.length <= 1) return null;\n // obj[keyValueArr[0]] = keyValueArr[1];\n }\n return obj;\n};\n\nvar getUriCombinedParams = function getUriCombinedParams(uri, params) {\n if (!uri) return '';\n if (!params) return uri;\n\n var str = '';\n for (var key in params) {\n str += '&' + key + '=' + String(params[key]);\n }\n if (str === '') return uri;\n\n var tmpArr = uri.split('#'),\n uri = tmpArr[0],\n hashStr = isDefined(tmpArr[1]) ? '#' + tmpArr[1] : '';\n\n uri = (uri.indexOf('?') >= 0 ? uri + str : uri + '?' + str.substr(1)) + hashStr;\n return uri;\n};\n\nvar getHashParams = function getHashParams(hashStr) {\n var str = hashStr;\n if (str.length < 1) return null;\n\n var tmpArr = str.split('#');\n if (tmpArr.length < 2) return null;\n\n var paramStr = tmpArr[1],\n params = paramStr.split('&');\n\n var keyValueArr = void 0,\n obj = {};\n for (var i = 0, max = params.length; i < max; ++i) {\n keyValueArr = params[i].split('=');\n if (keyValueArr.length <= 1) return null;\n\n obj[keyValueArr[0]] = keyValueArr[1];\n }\n\n return obj;\n};\n\nvar getHashCombinedParams = function getHashCombinedParams(uri, params) {\n if (!params) return uri;\n\n var str = '';\n for (var key in params) {\n str += '&' + key + '=' + String(params[key]);\n }\n if (str === '') return uri;\n\n uri = uri.indexOf('#') >= 0 ? uri + str : uri + '#' + str.substr(1);\n return uri;\n};\n\nvar getObjForPagination = function getObjForPagination(totalPostNum, displayPostNumPerPage, displayPaginationBtnNum, pageIndex) {\n var args = Array.prototype.slice.call(arguments);\n\n if (args.length < 4) throw new Error('getObjForPagination() requires 4 parameters.');\n\n if (!isInteger(totalPostNum) || !isInteger(displayPostNumPerPage) || !isInteger(displayPaginationBtnNum) || !isInteger(pageIndex)) {\n throw new TypeError('getObjForPagination() requires Integer Number parameters.');\n }\n if (totalPostNum <= 0 || displayPostNumPerPage <= 0 || displayPaginationBtnNum <= 0 || pageIndex <= 0) {\n throw new TypeError('getObjForPagination() requires positive Integer Number parameters.');\n }\n\n var totalPageNum = Math.ceil(totalPostNum / displayPostNumPerPage);\n if (pageIndex < 1) pageIndex = 1;\n if (pageIndex > totalPageNum) pageIndex = totalPageNum;\n\n var paginationBtnGroupIndex = Math.floor((pageIndex - 1) / displayPaginationBtnNum),\n prevPageIndex = paginationBtnGroupIndex * displayPaginationBtnNum,\n firstPageIndex = paginationBtnGroupIndex * displayPaginationBtnNum + 1,\n lastPageIndex = firstPageIndex + displayPaginationBtnNum - 1,\n nextPageIndex = lastPageIndex + 1;\n\n if (lastPageIndex > totalPageNum) lastPageIndex = totalPageNum;\n if (nextPageIndex > totalPageNum) nextPageIndex = 0;\n\n return {\n totalPostNum: totalPostNum,\n displayPostNumPerPage: displayPostNumPerPage,\n displayPaginationBtnNum: displayPaginationBtnNum,\n pageIndex: pageIndex,\n\n totalPageNum: totalPageNum,\n prevPageIndex: prevPageIndex,\n firstPageIndex: firstPageIndex,\n lastPageIndex: lastPageIndex,\n nextPageIndex: nextPageIndex\n };\n};\n\nvar getDivideIntStrByThousandUnit = function getDivideIntStrByThousandUnit(intStr_) {\n if (not(isDefined)(intStr_)) return ['0'];\n\n var DIVIDE_UNIT = 4;\n\n var intStr = String(parseStrIntToInt(intStr_)),\n intStrs = [];\n\n if (intStr.length <= DIVIDE_UNIT) return [String(intStr)];\n\n var lastIndex = 0,\n unitStr = '';\n while (intStr.length > DIVIDE_UNIT) {\n lastIndex = intStr.length;\n unitStr = intStr.substr(lastIndex - DIVIDE_UNIT, lastIndex);\n\n intStr = intStr.substr(0, lastIndex - DIVIDE_UNIT);\n intStrs.unshift(unitStr);\n }\n intStrs.unshift(intStr);\n\n return intStrs;\n};\n\nvar getMarketPriceStr = function getMarketPriceStr(str) {\n var UNIT_PRICE = ['', '만', '억'];\n\n var val = isDefined(str) ? str : '0',\n unitValues = getDivideIntStrByThousandUnit(val);\n\n unitValues.reverse();\n\n var priceStr = '',\n unitVal = 0;\n for (var i = 0, max = unitValues.length; i < max; i++) {\n unitVal = parseInt10(unitValues[i]);\n if (unitVal <= 0) continue;\n\n priceStr = numberWithCommas(unitVal) + UNIT_PRICE[i] + priceStr;\n if (i !== unitValues.length) priceStr = ' ' + priceStr;\n }\n priceStr = priceStr.trim();\n\n if (!priceStr) return '0';\n return priceStr;\n};\n\nvar getEmphasizedStrByQuery = function getEmphasizedStrByQuery(str, query) {\n return (str || '').split(query).join('' + query + '');\n};\n\nvar getSeparatedDateStr = function getSeparatedDateStr(moment, dateStr) {\n var DAYS = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {\n 'Sunday': '일',\n 'Monday': '월',\n 'Tuesday': '화',\n 'Wednesday': '수',\n 'Thursday': '목',\n 'Friday': '금',\n 'Saturday': '토'\n };\n\n var val = '';\n\n var MIN_TO_SEC = 60,\n HOUR_TO_SEC = 3600,\n DAY_TO_SEC = 86400;\n\n var now = new Date(),\n past = new Date(dateStr),\n diffSeconds = Math.floor((now - past) / 1000);\n\n if (diffSeconds < DAY_TO_SEC) {\n if (diffSeconds < HOUR_TO_SEC) {\n if (diffSeconds < MIN_TO_SEC) {\n val = diffSeconds + '\\uCD08 \\uC804';\n } else {\n var diffMinutes = Math.floor(diffSeconds / MIN_TO_SEC);\n val = diffMinutes + '\\uBD84 \\uC804';\n }\n } else {\n var diffHours = Math.floor(diffSeconds / HOUR_TO_SEC);\n val = diffHours + '\\uC2DC\\uAC04 \\uC804';\n }\n } else {\n var date = moment(dateStr),\n day = DAYS[date.format('dddd')] || '';\n\n val = date.format('YYYY-MM-DD');\n // val = date.format(`YYYY.MM.DD. (${day})`);\n }\n\n return val;\n};\n\nvar namespace = function namespace(_namespace, parent) {\n if (!isString(_namespace)) throw new TypeError('namespace parameter type of namespace() must be String.');\n if (!(isObject(parent) || !isDefined(parent))) throw new TypeError('parent parameter type of namespace() must be Object or null or undefined.');\n\n var ns = parent || window;\n\n if (_namespace) {\n var parts = _namespace.split('.');\n\n for (var i = 0, max = parts.length; i < max; i++) {\n if (!ns[parts[i]]) ns[parts[i]] = {};\n ns = ns[parts[i]];\n }\n }\n\n return ns;\n};\n\nvar template = function template(strings) {\n for (var _len = arguments.length, keys = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n keys[_key - 1] = arguments[_key];\n }\n\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals\n return function () {\n for (var _len2 = arguments.length, values = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n values[_key2] = arguments[_key2];\n }\n\n var dict = values[values.length - 1] || {};\n\n var result = [strings[0]];\n keys.forEach(function (key, i) {\n var value = Number.isInteger(key) ? values[key] : dict[key];\n result.push(value, strings[i + 1]);\n });\n\n return result.join('');\n };\n};\n\n// board - server list\nvar getUrlAddCategoryIdByArticle = function getUrlAddCategoryIdByArticle(_url, _article, _serverNameMap) {\n var url = _url;\n\n if (url !== '#') {\n var path = url.split('?')[0],\n uriParams = getUriParams(url);\n\n var categoryId = isObject(_article.category) ? _article.category.categoryId : uriParams.categoryId;\n\n if (isNotDefined(categoryId)) {\n // const obj = getFirstObjectHasProperty(_serverNameMap, 'serverId', 1) || _serverNameMap[0];\n // categoryId = obj.categoryId;\n categoryId = 0;\n }\n\n url = getUriCombinedParams(path, $.extend(uriParams, { categoryId: categoryId }));\n }\n\n return url;\n};\n\n// character setting - stat, equip simulator\nvar getChangedStats = function getChangedStats(originalStatObj, newStatObj) {\n var changedStats = {};\n\n var stat, newStat;\n for (var key in originalStatObj) {\n stat = isDefined(originalStatObj[key]) ? originalStatObj[key] : null;\n newStat = isDefined(newStatObj[key]) ? newStatObj[key] : null;\n\n if (allOf(isDefined(newStat), stat !== newStat)) changedStats[key] = newStat;\n }\n\n var changeStatsCount = 0;\n for (var k in changedStats) {\n changeStatsCount++;\n }return changeStatsCount > 0 ? changedStats : null;\n};\n\n// 2021.12 [StatModel.js] STEP_ELIXIR_POINT_BY_LEVEL = [{level: 80, point: 2 }, {level: 90, point: 2}, {level: 100, point: 3 }];\nvar getPlusElixirPointByLevel = function getPlusElixirPointByLevel(level, level_init, plusElixirPointByLevel) {\n var _plusElixirPoint = 0;\n if ((level - level_init) % 2 === 0) {\n _plusElixirPoint = 1;\n }\n each(plusElixirPointByLevel, function (obj) {\n if (parseInt(obj.level) === parseInt(level)) {\n _plusElixirPoint = parseInt(obj.point);\n }\n });\n // console.log( '=> util.js _plusElixirPoint : ', _plusElixirPoint );\n return _plusElixirPoint;\n};\n\n// 2019.11 엘릭서를 사용할 수 없는 레벨 체크 50 이상이면 가능함 _.statData.level - _.model.LEVEL_INIT\nvar isLevelCanConsumeElixirStat = function isLevelCanConsumeElixirStat(level, perLevelPlusElixirPoint) {\n return level >= 0 ? true : false;\n // return (level % perLevelPlusElixirPoint === 0) ? true : false;\n};\n\nvar isLevelGetElixirPoint = function isLevelGetElixirPoint(level, perLevelPlusElixirPoint) {\n // 2019.11\n return level % perLevelPlusElixirPoint === 0 ? true : false;\n};\n\n// STAT_MAX_BY_LEVEL 2021.\nvar getStatMaxByLevel = function getStatMaxByLevel(level, statMaxByLevel) {\n var _statMax = 50;\n each(statMaxByLevel, function (obj) {\n if (parseInt(obj.level) <= level) {\n _statMax = parseInt(obj.max);\n }\n });\n // console.log( '=> util.js getStatMaxByLevel() _statMax : ', _statMax );\n return _statMax;\n};\n\nvar isWarrior = function isWarrior(classId) {\n if (parseInt10(classId) === 7) return true;\n\n return false;\n};\n\nvar getClassName = function getClassName(classId) {\n var CLASS_NAMES_KOR = ['군주', '기사', '요정', '마법사', '다크엘프', '용기사', '환술사', '전사', '검사', '창기사'];\n\n var className = CLASS_NAMES_KOR[parseInt10(classId)];\n if (not(isDefined)(className)) className = '';\n\n return className;\n};\n\nvar removeEquipInEquips = function removeEquipInEquips(equips, equipItemObj) {\n if (!Array.isArray(equips)) throw new TypeError('arr parameter type of removeEquipInEquips() must be Array.');\n\n var clonedEquips = equips.slice();\n\n var equip = void 0;\n for (var i = 0, max = clonedEquips.length; i < max; i++) {\n equip = clonedEquips[i];\n\n if (allOf(isDefined(equip), equip.id === equipItemObj.id, equip.name === equipItemObj.name, equip.slot === equipItemObj.slot)) {\n clonedEquips.splice(i, 1);\n break;\n }\n }\n\n return clonedEquips;\n};\n\nvar isPetNecklace = function isPetNecklace(itemId) {\n return itemId === __WEBPACK_IMPORTED_MODULE_0__model_model__[\"a\" /* PET_NECKLACE_ID */] ? true : false;\n};\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(2);\n\n\n/***/ }),\n/* 2 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__realtimeKeyword_RealtimeKeyword__ = __webpack_require__(3);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__utils_util__ = __webpack_require__(0);\n\n\n\n(function ($, global) {\n \"use strict\";\n\n // import tram\n\n __webpack_require__(6);\n\n Object(__WEBPACK_IMPORTED_MODULE_1__utils_util__[\"d\" /* namespace */])('nc.lineage');\n\n nc.lineage.searchRealtimeKeyword = function (options) {\n if (Object(__WEBPACK_IMPORTED_MODULE_1__utils_util__[\"c\" /* isNotDefined */])(options)) throw new Error('nc.lineage.searchRealtimeKeyword require options object');\n\n var keyword = global.popularKeyword;\n if (Object(__WEBPACK_IMPORTED_MODULE_1__utils_util__[\"c\" /* isNotDefined */])(keyword) || Object(__WEBPACK_IMPORTED_MODULE_1__utils_util__[\"e\" /* not */])(Array.isArray)(keyword.data) || keyword.data.length <= 0) return;\n\n var data = Object(__WEBPACK_IMPORTED_MODULE_1__utils_util__[\"a\" /* getFirstObjectHasProperty */])(keyword.data, 'pos', options.pos);\n if (Object(__WEBPACK_IMPORTED_MODULE_1__utils_util__[\"c\" /* isNotDefined */])(data)) return;\n\n return new __WEBPACK_IMPORTED_MODULE_0__realtimeKeyword_RealtimeKeyword__[\"a\" /* default */]({\n service: options.service,\n wrap: options.wrap,\n serverId: options.serverId,\n data: data,\n alias: options.alias,\n global: global\n }).init();\n };\n})(jQuery, window);\n\n/***/ }),\n/* 3 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* WEBPACK VAR INJECTION */(function(global) {/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__utils_util__ = __webpack_require__(0);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\n\nvar RealtimeKeyword = function () {\n function RealtimeKeyword(options) {\n _classCallCheck(this, RealtimeKeyword);\n\n console.log('RealtimeKeyword constructor !!! ');\n var _ = this;\n\n if (!options) return;\n\n _.INTERVAL_ROLLING_ITEMS = 3500;\n\n _.option = $.extend(true, {\n service: 'search', // search, item, powerbook\n wrap: null,\n data: null,\n alias: null,\n serverId: 1,\n global: window\n }, options);\n\n _.global = _.option.global ? _.option.global : window;\n\n _.data = null;\n _.alias = null;\n _.wrap = null;\n\n _.rollingWrap = null;\n _.rollingKeywordWrap = null;\n _.rollingItemInterval = null;\n _.rollingItemIndex = 1;\n\n _.listWrap = null;\n _.listKeywordWrap = null;\n\n _.uniqueId = Date.now();\n\n _.proxy = {\n clickDocumentEventHandler: null\n };\n }\n\n _createClass(RealtimeKeyword, [{\n key: 'init',\n value: function init() {\n\n console.log('realtime keyword .js init() ');\n\n var _ = this;\n\n _.wrap = $(_.option.wrap);\n\n if (Object(__WEBPACK_IMPORTED_MODULE_0__utils_util__[\"b\" /* isDefined */])(_.wrap) && _.wrap.length) {\n _.data = _.option.data ? _.option.data.list : [];\n\n if (_.data.length) {\n _.rollingWrap = $('.keyword__rolling', _.wrap);\n _.listWrap = $('.keyword__list', _.wrap);\n\n _.rollingKeywordWrap = $('.keyword', _.rollingWrap);\n _.listKeywordWrap = $('.keyword', _.listWrap);\n\n _.proxy.clickDocumentEventHandler = $.proxy(_.clickDocumentEventHandler, _);\n\n _.setInstance();\n }\n }\n\n return _;\n }\n }, {\n key: 'setInstance',\n value: function setInstance() {\n var _ = this;\n\n var item = void 0,\n obj = void 0,\n tpl = '',\n queryStr = '';\n for (var i = 0, max = _.data.length; i < max; ++i) {\n var fnAlias = function fnAlias(alias) {\n var _alias = void 0;\n switch (_.option.alias) {\n case 'search-powerbook':\n _alias = 'powerbook';\n break;\n case 'search-community':\n _alias = 'community';\n break;\n case 'search-faq':\n _alias = 'faq';\n break;\n default:\n _alias = 'index';\n break;\n }\n return _alias;\n };\n\n item = _.data[i];\n\n queryStr = global.encodeURIComponent(item[0]);\n\n obj = {\n index: i + 1,\n name: item[0],\n updown: item[1], // 'up', 'down', 'same'\n rank: item[2],\n url: ''\n };\n\n switch (_.option.service) {\n case 'search':\n obj.url = '/search/' + fnAlias(_.option.alias) + '?query=' + queryStr;\n break;\n\n case 'item':\n obj.url = '/world/item/search?serverId=' + _.option.serverId + '&query=' + queryStr;\n break;\n\n case 'powerbook':\n obj.url = '/powerbook/search?query=' + queryStr;\n break;\n }\n\n tpl += _.getListTpl(obj);\n }\n\n _.rollingKeywordWrap.empty().append(tpl);\n _.listKeywordWrap.empty().append(tpl);\n\n _.setRollingKeywords();\n _.setToggleBtn();\n _.setWrapVisible(false);\n }\n }, {\n key: 'setRollingKeywords',\n value: function setRollingKeywords() {\n var _ = this;\n\n var items = $('li', _.rollingKeywordWrap);\n tram(items).set({\n position: 'absolute',\n top: 0,\n left: 0,\n y: _.rollingKeywordWrap.height()\n });\n\n _.changeItem(_.rollingItemIndex);\n _.setRollingKeywordInterval(true);\n }\n }, {\n key: 'setRollingKeywordInterval',\n value: function setRollingKeywordInterval(flag) {\n var _ = this;\n\n _.global.clearInterval(_.rollingItemInterval);\n _.rollingItemInterval = null;\n\n if (Object(__WEBPACK_IMPORTED_MODULE_0__utils_util__[\"f\" /* truthy */])(flag)) {\n var items = $('li', _.rollingKeywordWrap);\n\n _.rollingItemInterval = _.global.setInterval(function () {\n var activateIndex = _.rollingItemIndex + 1;\n if (activateIndex > items.length) activateIndex = 1;\n\n _.changeItem(activateIndex);\n _.rollingItemIndex = activateIndex;\n }, _.INTERVAL_ROLLING_ITEMS);\n }\n }\n }, {\n key: 'changeItem',\n value: function changeItem(index) {\n var _ = this;\n\n var keywordWrapHeight = _.rollingKeywordWrap.height(),\n prevItemIndex = _.rollingItemIndex,\n activateIndex = index;\n\n var items = $('li', _.rollingKeywordWrap),\n prevItem = $(items.get(prevItemIndex - 1)),\n activateItem = $(items.get(activateIndex - 1));\n\n if (prevItem.length) {\n tram(prevItem).stop({ y: true }).add('transform 0.9s ease-out-expo').start({ y: -keywordWrapHeight });\n }\n\n if (activateItem.length) {\n tram(activateItem).stop({ y: true }).set({ y: keywordWrapHeight }).add('transform 0.9s ease-out-expo').start({ y: 0 });\n }\n }\n }, {\n key: 'getListTpl',\n value: function getListTpl(obj) {\n return '
  • \\n ' + obj.name + '\\n ' + obj.rank + '\\n
  • ';\n }\n }, {\n key: 'setToggleBtn',\n value: function setToggleBtn() {\n var _ = this;\n\n $('.btn-toggle', _.wrap).on('click', function (evt) {\n evt.preventDefault();\n\n var isListWrapVisible = _.listWrap.is(':visible');\n\n _.setDocumentEventHandler(!isListWrapVisible);\n _.setWrapVisible(!isListWrapVisible);\n });\n }\n }, {\n key: 'setWrapVisible',\n value: function setWrapVisible(flag) {\n var _ = this;\n\n if (Object(__WEBPACK_IMPORTED_MODULE_0__utils_util__[\"f\" /* truthy */])(flag)) {\n _.wrap.addClass('on');\n _.showListWrap(true);\n } else {\n _.wrap.removeClass('on');\n _.showListWrap(false);\n }\n }\n }, {\n key: 'showListWrap',\n value: function showListWrap(flag) {\n Object(__WEBPACK_IMPORTED_MODULE_0__utils_util__[\"f\" /* truthy */])(flag) ? this.listWrap.show() : this.listWrap.hide();\n }\n }, {\n key: 'setDocumentEventHandler',\n value: function setDocumentEventHandler(flag) {\n var _ = this;\n\n $(document).off('click.ui.realtimekeyword.' + _.uniqueId, _.proxy.clickDocumentEventHandler);\n if (Object(__WEBPACK_IMPORTED_MODULE_0__utils_util__[\"f\" /* truthy */])(flag)) $(document).on('click.ui.realtimekeyword.' + _.uniqueId, _.proxy.clickDocumentEventHandler);\n\n return _;\n }\n }, {\n key: 'clickDocumentEventHandler',\n value: function clickDocumentEventHandler(evt) {\n var _ = this;\n\n switch (evt.type) {\n case 'click':\n var toggleBtn = $('.btn-toggle', _.wrap).get(0),\n keywordList = $('.keyword__list', _.wrap).get(0);\n\n if (evt.target === toggleBtn) return;\n if (evt.target === keywordList || $.contains(keywordList, evt.target)) return;\n\n _.setDocumentEventHandler(false);\n _.setWrapVisible(false);\n\n break;\n }\n\n return _;\n }\n }]);\n\n return RealtimeKeyword;\n}();\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (RealtimeKeyword);\n/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__(4)))\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports) {\n\nvar g;\r\n\r\n// This works in non-strict mode\r\ng = (function() {\r\n\treturn this;\r\n})();\r\n\r\ntry {\r\n\t// This works if eval is allowed (see CSP)\r\n\tg = g || Function(\"return this\")() || (1,eval)(\"this\");\r\n} catch(e) {\r\n\t// This works if the window reference is available\r\n\tif(typeof window === \"object\")\r\n\t\tg = window;\r\n}\r\n\r\n// g can still be undefined, but nothing to do about it...\r\n// We return undefined, instead of nothing here, so it's\r\n// easier to handle this case. if(!global) { ...}\r\n\r\nmodule.exports = g;\r\n\n\n/***/ }),\n/* 5 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* unused harmony export BREAKPOINTS */\n/* unused harmony export DAYS */\n/* unused harmony export API_DOMAIN_DEFAULT */\n/* unused harmony export API_COMMUNITY_DOMAIN */\n/* unused harmony export STATIC_DOMAIN_DEFAULT */\n/* unused harmony export STATIC_CDN_DOMAIN_DEFAULT */\n/* unused harmony export NO_ITEM_IMAGE_URL */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return PET_NECKLACE_ID; });\nvar BREAKPOINTS = {\n tablet: 640,\n pc: 960,\n max: 1340\n};\n\nvar DAYS = {\n 'Sunday': '일',\n 'Monday': '월',\n 'Tuesday': '화',\n 'Wednesday': '수',\n 'Thursday': '목',\n 'Friday': '금',\n 'Saturday': '토'\n};\n\nvar API_DOMAIN_DEFAULT = 'https://api-lineage.plaync.com';\n\nvar API_COMMUNITY_DOMAIN = 'https://api-commnity.plaync.com/lineage1';\n\nvar STATIC_DOMAIN_DEFAULT = 'https://assets.playnccdn.com'; // https://wstatic.plaync.co.kr';\n\nvar STATIC_CDN_DOMAIN_DEFAULT = 'https://wstatic-cdn.plaync.com';\n\nvar NO_ITEM_IMAGE_URL = STATIC_DOMAIN_DEFAULT + '/lineage/v1/img/world/item/noimg.gif';\n\nvar PET_NECKLACE_ID = 25668;\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports) {\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n/*!\r\n * tram.js v0.8.3-global\r\n * Cross-browser CSS3 transitions in JavaScript\r\n * https://github.com/bkwld/tram\r\n * MIT License\r\n */\nwindow.tram = function (jQuery) {\n\n /*!\r\n * P.js\r\n * A lightweight class system. It's just prototypes!\r\n * http:// github.com/jayferd/pjs\r\n * MIT license\r\n */\n var P = function (prototype, ownProperty, undefined) {\n // helper functions that also help minification\n function isObject(o) {\n return (typeof o === 'undefined' ? 'undefined' : _typeof(o)) === 'object';\n }\n function isFunction(f) {\n return typeof f === 'function';\n }\n\n // a function that gets reused to make uninitialized objects\n function BareConstructor() {}\n\n function P(_superclass /* = Object */, definition) {\n // handle the case where no superclass is given\n if (definition === undefined) {\n definition = _superclass;\n _superclass = Object;\n }\n\n // C is the class to be returned.\n //\n // It delegates to instantiating an instance of `Bare`, so that it\n // will always return a new instance regardless of the calling\n // context.\n //\n // TODO: the Chrome inspector shows all created objects as `C`\n // rather than `Object`. Setting the .name property seems to\n // have no effect. Is there a way to override this behavior?\n function C() {\n var self = new Bare();\n if (isFunction(self.init)) self.init.apply(self, arguments);\n return self;\n }\n\n // C.Bare is a class with a noop constructor. Its prototype is the\n // same as C, so that instances of C.Bare are also instances of C.\n // New objects can be allocated without initialization by calling\n // `new MyClass.Bare`.\n function Bare() {}\n C.Bare = Bare;\n\n // Set up the prototype of the new class.\n var _super = BareConstructor[prototype] = _superclass[prototype];\n var proto = Bare[prototype] = C[prototype] = new BareConstructor();\n\n // other variables, as a minifier optimization\n var extensions;\n\n // set the constructor property on the prototype, for convenience\n proto.constructor = C;\n\n C.mixin = function (def) {\n Bare[prototype] = C[prototype] = P(C, def)[prototype];\n return C;\n };\n\n C.open = function (def) {\n extensions = {};\n\n if (isFunction(def)) {\n // call the defining function with all the arguments you need\n // extensions captures the return value.\n extensions = def.call(C, proto, _super, C, _superclass);\n } else if (isObject(def)) {\n // if you passed an object instead, we'll take it\n extensions = def;\n }\n\n // ...and extend it\n if (isObject(extensions)) {\n for (var ext in extensions) {\n if (ownProperty.call(extensions, ext)) {\n proto[ext] = extensions[ext];\n }\n }\n }\n\n // if there's no init, we assume we're inheriting a non-pjs class, so\n // we default to applying the superclass's constructor.\n if (!isFunction(proto.init)) {\n proto.init = _superclass;\n }\n\n return C;\n };\n\n return C.open(definition);\n }\n\n // ship it\n return P;\n\n // as a minifier optimization, we've closured in a few helper functions\n // and the string 'prototype' (C[p] is much shorter than C.prototype)\n }('prototype', {}.hasOwnProperty);\n\n // --------------------------------------------------\n // Easing methods { id: [ cssString, jsFunction ] }\n\n var easing = {\n\n // --------------------------------------------------\n // CSS easings, converted to functions using Timothee Groleau's generator.\n // http://www.timotheegroleau.com/Flash/experiments/easing_function_generator.htm\n\n 'ease': ['ease', function (t, b, c, d) {\n var ts = (t /= d) * t;\n var tc = ts * t;\n return b + c * (-2.75 * tc * ts + 11 * ts * ts + -15.5 * tc + 8 * ts + 0.25 * t);\n }],\n\n 'ease-in': ['ease-in', function (t, b, c, d) {\n var ts = (t /= d) * t;\n var tc = ts * t;\n return b + c * (-1 * tc * ts + 3 * ts * ts + -3 * tc + 2 * ts);\n }],\n\n 'ease-out': ['ease-out', function (t, b, c, d) {\n var ts = (t /= d) * t;\n var tc = ts * t;\n return b + c * (0.3 * tc * ts + -1.6 * ts * ts + 2.2 * tc + -1.8 * ts + 1.9 * t);\n }],\n\n 'ease-in-out': ['ease-in-out', function (t, b, c, d) {\n var ts = (t /= d) * t;\n var tc = ts * t;\n return b + c * (2 * tc * ts + -5 * ts * ts + 2 * tc + 2 * ts);\n }]\n\n // --------------------------------------------------\n // Robert Penner easing equations and their CSS equivalents.\n // http://www.robertpenner.com/easing_terms_of_use.html\n\n , 'linear': ['linear', function (t, b, c, d) {\n return c * t / d + b;\n }]\n\n // Quad\n , 'ease-in-quad': ['cubic-bezier(0.550, 0.085, 0.680, 0.530)', function (t, b, c, d) {\n return c * (t /= d) * t + b;\n }],\n\n 'ease-out-quad': ['cubic-bezier(0.250, 0.460, 0.450, 0.940)', function (t, b, c, d) {\n return -c * (t /= d) * (t - 2) + b;\n }],\n\n 'ease-in-out-quad': ['cubic-bezier(0.455, 0.030, 0.515, 0.955)', function (t, b, c, d) {\n if ((t /= d / 2) < 1) return c / 2 * t * t + b;\n return -c / 2 * (--t * (t - 2) - 1) + b;\n }]\n\n // Cubic\n , 'ease-in-cubic': ['cubic-bezier(0.550, 0.055, 0.675, 0.190)', function (t, b, c, d) {\n return c * (t /= d) * t * t + b;\n }],\n\n 'ease-out-cubic': ['cubic-bezier(0.215, 0.610, 0.355, 1)', function (t, b, c, d) {\n return c * ((t = t / d - 1) * t * t + 1) + b;\n }],\n\n 'ease-in-out-cubic': ['cubic-bezier(0.645, 0.045, 0.355, 1)', function (t, b, c, d) {\n if ((t /= d / 2) < 1) return c / 2 * t * t * t + b;\n return c / 2 * ((t -= 2) * t * t + 2) + b;\n }]\n\n // Quart\n , 'ease-in-quart': ['cubic-bezier(0.895, 0.030, 0.685, 0.220)', function (t, b, c, d) {\n return c * (t /= d) * t * t * t + b;\n }],\n\n 'ease-out-quart': ['cubic-bezier(0.165, 0.840, 0.440, 1)', function (t, b, c, d) {\n return -c * ((t = t / d - 1) * t * t * t - 1) + b;\n }],\n\n 'ease-in-out-quart': ['cubic-bezier(0.770, 0, 0.175, 1)', function (t, b, c, d) {\n if ((t /= d / 2) < 1) return c / 2 * t * t * t * t + b;\n return -c / 2 * ((t -= 2) * t * t * t - 2) + b;\n }]\n\n // Quint\n , 'ease-in-quint': ['cubic-bezier(0.755, 0.050, 0.855, 0.060)', function (t, b, c, d) {\n return c * (t /= d) * t * t * t * t + b;\n }],\n\n 'ease-out-quint': ['cubic-bezier(0.230, 1, 0.320, 1)', function (t, b, c, d) {\n return c * ((t = t / d - 1) * t * t * t * t + 1) + b;\n }],\n\n 'ease-in-out-quint': ['cubic-bezier(0.860, 0, 0.070, 1)', function (t, b, c, d) {\n if ((t /= d / 2) < 1) return c / 2 * t * t * t * t * t + b;\n return c / 2 * ((t -= 2) * t * t * t * t + 2) + b;\n }]\n\n // Sine\n , 'ease-in-sine': ['cubic-bezier(0.470, 0, 0.745, 0.715)', function (t, b, c, d) {\n return -c * Math.cos(t / d * (Math.PI / 2)) + c + b;\n }],\n\n 'ease-out-sine': ['cubic-bezier(0.390, 0.575, 0.565, 1)', function (t, b, c, d) {\n return c * Math.sin(t / d * (Math.PI / 2)) + b;\n }],\n\n 'ease-in-out-sine': ['cubic-bezier(0.445, 0.050, 0.550, 0.950)', function (t, b, c, d) {\n return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b;\n }]\n\n // Expo\n , 'ease-in-expo': ['cubic-bezier(0.950, 0.050, 0.795, 0.035)', function (t, b, c, d) {\n return t === 0 ? b : c * Math.pow(2, 10 * (t / d - 1)) + b;\n }],\n\n 'ease-out-expo': ['cubic-bezier(0.190, 1, 0.220, 1)', function (t, b, c, d) {\n return t === d ? b + c : c * (-Math.pow(2, -10 * t / d) + 1) + b;\n }],\n\n 'ease-in-out-expo': ['cubic-bezier(1, 0, 0, 1)', function (t, b, c, d) {\n if (t === 0) return b;\n if (t === d) return b + c;\n if ((t /= d / 2) < 1) return c / 2 * Math.pow(2, 10 * (t - 1)) + b;\n return c / 2 * (-Math.pow(2, -10 * --t) + 2) + b;\n }]\n\n // Circ\n , 'ease-in-circ': ['cubic-bezier(0.600, 0.040, 0.980, 0.335)', function (t, b, c, d) {\n return -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b;\n }],\n\n 'ease-out-circ': ['cubic-bezier(0.075, 0.820, 0.165, 1)', function (t, b, c, d) {\n return c * Math.sqrt(1 - (t = t / d - 1) * t) + b;\n }],\n\n 'ease-in-out-circ': ['cubic-bezier(0.785, 0.135, 0.150, 0.860)', function (t, b, c, d) {\n if ((t /= d / 2) < 1) return -c / 2 * (Math.sqrt(1 - t * t) - 1) + b;\n return c / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + b;\n }]\n\n // Back\n , 'ease-in-back': ['cubic-bezier(0.600, -0.280, 0.735, 0.045)', function (t, b, c, d, s) {\n if (s === undefined) s = 1.70158;\n return c * (t /= d) * t * ((s + 1) * t - s) + b;\n }],\n\n 'ease-out-back': ['cubic-bezier(0.175, 0.885, 0.320, 1.275)', function (t, b, c, d, s) {\n if (s === undefined) s = 1.70158;\n return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;\n }],\n\n 'ease-in-out-back': ['cubic-bezier(0.680, -0.550, 0.265, 1.550)', function (t, b, c, d, s) {\n if (s === undefined) s = 1.70158;\n if ((t /= d / 2) < 1) return c / 2 * (t * t * (((s *= 1.525) + 1) * t - s)) + b;\n return c / 2 * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2) + b;\n }]\n };\n\n // Clamp cubic-bezier values for webkit bug\n // https://bugs.webkit.org/show_bug.cgi?id=45761\n var clamped = {\n 'ease-in-back': 'cubic-bezier(0.600, 0, 0.735, 0.045)',\n 'ease-out-back': 'cubic-bezier(0.175, 0.885, 0.320, 1)',\n 'ease-in-out-back': 'cubic-bezier(0.680, 0, 0.265, 1)'\n };\n\n // --------------------------------------------------\n // Private vars\n /*global jQuery, P, easing, clamped */\n\n var doc = document,\n win = window,\n dataKey = 'bkwld-tram',\n unitRegex = /[\\-\\.0-9]/g,\n capsRegex = /[A-Z]/,\n typeNumber = 'number',\n typeColor = /^(rgb|#)/,\n typeLength = /(em|cm|mm|in|pt|pc|px)$/,\n typeLenPerc = /(em|cm|mm|in|pt|pc|px|%)$/,\n typeAngle = /(deg|rad|turn)$/,\n typeFancy = 'unitless',\n emptyTrans = /(all|none) 0s ease 0s/,\n allowAuto = /^(width|height)$/,\n space = ' ';\n\n // --------------------------------------------------\n // Private functions\n\n // Simple feature detect, returns both dom + css prefixed names\n var testDiv = doc.createElement('a'),\n domPrefixes = ['Webkit', 'Moz', 'O', 'ms'],\n cssPrefixes = ['-webkit-', '-moz-', '-o-', '-ms-'];\n var testFeature = function testFeature(prop) {\n // unprefixed case\n if (prop in testDiv.style) return { dom: prop, css: prop };\n // test all prefixes\n var i,\n domProp,\n domSuffix = '',\n words = prop.split('-');\n for (i = 0; i < words.length; i++) {\n domSuffix += words[i].charAt(0).toUpperCase() + words[i].slice(1);\n }\n for (i = 0; i < domPrefixes.length; i++) {\n domProp = domPrefixes[i] + domSuffix;\n if (domProp in testDiv.style) return { dom: domProp, css: cssPrefixes[i] + prop };\n }\n };\n\n // Run feature tests\n var support = tram.support = {\n bind: Function.prototype.bind,\n transform: testFeature('transform'),\n transition: testFeature('transition'),\n backface: testFeature('backface-visibility'),\n timing: testFeature('transition-timing-function')\n };\n\n // Modify easing variants for webkit clamp bug\n if (support.transition) {\n var timingProp = support.timing.dom;\n testDiv.style[timingProp] = easing['ease-in-back'][0];\n if (!testDiv.style[timingProp]) {\n // style invalid, use clamped versions instead\n for (var x in clamped) {\n easing[x][0] = clamped[x];\n }\n }\n }\n\n // Animation timer shim with setTimeout fallback\n var enterFrame = tram.frame = function () {\n var raf = win.requestAnimationFrame || win.webkitRequestAnimationFrame || win.mozRequestAnimationFrame || win.oRequestAnimationFrame || win.msRequestAnimationFrame;\n if (raf && support.bind) return raf.bind(win);\n return function (callback) {\n win.setTimeout(callback, 16);\n };\n }();\n\n // Timestamp shim with fallback\n var timeNow = tram.now = function () {\n // use high-res timer if available\n var perf = win.performance,\n perfNow = perf && (perf.now || perf.webkitNow || perf.msNow || perf.mozNow);\n if (perfNow && support.bind) return perfNow.bind(perf);\n // fallback to epoch-based timestamp\n return Date.now || function () {\n return +new Date();\n };\n }();\n\n // --------------------------------------------------\n // Transition class - public API returned from the tram() wrapper.\n\n var Transition = P(function (proto) {\n\n proto.init = function (el) {\n this.$el = jQuery(el);\n this.el = this.$el[0];\n this.props = {};\n this.queue = [];\n this.style = '';\n this.active = false;\n\n // store inherited transitions from css styles\n if (config.keepInherited && !config.fallback) {\n var upstream = getStyle(this.el, 'transition');\n if (upstream && !emptyTrans.test(upstream)) this.upstream = upstream;\n }\n\n // hide backface if supported, for better perf\n if (support.backface && config.hideBackface) {\n setStyle(this.el, support.backface.css, 'hidden');\n }\n };\n\n // Public chainable methods\n chain('add', add);\n chain('start', start);\n chain('wait', wait);\n chain('then', then);\n chain('next', next);\n chain('stop', stop);\n chain('set', set);\n chain('show', show);\n chain('hide', hide);\n chain('redraw', redraw);\n chain('destroy', destroy);\n\n // Public add() - chainable\n function add(transition, options) {\n // Parse transition settings\n var settings = compact(('' + transition).split(space));\n var name = settings[0];\n options = options || {};\n\n // Get property definition from map\n var definition = propertyMap[name];\n if (!definition) return warn('Unsupported property: ' + name);\n\n // Ignore weak property additions\n if (options.weak && this.props[name]) return;\n\n // Init property instance\n var Class = definition[0];\n var prop = this.props[name];\n if (!prop) prop = this.props[name] = new Class.Bare();\n // Init settings + type + options\n prop.init(this.$el, settings, definition, options);\n return prop; // return for internal use\n }\n\n // Public start() - chainable\n function start(options, fromQueue, queueArgs) {\n if (!options) return;\n var optionType = typeof options === 'undefined' ? 'undefined' : _typeof(options);\n\n // Clear queue unless start was called from it\n if (!fromQueue) {\n this.timer && this.timer.destroy();\n this.queue = [];\n this.active = false;\n }\n\n // If options is a number, wait for a delay and continue queue.\n if (optionType == 'number' && fromQueue) {\n this.timer = new Delay({ duration: options, context: this, complete: next });\n this.active = true;\n return;\n }\n\n // If options is a string, invoke add() to modify transition settings\n if (optionType == 'string' && fromQueue) {\n switch (options) {\n case 'hide':\n hide.call(this);break;\n case 'stop':\n stop.call(this);break;\n case 'redraw':\n redraw.call(this);break;\n default:\n add.call(this, options, queueArgs && queueArgs[1]);\n }\n return next.call(this);\n }\n\n // If options is a function, invoke it.\n if (optionType == 'function') {\n options.call(this, this);\n return;\n }\n\n // If options is an object, start property tweens.\n if (optionType == 'object') {\n\n // loop through each valid property\n var timespan = 0;\n eachProp.call(this, options, function (prop, value) {\n // determine the longest time span (duration + delay)\n if (prop.span > timespan) timespan = prop.span;\n // stop current, then begin animation\n prop.stop();\n prop.animate(value);\n }, function (extras) {\n // look for wait property and use it to override timespan\n if ('wait' in extras) timespan = validTime(extras.wait, 0);\n });\n // update main transition styles for active props\n updateStyles.call(this);\n\n // start timer for total transition timespan\n if (timespan > 0) {\n this.timer = new Delay({ duration: timespan, context: this });\n this.active = true;\n if (fromQueue) this.timer.complete = next;\n }\n // apply deferred styles after a single frame delay\n var self = this,\n found = false,\n styles = {};\n enterFrame(function () {\n eachProp.call(self, options, function (prop) {\n if (!prop.active) return;\n found = true;\n styles[prop.name] = prop.nextStyle;\n });\n found && self.$el.css(styles); // set styles object\n });\n }\n }\n\n // Public wait() - chainable\n function wait(time) {\n time = validTime(time, 0);\n // if start() has ocurred, simply push wait into queue\n if (this.active) {\n this.queue.push({ options: time });\n } else {\n // otherwise, start a timer. wait() is starting the sequence.\n this.timer = new Delay({ duration: time, context: this, complete: next });\n this.active = true;\n }\n }\n\n // Public then() - chainable\n function then(options) {\n if (!this.active) {\n return warn('No active transition timer. Use start() or wait() before then().');\n }\n // push options into queue\n this.queue.push({ options: options, args: arguments });\n // set timer complete callback\n this.timer.complete = next;\n }\n\n // Public next() - chainable\n function next() {\n // stop current timer in case next() was called early\n this.timer && this.timer.destroy();\n this.active = false;\n // if the queue is empty do nothing\n if (!this.queue.length) return;\n // start next item in queue\n var queued = this.queue.shift();\n start.call(this, queued.options, true, queued.args);\n }\n\n // Public stop() - chainable\n function stop(options) {\n this.timer && this.timer.destroy();\n this.queue = [];\n this.active = false;\n var values;\n if (typeof options == 'string') {\n values = {};\n values[options] = 1;\n } else if ((typeof options === 'undefined' ? 'undefined' : _typeof(options)) == 'object' && options != null) {\n values = options;\n } else {\n values = this.props;\n }\n eachProp.call(this, values, stopProp);\n updateStyles.call(this);\n }\n\n // Public set() - chainable\n function set(values) {\n stop.call(this, values);\n eachProp.call(this, values, setProp, setExtras);\n }\n\n // Public show() - chainable\n function show(display) {\n // Show an element by setting its display\n if (typeof display != 'string') display = 'block';\n this.el.style.display = display;\n }\n\n // Public hide() - chainable\n function hide() {\n // Stop all transitions before hiding the element\n stop.call(this);\n this.el.style.display = 'none';\n }\n\n // Public redraw() - chainable\n function redraw() {\n this.el.offsetHeight;\n }\n\n // Public destroy() - chainable\n function destroy() {\n stop.call(this);\n jQuery.removeData(this.el, dataKey);\n this.$el = this.el = null;\n }\n\n // Update transition styles\n function updateStyles() {\n // build transition string from active props\n var p,\n prop,\n result = [];\n if (this.upstream) result.push(this.upstream);\n for (p in this.props) {\n prop = this.props[p];\n if (!prop.active) continue;\n result.push(prop.string);\n }\n // set transition style property on dom element\n result = result.join(',');\n if (this.style === result) return;\n this.style = result;\n this.el.style[support.transition.dom] = result;\n }\n\n // Loop through valid properties, auto-create them, and run iterator callback\n function eachProp(collection, iterator, ejector) {\n // skip auto-add during stop()\n var autoAdd = iterator !== stopProp;\n var name;\n var prop;\n var value;\n var matches = {};\n var extras;\n // find valid properties in collection\n for (name in collection) {\n value = collection[name];\n // match transform sub-properties\n if (name in transformMap) {\n if (!matches.transform) matches.transform = {};\n matches.transform[name] = value;\n continue;\n }\n // convert camelCase to dashed\n if (capsRegex.test(name)) name = toDashed(name);\n // match base properties\n if (name in propertyMap) {\n matches[name] = value;\n continue;\n }\n // otherwise, add property to extras\n if (!extras) extras = {};\n extras[name] = value;\n }\n // iterate on each matched property, auto-adding them\n for (name in matches) {\n value = matches[name];\n prop = this.props[name];\n if (!prop) {\n // skip auto-add during stop()\n if (!autoAdd) continue;\n // auto-add property instances\n prop = add.call(this, name);\n }\n // iterate on each property\n iterator.call(this, prop, value);\n }\n // finally, eject the extras into space\n if (ejector && extras) ejector.call(this, extras);\n }\n\n // Loop iterators\n function stopProp(prop) {\n prop.stop();\n }\n function setProp(prop, value) {\n prop.set(value);\n }\n function setExtras(extras) {\n this.$el.css(extras);\n }\n\n // Define a chainable method that takes children into account\n function chain(name, method) {\n proto[name] = function () {\n if (this.children) return eachChild.call(this, method, arguments);\n this.el && method.apply(this, arguments);\n return this;\n };\n }\n\n // Iterate through children and apply the method, return for chaining\n function eachChild(method, args) {\n var i,\n count = this.children.length;\n for (i = 0; i < count; i++) {\n method.apply(this.children[i], args);\n }\n return this;\n }\n });\n\n // Tram class - extends Transition + wraps child instances for chaining.\n var Tram = P(Transition, function (proto) {\n\n proto.init = function (element, options) {\n var $elems = jQuery(element);\n\n // Invalid selector, do nothing.\n if (!$elems.length) return this;\n\n // Single case - return single Transition instance\n if ($elems.length === 1) return factory($elems[0], options);\n\n // Store multiple instances for chaining\n var children = [];\n $elems.each(function (index, el) {\n children.push(factory(el, options));\n });\n this.children = children;\n return this;\n };\n\n // Retrieve instance from data or create a new one.\n function factory(el, options) {\n var t = jQuery.data(el, dataKey) || jQuery.data(el, dataKey, new Transition.Bare());\n if (!t.el) t.init(el);\n if (options) return t.start(options);\n return t;\n }\n });\n\n // --------------------------------------------------\n // Property class - get/set property values\n\n var Property = P(function (proto) {\n\n var defaults = {\n duration: 500,\n ease: 'ease',\n delay: 0\n };\n\n proto.init = function ($el, settings, definition, options) {\n // Initialize or extend settings\n this.$el = $el;\n this.el = $el[0];\n var name = settings[0];\n if (definition[2]) name = definition[2]; // expand name\n if (prefixed[name]) name = prefixed[name];\n this.name = name;\n this.type = definition[1];\n this.duration = validTime(settings[1], this.duration, defaults.duration);\n this.ease = validEase(settings[2], this.ease, defaults.ease);\n this.delay = validTime(settings[3], this.delay, defaults.delay);\n this.span = this.duration + this.delay;\n this.active = false;\n this.nextStyle = null;\n this.auto = allowAuto.test(this.name);\n this.unit = options.unit || this.unit || config.defaultUnit;\n this.angle = options.angle || this.angle || config.defaultAngle;\n // Animate using tween fallback if necessary, otherwise use transition.\n if (config.fallback || options.fallback) {\n this.animate = this.fallback;\n } else {\n this.animate = this.transition;\n this.string = this.name + space + this.duration + 'ms' + (this.ease != 'ease' ? space + easing[this.ease][0] : '') + (this.delay ? space + this.delay + 'ms' : '');\n }\n };\n\n // Set value immediately\n proto.set = function (value) {\n value = this.convert(value, this.type);\n this.update(value);\n this.redraw();\n };\n\n // CSS transition\n proto.transition = function (value) {\n // set new value to start transition\n this.active = true;\n value = this.convert(value, this.type);\n if (this.auto) {\n // when transitioning from 'auto', we must reset to computed\n if (this.el.style[this.name] == 'auto') {\n this.update(this.get());\n this.redraw();\n }\n if (value == 'auto') value = getAuto.call(this);\n }\n this.nextStyle = value;\n };\n\n // Fallback tweening\n proto.fallback = function (value) {\n var from = this.el.style[this.name] || this.convert(this.get(), this.type);\n value = this.convert(value, this.type);\n if (this.auto) {\n if (from == 'auto') from = this.convert(this.get(), this.type);\n if (value == 'auto') value = getAuto.call(this);\n }\n this.tween = new Tween({\n from: from,\n to: value,\n duration: this.duration,\n delay: this.delay,\n ease: this.ease,\n update: this.update,\n context: this\n });\n };\n\n // Get current element style\n proto.get = function () {\n return getStyle(this.el, this.name);\n };\n\n // Update element style value\n proto.update = function (value) {\n setStyle(this.el, this.name, value);\n };\n\n // Stop animation\n proto.stop = function () {\n // Stop CSS transition\n if (this.active || this.nextStyle) {\n this.active = false;\n this.nextStyle = null;\n setStyle(this.el, this.name, this.get());\n }\n // Stop fallback tween\n var tween = this.tween;\n if (tween && tween.context) tween.destroy();\n };\n\n // Convert value to expected type\n proto.convert = function (value, type) {\n if (value == 'auto' && this.auto) return value;\n var warnType,\n number = typeof value == 'number',\n string = typeof value == 'string';\n switch (type) {\n case typeNumber:\n if (number) return value;\n if (string && value.replace(unitRegex, '') === '') return +value;\n warnType = 'number(unitless)';\n break;\n case typeColor:\n if (string) {\n if (value === '' && this.original) {\n return this.original;\n }\n if (type.test(value)) {\n if (value.charAt(0) == '#' && value.length == 7) return value;\n return cssToHex(value);\n }\n }\n warnType = 'hex or rgb string';\n break;\n case typeLength:\n if (number) return value + this.unit;\n if (string && type.test(value)) return value;\n warnType = 'number(px) or string(unit)';\n break;\n case typeLenPerc:\n if (number) return value + this.unit;\n if (string && type.test(value)) return value;\n warnType = 'number(px) or string(unit or %)';\n break;\n case typeAngle:\n if (number) return value + this.angle;\n if (string && type.test(value)) return value;\n warnType = 'number(deg) or string(angle)';\n break;\n case typeFancy:\n if (number) return value;\n if (string && typeLenPerc.test(value)) return value;\n warnType = 'number(unitless) or string(unit or %)';\n break;\n }\n // Type must be invalid, warn people.\n typeWarning(warnType, value);\n return value;\n };\n\n proto.redraw = function () {\n this.el.offsetHeight;\n };\n\n // Calculate expected value for animating towards 'auto'\n function getAuto() {\n var oldVal = this.get();\n this.update('auto');\n var newVal = this.get();\n this.update(oldVal);\n return newVal;\n }\n\n // Make sure ease exists\n function validEase(ease, current, safe) {\n if (current !== undefined) safe = current;\n return ease in easing ? ease : safe;\n }\n\n // Convert rgb and short hex to long hex\n function cssToHex(c) {\n var m = /rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)/.exec(c);\n return (m ? rgbToHex(m[1], m[2], m[3]) : c).replace(/#(\\w)(\\w)(\\w)$/, '#$1$1$2$2$3$3');\n }\n });\n\n // --------------------------------------------------\n // Color prop\n\n var Color = P(Property, function (proto, supr) {\n\n proto.init = function () {\n supr.init.apply(this, arguments);\n\n // Store original computed value to allow tweening to ''\n if (this.original) return;\n this.original = this.convert(this.get(), typeColor);\n };\n });\n\n // --------------------------------------------------\n // Scroll prop\n\n var Scroll = P(Property, function (proto, supr) {\n\n proto.init = function () {\n supr.init.apply(this, arguments);\n this.animate = this.fallback;\n };\n\n proto.get = function () {\n return this.$el[this.name]();\n };\n\n proto.update = function (value) {\n this.$el[this.name](value);\n };\n });\n\n // --------------------------------------------------\n // Transform prop w/ sub-properties\n\n var Transform = P(Property, function (proto, supr) {\n\n proto.init = function () {\n supr.init.apply(this, arguments);\n\n // If a current state exists, return here\n if (this.current) return;\n\n // Store transform state\n this.current = {};\n\n // Set default perspective, if specified\n if (transformMap.perspective && config.perspective) {\n this.current.perspective = config.perspective;\n setStyle(this.el, this.name, this.style(this.current));\n this.redraw();\n }\n };\n\n proto.set = function (props) {\n // convert new props and store current values\n convertEach.call(this, props, function (name, value) {\n this.current[name] = value;\n });\n\n // set element style immediately\n setStyle(this.el, this.name, this.style(this.current));\n this.redraw();\n };\n\n proto.transition = function (props) {\n // convert new prop values and set defaults\n var values = this.values(props);\n\n // create MultiTween to track values over time\n this.tween = new MultiTween({\n current: this.current,\n values: values,\n duration: this.duration,\n delay: this.delay,\n ease: this.ease\n });\n\n // build temp object for final transition values\n var p,\n temp = {};\n for (p in this.current) {\n temp[p] = p in values ? values[p] : this.current[p];\n }\n\n // set new value to start transition\n this.active = true;\n this.nextStyle = this.style(temp);\n };\n\n proto.fallback = function (props) {\n // convert new prop values and set defaults\n var values = this.values(props);\n\n // create MultiTween to track values over time\n this.tween = new MultiTween({\n current: this.current,\n values: values,\n duration: this.duration,\n delay: this.delay,\n ease: this.ease,\n update: this.update,\n context: this\n });\n };\n\n // Update current values (called from MultiTween)\n proto.update = function () {\n setStyle(this.el, this.name, this.style(this.current));\n };\n\n // Get combined style string from props\n proto.style = function (props) {\n var p,\n out = '';\n for (p in props) {\n out += p + '(' + props[p] + ') ';\n }\n return out;\n };\n\n // Build values object and set defaults\n proto.values = function (props) {\n var values = {},\n def;\n convertEach.call(this, props, function (name, value, type) {\n values[name] = value;\n // set default value if current property does not exist\n if (this.current[name] === undefined) {\n def = 0; // default prop value\n if (~name.indexOf('scale')) def = 1;\n this.current[name] = this.convert(def, type);\n }\n });\n return values;\n };\n\n // Loop through each prop and output name + converted value\n function convertEach(props, iterator) {\n var p, name, type, definition, value;\n for (p in props) {\n definition = transformMap[p];\n type = definition[0];\n name = definition[1] || p;\n value = this.convert(props[p], type);\n iterator.call(this, name, value, type);\n }\n }\n });\n\n // --------------------------------------------------\n // Tween class - tweens values over time, based on frame timers.\n\n var Tween = P(function (proto) {\n\n // Private vars\n var defaults = {\n ease: easing.ease[1],\n from: 0,\n to: 1\n };\n\n proto.init = function (options) {\n // Init timing props\n this.duration = options.duration || 0;\n this.delay = options.delay || 0;\n\n // Use ease function or key value from easing map\n var ease = options.ease || defaults.ease;\n if (easing[ease]) ease = easing[ease][1];\n if (typeof ease != 'function') ease = defaults.ease;\n this.ease = ease;\n\n this.update = options.update || noop;\n this.complete = options.complete || noop;\n this.context = options.context || this;\n this.name = options.name;\n\n // Format value and determine units\n var from = options.from;\n var to = options.to;\n if (from === undefined) from = defaults.from;\n if (to === undefined) to = defaults.to;\n this.unit = options.unit || '';\n if (typeof from == 'number' && typeof to == 'number') {\n this.begin = from;\n this.change = to - from;\n } else {\n this.format(to, from);\n }\n // Store value + unit in case it's accessed before delay is up\n this.value = this.begin + this.unit;\n\n // Set start time for all Tween instances\n this.start = timeNow();\n\n // Start tween (unless autoplay disabled)\n if (options.autoplay !== false) {\n this.play();\n }\n };\n\n proto.play = function () {\n if (this.active) return;\n if (!this.start) this.start = timeNow();\n this.active = true;\n addRender(this);\n };\n\n proto.stop = function () {\n if (!this.active) return;\n this.active = false;\n removeRender(this);\n };\n\n proto.render = function (now) {\n var value,\n delta = now - this.start;\n // skip render during delay\n if (this.delay) {\n if (delta <= this.delay) return;\n // after delay, reduce delta\n delta -= this.delay;\n }\n if (delta < this.duration) {\n // calculate eased position\n var position = this.ease(delta, 0, 1, this.duration);\n value = this.startRGB ? interpolate(this.startRGB, this.endRGB, position) : round(this.begin + position * this.change);\n this.value = value + this.unit;\n this.update.call(this.context, this.value);\n return;\n }\n // we're done, set final value and destroy\n value = this.endHex || this.begin + this.change;\n this.value = value + this.unit;\n this.update.call(this.context, this.value);\n this.complete.call(this.context);\n this.destroy();\n };\n\n // Format string values for tween\n proto.format = function (to, from) {\n // cast strings\n from += '';\n to += '';\n // hex colors\n if (to.charAt(0) == '#') {\n this.startRGB = hexToRgb(from);\n this.endRGB = hexToRgb(to);\n this.endHex = to;\n this.begin = 0;\n this.change = 1;\n return;\n }\n // determine unit suffix\n if (!this.unit) {\n var fromUnit = from.replace(unitRegex, '');\n var toUnit = to.replace(unitRegex, '');\n if (fromUnit !== toUnit) unitWarning('tween', from, to);\n this.unit = fromUnit;\n }\n from = parseFloat(from);\n to = parseFloat(to);\n this.begin = this.value = from;\n this.change = to - from;\n };\n\n // Clean up for garbage collection\n proto.destroy = function () {\n this.stop();\n this.context = null;\n this.ease = this.update = this.complete = noop;\n };\n\n // Add a tween to the render list\n var tweenList = [];\n function addRender(tween) {\n // if this is the first item, start the render loop\n if (tweenList.push(tween) === 1) enterFrame(renderLoop);\n }\n\n // Loop through all tweens on each frame\n function renderLoop() {\n var i,\n now,\n tween,\n count = tweenList.length;\n if (!count) return;\n enterFrame(renderLoop);\n now = timeNow();\n for (i = count; i--;) {\n tween = tweenList[i];\n tween && tween.render(now);\n }\n }\n\n // Remove tween from render list\n function removeRender(tween) {\n var rest,\n index = jQuery.inArray(tween, tweenList);\n if (index >= 0) {\n rest = tweenList.slice(index + 1);\n tweenList.length = index;\n if (rest.length) tweenList = tweenList.concat(rest);\n }\n }\n\n // Round number to limit decimals\n var factor = 1000;\n function round(value) {\n return Math.round(value * factor) / factor;\n }\n\n // Interpolate rgb colors based on `position`, returns hex string\n function interpolate(start, end, position) {\n return rgbToHex(start[0] + position * (end[0] - start[0]), start[1] + position * (end[1] - start[1]), start[2] + position * (end[2] - start[2]));\n }\n });\n\n // Delay - simple delay timer that hooks into frame loop\n var Delay = P(Tween, function (proto) {\n\n proto.init = function (options) {\n this.duration = options.duration || 0;\n this.complete = options.complete || noop;\n this.context = options.context;\n this.play();\n };\n\n proto.render = function (now) {\n var delta = now - this.start;\n if (delta < this.duration) return;\n this.complete.call(this.context);\n this.destroy();\n };\n });\n\n // MultiTween - tween multiple properties on a single frame loop\n var MultiTween = P(Tween, function (proto, supr) {\n\n proto.init = function (options) {\n // configure basic options\n this.context = options.context;\n this.update = options.update;\n\n // create child tweens for each changed property\n this.tweens = [];\n this.current = options.current; // store direct reference\n var name, value;\n for (name in options.values) {\n value = options.values[name];\n if (this.current[name] === value) continue;\n this.tweens.push(new Tween({\n name: name,\n from: this.current[name],\n to: value,\n duration: options.duration,\n delay: options.delay,\n ease: options.ease,\n autoplay: false\n }));\n }\n // begin MultiTween render\n this.play();\n };\n\n proto.render = function (now) {\n // render each child tween\n var i,\n tween,\n count = this.tweens.length;\n var alive = false;\n for (i = count; i--;) {\n tween = this.tweens[i];\n if (tween.context) {\n tween.render(now);\n // store current value directly on object\n this.current[tween.name] = tween.value;\n alive = true;\n }\n }\n // destroy and stop render if no longer alive\n if (!alive) return this.destroy();\n\n // call update method\n this.update && this.update.call(this.context);\n };\n\n proto.destroy = function () {\n supr.destroy.call(this);\n if (!this.tweens) return;\n\n // Destroy all child tweens\n var i,\n count = this.tweens.length;\n for (i = count; i--;) {\n this.tweens[i].destroy();\n }\n this.tweens = null;\n this.current = null;\n };\n });\n\n // --------------------------------------------------\n // Main wrapper - returns a Tram instance with public chaining API.\n\n function tram(element, options) {\n // Chain on the result of Tram.init() to optimize single case.\n var wrap = new Tram.Bare();\n return wrap.init(element, options);\n }\n\n // Global tram config\n var config = tram.config = {\n debug: false // debug mode with console warnings\n , defaultUnit: 'px' // default unit added to types\n , defaultAngle: 'deg' // default unit added to types\n , keepInherited: false // optionally keep inherited CSS transitions\n , hideBackface: false // optionally hide backface on all elements\n , perspective: '' // optional default perspective value e.g. '1000px'\n , fallback: !support.transition // boolean to globally set fallback mode\n , agentTests: [] // array of userAgent test strings for sniffing\n };\n\n // fallback() static - browser sniff to force fallback mode\n // Example: tram.fallback('firefox');\n // Would match Firefox along with previously sniffed browsers.\n tram.fallback = function (testString) {\n // if no transition support, fallback is always true\n if (!support.transition) return config.fallback = true;\n config.agentTests.push('(' + testString + ')');\n var pattern = new RegExp(config.agentTests.join('|'), 'i');\n config.fallback = pattern.test(navigator.userAgent);\n };\n // Default sniffs for browsers that support transitions badly ;_;\n tram.fallback('6.0.[2-5] Safari');\n\n // tram.tween() static method\n tram.tween = function (options) {\n return new Tween(options);\n };\n\n // tram.delay() static method\n tram.delay = function (duration, callback, context) {\n return new Delay({ complete: callback, duration: duration, context: context });\n };\n\n // --------------------------------------------------\n // jQuery methods\n\n // jQuery plugin method, diverts chain to Tram object.\n jQuery.fn.tram = function (options) {\n return tram.call(null, this, options);\n };\n\n // Shortcuts for internal jQuery style getter / setter\n var setStyle = jQuery.style;\n var getStyle = jQuery.css;\n\n // --------------------------------------------------\n // Property maps + unit values\n\n // Prefixed property names\n var prefixed = {\n 'transform': support.transform && support.transform.css\n };\n\n // Main Property map { name: [ Class, valueType, expand ]}\n var propertyMap = {\n 'color': [Color, typeColor],\n 'background': [Color, typeColor, 'background-color'],\n 'outline-color': [Color, typeColor],\n 'border-color': [Color, typeColor],\n 'border-top-color': [Color, typeColor],\n 'border-right-color': [Color, typeColor],\n 'border-bottom-color': [Color, typeColor],\n 'border-left-color': [Color, typeColor],\n 'border-width': [Property, typeLength],\n 'border-top-width': [Property, typeLength],\n 'border-right-width': [Property, typeLength],\n 'border-bottom-width': [Property, typeLength],\n 'border-left-width': [Property, typeLength],\n 'border-spacing': [Property, typeLength],\n 'letter-spacing': [Property, typeLength],\n 'margin': [Property, typeLength],\n 'margin-top': [Property, typeLength],\n 'margin-right': [Property, typeLength],\n 'margin-bottom': [Property, typeLength],\n 'margin-left': [Property, typeLength],\n 'padding': [Property, typeLength],\n 'padding-top': [Property, typeLength],\n 'padding-right': [Property, typeLength],\n 'padding-bottom': [Property, typeLength],\n 'padding-left': [Property, typeLength],\n 'outline-width': [Property, typeLength],\n 'opacity': [Property, typeNumber],\n 'top': [Property, typeLenPerc],\n 'right': [Property, typeLenPerc],\n 'bottom': [Property, typeLenPerc],\n 'left': [Property, typeLenPerc],\n 'font-size': [Property, typeLenPerc],\n 'text-indent': [Property, typeLenPerc],\n 'word-spacing': [Property, typeLenPerc],\n 'width': [Property, typeLenPerc],\n 'min-width': [Property, typeLenPerc],\n 'max-width': [Property, typeLenPerc],\n 'height': [Property, typeLenPerc],\n 'min-height': [Property, typeLenPerc],\n 'max-height': [Property, typeLenPerc],\n 'line-height': [Property, typeFancy],\n 'scroll-top': [Scroll, typeNumber, 'scrollTop'],\n 'scroll-left': [Scroll, typeNumber, 'scrollLeft']\n // , 'background-position' : [ Property, typeLenPerc ]\n };\n\n // Transform property maps\n var transformMap = {};\n\n if (support.transform) {\n // Add base properties if supported\n propertyMap['transform'] = [Transform];\n // propertyMap['transform-origin'] = [ Transform ];\n\n // Transform sub-property map { name: [ valueType, expand ]}\n transformMap = {\n x: [typeLenPerc, 'translateX'],\n y: [typeLenPerc, 'translateY'],\n rotate: [typeAngle],\n rotateX: [typeAngle],\n rotateY: [typeAngle],\n scale: [typeNumber],\n scaleX: [typeNumber],\n scaleY: [typeNumber],\n skew: [typeAngle],\n skewX: [typeAngle],\n skewY: [typeAngle]\n };\n }\n\n // Add 3D transform props if supported\n if (support.transform && support.backface) {\n transformMap.z = [typeLenPerc, 'translateZ'];\n transformMap.rotateZ = [typeAngle];\n transformMap.scaleZ = [typeNumber];\n transformMap.perspective = [typeLength];\n }\n\n // --------------------------------------------------\n // Utils\n\n function toDashed(string) {\n return string.replace(/[A-Z]/g, function (letter) {\n return '-' + letter.toLowerCase();\n });\n }\n\n function hexToRgb(hex) {\n var n = parseInt(hex.slice(1), 16);\n var r = n >> 16 & 255;\n var g = n >> 8 & 255;\n var b = n & 255;\n return [r, g, b];\n }\n\n function rgbToHex(r, g, b) {\n return '#' + (1 << 24 | r << 16 | g << 8 | b).toString(16).slice(1);\n }\n\n function noop() {}\n\n function typeWarning(exp, val) {\n warn('Type warning: Expected: [' + exp + '] Got: [' + (typeof val === 'undefined' ? 'undefined' : _typeof(val)) + '] ' + val);\n }\n\n function unitWarning(name, from, to) {\n warn('Units do not match [' + name + ']: ' + from + ', ' + to);\n }\n\n // Normalize time values\n var milli = /ms/,\n seconds = /s|\\./;\n function validTime(string, current, safe) {\n if (current !== undefined) safe = current;\n if (string === undefined) return safe;\n var n = safe;\n // if string contains 'ms' or contains no suffix\n if (milli.test(string) || !seconds.test(string)) {\n n = parseInt(string, 10);\n // otherwise if string contains 's' or a decimal point\n } else if (seconds.test(string)) {\n n = parseFloat(string) * 1000;\n }\n if (n < 0) n = 0; // no negative times\n return n === n ? n : safe; // protect from NaNs\n }\n\n // Log warning message if supported\n function warn(msg) {\n config.debug && window && window.console.warn(msg);\n }\n\n // Lo-Dash compact()\n // MIT license \n // Creates an array with all falsey values of `array` removed\n function compact(array) {\n var index = -1,\n length = array ? array.length : 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (value) {\n result.push(value);\n }\n }\n return result;\n }\n\n // --------------------------------------------------\n // Export public module.\n return jQuery.tram = tram;\n}(window.jQuery);\n\n/***/ })\n/******/ ]);\n\n\n// WEBPACK FOOTER //\n// search/search-realtime-keyword.js"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 1);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 3d8e493d9d2f3cc969c4","/*\r\n * common utils\r\n */\r\n\r\nimport {PET_NECKLACE_ID} from '../model/model';\r\n\r\nexport const ua = window.navigator.userAgent;\r\n\r\nexport const locationOriginRegex = /^(https?:\\/\\/)?([\\da-z\\.-]+)\\.([a-z\\.]{2,6})/;\r\n\r\nexport let isIE = (function () {\r\n return /msie/i.test(ua) || /trident/i.test(ua);\r\n}());\r\n\r\nexport let isEdge = (userAgent) => {\r\n return ( /Gecko/i.test(userAgent) && /Edge/i.test(userAgent) );\r\n};\r\n\r\nexport let isOpera = (userAgent) => {\r\n return ( /Opera/i.test(userAgent) || /OPR\\//i.test(userAgent) );\r\n};\r\n\r\nexport let isChrome = (userAgent) => {\r\n return ( !isEdge(userAgent) && !isOpera(userAgent) && /Chrome/i.test(userAgent) );\r\n};\r\n\r\nexport let isIOS = (userAgent) => {\r\n return /iPad|iPhone|iPod/.test(userAgent) && !window.MSStream;\r\n};\r\n\r\nexport let isAndroid = (userAgent) => {\r\n return /android/i.test(userAgent);\r\n};\r\n\r\nexport let truthy = function truthy(object) {\r\n return !!object;\r\n};\r\n\r\nexport let falsy = function falsy(object) {\r\n return !!!object;\r\n};\r\n\r\nexport let existy = (obj) => {\r\n return obj != null;\r\n};\r\n\r\nexport let isDefined = (obj) => {\r\n let flag = true;\r\n if (obj === null || typeof obj === 'undefined') return false;\r\n return flag;\r\n};\r\n\r\nexport let isRc = (function () {\r\n return isDefined(/^rc-/.exec(location.hostname));\r\n}());\r\n\r\nexport let isInteger = (obj) => {\r\n if (!isDefined(obj) || obj.constructor !== Number) return false;\r\n\r\n // https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger\r\n return (isFinite(obj) && Math.floor(obj) === obj);\r\n};\r\n\r\nexport let isString = (obj) => {\r\n if (!isDefined(obj)) return false;\r\n return (obj.constructor === String);\r\n};\r\n\r\nexport let isNumber = function isNumber(obj) {\r\n if (!isDefined(obj)) return false;\r\n return (obj.constructor === Number);\r\n};\r\n\r\nexport let isBoolean = (obj) => {\r\n if (!isDefined(obj)) return false;\r\n return (obj.constructor === Boolean);\r\n};\r\n\r\nexport let isObject = (obj) => {\r\n if (!isDefined(obj)) return false;\r\n return (obj.constructor === Object);\r\n};\r\n\r\nexport let isFunction = (obj) => {\r\n if (!isDefined(obj)) return false;\r\n return (obj.constructor === Function);\r\n};\r\n\r\nexport let isRegExp = (obj) => {\r\n if (!isDefined(obj)) return false;\r\n return (obj.constructor === RegExp);\r\n};\r\n\r\nexport let not = (func) => {\r\n if (!isFunction(func)) throw new TypeError('func parameter type of not() must be Function.');\r\n\r\n return (object) => {\r\n return !func(object);\r\n };\r\n};\r\n\r\nexport let isNotDefined = not(isDefined);\r\n\r\nexport let parseInt10 = (number) => {\r\n return parseInt(number, 10);\r\n};\r\n\r\nexport let parseStrIntToInt = (strIntOrInt) => {\r\n let val = strIntOrInt;\r\n\r\n if (!isDefined(val)) return 0;\r\n if (typeof(val) === 'number') return val;\r\n\r\n return parseInt10(val.split(',').join(''));\r\n};\r\n\r\nexport let removeElementInArray = function removeElementInArray(arr, target) {\r\n if (!Array.isArray(arr)) throw new TypeError('arr parameter type of removeElementInArray() must be Array.');\r\n\r\n var clonedArr = arr.slice(0),\r\n index = clonedArr.indexOf(target);\r\n\r\n if (index >= 0) clonedArr.splice(index, 1);\r\n\r\n return clonedArr;\r\n};\r\n\r\nexport let allOf = function allOf(/*args*/) {\r\n const args = Array.prototype.slice.call(arguments);\r\n\r\n return args.every(function (val) {\r\n return (val === true);\r\n });\r\n};\r\n\r\nexport let anyOf = function anyOf(/*args*/) {\r\n const args = Array.prototype.slice.call(arguments);\r\n\r\n return args.some(function (val) {\r\n return (val === true);\r\n });\r\n};\r\n\r\nexport let getDefined = function (val, defaultVal) {\r\n return (isDefined(val)) ? val : defaultVal;\r\n};\r\n\r\nexport let notSingleEle = not(($ele) => {\r\n return $ele.length === 1;\r\n});\r\n\r\nexport let each = (dataCanLoop, func, context) => {\r\n let _context = (existy(context)) ? context : null;\r\n\r\n if (!(Array.isArray(dataCanLoop) || isString(dataCanLoop))) throw new TypeError('dataCanLoop parameter type of each() must be Array or String.');\r\n\r\n let result = false;\r\n for (let i = 0, max = dataCanLoop.length; i < max; i++) {\r\n result = func.call(_context, dataCanLoop[i]);\r\n if (result === false) break;\r\n }\r\n};\r\n\r\nexport let getFileExtension = (fileName) => {\r\n if (!isString(fileName)) throw new TypeError('getFileExtension() requires String parameter.');\r\n\r\n if (fileName.length <= 0) return '';\r\n\r\n var lastDotIndex = fileName.lastIndexOf('.'),\r\n extension = fileName.substr(lastDotIndex + 1);\r\n\r\n return extension;\r\n};\r\n\r\nexport let getFirstObjectHasProperty = function (arrayHasObjects, propertyKey, findPropertyValueOrRegex) {\r\n if (!Array.isArray(arrayHasObjects) || arrayHasObjects.length <= 0) return null;\r\n if (!isString(propertyKey)) return null;\r\n\r\n let obj, result = null;\r\n for (let i = 0, max = arrayHasObjects.length; i < max; ++i) {\r\n obj = arrayHasObjects[i];\r\n if (!obj.hasOwnProperty(propertyKey)) continue;\r\n\r\n if (isRegExp(findPropertyValueOrRegex)) {\r\n if (findPropertyValueOrRegex.test(obj[propertyKey])) {\r\n result = obj;\r\n break;\r\n }\r\n } else {\r\n if (obj[propertyKey] === findPropertyValueOrRegex) {\r\n result = obj;\r\n break;\r\n }\r\n }\r\n }\r\n return result;\r\n};\r\n\r\nexport let getObjectHasProperty = function getObjectHasProperty(arrayHasObjects, propertyKey ) {\r\n if (!Array.isArray(arrayHasObjects) || arrayHasObjects.length <= 0) return null;\r\n if (!isString(propertyKey)) return null;\r\n let obj, result = null;\r\n\r\n each(arrayHasObjects, (obj) => {\r\n if(obj.hasOwnProperty(propertyKey)) result = obj[propertyKey];\r\n });\r\n // console.log( '=> util.js getObjectHasProperty() result : ', propertyKey, result );\r\n return result;\r\n};\r\n\r\n\r\nexport let overlappedConditionSortByProperty = function sortByProp(_datas, _conditions, _conditionIndex) {\r\n let datas = Array.prototype.slice.call(_datas);\r\n\r\n if (!_conditions || _conditions.constructor !== Array || _conditions.length < 0) return datas;\r\n\r\n let conditionIndex = (_conditionIndex >= 0) ? _conditionIndex : 0,\r\n condition = _conditions[conditionIndex];\r\n\r\n if (conditionIndex <= 0) datas.sort(condition.func);\r\n\r\n if (_conditions.length <= 1) return datas;\r\n\r\n if (conditionIndex < _conditions.length - 1) {\r\n let prevProperty = condition.property,\r\n nextConditionIndex = conditionIndex + 1,\r\n nextCondition = _conditions[nextConditionIndex];\r\n\r\n let memoObj = {},\r\n memoArr = [],\r\n arr = [];\r\n\r\n let obj, prop;\r\n for (let i = 0, max = datas.length; i < max; i++) {\r\n obj = datas[i];\r\n prop = String(obj[prevProperty]);\r\n\r\n if (!memoObj[prop]) {\r\n memoObj[prop] = [];\r\n memoArr.push(memoObj[prop]);\r\n }\r\n\r\n arr = memoObj[prop];\r\n arr.push(obj);\r\n }\r\n\r\n for (let j = 0, len = memoArr.length; j < len; j++) {\r\n arr = memoArr[j];\r\n arr.sort(nextCondition.func);\r\n\r\n memoArr[j] = overlappedConditionSortByProperty(arr, _conditions, nextConditionIndex);\r\n }\r\n\r\n let resultArr = memoArr.reduce((acc, curVal, curIndex, array) => acc.concat(curVal));\r\n\r\n return resultArr;\r\n }\r\n\r\n return datas;\r\n}\r\n\r\n\r\nexport let getPositionFromTranslateStr = (str) => {\r\n let obj = {x: 0, y: 0};\r\n if (!isDefined(str)) return obj;\r\n\r\n let values = str.match(/[+-]?(\\d*\\.)?\\d+/g);\r\n if (values.length <= 0) return obj;\r\n\r\n if (/translateX/g.test(str)) {\r\n obj.x = parseFloat(values[0]);\r\n return obj;\r\n }\r\n\r\n if (/translateY/g.test(str)) {\r\n obj.y = parseFloat(values[0]);\r\n return obj;\r\n }\r\n\r\n obj.x = parseFloat(values[0]);\r\n if (values.length > 1) obj.y = parseFloat(values[1]);\r\n\r\n return obj;\r\n};\r\n\r\nexport let isIndexInLoop = function isIndexInLoop(totalLength, loopGap, firstIndex, searchIndex) {\r\n const args = Array.prototype.slice.call(arguments);\r\n if (args.length < 4) throw Error('isIndexInLoop function requires 4 arguments.');\r\n\r\n if (!isInteger(totalLength) || !isInteger(loopGap) || !isInteger(firstIndex) || !isInteger(searchIndex)) {\r\n throw Error('arguments must be Integer Number.');\r\n }\r\n if (totalLength < 1 || firstIndex < 1) {\r\n throw Error('totalLength and startIndex can not smaller than 1.');\r\n }\r\n if (loopGap > totalLength) {\r\n throw Error('loopGap can not bigger than totalLength.');\r\n }\r\n\r\n let index = firstIndex;\r\n for (let i = 0; i < loopGap; i++) {\r\n if (index === searchIndex) return true;\r\n index = (index + 1 > totalLength) ? 1 : index + 1;\r\n }\r\n\r\n return false;\r\n};\r\n\r\nexport let getLoopedLastIndex = function getLoopedLastIndex(totalLength, loopGap, firstIndex) {\r\n const args = Array.prototype.slice.call(arguments);\r\n if (args.length < 3) throw Error('getLoopedLastIndex function requires 3 arguments.');\r\n\r\n if (!isInteger(totalLength) || !isInteger(loopGap) || !isInteger(firstIndex)) {\r\n throw Error('arguments must be Integer Number.');\r\n }\r\n if (totalLength < 1 || firstIndex < 1) {\r\n throw Error('totalLength and firstIndex can not smaller than 1.');\r\n }\r\n if (loopGap > totalLength || firstIndex > totalLength) {\r\n throw Error('loopGap and firstIndex can not bigger than totalLength.');\r\n }\r\n\r\n let index = firstIndex;\r\n for (let i = 0; i < loopGap - 1; i++) {\r\n index++;\r\n if (index > totalLength) index = 1;\r\n }\r\n return index;\r\n};\r\n\r\nexport let getReverseLoopedFirstIndex = function getReverseLoopedFirstIndex(totalLength, loopGap, lastIndex) {\r\n const args = Array.prototype.slice.call(arguments);\r\n if (args.length < 3) throw Error('getReverseLoopedFirstIndex function requires 3 arguments.');\r\n\r\n if (!isInteger(totalLength) || !isInteger(loopGap) || !isInteger(lastIndex)) {\r\n throw Error('arguments must be Integer Number.');\r\n }\r\n if (totalLength < 1 || lastIndex < 1) {\r\n throw Error('totalLength and lastIndex can not smaller than 1.');\r\n }\r\n if (loopGap > totalLength || lastIndex > totalLength) {\r\n throw Error('loopGap and lastIndex can not bigger than totalLength.');\r\n }\r\n\r\n let index = lastIndex;\r\n for (let i = 0; i < loopGap - 1; i++) {\r\n index = (index - 1 < 1) ? totalLength : index - 1;\r\n }\r\n\r\n return index;\r\n};\r\n\r\nexport let getResolution = (breakpoint = {tablet: 640, pc: 960, max: 1260}, global = window) => {\r\n let resolution = '';\r\n if (breakpoint.max && global.innerWidth >= breakpoint.max) {\r\n resolution = 'max';\r\n\r\n } else if (breakpoint.pc && global.innerWidth >= breakpoint.pc) {\r\n resolution = 'pc';\r\n\r\n } else if (breakpoint.tablet && global.innerWidth >= breakpoint.tablet) {\r\n resolution = 'tablet';\r\n\r\n } else {\r\n resolution = 'phone';\r\n }\r\n\r\n return resolution;\r\n};\r\n\r\nexport let isPhoneResolution = (resolution) => {\r\n return resolution === 'phone';\r\n};\r\n\r\nexport let isTabletResolution = (resolution) => {\r\n return resolution === 'tablet';\r\n};\r\n\r\nexport let isMobileResolution = (resolution) => {\r\n return ( resolution === 'phone' || resolution === 'tablet');\r\n};\r\n\r\n// http://stackoverflow.com/questions/2901102/how-to-print-a-number-with-commas-as-thousands-separators-in-javascript\r\nexport let numberWithCommas = (number) => {\r\n return number.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\r\n};\r\n\r\nexport let getUriParams = (uri) => {\r\n if (uri.length < 1) return null;\r\n let str = uri.split('#')[0];\r\n\r\n let tmpArr = str.split('?');\r\n if (tmpArr.length < 2) return null;\r\n\r\n let paramStr = tmpArr[1],\r\n params = paramStr.split('&');\r\n\r\n let keyValueArr, obj = {};\r\n for (let i = 0, max = params.length; i < max; ++i) {\r\n keyValueArr = params[i].split('=');\r\n if (keyValueArr.length > 1) obj[keyValueArr[0]] = keyValueArr[1];\r\n\r\n // if (keyValueArr.length <= 1) return null;\r\n // obj[keyValueArr[0]] = keyValueArr[1];\r\n }\r\n return obj;\r\n};\r\n\r\nexport let getUriCombinedParams = (uri, params) => {\r\n if (!uri) return '';\r\n if (!params) return uri;\r\n\r\n let str = '';\r\n for (let key in params) {\r\n str += '&' + key + '=' + String(params[key]);\r\n }\r\n if (str === '') return uri;\r\n\r\n var tmpArr = uri.split('#'),\r\n uri = tmpArr[0],\r\n hashStr = (isDefined(tmpArr[1])) ? '#' + tmpArr[1] : '';\r\n\r\n uri = ((uri.indexOf('?') >= 0) ? (uri + str) : (uri + '?' + str.substr(1))) + hashStr;\r\n return uri;\r\n};\r\n\r\nexport let getHashParams = (hashStr) => {\r\n let str = hashStr;\r\n if (str.length < 1) return null;\r\n\r\n let tmpArr = str.split('#');\r\n if (tmpArr.length < 2) return null;\r\n\r\n let paramStr = tmpArr[1],\r\n params = paramStr.split('&');\r\n\r\n let keyValueArr, obj = {};\r\n for (let i = 0, max = params.length; i < max; ++i) {\r\n keyValueArr = params[i].split('=');\r\n if (keyValueArr.length <= 1) return null;\r\n\r\n obj[keyValueArr[0]] = keyValueArr[1];\r\n }\r\n\r\n return obj;\r\n};\r\n\r\nexport let getHashCombinedParams = (uri, params) => {\r\n if (!params) return uri;\r\n\r\n let str = '';\r\n for (let key in params) {\r\n str += '&' + key + '=' + String(params[key]);\r\n }\r\n if (str === '') return uri;\r\n\r\n uri = (uri.indexOf('#') >= 0) ? (uri + str) : (uri + '#' + str.substr(1));\r\n return uri;\r\n};\r\n\r\nexport let getObjForPagination = function (totalPostNum, displayPostNumPerPage, displayPaginationBtnNum, pageIndex) {\r\n const args = Array.prototype.slice.call(arguments);\r\n\r\n if (args.length < 4) throw new Error('getObjForPagination() requires 4 parameters.');\r\n\r\n if (!isInteger(totalPostNum) || !isInteger(displayPostNumPerPage) || !isInteger(displayPaginationBtnNum) || !isInteger(pageIndex)) {\r\n throw new TypeError('getObjForPagination() requires Integer Number parameters.');\r\n }\r\n if (totalPostNum <= 0 || displayPostNumPerPage <= 0 || displayPaginationBtnNum <= 0 || pageIndex <= 0) {\r\n throw new TypeError('getObjForPagination() requires positive Integer Number parameters.');\r\n }\r\n\r\n let totalPageNum = Math.ceil(totalPostNum / displayPostNumPerPage);\r\n if (pageIndex < 1) pageIndex = 1;\r\n if (pageIndex > totalPageNum) pageIndex = totalPageNum;\r\n\r\n let paginationBtnGroupIndex = Math.floor((pageIndex - 1) / displayPaginationBtnNum),\r\n prevPageIndex = paginationBtnGroupIndex * displayPaginationBtnNum,\r\n firstPageIndex = (paginationBtnGroupIndex * displayPaginationBtnNum) + 1,\r\n lastPageIndex = firstPageIndex + displayPaginationBtnNum - 1,\r\n nextPageIndex = lastPageIndex + 1;\r\n\r\n if (lastPageIndex > totalPageNum) lastPageIndex = totalPageNum;\r\n if (nextPageIndex > totalPageNum) nextPageIndex = 0;\r\n\r\n return {\r\n totalPostNum: totalPostNum,\r\n displayPostNumPerPage: displayPostNumPerPage,\r\n displayPaginationBtnNum: displayPaginationBtnNum,\r\n pageIndex: pageIndex,\r\n\r\n totalPageNum: totalPageNum,\r\n prevPageIndex: prevPageIndex,\r\n firstPageIndex: firstPageIndex,\r\n lastPageIndex: lastPageIndex,\r\n nextPageIndex: nextPageIndex\r\n };\r\n};\r\n\r\nexport let getDivideIntStrByThousandUnit = (intStr_) => {\r\n if (not(isDefined)(intStr_)) return ['0'];\r\n\r\n const DIVIDE_UNIT = 4;\r\n\r\n let intStr = String(parseStrIntToInt(intStr_)),\r\n intStrs = [];\r\n\r\n if (intStr.length <= DIVIDE_UNIT) return [String(intStr)];\r\n\r\n let lastIndex = 0, unitStr = '';\r\n while (intStr.length > DIVIDE_UNIT) {\r\n lastIndex = intStr.length;\r\n unitStr = intStr.substr(lastIndex - DIVIDE_UNIT, lastIndex);\r\n\r\n intStr = intStr.substr(0, lastIndex - DIVIDE_UNIT);\r\n intStrs.unshift(unitStr);\r\n }\r\n intStrs.unshift(intStr);\r\n\r\n return intStrs;\r\n};\r\n\r\nexport let getMarketPriceStr = (str) => {\r\n const UNIT_PRICE = ['', '만', '억'];\r\n\r\n let val = ( isDefined(str) ) ? str : '0',\r\n unitValues = getDivideIntStrByThousandUnit(val);\r\n\r\n unitValues.reverse();\r\n\r\n let priceStr = '', unitVal = 0;\r\n for (let i = 0, max = unitValues.length; i < max; i++) {\r\n unitVal = parseInt10(unitValues[i]);\r\n if (unitVal <= 0) continue;\r\n\r\n priceStr = (numberWithCommas(unitVal) + UNIT_PRICE[i]) + priceStr;\r\n if (i !== unitValues.length) priceStr = ' ' + priceStr;\r\n }\r\n priceStr = priceStr.trim();\r\n\r\n if (!priceStr) return '0';\r\n return priceStr;\r\n};\r\n\r\nexport let getEmphasizedStrByQuery = (str, query) => {\r\n return (str || '').split(query).join(`${query}`);\r\n};\r\n\r\nexport let getSeparatedDateStr = (moment, dateStr, DAYS = {\r\n 'Sunday': '일',\r\n 'Monday': '월',\r\n 'Tuesday': '화',\r\n 'Wednesday': '수',\r\n 'Thursday': '목',\r\n 'Friday': '금',\r\n 'Saturday': '토'\r\n}) => {\r\n let val = '';\r\n\r\n const MIN_TO_SEC = 60,\r\n HOUR_TO_SEC = 3600,\r\n DAY_TO_SEC = 86400;\r\n\r\n const now = new Date(),\r\n past = new Date(dateStr),\r\n diffSeconds = Math.floor((now - past) / 1000);\r\n\r\n if (diffSeconds < DAY_TO_SEC) {\r\n if (diffSeconds < HOUR_TO_SEC) {\r\n if (diffSeconds < MIN_TO_SEC) {\r\n val = `${diffSeconds}초 전`;\r\n\r\n } else {\r\n const diffMinutes = Math.floor(diffSeconds / MIN_TO_SEC);\r\n val = `${diffMinutes}분 전`;\r\n }\r\n\r\n } else {\r\n const diffHours = Math.floor(diffSeconds / HOUR_TO_SEC);\r\n val = `${diffHours}시간 전`;\r\n }\r\n\r\n } else {\r\n const date = moment(dateStr),\r\n day = (DAYS[date.format('dddd')] || '');\r\n\r\n val = date.format(`YYYY-MM-DD`);\r\n // val = date.format(`YYYY.MM.DD. (${day})`);\r\n }\r\n\r\n return val;\r\n};\r\n\r\nexport let namespace = (namespace, parent) => {\r\n if (!isString(namespace)) throw new TypeError('namespace parameter type of namespace() must be String.');\r\n if (!(isObject(parent) || !isDefined(parent))) throw new TypeError('parent parameter type of namespace() must be Object or null or undefined.');\r\n\r\n let ns = parent || window;\r\n\r\n if (namespace) {\r\n let parts = namespace.split('.');\r\n\r\n for (let i = 0, max = parts.length; i < max; i++) {\r\n if (!ns[parts[i]]) ns[parts[i]] = {};\r\n ns = ns[parts[i]];\r\n }\r\n }\r\n\r\n return ns;\r\n};\r\n\r\nexport let template = function template(strings, ...keys) {\r\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals\r\n return (function (...values) {\r\n let dict = values[values.length - 1] || {};\r\n\r\n let result = [strings[0]];\r\n keys.forEach(function (key, i) {\r\n let value = Number.isInteger(key) ? values[key] : dict[key];\r\n result.push(value, strings[i + 1]);\r\n });\r\n\r\n return result.join('');\r\n });\r\n};\r\n\r\n// board - server list\r\nexport let getUrlAddCategoryIdByArticle = function(_url, _article, _serverNameMap) {\r\n let url = _url;\r\n\r\n if (url !== '#') {\r\n const path = url.split('?')[0],\r\n uriParams = getUriParams(url);\r\n\r\n let categoryId = (isObject(_article.category)) ? _article.category.categoryId : uriParams.categoryId;\r\n\r\n if (isNotDefined(categoryId)) {\r\n // const obj = getFirstObjectHasProperty(_serverNameMap, 'serverId', 1) || _serverNameMap[0];\r\n // categoryId = obj.categoryId;\r\n categoryId = 0;\r\n }\r\n\r\n url = getUriCombinedParams(path, $.extend(uriParams, {categoryId: categoryId}));\r\n }\r\n\r\n return url;\r\n}\r\n\r\n// character setting - stat, equip simulator\r\nexport let getChangedStats = function (originalStatObj, newStatObj) {\r\n let changedStats = {};\r\n\r\n var stat, newStat;\r\n for (let key in originalStatObj) {\r\n stat = (isDefined(originalStatObj[key])) ? originalStatObj[key] : null;\r\n newStat = (isDefined(newStatObj[key])) ? newStatObj[key] : null;\r\n\r\n if (allOf(isDefined(newStat), stat !== newStat)) changedStats[key] = newStat;\r\n }\r\n\r\n let changeStatsCount = 0;\r\n for (let k in changedStats) changeStatsCount++;\r\n\r\n return (changeStatsCount > 0) ? changedStats : null;\r\n};\r\n\r\n// 2021.12 [StatModel.js] STEP_ELIXIR_POINT_BY_LEVEL = [{level: 80, point: 2 }, {level: 90, point: 2}, {level: 100, point: 3 }];\r\nexport let getPlusElixirPointByLevel = function (level, level_init, plusElixirPointByLevel ) {\r\n let _plusElixirPoint = 0;\r\n if ( (level - level_init) % 2 === 0 ) {\r\n _plusElixirPoint = 1;\r\n }\r\n each(plusElixirPointByLevel, (obj) => {\r\n if( parseInt(obj.level) === parseInt(level) ) {\r\n _plusElixirPoint = parseInt(obj.point);\r\n }\r\n });\r\n // console.log( '=> util.js _plusElixirPoint : ', _plusElixirPoint );\r\n return _plusElixirPoint;\r\n};\r\n\r\n// 2019.11 엘릭서를 사용할 수 없는 레벨 체크 50 이상이면 가능함 _.statData.level - _.model.LEVEL_INIT\r\nexport let isLevelCanConsumeElixirStat = function (level, perLevelPlusElixirPoint) {\r\n return (level >= 0) ? true : false;\r\n // return (level % perLevelPlusElixirPoint === 0) ? true : false;\r\n};\r\n\r\nexport let isLevelGetElixirPoint = function (level, perLevelPlusElixirPoint) { // 2019.11\r\n return (level % perLevelPlusElixirPoint === 0) ? true : false;\r\n};\r\n\r\n// STAT_MAX_BY_LEVEL 2021.\r\nexport let getStatMaxByLevel = function (level, statMaxByLevel ) {\r\n let _statMax = 50;\r\n each(statMaxByLevel, (obj) => {\r\n if (parseInt(obj.level) <= level) {\r\n _statMax = parseInt(obj.max);\r\n }\r\n });\r\n // console.log( '=> util.js getStatMaxByLevel() _statMax : ', _statMax );\r\n return _statMax;\r\n};\r\n\r\nexport let isWarrior = function (classId) {\r\n if (parseInt10(classId) === 7) return true;\r\n\r\n return false;\r\n}\r\n\r\nexport let getClassName = function (classId) {\r\n const CLASS_NAMES_KOR = ['군주', '기사', '요정', '마법사', '다크엘프', '용기사', '환술사', '전사', '검사', '창기사'];\r\n\r\n let className = CLASS_NAMES_KOR[parseInt10(classId)];\r\n if (not(isDefined)(className)) className = '';\r\n\r\n return className;\r\n};\r\n\r\nexport let removeEquipInEquips = function (equips, equipItemObj) {\r\n if (!Array.isArray(equips)) throw new TypeError('arr parameter type of removeEquipInEquips() must be Array.');\r\n\r\n const clonedEquips = equips.slice();\r\n\r\n let equip;\r\n for (let i = 0, max = clonedEquips.length; i < max; i++) {\r\n equip = clonedEquips[i];\r\n\r\n if (allOf(isDefined(equip), equip.id === equipItemObj.id, equip.name === equipItemObj.name, equip.slot === equipItemObj.slot)) {\r\n clonedEquips.splice(i, 1);\r\n break;\r\n }\r\n }\r\n\r\n return clonedEquips;\r\n};\r\n\r\nexport const isPetNecklace = function(itemId) {\r\n return (itemId === PET_NECKLACE_ID) ? true : false;\r\n};\n\n\n// WEBPACK FOOTER //\n// ./_src/js/utils/util.js","import RealtimeKeyword from './realtimeKeyword/RealtimeKeyword';\r\nimport { isNotDefined, not, getFirstObjectHasProperty, namespace } from './../utils/util';\r\n\r\n(function ($, global) {\r\n \"use strict\";\r\n\r\n // import tram\r\n require('../vendor/tram-v0.8.3/tram');\r\n\r\n namespace('nc.lineage');\r\n\r\n nc.lineage.searchRealtimeKeyword = function (options) {\r\n if (isNotDefined(options)) throw new Error('nc.lineage.searchRealtimeKeyword require options object');\r\n\r\n const keyword = global.popularKeyword;\r\n if (isNotDefined(keyword) || not(Array.isArray)(keyword.data) || keyword.data.length <= 0) return;\r\n\r\n const data = getFirstObjectHasProperty(keyword.data, 'pos', options.pos);\r\n if (isNotDefined(data)) return;\r\n\r\n return new RealtimeKeyword({\r\n service: options.service,\r\n wrap: options.wrap,\r\n serverId: options.serverId,\r\n data: data,\r\n alias: options.alias,\r\n global: global\r\n }).init();\r\n };\r\n}(jQuery, window));\n\n\n// WEBPACK FOOTER //\n// ./_src/js/search/search-realtime-keyword.js","import { isDefined, truthy } from '../../utils/util';\r\n\r\nclass RealtimeKeyword {\r\n constructor(options) {\r\n\r\n console.log('RealtimeKeyword constructor !!! ');\r\n const _ = this;\r\n\r\n if (!options) return;\r\n\r\n _.INTERVAL_ROLLING_ITEMS = 3500;\r\n\r\n _.option = $.extend(true, {\r\n service: 'search', // search, item, powerbook\r\n wrap: null,\r\n data: null,\r\n alias: null,\r\n serverId: 1,\r\n global: window\r\n }, options);\r\n\r\n _.global = (_.option.global) ? _.option.global : window;\r\n\r\n _.data = null;\r\n _.alias = null;\r\n _.wrap = null;\r\n\r\n _.rollingWrap = null;\r\n _.rollingKeywordWrap = null;\r\n _.rollingItemInterval = null;\r\n _.rollingItemIndex = 1;\r\n\r\n _.listWrap = null;\r\n _.listKeywordWrap = null;\r\n\r\n _.uniqueId = Date.now();\r\n\r\n _.proxy = {\r\n clickDocumentEventHandler: null\r\n };\r\n }\r\n\r\n init() {\r\n\r\n console.log('realtime keyword .js init() ');\r\n\r\n const _ = this;\r\n\r\n _.wrap = $(_.option.wrap);\r\n\r\n if (isDefined(_.wrap) && _.wrap.length) {\r\n _.data = (_.option.data) ? _.option.data.list : [];\r\n\r\n if (_.data.length) {\r\n _.rollingWrap = $('.keyword__rolling', _.wrap);\r\n _.listWrap = $('.keyword__list', _.wrap);\r\n\r\n _.rollingKeywordWrap = $('.keyword', _.rollingWrap);\r\n _.listKeywordWrap = $('.keyword', _.listWrap);\r\n\r\n _.proxy.clickDocumentEventHandler = $.proxy(_.clickDocumentEventHandler, _);\r\n\r\n _.setInstance();\r\n }\r\n }\r\n\r\n return _;\r\n }\r\n\r\n setInstance() {\r\n const _ = this;\r\n\r\n let item, obj, tpl = '', queryStr = '';\r\n for (let i = 0, max = _.data.length; i < max; ++i) {\r\n item = _.data[i];\r\n\r\n queryStr = global.encodeURIComponent(item[0]);\r\n\r\n obj = {\r\n index: i + 1,\r\n name: item[0],\r\n updown: item[1], // 'up', 'down', 'same'\r\n rank: item[2],\r\n url: ''\r\n };\r\n\r\n function fnAlias( alias ) {\r\n let _alias;\r\n switch(_.option.alias) {\r\n case 'search-powerbook' :\r\n _alias = `powerbook`;\r\n break;\r\n case 'search-community' :\r\n _alias = `community`;\r\n break;\r\n case 'search-faq' :\r\n _alias = `faq`;\r\n break;\r\n default :\r\n _alias = `index`;\r\n break;\r\n }\r\n return _alias;\r\n }\r\n\r\n switch (_.option.service) {\r\n case 'search' :\r\n obj.url = `/search/${fnAlias(_.option.alias)}?query=${queryStr}`;\r\n break;\r\n\r\n case 'item' :\r\n obj.url = `/world/item/search?serverId=${_.option.serverId}&query=${queryStr}`;\r\n break;\r\n\r\n case 'powerbook' :\r\n obj.url = `/powerbook/search?query=${queryStr}`;\r\n break;\r\n }\r\n\r\n tpl += _.getListTpl(obj);\r\n }\r\n\r\n _.rollingKeywordWrap.empty().append(tpl);\r\n _.listKeywordWrap.empty().append(tpl);\r\n\r\n _.setRollingKeywords();\r\n _.setToggleBtn();\r\n _.setWrapVisible(false);\r\n }\r\n\r\n setRollingKeywords() {\r\n const _ = this;\r\n\r\n let items = $('li', _.rollingKeywordWrap);\r\n tram(items).set({\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n y: _.rollingKeywordWrap.height()\r\n });\r\n\r\n _.changeItem(_.rollingItemIndex);\r\n _.setRollingKeywordInterval(true);\r\n }\r\n\r\n setRollingKeywordInterval(flag) {\r\n const _ = this;\r\n\r\n _.global.clearInterval(_.rollingItemInterval);\r\n _.rollingItemInterval = null;\r\n\r\n if (truthy(flag)) {\r\n let items = $('li', _.rollingKeywordWrap);\r\n\r\n _.rollingItemInterval = _.global.setInterval(() => {\r\n let activateIndex = _.rollingItemIndex + 1;\r\n if (activateIndex > items.length) activateIndex = 1;\r\n\r\n _.changeItem(activateIndex);\r\n _.rollingItemIndex = activateIndex;\r\n }, _.INTERVAL_ROLLING_ITEMS);\r\n }\r\n }\r\n\r\n changeItem(index) {\r\n const _ = this;\r\n\r\n let keywordWrapHeight = _.rollingKeywordWrap.height(),\r\n prevItemIndex = _.rollingItemIndex,\r\n activateIndex = index;\r\n\r\n let items = $('li', _.rollingKeywordWrap),\r\n prevItem = $(items.get(prevItemIndex - 1)),\r\n activateItem = $(items.get(activateIndex - 1));\r\n\r\n if (prevItem.length) {\r\n tram(prevItem)\r\n .stop({y: true})\r\n .add('transform 0.9s ease-out-expo')\r\n .start({y: -keywordWrapHeight});\r\n }\r\n\r\n if (activateItem.length) {\r\n tram(activateItem)\r\n .stop({y: true})\r\n .set({y: keywordWrapHeight})\r\n .add('transform 0.9s ease-out-expo')\r\n .start({y: 0});\r\n }\r\n }\r\n\r\n getListTpl(obj) {\r\n return `
  • \r\n ${obj.name}\r\n ${obj.rank}\r\n
  • `;\r\n }\r\n\r\n setToggleBtn() {\r\n const _ = this;\r\n\r\n $('.btn-toggle', _.wrap).on('click', evt => {\r\n evt.preventDefault();\r\n\r\n const isListWrapVisible = _.listWrap.is(':visible');\r\n\r\n _.setDocumentEventHandler(!isListWrapVisible);\r\n _.setWrapVisible(!isListWrapVisible);\r\n });\r\n }\r\n\r\n setWrapVisible(flag) {\r\n const _ = this;\r\n\r\n if (truthy(flag)) {\r\n _.wrap.addClass('on');\r\n _.showListWrap(true);\r\n\r\n } else {\r\n _.wrap.removeClass('on');\r\n _.showListWrap(false);\r\n }\r\n }\r\n\r\n showListWrap(flag) {\r\n (truthy(flag)) ? this.listWrap.show() : this.listWrap.hide();\r\n }\r\n\r\n setDocumentEventHandler(flag) {\r\n const _ = this;\r\n\r\n $(document).off(`click.ui.realtimekeyword.${_.uniqueId}`, _.proxy.clickDocumentEventHandler);\r\n if (truthy(flag)) $(document).on(`click.ui.realtimekeyword.${_.uniqueId}`, _.proxy.clickDocumentEventHandler);\r\n\r\n return _;\r\n }\r\n\r\n clickDocumentEventHandler(evt) {\r\n const _ = this;\r\n\r\n switch (evt.type) {\r\n case 'click' :\r\n const toggleBtn = $('.btn-toggle', _.wrap).get(0),\r\n keywordList = $('.keyword__list', _.wrap).get(0);\r\n\r\n if (evt.target === toggleBtn) return;\r\n if (evt.target === keywordList || $.contains(keywordList, evt.target)) return;\r\n\r\n _.setDocumentEventHandler(false);\r\n _.setWrapVisible(false);\r\n\r\n break;\r\n }\r\n\r\n return _;\r\n }\r\n}\r\n\r\nexport default RealtimeKeyword;\n\n\n// WEBPACK FOOTER //\n// ./_src/js/search/realtimeKeyword/RealtimeKeyword.js","var g;\r\n\r\n// This works in non-strict mode\r\ng = (function() {\r\n\treturn this;\r\n})();\r\n\r\ntry {\r\n\t// This works if eval is allowed (see CSP)\r\n\tg = g || Function(\"return this\")() || (1,eval)(\"this\");\r\n} catch(e) {\r\n\t// This works if the window reference is available\r\n\tif(typeof window === \"object\")\r\n\t\tg = window;\r\n}\r\n\r\n// g can still be undefined, but nothing to do about it...\r\n// We return undefined, instead of nothing here, so it's\r\n// easier to handle this case. if(!global) { ...}\r\n\r\nmodule.exports = g;\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// (webpack)/buildin/global.js\n// module id = 4\n// module chunks = 0","export const BREAKPOINTS = {\r\n tablet: 640,\r\n pc: 960,\r\n max: 1340\r\n};\r\n\r\nexport const DAYS = {\r\n 'Sunday': '일',\r\n 'Monday': '월',\r\n 'Tuesday': '화',\r\n 'Wednesday': '수',\r\n 'Thursday': '목',\r\n 'Friday': '금',\r\n 'Saturday': '토'\r\n};\r\n\r\nexport const API_DOMAIN_DEFAULT = 'https://api-lineage.plaync.com';\r\n\r\nexport const API_COMMUNITY_DOMAIN = 'https://api-commnity.plaync.com/lineage1';\r\n\r\nexport const STATIC_DOMAIN_DEFAULT = 'https://assets.playnccdn.com'; // https://wstatic.plaync.co.kr';\r\n\r\nexport const STATIC_CDN_DOMAIN_DEFAULT = 'https://wstatic-cdn.plaync.com';\r\n\r\nexport const NO_ITEM_IMAGE_URL = `${STATIC_DOMAIN_DEFAULT}/lineage/v1/img/world/item/noimg.gif`;\r\n\r\nexport const PET_NECKLACE_ID = 25668;\n\n\n// WEBPACK FOOTER //\n// ./_src/js/model/model.js","/*!\r\n * tram.js v0.8.3-global\r\n * Cross-browser CSS3 transitions in JavaScript\r\n * https://github.com/bkwld/tram\r\n * MIT License\r\n */\r\nwindow.tram = (function (jQuery) {\r\n\r\n /*!\r\n * P.js\r\n * A lightweight class system. It's just prototypes!\r\n * http:// github.com/jayferd/pjs\r\n * MIT license\r\n */\r\n var P = (function(prototype, ownProperty, undefined) {\r\n // helper functions that also help minification\r\n function isObject(o) { return typeof o === 'object'; }\r\n function isFunction(f) { return typeof f === 'function'; }\r\n\r\n // a function that gets reused to make uninitialized objects\r\n function BareConstructor() {}\r\n\r\n function P(_superclass /* = Object */, definition) {\r\n // handle the case where no superclass is given\r\n if (definition === undefined) {\r\n definition = _superclass;\r\n _superclass = Object;\r\n }\r\n\r\n // C is the class to be returned.\r\n //\r\n // It delegates to instantiating an instance of `Bare`, so that it\r\n // will always return a new instance regardless of the calling\r\n // context.\r\n //\r\n // TODO: the Chrome inspector shows all created objects as `C`\r\n // rather than `Object`. Setting the .name property seems to\r\n // have no effect. Is there a way to override this behavior?\r\n function C() {\r\n var self = new Bare;\r\n if (isFunction(self.init)) self.init.apply(self, arguments);\r\n return self;\r\n }\r\n\r\n // C.Bare is a class with a noop constructor. Its prototype is the\r\n // same as C, so that instances of C.Bare are also instances of C.\r\n // New objects can be allocated without initialization by calling\r\n // `new MyClass.Bare`.\r\n function Bare() {}\r\n C.Bare = Bare;\r\n\r\n // Set up the prototype of the new class.\r\n var _super = BareConstructor[prototype] = _superclass[prototype];\r\n var proto = Bare[prototype] = C[prototype] = new BareConstructor;\r\n\r\n // other variables, as a minifier optimization\r\n var extensions;\r\n\r\n\r\n // set the constructor property on the prototype, for convenience\r\n proto.constructor = C;\r\n\r\n C.mixin = function(def) {\r\n Bare[prototype] = C[prototype] = P(C, def)[prototype];\r\n return C;\r\n };\r\n\r\n C.open = function(def) {\r\n extensions = {};\r\n\r\n if (isFunction(def)) {\r\n // call the defining function with all the arguments you need\r\n // extensions captures the return value.\r\n extensions = def.call(C, proto, _super, C, _superclass);\r\n }\r\n else if (isObject(def)) {\r\n // if you passed an object instead, we'll take it\r\n extensions = def;\r\n }\r\n\r\n // ...and extend it\r\n if (isObject(extensions)) {\r\n for (var ext in extensions) {\r\n if (ownProperty.call(extensions, ext)) {\r\n proto[ext] = extensions[ext];\r\n }\r\n }\r\n }\r\n\r\n // if there's no init, we assume we're inheriting a non-pjs class, so\r\n // we default to applying the superclass's constructor.\r\n if (!isFunction(proto.init)) {\r\n proto.init = _superclass;\r\n }\r\n\r\n return C;\r\n };\r\n\r\n return C.open(definition);\r\n }\r\n\r\n // ship it\r\n return P;\r\n\r\n // as a minifier optimization, we've closured in a few helper functions\r\n // and the string 'prototype' (C[p] is much shorter than C.prototype)\r\n })('prototype', ({}).hasOwnProperty);\r\n\r\n // --------------------------------------------------\r\n // Easing methods { id: [ cssString, jsFunction ] }\r\n\r\n var easing = {\r\n\r\n // --------------------------------------------------\r\n // CSS easings, converted to functions using Timothee Groleau's generator.\r\n // http://www.timotheegroleau.com/Flash/experiments/easing_function_generator.htm\r\n\r\n 'ease': ['ease', function (t, b, c, d) {\r\n var ts=(t /= d)*t;\r\n var tc=ts*t;\r\n return b+c*(-2.75*tc*ts + 11*ts*ts + -15.5*tc + 8*ts + 0.25*t);\r\n }]\r\n\r\n , 'ease-in': ['ease-in', function (t, b, c, d) {\r\n var ts=(t /= d)*t;\r\n var tc=ts*t;\r\n return b+c*(-1*tc*ts + 3*ts*ts + -3*tc + 2*ts);\r\n }]\r\n\r\n , 'ease-out': ['ease-out', function (t, b, c, d) {\r\n var ts=(t /= d)*t;\r\n var tc=ts*t;\r\n return b+c*(0.3*tc*ts + -1.6*ts*ts + 2.2*tc + -1.8*ts + 1.9*t);\r\n }]\r\n\r\n , 'ease-in-out': ['ease-in-out', function (t, b, c, d) {\r\n var ts=(t /= d)*t;\r\n var tc=ts*t;\r\n return b+c*(2*tc*ts + -5*ts*ts + 2*tc + 2*ts);\r\n }]\r\n\r\n // --------------------------------------------------\r\n // Robert Penner easing equations and their CSS equivalents.\r\n // http://www.robertpenner.com/easing_terms_of_use.html\r\n\r\n , 'linear': ['linear', function (t, b, c, d) {\r\n return c*t/d + b;\r\n }]\r\n\r\n // Quad\r\n , 'ease-in-quad':\r\n ['cubic-bezier(0.550, 0.085, 0.680, 0.530)', function (t, b, c, d) {\r\n return c*(t /= d)*t + b;\r\n }]\r\n\r\n , 'ease-out-quad':\r\n ['cubic-bezier(0.250, 0.460, 0.450, 0.940)', function (t, b, c, d) {\r\n return -c *(t /= d)*(t-2) + b;\r\n }]\r\n\r\n , 'ease-in-out-quad':\r\n ['cubic-bezier(0.455, 0.030, 0.515, 0.955)', function (t, b, c, d) {\r\n if ((t /= d/2) < 1) return c/2*t*t + b;\r\n return -c/2 * ((--t)*(t-2) - 1) + b;\r\n }]\r\n\r\n // Cubic\r\n , 'ease-in-cubic':\r\n ['cubic-bezier(0.550, 0.055, 0.675, 0.190)', function (t, b, c, d) {\r\n return c*(t /= d)*t*t + b;\r\n }]\r\n\r\n , 'ease-out-cubic':\r\n ['cubic-bezier(0.215, 0.610, 0.355, 1)', function (t, b, c, d) {\r\n return c*((t=t/d-1)*t*t + 1) + b;\r\n }]\r\n\r\n , 'ease-in-out-cubic':\r\n ['cubic-bezier(0.645, 0.045, 0.355, 1)', function (t, b, c, d) {\r\n if ((t /= d/2) < 1) return c/2*t*t*t + b;\r\n return c/2*((t-=2)*t*t + 2) + b;\r\n }]\r\n\r\n // Quart\r\n , 'ease-in-quart':\r\n ['cubic-bezier(0.895, 0.030, 0.685, 0.220)', function (t, b, c, d) {\r\n return c*(t /= d)*t*t*t + b;\r\n }]\r\n\r\n , 'ease-out-quart':\r\n ['cubic-bezier(0.165, 0.840, 0.440, 1)', function (t, b, c, d) {\r\n return -c * ((t=t/d-1)*t*t*t - 1) + b;\r\n }]\r\n\r\n , 'ease-in-out-quart':\r\n ['cubic-bezier(0.770, 0, 0.175, 1)', function (t, b, c, d) {\r\n if ((t /= d/2) < 1) return c/2*t*t*t*t + b;\r\n return -c/2 * ((t-=2)*t*t*t - 2) + b;\r\n }]\r\n\r\n // Quint\r\n , 'ease-in-quint':\r\n ['cubic-bezier(0.755, 0.050, 0.855, 0.060)', function (t, b, c, d) {\r\n return c*(t /= d)*t*t*t*t + b;\r\n }]\r\n\r\n , 'ease-out-quint':\r\n ['cubic-bezier(0.230, 1, 0.320, 1)', function (t, b, c, d) {\r\n return c*((t=t/d-1)*t*t*t*t + 1) + b;\r\n }]\r\n\r\n , 'ease-in-out-quint':\r\n ['cubic-bezier(0.860, 0, 0.070, 1)', function (t, b, c, d) {\r\n if ((t /= d/2) < 1) return c/2*t*t*t*t*t + b;\r\n return c/2*((t-=2)*t*t*t*t + 2) + b;\r\n }]\r\n\r\n // Sine\r\n , 'ease-in-sine':\r\n ['cubic-bezier(0.470, 0, 0.745, 0.715)', function (t, b, c, d) {\r\n return -c * Math.cos(t/d * (Math.PI/2)) + c + b;\r\n }]\r\n\r\n , 'ease-out-sine':\r\n ['cubic-bezier(0.390, 0.575, 0.565, 1)', function (t, b, c, d) {\r\n return c * Math.sin(t/d * (Math.PI/2)) + b;\r\n }]\r\n\r\n , 'ease-in-out-sine':\r\n ['cubic-bezier(0.445, 0.050, 0.550, 0.950)', function (t, b, c, d) {\r\n return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;\r\n }]\r\n\r\n // Expo\r\n , 'ease-in-expo':\r\n ['cubic-bezier(0.950, 0.050, 0.795, 0.035)', function (t, b, c, d) {\r\n return (t === 0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;\r\n }]\r\n\r\n , 'ease-out-expo':\r\n ['cubic-bezier(0.190, 1, 0.220, 1)', function (t, b, c, d) {\r\n return (t === d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;\r\n }]\r\n\r\n , 'ease-in-out-expo':\r\n ['cubic-bezier(1, 0, 0, 1)', function (t, b, c, d) {\r\n if (t === 0) return b;\r\n if (t === d) return b+c;\r\n if ((t /= d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;\r\n return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;\r\n }]\r\n\r\n // Circ\r\n , 'ease-in-circ':\r\n ['cubic-bezier(0.600, 0.040, 0.980, 0.335)', function (t, b, c, d) {\r\n return -c * (Math.sqrt(1 - (t /= d)*t) - 1) + b;\r\n }]\r\n\r\n , 'ease-out-circ':\r\n ['cubic-bezier(0.075, 0.820, 0.165, 1)', function (t, b, c, d) {\r\n return c * Math.sqrt(1 - (t=t/d-1)*t) + b;\r\n }]\r\n\r\n , 'ease-in-out-circ':\r\n ['cubic-bezier(0.785, 0.135, 0.150, 0.860)', function (t, b, c, d) {\r\n if ((t /= d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;\r\n return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;\r\n }]\r\n\r\n // Back\r\n , 'ease-in-back':\r\n ['cubic-bezier(0.600, -0.280, 0.735, 0.045)', function (t, b, c, d, s) {\r\n if (s === undefined) s = 1.70158;\r\n return c*(t /= d)*t*((s+1)*t - s) + b;\r\n }]\r\n\r\n , 'ease-out-back':\r\n ['cubic-bezier(0.175, 0.885, 0.320, 1.275)', function (t, b, c, d, s) {\r\n if (s === undefined) s = 1.70158;\r\n return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;\r\n }]\r\n\r\n , 'ease-in-out-back':\r\n ['cubic-bezier(0.680, -0.550, 0.265, 1.550)', function (t, b, c, d, s) {\r\n if (s === undefined) s = 1.70158;\r\n if ((t /= d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;\r\n return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;\r\n }]\r\n };\r\n\r\n // Clamp cubic-bezier values for webkit bug\r\n // https://bugs.webkit.org/show_bug.cgi?id=45761\r\n var clamped = {\r\n 'ease-in-back': 'cubic-bezier(0.600, 0, 0.735, 0.045)'\r\n , 'ease-out-back': 'cubic-bezier(0.175, 0.885, 0.320, 1)'\r\n , 'ease-in-out-back': 'cubic-bezier(0.680, 0, 0.265, 1)'\r\n };\r\n\r\n // --------------------------------------------------\r\n // Private vars\r\n /*global jQuery, P, easing, clamped */\r\n\r\n var doc = document\r\n , win = window\r\n , dataKey = 'bkwld-tram'\r\n , unitRegex = /[\\-\\.0-9]/g\r\n , capsRegex = /[A-Z]/\r\n , typeNumber = 'number'\r\n , typeColor = /^(rgb|#)/\r\n , typeLength = /(em|cm|mm|in|pt|pc|px)$/\r\n , typeLenPerc = /(em|cm|mm|in|pt|pc|px|%)$/\r\n , typeAngle = /(deg|rad|turn)$/\r\n , typeFancy = 'unitless'\r\n , emptyTrans = /(all|none) 0s ease 0s/\r\n , allowAuto = /^(width|height)$/\r\n , space = ' '\r\n ;\r\n\r\n // --------------------------------------------------\r\n // Private functions\r\n\r\n // Simple feature detect, returns both dom + css prefixed names\r\n var testDiv = doc.createElement('a')\r\n , domPrefixes = ['Webkit', 'Moz', 'O', 'ms']\r\n , cssPrefixes = ['-webkit-', '-moz-', '-o-', '-ms-']\r\n ;\r\n var testFeature = function (prop) {\r\n // unprefixed case\r\n if (prop in testDiv.style) return { dom: prop, css: prop };\r\n // test all prefixes\r\n var i, domProp, domSuffix = '', words = prop.split('-');\r\n for (i = 0; i < words.length; i++) {\r\n domSuffix += words[i].charAt(0).toUpperCase() + words[i].slice(1);\r\n }\r\n for (i = 0; i < domPrefixes.length; i++) {\r\n domProp = domPrefixes[i] + domSuffix;\r\n if (domProp in testDiv.style) return { dom: domProp, css: cssPrefixes[i] + prop };\r\n }\r\n };\r\n\r\n // Run feature tests\r\n var support = tram.support = {\r\n bind: Function.prototype.bind\r\n , transform: testFeature('transform')\r\n , transition: testFeature('transition')\r\n , backface: testFeature('backface-visibility')\r\n , timing: testFeature('transition-timing-function')\r\n };\r\n\r\n // Modify easing variants for webkit clamp bug\r\n if (support.transition) {\r\n var timingProp = support.timing.dom;\r\n testDiv.style[timingProp] = easing['ease-in-back'][0];\r\n if (!testDiv.style[timingProp]) {\r\n // style invalid, use clamped versions instead\r\n for (var x in clamped) easing[x][0] = clamped[x];\r\n }\r\n }\r\n\r\n // Animation timer shim with setTimeout fallback\r\n var enterFrame = tram.frame = function () {\r\n var raf = win.requestAnimationFrame ||\r\n win.webkitRequestAnimationFrame ||\r\n win.mozRequestAnimationFrame ||\r\n win.oRequestAnimationFrame ||\r\n win.msRequestAnimationFrame;\r\n if (raf && support.bind) return raf.bind(win);\r\n return function (callback) {\r\n win.setTimeout(callback, 16);\r\n };\r\n }();\r\n\r\n // Timestamp shim with fallback\r\n var timeNow = tram.now = function () {\r\n // use high-res timer if available\r\n var perf = win.performance,\r\n perfNow = perf && (perf.now || perf.webkitNow || perf.msNow || perf.mozNow);\r\n if (perfNow && support.bind) return perfNow.bind(perf);\r\n // fallback to epoch-based timestamp\r\n return Date.now || function () {\r\n return +(new Date);\r\n };\r\n }();\r\n\r\n // --------------------------------------------------\r\n // Transition class - public API returned from the tram() wrapper.\r\n\r\n var Transition = P(function(proto) {\r\n\r\n proto.init = function (el) {\r\n this.$el = jQuery(el);\r\n this.el = this.$el[0];\r\n this.props = {};\r\n this.queue = [];\r\n this.style = '';\r\n this.active = false;\r\n\r\n // store inherited transitions from css styles\r\n if (config.keepInherited && !config.fallback) {\r\n var upstream = getStyle(this.el, 'transition');\r\n if (upstream && !emptyTrans.test(upstream)) this.upstream = upstream;\r\n }\r\n\r\n // hide backface if supported, for better perf\r\n if (support.backface && config.hideBackface) {\r\n setStyle(this.el, support.backface.css, 'hidden');\r\n }\r\n };\r\n\r\n // Public chainable methods\r\n chain('add', add);\r\n chain('start', start);\r\n chain('wait', wait);\r\n chain('then', then);\r\n chain('next', next);\r\n chain('stop', stop);\r\n chain('set', set);\r\n chain('show', show);\r\n chain('hide', hide);\r\n chain('redraw', redraw);\r\n chain('destroy', destroy);\r\n\r\n // Public add() - chainable\r\n function add(transition, options) {\r\n // Parse transition settings\r\n var settings = compact(('' + transition).split(space));\r\n var name = settings[0];\r\n options = options || {};\r\n\r\n // Get property definition from map\r\n var definition = propertyMap[name];\r\n if (!definition) return warn('Unsupported property: ' + name);\r\n\r\n // Ignore weak property additions\r\n if (options.weak && this.props[name]) return;\r\n\r\n // Init property instance\r\n var Class = definition[0];\r\n var prop = this.props[name];\r\n if (!prop) prop = this.props[name] = new Class.Bare();\r\n // Init settings + type + options\r\n prop.init(this.$el, settings, definition, options);\r\n return prop; // return for internal use\r\n }\r\n\r\n // Public start() - chainable\r\n function start(options, fromQueue, queueArgs) {\r\n if (!options) return;\r\n var optionType = typeof options;\r\n\r\n // Clear queue unless start was called from it\r\n if (!fromQueue) {\r\n this.timer && this.timer.destroy();\r\n this.queue = [];\r\n this.active = false;\r\n }\r\n\r\n // If options is a number, wait for a delay and continue queue.\r\n if (optionType == 'number' && fromQueue) {\r\n this.timer = new Delay({ duration: options, context: this, complete: next });\r\n this.active = true;\r\n return;\r\n }\r\n\r\n // If options is a string, invoke add() to modify transition settings\r\n if (optionType == 'string' && fromQueue) {\r\n switch (options) {\r\n case 'hide': hide.call(this); break;\r\n case 'stop': stop.call(this); break;\r\n case 'redraw': redraw.call(this); break;\r\n default: add.call(this, options, (queueArgs && queueArgs[1]));\r\n }\r\n return next.call(this);\r\n }\r\n\r\n // If options is a function, invoke it.\r\n if (optionType == 'function') {\r\n options.call(this, this);\r\n return;\r\n }\r\n\r\n // If options is an object, start property tweens.\r\n if (optionType == 'object') {\r\n\r\n // loop through each valid property\r\n var timespan = 0;\r\n eachProp.call(this, options, function (prop, value) {\r\n // determine the longest time span (duration + delay)\r\n if (prop.span > timespan) timespan = prop.span;\r\n // stop current, then begin animation\r\n prop.stop();\r\n prop.animate(value);\r\n }, function (extras) {\r\n // look for wait property and use it to override timespan\r\n if ('wait' in extras) timespan = validTime(extras.wait, 0);\r\n });\r\n // update main transition styles for active props\r\n updateStyles.call(this);\r\n\r\n // start timer for total transition timespan\r\n if (timespan > 0) {\r\n this.timer = new Delay({ duration: timespan, context: this });\r\n this.active = true;\r\n if (fromQueue) this.timer.complete = next;\r\n }\r\n // apply deferred styles after a single frame delay\r\n var self = this, found = false, styles = {};\r\n enterFrame(function () {\r\n eachProp.call(self, options, function (prop) {\r\n if (!prop.active) return;\r\n found = true;\r\n styles[prop.name] = prop.nextStyle;\r\n });\r\n found && self.$el.css(styles); // set styles object\r\n });\r\n }\r\n }\r\n\r\n // Public wait() - chainable\r\n function wait(time) {\r\n time = validTime(time, 0);\r\n // if start() has ocurred, simply push wait into queue\r\n if (this.active) {\r\n this.queue.push({ options: time });\r\n } else {\r\n // otherwise, start a timer. wait() is starting the sequence.\r\n this.timer = new Delay({ duration: time, context: this, complete: next });\r\n this.active = true;\r\n }\r\n }\r\n\r\n // Public then() - chainable\r\n function then(options) {\r\n if (!this.active) {\r\n return warn('No active transition timer. Use start() or wait() before then().');\r\n }\r\n // push options into queue\r\n this.queue.push({ options: options, args: arguments });\r\n // set timer complete callback\r\n this.timer.complete = next;\r\n }\r\n\r\n // Public next() - chainable\r\n function next() {\r\n // stop current timer in case next() was called early\r\n this.timer && this.timer.destroy();\r\n this.active = false;\r\n // if the queue is empty do nothing\r\n if (!this.queue.length) return;\r\n // start next item in queue\r\n var queued = this.queue.shift();\r\n start.call(this, queued.options, true, queued.args);\r\n }\r\n\r\n // Public stop() - chainable\r\n function stop(options) {\r\n this.timer && this.timer.destroy();\r\n this.queue = [];\r\n this.active = false;\r\n var values;\r\n if (typeof options == 'string') {\r\n values = {};\r\n values[options] = 1;\r\n } else if (typeof options == 'object' && options != null) {\r\n values = options;\r\n } else {\r\n values = this.props;\r\n }\r\n eachProp.call(this, values, stopProp);\r\n updateStyles.call(this);\r\n }\r\n\r\n // Public set() - chainable\r\n function set(values) {\r\n stop.call(this, values);\r\n eachProp.call(this, values, setProp, setExtras);\r\n }\r\n\r\n // Public show() - chainable\r\n function show(display) {\r\n // Show an element by setting its display\r\n if (typeof display != 'string') display = 'block';\r\n this.el.style.display = display;\r\n }\r\n\r\n // Public hide() - chainable\r\n function hide() {\r\n // Stop all transitions before hiding the element\r\n stop.call(this);\r\n this.el.style.display = 'none';\r\n }\r\n\r\n // Public redraw() - chainable\r\n function redraw() {\r\n this.el.offsetHeight;\r\n }\r\n\r\n // Public destroy() - chainable\r\n function destroy() {\r\n stop.call(this);\r\n jQuery.removeData(this.el, dataKey);\r\n this.$el = this.el = null;\r\n }\r\n\r\n // Update transition styles\r\n function updateStyles() {\r\n // build transition string from active props\r\n var p, prop, result = [];\r\n if (this.upstream) result.push(this.upstream);\r\n for (p in this.props) {\r\n prop = this.props[p];\r\n if (!prop.active) continue;\r\n result.push(prop.string);\r\n }\r\n // set transition style property on dom element\r\n result = result.join(',');\r\n if (this.style === result) return;\r\n this.style = result;\r\n this.el.style[support.transition.dom] = result;\r\n }\r\n\r\n // Loop through valid properties, auto-create them, and run iterator callback\r\n function eachProp(collection, iterator, ejector) {\r\n // skip auto-add during stop()\r\n var autoAdd = iterator !== stopProp;\r\n var name;\r\n var prop;\r\n var value;\r\n var matches = {};\r\n var extras;\r\n // find valid properties in collection\r\n for (name in collection) {\r\n value = collection[name];\r\n // match transform sub-properties\r\n if (name in transformMap) {\r\n if (!matches.transform) matches.transform = {};\r\n matches.transform[name] = value;\r\n continue;\r\n }\r\n // convert camelCase to dashed\r\n if (capsRegex.test(name)) name = toDashed(name);\r\n // match base properties\r\n if (name in propertyMap) {\r\n matches[name] = value;\r\n continue;\r\n }\r\n // otherwise, add property to extras\r\n if (!extras) extras = {};\r\n extras[name] = value;\r\n }\r\n // iterate on each matched property, auto-adding them\r\n for (name in matches) {\r\n value = matches[name];\r\n prop = this.props[name];\r\n if (!prop) {\r\n // skip auto-add during stop()\r\n if (!autoAdd) continue;\r\n // auto-add property instances\r\n prop = add.call(this, name);\r\n }\r\n // iterate on each property\r\n iterator.call(this, prop, value);\r\n }\r\n // finally, eject the extras into space\r\n if (ejector && extras) ejector.call(this, extras);\r\n }\r\n\r\n // Loop iterators\r\n function stopProp(prop) { prop.stop(); }\r\n function setProp(prop, value) { prop.set(value); }\r\n function setExtras(extras) { this.$el.css(extras); }\r\n\r\n // Define a chainable method that takes children into account\r\n function chain(name, method) {\r\n proto[name] = function () {\r\n if (this.children) return eachChild.call(this, method, arguments);\r\n this.el && method.apply(this, arguments);\r\n return this;\r\n };\r\n }\r\n\r\n // Iterate through children and apply the method, return for chaining\r\n function eachChild(method, args) {\r\n var i, count = this.children.length;\r\n for (i = 0; i < count; i++) {\r\n method.apply(this.children[i], args);\r\n }\r\n return this;\r\n }\r\n });\r\n\r\n // Tram class - extends Transition + wraps child instances for chaining.\r\n var Tram = P(Transition, function (proto) {\r\n\r\n proto.init = function (element, options) {\r\n var $elems = jQuery(element);\r\n\r\n // Invalid selector, do nothing.\r\n if (!$elems.length) return this;\r\n\r\n // Single case - return single Transition instance\r\n if ($elems.length === 1) return factory($elems[0], options);\r\n\r\n // Store multiple instances for chaining\r\n var children = [];\r\n $elems.each(function (index, el) {\r\n children.push(factory(el, options));\r\n });\r\n this.children = children;\r\n return this;\r\n };\r\n\r\n // Retrieve instance from data or create a new one.\r\n function factory(el, options) {\r\n var t = jQuery.data(el, dataKey) || jQuery.data(el, dataKey, new Transition.Bare());\r\n if (!t.el) t.init(el);\r\n if (options) return t.start(options);\r\n return t;\r\n }\r\n });\r\n\r\n // --------------------------------------------------\r\n // Property class - get/set property values\r\n\r\n var Property = P(function (proto) {\r\n\r\n var defaults = {\r\n duration: 500\r\n , ease: 'ease'\r\n , delay: 0\r\n };\r\n\r\n proto.init = function ($el, settings, definition, options) {\r\n // Initialize or extend settings\r\n this.$el = $el;\r\n this.el = $el[0];\r\n var name = settings[0];\r\n if (definition[2]) name = definition[2]; // expand name\r\n if (prefixed[name]) name = prefixed[name];\r\n this.name = name;\r\n this.type = definition[1];\r\n this.duration = validTime(settings[1], this.duration, defaults.duration);\r\n this.ease = validEase(settings[2], this.ease, defaults.ease);\r\n this.delay = validTime(settings[3], this.delay, defaults.delay);\r\n this.span = this.duration + this.delay;\r\n this.active = false;\r\n this.nextStyle = null;\r\n this.auto = allowAuto.test(this.name);\r\n this.unit = options.unit || this.unit || config.defaultUnit;\r\n this.angle = options.angle || this.angle || config.defaultAngle;\r\n // Animate using tween fallback if necessary, otherwise use transition.\r\n if (config.fallback || options.fallback) {\r\n this.animate = this.fallback;\r\n } else {\r\n this.animate = this.transition;\r\n this.string = this.name + space + this.duration + 'ms' +\r\n (this.ease != 'ease' ? space + easing[this.ease][0] : '') +\r\n (this.delay ? space + this.delay + 'ms' : '');\r\n }\r\n };\r\n\r\n // Set value immediately\r\n proto.set = function (value) {\r\n value = this.convert(value, this.type);\r\n this.update(value);\r\n this.redraw();\r\n };\r\n\r\n // CSS transition\r\n proto.transition = function (value) {\r\n // set new value to start transition\r\n this.active = true;\r\n value = this.convert(value, this.type);\r\n if (this.auto) {\r\n // when transitioning from 'auto', we must reset to computed\r\n if (this.el.style[this.name] == 'auto') {\r\n this.update(this.get());\r\n this.redraw();\r\n }\r\n if (value == 'auto') value = getAuto.call(this);\r\n }\r\n this.nextStyle = value;\r\n };\r\n\r\n // Fallback tweening\r\n proto.fallback = function (value) {\r\n var from = this.el.style[this.name] || this.convert(this.get(), this.type);\r\n value = this.convert(value, this.type);\r\n if (this.auto) {\r\n if (from == 'auto') from = this.convert(this.get(), this.type);\r\n if (value == 'auto') value = getAuto.call(this);\r\n }\r\n this.tween = new Tween({\r\n from: from\r\n , to: value\r\n , duration: this.duration\r\n , delay: this.delay\r\n , ease: this.ease\r\n , update: this.update\r\n , context: this\r\n });\r\n };\r\n\r\n // Get current element style\r\n proto.get = function () {\r\n return getStyle(this.el, this.name);\r\n };\r\n\r\n // Update element style value\r\n proto.update = function (value) {\r\n setStyle(this.el, this.name, value);\r\n };\r\n\r\n // Stop animation\r\n proto.stop = function () {\r\n // Stop CSS transition\r\n if (this.active || this.nextStyle) {\r\n this.active = false;\r\n this.nextStyle = null;\r\n setStyle(this.el, this.name, this.get());\r\n }\r\n // Stop fallback tween\r\n var tween = this.tween;\r\n if (tween && tween.context) tween.destroy();\r\n };\r\n\r\n // Convert value to expected type\r\n proto.convert = function (value, type) {\r\n if (value == 'auto' && this.auto) return value;\r\n var warnType\r\n , number = typeof value == 'number'\r\n , string = typeof value == 'string'\r\n ;\r\n switch(type) {\r\n case typeNumber:\r\n if (number) return value;\r\n if (string && value.replace(unitRegex, '') === '') return +value;\r\n warnType = 'number(unitless)';\r\n break;\r\n case typeColor:\r\n if (string) {\r\n if (value === '' && this.original) {\r\n return this.original;\r\n }\r\n if (type.test(value)) {\r\n if (value.charAt(0) == '#' && value.length == 7) return value;\r\n return cssToHex(value);\r\n }\r\n }\r\n warnType = 'hex or rgb string';\r\n break;\r\n case typeLength:\r\n if (number) return value + this.unit;\r\n if (string && type.test(value)) return value;\r\n warnType = 'number(px) or string(unit)';\r\n break;\r\n case typeLenPerc:\r\n if (number) return value + this.unit;\r\n if (string && type.test(value)) return value;\r\n warnType = 'number(px) or string(unit or %)';\r\n break;\r\n case typeAngle:\r\n if (number) return value + this.angle;\r\n if (string && type.test(value)) return value;\r\n warnType = 'number(deg) or string(angle)';\r\n break;\r\n case typeFancy:\r\n if (number) return value;\r\n if (string && typeLenPerc.test(value)) return value;\r\n warnType = 'number(unitless) or string(unit or %)';\r\n break;\r\n }\r\n // Type must be invalid, warn people.\r\n typeWarning(warnType, value);\r\n return value;\r\n };\r\n\r\n proto.redraw = function () {\r\n this.el.offsetHeight;\r\n };\r\n\r\n // Calculate expected value for animating towards 'auto'\r\n function getAuto() {\r\n var oldVal = this.get();\r\n this.update('auto');\r\n var newVal = this.get();\r\n this.update(oldVal);\r\n return newVal;\r\n }\r\n\r\n // Make sure ease exists\r\n function validEase(ease, current, safe) {\r\n if (current !== undefined) safe = current;\r\n return ease in easing ? ease : safe;\r\n }\r\n\r\n // Convert rgb and short hex to long hex\r\n function cssToHex(c) {\r\n var m = /rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)/.exec(c);\r\n return (m ? rgbToHex(m[1], m[2], m[3]) : c)\r\n .replace(/#(\\w)(\\w)(\\w)$/, '#$1$1$2$2$3$3');\r\n }\r\n });\r\n\r\n // --------------------------------------------------\r\n // Color prop\r\n\r\n var Color = P(Property, function (proto, supr) {\r\n\r\n proto.init = function () {\r\n supr.init.apply(this, arguments);\r\n\r\n // Store original computed value to allow tweening to ''\r\n if (this.original) return;\r\n this.original = this.convert(this.get(), typeColor);\r\n };\r\n });\r\n\r\n // --------------------------------------------------\r\n // Scroll prop\r\n\r\n var Scroll = P(Property, function (proto, supr) {\r\n\r\n proto.init = function () {\r\n supr.init.apply(this, arguments);\r\n this.animate = this.fallback;\r\n };\r\n\r\n proto.get = function () {\r\n return this.$el[this.name]();\r\n };\r\n\r\n proto.update = function (value) {\r\n this.$el[this.name](value);\r\n };\r\n });\r\n\r\n // --------------------------------------------------\r\n // Transform prop w/ sub-properties\r\n\r\n var Transform = P(Property, function (proto, supr) {\r\n\r\n proto.init = function () {\r\n supr.init.apply(this, arguments);\r\n\r\n // If a current state exists, return here\r\n if (this.current) return;\r\n\r\n // Store transform state\r\n this.current = {};\r\n\r\n // Set default perspective, if specified\r\n if (transformMap.perspective && config.perspective) {\r\n this.current.perspective = config.perspective;\r\n setStyle(this.el, this.name, this.style(this.current));\r\n this.redraw();\r\n }\r\n };\r\n\r\n proto.set = function (props) {\r\n // convert new props and store current values\r\n convertEach.call(this, props, function (name, value) {\r\n this.current[name] = value;\r\n });\r\n\r\n // set element style immediately\r\n setStyle(this.el, this.name, this.style(this.current));\r\n this.redraw();\r\n };\r\n\r\n proto.transition = function (props) {\r\n // convert new prop values and set defaults\r\n var values = this.values(props);\r\n\r\n // create MultiTween to track values over time\r\n this.tween = new MultiTween({\r\n current: this.current\r\n , values: values\r\n , duration: this.duration\r\n , delay: this.delay\r\n , ease: this.ease\r\n });\r\n\r\n // build temp object for final transition values\r\n var p, temp = {};\r\n for (p in this.current) {\r\n temp[p] = p in values ? values[p] : this.current[p];\r\n }\r\n\r\n // set new value to start transition\r\n this.active = true;\r\n this.nextStyle = this.style(temp);\r\n };\r\n\r\n proto.fallback = function (props) {\r\n // convert new prop values and set defaults\r\n var values = this.values(props);\r\n\r\n // create MultiTween to track values over time\r\n this.tween = new MultiTween({\r\n current: this.current\r\n , values: values\r\n , duration: this.duration\r\n , delay: this.delay\r\n , ease: this.ease\r\n , update: this.update\r\n , context: this\r\n });\r\n };\r\n\r\n // Update current values (called from MultiTween)\r\n proto.update = function () {\r\n setStyle(this.el, this.name, this.style(this.current));\r\n };\r\n\r\n // Get combined style string from props\r\n proto.style = function (props) {\r\n var p, out = '';\r\n for (p in props) {\r\n out += p + '(' + props[p] + ') ';\r\n }\r\n return out;\r\n };\r\n\r\n // Build values object and set defaults\r\n proto.values = function (props) {\r\n var values = {}, def;\r\n convertEach.call(this, props, function (name, value, type) {\r\n values[name] = value;\r\n // set default value if current property does not exist\r\n if (this.current[name] === undefined) {\r\n def = 0; // default prop value\r\n if (~name.indexOf('scale')) def = 1;\r\n this.current[name] = this.convert(def, type);\r\n }\r\n });\r\n return values;\r\n };\r\n\r\n // Loop through each prop and output name + converted value\r\n function convertEach(props, iterator) {\r\n var p, name, type, definition, value;\r\n for (p in props) {\r\n definition = transformMap[p];\r\n type = definition[0];\r\n name = definition[1] || p;\r\n value = this.convert(props[p], type);\r\n iterator.call(this, name, value, type);\r\n }\r\n }\r\n });\r\n\r\n // --------------------------------------------------\r\n // Tween class - tweens values over time, based on frame timers.\r\n\r\n var Tween = P(function (proto) {\r\n\r\n // Private vars\r\n var defaults = {\r\n ease: easing.ease[1]\r\n , from: 0\r\n , to: 1\r\n };\r\n\r\n proto.init = function (options) {\r\n // Init timing props\r\n this.duration = options.duration || 0;\r\n this.delay = options.delay || 0;\r\n\r\n // Use ease function or key value from easing map\r\n var ease = options.ease || defaults.ease;\r\n if (easing[ease]) ease = easing[ease][1];\r\n if (typeof ease != 'function') ease = defaults.ease;\r\n this.ease = ease;\r\n\r\n this.update = options.update || noop;\r\n this.complete = options.complete || noop;\r\n this.context = options.context || this;\r\n this.name = options.name;\r\n\r\n // Format value and determine units\r\n var from = options.from;\r\n var to = options.to;\r\n if (from === undefined) from = defaults.from;\r\n if (to === undefined) to = defaults.to;\r\n this.unit = options.unit || '';\r\n if (typeof from == 'number' && typeof to == 'number') {\r\n this.begin = from;\r\n this.change = to - from;\r\n } else {\r\n this.format(to, from);\r\n }\r\n // Store value + unit in case it's accessed before delay is up\r\n this.value = this.begin + this.unit;\r\n\r\n // Set start time for all Tween instances\r\n this.start = timeNow();\r\n\r\n // Start tween (unless autoplay disabled)\r\n if (options.autoplay !== false) {\r\n this.play();\r\n }\r\n };\r\n\r\n proto.play = function () {\r\n if (this.active) return;\r\n if (!this.start) this.start = timeNow();\r\n this.active = true;\r\n addRender(this);\r\n };\r\n\r\n proto.stop = function () {\r\n if (!this.active) return;\r\n this.active = false;\r\n removeRender(this);\r\n };\r\n\r\n proto.render = function (now) {\r\n var value, delta = now - this.start;\r\n // skip render during delay\r\n if (this.delay) {\r\n if (delta <= this.delay) return;\r\n // after delay, reduce delta\r\n delta -= this.delay;\r\n }\r\n if (delta < this.duration) {\r\n // calculate eased position\r\n var position = this.ease(delta, 0, 1, this.duration);\r\n value = this.startRGB ? interpolate(this.startRGB, this.endRGB, position)\r\n : round(this.begin + (position * this.change));\r\n this.value = value + this.unit;\r\n this.update.call(this.context, this.value);\r\n return;\r\n }\r\n // we're done, set final value and destroy\r\n value = this.endHex || this.begin + this.change;\r\n this.value = value + this.unit;\r\n this.update.call(this.context, this.value);\r\n this.complete.call(this.context);\r\n this.destroy();\r\n };\r\n\r\n // Format string values for tween\r\n proto.format = function (to, from) {\r\n // cast strings\r\n from += '';\r\n to += '';\r\n // hex colors\r\n if (to.charAt(0) == '#') {\r\n this.startRGB = hexToRgb(from);\r\n this.endRGB = hexToRgb(to);\r\n this.endHex = to;\r\n this.begin = 0;\r\n this.change = 1;\r\n return;\r\n }\r\n // determine unit suffix\r\n if (!this.unit) {\r\n var fromUnit = from.replace(unitRegex, '');\r\n var toUnit = to.replace(unitRegex, '');\r\n if (fromUnit !== toUnit) unitWarning('tween', from, to);\r\n this.unit = fromUnit;\r\n }\r\n from = parseFloat(from);\r\n to = parseFloat(to);\r\n this.begin = this.value = from;\r\n this.change = to - from;\r\n };\r\n\r\n // Clean up for garbage collection\r\n proto.destroy = function () {\r\n this.stop();\r\n this.context = null;\r\n this.ease = this.update = this.complete = noop;\r\n };\r\n\r\n // Add a tween to the render list\r\n var tweenList = [];\r\n function addRender(tween) {\r\n // if this is the first item, start the render loop\r\n if (tweenList.push(tween) === 1) enterFrame(renderLoop);\r\n }\r\n\r\n // Loop through all tweens on each frame\r\n function renderLoop() {\r\n var i, now, tween, count = tweenList.length;\r\n if (!count) return;\r\n enterFrame(renderLoop);\r\n now = timeNow();\r\n for (i = count; i--;) {\r\n tween = tweenList[i];\r\n tween && tween.render(now);\r\n }\r\n }\r\n\r\n // Remove tween from render list\r\n function removeRender(tween) {\r\n var rest, index = jQuery.inArray(tween, tweenList);\r\n if (index >= 0) {\r\n rest = tweenList.slice(index + 1);\r\n tweenList.length = index;\r\n if (rest.length) tweenList = tweenList.concat(rest);\r\n }\r\n }\r\n\r\n // Round number to limit decimals\r\n var factor = 1000;\r\n function round(value) {\r\n return Math.round(value * factor) / factor;\r\n }\r\n\r\n // Interpolate rgb colors based on `position`, returns hex string\r\n function interpolate(start, end, position) {\r\n return rgbToHex(\r\n start[0] + position * (end[0] - start[0]),\r\n start[1] + position * (end[1] - start[1]),\r\n start[2] + position * (end[2] - start[2])\r\n );\r\n }\r\n });\r\n\r\n // Delay - simple delay timer that hooks into frame loop\r\n var Delay = P(Tween, function (proto) {\r\n\r\n proto.init = function (options) {\r\n this.duration = options.duration || 0;\r\n this.complete = options.complete || noop;\r\n this.context = options.context;\r\n this.play();\r\n };\r\n\r\n proto.render = function (now) {\r\n var delta = now - this.start;\r\n if (delta < this.duration) return;\r\n this.complete.call(this.context);\r\n this.destroy();\r\n };\r\n });\r\n\r\n // MultiTween - tween multiple properties on a single frame loop\r\n var MultiTween = P(Tween, function (proto, supr) {\r\n\r\n proto.init = function (options) {\r\n // configure basic options\r\n this.context = options.context;\r\n this.update = options.update;\r\n\r\n // create child tweens for each changed property\r\n this.tweens = [];\r\n this.current = options.current; // store direct reference\r\n var name, value;\r\n for (name in options.values) {\r\n value = options.values[name];\r\n if (this.current[name] === value) continue;\r\n this.tweens.push(new Tween({\r\n name: name\r\n , from: this.current[name]\r\n , to: value\r\n , duration: options.duration\r\n , delay: options.delay\r\n , ease: options.ease\r\n , autoplay: false\r\n }));\r\n }\r\n // begin MultiTween render\r\n this.play();\r\n };\r\n\r\n proto.render = function (now) {\r\n // render each child tween\r\n var i, tween, count = this.tweens.length;\r\n var alive = false;\r\n for (i = count; i--;) {\r\n tween = this.tweens[i];\r\n if (tween.context) {\r\n tween.render(now);\r\n // store current value directly on object\r\n this.current[tween.name] = tween.value;\r\n alive = true;\r\n }\r\n }\r\n // destroy and stop render if no longer alive\r\n if (!alive) return this.destroy();\r\n\r\n // call update method\r\n this.update && this.update.call(this.context);\r\n };\r\n\r\n proto.destroy = function () {\r\n supr.destroy.call(this);\r\n if (!this.tweens) return;\r\n\r\n // Destroy all child tweens\r\n var i, count = this.tweens.length;\r\n for (i = count; i--;) {\r\n this.tweens[i].destroy();\r\n }\r\n this.tweens = null;\r\n this.current = null;\r\n };\r\n });\r\n\r\n // --------------------------------------------------\r\n // Main wrapper - returns a Tram instance with public chaining API.\r\n\r\n function tram(element, options) {\r\n // Chain on the result of Tram.init() to optimize single case.\r\n var wrap = new Tram.Bare();\r\n return wrap.init(element, options);\r\n }\r\n\r\n // Global tram config\r\n var config = tram.config = {\r\n debug: false // debug mode with console warnings\r\n , defaultUnit: 'px' // default unit added to types\r\n , defaultAngle: 'deg' // default unit added to types\r\n , keepInherited: false // optionally keep inherited CSS transitions\r\n , hideBackface: false // optionally hide backface on all elements\r\n , perspective: '' // optional default perspective value e.g. '1000px'\r\n , fallback: !support.transition // boolean to globally set fallback mode\r\n , agentTests: [] // array of userAgent test strings for sniffing\r\n };\r\n\r\n // fallback() static - browser sniff to force fallback mode\r\n // Example: tram.fallback('firefox');\r\n // Would match Firefox along with previously sniffed browsers.\r\n tram.fallback = function (testString) {\r\n // if no transition support, fallback is always true\r\n if (!support.transition) return config.fallback = true;\r\n config.agentTests.push('(' + testString + ')');\r\n var pattern = new RegExp(config.agentTests.join('|'), 'i');\r\n config.fallback = pattern.test(navigator.userAgent);\r\n };\r\n // Default sniffs for browsers that support transitions badly ;_;\r\n tram.fallback('6.0.[2-5] Safari');\r\n\r\n // tram.tween() static method\r\n tram.tween = function (options) {\r\n return new Tween(options);\r\n };\r\n\r\n // tram.delay() static method\r\n tram.delay = function (duration, callback, context) {\r\n return new Delay({ complete: callback, duration: duration, context: context });\r\n };\r\n\r\n // --------------------------------------------------\r\n // jQuery methods\r\n\r\n // jQuery plugin method, diverts chain to Tram object.\r\n jQuery.fn.tram = function (options) {\r\n return tram.call(null, this, options);\r\n };\r\n\r\n // Shortcuts for internal jQuery style getter / setter\r\n var setStyle = jQuery.style;\r\n var getStyle = jQuery.css;\r\n\r\n // --------------------------------------------------\r\n // Property maps + unit values\r\n\r\n // Prefixed property names\r\n var prefixed = {\r\n 'transform': support.transform && support.transform.css\r\n };\r\n\r\n // Main Property map { name: [ Class, valueType, expand ]}\r\n var propertyMap = {\r\n 'color' : [ Color, typeColor ]\r\n , 'background' : [ Color, typeColor, 'background-color' ]\r\n , 'outline-color' : [ Color, typeColor ]\r\n , 'border-color' : [ Color, typeColor ]\r\n , 'border-top-color' : [ Color, typeColor ]\r\n , 'border-right-color' : [ Color, typeColor ]\r\n , 'border-bottom-color' : [ Color, typeColor ]\r\n , 'border-left-color' : [ Color, typeColor ]\r\n , 'border-width' : [ Property, typeLength ]\r\n , 'border-top-width' : [ Property, typeLength ]\r\n , 'border-right-width' : [ Property, typeLength ]\r\n , 'border-bottom-width' : [ Property, typeLength ]\r\n , 'border-left-width' : [ Property, typeLength ]\r\n , 'border-spacing' : [ Property, typeLength ]\r\n , 'letter-spacing' : [ Property, typeLength ]\r\n , 'margin' : [ Property, typeLength ]\r\n , 'margin-top' : [ Property, typeLength ]\r\n , 'margin-right' : [ Property, typeLength ]\r\n , 'margin-bottom' : [ Property, typeLength ]\r\n , 'margin-left' : [ Property, typeLength ]\r\n , 'padding' : [ Property, typeLength ]\r\n , 'padding-top' : [ Property, typeLength ]\r\n , 'padding-right' : [ Property, typeLength ]\r\n , 'padding-bottom' : [ Property, typeLength ]\r\n , 'padding-left' : [ Property, typeLength ]\r\n , 'outline-width' : [ Property, typeLength ]\r\n , 'opacity' : [ Property, typeNumber ]\r\n , 'top' : [ Property, typeLenPerc ]\r\n , 'right' : [ Property, typeLenPerc ]\r\n , 'bottom' : [ Property, typeLenPerc ]\r\n , 'left' : [ Property, typeLenPerc ]\r\n , 'font-size' : [ Property, typeLenPerc ]\r\n , 'text-indent' : [ Property, typeLenPerc ]\r\n , 'word-spacing' : [ Property, typeLenPerc ]\r\n , 'width' : [ Property, typeLenPerc ]\r\n , 'min-width' : [ Property, typeLenPerc ]\r\n , 'max-width' : [ Property, typeLenPerc ]\r\n , 'height' : [ Property, typeLenPerc ]\r\n , 'min-height' : [ Property, typeLenPerc ]\r\n , 'max-height' : [ Property, typeLenPerc ]\r\n , 'line-height' : [ Property, typeFancy ]\r\n , 'scroll-top' : [ Scroll, typeNumber, 'scrollTop' ]\r\n , 'scroll-left' : [ Scroll, typeNumber, 'scrollLeft' ]\r\n // , 'background-position' : [ Property, typeLenPerc ]\r\n };\r\n\r\n // Transform property maps\r\n var transformMap = {};\r\n\r\n if (support.transform) {\r\n // Add base properties if supported\r\n propertyMap['transform'] = [ Transform ];\r\n // propertyMap['transform-origin'] = [ Transform ];\r\n\r\n // Transform sub-property map { name: [ valueType, expand ]}\r\n transformMap = {\r\n x: [ typeLenPerc, 'translateX' ]\r\n , y: [ typeLenPerc, 'translateY' ]\r\n , rotate: [ typeAngle ]\r\n , rotateX: [ typeAngle ]\r\n , rotateY: [ typeAngle ]\r\n , scale: [ typeNumber ]\r\n , scaleX: [ typeNumber ]\r\n , scaleY: [ typeNumber ]\r\n , skew: [ typeAngle ]\r\n , skewX: [ typeAngle ]\r\n , skewY: [ typeAngle ]\r\n };\r\n }\r\n\r\n // Add 3D transform props if supported\r\n if (support.transform && support.backface) {\r\n transformMap.z = [ typeLenPerc, 'translateZ' ];\r\n transformMap.rotateZ = [ typeAngle ];\r\n transformMap.scaleZ = [ typeNumber ];\r\n transformMap.perspective = [ typeLength ];\r\n }\r\n\r\n // --------------------------------------------------\r\n // Utils\r\n\r\n function toDashed(string) {\r\n return string.replace(/[A-Z]/g, function (letter) {\r\n return '-' + letter.toLowerCase();\r\n });\r\n }\r\n\r\n function hexToRgb(hex) {\r\n var n = parseInt(hex.slice(1), 16);\r\n var r = (n >> 16) & 255;\r\n var g = (n >> 8) & 255;\r\n var b = n & 255;\r\n return [r,g,b];\r\n }\r\n\r\n function rgbToHex(r, g, b) {\r\n return '#' + (1 << 24 | r << 16 | g << 8 | b).toString(16).slice(1);\r\n }\r\n\r\n function noop() {}\r\n\r\n function typeWarning(exp, val) {\r\n warn('Type warning: Expected: [' + exp + '] Got: [' + typeof val + '] ' + val);\r\n }\r\n\r\n function unitWarning(name, from, to) {\r\n warn('Units do not match [' + name + ']: ' + from + ', ' + to);\r\n }\r\n\r\n // Normalize time values\r\n var milli = /ms/, seconds = /s|\\./;\r\n function validTime(string, current, safe) {\r\n if (current !== undefined) safe = current;\r\n if (string === undefined) return safe;\r\n var n = safe;\r\n // if string contains 'ms' or contains no suffix\r\n if (milli.test(string) || !seconds.test(string)) {\r\n n = parseInt(string, 10);\r\n // otherwise if string contains 's' or a decimal point\r\n } else if (seconds.test(string)) {\r\n n = parseFloat(string) * 1000;\r\n }\r\n if (n < 0) n = 0; // no negative times\r\n return n === n ? n : safe; // protect from NaNs\r\n }\r\n\r\n // Log warning message if supported\r\n function warn(msg) {\r\n config.debug && window && window.console.warn(msg);\r\n }\r\n\r\n // Lo-Dash compact()\r\n // MIT license \r\n // Creates an array with all falsey values of `array` removed\r\n function compact(array) {\r\n var index = -1,\r\n length = array ? array.length : 0,\r\n result = [];\r\n\r\n while (++index < length) {\r\n var value = array[index];\r\n if (value) {\r\n result.push(value);\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n // --------------------------------------------------\r\n // Export public module.\r\n return jQuery.tram = tram;\r\n\r\n}(window.jQuery));\n\n\n// WEBPACK FOOTER //\n// ./_src/js/vendor/tram-v0.8.3/tram.js"],"sourceRoot":""}