You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1 lines
470 KiB

{"version":3,"sources":["clipboard.js","jquery.tmpl.js","jquery.blockUI.js","jquery.cookie.js","ax5core.js","ax5mask.js","ax5modal.js","toastr.js","autosize.js","global.js","regex.js","formatter.js","popup.js","member.js","board.js","components.js","dropdown.js","modal.js","mobile.js"],"names":["root","factory","exports","module","define","amd","this","modules","installedModules","__webpack_require__","moduleId","i","l","call","m","c","value","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","__WEBPACK_AMD_DEFINE_FACTORY__","__WEBPACK_AMD_DEFINE_ARRAY__","__WEBPACK_AMD_DEFINE_RESULT__","_select","obj","_select2","default","_typeof","Symbol","iterator","constructor","_createClass","defineProperties","target","props","length","descriptor","writable","key","Constructor","protoProps","staticProps","ClipboardAction","options","instance","TypeError","_classCallCheck","resolveOptions","initSelection","arguments","undefined","action","container","emitter","text","trigger","selectedText","selectFake","selectTarget","_this","isRTL","document","documentElement","getAttribute","removeFake","fakeHandlerCallback","fakeHandler","addEventListener","fakeElem","createElement","style","fontSize","border","padding","margin","position","yPosition","window","pageYOffset","scrollTop","top","setAttribute","appendChild","copyText","removeEventListener","removeChild","succeeded","execCommand","err","handleResult","emit","clearSelection","bind","focus","getSelection","removeAllRanges","set","_action","Error","nodeType","hasAttribute","_target","apply","is","delegate","type","callback","string","fn","node","destroy","listenNode","nodeList","Array","forEach","listenNodeList","selector","body","listenSelector","E","on","ctx","e","push","once","self","listener","off","_","data","slice","evtArr","len","evts","liveEvents","_clipboardAction","_tinyEmitter","_goodListener","_clipboardAction2","_interopRequireDefault","_tinyEmitter2","_goodListener2","Clipboard","_Emitter","ReferenceError","_possibleConstructorReturn","__proto__","getPrototypeOf","listenClick","subClass","superClass","create","setPrototypeOf","_inherits","defaultAction","defaultTarget","defaultText","_this2","onClick","delegateTarget","currentTarget","clipboardAction","getAttributeValue","querySelector","actions","support","queryCommandSupported","suffix","element","attribute","DOCUMENT_NODE_TYPE","Element","matches","proto","matchesSelector","mozMatchesSelector","msMatchesSelector","oMatchesSelector","webkitMatchesSelector","parentNode","closest","_delegate","useCapture","listenerFn","elements","querySelectorAll","map","HTMLElement","toString","String","nodeName","isReadOnly","select","setSelectionRange","removeAttribute","selection","range","createRange","selectNodeContents","addRange","jQuery","appendToTmplItems","oldManip","domManip","tmplItmAtt","htmlExpr","newTmplItems","wrappedItems","topTmplItem","itemKey","cloneIndex","stack","newTmplItem","parentItem","newItem","_wrap","tmpl","parent","nodes","calls","tiCalls","nest","tiNest","wrap","tiWrap","html","tiHtml","update","tiUpdate","extend","_ctnt","build","tmplItem","nested","content","frag","ret","item","replace","join","all","before","middle","after","storeTmplItems","unencode","concat","el","innerHTML","makeArray","childNodes","buildTmplFn","markup","Function","trim","slash","fnargs","parens","args","def","expr","exprAutoFnDetect","tag","_default","test","unescape","indexOf","$1","split","$2","updateWrapped","wrapped","isArray","elem","elems","keySuffix","newClonedItems","getElementsByTagName","processItemKey","pntKey","pntItem","pntNode","cloneTmplItem","pop","template","filter","textOnly","innerText","textContent","outerHTML","div","cloneNode","coll","insertBefore","remove","each","appendTo","prependTo","insertAfter","replaceAll","original","tmplItems","insert","clone","pushStack","complete","table","dmArgs","elemsLength","fragClone","afterManip","topLevel","dataItem","encode","open","close","if","else","=","!","items","setup","$","_fadeIn","fadeIn","noOp","noop","msie","navigator","userAgent","ie6","setExpr","documentMode","isFunction","setExpression","blockUI","opts","install","unblockUI","growlUI","title","message","timeout","onClose","$m","append","callBlock","fadeOut","centerY","showOverlay","onUnblock","css","defaults","growlCSS","mouseover","displayBlock","stop","fadeTo","mouseout","block","fullOpts","$el","ignoreIfBlocked","unblock","zoom","version","draggable","theme","width","left","textAlign","color","backgroundColor","cursor","themedCSS","overlayCSS","opacity","cursorReset","right","-webkit-border-radius","-moz-border-radius","border-radius","iframeSrc","location","href","forceIframe","baseZ","centerX","allowBodyStretch","bindEvents","constrainTabKey","focusInput","focusableElements","onBlock","onOverlayClick","quirksmodeOffsetHack","blockMsgClass","pageBlock","pageBlockEls","full","msg","jquery","display","lyr1","lyr2","lyr3","z","addClass","layers","$par","handle","cancel","boxModel","t","sz","fixT","fixL","marginTop","expression","parseInt","find","show","cb","cb1","cb2","setTimeout","x","y","offsetWidth","offsetHeight","center","to","count","els","clearTimeout","removeData","children","add","reset","w","cssW","b","events","handler","unbind","keyCode","fwd","shiftKey","back","hasClass","parents","require","pluses","config","raw","encodeURIComponent","read","converter","decodeURIComponent","json","JSON","parse","parseCookieValue","cookie","expires","days","Date","setMilliseconds","getMilliseconds","stringify","stringifyCookieValue","toUTCString","path","domain","secure","result","cookies","parts","shift","removeCookie","win","doc","reIsJson","reMs","reSnakeCase","reCamelCase","reDot","reInt","reNotNum","reMoneySplit","RegExp","reAmp","reEq","reClassNameSplit","ax5","info","U","guid","getGuid","_arguments","browser","ua","mobile","browserName","match","browserVersion","toLowerCase","search","exec","isBrowser","wheelEnm","errorMsg","baseUrl","onerror","console","error","toArray","eventKeys","BACKSPACE","TAB","RETURN","ESC","LEFT","UP","RIGHT","DOWN","DELETE","HOME","END","PAGEUP","PAGEDOWN","INSERT","SPACE","weekNames","label","supportTouch","maxTouchPoints","msMaxTouchPoints","supportFileApi","FileReader","File","FileList","Blob","urlUtil","url","urls","param","referrer","pathname","hostname","port","hashdata","last","getError","className","errorCode","methodName","_toString","O","_fn","isNothing","toJson","jsonString","util","isObject","jsonObjectBody","isString","isNumber","isUndefined","str","pos","substr","lastIndexOf","camelCase","letter","toUpperCase","snakeCase","number","cond","isMinus","returnValue","pair","Number","k","nUnit","myByte","Math","round","abs","floor","ceil","val","txtNumber","isNaN","arrNumber","localDate","yy","mm","dd","hh","mi","ss","utcD","UTC","getUTCHours","getTimezoneOffset","setUTCHours","date","nY","nH","nMM","nS","nDW","regY","regM","regD","regH","regMI","regS","regDW","fStr","nM","nD","aDateTime","aTimes","aTime","aDate","va","parseFloat","substring","_d","mxdd","setTime","getTime","getFullYear","getMonth","getDate","daysOfMonth","processor","firstDayOfMonth","lastDayOfMonth","getUTCFullYear","setDigit","getHours","getMinutes","getSeconds","getDay","num","padder","radix","times","selectRange","textRange","selectAll","offset","arr","moveStart","collapse","moveEnd","start","end","setStart","setEnd","firstChild","rangeType","createTextRange","moveToElementText","debounce","func","wait","lastArgs","lastThis","maxWait","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","invokeFunc","time","thisArg","shouldInvoke","timeSinceLastCall","timerExpired","now","trailingEdge","timeSinceLastInvoke","min","remainingWait","debounced","isInvoking","_len","_key","leadingEdge","max","flush","escapeHtml","unescapeHtml","alert","results","fnResult","reduce","tokenItem","reduceRight","sum","defaultValue","tokenValue","avg","parseJson","force","first","keys","deepCopy","r","getType","typeName","isWindow","isElement","isNodelist","setCookie","cn","cv","exdays","expire","setDate","escape","getCookie","cname","ca","charAt","merge","second","j","v","dday","diffnum","memoryDay","DyMilli","today","getDayTime","weeksOfMonth","myDate","year","month","findParentNode","tagName","toLocaleLowerCase","klasss","a","cssNumber","found","unit","returns","vSplited","isDate","valueOf","isDateFormat","stopEvent","event","cancelBubble","stopPropagation","preventDefault","throttle","_string","format","decode","_pos","_hexColor","CSS_UNIT","PERMISSIVE_MATCH3","PERMISSIVE_MATCH4","matchers","rgb","rgba","hsl","hsla","hsv","hsva","hex3","hex6","hex4","hex8","convertToPercentage","convertTo255","convertToHex","bound01","isOnePointZero","processPercent","isPercentage","rgbToHsl","g","h","hslToRgb","hue2rgb","q","_color","_originalValue","convertObject","_format","_hex","getHexValue","lighten","amount","darken","getBrightness","isDark","isLight","getHsl","501","401","402","460","461","hwp","hdeb","de","del","_f","re_trim","propertyIsEnumerable","prop","fun","thisp","bound","nop","createStyleSheet","maxCount","resultSet","addRule","currentStyle","foo","removeRule","Infinity","sJSON","vContent","splice","_splice","_slice","begin","size","cloned","upTo","con","method","empty","dummy","properties","methods","webkitMatchMedia","mozMatchMedia","oMatchMedia","msMatchMedia","matchMedia","styleMedia","media","script","id","getComputedStyle","matchMedium","styleSheet","cssText","addListener","localMatchMedia","hasMediaQueries","isListening","timeoutID","queries","handleChange","evt","il","mql","listeners","jl","index","removeListener","ui","setConfig","cfg","callInit","init","log","bindWindowResize","callBack","resize","bindWindowResize__","main","cls","classStore","wrapper","arg","instanceId","initInstance","global","mustache","objectToString","escapeRegExp","hasProperty","propName","regExpTest","nonSpaceRe","isWhitespace","re","testRegExp","entityMap","&","<",">","\"","'","/","whiteRe","spaceRe","equalsRe","curlyRe","tagRe","Scanner","tail","Context","view","parentContext","cache",".","@each","@key","@value","Writer","eos","scan","scanUntil","lookup","names","context","lookupHit","clearCache","tags","tokens","openingTagRe","closingTagRe","closingCurlyRe","sections","spaces","hasTag","nonSpace","stripSpace","compileTags","tagsToCompile","chr","token","openSection","scanner","valueLength","nestedTokens","collector","numTokens","nestTokens","lastToken","squashedTokens","squashTokens","parseTemplate","render","partials","renderTokens","originalTemplate","symbol","buffer","renderSection","renderInverted","renderPartial","unescapedValue","escapedValue","rawValue","defaultWriter","to_html","send","UI","MASK","animateTime","maskContent","status","onStateChanged","that","setBody","templateName","maskConfig","_cfg","$target","maskId","$mask","getBodyTmpl","outerWidth","height","outerHeight","_$target","align","zIndex","state","_delay","_close","removeClass","pullRequest","mask_instance","mask","defaultMask","columnKeys","tmplName","MODAL","ENM","mousedown","mousemove","mouseup","getMousePosition","mouseObj","changedTouches","clientX","clientY","minimizePosition","clickEventName","closeToEsc","disableDrag","disableResize","iframe","activeModal","watingModal","eventProcessor","onResize","move","modalId","header","fullScreen","styles","iframeLoadingMsg","absolute","attr","hide","submit","onkeyup","isButton","isFullScreen","mousePosition","moveModal","btnOnClick","originalEvent","resizeModal","srcElement","btns","dialogId","btnTarget","alignProcessor","top-left","top-right","bottom-left","bottom-right","center-middle","modalZIndex","modalOffset","modalBox","scrollLeft","__dx","__dy","resizerBg","resizer","getResizerPosition","box","modalConfig","removeAttr","resizerType","resizerProcessor","minHeight","altKey","bottom","minWidth","cursorType","headerHeight","tryCount","_option","$iframe","iframeObject","idoc","contentDocument","contentWindow","CollectGarbage","minimized","minimize","originalHeight","restore","setModalConfig","_config","_fullScreen","modal_instance","modal","$container","previousToast","toastId","toastType","success","warning","toastr","clear","$toastElement","clearOptions","getOptions","getContainer","clearToast","toastsToClear","clearContainer","removeToast","optionsOverride","notify","iconClass","iconClasses","subscribe","containerId","positionClass","createContainer","hideMethod","duration","hideDuration","easing","hideEasing","publish","preventDuplicates","shouldExit","intervalId","$titleElement","$messageElement","$progressElement","$closeElement","closeHtml","progressBar","hideEta","maxHideTime","response","startTime","toastClass","titleClass","messageClass","closeButton","prepend","newestOnTop","showMethod","showDuration","showEasing","onShown","timeOut","hideToast","setInterval","updateProgress","hover","stickAround","delayedHideToast","onclick","tapToDismiss","click","handleEvents","debug","source","override","closeMethod","closeDuration","closeEasing","onHidden","endTime","extendedTimeOut","percentage","deps","mod","autosize","values","Map","has","delete","createEvent","Event","bubbles","initEvent","assign","ta","heightOffset","clientWidth","cachedHeight","pageResize","overflowY","overflowX","wordWrap","boxSizing","paddingTop","paddingBottom","borderTopWidth","borderBottomWidth","changeOverflow","scrollHeight","overflows","getParentOverflows","docTop","styleHeight","computed","actualHeight","dispatchEvent","APP","SET_LANG","lang","reload","idx","not","sns_type","loc","img","POPUP","ClipboardJS","regex","regexType","transNum","c2","remander","checkID","chkSum","bizID","numberFormat","reg","unNumberFormat","returnStr","dateFormat","f","weekName","shortWeekName","zf","toKorean","hanA","danA","han","option","cw","screen","availWidth","ch","availHeight","sw","sh","ml","mt","MEMBER","InitLoginForm","initCheckExist","InitRegisterForm","InitMemberModifyForm","$form","ajax","serialize","base_url","res","LANG","member_join_success","elementLoginID","elementLoginPass","member_login_userid_required","member_login_password_required","reurl","$btn","member_join_user_id_required","wordCheck","denyWordCheck","member_join_no_valid_email_address","getInfo","member_join_user_id_already_exists","member_join_user_id_available","member_join_user_id_contains_deny_word","async","POP_CHANGE_PHOTO","ready","BOARD","CATEGORY","EXTRA","COMMENT","bca_idx","postCount","modify","cmt_idx","reply","cmt_num","$form_post","ajaxError","request","settings","responseJSON","ajaxStart","ajaxComplete","$check","is_all","checked","$allCheck","which","keyup","backdrop","toggle","Dropdown","getParent","$this","$parent","clearMenus","relatedTarget","contains","isDefaultPrevented","VERSION","isActive","toggleClass","keydown","$items","eq","old","dropdown","noConflict","MASK2","modal2","defaultCss","defaultOption","modalCallback","modalSendData","sendData","modalCss","modalAlign","maximize","getData","MODAL2"],"mappings":"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","sourcesContent":["/*!\n * clipboard.js v2.0.1\n * https://zenorocha.github.io/clipboard.js\n * \n * Licensed MIT © Zeno Rocha\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ClipboardJS\"] = factory();\n\telse\n\t\troot[\"ClipboardJS\"] = factory();\n})(this, function() {\nreturn /******/ (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// identity function for calling harmony imports with the correct context\n/******/ \t__webpack_require__.i = function(value) { return value; };\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 = 3);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function (global, factory) {\n if (true) {\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [module, __webpack_require__(7)], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else if (typeof exports !== \"undefined\") {\n factory(module, require('select'));\n } else {\n var mod = {\n exports: {}\n };\n factory(mod, global.select);\n global.clipboardAction = mod.exports;\n }\n})(this, function (module, _select) {\n 'use strict';\n\n var _select2 = _interopRequireDefault(_select);\n\n function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n default: obj\n };\n }\n\n var _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) {\n return typeof obj;\n } : function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n var _createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n }();\n\n var ClipboardAction = function () {\n /**\n * @param {Object} options\n */\n function ClipboardAction(options) {\n _classCallCheck(this, ClipboardAction);\n\n this.resolveOptions(options);\n this.initSelection();\n }\n\n /**\n * Defines base properties passed from constructor.\n * @param {Object} options\n */\n\n\n _createClass(ClipboardAction, [{\n key: 'resolveOptions',\n value: function resolveOptions() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n this.action = options.action;\n this.container = options.container;\n this.emitter = options.emitter;\n this.target = options.target;\n this.text = options.text;\n this.trigger = options.trigger;\n\n this.selectedText = '';\n }\n }, {\n key: 'initSelection',\n value: function initSelection() {\n if (this.text) {\n this.selectFake();\n } else if (this.target) {\n this.selectTarget();\n }\n }\n }, {\n key: 'selectFake',\n value: function selectFake() {\n var _this = this;\n\n var isRTL = document.documentElement.getAttribute('dir') == 'rtl';\n\n this.removeFake();\n\n this.fakeHandlerCallback = function () {\n return _this.removeFake();\n };\n this.fakeHandler = this.container.addEventListener('click', this.fakeHandlerCallback) || true;\n\n this.fakeElem = document.createElement('textarea');\n // Prevent zooming on iOS\n this.fakeElem.style.fontSize = '12pt';\n // Reset box model\n this.fakeElem.style.border = '0';\n this.fakeElem.style.padding = '0';\n this.fakeElem.style.margin = '0';\n // Move element out of screen horizontally\n this.fakeElem.style.position = 'absolute';\n this.fakeElem.style[isRTL ? 'right' : 'left'] = '-9999px';\n // Move element to the same position vertically\n var yPosition = window.pageYOffset || document.documentElement.scrollTop;\n this.fakeElem.style.top = yPosition + 'px';\n\n this.fakeElem.setAttribute('readonly', '');\n this.fakeElem.value = this.text;\n\n this.container.appendChild(this.fakeElem);\n\n this.selectedText = (0, _select2.default)(this.fakeElem);\n this.copyText();\n }\n }, {\n key: 'removeFake',\n value: function removeFake() {\n if (this.fakeHandler) {\n this.container.removeEventListener('click', this.fakeHandlerCallback);\n this.fakeHandler = null;\n this.fakeHandlerCallback = null;\n }\n\n if (this.fakeElem) {\n this.container.removeChild(this.fakeElem);\n this.fakeElem = null;\n }\n }\n }, {\n key: 'selectTarget',\n value: function selectTarget() {\n this.selectedText = (0, _select2.default)(this.target);\n this.copyText();\n }\n }, {\n key: 'copyText',\n value: function copyText() {\n var succeeded = void 0;\n\n try {\n succeeded = document.execCommand(this.action);\n } catch (err) {\n succeeded = false;\n }\n\n this.handleResult(succeeded);\n }\n }, {\n key: 'handleResult',\n value: function handleResult(succeeded) {\n this.emitter.emit(succeeded ? 'success' : 'error', {\n action: this.action,\n text: this.selectedText,\n trigger: this.trigger,\n clearSelection: this.clearSelection.bind(this)\n });\n }\n }, {\n key: 'clearSelection',\n value: function clearSelection() {\n if (this.trigger) {\n this.trigger.focus();\n }\n\n window.getSelection().removeAllRanges();\n }\n }, {\n key: 'destroy',\n value: function destroy() {\n this.removeFake();\n }\n }, {\n key: 'action',\n set: function set() {\n var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'copy';\n\n this._action = action;\n\n if (this._action !== 'copy' && this._action !== 'cut') {\n throw new Error('Invalid \"action\" value, use either \"copy\" or \"cut\"');\n }\n },\n get: function get() {\n return this._action;\n }\n }, {\n key: 'target',\n set: function set(target) {\n if (target !== undefined) {\n if (target && (typeof target === 'undefined' ? 'undefined' : _typeof(target)) === 'object' && target.nodeType === 1) {\n if (this.action === 'copy' && target.hasAttribute('disabled')) {\n throw new Error('Invalid \"target\" attribute. Please use \"readonly\" instead of \"disabled\" attribute');\n }\n\n if (this.action === 'cut' && (target.hasAttribute('readonly') || target.hasAttribute('disabled'))) {\n throw new Error('Invalid \"target\" attribute. You can\\'t cut text from elements with \"readonly\" or \"disabled\" attributes');\n }\n\n this._target = target;\n } else {\n throw new Error('Invalid \"target\" value, use a valid Element');\n }\n }\n },\n get: function get() {\n return this._target;\n }\n }]);\n\n return ClipboardAction;\n }();\n\n module.exports = ClipboardAction;\n});\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar is = __webpack_require__(6);\nvar delegate = __webpack_require__(5);\n\n/**\n * Validates all params and calls the right\n * listener function based on its target type.\n *\n * @param {String|HTMLElement|HTMLCollection|NodeList} target\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listen(target, type, callback) {\n if (!target && !type && !callback) {\n throw new Error('Missing required arguments');\n }\n\n if (!is.string(type)) {\n throw new TypeError('Second argument must be a String');\n }\n\n if (!is.fn(callback)) {\n throw new TypeError('Third argument must be a Function');\n }\n\n if (is.node(target)) {\n return listenNode(target, type, callback);\n }\n else if (is.nodeList(target)) {\n return listenNodeList(target, type, callback);\n }\n else if (is.string(target)) {\n return listenSelector(target, type, callback);\n }\n else {\n throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList');\n }\n}\n\n/**\n * Adds an event listener to a HTML element\n * and returns a remove listener function.\n *\n * @param {HTMLElement} node\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNode(node, type, callback) {\n node.addEventListener(type, callback);\n\n return {\n destroy: function() {\n node.removeEventListener(type, callback);\n }\n }\n}\n\n/**\n * Add an event listener to a list of HTML elements\n * and returns a remove listener function.\n *\n * @param {NodeList|HTMLCollection} nodeList\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNodeList(nodeList, type, callback) {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.addEventListener(type, callback);\n });\n\n return {\n destroy: function() {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.removeEventListener(type, callback);\n });\n }\n }\n}\n\n/**\n * Add an event listener to a selector\n * and returns a remove listener function.\n *\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenSelector(selector, type, callback) {\n return delegate(document.body, selector, type, callback);\n}\n\nmodule.exports = listen;\n\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports) {\n\nfunction E () {\n // Keep this empty so it's easier to inherit from\n // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n}\n\nE.prototype = {\n on: function (name, callback, ctx) {\n var e = this.e || (this.e = {});\n\n (e[name] || (e[name] = [])).push({\n fn: callback,\n ctx: ctx\n });\n\n return this;\n },\n\n once: function (name, callback, ctx) {\n var self = this;\n function listener () {\n self.off(name, listener);\n callback.apply(ctx, arguments);\n };\n\n listener._ = callback\n return this.on(name, listener, ctx);\n },\n\n emit: function (name) {\n var data = [].slice.call(arguments, 1);\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n var i = 0;\n var len = evtArr.length;\n\n for (i; i < len; i++) {\n evtArr[i].fn.apply(evtArr[i].ctx, data);\n }\n\n return this;\n },\n\n off: function (name, callback) {\n var e = this.e || (this.e = {});\n var evts = e[name];\n var liveEvents = [];\n\n if (evts && callback) {\n for (var i = 0, len = evts.length; i < len; i++) {\n if (evts[i].fn !== callback && evts[i].fn._ !== callback)\n liveEvents.push(evts[i]);\n }\n }\n\n // Remove event from queue to prevent memory leak\n // Suggested by https://github.com/lazd\n // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n\n (liveEvents.length)\n ? e[name] = liveEvents\n : delete e[name];\n\n return this;\n }\n};\n\nmodule.exports = E;\n\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function (global, factory) {\n if (true) {\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [module, __webpack_require__(0), __webpack_require__(2), __webpack_require__(1)], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else if (typeof exports !== \"undefined\") {\n factory(module, require('./clipboard-action'), require('tiny-emitter'), require('good-listener'));\n } else {\n var mod = {\n exports: {}\n };\n factory(mod, global.clipboardAction, global.tinyEmitter, global.goodListener);\n global.clipboard = mod.exports;\n }\n})(this, function (module, _clipboardAction, _tinyEmitter, _goodListener) {\n 'use strict';\n\n var _clipboardAction2 = _interopRequireDefault(_clipboardAction);\n\n var _tinyEmitter2 = _interopRequireDefault(_tinyEmitter);\n\n var _goodListener2 = _interopRequireDefault(_goodListener);\n\n function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n default: obj\n };\n }\n\n var _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) {\n return typeof obj;\n } : function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n var _createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n }();\n\n function _possibleConstructorReturn(self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n }\n\n function _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n }\n\n var Clipboard = function (_Emitter) {\n _inherits(Clipboard, _Emitter);\n\n /**\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n * @param {Object} options\n */\n function Clipboard(trigger, options) {\n _classCallCheck(this, Clipboard);\n\n var _this = _possibleConstructorReturn(this, (Clipboard.__proto__ || Object.getPrototypeOf(Clipboard)).call(this));\n\n _this.resolveOptions(options);\n _this.listenClick(trigger);\n return _this;\n }\n\n /**\n * Defines if attributes would be resolved using internal setter functions\n * or custom functions that were passed in the constructor.\n * @param {Object} options\n */\n\n\n _createClass(Clipboard, [{\n key: 'resolveOptions',\n value: function resolveOptions() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n this.action = typeof options.action === 'function' ? options.action : this.defaultAction;\n this.target = typeof options.target === 'function' ? options.target : this.defaultTarget;\n this.text = typeof options.text === 'function' ? options.text : this.defaultText;\n this.container = _typeof(options.container) === 'object' ? options.container : document.body;\n }\n }, {\n key: 'listenClick',\n value: function listenClick(trigger) {\n var _this2 = this;\n\n this.listener = (0, _goodListener2.default)(trigger, 'click', function (e) {\n return _this2.onClick(e);\n });\n }\n }, {\n key: 'onClick',\n value: function onClick(e) {\n var trigger = e.delegateTarget || e.currentTarget;\n\n if (this.clipboardAction) {\n this.clipboardAction = null;\n }\n\n this.clipboardAction = new _clipboardAction2.default({\n action: this.action(trigger),\n target: this.target(trigger),\n text: this.text(trigger),\n container: this.container,\n trigger: trigger,\n emitter: this\n });\n }\n }, {\n key: 'defaultAction',\n value: function defaultAction(trigger) {\n return getAttributeValue('action', trigger);\n }\n }, {\n key: 'defaultTarget',\n value: function defaultTarget(trigger) {\n var selector = getAttributeValue('target', trigger);\n\n if (selector) {\n return document.querySelector(selector);\n }\n }\n }, {\n key: 'defaultText',\n value: function defaultText(trigger) {\n return getAttributeValue('text', trigger);\n }\n }, {\n key: 'destroy',\n value: function destroy() {\n this.listener.destroy();\n\n if (this.clipboardAction) {\n this.clipboardAction.destroy();\n this.clipboardAction = null;\n }\n }\n }], [{\n key: 'isSupported',\n value: function isSupported() {\n var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['copy', 'cut'];\n\n var actions = typeof action === 'string' ? [action] : action;\n var support = !!document.queryCommandSupported;\n\n actions.forEach(function (action) {\n support = support && !!document.queryCommandSupported(action);\n });\n\n return support;\n }\n }]);\n\n return Clipboard;\n }(_tinyEmitter2.default);\n\n /**\n * Helper function to retrieve attribute value.\n * @param {String} suffix\n * @param {Element} element\n */\n function getAttributeValue(suffix, element) {\n var attribute = 'data-clipboard-' + suffix;\n\n if (!element.hasAttribute(attribute)) {\n return;\n }\n\n return element.getAttribute(attribute);\n }\n\n module.exports = Clipboard;\n});\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports) {\n\nvar DOCUMENT_NODE_TYPE = 9;\n\n/**\n * A polyfill for Element.matches()\n */\nif (typeof Element !== 'undefined' && !Element.prototype.matches) {\n var proto = Element.prototype;\n\n proto.matches = proto.matchesSelector ||\n proto.mozMatchesSelector ||\n proto.msMatchesSelector ||\n proto.oMatchesSelector ||\n proto.webkitMatchesSelector;\n}\n\n/**\n * Finds the closest parent that matches a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @return {Function}\n */\nfunction closest (element, selector) {\n while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {\n if (typeof element.matches === 'function' &&\n element.matches(selector)) {\n return element;\n }\n element = element.parentNode;\n }\n}\n\nmodule.exports = closest;\n\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar closest = __webpack_require__(4);\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction _delegate(element, selector, type, callback, useCapture) {\n var listenerFn = listener.apply(this, arguments);\n\n element.addEventListener(type, listenerFn, useCapture);\n\n return {\n destroy: function() {\n element.removeEventListener(type, listenerFn, useCapture);\n }\n }\n}\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element|String|Array} [elements]\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction delegate(elements, selector, type, callback, useCapture) {\n // Handle the regular Element usage\n if (typeof elements.addEventListener === 'function') {\n return _delegate.apply(null, arguments);\n }\n\n // Handle Element-less usage, it defaults to global delegation\n if (typeof type === 'function') {\n // Use `document` as the first parameter, then apply arguments\n // This is a short way to .unshift `arguments` without running into deoptimizations\n return _delegate.bind(null, document).apply(null, arguments);\n }\n\n // Handle Selector-based usage\n if (typeof elements === 'string') {\n elements = document.querySelectorAll(elements);\n }\n\n // Handle Array-like based usage\n return Array.prototype.map.call(elements, function (element) {\n return _delegate(element, selector, type, callback, useCapture);\n });\n}\n\n/**\n * Finds closest match and invokes callback.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Function}\n */\nfunction listener(element, selector, type, callback) {\n return function(e) {\n e.delegateTarget = closest(e.target, selector);\n\n if (e.delegateTarget) {\n callback.call(element, e);\n }\n }\n}\n\nmodule.exports = delegate;\n\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports) {\n\n/**\n * Check if argument is a HTML element.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.node = function(value) {\n return value !== undefined\n && value instanceof HTMLElement\n && value.nodeType === 1;\n};\n\n/**\n * Check if argument is a list of HTML elements.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.nodeList = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return value !== undefined\n && (type === '[object NodeList]' || type === '[object HTMLCollection]')\n && ('length' in value)\n && (value.length === 0 || exports.node(value[0]));\n};\n\n/**\n * Check if argument is a string.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.string = function(value) {\n return typeof value === 'string'\n || value instanceof String;\n};\n\n/**\n * Check if argument is a function.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.fn = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return type === '[object Function]';\n};\n\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports) {\n\nfunction select(element) {\n var selectedText;\n\n if (element.nodeName === 'SELECT') {\n element.focus();\n\n selectedText = element.value;\n }\n else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {\n var isReadOnly = element.hasAttribute('readonly');\n\n if (!isReadOnly) {\n element.setAttribute('readonly', '');\n }\n\n element.select();\n element.setSelectionRange(0, element.value.length);\n\n if (!isReadOnly) {\n element.removeAttribute('readonly');\n }\n\n selectedText = element.value;\n }\n else {\n if (element.hasAttribute('contenteditable')) {\n element.focus();\n }\n\n var selection = window.getSelection();\n var range = document.createRange();\n\n range.selectNodeContents(element);\n selection.removeAllRanges();\n selection.addRange(range);\n\n selectedText = selection.toString();\n }\n\n return selectedText;\n}\n\nmodule.exports = select;\n\n\n/***/ })\n/******/ ]);\n});","/*!\n * jQuery Templates Plugin 1.0.0pre\n * http://github.com/jquery/jquery-tmpl\n * Requires jQuery 1.4.2\n *\n * Copyright 2011, Software Freedom Conservancy, Inc.\n * Dual licensed under the MIT or GPL Version 2 licenses.\n * http://jquery.org/license\n */\n(function( jQuery, undefined ){\n\tvar oldManip = jQuery.fn.domManip, tmplItmAtt = \"_tmplitem\", htmlExpr = /^[^<]*(<[\\w\\W]+>)[^>]*$|\\{\\{\\! /,\n\t\tnewTmplItems = {}, wrappedItems = {}, appendToTmplItems, topTmplItem = { key: 0, data: {} }, itemKey = 0, cloneIndex = 0, stack = [];\n\n\tfunction newTmplItem( options, parentItem, fn, data ) {\n\t\t// Returns a template item data structure for a new rendered instance of a template (a 'template item').\n\t\t// The content field is a hierarchical array of strings and nested items (to be\n\t\t// removed and replaced by nodes field of dom elements, once inserted in DOM).\n\t\tvar newItem = {\n\t\t\tdata: data || (data === 0 || data === false) ? data : (parentItem ? parentItem.data : {}),\n\t\t\t_wrap: parentItem ? parentItem._wrap : null,\n\t\t\ttmpl: null,\n\t\t\tparent: parentItem || null,\n\t\t\tnodes: [],\n\t\t\tcalls: tiCalls,\n\t\t\tnest: tiNest,\n\t\t\twrap: tiWrap,\n\t\t\thtml: tiHtml,\n\t\t\tupdate: tiUpdate\n\t\t};\n\t\tif ( options ) {\n\t\t\tjQuery.extend( newItem, options, { nodes: [], parent: parentItem });\n\t\t}\n\t\tif ( fn ) {\n\t\t\t// Build the hierarchical content to be used during insertion into DOM\n\t\t\tnewItem.tmpl = fn;\n\t\t\tnewItem._ctnt = newItem._ctnt || newItem.tmpl( jQuery, newItem );\n\t\t\tnewItem.key = ++itemKey;\n\t\t\t// Keep track of new template item, until it is stored as jQuery Data on DOM element\n\t\t\t(stack.length ? wrappedItems : newTmplItems)[itemKey] = newItem;\n\t\t}\n\t\treturn newItem;\n\t}\n\n\t// Override appendTo etc., in order to provide support for targeting multiple elements. (This code would disappear if integrated in jquery core).\n\tjQuery.each({\n\t\tappendTo: \"append\",\n\t\tprependTo: \"prepend\",\n\t\tinsertBefore: \"before\",\n\t\tinsertAfter: \"after\",\n\t\treplaceAll: \"replaceWith\"\n\t}, function( name, original ) {\n\t\tjQuery.fn[ name ] = function( selector ) {\n\t\t\tvar ret = [], insert = jQuery( selector ), elems, i, l, tmplItems,\n\t\t\t\tparent = this.length === 1 && this[0].parentNode;\n\n\t\t\tappendToTmplItems = newTmplItems || {};\n\t\t\tif ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {\n\t\t\t\tinsert[ original ]( this[0] );\n\t\t\t\tret = this;\n\t\t\t} else {\n\t\t\t\tfor ( i = 0, l = insert.length; i < l; i++ ) {\n\t\t\t\t\tcloneIndex = i;\n\t\t\t\t\telems = (i > 0 ? this.clone(true) : this).get();\n\t\t\t\t\tjQuery( insert[i] )[ original ]( elems );\n\t\t\t\t\tret = ret.concat( elems );\n\t\t\t\t}\n\t\t\t\tcloneIndex = 0;\n\t\t\t\tret = this.pushStack( ret, name, insert.selector );\n\t\t\t}\n\t\t\ttmplItems = appendToTmplItems;\n\t\t\tappendToTmplItems = null;\n\t\t\tjQuery.tmpl.complete( tmplItems );\n\t\t\treturn ret;\n\t\t};\n\t});\n\n\tjQuery.fn.extend({\n\t\t// Use first wrapped element as template markup.\n\t\t// Return wrapped set of template items, obtained by rendering template against data.\n\t\ttmpl: function( data, options, parentItem ) {\n\t\t\treturn jQuery.tmpl( this[0], data, options, parentItem );\n\t\t},\n\n\t\t// Find which rendered template item the first wrapped DOM element belongs to\n\t\ttmplItem: function() {\n\t\t\treturn jQuery.tmplItem( this[0] );\n\t\t},\n\n\t\t// Consider the first wrapped element as a template declaration, and get the compiled template or store it as a named template.\n\t\ttemplate: function( name ) {\n\t\t\treturn jQuery.template( name, this[0] );\n\t\t},\n\n\t\tdomManip: function( args, table, callback, options ) {\n\t\t\tif ( args[0] && jQuery.isArray( args[0] )) {\n\t\t\t\tvar dmArgs = jQuery.makeArray( arguments ), elems = args[0], elemsLength = elems.length, i = 0, tmplItem;\n\t\t\t\twhile ( i < elemsLength && !(tmplItem = jQuery.data( elems[i++], \"tmplItem\" ))) {}\n\t\t\t\tif ( tmplItem && cloneIndex ) {\n\t\t\t\t\tdmArgs[2] = function( fragClone ) {\n\t\t\t\t\t\t// Handler called by oldManip when rendered template has been inserted into DOM.\n\t\t\t\t\t\tjQuery.tmpl.afterManip( this, fragClone, callback );\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\toldManip.apply( this, dmArgs );\n\t\t\t} else {\n\t\t\t\toldManip.apply( this, arguments );\n\t\t\t}\n\t\t\tcloneIndex = 0;\n\t\t\tif ( !appendToTmplItems ) {\n\t\t\t\tjQuery.tmpl.complete( newTmplItems );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t});\n\n\tjQuery.extend({\n\t\t// Return wrapped set of template items, obtained by rendering template against data.\n\t\ttmpl: function( tmpl, data, options, parentItem ) {\n\t\t\tvar ret, topLevel = !parentItem;\n\t\t\tif ( topLevel ) {\n\t\t\t\t// This is a top-level tmpl call (not from a nested template using {{tmpl}})\n\t\t\t\tparentItem = topTmplItem;\n\t\t\t\ttmpl = jQuery.template[tmpl] || jQuery.template( null, tmpl );\n\t\t\t\twrappedItems = {}; // Any wrapped items will be rebuilt, since this is top level\n\t\t\t} else if ( !tmpl ) {\n\t\t\t\t// The template item is already associated with DOM - this is a refresh.\n\t\t\t\t// Re-evaluate rendered template for the parentItem\n\t\t\t\ttmpl = parentItem.tmpl;\n\t\t\t\tnewTmplItems[parentItem.key] = parentItem;\n\t\t\t\tparentItem.nodes = [];\n\t\t\t\tif ( parentItem.wrapped ) {\n\t\t\t\t\tupdateWrapped( parentItem, parentItem.wrapped );\n\t\t\t\t}\n\t\t\t\t// Rebuild, without creating a new template item\n\t\t\t\treturn jQuery( build( parentItem, null, parentItem.tmpl( jQuery, parentItem ) ));\n\t\t\t}\n\t\t\tif ( !tmpl ) {\n\t\t\t\treturn []; // Could throw...\n\t\t\t}\n\t\t\tif ( typeof data === \"function\" ) {\n\t\t\t\tdata = data.call( parentItem || {} );\n\t\t\t}\n\t\t\tif ( options && options.wrapped ) {\n\t\t\t\tupdateWrapped( options, options.wrapped );\n\t\t\t}\n\t\t\tret = jQuery.isArray( data ) ?\n\t\t\t\tjQuery.map( data, function( dataItem ) {\n\t\t\t\t\treturn dataItem ? newTmplItem( options, parentItem, tmpl, dataItem ) : null;\n\t\t\t\t}) :\n\t\t\t\t[ newTmplItem( options, parentItem, tmpl, data ) ];\n\t\t\treturn topLevel ? jQuery( build( parentItem, null, ret ) ) : ret;\n\t\t},\n\n\t\t// Return rendered template item for an element.\n\t\ttmplItem: function( elem ) {\n\t\t\tvar tmplItem;\n\t\t\tif ( elem instanceof jQuery ) {\n\t\t\t\telem = elem[0];\n\t\t\t}\n\t\t\twhile ( elem && elem.nodeType === 1 && !(tmplItem = jQuery.data( elem, \"tmplItem\" )) && (elem = elem.parentNode) ) {}\n\t\t\treturn tmplItem || topTmplItem;\n\t\t},\n\n\t\t// Set:\n\t\t// Use $.template( name, tmpl ) to cache a named template,\n\t\t// where tmpl is a template string, a script element or a jQuery instance wrapping a script element, etc.\n\t\t// Use $( \"selector\" ).template( name ) to provide access by name to a script block template declaration.\n\n\t\t// Get:\n\t\t// Use $.template( name ) to access a cached template.\n\t\t// Also $( selectorToScriptBlock ).template(), or $.template( null, templateString )\n\t\t// will return the compiled template, without adding a name reference.\n\t\t// If templateString includes at least one HTML tag, $.template( templateString ) is equivalent\n\t\t// to $.template( null, templateString )\n\t\ttemplate: function( name, tmpl ) {\n\t\t\tif (tmpl) {\n\t\t\t\t// Compile template and associate with name\n\t\t\t\tif ( typeof tmpl === \"string\" ) {\n\t\t\t\t\t// This is an HTML string being passed directly in.\n\t\t\t\t\ttmpl = buildTmplFn( tmpl );\n\t\t\t\t} else if ( tmpl instanceof jQuery ) {\n\t\t\t\t\ttmpl = tmpl[0] || {};\n\t\t\t\t}\n\t\t\t\tif ( tmpl.nodeType ) {\n\t\t\t\t\t// If this is a template block, use cached copy, or generate tmpl function and cache.\n\t\t\t\t\ttmpl = jQuery.data( tmpl, \"tmpl\" ) || jQuery.data( tmpl, \"tmpl\", buildTmplFn( tmpl.innerHTML ));\n\t\t\t\t\t// Issue: In IE, if the container element is not a script block, the innerHTML will remove quotes from attribute values whenever the value does not include white space.\n\t\t\t\t\t// This means that foo=\"${x}\" will not work if the value of x includes white space: foo=\"${x}\" -> foo=value of x.\n\t\t\t\t\t// To correct this, include space in tag: foo=\"${ x }\" -> foo=\"value of x\"\n\t\t\t\t}\n\t\t\t\treturn typeof name === \"string\" ? (jQuery.template[name] = tmpl) : tmpl;\n\t\t\t}\n\t\t\t// Return named compiled template\n\t\t\treturn name ? (typeof name !== \"string\" ? jQuery.template( null, name ):\n\t\t\t\t(jQuery.template[name] ||\n\t\t\t\t\t// If not in map, and not containing at least on HTML tag, treat as a selector.\n\t\t\t\t\t// (If integrated with core, use quickExpr.exec)\n\t\t\t\t\tjQuery.template( null, htmlExpr.test( name ) ? name : jQuery( name )))) : null;\n\t\t},\n\n\t\tencode: function( text ) {\n\t\t\t// Do HTML encoding replacing < > & and ' and \" by corresponding entities.\n\t\t\treturn (\"\" + text).split(\"<\").join(\"&lt;\").split(\">\").join(\"&gt;\").split('\"').join(\"&#34;\").split(\"'\").join(\"&#39;\");\n\t\t}\n\t});\n\n\tjQuery.extend( jQuery.tmpl, {\n\t\ttag: {\n\t\t\t\"tmpl\": {\n\t\t\t\t_default: { $2: \"null\" },\n\t\t\t\topen: \"if($notnull_1){__=__.concat($item.nest($1,$2));}\"\n\t\t\t\t// tmpl target parameter can be of type function, so use $1, not $1a (so not auto detection of functions)\n\t\t\t\t// This means that {{tmpl foo}} treats foo as a template (which IS a function).\n\t\t\t\t// Explicit parens can be used if foo is a function that returns a template: {{tmpl foo()}}.\n\t\t\t},\n\t\t\t\"wrap\": {\n\t\t\t\t_default: { $2: \"null\" },\n\t\t\t\topen: \"$item.calls(__,$1,$2);__=[];\",\n\t\t\t\tclose: \"call=$item.calls();__=call._.concat($item.wrap(call,__));\"\n\t\t\t},\n\t\t\t\"each\": {\n\t\t\t\t_default: { $2: \"$index, $value\" },\n\t\t\t\topen: \"if($notnull_1){$.each($1a,function($2){with(this){\",\n\t\t\t\tclose: \"}});}\"\n\t\t\t},\n\t\t\t\"if\": {\n\t\t\t\topen: \"if(($notnull_1) && $1a){\",\n\t\t\t\tclose: \"}\"\n\t\t\t},\n\t\t\t\"else\": {\n\t\t\t\t_default: { $1: \"true\" },\n\t\t\t\topen: \"}else if(($notnull_1) && $1a){\"\n\t\t\t},\n\t\t\t\"html\": {\n\t\t\t\t// Unecoded expression evaluation.\n\t\t\t\topen: \"if($notnull_1){__.push($1a);}\"\n\t\t\t},\n\t\t\t\"=\": {\n\t\t\t\t// Encoded expression evaluation. Abbreviated form is ${}.\n\t\t\t\t_default: { $1: \"$data\" },\n\t\t\t\topen: \"if($notnull_1){__.push($.encode($1a));}\"\n\t\t\t},\n\t\t\t\"!\": {\n\t\t\t\t// Comment tag. Skipped by parser\n\t\t\t\topen: \"\"\n\t\t\t}\n\t\t},\n\n\t\t// This stub can be overridden, e.g. in jquery.tmplPlus for providing rendered events\n\t\tcomplete: function( items ) {\n\t\t\tnewTmplItems = {};\n\t\t},\n\n\t\t// Call this from code which overrides domManip, or equivalent\n\t\t// Manage cloning/storing template items etc.\n\t\tafterManip: function afterManip( elem, fragClone, callback ) {\n\t\t\t// Provides cloned fragment ready for fixup prior to and after insertion into DOM\n\t\t\tvar content = fragClone.nodeType === 11 ?\n\t\t\t\tjQuery.makeArray(fragClone.childNodes) :\n\t\t\t\tfragClone.nodeType === 1 ? [fragClone] : [];\n\n\t\t\t// Return fragment to original caller (e.g. append) for DOM insertion\n\t\t\tcallback.call( elem, fragClone );\n\n\t\t\t// Fragment has been inserted:- Add inserted nodes to tmplItem data structure. Replace inserted element annotations by jQuery.data.\n\t\t\tstoreTmplItems( content );\n\t\t\tcloneIndex++;\n\t\t}\n\t});\n\n\t//========================== Private helper functions, used by code above ==========================\n\n\tfunction build( tmplItem, nested, content ) {\n\t\t// Convert hierarchical content into flat string array\n\t\t// and finally return array of fragments ready for DOM insertion\n\t\tvar frag, ret = content ? jQuery.map( content, function( item ) {\n\t\t\treturn (typeof item === \"string\") ?\n\t\t\t\t// Insert template item annotations, to be converted to jQuery.data( \"tmplItem\" ) when elems are inserted into DOM.\n\t\t\t\t(tmplItem.key ? item.replace( /(<\\w+)(?=[\\s>])(?![^>]*_tmplitem)([^>]*)/g, \"$1 \" + tmplItmAtt + \"=\\\"\" + tmplItem.key + \"\\\" $2\" ) : item) :\n\t\t\t\t// This is a child template item. Build nested template.\n\t\t\t\tbuild( item, tmplItem, item._ctnt );\n\t\t}) :\n\t\t// If content is not defined, insert tmplItem directly. Not a template item. May be a string, or a string array, e.g. from {{html $item.html()}}.\n\t\ttmplItem;\n\t\tif ( nested ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\t// top-level template\n\t\tret = ret.join(\"\");\n\n\t\t// Support templates which have initial or final text nodes, or consist only of text\n\t\t// Also support HTML entities within the HTML markup.\n\t\tret.replace( /^\\s*([^<\\s][^<]*)?(<[\\w\\W]+>)([^>]*[^>\\s])?\\s*$/, function( all, before, middle, after) {\n\t\t\tfrag = jQuery( middle ).get();\n\n\t\t\tstoreTmplItems( frag );\n\t\t\tif ( before ) {\n\t\t\t\tfrag = unencode( before ).concat(frag);\n\t\t\t}\n\t\t\tif ( after ) {\n\t\t\t\tfrag = frag.concat(unencode( after ));\n\t\t\t}\n\t\t});\n\t\treturn frag ? frag : unencode( ret );\n\t}\n\n\tfunction unencode( text ) {\n\t\t// Use createElement, since createTextNode will not render HTML entities correctly\n\t\tvar el = document.createElement( \"div\" );\n\t\tel.innerHTML = text;\n\t\treturn jQuery.makeArray(el.childNodes);\n\t}\n\n\t// Generate a reusable function that will serve to render a template against data\n\tfunction buildTmplFn( markup ) {\n\t\treturn new Function(\"jQuery\",\"$item\",\n\t\t\t// Use the variable __ to hold a string array while building the compiled template. (See https://github.com/jquery/jquery-tmpl/issues#issue/10).\n\t\t\t\"var $=jQuery,call,__=[],$data=$item.data;\" +\n\n\t\t\t// Introduce the data as local variables using with(){}\n\t\t\t\"with($data){__.push('\" +\n\n\t\t\t// Convert the template into pure JavaScript\n\t\t\tjQuery.trim(markup)\n\t\t\t\t.replace( /([\\\\'])/g, \"\\\\$1\" )\n\t\t\t\t.replace( /[\\r\\t\\n]/g, \" \" )\n\t\t\t\t.replace( /\\$\\{([^\\}]*)\\}/g, \"{{= $1}}\" )\n\t\t\t\t.replace( /\\{\\{(\\/?)(\\w+|.)(?:\\(((?:[^\\}]|\\}(?!\\}))*?)?\\))?(?:\\s+(.*?)?)?(\\(((?:[^\\}]|\\}(?!\\}))*?)\\))?\\s*\\}\\}/g,\n\t\t\t\tfunction( all, slash, type, fnargs, target, parens, args ) {\n\t\t\t\t\tvar tag = jQuery.tmpl.tag[ type ], def, expr, exprAutoFnDetect;\n\t\t\t\t\tif ( !tag ) {\n\t\t\t\t\t\tthrow \"Unknown template tag: \" + type;\n\t\t\t\t\t}\n\t\t\t\t\tdef = tag._default || [];\n\t\t\t\t\tif ( parens && !/\\w$/.test(target)) {\n\t\t\t\t\t\ttarget += parens;\n\t\t\t\t\t\tparens = \"\";\n\t\t\t\t\t}\n\t\t\t\t\tif ( target ) {\n\t\t\t\t\t\ttarget = unescape( target );\n\t\t\t\t\t\targs = args ? (\",\" + unescape( args ) + \")\") : (parens ? \")\" : \"\");\n\t\t\t\t\t\t// Support for target being things like a.toLowerCase();\n\t\t\t\t\t\t// In that case don't call with template item as 'this' pointer. Just evaluate...\n\t\t\t\t\t\texpr = parens ? (target.indexOf(\".\") > -1 ? target + unescape( parens ) : (\"(\" + target + \").call($item\" + args)) : target;\n\t\t\t\t\t\texprAutoFnDetect = parens ? expr : \"(typeof(\" + target + \")==='function'?(\" + target + \").call($item):(\" + target + \"))\";\n\t\t\t\t\t} else {\n\t\t\t\t\t\texprAutoFnDetect = expr = def.$1 || \"null\";\n\t\t\t\t\t}\n\t\t\t\t\tfnargs = unescape( fnargs );\n\t\t\t\t\treturn \"');\" +\n\t\t\t\t\t\ttag[ slash ? \"close\" : \"open\" ]\n\t\t\t\t\t\t\t.split( \"$notnull_1\" ).join( target ? \"typeof(\" + target + \")!=='undefined' && (\" + target + \")!=null\" : \"true\" )\n\t\t\t\t\t\t\t.split( \"$1a\" ).join( exprAutoFnDetect )\n\t\t\t\t\t\t\t.split( \"$1\" ).join( expr )\n\t\t\t\t\t\t\t.split( \"$2\" ).join( fnargs || def.$2 || \"\" ) +\n\t\t\t\t\t\t\"__.push('\";\n\t\t\t\t}) +\n\t\t\t\"');}return __;\"\n\t\t);\n\t}\n\tfunction updateWrapped( options, wrapped ) {\n\t\t// Build the wrapped content.\n\t\toptions._wrap = build( options, true,\n\t\t\t// Suport imperative scenario in which options.wrapped can be set to a selector or an HTML string.\n\t\t\tjQuery.isArray( wrapped ) ? wrapped : [htmlExpr.test( wrapped ) ? wrapped : jQuery( wrapped ).html()]\n\t\t).join(\"\");\n\t}\n\n\tfunction unescape( args ) {\n\t\treturn args ? args.replace( /\\\\'/g, \"'\").replace(/\\\\\\\\/g, \"\\\\\" ) : null;\n\t}\n\tfunction outerHtml( elem ) {\n\t\tvar div = document.createElement(\"div\");\n\t\tdiv.appendChild( elem.cloneNode(true) );\n\t\treturn div.innerHTML;\n\t}\n\n\t// Store template items in jQuery.data(), ensuring a unique tmplItem data data structure for each rendered template instance.\n\tfunction storeTmplItems( content ) {\n\t\tvar keySuffix = \"_\" + cloneIndex, elem, elems, newClonedItems = {}, i, l, m;\n\t\tfor ( i = 0, l = content.length; i < l; i++ ) {\n\t\t\tif ( (elem = content[i]).nodeType !== 1 ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\telems = elem.getElementsByTagName(\"*\");\n\t\t\tfor ( m = elems.length - 1; m >= 0; m-- ) {\n\t\t\t\tprocessItemKey( elems[m] );\n\t\t\t}\n\t\t\tprocessItemKey( elem );\n\t\t}\n\t\tfunction processItemKey( el ) {\n\t\t\tvar pntKey, pntNode = el, pntItem, tmplItem, key;\n\t\t\t// Ensure that each rendered template inserted into the DOM has its own template item,\n\t\t\tif ( (key = el.getAttribute( tmplItmAtt ))) {\n\t\t\t\twhile ( pntNode.parentNode && (pntNode = pntNode.parentNode).nodeType === 1 && !(pntKey = pntNode.getAttribute( tmplItmAtt ))) { }\n\t\t\t\tif ( pntKey !== key ) {\n\t\t\t\t\t// The next ancestor with a _tmplitem expando is on a different key than this one.\n\t\t\t\t\t// So this is a top-level element within this template item\n\t\t\t\t\t// Set pntNode to the key of the parentNode, or to 0 if pntNode.parentNode is null, or pntNode is a fragment.\n\t\t\t\t\tpntNode = pntNode.parentNode ? (pntNode.nodeType === 11 ? 0 : (pntNode.getAttribute( tmplItmAtt ) || 0)) : 0;\n\t\t\t\t\tif ( !(tmplItem = newTmplItems[key]) ) {\n\t\t\t\t\t\t// The item is for wrapped content, and was copied from the temporary parent wrappedItem.\n\t\t\t\t\t\ttmplItem = wrappedItems[key];\n\t\t\t\t\t\ttmplItem = newTmplItem( tmplItem, newTmplItems[pntNode]||wrappedItems[pntNode] );\n\t\t\t\t\t\ttmplItem.key = ++itemKey;\n\t\t\t\t\t\tnewTmplItems[itemKey] = tmplItem;\n\t\t\t\t\t}\n\t\t\t\t\tif ( cloneIndex ) {\n\t\t\t\t\t\tcloneTmplItem( key );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tel.removeAttribute( tmplItmAtt );\n\t\t\t} else if ( cloneIndex && (tmplItem = jQuery.data( el, \"tmplItem\" )) ) {\n\t\t\t\t// This was a rendered element, cloned during append or appendTo etc.\n\t\t\t\t// TmplItem stored in jQuery data has already been cloned in cloneCopyEvent. We must replace it with a fresh cloned tmplItem.\n\t\t\t\tcloneTmplItem( tmplItem.key );\n\t\t\t\tnewTmplItems[tmplItem.key] = tmplItem;\n\t\t\t\tpntNode = jQuery.data( el.parentNode, \"tmplItem\" );\n\t\t\t\tpntNode = pntNode ? pntNode.key : 0;\n\t\t\t}\n\t\t\tif ( tmplItem ) {\n\t\t\t\tpntItem = tmplItem;\n\t\t\t\t// Find the template item of the parent element.\n\t\t\t\t// (Using !=, not !==, since pntItem.key is number, and pntNode may be a string)\n\t\t\t\twhile ( pntItem && pntItem.key != pntNode ) {\n\t\t\t\t\t// Add this element as a top-level node for this rendered template item, as well as for any\n\t\t\t\t\t// ancestor items between this item and the item of its parent element\n\t\t\t\t\tpntItem.nodes.push( el );\n\t\t\t\t\tpntItem = pntItem.parent;\n\t\t\t\t}\n\t\t\t\t// Delete content built during rendering - reduce API surface area and memory use, and avoid exposing of stale data after rendering...\n\t\t\t\tdelete tmplItem._ctnt;\n\t\t\t\tdelete tmplItem._wrap;\n\t\t\t\t// Store template item as jQuery data on the element\n\t\t\t\tjQuery.data( el, \"tmplItem\", tmplItem );\n\t\t\t}\n\t\t\tfunction cloneTmplItem( key ) {\n\t\t\t\tkey = key + keySuffix;\n\t\t\t\ttmplItem = newClonedItems[key] =\n\t\t\t\t\t(newClonedItems[key] || newTmplItem( tmplItem, newTmplItems[tmplItem.parent.key + keySuffix] || tmplItem.parent ));\n\t\t\t}\n\t\t}\n\t}\n\n\t//---- Helper functions for template item ----\n\n\tfunction tiCalls( content, tmpl, data, options ) {\n\t\tif ( !content ) {\n\t\t\treturn stack.pop();\n\t\t}\n\t\tstack.push({ _: content, tmpl: tmpl, item:this, data: data, options: options });\n\t}\n\n\tfunction tiNest( tmpl, data, options ) {\n\t\t// nested template, using {{tmpl}} tag\n\t\treturn jQuery.tmpl( jQuery.template( tmpl ), data, options, this );\n\t}\n\n\tfunction tiWrap( call, wrapped ) {\n\t\t// nested template, using {{wrap}} tag\n\t\tvar options = call.options || {};\n\t\toptions.wrapped = wrapped;\n\t\t// Apply the template, which may incorporate wrapped content,\n\t\treturn jQuery.tmpl( jQuery.template( call.tmpl ), call.data, options, call.item );\n\t}\n\n\tfunction tiHtml( filter, textOnly ) {\n\t\tvar wrapped = this._wrap;\n\t\treturn jQuery.map(\n\t\t\tjQuery( jQuery.isArray( wrapped ) ? wrapped.join(\"\") : wrapped ).filter( filter || \"*\" ),\n\t\t\tfunction(e) {\n\t\t\t\treturn textOnly ?\n\t\t\t\t\te.innerText || e.textContent :\n\t\t\t\t\te.outerHTML || outerHtml(e);\n\t\t\t});\n\t}\n\n\tfunction tiUpdate() {\n\t\tvar coll = this.nodes;\n\t\tjQuery.tmpl( null, null, null, this).insertBefore( coll[0] );\n\t\tjQuery( coll ).remove();\n\t}\n})( jQuery );\n","/*!\n * jQuery blockUI plugin\n * Version 2.70.0-2014.11.23\n * Requires jQuery v1.7 or later\n *\n * Examples at: http://malsup.com/jquery/block/\n * Copyright (c) 2007-2013 M. Alsup\n * Dual licensed under the MIT and GPL licenses:\n * http://www.opensource.org/licenses/mit-license.php\n * http://www.gnu.org/licenses/gpl.html\n *\n * Thanks to Amir-Hossein Sobhi for some excellent contributions!\n */\n\n;(function() {\n /*jshint eqeqeq:false curly:false latedef:false */\n \"use strict\";\n\n function setup($) {\n $.fn._fadeIn = $.fn.fadeIn;\n\n var noOp = $.noop || function() {};\n\n // this bit is to ensure we don't call setExpression when we shouldn't (with extra muscle to handle\n // confusing userAgent strings on Vista)\n var msie = /MSIE/.test(navigator.userAgent);\n var ie6 = /MSIE 6.0/.test(navigator.userAgent) && ! /MSIE 8.0/.test(navigator.userAgent);\n var mode = document.documentMode || 0;\n var setExpr = $.isFunction( document.createElement('div').style.setExpression );\n\n // global $ methods for blocking/unblocking the entire page\n $.blockUI = function(opts) { install(window, opts); };\n $.unblockUI = function(opts) { remove(window, opts); };\n\n // convenience method for quick growl-like notifications (http://www.google.com/search?q=growl)\n $.growlUI = function(title, message, timeout, onClose) {\n var $m = $('<div class=\"growlUI\"></div>');\n if (title) $m.append('<h1>'+title+'</h1>');\n if (message) $m.append('<h2>'+message+'</h2>');\n if (timeout === undefined) timeout = 3000;\n\n // Added by konapun: Set timeout to 30 seconds if this growl is moused over, like normal toast notifications\n var callBlock = function(opts) {\n opts = opts || {};\n\n $.blockUI({\n message: $m,\n fadeIn : typeof opts.fadeIn !== 'undefined' ? opts.fadeIn : 700,\n fadeOut: typeof opts.fadeOut !== 'undefined' ? opts.fadeOut : 1000,\n timeout: typeof opts.timeout !== 'undefined' ? opts.timeout : timeout,\n centerY: false,\n showOverlay: false,\n onUnblock: onClose,\n css: $.blockUI.defaults.growlCSS\n });\n };\n\n callBlock();\n var nonmousedOpacity = $m.css('opacity');\n $m.mouseover(function() {\n callBlock({\n fadeIn: 0,\n timeout: 30000\n });\n\n var displayBlock = $('.blockMsg');\n displayBlock.stop(); // cancel fadeout if it has started\n displayBlock.fadeTo(300, 1); // make it easier to read the message by removing transparency\n }).mouseout(function() {\n $('.blockMsg').fadeOut(1000);\n });\n // End konapun additions\n };\n\n // plugin method for blocking element content\n $.fn.block = function(opts) {\n if ( this[0] === window ) {\n $.blockUI( opts );\n return this;\n }\n var fullOpts = $.extend({}, $.blockUI.defaults, opts || {});\n this.each(function() {\n var $el = $(this);\n if (fullOpts.ignoreIfBlocked && $el.data('blockUI.isBlocked'))\n return;\n $el.unblock({ fadeOut: 0 });\n });\n\n return this.each(function() {\n if ($.css(this,'position') == 'static') {\n this.style.position = 'relative';\n $(this).data('blockUI.static', true);\n }\n this.style.zoom = 1; // force 'hasLayout' in ie\n install(this, opts);\n });\n };\n\n // plugin method for unblocking element content\n $.fn.unblock = function(opts) {\n if ( this[0] === window ) {\n $.unblockUI( opts );\n return this;\n }\n return this.each(function() {\n remove(this, opts);\n });\n };\n\n $.blockUI.version = 2.70; // 2nd generation blocking at no extra cost!\n\n // override these in your code to change the default behavior and style\n $.blockUI.defaults = {\n // message displayed when blocking (use null for no message)\n message: '<h1>Please wait...</h1>',\n\n title: null,\t\t// title string; only used when theme == true\n draggable: true,\t// only used when theme == true (requires jquery-ui.js to be loaded)\n\n theme: false, // set to true to use with jQuery UI themes\n\n // styles for the message when blocking; if you wish to disable\n // these and use an external stylesheet then do this in your code:\n // $.blockUI.defaults.css = {};\n css: {\n padding:\t0,\n margin:\t\t0,\n width:\t\t'30%',\n top:\t\t'40%',\n left:\t\t'35%',\n textAlign:\t'center',\n color:\t\t'#000',\n border:\t\t'3px solid #aaa',\n backgroundColor:'#fff',\n cursor:\t\t'wait'\n },\n\n // minimal style set used when themes are used\n themedCSS: {\n width:\t'30%',\n top:\t'40%',\n left:\t'35%'\n },\n\n // styles for the overlay\n overlayCSS: {\n backgroundColor:\t'#000',\n opacity:\t\t\t0.6,\n cursor:\t\t\t\t'wait'\n },\n\n // style to replace wait cursor before unblocking to correct issue\n // of lingering wait cursor\n cursorReset: 'default',\n\n // styles applied when using $.growlUI\n growlCSS: {\n width:\t\t'350px',\n top:\t\t'10px',\n left:\t\t'',\n right:\t\t'10px',\n border:\t\t'none',\n padding:\t'5px',\n opacity:\t0.6,\n cursor:\t\t'default',\n color:\t\t'#fff',\n backgroundColor: '#000',\n '-webkit-border-radius':'10px',\n '-moz-border-radius':\t'10px',\n 'border-radius':\t\t'10px'\n },\n\n // IE issues: 'about:blank' fails on HTTPS and javascript:false is s-l-o-w\n // (hat tip to Jorge H. N. de Vasconcelos)\n /*jshint scripturl:true */\n iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank',\n\n // force usage of iframe in non-IE browsers (handy for blocking applets)\n forceIframe: false,\n\n // z-index for the blocking overlay\n baseZ: 1000,\n\n // set these to true to have the message automatically centered\n centerX: true, // <-- only effects element blocking (page block controlled via css above)\n centerY: true,\n\n // allow body element to be stetched in ie6; this makes blocking look better\n // on \"short\" pages. disable if you wish to prevent changes to the body height\n allowBodyStretch: true,\n\n // enable if you want key and mouse events to be disabled for content that is blocked\n bindEvents: true,\n\n // be default blockUI will supress tab navigation from leaving blocking content\n // (if bindEvents is true)\n constrainTabKey: true,\n\n // fadeIn time in millis; set to 0 to disable fadeIn on block\n fadeIn: 200,\n\n // fadeOut time in millis; set to 0 to disable fadeOut on unblock\n fadeOut: 400,\n\n // time in millis to wait before auto-unblocking; set to 0 to disable auto-unblock\n timeout: 0,\n\n // disable if you don't want to show the overlay\n showOverlay: true,\n\n // if true, focus will be placed in the first available input field when\n // page blocking\n focusInput: true,\n\n // elements that can receive focus\n focusableElements: ':input:enabled:visible',\n\n // suppresses the use of overlay styles on FF/Linux (due to performance issues with opacity)\n // no longer needed in 2012\n // applyPlatformOpacityRules: true,\n\n // callback method invoked when fadeIn has completed and blocking message is visible\n onBlock: null,\n\n // callback method invoked when unblocking has completed; the callback is\n // passed the element that has been unblocked (which is the window object for page\n // blocks) and the options that were passed to the unblock call:\n //\tonUnblock(element, options)\n onUnblock: null,\n\n // callback method invoked when the overlay area is clicked.\n // setting this will turn the cursor to a pointer, otherwise cursor defined in overlayCss will be used.\n onOverlayClick: null,\n\n // don't ask; if you really must know: http://groups.google.com/group/jquery-en/browse_thread/thread/36640a8730503595/2f6a79a77a78e493#2f6a79a77a78e493\n quirksmodeOffsetHack: 4,\n\n // class name of the message block\n blockMsgClass: 'blockMsg',\n\n // if it is already blocked, then ignore it (don't unblock and reblock)\n ignoreIfBlocked: false\n };\n\n // private data and functions follow...\n\n var pageBlock = null;\n var pageBlockEls = [];\n\n function install(el, opts) {\n var css, themedCSS;\n var full = (el == window);\n var msg = (opts && opts.message !== undefined ? opts.message : undefined);\n opts = $.extend({}, $.blockUI.defaults, opts || {});\n\n if (opts.ignoreIfBlocked && $(el).data('blockUI.isBlocked'))\n return;\n\n opts.overlayCSS = $.extend({}, $.blockUI.defaults.overlayCSS, opts.overlayCSS || {});\n css = $.extend({}, $.blockUI.defaults.css, opts.css || {});\n if (opts.onOverlayClick)\n opts.overlayCSS.cursor = 'pointer';\n\n themedCSS = $.extend({}, $.blockUI.defaults.themedCSS, opts.themedCSS || {});\n msg = msg === undefined ? opts.message : msg;\n\n // remove the current block (if there is one)\n if (full && pageBlock)\n remove(window, {fadeOut:0});\n\n // if an existing element is being used as the blocking content then we capture\n // its current place in the DOM (and current display style) so we can restore\n // it when we unblock\n if (msg && typeof msg != 'string' && (msg.parentNode || msg.jquery)) {\n var node = msg.jquery ? msg[0] : msg;\n var data = {};\n $(el).data('blockUI.history', data);\n data.el = node;\n data.parent = node.parentNode;\n data.display = node.style.display;\n data.position = node.style.position;\n if (data.parent)\n data.parent.removeChild(node);\n }\n\n $(el).data('blockUI.onUnblock', opts.onUnblock);\n var z = opts.baseZ;\n\n // blockUI uses 3 layers for blocking, for simplicity they are all used on every platform;\n // layer1 is the iframe layer which is used to supress bleed through of underlying content\n // layer2 is the overlay layer which has opacity and a wait cursor (by default)\n // layer3 is the message content that is displayed while blocking\n var lyr1, lyr2, lyr3, s;\n if (msie || opts.forceIframe)\n lyr1 = $('<iframe class=\"blockUI\" style=\"z-index:'+ (z++) +';display:none;border:none;margin:0;padding:0;position:absolute;width:100%;height:100%;top:0;left:0\" src=\"'+opts.iframeSrc+'\"></iframe>');\n else\n lyr1 = $('<div class=\"blockUI\" style=\"display:none\"></div>');\n\n if (opts.theme)\n lyr2 = $('<div class=\"blockUI blockOverlay ui-widget-overlay\" style=\"z-index:'+ (z++) +';display:none\"></div>');\n else\n lyr2 = $('<div class=\"blockUI blockOverlay\" style=\"z-index:'+ (z++) +';display:none;border:none;margin:0;padding:0;width:100%;height:100%;top:0;left:0\"></div>');\n\n if (opts.theme && full) {\n s = '<div class=\"blockUI ' + opts.blockMsgClass + ' blockPage ui-dialog ui-widget ui-corner-all\" style=\"z-index:'+(z+10)+';display:none;position:fixed\">';\n if ( opts.title ) {\n s += '<div class=\"ui-widget-header ui-dialog-titlebar ui-corner-all blockTitle\">'+(opts.title || '&nbsp;')+'</div>';\n }\n s += '<div class=\"ui-widget-content ui-dialog-content\"></div>';\n s += '</div>';\n }\n else if (opts.theme) {\n s = '<div class=\"blockUI ' + opts.blockMsgClass + ' blockElement ui-dialog ui-widget ui-corner-all\" style=\"z-index:'+(z+10)+';display:none;position:absolute\">';\n if ( opts.title ) {\n s += '<div class=\"ui-widget-header ui-dialog-titlebar ui-corner-all blockTitle\">'+(opts.title || '&nbsp;')+'</div>';\n }\n s += '<div class=\"ui-widget-content ui-dialog-content\"></div>';\n s += '</div>';\n }\n else if (full) {\n s = '<div class=\"blockUI ' + opts.blockMsgClass + ' blockPage\" style=\"z-index:'+(z+10)+';display:none;position:fixed\"></div>';\n }\n else {\n s = '<div class=\"blockUI ' + opts.blockMsgClass + ' blockElement\" style=\"z-index:'+(z+10)+';display:none;position:absolute\"></div>';\n }\n lyr3 = $(s);\n\n // if we have a message, style it\n if (msg) {\n if (opts.theme) {\n lyr3.css(themedCSS);\n lyr3.addClass('ui-widget-content');\n }\n else\n lyr3.css(css);\n }\n\n // style the overlay\n if (!opts.theme /*&& (!opts.applyPlatformOpacityRules)*/)\n lyr2.css(opts.overlayCSS);\n lyr2.css('position', full ? 'fixed' : 'absolute');\n\n // make iframe layer transparent in IE\n if (msie || opts.forceIframe)\n lyr1.css('opacity',0.0);\n\n //$([lyr1[0],lyr2[0],lyr3[0]]).appendTo(full ? 'body' : el);\n var layers = [lyr1,lyr2,lyr3], $par = full ? $('body') : $(el);\n $.each(layers, function() {\n this.appendTo($par);\n });\n\n if (opts.theme && opts.draggable && $.fn.draggable) {\n lyr3.draggable({\n handle: '.ui-dialog-titlebar',\n cancel: 'li'\n });\n }\n\n // ie7 must use absolute positioning in quirks mode and to account for activex issues (when scrolling)\n var expr = setExpr && (!$.support.boxModel || $('object,embed', full ? null : el).length > 0);\n if (ie6 || expr) {\n // give body 100% height\n if (full && opts.allowBodyStretch && $.support.boxModel)\n $('html,body').css('height','100%');\n\n // fix ie6 issue when blocked element has a border width\n if ((ie6 || !$.support.boxModel) && !full) {\n var t = sz(el,'borderTopWidth'), l = sz(el,'borderLeftWidth');\n var fixT = t ? '(0 - '+t+')' : 0;\n var fixL = l ? '(0 - '+l+')' : 0;\n }\n\n // simulate fixed position\n $.each(layers, function(i,o) {\n var s = o[0].style;\n s.position = 'absolute';\n if (i < 2) {\n if (full)\n s.setExpression('height','Math.max(document.body.scrollHeight, document.body.offsetHeight) - (jQuery.support.boxModel?0:'+opts.quirksmodeOffsetHack+') + \"px\"');\n else\n s.setExpression('height','this.parentNode.offsetHeight + \"px\"');\n if (full)\n s.setExpression('width','jQuery.support.boxModel && document.documentElement.clientWidth || document.body.clientWidth + \"px\"');\n else\n s.setExpression('width','this.parentNode.offsetWidth + \"px\"');\n if (fixL) s.setExpression('left', fixL);\n if (fixT) s.setExpression('top', fixT);\n }\n else if (opts.centerY) {\n if (full) s.setExpression('top','(document.documentElement.clientHeight || document.body.clientHeight) / 2 - (this.offsetHeight / 2) + (blah = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + \"px\"');\n s.marginTop = 0;\n }\n else if (!opts.centerY && full) {\n var top = (opts.css && opts.css.top) ? parseInt(opts.css.top, 10) : 0;\n var expression = '((document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + '+top+') + \"px\"';\n s.setExpression('top',expression);\n }\n });\n }\n\n // show the message\n if (msg) {\n if (opts.theme)\n lyr3.find('.ui-widget-content').append(msg);\n else\n lyr3.append(msg);\n if (msg.jquery || msg.nodeType)\n $(msg).show();\n }\n\n if ((msie || opts.forceIframe) && opts.showOverlay)\n lyr1.show(); // opacity is zero\n if (opts.fadeIn) {\n var cb = opts.onBlock ? opts.onBlock : noOp;\n var cb1 = (opts.showOverlay && !msg) ? cb : noOp;\n var cb2 = msg ? cb : noOp;\n if (opts.showOverlay)\n lyr2._fadeIn(opts.fadeIn, cb1);\n if (msg)\n lyr3._fadeIn(opts.fadeIn, cb2);\n }\n else {\n if (opts.showOverlay)\n lyr2.show();\n if (msg)\n lyr3.show();\n if (opts.onBlock)\n opts.onBlock.bind(lyr3)();\n }\n\n // bind key and mouse events\n bind(1, el, opts);\n\n if (full) {\n pageBlock = lyr3[0];\n pageBlockEls = $(opts.focusableElements,pageBlock);\n if (opts.focusInput)\n setTimeout(focus, 20);\n }\n else\n center(lyr3[0], opts.centerX, opts.centerY);\n\n if (opts.timeout) {\n // auto-unblock\n var to = setTimeout(function() {\n if (full)\n $.unblockUI(opts);\n else\n $(el).unblock(opts);\n }, opts.timeout);\n $(el).data('blockUI.timeout', to);\n }\n }\n\n // remove the block\n function remove(el, opts) {\n var count;\n var full = (el == window);\n var $el = $(el);\n var data = $el.data('blockUI.history');\n var to = $el.data('blockUI.timeout');\n if (to) {\n clearTimeout(to);\n $el.removeData('blockUI.timeout');\n }\n opts = $.extend({}, $.blockUI.defaults, opts || {});\n bind(0, el, opts); // unbind events\n\n if (opts.onUnblock === null) {\n opts.onUnblock = $el.data('blockUI.onUnblock');\n $el.removeData('blockUI.onUnblock');\n }\n\n var els;\n if (full) // crazy selector to handle odd field errors in ie6/7\n els = $('body').children().filter('.blockUI').add('body > .blockUI');\n else\n els = $el.find('>.blockUI');\n\n // fix cursor issue\n if ( opts.cursorReset ) {\n if ( els.length > 1 )\n els[1].style.cursor = opts.cursorReset;\n if ( els.length > 2 )\n els[2].style.cursor = opts.cursorReset;\n }\n\n if (full)\n pageBlock = pageBlockEls = null;\n\n if (opts.fadeOut) {\n count = els.length;\n els.stop().fadeOut(opts.fadeOut, function() {\n if ( --count === 0)\n reset(els,data,opts,el);\n });\n }\n else\n reset(els, data, opts, el);\n }\n\n // move blocking element back into the DOM where it started\n function reset(els,data,opts,el) {\n var $el = $(el);\n if ( $el.data('blockUI.isBlocked') )\n return;\n\n els.each(function(i,o) {\n // remove via DOM calls so we don't lose event handlers\n if (this.parentNode)\n this.parentNode.removeChild(this);\n });\n\n if (data && data.el) {\n data.el.style.display = data.display;\n data.el.style.position = data.position;\n data.el.style.cursor = 'default'; // #59\n if (data.parent)\n data.parent.appendChild(data.el);\n $el.removeData('blockUI.history');\n }\n\n if ($el.data('blockUI.static')) {\n $el.css('position', 'static'); // #22\n }\n\n if (typeof opts.onUnblock == 'function')\n opts.onUnblock(el,opts);\n\n // fix issue in Safari 6 where block artifacts remain until reflow\n var body = $(document.body), w = body.width(), cssW = body[0].style.width;\n body.width(w-1).width(w);\n body[0].style.width = cssW;\n }\n\n // bind/unbind the handler\n function bind(b, el, opts) {\n var full = el == window, $el = $(el);\n\n // don't bother unbinding if there is nothing to unbind\n if (!b && (full && !pageBlock || !full && !$el.data('blockUI.isBlocked')))\n return;\n\n $el.data('blockUI.isBlocked', b);\n\n // don't bind events when overlay is not in use or if bindEvents is false\n if (!full || !opts.bindEvents || (b && !opts.showOverlay))\n return;\n\n // bind anchors and inputs for mouse and key events\n var events = 'mousedown mouseup keydown keypress keyup touchstart touchend touchmove';\n if (b)\n $(document).bind(events, opts, handler);\n else\n $(document).unbind(events, handler);\n\n // former impl...\n //\t\tvar $e = $('a,:input');\n //\t\tb ? $e.bind(events, opts, handler) : $e.unbind(events, handler);\n }\n\n // event handler to suppress keyboard/mouse events when blocking\n function handler(e) {\n // allow tab navigation (conditionally)\n if (e.type === 'keydown' && e.keyCode && e.keyCode == 9) {\n if (pageBlock && e.data.constrainTabKey) {\n var els = pageBlockEls;\n var fwd = !e.shiftKey && e.target === els[els.length-1];\n var back = e.shiftKey && e.target === els[0];\n if (fwd || back) {\n setTimeout(function(){focus(back);},10);\n return false;\n }\n }\n }\n var opts = e.data;\n var target = $(e.target);\n if (target.hasClass('blockOverlay') && opts.onOverlayClick)\n opts.onOverlayClick(e);\n\n // allow events within the message content\n if (target.parents('div.' + opts.blockMsgClass).length > 0)\n return true;\n\n // allow events for content that is not being blocked\n return target.parents().children().filter('div.blockUI').length === 0;\n }\n\n function focus(back) {\n if (!pageBlockEls)\n return;\n var e = pageBlockEls[back===true ? pageBlockEls.length-1 : 0];\n if (e)\n e.focus();\n }\n\n function center(el, x, y) {\n var p = el.parentNode, s = el.style;\n var l = ((p.offsetWidth - el.offsetWidth)/2) - sz(p,'borderLeftWidth');\n var t = ((p.offsetHeight - el.offsetHeight)/2) - sz(p,'borderTopWidth');\n if (x) s.left = l > 0 ? (l+'px') : '0';\n if (y) s.top = t > 0 ? (t+'px') : '0';\n }\n\n function sz(el, p) {\n return parseInt($.css(el,p),10)||0;\n }\n\n }\n\n\n /*global define:true */\n if (typeof define === 'function' && define.amd && define.amd.jQuery) {\n define(['jquery'], setup);\n } else {\n setup(jQuery);\n }\n\n})();","/*!\n * jQuery Cookie Plugin v1.4.1\n * https://github.com/carhartl/jquery-cookie\n *\n * Copyright 2006, 2014 Klaus Hartl\n * Released under the MIT license\n */\n(function (factory) {\n if (typeof define === 'function' && define.amd) {\n // AMD (Register as an anonymous module)\n define(['jquery'], factory);\n } else if (typeof exports === 'object') {\n // Node/CommonJS\n module.exports = factory(require('jquery'));\n } else {\n // Browser globals\n factory(jQuery);\n }\n}(function ($) {\n\n var pluses = /\\+/g;\n\n function encode(s) {\n return config.raw ? s : encodeURIComponent(s);\n }\n\n function decode(s) {\n return config.raw ? s : decodeURIComponent(s);\n }\n\n function stringifyCookieValue(value) {\n return encode(config.json ? JSON.stringify(value) : String(value));\n }\n\n function parseCookieValue(s) {\n if (s.indexOf('\"') === 0) {\n // This is a quoted cookie as according to RFC2068, unescape...\n s = s.slice(1, -1).replace(/\\\\\"/g, '\"').replace(/\\\\\\\\/g, '\\\\');\n }\n\n try {\n // Replace server-side written pluses with spaces.\n // If we can't decode the cookie, ignore it, it's unusable.\n // If we can't parse the cookie, ignore it, it's unusable.\n s = decodeURIComponent(s.replace(pluses, ' '));\n return config.json ? JSON.parse(s) : s;\n } catch(e) {}\n }\n\n function read(s, converter) {\n var value = config.raw ? s : parseCookieValue(s);\n return $.isFunction(converter) ? converter(value) : value;\n }\n\n var config = $.cookie = function (key, value, options) {\n\n // Write\n\n if (arguments.length > 1 && !$.isFunction(value)) {\n options = $.extend({}, config.defaults, options);\n\n if (typeof options.expires === 'number') {\n var days = options.expires, t = options.expires = new Date();\n t.setMilliseconds(t.getMilliseconds() + days * 864e+5);\n }\n\n return (document.cookie = [\n encode(key), '=', stringifyCookieValue(value),\n options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE\n options.path ? '; path=' + options.path : '',\n options.domain ? '; domain=' + options.domain : '',\n options.secure ? '; secure' : ''\n ].join(''));\n }\n\n // Read\n\n var result = key ? undefined : {},\n // To prevent the for loop in the first place assign an empty array\n // in case there are no cookies at all. Also prevents odd result when\n // calling $.cookie().\n cookies = document.cookie ? document.cookie.split('; ') : [],\n i = 0,\n l = cookies.length;\n\n for (; i < l; i++) {\n var parts = cookies[i].split('='),\n name = decode(parts.shift()),\n cookie = parts.join('=');\n\n if (key === name) {\n // If second argument (value) is a function it's a converter...\n result = read(cookie, value);\n break;\n }\n\n // Prevent storing a cookie that we couldn't decode.\n if (!key && (cookie = read(cookie)) !== undefined) {\n result[name] = cookie;\n }\n }\n\n return result;\n };\n\n config.defaults = {};\n\n $.removeCookie = function (key, options) {\n // Must not alter options, thus extending a fresh object...\n $.cookie(key, '', $.extend({}, options, { expires: -1 }));\n return !$.cookie(key);\n };\n\n}));","'use strict';\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(function () {\n 'use strict';\n\n // root of function\n\n var root = this,\n win = this,\n doc = win ? win.document : null,\n docElem = win ? win.document.documentElement : null,\n reIsJson = /^([\"'](\\\\.|[^\"\\\\\\n\\r])*?[\"']|[,:{}\\[\\]0-9.\\-+Eaeflnr-u \\n\\r\\t])+?$/,\n reMs = /^-ms-/,\n reSnakeCase = /[\\-_]([\\da-z])/gi,\n reCamelCase = /([A-Z])/g,\n reDot = /\\./,\n reInt = /[-|+]?[\\D]/gi,\n reNotNum = /\\D/gi,\n reMoneySplit = new RegExp('([0-9])([0-9][0-9][0-9][,.])'),\n reAmp = /&/g,\n reEq = /=/,\n reClassNameSplit = /[ ]+/g,\n\n\n /** @namespace {Object} ax5 */\n ax5 = {},\n info = void 0,\n U = void 0,\n dom = void 0;\n\n /**\n * guid\n * @member {Number} ax5.guid\n */\n ax5.guid = 1;\n /**\n * ax5.guid를 구하고 증가시킵니다.\n * @method ax5.getGuid\n * @returns {Number} guid\n */\n ax5.getGuid = function () {\n return ax5.guid++;\n };\n\n /**\n * 상수모음\n * @namespace ax5.info\n */\n ax5.info = info = function () {\n var _arguments = arguments;\n\n /**\n * ax5 version\n * @member {String} ax5.info.version\n */\n var version = \"1.4.126\";\n\n /**\n * ax5 library path\n * @member {String} ax5.info.baseUrl\n */\n var baseUrl = \"\";\n\n /**\n * ax5 에러 출력메세지 사용자 재 정의\n * @member {Object} ax5.info.onerror\n * @examples\n * ```\n * ax5.info.onerror = function(){\n * console.log(arguments);\n * }\n * ```\n */\n var onerror = function onerror() {\n console.error(U.toArray(_arguments).join(\":\"));\n };\n\n /**\n * event keyCodes\n * @member {Object} ax5.info.eventKeys\n * @example\n * ```\n * {\n * \tBACKSPACE: 8, TAB: 9,\n * \tRETURN: 13, ESC: 27, LEFT: 37, UP: 38, RIGHT: 39, DOWN: 40, DELETE: 46,\n * \tHOME: 36, END: 35, PAGEUP: 33, PAGEDOWN: 34, INSERT: 45, SPACE: 32\n * }\n * ```\n */\n var eventKeys = {\n BACKSPACE: 8, TAB: 9,\n RETURN: 13, ESC: 27, LEFT: 37, UP: 38, RIGHT: 39, DOWN: 40, DELETE: 46,\n HOME: 36, END: 35, PAGEUP: 33, PAGEDOWN: 34, INSERT: 45, SPACE: 32\n };\n\n /**\n * week names\n * @member {Object[]} weekNames\n * @member {string} weekNames[].label\n *\n * @example\n * ```\n * [\n * {label: \"SUN\"},{label: \"MON\"},{label: \"TUE\"},{label: \"WED\"},{label: \"THU\"},{label: \"FRI\"},{label: \"SAT\"}\n * ]\n * console.log( weekNames[0] );\n * console.log( ax5.info.weekNames[(new Date()).getDay()].label )\n * ```\n */\n var weekNames = [{ label: \"SUN\" }, { label: \"MON\" }, { label: \"TUE\" }, { label: \"WED\" }, { label: \"THU\" }, { label: \"FRI\" }, { label: \"SAT\" }];\n\n /**\n * 사용자 브라우저 식별용 오브젝트\n * @member {Object} ax5.info.browser\n * @example\n * ```\n * console.log( ax5.info.browser );\n * //Object {name: \"chrome\", version: \"39.0.2171.71\", mobile: false}\n * ```\n */\n var browser = function (ua, mobile, browserName, match, browser, browserVersion) {\n if (!win || !win.navigator) return {};\n\n ua = navigator.userAgent.toLowerCase(), mobile = ua.search(/mobile/g) != -1, browserName, match, browser, browserVersion;\n\n if (ua.search(/iphone/g) != -1) {\n return { name: \"iphone\", version: 0, mobile: true };\n } else if (ua.search(/ipad/g) != -1) {\n return { name: \"ipad\", version: 0, mobile: true };\n } else if (ua.search(/android/g) != -1) {\n match = /(android)[ \\/]([\\w.]+)/.exec(ua) || [];\n browserVersion = match[2] || \"0\";\n return { name: \"android\", version: browserVersion, mobile: mobile };\n } else {\n browserName = \"\";\n match = /(opr)[ \\/]([\\w.]+)/.exec(ua) || /(chrome)[ \\/]([\\w.]+)/.exec(ua) || /(webkit)[ \\/]([\\w.]+)/.exec(ua) || /(msie) ([\\w.]+)/.exec(ua) || ua.indexOf(\"compatible\") < 0 && /(mozilla)(?:.*? rv:([\\w.]+)|)/.exec(ua) || [];\n browser = match[1] || \"\";\n browserVersion = match[2] || \"0\";\n\n if (browser == \"msie\") browser = \"ie\";\n return {\n name: browser,\n version: browserVersion,\n mobile: mobile\n };\n }\n ua = null, mobile = null, browserName = null, match = null, browser = null, browserVersion = null;\n }();\n\n /**\n * 브라우저 여부\n * @member {Boolean} ax5.info.isBrowser\n */\n var isBrowser = !!(typeof window !== 'undefined' && typeof navigator !== 'undefined' && win.document);\n\n /**\n * 브라우저에 따른 마우스 휠 이벤트이름\n * @member {Object} ax5.info.wheelEnm\n */\n var wheelEnm = win && /Firefox/i.test(navigator.userAgent) ? \"DOMMouseScroll\" : \"mousewheel\";\n\n /**\n * 첫번째 자리수 동사 - (필요한것이 없을때 : 4, 실행오류 : 5)\n * 두번째 자리수 목적어 - 문자열 0, 숫자 1, 배열 2, 오브젝트 3, 함수 4, DOM 5, 파일 6, 기타 7\n * 세번째 자리수 옵션\n * @member {Object} ax5.info.errorMsg\n */\n var errorMsg = {};\n\n /**\n * 현재 페이지의 Url 정보를 리턴합니다.\n * @method ax5.info.urlUtil\n * @returns {Object}\n * @example\n * ```\n * console.log( ax5.util.toJson( ax5.info.urlUtil() ) );\n * {\n *\t\"baseUrl\": \"http://ax5:2018\",\n *\t\"href\": \"http://ax5:2018/samples/index.html?a=1&b=1#abc\",\n *\t\"param\": \"a=1&b=1\",\n *\t\"referrer\": \"\",\n *\t\"pathname\": \"/samples/index.html\",\n *\t\"hostname\": \"ax5\",\n *\t\"port\": \"2018\",\n *\t\"url\": \"http://ax5:2018/samples/index.html\",\n *\t\"hashdata\": \"abc\"\n * }\n * ```\n */\n function urlUtil(url, urls) {\n url = {\n href: win.location.href,\n param: win.location.search,\n referrer: doc.referrer,\n pathname: win.location.pathname,\n hostname: win.location.hostname,\n port: win.location.port\n }, urls = url.href.split(/[\\?#]/);\n url.param = url.param.replace(\"?\", \"\");\n url.url = urls[0];\n if (url.href.search(\"#\") > -1) {\n url.hashdata = U.last(urls);\n }\n urls = null;\n url.baseUrl = U.left(url.href, \"?\").replace(url.pathname, \"\");\n return url;\n }\n\n /**\n * ax5-error-msg.js 에 정의된 ax5 error를 반환합니다.\n * @method ax5.info.getError\n * @returns {Object}\n * @example\n * ```\n * console.log( ax5.info.getError(\"single-uploader\", \"460\", \"upload\") );\n *\n * if(!this.selectedFile){\n * if (cfg.onEvent) {\n * \tvar that = {\n * \t\taction: \"error\",\n * \t\terror: ax5.info.getError(\"single-uploader\", \"460\", \"upload\")\n * \t};\n * \tcfg.onEvent.call(that, that);\n * }\n * return this;\n * }\n * ```\n */\n function getError(className, errorCode, methodName) {\n if (info.errorMsg && info.errorMsg[className]) {\n return {\n className: className,\n errorCode: errorCode,\n methodName: methodName,\n msg: info.errorMsg[className][errorCode]\n };\n } else {\n return { className: className, errorCode: errorCode, methodName: methodName };\n }\n }\n\n /**\n * 브라우져의 터치 기능 유무를 확인합니다.\n * @method ax5.info.supportTouch\n * @returns {boolean}\n * @example\n * ```\n * var chkFlag = ax5.info.supportTouch;\n */\n var supportTouch = win ? 'ontouchstart' in win || navigator.maxTouchPoints > 0 || navigator.msMaxTouchPoints > 0 : false;\n\n var supportFileApi = win ? win.FileReader && win.File && win.FileList && win.Blob : false;\n\n return {\n errorMsg: errorMsg,\n version: version,\n baseUrl: baseUrl,\n onerror: onerror,\n eventKeys: eventKeys,\n weekNames: weekNames,\n browser: browser,\n isBrowser: isBrowser,\n supportTouch: supportTouch,\n supportFileApi: supportFileApi,\n wheelEnm: wheelEnm,\n urlUtil: urlUtil,\n getError: getError\n };\n }();\n\n /**\n * Refer to this by {@link ax5}.\n * @namespace ax5.util\n */\n ax5['util'] = U = function () {\n var _toString = Object.prototype.toString;\n\n /**\n * Object나 Array의 아이템으로 사용자 함수를 호출합니다.\n * @method ax5.util.each\n * @param {Object|Array} O\n * @param {Function} _fn\n * @example\n * ```js\n * var axf = ax5.util;\n * axf.each([0,1,2], function(){\n * \t// with this\n * });\n * axf.each({a:1, b:2}, function(){\n * \t// with this\n * });\n * ```\n */\n function each(O, _fn) {\n if (isNothing(O)) return [];\n var key = void 0,\n i = 0,\n l = O.length,\n isObj = l === undefined || typeof O === \"function\";\n if (isObj) {\n for (key in O) {\n if (typeof O[key] != \"undefined\") if (_fn.call(O[key], key, O[key]) === false) break;\n }\n } else {\n for (; i < l;) {\n if (typeof O[i] != \"undefined\") if (_fn.call(O[i], i, O[i++]) === false) break;\n }\n }\n return O;\n }\n\n // In addition to using the http://underscorejs.org : map, reduce, reduceRight, find\n /**\n * 원본 아이템들을 이용하여 사용자 함수의 리턴값으로 이루어진 새로운 배열을 만듭니다.\n * @method ax5.util.map\n * @param {Object|Array} O\n * @param {Function} _fn\n * @returns {Array}\n * @example\n * ```js\n * var myArray = [0,1,2,3,4];\n * var myObject = {a:1, b:\"2\", c:{axj:\"what\", arrs:[0,2,\"3\"]},\n * fn: function(abcdd){\n * return abcdd;\n * }\n * };\n *\n * var _arr = ax5.util.map( myArray, function(index, I){\n * return index+1;\n * });\n * console.log(_arr);\n * // [1, 2, 3, 4, 5]\n *\n * var _arr = ax5.util.map( myObject, function(k, v){\n * return v * 2;\n * });\n * console.log(_arr);\n * // [2, 4, NaN, NaN]\n * ```\n */\n function map(O, _fn) {\n if (isNothing(O)) return [];\n var key = void 0,\n i = 0,\n l = O.length,\n results = [],\n fnResult = void 0;\n if (isObject(O)) {\n for (key in O) {\n if (typeof O[key] != \"undefined\") {\n fnResult = undefined;\n if ((fnResult = _fn.call(O[key], key, O[key])) === false) break;else results.push(fnResult);\n }\n }\n } else {\n for (; i < l;) {\n if (typeof O[i] != \"undefined\") {\n fnResult = undefined;\n if ((fnResult = _fn.call(O[i], i, O[i++])) === false) break;else results.push(fnResult);\n }\n }\n }\n return results;\n }\n\n /**\n * 원본 아이템들을 이용하여 사용자 함수의 리턴값이 참인 아이템의 위치나 키값을 반환합니다.\n * @method ax5.util.search\n * @param {Object|Array} O\n * @param {Function|String|Number} _fn - 함수 또는 값\n * @returns {Number|String}\n * @example\n * ```js\n * var myArray = [0,1,2,3,4,5,6];\n * var myObject = {a:\"123\",\"b\":\"123\",c:123};\n *\n * ax5.util.search(myArray, function(){\n * return this > 3;\n * });\n * // 4\n * ax5.util.search(myObject, function(k, v){\n * return v === 123;\n * });\n * // \"c\"\n * ax5.util.search([1,2,3,4], 3);\n * // 2\n * ax5.util.search([1,2], 4);\n * // -1\n * ax5.util.search([\"name\",\"value\"], \"value\");\n * // 1\n * ax5.util.search([\"name\",\"value\"], \"values\");\n * // -1\n * ax5.util.search({k1:\"name\",k2:\"value\"}, \"value2\");\n * // -1\n * ax5.util.search({k1:\"name\",k2:\"value\"}, \"value\");\n * // \"k2\"\n * ```\n */\n function search(O, _fn) {\n if (isNothing(O)) return -1;\n if (isObject(O)) {\n for (var key in O) {\n if (typeof O[key] != \"undefined\" && isFunction(_fn) && _fn.call(O[key], key, O[key])) {\n return key;\n break;\n } else if (O[key] == _fn) {\n return key;\n break;\n }\n }\n } else {\n for (var i = 0, l = O.length; i < l; i++) {\n if (typeof O[i] != \"undefined\" && isFunction(_fn) && _fn.call(O[i], i, O[i])) {\n return i;\n break;\n } else if (O[i] == _fn) {\n return i;\n break;\n }\n }\n }\n return -1;\n }\n\n /**\n * @method ax5.util.sum\n * @param {Array|Object} O\n * @param {Number} [defaultValue]\n * @param {Function} _fn\n * @returns {Number}\n * @example\n * ```js\n * var arr = [\n * {name: \"122\", value: 9},\n * {name: \"122\", value: 10},\n * {name: \"123\", value: 11}\n * ];\n *\n * var rs = ax5.util.sum(arr, function () {\n * if(this.name == \"122\") {\n * return this.value;\n * }\n * });\n * console.log(rs); // 19\n *\n * console.log(ax5.util.sum(arr, 10, function () {\n * return this.value;\n * }));\n * // 40\n * ```\n */\n function sum(O, defaultValue, _fn) {\n var i = void 0,\n l = void 0,\n tokenValue = void 0;\n if (isFunction(defaultValue) && typeof _fn === \"undefined\") {\n _fn = defaultValue;\n defaultValue = 0;\n }\n if (typeof defaultValue === \"undefined\") defaultValue = 0;\n\n if (isArray(O)) {\n i = 0;\n l = O.length;\n for (; i < l; i++) {\n if (typeof O[i] !== \"undefined\") {\n if ((tokenValue = _fn.call(O[i], O[i])) === false) break;else if (typeof tokenValue !== \"undefined\") defaultValue += tokenValue;\n }\n }\n return defaultValue;\n } else if (isObject(O)) {\n for (i in O) {\n if (typeof O[i] != \"undefined\") {\n if ((tokenValue = _fn.call(O[i], O[i])) === false) break;else if (typeof tokenValue !== \"undefined\") defaultValue += tokenValue;\n }\n }\n return defaultValue;\n } else {\n console.error(\"argument error : ax5.util.sum - use Array or Object\");\n return defaultValue;\n }\n }\n\n /**\n * @method ax5.util.avg\n * @param {Array|Object} O\n * @param {Number} [defaultValue]\n * @param {Function} _fn\n * @returns {Number}\n * @example\n * ```js\n * var arr = [\n * {name: \"122\", value: 9},\n * {name: \"122\", value: 10},\n * {name: \"123\", value: 11}\n * ];\n *\n * var rs = ax5.util.avg(arr, function () {\n * return this.value;\n * });\n *\n * console.log(rs); // 10\n * ```\n */\n function avg(O, defaultValue, _fn) {\n var i = void 0,\n l = void 0,\n tokenValue = void 0;\n if (isFunction(defaultValue) && typeof _fn === \"undefined\") {\n _fn = defaultValue;\n defaultValue = 0;\n }\n if (typeof defaultValue === \"undefined\") defaultValue = 0;\n\n if (isArray(O)) {\n i = 0;\n l = O.length;\n for (; i < l; i++) {\n if (typeof O[i] !== \"undefined\") {\n if ((tokenValue = _fn.call(O[i], O[i])) === false) break;else if (typeof tokenValue !== \"undefined\") defaultValue += tokenValue;\n }\n }\n return defaultValue / l;\n } else if (isObject(O)) {\n l = 0;\n for (i in O) {\n if (typeof O[i] != \"undefined\") {\n if ((tokenValue = _fn.call(O[i], O[i])) === false) break;else if (typeof tokenValue !== \"undefined\") defaultValue += tokenValue;++l;\n }\n }\n return defaultValue / l;\n } else {\n console.error(\"argument error : ax5.util.sum - use Array or Object\");\n return defaultValue;\n }\n }\n\n /**\n * 배열의 왼쪽에서 오른쪽으로 연산을 진행하는데 수행한 결과가 왼쪽 값으로 반영되어 최종 왼쪽 값을 반환합니다.\n * @method ax5.util.reduce\n * @param {Array|Object} O\n * @param {Function} _fn\n * @returns {Alltypes}\n * @example\n * ```js\n * var aarray = [5,4,3,2,1];\n * result = ax5.util.reduce( aarray, function(p, n){\n * return p * n;\n * });\n * console.log(result, aarray);\n * // 120 [5, 4, 3, 2, 1]\n *\n * ax5.util.reduce({a:1, b:2}, function(p, n){\n * return parseInt(p|0) + parseInt(n);\n * });\n * // 3\n * ```\n */\n function reduce(O, _fn) {\n var i, l, tokenItem;\n if (isArray(O)) {\n i = 0, l = O.length, tokenItem = O[i];\n for (; i < l - 1;) {\n if (typeof O[i] != \"undefined\") {\n if ((tokenItem = _fn.call(root, tokenItem, O[++i])) === false) break;\n }\n }\n return tokenItem;\n } else if (isObject(O)) {\n for (i in O) {\n if (typeof O[i] != \"undefined\") {\n if ((tokenItem = _fn.call(root, tokenItem, O[i])) === false) break;\n }\n }\n return tokenItem;\n } else {\n console.error(\"argument error : ax5.util.reduce - use Array or Object\");\n return null;\n }\n }\n\n /**\n * 배열의 오른쪽에서 왼쪽으로 연산을 진행하는데 수행한 결과가 오른쪽 값으로 반영되어 최종 오른쪽 값을 반환합니다.\n * @method ax5.util.reduceRight\n * @param {Array} O\n * @param {Function} _fn\n * @returns {Alltypes}\n * @example\n * ```js\n * var aarray = [5,4,3,2,1];\n * result = ax5.util.reduceRight( aarray, function(p, n){\n * console.log( n );\n * return p * n;\n * });\n * console.log(result, aarray);\n * 120 [5, 4, 3, 2, 1]\n * ```\n */\n function reduceRight(O, _fn) {\n var i = O.length - 1,\n tokenItem = O[i];\n for (; i > 0;) {\n if (typeof O[i] != \"undefined\") {\n if ((tokenItem = _fn.call(root, tokenItem, O[--i])) === false) break;\n }\n }\n return tokenItem;\n }\n\n /**\n * 배열또는 오브젝트의 각 아이템을 인자로 하는 사용자 함수의 결과가 참인 아이템들의 배열을 반환합니다.\n * @method ax5.util.filter\n * @param {Object|Array} O\n * @param {Function} _fn\n * @returns {Array}\n * @example\n * ```js\n * var aarray = [5,4,3,2,1];\n * result = ax5.util.filter( aarray, function(){\n * return this % 2;\n * });\n * console.log(result);\n * // [5, 3, 1]\n *\n * var filObject = {a:1, s:\"string\", oa:{pickup:true, name:\"AXISJ\"}, os:{pickup:true, name:\"AX5\"}};\n * result = ax5.util.filter( filObject, function(){\n * \treturn this.pickup;\n * });\n * console.log( ax5.util.toJson(result) );\n * // [{\"pickup\": , \"name\": \"AXISJ\"}, {\"pickup\": , \"name\": \"AX5\"}]\n * ```\n */\n function filter(O, _fn) {\n if (isNothing(O)) return [];\n var k,\n i = 0,\n l = O.length,\n results = [],\n fnResult;\n if (isObject(O)) {\n for (k in O) {\n if (typeof O[k] != \"undefined\") {\n if (fnResult = _fn.call(O[k], k, O[k])) results.push(O[k]);\n }\n }\n } else {\n for (; i < l;) {\n if (typeof O[i] != \"undefined\") {\n if (fnResult = _fn.call(O[i], i, O[i])) results.push(O[i]);\n i++;\n }\n }\n }\n return results;\n }\n\n /**\n * Object를 JSONString 으로 반환합니다.\n * @method ax5.util.toJson\n * @param {Object|Array} O\n * @returns {String} JSON\n * @example\n * ```js\n * var ax = ax5.util;\n * var myObject = {\n * a:1, b:\"2\", c:{axj:\"what\", arrs:[0,2,\"3\"]},\n * fn: function(abcdd){\n * return abcdd;\n * }\n * };\n * console.log( ax.toJson(myObject) );\n * ```\n */\n function toJson(O) {\n var jsonString = \"\";\n if (ax5.util.isArray(O)) {\n var i = 0,\n l = O.length;\n jsonString += \"[\";\n for (; i < l; i++) {\n if (i > 0) jsonString += \",\";\n jsonString += toJson(O[i]);\n }\n jsonString += \"]\";\n } else if (ax5.util.isObject(O)) {\n jsonString += \"{\";\n var jsonObjectBody = [];\n each(O, function (key, value) {\n jsonObjectBody.push('\"' + key + '\": ' + toJson(value));\n });\n jsonString += jsonObjectBody.join(\", \");\n jsonString += \"}\";\n } else if (ax5.util.isString(O)) {\n jsonString = '\"' + O + '\"';\n } else if (ax5.util.isNumber(O)) {\n jsonString = O;\n } else if (ax5.util.isUndefined(O)) {\n jsonString = \"undefined\";\n } else if (ax5.util.isFunction(O)) {\n jsonString = '\"{Function}\"';\n } else {\n jsonString = O;\n }\n return jsonString;\n }\n\n /**\n * 관용의 JSON Parser\n * @method ax5.util.parseJson\n * @param {String} JSONString\n * @param {Boolean} [force] - 강제 적용 여부 (json 문자열 검사를 무시하고 오브젝트 변환을 시도합니다.)\n * @returns {Object}\n * @example\n * ```\n * console.log(ax5.util.parseJson('{\"a\":1}'));\n * // Object {a: 1}\n * console.log(ax5.util.parseJson(\"{'a':1, 'b':'b'}\"));\n * // Object {a: 1, b: \"b\"}\n * console.log(ax5.util.parseJson(\"{'a':1, 'b':function(){return 1;}}\", true));\n * // Object {a: 1, b: function}\n * console.log(ax5.util.parseJson(\"{a:1}\"));\n * // Object {a: 1}\n * console.log(ax5.util.parseJson(\"[1,2,3]\"));\n * // [1, 2, 3]\n * console.log(ax5.util.parseJson(\"['1','2','3']\"));\n * // [\"1\", \"2\", \"3\"]\n * console.log(ax5.util.parseJson(\"[{'a':'99'},'2','3']\"));\n * // [Object, \"2\", \"3\"]\n * ```\n */\n function parseJson(str, force) {\n if (force || reIsJson.test(str)) {\n try {\n return new Function('', 'return ' + str)();\n } catch (e) {\n return { error: 500, msg: 'syntax error' };\n }\n } else {\n return { error: 500, msg: 'syntax error' };\n }\n }\n\n /**\n * 인자의 타입을 반환합니다.\n * @method ax5.util.getType\n * @param {Object|Array|String|Number|Element|Etc} O\n * @returns {String} window|element|object|array|function|string|number|undefined|nodelist\n * @example\n * ```js\n * var axf = ax5.util;\n * var a = 11;\n * var b = \"11\";\n * console.log( axf.getType(a) );\n * console.log( axf.getType(b) );\n * ```\n */\n function getType(O) {\n var typeName;\n if (O != null && O == O.window) {\n typeName = \"window\";\n } else if (!!(O && O.nodeType == 1)) {\n typeName = \"element\";\n } else if (!!(O && O.nodeType == 11)) {\n typeName = \"fragment\";\n } else if (O === null) {\n typeName = \"null\";\n } else if (typeof O === \"undefined\") {\n typeName = \"undefined\";\n } else if (_toString.call(O) == \"[object Object]\") {\n typeName = \"object\";\n } else if (_toString.call(O) == \"[object Array]\") {\n typeName = \"array\";\n } else if (_toString.call(O) == \"[object String]\") {\n typeName = \"string\";\n } else if (_toString.call(O) == \"[object Number]\") {\n typeName = \"number\";\n } else if (_toString.call(O) == \"[object NodeList]\") {\n typeName = \"nodelist\";\n } else if (typeof O === \"function\") {\n typeName = \"function\";\n }\n return typeName;\n }\n\n /**\n * 오브젝트가 window 인지 판단합니다.\n * @method ax5.util.isWindow\n * @param {Object} O\n * @returns {Boolean}\n */\n function isWindow(O) {\n return O != null && O == O.window;\n }\n\n /**\n * 오브젝트가 HTML 엘리먼트여부인지 판단합니다.\n * @method ax5.util.isElement\n * @param {Object} O\n * @returns {Boolean}\n */\n function isElement(O) {\n return !!(O && (O.nodeType == 1 || O.nodeType == 11));\n }\n\n /**\n * 오브젝트가 Object인지 판단합니다.\n * @method ax5.util.isObject\n * @param {Object} O\n * @returns {Boolean}\n */\n function isObject(O) {\n return _toString.call(O) == \"[object Object]\";\n }\n\n /**\n * 오브젝트가 Array인지 판단합니다.\n * @method ax5.util.isArray\n * @param {Object} O\n * @returns {Boolean}\n */\n function isArray(O) {\n return _toString.call(O) == \"[object Array]\";\n }\n\n /**\n * 오브젝트가 Function인지 판단합니다.\n * @method ax5.util.isFunction\n * @param {Object} O\n * @returns {Boolean}\n */\n function isFunction(O) {\n return typeof O === \"function\";\n }\n\n /**\n * 오브젝트가 String인지 판단합니다.\n * @method ax5.util.isString\n * @param {Object} O\n * @returns {Boolean}\n */\n function isString(O) {\n return _toString.call(O) == \"[object String]\";\n }\n\n /**\n * 오브젝트가 Number인지 판단합니다.\n * @method ax5.util.isNumber\n * @param {Object} O\n * @returns {Boolean}\n */\n function isNumber(O) {\n return _toString.call(O) == \"[object Number]\";\n }\n\n /**\n * 오브젝트가 NodeList인지 판단합니다.\n * @method ax5.util.isNodelist\n * @param {Object} O\n * @returns {Boolean}\n */\n function isNodelist(O) {\n return !!(_toString.call(O) == \"[object NodeList]\" || typeof O !== \"undefined\" && O && O[0] && O[0].nodeType == 1);\n }\n\n /**\n * 오브젝트가 undefined인지 판단합니다.\n * @method ax5.util.isUndefined\n * @param {Object} O\n * @returns {Boolean}\n */\n function isUndefined(O) {\n return typeof O === \"undefined\";\n }\n\n /**\n * 오브젝트가 undefined이거나 null이거나 빈값인지 판단합니다.\n * @method ax5.util.isNothing\n * @param {Object} O\n * @returns {Boolean}\n */\n function isNothing(O) {\n return typeof O === \"undefined\" || O === null || O === \"\";\n }\n\n /**\n * 오브젝트가 날자값인지 판단합니다.\n * @method ax5.util.isDate\n * @param {Date} O\n * @returns {Boolean}\n * @example\n * ```js\n * ax5.util.isDate('2016-09-30');\n * // false\n * ax5.util.isDate( new Date('2016-09-30') );\n * // true\n * ```\n */\n function isDate(O) {\n return O instanceof Date && !isNaN(O.valueOf());\n }\n\n function isDateFormat(O) {\n var result = false;\n if (!O) {} else if (O instanceof Date && !isNaN(O.valueOf())) {\n result = true;\n } else {\n if (O.length > 7) {\n if (date(O) instanceof Date) {\n return true;\n }\n }\n O = O.replace(/\\D/g, '');\n if (O.length > 7) {\n var mm = O.substr(4, 2),\n dd = O.substr(6, 2);\n O = date(O);\n if (O.getMonth() == mm - 1 && O.getDate() == dd) {\n result = true;\n }\n }\n }\n return result;\n }\n\n /**\n * 오브젝트의 첫번째 아이템을 반환합니다.\n * @method ax5.util.first\n * @param {Object|Array} O\n * @returns {Object}\n * @example\n * ```js\n * ax5.util.first({a:1, b:2});\n * // Object {a: 1}\n * ax5.util.first([1,2,3,4]);\n * // 1\n * ```\n */\n function first(O) {\n if (isObject(O)) {\n var keys = Object.keys(O);\n var item = {};\n item[keys[0]] = O[keys[0]];\n return item;\n } else if (isArray(O)) {\n return O[0];\n } else {\n console.error(\"ax5.util.object.first\", \"argument type error\");\n return undefined;\n }\n }\n\n /**\n * 오브젝트의 마지막 아이템을 반환합니다.\n * @method ax5.util.last\n * @param {Object|Array} O\n * @returns {Object}\n * @example\n * ```js\n * ax5.util.last({a:1, b:2});\n * // Object {b: 2}\n * ax5.util.last([1,2,3,4]);\n * // 4\n * ```\n */\n function last(O) {\n if (isObject(O)) {\n var keys = Object.keys(O);\n var item = {};\n item[keys[keys.length - 1]] = O[keys[keys.length - 1]];\n return item;\n } else if (isArray(O)) {\n return O[O.length - 1];\n } else {\n console.error(\"ax5.util.object.last\", \"argument type error\");\n return undefined;\n }\n }\n\n /**\n * 쿠키를 설정합니다.\n * @method ax5.util.setCookie\n * @param {String} cname - 쿠키이름\n * @param {String} cvalue - 쿠키값\n * @param {Number} [exdays] - 쿠키 유지일수\n * @param {Object} [opts] - path, domain 설정 옵션\n * @example\n * ```js\n * ax5.util.setCookie(\"jslib\", \"AX5\");\n * ax5.util.setCookie(\"jslib\", \"AX5\", 3);\n * ax5.util.setCookie(\"jslib\", \"AX5\", 3, {path:\"/\", domain:\".axisj.com\"});\n * ```\n */\n function setCookie(cn, cv, exdays, opts) {\n var expire;\n if (typeof exdays === \"number\") {\n expire = new Date();\n expire.setDate(expire.getDate() + exdays);\n }\n opts = opts || {};\n return doc.cookie = [escape(cn), '=', escape(cv), expire ? \"; expires=\" + expire.toUTCString() : \"\", // use expires attribute, max-age is not supported by IE\n opts.path ? \"; path=\" + opts.path : \"\", opts.domain ? \"; domain=\" + opts.domain : \"\", opts.secure ? \"; secure\" : \"\"].join(\"\");\n }\n\n /**\n * 쿠키를 가져옵니다.\n * @method ax5.util.getCookie\n * @param {String} cname\n * @returns {String} cookie value\n * @example\n * ```js\n * ax5.util.getCookie(\"jslib\");\n * ```\n */\n function getCookie(cname) {\n var name = cname + \"=\";\n var ca = doc.cookie.split(';'),\n i = 0,\n l = ca.length;\n for (; i < l; i++) {\n var c = ca[i];\n while (c.charAt(0) == ' ') {\n c = c.substring(1);\n }if (c.indexOf(name) != -1) return unescape(c.substring(name.length, c.length));\n }\n return \"\";\n }\n\n /**\n * jsonString 으로 alert 합니다.\n * @method ax5.util.alert\n * @param {Object|Array|String|Number} O\n * @returns {Object|Array|String|Number} O\n * @example ```js\n * ax5.util.alert({a:1,b:2});\n * ax5.util.alert(\"정말?\");\n * ```\n */\n function alert(O) {\n win.alert(toJson(O));\n return O;\n }\n\n /**\n * 문자열의 특정 문자열까지 잘라주거나 원하는 포지션까지 잘라줍니다.\n * @method ax5.util.left\n * @param {String} str - 문자열\n * @param {String|Number} pos - 찾을 문자열 또는 포지션\n * @returns {String}\n * @example\n * ```js\n * ax5.util.left(\"abcd.efd\", 3);\n * // abc\n * ax5.util.left(\"abcd.efd\", \".\");\n * // abcd\n * ```\n */\n function left(str, pos) {\n if (typeof str === \"undefined\" || typeof pos === \"undefined\") return \"\";\n if (isString(pos)) {\n return str.indexOf(pos) > -1 ? str.substr(0, str.indexOf(pos)) : \"\";\n } else if (isNumber(pos)) {\n return str.substr(0, pos);\n } else {\n return \"\";\n }\n }\n\n /**\n * 문자열의 특정 문자열까지 잘라주거나 원하는 포지션까지 잘라줍니다.\n * @method ax5.util.right\n * @param {String} str - 문자열\n * @param {String|Number} pos - 찾을 문자열 또는 포지션\n * @returns {String}\n * @example\n * ```js\n * ax5.util.right(\"abcd.efd\", 3);\n * // efd\n * ax5.util.right(\"abcd.efd\", \".\");\n * // efd\n * ```\n */\n function right(str, pos) {\n if (typeof str === \"undefined\" || typeof pos === \"undefined\") return \"\";\n str = '' + str;\n if (isString(pos)) {\n return str.lastIndexOf(pos) > -1 ? str.substr(str.lastIndexOf(pos) + 1) : \"\";\n } else if (isNumber(pos)) {\n return str.substr(str.length - pos);\n } else {\n return \"\";\n }\n }\n\n /**\n * css형 문자열이나 특수문자가 포함된 문자열을 카멜케이스로 바꾸어 반환합니다.\n * @method ax5.util.camelCase\n * @param {String} str\n * @returns {String}\n * @example\n * ```js\n * ax5.util.camelCase(\"inner-width\");\n * ax5.util.camelCase(\"innerWidth\");\n * // innerWidth\n * ```\n */\n function camelCase(str) {\n return str.replace(reMs, \"ms-\").replace(reSnakeCase, function (all, letter) {\n return letter.toUpperCase();\n });\n }\n\n /**\n * css형 문자열이나 카멜케이스문자열을 스네이크 케이스 문자열로 바꾸어 반환합니다.\n * @method ax5.util.snakeCase\n * @param {String} str\n * @returns {String}\n * @example\n * ```js\n * ax5.util.snakeCase(\"innerWidth\");\n * ax5.util.snakeCase(\"inner-Width\");\n * ax5.util.snakeCase(\"innerWidth\");\n * // inner-width\n * ```\n */\n function snakeCase(str) {\n return camelCase(str).replace(reCamelCase, function (all, letter) {\n return \"-\" + letter.toLowerCase();\n });\n }\n\n /**\n * 문자열에서 -. 을 제외한 모든 문자열을 제거하고 숫자로 반환합니다. 옵션에 따라 원하는 형식의 숫자로 변환 할 수 도 있습니다.\n * @method ax5.util.number\n * @param {String|Number} str\n * @param {Object} cond - 옵션\n * @returns {String|Number}\n * @example\n * ```js\n * var cond = {\n * \tround: {Number|Boolean} - 반올림할 자릿수,\n * \tmoney: {Boolean} - 통화,\n * \tabs: {Boolean} - 절대값,\n * \tbyte: {Boolean} - 바이트\n * }\n *\n * console.log(ax5.util.number(123456789.678, {round:1}));\n * console.log(ax5.util.number(123456789.678, {round:1, money:true}));\n * console.log(ax5.util.number(123456789.678, {round:2, byte:true}));\n * console.log(ax5.util.number(-123456789.8888, {abs:true, round:2, money:true}));\n * console.log(ax5.util.number(\"A-1234~~56789.8~888PX\", {abs:true, round:2, money:true}));\n *\n * //123456789.7\n * //123,456,789.7\n * //117.7MB\n * //123,456,789.89\n * //123,456,789.89\n * ```\n */\n function number(str, cond) {\n var result,\n pair = ('' + str).split(reDot),\n isMinus,\n returnValue;\n\n isMinus = Number(pair[0].replace(/,/g, \"\")) < 0 || pair[0] == \"-0\";\n returnValue = 0.0;\n pair[0] = pair[0].replace(reInt, \"\");\n\n if (pair[1]) {\n pair[1] = pair[1].replace(reNotNum, \"\");\n returnValue = Number(pair[0] + \".\" + pair[1]) || 0;\n } else {\n returnValue = Number(pair[0]) || 0;\n }\n result = isMinus ? -returnValue : returnValue;\n\n each(cond, function (k, c) {\n if (k == \"round\") {\n if (isNumber(c)) {\n if (c < 0) {\n result = +(Math.round(result + \"e-\" + Math.abs(c)) + \"e+\" + Math.abs(c));\n } else {\n result = +(Math.round(result + \"e+\" + c) + \"e-\" + c);\n }\n } else {\n result = Math.round(result);\n }\n }\n if (k == \"floor\") {\n result = Math.floor(result);\n }\n if (k == \"ceil\") {\n result = Math.ceil(result);\n } else if (k == \"money\") {\n result = function (val) {\n var txtNumber = '' + val;\n if (isNaN(txtNumber) || txtNumber == \"\") {\n return \"\";\n } else {\n var arrNumber = txtNumber.split('.');\n arrNumber[0] += '.';\n do {\n arrNumber[0] = arrNumber[0].replace(reMoneySplit, '$1,$2');\n } while (reMoneySplit.test(arrNumber[0]));\n if (arrNumber.length > 1) {\n return arrNumber.join('');\n } else {\n return arrNumber[0].split('.')[0];\n }\n }\n }(result);\n } else if (k == \"abs\") {\n result = Math.abs(Number(result));\n } else if (k == \"byte\") {\n result = function (val) {\n val = Number(result);\n var nUnit = \"KB\";\n var myByte = val / 1024;\n if (myByte / 1024 > 1) {\n nUnit = \"MB\";\n myByte = myByte / 1024;\n }\n if (myByte / 1024 > 1) {\n nUnit = \"GB\";\n myByte = myByte / 1024;\n }\n return number(myByte, { round: 1 }) + nUnit;\n }(result);\n }\n });\n\n return result;\n }\n\n /**\n * 배열 비슷한 오브젝트를 배열로 변환해줍니다.\n * @method ax5.util.toArray\n * @param {Object|Elements|Arguments} O\n * @returns {Array}\n * @example\n * ```js\n * ax5.util.toArray(arguments);\n * //\n * ```\n */\n function toArray(O) {\n if (typeof O.length != \"undefined\") return Array.prototype.slice.call(O);\n return [];\n }\n\n /**\n * 첫번째 인자에 두번째 인자 아이템을 합쳐줍니다. concat과 같은 역할을 하지만. 인자가 Array타입이 아니어도 됩니다.\n * @method ax5.util.merge\n * @param {Array|ArrayLike} first\n * @param {Array|ArrayLike} second\n * @returns {Array} first\n * @example\n * ```\n *\n * ```\n */\n function merge(first, second) {\n var l = second.length,\n i = first.length,\n j = 0;\n\n if (typeof l === \"number\") {\n for (; j < l; j++) {\n first[i++] = second[j];\n }\n } else {\n while (second[j] !== undefined) {\n first[i++] = second[j++];\n }\n }\n\n first.length = i;\n\n return first;\n }\n\n /**\n * 오브젝트를 파라미터형식으로 또는 파라미터를 오브젝트 형식으로 변환합니다.\n * @method ax5.util.param\n * @param {Object|Array|String} O\n * @param {String} [cond] - param|object\n * @returns {Object|String}\n * @example\n * ```\n * ax5.util.param({a:1,b:'1232'}, \"param\");\n * ax5.util.param(\"a=1&b=1232\", \"param\");\n * // \"a=1&b=1232\"\n * ax5.util.param(\"a=1&b=1232\");\n * // {a: \"1\", b: \"1232\"}\n * ```\n */\n function param(O, cond) {\n var p;\n if (isString(O) && typeof cond !== \"undefined\" && cond == \"param\") {\n return O;\n } else if (isString(O) && typeof cond !== \"undefined\" && cond == \"object\" || isString(O) && typeof cond === \"undefined\") {\n p = {};\n each(O.split(reAmp), function () {\n var item = this.split(reEq);\n if (!p[item[0]]) p[item[0]] = item[1];else {\n if (isString(p[item[0]])) p[item[0]] = [p[item[0]]];\n p[item[0]].push(item[1]);\n }\n });\n return p;\n } else {\n p = [];\n each(O, function (k, v) {\n p.push(k + \"=\" + escape(v));\n });\n return p.join('&');\n }\n }\n\n function encode(s) {\n return encodeURIComponent(s);\n }\n\n function decode(s) {\n return decodeURIComponent(s);\n }\n\n function error() {\n ax5.info.onerror.apply(this, arguments);\n }\n\n function localDate(yy, mm, dd, hh, mi, ss) {\n var utcD, localD;\n localD = new Date();\n if (mm < 0) mm = 0;\n if (typeof hh === \"undefined\") hh = 12;\n if (typeof mi === \"undefined\") mi = 0;\n utcD = new Date(Date.UTC(yy, mm, dd || 1, hh, mi, ss || 0));\n\n if (mm == 0 && dd == 1 && utcD.getUTCHours() + utcD.getTimezoneOffset() / 60 < 0) {\n utcD.setUTCHours(0);\n } else {\n utcD.setUTCHours(utcD.getUTCHours() + utcD.getTimezoneOffset() / 60);\n }\n return utcD;\n }\n\n /**\n * 날짜 형식의 문자열이나 Date객체를 조건에 맞게 처리 한 후 원하는 return 값으로 반환합니다.\n * @method ax5.util.date\n * @param {String|Date} d\n * @param {Object} cond\n * @returns {Date|String}\n * @example\n * ```js\n * ax5.util.date('2013-01-01'); // Tue Jan 01 2013 23:59:00 GMT+0900 (KST)\n * ax5.util.date((new Date()), {add:{d:10}, return:'yyyy/MM/dd'}); // \"2015/07/01\"\n * ax5.util.date('1919-03-01', {add:{d:10}, return:'yyyy/MM/dd hh:mm:ss'}); // \"1919/03/11 23:59:00\"\n * ```\n */\n function date(d, cond) {\n var yy = void 0,\n mm = void 0,\n dd = void 0,\n hh = void 0,\n mi = void 0,\n aDateTime = void 0,\n aTimes = void 0,\n aTime = void 0,\n aDate = void 0,\n va = void 0,\n ISO_8601 = /^\\d{4}(-\\d\\d(-\\d\\d(T\\d\\d:\\d\\d(:\\d\\d)?(\\.\\d+)?(([+-]\\d\\d:\\d\\d)|Z)?)?)?)?$/i,\n ISO_8601_FULL = /^\\d{4}-\\d\\d-\\d\\dT\\d\\d:\\d\\d:\\d\\d(\\.\\d+)?(([+-]\\d\\d:\\d\\d)|Z)?$/i;\n\n if (isString(d)) {\n if (d.length == 0) {\n d = new Date();\n } else if (d.length > 15) {\n if (ISO_8601_FULL.test(d) || ISO_8601.test(d)) {\n d = new Date(d);\n } else {\n aDateTime = d.split(/ /g), aTimes, aTime, aDate = aDateTime[0].split(/\\D/g), yy = aDate[0];\n mm = parseFloat(aDate[1]);\n dd = parseFloat(aDate[2]);\n aTime = aDateTime[1] || \"09:00\";\n aTimes = aTime.substring(0, 5).split(\":\");\n hh = parseFloat(aTimes[0]);\n mi = parseFloat(aTimes[1]);\n if (right(aTime, 2) === \"AM\" || right(aTime, 2) === \"PM\") hh += 12;\n d = localDate(yy, mm - 1, dd, hh, mi);\n }\n } else if (d.length == 14) {\n va = d.replace(/\\D/g, \"\");\n d = localDate(va.substr(0, 4), va.substr(4, 2) - 1, number(va.substr(6, 2)), number(va.substr(8, 2)), number(va.substr(10, 2)), number(va.substr(12, 2)));\n } else if (d.length > 7) {\n va = d.replace(/\\D/g, \"\");\n d = localDate(va.substr(0, 4), va.substr(4, 2) - 1, number(va.substr(6, 2)));\n } else if (d.length > 4) {\n va = d.replace(/\\D/g, \"\");\n d = localDate(va.substr(0, 4), va.substr(4, 2) - 1, 1);\n } else if (d.length > 2) {\n va = d.replace(/\\D/g, \"\");\n return localDate(va.substr(0, 4), va.substr(4, 2) - 1, 1);\n } else {\n d = new Date();\n }\n }\n if (typeof cond === \"undefined\" || typeof d === \"undefined\") {\n return d;\n } else {\n if (\"add\" in cond) {\n d = function (_d, opts) {\n var yy = void 0,\n mm = void 0,\n dd = void 0,\n mxdd = void 0,\n DyMilli = 1000 * 60 * 60 * 24;\n\n if (typeof opts[\"d\"] !== \"undefined\") {\n _d.setTime(_d.getTime() + opts[\"d\"] * DyMilli);\n } else if (typeof opts[\"m\"] !== \"undefined\") {\n yy = _d.getFullYear();\n mm = _d.getMonth();\n dd = _d.getDate();\n yy = yy + parseInt(opts[\"m\"] / 12);\n mm += opts[\"m\"] % 12;\n mxdd = daysOfMonth(yy, mm);\n if (mxdd < dd) dd = mxdd;\n _d = new Date(yy, mm, dd, 12);\n } else if (typeof opts[\"y\"] !== \"undefined\") {\n _d.setTime(_d.getTime() + opts[\"y\"] * 365 * DyMilli);\n } else if (typeof opts[\"h\"] !== \"undefined\") {\n _d.setTime(_d.getTime() + opts[\"h\"] * 1000 * 60 * 60);\n }\n\n return _d;\n }(new Date(d), cond[\"add\"]);\n }\n if (\"set\" in cond) {\n d = function (_d, opts) {\n var yy = void 0,\n mm = void 0,\n dd = void 0,\n processor = {\n \"firstDayOfMonth\": function firstDayOfMonth(date) {\n yy = date.getFullYear();\n mm = date.getMonth();\n dd = 1;\n return new Date(yy, mm, dd, 12);\n },\n \"lastDayOfMonth\": function lastDayOfMonth(date) {\n yy = date.getFullYear();\n mm = date.getMonth();\n dd = daysOfMonth(yy, mm);\n return new Date(yy, mm, dd, 12);\n }\n };\n if (opts in processor) {\n return processor[opts](_d);\n } else {\n return _d;\n }\n }(new Date(d), cond[\"set\"]);\n }\n if (\"return\" in cond) {\n return function () {\n\n var fStr = cond[\"return\"],\n nY = void 0,\n nM = void 0,\n nD = void 0,\n nH = void 0,\n nMM = void 0,\n nS = void 0,\n nDW = void 0,\n yre = void 0,\n regY = void 0,\n mre = void 0,\n regM = void 0,\n dre = void 0,\n regD = void 0,\n hre = void 0,\n regH = void 0,\n mire = void 0,\n regMI = void 0,\n sre = void 0,\n regS = void 0,\n dwre = void 0,\n regDW = void 0;\n\n nY = d.getUTCFullYear();\n nM = setDigit(d.getMonth() + 1, 2);\n nD = setDigit(d.getDate(), 2);\n nH = setDigit(d.getHours(), 2);\n nMM = setDigit(d.getMinutes(), 2);\n nS = setDigit(d.getSeconds(), 2);\n nDW = d.getDay();\n\n yre = /[^y]*(yyyy)[^y]*/gi;\n yre.exec(fStr);\n regY = RegExp.$1;\n mre = /[^m]*(MM)[^m]*/g;\n mre.exec(fStr);\n regM = RegExp.$1;\n dre = /[^d]*(dd)[^d]*/gi;\n dre.exec(fStr);\n regD = RegExp.$1;\n hre = /[^h]*(hh)[^h]*/gi;\n hre.exec(fStr);\n regH = RegExp.$1;\n mire = /[^m]*(mm)[^i]*/g;\n mire.exec(fStr);\n regMI = RegExp.$1;\n sre = /[^s]*(ss)[^s]*/gi;\n sre.exec(fStr);\n regS = RegExp.$1;\n dwre = /[^d]*(dw)[^w]*/gi;\n dwre.exec(fStr);\n regDW = RegExp.$1;\n\n if (regY === \"yyyy\") {\n fStr = fStr.replace(regY, right(nY, regY.length));\n }\n if (regM === \"MM\") {\n if (regM.length == 1) nM = d.getMonth() + 1;\n fStr = fStr.replace(regM, nM);\n }\n if (regD === \"dd\") {\n if (regD.length == 1) nD = d.getDate();\n fStr = fStr.replace(regD, nD);\n }\n if (regH === \"hh\") {\n fStr = fStr.replace(regH, nH);\n }\n if (regMI === \"mm\") {\n fStr = fStr.replace(regMI, nMM);\n }\n if (regS === \"ss\") {\n fStr = fStr.replace(regS, nS);\n }\n if (regDW == \"dw\") {\n fStr = fStr.replace(regDW, info.weekNames[nDW].label);\n }\n return fStr;\n }();\n } else {\n return d;\n }\n }\n }\n\n /**\n * 인자인 날짜가 오늘부터 몇일전인지 반환합니다. 또는 인자인 날짜가 가까운 미래에 몇일 후인지 반환합니다.\n * @method ax5.util.dday\n * @param {String|Data} d\n * @param {Object} cond\n * @returns {Number}\n * @example\n * ```js\n * ax5.util.dday('2016-01-29');\n * // 1\n * ax5.util.dday('2016-01-29', {today:'2016-01-28'});\n * // 1\n * ax5.util.dday('1977-03-29', {today:'2016-01-28', age:true});\n * // 39\n * ```\n */\n function dday(d, cond) {\n var memoryDay = date(d),\n DyMilli = 1000 * 60 * 60 * 24,\n today = new Date(),\n diffnum,\n thisYearMemoryDay;\n\n function getDayTime(_d) {\n return Math.floor(_d.getTime() / DyMilli) * DyMilli;\n }\n\n if (typeof cond === \"undefined\") {\n diffnum = number((getDayTime(memoryDay) - getDayTime(today)) / DyMilli, { floor: true });\n return diffnum;\n } else {\n diffnum = number((getDayTime(memoryDay) - getDayTime(today)) / DyMilli, { floor: true });\n if (cond[\"today\"]) {\n today = date(cond.today);\n diffnum = number((getDayTime(memoryDay) - getDayTime(today)) / DyMilli, { floor: true });\n }\n if (cond[\"thisYear\"]) {\n thisYearMemoryDay = new Date(today.getFullYear(), memoryDay.getMonth(), memoryDay.getDate());\n diffnum = number((getDayTime(thisYearMemoryDay) - getDayTime(today)) / DyMilli, { floor: true });\n if (diffnum < 0) {\n thisYearMemoryDay = new Date(today.getFullYear() + 1, memoryDay.getMonth(), memoryDay.getDate());\n diffnum = number((getDayTime(thisYearMemoryDay) - getDayTime(today)) / DyMilli, { floor: true });\n }\n }\n if (cond[\"age\"]) {\n thisYearMemoryDay = new Date(today.getFullYear(), memoryDay.getMonth(), memoryDay.getDate());\n diffnum = thisYearMemoryDay.getFullYear() - memoryDay.getFullYear();\n }\n\n return diffnum;\n }\n }\n\n /**\n * 인자인 날짜가 몇년 몇월의 몇번째 주차인지 반환합니다.\n * @method ax5.util.weeksOfMonth\n * @param {String|Data} d\n * @returns {Object}\n * @example\n * ```js\n * ax5.util.weeksOfMonth(\"2015-10-01\"); // {year: 2015, month: 10, count: 1}\n * ax5.util.weeksOfMonth(\"2015-09-19\"); // {year: 2015, month: 9, count: 3}\n * ```\n */\n function weeksOfMonth(d) {\n var myDate = date(d);\n return {\n year: myDate.getFullYear(),\n month: myDate.getMonth() + 1,\n count: parseInt(myDate.getDate() / 7 + 1)\n };\n }\n\n /**\n * 년월에 맞는 날자수를 반환합니다.\n * (new Date()).getMonth() 기준으로 월값을 보냅니다. \"2월\" 인경우 \"1\" 을 넘기게 됩니다.\n * @method ax5.util.daysOfMonth\n * @param {Number} y\n * @param {Number} m\n * @returns {Number}\n * @examples\n * ```js\n * ax5.util.daysOfMonth(2015, 11); // 31\n * ax5.util.daysOfMonth(2015, 1); // 28\n * ```\n */\n function daysOfMonth(y, m) {\n if (m == 3 || m == 5 || m == 8 || m == 10) {\n return 30;\n } else if (m == 1) {\n return y % 4 == 0 && y % 100 != 0 || y % 400 == 0 ? 29 : 28;\n } else {\n return 31;\n }\n }\n\n /**\n * 원하는 횟수 만큼 자릿수 맞춤 문자열을 포함한 문자열을 반환합니다.\n * 문자열 길이보다 작은값을 보내면 무시됩니다.\n * @method ax5.util.setDigit\n * @param {String|Number} num\n * @param {Number} length\n * @param {String} [padder=0]\n * @param {Number} [radix]\n * @returns {String}\n * @example\n * ```\n * ax5.util.setDigit(2016, 6)\n * // \"002016\"\n * ax5.util.setDigit(2016, 2)\n * // \"2016\"\n * ```\n */\n function setDigit(num, length, padder, radix) {\n var s = num.toString(radix || 10);\n return times(padder || '0', length - s.length) + s;\n }\n\n /**\n * 문자열을 지정된 수만큼 반복 합니다.\n * @param {String} s\n * @param {Number} count\n * @returns {string}\n * @example\n * ```\n * ax5.util.times(2016, 2)\n * //\"20162016\"\n * ```\n */\n function times(s, count) {\n return count < 1 ? '' : new Array(count + 1).join(s);\n }\n\n /**\n * 타겟엘리먼트의 부모 엘리멘트 트리에서 원하는 조건의 엘리먼트를 얻습니다.\n * @method ax5.util.findParentNode\n * @param {Element} _target - target element\n * @param {Object|Function} cond - 원하는 element를 찾을 조건\n * @returns {Element}\n * @example\n * ```\n * // cond 속성정의\n * var cond = {\n * \ttagname: {String} - 태그명 (ex. a, div, span..),\n * \tclazz: {String} - 클래스명\n * \t[, 그 외 찾고 싶은 attribute명들]\n * };\n * console.log(\n * console.log(\n * ax5.util.findParentNode(e.target, {tagname:\"a\", clazz:\"ax-menu-handel\", \"data-custom-attr\":\"attr_value\"})\n * );\n * // cond 함수로 처리하기\n * jQuery('#id').bind(\"click.app_expand\", function(e){\n * \tvar target = ax5.util.findParentNode(e.target, function(target){\n * \t\tif($(target).hasClass(\"aside\")){\n * \t\t\treturn true;\n * \t\t}\n * \t\telse{\n * \t\t\treturn true;\n * \t\t}\n * \t});\n * \t//client-aside\n * \tif(target.id !== \"client-aside\"){\n * \t\t// some action\n * \t}\n * });\n * ```\n */\n\n function findParentNode(_target, cond) {\n if (_target) {\n while (function () {\n var result = true;\n if (typeof cond === \"undefined\") {\n _target = _target.parentNode ? _target.parentNode : false;\n } else if (isFunction(cond)) {\n result = cond(_target);\n } else if (isObject(cond)) {\n for (var k in cond) {\n if (k === \"tagname\") {\n if (_target.tagName.toLocaleLowerCase() != cond[k]) {\n result = false;\n break;\n }\n } else if (k === \"clazz\" || k === \"class_name\") {\n if (\"className\" in _target) {\n var klasss = _target.className.split(reClassNameSplit);\n var hasClass = false;\n for (var a = 0; a < klasss.length; a++) {\n if (klasss[a] == cond[k]) {\n hasClass = true;\n break;\n }\n }\n result = hasClass;\n } else {\n result = false;\n break;\n }\n } else {\n // 그외 속성값들.\n if (_target.getAttribute) {\n if (_target.getAttribute(k) != cond[k]) {\n result = false;\n break;\n }\n } else {\n result = false;\n break;\n }\n }\n }\n }\n return !result;\n }()) {\n if (_target.parentNode && _target.parentNode.parentNode) {\n _target = _target.parentNode;\n } else {\n _target = false;\n break;\n }\n }\n }\n return _target;\n }\n\n /**\n * @method ax5.util.cssNumber\n * @param {String|Number} val\n * @returns {String}\n * @example\n * ```\n * console.log(ax5.util.cssNumber(\"100px\"))\n * console.log(ax5.util.cssNumber(\"100%\"))\n * console.log(ax5.util.cssNumber(\"100\"))\n * console.log(ax5.util.cssNumber(100))\n * console.log(ax5.util.cssNumber(\"!!100@#\"))\n * ```\n */\n function cssNumber(val) {\n var re = /\\D?(\\d+)([a-zA-Z%]*)/i,\n found = ('' + val).match(re),\n unit = found[2] || \"px\";\n\n return found[1] + unit;\n }\n\n /**\n * css string 및 object 를 넘기면 object 및 string 으로 변환되어 리턴됩니다.\n * @method ax5.util.css\n * @param {Object|String} val - CSS String or CSS Object\n * @returns {String|Object}\n * @example\n * ```\n * console.log(ax5.util.css({background: \"#ccc\", padding: \"50px\", width: \"100px\"}));\n * //\"background:#ccc;padding:50px;width:100px;\"\n * console.log(ax5.util.css('width:100px;padding: 50px; background: #ccc'));\n * // object {width: \"100px\", padding: \"50px\", background: \"#ccc\"}\n * ```\n */\n function css(val) {\n var returns;\n if (isObject(val)) {\n returns = '';\n for (var k in val) {\n returns += k + ':' + val[k] + ';';\n }\n return returns;\n } else if (isString(val)) {\n returns = {};\n var valSplited = val.split(/[ ]*;[ ]*/g);\n valSplited.forEach(function (v) {\n if ((v = v.trim()) !== \"\") {\n var vSplited = v.split(/[ ]*:[ ]*/g);\n returns[vSplited[0]] = vSplited[1];\n }\n });\n return returns;\n }\n }\n\n /**\n * @method ax5.util.stopEvent\n * @param {Event} e\n * @example\n * ```\n * ax5.util.stopEvent(e);\n * ```\n */\n function stopEvent(e) {\n // 이벤트 중지 구문\n if (!e) var e = window.event;\n\n //e.cancelBubble is supported by IE -\n // this will kill the bubbling process.\n e.cancelBubble = true;\n e.returnValue = false;\n\n //e.stopPropagation works only in Firefox.\n if (e.stopPropagation) e.stopPropagation();\n if (e.preventDefault) e.preventDefault();\n\n return false;\n // 이벤트 중지 구문 끝\n }\n\n /**\n * @method ax5.util.selectRange\n * @param {Element} el\n * @param {Element} offset\n * @example\n * ```\n * ax5.util.selectRange($(\"#select-test-0\")); // selectAll\n * ax5.util.selectRange($(\"#select-test-0\"), \"selectAll\"); //selectAll\n * ax5.util.selectRange($(\"#select-test-0\"), \"start\"); // focus on start\n * ax5.util.selectRange($(\"#select-test-0\"), \"end\"); // focus on end\n * ax5.util.selectRange($(\"#select-test-0\"), [1, 5]); // select 1~5\n * ```\n */\n var selectRange = function () {\n var processor = {\n 'textRange': {\n 'selectAll': function selectAll(el, range, offset) {},\n 'arr': function arr(el, range, offset) {\n range.moveStart(\"character\", offset[0]); // todo ie node select 체크필요\n range.collapse();\n range.moveEnd(\"character\", offset[1]);\n },\n 'start': function start(el, range, offset) {\n range.moveStart(\"character\", 0);\n range.collapse();\n },\n 'end': function end(el, range, offset) {\n range.moveStart(\"character\", range.text.length);\n range.collapse();\n }\n },\n 'range': {\n 'selectAll': function selectAll(el, range, offset) {\n range.selectNodeContents(el);\n },\n 'arr': function arr(el, range, offset) {\n if (isObject(offset[0])) {\n range.setStart(offset[0].node, offset[0].offset);\n range.setEnd(offset[1].node, offset[1].offset);\n } else {\n range.setStart(el.firstChild, offset[0]);\n range.setEnd(el.firstChild, offset[1]);\n }\n },\n 'start': function start(el, range, offset) {\n range.selectNodeContents(el);\n range.collapse(true);\n },\n 'end': function end(el, range, offset) {\n range.selectNodeContents(el);\n range.collapse(false);\n }\n }\n };\n return function (el, offset) {\n var range, rangeType, selection;\n\n if (el instanceof jQuery) {\n el = el.get(0);\n }\n if (!el) return;\n\n // 레인지 타입 선택\n if (doc.body.createTextRange) {\n range = document.body.createTextRange();\n range.moveToElementText(el);\n rangeType = \"textRange\";\n } else if (window.getSelection) {\n selection = window.getSelection();\n range = document.createRange();\n rangeType = \"range\";\n }\n\n // range 적용\n if (typeof offset == \"undefined\") {\n processor[rangeType].selectAll.call(this, el, range, offset);\n } else if (isArray(offset)) {\n processor[rangeType].arr.call(this, el, range, offset);\n } else {\n for (var key in processor[rangeType]) {\n if (offset == key) {\n processor[rangeType][key].call(this, el, range, offset);\n break;\n }\n }\n }\n\n // 포커스 및 셀렉트\n if (doc.body.createTextRange) {\n range.select();\n el.focus();\n } else if (window.getSelection) {\n el.focus();\n selection.removeAllRanges();\n selection.addRange(range);\n }\n };\n }();\n\n /**\n * 지정한 시간을 지연시켜 함수를 실행합니다.\n * @method ax5.util.debounce\n * @param {Function} func\n * @param {Number} wait\n * @param {Object} options\n * @returns {debounced}\n * @example\n * ```js\n * var debounceFn = ax5.util.debounce(function( val ) { console.log(val); }, 300);\n * $(document.body).click(function(){\n * debounceFn(new Date());\n * });\n * ```\n */\n // https://github.com/lodash/lodash/blob/master/debounce.js\n function debounce(func, wait, options) {\n var lastArgs = void 0,\n lastThis = void 0,\n maxWait = void 0,\n result = void 0,\n timerId = void 0,\n lastCallTime = void 0;\n\n var lastInvokeTime = 0;\n var leading = false;\n var maxing = false;\n var trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError('Expected a function');\n }\n wait = +wait || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? Math.max(+options.maxWait || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs;\n var thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime;\n var timeSinceLastInvoke = time - lastInvokeTime;\n var result = wait - timeSinceLastCall;\n\n return maxing ? Math.min(result, maxWait - timeSinceLastInvoke) : result;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime;\n var timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return lastCallTime === undefined || timeSinceLastCall >= wait || timeSinceLastCall < 0 || maxing && timeSinceLastInvoke >= maxWait;\n }\n\n function timerExpired() {\n var time = Date.now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(Date.now());\n }\n\n function debounced() {\n var time = Date.now();\n var isInvoking = shouldInvoke(time);\n\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n lastArgs = args;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n }\n\n /**\n * @method ax5.util.throttle\n * @param func\n * @param wait\n * @param options\n * @return {debounced}\n */\n //https://github.com/lodash/lodash/blob/master/throttle.js\n function throttle(func, wait, options) {\n var leading = true;\n var trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError('Expected a function');\n }\n if (isObject(options)) {\n leading = 'leading' in options ? !!options.leading : leading;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n return debounce(func, wait, {\n 'leading': leading,\n 'maxWait': wait,\n 'trailing': trailing\n });\n }\n\n /**\n * @method ax5.util.deepCopy\n * @param {Object} obj\n * @returns {Object}\n * @example\n * ```js\n * var obj = [\n * {name:\"A\", child:[{name:\"a-1\"}]},\n * {name:\"B\", child:[{name:\"b-1\"}], callBack: function(){ console.log('callBack'); }}\n * ];\n * var copiedObj = ax5.util.deepCopy(obj)\n * ```\n */\n function deepCopy(obj) {\n var r, l;\n if ((typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) == 'object') {\n if (U.isArray(obj)) {\n l = obj.length;\n r = new Array(l);\n for (var i = 0; i < l; i++) {\n r[i] = deepCopy(obj[i]);\n }\n return r;\n } else {\n return jQuery.extend({}, obj);\n }\n }\n return obj;\n }\n\n /**\n * HTML 문자열을 escape 처리합니다.\n * \"&lt;\" represents the < sign.\n * \"&gt;\" represents the > sign.\n * \"&amp;\" represents the & sign.\n * \"&quot; represents the \" mark.\n * [Character entity references](https://www.w3.org/TR/html401/charset.html#h-5.3)\n * @method ax5.util.escapeHtml\n * @param {String} s\n * @returns {string}\n * @example\n * ```\n * ax5.util.escapeHtml('HTML <span>string</span> & \"escape\"')\n * //\"HTML &lt;span&gt;string&lt;/span&gt; &amp; &quot;escape&quot;\"\n * ```\n */\n function escapeHtml(s) {\n if (_toString.call(s) != \"[object String]\") return s;\n if (!s) return \"\";\n return s.replace(/[\\<\\>\\&\\\"]/gm, function (match) {\n switch (match) {\n case \"<\":\n return \"&lt;\";\n case \">\":\n return \"&gt;\";\n case \"&\":\n return \"&amp;\";\n case \"\\\"\":\n return \"&quot;\";\n default:\n return match;\n }\n });\n }\n\n /**\n * HTML 문자열을 unescape 처리합니다.\n * escapeHtml를 참고하세요.\n * @method ax5.util.unescapeHtml\n * @param {String} s\n * @returns {string}\n * @example\n * ```\n * ax5.util.unescapeHtml('HTML &lt;span&gt;string&lt;/span&gt; &amp; &quot;escape&quot;')\n * //\"HTML <span>string</span> & \"escape\"\"\n * ```\n */\n function unescapeHtml(s) {\n if (_toString.call(s) != \"[object String]\") return s;\n if (!s) return \"\";\n return s.replace(/(&lt;)|(&gt;)|(&amp;)|(&quot;)/gm, function (match) {\n switch (match) {\n case \"&lt;\":\n return \"<\";\n case \"&gt;\":\n return \">\";\n case \"&amp;\":\n return \"&\";\n case \"&quot;\":\n return \"\\\"\";\n default:\n return match;\n }\n });\n }\n\n /**\n * @method ax5.util.string\n * @param {String} tmpl\n * @param {*} args\n * @return {ax5string}\n * @example\n * ```js\n * ax5.util.string(\"{0} is dead, but {1} is alive! {0} {2}\").format(\"ASP\", \"ASP.NET\");\n * ax5.util.string(\"{0} is dead, but {1} is alive! {0} {2}\").format([\"ASP\", \"ASP.NET\"]);\n * ax5.util.stinrg(\"{0} counts\").format(100);\n * ```\n */\n function string(_string) {\n return new function (_string) {\n this.value = _string;\n this.toString = function () {\n return this.value;\n };\n /**\n * @method ax5.util.string.format\n * @returns {*}\n */\n this.format = function () {\n var args = [];\n for (var i = 0, l = arguments.length; i < l; i++) {\n args = args.concat(arguments[i]);\n }\n return this.value.replace(/{(\\d+)}/g, function (match, number) {\n return typeof args[number] != 'undefined' ? args[number] : match;\n });\n };\n /**\n * @method ax5.util.string.escape\n * @returns {*}\n */\n this.escape = function () {\n return escapeHtml(this.value);\n };\n /**\n * @method ax5.util.string.unescape\n * @returns {*}\n */\n this.unescape = function () {\n return unescapeHtml(this.value);\n };\n /**\n * @method ax5.util.string.encode\n * @returns {*}\n */\n this.encode = function () {\n return encode(this.value);\n };\n /**\n * @method ax5.util.string.decode\n * @returns {*}\n */\n this.decode = function () {\n return decode(this.value);\n };\n /**\n * @method ax5.util.string.left\n * @param {String|Number} pos - 찾을 문자열 또는 포지션\n * @returns {*}\n */\n this.left = function (_pos) {\n return left(this.value, _pos);\n };\n /**\n * @method ax5.util.string.right\n * @param {String|Number} pos - 찾을 문자열 또는 포지션\n * @returns {*}\n */\n this.right = function (_pos) {\n return right(this.value, _pos);\n };\n /**\n * @method ax5.util.string.camelCase\n * @returns {*}\n */\n this.camelCase = function () {\n return camelCase(this.value);\n };\n /**\n * @method ax5.util.string.snakeCase\n * @returns {*}\n */\n this.snakeCase = function () {\n return snakeCase(this.value);\n };\n }(_string);\n }\n\n /**\n * @method ax5.util.color\n * @param _hexColor\n * @return {ax5color}\n * @example\n * ```js\n * ax5.util.color(\"#ff3300\").lighten(10).getHexValue()\n * console.log(ax5.util.color(\"#ff3300\").darken(10).getHexValue());\n * ```\n */\n function color(_hexColor) {\n\n var matchers = function () {\n\n // <http://www.w3.org/TR/css3-values/#integers>\n var CSS_INTEGER = \"[-\\\\+]?\\\\d+%?\";\n\n // <http://www.w3.org/TR/css3-values/#number-value>\n var CSS_NUMBER = \"[-\\\\+]?\\\\d*\\\\.\\\\d+%?\";\n\n // Allow positive/negative integer/number. Don't capture the either/or, just the entire outcome.\n var CSS_UNIT = \"(?:\" + CSS_NUMBER + \")|(?:\" + CSS_INTEGER + \")\";\n\n // Actual matching.\n // Parentheses and commas are optional, but not required.\n // Whitespace can take the place of commas or opening paren\n var PERMISSIVE_MATCH3 = \"[\\\\s|\\\\(]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")\\\\s*\\\\)?\";\n var PERMISSIVE_MATCH4 = \"[\\\\s|\\\\(]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")\\\\s*\\\\)?\";\n\n return {\n CSS_UNIT: new RegExp(CSS_UNIT),\n rgb: new RegExp(\"rgb\" + PERMISSIVE_MATCH3),\n rgba: new RegExp(\"rgba\" + PERMISSIVE_MATCH4),\n hsl: new RegExp(\"hsl\" + PERMISSIVE_MATCH3),\n hsla: new RegExp(\"hsla\" + PERMISSIVE_MATCH4),\n hsv: new RegExp(\"hsv\" + PERMISSIVE_MATCH3),\n hsva: new RegExp(\"hsva\" + PERMISSIVE_MATCH4),\n hex3: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,\n hex6: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,\n hex4: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,\n hex8: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/\n };\n }();\n\n var convertObject = function convertObject(_color) {\n var match = void 0;\n if (match = matchers.rgb.exec(_color)) {\n return { r: match[1], g: match[2], b: match[3] };\n }\n if (match = matchers.rgba.exec(_color)) {\n return { r: match[1], g: match[2], b: match[3], a: match[4] };\n }\n if (match = matchers.hsl.exec(_color)) {\n return { h: match[1], s: match[2], l: match[3] };\n }\n if (match = matchers.hsla.exec(_color)) {\n return { h: match[1], s: match[2], l: match[3], a: match[4] };\n }\n if (match = matchers.hsv.exec(_color)) {\n return { h: match[1], s: match[2], v: match[3] };\n }\n if (match = matchers.hsva.exec(_color)) {\n return { h: match[1], s: match[2], v: match[3], a: match[4] };\n }\n if (match = matchers.hex8.exec(_color)) {\n return {\n r: parseInt(match[1], 16),\n g: parseInt(match[2], 16),\n b: parseInt(match[3], 16),\n a: parseInt(match[4] / 255, 16),\n format: \"hex8\"\n };\n }\n if (match = matchers.hex6.exec(_color)) {\n return {\n r: parseInt(match[1], 16),\n g: parseInt(match[2], 16),\n b: parseInt(match[3], 16),\n format: \"hex\"\n };\n }\n if (match = matchers.hex4.exec(_color)) {\n return {\n r: parseInt(match[1] + '' + match[1], 16),\n g: parseInt(match[2] + '' + match[2], 16),\n b: parseInt(match[3] + '' + match[3], 16),\n a: parseInt(match[4] + '' + match[4], 16),\n format: \"hex8\"\n };\n }\n if (match = matchers.hex3.exec(_color)) {\n return {\n r: parseInt(match[1] + '' + match[1], 16),\n g: parseInt(match[2] + '' + match[2], 16),\n b: parseInt(match[3] + '' + match[3], 16),\n format: \"hex\"\n };\n }\n\n return false;\n };\n\n function isOnePointZero(n) {\n return typeof n == \"string\" && n.indexOf('.') != -1 && parseFloat(n) === 1;\n }\n\n function isPercentage(n) {\n return typeof n === \"string\" && n.indexOf('%') != -1;\n }\n\n function convertToPercentage(n) {\n if (n <= 1) {\n n = n * 100 + \"%\";\n }\n\n return n;\n }\n\n function convertTo255(n) {\n return ax5.util.number(Math.min(255, Math.max(n, 0)), { 'round': 2 });\n }\n\n function convertToHex(n) {\n return setDigit(Math.round(n).toString(16), 2);\n }\n\n function bound01(n, max) {\n if (isOnePointZero(n)) {\n n = \"100%\";\n }\n\n var processPercent = isPercentage(n);\n n = Math.min(max, Math.max(0, parseFloat(n)));\n\n // Automatically convert percentage into number\n if (processPercent) {\n n = parseInt(n * max, 10) / 100;\n }\n\n // Handle floating point rounding errors\n if (Math.abs(n - max) < 0.000001) {\n return 1;\n }\n\n // Convert into [0, 1] range if it isn't already\n return n % max / parseFloat(max);\n }\n\n function rgbToHsl(r, g, b) {\n r = bound01(r, 255);\n g = bound01(g, 255);\n b = bound01(b, 255);\n\n var max = Math.max(r, g, b),\n min = Math.min(r, g, b);\n var h,\n s,\n l = (max + min) / 2;\n\n if (max == min) {\n h = s = 0; // achromatic\n } else {\n var d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n\n h /= 6;\n }\n\n return { h: h, s: s, l: l };\n }\n\n function hslToRgb(h, s, l) {\n var r = void 0,\n g = void 0,\n b = void 0;\n\n h = bound01(h, 360);\n s = bound01(s, 100);\n l = bound01(l, 100);\n\n function hue2rgb(p, q, t) {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n }\n\n if (s === 0) {\n r = g = b = l; // achromatic\n } else {\n var q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n var p = 2 * l - q;\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n\n return { r: r * 255, g: g * 255, b: b * 255 };\n }\n\n return new function (_color) {\n this._originalValue = _color;\n _color = convertObject(_color);\n this.r = _color.r;\n this.g = _color.g;\n this.b = _color.b;\n this.a = _color.a || 1;\n this._format = _color.format;\n this._hex = convertToHex(this.r) + convertToHex(this.g) + convertToHex(this.b);\n\n this.getHexValue = function () {\n return this._hex;\n };\n\n this.lighten = function (amount) {\n amount = amount === 0 ? 0 : amount || 10;\n var hsl = rgbToHsl(this.r, this.g, this.b),\n rgb = {};\n\n hsl.l += amount / 100;\n hsl.l = Math.min(1, Math.max(0, hsl.l));\n hsl.h = hsl.h * 360;\n\n rgb = hslToRgb(hsl.h, convertToPercentage(hsl.s), convertToPercentage(hsl.l));\n\n return color('rgba(' + convertTo255(rgb.r) + ', ' + convertTo255(rgb.g) + ', ' + convertTo255(rgb.b) + ', ' + this.a + ')');\n };\n\n this.darken = function (amount) {\n amount = amount === 0 ? 0 : amount || 10;\n var hsl = rgbToHsl(this.r, this.g, this.b),\n rgb = {};\n\n hsl.l -= amount / 100;\n hsl.l = Math.min(1, Math.max(0, hsl.l));\n hsl.h = hsl.h * 360;\n\n rgb = hslToRgb(hsl.h, convertToPercentage(hsl.s), convertToPercentage(hsl.l));\n\n return color('rgba(' + convertTo255(rgb.r) + ', ' + convertTo255(rgb.g) + ', ' + convertTo255(rgb.b) + ', ' + this.a + ')');\n };\n\n this.getBrightness = function () {\n return (this.r * 299 + this.g * 587 + this.b * 114) / 1000;\n };\n\n this.isDark = function () {\n return this.getBrightness() < 128;\n };\n\n this.isLight = function () {\n return !this.isDark();\n };\n\n this.getHsl = function () {\n var hsl = rgbToHsl(this.r, this.g, this.b);\n hsl.l = Math.min(1, Math.max(0, hsl.l));\n hsl.h = hsl.h * 360;\n return {\n h: hsl.h,\n s: hsl.s,\n l: hsl.l\n };\n };\n }(_hexColor);\n }\n\n return {\n alert: alert,\n each: each,\n map: map,\n search: search,\n reduce: reduce,\n reduceRight: reduceRight,\n filter: filter,\n sum: sum,\n avg: avg,\n toJson: toJson,\n parseJson: parseJson,\n first: first,\n last: last,\n deepCopy: deepCopy,\n\n left: left,\n right: right,\n getType: getType,\n isWindow: isWindow,\n isElement: isElement,\n isObject: isObject,\n isArray: isArray,\n isFunction: isFunction,\n isString: isString,\n isNumber: isNumber,\n isNodelist: isNodelist,\n isUndefined: isUndefined,\n isNothing: isNothing,\n setCookie: setCookie,\n getCookie: getCookie,\n camelCase: camelCase,\n snakeCase: snakeCase,\n number: number,\n toArray: toArray,\n merge: merge,\n param: param,\n error: error,\n date: date,\n dday: dday,\n daysOfMonth: daysOfMonth,\n weeksOfMonth: weeksOfMonth,\n setDigit: setDigit,\n times: times,\n findParentNode: findParentNode,\n cssNumber: cssNumber,\n css: css,\n isDate: isDate,\n isDateFormat: isDateFormat,\n stopEvent: stopEvent,\n selectRange: selectRange,\n debounce: debounce,\n throttle: throttle,\n escapeHtml: escapeHtml,\n unescapeHtml: unescapeHtml,\n\n string: string,\n color: color\n };\n }();\n\n if ((typeof module === 'undefined' ? 'undefined' : _typeof(module)) === \"object\" && _typeof(module.exports) === \"object\") {\n module.exports = ax5;\n } else {\n root.ax5 = function () {\n return ax5;\n }(); // ax5.ui에 연결\n }\n}).call(typeof window !== \"undefined\" ? window : undefined);\n\nax5.def = {};\nax5.info.errorMsg[\"ax5dialog\"] = {\n \"501\": \"Duplicate call error\"\n};\n\nax5.info.errorMsg[\"ax5picker\"] = {\n \"401\": \"Can not find target element\",\n \"402\": \"Can not find boundID\",\n \"501\": \"Can not find content key\"\n};\n\nax5.info.errorMsg[\"single-uploader\"] = {\n \"460\": \"There are no files to be uploaded.\",\n \"461\": \"There is no uploaded files.\"\n};\n\nax5.info.errorMsg[\"ax5calendar\"] = {\n \"401\": \"Can not find target element\"\n};\n\nax5.info.errorMsg[\"ax5formatter\"] = {\n \"401\": \"Can not find target element\",\n \"402\": \"Can not find boundID\",\n \"501\": \"Can not find pattern\"\n};\n\nax5.info.errorMsg[\"ax5menu\"] = {\n \"501\": \"Can not find menu item\"\n};\n\nax5.info.errorMsg[\"ax5select\"] = {\n \"401\": \"Can not find target element\",\n \"402\": \"Can not find boundID\",\n \"501\": \"Can not find option\"\n};\n\nax5.info.errorMsg[\"ax5combobox\"] = {\n \"401\": \"Can not find target element\",\n \"402\": \"Can not find boundID\",\n \"501\": \"Can not find option\"\n};\n// 필수 Ployfill 확장 구문\n(function () {\n 'use strict';\n\n var root = this,\n re_trim = /^\\s*|\\s*$/g;\n\n // From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys\n if (!Object.keys) {\n Object.keys = function () {\n var hwp = Object.prototype.hasOwnProperty,\n hdeb = !{ toString: null }.propertyIsEnumerable('toString'),\n de = ['toString', 'toLocaleString', 'valueOf', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable', 'constructor'],\n del = de.length;\n\n return function (obj) {\n if ((typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) !== 'object' && (typeof obj !== 'function' || obj === null)) throw new TypeError('type err');\n var r = [],\n prop,\n i;\n for (prop in obj) {\n if (hwp.call(obj, prop)) r.push(prop);\n }if (hdeb) {\n for (i = 0; i < del; i++) {\n if (hwp.call(obj, de[i])) r.push(de[i]);\n }\n }\n return r;\n };\n }();\n }\n\n // ES5 15.4.4.18 Array.prototype.forEach ( callbackfn [ , thisArg ] )\n // From https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/forEach\n if (!Array.prototype.forEach) {\n Array.prototype.forEach = function (fun /*, thisp */) {\n if (this === void 0 || this === null) {\n throw TypeError();\n }\n var t = Object(this);\n var len = t.length >>> 0;\n if (typeof fun !== \"function\") {\n throw TypeError();\n }\n var thisp = arguments[1],\n i;\n for (i = 0; i < len; i++) {\n if (i in t) {\n fun.call(thisp, t[i], i, t);\n }\n }\n };\n }\n\n // ES5 15.3.4.5 Function.prototype.bind ( thisArg [, arg1 [, arg2, ... ]] )\n // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind\n if (!Function.prototype.bind) {\n Function.prototype.bind = function (o) {\n if (typeof this !== 'function') {\n throw TypeError(\"function\");\n }\n var slice = [].slice,\n args = slice.call(arguments, 1),\n self = this,\n bound = function bound() {\n return self.apply(this instanceof nop ? this : o, args.concat(slice.call(arguments)));\n };\n\n function nop() {}\n\n nop.prototype = self.prototype;\n bound.prototype = new nop();\n return bound;\n };\n }\n\n /*global document */\n /**\n * define document.querySelector & document.querySelectorAll for IE7\n *\n * A not very fast but small hack. The approach is taken from\n * http://weblogs.asp.net/bleroy/archive/2009/08/31/queryselectorall-on-old-ie-versions-something-that-doesn-t-work.aspx\n *\n */\n (function () {\n if (document.querySelectorAll || document.querySelector) {\n return;\n }\n if (!document.createStyleSheet) return;\n var style = document.createStyleSheet(),\n select = function select(selector, maxCount) {\n var all = document.all,\n l = all.length,\n i,\n resultSet = [];\n\n style.addRule(selector, \"foo:bar\");\n for (i = 0; i < l; i += 1) {\n if (all[i].currentStyle.foo === \"bar\") {\n resultSet.push(all[i]);\n if (resultSet.length > maxCount) {\n break;\n }\n }\n }\n style.removeRule(0);\n return resultSet;\n };\n\n document.querySelectorAll = function (selector) {\n return select(selector, Infinity);\n };\n document.querySelector = function (selector) {\n return select(selector, 1)[0] || null;\n };\n })();\n\n if (!String.prototype.trim) {\n (function () {\n String.prototype.trim = function () {\n return this.replace(re_trim, '');\n };\n })();\n }\n\n if (!window.JSON) {\n window.JSON = {\n parse: function parse(sJSON) {\n return new Function('', 'return ' + sJSON)();\n },\n stringify: function () {\n var r = /[\"]/g,\n _f;\n return _f = function f(vContent) {\n var result, i, j;\n switch (result = typeof vContent === 'undefined' ? 'undefined' : _typeof(vContent)) {\n case 'string':\n return '\"' + vContent.replace(r, '\\\\\"') + '\"';\n case 'number':\n case 'boolean':\n return vContent.toString();\n case 'undefined':\n return 'undefined';\n case 'function':\n return '\"\"';\n case 'object':\n if (!vContent) return 'null';\n result = '';\n if (vContent.splice) {\n for (i = 0, j = vContent.length; i < j; i++) {\n result += ',' + _f(vContent[i]);\n }return '[' + result.substr(1) + ']';\n } else {\n for (i in vContent) {\n if (vContent.hasOwnProperty(i) && vContent[i] !== undefined && typeof vContent[i] != 'function') result += ',\"' + i + '\":' + _f(vContent[i]);\n }return '{' + result.substr(1) + '}';\n }\n }\n };\n }()\n };\n }\n\n // splice ie8 <= polyfill\n (function () {\n if (!document.documentMode || document.documentMode >= 9) return false;\n var _splice = Array.prototype.splice;\n Array.prototype.splice = function () {\n var args = Array.prototype.slice.call(arguments);\n if (typeof args[1] === \"undefined\") args[1] = this.length - args[0];\n return _splice.apply(this, args);\n };\n })();\n\n /**\n * Shim for \"fixing\" IE's lack of support (IE < 9) for applying slice\n * on host objects like NamedNodeMap, NodeList, and HTMLCollection\n * (technically, since host objects have been implementation-dependent,\n * at least before ES6, IE hasn't needed to work this way).\n * Also works on strings, fixes IE < 9 to allow an explicit undefined\n * for the 2nd argument (as in Firefox), and prevents errors when\n * called on other DOM objects.\n */\n (function () {\n 'use strict';\n\n var _slice = Array.prototype.slice;\n\n try {\n // Can't be used with DOM elements in IE < 9\n _slice.call(document.documentElement);\n } catch (e) {\n // Fails in IE < 9\n // This will work for genuine arrays, array-like objects,\n // NamedNodeMap (attributes, entities, notations),\n // NodeList (e.g., getElementsByTagName), HTMLCollection (e.g., childNodes),\n // and will not fail on other DOM objects (as do DOM elements in IE < 9)\n Array.prototype.slice = function (begin, end) {\n // IE < 9 gets unhappy with an undefined end argument\n end = typeof end !== 'undefined' ? end : this.length;\n\n // For native Array objects, we use the native slice function\n if (Object.prototype.toString.call(this) === '[object Array]') {\n return _slice.call(this, begin, end);\n }\n\n // For array like object we handle it ourselves.\n var i,\n cloned = [],\n size,\n len = this.length;\n\n // Handle negative value for \"begin\"\n var start = begin || 0;\n start = start >= 0 ? start : Math.max(0, len + start);\n\n // Handle negative value for \"end\"\n var upTo = typeof end == 'number' ? Math.min(end, len) : len;\n if (end < 0) {\n upTo = len + end;\n }\n\n // Actual expected size of the slice\n size = upTo - start;\n\n if (size > 0) {\n cloned = new Array(size);\n if (this.charAt) {\n for (i = 0; i < size; i++) {\n cloned[i] = this.charAt(start + i);\n }\n } else {\n for (i = 0; i < size; i++) {\n cloned[i] = this[start + i];\n }\n }\n }\n\n return cloned;\n };\n }\n })();\n\n // Console-polyfill. MIT license. https://github.com/paulmillr/console-polyfill\n // Make it safe to do console.log() always.\n (function (con) {\n var prop, method;\n var empty = {};\n var dummy = function dummy() {};\n var properties = 'memory'.split(',');\n var methods = ('assert,clear,count,debug,dir,dirxml,error,exception,group,' + 'groupCollapsed,groupEnd,info,log,markTimeline,profile,profiles,profileEnd,' + 'show,table,time,timeEnd,timeline,timelineEnd,timeStamp,trace,warn').split(',');\n while (prop = properties.pop()) {\n con[prop] = con[prop] || empty;\n }while (method = methods.pop()) {\n con[method] = con[method] || dummy;\n }\n })(window.console || {}); // Using `this` for web workers.\n\n\n // Modernizr style test\n if (!(window.webkitMatchMedia || window.mozMatchMedia || window.oMatchMedia || window.msMatchMedia || window.matchMedia)) {\n var root = document.getElementsByTagName('html')[0];\n root.className += ' no-matchmedia';\n }\n\n /*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas, David Knight. Dual MIT/BSD license */\n window.matchMedia || (window.matchMedia = function () {\n \"use strict\";\n\n // For browsers that support matchMedium api such as IE 9 and webkit\n\n var styleMedia = window.styleMedia || window.media;\n\n // For those that don't support matchMedium\n if (!styleMedia) {\n var style = document.createElement('style'),\n script = document.getElementsByTagName('script')[0],\n info = null;\n\n style.type = 'text/css';\n style.id = 'matchmediajs-test';\n\n script.parentNode.insertBefore(style, script);\n\n // 'style.currentStyle' is used by IE <= 8 and 'window.getComputedStyle' for all other browsers\n info = 'getComputedStyle' in window && window.getComputedStyle(style, null) || style.currentStyle;\n\n styleMedia = {\n matchMedium: function matchMedium(media) {\n var text = '@media ' + media + '{ #matchmediajs-test { width: 1px; } }';\n\n // 'style.styleSheet' is used by IE <= 8 and 'style.textContent' for all other browsers\n if (style.styleSheet) {\n style.styleSheet.cssText = text;\n } else {\n style.textContent = text;\n }\n\n // Test if media query is true or false\n return info.width === '1px';\n }\n };\n }\n\n return function (media) {\n return {\n matches: styleMedia.matchMedium(media || 'all'),\n media: media || 'all'\n };\n };\n }());\n\n /*! matchMedia() polyfill addListener/removeListener extension. Author & copyright (c) 2012: Scott Jehl. Dual MIT/BSD license */\n (function () {\n // Bail out for browsers that have addListener support\n if (window.matchMedia && window.matchMedia('all').addListener) {\n return false;\n }\n\n var localMatchMedia = window.matchMedia,\n hasMediaQueries = localMatchMedia('only all').matches,\n isListening = false,\n timeoutID = 0,\n // setTimeout for debouncing 'handleChange'\n queries = [],\n // Contains each 'mql' and associated 'listeners' if 'addListener' is used\n handleChange = function handleChange(evt) {\n // Debounce\n clearTimeout(timeoutID);\n\n timeoutID = setTimeout(function () {\n for (var i = 0, il = queries.length; i < il; i++) {\n var mql = queries[i].mql,\n listeners = queries[i].listeners || [],\n matches = localMatchMedia(mql.media).matches;\n\n // Update mql.matches value and call listeners\n // Fire listeners only if transitioning to or from matched state\n if (matches !== mql.matches) {\n mql.matches = matches;\n\n for (var j = 0, jl = listeners.length; j < jl; j++) {\n listeners[j].call(window, mql);\n }\n }\n }\n }, 30);\n };\n\n window.matchMedia = function (media) {\n var mql = localMatchMedia(media),\n listeners = [],\n index = 0;\n\n mql.addListener = function (listener) {\n // Changes would not occur to css media type so return now (Affects IE <= 8)\n if (!hasMediaQueries) {\n return;\n }\n\n // Set up 'resize' listener for browsers that support CSS3 media queries (Not for IE <= 8)\n // There should only ever be 1 resize listener running for performance\n if (!isListening) {\n isListening = true;\n window.addEventListener('resize', handleChange, true);\n }\n\n // Push object only if it has not been pushed already\n if (index === 0) {\n index = queries.push({\n mql: mql,\n listeners: listeners\n });\n }\n\n listeners.push(listener);\n };\n\n mql.removeListener = function (listener) {\n for (var i = 0, il = listeners.length; i < il; i++) {\n if (listeners[i] === listener) {\n listeners.splice(i, 1);\n }\n }\n };\n\n return mql;\n };\n })();\n\n // extend innerWidth ..\n var html = document.getElementsByTagName('html')[0];\n var body = document.getElementsByTagName('body')[0];\n\n /*\n if (!window.innerWidth) window.innerWidth = html.clientWidth;\n if (!window.innerHeight) window.innerHeight = html.clientHeight;\n if (!window.scrollX) window.scrollX = window.pageXOffset || html.scrollLeft;\n if (!window.scrollY) window.scrollY = window.pageYOffset || html.scrollTop;\n */\n}).call(window);\n/**\n * Refer to this by {@link ax5}.\n * @namespace ax5.ui\n */\n\n/**\n * @class ax5.ui.root\n * @classdesc ax5 ui class\n * @author tom@axisj.com\n * @example\n * ```\n * var myui = new ax5.ui.root();\n * ```\n */\nax5.ui = function () {\n\n function axUi() {\n this.config = {};\n this.name = \"root\";\n\n /**\n * 클래스의 속성 정의 메소드 속성 확장후에 내부에 init 함수를 호출합니다.\n * @method ax5.ui.root.setConfig\n * @param {Object} config - 클래스 속성값\n * @param {Boolean} [callInit=true] - init 함수 호출 여부\n * @returns {ax5.ui.axUi}\n * @example\n * ```\n * var myui = new ax5.ui.root();\n * myui.setConfig({\n * \tid:\"abcd\"\n * });\n * ```\n */\n this.setConfig = function (cfg, callInit) {\n jQuery.extend(true, this.config, cfg);\n if (typeof callInit == \"undefined\" || callInit === true) {\n this.init();\n }\n return this;\n };\n this.init = function () {\n console.log(this.config);\n };\n\n this.bindWindowResize = function (callBack) {\n setTimeout(function () {\n jQuery(window).resize(function () {\n if (this.bindWindowResize__) clearTimeout(this.bindWindowResize__);\n this.bindWindowResize__ = setTimeout(function () {\n callBack.call(this);\n }.bind(this), 10);\n }.bind(this));\n }.bind(this), 100);\n };\n\n this.stopEvent = function (e) {\n if (e.preventDefault) e.preventDefault();\n if (e.stopPropagation) e.stopPropagation();\n e.cancelBubble = true;\n return false;\n };\n\n this.toString = function () {\n return this.name + '@' + this.version;\n };\n\n // instance init\n this.main = function () {}.apply(this, arguments);\n }\n\n /**\n * @method ax5.ui.addClass\n * @param {Object} config\n * @param {String} config.className - name of Class\n * @param {Object} [config.classStore=ax5.ui] - 클래스가 저장될 경로\n * @param {Function} [config.superClass=ax5.ui.root]\n * @param {Function} cls - Class Function\n */\n function addClass(config, cls) {\n if (!config || !config.className) throw 'invalid call';\n var classStore = config.classStore ? config.classStore : ax5.ui;\n if (!classStore) throw 'invalid classStore';\n\n // make ui definition variable\n ax5.def[config.className] = {\n version: ax5.info.version\n };\n\n var factory = function factory(cls, arg) {\n switch (arg.length) {\n case 0:\n return new cls();\n break;\n case 1:\n return new cls(arg[0]);\n break;\n case 2:\n return new cls(arg[0], arg[1]);\n break;\n case 3:\n return new cls(arg[0], arg[1], arg[2]);\n break;\n }\n };\n var initInstance = function initInstance(name, version, instance) {\n instance.name = name;\n instance.version = version;\n instance.instanceId = ax5.getGuid();\n return instance;\n };\n var initPrototype = function initPrototype(cls) {\n var superClass = config.superClass ? config.superClass : ax5.ui.root;\n if (!ax5.util.isFunction(superClass)) throw 'invalid superClass';\n superClass.call(this); // 부모호출\n cls.prototype = new superClass(); // 상속\n };\n var wrapper = function wrapper() {\n if (!this || !(this instanceof wrapper)) throw 'invalid call';\n var instance = factory(cls, arguments);\n return initInstance(config.className, config.version || \"\", instance);\n };\n initPrototype.call(this, cls);\n classStore[config.className] = wrapper;\n }\n\n return {\n root: axUi,\n addClass: addClass\n };\n}();\n\n/*!\n * mustache.js - Logic-less {{mustache}} templates with JavaScript\n * http://github.com/janl/mustache.js\n * https://github.com/thomasJang/mustache.js -- imporove some variables\n */\n\n(function defineMustache(global, factory) {\n\n factory(global.mustache = {});\n})(window.ax5, function mustacheFactory(mustache) {\n\n var objectToString = Object.prototype.toString;\n var isArray = Array.isArray || function isArrayPolyfill(object) {\n return objectToString.call(object) === '[object Array]';\n };\n\n function isFunction(object) {\n return typeof object === 'function';\n }\n\n /**\n * More correct typeof string handling array\n * which normally returns typeof 'object'\n */\n function typeStr(obj) {\n return isArray(obj) ? 'array' : typeof obj === 'undefined' ? 'undefined' : _typeof(obj);\n }\n\n function escapeRegExp(string) {\n return string.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, '\\\\$&');\n }\n\n /**\n * Null safe way of checking whether or not an object,\n * including its prototype, has a given property\n */\n function hasProperty(obj, propName) {\n return obj != null && (typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) === 'object' && propName in obj;\n }\n\n // Workaround for https://issues.apache.org/jira/browse/COUCHDB-577\n // See https://github.com/janl/mustache.js/issues/189\n var regExpTest = RegExp.prototype.test;\n\n function testRegExp(re, string) {\n return regExpTest.call(re, string);\n }\n\n var nonSpaceRe = /\\S/;\n\n function isWhitespace(string) {\n return !testRegExp(nonSpaceRe, string);\n }\n\n var entityMap = {\n '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;', '/': '&#x2F;'\n };\n\n function escapeHtml(string) {\n return String(string).replace(/[&<>\"'\\/]/g, function fromEntityMap(s) {\n return entityMap[s];\n });\n }\n\n var whiteRe = /\\s*/;\n var spaceRe = /\\s+/;\n var equalsRe = /\\s*=/;\n var curlyRe = /\\s*\\}/;\n var tagRe = /#|\\^|\\/|>|\\{|&|=|!/;\n\n /**\n * Breaks up the given `template` string into a tree of tokens. If the `tags`\n * argument is given here it must be an array with two string values: the\n * opening and closing tags used in the template (e.g. [ \"<%\", \"%>\" ]). Of\n * course, the default is to use mustaches (i.e. mustache.tags).\n *\n * A token is an array with at least 4 elements. The first element is the\n * mustache symbol that was used inside the tag, e.g. \"#\" or \"&\". If the tag\n * did not contain a symbol (i.e. {{myValue}}) this element is \"name\". For\n * all text that appears outside a symbol this element is \"text\".\n *\n * The second element of a token is its \"value\". For mustache tags this is\n * whatever else was inside the tag besides the opening symbol. For text tokens\n * this is the text itself.\n *\n * The third and fourth elements of the token are the start and end indices,\n * respectively, of the token in the original template.\n *\n * Tokens that are the root node of a subtree contain two more elements: 1) an\n * array of tokens in the subtree and 2) the index in the original template at\n * which the closing tag for that section begins.\n */\n function parseTemplate(template, tags) {\n if (!template) return [];\n\n var sections = []; // Stack to hold section tokens\n var tokens = []; // Buffer to hold the tokens\n var spaces = []; // Indices of whitespace tokens on the current line\n var hasTag = false; // Is there a {{tag}} on the current line?\n var nonSpace = false; // Is there a non-space char on the current line?\n\n // Strips all whitespace tokens array for the current line\n // if there was a {{#tag}} on it and otherwise only space.\n function stripSpace() {\n if (hasTag && !nonSpace) {\n while (spaces.length) {\n delete tokens[spaces.pop()];\n }\n } else {\n spaces = [];\n }\n\n hasTag = false;\n nonSpace = false;\n }\n\n var openingTagRe, closingTagRe, closingCurlyRe;\n\n function compileTags(tagsToCompile) {\n if (typeof tagsToCompile === 'string') tagsToCompile = tagsToCompile.split(spaceRe, 2);\n\n if (!isArray(tagsToCompile) || tagsToCompile.length !== 2) throw new Error('Invalid tags: ' + tagsToCompile);\n\n openingTagRe = new RegExp(escapeRegExp(tagsToCompile[0]) + '\\\\s*');\n closingTagRe = new RegExp('\\\\s*' + escapeRegExp(tagsToCompile[1]));\n closingCurlyRe = new RegExp('\\\\s*' + escapeRegExp('}' + tagsToCompile[1]));\n }\n\n compileTags(tags || mustache.tags);\n\n var scanner = new Scanner(template);\n\n var start, type, value, chr, token, openSection;\n while (!scanner.eos()) {\n start = scanner.pos;\n\n // Match any text between tags.\n value = scanner.scanUntil(openingTagRe);\n\n if (value) {\n for (var i = 0, valueLength = value.length; i < valueLength; ++i) {\n chr = value.charAt(i);\n\n if (isWhitespace(chr)) {\n spaces.push(tokens.length);\n } else {\n nonSpace = true;\n }\n\n tokens.push(['text', chr, start, start + 1]);\n start += 1;\n\n // Check for whitespace on the current line.\n if (chr === '\\n') stripSpace();\n }\n }\n\n // Match the opening tag.\n if (!scanner.scan(openingTagRe)) break;\n\n hasTag = true;\n\n // Get the tag type.\n type = scanner.scan(tagRe) || 'name';\n scanner.scan(whiteRe);\n\n // Get the tag value.\n if (type === '=') {\n value = scanner.scanUntil(equalsRe);\n scanner.scan(equalsRe);\n scanner.scanUntil(closingTagRe);\n } else if (type === '{') {\n value = scanner.scanUntil(closingCurlyRe);\n scanner.scan(curlyRe);\n scanner.scanUntil(closingTagRe);\n type = '&';\n } else {\n value = scanner.scanUntil(closingTagRe);\n }\n\n // Match the closing tag.\n if (!scanner.scan(closingTagRe)) throw new Error('Unclosed tag at ' + scanner.pos);\n\n token = [type, value, start, scanner.pos];\n tokens.push(token);\n\n if (type === '#' || type === '^') {\n sections.push(token);\n } else if (type === '/') {\n // Check section nesting.\n openSection = sections.pop();\n\n if (!openSection) throw new Error('Unopened section \"' + value + '\" at ' + start);\n\n if (openSection[1] !== value) throw new Error('Unclosed section \"' + openSection[1] + '\" at ' + start);\n } else if (type === 'name' || type === '{' || type === '&') {\n nonSpace = true;\n } else if (type === '=') {\n // Set the tags for the next time around.\n compileTags(value);\n }\n }\n\n // Make sure there are no open sections when we're done.\n openSection = sections.pop();\n\n if (openSection) throw new Error('Unclosed section \"' + openSection[1] + '\" at ' + scanner.pos);\n\n return nestTokens(squashTokens(tokens));\n }\n\n /**\n * Combines the values of consecutive text tokens in the given `tokens` array\n * to a single token.\n */\n function squashTokens(tokens) {\n var squashedTokens = [];\n\n var token, lastToken;\n for (var i = 0, numTokens = tokens.length; i < numTokens; ++i) {\n token = tokens[i];\n\n if (token) {\n if (token[0] === 'text' && lastToken && lastToken[0] === 'text') {\n lastToken[1] += token[1];\n lastToken[3] = token[3];\n } else {\n squashedTokens.push(token);\n lastToken = token;\n }\n }\n }\n\n return squashedTokens;\n }\n\n /**\n * Forms the given array of `tokens` into a nested tree structure where\n * tokens that represent a section have two additional items: 1) an array of\n * all tokens that appear in that section and 2) the index in the original\n * template that represents the end of that section.\n */\n function nestTokens(tokens) {\n var nestedTokens = [];\n var collector = nestedTokens;\n var sections = [];\n\n var token, section;\n for (var i = 0, numTokens = tokens.length; i < numTokens; ++i) {\n token = tokens[i];\n\n switch (token[0]) {\n case '#':\n case '^':\n collector.push(token);\n sections.push(token);\n collector = token[4] = [];\n break;\n case '/':\n section = sections.pop();\n section[5] = token[2];\n collector = sections.length > 0 ? sections[sections.length - 1][4] : nestedTokens;\n break;\n default:\n collector.push(token);\n }\n }\n\n return nestedTokens;\n }\n\n /**\n * A simple string scanner that is used by the template parser to find\n * tokens in template strings.\n */\n function Scanner(string) {\n this.string = string;\n this.tail = string;\n this.pos = 0;\n }\n\n /**\n * Returns `true` if the tail is empty (end of string).\n */\n Scanner.prototype.eos = function eos() {\n return this.tail === '';\n };\n\n /**\n * Tries to match the given regular expression at the current position.\n * Returns the matched text if it can match, the empty string otherwise.\n */\n Scanner.prototype.scan = function scan(re) {\n var match = this.tail.match(re);\n\n if (!match || match.index !== 0) return '';\n\n var string = match[0];\n\n this.tail = this.tail.substring(string.length);\n this.pos += string.length;\n\n return string;\n };\n\n /**\n * Skips all text until the given regular expression can be matched. Returns\n * the skipped string, which is the entire tail if no match can be made.\n */\n Scanner.prototype.scanUntil = function scanUntil(re) {\n var index = this.tail.search(re),\n match;\n\n switch (index) {\n case -1:\n match = this.tail;\n this.tail = '';\n break;\n case 0:\n match = '';\n break;\n default:\n match = this.tail.substring(0, index);\n this.tail = this.tail.substring(index);\n }\n\n this.pos += match.length;\n\n return match;\n };\n\n /**\n * Represents a rendering context by wrapping a view object and\n * maintaining a reference to the parent context.\n */\n function Context(view, parentContext) {\n this.view = view;\n this.cache = {\n '.': this.view,\n '@each': function each() {\n var returns = [];\n for (var k in this) {\n returns.push({ '@key': k, '@value': this[k] });\n }\n return returns;\n }\n };\n this.parent = parentContext;\n }\n\n /**\n * Creates a new context using the given view with this context\n * as the parent.\n */\n Context.prototype.push = function push(view) {\n return new Context(view, this);\n };\n\n /**\n * Returns the value of the given name in this context, traversing\n * up the context hierarchy if the value is absent in this context's view.\n */\n Context.prototype.lookup = function lookup(name) {\n var cache = this.cache;\n\n var value;\n if (cache.hasOwnProperty(name)) {\n value = cache[name];\n } else {\n var context = this,\n names,\n index,\n lookupHit = false;\n\n while (context) {\n if (name.indexOf('.') > 0) {\n value = context.view;\n names = name.split('.');\n index = 0;\n\n /**\n * Using the dot notion path in `name`, we descend through the\n * nested objects.\n *\n * To be certain that the lookup has been successful, we have to\n * check if the last object in the path actually has the property\n * we are looking for. We store the result in `lookupHit`.\n *\n * This is specially necessary for when the value has been set to\n * `undefined` and we want to avoid looking up parent contexts.\n **/\n while (value != null && index < names.length) {\n if (index === names.length - 1) lookupHit = hasProperty(value, names[index]);\n\n value = value[names[index++]];\n }\n } else {\n value = context.view[name];\n lookupHit = hasProperty(context.view, name);\n }\n\n if (lookupHit) break;\n\n context = context.parent;\n }\n\n cache[name] = value;\n }\n\n if (isFunction(value)) value = value.call(this.view);\n\n return value;\n };\n\n /**\n * A Writer knows how to take a stream of tokens and render them to a\n * string, given a context. It also maintains a cache of templates to\n * avoid the need to parse the same template twice.\n */\n function Writer() {\n this.cache = {};\n }\n\n /**\n * Clears all cached templates in this writer.\n */\n Writer.prototype.clearCache = function clearCache() {\n this.cache = {};\n };\n\n /**\n * Parses and caches the given `template` and returns the array of tokens\n * that is generated from the parse.\n */\n Writer.prototype.parse = function parse(template, tags) {\n var cache = this.cache;\n var tokens = cache[template];\n\n if (tokens == null) tokens = cache[template] = parseTemplate(template, tags);\n\n return tokens;\n };\n\n /**\n * High-level method that is used to render the given `template` with\n * the given `view`.\n *\n * The optional `partials` argument may be an object that contains the\n * names and templates of partials that are used in the template. It may\n * also be a function that is used to load partial templates on the fly\n * that takes a single argument: the name of the partial.\n */\n Writer.prototype.render = function render(template, view, partials) {\n var tokens = this.parse(template);\n var context = view instanceof Context ? view : new Context(view);\n return this.renderTokens(tokens, context, partials, template);\n };\n\n /**\n * Low-level method that renders the given array of `tokens` using\n * the given `context` and `partials`.\n *\n * Note: The `originalTemplate` is only ever used to extract the portion\n * of the original template that was contained in a higher-order section.\n * If the template doesn't use higher-order sections, this argument may\n * be omitted.\n */\n Writer.prototype.renderTokens = function renderTokens(tokens, context, partials, originalTemplate) {\n var buffer = '';\n var token, symbol, value;\n for (var i = 0, numTokens = tokens.length; i < numTokens; ++i) {\n value = undefined;\n token = tokens[i];\n symbol = token[0];\n\n if (symbol === '#') value = this.renderSection(token, context, partials, originalTemplate);else if (symbol === '^') value = this.renderInverted(token, context, partials, originalTemplate);else if (symbol === '>') value = this.renderPartial(token, context, partials, originalTemplate);else if (symbol === '&') value = this.unescapedValue(token, context);else if (symbol === 'name') value = this.escapedValue(token, context);else if (symbol === 'text') value = this.rawValue(token);\n\n if (value !== undefined) buffer += value;\n }\n\n return buffer;\n };\n\n Writer.prototype.renderSection = function renderSection(token, context, partials, originalTemplate) {\n var self = this;\n var buffer = '';\n\n var value = context.lookup(token[1]);\n\n // This function is used to render an arbitrary template\n // in the current context by higher-order sections.\n function subRender(template) {\n return self.render(template, context, partials);\n }\n\n if (!value) return;\n\n if (isArray(value)) {\n for (var j = 0, valueLength = value.length; j < valueLength; ++j) {\n if (value[j]) {\n if (_typeof(value[j]) === 'object') {\n value[j]['@i'] = j;\n value[j]['@first'] = j === 0;\n }\n\n buffer += this.renderTokens(token[4], context.push(value[j]), partials, originalTemplate);\n }\n }\n } else if ((typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object' || typeof value === 'string' || typeof value === 'number') {\n buffer += this.renderTokens(token[4], context.push(value), partials, originalTemplate);\n } else if (isFunction(value)) {\n if (typeof originalTemplate !== 'string') throw new Error('Cannot use higher-order sections without the original template');\n\n // Extract the portion of the original template that the section contains.\n value = value.call(context.view, originalTemplate.slice(token[3], token[5]), subRender);\n\n if (value != null) buffer += value;\n } else {\n buffer += this.renderTokens(token[4], context, partials, originalTemplate);\n }\n return buffer;\n };\n\n Writer.prototype.renderInverted = function renderInverted(token, context, partials, originalTemplate) {\n var value = context.lookup(token[1]);\n\n // Use JavaScript's definition of falsy. Include empty arrays.\n // See https://github.com/janl/mustache.js/issues/186\n if (!value || isArray(value) && value.length === 0) return this.renderTokens(token[4], context, partials, originalTemplate);\n };\n\n Writer.prototype.renderPartial = function renderPartial(token, context, partials) {\n if (!partials) return;\n\n var value = isFunction(partials) ? partials(token[1]) : partials[token[1]];\n if (value != null) return this.renderTokens(this.parse(value), context, partials, value);\n };\n\n Writer.prototype.unescapedValue = function unescapedValue(token, context) {\n var value = context.lookup(token[1]);\n if (value != null) return value;\n };\n\n Writer.prototype.escapedValue = function escapedValue(token, context) {\n var value = context.lookup(token[1]);\n if (value != null) return mustache.escape(value);\n };\n\n Writer.prototype.rawValue = function rawValue(token) {\n return token[1];\n };\n\n mustache.name = 'mustache.js';\n mustache.version = '2.1.3';\n mustache.tags = ['{{', '}}'];\n\n // All high-level mustache.* functions use this writer.\n var defaultWriter = new Writer();\n\n /**\n * Clears all cached templates in the default writer.\n */\n mustache.clearCache = function clearCache() {\n return defaultWriter.clearCache();\n };\n\n /**\n * Parses and caches the given template in the default writer and returns the\n * array of tokens it contains. Doing this ahead of time avoids the need to\n * parse templates on the fly as they are rendered.\n */\n mustache.parse = function parse(template, tags) {\n return defaultWriter.parse(template, tags);\n };\n\n /**\n * Renders the `template` with the given `view` and `partials` using the\n * default writer.\n */\n mustache.render = function render(template, view, partials) {\n if (typeof template !== 'string') {\n throw new TypeError('Invalid template! Template should be a \"string\" ' + 'but \"' + typeStr(template) + '\" was given as the first ' + 'argument for mustache#render(template, view, partials)');\n }\n\n return defaultWriter.render(template, view, partials);\n };\n\n // This is here for backwards compatibility with 0.4.x.,\n /*eslint-disable */ // eslint wants camel cased function name\n mustache.to_html = function to_html(template, view, partials, send) {\n /*eslint-enable*/\n\n var result = mustache.render(template, view, partials);\n\n if (isFunction(send)) {\n send(result);\n } else {\n return result;\n }\n };\n\n // Export the escaping function so that the user may override it.\n // See https://github.com/janl/mustache.js/issues/244\n mustache.escape = escapeHtml;\n\n // Export these mainly for testing, but also for advanced usage.\n mustache.Scanner = Scanner;\n mustache.Context = Context;\n mustache.Writer = Writer;\n});","'use strict';\n\n// ax5.ui.mask\n(function () {\n\n var UI = ax5.ui;\n var U = ax5.util;\n var MASK = void 0;\n\n UI.addClass({\n className: \"mask\"\n }, function () {\n /**\n * @class ax5mask\n * @classdesc\n * @author tom@axisj.com\n * @example\n * ```js\n * var customMask = function customMask() {\n * var cTmpl = '' +\n * '<div class=\"ax-mask\" id=\"{{maskId}}\" >' +\n * ' <div class=\"ax-mask-bg\" style=\"background-color:red !important;\"></div>' +\n * ' <div class=\"ax-mask-content\">' +\n * ' {{{body}}}' +\n * ' </div>' +\n * '</div>';\n * return cTmpl;\n * };\n * ax5.ui.mask.tmpl.customMask = customMask;\n *\n * var mask = new ax5.ui.mask();\n *\n * mask.open({\n * templateName: 'customMask',\n * content: 'custom MASK on target',\n * target: $(\"#user-content\").get(0),\n * onClick: function(){\n * console.log(this);\n * }\n * });\n * ```\n */\n return function () {\n var self = this,\n cfg = void 0;\n\n this.instanceId = ax5.getGuid();\n this.config = {\n theme: '',\n target: jQuery(document.body).get(0),\n animateTime: 250\n };\n this.maskContent = '';\n this.status = \"off\";\n\n cfg = this.config;\n\n var onStateChanged = function onStateChanged(opts, that) {\n if (opts && opts.onStateChanged) {\n opts.onStateChanged.call(that, that);\n } else if (this.onStateChanged) {\n this.onStateChanged.call(that, that);\n }\n\n opts = null;\n that = null;\n return true;\n };\n var getBodyTmpl = function getBodyTmpl(data) {\n if (typeof data.templateName === \"undefined\") data.templateName = \"defaultMask\";\n return MASK.tmpl.get.call(this, data.templateName, data);\n };\n var setBody = function setBody(content) {\n this.maskContent = content;\n };\n\n /**\n * Preferences of Mask UI\n * @method ax5mask.setConfig\n * @param {Object} config - 클래스 속성값\n * @returns {ax5mask}\n * @example\n * ```\n * setConfig({\n * target : {Element|AX5 nodelist}, // 마스크 처리할 대상\n * content : {String}, // 마스크안에 들어가는 내용물\n * onStateChanged: function(){} // 마스크 상태변경 시 호출되는 함수 this.type으로 예외처리 가능\n * }\n * ```\n */\n this.init = function () {\n // after setConfig();\n this.onStateChanged = cfg.onStateChanged;\n this.onClick = cfg.onClick;\n if (this.config.content) setBody.call(this, this.config.content);\n };\n\n /**\n * open mask\n * target 을 주지 않으면 기본적으로 body 에 마스크가 적용되고 원하는 타겟을 지정해서 마스크를 씌울 수 있습니다.\n * 기본 정의된 마스크 외에 사용자가 템플릿을 정의해서 마스크를 사용 가능합니다.\n * @method ax5mask.open\n * @param {Object} config\n * @param {String} config\n * @returns {ax5mask}\n * @example\n * ```js\n * my_mask.open({\n * target: document.body,\n * content: \"<h1>Loading..</h1>\",\n * onStateChanged: function () {\n *\n * }\n * });\n *\n * my_mask.open({\n * target: $(\"#mask-target\").get(0), // dom Element\n * content: \"<h1>Loading..</h1>\",\n * onStateChanged: function () {\n *\n * }\n * });\n *\n *\n * var customMask = function customMask() {\n * var cTmpl = '' +\n * '<div class=\"ax-mask\" id=\"{{maskId}}\" >' +\n * ' <div class=\"ax-mask-bg\" style=\"background-color:red !important;\"></div>' +\n * ' <div class=\"ax-mask-content\">' +\n * ' {{{body}}}' +\n * ' </div>' +\n * '</div>';\n * return cTmpl;\n * };\n * ax5.ui.mask.tmpl.customMask = customMask;\n *\n * my_mask.open({\n * target: $(\"#mask-target\").get(0), // dom Element\n * content: \"<h1>Loading..</h1>\",\n * \n * onStateChanged: function () {\n *\n * }\n * });\n * ```\n */\n this.open = function (options) {\n\n if (this.status === \"on\") this.close();\n if (options && options.content) setBody.call(this, options.content);\n if (options && typeof options.templateName === \"undefined\") options.templateName = \"defaultMask\";\n self.maskConfig = jQuery.extend(true, {}, this.config, options);\n\n var _cfg = self.maskConfig,\n target = _cfg.target,\n $target = jQuery(target),\n maskId = 'ax-mask-' + ax5.getGuid(),\n $mask = void 0,\n css = {},\n that = {},\n templateName = _cfg.templateName,\n body = getBodyTmpl({\n theme: _cfg.theme,\n maskId: maskId,\n body: this.maskContent,\n templateName: templateName\n });\n\n jQuery(document.body).append(body);\n\n // 마스크의 타겟이 html body 가 아니라면\n if (target && target !== jQuery(document.body).get(0)) {\n css = {\n position: _cfg.position || \"absolute\",\n left: $target.offset().left,\n top: $target.offset().top,\n width: $target.outerWidth(),\n height: $target.outerHeight()\n };\n\n $target.addClass(\"ax-masking\");\n\n // 마스크의 타겟이 html body가 아닌경우 window resize 이벤트를 추적하여 엘리먼트 마스크의 CSS 속성 변경\n jQuery(window).on(\"resize.ax5mask-\" + this.instanceId, function (_$target) {\n this.align();\n }.bind(this));\n }\n\n if (typeof self.maskConfig.zIndex !== \"undefined\") {\n css[\"z-index\"] = self.maskConfig.zIndex;\n }\n\n this.$mask = $mask = jQuery(\"#\" + maskId);\n this.$target = $target;\n this.status = \"on\";\n $mask.css(css);\n\n if (_cfg.onClick) {\n $mask.on(\"click\", function (e) {\n that = {\n self: self,\n state: \"open\",\n type: \"click\"\n };\n self.maskConfig.onClick.call(that, that);\n });\n }\n\n onStateChanged.call(this, null, {\n self: this,\n state: \"open\"\n });\n\n options = null;\n _cfg = null;\n target = null;\n $target = null;\n maskId = null;\n $mask = null;\n css = null;\n that = null;\n templateName = null;\n body = null;\n\n return this;\n };\n\n /**\n * close mask\n * @method ax5mask.close\n * @param {Number} [_delay=0]\n * @returns {ax5mask}\n * @example\n * ```\n * my_mask.close();\n * ```\n */\n this.close = function (_delay) {\n if (this.$mask) {\n var _close = function _close() {\n this.status = \"off\";\n this.$mask.remove();\n this.$target.removeClass(\"ax-masking\");\n\n onStateChanged.call(this, null, {\n self: this,\n state: \"close\"\n });\n\n jQuery(window).off(\"resize.ax5mask-\" + this.instanceId);\n };\n\n if (_delay) {\n setTimeout(function () {\n _close.call(this);\n }.bind(this), _delay);\n } else {\n _close.call(this);\n }\n }\n return this;\n };\n\n /**\n * @method ax5mask.fadeOut\n * @returns {ax5mask}\n */\n this.fadeOut = function () {\n if (this.$mask) {\n var _close = function _close() {\n this.status = \"off\";\n this.$mask.remove();\n this.$target.removeClass(\"ax-masking\");\n\n onStateChanged.call(this, null, {\n self: this,\n state: \"close\"\n });\n\n jQuery(window).off(\"resize.ax5mask-\" + this.instanceId);\n };\n\n this.$mask.addClass(\"fade-out\");\n setTimeout(function () {\n _close.call(this);\n }.bind(this), cfg.animateTime);\n }\n return this;\n };\n\n /**\n * @method ax5mask.align\n * @returns {ax5mask}\n */\n this.align = function () {\n if (this.maskConfig && this.maskConfig.target && this.maskConfig.target !== jQuery(document.body).get(0)) {\n try {\n var css = {\n position: this.maskConfig.position || \"absolute\",\n left: this.$target.offset().left,\n top: this.$target.offset().top,\n width: this.$target.outerWidth(),\n height: this.$target.outerHeight()\n };\n this.$mask.css(css);\n } catch (e) {}\n }\n return this;\n };\n\n this.pullRequest = function () {\n console.log(\"test pullRequest01\");\n console.log(\"test pullRequest02\");\n };\n\n // 클래스 생성자\n this.main = function () {\n\n UI.mask_instance = UI.mask_instance || [];\n UI.mask_instance.push(this);\n\n if (arguments && U.isObject(arguments[0])) {\n this.setConfig(arguments[0]);\n }\n }.apply(this, arguments);\n };\n }());\n MASK = ax5.ui.mask;\n})();\n// ax5.ui.mask.tmpl\n(function () {\n\n var MASK = ax5.ui.mask;\n\n var defaultMask = function defaultMask(columnKeys) {\n return '\\n <div class=\"ax-mask {{theme}}\" id=\"{{maskId}}\">\\n <div class=\"ax-mask-bg\"></div>\\n <div class=\"ax-mask-content\">\\n <div class=\"ax-mask-body\">\\n {{{body}}}\\n </div>\\n </div>\\n </div>\\n ';\n };\n\n MASK.tmpl = {\n \"defaultMask\": defaultMask,\n\n get: function get(tmplName, data, columnKeys) {\n return ax5.mustache.render(MASK.tmpl[tmplName].call(this, columnKeys), data);\n }\n };\n})();","\"use strict\";\n\n/*\n * Copyright (c) 2016. tom@axisj.com\n * - github.com/thomasjang\n * - www.axisj.com\n */\n\n// ax5.ui.modal\n(function () {\n var UI = ax5.ui;\n var U = ax5.util;\n var MODAL = void 0;\n\n UI.addClass({\n className: \"modal\"\n }, function () {\n /**\n * @class ax5modal\n * @alias ax5.ui.modal\n * @author tom@axisj.com\n */\n return function () {\n var self = this,\n cfg = void 0,\n ENM = {\n mousedown: ax5.info.supportTouch ? \"touchstart\" : \"mousedown\",\n mousemove: ax5.info.supportTouch ? \"touchmove\" : \"mousemove\",\n mouseup: ax5.info.supportTouch ? \"touchend\" : \"mouseup\"\n },\n getMousePosition = function getMousePosition(e) {\n var mouseObj = e;\n if (\"changedTouches\" in e && e.changedTouches) {\n mouseObj = e.changedTouches[0];\n }\n return {\n clientX: mouseObj.clientX,\n clientY: mouseObj.clientY\n };\n };\n\n this.instanceId = ax5.getGuid();\n this.config = {\n id: \"ax5-modal-\" + this.instanceId,\n position: {\n left: \"center\",\n top: \"middle\",\n margin: 10\n },\n minimizePosition: \"bottom-right\",\n clickEventName: \"ontouchstart\" in document.documentElement ? \"touchstart\" : \"click\",\n theme: \"default\",\n width: 300,\n height: 400,\n closeToEsc: true,\n disableDrag: false,\n disableResize: false,\n animateTime: 250,\n iframe: false\n };\n this.activeModal = null;\n this.watingModal = false;\n this.$ = {}; // UI inside of the jQuery object store\n\n cfg = this.config; // extended config copy cfg\n\n var onStateChanged = function onStateChanged(opts, that) {\n var eventProcessor = {\n resize: function resize(that) {\n if (opts && opts.onResize) {\n opts.onResize.call(that, that);\n } else if (this.onResize) {\n this.onResize.call(that, that);\n }\n },\n move: function move() {}\n };\n if (that.state in eventProcessor) {\n eventProcessor[that.state].call(this, that);\n }\n\n if (opts && opts.onStateChanged) {\n opts.onStateChanged.call(that, that);\n } else if (this.onStateChanged) {\n this.onStateChanged.call(that, that);\n }\n return true;\n },\n getContent = function getContent(modalId, opts) {\n var data = {\n modalId: modalId,\n theme: opts.theme,\n header: opts.header,\n fullScreen: opts.fullScreen ? \"fullscreen\" : \"\",\n styles: \"\",\n iframe: opts.iframe,\n iframeLoadingMsg: opts.iframeLoadingMsg,\n disableResize: opts.disableResize\n };\n\n if (opts.zIndex) {\n data.styles += \"z-index:\" + opts.zIndex + \";\";\n }\n if (opts.absolute) {\n data.styles += \"position:absolute;\";\n }\n\n if (data.iframe && typeof data.iframe.param === \"string\") {\n data.iframe.param = ax5.util.param(data.iframe.param);\n }\n\n return MODAL.tmpl.get.call(this, \"content\", data, {});\n },\n open = function open(opts, callback) {\n var that = void 0;\n jQuery(document.body).append(getContent.call(this, opts.id, opts));\n\n this.activeModal = jQuery(\"#\" + opts.id);\n // 파트수집\n this.$ = {\n root: this.activeModal,\n header: this.activeModal.find('[data-modal-els=\"header\"]'),\n body: this.activeModal.find('[data-modal-els=\"body\"]')\n };\n\n if (opts.iframe) {\n this.$[\"iframe-wrap\"] = this.activeModal.find('[data-modal-els=\"iframe-wrap\"]');\n this.$[\"iframe\"] = this.activeModal.find('[data-modal-els=\"iframe\"]');\n this.$[\"iframe-form\"] = this.activeModal.find('[data-modal-els=\"iframe-form\"]');\n this.$[\"iframe-loading\"] = this.activeModal.find('[data-modal-els=\"iframe-loading\"]');\n } else {\n this.$[\"body-frame\"] = this.activeModal.find('[data-modal-els=\"body-frame\"]');\n }\n\n //- position 정렬\n this.align();\n\n that = {\n self: this,\n id: opts.id,\n theme: opts.theme,\n width: opts.width,\n height: opts.height,\n state: \"open\",\n $: this.$\n };\n\n if (opts.iframe) {\n this.$[\"iframe-wrap\"].css({ height: opts.height });\n this.$[\"iframe\"].css({ height: opts.height });\n\n // iframe content load\n this.$[\"iframe-form\"].attr({ method: opts.iframe.method });\n this.$[\"iframe-form\"].attr({ target: opts.id + \"-frame\" });\n this.$[\"iframe-form\"].attr({ action: opts.iframe.url });\n this.$[\"iframe\"].on(\"load\", function () {\n that.state = \"load\";\n if (opts.iframeLoadingMsg) {\n this.$[\"iframe-loading\"].hide();\n }\n onStateChanged.call(this, opts, that);\n }.bind(this));\n if (!opts.iframeLoadingMsg) {\n this.$[\"iframe\"].show();\n }\n this.$[\"iframe-form\"].submit();\n }\n\n if (callback) callback.call(that, that);\n\n if (!this.watingModal) {\n onStateChanged.call(this, opts, that);\n }\n\n // bind key event\n if (opts.closeToEsc) {\n jQuery(window).bind(\"keydown.ax-modal\", function (e) {\n onkeyup.call(this, e || window.event);\n }.bind(this));\n }\n\n jQuery(window).bind(\"resize.ax-modal\", function (e) {\n this.align(null, e || window.event);\n }.bind(this));\n\n this.$.header.off(ENM[\"mousedown\"]).off(\"dragstart\").on(ENM[\"mousedown\"], function (e) {\n /// 이벤트 필터링 추가 : 버튼엘리먼트로 부터 발생된 이벤트이면 moveModal 시작하지 않도록 필터링\n var isButton = U.findParentNode(e.target, function (_target) {\n if (_target.getAttribute(\"data-modal-header-btn\")) {\n return true;\n }\n });\n\n if (!opts.isFullScreen && !isButton && opts.disableDrag != true) {\n self.mousePosition = getMousePosition(e);\n moveModal.on.call(self);\n }\n if (isButton) {\n btnOnClick.call(self, e || window.event, opts);\n }\n }).on(\"dragstart\", function (e) {\n U.stopEvent(e.originalEvent);\n return false;\n });\n\n this.activeModal.off(ENM[\"mousedown\"]).off(\"dragstart\").on(ENM[\"mousedown\"], \"[data-ax5modal-resizer]\", function (e) {\n if (opts.disableDrag || opts.isFullScreen) return false;\n self.mousePosition = getMousePosition(e);\n resizeModal.on.call(self, this.getAttribute(\"data-ax5modal-resizer\"));\n }).on(\"dragstart\", function (e) {\n U.stopEvent(e.originalEvent);\n return false;\n });\n },\n btnOnClick = function btnOnClick(e, opts, callback, target, k) {\n var that = void 0;\n if (e.srcElement) e.target = e.srcElement;\n\n target = U.findParentNode(e.target, function (target) {\n if (target.getAttribute(\"data-modal-header-btn\")) {\n return true;\n }\n });\n\n if (target) {\n k = target.getAttribute(\"data-modal-header-btn\");\n\n that = {\n self: this,\n key: k,\n value: opts.header.btns[k],\n dialogId: opts.id,\n btnTarget: target\n };\n\n if (opts.header.btns[k].onClick) {\n opts.header.btns[k].onClick.call(that, k);\n }\n }\n\n that = null;\n opts = null;\n callback = null;\n target = null;\n k = null;\n },\n onkeyup = function onkeyup(e) {\n if (e.keyCode == ax5.info.eventKeys.ESC) {\n this.close();\n }\n },\n alignProcessor = {\n \"top-left\": function topLeft() {\n this.align({ left: \"left\", top: \"top\" });\n },\n \"top-right\": function topRight() {\n this.align({ left: \"right\", top: \"top\" });\n },\n \"bottom-left\": function bottomLeft() {\n this.align({ left: \"left\", top: \"bottom\" });\n },\n \"bottom-right\": function bottomRight() {\n this.align({ left: \"right\", top: \"bottom\" });\n },\n \"center-middle\": function centerMiddle() {\n this.align({ left: \"center\", top: \"middle\" });\n }\n },\n moveModal = {\n on: function on() {\n var modalZIndex = this.activeModal.css(\"z-index\"),\n modalOffset = this.activeModal.offset(),\n modalBox = {\n width: this.activeModal.outerWidth(),\n height: this.activeModal.outerHeight()\n },\n windowBox = {\n width: jQuery(window).width(),\n height: jQuery(window).height(),\n scrollLeft: jQuery(document).scrollLeft(),\n scrollTop: jQuery(document).scrollTop()\n },\n getResizerPosition = function getResizerPosition(e) {\n self.__dx = e.clientX - self.mousePosition.clientX;\n self.__dy = e.clientY - self.mousePosition.clientY;\n\n /*\n if (minX > modalOffset.left + self.__dx) {\n self.__dx = -modalOffset.left;\n } else if (maxX < modalOffset.left + self.__dx) {\n self.__dx = maxX - modalOffset.left;\n }\n if (minY > modalOffset.top + self.__dy) {\n self.__dy = -modalOffset.top;\n } else if (maxY < modalOffset.top + self.__dy) {\n self.__dy = maxY - modalOffset.top;\n }\n */\n\n return {\n left: modalOffset.left + self.__dx,\n top: modalOffset.top + self.__dy\n };\n };\n\n var minX = 0,\n maxX = windowBox.width - modalBox.width,\n minY = 0,\n maxY = windowBox.height - modalBox.height;\n\n self.__dx = 0; // 변화량 X\n self.__dy = 0; // 변화량 Y\n\n // self.resizerBg : body 가 window보다 작을 때 문제 해결을 위한 DIV\n self.resizerBg = jQuery('<div class=\"ax5modal-resizer-background\" ondragstart=\"return false;\"></div>');\n self.resizer = jQuery('<div class=\"ax5modal-resizer\" ondragstart=\"return false;\"></div>');\n self.resizerBg.css({ zIndex: modalZIndex });\n self.resizer.css({\n left: modalOffset.left,\n top: modalOffset.top,\n width: modalBox.width,\n height: modalBox.height,\n zIndex: modalZIndex + 1\n });\n\n jQuery(document.body).append(self.resizerBg).append(self.resizer);\n\n self.activeModal.addClass(\"draged\");\n\n jQuery(document.body).on(ENM[\"mousemove\"] + \".ax5modal-move-\" + this.instanceId, function (e) {\n self.resizer.css(getResizerPosition(e));\n }).on(ENM[\"mouseup\"] + \".ax5modal-move-\" + this.instanceId, function (e) {\n moveModal.off.call(self);\n }).on(\"mouseleave.ax5modal-move-\" + this.instanceId, function (e) {\n moveModal.off.call(self);\n });\n\n jQuery(document.body).attr(\"unselectable\", \"on\").css(\"user-select\", \"none\").on(\"selectstart\", false);\n },\n off: function off() {\n var setModalPosition = function setModalPosition() {\n var box = this.resizer.offset();\n if (!this.modalConfig.absolute) {\n box.left -= jQuery(document).scrollLeft();\n box.top -= jQuery(document).scrollTop();\n }\n this.activeModal.css(box);\n this.modalConfig.left = box.left;\n this.modalConfig.top = box.top;\n\n box = null;\n };\n\n this.activeModal.removeClass(\"draged\");\n setModalPosition.call(this);\n\n this.resizer.remove();\n this.resizer = null;\n this.resizerBg.remove();\n this.resizerBg = null;\n //this.align();\n\n jQuery(document.body).off(ENM[\"mousemove\"] + \".ax5modal-move-\" + this.instanceId).off(ENM[\"mouseup\"] + \".ax5modal-move-\" + this.instanceId).off(\"mouseleave.ax5modal-move-\" + this.instanceId);\n\n jQuery(document.body).removeAttr(\"unselectable\").css(\"user-select\", \"auto\").off(\"selectstart\");\n\n onStateChanged.call(this, self.modalConfig, {\n self: this,\n state: \"move\"\n });\n }\n },\n resizeModal = {\n on: function on(resizerType) {\n var modalZIndex = this.activeModal.css(\"z-index\"),\n modalOffset = this.activeModal.offset(),\n modalBox = {\n width: this.activeModal.outerWidth(),\n height: this.activeModal.outerHeight()\n },\n windowBox = {\n width: jQuery(window).width(),\n height: jQuery(window).height(),\n scrollLeft: jQuery(document).scrollLeft(),\n scrollTop: jQuery(document).scrollTop()\n },\n resizerProcessor = {\n top: function top(e) {\n if (minHeight > modalBox.height - self.__dy) {\n self.__dy = modalBox.height - minHeight;\n }\n\n if (e.shiftKey) {\n if (minHeight > modalBox.height - self.__dy * 2) {\n self.__dy = (modalBox.height - minHeight) / 2;\n }\n\n return {\n left: modalOffset.left,\n top: modalOffset.top + self.__dy,\n width: modalBox.width,\n height: modalBox.height - self.__dy * 2\n };\n } else if (e.altKey) {\n if (minHeight > modalBox.height - self.__dy * 2) {\n self.__dy = (modalBox.height - minHeight) / 2;\n }\n\n return {\n left: modalOffset.left + self.__dy,\n top: modalOffset.top + self.__dy,\n width: modalBox.width - self.__dy * 2,\n height: modalBox.height - self.__dy * 2\n };\n } else {\n return {\n left: modalOffset.left,\n top: modalOffset.top + self.__dy,\n width: modalBox.width,\n height: modalBox.height - self.__dy\n };\n }\n },\n bottom: function bottom(e) {\n if (minHeight > modalBox.height + self.__dy) {\n self.__dy = -modalBox.height + minHeight;\n }\n\n if (e.shiftKey) {\n if (minHeight > modalBox.height + self.__dy * 2) {\n self.__dy = (-modalBox.height + minHeight) / 2;\n }\n\n return {\n left: modalOffset.left,\n top: modalOffset.top - self.__dy,\n width: modalBox.width,\n height: modalBox.height + self.__dy * 2\n };\n } else if (e.altKey) {\n if (minHeight > modalBox.height + self.__dy * 2) {\n self.__dy = (-modalBox.height + minHeight) / 2;\n }\n\n return {\n left: modalOffset.left - self.__dy,\n top: modalOffset.top - self.__dy,\n width: modalBox.width + self.__dy * 2,\n height: modalBox.height + self.__dy * 2\n };\n } else {\n return {\n left: modalOffset.left,\n top: modalOffset.top,\n width: modalBox.width,\n height: modalBox.height + self.__dy\n };\n }\n },\n left: function left(e) {\n if (minWidth > modalBox.width - self.__dx) {\n self.__dx = modalBox.width - minWidth;\n }\n\n if (e.shiftKey) {\n if (minWidth > modalBox.width - self.__dx * 2) {\n self.__dx = (modalBox.width - minWidth) / 2;\n }\n\n return {\n left: modalOffset.left + self.__dx,\n top: modalOffset.top,\n width: modalBox.width - self.__dx * 2,\n height: modalBox.height\n };\n } else if (e.altKey) {\n if (minWidth > modalBox.width - self.__dx * 2) {\n self.__dx = (modalBox.width - minWidth) / 2;\n }\n\n return {\n left: modalOffset.left + self.__dx,\n top: modalOffset.top + self.__dx,\n width: modalBox.width - self.__dx * 2,\n height: modalBox.height - self.__dx * 2\n };\n } else {\n return {\n left: modalOffset.left + self.__dx,\n top: modalOffset.top,\n width: modalBox.width - self.__dx,\n height: modalBox.height\n };\n }\n },\n right: function right(e) {\n if (minWidth > modalBox.width + self.__dx) {\n self.__dx = -modalBox.width + minWidth;\n }\n\n if (e.shiftKey) {\n if (minWidth > modalBox.width + self.__dx * 2) {\n self.__dx = (-modalBox.width + minWidth) / 2;\n }\n\n return {\n left: modalOffset.left - self.__dx,\n top: modalOffset.top,\n width: modalBox.width + self.__dx * 2,\n height: modalBox.height\n };\n } else if (e.altKey) {\n if (minWidth > modalBox.width + self.__dx * 2) {\n self.__dx = (-modalBox.width + minWidth) / 2;\n }\n\n return {\n left: modalOffset.left - self.__dx,\n top: modalOffset.top - self.__dx,\n width: modalBox.width + self.__dx * 2,\n height: modalBox.height + self.__dx * 2\n };\n } else {\n return {\n left: modalOffset.left,\n top: modalOffset.top,\n width: modalBox.width + self.__dx,\n height: modalBox.height\n };\n }\n },\n \"top-left\": function topLeft(e) {\n if (minWidth > modalBox.width - self.__dx) {\n self.__dx = modalBox.width - minWidth;\n }\n\n if (minHeight > modalBox.height - self.__dy) {\n self.__dy = modalBox.height - minHeight;\n }\n\n if (e.shiftKey || e.altKey) {\n if (minHeight > modalBox.height - self.__dy * 2) {\n self.__dy = (modalBox.height - minHeight) / 2;\n }\n if (minWidth > modalBox.width - self.__dx * 2) {\n self.__dx = (modalBox.width - minWidth) / 2;\n }\n\n return {\n left: modalOffset.left + self.__dx,\n top: modalOffset.top + self.__dy,\n width: modalBox.width - self.__dx * 2,\n height: modalBox.height - self.__dy * 2\n };\n } else {\n if (minHeight > modalBox.height - self.__dy * 2) {\n self.__dy = (modalBox.height - minHeight) / 2;\n }\n if (minWidth > modalBox.width - self.__dx * 2) {\n self.__dx = (modalBox.width - minWidth) / 2;\n }\n\n return {\n left: modalOffset.left + self.__dx,\n top: modalOffset.top + self.__dy,\n width: modalBox.width - self.__dx,\n height: modalBox.height - self.__dy\n };\n }\n },\n \"top-right\": function topRight(e) {\n if (minWidth > modalBox.width + self.__dx) {\n self.__dx = -modalBox.width + minWidth;\n }\n\n if (minHeight > modalBox.height - self.__dy) {\n self.__dy = modalBox.height - minHeight;\n }\n\n if (e.shiftKey || e.altKey) {\n if (minHeight > modalBox.height - self.__dy * 2) {\n self.__dy = (modalBox.height - minHeight) / 2;\n }\n if (minWidth > modalBox.width + self.__dx * 2) {\n self.__dx = (-modalBox.width + minWidth) / 2;\n }\n\n return {\n left: modalOffset.left - self.__dx,\n top: modalOffset.top + self.__dy,\n width: modalBox.width + self.__dx * 2,\n height: modalBox.height - self.__dy * 2\n };\n } else {\n return {\n left: modalOffset.left,\n top: modalOffset.top + self.__dy,\n width: modalBox.width + self.__dx,\n height: modalBox.height - self.__dy\n };\n }\n },\n \"bottom-left\": function bottomLeft(e) {\n if (minWidth > modalBox.width - self.__dx) {\n self.__dx = modalBox.width - minWidth;\n }\n\n if (minHeight > modalBox.height + self.__dy) {\n self.__dy = -modalBox.height + minHeight;\n }\n\n if (e.shiftKey || e.altKey) {\n if (minWidth > modalBox.width - self.__dx * 2) {\n self.__dx = (modalBox.width - minWidth) / 2;\n }\n if (minHeight > modalBox.height + self.__dy * 2) {\n self.__dy = (-modalBox.height + minHeight) / 2;\n }\n return {\n left: modalOffset.left + self.__dx,\n top: modalOffset.top - self.__dy,\n width: modalBox.width - self.__dx * 2,\n height: modalBox.height + self.__dy * 2\n };\n } else {\n return {\n left: modalOffset.left + self.__dx,\n top: modalOffset.top,\n width: modalBox.width - self.__dx,\n height: modalBox.height + self.__dy\n };\n }\n },\n \"bottom-right\": function bottomRight(e) {\n if (minWidth > modalBox.width + self.__dx) {\n self.__dx = -modalBox.width + minWidth;\n }\n\n if (minHeight > modalBox.height + self.__dy) {\n self.__dy = -modalBox.height + minHeight;\n }\n\n if (e.shiftKey || e.altKey) {\n if (minWidth > modalBox.width + self.__dx * 2) {\n self.__dx = (-modalBox.width + minWidth) / 2;\n }\n if (minHeight > modalBox.height + self.__dy * 2) {\n self.__dy = (-modalBox.height + minHeight) / 2;\n }\n return {\n left: modalOffset.left - self.__dx,\n top: modalOffset.top - self.__dy,\n width: modalBox.width + self.__dx * 2,\n height: modalBox.height + self.__dy * 2\n };\n } else {\n return {\n left: modalOffset.left,\n top: modalOffset.top,\n width: modalBox.width + self.__dx,\n height: modalBox.height + self.__dy\n };\n }\n }\n },\n getResizerPosition = function getResizerPosition(e) {\n self.__dx = e.clientX - self.mousePosition.clientX;\n self.__dy = e.clientY - self.mousePosition.clientY;\n\n return resizerProcessor[resizerType](e);\n };\n\n var minWidth = 100,\n minHeight = 100;\n\n var cursorType = {\n top: \"row-resize\",\n bottom: \"row-resize\",\n left: \"col-resize\",\n right: \"col-resize\",\n \"top-left\": \"nwse-resize\",\n \"top-right\": \"nesw-resize\",\n \"bottom-left\": \"nesw-resize\",\n \"bottom-right\": \"nwse-resize\"\n };\n\n self.__dx = 0; // 변화량 X\n self.__dy = 0; // 변화량 Y\n\n // self.resizerBg : body 가 window보다 작을 때 문제 해결을 위한 DIV\n self.resizerBg = jQuery('<div class=\"ax5modal-resizer-background\" ondragstart=\"return false;\"></div>');\n self.resizer = jQuery('<div class=\"ax5modal-resizer\" ondragstart=\"return false;\"></div>');\n self.resizerBg.css({\n zIndex: modalZIndex,\n cursor: cursorType[resizerType]\n });\n self.resizer.css({\n left: modalOffset.left,\n top: modalOffset.top,\n width: modalBox.width,\n height: modalBox.height,\n zIndex: modalZIndex + 1,\n cursor: cursorType[resizerType]\n });\n jQuery(document.body).append(self.resizerBg).append(self.resizer);\n self.activeModal.addClass(\"draged\");\n\n jQuery(document.body).bind(ENM[\"mousemove\"] + \".ax5modal-resize-\" + this.instanceId, function (e) {\n self.resizer.css(getResizerPosition(e));\n }).bind(ENM[\"mouseup\"] + \".ax5modal-resize-\" + this.instanceId, function (e) {\n resizeModal.off.call(self);\n }).bind(\"mouseleave.ax5modal-resize-\" + this.instanceId, function (e) {\n resizeModal.off.call(self);\n });\n\n jQuery(document.body).attr(\"unselectable\", \"on\").css(\"user-select\", \"none\").bind(\"selectstart\", false);\n },\n off: function off() {\n var setModalPosition = function setModalPosition() {\n var box = this.resizer.offset();\n jQuery.extend(box, {\n width: this.resizer.width(),\n height: this.resizer.height()\n });\n if (!this.modalConfig.absolute) {\n box.left -= jQuery(document).scrollLeft();\n box.top -= jQuery(document).scrollTop();\n }\n this.activeModal.css(box);\n\n this.modalConfig.left = box.left;\n this.modalConfig.top = box.top;\n this.modalConfig.width = box.width;\n this.modalConfig.height = box.height;\n this.$[\"body\"].css({\n height: box.height - this.modalConfig.headerHeight\n });\n if (this.modalConfig.iframe) {\n this.$[\"iframe-wrap\"].css({\n height: box.height - this.modalConfig.headerHeight\n });\n this.$[\"iframe\"].css({\n height: box.height - this.modalConfig.headerHeight\n });\n }\n\n box = null;\n };\n\n this.activeModal.removeClass(\"draged\");\n setModalPosition.call(this);\n\n this.resizer.remove();\n this.resizer = null;\n this.resizerBg.remove();\n this.resizerBg = null;\n\n onStateChanged.call(this, self.modalConfig, {\n self: this,\n state: \"resize\"\n });\n\n jQuery(document.body).unbind(ENM[\"mousemove\"] + \".ax5modal-resize-\" + this.instanceId).unbind(ENM[\"mouseup\"] + \".ax5modal-resize-\" + this.instanceId).unbind(\"mouseleave.ax5modal-resize-\" + this.instanceId);\n\n jQuery(document.body).removeAttr(\"unselectable\").css(\"user-select\", \"auto\").unbind(\"selectstart\");\n }\n };\n\n /// private end\n\n /**\n * Preferences of modal UI\n * @method ax5modal.setConfig\n * @param {Object} config - 클래스 속성값\n * @param {Number} [config.zIndex]\n * @param {Object} [config.position]\n * @param {String} [config.position.left=\"center\"]\n * @param {String} [config.position.top=\"middle\"]\n * @param {Number} [config.position.margin=10]\n * @param {String} [config.minimizePosition=\"bottom-right\"]\n * @param {Number} [config.width=300]\n * @param {Number} [config.height=400]\n * @param {Boolean} [config.closeToEsc=true]\n * @param {Boolean} [config.absolute=false]\n * @param {Boolean} [config.disableDrag=false]\n * @param {Boolean} [config.disableResize=false]\n * @param {Number} [config.animateTime=250]\n * @param {Function} [config.fullScreen]\n * @param {Function} [config.onStateChanged] - `onStateChanged` function can be defined in setConfig method or new ax5.ui.modal initialization method. However, you can us to define an event function after initialization, if necessary\n * @param {Function} [config.onResize]\n * @returns {ax5modal}\n * @example\n * ```js\n * var modal = new ax5.ui.modal({\n * iframeLoadingMsg: '<i class=\"fa fa-spinner fa-5x fa-spin\" aria-hidden=\"true\"></i>',\n * header: {\n * title: \"MODAL TITLE\",\n * btns: {\n * minimize: {\n * label: '<i class=\"fa fa-minus-circle\" aria-hidden=\"true\"></i>', onClick: function () {\n * modal.minimize();\n * }\n * },\n * maximize: {\n * label: '<i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i>', onClick: function () {\n * modal.maximize();\n * }\n * },\n * close: {\n * label: '<i class=\"fa fa-times-circle\" aria-hidden=\"true\"></i>', onClick: function () {\n * modal.close();\n * }\n * }\n * }\n * }\n * });\n *\n * modal.open({\n * width: 800,\n * height: 600,\n * fullScreen: function(){\n * return ($(window).width() < 600);\n * },\n * iframe: {\n * method: \"get\",\n * url: \"http://chequer-app:2017/html/login.html\",\n * param: \"callback=modalCallback\"\n * },\n * onStateChanged: function(){\n * console.log(this);\n * },\n * onResize: function(){\n * console.log(this);\n * }\n * });\n * ```\n */\n //== class body start\n this.init = function () {\n this.onStateChanged = cfg.onStateChanged;\n this.onResize = cfg.onResize;\n };\n\n /**\n * open the modal\n * @method ax5modal.open\n * @returns {ax5modal}\n * @example\n * ```\n * modal.open();\n * modal.open({\n * width: 500,\n * height: 500\n * });\n * moaal.open({}, function(){\n * console.log(this);\n * });\n * ```\n */\n this.open = function (opts, callback, tryCount) {\n if (typeof tryCount === \"undefined\") tryCount = 0;\n if (!this.activeModal) {\n opts = self.modalConfig = jQuery.extend(true, {}, cfg, opts);\n open.call(this, opts, callback);\n this.watingModal = false;\n } else if (tryCount < 3) {\n // 3번까지 재 시도\n this.watingModal = true;\n setTimeout(function () {\n this.open(opts, callback, tryCount + 1);\n }.bind(this), cfg.animateTime);\n } else {\n // 열기 시도 종료\n this.watingModal = false;\n }\n return this;\n };\n\n /**\n * close the modal\n * @method ax5modal.close\n * @param _option\n * @returns {ax5modal}\n * @example\n * ```\n * my_modal.close();\n * my_modal.close({callback: function(){\n * // on close event\n * });\n * // close 함수에 callback을 전달하면 정확한 close 타이밍을 캐치할 수 있습니다\n * ```\n */\n\n this.close = function (_option) {\n var opts = void 0,\n that = void 0;\n\n if (this.activeModal) {\n opts = self.modalConfig;\n this.activeModal.addClass(\"destroy\");\n jQuery(window).unbind(\"keydown.ax-modal\");\n jQuery(window).unbind(\"resize.ax-modal\");\n\n setTimeout(function () {\n // 프레임 제거\n if (opts.iframe) {\n var $iframe = this.$[\"iframe\"]; // iframe jQuery Object\n if ($iframe) {\n var iframeObject = $iframe.get(0),\n idoc = iframeObject.contentDocument ? iframeObject.contentDocument : iframeObject.contentWindow.document;\n\n try {\n $(idoc.body).children().each(function () {\n $(this).remove();\n });\n } catch (e) {}\n idoc.innerHTML = \"\";\n $iframe.attr(\"src\", \"about:blank\").remove();\n\n // force garbarge collection for IE only\n window.CollectGarbage && window.CollectGarbage();\n }\n }\n\n this.activeModal.remove();\n this.activeModal = null;\n\n // 모달 오픈 대기중이면 닫기 상태 전달 안함.\n if (!this.watingModal) {\n onStateChanged.call(this, opts, {\n self: this,\n state: \"close\"\n });\n }\n\n if (_option && U.isFunction(_option.callback)) {\n that = {\n self: this,\n id: opts.id,\n theme: opts.theme,\n width: opts.width,\n height: opts.height,\n state: \"close\",\n $: this.$\n };\n _option.callback.call(that, that);\n }\n }.bind(this), cfg.animateTime);\n }\n\n this.minimized = false; // hoksi\n\n return this;\n };\n\n /**\n * @method ax5modal.minimize\n * @returns {ax5modal}\n */\n this.minimize = function () {\n return function (minimizePosition) {\n if (this.minimized !== true) {\n var opts = self.modalConfig;\n if (typeof minimizePosition === \"undefined\") minimizePosition = cfg.minimizePosition;\n\n this.minimized = true;\n this.$.body.hide();\n self.modalConfig.originalHeight = opts.height;\n self.modalConfig.height = 0;\n alignProcessor[minimizePosition].call(this);\n\n onStateChanged.call(this, opts, {\n self: this,\n state: \"minimize\"\n });\n }\n\n return this;\n };\n }();\n\n /**\n * @method ax5modal.restore\n * @returns {ax5modal}\n */\n this.restore = function () {\n var opts = self.modalConfig;\n if (this.minimized) {\n this.minimized = false;\n this.$.body.show();\n self.modalConfig.height = self.modalConfig.originalHeight;\n self.modalConfig.originalHeight = undefined;\n\n this.align({ left: \"center\", top: \"middle\" });\n onStateChanged.call(this, opts, {\n self: this,\n state: \"restore\"\n });\n }\n return this;\n };\n\n /**\n * setCSS\n * @method ax5modal.css\n * @param {Object} css -\n * @returns {ax5modal}\n */\n this.css = function (css) {\n if (this.activeModal && !self.fullScreen) {\n this.activeModal.css(css);\n if (typeof css.width !== \"undefined\") {\n self.modalConfig.width = css.width;\n }\n if (typeof css.height !== \"undefined\") {\n self.modalConfig.height = css.height;\n }\n\n this.align();\n }\n return this;\n };\n\n /**\n * @method ax5modal.setModalConfig\n * @param _config\n * @returns {ax5.ui.ax5modal}\n */\n this.setModalConfig = function (_config) {\n self.modalConfig = jQuery.extend({}, self.modalConfig, _config);\n this.align();\n return this;\n };\n\n /**\n * @method ax5modal.align\n * @param position\n * @param e\n * @returns {ax5modal}\n * @example\n * ```js\n * modal.align({left:\"center\", top:\"middle\"});\n * modal.align({left:\"left\", top:\"top\", margin: 20});\n * ```\n */\n this.align = function () {\n return function (position, e) {\n if (!this.activeModal) return this;\n\n var opts = self.modalConfig,\n box = {\n width: opts.width,\n height: opts.height\n };\n\n var fullScreen = opts.isFullScreen = function (_fullScreen) {\n if (typeof _fullScreen === \"undefined\") {\n return false;\n } else if (U.isFunction(_fullScreen)) {\n return _fullScreen();\n }\n }(opts.fullScreen);\n\n if (fullScreen) {\n if (opts.header) this.$.header.show();\n if (opts.header) {\n opts.headerHeight = this.$.header.outerHeight();\n box.height += opts.headerHeight;\n } else {\n opts.headerHeight = 0;\n }\n box.width = jQuery(window).width();\n box.height = opts.height;\n box.left = 0;\n box.top = 0;\n } else {\n if (opts.header) this.$.header.show();\n if (position) {\n jQuery.extend(true, opts.position, position);\n }\n\n if (opts.header) {\n opts.headerHeight = this.$.header.outerHeight();\n box.height += opts.headerHeight;\n } else {\n opts.headerHeight = 0;\n }\n\n //- position 정렬\n if (opts.position.left == \"left\") {\n box.left = opts.position.margin || 0;\n } else if (opts.position.left == \"right\") {\n // window.innerWidth;\n box.left = jQuery(window).width() - box.width - (opts.position.margin || 0);\n } else if (opts.position.left == \"center\") {\n box.left = jQuery(window).width() / 2 - box.width / 2;\n } else {\n box.left = opts.position.left || 0;\n }\n\n if (opts.position.top == \"top\") {\n box.top = opts.position.margin || 0;\n } else if (opts.position.top == \"bottom\") {\n box.top = jQuery(window).height() - box.height - (opts.position.margin || 0);\n } else if (opts.position.top == \"middle\") {\n box.top = jQuery(window).height() / 2 - box.height / 2;\n } else {\n box.top = opts.position.top || 0;\n }\n if (box.left < 0) box.left = 0;\n if (box.top < 0) box.top = 0;\n\n if (opts.absolute) {\n box.top += jQuery(window).scrollTop();\n box.left += jQuery(window).scrollLeft();\n }\n }\n\n this.activeModal.css(box);\n\n this.$[\"body\"].css({\n height: box.height - (opts.headerHeight || 0)\n });\n\n if (opts.iframe) {\n this.$[\"iframe-wrap\"].css({\n height: box.height - opts.headerHeight\n });\n this.$[\"iframe\"].css({ height: box.height - opts.headerHeight });\n } else {}\n return this;\n };\n }();\n\n // 클래스 생성자\n this.main = function () {\n UI.modal_instance = UI.modal_instance || [];\n UI.modal_instance.push(this);\n\n if (arguments && U.isObject(arguments[0])) {\n this.setConfig(arguments[0]);\n }\n }.apply(this, arguments);\n };\n }());\n\n MODAL = ax5.ui.modal;\n})();\n\n// ax5.ui.modal.tmpl\n(function () {\n var MODAL = ax5.ui.modal;\n\n var content = function content() {\n return \" \\n <div id=\\\"{{modalId}}\\\" data-modal-els=\\\"root\\\" class=\\\"ax5modal {{theme}} {{fullscreen}}\\\" style=\\\"{{styles}}\\\">\\n {{#header}}\\n <div class=\\\"ax-modal-header\\\" data-modal-els=\\\"header\\\">\\n {{{title}}}\\n {{#btns}}\\n <div class=\\\"ax-modal-header-addon\\\">\\n {{#@each}}\\n <button tabindex=\\\"-1\\\" data-modal-header-btn=\\\"{{@key}}\\\" class=\\\"{{@value.theme}}\\\">{{{@value.label}}}</button>\\n {{/@each}}\\n </div>\\n {{/btns}}\\n </div>\\n {{/header}}\\n <div class=\\\"ax-modal-body\\\" data-modal-els=\\\"body\\\">\\n {{#iframe}}\\n <div data-modal-els=\\\"iframe-wrap\\\" style=\\\"-webkit-overflow-scrolling: touch; overflow: auto;position: relative;\\\">\\n <table data-modal-els=\\\"iframe-loading\\\" style=\\\"width:100%;height:100%;\\\"><tr><td style=\\\"text-align: center;vertical-align: middle\\\">{{{iframeLoadingMsg}}}</td></tr></table>\\n <iframe name=\\\"{{modalId}}-frame\\\" src=\\\"\\\" width=\\\"100%\\\" height=\\\"100%\\\" frameborder=\\\"0\\\" data-modal-els=\\\"iframe\\\" style=\\\"position: absolute;left:0;top:0;\\\"></iframe>\\n </div>\\n <form name=\\\"{{modalId}}-form\\\" data-modal-els=\\\"iframe-form\\\">\\n <input type=\\\"hidden\\\" name=\\\"modalId\\\" value=\\\"{{modalId}}\\\" />\\n {{#param}}\\n {{#@each}}\\n <input type=\\\"hidden\\\" name=\\\"{{@key}}\\\" value=\\\"{{@value}}\\\" />\\n {{/@each}}\\n {{/param}}\\n </form>\\n {{/iframe}}\\n {{^iframe}}\\n <div data-modal-els=\\\"body-frame\\\" style=\\\"position: absolute;left:0;top:0;width:100%;height:100%;\\\"></div>\\n {{/iframe}}\\n </div>\\n {{^disableResize}}\\n <div data-ax5modal-resizer=\\\"top\\\"></div>\\n <div data-ax5modal-resizer=\\\"right\\\"></div>\\n <div data-ax5modal-resizer=\\\"bottom\\\"></div>\\n <div data-ax5modal-resizer=\\\"left\\\"></div>\\n <div data-ax5modal-resizer=\\\"top-left\\\"></div>\\n <div data-ax5modal-resizer=\\\"top-right\\\"></div>\\n <div data-ax5modal-resizer=\\\"bottom-left\\\"></div>\\n <div data-ax5modal-resizer=\\\"bottom-right\\\"></div>\\n {{/disableResize}}\\n </div>\\n \";\n };\n\n MODAL.tmpl = {\n \"content\": content,\n\n get: function get(tmplName, data, columnKeys) {\n return ax5.mustache.render(MODAL.tmpl[tmplName].call(this, columnKeys), data);\n }\n };\n})();","/*\n * Toastr\n * Copyright 2012-2015\n * Authors: John Papa, Hans Fjällemark, and Tim Ferrell.\n * All Rights Reserved.\n * Use, reproduction, distribution, and modification of this code is subject to the terms and\n * conditions of the MIT license, available at http://www.opensource.org/licenses/mit-license.php\n *\n * ARIA Support: Greta Krafsig\n *\n * Project: https://github.com/CodeSeven/toastr\n */\n/* global define */\n; (function (define) {\n define(['jquery'], function ($) {\n return (function () {\n var $container;\n var listener;\n var toastId = 0;\n var toastType = {\n error: 'error',\n info: 'info',\n success: 'success',\n warning: 'warning'\n };\n\n var toastr = {\n clear: clear,\n remove: remove,\n error: error,\n getContainer: getContainer,\n info: info,\n options: {},\n subscribe: subscribe,\n success: success,\n version: '2.1.2',\n warning: warning\n };\n\n var previousToast;\n\n return toastr;\n\n ////////////////\n\n function error(message, title, optionsOverride) {\n return notify({\n type: toastType.error,\n iconClass: getOptions().iconClasses.error,\n message: message,\n optionsOverride: optionsOverride,\n title: title\n });\n }\n\n function getContainer(options, create) {\n if (!options) { options = getOptions(); }\n $container = $('#' + options.containerId);\n if ($container.length) {\n return $container;\n }\n if (create) {\n $container = createContainer(options);\n }\n return $container;\n }\n\n function info(message, title, optionsOverride) {\n return notify({\n type: toastType.info,\n iconClass: getOptions().iconClasses.info,\n message: message,\n optionsOverride: optionsOverride,\n title: title\n });\n }\n\n function subscribe(callback) {\n listener = callback;\n }\n\n function success(message, title, optionsOverride) {\n return notify({\n type: toastType.success,\n iconClass: getOptions().iconClasses.success,\n message: message,\n optionsOverride: optionsOverride,\n title: title\n });\n }\n\n function warning(message, title, optionsOverride) {\n return notify({\n type: toastType.warning,\n iconClass: getOptions().iconClasses.warning,\n message: message,\n optionsOverride: optionsOverride,\n title: title\n });\n }\n\n function clear($toastElement, clearOptions) {\n var options = getOptions();\n if (!$container) { getContainer(options); }\n if (!clearToast($toastElement, options, clearOptions)) {\n clearContainer(options);\n }\n }\n\n function remove($toastElement) {\n var options = getOptions();\n if (!$container) { getContainer(options); }\n if ($toastElement && $(':focus', $toastElement).length === 0) {\n removeToast($toastElement);\n return;\n }\n if ($container.children().length) {\n $container.remove();\n }\n }\n\n // internal functions\n\n function clearContainer (options) {\n var toastsToClear = $container.children();\n for (var i = toastsToClear.length - 1; i >= 0; i--) {\n clearToast($(toastsToClear[i]), options);\n }\n }\n\n function clearToast ($toastElement, options, clearOptions) {\n var force = clearOptions && clearOptions.force ? clearOptions.force : false;\n if ($toastElement && (force || $(':focus', $toastElement).length === 0)) {\n $toastElement[options.hideMethod]({\n duration: options.hideDuration,\n easing: options.hideEasing,\n complete: function () { removeToast($toastElement); }\n });\n return true;\n }\n return false;\n }\n\n function createContainer(options) {\n $container = $('<div/>')\n .attr('id', options.containerId)\n .addClass(options.positionClass)\n .attr('aria-live', 'polite')\n .attr('role', 'alert');\n\n $container.appendTo($(options.target));\n return $container;\n }\n\n function getDefaults() {\n return {\n tapToDismiss: true,\n toastClass: 'toast',\n containerId: 'toast-container',\n debug: false,\n\n showMethod: 'fadeIn', //fadeIn, slideDown, and show are built into jQuery\n showDuration: 300,\n showEasing: 'swing', //swing and linear are built into jQuery\n onShown: undefined,\n hideMethod: 'fadeOut',\n hideDuration: 1000,\n hideEasing: 'swing',\n onHidden: undefined,\n closeMethod: false,\n closeDuration: false,\n closeEasing: false,\n\n extendedTimeOut: 1000,\n iconClasses: {\n error: 'toast-error',\n info: 'toast-info',\n success: 'toast-success',\n warning: 'toast-warning'\n },\n iconClass: 'toast-info',\n positionClass: 'toast-top-right',\n timeOut: 5000, // Set timeOut and extendedTimeOut to 0 to make it sticky\n titleClass: 'toast-title',\n messageClass: 'toast-message',\n escapeHtml: false,\n target: 'body',\n closeHtml: '<button type=\"button\">&times;</button>',\n newestOnTop: true,\n preventDuplicates: false,\n progressBar: false\n };\n }\n\n function publish(args) {\n if (!listener) { return; }\n listener(args);\n }\n\n function notify(map) {\n var options = getOptions();\n var iconClass = map.iconClass || options.iconClass;\n\n if (typeof (map.optionsOverride) !== 'undefined') {\n options = $.extend(options, map.optionsOverride);\n iconClass = map.optionsOverride.iconClass || iconClass;\n }\n\n if (shouldExit(options, map)) { return; }\n\n toastId++;\n\n $container = getContainer(options, true);\n\n var intervalId = null;\n var $toastElement = $('<div/>');\n var $titleElement = $('<div/>');\n var $messageElement = $('<div/>');\n var $progressElement = $('<div/>');\n var $closeElement = $(options.closeHtml);\n var progressBar = {\n intervalId: null,\n hideEta: null,\n maxHideTime: null\n };\n var response = {\n toastId: toastId,\n state: 'visible',\n startTime: new Date(),\n options: options,\n map: map\n };\n\n personalizeToast();\n\n displayToast();\n\n handleEvents();\n\n publish(response);\n\n if (options.debug && console) {\n console.log(response);\n }\n\n return $toastElement;\n\n function escapeHtml(source) {\n if (source == null)\n source = \"\";\n\n return new String(source)\n .replace(/&/g, '&amp;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;');\n }\n\n function personalizeToast() {\n setIcon();\n setTitle();\n setMessage();\n setCloseButton();\n setProgressBar();\n setSequence();\n }\n\n function handleEvents() {\n $toastElement.hover(stickAround, delayedHideToast);\n if (!options.onclick && options.tapToDismiss) {\n $toastElement.click(hideToast);\n }\n\n if (options.closeButton && $closeElement) {\n $closeElement.click(function (event) {\n if (event.stopPropagation) {\n event.stopPropagation();\n } else if (event.cancelBubble !== undefined && event.cancelBubble !== true) {\n event.cancelBubble = true;\n }\n hideToast(true);\n });\n }\n\n if (options.onclick) {\n $toastElement.click(function (event) {\n options.onclick(event);\n hideToast();\n });\n }\n }\n\n function displayToast() {\n $toastElement.hide();\n\n $toastElement[options.showMethod](\n {duration: options.showDuration, easing: options.showEasing, complete: options.onShown}\n );\n\n if (options.timeOut > 0) {\n intervalId = setTimeout(hideToast, options.timeOut);\n progressBar.maxHideTime = parseFloat(options.timeOut);\n progressBar.hideEta = new Date().getTime() + progressBar.maxHideTime;\n if (options.progressBar) {\n progressBar.intervalId = setInterval(updateProgress, 10);\n }\n }\n }\n\n function setIcon() {\n if (map.iconClass) {\n $toastElement.addClass(options.toastClass).addClass(iconClass);\n }\n }\n\n function setSequence() {\n if (options.newestOnTop) {\n $container.prepend($toastElement);\n } else {\n $container.append($toastElement);\n }\n }\n\n function setTitle() {\n if (map.title) {\n $titleElement.append(!options.escapeHtml ? map.title : escapeHtml(map.title)).addClass(options.titleClass);\n $toastElement.append($titleElement);\n }\n }\n\n function setMessage() {\n if (map.message) {\n $messageElement.append(!options.escapeHtml ? map.message : escapeHtml(map.message)).addClass(options.messageClass);\n $toastElement.append($messageElement);\n }\n }\n\n function setCloseButton() {\n if (options.closeButton) {\n $closeElement.addClass('toast-close-button').attr('role', 'button');\n $toastElement.prepend($closeElement);\n }\n }\n\n function setProgressBar() {\n if (options.progressBar) {\n $progressElement.addClass('toast-progress');\n $toastElement.prepend($progressElement);\n }\n }\n\n function shouldExit(options, map) {\n if (options.preventDuplicates) {\n if (map.message === previousToast) {\n return true;\n } else {\n previousToast = map.message;\n }\n }\n return false;\n }\n\n function hideToast(override) {\n var method = override && options.closeMethod !== false ? options.closeMethod : options.hideMethod;\n var duration = override && options.closeDuration !== false ?\n options.closeDuration : options.hideDuration;\n var easing = override && options.closeEasing !== false ? options.closeEasing : options.hideEasing;\n if ($(':focus', $toastElement).length && !override) {\n return;\n }\n clearTimeout(progressBar.intervalId);\n return $toastElement[method]({\n duration: duration,\n easing: easing,\n complete: function () {\n removeToast($toastElement);\n if (options.onHidden && response.state !== 'hidden') {\n options.onHidden();\n }\n response.state = 'hidden';\n response.endTime = new Date();\n publish(response);\n }\n });\n }\n\n function delayedHideToast() {\n if (options.timeOut > 0 || options.extendedTimeOut > 0) {\n intervalId = setTimeout(hideToast, options.extendedTimeOut);\n progressBar.maxHideTime = parseFloat(options.extendedTimeOut);\n progressBar.hideEta = new Date().getTime() + progressBar.maxHideTime;\n }\n }\n\n function stickAround() {\n clearTimeout(intervalId);\n progressBar.hideEta = 0;\n $toastElement.stop(true, true)[options.showMethod](\n {duration: options.showDuration, easing: options.showEasing}\n );\n }\n\n function updateProgress() {\n var percentage = ((progressBar.hideEta - (new Date().getTime())) / progressBar.maxHideTime) * 100;\n $progressElement.width(percentage + '%');\n }\n }\n\n function getOptions() {\n return $.extend({}, getDefaults(), toastr.options);\n }\n\n function removeToast($toastElement) {\n if (!$container) { $container = getContainer(); }\n if ($toastElement.is(':visible')) {\n return;\n }\n $toastElement.remove();\n $toastElement = null;\n if ($container.children().length === 0) {\n $container.remove();\n previousToast = undefined;\n }\n }\n\n })();\n });\n}(typeof define === 'function' && define.amd ? define : function (deps, factory) {\n if (typeof module !== 'undefined' && module.exports) { //Node\n module.exports = factory(require('jquery'));\n } else {\n window.toastr = factory(window.jQuery);\n }\n}));\n","/*!\n\tautosize 4.0.2\n\tlicense: MIT\n\thttp://www.jacklmoore.com/autosize\n*/\n(function (global, factory) {\n if (typeof define === \"function\" && define.amd) {\n define(['module', 'exports'], factory);\n } else if (typeof exports !== \"undefined\") {\n factory(module, exports);\n } else {\n var mod = {\n exports: {}\n };\n factory(mod, mod.exports);\n global.autosize = mod.exports;\n }\n})(this, function (module, exports) {\n 'use strict';\n\n var map = typeof Map === \"function\" ? new Map() : function () {\n var keys = [];\n var values = [];\n\n return {\n has: function has(key) {\n return keys.indexOf(key) > -1;\n },\n get: function get(key) {\n return values[keys.indexOf(key)];\n },\n set: function set(key, value) {\n if (keys.indexOf(key) === -1) {\n keys.push(key);\n values.push(value);\n }\n },\n delete: function _delete(key) {\n var index = keys.indexOf(key);\n if (index > -1) {\n keys.splice(index, 1);\n values.splice(index, 1);\n }\n }\n };\n }();\n\n var createEvent = function createEvent(name) {\n return new Event(name, { bubbles: true });\n };\n try {\n new Event('test');\n } catch (e) {\n // IE does not support `new Event()`\n createEvent = function createEvent(name) {\n var evt = document.createEvent('Event');\n evt.initEvent(name, true, false);\n return evt;\n };\n }\n\n function assign(ta) {\n if (!ta || !ta.nodeName || ta.nodeName !== 'TEXTAREA' || map.has(ta)) return;\n\n var heightOffset = null;\n var clientWidth = null;\n var cachedHeight = null;\n\n function init() {\n var style = window.getComputedStyle(ta, null);\n\n if (style.resize === 'vertical') {\n ta.style.resize = 'none';\n } else if (style.resize === 'both') {\n ta.style.resize = 'horizontal';\n }\n\n if (style.boxSizing === 'content-box') {\n heightOffset = -(parseFloat(style.paddingTop) + parseFloat(style.paddingBottom));\n } else {\n heightOffset = parseFloat(style.borderTopWidth) + parseFloat(style.borderBottomWidth);\n }\n // Fix when a textarea is not on document body and heightOffset is Not a Number\n if (isNaN(heightOffset)) {\n heightOffset = 0;\n }\n\n update();\n }\n\n function changeOverflow(value) {\n {\n // Chrome/Safari-specific fix:\n // When the textarea y-overflow is hidden, Chrome/Safari do not reflow the text to account for the space\n // made available by removing the scrollbar. The following forces the necessary text reflow.\n var width = ta.style.width;\n ta.style.width = '0px';\n // Force reflow:\n /* jshint ignore:start */\n ta.offsetWidth;\n /* jshint ignore:end */\n ta.style.width = width;\n }\n\n ta.style.overflowY = value;\n }\n\n function getParentOverflows(el) {\n var arr = [];\n\n while (el && el.parentNode && el.parentNode instanceof Element) {\n if (el.parentNode.scrollTop) {\n arr.push({\n node: el.parentNode,\n scrollTop: el.parentNode.scrollTop\n });\n }\n el = el.parentNode;\n }\n\n return arr;\n }\n\n function resize() {\n if (ta.scrollHeight === 0) {\n // If the scrollHeight is 0, then the element probably has display:none or is detached from the DOM.\n return;\n }\n\n var overflows = getParentOverflows(ta);\n var docTop = document.documentElement && document.documentElement.scrollTop; // Needed for Mobile IE (ticket #240)\n\n ta.style.height = '';\n ta.style.height = ta.scrollHeight + heightOffset + 'px';\n\n // used to check if an update is actually necessary on window.resize\n clientWidth = ta.clientWidth;\n\n // prevents scroll-position jumping\n overflows.forEach(function (el) {\n el.node.scrollTop = el.scrollTop;\n });\n\n if (docTop) {\n document.documentElement.scrollTop = docTop;\n }\n }\n\n function update() {\n resize();\n\n var styleHeight = Math.round(parseFloat(ta.style.height));\n var computed = window.getComputedStyle(ta, null);\n\n // Using offsetHeight as a replacement for computed.height in IE, because IE does not account use of border-box\n var actualHeight = computed.boxSizing === 'content-box' ? Math.round(parseFloat(computed.height)) : ta.offsetHeight;\n\n // The actual height not matching the style height (set via the resize method) indicates that\n // the max-height has been exceeded, in which case the overflow should be allowed.\n if (actualHeight < styleHeight) {\n if (computed.overflowY === 'hidden') {\n changeOverflow('scroll');\n resize();\n actualHeight = computed.boxSizing === 'content-box' ? Math.round(parseFloat(window.getComputedStyle(ta, null).height)) : ta.offsetHeight;\n }\n } else {\n // Normally keep overflow set to hidden, to avoid flash of scrollbar as the textarea expands.\n if (computed.overflowY !== 'hidden') {\n changeOverflow('hidden');\n resize();\n actualHeight = computed.boxSizing === 'content-box' ? Math.round(parseFloat(window.getComputedStyle(ta, null).height)) : ta.offsetHeight;\n }\n }\n\n if (cachedHeight !== actualHeight) {\n cachedHeight = actualHeight;\n var evt = createEvent('autosize:resized');\n try {\n ta.dispatchEvent(evt);\n } catch (err) {\n // Firefox will throw an error on dispatchEvent for a detached element\n // https://bugzilla.mozilla.org/show_bug.cgi?id=889376\n }\n }\n }\n\n var pageResize = function pageResize() {\n if (ta.clientWidth !== clientWidth) {\n update();\n }\n };\n\n var destroy = function (style) {\n window.removeEventListener('resize', pageResize, false);\n ta.removeEventListener('input', update, false);\n ta.removeEventListener('keyup', update, false);\n ta.removeEventListener('autosize:destroy', destroy, false);\n ta.removeEventListener('autosize:update', update, false);\n\n Object.keys(style).forEach(function (key) {\n ta.style[key] = style[key];\n });\n\n map.delete(ta);\n }.bind(ta, {\n height: ta.style.height,\n resize: ta.style.resize,\n overflowY: ta.style.overflowY,\n overflowX: ta.style.overflowX,\n wordWrap: ta.style.wordWrap\n });\n\n ta.addEventListener('autosize:destroy', destroy, false);\n\n // IE9 does not fire onpropertychange or oninput for deletions,\n // so binding to onkeyup to catch most of those events.\n // There is no way that I know of to detect something like 'cut' in IE9.\n if ('onpropertychange' in ta && 'oninput' in ta) {\n ta.addEventListener('keyup', update, false);\n }\n\n window.addEventListener('resize', pageResize, false);\n ta.addEventListener('input', update, false);\n ta.addEventListener('autosize:update', update, false);\n ta.style.overflowX = 'hidden';\n ta.style.wordWrap = 'break-word';\n\n map.set(ta, {\n destroy: destroy,\n update: update\n });\n\n init();\n }\n\n function destroy(ta) {\n var methods = map.get(ta);\n if (methods) {\n methods.destroy();\n }\n }\n\n function update(ta) {\n var methods = map.get(ta);\n if (methods) {\n methods.update();\n }\n }\n\n var autosize = null;\n\n // Do nothing in Node.js environment and IE8 (or lower)\n if (typeof window === 'undefined' || typeof window.getComputedStyle !== 'function') {\n autosize = function autosize(el) {\n return el;\n };\n autosize.destroy = function (el) {\n return el;\n };\n autosize.update = function (el) {\n return el;\n };\n } else {\n autosize = function autosize(el, options) {\n if (el) {\n Array.prototype.forEach.call(el.length ? el : [el], function (x) {\n return assign(x, options);\n });\n }\n return el;\n };\n autosize.destroy = function (el) {\n if (el) {\n Array.prototype.forEach.call(el.length ? el : [el], destroy);\n }\n return el;\n };\n autosize.update = function (el) {\n if (el) {\n Array.prototype.forEach.call(el.length ? el : [el], update);\n }\n return el;\n };\n }\n\n exports.default = autosize;\n module.exports = exports['default'];\n});","/***********************************************************************************\n * IE 8 이하 브라우져 console.log 에러처리\n ***********************************************************************************/\nif(!window.console || !window.console.log) {window.console = {log : function(){}};}\n\nvar APP = {};\n\n/**\n * 언어셋 변경\n * @param lang\n * @constructor\n */\nAPP.SET_LANG = function(lang)\n{\n $.cookie('site_lang', lang, {expires:30, path:'/'});\n location.reload();\n};\n\n/**\n * 팝업창 닫기버튼 init\n */\n$('[data-toggle=\"btn-popup-close\"]').click(function(e){\n var type = $(this).data('type');\n var idx = $(this).data('idx');\n var cookie = $(this).data('cookie');\n\n if( type == 'Y')\n {\n window.close();\n }\n else if( type == 'N' )\n {\n $(\"#popup-\" + idx ).remove();\n }\n\n if( cookie == 1 )\n {\n $.cookie('popup_'+idx, 1, {expires:1, path:'/'});\n }\n});\n\n/**\n * SNS 공유\n */\n$(\"a[data-toggle='sns-share']\").not('[data-service=\"link\"]').click(function(e){\n e.preventDefault();\n\n var _this = $(this);\n var sns_type = _this.data('service');\n var href = _this.data('url');\n var title = _this.data('title');\n var loc = \"\";\n var img = $(\"meta[name='og:image']\").attr('content');\n\n if( ! sns_type || !href || !title) return;\n\n if( sns_type == 'facebook' ) {\n loc = '//www.facebook.com/sharer/sharer.php?u='+encodeURIComponent(href);\n }\n else if ( sns_type == 'twitter' ) {\n loc = '//twitter.com/home?status='+encodeURIComponent(title)+' '+href;\n }\n else if ( sns_type == 'google' ) {\n loc = '//plus.google.com/share?url='+href;\n }\n else if ( sns_type == 'pinterest' ) {\n\n loc = '//www.pinterest.com/pin/create/button/?url='+href+'&media='+img+'&description='+encodeURIComponent(title);\n }\n else if ( sns_type == 'kakaostory') {\n loc = 'https://story.kakao.com/share?url='+encodeURIComponent(href);\n }\n else if ( sns_type == 'band' ) {\n loc = 'http://www.band.us/plugin/share?body='+encodeURIComponent(title)+'%0A'+encodeURIComponent(href);\n }\n else if ( sns_type == 'naver' ) {\n loc = \"http://share.naver.com/web/shareView.nhn?url=\"+encodeURIComponent(href)+\"&title=\"+encodeURIComponent(title);\n }\n else if ( sns_type == 'line') {\n loc = \"http://line.me/R/msg/text/?\" + encodeURIComponent(title + \"\\n\" + href);\n }\n else {\n return false;\n }\n APP.POPUP({ url : loc});\n return false;\n});\n\n$(function(){\n var clipboard = new ClipboardJS('a[data-toggle=\"sns-share\"][data-service=\"link\"]', {\n text: function(trigger) {\n return trigger.getAttribute('data-url');\n }\n });\n clipboard.on('success', function(){\n alert('현재 URL이 복사되었습니다.');\n });\n});","/************************************************************************************************************************\n * 해당 문자열의 regex 검사\n * @param regexType\n *************************************************************************************************************************/\nString.prototype.regex = function(regexType) {\n var phoneRegex = /^(01[016789]{1}|02|0[3-9]{1}[0-9]{1})([0-9]{3,4})([0-9]{4})$/,\n phoneWithHypenRegex = /^(01[016789]{1}|02|0[3-9]{1}[0-9]{1})-?([0-9]{3,4})-?([0-9]{4})$/,\n telRegex = /(^02.{0}|^01.{1}|[0-9]{3})([0-9]{3,4})([0-9]{4})/,\n telCheckRegex = /^\\d{2,3}-\\d{3,4}-\\d{4}$/,\n uniqueID = /^[a-z][a-z0-9_]{2,19}$/g,\n emailRegex = /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/,\n str = this;\n\n switch(regexType) {\n case \"phone\" :\n var transNum = str.replace(/\\s/gi, '').replace(/-/gi,'');\n if(transNum.length == 11 || transNum.length == 10) {\n if( phoneRegex.test(transNum) ) {\n transNum = transNum.replace(phoneWithHypenRegex, '$1-$2-$3');\n return transNum;\n }\n }\n return false;\n case \"tel\":\n var transNum = str.replace(/\\s/gi, '').replace(/-/gi,'');\n transNum = transNum.replace(telRegex, '$1-$2-$3');\n if(telCheckRegex.test(transNum)) {\n return transNum;\n }\n return false;\n case \"email\":\n return emailRegex.test(str);\n case \"biznum\" :\n var checkID = new Array(1, 3, 7, 1, 3, 7, 1, 3, 5, 1),\n tmpBizID, i, chkSum=0, c2, remander,\n bizID = str.replace(/-/gi,'');\n\n for (i=0; i<=7; i++) chkSum += checkID[i] * bizID.charAt(i);\n c2 = \"0\" + (checkID[8] * bizID.charAt(8));\n c2 = c2.substring(c2.length - 2, c2.length);\n chkSum += Math.floor(c2.charAt(0)) + Math.floor(c2.charAt(1));\n remander = (10 - (chkSum % 10)) % 10 ;\n\n if (Math.floor(bizID.charAt(9)) == remander) return bizID.replace(/(\\d{3})(\\d{2})(\\d{5})/, '$1-$2-$3');\n return false;\n case \"uniqid\" :\n return uniqueID.test(str);\n }\n};","/**********************************************************************************************************************\n * 숫자에 컴마를 붙여서 리턴한다\n * @returns {*}\n *********************************************************************************************************************/\nNumber.prototype.numberFormat = function(){\n if(this==0) return 0;\n\n var reg = /(^[+-]?\\d+)(\\d{3})/;\n var n = (this + '');\n\n while (reg.test(n)) n = n.replace(reg, '$1' + ',' + '$2');\n\n return n;\n};\nString.prototype.numberFormat = function() { return isNaN( parseFloat(this) ) ? \"0\" : (parseFloat(this)).numberFormat(); };\n\n/**********************************************************************************************************************\n * 컴마가 붙어있는 숫자에서 콤마를 삭제하고 숫자로 반환한다.\n * @returns {*}\n *********************************************************************************************************************/\nString.prototype.unNumberFormat = function() {\n var str = this;\n if(typeof str == 'number') return str;\n str = (\"\" + str).replace(/,/gi,''); // 콤마 제거\n str = str.replace(/(^\\s*)|(\\s*$)/g, \"\"); // trim\n\n var returnStr = new Number(str);\n return isNaN(returnStr) ? str : returnStr;\n};\nNumber.prototype.unNumberFormat = function() {\n return this;\n};\n\n/**********************************************************************************************************************\n * 날짜를 원하는 포맷 형식으로 출력\n * @param f\n * @returns {*}\n *********************************************************************************************************************/\nDate.prototype.dateFormat = function(f) {\n if (!this.valueOf()) return \" \";\n if (!f) return this;\n\n var weekName = [\"일요일\", \"월요일\", \"화요일\", \"수요일\", \"목요일\", \"금요일\", \"토요일\"],\n shortWeekName = [\"일\", \"월\", \"화\", \"수\", \"목\", \"금\", \"토\"],\n d = this;\n\n return f.replace(/(yyyy|yy|MM|dd|E|hh|mm|ss|a\\/p)/gi, function($1) {\n switch ($1) {\n case \"yyyy\": return d.getFullYear();\n case \"yy\": return (d.getFullYear() % 1000).zf(2);\n case \"MM\": return (d.getMonth() + 1).zf(2);\n case \"dd\": return d.getDate().zf(2);\n case \"E\": return weekName[d.getDay()];\n case \"e\": return shortWeekName[d.getDay()];\n case \"HH\": return d.getHours().zf(2);\n case \"hh\": return ((h = d.getHours() % 12) ? h : 12).zf(2);\n case \"mm\": return d.getMinutes().zf(2);\n case \"ss\": return d.getSeconds().zf(2);\n case \"a/p\": return d.getHours() < 12 ? \"오전\" : \"오후\";\n default: return $1;\n }\n });\n};\nString.prototype.string = function(len){var s = '', i = 0; while (i++ < len) { s += this; } return s;};\nString.prototype.zf = function(len){return \"0\".string(len - this.length) + this;};\nNumber.prototype.zf = function(len){return this.toString().zf(len);};\nString.prototype.dateFormat = function(f) {\n var d = new Date(this);\n return ( d == 'Invalid Date') ? '' : d.dateFormat(f);\n}\n\n/**********************************************************************************************************************\n * 숫자를 한글명으로 바꿔서 보여줍니다.\n *********************************************************************************************************************/\nNumber.prototype.toKorean = function() {\n var hanA = new Array(\"\",\"일\",\"이\",\"삼\",\"사\",\"오\",\"육\",\"칠\",\"팔\",\"구\",\"십\"),\n danA = new Array(\"\",\"십\",\"백\",\"천\",\"\",\"십\",\"백\",\"천\",\"\",\"십\",\"백\",\"천\",\"\",\"십\",\"백\",\"천\"),\n num = new String(this),\n result = '';\n\n for(var i=0; i<num.length; i++) {\n var str = \"\",\n han = hanA[num.charAt(num.length-(i+1))];\n\n if(han != \"\") str += han+danA[i];\n\n if(i == 4) str += \"만\";\n if(i == 8) str += \"억\";\n if(i == 12) str += \"조\";\n\n result = str + result;\n }\n\n return result;\n}\nString.prototype.toKorean = function() {\n return (this.unNumberFormat()).toKorean();\n}","APP.POPUP = null;\n(function($) {\n APP.POPUP = function(option) {\n var defaults={\n title : '_blank',\n width : 800,\n height : 600,\n url : ''\n };\n\n var options = $.extend({}, defaults, option);\n\n cw = screen.availWidth;\n ch = screen.availHeight;\n sw = options.width;\n sh = options.height;\n\n ml = (cw - sw) / 2;\n mt = (ch - sh) / 2;\n var option = 'width='+sw+',height='+sh+',top='+mt+',left='+ml+',scrollbars=yes,resizable=no';\n var win = window.open(options.url, options.title, option);\n if (win == null || typeof(win) == \"undefined\" || (win == null && win.outerWidth == 0) || (win != null && win.outerHeight == 0))\n {\n alert(\"팝업 차단 기능이 설정되어있습니다\\n\\n차단 기능을 해제(팝업허용) 한 후 다시 이용해 주십시오.\");\n return;\n }\n };\n})(jQuery);","APP.MEMBER = {};\n\n/**\n * 회원 관련 자바스크립트 초기화\n */\nAPP.MEMBER.init = function() {\n APP.MEMBER.InitLoginForm(); // 로그인폼 init\n APP.MEMBER.initCheckExist();\n APP.MEMBER.InitRegisterForm();\n APP.MEMBER.InitMemberModifyForm();\n};\n\nAPP.MEMBER.InitRegisterForm = function() {\n $('[data-form=\"form-register\"]').submit(function(e) {\n e.preventDefault();\n var $form = $(this);\n $.ajax({\n type : 'PUT',\n data : $form.serialize(),\n url : base_url + '/ajax/members/info',\n success:function(res){\n if(res.result == true) {\n alert(LANG.member_join_success);\n location.href = base_url + \"/members/login\";\n }\n }\n });\n });\n};\n\nAPP.MEMBER.InitMemberModifyForm = function() {\n $('[data-form=\"form-member-modify\"]').submit(function(e) {\n e.preventDefault();\n var $form = $(this);\n $.ajax({\n type : 'POST',\n data : $form.serialize(),\n url : base_url + '/ajax/members/info',\n success:function(res){\n if(res.result == true) {\n alert(res.message);\n location.reload();\n }\n }\n });\n });\n};\n\n/**\n * 로그인 폼 초기화\n * @constructor\n */\nAPP.MEMBER.InitLoginForm = function() {\n $('[data-role=\"form-login\"]').submit(function (e) {\n e.preventDefault();\n var $form = $(this);\n var elementLoginID = $form.find('[name=\"login_id\"]');\n var elementLoginPass = $form.find('[name=\"login_pass\"]');\n\n if(elementLoginID.val().trim() == '')\n {\n alert(LANG.member_login_userid_required);\n elementLoginID.focus();\n return false;\n }\n\n if(elementLoginPass.val().trim() == '')\n {\n alert(LANG.member_login_password_required);\n elementLoginPass.focus();\n return false;\n }\n\n $.ajax({\n url : base_url + 'ajax/members/login',\n type : \"POST\",\n data : $form.serialize(),\n success:function(res) {\n if (res.result == true) {\n location.href = res.reurl ? res.reurl : base_url;\n }\n },\n error : function(e){\n elementLoginPass.val('');\n }\n })\n });\n};\n\n/**\n * 중복확인 버튼 이벤트 연결\n */\nAPP.MEMBER.initCheckExist = function() {\n $('[data-toggle=\"check-member-exist\"]').each(function(){\n var $btn = $(this);\n\n $btn.on('click', function(){\n var $target = $(\"#\" + $btn.data('target'));\n var key = $btn.data('check');\n var value = $target.val();\n\n if( typeof value == 'undefined' || ! value || ! value.trim() )\n {\n alert(LANG.member_join_user_id_required );\n $target.focus();\n return false;\n }\n\n var wordCheck = APP.MEMBER.denyWordCheck(key,value);\n if( wordCheck == 'VALID_EMAIL' )\n {\n alert(LANG.member_join_no_valid_email_address );\n $target.focus();\n return false;\n }\n else if(! wordCheck)\n {\n alert(LANG.member_join_user_id_contains_deny_word );\n $target.focus();\n return false;\n }\n\n if( APP.MEMBER.getInfo(key, value) )\n {\n alert(LANG.member_join_user_id_already_exists );\n $target.focus();\n return false;\n }\n\n alert(LANG.member_join_user_id_available );\n return true;\n });\n });\n\n};\n\n/**\n * 사용자의 정보 가져오기\n * @param key 가져올 기준 키\n * @param value 키 값\n * @returns {*}\n */\nAPP.MEMBER.getInfo = function(key, value) {\n var info = null;\n $.ajax({\n url : base_url + '/ajax/members/info',\n type : 'get',\n async : false,\n cache : false,\n data : {\n key : key,\n value : value\n },\n success:function(res){\n info = res.result;\n }\n });\n return info;\n};\n\n/**\n * 아이디와 닉네임 금지단어 사용여부 체크\n * @param key 아이디/닉네임\n * @param value 체크할 값\n * @returns {*}\n */\nAPP.MEMBER.denyWordCheck = function(key,value) {\n var result = null;\n $.ajax({\n url : base_url + '/ajax/members/word_check',\n type : 'get',\n async : false,\n cache : false,\n data : {\n key:key,\n value : value\n },\n success:function(res) {\n result = res.result;\n }\n });\n return result;\n};\n\n\nAPP.MEMBER.POP_CHANGE_PHOTO = function() {\n APP.POPUP({\n url : '/members/photo_change',\n width : 600,\n height :150\n });\n};\n\n$(document).ready(APP.MEMBER.init);","APP.BOARD = {};\nAPP.BOARD.CATEGORY = {};\nAPP.BOARD.EXTRA = {};\nAPP.BOARD.COMMENT = {};\n\n/**\n * 특정 카테고리의 하위 카테고리가 몇개인지 가져온다.\n * @param bca_idx\n */\nAPP.BOARD.CATEGORY.count = function(bca_idx)\n{\n if (typeof bca_idx == 'undefined' || ! bca_idx) return 0;\n\n var count = 0;\n $.ajax({\n url : base_url + \"/ajax/board/category_count\",\n type : 'get',\n cache : false,\n async : false,\n data : {\n bca_idx: bca_idx\n },\n success:function(res)\n {\n count = res.result;\n }\n })\n\n return count;\n};\n\nAPP.BOARD.CATEGORY.postCount = function(bca_idx)\n{\n if (typeof bca_idx == 'undefined' || ! bca_idx) return 0;\n\n var count = 0;\n $.ajax({\n url : base_url + \"/ajax/board/category_post_count\",\n type : 'get',\n cache : false,\n async : false,\n data : {\n bca_idx: bca_idx\n },\n success:function(res)\n {\n count = res.result;\n }\n });\n\n return count;\n};\n\nAPP.BOARD.COMMENT.modify= function( cmt_idx )\n{\n APP.POPUP({\n title : '_blank',\n width : 800,\n height : 600,\n url : base_url + '/board/comment/modify/' + cmt_idx\n });\n};\n\nAPP.BOARD.COMMENT.reply= function( cmt_idx, cmt_num )\n{\n APP.POPUP({\n title : '_blank',\n width : 800,\n height : 600,\n url : base_url + '/board/comment/reply/' + cmt_idx + '/' + cmt_num\n });\n};\n\n$(function(){\n var $form_post = $('[data-form=\"post\"]');\n if( $form_post.length > 0 )\n {\n $form_post.on('submit', function(){\n $.blockUI({\n css: {width:'25px',top:'49%',left:'49%',border:'0px none',backgroundColor:'transparent',cursor:'wait'},\n message : '<img src=\"/assets/images/common/ajax-loader.gif\" alt=\"로딩중\">',\n baseZ : 10000,\n overlayCSS : {opacity : 0}\n });\n });\n }\n});\n","/***********************************************************************************\n * AJAX Error 및 BlockUI 처리\n ***********************************************************************************/\n$(function() {\n $(document).ajaxError(function(event, request, settings){\n var message = '알수없는 오류가 발생하였습니다.';\n if( typeof request.responseJSON != 'undefined' && typeof request.responseJSON.message != 'undefined' ) {\n message = request.responseJSON.message;\n }\n else {\n if( request.status == 500 ) message = '서버 코드 오류가 발생하였습니다.\\n관리자에게 문의하세요';\n else if ( request.status == 401 ) message = '해당 명령을 실행할 권한이 없습니다.';\n }\n toastr.error(message, '오류 발생');\n }).ajaxStart(function(){\n $.blockUI({\n css: {width:'25px',top:'49%',left:'49%',border:'0px none',backgroundColor:'transparent',cursor:'wait'},\n message : '<img src=\"/assets/images/common/ajax-loader.gif\" alt=\"로딩중\">',\n baseZ : 10000,\n overlayCSS : {opacity : 0}\n });\n }).ajaxComplete(function(){\n $.unblockUI();\n });\n});\n\n/***********************************************************************************************************************\n * 전체체크박스 / 체크박스 연동\n ***********************************************************************************************************************/\n$(function() {\n $(document).on('change', '[data-checkbox]', function() {\n var $check = $(this);\n var is_all = $check.data('checkbox-all') != null ? true : false;\n var name = $check.data('checkbox');\n var checked = $check.prop('checked');\n var $allCheck = is_all ? $check : $('[data-checkbox=\"'+name+'\"][data-checkbox-all]');\n\n if( is_all ) {\n $('[data-checkbox=\"'+name+'\"]').prop('checked', checked );\n }\n else {\n $allCheck.prop('checked', $('[data-checkbox=\"'+name+'\"]').not('[data-checkbox-all]').length == $('[data-checkbox=\"'+name+'\"]:checked').not('[data-checkbox-all]').length);\n }\n });\n});\n\n/***********************************************************************************************************************\n * 숫자 3자리마다 Comma 자동 입력\n ***********************************************************************************************************************/\n$(function() {\n $(document).on('keyup', '[data-number-format]', function(e) {\n $(this).val( $(this).val().trim().unNumberFormat().numberFormat() );\n })\n});\n\n/***********************************************************************************************************************\n * 숫자만 입력가능한 Input\n ***********************************************************************************************************************/\n$(function() {\n $(document).on('keypress', '[data-number-only]', function(e) {\n if (e.which != 8 && e.which != 0 && e.which != 45 && (e.which < 48 || e.which > 57)) {\n e.preventDefault();\n }\n })\n});\n\n/***********************************************************************************************************************\n * 높이 자동조절되는 Textarea\n ***********************************************************************************************************************/\n$(function() {\n $(document).on('keyup','textarea[data-autosize]', function(e) {\n autosize($(this));\n });\n $('textarea[data-autosize]').keyup();\n});\n\n$(function() {\n /***********************************************************************************************************************\n * 핸드폰 번호 Input\n ***********************************************************************************************************************/\n $('body').on('keypress', '[data-regex=\"phone-number\"]', function(e){\n if (e.which != 8 && e.which != 0 && e.which != 45 && (e.which < 48 || e.which > 57)) {\n e.preventDefault();\n }\n }).on('blur','[data-regex=\"phone-number\"]', function(e){\n if($(this).val() == '') return;\n var transNum = $(this).val().regex('phone');\n if( transNum === false ) {\n toastr.error('유효하지 않은 전화번호 입니다.');\n $(this).val(\"\");\n $(this).focus();\n return;\n }\n $(this).val(transNum);\n });\n\n /***********************************************************************************************************************\n * 전화번호 Input\n ***********************************************************************************************************************/\n $('body').on('blur', '[data-regex=\"tel-number\"]', function(e){\n if($(this).val() == '') return;\n var transNum = $(this).val().regex('tel');\n if( transNum === false ) {\n toastr.error('유효하지 않은 전화번호 입니다.');\n $(this).val(\"\");\n $(this).focus();\n return;\n }\n $(this).val(transNum);\n });\n\n /***********************************************************************************************************************\n * 이메일주소 Input\n ***********************************************************************************************************************/\n $('body').on('blur', '[data-regex=\"email-address\"]', function(e){\n if($(this).val() == '') return;\n var trans_num = $(this).val().regex('email');\n\n if(! trans_num) {\n toastr.error('유효하지 않은 이메일주소 입니다.');\n $(this).val(\"\");\n $(this).focus();\n }\n });\n});\n\n","/* ========================================================================\n * Bootstrap: dropdown.js v3.3.7\n * http://getbootstrap.com/javascript/#dropdowns\n * ========================================================================\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n+function ($) {\n 'use strict';\n\n // DROPDOWN CLASS DEFINITION\n // =========================\n\n var backdrop = '.dropdown-backdrop'\n var toggle = '[data-toggle=\"dropdown\"]'\n var Dropdown = function (element) {\n $(element).on('click.bs.dropdown', this.toggle)\n }\n\n Dropdown.VERSION = '3.3.7'\n\n function getParent($this) {\n var selector = $this.attr('data-target')\n\n if (!selector) {\n selector = $this.attr('href')\n selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n }\n\n var $parent = selector && $(selector)\n\n return $parent && $parent.length ? $parent : $this.parent()\n }\n\n function clearMenus(e) {\n if (e && e.which === 3) return\n $(backdrop).remove()\n $(toggle).each(function () {\n var $this = $(this)\n var $parent = getParent($this)\n var relatedTarget = { relatedTarget: this }\n\n if (!$parent.hasClass('open')) return\n\n if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return\n\n $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))\n\n if (e.isDefaultPrevented()) return\n\n $this.attr('aria-expanded', 'false')\n $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget))\n })\n }\n\n Dropdown.prototype.toggle = function (e) {\n var $this = $(this)\n\n if ($this.is('.disabled, :disabled')) return\n\n var $parent = getParent($this)\n var isActive = $parent.hasClass('open')\n\n clearMenus()\n\n if (!isActive) {\n if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {\n // if mobile we use a backdrop because click events don't delegate\n $(document.createElement('div'))\n .addClass('dropdown-backdrop')\n .insertAfter($(this))\n .on('click', clearMenus)\n }\n\n var relatedTarget = { relatedTarget: this }\n $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))\n\n if (e.isDefaultPrevented()) return\n\n $this\n .trigger('focus')\n .attr('aria-expanded', 'true')\n\n $parent\n .toggleClass('open')\n .trigger($.Event('shown.bs.dropdown', relatedTarget))\n }\n\n return false\n }\n\n Dropdown.prototype.keydown = function (e) {\n if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return\n\n var $this = $(this)\n\n e.preventDefault()\n e.stopPropagation()\n\n if ($this.is('.disabled, :disabled')) return\n\n var $parent = getParent($this)\n var isActive = $parent.hasClass('open')\n\n if (!isActive && e.which != 27 || isActive && e.which == 27) {\n if (e.which == 27) $parent.find(toggle).trigger('focus')\n return $this.trigger('click')\n }\n\n var desc = ' li:not(.disabled):visible a'\n var $items = $parent.find('.dropdown-menu' + desc)\n\n if (!$items.length) return\n\n var index = $items.index(e.target)\n\n if (e.which == 38 && index > 0) index-- // up\n if (e.which == 40 && index < $items.length - 1) index++ // down\n if (!~index) index = 0\n\n $items.eq(index).trigger('focus')\n }\n\n\n // DROPDOWN PLUGIN DEFINITION\n // ==========================\n\n function Plugin(option) {\n return this.each(function () {\n var $this = $(this)\n var data = $this.data('bs.dropdown')\n\n if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))\n if (typeof option == 'string') data[option].call($this)\n })\n }\n\n var old = $.fn.dropdown\n\n $.fn.dropdown = Plugin\n $.fn.dropdown.Constructor = Dropdown\n\n\n // DROPDOWN NO CONFLICT\n // ====================\n\n $.fn.dropdown.noConflict = function () {\n $.fn.dropdown = old\n return this\n }\n\n\n // APPLY TO STANDARD DROPDOWN ELEMENTS\n // ===================================\n\n $(document)\n .on('click.bs.dropdown.data-api', clearMenus)\n .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })\n .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)\n .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)\n .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown)\n\n}(jQuery);","APP.MASK = new ax5.ui.mask({\n zIndex: 1000}\n);\nAPP.MASK2 = new ax5.ui.mask({\n zIndex: 2000\n});\nAPP.modal = new ax5.ui.modal({\n absolute: true,\n iframeLoadingMsg: '<i class=\"fal fa-spinner\"></i>'\n});\nAPP.modal2 = new ax5.ui.modal({\n absolute: true,\n iframeLoadingMsg: '<i class=\"fal fa-spinner\"></i>'\n});\nAPP.MODAL = function() {\n var modalCallback = {};\n\n var defaultCss = {\n width: 400,\n height: 400,\n position: {\n left: \"center\",\n top: \"middle\"\n }\n };\n\n var defaultOption = $.extend(true, {}, defaultCss, {\n iframeLoadingMsg: \"\",\n iframe: {\n method: \"get\",\n url: \"#\"\n },\n closeToEsc: true,\n onStateChanged: function onStateChanged() {\n // mask\n if (this.state === \"open\") {\n APP.MASK.open();\n } else if (this.state === \"close\") {\n APP.MASK.close();\n }\n },\n animateTime: 100,\n zIndex: 1001,\n absolute: true,\n fullScreen: false,\n header: {\n title: \"새로운 윈도우\",\n btns: {\n close: {\n label: '<i class=\"far fa-times\"></i>', onClick: function onClick() {\n APP.MODAL.callback();\n }\n }\n }\n }\n });\n\n var open = function(modalConfig) {\n\n modalConfig = $.extend(true, {}, defaultOption, modalConfig);\n $(document.body).addClass(\"modalOpened\");\n\n this.modalCallback = modalConfig.callback;\n this.modalSendData = modalConfig.sendData;\n\n APP.modal.open(modalConfig);\n };\n\n var css = function css(modalCss) {\n modalCss = $.extend(true, {}, defaultCss, modalCss);\n APP.modal.css(modalCss);\n };\n var align = function align(modalAlign) {\n APP.modal.align(modalAlign);\n };\n var close = function close(data) {\n APP.modal.close();\n setTimeout(function () {\n $(document.body).removeClass(\"modalOpened\");\n }, 500);\n };\n var minimize = function minimize() {\n APP.modal.minimize();\n };\n var maximize = function maximize() {\n APP.modal.maximize();\n };\n var callback = function callback(data) {\n if (this.modalCallback) {\n this.modalCallback(data);\n }\n this.close(data);\n };\n var getData = function getData() {\n if (this.modalSendData) {\n return this.modalSendData();\n }\n };\n\n return {\n \"open\": open,\n \"css\": css,\n \"align\": align,\n \"close\": close,\n \"minimize\": minimize,\n \"maximize\": maximize,\n \"callback\": callback,\n \"modalCallback\": modalCallback,\n \"getData\": getData\n };\n}();\nAPP.MODAL2 = function() {\n var modalCallback = {};\n\n var defaultCss = {\n width: 400,\n height: 400,\n position: {\n left: \"center\",\n top: \"middle\"\n }\n };\n\n var defaultOption = $.extend(true, {}, defaultCss, {\n iframeLoadingMsg: \"\",\n iframe: {\n method: \"get\",\n url: \"#\"\n },\n closeToEsc: true,\n onStateChanged: function onStateChanged() {\n // mask\n if (this.state === \"open\") {\n APP.MASK2.open();\n } else if (this.state === \"close\") {\n APP.MASK2.close();\n }\n },\n animateTime: 100,\n zIndex: 2001,\n absolute: true,\n fullScreen: false,\n header: {\n title: \"새로운 윈도우\",\n btns: {\n close: {\n label: '<i class=\"far fa-times\"></i>', onClick: function onClick() {\n APP.MODAL2.callback();\n }\n }\n }\n }\n });\n\n var open = function(modalConfig) {\n\n modalConfig = $.extend(true, {}, defaultOption, modalConfig);\n $(document.body).addClass(\"modalOpened\");\n\n this.modalCallback = modalConfig.callback;\n this.modalSendData = modalConfig.sendData;\n\n APP.modal2.open(modalConfig);\n };\n\n var css = function css(modalCss) {\n modalCss = $.extend(true, {}, defaultCss, modalCss);\n APP.modal2.css(modalCss);\n };\n var align = function align(modalAlign) {\n APP.modal2.align(modalAlign);\n };\n var close = function close(data) {\n APP.modal2.close();\n setTimeout(function () {\n $(document.body).removeClass(\"modalOpened\");\n }, 500);\n };\n var minimize = function minimize() {\n APP.modal2.minimize();\n };\n var maximize = function maximize() {\n APP.modal2.maximize();\n };\n var callback = function callback(data) {\n if (this.modalCallback) {\n this.modalCallback(data);\n }\n this.close(data);\n };\n var getData = function getData() {\n if (this.modalSendData) {\n return this.modalSendData();\n }\n };\n\n return {\n \"open\": open,\n \"css\": css,\n \"align\": align,\n \"close\": close,\n \"minimize\": minimize,\n \"maximize\": maximize,\n \"callback\": callback,\n \"modalCallback\": modalCallback,\n \"getData\": getData\n };\n}();",""],"file":"mobile.min.js"}