{"version":3,"sources":["webpack:///javascripts/user-common-js/header.js","webpack:///webpack/bootstrap 0d338e71b17bdae06fd8?2129**********************************","webpack:///./es6/user-common-js/header.js","webpack:///./es6/user-common-js/ui/legacy/inquiry.js","webpack:///./~/intro.js/intro.js","webpack:///./source/javascripts/ace/ace-extra.js"],"names":["modules","__webpack_require__","moduleId","installedModules","exports","module","id","loaded","call","m","c","p","0","859","873","openInquiryWindow","url","window","open","1023","root","factory","this","IntroJs","obj","_targetElement","_introItems","_options","nextLabel","prevLabel","skipLabel","doneLabel","hidePrev","hideNext","tooltipPosition","tooltipClass","highlightClass","exitOnEsc","exitOnOverlayClick","showStepNumbers","keyboardNavigation","showButtons","showBullets","showProgress","scrollToElement","overlayOpacity","scrollPadding","positionPrecedence","disableInteraction","hintPosition","hintButtonLabel","hintAnimation","_introForElement","targetElm","introItems","self","steps","i","stepsLength","length","currentItem","_cloneObject","step","element","document","querySelector","floatingElementQuery","createElement","className","body","appendChild","position","push","allIntroSteps","querySelectorAll","elmsLength","currentElement","style","display","parseInt","getAttribute","intro","nextStep","tempIntroItems","z","sort","a","b","_addOverlayLayer","_nextStep","_onKeyDown","e","keyCode","undefined","_introExitCallback","_exitIntro","_previousStep","target","srcElement","indexOf","_currentStep","_introCompleteCallback","preventDefault","returnValue","_onResize","_setHelperLayerPosition","addEventListener","attachEvent","object","temp","key","jQuery","_goToStep","_direction","_introBeforeChangeCallback","_showElement","targetElement","overlayLayer","opacity","setTimeout","parentNode","removeChild","helperLayer","referenceLayer","disableInteractionLayer","floatingElement","showElement","replace","fixParents","removeEventListener","detachEvent","_placeTooltip","tooltipLayer","arrowLayer","helperNumberLayer","hintMode","currentStepObj","tooltipOffset","targetOffset","windowSize","currentTooltipPosition","tooltipCssClass","top","right","bottom","left","marginLeft","marginTop","_determineAutoPosition","_getOffset","_getWinSize","tooltipLayerStyleLeft","_checkRight","height","width","tooltipLayerStyleRight","_checkLeft","tooltipLayerStyleLeftRight","desiredTooltipPosition","possiblePositions","slice","tooltipHeight","tooltipWidth","calculatedPosition","_removeEntry","stringArray","stringToRemove","splice","elementPosition","widthHeightPadding","_isFixed","setAttribute","_disableInteraction","_setAnchorAsButton","anchor","tabIndex","_introChangeCallback","oldHelperLayer","oldReferenceLayer","oldHelperNumberLayer","oldtooltipLayer","oldArrowLayer","oldtooltipContainer","skipTooltipButton","prevTooltipButton","nextTooltipButton","lastIntroItem","oldShowElement","_lastShowElementTimer","clearTimeout","innerHTML","_getProgress","focus","tooltipTextLayer","bulletsLayer","progressLayer","buttonsLayer","ulContainer","innerLi","anchorLink","onclick","goToStep","progressBar","removeAttribute","currentElementPosition","_getPropValue","parentElm","tagName","toLowerCase","zIndex","parseFloat","transform","test","_elementInViewport","rect","getBoundingClientRect","winHeight","clientHeight","scrollBy","_introAfterChangeCallback","propName","propValue","currentStyle","defaultView","getComputedStyle","getPropertyValue","nodeName","innerWidth","innerHeight","D","documentElement","clientWidth","el","styleText","toString","_removeHintTooltip","tooltip","_populateHints","hints","l","hint","_addHints","bind","_reAlignHints","item","_alignHintPosition","_hideHint","stepId","_hintCloseCallback","_hideHints","oldHintsWrapper","hintsWrapper","evt","event","stopPropagation","cancelBubble","_hintClick","hintDot","hintPulse","_hintsAddedCallback","offset","hintElement","_hintClickCallback","removedStep","tooltipWrapper","closeButton","offsetWidth","offsetHeight","_x","_y","isNaN","offsetLeft","offsetTop","offsetParent","currentStep","_mergeOptions","obj1","obj2","obj3","attrname","VERSION","introJs","Error","version","fn","prototype","clone","setOption","option","value","setOptions","options","start","previousStep","exit","refresh","onbeforechange","providedCallback","onchange","onafterchange","oncomplete","onhintsadded","onhintclick","onhintclose","onexit","addHints","hideHint","hideHints","1116","ace","config","storage_method","cookie_expiry","cookie_path","vars","settings","saveState","attrName","attrVal","append","getElementById","hasAttribute","hasClass","attrList","data","get","JSON","parse","newVal","hasCustomVal","$delete","re1","re2","hasOwnProperty","set","stringify","loadState","setAttr","attr","val","addClass","removeClass","name","clearState","remove","animationSupport","animation","animationstring","keyframeprefix","domPrefixes","split","pfx","elm","animationName","animationCSS","animationNode","head","domInsertEvent","documentReady","list","readyState","data_storage","method","prefix","storage","type","cookie","namespace","path","is_obj","tmp","sizeof","decodeURIComponent","substring","expires","domain","secure","d","Date","toGMTString","setTime","getTime","encodeURIComponent","getItem","setItem","removeItem","size","elem","parts","currentClass","replaceClass","newClass","classToRemove","RegExp","match","p1","p2","toggleClass","isHTMlElement","HTMLElement","nodeType"],"mappings":"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","file":"javascripts/user-common-js/header.js","sourcesContent":["/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"/static/\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 0:\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports = __webpack_require__(859);\n\n\n/***/ },\n\n/***/ 859:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\t__webpack_require__(1023);\n\t\n\t__webpack_require__(1116);\n\t\n\t__webpack_require__(873);\n\n/***/ },\n\n/***/ 873:\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tfunction openInquiryWindow(url) {\n\t window.open(url, 'inquiry', 'width=980, height=800, menubar=no, toolbar=no, scrollbars=yes');\n\t}\n\twindow.openInquiryWindow = openInquiryWindow;\n\n/***/ },\n\n/***/ 1023:\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * Intro.js v2.3.0\n\t * https://github.com/usablica/intro.js\n\t *\n\t * Copyright (C) 2016 Afshin Mehrabani (@afshinmeh)\n\t */\n\t\n\t(function (root, factory) {\n\t if (true) {\n\t // CommonJS\n\t factory(exports);\n\t } else if (typeof define === 'function' && define.amd) {\n\t // AMD. Register as an anonymous module.\n\t define(['exports'], factory);\n\t } else {\n\t // Browser globals\n\t factory(root);\n\t }\n\t} (this, function (exports) {\n\t //Default config/variables\n\t var VERSION = '2.3.0';\n\t\n\t /**\n\t * IntroJs main class\n\t *\n\t * @class IntroJs\n\t */\n\t function IntroJs(obj) {\n\t this._targetElement = obj;\n\t this._introItems = [];\n\t\n\t this._options = {\n\t /* Next button label in tooltip box */\n\t nextLabel: 'Next →',\n\t /* Previous button label in tooltip box */\n\t prevLabel: '← Back',\n\t /* Skip button label in tooltip box */\n\t skipLabel: 'Skip',\n\t /* Done button label in tooltip box */\n\t doneLabel: 'Done',\n\t /* Hide previous button in the first step? Otherwise, it will be disabled button. */\n\t hidePrev: false,\n\t /* Hide next button in the last step? Otherwise, it will be disabled button. */\n\t hideNext: false,\n\t /* Default tooltip box position */\n\t tooltipPosition: 'bottom',\n\t /* Next CSS class for tooltip boxes */\n\t tooltipClass: '',\n\t /* CSS class that is added to the helperLayer */\n\t highlightClass: '',\n\t /* Close introduction when pressing Escape button? */\n\t exitOnEsc: true,\n\t /* Close introduction when clicking on overlay layer? */\n\t exitOnOverlayClick: true,\n\t /* Show step numbers in introduction? */\n\t showStepNumbers: true,\n\t /* Let user use keyboard to navigate the tour? */\n\t keyboardNavigation: true,\n\t /* Show tour control buttons? */\n\t showButtons: true,\n\t /* Show tour bullets? */\n\t showBullets: true,\n\t /* Show tour progress? */\n\t showProgress: false,\n\t /* Scroll to highlighted element? */\n\t scrollToElement: true,\n\t /* Set the overlay opacity */\n\t overlayOpacity: 0.8,\n\t /* Padding to add after scrolling when element is not in the viewport (in pixels) */\n\t scrollPadding: 30,\n\t /* Precedence of positions, when auto is enabled */\n\t positionPrecedence: [\"bottom\", \"top\", \"right\", \"left\"],\n\t /* Disable an interaction with element? */\n\t disableInteraction: false,\n\t /* Default hint position */\n\t hintPosition: 'top-middle',\n\t /* Hint button label */\n\t hintButtonLabel: 'Got it',\n\t /* Adding animation to hints? */\n\t hintAnimation: true\n\t };\n\t }\n\t\n\t /**\n\t * Initiate a new introduction/guide from an element in the page\n\t *\n\t * @api private\n\t * @method _introForElement\n\t * @param {Object} targetElm\n\t * @returns {Boolean} Success or not?\n\t */\n\t function _introForElement(targetElm) {\n\t var introItems = [],\n\t self = this;\n\t\n\t if (this._options.steps) {\n\t //use steps passed programmatically\n\t for (var i = 0, stepsLength = this._options.steps.length; i < stepsLength; i++) {\n\t var currentItem = _cloneObject(this._options.steps[i]);\n\t //set the step\n\t currentItem.step = introItems.length + 1;\n\t //use querySelector function only when developer used CSS selector\n\t if (typeof(currentItem.element) === 'string') {\n\t //grab the element with given selector from the page\n\t currentItem.element = document.querySelector(currentItem.element);\n\t }\n\t\n\t //intro without element\n\t if (typeof(currentItem.element) === 'undefined' || currentItem.element == null) {\n\t var floatingElementQuery = document.querySelector(\".introjsFloatingElement\");\n\t\n\t if (floatingElementQuery == null) {\n\t floatingElementQuery = document.createElement('div');\n\t floatingElementQuery.className = 'introjsFloatingElement';\n\t\n\t document.body.appendChild(floatingElementQuery);\n\t }\n\t\n\t currentItem.element = floatingElementQuery;\n\t currentItem.position = 'floating';\n\t }\n\t\n\t if (currentItem.element != null) {\n\t introItems.push(currentItem);\n\t }\n\t }\n\t\n\t } else {\n\t //use steps from data-* annotations\n\t var allIntroSteps = targetElm.querySelectorAll('*[data-intro]');\n\t //if there's no element to intro\n\t if (allIntroSteps.length < 1) {\n\t return false;\n\t }\n\t\n\t //first add intro items with data-step\n\t for (var i = 0, elmsLength = allIntroSteps.length; i < elmsLength; i++) {\n\t var currentElement = allIntroSteps[i];\n\t\n\t // skip hidden elements\n\t if (currentElement.style.display == 'none') {\n\t continue;\n\t }\n\t\n\t var step = parseInt(currentElement.getAttribute('data-step'), 10);\n\t\n\t if (step > 0) {\n\t introItems[step - 1] = {\n\t element: currentElement,\n\t intro: currentElement.getAttribute('data-intro'),\n\t step: parseInt(currentElement.getAttribute('data-step'), 10),\n\t tooltipClass: currentElement.getAttribute('data-tooltipClass'),\n\t highlightClass: currentElement.getAttribute('data-highlightClass'),\n\t position: currentElement.getAttribute('data-position') || this._options.tooltipPosition\n\t };\n\t }\n\t }\n\t\n\t //next add intro items without data-step\n\t //todo: we need a cleanup here, two loops are redundant\n\t var nextStep = 0;\n\t for (var i = 0, elmsLength = allIntroSteps.length; i < elmsLength; i++) {\n\t var currentElement = allIntroSteps[i];\n\t\n\t if (currentElement.getAttribute('data-step') == null) {\n\t\n\t while (true) {\n\t if (typeof introItems[nextStep] == 'undefined') {\n\t break;\n\t } else {\n\t nextStep++;\n\t }\n\t }\n\t\n\t introItems[nextStep] = {\n\t element: currentElement,\n\t intro: currentElement.getAttribute('data-intro'),\n\t step: nextStep + 1,\n\t tooltipClass: currentElement.getAttribute('data-tooltipClass'),\n\t highlightClass: currentElement.getAttribute('data-highlightClass'),\n\t position: currentElement.getAttribute('data-position') || this._options.tooltipPosition\n\t };\n\t }\n\t }\n\t }\n\t\n\t //removing undefined/null elements\n\t var tempIntroItems = [];\n\t for (var z = 0; z < introItems.length; z++) {\n\t introItems[z] && tempIntroItems.push(introItems[z]); // copy non-empty values to the end of the array\n\t }\n\t\n\t introItems = tempIntroItems;\n\t\n\t //Ok, sort all items with given steps\n\t introItems.sort(function (a, b) {\n\t return a.step - b.step;\n\t });\n\t\n\t //set it to the introJs object\n\t self._introItems = introItems;\n\t\n\t //add overlay layer to the page\n\t if(_addOverlayLayer.call(self, targetElm)) {\n\t //then, start the show\n\t _nextStep.call(self);\n\t\n\t var skipButton = targetElm.querySelector('.introjs-skipbutton'),\n\t nextStepButton = targetElm.querySelector('.introjs-nextbutton');\n\t\n\t self._onKeyDown = function(e) {\n\t if (e.keyCode === 27 && self._options.exitOnEsc == true) {\n\t //escape key pressed, exit the intro\n\t //check if exit callback is defined\n\t if (self._introExitCallback != undefined) {\n\t self._introExitCallback.call(self);\n\t }\n\t _exitIntro.call(self, targetElm);\n\t } else if(e.keyCode === 37) {\n\t //left arrow\n\t _previousStep.call(self);\n\t } else if (e.keyCode === 39) {\n\t //right arrow\n\t _nextStep.call(self);\n\t } else if (e.keyCode === 13) {\n\t //srcElement === ie\n\t var target = e.target || e.srcElement;\n\t if (target && target.className.indexOf('introjs-prevbutton') > 0) {\n\t //user hit enter while focusing on previous button\n\t _previousStep.call(self);\n\t } else if (target && target.className.indexOf('introjs-skipbutton') > 0) {\n\t //user hit enter while focusing on skip button\n\t if (self._introItems.length - 1 == self._currentStep && typeof (self._introCompleteCallback) === 'function') {\n\t self._introCompleteCallback.call(self);\n\t }\n\t //check if any callback is defined\n\t if (self._introExitCallback != undefined) {\n\t self._introExitCallback.call(self);\n\t }\n\t _exitIntro.call(self, targetElm);\n\t } else {\n\t //default behavior for responding to enter\n\t _nextStep.call(self);\n\t }\n\t\n\t //prevent default behaviour on hitting Enter, to prevent steps being skipped in some browsers\n\t if(e.preventDefault) {\n\t e.preventDefault();\n\t } else {\n\t e.returnValue = false;\n\t }\n\t }\n\t };\n\t\n\t self._onResize = function(e) {\n\t _setHelperLayerPosition.call(self, document.querySelector('.introjs-helperLayer'));\n\t _setHelperLayerPosition.call(self, document.querySelector('.introjs-tooltipReferenceLayer'));\n\t };\n\t\n\t if (window.addEventListener) {\n\t if (this._options.keyboardNavigation) {\n\t window.addEventListener('keydown', self._onKeyDown, true);\n\t }\n\t //for window resize\n\t window.addEventListener('resize', self._onResize, true);\n\t } else if (document.attachEvent) { //IE\n\t if (this._options.keyboardNavigation) {\n\t document.attachEvent('onkeydown', self._onKeyDown);\n\t }\n\t //for window resize\n\t document.attachEvent('onresize', self._onResize);\n\t }\n\t }\n\t return false;\n\t }\n\t\n\t /*\n\t * makes a copy of the object\n\t * @api private\n\t * @method _cloneObject\n\t */\n\t function _cloneObject(object) {\n\t if (object == null || typeof (object) != 'object' || typeof (object.nodeType) != 'undefined') {\n\t return object;\n\t }\n\t var temp = {};\n\t for (var key in object) {\n\t if (typeof (jQuery) != 'undefined' && object[key] instanceof jQuery) {\n\t temp[key] = object[key];\n\t } else {\n\t temp[key] = _cloneObject(object[key]);\n\t }\n\t }\n\t return temp;\n\t }\n\t /**\n\t * Go to specific step of introduction\n\t *\n\t * @api private\n\t * @method _goToStep\n\t */\n\t function _goToStep(step) {\n\t //because steps starts with zero\n\t this._currentStep = step - 2;\n\t if (typeof (this._introItems) !== 'undefined') {\n\t _nextStep.call(this);\n\t }\n\t }\n\t\n\t /**\n\t * Go to next step on intro\n\t *\n\t * @api private\n\t * @method _nextStep\n\t */\n\t function _nextStep() {\n\t this._direction = 'forward';\n\t\n\t if (typeof (this._currentStep) === 'undefined') {\n\t this._currentStep = 0;\n\t } else {\n\t ++this._currentStep;\n\t }\n\t\n\t if ((this._introItems.length) <= this._currentStep) {\n\t //end of the intro\n\t //check if any callback is defined\n\t if (typeof (this._introCompleteCallback) === 'function') {\n\t this._introCompleteCallback.call(this);\n\t }\n\t _exitIntro.call(this, this._targetElement);\n\t return;\n\t }\n\t\n\t var nextStep = this._introItems[this._currentStep];\n\t if (typeof (this._introBeforeChangeCallback) !== 'undefined') {\n\t this._introBeforeChangeCallback.call(this, nextStep.element);\n\t }\n\t\n\t _showElement.call(this, nextStep);\n\t }\n\t\n\t /**\n\t * Go to previous step on intro\n\t *\n\t * @api private\n\t * @method _nextStep\n\t */\n\t function _previousStep() {\n\t this._direction = 'backward';\n\t\n\t if (this._currentStep === 0) {\n\t return false;\n\t }\n\t\n\t var nextStep = this._introItems[--this._currentStep];\n\t if (typeof (this._introBeforeChangeCallback) !== 'undefined') {\n\t this._introBeforeChangeCallback.call(this, nextStep.element);\n\t }\n\t\n\t _showElement.call(this, nextStep);\n\t }\n\t\n\t /**\n\t * Exit from intro\n\t *\n\t * @api private\n\t * @method _exitIntro\n\t * @param {Object} targetElement\n\t */\n\t function _exitIntro(targetElement) {\n\t //remove overlay layer from the page\n\t var overlayLayer = targetElement.querySelector('.introjs-overlay');\n\t\n\t //return if intro already completed or skipped\n\t if (overlayLayer == null) {\n\t return;\n\t }\n\t\n\t //for fade-out animation\n\t overlayLayer.style.opacity = 0;\n\t setTimeout(function () {\n\t if (overlayLayer.parentNode) {\n\t overlayLayer.parentNode.removeChild(overlayLayer);\n\t }\n\t }, 500);\n\t\n\t //remove all helper layers\n\t var helperLayer = targetElement.querySelector('.introjs-helperLayer');\n\t if (helperLayer) {\n\t helperLayer.parentNode.removeChild(helperLayer);\n\t }\n\t\n\t var referenceLayer = targetElement.querySelector('.introjs-tooltipReferenceLayer');\n\t if (referenceLayer) {\n\t referenceLayer.parentNode.removeChild(referenceLayer);\n\t }\n\t //remove disableInteractionLayer\n\t var disableInteractionLayer = targetElement.querySelector('.introjs-disableInteraction');\n\t if (disableInteractionLayer) {\n\t disableInteractionLayer.parentNode.removeChild(disableInteractionLayer);\n\t }\n\t\n\t //remove intro floating element\n\t var floatingElement = document.querySelector('.introjsFloatingElement');\n\t if (floatingElement) {\n\t floatingElement.parentNode.removeChild(floatingElement);\n\t }\n\t\n\t //remove `introjs-showElement` class from the element\n\t var showElement = document.querySelector('.introjs-showElement');\n\t if (showElement) {\n\t showElement.className = showElement.className.replace(/introjs-[a-zA-Z]+/g, '').replace(/^\\s+|\\s+$/g, ''); // This is a manual trim.\n\t }\n\t\n\t //remove `introjs-fixParent` class from the elements\n\t var fixParents = document.querySelectorAll('.introjs-fixParent');\n\t if (fixParents && fixParents.length > 0) {\n\t for (var i = fixParents.length - 1; i >= 0; i--) {\n\t fixParents[i].className = fixParents[i].className.replace(/introjs-fixParent/g, '').replace(/^\\s+|\\s+$/g, '');\n\t }\n\t }\n\t\n\t //clean listeners\n\t if (window.removeEventListener) {\n\t window.removeEventListener('keydown', this._onKeyDown, true);\n\t } else if (document.detachEvent) { //IE\n\t document.detachEvent('onkeydown', this._onKeyDown);\n\t }\n\t\n\t //set the step to zero\n\t this._currentStep = undefined;\n\t }\n\t\n\t /**\n\t * Render tooltip box in the page\n\t *\n\t * @api private\n\t * @method _placeTooltip\n\t * @param {HTMLElement} targetElement\n\t * @param {HTMLElement} tooltipLayer\n\t * @param {HTMLElement} arrowLayer\n\t * @param {HTMLElement} helperNumberLayer\n\t * @param {Boolean} hintMode\n\t */\n\t function _placeTooltip(targetElement, tooltipLayer, arrowLayer, helperNumberLayer, hintMode) {\n\t var tooltipCssClass = '',\n\t currentStepObj,\n\t tooltipOffset,\n\t targetOffset,\n\t windowSize,\n\t currentTooltipPosition;\n\t\n\t hintMode = hintMode || false;\n\t\n\t //reset the old style\n\t tooltipLayer.style.top = null;\n\t tooltipLayer.style.right = null;\n\t tooltipLayer.style.bottom = null;\n\t tooltipLayer.style.left = null;\n\t tooltipLayer.style.marginLeft = null;\n\t tooltipLayer.style.marginTop = null;\n\t\n\t arrowLayer.style.display = 'inherit';\n\t\n\t if (typeof(helperNumberLayer) != 'undefined' && helperNumberLayer != null) {\n\t helperNumberLayer.style.top = null;\n\t helperNumberLayer.style.left = null;\n\t }\n\t\n\t //prevent error when `this._currentStep` is undefined\n\t if (!this._introItems[this._currentStep]) return;\n\t\n\t //if we have a custom css class for each step\n\t currentStepObj = this._introItems[this._currentStep];\n\t if (typeof (currentStepObj.tooltipClass) === 'string') {\n\t tooltipCssClass = currentStepObj.tooltipClass;\n\t } else {\n\t tooltipCssClass = this._options.tooltipClass;\n\t }\n\t\n\t tooltipLayer.className = ('introjs-tooltip ' + tooltipCssClass).replace(/^\\s+|\\s+$/g, '');\n\t\n\t currentTooltipPosition = this._introItems[this._currentStep].position;\n\t if ((currentTooltipPosition == \"auto\" || this._options.tooltipPosition == \"auto\")) {\n\t if (currentTooltipPosition != \"floating\") { // Floating is always valid, no point in calculating\n\t currentTooltipPosition = _determineAutoPosition.call(this, targetElement, tooltipLayer, currentTooltipPosition);\n\t }\n\t }\n\t targetOffset = _getOffset(targetElement);\n\t tooltipOffset = _getOffset(tooltipLayer);\n\t windowSize = _getWinSize();\n\t\n\t switch (currentTooltipPosition) {\n\t case 'top':\n\t arrowLayer.className = 'introjs-arrow bottom';\n\t\n\t if (hintMode) {\n\t var tooltipLayerStyleLeft = 0;\n\t } else {\n\t var tooltipLayerStyleLeft = 15;\n\t }\n\t\n\t _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer);\n\t tooltipLayer.style.bottom = (targetOffset.height + 20) + 'px';\n\t break;\n\t case 'right':\n\t tooltipLayer.style.left = (targetOffset.width + 20) + 'px';\n\t if (targetOffset.top + tooltipOffset.height > windowSize.height) {\n\t // In this case, right would have fallen below the bottom of the screen.\n\t // Modify so that the bottom of the tooltip connects with the target\n\t arrowLayer.className = \"introjs-arrow left-bottom\";\n\t tooltipLayer.style.top = \"-\" + (tooltipOffset.height - targetOffset.height - 20) + \"px\";\n\t } else {\n\t arrowLayer.className = 'introjs-arrow left';\n\t }\n\t break;\n\t case 'left':\n\t if (!hintMode && this._options.showStepNumbers == true) {\n\t tooltipLayer.style.top = '15px';\n\t }\n\t\n\t if (targetOffset.top + tooltipOffset.height > windowSize.height) {\n\t // In this case, left would have fallen below the bottom of the screen.\n\t // Modify so that the bottom of the tooltip connects with the target\n\t tooltipLayer.style.top = \"-\" + (tooltipOffset.height - targetOffset.height - 20) + \"px\";\n\t arrowLayer.className = 'introjs-arrow right-bottom';\n\t } else {\n\t arrowLayer.className = 'introjs-arrow right';\n\t }\n\t tooltipLayer.style.right = (targetOffset.width + 20) + 'px';\n\t\n\t break;\n\t case 'floating':\n\t arrowLayer.style.display = 'none';\n\t\n\t //we have to adjust the top and left of layer manually for intro items without element\n\t tooltipLayer.style.left = '50%';\n\t tooltipLayer.style.top = '50%';\n\t tooltipLayer.style.marginLeft = '-' + (tooltipOffset.width / 2) + 'px';\n\t tooltipLayer.style.marginTop = '-' + (tooltipOffset.height / 2) + 'px';\n\t\n\t if (typeof(helperNumberLayer) != 'undefined' && helperNumberLayer != null) {\n\t helperNumberLayer.style.left = '-' + ((tooltipOffset.width / 2) + 18) + 'px';\n\t helperNumberLayer.style.top = '-' + ((tooltipOffset.height / 2) + 18) + 'px';\n\t }\n\t\n\t break;\n\t case 'bottom-right-aligned':\n\t arrowLayer.className = 'introjs-arrow top-right';\n\t\n\t var tooltipLayerStyleRight = 0;\n\t _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer);\n\t tooltipLayer.style.top = (targetOffset.height + 20) + 'px';\n\t break;\n\t\n\t case 'bottom-middle-aligned':\n\t arrowLayer.className = 'introjs-arrow top-middle';\n\t\n\t var tooltipLayerStyleLeftRight = targetOffset.width / 2 - tooltipOffset.width / 2;\n\t\n\t // a fix for middle aligned hints\n\t if (hintMode) {\n\t tooltipLayerStyleLeftRight += 5;\n\t }\n\t\n\t if (_checkLeft(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, tooltipLayer)) {\n\t tooltipLayer.style.right = null;\n\t _checkRight(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, windowSize, tooltipLayer);\n\t }\n\t tooltipLayer.style.top = (targetOffset.height + 20) + 'px';\n\t break;\n\t\n\t case 'bottom-left-aligned':\n\t // Bottom-left-aligned is the same as the default bottom\n\t case 'bottom':\n\t // Bottom going to follow the default behavior\n\t default:\n\t arrowLayer.className = 'introjs-arrow top';\n\t\n\t var tooltipLayerStyleLeft = 0;\n\t _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer);\n\t tooltipLayer.style.top = (targetOffset.height + 20) + 'px';\n\t break;\n\t }\n\t }\n\t\n\t /**\n\t * Set tooltip left so it doesn't go off the right side of the window\n\t *\n\t * @return boolean true, if tooltipLayerStyleLeft is ok. false, otherwise.\n\t */\n\t function _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer) {\n\t if (targetOffset.left + tooltipLayerStyleLeft + tooltipOffset.width > windowSize.width) {\n\t // off the right side of the window\n\t tooltipLayer.style.left = (windowSize.width - tooltipOffset.width - targetOffset.left) + 'px';\n\t return false;\n\t }\n\t tooltipLayer.style.left = tooltipLayerStyleLeft + 'px';\n\t return true;\n\t }\n\t\n\t /**\n\t * Set tooltip right so it doesn't go off the left side of the window\n\t *\n\t * @return boolean true, if tooltipLayerStyleRight is ok. false, otherwise.\n\t */\n\t function _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer) {\n\t if (targetOffset.left + targetOffset.width - tooltipLayerStyleRight - tooltipOffset.width < 0) {\n\t // off the left side of the window\n\t tooltipLayer.style.left = (-targetOffset.left) + 'px';\n\t return false;\n\t }\n\t tooltipLayer.style.right = tooltipLayerStyleRight + 'px';\n\t return true;\n\t }\n\t\n\t /**\n\t * Determines the position of the tooltip based on the position precedence and availability\n\t * of screen space.\n\t *\n\t * @param {Object} targetElement\n\t * @param {Object} tooltipLayer\n\t * @param {Object} desiredTooltipPosition\n\t *\n\t */\n\t function _determineAutoPosition(targetElement, tooltipLayer, desiredTooltipPosition) {\n\t\n\t // Take a clone of position precedence. These will be the available\n\t var possiblePositions = this._options.positionPrecedence.slice();\n\t\n\t var windowSize = _getWinSize();\n\t var tooltipHeight = _getOffset(tooltipLayer).height + 10;\n\t var tooltipWidth = _getOffset(tooltipLayer).width + 20;\n\t var targetOffset = _getOffset(targetElement);\n\t\n\t // If we check all the possible areas, and there are no valid places for the tooltip, the element\n\t // must take up most of the screen real estate. Show the tooltip floating in the middle of the screen.\n\t var calculatedPosition = \"floating\";\n\t\n\t // Check if the width of the tooltip + the starting point would spill off the right side of the screen\n\t // If no, neither bottom or top are valid\n\t if (targetOffset.left + tooltipWidth > windowSize.width || ((targetOffset.left + (targetOffset.width / 2)) - tooltipWidth) < 0) {\n\t _removeEntry(possiblePositions, \"bottom\");\n\t _removeEntry(possiblePositions, \"top\");\n\t } else {\n\t // Check for space below\n\t if ((targetOffset.height + targetOffset.top + tooltipHeight) > windowSize.height) {\n\t _removeEntry(possiblePositions, \"bottom\");\n\t }\n\t\n\t // Check for space above\n\t if (targetOffset.top - tooltipHeight < 0) {\n\t _removeEntry(possiblePositions, \"top\");\n\t }\n\t }\n\t\n\t // Check for space to the right\n\t if (targetOffset.width + targetOffset.left + tooltipWidth > windowSize.width) {\n\t _removeEntry(possiblePositions, \"right\");\n\t }\n\t\n\t // Check for space to the left\n\t if (targetOffset.left - tooltipWidth < 0) {\n\t _removeEntry(possiblePositions, \"left\");\n\t }\n\t\n\t // At this point, our array only has positions that are valid. Pick the first one, as it remains in order\n\t if (possiblePositions.length > 0) {\n\t calculatedPosition = possiblePositions[0];\n\t }\n\t\n\t // If the requested position is in the list, replace our calculated choice with that\n\t if (desiredTooltipPosition && desiredTooltipPosition != \"auto\") {\n\t if (possiblePositions.indexOf(desiredTooltipPosition) > -1) {\n\t calculatedPosition = desiredTooltipPosition;\n\t }\n\t }\n\t\n\t return calculatedPosition;\n\t }\n\t\n\t /**\n\t * Remove an entry from a string array if it's there, does nothing if it isn't there.\n\t *\n\t * @param {Array} stringArray\n\t * @param {String} stringToRemove\n\t */\n\t function _removeEntry(stringArray, stringToRemove) {\n\t if (stringArray.indexOf(stringToRemove) > -1) {\n\t stringArray.splice(stringArray.indexOf(stringToRemove), 1);\n\t }\n\t }\n\t\n\t /**\n\t * Update the position of the helper layer on the screen\n\t *\n\t * @api private\n\t * @method _setHelperLayerPosition\n\t * @param {Object} helperLayer\n\t */\n\t function _setHelperLayerPosition(helperLayer) {\n\t if (helperLayer) {\n\t //prevent error when `this._currentStep` in undefined\n\t if (!this._introItems[this._currentStep]) return;\n\t\n\t var currentElement = this._introItems[this._currentStep],\n\t elementPosition = _getOffset(currentElement.element),\n\t widthHeightPadding = 10;\n\t\n\t // If the target element is fixed, the tooltip should be fixed as well.\n\t // Otherwise, remove a fixed class that may be left over from the previous\n\t // step.\n\t if (_isFixed(currentElement.element)) {\n\t helperLayer.className += ' introjs-fixedTooltip';\n\t } else {\n\t helperLayer.className = helperLayer.className.replace(' introjs-fixedTooltip', '');\n\t }\n\t\n\t if (currentElement.position == 'floating') {\n\t widthHeightPadding = 0;\n\t }\n\t\n\t //set new position to helper layer\n\t helperLayer.setAttribute('style', 'width: ' + (elementPosition.width + widthHeightPadding) + 'px; ' +\n\t 'height:' + (elementPosition.height + widthHeightPadding) + 'px; ' +\n\t 'top:' + (elementPosition.top - 5) + 'px;' +\n\t 'left: ' + (elementPosition.left - 5) + 'px;');\n\t\n\t }\n\t }\n\t\n\t /**\n\t * Add disableinteraction layer and adjust the size and position of the layer\n\t *\n\t * @api private\n\t * @method _disableInteraction\n\t */\n\t function _disableInteraction() {\n\t var disableInteractionLayer = document.querySelector('.introjs-disableInteraction');\n\t if (disableInteractionLayer === null) {\n\t disableInteractionLayer = document.createElement('div');\n\t disableInteractionLayer.className = 'introjs-disableInteraction';\n\t this._targetElement.appendChild(disableInteractionLayer);\n\t }\n\t\n\t _setHelperLayerPosition.call(this, disableInteractionLayer);\n\t }\n\t\n\t /**\n\t * Setting anchors to behave like buttons\n\t *\n\t * @api private\n\t * @method _setAnchorAsButton\n\t */\n\t function _setAnchorAsButton(anchor){\n\t anchor.setAttribute('role', 'button');\n\t anchor.tabIndex = 0;\n\t }\n\t\n\t /**\n\t * Show an element on the page\n\t *\n\t * @api private\n\t * @method _showElement\n\t * @param {Object} targetElement\n\t */\n\t function _showElement(targetElement) {\n\t\n\t if (typeof (this._introChangeCallback) !== 'undefined') {\n\t this._introChangeCallback.call(this, targetElement.element);\n\t }\n\t\n\t var self = this,\n\t oldHelperLayer = document.querySelector('.introjs-helperLayer'),\n\t oldReferenceLayer = document.querySelector('.introjs-tooltipReferenceLayer'),\n\t highlightClass = 'introjs-helperLayer',\n\t elementPosition = _getOffset(targetElement.element);\n\t\n\t //check for a current step highlight class\n\t if (typeof (targetElement.highlightClass) === 'string') {\n\t highlightClass += (' ' + targetElement.highlightClass);\n\t }\n\t //check for options highlight class\n\t if (typeof (this._options.highlightClass) === 'string') {\n\t highlightClass += (' ' + this._options.highlightClass);\n\t }\n\t\n\t if (oldHelperLayer != null) {\n\t var oldHelperNumberLayer = oldReferenceLayer.querySelector('.introjs-helperNumberLayer'),\n\t oldtooltipLayer = oldReferenceLayer.querySelector('.introjs-tooltiptext'),\n\t oldArrowLayer = oldReferenceLayer.querySelector('.introjs-arrow'),\n\t oldtooltipContainer = oldReferenceLayer.querySelector('.introjs-tooltip'),\n\t skipTooltipButton = oldReferenceLayer.querySelector('.introjs-skipbutton'),\n\t prevTooltipButton = oldReferenceLayer.querySelector('.introjs-prevbutton'),\n\t nextTooltipButton = oldReferenceLayer.querySelector('.introjs-nextbutton');\n\t\n\t //update or reset the helper highlight class\n\t oldHelperLayer.className = highlightClass;\n\t //hide the tooltip\n\t oldtooltipContainer.style.opacity = 0;\n\t oldtooltipContainer.style.display = \"none\";\n\t\n\t if (oldHelperNumberLayer != null) {\n\t var lastIntroItem = this._introItems[(targetElement.step - 2 >= 0 ? targetElement.step - 2 : 0)];\n\t\n\t if (lastIntroItem != null && (this._direction == 'forward' && lastIntroItem.position == 'floating') || (this._direction == 'backward' && targetElement.position == 'floating')) {\n\t oldHelperNumberLayer.style.opacity = 0;\n\t }\n\t }\n\t\n\t //set new position to helper layer\n\t _setHelperLayerPosition.call(self, oldHelperLayer);\n\t _setHelperLayerPosition.call(self, oldReferenceLayer);\n\t\n\t //remove `introjs-fixParent` class from the elements\n\t var fixParents = document.querySelectorAll('.introjs-fixParent');\n\t if (fixParents && fixParents.length > 0) {\n\t for (var i = fixParents.length - 1; i >= 0; i--) {\n\t fixParents[i].className = fixParents[i].className.replace(/introjs-fixParent/g, '').replace(/^\\s+|\\s+$/g, '');\n\t };\n\t }\n\t\n\t //remove old classes if the element still exist\n\t var oldShowElement = document.querySelector('.introjs-showElement');\n\t if(oldShowElement) {\n\t oldShowElement.className = oldShowElement.className.replace(/introjs-[a-zA-Z]+/g, '').replace(/^\\s+|\\s+$/g, '');\n\t }\n\t\n\t //we should wait until the CSS3 transition is competed (it's 0.3 sec) to prevent incorrect `height` and `width` calculation\n\t if (self._lastShowElementTimer) {\n\t clearTimeout(self._lastShowElementTimer);\n\t }\n\t self._lastShowElementTimer = setTimeout(function() {\n\t //set current step to the label\n\t if (oldHelperNumberLayer != null) {\n\t oldHelperNumberLayer.innerHTML = targetElement.step;\n\t }\n\t //set current tooltip text\n\t oldtooltipLayer.innerHTML = targetElement.intro;\n\t //set the tooltip position\n\t oldtooltipContainer.style.display = \"block\";\n\t _placeTooltip.call(self, targetElement.element, oldtooltipContainer, oldArrowLayer, oldHelperNumberLayer);\n\t\n\t //change active bullet\n\t oldReferenceLayer.querySelector('.introjs-bullets li > a.active').className = '';\n\t oldReferenceLayer.querySelector('.introjs-bullets li > a[data-stepnumber=\"' + targetElement.step + '\"]').className = 'active';\n\t\n\t oldReferenceLayer.querySelector('.introjs-progress .introjs-progressbar').setAttribute('style', 'width:' + _getProgress.call(self) + '%;');\n\t\n\t //show the tooltip\n\t oldtooltipContainer.style.opacity = 1;\n\t if (oldHelperNumberLayer) oldHelperNumberLayer.style.opacity = 1;\n\t\n\t //reset button focus\n\t if (nextTooltipButton.tabIndex === -1) {\n\t //tabindex of -1 means we are at the end of the tour - focus on skip / done\n\t skipTooltipButton.focus();\n\t } else {\n\t //still in the tour, focus on next\n\t nextTooltipButton.focus();\n\t }\n\t }, 350);\n\t\n\t } else {\n\t var helperLayer = document.createElement('div'),\n\t referenceLayer = document.createElement('div'),\n\t arrowLayer = document.createElement('div'),\n\t tooltipLayer = document.createElement('div'),\n\t tooltipTextLayer = document.createElement('div'),\n\t bulletsLayer = document.createElement('div'),\n\t progressLayer = document.createElement('div'),\n\t buttonsLayer = document.createElement('div');\n\t\n\t helperLayer.className = highlightClass;\n\t referenceLayer.className = 'introjs-tooltipReferenceLayer';\n\t\n\t //set new position to helper layer\n\t _setHelperLayerPosition.call(self, helperLayer);\n\t _setHelperLayerPosition.call(self, referenceLayer);\n\t\n\t //add helper layer to target element\n\t this._targetElement.appendChild(helperLayer);\n\t this._targetElement.appendChild(referenceLayer);\n\t\n\t arrowLayer.className = 'introjs-arrow';\n\t\n\t tooltipTextLayer.className = 'introjs-tooltiptext';\n\t tooltipTextLayer.innerHTML = targetElement.intro;\n\t\n\t bulletsLayer.className = 'introjs-bullets';\n\t\n\t if (this._options.showBullets === false) {\n\t bulletsLayer.style.display = 'none';\n\t }\n\t\n\t var ulContainer = document.createElement('ul');\n\t\n\t for (var i = 0, stepsLength = this._introItems.length; i < stepsLength; i++) {\n\t var innerLi = document.createElement('li');\n\t var anchorLink = document.createElement('a');\n\t\n\t anchorLink.onclick = function() {\n\t self.goToStep(this.getAttribute('data-stepnumber'));\n\t };\n\t\n\t if (i === (targetElement.step-1)) anchorLink.className = 'active';\n\t\n\t _setAnchorAsButton(anchorLink);\n\t anchorLink.innerHTML = \" \";\n\t anchorLink.setAttribute('data-stepnumber', this._introItems[i].step);\n\t\n\t innerLi.appendChild(anchorLink);\n\t ulContainer.appendChild(innerLi);\n\t }\n\t\n\t bulletsLayer.appendChild(ulContainer);\n\t\n\t progressLayer.className = 'introjs-progress';\n\t\n\t if (this._options.showProgress === false) {\n\t progressLayer.style.display = 'none';\n\t }\n\t var progressBar = document.createElement('div');\n\t progressBar.className = 'introjs-progressbar';\n\t progressBar.setAttribute('style', 'width:' + _getProgress.call(this) + '%;');\n\t\n\t progressLayer.appendChild(progressBar);\n\t\n\t buttonsLayer.className = 'introjs-tooltipbuttons';\n\t if (this._options.showButtons === false) {\n\t buttonsLayer.style.display = 'none';\n\t }\n\t\n\t tooltipLayer.className = 'introjs-tooltip';\n\t tooltipLayer.appendChild(tooltipTextLayer);\n\t tooltipLayer.appendChild(bulletsLayer);\n\t tooltipLayer.appendChild(progressLayer);\n\t\n\t //add helper layer number\n\t if (this._options.showStepNumbers == true) {\n\t var helperNumberLayer = document.createElement('span');\n\t helperNumberLayer.className = 'introjs-helperNumberLayer';\n\t helperNumberLayer.innerHTML = targetElement.step;\n\t referenceLayer.appendChild(helperNumberLayer);\n\t }\n\t\n\t tooltipLayer.appendChild(arrowLayer);\n\t referenceLayer.appendChild(tooltipLayer);\n\t\n\t //next button\n\t var nextTooltipButton = document.createElement('a');\n\t\n\t nextTooltipButton.onclick = function() {\n\t if (self._introItems.length - 1 != self._currentStep) {\n\t _nextStep.call(self);\n\t }\n\t };\n\t\n\t _setAnchorAsButton(nextTooltipButton);\n\t nextTooltipButton.innerHTML = this._options.nextLabel;\n\t\n\t //previous button\n\t var prevTooltipButton = document.createElement('a');\n\t\n\t prevTooltipButton.onclick = function() {\n\t if (self._currentStep != 0) {\n\t _previousStep.call(self);\n\t }\n\t };\n\t\n\t _setAnchorAsButton(prevTooltipButton);\n\t prevTooltipButton.innerHTML = this._options.prevLabel;\n\t\n\t //skip button\n\t var skipTooltipButton = document.createElement('a');\n\t skipTooltipButton.className = 'introjs-button introjs-skipbutton';\n\t _setAnchorAsButton(skipTooltipButton);\n\t skipTooltipButton.innerHTML = this._options.skipLabel;\n\t\n\t skipTooltipButton.onclick = function() {\n\t if (self._introItems.length - 1 == self._currentStep && typeof (self._introCompleteCallback) === 'function') {\n\t self._introCompleteCallback.call(self);\n\t }\n\t\n\t if (self._introItems.length - 1 != self._currentStep && typeof (self._introExitCallback) === 'function') {\n\t self._introExitCallback.call(self);\n\t }\n\t\n\t _exitIntro.call(self, self._targetElement);\n\t };\n\t\n\t buttonsLayer.appendChild(skipTooltipButton);\n\t\n\t //in order to prevent displaying next/previous button always\n\t if (this._introItems.length > 1) {\n\t buttonsLayer.appendChild(prevTooltipButton);\n\t buttonsLayer.appendChild(nextTooltipButton);\n\t }\n\t\n\t tooltipLayer.appendChild(buttonsLayer);\n\t\n\t //set proper position\n\t _placeTooltip.call(self, targetElement.element, tooltipLayer, arrowLayer, helperNumberLayer);\n\t }\n\t\n\t //disable interaction\n\t if (this._options.disableInteraction === true) {\n\t _disableInteraction.call(self);\n\t }\n\t\n\t prevTooltipButton.removeAttribute('tabIndex');\n\t nextTooltipButton.removeAttribute('tabIndex');\n\t\n\t if (this._currentStep == 0 && this._introItems.length > 1) {\n\t nextTooltipButton.className = 'introjs-button introjs-nextbutton';\n\t\n\t if (this._options.hidePrev == true) {\n\t prevTooltipButton.className = 'introjs-button introjs-prevbutton introjs-hidden';\n\t nextTooltipButton.className += ' introjs-fullbutton';\n\t } else {\n\t prevTooltipButton.className = 'introjs-button introjs-prevbutton introjs-disabled';\n\t }\n\t\n\t prevTooltipButton.tabIndex = '-1';\n\t skipTooltipButton.innerHTML = this._options.skipLabel;\n\t } else if (this._introItems.length - 1 == this._currentStep || this._introItems.length == 1) {\n\t skipTooltipButton.innerHTML = this._options.doneLabel;\n\t prevTooltipButton.className = 'introjs-button introjs-prevbutton';\n\t\n\t if (this._options.hideNext == true) {\n\t nextTooltipButton.className = 'introjs-button introjs-nextbutton introjs-hidden';\n\t prevTooltipButton.className += ' introjs-fullbutton';\n\t } else {\n\t nextTooltipButton.className = 'introjs-button introjs-nextbutton introjs-disabled';\n\t }\n\t\n\t nextTooltipButton.tabIndex = '-1';\n\t } else {\n\t prevTooltipButton.className = 'introjs-button introjs-prevbutton';\n\t nextTooltipButton.className = 'introjs-button introjs-nextbutton';\n\t skipTooltipButton.innerHTML = this._options.skipLabel;\n\t }\n\t\n\t //Set focus on \"next\" button, so that hitting Enter always moves you onto the next step\n\t nextTooltipButton.focus();\n\t\n\t //add target element position style\n\t targetElement.element.className += ' introjs-showElement';\n\t\n\t var currentElementPosition = _getPropValue(targetElement.element, 'position');\n\t if (currentElementPosition !== 'absolute' &&\n\t currentElementPosition !== 'relative' &&\n\t currentElementPosition !== 'fixed') {\n\t //change to new intro item\n\t targetElement.element.className += ' introjs-relativePosition';\n\t }\n\t\n\t var parentElm = targetElement.element.parentNode;\n\t while (parentElm != null) {\n\t if (!parentElm.tagName || parentElm.tagName.toLowerCase() === 'body') break;\n\t\n\t //fix The Stacking Context problem.\n\t //More detail: https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Understanding_z_index/The_stacking_context\n\t var zIndex = _getPropValue(parentElm, 'z-index');\n\t var opacity = parseFloat(_getPropValue(parentElm, 'opacity'));\n\t var transform = _getPropValue(parentElm, 'transform') || _getPropValue(parentElm, '-webkit-transform') || _getPropValue(parentElm, '-moz-transform') || _getPropValue(parentElm, '-ms-transform') || _getPropValue(parentElm, '-o-transform');\n\t if (/[0-9]+/.test(zIndex) || opacity < 1 || (transform !== 'none' && transform !== undefined)) {\n\t parentElm.className += ' introjs-fixParent';\n\t }\n\t\n\t parentElm = parentElm.parentNode;\n\t }\n\t\n\t if (!_elementInViewport(targetElement.element) && this._options.scrollToElement === true) {\n\t var rect = targetElement.element.getBoundingClientRect(),\n\t winHeight = _getWinSize().height,\n\t top = rect.bottom - (rect.bottom - rect.top),\n\t bottom = rect.bottom - winHeight;\n\t\n\t //Scroll up\n\t if (top < 0 || targetElement.element.clientHeight > winHeight) {\n\t window.scrollBy(0, top - this._options.scrollPadding); // 30px padding from edge to look nice\n\t\n\t //Scroll down\n\t } else {\n\t window.scrollBy(0, bottom + 70 + this._options.scrollPadding); // 70px + 30px padding from edge to look nice\n\t }\n\t }\n\t\n\t if (typeof (this._introAfterChangeCallback) !== 'undefined') {\n\t this._introAfterChangeCallback.call(this, targetElement.element);\n\t }\n\t }\n\t\n\t /**\n\t * Get an element CSS property on the page\n\t * Thanks to JavaScript Kit: http://www.javascriptkit.com/dhtmltutors/dhtmlcascade4.shtml\n\t *\n\t * @api private\n\t * @method _getPropValue\n\t * @param {Object} element\n\t * @param {String} propName\n\t * @returns Element's property value\n\t */\n\t function _getPropValue (element, propName) {\n\t var propValue = '';\n\t if (element.currentStyle) { //IE\n\t propValue = element.currentStyle[propName];\n\t } else if (document.defaultView && document.defaultView.getComputedStyle) { //Others\n\t propValue = document.defaultView.getComputedStyle(element, null).getPropertyValue(propName);\n\t }\n\t\n\t //Prevent exception in IE\n\t if (propValue && propValue.toLowerCase) {\n\t return propValue.toLowerCase();\n\t } else {\n\t return propValue;\n\t }\n\t };\n\t\n\t /**\n\t * Checks to see if target element (or parents) position is fixed or not\n\t *\n\t * @api private\n\t * @method _isFixed\n\t * @param {Object} element\n\t * @returns Boolean\n\t */\n\t function _isFixed (element) {\n\t var p = element.parentNode;\n\t\n\t if (!p || p.nodeName === 'HTML') {\n\t return false;\n\t }\n\t\n\t if (_getPropValue(element, 'position') == 'fixed') {\n\t return true;\n\t }\n\t\n\t return _isFixed(p);\n\t };\n\t\n\t /**\n\t * Provides a cross-browser way to get the screen dimensions\n\t * via: http://stackoverflow.com/questions/5864467/internet-explorer-innerheight\n\t *\n\t * @api private\n\t * @method _getWinSize\n\t * @returns {Object} width and height attributes\n\t */\n\t function _getWinSize() {\n\t if (window.innerWidth != undefined) {\n\t return { width: window.innerWidth, height: window.innerHeight };\n\t } else {\n\t var D = document.documentElement;\n\t return { width: D.clientWidth, height: D.clientHeight };\n\t }\n\t }\n\t\n\t /**\n\t * Check to see if the element is in the viewport or not\n\t * http://stackoverflow.com/questions/123999/how-to-tell-if-a-dom-element-is-visible-in-the-current-viewport\n\t *\n\t * @api private\n\t * @method _elementInViewport\n\t * @param {Object} el\n\t */\n\t function _elementInViewport(el) {\n\t var rect = el.getBoundingClientRect();\n\t\n\t return (\n\t rect.top >= 0 &&\n\t rect.left >= 0 &&\n\t (rect.bottom+80) <= window.innerHeight && // add 80 to get the text right\n\t rect.right <= window.innerWidth\n\t );\n\t }\n\t\n\t /**\n\t * Add overlay layer to the page\n\t *\n\t * @api private\n\t * @method _addOverlayLayer\n\t * @param {Object} targetElm\n\t */\n\t function _addOverlayLayer(targetElm) {\n\t var overlayLayer = document.createElement('div'),\n\t styleText = '',\n\t self = this;\n\t\n\t //set css class name\n\t overlayLayer.className = 'introjs-overlay';\n\t\n\t //check if the target element is body, we should calculate the size of overlay layer in a better way\n\t if (!targetElm.tagName || targetElm.tagName.toLowerCase() === 'body') {\n\t styleText += 'top: 0;bottom: 0; left: 0;right: 0;position: fixed;';\n\t overlayLayer.setAttribute('style', styleText);\n\t } else {\n\t //set overlay layer position\n\t var elementPosition = _getOffset(targetElm);\n\t if (elementPosition) {\n\t styleText += 'width: ' + elementPosition.width + 'px; height:' + elementPosition.height + 'px; top:' + elementPosition.top + 'px;left: ' + elementPosition.left + 'px;';\n\t overlayLayer.setAttribute('style', styleText);\n\t }\n\t }\n\t\n\t targetElm.appendChild(overlayLayer);\n\t\n\t overlayLayer.onclick = function() {\n\t if (self._options.exitOnOverlayClick == true) {\n\t\n\t //check if any callback is defined\n\t if (self._introExitCallback != undefined) {\n\t self._introExitCallback.call(self);\n\t }\n\t _exitIntro.call(self, targetElm);\n\t }\n\t };\n\t\n\t setTimeout(function() {\n\t styleText += 'opacity: ' + self._options.overlayOpacity.toString() + ';';\n\t overlayLayer.setAttribute('style', styleText);\n\t }, 10);\n\t\n\t return true;\n\t };\n\t\n\t /**\n\t * Removes open hint (tooltip hint)\n\t *\n\t * @api private\n\t * @method _removeHintTooltip\n\t */\n\t function _removeHintTooltip() {\n\t var tooltip = this._targetElement.querySelector('.introjs-hintReference');\n\t\n\t if (tooltip) {\n\t var step = tooltip.getAttribute('data-step');\n\t tooltip.parentNode.removeChild(tooltip);\n\t return step;\n\t }\n\t };\n\t\n\t /**\n\t * Start parsing hint items\n\t *\n\t * @api private\n\t * @param {Object} targetElm\n\t * @method _startHint\n\t */\n\t function _populateHints(targetElm) {\n\t var self = this;\n\t this._introItems = []\n\t\n\t if (this._options.hints) {\n\t for (var i = 0, l = this._options.hints.length; i < l; i++) {\n\t var currentItem = _cloneObject(this._options.hints[i]);\n\t\n\t if (typeof(currentItem.element) === 'string') {\n\t //grab the element with given selector from the page\n\t currentItem.element = document.querySelector(currentItem.element);\n\t }\n\t\n\t currentItem.hintPosition = currentItem.hintPosition || this._options.hintPosition;\n\t currentItem.hintAnimation = currentItem.hintAnimation || this._options.hintAnimation;\n\t\n\t if (currentItem.element != null) {\n\t this._introItems.push(currentItem);\n\t }\n\t }\n\t } else {\n\t var hints = targetElm.querySelectorAll('*[data-hint]');\n\t\n\t if (hints.length < 1) {\n\t return false;\n\t }\n\t\n\t //first add intro items with data-step\n\t for (var i = 0, l = hints.length; i < l; i++) {\n\t var currentElement = hints[i];\n\t\n\t // hint animation\n\t var hintAnimation = currentElement.getAttribute('data-hintAnimation');\n\t\n\t if (hintAnimation) {\n\t hintAnimation = (hintAnimation == 'true');\n\t } else {\n\t hintAnimation = this._options.hintAnimation;\n\t }\n\t\n\t this._introItems.push({\n\t element: currentElement,\n\t hint: currentElement.getAttribute('data-hint'),\n\t hintPosition: currentElement.getAttribute('data-hintPosition') || this._options.hintPosition,\n\t hintAnimation: hintAnimation,\n\t tooltipClass: currentElement.getAttribute('data-tooltipClass'),\n\t position: currentElement.getAttribute('data-position') || this._options.tooltipPosition\n\t });\n\t }\n\t }\n\t\n\t _addHints.call(this);\n\t\n\t if (document.addEventListener) {\n\t document.addEventListener('click', _removeHintTooltip.bind(this), false);\n\t //for window resize\n\t window.addEventListener('resize', _reAlignHints.bind(this), true);\n\t } else if (document.attachEvent) { //IE\n\t //for window resize\n\t document.attachEvent('onclick', _removeHintTooltip.bind(this));\n\t document.attachEvent('onresize', _reAlignHints.bind(this));\n\t }\n\t };\n\t\n\t /**\n\t * Re-aligns all hint elements\n\t *\n\t * @api private\n\t * @method _reAlignHints\n\t */\n\t function _reAlignHints() {\n\t for (var i = 0, l = this._introItems.length; i < l; i++) {\n\t var item = this._introItems[i];\n\t\n\t if (typeof (item.targetElement) == 'undefined') continue;\n\t\n\t _alignHintPosition.call(this, item.hintPosition, item.element, item.targetElement)\n\t }\n\t }\n\t\n\t /**\n\t * Hide a hint\n\t *\n\t * @api private\n\t * @method _hideHint\n\t */\n\t function _hideHint(stepId) {\n\t _removeHintTooltip.call(this);\n\t var hint = this._targetElement.querySelector('.introjs-hint[data-step=\"' + stepId + '\"]');\n\t\n\t if (hint) {\n\t hint.className += ' introjs-hidehint';\n\t }\n\t\n\t // call the callback function (if any)\n\t if (typeof (this._hintCloseCallback) !== 'undefined') {\n\t this._hintCloseCallback.call(this, stepId);\n\t }\n\t };\n\t\n\t /**\n\t * Hide all hints\n\t *\n\t * @api private\n\t * @method _hideHints\n\t */\n\t function _hideHints() {\n\t var hints = this._targetElement.querySelectorAll('.introjs-hint');\n\t\n\t if (hints && hints.length > 0) {\n\t for (var i = 0; i < hints.length; i++) {\n\t _hideHint.call(this, hints[i].getAttribute('data-step'));\n\t }\n\t }\n\t };\n\t\n\t /**\n\t * Add all available hints to the page\n\t *\n\t * @api private\n\t * @method _addHints\n\t */\n\t function _addHints() {\n\t var self = this;\n\t\n\t var oldHintsWrapper = document.querySelector('.introjs-hints');\n\t\n\t if (oldHintsWrapper != null) {\n\t hintsWrapper = oldHintsWrapper;\n\t } else {\n\t var hintsWrapper = document.createElement('div');\n\t hintsWrapper.className = 'introjs-hints';\n\t }\n\t\n\t for (var i = 0, l = this._introItems.length; i < l; i++) {\n\t var item = this._introItems[i];\n\t\n\t // avoid append a hint twice\n\t if (document.querySelector('.introjs-hint[data-step=\"' + i + '\"]'))\n\t continue;\n\t\n\t var hint = document.createElement('a');\n\t _setAnchorAsButton(hint);\n\t\n\t (function (hint, item, i) {\n\t // when user clicks on the hint element\n\t hint.onclick = function(e) {\n\t var evt = e ? e : window.event;\n\t if (evt.stopPropagation) evt.stopPropagation();\n\t if (evt.cancelBubble != null) evt.cancelBubble = true;\n\t\n\t _hintClick.call(self, hint, item, i);\n\t };\n\t }(hint, item, i));\n\t\n\t hint.className = 'introjs-hint';\n\t\n\t if (!item.hintAnimation) {\n\t hint.className += ' introjs-hint-no-anim';\n\t }\n\t\n\t // hint's position should be fixed if the target element's position is fixed\n\t if (_isFixed(item.element)) {\n\t hint.className += ' introjs-fixedhint';\n\t }\n\t\n\t var hintDot = document.createElement('div');\n\t hintDot.className = 'introjs-hint-dot';\n\t var hintPulse = document.createElement('div');\n\t hintPulse.className = 'introjs-hint-pulse';\n\t\n\t hint.appendChild(hintDot);\n\t hint.appendChild(hintPulse);\n\t hint.setAttribute('data-step', i);\n\t\n\t // we swap the hint element with target element\n\t // because _setHelperLayerPosition uses `element` property\n\t item.targetElement = item.element;\n\t item.element = hint;\n\t\n\t // align the hint position\n\t _alignHintPosition.call(this, item.hintPosition, hint, item.targetElement);\n\t\n\t hintsWrapper.appendChild(hint);\n\t }\n\t\n\t // adding the hints wrapper\n\t document.body.appendChild(hintsWrapper);\n\t\n\t // call the callback function (if any)\n\t if (typeof (this._hintsAddedCallback) !== 'undefined') {\n\t this._hintsAddedCallback.call(this);\n\t }\n\t };\n\t\n\t /**\n\t * Aligns hint position\n\t *\n\t * @api private\n\t * @method _alignHintPosition\n\t * @param {String} position\n\t * @param {Object} hint\n\t * @param {Object} element\n\t */\n\t function _alignHintPosition(position, hint, element) {\n\t // get/calculate offset of target element\n\t var offset = _getOffset.call(this, element);\n\t\n\t // align the hint element\n\t switch (position) {\n\t default:\n\t case 'top-left':\n\t hint.style.left = offset.left + 'px';\n\t hint.style.top = offset.top + 'px';\n\t break;\n\t case 'top-right':\n\t hint.style.left = (offset.left + offset.width) + 'px';\n\t hint.style.top = offset.top + 'px';\n\t break;\n\t case 'bottom-left':\n\t hint.style.left = offset.left + 'px';\n\t hint.style.top = (offset.top + offset.height) + 'px';\n\t break;\n\t case 'bottom-right':\n\t hint.style.left = (offset.left + offset.width) + 'px';\n\t hint.style.top = (offset.top + offset.height) + 'px';\n\t break;\n\t case 'bottom-middle':\n\t hint.style.left = (offset.left + (offset.width / 2)) + 'px';\n\t hint.style.top = (offset.top + offset.height) + 'px';\n\t break;\n\t case 'top-middle':\n\t hint.style.left = (offset.left + (offset.width / 2)) + 'px';\n\t hint.style.top = offset.top + 'px';\n\t break;\n\t }\n\t };\n\t\n\t /**\n\t * Triggers when user clicks on the hint element\n\t *\n\t * @api private\n\t * @method _hintClick\n\t * @param {Object} hintElement\n\t * @param {Object} item\n\t * @param {Number} stepId\n\t */\n\t function _hintClick(hintElement, item, stepId) {\n\t // call the callback function (if any)\n\t if (typeof (this._hintClickCallback) !== 'undefined') {\n\t this._hintClickCallback.call(this, hintElement, item, stepId);\n\t }\n\t\n\t // remove all open tooltips\n\t var removedStep = _removeHintTooltip.call(this);\n\t\n\t // to toggle the tooltip\n\t if (parseInt(removedStep, 10) == stepId) {\n\t return;\n\t }\n\t\n\t var tooltipLayer = document.createElement('div');\n\t var tooltipTextLayer = document.createElement('div');\n\t var arrowLayer = document.createElement('div');\n\t var referenceLayer = document.createElement('div');\n\t\n\t tooltipLayer.className = 'introjs-tooltip';\n\t\n\t tooltipLayer.onclick = function (e) {\n\t //IE9 & Other Browsers\n\t if (e.stopPropagation) {\n\t e.stopPropagation();\n\t }\n\t //IE8 and Lower\n\t else {\n\t e.cancelBubble = true;\n\t }\n\t };\n\t\n\t tooltipTextLayer.className = 'introjs-tooltiptext';\n\t\n\t var tooltipWrapper = document.createElement('p');\n\t tooltipWrapper.innerHTML = item.hint;\n\t\n\t var closeButton = document.createElement('a');\n\t closeButton.className = 'introjs-button';\n\t closeButton.innerHTML = this._options.hintButtonLabel;\n\t closeButton.onclick = _hideHint.bind(this, stepId);\n\t\n\t tooltipTextLayer.appendChild(tooltipWrapper);\n\t tooltipTextLayer.appendChild(closeButton);\n\t\n\t arrowLayer.className = 'introjs-arrow';\n\t tooltipLayer.appendChild(arrowLayer);\n\t\n\t tooltipLayer.appendChild(tooltipTextLayer);\n\t\n\t // set current step for _placeTooltip function\n\t this._currentStep = hintElement.getAttribute('data-step');\n\t\n\t // align reference layer position\n\t referenceLayer.className = 'introjs-tooltipReferenceLayer introjs-hintReference';\n\t referenceLayer.setAttribute('data-step', hintElement.getAttribute('data-step'));\n\t _setHelperLayerPosition.call(this, referenceLayer);\n\t\n\t referenceLayer.appendChild(tooltipLayer);\n\t document.body.appendChild(referenceLayer);\n\t\n\t //set proper position\n\t _placeTooltip.call(this, hintElement, tooltipLayer, arrowLayer, null, true);\n\t };\n\t\n\t /**\n\t * Get an element position on the page\n\t * Thanks to `meouw`: http://stackoverflow.com/a/442474/375966\n\t *\n\t * @api private\n\t * @method _getOffset\n\t * @param {Object} element\n\t * @returns Element's position info\n\t */\n\t function _getOffset(element) {\n\t var elementPosition = {};\n\t\n\t //set width\n\t elementPosition.width = element.offsetWidth;\n\t\n\t //set height\n\t elementPosition.height = element.offsetHeight;\n\t\n\t //calculate element top and left\n\t var _x = 0;\n\t var _y = 0;\n\t while (element && !isNaN(element.offsetLeft) && !isNaN(element.offsetTop)) {\n\t _x += element.offsetLeft;\n\t _y += element.offsetTop;\n\t element = element.offsetParent;\n\t }\n\t //set top\n\t elementPosition.top = _y;\n\t //set left\n\t elementPosition.left = _x;\n\t\n\t return elementPosition;\n\t };\n\t\n\t /**\n\t * Gets the current progress percentage\n\t *\n\t * @api private\n\t * @method _getProgress\n\t * @returns current progress percentage\n\t */\n\t function _getProgress() {\n\t // Steps are 0 indexed\n\t var currentStep = parseInt((this._currentStep + 1), 10);\n\t return ((currentStep / this._introItems.length) * 100);\n\t };\n\t\n\t /**\n\t * Overwrites obj1's values with obj2's and adds obj2's if non existent in obj1\n\t * via: http://stackoverflow.com/questions/171251/how-can-i-merge-properties-of-two-javascript-objects-dynamically\n\t *\n\t * @param obj1\n\t * @param obj2\n\t * @returns obj3 a new object based on obj1 and obj2\n\t */\n\t function _mergeOptions(obj1,obj2) {\n\t var obj3 = {};\n\t for (var attrname in obj1) { obj3[attrname] = obj1[attrname]; }\n\t for (var attrname in obj2) { obj3[attrname] = obj2[attrname]; }\n\t return obj3;\n\t };\n\t\n\t var introJs = function (targetElm) {\n\t if (typeof (targetElm) === 'object') {\n\t //Ok, create a new instance\n\t return new IntroJs(targetElm);\n\t\n\t } else if (typeof (targetElm) === 'string') {\n\t //select the target element with query selector\n\t var targetElement = document.querySelector(targetElm);\n\t\n\t if (targetElement) {\n\t return new IntroJs(targetElement);\n\t } else {\n\t throw new Error('There is no element with given selector.');\n\t }\n\t } else {\n\t return new IntroJs(document.body);\n\t }\n\t };\n\t\n\t /**\n\t * Current IntroJs version\n\t *\n\t * @property version\n\t * @type String\n\t */\n\t introJs.version = VERSION;\n\t\n\t //Prototype\n\t introJs.fn = IntroJs.prototype = {\n\t clone: function () {\n\t return new IntroJs(this);\n\t },\n\t setOption: function(option, value) {\n\t this._options[option] = value;\n\t return this;\n\t },\n\t setOptions: function(options) {\n\t this._options = _mergeOptions(this._options, options);\n\t return this;\n\t },\n\t start: function () {\n\t _introForElement.call(this, this._targetElement);\n\t return this;\n\t },\n\t goToStep: function(step) {\n\t _goToStep.call(this, step);\n\t return this;\n\t },\n\t nextStep: function() {\n\t _nextStep.call(this);\n\t return this;\n\t },\n\t previousStep: function() {\n\t _previousStep.call(this);\n\t return this;\n\t },\n\t exit: function() {\n\t _exitIntro.call(this, this._targetElement);\n\t return this;\n\t },\n\t refresh: function() {\n\t // re-align intros\n\t _setHelperLayerPosition.call(this, document.querySelector('.introjs-helperLayer'));\n\t _setHelperLayerPosition.call(this, document.querySelector('.introjs-tooltipReferenceLayer'));\n\t\n\t //re-align hints\n\t _reAlignHints.call(this);\n\t return this;\n\t },\n\t onbeforechange: function(providedCallback) {\n\t if (typeof (providedCallback) === 'function') {\n\t this._introBeforeChangeCallback = providedCallback;\n\t } else {\n\t throw new Error('Provided callback for onbeforechange was not a function');\n\t }\n\t return this;\n\t },\n\t onchange: function(providedCallback) {\n\t if (typeof (providedCallback) === 'function') {\n\t this._introChangeCallback = providedCallback;\n\t } else {\n\t throw new Error('Provided callback for onchange was not a function.');\n\t }\n\t return this;\n\t },\n\t onafterchange: function(providedCallback) {\n\t if (typeof (providedCallback) === 'function') {\n\t this._introAfterChangeCallback = providedCallback;\n\t } else {\n\t throw new Error('Provided callback for onafterchange was not a function');\n\t }\n\t return this;\n\t },\n\t oncomplete: function(providedCallback) {\n\t if (typeof (providedCallback) === 'function') {\n\t this._introCompleteCallback = providedCallback;\n\t } else {\n\t throw new Error('Provided callback for oncomplete was not a function.');\n\t }\n\t return this;\n\t },\n\t onhintsadded: function(providedCallback) {\n\t if (typeof (providedCallback) === 'function') {\n\t this._hintsAddedCallback = providedCallback;\n\t } else {\n\t throw new Error('Provided callback for onhintsadded was not a function.');\n\t }\n\t return this;\n\t },\n\t onhintclick: function(providedCallback) {\n\t if (typeof (providedCallback) === 'function') {\n\t this._hintClickCallback = providedCallback;\n\t } else {\n\t throw new Error('Provided callback for onhintclick was not a function.');\n\t }\n\t return this;\n\t },\n\t onhintclose: function(providedCallback) {\n\t if (typeof (providedCallback) === 'function') {\n\t this._hintCloseCallback = providedCallback;\n\t } else {\n\t throw new Error('Provided callback for onhintclose was not a function.');\n\t }\n\t return this;\n\t },\n\t onexit: function(providedCallback) {\n\t if (typeof (providedCallback) === 'function') {\n\t this._introExitCallback = providedCallback;\n\t } else {\n\t throw new Error('Provided callback for onexit was not a function.');\n\t }\n\t return this;\n\t },\n\t addHints: function() {\n\t _populateHints.call(this, this._targetElement);\n\t return this;\n\t },\n\t hideHint: function (stepId) {\n\t _hideHint.call(this, stepId);\n\t return this;\n\t },\n\t hideHints: function () {\n\t _hideHints.call(this);\n\t return this;\n\t }\n\t };\n\t\n\t exports.introJs = introJs;\n\t return introJs;\n\t}));\n\n\n/***/ },\n\n/***/ 1116:\n/***/ function(module, exports) {\n\n\t(function(){\n\tif( !('ace' in window) ) window['ace'] = {}\n\t\n\tace.config = {\n\t storage_method: 0, //0 means use localStorage if available otherwise cookies, 1 means localStorage, 2 means cookies\n\t cookie_expiry : 604800, //(cookie only) 1 week duration for saved settings\n\t cookie_path: ''//(cookie only)\n\t}\n\tif( !('vars' in window['ace']) ) window['ace'].vars = {}\n\tace.vars['very_old_ie']\t= !('querySelector' in document.documentElement);\n\t\n\tace.settings = {\n\t\tsaveState : function(element, attrName, attrVal, append) {\n\t\t\tif( !element || (typeof element == 'string' && !(element = document.getElementById(element))) || !element.hasAttribute('id') ) return false;\n\t\t\tif( !ace.hasClass(element, 'ace-save-state') ) return false;\n\t\t\t\n\t\t\tvar attrName = attrName || 'class';\n\t\t\tvar id = element.getAttribute('id');\n\t\t\t\n\t\t\tvar attrList = ace.data.get('state', 'id-'+id) || {};\n\t\t\tif(typeof attrList == 'string') {\n\t\t\t\ttry {\n\t\t\t\t\tattrList = JSON.parse(attrList);\n\t\t\t\t}\n\t\t\t\tcatch(e) {\n\t\t\t\t\tattrList = {}\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\tvar newVal, hasCustomVal = typeof attrVal !== 'undefined', $delete = false;\n\t\t\t\n\t\t\tvar re1 = /class/i\n\t\t\tvar re2 = /checked|disabled|readonly|value/i\n\t\n\t\t\tif(re2.test(attrName)) newVal = hasCustomVal ? attrVal : element[attrName];\n\t\t\telse {\n\t\t\t\tif(element.hasAttribute(attrName)) {\n\t\t\t\t\tnewVal = hasCustomVal ? attrVal : element.getAttribute(attrName);\n\t\t\t\t}\n\t\t\t\telse if(!hasCustomVal) $delete = true;\n\t\t\t\t//delete this, because element has no such attribute and we haven't given a custom value! (no attrVal)\n\t\t\t}\n\t\t\t\n\t\t\n\t\t\tif($delete) {\n\t\t\t\tdelete attrList[attrName];\n\t\t\t}\n\t\t\telse {\n\t\t\t\t//save class names as an object which indicated which classes should be included or excluded (true/false)\n\t\t\t\tif( re1.test(attrName) ) {//class\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\tif( !attrList.hasOwnProperty(attrName) ) attrList[attrName] = {}\n\t\t\t\t\tif(append === true) {\n\t\t\t\t\t\t//append to previous value\t\t\t\t\t\n\t\t\t\t\t\tattrList[attrName][newVal] = 1;\n\t\t\t\t\t}\n\t\t\t\t\telse if(append === false) {\n\t\t\t\t\t\t//remove from previous value\n\t\t\t\t\t\tattrList[attrName][newVal] = -1;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tattrList[attrName]['className'] = newVal;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\telse {\n\t\t\t\t\tattrList[attrName] = newVal;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tace.data.set('state', 'id-'+id , JSON.stringify(attrList));\n\t\t},\n\t\t\n\t\tloadState : function(element, attrName) {\n\t\t\tif( !element || (typeof element == 'string' && !(element = document.getElementById(element))) || !element.hasAttribute('id') ) return false;\n\t\t\t\n\t\t\tvar id = element.getAttribute('id');\n\t\t\tvar attrList = ace.data.get('state', 'id-'+id) || {};\n\t\t\tif(typeof attrList == 'string') {\n\t\t\t\ttry {\n\t\t\t\t\tattrList = JSON.parse(attrList);\n\t\t\t\t}\n\t\t\t\tcatch(e) {\n\t\t\t\t\tattrList = {}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tvar setAttr = function(element, attr, val) {\n\t\t\t\tvar re1 = /class/i\n\t\t\t\tvar re2 = /checked|disabled|readonly|value/i\n\t\t\t\t\n\t\t\t\tif(re1.test(attr)) {\n\t\t\t\t\tif(typeof val === 'object') {\n\t\t\t\t\t\tif('className' in val) element.setAttribute('class', val['className']);\n\t\t\t\t\t\tfor(var key in val) if(val.hasOwnProperty(key)) {\n\t\t\t\t\t\t\tvar append = val[key];\n\t\t\t\t\t\t\tif(append == 1) ace.addClass(element, key);\n\t\t\t\t\t\t\telse if(append == -1) ace.removeClass(element, key);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t//else if(typeof ace.addClass(element, val);\n\t\t\t\t}\n\t\t\t\telse if(re2.test(attr)) element[attr] = val;\n\t\t\t\telse element.setAttribute(attr, val);\n\t\t\t}\n\t\t\t\n\t\t\tif(attrName !== undefined) {\n\t\t\t\tif(attrList.hasOwnProperty(attrName) && attrList[attrName] !== null) setAttr(element, attrName, attrList[attrName]);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tfor(var name in attrList) {\n\t\t\t\t\tif(attrList.hasOwnProperty(name) && attrList[name] !== null) setAttr(element, name, attrList[name]);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t\n\t\tclearState : function(element) {\n\t\t\tvar id = null;\n\t\t\tif(typeof element === 'string') {\n\t\t\t\tid = element;\n\t\t\t}\n\t\t\telse if('hasAttribute' in element && element.hasAttribute('id')) {\n\t\t\t\tid = element.getAttribute('id');\n\t\t\t}\n\t\t\tif(id) ace.data.remove('state', 'id-'+id);\n\t\t}\n\t};\n\t\n\t\n\t\n\t\n\t(function() {\n\t\t//detect if it is supported\n\t\t//https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Animations/Detecting_CSS_animation_support\n\t\tvar animationSupport = function() {\n\t\t\tvar animation = false,\n\t\t\tanimationstring = 'animation',\n\t\t\tkeyframeprefix = '',\n\t\t\tdomPrefixes = 'Webkit Moz O ms Khtml'.split(' '),\n\t\t\tpfx = '',\n\t\t\telm = document.createElement('div');\n\t\n\t\t\tif( elm.style.animationName !== undefined ) { animation = true; } \n\t\n\t\t\tif( animation === false ) {\n\t\t\t for( var i = 0; i < domPrefixes.length; i++ ) {\n\t\t\t\tif( elm.style[ domPrefixes[i] + 'AnimationName' ] !== undefined ) {\n\t\t\t\t pfx = domPrefixes[ i ];\n\t\t\t\t animationstring = pfx + 'Animation';\n\t\t\t\t keyframeprefix = '-' + pfx.toLowerCase() + '-';\n\t\t\t\t animation = true;\n\t\t\t\t break;\n\t\t\t\t}\n\t\t\t }\n\t\t\t}\n\t\t\t\n\t\t\treturn animation;\n\t\t}\n\t\t\n\t\tace.vars['animation'] = animationSupport();\n\t\tif( ace.vars['animation'] ) {\n\t\t\t//based on http://www.backalleycoder.com/2012/04/25/i-want-a-damnodeinserted/\n\t\n\t\t\tvar animationCSS = \"@keyframes nodeInserted{from{outline-color:#fff}to{outline-color:#000}}@-moz-keyframes nodeInserted{from{outline-color:#fff}to{outline-color:#000}}@-webkit-keyframes nodeInserted{from{outline-color:#fff}to{outline-color:#000}}@-ms-keyframes nodeInserted{from{outline-color:#fff}to{outline-color:#000}}@-o-keyframes nodeInserted{from{outline-color:#fff}to{outline-color:#000}}.ace-save-state{animation-duration:10ms;-o-animation-duration:10ms;-ms-animation-duration:10ms;-moz-animation-duration:10ms;-webkit-animation-duration:10ms;animation-delay:0s;-o-animation-delay:0s;-ms-animation-delay:0s;-moz-animation-delay:0s;-webkit-animation-delay:0s;animation-name:nodeInserted;-o-animation-name:nodeInserted;-ms-animation-name:nodeInserted;-moz-animation-name:nodeInserted;-webkit-animation-name:nodeInserted}\";\n\t\t\tvar animationNode = document.createElement('style');\n\t\t\tanimationNode.innerHTML = animationCSS;\n\t\t\tdocument.head.appendChild(animationNode);\n\t\t\n\t\t\tvar domInsertEvent = function(event) {\n\t\t\t\tvar element = event.target;\n\t\t\t\tif( !element || !ace.hasClass(element, 'ace-save-state') ) return;\n\t\t\t\t\n\t\t\t\tace.settings.loadState(element);\n\t\t\t}\n\t\n\t\t\tdocument.addEventListener('animationstart', domInsertEvent, false);\n\t\t\tdocument.addEventListener('MSAnimationStart', domInsertEvent, false);\n\t\t\tdocument.addEventListener('webkitAnimationStart', domInsertEvent, false);\n\t\t}\n\t\telse {\n\t\t\t//if animation events are not supported, wait for document ready event\n\t\t\tvar documentReady = function() {\n\t\t\t\tvar list = document.querySelectorAll('.ace-save-state');\n\t\t\t\tfor(var i = 0 ; i < list.length ; i++) ace.settings.loadState(list[i]);\n\t\t\t}\n\t\t\t\n\t\t\tif(document.readyState == 'complete') documentReady();\n\t\t\telse if(document.addEventListener) document.addEventListener('DOMContentLoaded', documentReady, false);\n\t\t\telse if(document.attachEvent) document.attachEvent('onreadystatechange', function(){\n\t\t\t\tif (document.readyState == 'complete') documentReady();\n\t\t\t});\n\t\t}\n\t})();\n\t\n\t\n\t\n\t\n\t\n\t\n\t//save/retrieve data using localStorage or cookie\n\t//method == 1, use localStorage\n\t//method == 2, use cookies\n\t//method not specified, use localStorage if available, otherwise cookies\n\tace.data_storage = function(method, undefined) {\n\t\tvar prefix = 'ace_';\n\t\n\t\tvar storage = null;\n\t\tvar type = 0;\n\t\t\n\t\tif((method == 1 || method === undefined || method == 0) && 'localStorage' in window && window['localStorage'] !== null) {\n\t\t\tstorage = ace.storage;\n\t\t\ttype = 1;\n\t\t}\n\t\telse if(storage == null && (method == 2 || method === undefined) && 'cookie' in document && document['cookie'] !== null) {\n\t\t\tstorage = ace.cookie;\n\t\t\ttype = 2;\n\t\t}\n\t\t\n\t\n\t\tthis.set = function(namespace, key, value, path, is_obj, undefined) {\n\t\t\tif(!storage) return;\n\t\t\t\n\t\t\tif(value === undefined) {//no namespace here?\n\t\t\t\tvalue = key;\n\t\t\t\tkey = namespace;\n\t\n\t\t\t\tif(value == null) storage.remove(prefix+key)\n\t\t\t\telse {\n\t\t\t\t\tif(type == 1)\n\t\t\t\t\t\tstorage.set(prefix+key, value)\n\t\t\t\t\telse if(type == 2)\n\t\t\t\t\t\tstorage.set(prefix+key, value, ace.config.cookie_expiry, path || ace.config.cookie_path)\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif(type == 1) {//localStorage\n\t\t\t\t\tif(value == null) storage.remove(prefix+namespace+'_'+key)\n\t\t\t\t\telse {\n\t\t\t\t\t\tif(is_obj && typeof value == 'object') {\n\t\t\t\t\t\t\tvalue = JSON.stringify(value);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstorage.set(prefix+namespace+'_'+key, value);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if(type == 2) {//cookie\n\t\t\t\t\tvar val = storage.get(prefix+namespace);\n\t\t\t\t\tvar tmp = val ? JSON.parse(val) : {};\n\t\n\t\t\t\t\tif(value == null) {\n\t\t\t\t\t\tdelete tmp[key];//remove\n\t\t\t\t\t\tif(ace.sizeof(tmp) == 0) {//no other elements in this cookie, so delete it\n\t\t\t\t\t\t\tstorage.remove(prefix+namespace);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\telse {\n\t\t\t\t\t\ttmp[key] = value;\n\t\t\t\t\t}\n\t\n\t\t\t\t\tstorage.set(prefix+namespace , JSON.stringify(tmp), ace.config.cookie_expiry, path || ace.config.cookie_path)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\n\t\tthis.get = function(namespace, key, is_obj, undefined) {\n\t\t\tif(!storage) return null;\n\t\t\t\n\t\t\tif(key === undefined) {//no namespace here?\n\t\t\t\tkey = namespace;\n\t\t\t\treturn storage.get(prefix+key);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif(type == 1) {//localStorage\n\t\t\t\t\tvar value = storage.get(prefix+namespace+'_'+key);\n\t\t\t\t\tif(is_obj && value) {\n\t\t\t\t\t\ttry { value = JSON.parse(value) } catch(e) {}\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t\telse if(type == 2) {//cookie\n\t\t\t\t\tvar val = storage.get(prefix+namespace);\n\t\t\t\t\tvar tmp = val ? JSON.parse(val) : {};\n\t\t\t\t\treturn key in tmp ? tmp[key] : null;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\n\t\t\n\t\tthis.remove = function(namespace, key, undefined) {\n\t\t\tif(!storage) return;\n\t\t\t\n\t\t\tif(key === undefined) {\n\t\t\t\tkey = namespace\n\t\t\t\tthis.set(key, null);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.set(namespace, key, null);\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\n\t\n\t\n\t\n\t//cookie storage\n\tace.cookie = {\n\t\t// The following settingFunction are from Cookie.js class in TinyMCE, Moxiecode, used under LGPL.\n\t\n\t\t/**\n\t\t * Get a cookie.\n\t\t */\n\t\tget : function(name) {\n\t\t\tvar cookie = document.cookie, e, p = name + \"=\", b;\n\t\n\t\t\tif ( !cookie )\n\t\t\t\treturn;\n\t\n\t\t\tb = cookie.indexOf(\"; \" + p);\n\t\n\t\t\tif ( b == -1 ) {\n\t\t\t\tb = cookie.indexOf(p);\n\t\n\t\t\t\tif ( b != 0 )\n\t\t\t\t\treturn null;\n\t\n\t\t\t} else {\n\t\t\t\tb += 2;\n\t\t\t}\n\t\n\t\t\te = cookie.indexOf(\";\", b);\n\t\n\t\t\tif ( e == -1 )\n\t\t\t\te = cookie.length;\n\t\n\t\t\treturn decodeURIComponent( cookie.substring(b + p.length, e) );\n\t\t},\n\t\n\t\t/**\n\t\t * Set a cookie.\n\t\t *\n\t\t * The 'expires' arg can be either a JS Date() object set to the expiration date (back-compat)\n\t\t * or the number of seconds until expiration\n\t\t */\n\t\tset : function(name, value, expires, path, domain, secure) {\n\t\t\tvar d = new Date();\n\t\n\t\t\tif ( typeof(expires) == 'object' && expires.toGMTString ) {\n\t\t\t\texpires = expires.toGMTString();\n\t\t\t} else if ( parseInt(expires, 10) ) {\n\t\t\t\td.setTime( d.getTime() + ( parseInt(expires, 10) * 1000 ) ); // time must be in miliseconds\n\t\t\t\texpires = d.toGMTString();\n\t\t\t} else {\n\t\t\t\texpires = '';\n\t\t\t}\n\t\n\t\t\tdocument.cookie = name + \"=\" + encodeURIComponent(value) +\n\t\t\t\t((expires) ? \"; expires=\" + expires : \"\") +\n\t\t\t\t((path) ? \"; path=\" + path : \"\") +\n\t\t\t\t((domain) ? \"; domain=\" + domain : \"\") +\n\t\t\t\t((secure) ? \"; secure\" : \"\");\n\t\t},\n\t\n\t\t/**\n\t\t * Remove a cookie.\n\t\t *\n\t\t * This is done by setting it to an empty value and setting the expiration time in the past.\n\t\t */\n\t\tremove : function(name, path) {\n\t\t\tthis.set(name, '', -1000, path);\n\t\t}\n\t};\n\t\n\t\n\t//local storage\n\tace.storage = {\n\t\tget: function(key) {\n\t\t\treturn window['localStorage'].getItem(key);\n\t\t},\n\t\tset: function(key, value) {\n\t\t\twindow['localStorage'].setItem(key , value);\n\t\t},\n\t\tremove: function(key) {\n\t\t\twindow['localStorage'].removeItem(key);\n\t\t}\n\t};\n\t\n\t\n\t\n\t\n\t\n\t\n\t//count the number of properties in an object\n\t//useful for getting the number of elements in an associative array\n\tace.sizeof = function(obj) {\n\t\tvar size = 0;\n\t\tfor(var key in obj) if(obj.hasOwnProperty(key)) size++;\n\t\treturn size;\n\t}\n\t\n\t//because jQuery may not be loaded at this stage, we use our own toggleClass\n\tace.hasClass = function(elem, className) {\treturn (\" \" + elem.className + \" \").indexOf(\" \" + className + \" \") > -1; }\n\t\n\tace.addClass = function(elem, className) {\n\t var parts = className.split(/\\s+/);\n\t for(var p = 0; p < parts.length; p++) {\n\t\tif ( parts[p].length > 0 && !ace.hasClass(elem, parts[p]) ) {\n\t\t\tvar currentClass = elem.className;\n\t\t\telem.className = currentClass + (currentClass.length ? \" \" : \"\") + parts[p];\n\t\t}\n\t }\n\t}\n\t\n\tace.removeClass = function(elem, className) {\n\t var parts = className.split(/\\s+/);\n\t for(var p = 0; p < parts.length; p++) {\n\t\tif( parts[p].length > 0 ) ace.replaceClass(elem, parts[p]);\n\t }\n\t ace.replaceClass(elem, className);\n\t}\n\t\n\tace.replaceClass = function(elem, className, newClass) {\n\t var classToRemove = new RegExp((\"(^|\\\\s)\" + className + \"(\\\\s|$)\"), \"i\");\n\t elem.className = elem.className.replace(classToRemove, function (match, p1, p2) {\n\t\treturn newClass ? (p1 + newClass + p2) : \" \";\n\t }).replace(/^\\s+|\\s+$/g, \"\");\n\t}\n\t\n\t\n\tace.toggleClass = function(elem, className) {\n\t\tif(ace.hasClass(elem, className))\n\t\t\tace.removeClass(elem, className);\n\t\telse ace.addClass(elem, className);\n\t}\n\t\n\tace.isHTMlElement = function(elem) {\n\t return window.HTMLElement ? elem instanceof HTMLElement : ('nodeType' in elem ? elem.nodeType == 1 : false);\n\t}\n\t\n\t\n\t //data_storage instance used inside ace.settings etc\n\t ace.data = new ace.data_storage(ace.config.storage_method);\n\t\n\t})();\n\t\n\n\n/***/ }\n\n/******/ });\n\n\n// WEBPACK FOOTER //\n// javascripts/user-common-js/header.js"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n \t__webpack_require__.p = \"/static/\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 0d338e71b17bdae06fd8","/**\n * Created by takeo on 2016/10/06.\n */\nimport 'intro.js';\nimport '../../source/javascripts/ace/ace-extra';\nimport './ui/legacy/inquiry';\n\n\n\n// WEBPACK FOOTER //\n// ./es6/user-common-js/header.js","function openInquiryWindow(url) {\n window.open(url, 'inquiry', 'width=980, height=800, menubar=no, toolbar=no, scrollbars=yes');\n}\nwindow.openInquiryWindow = openInquiryWindow;\n\n\n\n// WEBPACK FOOTER //\n// ./es6/user-common-js/ui/legacy/inquiry.js","/**\n * Intro.js v2.3.0\n * https://github.com/usablica/intro.js\n *\n * Copyright (C) 2016 Afshin Mehrabani (@afshinmeh)\n */\n\n(function (root, factory) {\n if (typeof exports === 'object') {\n // CommonJS\n factory(exports);\n } else if (typeof define === 'function' && define.amd) {\n // AMD. Register as an anonymous module.\n define(['exports'], factory);\n } else {\n // Browser globals\n factory(root);\n }\n} (this, function (exports) {\n //Default config/variables\n var VERSION = '2.3.0';\n\n /**\n * IntroJs main class\n *\n * @class IntroJs\n */\n function IntroJs(obj) {\n this._targetElement = obj;\n this._introItems = [];\n\n this._options = {\n /* Next button label in tooltip box */\n nextLabel: 'Next →',\n /* Previous button label in tooltip box */\n prevLabel: '← Back',\n /* Skip button label in tooltip box */\n skipLabel: 'Skip',\n /* Done button label in tooltip box */\n doneLabel: 'Done',\n /* Hide previous button in the first step? Otherwise, it will be disabled button. */\n hidePrev: false,\n /* Hide next button in the last step? Otherwise, it will be disabled button. */\n hideNext: false,\n /* Default tooltip box position */\n tooltipPosition: 'bottom',\n /* Next CSS class for tooltip boxes */\n tooltipClass: '',\n /* CSS class that is added to the helperLayer */\n highlightClass: '',\n /* Close introduction when pressing Escape button? */\n exitOnEsc: true,\n /* Close introduction when clicking on overlay layer? */\n exitOnOverlayClick: true,\n /* Show step numbers in introduction? */\n showStepNumbers: true,\n /* Let user use keyboard to navigate the tour? */\n keyboardNavigation: true,\n /* Show tour control buttons? */\n showButtons: true,\n /* Show tour bullets? */\n showBullets: true,\n /* Show tour progress? */\n showProgress: false,\n /* Scroll to highlighted element? */\n scrollToElement: true,\n /* Set the overlay opacity */\n overlayOpacity: 0.8,\n /* Padding to add after scrolling when element is not in the viewport (in pixels) */\n scrollPadding: 30,\n /* Precedence of positions, when auto is enabled */\n positionPrecedence: [\"bottom\", \"top\", \"right\", \"left\"],\n /* Disable an interaction with element? */\n disableInteraction: false,\n /* Default hint position */\n hintPosition: 'top-middle',\n /* Hint button label */\n hintButtonLabel: 'Got it',\n /* Adding animation to hints? */\n hintAnimation: true\n };\n }\n\n /**\n * Initiate a new introduction/guide from an element in the page\n *\n * @api private\n * @method _introForElement\n * @param {Object} targetElm\n * @returns {Boolean} Success or not?\n */\n function _introForElement(targetElm) {\n var introItems = [],\n self = this;\n\n if (this._options.steps) {\n //use steps passed programmatically\n for (var i = 0, stepsLength = this._options.steps.length; i < stepsLength; i++) {\n var currentItem = _cloneObject(this._options.steps[i]);\n //set the step\n currentItem.step = introItems.length + 1;\n //use querySelector function only when developer used CSS selector\n if (typeof(currentItem.element) === 'string') {\n //grab the element with given selector from the page\n currentItem.element = document.querySelector(currentItem.element);\n }\n\n //intro without element\n if (typeof(currentItem.element) === 'undefined' || currentItem.element == null) {\n var floatingElementQuery = document.querySelector(\".introjsFloatingElement\");\n\n if (floatingElementQuery == null) {\n floatingElementQuery = document.createElement('div');\n floatingElementQuery.className = 'introjsFloatingElement';\n\n document.body.appendChild(floatingElementQuery);\n }\n\n currentItem.element = floatingElementQuery;\n currentItem.position = 'floating';\n }\n\n if (currentItem.element != null) {\n introItems.push(currentItem);\n }\n }\n\n } else {\n //use steps from data-* annotations\n var allIntroSteps = targetElm.querySelectorAll('*[data-intro]');\n //if there's no element to intro\n if (allIntroSteps.length < 1) {\n return false;\n }\n\n //first add intro items with data-step\n for (var i = 0, elmsLength = allIntroSteps.length; i < elmsLength; i++) {\n var currentElement = allIntroSteps[i];\n\n // skip hidden elements\n if (currentElement.style.display == 'none') {\n continue;\n }\n\n var step = parseInt(currentElement.getAttribute('data-step'), 10);\n\n if (step > 0) {\n introItems[step - 1] = {\n element: currentElement,\n intro: currentElement.getAttribute('data-intro'),\n step: parseInt(currentElement.getAttribute('data-step'), 10),\n tooltipClass: currentElement.getAttribute('data-tooltipClass'),\n highlightClass: currentElement.getAttribute('data-highlightClass'),\n position: currentElement.getAttribute('data-position') || this._options.tooltipPosition\n };\n }\n }\n\n //next add intro items without data-step\n //todo: we need a cleanup here, two loops are redundant\n var nextStep = 0;\n for (var i = 0, elmsLength = allIntroSteps.length; i < elmsLength; i++) {\n var currentElement = allIntroSteps[i];\n\n if (currentElement.getAttribute('data-step') == null) {\n\n while (true) {\n if (typeof introItems[nextStep] == 'undefined') {\n break;\n } else {\n nextStep++;\n }\n }\n\n introItems[nextStep] = {\n element: currentElement,\n intro: currentElement.getAttribute('data-intro'),\n step: nextStep + 1,\n tooltipClass: currentElement.getAttribute('data-tooltipClass'),\n highlightClass: currentElement.getAttribute('data-highlightClass'),\n position: currentElement.getAttribute('data-position') || this._options.tooltipPosition\n };\n }\n }\n }\n\n //removing undefined/null elements\n var tempIntroItems = [];\n for (var z = 0; z < introItems.length; z++) {\n introItems[z] && tempIntroItems.push(introItems[z]); // copy non-empty values to the end of the array\n }\n\n introItems = tempIntroItems;\n\n //Ok, sort all items with given steps\n introItems.sort(function (a, b) {\n return a.step - b.step;\n });\n\n //set it to the introJs object\n self._introItems = introItems;\n\n //add overlay layer to the page\n if(_addOverlayLayer.call(self, targetElm)) {\n //then, start the show\n _nextStep.call(self);\n\n var skipButton = targetElm.querySelector('.introjs-skipbutton'),\n nextStepButton = targetElm.querySelector('.introjs-nextbutton');\n\n self._onKeyDown = function(e) {\n if (e.keyCode === 27 && self._options.exitOnEsc == true) {\n //escape key pressed, exit the intro\n //check if exit callback is defined\n if (self._introExitCallback != undefined) {\n self._introExitCallback.call(self);\n }\n _exitIntro.call(self, targetElm);\n } else if(e.keyCode === 37) {\n //left arrow\n _previousStep.call(self);\n } else if (e.keyCode === 39) {\n //right arrow\n _nextStep.call(self);\n } else if (e.keyCode === 13) {\n //srcElement === ie\n var target = e.target || e.srcElement;\n if (target && target.className.indexOf('introjs-prevbutton') > 0) {\n //user hit enter while focusing on previous button\n _previousStep.call(self);\n } else if (target && target.className.indexOf('introjs-skipbutton') > 0) {\n //user hit enter while focusing on skip button\n if (self._introItems.length - 1 == self._currentStep && typeof (self._introCompleteCallback) === 'function') {\n self._introCompleteCallback.call(self);\n }\n //check if any callback is defined\n if (self._introExitCallback != undefined) {\n self._introExitCallback.call(self);\n }\n _exitIntro.call(self, targetElm);\n } else {\n //default behavior for responding to enter\n _nextStep.call(self);\n }\n\n //prevent default behaviour on hitting Enter, to prevent steps being skipped in some browsers\n if(e.preventDefault) {\n e.preventDefault();\n } else {\n e.returnValue = false;\n }\n }\n };\n\n self._onResize = function(e) {\n _setHelperLayerPosition.call(self, document.querySelector('.introjs-helperLayer'));\n _setHelperLayerPosition.call(self, document.querySelector('.introjs-tooltipReferenceLayer'));\n };\n\n if (window.addEventListener) {\n if (this._options.keyboardNavigation) {\n window.addEventListener('keydown', self._onKeyDown, true);\n }\n //for window resize\n window.addEventListener('resize', self._onResize, true);\n } else if (document.attachEvent) { //IE\n if (this._options.keyboardNavigation) {\n document.attachEvent('onkeydown', self._onKeyDown);\n }\n //for window resize\n document.attachEvent('onresize', self._onResize);\n }\n }\n return false;\n }\n\n /*\n * makes a copy of the object\n * @api private\n * @method _cloneObject\n */\n function _cloneObject(object) {\n if (object == null || typeof (object) != 'object' || typeof (object.nodeType) != 'undefined') {\n return object;\n }\n var temp = {};\n for (var key in object) {\n if (typeof (jQuery) != 'undefined' && object[key] instanceof jQuery) {\n temp[key] = object[key];\n } else {\n temp[key] = _cloneObject(object[key]);\n }\n }\n return temp;\n }\n /**\n * Go to specific step of introduction\n *\n * @api private\n * @method _goToStep\n */\n function _goToStep(step) {\n //because steps starts with zero\n this._currentStep = step - 2;\n if (typeof (this._introItems) !== 'undefined') {\n _nextStep.call(this);\n }\n }\n\n /**\n * Go to next step on intro\n *\n * @api private\n * @method _nextStep\n */\n function _nextStep() {\n this._direction = 'forward';\n\n if (typeof (this._currentStep) === 'undefined') {\n this._currentStep = 0;\n } else {\n ++this._currentStep;\n }\n\n if ((this._introItems.length) <= this._currentStep) {\n //end of the intro\n //check if any callback is defined\n if (typeof (this._introCompleteCallback) === 'function') {\n this._introCompleteCallback.call(this);\n }\n _exitIntro.call(this, this._targetElement);\n return;\n }\n\n var nextStep = this._introItems[this._currentStep];\n if (typeof (this._introBeforeChangeCallback) !== 'undefined') {\n this._introBeforeChangeCallback.call(this, nextStep.element);\n }\n\n _showElement.call(this, nextStep);\n }\n\n /**\n * Go to previous step on intro\n *\n * @api private\n * @method _nextStep\n */\n function _previousStep() {\n this._direction = 'backward';\n\n if (this._currentStep === 0) {\n return false;\n }\n\n var nextStep = this._introItems[--this._currentStep];\n if (typeof (this._introBeforeChangeCallback) !== 'undefined') {\n this._introBeforeChangeCallback.call(this, nextStep.element);\n }\n\n _showElement.call(this, nextStep);\n }\n\n /**\n * Exit from intro\n *\n * @api private\n * @method _exitIntro\n * @param {Object} targetElement\n */\n function _exitIntro(targetElement) {\n //remove overlay layer from the page\n var overlayLayer = targetElement.querySelector('.introjs-overlay');\n\n //return if intro already completed or skipped\n if (overlayLayer == null) {\n return;\n }\n\n //for fade-out animation\n overlayLayer.style.opacity = 0;\n setTimeout(function () {\n if (overlayLayer.parentNode) {\n overlayLayer.parentNode.removeChild(overlayLayer);\n }\n }, 500);\n\n //remove all helper layers\n var helperLayer = targetElement.querySelector('.introjs-helperLayer');\n if (helperLayer) {\n helperLayer.parentNode.removeChild(helperLayer);\n }\n\n var referenceLayer = targetElement.querySelector('.introjs-tooltipReferenceLayer');\n if (referenceLayer) {\n referenceLayer.parentNode.removeChild(referenceLayer);\n }\n //remove disableInteractionLayer\n var disableInteractionLayer = targetElement.querySelector('.introjs-disableInteraction');\n if (disableInteractionLayer) {\n disableInteractionLayer.parentNode.removeChild(disableInteractionLayer);\n }\n\n //remove intro floating element\n var floatingElement = document.querySelector('.introjsFloatingElement');\n if (floatingElement) {\n floatingElement.parentNode.removeChild(floatingElement);\n }\n\n //remove `introjs-showElement` class from the element\n var showElement = document.querySelector('.introjs-showElement');\n if (showElement) {\n showElement.className = showElement.className.replace(/introjs-[a-zA-Z]+/g, '').replace(/^\\s+|\\s+$/g, ''); // This is a manual trim.\n }\n\n //remove `introjs-fixParent` class from the elements\n var fixParents = document.querySelectorAll('.introjs-fixParent');\n if (fixParents && fixParents.length > 0) {\n for (var i = fixParents.length - 1; i >= 0; i--) {\n fixParents[i].className = fixParents[i].className.replace(/introjs-fixParent/g, '').replace(/^\\s+|\\s+$/g, '');\n }\n }\n\n //clean listeners\n if (window.removeEventListener) {\n window.removeEventListener('keydown', this._onKeyDown, true);\n } else if (document.detachEvent) { //IE\n document.detachEvent('onkeydown', this._onKeyDown);\n }\n\n //set the step to zero\n this._currentStep = undefined;\n }\n\n /**\n * Render tooltip box in the page\n *\n * @api private\n * @method _placeTooltip\n * @param {HTMLElement} targetElement\n * @param {HTMLElement} tooltipLayer\n * @param {HTMLElement} arrowLayer\n * @param {HTMLElement} helperNumberLayer\n * @param {Boolean} hintMode\n */\n function _placeTooltip(targetElement, tooltipLayer, arrowLayer, helperNumberLayer, hintMode) {\n var tooltipCssClass = '',\n currentStepObj,\n tooltipOffset,\n targetOffset,\n windowSize,\n currentTooltipPosition;\n\n hintMode = hintMode || false;\n\n //reset the old style\n tooltipLayer.style.top = null;\n tooltipLayer.style.right = null;\n tooltipLayer.style.bottom = null;\n tooltipLayer.style.left = null;\n tooltipLayer.style.marginLeft = null;\n tooltipLayer.style.marginTop = null;\n\n arrowLayer.style.display = 'inherit';\n\n if (typeof(helperNumberLayer) != 'undefined' && helperNumberLayer != null) {\n helperNumberLayer.style.top = null;\n helperNumberLayer.style.left = null;\n }\n\n //prevent error when `this._currentStep` is undefined\n if (!this._introItems[this._currentStep]) return;\n\n //if we have a custom css class for each step\n currentStepObj = this._introItems[this._currentStep];\n if (typeof (currentStepObj.tooltipClass) === 'string') {\n tooltipCssClass = currentStepObj.tooltipClass;\n } else {\n tooltipCssClass = this._options.tooltipClass;\n }\n\n tooltipLayer.className = ('introjs-tooltip ' + tooltipCssClass).replace(/^\\s+|\\s+$/g, '');\n\n currentTooltipPosition = this._introItems[this._currentStep].position;\n if ((currentTooltipPosition == \"auto\" || this._options.tooltipPosition == \"auto\")) {\n if (currentTooltipPosition != \"floating\") { // Floating is always valid, no point in calculating\n currentTooltipPosition = _determineAutoPosition.call(this, targetElement, tooltipLayer, currentTooltipPosition);\n }\n }\n targetOffset = _getOffset(targetElement);\n tooltipOffset = _getOffset(tooltipLayer);\n windowSize = _getWinSize();\n\n switch (currentTooltipPosition) {\n case 'top':\n arrowLayer.className = 'introjs-arrow bottom';\n\n if (hintMode) {\n var tooltipLayerStyleLeft = 0;\n } else {\n var tooltipLayerStyleLeft = 15;\n }\n\n _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer);\n tooltipLayer.style.bottom = (targetOffset.height + 20) + 'px';\n break;\n case 'right':\n tooltipLayer.style.left = (targetOffset.width + 20) + 'px';\n if (targetOffset.top + tooltipOffset.height > windowSize.height) {\n // In this case, right would have fallen below the bottom of the screen.\n // Modify so that the bottom of the tooltip connects with the target\n arrowLayer.className = \"introjs-arrow left-bottom\";\n tooltipLayer.style.top = \"-\" + (tooltipOffset.height - targetOffset.height - 20) + \"px\";\n } else {\n arrowLayer.className = 'introjs-arrow left';\n }\n break;\n case 'left':\n if (!hintMode && this._options.showStepNumbers == true) {\n tooltipLayer.style.top = '15px';\n }\n\n if (targetOffset.top + tooltipOffset.height > windowSize.height) {\n // In this case, left would have fallen below the bottom of the screen.\n // Modify so that the bottom of the tooltip connects with the target\n tooltipLayer.style.top = \"-\" + (tooltipOffset.height - targetOffset.height - 20) + \"px\";\n arrowLayer.className = 'introjs-arrow right-bottom';\n } else {\n arrowLayer.className = 'introjs-arrow right';\n }\n tooltipLayer.style.right = (targetOffset.width + 20) + 'px';\n\n break;\n case 'floating':\n arrowLayer.style.display = 'none';\n\n //we have to adjust the top and left of layer manually for intro items without element\n tooltipLayer.style.left = '50%';\n tooltipLayer.style.top = '50%';\n tooltipLayer.style.marginLeft = '-' + (tooltipOffset.width / 2) + 'px';\n tooltipLayer.style.marginTop = '-' + (tooltipOffset.height / 2) + 'px';\n\n if (typeof(helperNumberLayer) != 'undefined' && helperNumberLayer != null) {\n helperNumberLayer.style.left = '-' + ((tooltipOffset.width / 2) + 18) + 'px';\n helperNumberLayer.style.top = '-' + ((tooltipOffset.height / 2) + 18) + 'px';\n }\n\n break;\n case 'bottom-right-aligned':\n arrowLayer.className = 'introjs-arrow top-right';\n\n var tooltipLayerStyleRight = 0;\n _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer);\n tooltipLayer.style.top = (targetOffset.height + 20) + 'px';\n break;\n\n case 'bottom-middle-aligned':\n arrowLayer.className = 'introjs-arrow top-middle';\n\n var tooltipLayerStyleLeftRight = targetOffset.width / 2 - tooltipOffset.width / 2;\n\n // a fix for middle aligned hints\n if (hintMode) {\n tooltipLayerStyleLeftRight += 5;\n }\n\n if (_checkLeft(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, tooltipLayer)) {\n tooltipLayer.style.right = null;\n _checkRight(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, windowSize, tooltipLayer);\n }\n tooltipLayer.style.top = (targetOffset.height + 20) + 'px';\n break;\n\n case 'bottom-left-aligned':\n // Bottom-left-aligned is the same as the default bottom\n case 'bottom':\n // Bottom going to follow the default behavior\n default:\n arrowLayer.className = 'introjs-arrow top';\n\n var tooltipLayerStyleLeft = 0;\n _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer);\n tooltipLayer.style.top = (targetOffset.height + 20) + 'px';\n break;\n }\n }\n\n /**\n * Set tooltip left so it doesn't go off the right side of the window\n *\n * @return boolean true, if tooltipLayerStyleLeft is ok. false, otherwise.\n */\n function _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer) {\n if (targetOffset.left + tooltipLayerStyleLeft + tooltipOffset.width > windowSize.width) {\n // off the right side of the window\n tooltipLayer.style.left = (windowSize.width - tooltipOffset.width - targetOffset.left) + 'px';\n return false;\n }\n tooltipLayer.style.left = tooltipLayerStyleLeft + 'px';\n return true;\n }\n\n /**\n * Set tooltip right so it doesn't go off the left side of the window\n *\n * @return boolean true, if tooltipLayerStyleRight is ok. false, otherwise.\n */\n function _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer) {\n if (targetOffset.left + targetOffset.width - tooltipLayerStyleRight - tooltipOffset.width < 0) {\n // off the left side of the window\n tooltipLayer.style.left = (-targetOffset.left) + 'px';\n return false;\n }\n tooltipLayer.style.right = tooltipLayerStyleRight + 'px';\n return true;\n }\n\n /**\n * Determines the position of the tooltip based on the position precedence and availability\n * of screen space.\n *\n * @param {Object} targetElement\n * @param {Object} tooltipLayer\n * @param {Object} desiredTooltipPosition\n *\n */\n function _determineAutoPosition(targetElement, tooltipLayer, desiredTooltipPosition) {\n\n // Take a clone of position precedence. These will be the available\n var possiblePositions = this._options.positionPrecedence.slice();\n\n var windowSize = _getWinSize();\n var tooltipHeight = _getOffset(tooltipLayer).height + 10;\n var tooltipWidth = _getOffset(tooltipLayer).width + 20;\n var targetOffset = _getOffset(targetElement);\n\n // If we check all the possible areas, and there are no valid places for the tooltip, the element\n // must take up most of the screen real estate. Show the tooltip floating in the middle of the screen.\n var calculatedPosition = \"floating\";\n\n // Check if the width of the tooltip + the starting point would spill off the right side of the screen\n // If no, neither bottom or top are valid\n if (targetOffset.left + tooltipWidth > windowSize.width || ((targetOffset.left + (targetOffset.width / 2)) - tooltipWidth) < 0) {\n _removeEntry(possiblePositions, \"bottom\");\n _removeEntry(possiblePositions, \"top\");\n } else {\n // Check for space below\n if ((targetOffset.height + targetOffset.top + tooltipHeight) > windowSize.height) {\n _removeEntry(possiblePositions, \"bottom\");\n }\n\n // Check for space above\n if (targetOffset.top - tooltipHeight < 0) {\n _removeEntry(possiblePositions, \"top\");\n }\n }\n\n // Check for space to the right\n if (targetOffset.width + targetOffset.left + tooltipWidth > windowSize.width) {\n _removeEntry(possiblePositions, \"right\");\n }\n\n // Check for space to the left\n if (targetOffset.left - tooltipWidth < 0) {\n _removeEntry(possiblePositions, \"left\");\n }\n\n // At this point, our array only has positions that are valid. Pick the first one, as it remains in order\n if (possiblePositions.length > 0) {\n calculatedPosition = possiblePositions[0];\n }\n\n // If the requested position is in the list, replace our calculated choice with that\n if (desiredTooltipPosition && desiredTooltipPosition != \"auto\") {\n if (possiblePositions.indexOf(desiredTooltipPosition) > -1) {\n calculatedPosition = desiredTooltipPosition;\n }\n }\n\n return calculatedPosition;\n }\n\n /**\n * Remove an entry from a string array if it's there, does nothing if it isn't there.\n *\n * @param {Array} stringArray\n * @param {String} stringToRemove\n */\n function _removeEntry(stringArray, stringToRemove) {\n if (stringArray.indexOf(stringToRemove) > -1) {\n stringArray.splice(stringArray.indexOf(stringToRemove), 1);\n }\n }\n\n /**\n * Update the position of the helper layer on the screen\n *\n * @api private\n * @method _setHelperLayerPosition\n * @param {Object} helperLayer\n */\n function _setHelperLayerPosition(helperLayer) {\n if (helperLayer) {\n //prevent error when `this._currentStep` in undefined\n if (!this._introItems[this._currentStep]) return;\n\n var currentElement = this._introItems[this._currentStep],\n elementPosition = _getOffset(currentElement.element),\n widthHeightPadding = 10;\n\n // If the target element is fixed, the tooltip should be fixed as well.\n // Otherwise, remove a fixed class that may be left over from the previous\n // step.\n if (_isFixed(currentElement.element)) {\n helperLayer.className += ' introjs-fixedTooltip';\n } else {\n helperLayer.className = helperLayer.className.replace(' introjs-fixedTooltip', '');\n }\n\n if (currentElement.position == 'floating') {\n widthHeightPadding = 0;\n }\n\n //set new position to helper layer\n helperLayer.setAttribute('style', 'width: ' + (elementPosition.width + widthHeightPadding) + 'px; ' +\n 'height:' + (elementPosition.height + widthHeightPadding) + 'px; ' +\n 'top:' + (elementPosition.top - 5) + 'px;' +\n 'left: ' + (elementPosition.left - 5) + 'px;');\n\n }\n }\n\n /**\n * Add disableinteraction layer and adjust the size and position of the layer\n *\n * @api private\n * @method _disableInteraction\n */\n function _disableInteraction() {\n var disableInteractionLayer = document.querySelector('.introjs-disableInteraction');\n if (disableInteractionLayer === null) {\n disableInteractionLayer = document.createElement('div');\n disableInteractionLayer.className = 'introjs-disableInteraction';\n this._targetElement.appendChild(disableInteractionLayer);\n }\n\n _setHelperLayerPosition.call(this, disableInteractionLayer);\n }\n\n /**\n * Setting anchors to behave like buttons\n *\n * @api private\n * @method _setAnchorAsButton\n */\n function _setAnchorAsButton(anchor){\n anchor.setAttribute('role', 'button');\n anchor.tabIndex = 0;\n }\n\n /**\n * Show an element on the page\n *\n * @api private\n * @method _showElement\n * @param {Object} targetElement\n */\n function _showElement(targetElement) {\n\n if (typeof (this._introChangeCallback) !== 'undefined') {\n this._introChangeCallback.call(this, targetElement.element);\n }\n\n var self = this,\n oldHelperLayer = document.querySelector('.introjs-helperLayer'),\n oldReferenceLayer = document.querySelector('.introjs-tooltipReferenceLayer'),\n highlightClass = 'introjs-helperLayer',\n elementPosition = _getOffset(targetElement.element);\n\n //check for a current step highlight class\n if (typeof (targetElement.highlightClass) === 'string') {\n highlightClass += (' ' + targetElement.highlightClass);\n }\n //check for options highlight class\n if (typeof (this._options.highlightClass) === 'string') {\n highlightClass += (' ' + this._options.highlightClass);\n }\n\n if (oldHelperLayer != null) {\n var oldHelperNumberLayer = oldReferenceLayer.querySelector('.introjs-helperNumberLayer'),\n oldtooltipLayer = oldReferenceLayer.querySelector('.introjs-tooltiptext'),\n oldArrowLayer = oldReferenceLayer.querySelector('.introjs-arrow'),\n oldtooltipContainer = oldReferenceLayer.querySelector('.introjs-tooltip'),\n skipTooltipButton = oldReferenceLayer.querySelector('.introjs-skipbutton'),\n prevTooltipButton = oldReferenceLayer.querySelector('.introjs-prevbutton'),\n nextTooltipButton = oldReferenceLayer.querySelector('.introjs-nextbutton');\n\n //update or reset the helper highlight class\n oldHelperLayer.className = highlightClass;\n //hide the tooltip\n oldtooltipContainer.style.opacity = 0;\n oldtooltipContainer.style.display = \"none\";\n\n if (oldHelperNumberLayer != null) {\n var lastIntroItem = this._introItems[(targetElement.step - 2 >= 0 ? targetElement.step - 2 : 0)];\n\n if (lastIntroItem != null && (this._direction == 'forward' && lastIntroItem.position == 'floating') || (this._direction == 'backward' && targetElement.position == 'floating')) {\n oldHelperNumberLayer.style.opacity = 0;\n }\n }\n\n //set new position to helper layer\n _setHelperLayerPosition.call(self, oldHelperLayer);\n _setHelperLayerPosition.call(self, oldReferenceLayer);\n\n //remove `introjs-fixParent` class from the elements\n var fixParents = document.querySelectorAll('.introjs-fixParent');\n if (fixParents && fixParents.length > 0) {\n for (var i = fixParents.length - 1; i >= 0; i--) {\n fixParents[i].className = fixParents[i].className.replace(/introjs-fixParent/g, '').replace(/^\\s+|\\s+$/g, '');\n };\n }\n\n //remove old classes if the element still exist\n var oldShowElement = document.querySelector('.introjs-showElement');\n if(oldShowElement) {\n oldShowElement.className = oldShowElement.className.replace(/introjs-[a-zA-Z]+/g, '').replace(/^\\s+|\\s+$/g, '');\n }\n\n //we should wait until the CSS3 transition is competed (it's 0.3 sec) to prevent incorrect `height` and `width` calculation\n if (self._lastShowElementTimer) {\n clearTimeout(self._lastShowElementTimer);\n }\n self._lastShowElementTimer = setTimeout(function() {\n //set current step to the label\n if (oldHelperNumberLayer != null) {\n oldHelperNumberLayer.innerHTML = targetElement.step;\n }\n //set current tooltip text\n oldtooltipLayer.innerHTML = targetElement.intro;\n //set the tooltip position\n oldtooltipContainer.style.display = \"block\";\n _placeTooltip.call(self, targetElement.element, oldtooltipContainer, oldArrowLayer, oldHelperNumberLayer);\n\n //change active bullet\n oldReferenceLayer.querySelector('.introjs-bullets li > a.active').className = '';\n oldReferenceLayer.querySelector('.introjs-bullets li > a[data-stepnumber=\"' + targetElement.step + '\"]').className = 'active';\n\n oldReferenceLayer.querySelector('.introjs-progress .introjs-progressbar').setAttribute('style', 'width:' + _getProgress.call(self) + '%;');\n\n //show the tooltip\n oldtooltipContainer.style.opacity = 1;\n if (oldHelperNumberLayer) oldHelperNumberLayer.style.opacity = 1;\n\n //reset button focus\n if (nextTooltipButton.tabIndex === -1) {\n //tabindex of -1 means we are at the end of the tour - focus on skip / done\n skipTooltipButton.focus();\n } else {\n //still in the tour, focus on next\n nextTooltipButton.focus();\n }\n }, 350);\n\n } else {\n var helperLayer = document.createElement('div'),\n referenceLayer = document.createElement('div'),\n arrowLayer = document.createElement('div'),\n tooltipLayer = document.createElement('div'),\n tooltipTextLayer = document.createElement('div'),\n bulletsLayer = document.createElement('div'),\n progressLayer = document.createElement('div'),\n buttonsLayer = document.createElement('div');\n\n helperLayer.className = highlightClass;\n referenceLayer.className = 'introjs-tooltipReferenceLayer';\n\n //set new position to helper layer\n _setHelperLayerPosition.call(self, helperLayer);\n _setHelperLayerPosition.call(self, referenceLayer);\n\n //add helper layer to target element\n this._targetElement.appendChild(helperLayer);\n this._targetElement.appendChild(referenceLayer);\n\n arrowLayer.className = 'introjs-arrow';\n\n tooltipTextLayer.className = 'introjs-tooltiptext';\n tooltipTextLayer.innerHTML = targetElement.intro;\n\n bulletsLayer.className = 'introjs-bullets';\n\n if (this._options.showBullets === false) {\n bulletsLayer.style.display = 'none';\n }\n\n var ulContainer = document.createElement('ul');\n\n for (var i = 0, stepsLength = this._introItems.length; i < stepsLength; i++) {\n var innerLi = document.createElement('li');\n var anchorLink = document.createElement('a');\n\n anchorLink.onclick = function() {\n self.goToStep(this.getAttribute('data-stepnumber'));\n };\n\n if (i === (targetElement.step-1)) anchorLink.className = 'active';\n\n _setAnchorAsButton(anchorLink);\n anchorLink.innerHTML = \" \";\n anchorLink.setAttribute('data-stepnumber', this._introItems[i].step);\n\n innerLi.appendChild(anchorLink);\n ulContainer.appendChild(innerLi);\n }\n\n bulletsLayer.appendChild(ulContainer);\n\n progressLayer.className = 'introjs-progress';\n\n if (this._options.showProgress === false) {\n progressLayer.style.display = 'none';\n }\n var progressBar = document.createElement('div');\n progressBar.className = 'introjs-progressbar';\n progressBar.setAttribute('style', 'width:' + _getProgress.call(this) + '%;');\n\n progressLayer.appendChild(progressBar);\n\n buttonsLayer.className = 'introjs-tooltipbuttons';\n if (this._options.showButtons === false) {\n buttonsLayer.style.display = 'none';\n }\n\n tooltipLayer.className = 'introjs-tooltip';\n tooltipLayer.appendChild(tooltipTextLayer);\n tooltipLayer.appendChild(bulletsLayer);\n tooltipLayer.appendChild(progressLayer);\n\n //add helper layer number\n if (this._options.showStepNumbers == true) {\n var helperNumberLayer = document.createElement('span');\n helperNumberLayer.className = 'introjs-helperNumberLayer';\n helperNumberLayer.innerHTML = targetElement.step;\n referenceLayer.appendChild(helperNumberLayer);\n }\n\n tooltipLayer.appendChild(arrowLayer);\n referenceLayer.appendChild(tooltipLayer);\n\n //next button\n var nextTooltipButton = document.createElement('a');\n\n nextTooltipButton.onclick = function() {\n if (self._introItems.length - 1 != self._currentStep) {\n _nextStep.call(self);\n }\n };\n\n _setAnchorAsButton(nextTooltipButton);\n nextTooltipButton.innerHTML = this._options.nextLabel;\n\n //previous button\n var prevTooltipButton = document.createElement('a');\n\n prevTooltipButton.onclick = function() {\n if (self._currentStep != 0) {\n _previousStep.call(self);\n }\n };\n\n _setAnchorAsButton(prevTooltipButton);\n prevTooltipButton.innerHTML = this._options.prevLabel;\n\n //skip button\n var skipTooltipButton = document.createElement('a');\n skipTooltipButton.className = 'introjs-button introjs-skipbutton';\n _setAnchorAsButton(skipTooltipButton);\n skipTooltipButton.innerHTML = this._options.skipLabel;\n\n skipTooltipButton.onclick = function() {\n if (self._introItems.length - 1 == self._currentStep && typeof (self._introCompleteCallback) === 'function') {\n self._introCompleteCallback.call(self);\n }\n\n if (self._introItems.length - 1 != self._currentStep && typeof (self._introExitCallback) === 'function') {\n self._introExitCallback.call(self);\n }\n\n _exitIntro.call(self, self._targetElement);\n };\n\n buttonsLayer.appendChild(skipTooltipButton);\n\n //in order to prevent displaying next/previous button always\n if (this._introItems.length > 1) {\n buttonsLayer.appendChild(prevTooltipButton);\n buttonsLayer.appendChild(nextTooltipButton);\n }\n\n tooltipLayer.appendChild(buttonsLayer);\n\n //set proper position\n _placeTooltip.call(self, targetElement.element, tooltipLayer, arrowLayer, helperNumberLayer);\n }\n\n //disable interaction\n if (this._options.disableInteraction === true) {\n _disableInteraction.call(self);\n }\n\n prevTooltipButton.removeAttribute('tabIndex');\n nextTooltipButton.removeAttribute('tabIndex');\n\n if (this._currentStep == 0 && this._introItems.length > 1) {\n nextTooltipButton.className = 'introjs-button introjs-nextbutton';\n\n if (this._options.hidePrev == true) {\n prevTooltipButton.className = 'introjs-button introjs-prevbutton introjs-hidden';\n nextTooltipButton.className += ' introjs-fullbutton';\n } else {\n prevTooltipButton.className = 'introjs-button introjs-prevbutton introjs-disabled';\n }\n\n prevTooltipButton.tabIndex = '-1';\n skipTooltipButton.innerHTML = this._options.skipLabel;\n } else if (this._introItems.length - 1 == this._currentStep || this._introItems.length == 1) {\n skipTooltipButton.innerHTML = this._options.doneLabel;\n prevTooltipButton.className = 'introjs-button introjs-prevbutton';\n\n if (this._options.hideNext == true) {\n nextTooltipButton.className = 'introjs-button introjs-nextbutton introjs-hidden';\n prevTooltipButton.className += ' introjs-fullbutton';\n } else {\n nextTooltipButton.className = 'introjs-button introjs-nextbutton introjs-disabled';\n }\n\n nextTooltipButton.tabIndex = '-1';\n } else {\n prevTooltipButton.className = 'introjs-button introjs-prevbutton';\n nextTooltipButton.className = 'introjs-button introjs-nextbutton';\n skipTooltipButton.innerHTML = this._options.skipLabel;\n }\n\n //Set focus on \"next\" button, so that hitting Enter always moves you onto the next step\n nextTooltipButton.focus();\n\n //add target element position style\n targetElement.element.className += ' introjs-showElement';\n\n var currentElementPosition = _getPropValue(targetElement.element, 'position');\n if (currentElementPosition !== 'absolute' &&\n currentElementPosition !== 'relative' &&\n currentElementPosition !== 'fixed') {\n //change to new intro item\n targetElement.element.className += ' introjs-relativePosition';\n }\n\n var parentElm = targetElement.element.parentNode;\n while (parentElm != null) {\n if (!parentElm.tagName || parentElm.tagName.toLowerCase() === 'body') break;\n\n //fix The Stacking Context problem.\n //More detail: https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Understanding_z_index/The_stacking_context\n var zIndex = _getPropValue(parentElm, 'z-index');\n var opacity = parseFloat(_getPropValue(parentElm, 'opacity'));\n var transform = _getPropValue(parentElm, 'transform') || _getPropValue(parentElm, '-webkit-transform') || _getPropValue(parentElm, '-moz-transform') || _getPropValue(parentElm, '-ms-transform') || _getPropValue(parentElm, '-o-transform');\n if (/[0-9]+/.test(zIndex) || opacity < 1 || (transform !== 'none' && transform !== undefined)) {\n parentElm.className += ' introjs-fixParent';\n }\n\n parentElm = parentElm.parentNode;\n }\n\n if (!_elementInViewport(targetElement.element) && this._options.scrollToElement === true) {\n var rect = targetElement.element.getBoundingClientRect(),\n winHeight = _getWinSize().height,\n top = rect.bottom - (rect.bottom - rect.top),\n bottom = rect.bottom - winHeight;\n\n //Scroll up\n if (top < 0 || targetElement.element.clientHeight > winHeight) {\n window.scrollBy(0, top - this._options.scrollPadding); // 30px padding from edge to look nice\n\n //Scroll down\n } else {\n window.scrollBy(0, bottom + 70 + this._options.scrollPadding); // 70px + 30px padding from edge to look nice\n }\n }\n\n if (typeof (this._introAfterChangeCallback) !== 'undefined') {\n this._introAfterChangeCallback.call(this, targetElement.element);\n }\n }\n\n /**\n * Get an element CSS property on the page\n * Thanks to JavaScript Kit: http://www.javascriptkit.com/dhtmltutors/dhtmlcascade4.shtml\n *\n * @api private\n * @method _getPropValue\n * @param {Object} element\n * @param {String} propName\n * @returns Element's property value\n */\n function _getPropValue (element, propName) {\n var propValue = '';\n if (element.currentStyle) { //IE\n propValue = element.currentStyle[propName];\n } else if (document.defaultView && document.defaultView.getComputedStyle) { //Others\n propValue = document.defaultView.getComputedStyle(element, null).getPropertyValue(propName);\n }\n\n //Prevent exception in IE\n if (propValue && propValue.toLowerCase) {\n return propValue.toLowerCase();\n } else {\n return propValue;\n }\n };\n\n /**\n * Checks to see if target element (or parents) position is fixed or not\n *\n * @api private\n * @method _isFixed\n * @param {Object} element\n * @returns Boolean\n */\n function _isFixed (element) {\n var p = element.parentNode;\n\n if (!p || p.nodeName === 'HTML') {\n return false;\n }\n\n if (_getPropValue(element, 'position') == 'fixed') {\n return true;\n }\n\n return _isFixed(p);\n };\n\n /**\n * Provides a cross-browser way to get the screen dimensions\n * via: http://stackoverflow.com/questions/5864467/internet-explorer-innerheight\n *\n * @api private\n * @method _getWinSize\n * @returns {Object} width and height attributes\n */\n function _getWinSize() {\n if (window.innerWidth != undefined) {\n return { width: window.innerWidth, height: window.innerHeight };\n } else {\n var D = document.documentElement;\n return { width: D.clientWidth, height: D.clientHeight };\n }\n }\n\n /**\n * Check to see if the element is in the viewport or not\n * http://stackoverflow.com/questions/123999/how-to-tell-if-a-dom-element-is-visible-in-the-current-viewport\n *\n * @api private\n * @method _elementInViewport\n * @param {Object} el\n */\n function _elementInViewport(el) {\n var rect = el.getBoundingClientRect();\n\n return (\n rect.top >= 0 &&\n rect.left >= 0 &&\n (rect.bottom+80) <= window.innerHeight && // add 80 to get the text right\n rect.right <= window.innerWidth\n );\n }\n\n /**\n * Add overlay layer to the page\n *\n * @api private\n * @method _addOverlayLayer\n * @param {Object} targetElm\n */\n function _addOverlayLayer(targetElm) {\n var overlayLayer = document.createElement('div'),\n styleText = '',\n self = this;\n\n //set css class name\n overlayLayer.className = 'introjs-overlay';\n\n //check if the target element is body, we should calculate the size of overlay layer in a better way\n if (!targetElm.tagName || targetElm.tagName.toLowerCase() === 'body') {\n styleText += 'top: 0;bottom: 0; left: 0;right: 0;position: fixed;';\n overlayLayer.setAttribute('style', styleText);\n } else {\n //set overlay layer position\n var elementPosition = _getOffset(targetElm);\n if (elementPosition) {\n styleText += 'width: ' + elementPosition.width + 'px; height:' + elementPosition.height + 'px; top:' + elementPosition.top + 'px;left: ' + elementPosition.left + 'px;';\n overlayLayer.setAttribute('style', styleText);\n }\n }\n\n targetElm.appendChild(overlayLayer);\n\n overlayLayer.onclick = function() {\n if (self._options.exitOnOverlayClick == true) {\n\n //check if any callback is defined\n if (self._introExitCallback != undefined) {\n self._introExitCallback.call(self);\n }\n _exitIntro.call(self, targetElm);\n }\n };\n\n setTimeout(function() {\n styleText += 'opacity: ' + self._options.overlayOpacity.toString() + ';';\n overlayLayer.setAttribute('style', styleText);\n }, 10);\n\n return true;\n };\n\n /**\n * Removes open hint (tooltip hint)\n *\n * @api private\n * @method _removeHintTooltip\n */\n function _removeHintTooltip() {\n var tooltip = this._targetElement.querySelector('.introjs-hintReference');\n\n if (tooltip) {\n var step = tooltip.getAttribute('data-step');\n tooltip.parentNode.removeChild(tooltip);\n return step;\n }\n };\n\n /**\n * Start parsing hint items\n *\n * @api private\n * @param {Object} targetElm\n * @method _startHint\n */\n function _populateHints(targetElm) {\n var self = this;\n this._introItems = []\n\n if (this._options.hints) {\n for (var i = 0, l = this._options.hints.length; i < l; i++) {\n var currentItem = _cloneObject(this._options.hints[i]);\n\n if (typeof(currentItem.element) === 'string') {\n //grab the element with given selector from the page\n currentItem.element = document.querySelector(currentItem.element);\n }\n\n currentItem.hintPosition = currentItem.hintPosition || this._options.hintPosition;\n currentItem.hintAnimation = currentItem.hintAnimation || this._options.hintAnimation;\n\n if (currentItem.element != null) {\n this._introItems.push(currentItem);\n }\n }\n } else {\n var hints = targetElm.querySelectorAll('*[data-hint]');\n\n if (hints.length < 1) {\n return false;\n }\n\n //first add intro items with data-step\n for (var i = 0, l = hints.length; i < l; i++) {\n var currentElement = hints[i];\n\n // hint animation\n var hintAnimation = currentElement.getAttribute('data-hintAnimation');\n\n if (hintAnimation) {\n hintAnimation = (hintAnimation == 'true');\n } else {\n hintAnimation = this._options.hintAnimation;\n }\n\n this._introItems.push({\n element: currentElement,\n hint: currentElement.getAttribute('data-hint'),\n hintPosition: currentElement.getAttribute('data-hintPosition') || this._options.hintPosition,\n hintAnimation: hintAnimation,\n tooltipClass: currentElement.getAttribute('data-tooltipClass'),\n position: currentElement.getAttribute('data-position') || this._options.tooltipPosition\n });\n }\n }\n\n _addHints.call(this);\n\n if (document.addEventListener) {\n document.addEventListener('click', _removeHintTooltip.bind(this), false);\n //for window resize\n window.addEventListener('resize', _reAlignHints.bind(this), true);\n } else if (document.attachEvent) { //IE\n //for window resize\n document.attachEvent('onclick', _removeHintTooltip.bind(this));\n document.attachEvent('onresize', _reAlignHints.bind(this));\n }\n };\n\n /**\n * Re-aligns all hint elements\n *\n * @api private\n * @method _reAlignHints\n */\n function _reAlignHints() {\n for (var i = 0, l = this._introItems.length; i < l; i++) {\n var item = this._introItems[i];\n\n if (typeof (item.targetElement) == 'undefined') continue;\n\n _alignHintPosition.call(this, item.hintPosition, item.element, item.targetElement)\n }\n }\n\n /**\n * Hide a hint\n *\n * @api private\n * @method _hideHint\n */\n function _hideHint(stepId) {\n _removeHintTooltip.call(this);\n var hint = this._targetElement.querySelector('.introjs-hint[data-step=\"' + stepId + '\"]');\n\n if (hint) {\n hint.className += ' introjs-hidehint';\n }\n\n // call the callback function (if any)\n if (typeof (this._hintCloseCallback) !== 'undefined') {\n this._hintCloseCallback.call(this, stepId);\n }\n };\n\n /**\n * Hide all hints\n *\n * @api private\n * @method _hideHints\n */\n function _hideHints() {\n var hints = this._targetElement.querySelectorAll('.introjs-hint');\n\n if (hints && hints.length > 0) {\n for (var i = 0; i < hints.length; i++) {\n _hideHint.call(this, hints[i].getAttribute('data-step'));\n }\n }\n };\n\n /**\n * Add all available hints to the page\n *\n * @api private\n * @method _addHints\n */\n function _addHints() {\n var self = this;\n\n var oldHintsWrapper = document.querySelector('.introjs-hints');\n\n if (oldHintsWrapper != null) {\n hintsWrapper = oldHintsWrapper;\n } else {\n var hintsWrapper = document.createElement('div');\n hintsWrapper.className = 'introjs-hints';\n }\n\n for (var i = 0, l = this._introItems.length; i < l; i++) {\n var item = this._introItems[i];\n\n // avoid append a hint twice\n if (document.querySelector('.introjs-hint[data-step=\"' + i + '\"]'))\n continue;\n\n var hint = document.createElement('a');\n _setAnchorAsButton(hint);\n\n (function (hint, item, i) {\n // when user clicks on the hint element\n hint.onclick = function(e) {\n var evt = e ? e : window.event;\n if (evt.stopPropagation) evt.stopPropagation();\n if (evt.cancelBubble != null) evt.cancelBubble = true;\n\n _hintClick.call(self, hint, item, i);\n };\n }(hint, item, i));\n\n hint.className = 'introjs-hint';\n\n if (!item.hintAnimation) {\n hint.className += ' introjs-hint-no-anim';\n }\n\n // hint's position should be fixed if the target element's position is fixed\n if (_isFixed(item.element)) {\n hint.className += ' introjs-fixedhint';\n }\n\n var hintDot = document.createElement('div');\n hintDot.className = 'introjs-hint-dot';\n var hintPulse = document.createElement('div');\n hintPulse.className = 'introjs-hint-pulse';\n\n hint.appendChild(hintDot);\n hint.appendChild(hintPulse);\n hint.setAttribute('data-step', i);\n\n // we swap the hint element with target element\n // because _setHelperLayerPosition uses `element` property\n item.targetElement = item.element;\n item.element = hint;\n\n // align the hint position\n _alignHintPosition.call(this, item.hintPosition, hint, item.targetElement);\n\n hintsWrapper.appendChild(hint);\n }\n\n // adding the hints wrapper\n document.body.appendChild(hintsWrapper);\n\n // call the callback function (if any)\n if (typeof (this._hintsAddedCallback) !== 'undefined') {\n this._hintsAddedCallback.call(this);\n }\n };\n\n /**\n * Aligns hint position\n *\n * @api private\n * @method _alignHintPosition\n * @param {String} position\n * @param {Object} hint\n * @param {Object} element\n */\n function _alignHintPosition(position, hint, element) {\n // get/calculate offset of target element\n var offset = _getOffset.call(this, element);\n\n // align the hint element\n switch (position) {\n default:\n case 'top-left':\n hint.style.left = offset.left + 'px';\n hint.style.top = offset.top + 'px';\n break;\n case 'top-right':\n hint.style.left = (offset.left + offset.width) + 'px';\n hint.style.top = offset.top + 'px';\n break;\n case 'bottom-left':\n hint.style.left = offset.left + 'px';\n hint.style.top = (offset.top + offset.height) + 'px';\n break;\n case 'bottom-right':\n hint.style.left = (offset.left + offset.width) + 'px';\n hint.style.top = (offset.top + offset.height) + 'px';\n break;\n case 'bottom-middle':\n hint.style.left = (offset.left + (offset.width / 2)) + 'px';\n hint.style.top = (offset.top + offset.height) + 'px';\n break;\n case 'top-middle':\n hint.style.left = (offset.left + (offset.width / 2)) + 'px';\n hint.style.top = offset.top + 'px';\n break;\n }\n };\n\n /**\n * Triggers when user clicks on the hint element\n *\n * @api private\n * @method _hintClick\n * @param {Object} hintElement\n * @param {Object} item\n * @param {Number} stepId\n */\n function _hintClick(hintElement, item, stepId) {\n // call the callback function (if any)\n if (typeof (this._hintClickCallback) !== 'undefined') {\n this._hintClickCallback.call(this, hintElement, item, stepId);\n }\n\n // remove all open tooltips\n var removedStep = _removeHintTooltip.call(this);\n\n // to toggle the tooltip\n if (parseInt(removedStep, 10) == stepId) {\n return;\n }\n\n var tooltipLayer = document.createElement('div');\n var tooltipTextLayer = document.createElement('div');\n var arrowLayer = document.createElement('div');\n var referenceLayer = document.createElement('div');\n\n tooltipLayer.className = 'introjs-tooltip';\n\n tooltipLayer.onclick = function (e) {\n //IE9 & Other Browsers\n if (e.stopPropagation) {\n e.stopPropagation();\n }\n //IE8 and Lower\n else {\n e.cancelBubble = true;\n }\n };\n\n tooltipTextLayer.className = 'introjs-tooltiptext';\n\n var tooltipWrapper = document.createElement('p');\n tooltipWrapper.innerHTML = item.hint;\n\n var closeButton = document.createElement('a');\n closeButton.className = 'introjs-button';\n closeButton.innerHTML = this._options.hintButtonLabel;\n closeButton.onclick = _hideHint.bind(this, stepId);\n\n tooltipTextLayer.appendChild(tooltipWrapper);\n tooltipTextLayer.appendChild(closeButton);\n\n arrowLayer.className = 'introjs-arrow';\n tooltipLayer.appendChild(arrowLayer);\n\n tooltipLayer.appendChild(tooltipTextLayer);\n\n // set current step for _placeTooltip function\n this._currentStep = hintElement.getAttribute('data-step');\n\n // align reference layer position\n referenceLayer.className = 'introjs-tooltipReferenceLayer introjs-hintReference';\n referenceLayer.setAttribute('data-step', hintElement.getAttribute('data-step'));\n _setHelperLayerPosition.call(this, referenceLayer);\n\n referenceLayer.appendChild(tooltipLayer);\n document.body.appendChild(referenceLayer);\n\n //set proper position\n _placeTooltip.call(this, hintElement, tooltipLayer, arrowLayer, null, true);\n };\n\n /**\n * Get an element position on the page\n * Thanks to `meouw`: http://stackoverflow.com/a/442474/375966\n *\n * @api private\n * @method _getOffset\n * @param {Object} element\n * @returns Element's position info\n */\n function _getOffset(element) {\n var elementPosition = {};\n\n //set width\n elementPosition.width = element.offsetWidth;\n\n //set height\n elementPosition.height = element.offsetHeight;\n\n //calculate element top and left\n var _x = 0;\n var _y = 0;\n while (element && !isNaN(element.offsetLeft) && !isNaN(element.offsetTop)) {\n _x += element.offsetLeft;\n _y += element.offsetTop;\n element = element.offsetParent;\n }\n //set top\n elementPosition.top = _y;\n //set left\n elementPosition.left = _x;\n\n return elementPosition;\n };\n\n /**\n * Gets the current progress percentage\n *\n * @api private\n * @method _getProgress\n * @returns current progress percentage\n */\n function _getProgress() {\n // Steps are 0 indexed\n var currentStep = parseInt((this._currentStep + 1), 10);\n return ((currentStep / this._introItems.length) * 100);\n };\n\n /**\n * Overwrites obj1's values with obj2's and adds obj2's if non existent in obj1\n * via: http://stackoverflow.com/questions/171251/how-can-i-merge-properties-of-two-javascript-objects-dynamically\n *\n * @param obj1\n * @param obj2\n * @returns obj3 a new object based on obj1 and obj2\n */\n function _mergeOptions(obj1,obj2) {\n var obj3 = {};\n for (var attrname in obj1) { obj3[attrname] = obj1[attrname]; }\n for (var attrname in obj2) { obj3[attrname] = obj2[attrname]; }\n return obj3;\n };\n\n var introJs = function (targetElm) {\n if (typeof (targetElm) === 'object') {\n //Ok, create a new instance\n return new IntroJs(targetElm);\n\n } else if (typeof (targetElm) === 'string') {\n //select the target element with query selector\n var targetElement = document.querySelector(targetElm);\n\n if (targetElement) {\n return new IntroJs(targetElement);\n } else {\n throw new Error('There is no element with given selector.');\n }\n } else {\n return new IntroJs(document.body);\n }\n };\n\n /**\n * Current IntroJs version\n *\n * @property version\n * @type String\n */\n introJs.version = VERSION;\n\n //Prototype\n introJs.fn = IntroJs.prototype = {\n clone: function () {\n return new IntroJs(this);\n },\n setOption: function(option, value) {\n this._options[option] = value;\n return this;\n },\n setOptions: function(options) {\n this._options = _mergeOptions(this._options, options);\n return this;\n },\n start: function () {\n _introForElement.call(this, this._targetElement);\n return this;\n },\n goToStep: function(step) {\n _goToStep.call(this, step);\n return this;\n },\n nextStep: function() {\n _nextStep.call(this);\n return this;\n },\n previousStep: function() {\n _previousStep.call(this);\n return this;\n },\n exit: function() {\n _exitIntro.call(this, this._targetElement);\n return this;\n },\n refresh: function() {\n // re-align intros\n _setHelperLayerPosition.call(this, document.querySelector('.introjs-helperLayer'));\n _setHelperLayerPosition.call(this, document.querySelector('.introjs-tooltipReferenceLayer'));\n\n //re-align hints\n _reAlignHints.call(this);\n return this;\n },\n onbeforechange: function(providedCallback) {\n if (typeof (providedCallback) === 'function') {\n this._introBeforeChangeCallback = providedCallback;\n } else {\n throw new Error('Provided callback for onbeforechange was not a function');\n }\n return this;\n },\n onchange: function(providedCallback) {\n if (typeof (providedCallback) === 'function') {\n this._introChangeCallback = providedCallback;\n } else {\n throw new Error('Provided callback for onchange was not a function.');\n }\n return this;\n },\n onafterchange: function(providedCallback) {\n if (typeof (providedCallback) === 'function') {\n this._introAfterChangeCallback = providedCallback;\n } else {\n throw new Error('Provided callback for onafterchange was not a function');\n }\n return this;\n },\n oncomplete: function(providedCallback) {\n if (typeof (providedCallback) === 'function') {\n this._introCompleteCallback = providedCallback;\n } else {\n throw new Error('Provided callback for oncomplete was not a function.');\n }\n return this;\n },\n onhintsadded: function(providedCallback) {\n if (typeof (providedCallback) === 'function') {\n this._hintsAddedCallback = providedCallback;\n } else {\n throw new Error('Provided callback for onhintsadded was not a function.');\n }\n return this;\n },\n onhintclick: function(providedCallback) {\n if (typeof (providedCallback) === 'function') {\n this._hintClickCallback = providedCallback;\n } else {\n throw new Error('Provided callback for onhintclick was not a function.');\n }\n return this;\n },\n onhintclose: function(providedCallback) {\n if (typeof (providedCallback) === 'function') {\n this._hintCloseCallback = providedCallback;\n } else {\n throw new Error('Provided callback for onhintclose was not a function.');\n }\n return this;\n },\n onexit: function(providedCallback) {\n if (typeof (providedCallback) === 'function') {\n this._introExitCallback = providedCallback;\n } else {\n throw new Error('Provided callback for onexit was not a function.');\n }\n return this;\n },\n addHints: function() {\n _populateHints.call(this, this._targetElement);\n return this;\n },\n hideHint: function (stepId) {\n _hideHint.call(this, stepId);\n return this;\n },\n hideHints: function () {\n _hideHints.call(this);\n return this;\n }\n };\n\n exports.introJs = introJs;\n return introJs;\n}));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/intro.js/intro.js\n// module id = 1023\n// module chunks = 34","(function(){\nif( !('ace' in window) ) window['ace'] = {}\n\nace.config = {\n storage_method: 0, //0 means use localStorage if available otherwise cookies, 1 means localStorage, 2 means cookies\n cookie_expiry : 604800, //(cookie only) 1 week duration for saved settings\n cookie_path: ''//(cookie only)\n}\nif( !('vars' in window['ace']) ) window['ace'].vars = {}\nace.vars['very_old_ie']\t= !('querySelector' in document.documentElement);\n\nace.settings = {\n\tsaveState : function(element, attrName, attrVal, append) {\n\t\tif( !element || (typeof element == 'string' && !(element = document.getElementById(element))) || !element.hasAttribute('id') ) return false;\n\t\tif( !ace.hasClass(element, 'ace-save-state') ) return false;\n\t\t\n\t\tvar attrName = attrName || 'class';\n\t\tvar id = element.getAttribute('id');\n\t\t\n\t\tvar attrList = ace.data.get('state', 'id-'+id) || {};\n\t\tif(typeof attrList == 'string') {\n\t\t\ttry {\n\t\t\t\tattrList = JSON.parse(attrList);\n\t\t\t}\n\t\t\tcatch(e) {\n\t\t\t\tattrList = {}\n\t\t\t}\n\t\t}\n\n\t\tvar newVal, hasCustomVal = typeof attrVal !== 'undefined', $delete = false;\n\t\t\n\t\tvar re1 = /class/i\n\t\tvar re2 = /checked|disabled|readonly|value/i\n\n\t\tif(re2.test(attrName)) newVal = hasCustomVal ? attrVal : element[attrName];\n\t\telse {\n\t\t\tif(element.hasAttribute(attrName)) {\n\t\t\t\tnewVal = hasCustomVal ? attrVal : element.getAttribute(attrName);\n\t\t\t}\n\t\t\telse if(!hasCustomVal) $delete = true;\n\t\t\t//delete this, because element has no such attribute and we haven't given a custom value! (no attrVal)\n\t\t}\n\t\t\n\t\n\t\tif($delete) {\n\t\t\tdelete attrList[attrName];\n\t\t}\n\t\telse {\n\t\t\t//save class names as an object which indicated which classes should be included or excluded (true/false)\n\t\t\tif( re1.test(attrName) ) {//class\n\t\t\t\n\t\t\t\t\n\t\t\t\tif( !attrList.hasOwnProperty(attrName) ) attrList[attrName] = {}\n\t\t\t\tif(append === true) {\n\t\t\t\t\t//append to previous value\t\t\t\t\t\n\t\t\t\t\tattrList[attrName][newVal] = 1;\n\t\t\t\t}\n\t\t\t\telse if(append === false) {\n\t\t\t\t\t//remove from previous value\n\t\t\t\t\tattrList[attrName][newVal] = -1;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tattrList[attrName]['className'] = newVal;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\telse {\n\t\t\t\tattrList[attrName] = newVal;\n\t\t\t}\n\t\t}\n\t\t\n\t\tace.data.set('state', 'id-'+id , JSON.stringify(attrList));\n\t},\n\t\n\tloadState : function(element, attrName) {\n\t\tif( !element || (typeof element == 'string' && !(element = document.getElementById(element))) || !element.hasAttribute('id') ) return false;\n\t\t\n\t\tvar id = element.getAttribute('id');\n\t\tvar attrList = ace.data.get('state', 'id-'+id) || {};\n\t\tif(typeof attrList == 'string') {\n\t\t\ttry {\n\t\t\t\tattrList = JSON.parse(attrList);\n\t\t\t}\n\t\t\tcatch(e) {\n\t\t\t\tattrList = {}\n\t\t\t}\n\t\t}\n\t\t\n\t\tvar setAttr = function(element, attr, val) {\n\t\t\tvar re1 = /class/i\n\t\t\tvar re2 = /checked|disabled|readonly|value/i\n\t\t\t\n\t\t\tif(re1.test(attr)) {\n\t\t\t\tif(typeof val === 'object') {\n\t\t\t\t\tif('className' in val) element.setAttribute('class', val['className']);\n\t\t\t\t\tfor(var key in val) if(val.hasOwnProperty(key)) {\n\t\t\t\t\t\tvar append = val[key];\n\t\t\t\t\t\tif(append == 1) ace.addClass(element, key);\n\t\t\t\t\t\telse if(append == -1) ace.removeClass(element, key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t//else if(typeof ace.addClass(element, val);\n\t\t\t}\n\t\t\telse if(re2.test(attr)) element[attr] = val;\n\t\t\telse element.setAttribute(attr, val);\n\t\t}\n\t\t\n\t\tif(attrName !== undefined) {\n\t\t\tif(attrList.hasOwnProperty(attrName) && attrList[attrName] !== null) setAttr(element, attrName, attrList[attrName]);\n\t\t}\n\t\telse {\n\t\t\tfor(var name in attrList) {\n\t\t\t\tif(attrList.hasOwnProperty(name) && attrList[name] !== null) setAttr(element, name, attrList[name]);\n\t\t\t}\n\t\t}\n\t},\n\t\n\tclearState : function(element) {\n\t\tvar id = null;\n\t\tif(typeof element === 'string') {\n\t\t\tid = element;\n\t\t}\n\t\telse if('hasAttribute' in element && element.hasAttribute('id')) {\n\t\t\tid = element.getAttribute('id');\n\t\t}\n\t\tif(id) ace.data.remove('state', 'id-'+id);\n\t}\n};\n\n\n\n\n(function() {\n\t//detect if it is supported\n\t//https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Animations/Detecting_CSS_animation_support\n\tvar animationSupport = function() {\n\t\tvar animation = false,\n\t\tanimationstring = 'animation',\n\t\tkeyframeprefix = '',\n\t\tdomPrefixes = 'Webkit Moz O ms Khtml'.split(' '),\n\t\tpfx = '',\n\t\telm = document.createElement('div');\n\n\t\tif( elm.style.animationName !== undefined ) { animation = true; } \n\n\t\tif( animation === false ) {\n\t\t for( var i = 0; i < domPrefixes.length; i++ ) {\n\t\t\tif( elm.style[ domPrefixes[i] + 'AnimationName' ] !== undefined ) {\n\t\t\t pfx = domPrefixes[ i ];\n\t\t\t animationstring = pfx + 'Animation';\n\t\t\t keyframeprefix = '-' + pfx.toLowerCase() + '-';\n\t\t\t animation = true;\n\t\t\t break;\n\t\t\t}\n\t\t }\n\t\t}\n\t\t\n\t\treturn animation;\n\t}\n\t\n\tace.vars['animation'] = animationSupport();\n\tif( ace.vars['animation'] ) {\n\t\t//based on http://www.backalleycoder.com/2012/04/25/i-want-a-damnodeinserted/\n\n\t\tvar animationCSS = \"@keyframes nodeInserted{from{outline-color:#fff}to{outline-color:#000}}@-moz-keyframes nodeInserted{from{outline-color:#fff}to{outline-color:#000}}@-webkit-keyframes nodeInserted{from{outline-color:#fff}to{outline-color:#000}}@-ms-keyframes nodeInserted{from{outline-color:#fff}to{outline-color:#000}}@-o-keyframes nodeInserted{from{outline-color:#fff}to{outline-color:#000}}.ace-save-state{animation-duration:10ms;-o-animation-duration:10ms;-ms-animation-duration:10ms;-moz-animation-duration:10ms;-webkit-animation-duration:10ms;animation-delay:0s;-o-animation-delay:0s;-ms-animation-delay:0s;-moz-animation-delay:0s;-webkit-animation-delay:0s;animation-name:nodeInserted;-o-animation-name:nodeInserted;-ms-animation-name:nodeInserted;-moz-animation-name:nodeInserted;-webkit-animation-name:nodeInserted}\";\n\t\tvar animationNode = document.createElement('style');\n\t\tanimationNode.innerHTML = animationCSS;\n\t\tdocument.head.appendChild(animationNode);\n\t\n\t\tvar domInsertEvent = function(event) {\n\t\t\tvar element = event.target;\n\t\t\tif( !element || !ace.hasClass(element, 'ace-save-state') ) return;\n\t\t\t\n\t\t\tace.settings.loadState(element);\n\t\t}\n\n\t\tdocument.addEventListener('animationstart', domInsertEvent, false);\n\t\tdocument.addEventListener('MSAnimationStart', domInsertEvent, false);\n\t\tdocument.addEventListener('webkitAnimationStart', domInsertEvent, false);\n\t}\n\telse {\n\t\t//if animation events are not supported, wait for document ready event\n\t\tvar documentReady = function() {\n\t\t\tvar list = document.querySelectorAll('.ace-save-state');\n\t\t\tfor(var i = 0 ; i < list.length ; i++) ace.settings.loadState(list[i]);\n\t\t}\n\t\t\n\t\tif(document.readyState == 'complete') documentReady();\n\t\telse if(document.addEventListener) document.addEventListener('DOMContentLoaded', documentReady, false);\n\t\telse if(document.attachEvent) document.attachEvent('onreadystatechange', function(){\n\t\t\tif (document.readyState == 'complete') documentReady();\n\t\t});\n\t}\n})();\n\n\n\n\n\n\n//save/retrieve data using localStorage or cookie\n//method == 1, use localStorage\n//method == 2, use cookies\n//method not specified, use localStorage if available, otherwise cookies\nace.data_storage = function(method, undefined) {\n\tvar prefix = 'ace_';\n\n\tvar storage = null;\n\tvar type = 0;\n\t\n\tif((method == 1 || method === undefined || method == 0) && 'localStorage' in window && window['localStorage'] !== null) {\n\t\tstorage = ace.storage;\n\t\ttype = 1;\n\t}\n\telse if(storage == null && (method == 2 || method === undefined) && 'cookie' in document && document['cookie'] !== null) {\n\t\tstorage = ace.cookie;\n\t\ttype = 2;\n\t}\n\t\n\n\tthis.set = function(namespace, key, value, path, is_obj, undefined) {\n\t\tif(!storage) return;\n\t\t\n\t\tif(value === undefined) {//no namespace here?\n\t\t\tvalue = key;\n\t\t\tkey = namespace;\n\n\t\t\tif(value == null) storage.remove(prefix+key)\n\t\t\telse {\n\t\t\t\tif(type == 1)\n\t\t\t\t\tstorage.set(prefix+key, value)\n\t\t\t\telse if(type == 2)\n\t\t\t\t\tstorage.set(prefix+key, value, ace.config.cookie_expiry, path || ace.config.cookie_path)\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tif(type == 1) {//localStorage\n\t\t\t\tif(value == null) storage.remove(prefix+namespace+'_'+key)\n\t\t\t\telse {\n\t\t\t\t\tif(is_obj && typeof value == 'object') {\n\t\t\t\t\t\tvalue = JSON.stringify(value);\n\t\t\t\t\t}\n\t\t\t\t\tstorage.set(prefix+namespace+'_'+key, value);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(type == 2) {//cookie\n\t\t\t\tvar val = storage.get(prefix+namespace);\n\t\t\t\tvar tmp = val ? JSON.parse(val) : {};\n\n\t\t\t\tif(value == null) {\n\t\t\t\t\tdelete tmp[key];//remove\n\t\t\t\t\tif(ace.sizeof(tmp) == 0) {//no other elements in this cookie, so delete it\n\t\t\t\t\t\tstorage.remove(prefix+namespace);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\telse {\n\t\t\t\t\ttmp[key] = value;\n\t\t\t\t}\n\n\t\t\t\tstorage.set(prefix+namespace , JSON.stringify(tmp), ace.config.cookie_expiry, path || ace.config.cookie_path)\n\t\t\t}\n\t\t}\n\t}\n\n\tthis.get = function(namespace, key, is_obj, undefined) {\n\t\tif(!storage) return null;\n\t\t\n\t\tif(key === undefined) {//no namespace here?\n\t\t\tkey = namespace;\n\t\t\treturn storage.get(prefix+key);\n\t\t}\n\t\telse {\n\t\t\tif(type == 1) {//localStorage\n\t\t\t\tvar value = storage.get(prefix+namespace+'_'+key);\n\t\t\t\tif(is_obj && value) {\n\t\t\t\t\ttry { value = JSON.parse(value) } catch(e) {}\n\t\t\t\t}\n\t\t\t\treturn value;\n\t\t\t}\n\t\t\telse if(type == 2) {//cookie\n\t\t\t\tvar val = storage.get(prefix+namespace);\n\t\t\t\tvar tmp = val ? JSON.parse(val) : {};\n\t\t\t\treturn key in tmp ? tmp[key] : null;\n\t\t\t}\n\t\t}\n\t}\n\n\t\n\tthis.remove = function(namespace, key, undefined) {\n\t\tif(!storage) return;\n\t\t\n\t\tif(key === undefined) {\n\t\t\tkey = namespace\n\t\t\tthis.set(key, null);\n\t\t}\n\t\telse {\n\t\t\tthis.set(namespace, key, null);\n\t\t}\n\t}\n}\n\n\n\n\n\n//cookie storage\nace.cookie = {\n\t// The following settingFunction are from Cookie.js class in TinyMCE, Moxiecode, used under LGPL.\n\n\t/**\n\t * Get a cookie.\n\t */\n\tget : function(name) {\n\t\tvar cookie = document.cookie, e, p = name + \"=\", b;\n\n\t\tif ( !cookie )\n\t\t\treturn;\n\n\t\tb = cookie.indexOf(\"; \" + p);\n\n\t\tif ( b == -1 ) {\n\t\t\tb = cookie.indexOf(p);\n\n\t\t\tif ( b != 0 )\n\t\t\t\treturn null;\n\n\t\t} else {\n\t\t\tb += 2;\n\t\t}\n\n\t\te = cookie.indexOf(\";\", b);\n\n\t\tif ( e == -1 )\n\t\t\te = cookie.length;\n\n\t\treturn decodeURIComponent( cookie.substring(b + p.length, e) );\n\t},\n\n\t/**\n\t * Set a cookie.\n\t *\n\t * The 'expires' arg can be either a JS Date() object set to the expiration date (back-compat)\n\t * or the number of seconds until expiration\n\t */\n\tset : function(name, value, expires, path, domain, secure) {\n\t\tvar d = new Date();\n\n\t\tif ( typeof(expires) == 'object' && expires.toGMTString ) {\n\t\t\texpires = expires.toGMTString();\n\t\t} else if ( parseInt(expires, 10) ) {\n\t\t\td.setTime( d.getTime() + ( parseInt(expires, 10) * 1000 ) ); // time must be in miliseconds\n\t\t\texpires = d.toGMTString();\n\t\t} else {\n\t\t\texpires = '';\n\t\t}\n\n\t\tdocument.cookie = name + \"=\" + encodeURIComponent(value) +\n\t\t\t((expires) ? \"; expires=\" + expires : \"\") +\n\t\t\t((path) ? \"; path=\" + path : \"\") +\n\t\t\t((domain) ? \"; domain=\" + domain : \"\") +\n\t\t\t((secure) ? \"; secure\" : \"\");\n\t},\n\n\t/**\n\t * Remove a cookie.\n\t *\n\t * This is done by setting it to an empty value and setting the expiration time in the past.\n\t */\n\tremove : function(name, path) {\n\t\tthis.set(name, '', -1000, path);\n\t}\n};\n\n\n//local storage\nace.storage = {\n\tget: function(key) {\n\t\treturn window['localStorage'].getItem(key);\n\t},\n\tset: function(key, value) {\n\t\twindow['localStorage'].setItem(key , value);\n\t},\n\tremove: function(key) {\n\t\twindow['localStorage'].removeItem(key);\n\t}\n};\n\n\n\n\n\n\n//count the number of properties in an object\n//useful for getting the number of elements in an associative array\nace.sizeof = function(obj) {\n\tvar size = 0;\n\tfor(var key in obj) if(obj.hasOwnProperty(key)) size++;\n\treturn size;\n}\n\n//because jQuery may not be loaded at this stage, we use our own toggleClass\nace.hasClass = function(elem, className) {\treturn (\" \" + elem.className + \" \").indexOf(\" \" + className + \" \") > -1; }\n\nace.addClass = function(elem, className) {\n var parts = className.split(/\\s+/);\n for(var p = 0; p < parts.length; p++) {\n\tif ( parts[p].length > 0 && !ace.hasClass(elem, parts[p]) ) {\n\t\tvar currentClass = elem.className;\n\t\telem.className = currentClass + (currentClass.length ? \" \" : \"\") + parts[p];\n\t}\n }\n}\n\nace.removeClass = function(elem, className) {\n var parts = className.split(/\\s+/);\n for(var p = 0; p < parts.length; p++) {\n\tif( parts[p].length > 0 ) ace.replaceClass(elem, parts[p]);\n }\n ace.replaceClass(elem, className);\n}\n\nace.replaceClass = function(elem, className, newClass) {\n var classToRemove = new RegExp((\"(^|\\\\s)\" + className + \"(\\\\s|$)\"), \"i\");\n elem.className = elem.className.replace(classToRemove, function (match, p1, p2) {\n\treturn newClass ? (p1 + newClass + p2) : \" \";\n }).replace(/^\\s+|\\s+$/g, \"\");\n}\n\n\nace.toggleClass = function(elem, className) {\n\tif(ace.hasClass(elem, className))\n\t\tace.removeClass(elem, className);\n\telse ace.addClass(elem, className);\n}\n\nace.isHTMlElement = function(elem) {\n return window.HTMLElement ? elem instanceof HTMLElement : ('nodeType' in elem ? elem.nodeType == 1 : false);\n}\n\n\n //data_storage instance used inside ace.settings etc\n ace.data = new ace.data_storage(ace.config.storage_method);\n\n})();\n\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./source/javascripts/ace/ace-extra.js\n// module id = 1116\n// module chunks = 34"],"sourceRoot":""}