Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / ui / new_ui / ui / javascripts / foundation / foundation.joyride.js @ 65635b1b

History | View | Annotate | Download (18.9 kB)

1 b3c1328b Olga Brani
/*jslint unparam: true, browser: true, indent: 2 */
2 b3c1328b Olga Brani
3 b3c1328b Olga Brani
;(function ($, window, document, undefined) {
4 b3c1328b Olga Brani
  'use strict';
5 b3c1328b Olga Brani
6 b3c1328b Olga Brani
  Foundation.libs.joyride = {
7 b3c1328b Olga Brani
    name: 'joyride',
8 b3c1328b Olga Brani
9 b3c1328b Olga Brani
    version : '4.0.0',
10 b3c1328b Olga Brani
11 b3c1328b Olga Brani
    defaults : {
12 b3c1328b Olga Brani
      tipLocation          : 'bottom',  // 'top' or 'bottom' in relation to parent
13 b3c1328b Olga Brani
      nubPosition          : 'auto',    // override on a per tooltip bases
14 b3c1328b Olga Brani
      scrollSpeed          : 300,       // Page scrolling speed in milliseconds
15 b3c1328b Olga Brani
      timer                : 0,         // 0 = no timer , all other numbers = timer in milliseconds
16 b3c1328b Olga Brani
      startTimerOnClick    : true,      // true or false - true requires clicking the first button start the timer
17 b3c1328b Olga Brani
      startOffset          : 0,         // the index of the tooltip you want to start on (index of the li)
18 b3c1328b Olga Brani
      nextButton           : true,      // true or false to control whether a next button is used
19 b3c1328b Olga Brani
      tipAnimation         : 'fade',    // 'pop' or 'fade' in each tip
20 b3c1328b Olga Brani
      pauseAfter           : [],        // array of indexes where to pause the tour after
21 b3c1328b Olga Brani
      tipAnimationFadeSpeed: 300,       // when tipAnimation = 'fade' this is speed in milliseconds for the transition
22 b3c1328b Olga Brani
      cookieMonster        : false,     // true or false to control whether cookies are used
23 b3c1328b Olga Brani
      cookieName           : 'joyride', // Name the cookie you'll use
24 b3c1328b Olga Brani
      cookieDomain         : false,     // Will this cookie be attached to a domain, ie. '.notableapp.com'
25 b3c1328b Olga Brani
      cookieExpires        : 365,       // set when you would like the cookie to expire.
26 b3c1328b Olga Brani
      tipContainer         : 'body',    // Where will the tip be attached
27 b3c1328b Olga Brani
      postRideCallback     : function (){},    // A method to call once the tour closes (canceled or complete)
28 b3c1328b Olga Brani
      postStepCallback     : function (){},    // A method to call after each step
29 b3c1328b Olga Brani
      template : { // HTML segments for tip layout
30 b3c1328b Olga Brani
        link    : '<a href="#close" class="joyride-close-tip">&times;</a>',
31 b3c1328b Olga Brani
        timer   : '<div class="joyride-timer-indicator-wrap"><span class="joyride-timer-indicator"></span></div>',
32 b3c1328b Olga Brani
        tip     : '<div class="joyride-tip-guide"><span class="joyride-nub"></span></div>',
33 b3c1328b Olga Brani
        wrapper : '<div class="joyride-content-wrapper"></div>',
34 b3c1328b Olga Brani
        button  : '<a href="#" class="small button joyride-next-tip"></a>'
35 b3c1328b Olga Brani
      }
36 b3c1328b Olga Brani
    },
37 b3c1328b Olga Brani
38 b3c1328b Olga Brani
    settings : {},
39 b3c1328b Olga Brani
40 b3c1328b Olga Brani
    init : function (scope, method, options) {
41 b3c1328b Olga Brani
      this.scope = scope || this.scope;
42 b3c1328b Olga Brani
      Foundation.inherit(this, 'throttle data_options scrollTo scrollLeft delay');
43 b3c1328b Olga Brani
44 b3c1328b Olga Brani
      if (typeof method === 'object') {
45 b3c1328b Olga Brani
        $.extend(true, this.settings, this.defaults, method);
46 b3c1328b Olga Brani
      } else {
47 b3c1328b Olga Brani
        $.extend(true, this.settings, this.defaults, options);
48 b3c1328b Olga Brani
      }
49 b3c1328b Olga Brani
50 b3c1328b Olga Brani
      if (typeof method != 'string') {
51 b3c1328b Olga Brani
        if (!this.settings.init) this.events();
52 b3c1328b Olga Brani
53 b3c1328b Olga Brani
        return this.settings.init;
54 b3c1328b Olga Brani
      } else {
55 b3c1328b Olga Brani
        return this[method].call(this, options);
56 b3c1328b Olga Brani
      }
57 b3c1328b Olga Brani
    },
58 b3c1328b Olga Brani
59 b3c1328b Olga Brani
    events : function () {
60 b3c1328b Olga Brani
      var self = this;
61 b3c1328b Olga Brani
62 b3c1328b Olga Brani
      $(this.scope)
63 b3c1328b Olga Brani
        .on('click.joyride', '.joyride-next-tip, .joyride-modal-bg', function (e) {
64 b3c1328b Olga Brani
          e.preventDefault();
65 b3c1328b Olga Brani
66 b3c1328b Olga Brani
          if (this.settings.$li.next().length < 1) {
67 b3c1328b Olga Brani
            this.end();
68 b3c1328b Olga Brani
          } else if (this.settings.timer > 0) {
69 b3c1328b Olga Brani
            clearTimeout(this.settings.automate);
70 b3c1328b Olga Brani
            this.hide();
71 b3c1328b Olga Brani
            this.show();
72 b3c1328b Olga Brani
            this.startTimer();
73 b3c1328b Olga Brani
          } else {
74 b3c1328b Olga Brani
            this.hide();
75 b3c1328b Olga Brani
            this.show();
76 b3c1328b Olga Brani
          }
77 b3c1328b Olga Brani
78 b3c1328b Olga Brani
        }.bind(this))
79 b3c1328b Olga Brani
80 b3c1328b Olga Brani
        .on('click.joyride', '.joyride-close-tip', function (e) {
81 b3c1328b Olga Brani
          e.preventDefault();
82 b3c1328b Olga Brani
          this.end();
83 b3c1328b Olga Brani
        }.bind(this));
84 b3c1328b Olga Brani
85 b3c1328b Olga Brani
      $(window).on('resize.fndtn.joyride', self.throttle(function () {
86 b3c1328b Olga Brani
        if ($('[data-joyride]').length > 0 && self.settings.$next_tip) {
87 b3c1328b Olga Brani
          if (self.is_phone()) {
88 b3c1328b Olga Brani
            self.pos_phone();
89 b3c1328b Olga Brani
          } else {
90 b3c1328b Olga Brani
            self.pos_default();
91 b3c1328b Olga Brani
          }
92 b3c1328b Olga Brani
        }
93 b3c1328b Olga Brani
      }, 100));
94 b3c1328b Olga Brani
95 b3c1328b Olga Brani
      this.settings.init = true;
96 b3c1328b Olga Brani
    },
97 b3c1328b Olga Brani
98 b3c1328b Olga Brani
    start : function () {
99 b3c1328b Olga Brani
      var self = this,
100 b3c1328b Olga Brani
          $this = $(this.scope).find('[data-joyride]'),
101 b3c1328b Olga Brani
          integer_settings = ['timer', 'scrollSpeed', 'startOffset', 'tipAnimationFadeSpeed', 'cookieExpires'],
102 b3c1328b Olga Brani
          int_settings_count = integer_settings.length;
103 b3c1328b Olga Brani
104 b3c1328b Olga Brani
      if (!this.settings.init) this.init();
105 b3c1328b Olga Brani
      
106 b3c1328b Olga Brani
      // non configureable settings
107 b3c1328b Olga Brani
      this.settings.$content_el = $this;
108 b3c1328b Olga Brani
      this.settings.body_offset = $(this.settings.tipContainer).position();
109 b3c1328b Olga Brani
      this.settings.$tip_content = this.settings.$content_el.find('> li');
110 b3c1328b Olga Brani
      this.settings.paused = false;
111 b3c1328b Olga Brani
      this.settings.attempts = 0;
112 b3c1328b Olga Brani
113 b3c1328b Olga Brani
      this.settings.tipLocationPatterns = {
114 b3c1328b Olga Brani
        top: ['bottom'],
115 b3c1328b Olga Brani
        bottom: [], // bottom should not need to be repositioned
116 b3c1328b Olga Brani
        left: ['right', 'top', 'bottom'],
117 b3c1328b Olga Brani
        right: ['left', 'top', 'bottom']
118 b3c1328b Olga Brani
      };
119 b3c1328b Olga Brani
120 b3c1328b Olga Brani
      // can we create cookies?
121 b3c1328b Olga Brani
      if (typeof $.cookie !== 'function') {
122 b3c1328b Olga Brani
        this.settings.cookieMonster = false;
123 b3c1328b Olga Brani
      }
124 b3c1328b Olga Brani
125 b3c1328b Olga Brani
      // generate the tips and insert into dom.
126 b3c1328b Olga Brani
      if (!this.settings.cookieMonster || this.settings.cookieMonster && $.cookie(this.settings.cookieName) === null) {
127 b3c1328b Olga Brani
        this.settings.$tip_content.each(function (index) {
128 b3c1328b Olga Brani
          var $this = $(this);
129 b3c1328b Olga Brani
          $.extend(true, self.settings, self.data_options($this));
130 b3c1328b Olga Brani
          // Make sure that settings parsed from data_options are integers where necessary
131 b3c1328b Olga Brani
          for (var i = int_settings_count - 1; i >= 0; i--) {
132 b3c1328b Olga Brani
            self.settings[integer_settings[i]] = parseInt(self.settings[integer_settings[i]], 10);
133 b3c1328b Olga Brani
          }
134 b3c1328b Olga Brani
          self.create({$li : $this, index : index});
135 b3c1328b Olga Brani
        });
136 b3c1328b Olga Brani
137 b3c1328b Olga Brani
        // show first tip
138 b3c1328b Olga Brani
        if (!this.settings.startTimerOnClick && this.settings.timer > 0) {
139 b3c1328b Olga Brani
          this.show('init');
140 b3c1328b Olga Brani
          this.startTimer();
141 b3c1328b Olga Brani
        } else {
142 b3c1328b Olga Brani
          this.show('init');
143 b3c1328b Olga Brani
        }
144 b3c1328b Olga Brani
145 b3c1328b Olga Brani
      }
146 b3c1328b Olga Brani
    },
147 b3c1328b Olga Brani
148 b3c1328b Olga Brani
    resume : function () {
149 b3c1328b Olga Brani
      this.set_li();
150 b3c1328b Olga Brani
      this.show();
151 b3c1328b Olga Brani
    },
152 b3c1328b Olga Brani
153 b3c1328b Olga Brani
    tip_template : function (opts) {
154 b3c1328b Olga Brani
      var $blank, content;
155 b3c1328b Olga Brani
156 b3c1328b Olga Brani
      opts.tip_class = opts.tip_class || '';
157 b3c1328b Olga Brani
158 b3c1328b Olga Brani
      $blank = $(this.settings.template.tip).addClass(opts.tip_class);
159 b3c1328b Olga Brani
      content = $.trim($(opts.li).html()) +
160 b3c1328b Olga Brani
        this.button_text(opts.button_text) +
161 b3c1328b Olga Brani
        this.settings.template.link +
162 b3c1328b Olga Brani
        this.timer_instance(opts.index);
163 b3c1328b Olga Brani
164 b3c1328b Olga Brani
      $blank.append($(this.settings.template.wrapper));
165 b3c1328b Olga Brani
      $blank.first().attr('data-index', opts.index);
166 b3c1328b Olga Brani
      $('.joyride-content-wrapper', $blank).append(content);
167 b3c1328b Olga Brani
168 b3c1328b Olga Brani
      return $blank[0];
169 b3c1328b Olga Brani
    },
170 b3c1328b Olga Brani
171 b3c1328b Olga Brani
    timer_instance : function (index) {
172 b3c1328b Olga Brani
      var txt;
173 b3c1328b Olga Brani
174 b3c1328b Olga Brani
      if ((index === 0 && this.settings.startTimerOnClick && this.settings.timer > 0) || this.settings.timer === 0) {
175 b3c1328b Olga Brani
        txt = '';
176 b3c1328b Olga Brani
      } else {
177 b3c1328b Olga Brani
        txt = this.outerHTML($(this.settings.template.timer)[0]);
178 b3c1328b Olga Brani
      }
179 b3c1328b Olga Brani
      return txt;
180 b3c1328b Olga Brani
    },
181 b3c1328b Olga Brani
182 b3c1328b Olga Brani
    button_text : function (txt) {
183 b3c1328b Olga Brani
      if (this.settings.nextButton) {
184 b3c1328b Olga Brani
        txt = $.trim(txt) || 'Next';
185 b3c1328b Olga Brani
        txt = this.outerHTML($(this.settings.template.button).append(txt)[0]);
186 b3c1328b Olga Brani
      } else {
187 b3c1328b Olga Brani
        txt = '';
188 b3c1328b Olga Brani
      }
189 b3c1328b Olga Brani
      return txt;
190 b3c1328b Olga Brani
    },
191 b3c1328b Olga Brani
192 b3c1328b Olga Brani
    create : function (opts) {
193 b3c1328b Olga Brani
      var buttonText = opts.$li.attr('data-button') || opts.$li.attr('data-text'),
194 b3c1328b Olga Brani
        tipClass = opts.$li.attr('class'),
195 b3c1328b Olga Brani
        $tip_content = $(this.tip_template({
196 b3c1328b Olga Brani
          tip_class : tipClass,
197 b3c1328b Olga Brani
          index : opts.index,
198 b3c1328b Olga Brani
          button_text : buttonText,
199 b3c1328b Olga Brani
          li : opts.$li
200 b3c1328b Olga Brani
        }));
201 b3c1328b Olga Brani
202 b3c1328b Olga Brani
      $(this.settings.tipContainer).append($tip_content);
203 b3c1328b Olga Brani
    },
204 b3c1328b Olga Brani
205 b3c1328b Olga Brani
    show : function (init) {
206 b3c1328b Olga Brani
      var $timer = null;
207 b3c1328b Olga Brani
208 b3c1328b Olga Brani
      // are we paused?
209 b3c1328b Olga Brani
      if (this.settings.$li === undefined
210 b3c1328b Olga Brani
        || ($.inArray(this.settings.$li.index(), this.settings.pauseAfter) === -1)) {
211 b3c1328b Olga Brani
212 b3c1328b Olga Brani
        // don't go to the next li if the tour was paused
213 b3c1328b Olga Brani
        if (this.settings.paused) {
214 b3c1328b Olga Brani
          this.settings.paused = false;
215 b3c1328b Olga Brani
        } else {
216 b3c1328b Olga Brani
          this.set_li(init);
217 b3c1328b Olga Brani
        }
218 b3c1328b Olga Brani
219 b3c1328b Olga Brani
        this.settings.attempts = 0;
220 b3c1328b Olga Brani
221 b3c1328b Olga Brani
        if (this.settings.$li.length && this.settings.$target.length > 0) {
222 b3c1328b Olga Brani
223 b3c1328b Olga Brani
          this.settings.tipSettings = $.extend(this.settings, this.data_options(this.settings.$li));
224 b3c1328b Olga Brani
225 b3c1328b Olga Brani
          this.settings.timer = parseInt(this.settings.timer, 10);
226 b3c1328b Olga Brani
227 b3c1328b Olga Brani
          this.settings.tipSettings.tipLocationPattern = this.settings.tipLocationPatterns[this.settings.tipSettings.tipLocation];
228 b3c1328b Olga Brani
229 b3c1328b Olga Brani
          // scroll if not modal
230 b3c1328b Olga Brani
          if (!/body/i.test(this.settings.$target.selector)) {
231 b3c1328b Olga Brani
            this.scroll_to();
232 b3c1328b Olga Brani
          }
233 b3c1328b Olga Brani
234 b3c1328b Olga Brani
          if (this.is_phone()) {
235 b3c1328b Olga Brani
            this.pos_phone(true);
236 b3c1328b Olga Brani
          } else {
237 b3c1328b Olga Brani
            this.pos_default(true);
238 b3c1328b Olga Brani
          }
239 b3c1328b Olga Brani
240 b3c1328b Olga Brani
          $timer = this.settings.$next_tip.find('.joyride-timer-indicator');
241 b3c1328b Olga Brani
242 b3c1328b Olga Brani
          if (/pop/i.test(this.settings.tipAnimation)) {
243 b3c1328b Olga Brani
244 b3c1328b Olga Brani
            $timer.width(0);
245 b3c1328b Olga Brani
246 b3c1328b Olga Brani
            if (thsi.settings.timer > 0) {
247 b3c1328b Olga Brani
248 b3c1328b Olga Brani
              this.settings.$next_tip.show();
249 b3c1328b Olga Brani
250 b3c1328b Olga Brani
              this.delay(function () {
251 b3c1328b Olga Brani
                $timer.animate({
252 b3c1328b Olga Brani
                  width: $timer.parent().width()
253 b3c1328b Olga Brani
                }, this.settings.timer, 'linear');
254 b3c1328b Olga Brani
              }.bind(this), this.settings.tipAnimationFadeSpeed);
255 b3c1328b Olga Brani
256 b3c1328b Olga Brani
            } else {
257 b3c1328b Olga Brani
              this.settings.$next_tip.show();
258 b3c1328b Olga Brani
259 b3c1328b Olga Brani
            }
260 b3c1328b Olga Brani
261 b3c1328b Olga Brani
262 b3c1328b Olga Brani
          } else if (/fade/i.test(this.settings.tipAnimation)) {
263 b3c1328b Olga Brani
264 b3c1328b Olga Brani
            $timer.width(0);
265 b3c1328b Olga Brani
266 b3c1328b Olga Brani
            if (this.settings.timer > 0) {
267 b3c1328b Olga Brani
268 b3c1328b Olga Brani
              this.settings.$next_tip
269 b3c1328b Olga Brani
                .fadeIn(this.settings.tipAnimationFadeSpeed)
270 b3c1328b Olga Brani
                .show();
271 b3c1328b Olga Brani
272 b3c1328b Olga Brani
              this.delay(function () {
273 b3c1328b Olga Brani
                $timer.animate({
274 b3c1328b Olga Brani
                  width: $timer.parent().width()
275 b3c1328b Olga Brani
                }, this.settings.timer, 'linear');
276 b3c1328b Olga Brani
              }.bind(this), this.settings.tipAnimationFadeSpeed);
277 b3c1328b Olga Brani
278 b3c1328b Olga Brani
            } else {
279 b3c1328b Olga Brani
              this.settings.$next_tip.fadeIn(this.settings.tipAnimationFadeSpeed);
280 b3c1328b Olga Brani
281 b3c1328b Olga Brani
            }
282 b3c1328b Olga Brani
          }
283 b3c1328b Olga Brani
284 b3c1328b Olga Brani
          this.settings.$current_tip = this.settings.$next_tip;
285 b3c1328b Olga Brani
286 b3c1328b Olga Brani
        // skip non-existant targets
287 b3c1328b Olga Brani
        } else if (this.settings.$li && this.settings.$target.length < 1) {
288 b3c1328b Olga Brani
289 b3c1328b Olga Brani
          this.show();
290 b3c1328b Olga Brani
291 b3c1328b Olga Brani
        } else {
292 b3c1328b Olga Brani
293 b3c1328b Olga Brani
          this.end();
294 b3c1328b Olga Brani
295 b3c1328b Olga Brani
        }
296 b3c1328b Olga Brani
      } else {
297 b3c1328b Olga Brani
298 b3c1328b Olga Brani
        this.settings.paused = true;
299 b3c1328b Olga Brani
300 b3c1328b Olga Brani
      }
301 b3c1328b Olga Brani
302 b3c1328b Olga Brani
    },
303 b3c1328b Olga Brani
304 b3c1328b Olga Brani
    is_phone : function () {
305 b3c1328b Olga Brani
      if (Modernizr) {
306 b3c1328b Olga Brani
        return Modernizr.mq('only screen and (max-width: 767px)') || $('.lt-ie9').length > 0;
307 b3c1328b Olga Brani
      }
308 b3c1328b Olga Brani
309 b3c1328b Olga Brani
      return (this.settings.$window.width() < 767) ? true : false;
310 b3c1328b Olga Brani
    },
311 b3c1328b Olga Brani
312 b3c1328b Olga Brani
    hide : function () {
313 b3c1328b Olga Brani
      this.settings.postStepCallback(this.settings.$li.index(),
314 b3c1328b Olga Brani
        this.settings.$current_tip);
315 b3c1328b Olga Brani
      $('.joyride-modal-bg').hide();
316 b3c1328b Olga Brani
      this.settings.$current_tip.hide();
317 b3c1328b Olga Brani
    },
318 b3c1328b Olga Brani
319 b3c1328b Olga Brani
    set_li : function (init) {
320 b3c1328b Olga Brani
      if (init) {
321 b3c1328b Olga Brani
        this.settings.$li = this.settings.$tip_content.eq(this.settings.startOffset);
322 b3c1328b Olga Brani
        this.set_next_tip();
323 b3c1328b Olga Brani
        this.settings.$current_tip = this.settings.$next_tip;
324 b3c1328b Olga Brani
      } else {
325 b3c1328b Olga Brani
        this.settings.$li = this.settings.$li.next();
326 b3c1328b Olga Brani
        this.set_next_tip();
327 b3c1328b Olga Brani
      }
328 b3c1328b Olga Brani
329 b3c1328b Olga Brani
      this.set_target();
330 b3c1328b Olga Brani
    },
331 b3c1328b Olga Brani
332 b3c1328b Olga Brani
    set_next_tip : function () {
333 b3c1328b Olga Brani
      this.settings.$next_tip = $(".joyride-tip-guide[data-index='" + this.settings.$li.index() + "']");
334 b3c1328b Olga Brani
      this.settings.$next_tip.data('closed', '');
335 b3c1328b Olga Brani
    },
336 b3c1328b Olga Brani
337 b3c1328b Olga Brani
    set_target : function () {
338 b3c1328b Olga Brani
      var cl = this.settings.$li.attr('data-class'),
339 b3c1328b Olga Brani
          id = this.settings.$li.attr('data-id'),
340 b3c1328b Olga Brani
          $sel = function () {
341 b3c1328b Olga Brani
            if (id) {
342 b3c1328b Olga Brani
              return $(document.getElementById(id));
343 b3c1328b Olga Brani
            } else if (cl) {
344 b3c1328b Olga Brani
              return $('.' + cl).first();
345 b3c1328b Olga Brani
            } else {
346 b3c1328b Olga Brani
              return $('body');
347 b3c1328b Olga Brani
            }
348 b3c1328b Olga Brani
          };
349 b3c1328b Olga Brani
350 b3c1328b Olga Brani
      this.settings.$target = $sel();
351 b3c1328b Olga Brani
    },
352 b3c1328b Olga Brani
353 b3c1328b Olga Brani
    scroll_to : function () {
354 b3c1328b Olga Brani
      var window_half, tipOffset;
355 b3c1328b Olga Brani
356 b3c1328b Olga Brani
      window_half = $(window).height() / 2;
357 b3c1328b Olga Brani
      tipOffset = Math.ceil(this.settings.$target.offset().top - window_half + this.outerHeight(this.settings.$next_tip));
358 b3c1328b Olga Brani
      if (tipOffset > 0) {
359 b3c1328b Olga Brani
        this.scrollTo($('html, body'), tipOffset, this.settings.scrollSpeed);
360 b3c1328b Olga Brani
      }
361 b3c1328b Olga Brani
    },
362 b3c1328b Olga Brani
363 b3c1328b Olga Brani
    paused : function () {
364 b3c1328b Olga Brani
      if (($.inArray((this.settings.$li.index() + 1), this.settings.pauseAfter) === -1)) {
365 b3c1328b Olga Brani
        return true;
366 b3c1328b Olga Brani
      }
367 b3c1328b Olga Brani
368 b3c1328b Olga Brani
      return false;
369 b3c1328b Olga Brani
    },
370 b3c1328b Olga Brani
371 b3c1328b Olga Brani
    restart : function () {
372 b3c1328b Olga Brani
      this.hide();
373 b3c1328b Olga Brani
      this.settings.$li = undefined;
374 b3c1328b Olga Brani
      this.show('init');
375 b3c1328b Olga Brani
    },
376 b3c1328b Olga Brani
377 b3c1328b Olga Brani
    pos_default : function (init) {
378 b3c1328b Olga Brani
      var half_fold = Math.ceil($(window).height() / 2),
379 b3c1328b Olga Brani
          tip_position = this.settings.$next_tip.offset(),
380 b3c1328b Olga Brani
          $nub = this.settings.$next_tip.find('.joyride-nub'),
381 b3c1328b Olga Brani
          nub_height = Math.ceil(this.outerHeight($nub) / 2),
382 b3c1328b Olga Brani
          toggle = init || false;
383 b3c1328b Olga Brani
384 b3c1328b Olga Brani
      // tip must not be "display: none" to calculate position
385 b3c1328b Olga Brani
      if (toggle) {
386 b3c1328b Olga Brani
        this.settings.$next_tip.css('visibility', 'hidden');
387 b3c1328b Olga Brani
        this.settings.$next_tip.show();
388 b3c1328b Olga Brani
      }
389 b3c1328b Olga Brani
390 b3c1328b Olga Brani
      if (!/body/i.test(this.settings.$target.selector)) {
391 b3c1328b Olga Brani
392 b3c1328b Olga Brani
          if (this.bottom()) {
393 b3c1328b Olga Brani
            this.settings.$next_tip.css({
394 b3c1328b Olga Brani
              top: (this.settings.$target.offset().top + nub_height + this.outerHeight(this.settings.$target)),
395 b3c1328b Olga Brani
              left: this.settings.$target.offset().left});
396 b3c1328b Olga Brani
397 b3c1328b Olga Brani
            this.nub_position($nub, this.settings.tipSettings.nubPosition, 'top');
398 b3c1328b Olga Brani
399 b3c1328b Olga Brani
          } else if (this.top()) {
400 b3c1328b Olga Brani
401 b3c1328b Olga Brani
            this.settings.$next_tip.css({
402 b3c1328b Olga Brani
              top: (this.settings.$target.offset().top - this.outerHeight(this.settings.$next_tip) - nub_height),
403 b3c1328b Olga Brani
              left: this.settings.$target.offset().left});
404 b3c1328b Olga Brani
405 b3c1328b Olga Brani
            this.nub_position($nub, this.settings.tipSettings.nubPosition, 'bottom');
406 b3c1328b Olga Brani
407 b3c1328b Olga Brani
          } else if (this.right()) {
408 b3c1328b Olga Brani
409 b3c1328b Olga Brani
            this.settings.$next_tip.css({
410 b3c1328b Olga Brani
              top: this.settings.$target.offset().top,
411 b3c1328b Olga Brani
              left: (this.outerWidth(this.settings.$target) + this.settings.$target.offset().left)});
412 b3c1328b Olga Brani
413 b3c1328b Olga Brani
            this.nub_position($nub, this.settings.tipSettings.nubPosition, 'left');
414 b3c1328b Olga Brani
415 b3c1328b Olga Brani
          } else if (this.left()) {
416 b3c1328b Olga Brani
417 b3c1328b Olga Brani
            this.settings.$next_tip.css({
418 b3c1328b Olga Brani
              top: this.settings.$target.offset().top,
419 b3c1328b Olga Brani
              left: (this.settings.$target.offset().left - this.outerWidth(this.settings.$next_tip) - nub_height)});
420 b3c1328b Olga Brani
421 b3c1328b Olga Brani
            this.nub_position($nub, this.settings.tipSettings.nubPosition, 'right');
422 b3c1328b Olga Brani
423 b3c1328b Olga Brani
          }
424 b3c1328b Olga Brani
425 b3c1328b Olga Brani
          if (!this.visible(this.corners(this.settings.$next_tip)) && this.settings.attempts < this.settings.tipSettings.tipLocationPattern.length) {
426 b3c1328b Olga Brani
427 b3c1328b Olga Brani
            $nub.removeClass('bottom')
428 b3c1328b Olga Brani
              .removeClass('top')
429 b3c1328b Olga Brani
              .removeClass('right')
430 b3c1328b Olga Brani
              .removeClass('left');
431 b3c1328b Olga Brani
432 b3c1328b Olga Brani
            this.settings.tipSettings.tipLocation = this.settings.tipSettings.tipLocationPattern[this.settings.attempts];
433 b3c1328b Olga Brani
434 b3c1328b Olga Brani
            this.settings.attempts++;
435 b3c1328b Olga Brani
436 b3c1328b Olga Brani
            this.pos_default(true);
437 b3c1328b Olga Brani
438 b3c1328b Olga Brani
          }
439 b3c1328b Olga Brani
440 b3c1328b Olga Brani
      } else if (this.settings.$li.length) {
441 b3c1328b Olga Brani
442 b3c1328b Olga Brani
        this.pos_modal($nub);
443 b3c1328b Olga Brani
444 b3c1328b Olga Brani
      }
445 b3c1328b Olga Brani
446 b3c1328b Olga Brani
      if (toggle) {
447 b3c1328b Olga Brani
        this.settings.$next_tip.hide();
448 b3c1328b Olga Brani
        this.settings.$next_tip.css('visibility', 'visible');
449 b3c1328b Olga Brani
      }
450 b3c1328b Olga Brani
451 b3c1328b Olga Brani
    },
452 b3c1328b Olga Brani
453 b3c1328b Olga Brani
    pos_phone : function (init) {
454 b3c1328b Olga Brani
      var tip_height = this.outerHeight(this.settings.$next_tip),
455 b3c1328b Olga Brani
          tip_offset = this.settings.$next_tip.offset(),
456 b3c1328b Olga Brani
          target_height = this.outerHeight(this.settings.$target),
457 b3c1328b Olga Brani
          $nub = $('.joyride-nub', this.settings.$next_tip),
458 b3c1328b Olga Brani
          nub_height = Math.ceil(this.outerHeight($nub) / 2),
459 b3c1328b Olga Brani
          toggle = init || false;
460 b3c1328b Olga Brani
461 b3c1328b Olga Brani
      $nub.removeClass('bottom')
462 b3c1328b Olga Brani
        .removeClass('top')
463 b3c1328b Olga Brani
        .removeClass('right')
464 b3c1328b Olga Brani
        .removeClass('left');
465 b3c1328b Olga Brani
466 b3c1328b Olga Brani
      if (toggle) {
467 b3c1328b Olga Brani
        this.settings.$next_tip.css('visibility', 'hidden');
468 b3c1328b Olga Brani
        this.settings.$next_tip.show();
469 b3c1328b Olga Brani
      }
470 b3c1328b Olga Brani
471 b3c1328b Olga Brani
      if (!/body/i.test(this.settings.$target.selector)) {
472 b3c1328b Olga Brani
473 b3c1328b Olga Brani
        if (this.top()) {
474 b3c1328b Olga Brani
475 b3c1328b Olga Brani
            this.settings.$next_tip.offset({top: this.settings.$target.offset().top - tip_height - nub_height});
476 b3c1328b Olga Brani
            $nub.addClass('bottom');
477 b3c1328b Olga Brani
478 b3c1328b Olga Brani
        } else {
479 b3c1328b Olga Brani
480 b3c1328b Olga Brani
          this.settings.$next_tip.offset({top: this.settings.$target.offset().top + target_height + nub_height});
481 b3c1328b Olga Brani
          $nub.addClass('top');
482 b3c1328b Olga Brani
483 b3c1328b Olga Brani
        }
484 b3c1328b Olga Brani
485 b3c1328b Olga Brani
      } else if (this.settings.$li.length) {
486 b3c1328b Olga Brani
        this.pos_modal($nub);
487 b3c1328b Olga Brani
      }
488 b3c1328b Olga Brani
489 b3c1328b Olga Brani
      if (toggle) {
490 b3c1328b Olga Brani
        this.settings.$next_tip.hide();
491 b3c1328b Olga Brani
        this.settings.$next_tip.css('visibility', 'visible');
492 b3c1328b Olga Brani
      }
493 b3c1328b Olga Brani
    },
494 b3c1328b Olga Brani
495 b3c1328b Olga Brani
    pos_modal : function ($nub) {
496 b3c1328b Olga Brani
      this.center();
497 b3c1328b Olga Brani
      $nub.hide();
498 b3c1328b Olga Brani
      if (!this.settings.$next_tip.data('closed')) {
499 b3c1328b Olga Brani
        if ($('.joyride-modal-bg').length < 1) {
500 b3c1328b Olga Brani
          $('body').append('<div class="joyride-modal-bg">').show();
501 b3c1328b Olga Brani
        }
502 b3c1328b Olga Brani
503 b3c1328b Olga Brani
        if (/pop/i.test(this.settings.tipAnimation)) {
504 b3c1328b Olga Brani
          $('.joyride-modal-bg').show();
505 b3c1328b Olga Brani
        } else {
506 b3c1328b Olga Brani
          $('.joyride-modal-bg').fadeIn(this.settings.tipAnimationFadeSpeed);
507 b3c1328b Olga Brani
        }
508 b3c1328b Olga Brani
      }
509 b3c1328b Olga Brani
    },
510 b3c1328b Olga Brani
511 b3c1328b Olga Brani
    center : function () {
512 b3c1328b Olga Brani
      var $w = $(window);
513 b3c1328b Olga Brani
514 b3c1328b Olga Brani
      this.settings.$next_tip.css({
515 b3c1328b Olga Brani
        top : ((($w.height() - this.outerHeight(this.settings.$next_tip)) / 2) + $w.scrollTop()),
516 b3c1328b Olga Brani
        left : ((($w.width() - this.outerWidth(this.settings.$next_tip)) / 2) + this.scrollLeft($w))
517 b3c1328b Olga Brani
      });
518 b3c1328b Olga Brani
519 b3c1328b Olga Brani
      return true;
520 b3c1328b Olga Brani
    },
521 b3c1328b Olga Brani
522 b3c1328b Olga Brani
    bottom : function () {
523 b3c1328b Olga Brani
      return /bottom/i.test(this.settings.tipSettings.tipLocation);
524 b3c1328b Olga Brani
    },
525 b3c1328b Olga Brani
526 b3c1328b Olga Brani
    top : function () {
527 b3c1328b Olga Brani
      return /top/i.test(this.settings.tipSettings.tipLocation);
528 b3c1328b Olga Brani
    },
529 b3c1328b Olga Brani
530 b3c1328b Olga Brani
    right : function () {
531 b3c1328b Olga Brani
      return /right/i.test(this.settings.tipSettings.tipLocation);
532 b3c1328b Olga Brani
    },
533 b3c1328b Olga Brani
534 b3c1328b Olga Brani
    left : function () {
535 b3c1328b Olga Brani
      return /left/i.test(this.settings.tipSettings.tipLocation);
536 b3c1328b Olga Brani
    },
537 b3c1328b Olga Brani
538 b3c1328b Olga Brani
    corners : function (el) {
539 b3c1328b Olga Brani
      var w = $(window),
540 b3c1328b Olga Brani
          right = w.width() + this.scrollLeft(w),
541 b3c1328b Olga Brani
          bottom = w.width() + w.scrollTop();
542 b3c1328b Olga Brani
543 b3c1328b Olga Brani
      return [
544 b3c1328b Olga Brani
        el.offset().top <= w.scrollTop(),
545 b3c1328b Olga Brani
        right <= el.offset().left + this.outerWidth(el),
546 b3c1328b Olga Brani
        bottom <= el.offset().top + this.outerHeight(el),
547 b3c1328b Olga Brani
        this.scrollLeft(w) >= el.offset().left
548 b3c1328b Olga Brani
      ];
549 b3c1328b Olga Brani
    },
550 b3c1328b Olga Brani
551 b3c1328b Olga Brani
    visible : function (hidden_corners) {
552 b3c1328b Olga Brani
      var i = hidden_corners.length;
553 b3c1328b Olga Brani
554 b3c1328b Olga Brani
      while (i--) {
555 b3c1328b Olga Brani
        if (hidden_corners[i]) return false;
556 b3c1328b Olga Brani
      }
557 b3c1328b Olga Brani
558 b3c1328b Olga Brani
      return true;
559 b3c1328b Olga Brani
    },
560 b3c1328b Olga Brani
561 b3c1328b Olga Brani
    nub_position : function (nub, pos, def) {
562 b3c1328b Olga Brani
      if (pos === 'auto') {
563 b3c1328b Olga Brani
        nub.addClass(def);
564 b3c1328b Olga Brani
      } else {
565 b3c1328b Olga Brani
        nub.addClass(pos);
566 b3c1328b Olga Brani
      }
567 b3c1328b Olga Brani
    },
568 b3c1328b Olga Brani
569 b3c1328b Olga Brani
    startTimer : function () {
570 b3c1328b Olga Brani
      if (this.settings.$li.length) {
571 b3c1328b Olga Brani
        this.settings.automate = setTimeout(function () {
572 b3c1328b Olga Brani
          this.hide();
573 b3c1328b Olga Brani
          this.show();
574 b3c1328b Olga Brani
          this.startTimer();
575 b3c1328b Olga Brani
        }.bind(this), this.settings.timer);
576 b3c1328b Olga Brani
      } else {
577 b3c1328b Olga Brani
        clearTimeout(this.settings.automate);
578 b3c1328b Olga Brani
      }
579 b3c1328b Olga Brani
    },
580 b3c1328b Olga Brani
581 b3c1328b Olga Brani
    end : function () {
582 b3c1328b Olga Brani
      if (this.settings.cookieMonster) {
583 b3c1328b Olga Brani
        $.cookie(this.settings.cookieName, 'ridden', { expires: this.settings.cookieExpires, domain: this.settings.cookieDomain });
584 b3c1328b Olga Brani
      }
585 b3c1328b Olga Brani
586 b3c1328b Olga Brani
      if (this.settings.timer > 0) {
587 b3c1328b Olga Brani
        clearTimeout(this.settings.automate);
588 b3c1328b Olga Brani
      }
589 b3c1328b Olga Brani
590 b3c1328b Olga Brani
      this.settings.$next_tip.data('closed', true);
591 b3c1328b Olga Brani
592 b3c1328b Olga Brani
      $('.joyride-modal-bg').hide();
593 b3c1328b Olga Brani
      this.settings.$current_tip.hide();
594 b3c1328b Olga Brani
      this.settings.postStepCallback(this.settings.$li.index(), this.settings.$current_tip);
595 b3c1328b Olga Brani
      this.settings.postRideCallback(this.settings.$li.index(), this.settings.$current_tip);
596 b3c1328b Olga Brani
    },
597 b3c1328b Olga Brani
598 b3c1328b Olga Brani
    outerHTML : function (el) {
599 b3c1328b Olga Brani
      // support FireFox < 11
600 b3c1328b Olga Brani
      return el.outerHTML || new XMLSerializer().serializeToString(el);
601 b3c1328b Olga Brani
    },
602 b3c1328b Olga Brani
603 b3c1328b Olga Brani
    off : function () {
604 b3c1328b Olga Brani
      $(this.scope).off('.joyride');
605 b3c1328b Olga Brani
      $(window).off('.joyride');
606 b3c1328b Olga Brani
      $('.joyride-close-tip, .joyride-next-tip, .joyride-modal-bg').off('.joyride');
607 b3c1328b Olga Brani
      $('.joyride-tip-guide, .joyride-modal-bg').remove();
608 b3c1328b Olga Brani
      clearTimeout(this.settings.automate);
609 b3c1328b Olga Brani
      this.settings = {};
610 b3c1328b Olga Brani
    }
611 b3c1328b Olga Brani
  };
612 b3c1328b Olga Brani
}(Foundation.zj, this, this.document));