/**! hopscotch - v0.3.1 * * Copyright 2017 LinkedIn Corp. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ ! function(a, b) { "object" == typeof exports && "undefined" != typeof module ? module.exports = b() : "function" == typeof define && define.amd ? define(b) : a.hopscotch = b() }(this, function() { "use strict"; var a, b, c, d, e, f, g, h, i, j, k, l, m, n = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(a) { return typeof a } : function(a) { return a && "function" == typeof Symbol && a.constructor === Symbol && a !== Symbol.prototype ? "symbol" : typeof a }, o = "bubble_default", p = window.Sizzle || null, q = "undefined", r = !1, s = ("undefined" == typeof jQuery ? "undefined" : n(jQuery)) !== q, t = !1, u = !1, v = /^[a-zA-Z]+[a-zA-Z0-9_-]*$/, w = { left: "right", right: "left" }; try { n(window.sessionStorage) !== q && (t = !0, sessionStorage.setItem("hopscotch.test.storage", "ok"), sessionStorage.removeItem("hopscotch.test.storage"), u = !0) } catch (x) {} l = { smoothScroll: !0, scrollDuration: 1e3, scrollTopMargin: 200, showCloseButton: !0, showPrevButton: !1, showNextButton: !0, bubbleWidth: 280, bubblePadding: 15, arrowWidth: 20, skipIfNoElement: !0, isRtl: !1, cookieName: "hopscotch.tour.state" }, Array.isArray || (Array.isArray = function(a) { return "[object Array]" === Object.prototype.toString.call(a) }), k = function() { r && m.startTour() }, h = { addClass: function(a, b) { var c, d, e, f; if (a.className) { for (d = b.split(/\s+/), c = " " + a.className + " ", e = 0, f = d.length; f > e; ++e) c.indexOf(" " + d[e] + " ") < 0 && (c += d[e] + " "); a.className = c.replace(/^\s+|\s+$/g, "") } else a.className = b }, removeClass: function(a, b) { var c, d, e, f; for (d = b.split(/\s+/), c = " " + a.className + " ", e = 0, f = d.length; f > e; ++e) c = c.replace(" " + d[e] + " ", " "); a.className = c.replace(/^\s+|\s+$/g, "") }, hasClass: function(a, b) { var c; return a.className ? (c = " " + a.className + " ", -1 !== c.indexOf(" " + b + " ")) : !1 }, getPixelValue: function(a) { var b = "undefined" == typeof a ? "undefined" : n(a); return "number" === b ? a : "string" === b ? parseInt(a, 10) : 0 }, valOrDefault: function(a, b) { return ("undefined" == typeof a ? "undefined" : n(a)) !== q ? a : b }, invokeCallbackArrayHelper: function(a) { var b; return Array.isArray(a) && (b = j[a[0]], "function" == typeof b) ? b.apply(this, a.slice(1)) : void 0 }, invokeCallbackArray: function(a) { var b, c; if (Array.isArray(a)) { if ("string" == typeof a[0]) return h.invokeCallbackArrayHelper(a); for (b = 0, c = a.length; c > b; ++b) h.invokeCallback(a[b]) } }, invokeCallback: function(a) { return "function" == typeof a ? a() : "string" == typeof a && j[a] ? j[a]() : h.invokeCallbackArray(a) }, invokeEventCallbacks: function(a, b) { var c, d, e = i[a]; if (b) return this.invokeCallback(b); for (c = 0, d = e.length; d > c; ++c) this.invokeCallback(e[c].cb) }, getScrollTop: function() { var a; return a = n(window.pageYOffset) !== q ? window.pageYOffset : document.documentElement.scrollTop }, getScrollLeft: function() { var a; return a = n(window.pageXOffset) !== q ? window.pageXOffset : document.documentElement.scrollLeft }, getWindowHeight: function() { return window.innerHeight || document.documentElement.clientHeight }, addEvtListener: function(a, b, c) { return a ? a.addEventListener ? a.addEventListener(b, c, !1) : a.attachEvent("on" + b, c) : void 0 }, removeEvtListener: function(a, b, c) { return a ? a.removeEventListener ? a.removeEventListener(b, c, !1) : a.detachEvent("on" + b, c) : void 0 }, documentIsReady: function() { return "complete" === document.readyState }, evtPreventDefault: function(a) { a.preventDefault ? a.preventDefault() : event && (event.returnValue = !1) }, extend: function(a, b) { var c; for (c in b) b.hasOwnProperty(c) && (a[c] = b[c]) }, getStepTargetHelper: function(a) { var b = document.getElementById(a); if (b) return b; if (s) return b = jQuery(a), b.length ? b[0] : null; if (p) return b = new p(a), b.length ? b[0] : null; if (document.querySelector) try { return document.querySelector(a) } catch (c) {} return /^#[a-zA-Z][\w-_:.]*$/.test(a) ? document.getElementById(a.substring(1)) : null }, getStepTarget: function(a) { var b; if (!a || !a.target) return null; if ("string" == typeof a.target) return h.getStepTargetHelper(a.target); if (Array.isArray(a.target)) { var c, d; for (c = 0, d = a.target.length; d > c; c++) if ("string" == typeof a.target[c] && (b = h.getStepTargetHelper(a.target[c]))) return b; return null } return a.target }, getI18NString: function(a) { return e[a] || d[a] }, setState: function(a, b, c) { var d, e = ""; if (t && u) try { sessionStorage.setItem(a, b) } catch (f) { u = !1, this.setState(a, b, c) } else t && sessionStorage.removeItem(a), c && (d = new Date, d.setTime(d.getTime() + 24 * c * 60 * 60 * 1e3), e = "; expires=" + d.toGMTString()), document.cookie = a + "=" + b + e + "; path=/" }, getState: function(a) { var b, c, d, e = a + "=", f = document.cookie.split(";"); if (t && (d = sessionStorage.getItem(a))) return d; for (b = 0; b < f.length; b++) { for (c = f[b]; " " === c.charAt(0);) c = c.substring(1, c.length); if (0 === c.indexOf(e)) { d = c.substring(e.length, c.length); break } } return d }, clearState: function(a) { t ? sessionStorage.removeItem(a) : this.setState(a, "", -1) }, normalizePlacement: function(a) { !a.placement && a.orientation && (a.placement = a.orientation) }, flipPlacement: function(a) { if (a.isRtl && !a._isFlipped) { var b, c, d = ["orientation", "placement"]; a.xOffset && (a.xOffset = -1 * this.getPixelValue(a.xOffset)); for (c in d) b = d[c], a.hasOwnProperty(b) && w.hasOwnProperty(a[b]) && (a[b] = w[a[b]]); a._isFlipped = !0 } } }, h.addEvtListener(window, "load", k), i = { next: [], prev: [], start: [], end: [], show: [], error: [], close: [] }, j = {}, d = { stepNums: null, nextBtn: "Next", prevBtn: "Back", doneBtn: "Done", skipBtn: "Skip", closeTooltip: "Close" }, e = {}, b = function(a) { this.init(a) }, b.prototype = { isShowing: !1, currStep: void 0, setPosition: function(a) { var b, c, d, e, f, g, i, j = h.getStepTarget(a), k = this.element, l = this.arrowEl, m = a.isRtl ? "right" : "left"; if (h.flipPlacement(a), h.normalizePlacement(a), c = k.offsetWidth, b = k.offsetHeight, h.removeClass(k, "fade-in-down fade-in-up fade-in-left fade-in-right"), d = j.getBoundingClientRect(), i = a.isRtl ? d.right - c : d.left, "top" === a.placement) e = d.top - b - this.opt.arrowWidth, f = i; else if ("bottom" === a.placement) e = d.bottom + this.opt.arrowWidth, f = i; else if ("left" === a.placement) e = d.top, f = d.left - c - this.opt.arrowWidth; else { if ("right" !== a.placement) throw new Error("Bubble placement failed because step.placement is invalid or undefined!"); e = d.top, f = d.right + this.opt.arrowWidth } g = "center" !== a.arrowOffset ? h.getPixelValue(a.arrowOffset) : a.arrowOffset, g ? "top" === a.placement || "bottom" === a.placement ? (l.style.top = "", "center" === g ? l.style[m] = Math.floor(c / 2 - l.offsetWidth / 2) + "px" : l.style[m] = g + "px") : ("left" === a.placement || "right" === a.placement) && (l.style[m] = "", "center" === g ? l.style.top = Math.floor(b / 2 - l.offsetHeight / 2) + "px" : l.style.top = g + "px") : (l.style.top = "", l.style[m] = ""), "center" === a.xOffset ? f = d.left + j.offsetWidth / 2 - c / 2 : f += h.getPixelValue(a.xOffset), "center" === a.yOffset ? e = d.top + j.offsetHeight / 2 - b / 2 : e += h.getPixelValue(a.yOffset), a.fixedElement || (e += h.getScrollTop(), f += h.getScrollLeft()), k.style.position = a.fixedElement ? "fixed" : "absolute", k.style.top = e + "px", k.style.left = f + "px" }, render: function(a, b, c) { var d, e, g, i, j, k, l, n, p, q, r = this.element; if (a ? this.currStep = a : this.currStep && (a = this.currStep), this.opt.isTourBubble ? (i = m.getCurrTour(), i && (e = i.customData, d = i.customRenderer, a.isRtl = a.hasOwnProperty("isRtl") ? a.isRtl : i.hasOwnProperty("isRtl") ? i.isRtl : this.opt.isRtl, g = i.unsafe, Array.isArray(i.steps) && (j = i.steps.length, k = this._getStepI18nNum(this._getStepNum(j - 1)), n = this._getStepNum(b) === this._getStepNum(j - 1)))) : (e = a.customData, d = a.customRenderer, g = a.unsafe, a.isRtl = a.hasOwnProperty("isRtl") ? a.isRtl : this.opt.isRtl), l = n ? h.getI18NString("doneBtn") : a.showSkip ? h.getI18NString("skipBtn") : h.getI18NString("nextBtn"), h.flipPlacement(a), h.normalizePlacement(a), this.placement = a.placement, q = { i18n: { prevBtn: h.getI18NString("prevBtn"), nextBtn: l, closeTooltip: h.getI18NString("closeTooltip"), stepNum: this._getStepI18nNum(this._getStepNum(b)), numSteps: k }, buttons: { showPrev: h.valOrDefault(a.showPrevButton, this.opt.showPrevButton) && this._getStepNum(b) > 0, showNext: h.valOrDefault(a.showNextButton, this.opt.showNextButton), showCTA: h.valOrDefault(a.showCTAButton && a.ctaLabel, !1), ctaLabel: a.ctaLabel, showClose: h.valOrDefault(this.opt.showCloseButton, !0) }, step: { num: b, isLast: h.valOrDefault(n, !1), title: a.title || "", content: a.content || "", isRtl: a.isRtl, placement: a.placement, padding: h.valOrDefault(a.padding, this.opt.bubblePadding), width: h.getPixelValue(a.width) || this.opt.bubbleWidth, customData: a.customData || {} }, tour: { isTour: this.opt.isTourBubble, numSteps: j, unsafe: h.valOrDefault(g, !1), customData: e || {} } }, "function" == typeof d) r.innerHTML = d(q); else if ("string" == typeof d) { if (!m.templates || "function" != typeof m.templates[d]) throw new Error('Bubble rendering failed - template "' + d + '" is not a function.'); r.innerHTML = m.templates[d](q) } else if (f) r.innerHTML = f(q); else { if (!m.templates || "function" != typeof m.templates[o]) throw new Error('Bubble rendering failed - template "' + o + '" is not a function.'); r.innerHTML = m.templates[o](q) } var s, t = r.children, u = t.length; for (p = 0; u > p; p++) s = t[p], h.hasClass(s, "hopscotch-arrow") && (this.arrowEl = s); return r.style.zIndex = "number" == typeof a.zindex ? a.zindex : "", this._setArrow(a.placement), this.hide(!1), this.setPosition(a), c && c(!a.fixedElement), this }, _getStepNum: function(a) { var b, c, d = 0, e = m.getSkippedStepsIndexes(), f = e.length; for (c = 0; f > c; c++) b = e[c], a > b && d++; return a - d }, _getStepI18nNum: function(a) { var b = h.getI18NString("stepNums"); return b && a < b.length ? a = b[a] : a += 1, a }, _setArrow: function(a) { h.removeClass(this.arrowEl, "down up right left"), "top" === a ? h.addClass(this.arrowEl, "down") : "bottom" === a ? h.addClass(this.arrowEl, "up") : "left" === a ? h.addClass(this.arrowEl, "right") : "right" === a && h.addClass(this.arrowEl, "left") }, _getArrowDirection: function() { return "top" === this.placement ? "down" : "bottom" === this.placement ? "up" : "left" === this.placement ? "right" : "right" === this.placement ? "left" : void 0 }, show: function() { var a = this, b = "fade-in-" + this._getArrowDirection(), c = 1e3; return h.removeClass(this.element, "hide"), h.addClass(this.element, b), setTimeout(function() { h.removeClass(a.element, "invisible") }, 50), setTimeout(function() { h.removeClass(a.element, b) }, c), this.isShowing = !0, this }, hide: function(a) { var b = this.element; return a = h.valOrDefault(a, !0), b.style.top = "", b.style.left = "", a ? (h.addClass(b, "hide"), h.removeClass(b, "invisible")) : (h.removeClass(b, "hide"), h.addClass(b, "invisible")), h.removeClass(b, "animate fade-in-up fade-in-down fade-in-right fade-in-left"), this.isShowing = !1, this }, destroy: function() { var a = this.element; a && a.parentNode.removeChild(a), h.removeEvtListener(a, "click", this.clickCb) }, _handleBubbleClick: function(a) { function b(c) { return c === a.currentTarget ? null : h.hasClass(c, "hopscotch-cta") ? "cta" : h.hasClass(c, "hopscotch-next") ? "next" : h.hasClass(c, "hopscotch-prev") ? "prev" : h.hasClass(c, "hopscotch-close") ? "close" : b(c.parentElement) } var c; a = a || window.event; var d = a.target || a.srcElement; if (c = b(d), "cta" === c) this.opt.isTourBubble || m.getCalloutManager().removeCallout(this.currStep.id), this.currStep.onCTA && h.invokeCallback(this.currStep.onCTA); else if ("next" === c) m.nextStep(!0); else if ("prev" === c) m.prevStep(!0); else if ("close" === c) { if (this.opt.isTourBubble) { var e = m.getCurrStepNum(), f = m.getCurrTour(), g = e === f.steps.length - 1; h.invokeEventCallbacks("close"), m.endTour(!0, g) } else this.opt.onClose && h.invokeCallback(this.opt.onClose), this.opt.id && !this.opt.isTourBubble ? m.getCalloutManager().removeCallout(this.opt.id) : this.destroy(); h.evtPreventDefault(a) } }, init: function(a) { var b, c, d, e, f = document.createElement("div"), g = this, i = !1; this.element = f, e = { showPrevButton: l.showPrevButton, showNextButton: l.showNextButton, bubbleWidth: l.bubbleWidth, bubblePadding: l.bubblePadding, arrowWidth: l.arrowWidth, isRtl: l.isRtl, showNumber: !0, isTourBubble: !0 }, a = ("undefined" == typeof a ? "undefined" : n(a)) === q ? {} : a, h.extend(e, a), this.opt = e, f.className = "hopscotch-bubble animated", e.isTourBubble ? (d = m.getCurrTour(), d && h.addClass(f, "tour-" + d.id)) : h.addClass(f, "hopscotch-callout no-number"), b = function() { !i && g.isShowing && (i = !0, setTimeout(function() { g.setPosition(g.currStep), i = !1 }, 100)) }, h.addEvtListener(window, "resize", b), this.clickCb = function(a) { g._handleBubbleClick(a) }, h.addEvtListener(f, "click", this.clickCb), this.hide(), h.documentIsReady() ? document.body.appendChild(f) : (document.addEventListener ? (c = function() { document.removeEventListener("DOMContentLoaded", c), window.removeEventListener("load", c), document.body.appendChild(f) }, document.addEventListener("DOMContentLoaded", c, !1)) : (c = function() { "complete" === document.readyState && (document.detachEvent("onreadystatechange", c), window.detachEvent("onload", c), document.body.appendChild(f)) }, document.attachEvent("onreadystatechange", c)), h.addEvtListener(window, "load", c)) } }, c = function() { var a = {}, c = {}; this.createCallout = function(d) { var e; if (!d.id) throw new Error("Must specify a callout id."); if (!v.test(d.id)) throw new Error("Callout ID is using an invalid format. Use alphanumeric, underscores, and/or hyphens only. First character must be a letter."); if (a[d.id]) throw new Error("Callout by that id already exists. Please choose a unique id."); if (!h.getStepTarget(d)) throw new Error("Must specify existing target element via 'target' option."); return d.showNextButton = d.showPrevButton = !1, d.isTourBubble = !1, e = new b(d), a[d.id] = e, c[d.id] = d, e.render(d, null, function() { e.show(), d.onShow && h.invokeCallback(d.onShow) }), e }, this.getCallout = function(b) { return a[b] }, this.removeAllCallouts = function() { var b; for (b in a) a.hasOwnProperty(b) && this.removeCallout(b) }, this.removeCallout = function(b) { var d = a[b]; a[b] = null, c[b] = null, d && d.destroy() }, this.refreshCalloutPositions = function() { var b, d, e; for (b in a) a.hasOwnProperty(b) && c.hasOwnProperty(b) && (d = a[b], e = c[b], d && e && d.setPosition(e)) } }, a = function(a) { var d, k, p, t, u, w, x, y, z = this, A = {}, B = [], C = function(a) { return d && d.element && d.element.parentNode || (d = new b(p)), a && h.extend(d.opt, { bubblePadding: E("bubblePadding"), bubbleWidth: E("bubbleWidth"), showNextButton: E("showNextButton"), showPrevButton: E("showPrevButton"), showCloseButton: E("showCloseButton"), arrowWidth: E("arrowWidth"), isRtl: E("isRtl") }), d }, D = function() { d && (d.destroy(), d = null) }, E = function(a) { return "undefined" == typeof p ? l[a] : h.valOrDefault(p[a], l[a]) }, F = function() { var a; return a = !t || 0 > u || u >= t.steps.length ? null : t.steps[u] }, G = function() { z.nextStep() }, H = function(a) { var b, c, d, e, f, g, i = C(), j = i.element, k = h.getPixelValue(j.style.top), l = k + h.getPixelValue(j.offsetHeight), m = h.getStepTarget(F()), o = m.getBoundingClientRect(), p = o.top + h.getScrollTop(), r = o.bottom + h.getScrollTop(), t = p > k ? k : p, u = l > r ? l : r, v = h.getScrollTop(), w = v + h.getWindowHeight(), x = t - E("scrollTopMargin"); t >= v && (t <= v + E("scrollTopMargin") || w >= u) ? a && a() : E("smoothScroll") ? ("undefined" == typeof YAHOO ? "undefined" : n(YAHOO)) !== q && n(YAHOO.env) !== q && n(YAHOO.env.ua) !== q && n(YAHOO.util) !== q && n(YAHOO.util.Scroll) !== q ? (b = YAHOO.env.ua.webkit ? document.body : document.documentElement, d = YAHOO.util.Easing ? YAHOO.util.Easing.easeOut : void 0, c = new YAHOO.util.Scroll(b, { scroll: { to: [0, x] } }, E("scrollDuration") / 1e3, d), c.onComplete.subscribe(a), c.animate()) : s ? jQuery("body, html").animate({ scrollTop: x }, E("scrollDuration"), a) : (0 > x && (x = 0), e = v > t ? -1 : 1, f = Math.abs(v - x) / (E("scrollDuration") / 10), (g = function() { var b = h.getScrollTop(), c = b + e * f; return e > 0 && c >= x || 0 > e && x >= c ? (c = x, a && a(), void window.scrollTo(0, c)) : (window.scrollTo(0, c), h.getScrollTop() === b ? void(a && a()) : void setTimeout(g, 10)) })()) : (window.scrollTo(0, x), a && a()) }, I = function P(a, b) { var c, d, e; u + a >= 0 && u + a < t.steps.length ? (u += a, d = F(), e = function() { c = h.getStepTarget(d), c ? (A[u] && delete A[u], b(u)) : (A[u] = !0, h.invokeEventCallbacks("error"), P(a, b)) }, d.delay ? setTimeout(e, d.delay) : e()) : b(-1) }, J = function(a, b) { var c, d, e, f, g = C(), i = this; if (g.hide(), a = h.valOrDefault(a, !0), c = F(), c.nextOnTargetClick && h.removeEvtListener(h.getStepTarget(c), "click", G), d = c, e = b > 0 ? d.multipage : u > 0 && t.steps[u - 1].multipage, f = function(c) { var f; if (-1 === c) return this.endTour(!0); if (a && (f = b > 0 ? h.invokeEventCallbacks("next", d.onNext) : h.invokeEventCallbacks("prev", d.onPrev)), c === u) { if (e) return void N(); f = h.valOrDefault(f, !0), f ? this.showStep(c) : this.endTour(!1) } }, !e && E("skipIfNoElement")) I(b, function(a) { f.call(i, a) }); else if (u + b >= 0 && u + b < t.steps.length) { if (u += b, c = F(), !h.getStepTarget(c) && !e) return h.invokeEventCallbacks("error"), this.endTour(!0, !1); f.call(this, u) } else if (u + b === t.steps.length) return this.endTour(); return this }, K = function(a) { var b, c, d, e = {}; for (b in a) a.hasOwnProperty(b) && "id" !== b && "steps" !== b && (e[b] = a[b]); return y.call(this, e, !0), c = h.getState(E("cookieName")), c && (d = c.split(":"), w = d[0], x = d[1], d.length > 2 && (B = d[2].split(",")), x = parseInt(x, 10)), this }, L = function(a, b, c) { var d, e; if (u = a || 0, A = b || {}, d = F(), e = h.getStepTarget(d)) return void c(u); if (!e) { if (h.invokeEventCallbacks("error"), A[u] = !0, E("skipIfNoElement")) return void I(1, c); u = -1, c(u) } }, M = function(a) { function b() { d.show(), h.invokeEventCallbacks("show", c.onShow) } var c = t.steps[a], d = C(), e = h.getStepTarget(c); u !== a && F().nextOnTargetClick && h.removeEvtListener(h.getStepTarget(F()), "click", G), u = a, d.hide(!1), d.render(c, a, function(a) { a ? H(b) : b(), c.nextOnTargetClick && h.addEvtListener(e, "click", G) }), N() }, N = function() { var a = t.id + ":" + u, b = m.getSkippedStepsIndexes(); b && b.length > 0 && (a += ":" + b.join(",")), h.setState(E("cookieName"), a, 1) }, O = function(a) { a && this.configure(a) }; this.getCalloutManager = function() { return ("undefined" == typeof k ? "undefined" : n(k)) === q && (k = new c), k }, this.startTour = function(a, b) { var c, d, e = {}, f = this; if (!t) { if (!a) throw new Error("Tour data is required for startTour."); if (!a.id || !v.test(a.id)) throw new Error("Tour ID is using an invalid format. Use alphanumeric, underscores, and/or hyphens only. First character must be a letter."); t = a, K.call(this, a) } if (("undefined" == typeof b ? "undefined" : n(b)) !== q) { if (b >= t.steps.length) throw new Error("Specified step number out of bounds."); d = b } if (!h.documentIsReady()) return r = !0, this; if ("undefined" == typeof d && t.id === w && ("undefined" == typeof x ? "undefined" : n(x)) !== q) { if (d = x, B.length > 0) for (var g = 0, i = B.length; i > g; g++) e[B[g]] = !0 } else d || (d = 0); return L(d, e, function(a) { var b = -1 !== a && h.getStepTarget(t.steps[a]); return b ? (h.invokeEventCallbacks("start"), c = C(), c.hide(!1), f.isActive = !0, void(h.getStepTarget(F()) ? f.showStep(a) : (h.invokeEventCallbacks("error"), E("skipIfNoElement") && f.nextStep(!1)))) : void f.endTour(!1, !1) }), this }, this.showStep = function(a) { var b = t.steps[a], c = u; return h.getStepTarget(b) ? (b.delay ? setTimeout(function() { M(a) }, b.delay) : M(a), this) : (u = a, h.invokeEventCallbacks("error"), void(u = c)) }, this.prevStep = function(a) { return J.call(this, a, -1), this }, this.nextStep = function(a) { return J.call(this, a, 1), this }, this.endTour = function(a, b) { var c, d = C(); return a = h.valOrDefault(a, !0), b = h.valOrDefault(b, !0), t && (c = F(), c && c.nextOnTargetClick && h.removeEvtListener(h.getStepTarget(c), "click", G)), u = 0, x = void 0, d.hide(), a && h.clearState(E("cookieName")), this.isActive && (this.isActive = !1, t && b && h.invokeEventCallbacks("end")), this.removeCallbacks(null, !0), this.resetDefaultOptions(), D(), t = null, this }, this.getCurrTour = function() { return t }, this.getCurrTarget = function() { return h.getStepTarget(F()) }, this.getCurrStepNum = function() { return u }, this.getSkippedStepsIndexes = function() { var a, b = []; for (a in A) b.push(a); return b }, this.refreshBubblePosition = function() { var a = F(); return a && C().setPosition(a), this.getCalloutManager().refreshCalloutPositions(), this }, this.listen = function(a, b, c) { return a && i[a].push({ cb: b, fromTour: c }), this }, this.unlisten = function(a, b) { var c, d, e = i[a]; for (c = 0, d = e.length; d > c; ++c) e[c].cb === b && e.splice(c, 1); return this }, this.removeCallbacks = function(a, b) { var c, d, e, f; for (f in i) if (!a || a === f) if (b) for (c = i[f], d = 0, e = c.length; e > d; ++d) c[d].fromTour && (c.splice(d--, 1), --e); else i[f] = []; return this }, this.registerHelper = function(a, b) { "string" == typeof a && "function" == typeof b && (j[a] = b) }, this.unregisterHelper = function(a) { j[a] = null }, this.invokeHelper = function(a) { var b, c, d = []; for (b = 1, c = arguments.length; c > b; ++b) d.push(arguments[b]); j[a] && j[a].call(null, d) }, this.setCookieName = function(a) { return p.cookieName = a, this }, this.resetDefaultOptions = function() { return p = {}, this }, this.resetDefaultI18N = function() { return e = {}, this }, this.getState = function() { return h.getState(E("cookieName")) }, y = function(a, b) { var c, d, f, g, i = ["next", "prev", "start", "end", "show", "error", "close"]; for (p || this.resetDefaultOptions(), h.extend(p, a), a && h.extend(e, a.i18n), f = 0, g = i.length; g > f; ++f) d = "on" + i[f].charAt(0).toUpperCase() + i[f].substring(1), a[d] && this.listen(i[f], a[d], b); return c = C(!0), this }, this.configure = function(a) { return y.call(this, a, !1) }, this.setRenderer = function(a) { var b = "undefined" == typeof a ? "undefined" : n(a); return "string" === b ? (o = a, f = void 0) : "function" === b && (f = a), this }, this.setEscaper = function(a) { return "function" == typeof a && (g = a), this }, O.call(this, a) }, m = new a, function() { var a = {}; a.escape = function(a) { return g ? g(a) : null == a ? "" : ("" + a).replace(new RegExp("[&<>\"']", "g"), function(a) { return "&" == a ? "&" : "<" == a ? "<" : ">" == a ? ">" : '"' == a ? """ : "'" == a ? "'" : void 0 }) }, this.templates = this.templates || {}, this.templates.bubble_default = function(b) { function c(b, c) { return c ? a.escape(b) : b } var d, e = ""; a.escape, Array.prototype.join; e += "\n"; var f = b.i18n, g = b.buttons, h = b.step, i = b.tour; return e += '\n