{"version":3,"sources":["clipboard.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","setup","$","_fadeIn","fadeIn","noOp","noop","msie","test","navigator","userAgent","ie6","setExpr","documentMode","isFunction","setExpression","blockUI","opts","install","unblockUI","remove","growlUI","title","message","timeout","onClose","$m","append","callBlock","fadeOut","centerY","showOverlay","onUnblock","css","defaults","growlCSS","mouseover","displayBlock","stop","fadeTo","mouseout","block","fullOpts","extend","each","$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","el","full","msg","jquery","parent","display","lyr1","lyr2","lyr3","z","addClass","layers","$par","appendTo","handle","cancel","expr","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","filter","add","reset","w","cssW","b","events","handler","unbind","keyCode","fwd","shiftKey","back","hasClass","parents","jQuery","require","pluses","encode","config","raw","encodeURIComponent","read","converter","indexOf","replace","decodeURIComponent","json","JSON","parse","parseCookieValue","cookie","expires","days","Date","setMilliseconds","getMilliseconds","stringify","stringifyCookieValue","toUTCString","path","domain","secure","join","result","cookies","split","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","isArray","isObject","jsonObjectBody","isString","isNumber","isUndefined","str","pos","substr","lastIndexOf","camelCase","all","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","$1","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","args","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","Function","first","keys","item","deepCopy","r","getType","typeName","isWindow","isElement","isNodelist","setCookie","cn","cv","exdays","expire","setDate","escape","getCookie","cname","ca","charAt","unescape","merge","second","j","v","dday","diffnum","memoryDay","DyMilli","today","getDayTime","weeksOfMonth","myDate","year","month","findParentNode","tagName","toLocaleLowerCase","klasss","a","cssNumber","found","unit","returns","trim","vSplited","isDate","valueOf","isDateFormat","stopEvent","event","cancelBubble","stopPropagation","preventDefault","throttle","_string","format","concat","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","def","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","pop","webkitMatchMedia","mozMatchMedia","oMatchMedia","msMatchMedia","matchMedia","getElementsByTagName","styleMedia","media","script","id","insertBefore","getComputedStyle","matchMedium","styleSheet","cssText","textContent","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","template","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","content","open","close","templateName","maskConfig","_cfg","$target","maskId","$mask","tmpl","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","innerHTML","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","complete","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","update","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","backdrop","toggle","Dropdown","getParent","$this","$parent","clearMenus","relatedTarget","contains","isDefaultPrevented","VERSION","isActive","insertAfter","toggleClass","keydown","$items","eq","old","dropdown","noConflict","defaultCss","defaultOption","modalCallback","modalSendData","sendData","modalCss","modalAlign","maximize","getData","MODAL2","MASK2","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});","/*!\r\n * jQuery blockUI plugin\r\n * Version 2.70.0-2014.11.23\r\n * Requires jQuery v1.7 or later\r\n *\r\n * Examples at: http://malsup.com/jquery/block/\r\n * Copyright (c) 2007-2013 M. Alsup\r\n * Dual licensed under the MIT and GPL licenses:\r\n * http://www.opensource.org/licenses/mit-license.php\r\n * http://www.gnu.org/licenses/gpl.html\r\n *\r\n * Thanks to Amir-Hossein Sobhi for some excellent contributions!\r\n */\r\n\r\n;(function() {\r\n /*jshint eqeqeq:false curly:false latedef:false */\r\n \"use strict\";\r\n\r\n function setup($) {\r\n $.fn._fadeIn = $.fn.fadeIn;\r\n\r\n var noOp = $.noop || function() {};\r\n\r\n // this bit is to ensure we don't call setExpression when we shouldn't (with extra muscle to handle\r\n // confusing userAgent strings on Vista)\r\n var msie = /MSIE/.test(navigator.userAgent);\r\n var ie6 = /MSIE 6.0/.test(navigator.userAgent) && ! /MSIE 8.0/.test(navigator.userAgent);\r\n var mode = document.documentMode || 0;\r\n var setExpr = $.isFunction( document.createElement('div').style.setExpression );\r\n\r\n // global $ methods for blocking/unblocking the entire page\r\n $.blockUI = function(opts) { install(window, opts); };\r\n $.unblockUI = function(opts) { remove(window, opts); };\r\n\r\n // convenience method for quick growl-like notifications (http://www.google.com/search?q=growl)\r\n $.growlUI = function(title, message, timeout, onClose) {\r\n var $m = $('
');\r\n if (title) $m.append('

'+title+'

');\r\n if (message) $m.append('

'+message+'

');\r\n if (timeout === undefined) timeout = 3000;\r\n\r\n // Added by konapun: Set timeout to 30 seconds if this growl is moused over, like normal toast notifications\r\n var callBlock = function(opts) {\r\n opts = opts || {};\r\n\r\n $.blockUI({\r\n message: $m,\r\n fadeIn : typeof opts.fadeIn !== 'undefined' ? opts.fadeIn : 700,\r\n fadeOut: typeof opts.fadeOut !== 'undefined' ? opts.fadeOut : 1000,\r\n timeout: typeof opts.timeout !== 'undefined' ? opts.timeout : timeout,\r\n centerY: false,\r\n showOverlay: false,\r\n onUnblock: onClose,\r\n css: $.blockUI.defaults.growlCSS\r\n });\r\n };\r\n\r\n callBlock();\r\n var nonmousedOpacity = $m.css('opacity');\r\n $m.mouseover(function() {\r\n callBlock({\r\n fadeIn: 0,\r\n timeout: 30000\r\n });\r\n\r\n var displayBlock = $('.blockMsg');\r\n displayBlock.stop(); // cancel fadeout if it has started\r\n displayBlock.fadeTo(300, 1); // make it easier to read the message by removing transparency\r\n }).mouseout(function() {\r\n $('.blockMsg').fadeOut(1000);\r\n });\r\n // End konapun additions\r\n };\r\n\r\n // plugin method for blocking element content\r\n $.fn.block = function(opts) {\r\n if ( this[0] === window ) {\r\n $.blockUI( opts );\r\n return this;\r\n }\r\n var fullOpts = $.extend({}, $.blockUI.defaults, opts || {});\r\n this.each(function() {\r\n var $el = $(this);\r\n if (fullOpts.ignoreIfBlocked && $el.data('blockUI.isBlocked'))\r\n return;\r\n $el.unblock({ fadeOut: 0 });\r\n });\r\n\r\n return this.each(function() {\r\n if ($.css(this,'position') == 'static') {\r\n this.style.position = 'relative';\r\n $(this).data('blockUI.static', true);\r\n }\r\n this.style.zoom = 1; // force 'hasLayout' in ie\r\n install(this, opts);\r\n });\r\n };\r\n\r\n // plugin method for unblocking element content\r\n $.fn.unblock = function(opts) {\r\n if ( this[0] === window ) {\r\n $.unblockUI( opts );\r\n return this;\r\n }\r\n return this.each(function() {\r\n remove(this, opts);\r\n });\r\n };\r\n\r\n $.blockUI.version = 2.70; // 2nd generation blocking at no extra cost!\r\n\r\n // override these in your code to change the default behavior and style\r\n $.blockUI.defaults = {\r\n // message displayed when blocking (use null for no message)\r\n message: '

Please wait...

',\r\n\r\n title: null,\t\t// title string; only used when theme == true\r\n draggable: true,\t// only used when theme == true (requires jquery-ui.js to be loaded)\r\n\r\n theme: false, // set to true to use with jQuery UI themes\r\n\r\n // styles for the message when blocking; if you wish to disable\r\n // these and use an external stylesheet then do this in your code:\r\n // $.blockUI.defaults.css = {};\r\n css: {\r\n padding:\t0,\r\n margin:\t\t0,\r\n width:\t\t'30%',\r\n top:\t\t'40%',\r\n left:\t\t'35%',\r\n textAlign:\t'center',\r\n color:\t\t'#000',\r\n border:\t\t'3px solid #aaa',\r\n backgroundColor:'#fff',\r\n cursor:\t\t'wait'\r\n },\r\n\r\n // minimal style set used when themes are used\r\n themedCSS: {\r\n width:\t'30%',\r\n top:\t'40%',\r\n left:\t'35%'\r\n },\r\n\r\n // styles for the overlay\r\n overlayCSS: {\r\n backgroundColor:\t'#000',\r\n opacity:\t\t\t0.6,\r\n cursor:\t\t\t\t'wait'\r\n },\r\n\r\n // style to replace wait cursor before unblocking to correct issue\r\n // of lingering wait cursor\r\n cursorReset: 'default',\r\n\r\n // styles applied when using $.growlUI\r\n growlCSS: {\r\n width:\t\t'350px',\r\n top:\t\t'10px',\r\n left:\t\t'',\r\n right:\t\t'10px',\r\n border:\t\t'none',\r\n padding:\t'5px',\r\n opacity:\t0.6,\r\n cursor:\t\t'default',\r\n color:\t\t'#fff',\r\n backgroundColor: '#000',\r\n '-webkit-border-radius':'10px',\r\n '-moz-border-radius':\t'10px',\r\n 'border-radius':\t\t'10px'\r\n },\r\n\r\n // IE issues: 'about:blank' fails on HTTPS and javascript:false is s-l-o-w\r\n // (hat tip to Jorge H. N. de Vasconcelos)\r\n /*jshint scripturl:true */\r\n iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank',\r\n\r\n // force usage of iframe in non-IE browsers (handy for blocking applets)\r\n forceIframe: false,\r\n\r\n // z-index for the blocking overlay\r\n baseZ: 1000,\r\n\r\n // set these to true to have the message automatically centered\r\n centerX: true, // <-- only effects element blocking (page block controlled via css above)\r\n centerY: true,\r\n\r\n // allow body element to be stetched in ie6; this makes blocking look better\r\n // on \"short\" pages. disable if you wish to prevent changes to the body height\r\n allowBodyStretch: true,\r\n\r\n // enable if you want key and mouse events to be disabled for content that is blocked\r\n bindEvents: true,\r\n\r\n // be default blockUI will supress tab navigation from leaving blocking content\r\n // (if bindEvents is true)\r\n constrainTabKey: true,\r\n\r\n // fadeIn time in millis; set to 0 to disable fadeIn on block\r\n fadeIn: 200,\r\n\r\n // fadeOut time in millis; set to 0 to disable fadeOut on unblock\r\n fadeOut: 400,\r\n\r\n // time in millis to wait before auto-unblocking; set to 0 to disable auto-unblock\r\n timeout: 0,\r\n\r\n // disable if you don't want to show the overlay\r\n showOverlay: true,\r\n\r\n // if true, focus will be placed in the first available input field when\r\n // page blocking\r\n focusInput: true,\r\n\r\n // elements that can receive focus\r\n focusableElements: ':input:enabled:visible',\r\n\r\n // suppresses the use of overlay styles on FF/Linux (due to performance issues with opacity)\r\n // no longer needed in 2012\r\n // applyPlatformOpacityRules: true,\r\n\r\n // callback method invoked when fadeIn has completed and blocking message is visible\r\n onBlock: null,\r\n\r\n // callback method invoked when unblocking has completed; the callback is\r\n // passed the element that has been unblocked (which is the window object for page\r\n // blocks) and the options that were passed to the unblock call:\r\n //\tonUnblock(element, options)\r\n onUnblock: null,\r\n\r\n // callback method invoked when the overlay area is clicked.\r\n // setting this will turn the cursor to a pointer, otherwise cursor defined in overlayCss will be used.\r\n onOverlayClick: null,\r\n\r\n // don't ask; if you really must know: http://groups.google.com/group/jquery-en/browse_thread/thread/36640a8730503595/2f6a79a77a78e493#2f6a79a77a78e493\r\n quirksmodeOffsetHack: 4,\r\n\r\n // class name of the message block\r\n blockMsgClass: 'blockMsg',\r\n\r\n // if it is already blocked, then ignore it (don't unblock and reblock)\r\n ignoreIfBlocked: false\r\n };\r\n\r\n // private data and functions follow...\r\n\r\n var pageBlock = null;\r\n var pageBlockEls = [];\r\n\r\n function install(el, opts) {\r\n var css, themedCSS;\r\n var full = (el == window);\r\n var msg = (opts && opts.message !== undefined ? opts.message : undefined);\r\n opts = $.extend({}, $.blockUI.defaults, opts || {});\r\n\r\n if (opts.ignoreIfBlocked && $(el).data('blockUI.isBlocked'))\r\n return;\r\n\r\n opts.overlayCSS = $.extend({}, $.blockUI.defaults.overlayCSS, opts.overlayCSS || {});\r\n css = $.extend({}, $.blockUI.defaults.css, opts.css || {});\r\n if (opts.onOverlayClick)\r\n opts.overlayCSS.cursor = 'pointer';\r\n\r\n themedCSS = $.extend({}, $.blockUI.defaults.themedCSS, opts.themedCSS || {});\r\n msg = msg === undefined ? opts.message : msg;\r\n\r\n // remove the current block (if there is one)\r\n if (full && pageBlock)\r\n remove(window, {fadeOut:0});\r\n\r\n // if an existing element is being used as the blocking content then we capture\r\n // its current place in the DOM (and current display style) so we can restore\r\n // it when we unblock\r\n if (msg && typeof msg != 'string' && (msg.parentNode || msg.jquery)) {\r\n var node = msg.jquery ? msg[0] : msg;\r\n var data = {};\r\n $(el).data('blockUI.history', data);\r\n data.el = node;\r\n data.parent = node.parentNode;\r\n data.display = node.style.display;\r\n data.position = node.style.position;\r\n if (data.parent)\r\n data.parent.removeChild(node);\r\n }\r\n\r\n $(el).data('blockUI.onUnblock', opts.onUnblock);\r\n var z = opts.baseZ;\r\n\r\n // blockUI uses 3 layers for blocking, for simplicity they are all used on every platform;\r\n // layer1 is the iframe layer which is used to supress bleed through of underlying content\r\n // layer2 is the overlay layer which has opacity and a wait cursor (by default)\r\n // layer3 is the message content that is displayed while blocking\r\n var lyr1, lyr2, lyr3, s;\r\n if (msie || opts.forceIframe)\r\n lyr1 = $('');\r\n else\r\n lyr1 = $('
');\r\n\r\n if (opts.theme)\r\n lyr2 = $('
');\r\n else\r\n lyr2 = $('
');\r\n\r\n if (opts.theme && full) {\r\n s = '';\r\n }\r\n else if (opts.theme) {\r\n s = '';\r\n }\r\n else if (full) {\r\n s = '';\r\n }\r\n else {\r\n s = '';\r\n }\r\n lyr3 = $(s);\r\n\r\n // if we have a message, style it\r\n if (msg) {\r\n if (opts.theme) {\r\n lyr3.css(themedCSS);\r\n lyr3.addClass('ui-widget-content');\r\n }\r\n else\r\n lyr3.css(css);\r\n }\r\n\r\n // style the overlay\r\n if (!opts.theme /*&& (!opts.applyPlatformOpacityRules)*/)\r\n lyr2.css(opts.overlayCSS);\r\n lyr2.css('position', full ? 'fixed' : 'absolute');\r\n\r\n // make iframe layer transparent in IE\r\n if (msie || opts.forceIframe)\r\n lyr1.css('opacity',0.0);\r\n\r\n //$([lyr1[0],lyr2[0],lyr3[0]]).appendTo(full ? 'body' : el);\r\n var layers = [lyr1,lyr2,lyr3], $par = full ? $('body') : $(el);\r\n $.each(layers, function() {\r\n this.appendTo($par);\r\n });\r\n\r\n if (opts.theme && opts.draggable && $.fn.draggable) {\r\n lyr3.draggable({\r\n handle: '.ui-dialog-titlebar',\r\n cancel: 'li'\r\n });\r\n }\r\n\r\n // ie7 must use absolute positioning in quirks mode and to account for activex issues (when scrolling)\r\n var expr = setExpr && (!$.support.boxModel || $('object,embed', full ? null : el).length > 0);\r\n if (ie6 || expr) {\r\n // give body 100% height\r\n if (full && opts.allowBodyStretch && $.support.boxModel)\r\n $('html,body').css('height','100%');\r\n\r\n // fix ie6 issue when blocked element has a border width\r\n if ((ie6 || !$.support.boxModel) && !full) {\r\n var t = sz(el,'borderTopWidth'), l = sz(el,'borderLeftWidth');\r\n var fixT = t ? '(0 - '+t+')' : 0;\r\n var fixL = l ? '(0 - '+l+')' : 0;\r\n }\r\n\r\n // simulate fixed position\r\n $.each(layers, function(i,o) {\r\n var s = o[0].style;\r\n s.position = 'absolute';\r\n if (i < 2) {\r\n if (full)\r\n s.setExpression('height','Math.max(document.body.scrollHeight, document.body.offsetHeight) - (jQuery.support.boxModel?0:'+opts.quirksmodeOffsetHack+') + \"px\"');\r\n else\r\n s.setExpression('height','this.parentNode.offsetHeight + \"px\"');\r\n if (full)\r\n s.setExpression('width','jQuery.support.boxModel && document.documentElement.clientWidth || document.body.clientWidth + \"px\"');\r\n else\r\n s.setExpression('width','this.parentNode.offsetWidth + \"px\"');\r\n if (fixL) s.setExpression('left', fixL);\r\n if (fixT) s.setExpression('top', fixT);\r\n }\r\n else if (opts.centerY) {\r\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\"');\r\n s.marginTop = 0;\r\n }\r\n else if (!opts.centerY && full) {\r\n var top = (opts.css && opts.css.top) ? parseInt(opts.css.top, 10) : 0;\r\n var expression = '((document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + '+top+') + \"px\"';\r\n s.setExpression('top',expression);\r\n }\r\n });\r\n }\r\n\r\n // show the message\r\n if (msg) {\r\n if (opts.theme)\r\n lyr3.find('.ui-widget-content').append(msg);\r\n else\r\n lyr3.append(msg);\r\n if (msg.jquery || msg.nodeType)\r\n $(msg).show();\r\n }\r\n\r\n if ((msie || opts.forceIframe) && opts.showOverlay)\r\n lyr1.show(); // opacity is zero\r\n if (opts.fadeIn) {\r\n var cb = opts.onBlock ? opts.onBlock : noOp;\r\n var cb1 = (opts.showOverlay && !msg) ? cb : noOp;\r\n var cb2 = msg ? cb : noOp;\r\n if (opts.showOverlay)\r\n lyr2._fadeIn(opts.fadeIn, cb1);\r\n if (msg)\r\n lyr3._fadeIn(opts.fadeIn, cb2);\r\n }\r\n else {\r\n if (opts.showOverlay)\r\n lyr2.show();\r\n if (msg)\r\n lyr3.show();\r\n if (opts.onBlock)\r\n opts.onBlock.bind(lyr3)();\r\n }\r\n\r\n // bind key and mouse events\r\n bind(1, el, opts);\r\n\r\n if (full) {\r\n pageBlock = lyr3[0];\r\n pageBlockEls = $(opts.focusableElements,pageBlock);\r\n if (opts.focusInput)\r\n setTimeout(focus, 20);\r\n }\r\n else\r\n center(lyr3[0], opts.centerX, opts.centerY);\r\n\r\n if (opts.timeout) {\r\n // auto-unblock\r\n var to = setTimeout(function() {\r\n if (full)\r\n $.unblockUI(opts);\r\n else\r\n $(el).unblock(opts);\r\n }, opts.timeout);\r\n $(el).data('blockUI.timeout', to);\r\n }\r\n }\r\n\r\n // remove the block\r\n function remove(el, opts) {\r\n var count;\r\n var full = (el == window);\r\n var $el = $(el);\r\n var data = $el.data('blockUI.history');\r\n var to = $el.data('blockUI.timeout');\r\n if (to) {\r\n clearTimeout(to);\r\n $el.removeData('blockUI.timeout');\r\n }\r\n opts = $.extend({}, $.blockUI.defaults, opts || {});\r\n bind(0, el, opts); // unbind events\r\n\r\n if (opts.onUnblock === null) {\r\n opts.onUnblock = $el.data('blockUI.onUnblock');\r\n $el.removeData('blockUI.onUnblock');\r\n }\r\n\r\n var els;\r\n if (full) // crazy selector to handle odd field errors in ie6/7\r\n els = $('body').children().filter('.blockUI').add('body > .blockUI');\r\n else\r\n els = $el.find('>.blockUI');\r\n\r\n // fix cursor issue\r\n if ( opts.cursorReset ) {\r\n if ( els.length > 1 )\r\n els[1].style.cursor = opts.cursorReset;\r\n if ( els.length > 2 )\r\n els[2].style.cursor = opts.cursorReset;\r\n }\r\n\r\n if (full)\r\n pageBlock = pageBlockEls = null;\r\n\r\n if (opts.fadeOut) {\r\n count = els.length;\r\n els.stop().fadeOut(opts.fadeOut, function() {\r\n if ( --count === 0)\r\n reset(els,data,opts,el);\r\n });\r\n }\r\n else\r\n reset(els, data, opts, el);\r\n }\r\n\r\n // move blocking element back into the DOM where it started\r\n function reset(els,data,opts,el) {\r\n var $el = $(el);\r\n if ( $el.data('blockUI.isBlocked') )\r\n return;\r\n\r\n els.each(function(i,o) {\r\n // remove via DOM calls so we don't lose event handlers\r\n if (this.parentNode)\r\n this.parentNode.removeChild(this);\r\n });\r\n\r\n if (data && data.el) {\r\n data.el.style.display = data.display;\r\n data.el.style.position = data.position;\r\n data.el.style.cursor = 'default'; // #59\r\n if (data.parent)\r\n data.parent.appendChild(data.el);\r\n $el.removeData('blockUI.history');\r\n }\r\n\r\n if ($el.data('blockUI.static')) {\r\n $el.css('position', 'static'); // #22\r\n }\r\n\r\n if (typeof opts.onUnblock == 'function')\r\n opts.onUnblock(el,opts);\r\n\r\n // fix issue in Safari 6 where block artifacts remain until reflow\r\n var body = $(document.body), w = body.width(), cssW = body[0].style.width;\r\n body.width(w-1).width(w);\r\n body[0].style.width = cssW;\r\n }\r\n\r\n // bind/unbind the handler\r\n function bind(b, el, opts) {\r\n var full = el == window, $el = $(el);\r\n\r\n // don't bother unbinding if there is nothing to unbind\r\n if (!b && (full && !pageBlock || !full && !$el.data('blockUI.isBlocked')))\r\n return;\r\n\r\n $el.data('blockUI.isBlocked', b);\r\n\r\n // don't bind events when overlay is not in use or if bindEvents is false\r\n if (!full || !opts.bindEvents || (b && !opts.showOverlay))\r\n return;\r\n\r\n // bind anchors and inputs for mouse and key events\r\n var events = 'mousedown mouseup keydown keypress keyup touchstart touchend touchmove';\r\n if (b)\r\n $(document).bind(events, opts, handler);\r\n else\r\n $(document).unbind(events, handler);\r\n\r\n // former impl...\r\n //\t\tvar $e = $('a,:input');\r\n //\t\tb ? $e.bind(events, opts, handler) : $e.unbind(events, handler);\r\n }\r\n\r\n // event handler to suppress keyboard/mouse events when blocking\r\n function handler(e) {\r\n // allow tab navigation (conditionally)\r\n if (e.type === 'keydown' && e.keyCode && e.keyCode == 9) {\r\n if (pageBlock && e.data.constrainTabKey) {\r\n var els = pageBlockEls;\r\n var fwd = !e.shiftKey && e.target === els[els.length-1];\r\n var back = e.shiftKey && e.target === els[0];\r\n if (fwd || back) {\r\n setTimeout(function(){focus(back);},10);\r\n return false;\r\n }\r\n }\r\n }\r\n var opts = e.data;\r\n var target = $(e.target);\r\n if (target.hasClass('blockOverlay') && opts.onOverlayClick)\r\n opts.onOverlayClick(e);\r\n\r\n // allow events within the message content\r\n if (target.parents('div.' + opts.blockMsgClass).length > 0)\r\n return true;\r\n\r\n // allow events for content that is not being blocked\r\n return target.parents().children().filter('div.blockUI').length === 0;\r\n }\r\n\r\n function focus(back) {\r\n if (!pageBlockEls)\r\n return;\r\n var e = pageBlockEls[back===true ? pageBlockEls.length-1 : 0];\r\n if (e)\r\n e.focus();\r\n }\r\n\r\n function center(el, x, y) {\r\n var p = el.parentNode, s = el.style;\r\n var l = ((p.offsetWidth - el.offsetWidth)/2) - sz(p,'borderLeftWidth');\r\n var t = ((p.offsetHeight - el.offsetHeight)/2) - sz(p,'borderTopWidth');\r\n if (x) s.left = l > 0 ? (l+'px') : '0';\r\n if (y) s.top = t > 0 ? (t+'px') : '0';\r\n }\r\n\r\n function sz(el, p) {\r\n return parseInt($.css(el,p),10)||0;\r\n }\r\n\r\n }\r\n\r\n\r\n /*global define:true */\r\n if (typeof define === 'function' && define.amd && define.amd.jQuery) {\r\n define(['jquery'], setup);\r\n } else {\r\n setup(jQuery);\r\n }\r\n\r\n})();","/*!\r\n * jQuery Cookie Plugin v1.4.1\r\n * https://github.com/carhartl/jquery-cookie\r\n *\r\n * Copyright 2006, 2014 Klaus Hartl\r\n * Released under the MIT license\r\n */\r\n(function (factory) {\r\n if (typeof define === 'function' && define.amd) {\r\n // AMD (Register as an anonymous module)\r\n define(['jquery'], factory);\r\n } else if (typeof exports === 'object') {\r\n // Node/CommonJS\r\n module.exports = factory(require('jquery'));\r\n } else {\r\n // Browser globals\r\n factory(jQuery);\r\n }\r\n}(function ($) {\r\n\r\n var pluses = /\\+/g;\r\n\r\n function encode(s) {\r\n return config.raw ? s : encodeURIComponent(s);\r\n }\r\n\r\n function decode(s) {\r\n return config.raw ? s : decodeURIComponent(s);\r\n }\r\n\r\n function stringifyCookieValue(value) {\r\n return encode(config.json ? JSON.stringify(value) : String(value));\r\n }\r\n\r\n function parseCookieValue(s) {\r\n if (s.indexOf('\"') === 0) {\r\n // This is a quoted cookie as according to RFC2068, unescape...\r\n s = s.slice(1, -1).replace(/\\\\\"/g, '\"').replace(/\\\\\\\\/g, '\\\\');\r\n }\r\n\r\n try {\r\n // Replace server-side written pluses with spaces.\r\n // If we can't decode the cookie, ignore it, it's unusable.\r\n // If we can't parse the cookie, ignore it, it's unusable.\r\n s = decodeURIComponent(s.replace(pluses, ' '));\r\n return config.json ? JSON.parse(s) : s;\r\n } catch(e) {}\r\n }\r\n\r\n function read(s, converter) {\r\n var value = config.raw ? s : parseCookieValue(s);\r\n return $.isFunction(converter) ? converter(value) : value;\r\n }\r\n\r\n var config = $.cookie = function (key, value, options) {\r\n\r\n // Write\r\n\r\n if (arguments.length > 1 && !$.isFunction(value)) {\r\n options = $.extend({}, config.defaults, options);\r\n\r\n if (typeof options.expires === 'number') {\r\n var days = options.expires, t = options.expires = new Date();\r\n t.setMilliseconds(t.getMilliseconds() + days * 864e+5);\r\n }\r\n\r\n return (document.cookie = [\r\n encode(key), '=', stringifyCookieValue(value),\r\n options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE\r\n options.path ? '; path=' + options.path : '',\r\n options.domain ? '; domain=' + options.domain : '',\r\n options.secure ? '; secure' : ''\r\n ].join(''));\r\n }\r\n\r\n // Read\r\n\r\n var result = key ? undefined : {},\r\n // To prevent the for loop in the first place assign an empty array\r\n // in case there are no cookies at all. Also prevents odd result when\r\n // calling $.cookie().\r\n cookies = document.cookie ? document.cookie.split('; ') : [],\r\n i = 0,\r\n l = cookies.length;\r\n\r\n for (; i < l; i++) {\r\n var parts = cookies[i].split('='),\r\n name = decode(parts.shift()),\r\n cookie = parts.join('=');\r\n\r\n if (key === name) {\r\n // If second argument (value) is a function it's a converter...\r\n result = read(cookie, value);\r\n break;\r\n }\r\n\r\n // Prevent storing a cookie that we couldn't decode.\r\n if (!key && (cookie = read(cookie)) !== undefined) {\r\n result[name] = cookie;\r\n }\r\n }\r\n\r\n return result;\r\n };\r\n\r\n config.defaults = {};\r\n\r\n $.removeCookie = function (key, options) {\r\n // Must not alter options, thus extending a fresh object...\r\n $.cookie(key, '', $.extend({}, options, { expires: -1 }));\r\n return !$.cookie(key);\r\n };\r\n\r\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 * \"<\" represents the < sign.\n * \">\" represents the > sign.\n * \"&\" represents the & sign.\n * \"" 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 string & \"escape\"')\n * //\"HTML <span>string</span> & "escape"\"\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 \"<\";\n case \">\":\n return \">\";\n case \"&\":\n return \"&\";\n case \"\\\"\":\n return \""\";\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 <span>string</span> & "escape"')\n * //\"HTML string & \"escape\"\"\n * ```\n */\n function unescapeHtml(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 \"<\";\n case \">\":\n return \">\";\n case \"&\":\n return \"&\";\n case \""\":\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 // \n var CSS_INTEGER = \"[-\\\\+]?\\\\d+%?\";\n\n // \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 '&': '&', '<': '<', '>': '>', '\"': '"', \"'\": ''', '/': '/'\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 * '
' +\n * '
' +\n * '
' +\n * ' {{{body}}}' +\n * '
' +\n * '
';\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: \"

Loading..

\",\n * onStateChanged: function () {\n *\n * }\n * });\n *\n * my_mask.open({\n * target: $(\"#mask-target\").get(0), // dom Element\n * content: \"

Loading..

\",\n * onStateChanged: function () {\n *\n * }\n * });\n *\n *\n * var customMask = function customMask() {\n * var cTmpl = '' +\n * '
' +\n * '
' +\n * '
' +\n * ' {{{body}}}' +\n * '
' +\n * '
';\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: \"

Loading..

\",\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
\\n
\\n
\\n
\\n {{{body}}}\\n
\\n
\\n
\\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('
');\n self.resizer = jQuery('
');\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('
');\n self.resizer = jQuery('
');\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: '',\n * header: {\n * title: \"MODAL TITLE\",\n * btns: {\n * minimize: {\n * label: '', onClick: function () {\n * modal.minimize();\n * }\n * },\n * maximize: {\n * label: '', onClick: function () {\n * modal.maximize();\n * }\n * },\n * close: {\n * label: '', 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
\\n {{#header}}\\n
\\n {{{title}}}\\n {{#btns}}\\n
\\n {{#@each}}\\n \\n {{/@each}}\\n
\\n {{/btns}}\\n
\\n {{/header}}\\n
\\n {{#iframe}}\\n
\\n
{{{iframeLoadingMsg}}}
\\n \\n
\\n
\\n \\n {{#param}}\\n {{#@each}}\\n \\n {{/@each}}\\n {{/param}}\\n
\\n {{/iframe}}\\n {{^iframe}}\\n
\\n {{/iframe}}\\n
\\n {{^disableResize}}\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n {{/disableResize}}\\n
\\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})();","/*\r\n * Toastr\r\n * Copyright 2012-2015\r\n * Authors: John Papa, Hans Fjällemark, and Tim Ferrell.\r\n * All Rights Reserved.\r\n * Use, reproduction, distribution, and modification of this code is subject to the terms and\r\n * conditions of the MIT license, available at http://www.opensource.org/licenses/mit-license.php\r\n *\r\n * ARIA Support: Greta Krafsig\r\n *\r\n * Project: https://github.com/CodeSeven/toastr\r\n */\r\n/* global define */\r\n; (function (define) {\r\n define(['jquery'], function ($) {\r\n return (function () {\r\n var $container;\r\n var listener;\r\n var toastId = 0;\r\n var toastType = {\r\n error: 'error',\r\n info: 'info',\r\n success: 'success',\r\n warning: 'warning'\r\n };\r\n\r\n var toastr = {\r\n clear: clear,\r\n remove: remove,\r\n error: error,\r\n getContainer: getContainer,\r\n info: info,\r\n options: {},\r\n subscribe: subscribe,\r\n success: success,\r\n version: '2.1.2',\r\n warning: warning\r\n };\r\n\r\n var previousToast;\r\n\r\n return toastr;\r\n\r\n ////////////////\r\n\r\n function error(message, title, optionsOverride) {\r\n return notify({\r\n type: toastType.error,\r\n iconClass: getOptions().iconClasses.error,\r\n message: message,\r\n optionsOverride: optionsOverride,\r\n title: title\r\n });\r\n }\r\n\r\n function getContainer(options, create) {\r\n if (!options) { options = getOptions(); }\r\n $container = $('#' + options.containerId);\r\n if ($container.length) {\r\n return $container;\r\n }\r\n if (create) {\r\n $container = createContainer(options);\r\n }\r\n return $container;\r\n }\r\n\r\n function info(message, title, optionsOverride) {\r\n return notify({\r\n type: toastType.info,\r\n iconClass: getOptions().iconClasses.info,\r\n message: message,\r\n optionsOverride: optionsOverride,\r\n title: title\r\n });\r\n }\r\n\r\n function subscribe(callback) {\r\n listener = callback;\r\n }\r\n\r\n function success(message, title, optionsOverride) {\r\n return notify({\r\n type: toastType.success,\r\n iconClass: getOptions().iconClasses.success,\r\n message: message,\r\n optionsOverride: optionsOverride,\r\n title: title\r\n });\r\n }\r\n\r\n function warning(message, title, optionsOverride) {\r\n return notify({\r\n type: toastType.warning,\r\n iconClass: getOptions().iconClasses.warning,\r\n message: message,\r\n optionsOverride: optionsOverride,\r\n title: title\r\n });\r\n }\r\n\r\n function clear($toastElement, clearOptions) {\r\n var options = getOptions();\r\n if (!$container) { getContainer(options); }\r\n if (!clearToast($toastElement, options, clearOptions)) {\r\n clearContainer(options);\r\n }\r\n }\r\n\r\n function remove($toastElement) {\r\n var options = getOptions();\r\n if (!$container) { getContainer(options); }\r\n if ($toastElement && $(':focus', $toastElement).length === 0) {\r\n removeToast($toastElement);\r\n return;\r\n }\r\n if ($container.children().length) {\r\n $container.remove();\r\n }\r\n }\r\n\r\n // internal functions\r\n\r\n function clearContainer (options) {\r\n var toastsToClear = $container.children();\r\n for (var i = toastsToClear.length - 1; i >= 0; i--) {\r\n clearToast($(toastsToClear[i]), options);\r\n }\r\n }\r\n\r\n function clearToast ($toastElement, options, clearOptions) {\r\n var force = clearOptions && clearOptions.force ? clearOptions.force : false;\r\n if ($toastElement && (force || $(':focus', $toastElement).length === 0)) {\r\n $toastElement[options.hideMethod]({\r\n duration: options.hideDuration,\r\n easing: options.hideEasing,\r\n complete: function () { removeToast($toastElement); }\r\n });\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n function createContainer(options) {\r\n $container = $('
')\r\n .attr('id', options.containerId)\r\n .addClass(options.positionClass)\r\n .attr('aria-live', 'polite')\r\n .attr('role', 'alert');\r\n\r\n $container.appendTo($(options.target));\r\n return $container;\r\n }\r\n\r\n function getDefaults() {\r\n return {\r\n tapToDismiss: true,\r\n toastClass: 'toast',\r\n containerId: 'toast-container',\r\n debug: false,\r\n\r\n showMethod: 'fadeIn', //fadeIn, slideDown, and show are built into jQuery\r\n showDuration: 300,\r\n showEasing: 'swing', //swing and linear are built into jQuery\r\n onShown: undefined,\r\n hideMethod: 'fadeOut',\r\n hideDuration: 1000,\r\n hideEasing: 'swing',\r\n onHidden: undefined,\r\n closeMethod: false,\r\n closeDuration: false,\r\n closeEasing: false,\r\n\r\n extendedTimeOut: 1000,\r\n iconClasses: {\r\n error: 'toast-error',\r\n info: 'toast-info',\r\n success: 'toast-success',\r\n warning: 'toast-warning'\r\n },\r\n iconClass: 'toast-info',\r\n positionClass: 'toast-top-right',\r\n timeOut: 5000, // Set timeOut and extendedTimeOut to 0 to make it sticky\r\n titleClass: 'toast-title',\r\n messageClass: 'toast-message',\r\n escapeHtml: false,\r\n target: 'body',\r\n closeHtml: '',\r\n newestOnTop: true,\r\n preventDuplicates: false,\r\n progressBar: false\r\n };\r\n }\r\n\r\n function publish(args) {\r\n if (!listener) { return; }\r\n listener(args);\r\n }\r\n\r\n function notify(map) {\r\n var options = getOptions();\r\n var iconClass = map.iconClass || options.iconClass;\r\n\r\n if (typeof (map.optionsOverride) !== 'undefined') {\r\n options = $.extend(options, map.optionsOverride);\r\n iconClass = map.optionsOverride.iconClass || iconClass;\r\n }\r\n\r\n if (shouldExit(options, map)) { return; }\r\n\r\n toastId++;\r\n\r\n $container = getContainer(options, true);\r\n\r\n var intervalId = null;\r\n var $toastElement = $('
');\r\n var $titleElement = $('
');\r\n var $messageElement = $('
');\r\n var $progressElement = $('
');\r\n var $closeElement = $(options.closeHtml);\r\n var progressBar = {\r\n intervalId: null,\r\n hideEta: null,\r\n maxHideTime: null\r\n };\r\n var response = {\r\n toastId: toastId,\r\n state: 'visible',\r\n startTime: new Date(),\r\n options: options,\r\n map: map\r\n };\r\n\r\n personalizeToast();\r\n\r\n displayToast();\r\n\r\n handleEvents();\r\n\r\n publish(response);\r\n\r\n if (options.debug && console) {\r\n console.log(response);\r\n }\r\n\r\n return $toastElement;\r\n\r\n function escapeHtml(source) {\r\n if (source == null)\r\n source = \"\";\r\n\r\n return new String(source)\r\n .replace(/&/g, '&')\r\n .replace(/\"/g, '"')\r\n .replace(/'/g, ''')\r\n .replace(//g, '>');\r\n }\r\n\r\n function personalizeToast() {\r\n setIcon();\r\n setTitle();\r\n setMessage();\r\n setCloseButton();\r\n setProgressBar();\r\n setSequence();\r\n }\r\n\r\n function handleEvents() {\r\n $toastElement.hover(stickAround, delayedHideToast);\r\n if (!options.onclick && options.tapToDismiss) {\r\n $toastElement.click(hideToast);\r\n }\r\n\r\n if (options.closeButton && $closeElement) {\r\n $closeElement.click(function (event) {\r\n if (event.stopPropagation) {\r\n event.stopPropagation();\r\n } else if (event.cancelBubble !== undefined && event.cancelBubble !== true) {\r\n event.cancelBubble = true;\r\n }\r\n hideToast(true);\r\n });\r\n }\r\n\r\n if (options.onclick) {\r\n $toastElement.click(function (event) {\r\n options.onclick(event);\r\n hideToast();\r\n });\r\n }\r\n }\r\n\r\n function displayToast() {\r\n $toastElement.hide();\r\n\r\n $toastElement[options.showMethod](\r\n {duration: options.showDuration, easing: options.showEasing, complete: options.onShown}\r\n );\r\n\r\n if (options.timeOut > 0) {\r\n intervalId = setTimeout(hideToast, options.timeOut);\r\n progressBar.maxHideTime = parseFloat(options.timeOut);\r\n progressBar.hideEta = new Date().getTime() + progressBar.maxHideTime;\r\n if (options.progressBar) {\r\n progressBar.intervalId = setInterval(updateProgress, 10);\r\n }\r\n }\r\n }\r\n\r\n function setIcon() {\r\n if (map.iconClass) {\r\n $toastElement.addClass(options.toastClass).addClass(iconClass);\r\n }\r\n }\r\n\r\n function setSequence() {\r\n if (options.newestOnTop) {\r\n $container.prepend($toastElement);\r\n } else {\r\n $container.append($toastElement);\r\n }\r\n }\r\n\r\n function setTitle() {\r\n if (map.title) {\r\n $titleElement.append(!options.escapeHtml ? map.title : escapeHtml(map.title)).addClass(options.titleClass);\r\n $toastElement.append($titleElement);\r\n }\r\n }\r\n\r\n function setMessage() {\r\n if (map.message) {\r\n $messageElement.append(!options.escapeHtml ? map.message : escapeHtml(map.message)).addClass(options.messageClass);\r\n $toastElement.append($messageElement);\r\n }\r\n }\r\n\r\n function setCloseButton() {\r\n if (options.closeButton) {\r\n $closeElement.addClass('toast-close-button').attr('role', 'button');\r\n $toastElement.prepend($closeElement);\r\n }\r\n }\r\n\r\n function setProgressBar() {\r\n if (options.progressBar) {\r\n $progressElement.addClass('toast-progress');\r\n $toastElement.prepend($progressElement);\r\n }\r\n }\r\n\r\n function shouldExit(options, map) {\r\n if (options.preventDuplicates) {\r\n if (map.message === previousToast) {\r\n return true;\r\n } else {\r\n previousToast = map.message;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n function hideToast(override) {\r\n var method = override && options.closeMethod !== false ? options.closeMethod : options.hideMethod;\r\n var duration = override && options.closeDuration !== false ?\r\n options.closeDuration : options.hideDuration;\r\n var easing = override && options.closeEasing !== false ? options.closeEasing : options.hideEasing;\r\n if ($(':focus', $toastElement).length && !override) {\r\n return;\r\n }\r\n clearTimeout(progressBar.intervalId);\r\n return $toastElement[method]({\r\n duration: duration,\r\n easing: easing,\r\n complete: function () {\r\n removeToast($toastElement);\r\n if (options.onHidden && response.state !== 'hidden') {\r\n options.onHidden();\r\n }\r\n response.state = 'hidden';\r\n response.endTime = new Date();\r\n publish(response);\r\n }\r\n });\r\n }\r\n\r\n function delayedHideToast() {\r\n if (options.timeOut > 0 || options.extendedTimeOut > 0) {\r\n intervalId = setTimeout(hideToast, options.extendedTimeOut);\r\n progressBar.maxHideTime = parseFloat(options.extendedTimeOut);\r\n progressBar.hideEta = new Date().getTime() + progressBar.maxHideTime;\r\n }\r\n }\r\n\r\n function stickAround() {\r\n clearTimeout(intervalId);\r\n progressBar.hideEta = 0;\r\n $toastElement.stop(true, true)[options.showMethod](\r\n {duration: options.showDuration, easing: options.showEasing}\r\n );\r\n }\r\n\r\n function updateProgress() {\r\n var percentage = ((progressBar.hideEta - (new Date().getTime())) / progressBar.maxHideTime) * 100;\r\n $progressElement.width(percentage + '%');\r\n }\r\n }\r\n\r\n function getOptions() {\r\n return $.extend({}, getDefaults(), toastr.options);\r\n }\r\n\r\n function removeToast($toastElement) {\r\n if (!$container) { $container = getContainer(); }\r\n if ($toastElement.is(':visible')) {\r\n return;\r\n }\r\n $toastElement.remove();\r\n $toastElement = null;\r\n if ($container.children().length === 0) {\r\n $container.remove();\r\n previousToast = undefined;\r\n }\r\n }\r\n\r\n })();\r\n });\r\n}(typeof define === 'function' && define.amd ? define : function (deps, factory) {\r\n if (typeof module !== 'undefined' && module.exports) { //Node\r\n module.exports = factory(require('jquery'));\r\n } else {\r\n window.toastr = factory(window.jQuery);\r\n }\r\n}));\r\n","/*!\r\n\tautosize 4.0.2\r\n\tlicense: MIT\r\n\thttp://www.jacklmoore.com/autosize\r\n*/\r\n(function (global, factory) {\r\n if (typeof define === \"function\" && define.amd) {\r\n define(['module', 'exports'], factory);\r\n } else if (typeof exports !== \"undefined\") {\r\n factory(module, exports);\r\n } else {\r\n var mod = {\r\n exports: {}\r\n };\r\n factory(mod, mod.exports);\r\n global.autosize = mod.exports;\r\n }\r\n})(this, function (module, exports) {\r\n 'use strict';\r\n\r\n var map = typeof Map === \"function\" ? new Map() : function () {\r\n var keys = [];\r\n var values = [];\r\n\r\n return {\r\n has: function has(key) {\r\n return keys.indexOf(key) > -1;\r\n },\r\n get: function get(key) {\r\n return values[keys.indexOf(key)];\r\n },\r\n set: function set(key, value) {\r\n if (keys.indexOf(key) === -1) {\r\n keys.push(key);\r\n values.push(value);\r\n }\r\n },\r\n delete: function _delete(key) {\r\n var index = keys.indexOf(key);\r\n if (index > -1) {\r\n keys.splice(index, 1);\r\n values.splice(index, 1);\r\n }\r\n }\r\n };\r\n }();\r\n\r\n var createEvent = function createEvent(name) {\r\n return new Event(name, { bubbles: true });\r\n };\r\n try {\r\n new Event('test');\r\n } catch (e) {\r\n // IE does not support `new Event()`\r\n createEvent = function createEvent(name) {\r\n var evt = document.createEvent('Event');\r\n evt.initEvent(name, true, false);\r\n return evt;\r\n };\r\n }\r\n\r\n function assign(ta) {\r\n if (!ta || !ta.nodeName || ta.nodeName !== 'TEXTAREA' || map.has(ta)) return;\r\n\r\n var heightOffset = null;\r\n var clientWidth = null;\r\n var cachedHeight = null;\r\n\r\n function init() {\r\n var style = window.getComputedStyle(ta, null);\r\n\r\n if (style.resize === 'vertical') {\r\n ta.style.resize = 'none';\r\n } else if (style.resize === 'both') {\r\n ta.style.resize = 'horizontal';\r\n }\r\n\r\n if (style.boxSizing === 'content-box') {\r\n heightOffset = -(parseFloat(style.paddingTop) + parseFloat(style.paddingBottom));\r\n } else {\r\n heightOffset = parseFloat(style.borderTopWidth) + parseFloat(style.borderBottomWidth);\r\n }\r\n // Fix when a textarea is not on document body and heightOffset is Not a Number\r\n if (isNaN(heightOffset)) {\r\n heightOffset = 0;\r\n }\r\n\r\n update();\r\n }\r\n\r\n function changeOverflow(value) {\r\n {\r\n // Chrome/Safari-specific fix:\r\n // When the textarea y-overflow is hidden, Chrome/Safari do not reflow the text to account for the space\r\n // made available by removing the scrollbar. The following forces the necessary text reflow.\r\n var width = ta.style.width;\r\n ta.style.width = '0px';\r\n // Force reflow:\r\n /* jshint ignore:start */\r\n ta.offsetWidth;\r\n /* jshint ignore:end */\r\n ta.style.width = width;\r\n }\r\n\r\n ta.style.overflowY = value;\r\n }\r\n\r\n function getParentOverflows(el) {\r\n var arr = [];\r\n\r\n while (el && el.parentNode && el.parentNode instanceof Element) {\r\n if (el.parentNode.scrollTop) {\r\n arr.push({\r\n node: el.parentNode,\r\n scrollTop: el.parentNode.scrollTop\r\n });\r\n }\r\n el = el.parentNode;\r\n }\r\n\r\n return arr;\r\n }\r\n\r\n function resize() {\r\n if (ta.scrollHeight === 0) {\r\n // If the scrollHeight is 0, then the element probably has display:none or is detached from the DOM.\r\n return;\r\n }\r\n\r\n var overflows = getParentOverflows(ta);\r\n var docTop = document.documentElement && document.documentElement.scrollTop; // Needed for Mobile IE (ticket #240)\r\n\r\n ta.style.height = '';\r\n ta.style.height = ta.scrollHeight + heightOffset + 'px';\r\n\r\n // used to check if an update is actually necessary on window.resize\r\n clientWidth = ta.clientWidth;\r\n\r\n // prevents scroll-position jumping\r\n overflows.forEach(function (el) {\r\n el.node.scrollTop = el.scrollTop;\r\n });\r\n\r\n if (docTop) {\r\n document.documentElement.scrollTop = docTop;\r\n }\r\n }\r\n\r\n function update() {\r\n resize();\r\n\r\n var styleHeight = Math.round(parseFloat(ta.style.height));\r\n var computed = window.getComputedStyle(ta, null);\r\n\r\n // Using offsetHeight as a replacement for computed.height in IE, because IE does not account use of border-box\r\n var actualHeight = computed.boxSizing === 'content-box' ? Math.round(parseFloat(computed.height)) : ta.offsetHeight;\r\n\r\n // The actual height not matching the style height (set via the resize method) indicates that\r\n // the max-height has been exceeded, in which case the overflow should be allowed.\r\n if (actualHeight < styleHeight) {\r\n if (computed.overflowY === 'hidden') {\r\n changeOverflow('scroll');\r\n resize();\r\n actualHeight = computed.boxSizing === 'content-box' ? Math.round(parseFloat(window.getComputedStyle(ta, null).height)) : ta.offsetHeight;\r\n }\r\n } else {\r\n // Normally keep overflow set to hidden, to avoid flash of scrollbar as the textarea expands.\r\n if (computed.overflowY !== 'hidden') {\r\n changeOverflow('hidden');\r\n resize();\r\n actualHeight = computed.boxSizing === 'content-box' ? Math.round(parseFloat(window.getComputedStyle(ta, null).height)) : ta.offsetHeight;\r\n }\r\n }\r\n\r\n if (cachedHeight !== actualHeight) {\r\n cachedHeight = actualHeight;\r\n var evt = createEvent('autosize:resized');\r\n try {\r\n ta.dispatchEvent(evt);\r\n } catch (err) {\r\n // Firefox will throw an error on dispatchEvent for a detached element\r\n // https://bugzilla.mozilla.org/show_bug.cgi?id=889376\r\n }\r\n }\r\n }\r\n\r\n var pageResize = function pageResize() {\r\n if (ta.clientWidth !== clientWidth) {\r\n update();\r\n }\r\n };\r\n\r\n var destroy = function (style) {\r\n window.removeEventListener('resize', pageResize, false);\r\n ta.removeEventListener('input', update, false);\r\n ta.removeEventListener('keyup', update, false);\r\n ta.removeEventListener('autosize:destroy', destroy, false);\r\n ta.removeEventListener('autosize:update', update, false);\r\n\r\n Object.keys(style).forEach(function (key) {\r\n ta.style[key] = style[key];\r\n });\r\n\r\n map.delete(ta);\r\n }.bind(ta, {\r\n height: ta.style.height,\r\n resize: ta.style.resize,\r\n overflowY: ta.style.overflowY,\r\n overflowX: ta.style.overflowX,\r\n wordWrap: ta.style.wordWrap\r\n });\r\n\r\n ta.addEventListener('autosize:destroy', destroy, false);\r\n\r\n // IE9 does not fire onpropertychange or oninput for deletions,\r\n // so binding to onkeyup to catch most of those events.\r\n // There is no way that I know of to detect something like 'cut' in IE9.\r\n if ('onpropertychange' in ta && 'oninput' in ta) {\r\n ta.addEventListener('keyup', update, false);\r\n }\r\n\r\n window.addEventListener('resize', pageResize, false);\r\n ta.addEventListener('input', update, false);\r\n ta.addEventListener('autosize:update', update, false);\r\n ta.style.overflowX = 'hidden';\r\n ta.style.wordWrap = 'break-word';\r\n\r\n map.set(ta, {\r\n destroy: destroy,\r\n update: update\r\n });\r\n\r\n init();\r\n }\r\n\r\n function destroy(ta) {\r\n var methods = map.get(ta);\r\n if (methods) {\r\n methods.destroy();\r\n }\r\n }\r\n\r\n function update(ta) {\r\n var methods = map.get(ta);\r\n if (methods) {\r\n methods.update();\r\n }\r\n }\r\n\r\n var autosize = null;\r\n\r\n // Do nothing in Node.js environment and IE8 (or lower)\r\n if (typeof window === 'undefined' || typeof window.getComputedStyle !== 'function') {\r\n autosize = function autosize(el) {\r\n return el;\r\n };\r\n autosize.destroy = function (el) {\r\n return el;\r\n };\r\n autosize.update = function (el) {\r\n return el;\r\n };\r\n } else {\r\n autosize = function autosize(el, options) {\r\n if (el) {\r\n Array.prototype.forEach.call(el.length ? el : [el], function (x) {\r\n return assign(x, options);\r\n });\r\n }\r\n return el;\r\n };\r\n autosize.destroy = function (el) {\r\n if (el) {\r\n Array.prototype.forEach.call(el.length ? el : [el], destroy);\r\n }\r\n return el;\r\n };\r\n autosize.update = function (el) {\r\n if (el) {\r\n Array.prototype.forEach.call(el.length ? el : [el], update);\r\n }\r\n return el;\r\n };\r\n }\r\n\r\n exports.default = autosize;\r\n module.exports = exports['default'];\r\n});","/***********************************************************************************\r\n * IE 8 이하 브라우져 console.log 에러처리\r\n ***********************************************************************************/\r\nif(!window.console || !window.console.log) {window.console = {log : function(){}};}\r\n\r\nvar APP = {};\r\n\r\n/**\r\n * 언어셋 변경\r\n * @param lang\r\n * @constructor\r\n */\r\nAPP.SET_LANG = function(lang)\r\n{\r\n $.cookie('site_lang', lang, {expires:30, path:'/'});\r\n location.reload();\r\n};\r\n\r\n/**\r\n * 팝업창 닫기버튼 init\r\n */\r\n$('[data-toggle=\"btn-popup-close\"]').click(function(e){\r\n var type = $(this).data('type');\r\n var idx = $(this).data('idx');\r\n var cookie = $(this).data('cookie');\r\n\r\n if( type == 'Y')\r\n {\r\n window.close();\r\n }\r\n else if( type == 'N' )\r\n {\r\n $(\"#popup-\" + idx ).remove();\r\n }\r\n\r\n if( cookie == 1 )\r\n {\r\n $.cookie('popup_'+idx, 1, {expires:1, path:'/'});\r\n }\r\n});\r\n\r\n/**\r\n * SNS 공유\r\n */\r\n$(\"a[data-toggle='sns-share']\").not('[data-service=\"link\"]').click(function(e){\r\n e.preventDefault();\r\n\r\n var _this = $(this);\r\n var sns_type = _this.data('service');\r\n var href = _this.data('url');\r\n var title = _this.data('title');\r\n var loc = \"\";\r\n var img = $(\"meta[name='og:image']\").attr('content');\r\n\r\n if( ! sns_type || !href || !title) return;\r\n\r\n if( sns_type == 'facebook' ) {\r\n loc = '//www.facebook.com/sharer/sharer.php?u='+encodeURIComponent(href);\r\n }\r\n else if ( sns_type == 'twitter' ) {\r\n loc = '//twitter.com/home?status='+encodeURIComponent(title)+' '+href;\r\n }\r\n else if ( sns_type == 'google' ) {\r\n loc = '//plus.google.com/share?url='+href;\r\n }\r\n else if ( sns_type == 'pinterest' ) {\r\n\r\n loc = '//www.pinterest.com/pin/create/button/?url='+href+'&media='+img+'&description='+encodeURIComponent(title);\r\n }\r\n else if ( sns_type == 'kakaostory') {\r\n loc = 'https://story.kakao.com/share?url='+encodeURIComponent(href);\r\n }\r\n else if ( sns_type == 'band' ) {\r\n loc = 'http://www.band.us/plugin/share?body='+encodeURIComponent(title)+'%0A'+encodeURIComponent(href);\r\n }\r\n else if ( sns_type == 'naver' ) {\r\n loc = \"http://share.naver.com/web/shareView.nhn?url=\"+encodeURIComponent(href)+\"&title=\"+encodeURIComponent(title);\r\n }\r\n else if ( sns_type == 'line') {\r\n loc = \"http://line.me/R/msg/text/?\" + encodeURIComponent(title + \"\\n\" + href);\r\n }\r\n else {\r\n return false;\r\n }\r\n APP.POPUP({ url : loc});\r\n return false;\r\n});\r\n\r\n$(function(){\r\n var clipboard = new ClipboardJS('a[data-toggle=\"sns-share\"][data-service=\"link\"]', {\r\n text: function(trigger) {\r\n return trigger.getAttribute('data-url');\r\n }\r\n });\r\n clipboard.on('success', function(){\r\n alert('현재 URL이 복사되었습니다.');\r\n });\r\n});","/************************************************************************************************************************\r\n * 해당 문자열의 regex 검사\r\n * @param regexType\r\n *************************************************************************************************************************/\r\nString.prototype.regex = function(regexType) {\r\n var phoneRegex = /^(01[016789]{1}|02|0[3-9]{1}[0-9]{1})([0-9]{3,4})([0-9]{4})$/,\r\n phoneWithHypenRegex = /^(01[016789]{1}|02|0[3-9]{1}[0-9]{1})-?([0-9]{3,4})-?([0-9]{4})$/,\r\n telRegex = /(^02.{0}|^01.{1}|[0-9]{3})([0-9]{3,4})([0-9]{4})/,\r\n telCheckRegex = /^\\d{2,3}-\\d{3,4}-\\d{4}$/,\r\n uniqueID = /^[a-z][a-z0-9_]{2,19}$/g,\r\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,}))$/,\r\n str = this;\r\n\r\n switch(regexType) {\r\n case \"phone\" :\r\n var transNum = str.replace(/\\s/gi, '').replace(/-/gi,'');\r\n if(transNum.length == 11 || transNum.length == 10) {\r\n if( phoneRegex.test(transNum) ) {\r\n transNum = transNum.replace(phoneWithHypenRegex, '$1-$2-$3');\r\n return transNum;\r\n }\r\n }\r\n return false;\r\n case \"tel\":\r\n var transNum = str.replace(/\\s/gi, '').replace(/-/gi,'');\r\n transNum = transNum.replace(telRegex, '$1-$2-$3');\r\n if(telCheckRegex.test(transNum)) {\r\n return transNum;\r\n }\r\n return false;\r\n case \"email\":\r\n return emailRegex.test(str);\r\n case \"biznum\" :\r\n var checkID = new Array(1, 3, 7, 1, 3, 7, 1, 3, 5, 1),\r\n tmpBizID, i, chkSum=0, c2, remander,\r\n bizID = str.replace(/-/gi,'');\r\n\r\n for (i=0; i<=7; i++) chkSum += checkID[i] * bizID.charAt(i);\r\n c2 = \"0\" + (checkID[8] * bizID.charAt(8));\r\n c2 = c2.substring(c2.length - 2, c2.length);\r\n chkSum += Math.floor(c2.charAt(0)) + Math.floor(c2.charAt(1));\r\n remander = (10 - (chkSum % 10)) % 10 ;\r\n\r\n if (Math.floor(bizID.charAt(9)) == remander) return bizID.replace(/(\\d{3})(\\d{2})(\\d{5})/, '$1-$2-$3');\r\n return false;\r\n case \"uniqid\" :\r\n return uniqueID.test(str);\r\n }\r\n};","/**********************************************************************************************************************\r\n * 숫자에 컴마를 붙여서 리턴한다\r\n * @returns {*}\r\n *********************************************************************************************************************/\r\nNumber.prototype.numberFormat = function(){\r\n if(this==0) return 0;\r\n\r\n var reg = /(^[+-]?\\d+)(\\d{3})/;\r\n var n = (this + '');\r\n\r\n while (reg.test(n)) n = n.replace(reg, '$1' + ',' + '$2');\r\n\r\n return n;\r\n};\r\nString.prototype.numberFormat = function() { return isNaN( parseFloat(this) ) ? \"0\" : (parseFloat(this)).numberFormat(); };\r\n\r\n/**********************************************************************************************************************\r\n * 컴마가 붙어있는 숫자에서 콤마를 삭제하고 숫자로 반환한다.\r\n * @returns {*}\r\n *********************************************************************************************************************/\r\nString.prototype.unNumberFormat = function() {\r\n var str = this;\r\n if(typeof str == 'number') return str;\r\n str = (\"\" + str).replace(/,/gi,''); // 콤마 제거\r\n str = str.replace(/(^\\s*)|(\\s*$)/g, \"\"); // trim\r\n\r\n var returnStr = new Number(str);\r\n return isNaN(returnStr) ? str : returnStr;\r\n};\r\nNumber.prototype.unNumberFormat = function() {\r\n return this;\r\n};\r\n\r\n/**********************************************************************************************************************\r\n * 날짜를 원하는 포맷 형식으로 출력\r\n * @param f\r\n * @returns {*}\r\n *********************************************************************************************************************/\r\nDate.prototype.dateFormat = function(f) {\r\n if (!this.valueOf()) return \" \";\r\n if (!f) return this;\r\n\r\n var weekName = [\"일요일\", \"월요일\", \"화요일\", \"수요일\", \"목요일\", \"금요일\", \"토요일\"],\r\n shortWeekName = [\"일\", \"월\", \"화\", \"수\", \"목\", \"금\", \"토\"],\r\n d = this;\r\n\r\n return f.replace(/(yyyy|yy|MM|dd|E|hh|mm|ss|a\\/p)/gi, function($1) {\r\n switch ($1) {\r\n case \"yyyy\": return d.getFullYear();\r\n case \"yy\": return (d.getFullYear() % 1000).zf(2);\r\n case \"MM\": return (d.getMonth() + 1).zf(2);\r\n case \"dd\": return d.getDate().zf(2);\r\n case \"E\": return weekName[d.getDay()];\r\n case \"e\": return shortWeekName[d.getDay()];\r\n case \"HH\": return d.getHours().zf(2);\r\n case \"hh\": return ((h = d.getHours() % 12) ? h : 12).zf(2);\r\n case \"mm\": return d.getMinutes().zf(2);\r\n case \"ss\": return d.getSeconds().zf(2);\r\n case \"a/p\": return d.getHours() < 12 ? \"오전\" : \"오후\";\r\n default: return $1;\r\n }\r\n });\r\n};\r\nString.prototype.string = function(len){var s = '', i = 0; while (i++ < len) { s += this; } return s;};\r\nString.prototype.zf = function(len){return \"0\".string(len - this.length) + this;};\r\nNumber.prototype.zf = function(len){return this.toString().zf(len);};\r\nString.prototype.dateFormat = function(f) {\r\n var d = new Date(this);\r\n return ( d == 'Invalid Date') ? '' : d.dateFormat(f);\r\n}\r\n\r\n/**********************************************************************************************************************\r\n * 숫자를 한글명으로 바꿔서 보여줍니다.\r\n *********************************************************************************************************************/\r\nNumber.prototype.toKorean = function() {\r\n var hanA = new Array(\"\",\"일\",\"이\",\"삼\",\"사\",\"오\",\"육\",\"칠\",\"팔\",\"구\",\"십\"),\r\n danA = new Array(\"\",\"십\",\"백\",\"천\",\"\",\"십\",\"백\",\"천\",\"\",\"십\",\"백\",\"천\",\"\",\"십\",\"백\",\"천\"),\r\n num = new String(this),\r\n result = '';\r\n\r\n for(var i=0; i 0 )\r\n {\r\n $form_post.on('submit', function(){\r\n $.blockUI({\r\n css: {width:'25px',top:'49%',left:'49%',border:'0px none',backgroundColor:'transparent',cursor:'wait'},\r\n message : '\"로딩중\"',\r\n baseZ : 10000,\r\n overlayCSS : {opacity : 0}\r\n });\r\n });\r\n }\r\n});\r\n","/***********************************************************************************\r\n * AJAX Error 및 BlockUI 처리\r\n ***********************************************************************************/\r\n$(function() {\r\n $(document).ajaxError(function(event, request, settings){\r\n var message = '알수없는 오류가 발생하였습니다.';\r\n if( typeof request.responseJSON != 'undefined' && typeof request.responseJSON.message != 'undefined' ) {\r\n message = request.responseJSON.message;\r\n }\r\n else {\r\n if( request.status == 500 ) message = '서버 코드 오류가 발생하였습니다.\\n관리자에게 문의하세요';\r\n else if ( request.status == 401 ) message = '해당 명령을 실행할 권한이 없습니다.';\r\n }\r\n toastr.error(message, '오류 발생');\r\n }).ajaxStart(function(){\r\n $.blockUI({\r\n css: {width:'25px',top:'49%',left:'49%',border:'0px none',backgroundColor:'transparent',cursor:'wait'},\r\n message : '\"로딩중\"',\r\n baseZ : 10000,\r\n overlayCSS : {opacity : 0}\r\n });\r\n }).ajaxComplete(function(){\r\n $.unblockUI();\r\n });\r\n});\r\n\r\n/***********************************************************************************************************************\r\n * 전체체크박스 / 체크박스 연동\r\n ***********************************************************************************************************************/\r\n$(function() {\r\n $(document).on('change', '[data-checkbox]', function() {\r\n var $check = $(this);\r\n var is_all = $check.data('checkbox-all') != null ? true : false;\r\n var name = $check.data('checkbox');\r\n var checked = $check.prop('checked');\r\n var $allCheck = is_all ? $check : $('[data-checkbox=\"'+name+'\"][data-checkbox-all]');\r\n\r\n if( is_all ) {\r\n $('[data-checkbox=\"'+name+'\"]').prop('checked', checked );\r\n }\r\n else {\r\n $allCheck.prop('checked', $('[data-checkbox=\"'+name+'\"]').not('[data-checkbox-all]').length == $('[data-checkbox=\"'+name+'\"]:checked').not('[data-checkbox-all]').length);\r\n }\r\n });\r\n});\r\n\r\n/***********************************************************************************************************************\r\n * 숫자 3자리마다 Comma 자동 입력\r\n ***********************************************************************************************************************/\r\n$(function() {\r\n $(document).on('keypress', '[data-number-format]', function(e) {\r\n $(this).val( $(this).val().trim().unNumberFormat().numberFormat() );\r\n })\r\n});\r\n\r\n/***********************************************************************************************************************\r\n * 숫자만 입력가능한 Input\r\n ***********************************************************************************************************************/\r\n$(function() {\r\n $(document).on('keypress', '[data-number-only]', function(e) {\r\n if (e.which != 8 && e.which != 0 && e.which != 45 && (e.which < 48 || e.which > 57)) {\r\n e.preventDefault();\r\n }\r\n })\r\n});\r\n\r\n/***********************************************************************************************************************\r\n * 높이 자동조절되는 Textarea\r\n ***********************************************************************************************************************/\r\n$(function() {\r\n $(document).on('keyup','textarea[data-autosize]', function(e) {\r\n autosize($(this));\r\n });\r\n});","/* ========================================================================\r\n * Bootstrap: dropdown.js v3.3.7\r\n * http://getbootstrap.com/javascript/#dropdowns\r\n * ========================================================================\r\n * Copyright 2011-2016 Twitter, Inc.\r\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\r\n * ======================================================================== */\r\n+function ($) {\r\n 'use strict';\r\n\r\n // DROPDOWN CLASS DEFINITION\r\n // =========================\r\n\r\n var backdrop = '.dropdown-backdrop'\r\n var toggle = '[data-toggle=\"dropdown\"]'\r\n var Dropdown = function (element) {\r\n $(element).on('click.bs.dropdown', this.toggle)\r\n }\r\n\r\n Dropdown.VERSION = '3.3.7'\r\n\r\n function getParent($this) {\r\n var selector = $this.attr('data-target')\r\n\r\n if (!selector) {\r\n selector = $this.attr('href')\r\n selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\r\n }\r\n\r\n var $parent = selector && $(selector)\r\n\r\n return $parent && $parent.length ? $parent : $this.parent()\r\n }\r\n\r\n function clearMenus(e) {\r\n if (e && e.which === 3) return\r\n $(backdrop).remove()\r\n $(toggle).each(function () {\r\n var $this = $(this)\r\n var $parent = getParent($this)\r\n var relatedTarget = { relatedTarget: this }\r\n\r\n if (!$parent.hasClass('open')) return\r\n\r\n if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return\r\n\r\n $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))\r\n\r\n if (e.isDefaultPrevented()) return\r\n\r\n $this.attr('aria-expanded', 'false')\r\n $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget))\r\n })\r\n }\r\n\r\n Dropdown.prototype.toggle = function (e) {\r\n var $this = $(this)\r\n\r\n if ($this.is('.disabled, :disabled')) return\r\n\r\n var $parent = getParent($this)\r\n var isActive = $parent.hasClass('open')\r\n\r\n clearMenus()\r\n\r\n if (!isActive) {\r\n if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {\r\n // if mobile we use a backdrop because click events don't delegate\r\n $(document.createElement('div'))\r\n .addClass('dropdown-backdrop')\r\n .insertAfter($(this))\r\n .on('click', clearMenus)\r\n }\r\n\r\n var relatedTarget = { relatedTarget: this }\r\n $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))\r\n\r\n if (e.isDefaultPrevented()) return\r\n\r\n $this\r\n .trigger('focus')\r\n .attr('aria-expanded', 'true')\r\n\r\n $parent\r\n .toggleClass('open')\r\n .trigger($.Event('shown.bs.dropdown', relatedTarget))\r\n }\r\n\r\n return false\r\n }\r\n\r\n Dropdown.prototype.keydown = function (e) {\r\n if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return\r\n\r\n var $this = $(this)\r\n\r\n e.preventDefault()\r\n e.stopPropagation()\r\n\r\n if ($this.is('.disabled, :disabled')) return\r\n\r\n var $parent = getParent($this)\r\n var isActive = $parent.hasClass('open')\r\n\r\n if (!isActive && e.which != 27 || isActive && e.which == 27) {\r\n if (e.which == 27) $parent.find(toggle).trigger('focus')\r\n return $this.trigger('click')\r\n }\r\n\r\n var desc = ' li:not(.disabled):visible a'\r\n var $items = $parent.find('.dropdown-menu' + desc)\r\n\r\n if (!$items.length) return\r\n\r\n var index = $items.index(e.target)\r\n\r\n if (e.which == 38 && index > 0) index-- // up\r\n if (e.which == 40 && index < $items.length - 1) index++ // down\r\n if (!~index) index = 0\r\n\r\n $items.eq(index).trigger('focus')\r\n }\r\n\r\n\r\n // DROPDOWN PLUGIN DEFINITION\r\n // ==========================\r\n\r\n function Plugin(option) {\r\n return this.each(function () {\r\n var $this = $(this)\r\n var data = $this.data('bs.dropdown')\r\n\r\n if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))\r\n if (typeof option == 'string') data[option].call($this)\r\n })\r\n }\r\n\r\n var old = $.fn.dropdown\r\n\r\n $.fn.dropdown = Plugin\r\n $.fn.dropdown.Constructor = Dropdown\r\n\r\n\r\n // DROPDOWN NO CONFLICT\r\n // ====================\r\n\r\n $.fn.dropdown.noConflict = function () {\r\n $.fn.dropdown = old\r\n return this\r\n }\r\n\r\n\r\n // APPLY TO STANDARD DROPDOWN ELEMENTS\r\n // ===================================\r\n\r\n $(document)\r\n .on('click.bs.dropdown.data-api', clearMenus)\r\n .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })\r\n .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)\r\n .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)\r\n .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown)\r\n\r\n}(jQuery);","APP.MODAL = function() {\r\n var modalCallback = {};\r\n\r\n var defaultCss = {\r\n width: 400,\r\n height: 400,\r\n position: {\r\n left: \"center\",\r\n top: \"middle\"\r\n }\r\n };\r\n\r\n var defaultOption = $.extend(true, {}, defaultCss, {\r\n iframeLoadingMsg: \"\",\r\n iframe: {\r\n method: \"get\",\r\n url: \"#\"\r\n },\r\n closeToEsc: true,\r\n onStateChanged: function onStateChanged() {\r\n // mask\r\n if (this.state === \"open\") {\r\n APP.MASK.open();\r\n } else if (this.state === \"close\") {\r\n APP.MASK.close();\r\n }\r\n },\r\n animateTime: 100,\r\n zIndex: 1001,\r\n absolute: true,\r\n fullScreen: false,\r\n header: {\r\n title: \"새로운 윈도우\",\r\n btns: {\r\n close: {\r\n label: '', onClick: function onClick() {\r\n APP.MODAL.callback();\r\n }\r\n }\r\n }\r\n }\r\n });\r\n\r\n var open = function(modalConfig) {\r\n\r\n modalConfig = $.extend(true, {}, defaultOption, modalConfig);\r\n $(document.body).addClass(\"modalOpened\");\r\n\r\n this.modalCallback = modalConfig.callback;\r\n this.modalSendData = modalConfig.sendData;\r\n\r\n APP.modal.open(modalConfig);\r\n };\r\n\r\n var css = function css(modalCss) {\r\n modalCss = $.extend(true, {}, defaultCss, modalCss);\r\n APP.modal.css(modalCss);\r\n };\r\n var align = function align(modalAlign) {\r\n APP.modal.align(modalAlign);\r\n };\r\n var close = function close(data) {\r\n APP.modal.close();\r\n setTimeout(function () {\r\n $(document.body).removeClass(\"modalOpened\");\r\n }, 500);\r\n };\r\n var minimize = function minimize() {\r\n APP.modal.minimize();\r\n };\r\n var maximize = function maximize() {\r\n APP.modal.maximize();\r\n };\r\n var callback = function callback(data) {\r\n if (this.modalCallback) {\r\n this.modalCallback(data);\r\n }\r\n this.close(data);\r\n };\r\n var getData = function getData() {\r\n if (this.modalSendData) {\r\n return this.modalSendData();\r\n }\r\n };\r\n\r\n return {\r\n \"open\": open,\r\n \"css\": css,\r\n \"align\": align,\r\n \"close\": close,\r\n \"minimize\": minimize,\r\n \"maximize\": maximize,\r\n \"callback\": callback,\r\n \"modalCallback\": modalCallback,\r\n \"getData\": getData\r\n };\r\n}();\r\nAPP.MODAL2 = function() {\r\n var modalCallback = {};\r\n\r\n var defaultCss = {\r\n width: 400,\r\n height: 400,\r\n position: {\r\n left: \"center\",\r\n top: \"middle\"\r\n }\r\n };\r\n\r\n var defaultOption = $.extend(true, {}, defaultCss, {\r\n iframeLoadingMsg: \"\",\r\n iframe: {\r\n method: \"get\",\r\n url: \"#\"\r\n },\r\n closeToEsc: true,\r\n onStateChanged: function onStateChanged() {\r\n // mask\r\n if (this.state === \"open\") {\r\n APP.MASK2.open();\r\n } else if (this.state === \"close\") {\r\n APP.MASK2.close();\r\n }\r\n },\r\n animateTime: 100,\r\n zIndex: 2001,\r\n absolute: true,\r\n fullScreen: false,\r\n header: {\r\n title: \"새로운 윈도우\",\r\n btns: {\r\n close: {\r\n label: '', onClick: function onClick() {\r\n APP.MODAL2.callback();\r\n }\r\n }\r\n }\r\n }\r\n });\r\n\r\n var open = function(modalConfig) {\r\n\r\n modalConfig = $.extend(true, {}, defaultOption, modalConfig);\r\n $(document.body).addClass(\"modalOpened\");\r\n\r\n this.modalCallback = modalConfig.callback;\r\n this.modalSendData = modalConfig.sendData;\r\n\r\n APP.modal2.open(modalConfig);\r\n };\r\n\r\n var css = function css(modalCss) {\r\n modalCss = $.extend(true, {}, defaultCss, modalCss);\r\n APP.modal2.css(modalCss);\r\n };\r\n var align = function align(modalAlign) {\r\n APP.modal2.align(modalAlign);\r\n };\r\n var close = function close(data) {\r\n APP.modal2.close();\r\n setTimeout(function () {\r\n $(document.body).removeClass(\"modalOpened\");\r\n }, 500);\r\n };\r\n var minimize = function minimize() {\r\n APP.modal2.minimize();\r\n };\r\n var maximize = function maximize() {\r\n APP.modal2.maximize();\r\n };\r\n var callback = function callback(data) {\r\n if (this.modalCallback) {\r\n this.modalCallback(data);\r\n }\r\n this.close(data);\r\n };\r\n var getData = function getData() {\r\n if (this.modalSendData) {\r\n return this.modalSendData();\r\n }\r\n };\r\n\r\n return {\r\n \"open\": open,\r\n \"css\": css,\r\n \"align\": align,\r\n \"close\": close,\r\n \"minimize\": minimize,\r\n \"maximize\": maximize,\r\n \"callback\": callback,\r\n \"modalCallback\": modalCallback,\r\n \"getData\": getData\r\n };\r\n}();",""],"file":"mobile.min.js"}