<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fa">
	<id>https://www.iran-pedia.org/w/index.php?action=history&amp;feed=atom&amp;title=%D9%85%D8%AF%DB%8C%D8%A7%D9%88%DB%8C%DA%A9%DB%8C%3AGadget-Intro.js</id>
	<title>مدیاویکی:Gadget-Intro.js - تاریخچهٔ نسخه‌ها</title>
	<link rel="self" type="application/atom+xml" href="https://www.iran-pedia.org/w/index.php?action=history&amp;feed=atom&amp;title=%D9%85%D8%AF%DB%8C%D8%A7%D9%88%DB%8C%DA%A9%DB%8C%3AGadget-Intro.js"/>
	<link rel="alternate" type="text/html" href="https://www.iran-pedia.org/w/index.php?title=%D9%85%D8%AF%DB%8C%D8%A7%D9%88%DB%8C%DA%A9%DB%8C:Gadget-Intro.js&amp;action=history"/>
	<updated>2026-04-26T05:58:41Z</updated>
	<subtitle>تاریخچهٔ نسخه‌ها برای این صفحه در ویکی</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://www.iran-pedia.org/w/index.php?title=%D9%85%D8%AF%DB%8C%D8%A7%D9%88%DB%8C%DA%A9%DB%8C:Gadget-Intro.js&amp;diff=2641&amp;oldid=prev</id>
		<title>Rootadmin: ۱ نسخه واردشده</title>
		<link rel="alternate" type="text/html" href="https://www.iran-pedia.org/w/index.php?title=%D9%85%D8%AF%DB%8C%D8%A7%D9%88%DB%8C%DA%A9%DB%8C:Gadget-Intro.js&amp;diff=2641&amp;oldid=prev"/>
		<updated>2017-12-02T11:14:09Z</updated>

		<summary type="html">&lt;p&gt;۱ نسخه واردشده&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;fa&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;→ نسخهٔ قدیمی‌تر&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;نسخهٔ ‏۲ دسامبر ۲۰۱۷، ساعت ۱۳:۱۴&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;4&quot; class=&quot;diff-notice&quot; lang=&quot;fa&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(بدون تفاوت)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;!-- diff cache key fairanpediadb-fa_:diff:1.41:old-2640:rev-2641 --&gt;
&lt;/table&gt;</summary>
		<author><name>Rootadmin</name></author>
	</entry>
	<entry>
		<id>https://www.iran-pedia.org/w/index.php?title=%D9%85%D8%AF%DB%8C%D8%A7%D9%88%DB%8C%DA%A9%DB%8C:Gadget-Intro.js&amp;diff=2640&amp;oldid=prev</id>
		<title>Rootadmin: ۱ نسخه واردشده</title>
		<link rel="alternate" type="text/html" href="https://www.iran-pedia.org/w/index.php?title=%D9%85%D8%AF%DB%8C%D8%A7%D9%88%DB%8C%DA%A9%DB%8C:Gadget-Intro.js&amp;diff=2640&amp;oldid=prev"/>
		<updated>2017-08-29T21:38:33Z</updated>

		<summary type="html">&lt;p&gt;۱ نسخه واردشده&lt;/p&gt;
&lt;p&gt;&lt;b&gt;صفحهٔ تازه&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/* &lt;br /&gt;
 * Intro.js v0.6.0&lt;br /&gt;
 * https://github.com/usablica/intro.js&lt;br /&gt;
 * MIT licensed&lt;br /&gt;
 *&lt;br /&gt;
 * Copyright (C) 2013 usabli.ca - A weekend project by Afshin Mehrabani (@afshinmeh)&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
function toPersianDigits(text) {&lt;br /&gt;
    var arabicDigits = &amp;#039;0123456789&amp;#039;;&lt;br /&gt;
    var i = 0;&lt;br /&gt;
    for (i = 0; i &amp;lt;= 9; i = i + 1) {&lt;br /&gt;
      text = text.replace(new RegExp(&amp;#039;[&amp;#039; + arabicDigits[i] + &amp;#039;]&amp;#039;, &amp;#039;g&amp;#039;), &amp;#039;٠١٢٣٤٥٦٧٨٩&amp;#039;[i]);&lt;br /&gt;
    }&lt;br /&gt;
    return text&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
(function (root, factory) {&lt;br /&gt;
  if (typeof exports === &amp;#039;object&amp;#039;) {&lt;br /&gt;
    // CommonJS&lt;br /&gt;
    factory(exports);&lt;br /&gt;
  } else if (typeof define === &amp;#039;function&amp;#039; &amp;amp;&amp;amp; define.amd) {&lt;br /&gt;
    // AMD. Register as an anonymous module.&lt;br /&gt;
    define([&amp;#039;exports&amp;#039;], factory);&lt;br /&gt;
  } else {&lt;br /&gt;
    // Browser globals&lt;br /&gt;
    factory(root);&lt;br /&gt;
  }&lt;br /&gt;
} (this, function (exports) {&lt;br /&gt;
  //Default config/variables&lt;br /&gt;
  var VERSION = &amp;#039;0.6.0&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * IntroJs main class&lt;br /&gt;
   *&lt;br /&gt;
   * @class IntroJs&lt;br /&gt;
   */&lt;br /&gt;
  function IntroJs(obj) {&lt;br /&gt;
    this._targetElement = obj;&lt;br /&gt;
&lt;br /&gt;
    this._options = {&lt;br /&gt;
      /* Next button label in tooltip box */&lt;br /&gt;
      nextLabel: &amp;#039;بعدی &amp;amp;rarr;&amp;#039;,&lt;br /&gt;
      /* Previous button label in tooltip box */&lt;br /&gt;
      prevLabel: &amp;#039;&amp;amp;larr; قبلی&amp;#039;,&lt;br /&gt;
      /* Skip button label in tooltip box */&lt;br /&gt;
      skipLabel: &amp;#039;لغو&amp;#039;,&lt;br /&gt;
      /* Done button label in tooltip box */&lt;br /&gt;
      doneLabel: &amp;#039;تمام شد&amp;#039;,&lt;br /&gt;
      /* Default tooltip box position */&lt;br /&gt;
      tooltipPosition: &amp;#039;bottom&amp;#039;,&lt;br /&gt;
      /* Next CSS class for tooltip boxes */&lt;br /&gt;
      tooltipClass: &amp;#039;&amp;#039;,&lt;br /&gt;
      /* Close introduction when pressing Escape button? */&lt;br /&gt;
      exitOnEsc: true,&lt;br /&gt;
      /* Close introduction when clicking on overlay layer? */&lt;br /&gt;
      exitOnOverlayClick: true,&lt;br /&gt;
      /* Show step numbers in introduction? */&lt;br /&gt;
      showStepNumbers: false,&lt;br /&gt;
      /* Let user use keyboard to navigate the tour? */&lt;br /&gt;
      keyboardNavigation: true,&lt;br /&gt;
      /* Show tour control buttons? */&lt;br /&gt;
      showButtons: true,&lt;br /&gt;
      /* Show tour bullets? */&lt;br /&gt;
      showBullets: true&lt;br /&gt;
    };&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * Initiate a new introduction/guide from an element in the page&lt;br /&gt;
   *&lt;br /&gt;
   * @api private&lt;br /&gt;
   * @method _introForElement&lt;br /&gt;
   * @param {Object} targetElm&lt;br /&gt;
   * @returns {Boolean} Success or not?&lt;br /&gt;
   */&lt;br /&gt;
  function _introForElement(targetElm) {&lt;br /&gt;
    var introItems = [],&lt;br /&gt;
        self = this;&lt;br /&gt;
&lt;br /&gt;
    if (this._options.steps) {&lt;br /&gt;
      //use steps passed programmatically&lt;br /&gt;
      var allIntroSteps = [];&lt;br /&gt;
&lt;br /&gt;
      for (var i = 0, stepsLength = this._options.steps.length; i &amp;lt; stepsLength; i++) {&lt;br /&gt;
        var currentItem = this._options.steps[i];&lt;br /&gt;
        //set the step&lt;br /&gt;
        currentItem.step = i + 1;&lt;br /&gt;
        //use querySelector function only when developer used CSS selector&lt;br /&gt;
        if (typeof(currentItem.element) === &amp;#039;string&amp;#039;) {&lt;br /&gt;
          //grab the element with given selector from the page&lt;br /&gt;
          currentItem.element = document.querySelector(currentItem.element);&lt;br /&gt;
        }&lt;br /&gt;
        introItems.push(currentItem);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    } else {&lt;br /&gt;
       //use steps from data-* annotations&lt;br /&gt;
      var allIntroSteps = targetElm.querySelectorAll(&amp;#039;*[data-intro]&amp;#039;);&lt;br /&gt;
      //if there&amp;#039;s no element to intro&lt;br /&gt;
      if (allIntroSteps.length &amp;lt; 1) {&lt;br /&gt;
        return false;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      //first add intro items with data-step&lt;br /&gt;
      for (var i = 0, elmsLength = allIntroSteps.length; i &amp;lt; elmsLength; i++) {&lt;br /&gt;
        var currentElement = allIntroSteps[i];&lt;br /&gt;
        var step = parseInt(currentElement.getAttribute(&amp;#039;data-step&amp;#039;), 10);&lt;br /&gt;
&lt;br /&gt;
        if (step &amp;gt; 0) {&lt;br /&gt;
          introItems[step - 1] = {&lt;br /&gt;
            element: currentElement,&lt;br /&gt;
            intro: currentElement.getAttribute(&amp;#039;data-intro&amp;#039;),&lt;br /&gt;
            step: parseInt(currentElement.getAttribute(&amp;#039;data-step&amp;#039;), 10),&lt;br /&gt;
            tooltipClass: currentElement.getAttribute(&amp;#039;data-tooltipClass&amp;#039;),&lt;br /&gt;
            position: currentElement.getAttribute(&amp;#039;data-position&amp;#039;) || this._options.tooltipPosition&lt;br /&gt;
          };&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      //next add intro items without data-step&lt;br /&gt;
      //todo: we need a cleanup here, two loops are redundant&lt;br /&gt;
      var nextStep = 0;&lt;br /&gt;
      for (var i = 0, elmsLength = allIntroSteps.length; i &amp;lt; elmsLength; i++) {&lt;br /&gt;
        var currentElement = allIntroSteps[i];&lt;br /&gt;
&lt;br /&gt;
        if (currentElement.getAttribute(&amp;#039;data-step&amp;#039;) == null) {&lt;br /&gt;
          &lt;br /&gt;
          while (true) {&lt;br /&gt;
            if (typeof introItems[nextStep] == &amp;#039;undefined&amp;#039;) {&lt;br /&gt;
              break;&lt;br /&gt;
            } else {&lt;br /&gt;
              nextStep++;&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
          introItems[nextStep] = {&lt;br /&gt;
            element: currentElement,&lt;br /&gt;
            intro: currentElement.getAttribute(&amp;#039;data-intro&amp;#039;),&lt;br /&gt;
            step: nextStep + 1,&lt;br /&gt;
            tooltipClass: currentElement.getAttribute(&amp;#039;data-tooltipClass&amp;#039;),&lt;br /&gt;
            position: currentElement.getAttribute(&amp;#039;data-position&amp;#039;) || this._options.tooltipPosition&lt;br /&gt;
          };&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //removing undefined/null elements&lt;br /&gt;
    var tempIntroItems = [];&lt;br /&gt;
    for (var z = 0; z &amp;lt; introItems.length; z++) {&lt;br /&gt;
      introItems[z] &amp;amp;&amp;amp; tempIntroItems.push(introItems[z]);  // copy non-empty values to the end of the array&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    introItems = tempIntroItems;&lt;br /&gt;
&lt;br /&gt;
    //Ok, sort all items with given steps&lt;br /&gt;
    introItems.sort(function (a, b) {&lt;br /&gt;
      return a.step - b.step;&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    //set it to the introJs object&lt;br /&gt;
    self._introItems = introItems;&lt;br /&gt;
&lt;br /&gt;
    //add overlay layer to the page&lt;br /&gt;
    if(_addOverlayLayer.call(self, targetElm)) {&lt;br /&gt;
      //then, start the show&lt;br /&gt;
      _nextStep.call(self);&lt;br /&gt;
&lt;br /&gt;
      var skipButton     = targetElm.querySelector(&amp;#039;.introjs-skipbutton&amp;#039;),&lt;br /&gt;
          nextStepButton = targetElm.querySelector(&amp;#039;.introjs-nextbutton&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
      self._onKeyDown = function(e) {&lt;br /&gt;
        if (e.keyCode === 27 &amp;amp;&amp;amp; self._options.exitOnEsc == true) {&lt;br /&gt;
          //escape key pressed, exit the intro&lt;br /&gt;
          _exitIntro.call(self, targetElm);&lt;br /&gt;
          //check if any callback is defined&lt;br /&gt;
          if (self._introExitCallback != undefined) {&lt;br /&gt;
            self._introExitCallback.call(self);&lt;br /&gt;
          }&lt;br /&gt;
        } else if(e.keyCode === 37) {&lt;br /&gt;
          //left arrow&lt;br /&gt;
          _previousStep.call(self);&lt;br /&gt;
        } else if (e.keyCode === 39 || e.keyCode === 13) {&lt;br /&gt;
          //right arrow or enter&lt;br /&gt;
          _nextStep.call(self);&lt;br /&gt;
          //prevent default behaviour on hitting Enter, to prevent steps being skipped in some browsers&lt;br /&gt;
          if(e.preventDefault) {&lt;br /&gt;
            e.preventDefault();&lt;br /&gt;
          } else {&lt;br /&gt;
            e.returnValue = false;&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      };&lt;br /&gt;
&lt;br /&gt;
      self._onResize = function(e) {&lt;br /&gt;
        _setHelperLayerPosition.call(self, document.querySelector(&amp;#039;.introjs-helperLayer&amp;#039;));&lt;br /&gt;
      };&lt;br /&gt;
&lt;br /&gt;
      if (window.addEventListener) {&lt;br /&gt;
        if (this._options.keyboardNavigation) {&lt;br /&gt;
          window.addEventListener(&amp;#039;keydown&amp;#039;, self._onKeyDown, true);&lt;br /&gt;
        }&lt;br /&gt;
        //for window resize&lt;br /&gt;
        window.addEventListener(&amp;quot;resize&amp;quot;, self._onResize, true);&lt;br /&gt;
      } else if (document.attachEvent) { //IE&lt;br /&gt;
        if (this._options.keyboardNavigation) {&lt;br /&gt;
          document.attachEvent(&amp;#039;onkeydown&amp;#039;, self._onKeyDown);&lt;br /&gt;
        }&lt;br /&gt;
        //for window resize&lt;br /&gt;
        document.attachEvent(&amp;quot;onresize&amp;quot;, self._onResize);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * Go to specific step of introduction&lt;br /&gt;
   *&lt;br /&gt;
   * @api private&lt;br /&gt;
   * @method _goToStep&lt;br /&gt;
   */&lt;br /&gt;
  function _goToStep(step) {&lt;br /&gt;
    //because steps starts with zero&lt;br /&gt;
    this._currentStep = step - 2;&lt;br /&gt;
    if (typeof (this._introItems) !== &amp;#039;undefined&amp;#039;) {&lt;br /&gt;
      _nextStep.call(this);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * Go to next step on intro&lt;br /&gt;
   *&lt;br /&gt;
   * @api private&lt;br /&gt;
   * @method _nextStep&lt;br /&gt;
   */&lt;br /&gt;
  function _nextStep() {&lt;br /&gt;
    if (typeof (this._currentStep) === &amp;#039;undefined&amp;#039;) {&lt;br /&gt;
      this._currentStep = 0;&lt;br /&gt;
    } else {&lt;br /&gt;
      ++this._currentStep;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if ((this._introItems.length) &amp;lt;= this._currentStep) {&lt;br /&gt;
      //end of the intro&lt;br /&gt;
      //check if any callback is defined&lt;br /&gt;
      if (typeof (this._introCompleteCallback) === &amp;#039;function&amp;#039;) {&lt;br /&gt;
        this._introCompleteCallback.call(this);&lt;br /&gt;
      }&lt;br /&gt;
      _exitIntro.call(this, this._targetElement);&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var nextStep = this._introItems[this._currentStep];&lt;br /&gt;
    if (typeof (this._introBeforeChangeCallback) !== &amp;#039;undefined&amp;#039;) {&lt;br /&gt;
      this._introBeforeChangeCallback.call(this, nextStep.element);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    _showElement.call(this, nextStep);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * Go to previous step on intro&lt;br /&gt;
   *&lt;br /&gt;
   * @api private&lt;br /&gt;
   * @method _nextStep&lt;br /&gt;
   */&lt;br /&gt;
  function _previousStep() {&lt;br /&gt;
    if (this._currentStep === 0) {&lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var nextStep = this._introItems[--this._currentStep];&lt;br /&gt;
    if (typeof (this._introBeforeChangeCallback) !== &amp;#039;undefined&amp;#039;) {&lt;br /&gt;
      this._introBeforeChangeCallback.call(this, nextStep.element);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    _showElement.call(this, nextStep);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * Exit from intro&lt;br /&gt;
   *&lt;br /&gt;
   * @api private&lt;br /&gt;
   * @method _exitIntro&lt;br /&gt;
   * @param {Object} targetElement&lt;br /&gt;
   */&lt;br /&gt;
  function _exitIntro(targetElement) {&lt;br /&gt;
    //remove overlay layer from the page&lt;br /&gt;
    var overlayLayer = targetElement.querySelector(&amp;#039;.introjs-overlay&amp;#039;);&lt;br /&gt;
    //for fade-out animation&lt;br /&gt;
    overlayLayer.style.opacity = 0;&lt;br /&gt;
    setTimeout(function () {&lt;br /&gt;
      if (overlayLayer.parentNode) {&lt;br /&gt;
        overlayLayer.parentNode.removeChild(overlayLayer);&lt;br /&gt;
      }&lt;br /&gt;
    }, 500);&lt;br /&gt;
    //remove all helper layers&lt;br /&gt;
    var helperLayer = targetElement.querySelector(&amp;#039;.introjs-helperLayer&amp;#039;);&lt;br /&gt;
    if (helperLayer) {&lt;br /&gt;
      helperLayer.parentNode.removeChild(helperLayer);&lt;br /&gt;
    }&lt;br /&gt;
    //remove `introjs-showElement` class from the element&lt;br /&gt;
    var showElement = document.querySelector(&amp;#039;.introjs-showElement&amp;#039;);&lt;br /&gt;
    if (showElement) {&lt;br /&gt;
      showElement.className = showElement.className.replace(/introjs-[a-zA-Z]+/g, &amp;#039;&amp;#039;).replace(/^\s+|\s+$/g, &amp;#039;&amp;#039;); // This is a manual trim.&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //remove `introjs-fixParent` class from the elements&lt;br /&gt;
    var fixParents = document.querySelectorAll(&amp;#039;.introjs-fixParent&amp;#039;);&lt;br /&gt;
    if (fixParents &amp;amp;&amp;amp; fixParents.length &amp;gt; 0) {&lt;br /&gt;
      for (var i = fixParents.length - 1; i &amp;gt;= 0; i--) {&lt;br /&gt;
        fixParents[i].className = fixParents[i].className.replace(/introjs-fixParent/g, &amp;#039;&amp;#039;).replace(/^\s+|\s+$/g, &amp;#039;&amp;#039;);&lt;br /&gt;
      };&lt;br /&gt;
    }&lt;br /&gt;
    //clean listeners&lt;br /&gt;
    if (window.removeEventListener) {&lt;br /&gt;
      window.removeEventListener(&amp;#039;keydown&amp;#039;, this._onKeyDown, true);&lt;br /&gt;
    } else if (document.detachEvent) { //IE&lt;br /&gt;
      document.detachEvent(&amp;#039;onkeydown&amp;#039;, this._onKeyDown);&lt;br /&gt;
    }&lt;br /&gt;
    //set the step to zero&lt;br /&gt;
    this._currentStep = undefined;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * Render tooltip box in the page&lt;br /&gt;
   *&lt;br /&gt;
   * @api private&lt;br /&gt;
   * @method _placeTooltip&lt;br /&gt;
   * @param {Object} targetElement&lt;br /&gt;
   * @param {Object} tooltipLayer&lt;br /&gt;
   * @param {Object} arrowLayer&lt;br /&gt;
   */&lt;br /&gt;
  function _placeTooltip(targetElement, tooltipLayer, arrowLayer) {&lt;br /&gt;
    //reset the old style&lt;br /&gt;
    tooltipLayer.style.top     = null;&lt;br /&gt;
    tooltipLayer.style.right   = null;&lt;br /&gt;
    tooltipLayer.style.bottom  = null;&lt;br /&gt;
    tooltipLayer.style.left    = null;&lt;br /&gt;
&lt;br /&gt;
    //prevent error when `this._currentStep` is undefined&lt;br /&gt;
    if (!this._introItems[this._currentStep]) return;&lt;br /&gt;
&lt;br /&gt;
    var tooltipCssClass = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    //if we have a custom css class for each step&lt;br /&gt;
    var currentStepObj = this._introItems[this._currentStep];&lt;br /&gt;
    if (typeof (currentStepObj.tooltipClass) === &amp;#039;string&amp;#039;) {&lt;br /&gt;
      tooltipCssClass = currentStepObj.tooltipClass;&lt;br /&gt;
    } else {&lt;br /&gt;
      tooltipCssClass = this._options.tooltipClass;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    tooltipLayer.className = (&amp;#039;introjs-tooltip &amp;#039; + tooltipCssClass).replace(/^\s+|\s+$/g, &amp;#039;&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
    //custom css class for tooltip boxes&lt;br /&gt;
    var tooltipCssClass = this._options.tooltipClass;&lt;br /&gt;
&lt;br /&gt;
    var currentTooltipPosition = this._introItems[this._currentStep].position;&lt;br /&gt;
    switch (currentTooltipPosition) {&lt;br /&gt;
      case &amp;#039;top&amp;#039;:&lt;br /&gt;
        tooltipLayer.style.left = &amp;#039;15px&amp;#039;;&lt;br /&gt;
        tooltipLayer.style.top = &amp;#039;-&amp;#039; + (_getOffset(tooltipLayer).height + 10) + &amp;#039;px&amp;#039;;&lt;br /&gt;
        arrowLayer.className = &amp;#039;introjs-arrow bottom&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
      case &amp;#039;right&amp;#039;:&lt;br /&gt;
        tooltipLayer.style.left = (_getOffset(targetElement).width + 20) + &amp;#039;px&amp;#039;;&lt;br /&gt;
        arrowLayer.className = &amp;#039;introjs-arrow left&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
      case &amp;#039;left&amp;#039;:&lt;br /&gt;
        tooltipLayer.style.top = &amp;#039;15px&amp;#039;;&lt;br /&gt;
        tooltipLayer.style.right = (_getOffset(targetElement).width + 20) + &amp;#039;px&amp;#039;;&lt;br /&gt;
        arrowLayer.className = &amp;#039;introjs-arrow right&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
      case &amp;#039;bottom&amp;#039;:&lt;br /&gt;
      // Bottom going to follow the default behavior&lt;br /&gt;
      default:&lt;br /&gt;
        tooltipLayer.style.bottom = &amp;#039;-&amp;#039; + (_getOffset(tooltipLayer).height + 10) + &amp;#039;px&amp;#039;;&lt;br /&gt;
        arrowLayer.className = &amp;#039;introjs-arrow top&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * Update the position of the helper layer on the screen&lt;br /&gt;
   *&lt;br /&gt;
   * @api private&lt;br /&gt;
   * @method _setHelperLayerPosition&lt;br /&gt;
   * @param {Object} helperLayer&lt;br /&gt;
   */&lt;br /&gt;
  function _setHelperLayerPosition(helperLayer) {&lt;br /&gt;
    if (helperLayer) {&lt;br /&gt;
      //prevent error when `this._currentStep` in undefined&lt;br /&gt;
      if (!this._introItems[this._currentStep]) return;&lt;br /&gt;
&lt;br /&gt;
      var elementPosition = _getOffset(this._introItems[this._currentStep].element);&lt;br /&gt;
      //set new position to helper layer&lt;br /&gt;
      helperLayer.setAttribute(&amp;#039;style&amp;#039;, &amp;#039;width: &amp;#039; + (elementPosition.width  + 10)  + &amp;#039;px; &amp;#039; +&lt;br /&gt;
                                        &amp;#039;height:&amp;#039; + (elementPosition.height + 10)  + &amp;#039;px; &amp;#039; +&lt;br /&gt;
                                        &amp;#039;top:&amp;#039;    + (elementPosition.top    - 5)   + &amp;#039;px;&amp;#039; +&lt;br /&gt;
                                        &amp;#039;left: &amp;#039;  + (elementPosition.left   - 5)   + &amp;#039;px;&amp;#039;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * Show an element on the page&lt;br /&gt;
   *&lt;br /&gt;
   * @api private&lt;br /&gt;
   * @method _showElement&lt;br /&gt;
   * @param {Object} targetElement&lt;br /&gt;
   */&lt;br /&gt;
  function _showElement(targetElement) {&lt;br /&gt;
&lt;br /&gt;
    if (typeof (this._introChangeCallback) !== &amp;#039;undefined&amp;#039;) {&lt;br /&gt;
        this._introChangeCallback.call(this, targetElement.element);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var self = this,&lt;br /&gt;
        oldHelperLayer = document.querySelector(&amp;#039;.introjs-helperLayer&amp;#039;),&lt;br /&gt;
        elementPosition = _getOffset(targetElement.element);&lt;br /&gt;
&lt;br /&gt;
    if (oldHelperLayer != null) {&lt;br /&gt;
      var oldHelperNumberLayer = oldHelperLayer.querySelector(&amp;#039;.introjs-helperNumberLayer&amp;#039;),&lt;br /&gt;
          oldtooltipLayer      = oldHelperLayer.querySelector(&amp;#039;.introjs-tooltiptext&amp;#039;),&lt;br /&gt;
          oldArrowLayer        = oldHelperLayer.querySelector(&amp;#039;.introjs-arrow&amp;#039;),&lt;br /&gt;
          oldtooltipContainer  = oldHelperLayer.querySelector(&amp;#039;.introjs-tooltip&amp;#039;),&lt;br /&gt;
          skipTooltipButton    = oldHelperLayer.querySelector(&amp;#039;.introjs-skipbutton&amp;#039;),&lt;br /&gt;
          prevTooltipButton    = oldHelperLayer.querySelector(&amp;#039;.introjs-prevbutton&amp;#039;),&lt;br /&gt;
          nextTooltipButton    = oldHelperLayer.querySelector(&amp;#039;.introjs-nextbutton&amp;#039;);&lt;br /&gt;
          &lt;br /&gt;
      //hide the tooltip&lt;br /&gt;
      oldtooltipContainer.style.opacity = 0;&lt;br /&gt;
&lt;br /&gt;
      //set new position to helper layer&lt;br /&gt;
      _setHelperLayerPosition.call(self, oldHelperLayer);&lt;br /&gt;
&lt;br /&gt;
      //remove `introjs-fixParent` class from the elements&lt;br /&gt;
      var fixParents = document.querySelectorAll(&amp;#039;.introjs-fixParent&amp;#039;);&lt;br /&gt;
      if (fixParents &amp;amp;&amp;amp; fixParents.length &amp;gt; 0) {&lt;br /&gt;
        for (var i = fixParents.length - 1; i &amp;gt;= 0; i--) {&lt;br /&gt;
          fixParents[i].className = fixParents[i].className.replace(/introjs-fixParent/g, &amp;#039;&amp;#039;).replace(/^\s+|\s+$/g, &amp;#039;&amp;#039;);&lt;br /&gt;
        };&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      //remove old classes&lt;br /&gt;
      var oldShowElement = document.querySelector(&amp;#039;.introjs-showElement&amp;#039;);&lt;br /&gt;
      oldShowElement.className = oldShowElement.className.replace(/introjs-[a-zA-Z]+/g, &amp;#039;&amp;#039;).replace(/^\s+|\s+$/g, &amp;#039;&amp;#039;);&lt;br /&gt;
      //we should wait until the CSS3 transition is competed (it&amp;#039;s 0.3 sec) to prevent incorrect `height` and `width` calculation&lt;br /&gt;
      if (self._lastShowElementTimer) {&lt;br /&gt;
        clearTimeout(self._lastShowElementTimer);&lt;br /&gt;
      }&lt;br /&gt;
      self._lastShowElementTimer = setTimeout(function() {&lt;br /&gt;
        //set current step to the label&lt;br /&gt;
        if (oldHelperNumberLayer != null) {&lt;br /&gt;
          oldHelperNumberLayer.innerHTML =targetElement.step;&lt;br /&gt;
        }&lt;br /&gt;
        //set current tooltip text&lt;br /&gt;
        oldtooltipLayer.innerHTML = targetElement.intro;&lt;br /&gt;
        //set the tooltip position&lt;br /&gt;
        _placeTooltip.call(self, targetElement.element, oldtooltipContainer, oldArrowLayer);&lt;br /&gt;
        &lt;br /&gt;
        //change active bullet&lt;br /&gt;
        oldHelperLayer.querySelector(&amp;#039;.introjs-bullets li &amp;gt; a.active&amp;#039;).className = &amp;#039;&amp;#039;;&lt;br /&gt;
        oldHelperLayer.querySelector(&amp;#039;.introjs-bullets li &amp;gt; a[data-stepnumber=&amp;quot;&amp;#039; + targetElement.step + &amp;#039;&amp;quot;]&amp;#039;).className = &amp;#039;active&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
        //show the tooltip&lt;br /&gt;
        oldtooltipContainer.style.opacity = 1;&lt;br /&gt;
      }, 350);&lt;br /&gt;
&lt;br /&gt;
    } else {&lt;br /&gt;
      var helperLayer       = document.createElement(&amp;#039;div&amp;#039;),&lt;br /&gt;
          arrowLayer        = document.createElement(&amp;#039;div&amp;#039;),&lt;br /&gt;
          tooltipLayer      = document.createElement(&amp;#039;div&amp;#039;),&lt;br /&gt;
          tooltipTextLayer  = document.createElement(&amp;#039;div&amp;#039;),&lt;br /&gt;
          bulletsLayer      = document.createElement(&amp;#039;div&amp;#039;),&lt;br /&gt;
          buttonsLayer      = document.createElement(&amp;#039;div&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
      helperLayer.className = &amp;#039;introjs-helperLayer&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
      //set new position to helper layer&lt;br /&gt;
      _setHelperLayerPosition.call(self, helperLayer);&lt;br /&gt;
&lt;br /&gt;
      //add helper layer to target element&lt;br /&gt;
      this._targetElement.appendChild(helperLayer);&lt;br /&gt;
&lt;br /&gt;
      arrowLayer.className = &amp;#039;introjs-arrow&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
      tooltipTextLayer.className = &amp;#039;introjs-tooltiptext&amp;#039;;&lt;br /&gt;
      tooltipTextLayer.innerHTML = targetElement.intro;&lt;br /&gt;
      &lt;br /&gt;
      bulletsLayer.className = &amp;#039;introjs-bullets&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
      if (this._options.showBullets === false) {&lt;br /&gt;
        bulletsLayer.style.display = &amp;#039;none&amp;#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      var ulContainer = document.createElement(&amp;#039;ul&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
      for (var i = 0, stepsLength = this._introItems.length; i &amp;lt; stepsLength; i++) {&lt;br /&gt;
        var innerLi    = document.createElement(&amp;#039;li&amp;#039;);&lt;br /&gt;
        var anchorLink = document.createElement(&amp;#039;a&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
        anchorLink.onclick = function() {&lt;br /&gt;
          self.goToStep(this.getAttribute(&amp;#039;data-stepnumber&amp;#039;));&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        if (i === 0) anchorLink.className = &amp;quot;active&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        anchorLink.href = &amp;#039;javascript:void(0);&amp;#039;;&lt;br /&gt;
        anchorLink.innerHTML = &amp;quot;&amp;amp;nbsp;&amp;quot;;&lt;br /&gt;
        anchorLink.setAttribute(&amp;#039;data-stepnumber&amp;#039;, this._introItems[i].step);&lt;br /&gt;
&lt;br /&gt;
        innerLi.appendChild(anchorLink);&lt;br /&gt;
        ulContainer.appendChild(innerLi);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      bulletsLayer.appendChild(ulContainer);&lt;br /&gt;
&lt;br /&gt;
      buttonsLayer.className = &amp;#039;introjs-tooltipbuttons&amp;#039;;&lt;br /&gt;
      if (this._options.showButtons === false) {&lt;br /&gt;
        buttonsLayer.style.display = &amp;#039;none&amp;#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      tooltipLayer.className = &amp;#039;introjs-tooltip&amp;#039;;&lt;br /&gt;
      tooltipLayer.appendChild(tooltipTextLayer);&lt;br /&gt;
      tooltipLayer.appendChild(bulletsLayer);&lt;br /&gt;
&lt;br /&gt;
      //add helper layer number&lt;br /&gt;
      if (this._options.showStepNumbers == true) {&lt;br /&gt;
        var helperNumberLayer = document.createElement(&amp;#039;span&amp;#039;);&lt;br /&gt;
        helperNumberLayer.className = &amp;#039;introjs-helperNumberLayer&amp;#039;;&lt;br /&gt;
        helperNumberLayer.innerHTML =targetElement.step;&lt;br /&gt;
        helperLayer.appendChild(helperNumberLayer);&lt;br /&gt;
      }&lt;br /&gt;
      tooltipLayer.appendChild(arrowLayer);&lt;br /&gt;
      helperLayer.appendChild(tooltipLayer);&lt;br /&gt;
&lt;br /&gt;
      //next button&lt;br /&gt;
      var nextTooltipButton = document.createElement(&amp;#039;a&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
      nextTooltipButton.onclick = function() {&lt;br /&gt;
        if (self._introItems.length - 1 != self._currentStep) {&lt;br /&gt;
          _nextStep.call(self);&lt;br /&gt;
        }&lt;br /&gt;
      };&lt;br /&gt;
&lt;br /&gt;
      nextTooltipButton.href = &amp;#039;javascript:void(0);&amp;#039;;&lt;br /&gt;
      nextTooltipButton.innerHTML = this._options.nextLabel;&lt;br /&gt;
&lt;br /&gt;
      //previous button&lt;br /&gt;
      var prevTooltipButton = document.createElement(&amp;#039;a&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
      prevTooltipButton.onclick = function() {&lt;br /&gt;
        if (self._currentStep != 0) {&lt;br /&gt;
          _previousStep.call(self);&lt;br /&gt;
        }&lt;br /&gt;
      };&lt;br /&gt;
&lt;br /&gt;
      prevTooltipButton.href = &amp;#039;javascript:void(0);&amp;#039;;&lt;br /&gt;
      prevTooltipButton.innerHTML = this._options.prevLabel;&lt;br /&gt;
&lt;br /&gt;
      //skip button&lt;br /&gt;
      var skipTooltipButton = document.createElement(&amp;#039;a&amp;#039;);&lt;br /&gt;
      skipTooltipButton.className = &amp;#039;introjs-button introjs-skipbutton&amp;#039;;&lt;br /&gt;
      skipTooltipButton.href = &amp;#039;javascript:void(0);&amp;#039;;&lt;br /&gt;
      skipTooltipButton.innerHTML = this._options.skipLabel;&lt;br /&gt;
&lt;br /&gt;
      skipTooltipButton.onclick = function() {&lt;br /&gt;
        if (self._introItems.length - 1 == self._currentStep &amp;amp;&amp;amp; typeof (self._introCompleteCallback) === &amp;#039;function&amp;#039;) {&lt;br /&gt;
          self._introCompleteCallback.call(self);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (self._introItems.length - 1 != self._currentStep &amp;amp;&amp;amp; typeof (self._introExitCallback) === &amp;#039;function&amp;#039;) {&lt;br /&gt;
          self._introExitCallback.call(self);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        _exitIntro.call(self, self._targetElement);&lt;br /&gt;
      };&lt;br /&gt;
&lt;br /&gt;
      buttonsLayer.appendChild(skipTooltipButton);&lt;br /&gt;
&lt;br /&gt;
      //in order to prevent displaying next/previous button always&lt;br /&gt;
      if (this._introItems.length &amp;gt; 1) {&lt;br /&gt;
        buttonsLayer.appendChild(nextTooltipButton);&lt;br /&gt;
        buttonsLayer.appendChild(prevTooltipButton);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      tooltipLayer.appendChild(buttonsLayer);&lt;br /&gt;
&lt;br /&gt;
      //set proper position&lt;br /&gt;
      _placeTooltip.call(self, targetElement.element, tooltipLayer, arrowLayer);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (this._currentStep == 0) {&lt;br /&gt;
      prevTooltipButton.className = &amp;#039;introjs-button introjs-prevbutton introjs-disabled&amp;#039;;&lt;br /&gt;
      nextTooltipButton.className = &amp;#039;introjs-button introjs-nextbutton&amp;#039;;&lt;br /&gt;
      skipTooltipButton.innerHTML = this._options.skipLabel;&lt;br /&gt;
    } else if (this._introItems.length - 1 == this._currentStep) {&lt;br /&gt;
      skipTooltipButton.innerHTML = this._options.doneLabel;&lt;br /&gt;
      prevTooltipButton.className = &amp;#039;introjs-button introjs-prevbutton&amp;#039;;&lt;br /&gt;
      nextTooltipButton.className = &amp;#039;introjs-button introjs-nextbutton introjs-disabled&amp;#039;;&lt;br /&gt;
    } else {&lt;br /&gt;
      prevTooltipButton.className = &amp;#039;introjs-button introjs-prevbutton&amp;#039;;&lt;br /&gt;
      nextTooltipButton.className = &amp;#039;introjs-button introjs-nextbutton&amp;#039;;&lt;br /&gt;
      skipTooltipButton.innerHTML = this._options.skipLabel;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //Set focus on &amp;quot;next&amp;quot; button, so that hitting Enter always moves you onto the next step&lt;br /&gt;
    nextTooltipButton.focus();&lt;br /&gt;
&lt;br /&gt;
    //add target element position style&lt;br /&gt;
    targetElement.element.className += &amp;#039; introjs-showElement&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    var currentElementPosition = _getPropValue(targetElement.element, &amp;#039;position&amp;#039;);&lt;br /&gt;
    if (currentElementPosition !== &amp;#039;absolute&amp;#039; &amp;amp;&amp;amp;&lt;br /&gt;
        currentElementPosition !== &amp;#039;relative&amp;#039;) {&lt;br /&gt;
      //change to new intro item&lt;br /&gt;
      targetElement.element.className += &amp;#039; introjs-relativePosition&amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var parentElm = targetElement.element.parentNode;&lt;br /&gt;
    while (parentElm != null) {&lt;br /&gt;
      if (parentElm.tagName.toLowerCase() === &amp;#039;body&amp;#039;) break;&lt;br /&gt;
&lt;br /&gt;
      var zIndex = _getPropValue(parentElm, &amp;#039;z-index&amp;#039;);&lt;br /&gt;
      if (/[0-9]+/.test(zIndex)) {&lt;br /&gt;
        parentElm.className += &amp;#039; introjs-fixParent&amp;#039;;&lt;br /&gt;
      }&lt;br /&gt;
      parentElm = parentElm.parentNode;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (!_elementInViewport(targetElement.element)) {&lt;br /&gt;
      var rect = targetElement.element.getBoundingClientRect(),&lt;br /&gt;
        winHeight=_getWinSize().height,&lt;br /&gt;
        top = rect.bottom - (rect.bottom - rect.top),&lt;br /&gt;
        bottom = rect.bottom - winHeight;&lt;br /&gt;
&lt;br /&gt;
      //Scroll up&lt;br /&gt;
      if (top &amp;lt; 0 || targetElement.element.clientHeight &amp;gt; winHeight) {&lt;br /&gt;
        window.scrollBy(0, top - 30); // 30px padding from edge to look nice&lt;br /&gt;
&lt;br /&gt;
      //Scroll down&lt;br /&gt;
      } else {&lt;br /&gt;
        window.scrollBy(0, bottom + 100); // 70px + 30px padding from edge to look nice&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * Get an element CSS property on the page&lt;br /&gt;
   * Thanks to JavaScript Kit: http://www.javascriptkit.com/dhtmltutors/dhtmlcascade4.shtml&lt;br /&gt;
   *&lt;br /&gt;
   * @api private&lt;br /&gt;
   * @method _getPropValue&lt;br /&gt;
   * @param {Object} element&lt;br /&gt;
   * @param {String} propName&lt;br /&gt;
   * @returns Element&amp;#039;s property value&lt;br /&gt;
   */&lt;br /&gt;
  function _getPropValue (element, propName) {&lt;br /&gt;
    var propValue = &amp;#039;&amp;#039;;&lt;br /&gt;
    if (element.currentStyle) { //IE&lt;br /&gt;
      propValue = element.currentStyle[propName];&lt;br /&gt;
    } else if (document.defaultView &amp;amp;&amp;amp; document.defaultView.getComputedStyle) { //Others&lt;br /&gt;
      propValue = document.defaultView.getComputedStyle(element, null).getPropertyValue(propName);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //Prevent exception in IE&lt;br /&gt;
    if (propValue &amp;amp;&amp;amp; propValue.toLowerCase) {&lt;br /&gt;
      return propValue.toLowerCase();&lt;br /&gt;
    } else {&lt;br /&gt;
      return propValue;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * Provides a cross-browser way to get the screen dimensions&lt;br /&gt;
   * via: http://stackoverflow.com/questions/5864467/internet-explorer-innerheight&lt;br /&gt;
   *&lt;br /&gt;
   * @api private&lt;br /&gt;
   * @method _getWinSize&lt;br /&gt;
   * @returns {Object} width and height attributes&lt;br /&gt;
   */&lt;br /&gt;
  function _getWinSize() {&lt;br /&gt;
    if (window.innerWidth != undefined) {&lt;br /&gt;
      return { width: window.innerWidth, height: window.innerHeight };&lt;br /&gt;
    } else {&lt;br /&gt;
      var D = document.documentElement;&lt;br /&gt;
      return { width: D.clientWidth, height: D.clientHeight };&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * Add overlay layer to the page&lt;br /&gt;
   * http://stackoverflow.com/questions/123999/how-to-tell-if-a-dom-element-is-visible-in-the-current-viewport&lt;br /&gt;
   *&lt;br /&gt;
   * @api private&lt;br /&gt;
   * @method _elementInViewport&lt;br /&gt;
   * @param {Object} el&lt;br /&gt;
   */&lt;br /&gt;
  function _elementInViewport(el) {&lt;br /&gt;
    var rect = el.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
    return (&lt;br /&gt;
      rect.top &amp;gt;= 0 &amp;amp;&amp;amp;&lt;br /&gt;
      rect.left &amp;gt;= 0 &amp;amp;&amp;amp;&lt;br /&gt;
      (rect.bottom+80) &amp;lt;= window.innerHeight &amp;amp;&amp;amp; // add 80 to get the text right&lt;br /&gt;
      rect.right &amp;lt;= window.innerWidth&lt;br /&gt;
    );&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * Add overlay layer to the page&lt;br /&gt;
   *&lt;br /&gt;
   * @api private&lt;br /&gt;
   * @method _addOverlayLayer&lt;br /&gt;
   * @param {Object} targetElm&lt;br /&gt;
   */&lt;br /&gt;
  function _addOverlayLayer(targetElm) {&lt;br /&gt;
    var overlayLayer = document.createElement(&amp;#039;div&amp;#039;),&lt;br /&gt;
        styleText = &amp;#039;&amp;#039;,&lt;br /&gt;
        self = this;&lt;br /&gt;
&lt;br /&gt;
    //set css class name&lt;br /&gt;
    overlayLayer.className = &amp;#039;introjs-overlay&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    //check if the target element is body, we should calculate the size of overlay layer in a better way&lt;br /&gt;
    if (targetElm.tagName.toLowerCase() === &amp;#039;body&amp;#039;) {&lt;br /&gt;
      styleText += &amp;#039;top: 0;bottom: 0; left: 0;right: 0;position: fixed;&amp;#039;;&lt;br /&gt;
      overlayLayer.setAttribute(&amp;#039;style&amp;#039;, styleText);&lt;br /&gt;
    } else {&lt;br /&gt;
      //set overlay layer position&lt;br /&gt;
      var elementPosition = _getOffset(targetElm);&lt;br /&gt;
      if (elementPosition) {&lt;br /&gt;
        styleText += &amp;#039;width: &amp;#039; + elementPosition.width + &amp;#039;px; height:&amp;#039; + elementPosition.height + &amp;#039;px; top:&amp;#039; + elementPosition.top + &amp;#039;px;left: &amp;#039; + elementPosition.left + &amp;#039;px;&amp;#039;;&lt;br /&gt;
        overlayLayer.setAttribute(&amp;#039;style&amp;#039;, styleText);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    targetElm.appendChild(overlayLayer);&lt;br /&gt;
&lt;br /&gt;
    overlayLayer.onclick = function() {&lt;br /&gt;
      if (self._options.exitOnOverlayClick == true) {&lt;br /&gt;
        _exitIntro.call(self, targetElm);&lt;br /&gt;
&lt;br /&gt;
        //check if any callback is defined&lt;br /&gt;
        if (self._introExitCallback != undefined) {&lt;br /&gt;
          self._introExitCallback.call(self);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    setTimeout(function() {&lt;br /&gt;
      styleText += &amp;#039;opacity: .8;&amp;#039;;&lt;br /&gt;
      overlayLayer.setAttribute(&amp;#039;style&amp;#039;, styleText);&lt;br /&gt;
    }, 10);&lt;br /&gt;
    return true;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * Get an element position on the page&lt;br /&gt;
   * Thanks to `meouw`: http://stackoverflow.com/a/442474/375966&lt;br /&gt;
   *&lt;br /&gt;
   * @api private&lt;br /&gt;
   * @method _getOffset&lt;br /&gt;
   * @param {Object} element&lt;br /&gt;
   * @returns Element&amp;#039;s position info&lt;br /&gt;
   */&lt;br /&gt;
  function _getOffset(element) {&lt;br /&gt;
    var elementPosition = {};&lt;br /&gt;
&lt;br /&gt;
    //set width&lt;br /&gt;
    elementPosition.width = element.offsetWidth;&lt;br /&gt;
&lt;br /&gt;
    //set height&lt;br /&gt;
    elementPosition.height = element.offsetHeight;&lt;br /&gt;
&lt;br /&gt;
    //calculate element top and left&lt;br /&gt;
    var _x = 0;&lt;br /&gt;
    var _y = 0;&lt;br /&gt;
    while (element &amp;amp;&amp;amp; !isNaN(element.offsetLeft) &amp;amp;&amp;amp; !isNaN(element.offsetTop)) {&lt;br /&gt;
      _x += element.offsetLeft;&lt;br /&gt;
      _y += element.offsetTop;&lt;br /&gt;
      element = element.offsetParent;&lt;br /&gt;
    }&lt;br /&gt;
    //set top&lt;br /&gt;
    elementPosition.top = _y;&lt;br /&gt;
    //set left&lt;br /&gt;
    elementPosition.left = _x;&lt;br /&gt;
&lt;br /&gt;
    return elementPosition;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * Overwrites obj1&amp;#039;s values with obj2&amp;#039;s and adds obj2&amp;#039;s if non existent in obj1&lt;br /&gt;
   * via: http://stackoverflow.com/questions/171251/how-can-i-merge-properties-of-two-javascript-objects-dynamically&lt;br /&gt;
   *&lt;br /&gt;
   * @param obj1&lt;br /&gt;
   * @param obj2&lt;br /&gt;
   * @returns obj3 a new object based on obj1 and obj2&lt;br /&gt;
   */&lt;br /&gt;
  function _mergeOptions(obj1,obj2) {&lt;br /&gt;
    var obj3 = {};&lt;br /&gt;
    for (var attrname in obj1) { obj3[attrname] = obj1[attrname]; }&lt;br /&gt;
    for (var attrname in obj2) { obj3[attrname] = obj2[attrname]; }&lt;br /&gt;
    return obj3;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var introJs = function (targetElm) {&lt;br /&gt;
    if (typeof (targetElm) === &amp;#039;object&amp;#039;) {&lt;br /&gt;
      //Ok, create a new instance&lt;br /&gt;
      return new IntroJs(targetElm);&lt;br /&gt;
&lt;br /&gt;
    } else if (typeof (targetElm) === &amp;#039;string&amp;#039;) {&lt;br /&gt;
      //select the target element with query selector&lt;br /&gt;
      var targetElement = document.querySelector(targetElm);&lt;br /&gt;
&lt;br /&gt;
      if (targetElement) {&lt;br /&gt;
        return new IntroJs(targetElement);&lt;br /&gt;
      } else {&lt;br /&gt;
        throw new Error(&amp;#039;There is no element with given selector.&amp;#039;);&lt;br /&gt;
      }&lt;br /&gt;
    } else {&lt;br /&gt;
      return new IntroJs(document.body);&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * Current IntroJs version&lt;br /&gt;
   *&lt;br /&gt;
   * @property version&lt;br /&gt;
   * @type String&lt;br /&gt;
   */&lt;br /&gt;
  introJs.version = VERSION;&lt;br /&gt;
&lt;br /&gt;
  //Prototype&lt;br /&gt;
  introJs.fn = IntroJs.prototype = {&lt;br /&gt;
    clone: function () {&lt;br /&gt;
      return new IntroJs(this);&lt;br /&gt;
    },&lt;br /&gt;
    setOption: function(option, value) {&lt;br /&gt;
      this._options[option] = value;&lt;br /&gt;
      return this;&lt;br /&gt;
    },&lt;br /&gt;
    setOptions: function(options) {&lt;br /&gt;
      this._options = _mergeOptions(this._options, options);&lt;br /&gt;
      return this;&lt;br /&gt;
    },&lt;br /&gt;
    start: function () {&lt;br /&gt;
      _introForElement.call(this, this._targetElement);&lt;br /&gt;
      return this;&lt;br /&gt;
    },&lt;br /&gt;
    goToStep: function(step) {&lt;br /&gt;
      _goToStep.call(this, step);&lt;br /&gt;
      return this;&lt;br /&gt;
    },&lt;br /&gt;
    exit: function() {&lt;br /&gt;
      _exitIntro.call(this, this._targetElement);&lt;br /&gt;
    },&lt;br /&gt;
    refresh: function() {&lt;br /&gt;
      _setHelperLayerPosition.call(this, document.querySelector(&amp;#039;.introjs-helperLayer&amp;#039;));&lt;br /&gt;
      return this;&lt;br /&gt;
    },&lt;br /&gt;
    onbeforechange: function(providedCallback) {&lt;br /&gt;
      if (typeof (providedCallback) === &amp;#039;function&amp;#039;) {&lt;br /&gt;
        this._introBeforeChangeCallback = providedCallback;&lt;br /&gt;
      } else {&lt;br /&gt;
        throw new Error(&amp;#039;Provided callback for onbeforechange was not a function&amp;#039;);&lt;br /&gt;
      }&lt;br /&gt;
      return this;&lt;br /&gt;
    },&lt;br /&gt;
    onchange: function(providedCallback) {&lt;br /&gt;
      if (typeof (providedCallback) === &amp;#039;function&amp;#039;) {&lt;br /&gt;
        this._introChangeCallback = providedCallback;&lt;br /&gt;
      } else {&lt;br /&gt;
        throw new Error(&amp;#039;Provided callback for onchange was not a function.&amp;#039;);&lt;br /&gt;
      }&lt;br /&gt;
      return this;&lt;br /&gt;
    },&lt;br /&gt;
    oncomplete: function(providedCallback) {&lt;br /&gt;
      if (typeof (providedCallback) === &amp;#039;function&amp;#039;) {&lt;br /&gt;
        this._introCompleteCallback = providedCallback;&lt;br /&gt;
      } else {&lt;br /&gt;
        throw new Error(&amp;#039;Provided callback for oncomplete was not a function.&amp;#039;);&lt;br /&gt;
      }&lt;br /&gt;
      return this;&lt;br /&gt;
    },&lt;br /&gt;
    onexit: function(providedCallback) {&lt;br /&gt;
      if (typeof (providedCallback) === &amp;#039;function&amp;#039;) {&lt;br /&gt;
        this._introExitCallback = providedCallback;&lt;br /&gt;
      } else {&lt;br /&gt;
        throw new Error(&amp;#039;Provided callback for onexit was not a function.&amp;#039;);&lt;br /&gt;
      }&lt;br /&gt;
      return this;&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  exports.introJs = introJs;&lt;br /&gt;
  return introJs;&lt;br /&gt;
}));&lt;/div&gt;</summary>
		<author><name>Rootadmin</name></author>
	</entry>
</feed>