Chris@0
|
1 /*
|
Chris@0
|
2 * jQuery Foundation Joyride Plugin 2.1
|
Chris@0
|
3 * http://foundation.zurb.com
|
Chris@0
|
4 * Copyright 2013, ZURB
|
Chris@0
|
5 * Free to use under the MIT license.
|
Chris@0
|
6 * http://www.opensource.org/licenses/mit-license.php
|
Chris@0
|
7 */
|
Chris@0
|
8
|
Chris@0
|
9 /*jslint unparam: true, browser: true, indent: 2 */
|
Chris@0
|
10
|
Chris@0
|
11 ;(function ($, window, undefined) {
|
Chris@0
|
12 'use strict';
|
Chris@0
|
13
|
Chris@0
|
14 var defaults = {
|
Chris@0
|
15 'version' : '2.1',
|
Chris@0
|
16 'tipLocation' : 'bottom', // 'top' or 'bottom' in relation to parent
|
Chris@0
|
17 'nubPosition' : 'auto', // override on a per tooltip bases
|
Chris@0
|
18 'scroll' : true, // whether to scroll to tips
|
Chris@0
|
19 'scrollSpeed' : 300, // Page scrolling speed in milliseconds
|
Chris@0
|
20 'timer' : 0, // 0 = no timer , all other numbers = timer in milliseconds
|
Chris@0
|
21 'autoStart' : false, // true or false - false tour starts when restart called
|
Chris@0
|
22 'startTimerOnClick' : true, // true or false - true requires clicking the first button start the timer
|
Chris@0
|
23 'startOffset' : 0, // the index of the tooltip you want to start on (index of the li)
|
Chris@0
|
24 'nextButton' : true, // true or false to control whether a next button is used
|
Chris@0
|
25 'tipAnimation' : 'fade', // 'pop' or 'fade' in each tip
|
Chris@0
|
26 'pauseAfter' : [], // array of indexes where to pause the tour after
|
Chris@0
|
27 'tipAnimationFadeSpeed': 300, // when tipAnimation = 'fade' this is speed in milliseconds for the transition
|
Chris@0
|
28 'cookieMonster' : false, // true or false to control whether cookies are used
|
Chris@0
|
29 'cookieName' : 'joyride', // Name the cookie you'll use
|
Chris@0
|
30 'cookieDomain' : false, // Will this cookie be attached to a domain, ie. '.notableapp.com'
|
Chris@0
|
31 'cookiePath' : false, // Set to '/' if you want the cookie for the whole website
|
Chris@0
|
32 'localStorage' : false, // true or false to control whether localstorage is used
|
Chris@0
|
33 'localStorageKey' : 'joyride', // Keyname in localstorage
|
Chris@0
|
34 'tipContainer' : 'body', // Where will the tip be attached
|
Chris@0
|
35 'modal' : false, // Whether to cover page with modal during the tour
|
Chris@0
|
36 'expose' : false, // Whether to expose the elements at each step in the tour (requires modal:true)
|
Chris@0
|
37 'postExposeCallback' : $.noop, // A method to call after an element has been exposed
|
Chris@0
|
38 'preRideCallback' : $.noop, // A method to call before the tour starts (passed index, tip, and cloned exposed element)
|
Chris@0
|
39 'postRideCallback' : $.noop, // A method to call once the tour closes (canceled or complete)
|
Chris@0
|
40 'preStepCallback' : $.noop, // A method to call before each step
|
Chris@0
|
41 'postStepCallback' : $.noop, // A method to call after each step
|
Chris@0
|
42 'template' : { // HTML segments for tip layout
|
Chris@0
|
43 'link' : '<a href="#close" class="joyride-close-tip">X</a>',
|
Chris@0
|
44 'timer' : '<div class="joyride-timer-indicator-wrap"><span class="joyride-timer-indicator"></span></div>',
|
Chris@0
|
45 'tip' : '<div class="joyride-tip-guide"><span class="joyride-nub"></span></div>',
|
Chris@0
|
46 'wrapper' : '<div class="joyride-content-wrapper" role="dialog"></div>',
|
Chris@0
|
47 'button' : '<a href="#" class="joyride-next-tip"></a>',
|
Chris@0
|
48 'modal' : '<div class="joyride-modal-bg"></div>',
|
Chris@0
|
49 'expose' : '<div class="joyride-expose-wrapper"></div>',
|
Chris@0
|
50 'exposeCover': '<div class="joyride-expose-cover"></div>'
|
Chris@0
|
51 }
|
Chris@0
|
52 },
|
Chris@0
|
53
|
Chris@0
|
54 Modernizr = Modernizr || false,
|
Chris@0
|
55
|
Chris@0
|
56 settings = {},
|
Chris@0
|
57
|
Chris@0
|
58 methods = {
|
Chris@0
|
59
|
Chris@0
|
60 init : function (opts) {
|
Chris@0
|
61 return this.each(function () {
|
Chris@0
|
62
|
Chris@0
|
63 if ($.isEmptyObject(settings)) {
|
Chris@0
|
64 settings = $.extend(true, defaults, opts);
|
Chris@0
|
65
|
Chris@0
|
66 // non configurable settings
|
Chris@0
|
67 settings.document = window.document;
|
Chris@0
|
68 settings.$document = $(settings.document);
|
Chris@0
|
69 settings.$window = $(window);
|
Chris@0
|
70 settings.$content_el = $(this);
|
Chris@0
|
71 settings.$body = $(settings.tipContainer);
|
Chris@0
|
72 settings.body_offset = $(settings.tipContainer).position();
|
Chris@0
|
73 settings.$tip_content = $('> li', settings.$content_el);
|
Chris@0
|
74 settings.paused = false;
|
Chris@0
|
75 settings.attempts = 0;
|
Chris@0
|
76
|
Chris@0
|
77 settings.tipLocationPatterns = {
|
Chris@0
|
78 top: ['bottom'],
|
Chris@0
|
79 bottom: [], // bottom should not need to be repositioned
|
Chris@0
|
80 left: ['right', 'top', 'bottom'],
|
Chris@0
|
81 right: ['left', 'top', 'bottom']
|
Chris@0
|
82 };
|
Chris@0
|
83
|
Chris@0
|
84 // are we using jQuery 1.7+
|
Chris@0
|
85 methods.jquery_check();
|
Chris@0
|
86
|
Chris@0
|
87 // can we create cookies?
|
Chris@0
|
88 if (!$.isFunction($.cookie)) {
|
Chris@0
|
89 settings.cookieMonster = false;
|
Chris@0
|
90 }
|
Chris@0
|
91
|
Chris@0
|
92 // generate the tips and insert into dom.
|
Chris@0
|
93 if ( (!settings.cookieMonster || !$.cookie(settings.cookieName) ) &&
|
Chris@0
|
94 (!settings.localStorage || !methods.support_localstorage() || !localStorage.getItem(settings.localStorageKey) ) ) {
|
Chris@0
|
95
|
Chris@0
|
96 settings.$tip_content.each(function (index) {
|
Chris@0
|
97 methods.create({$li : $(this), index : index});
|
Chris@0
|
98 });
|
Chris@0
|
99
|
Chris@0
|
100 // show first tip
|
Chris@0
|
101 if(settings.autoStart)
|
Chris@0
|
102 {
|
Chris@0
|
103 if (!settings.startTimerOnClick && settings.timer > 0) {
|
Chris@0
|
104 methods.show('init');
|
Chris@0
|
105 methods.startTimer();
|
Chris@0
|
106 } else {
|
Chris@0
|
107 methods.show('init');
|
Chris@0
|
108 }
|
Chris@0
|
109 }
|
Chris@0
|
110
|
Chris@0
|
111 }
|
Chris@0
|
112
|
Chris@0
|
113 settings.$document.on('click.joyride', '.joyride-next-tip, .joyride-modal-bg', function (e) {
|
Chris@0
|
114 e.preventDefault();
|
Chris@0
|
115
|
Chris@0
|
116 if (settings.$li.next().length < 1) {
|
Chris@0
|
117 methods.end();
|
Chris@0
|
118 } else if (settings.timer > 0) {
|
Chris@0
|
119 clearTimeout(settings.automate);
|
Chris@0
|
120 methods.hide();
|
Chris@0
|
121 methods.show();
|
Chris@0
|
122 methods.startTimer();
|
Chris@0
|
123 } else {
|
Chris@0
|
124 methods.hide();
|
Chris@0
|
125 methods.show();
|
Chris@0
|
126 }
|
Chris@0
|
127
|
Chris@0
|
128 });
|
Chris@0
|
129
|
Chris@0
|
130 settings.$document.on('click.joyride', '.joyride-close-tip', function (e) {
|
Chris@0
|
131 e.preventDefault();
|
Chris@0
|
132 methods.end(true /* isAborted */);
|
Chris@0
|
133 });
|
Chris@0
|
134
|
Chris@0
|
135 settings.$window.on('resize.joyride', function (e) {
|
Chris@0
|
136 if(settings.$li){
|
Chris@0
|
137 if(settings.exposed && settings.exposed.length>0){
|
Chris@0
|
138 var $els = $(settings.exposed);
|
Chris@0
|
139 $els.each(function(){
|
Chris@0
|
140 var $this = $(this);
|
Chris@0
|
141 methods.un_expose($this);
|
Chris@0
|
142 methods.expose($this);
|
Chris@0
|
143 });
|
Chris@0
|
144 }
|
Chris@0
|
145 if (methods.is_phone()) {
|
Chris@0
|
146 methods.pos_phone();
|
Chris@0
|
147 } else {
|
Chris@0
|
148 methods.pos_default();
|
Chris@0
|
149 }
|
Chris@0
|
150 }
|
Chris@0
|
151 });
|
Chris@0
|
152 } else {
|
Chris@0
|
153 methods.restart();
|
Chris@0
|
154 }
|
Chris@0
|
155
|
Chris@0
|
156 });
|
Chris@0
|
157 },
|
Chris@0
|
158
|
Chris@0
|
159 // call this method when you want to resume the tour
|
Chris@0
|
160 resume : function () {
|
Chris@0
|
161 methods.set_li();
|
Chris@0
|
162 methods.show();
|
Chris@0
|
163 },
|
Chris@0
|
164
|
Chris@0
|
165 nextTip: function(){
|
Chris@0
|
166 if (settings.$li.next().length < 1) {
|
Chris@0
|
167 methods.end();
|
Chris@0
|
168 } else if (settings.timer > 0) {
|
Chris@0
|
169 clearTimeout(settings.automate);
|
Chris@0
|
170 methods.hide();
|
Chris@0
|
171 methods.show();
|
Chris@0
|
172 methods.startTimer();
|
Chris@0
|
173 } else {
|
Chris@0
|
174 methods.hide();
|
Chris@0
|
175 methods.show();
|
Chris@0
|
176 }
|
Chris@0
|
177 },
|
Chris@0
|
178
|
Chris@0
|
179 tip_template : function (opts) {
|
Chris@0
|
180 var $blank, content, $wrapper;
|
Chris@0
|
181
|
Chris@0
|
182 opts.tip_class = opts.tip_class || '';
|
Chris@0
|
183
|
Chris@0
|
184 $blank = $(settings.template.tip).addClass(opts.tip_class);
|
Chris@0
|
185 content = $.trim($(opts.li).html()) +
|
Chris@0
|
186 methods.button_text(opts.button_text) +
|
Chris@0
|
187 settings.template.link +
|
Chris@0
|
188 methods.timer_instance(opts.index);
|
Chris@0
|
189
|
Chris@0
|
190 $wrapper = $(settings.template.wrapper);
|
Chris@0
|
191 if (opts.li.attr('data-aria-labelledby')) {
|
Chris@0
|
192 $wrapper.attr('aria-labelledby', opts.li.attr('data-aria-labelledby'))
|
Chris@0
|
193 }
|
Chris@0
|
194 if (opts.li.attr('data-aria-describedby')) {
|
Chris@0
|
195 $wrapper.attr('aria-describedby', opts.li.attr('data-aria-describedby'))
|
Chris@0
|
196 }
|
Chris@0
|
197 $blank.append($wrapper);
|
Chris@0
|
198 $blank.first().attr('data-index', opts.index);
|
Chris@0
|
199 $('.joyride-content-wrapper', $blank).append(content);
|
Chris@0
|
200
|
Chris@0
|
201 return $blank[0];
|
Chris@0
|
202 },
|
Chris@0
|
203
|
Chris@0
|
204 timer_instance : function (index) {
|
Chris@0
|
205 var txt;
|
Chris@0
|
206
|
Chris@0
|
207 if ((index === 0 && settings.startTimerOnClick && settings.timer > 0) || settings.timer === 0) {
|
Chris@0
|
208 txt = '';
|
Chris@0
|
209 } else {
|
Chris@0
|
210 txt = methods.outerHTML($(settings.template.timer)[0]);
|
Chris@0
|
211 }
|
Chris@0
|
212 return txt;
|
Chris@0
|
213 },
|
Chris@0
|
214
|
Chris@0
|
215 button_text : function (txt) {
|
Chris@0
|
216 if (settings.nextButton) {
|
Chris@0
|
217 txt = $.trim(txt) || 'Next';
|
Chris@0
|
218 txt = methods.outerHTML($(settings.template.button).append(txt)[0]);
|
Chris@0
|
219 } else {
|
Chris@0
|
220 txt = '';
|
Chris@0
|
221 }
|
Chris@0
|
222 return txt;
|
Chris@0
|
223 },
|
Chris@0
|
224
|
Chris@0
|
225 create : function (opts) {
|
Chris@0
|
226 // backwards compatibility with data-text attribute
|
Chris@0
|
227 var buttonText = opts.$li.attr('data-button') || opts.$li.attr('data-text'),
|
Chris@0
|
228 tipClass = opts.$li.attr('class'),
|
Chris@0
|
229 $tip_content = $(methods.tip_template({
|
Chris@0
|
230 tip_class : tipClass,
|
Chris@0
|
231 index : opts.index,
|
Chris@0
|
232 button_text : buttonText,
|
Chris@0
|
233 li : opts.$li
|
Chris@0
|
234 }));
|
Chris@0
|
235
|
Chris@0
|
236 $(settings.tipContainer).append($tip_content);
|
Chris@0
|
237 },
|
Chris@0
|
238
|
Chris@0
|
239 show : function (init) {
|
Chris@0
|
240 var opts = {}, ii, opts_arr = [], opts_len = 0, p,
|
Chris@0
|
241 $timer = null;
|
Chris@0
|
242
|
Chris@0
|
243 // are we paused?
|
Chris@0
|
244 if (settings.$li === undefined || ($.inArray(settings.$li.index(), settings.pauseAfter) === -1)) {
|
Chris@0
|
245
|
Chris@0
|
246 // don't go to the next li if the tour was paused
|
Chris@0
|
247 if (settings.paused) {
|
Chris@0
|
248 settings.paused = false;
|
Chris@0
|
249 } else {
|
Chris@0
|
250 methods.set_li(init);
|
Chris@0
|
251 }
|
Chris@0
|
252
|
Chris@0
|
253 settings.attempts = 0;
|
Chris@0
|
254
|
Chris@0
|
255 if (settings.$li.length && settings.$target.length > 0) {
|
Chris@0
|
256 if(init){ //run when we first start
|
Chris@0
|
257 settings.preRideCallback(settings.$li.index(), settings.$next_tip );
|
Chris@0
|
258 if(settings.modal){
|
Chris@0
|
259 methods.show_modal();
|
Chris@0
|
260 }
|
Chris@0
|
261 }
|
Chris@0
|
262 settings.preStepCallback(settings.$li.index(), settings.$next_tip );
|
Chris@0
|
263
|
Chris@0
|
264 // parse options
|
Chris@0
|
265 opts_arr = (settings.$li.data('options') || ':').split(';');
|
Chris@0
|
266 opts_len = opts_arr.length;
|
Chris@0
|
267 for (ii = opts_len - 1; ii >= 0; ii--) {
|
Chris@0
|
268 p = opts_arr[ii].split(':');
|
Chris@0
|
269
|
Chris@0
|
270 if (p.length === 2) {
|
Chris@0
|
271 opts[$.trim(p[0])] = $.trim(p[1]);
|
Chris@0
|
272 }
|
Chris@0
|
273 }
|
Chris@0
|
274 settings.tipSettings = $.extend({}, settings, opts);
|
Chris@0
|
275 settings.tipSettings.tipLocationPattern = settings.tipLocationPatterns[settings.tipSettings.tipLocation];
|
Chris@0
|
276
|
Chris@0
|
277 if(settings.modal && settings.expose){
|
Chris@0
|
278 methods.expose();
|
Chris@0
|
279 }
|
Chris@0
|
280
|
Chris@0
|
281 // scroll if not modal
|
Chris@0
|
282 if (!settings.$target.is("body") && settings.scroll) {
|
Chris@0
|
283 methods.scroll_to();
|
Chris@0
|
284 }
|
Chris@0
|
285
|
Chris@0
|
286 if (methods.is_phone()) {
|
Chris@0
|
287 methods.pos_phone(true);
|
Chris@0
|
288 } else {
|
Chris@0
|
289 methods.pos_default(true);
|
Chris@0
|
290 }
|
Chris@0
|
291
|
Chris@0
|
292 $timer = $('.joyride-timer-indicator', settings.$next_tip);
|
Chris@0
|
293
|
Chris@0
|
294 if (/pop/i.test(settings.tipAnimation)) {
|
Chris@0
|
295
|
Chris@0
|
296 $timer.outerWidth(0);
|
Chris@0
|
297
|
Chris@0
|
298 if (settings.timer > 0) {
|
Chris@0
|
299
|
Chris@0
|
300 settings.$next_tip.show();
|
Chris@0
|
301 $timer.animate({
|
Chris@0
|
302 width: $('.joyride-timer-indicator-wrap', settings.$next_tip).outerWidth()
|
Chris@0
|
303 }, settings.timer);
|
Chris@0
|
304
|
Chris@0
|
305 } else {
|
Chris@0
|
306
|
Chris@0
|
307 settings.$next_tip.show();
|
Chris@0
|
308
|
Chris@0
|
309 }
|
Chris@0
|
310
|
Chris@0
|
311
|
Chris@0
|
312 } else if (/fade/i.test(settings.tipAnimation)) {
|
Chris@0
|
313
|
Chris@0
|
314 $timer.outerWidth(0);
|
Chris@0
|
315
|
Chris@0
|
316 if (settings.timer > 0) {
|
Chris@0
|
317
|
Chris@0
|
318 settings.$next_tip.fadeIn(settings.tipAnimationFadeSpeed);
|
Chris@0
|
319
|
Chris@0
|
320 settings.$next_tip.show();
|
Chris@0
|
321 $timer.animate({
|
Chris@0
|
322 width: $('.joyride-timer-indicator-wrap', settings.$next_tip).outerWidth()
|
Chris@0
|
323 }, settings.timer);
|
Chris@0
|
324
|
Chris@0
|
325 } else {
|
Chris@0
|
326
|
Chris@0
|
327 settings.$next_tip.fadeIn(settings.tipAnimationFadeSpeed);
|
Chris@0
|
328
|
Chris@0
|
329 }
|
Chris@0
|
330 }
|
Chris@0
|
331
|
Chris@0
|
332 settings.$current_tip = settings.$next_tip;
|
Chris@0
|
333 // Focus next button for keyboard users.
|
Chris@0
|
334 $('.joyride-next-tip', settings.$current_tip).focus();
|
Chris@0
|
335 methods.tabbable(settings.$current_tip);
|
Chris@0
|
336 // skip non-existent targets
|
Chris@0
|
337 } else if (settings.$li && settings.$target.length < 1) {
|
Chris@0
|
338
|
Chris@0
|
339 methods.show();
|
Chris@0
|
340
|
Chris@0
|
341 } else {
|
Chris@0
|
342
|
Chris@0
|
343 methods.end();
|
Chris@0
|
344
|
Chris@0
|
345 }
|
Chris@0
|
346 } else {
|
Chris@0
|
347
|
Chris@0
|
348 settings.paused = true;
|
Chris@0
|
349
|
Chris@0
|
350 }
|
Chris@0
|
351
|
Chris@0
|
352 },
|
Chris@0
|
353
|
Chris@0
|
354 // detect phones with media queries if supported.
|
Chris@0
|
355 is_phone : function () {
|
Chris@0
|
356 if (Modernizr) {
|
Chris@0
|
357 return Modernizr.mq('only screen and (max-width: 767px)');
|
Chris@0
|
358 }
|
Chris@0
|
359
|
Chris@0
|
360 return (settings.$window.width() < 767) ? true : false;
|
Chris@0
|
361 },
|
Chris@0
|
362
|
Chris@0
|
363 support_localstorage : function () {
|
Chris@0
|
364 if (Modernizr) {
|
Chris@0
|
365 return Modernizr.localstorage;
|
Chris@0
|
366 } else {
|
Chris@0
|
367 return !!window.localStorage;
|
Chris@0
|
368 }
|
Chris@0
|
369 },
|
Chris@0
|
370
|
Chris@0
|
371 hide : function () {
|
Chris@0
|
372 if(settings.modal && settings.expose){
|
Chris@0
|
373 methods.un_expose();
|
Chris@0
|
374 }
|
Chris@0
|
375 if(!settings.modal){
|
Chris@0
|
376 $('.joyride-modal-bg').hide();
|
Chris@0
|
377 }
|
Chris@0
|
378 settings.$current_tip.hide();
|
Chris@0
|
379 settings.postStepCallback(settings.$li.index(), settings.$current_tip);
|
Chris@0
|
380 },
|
Chris@0
|
381
|
Chris@0
|
382 set_li : function (init) {
|
Chris@0
|
383 if (init) {
|
Chris@0
|
384 settings.$li = settings.$tip_content.eq(settings.startOffset);
|
Chris@0
|
385 methods.set_next_tip();
|
Chris@0
|
386 settings.$current_tip = settings.$next_tip;
|
Chris@0
|
387 } else {
|
Chris@0
|
388 settings.$li = settings.$li.next();
|
Chris@0
|
389 methods.set_next_tip();
|
Chris@0
|
390 }
|
Chris@0
|
391
|
Chris@0
|
392 methods.set_target();
|
Chris@0
|
393 },
|
Chris@0
|
394
|
Chris@0
|
395 set_next_tip : function () {
|
Chris@0
|
396 settings.$next_tip = $('.joyride-tip-guide[data-index=' + settings.$li.index() + ']');
|
Chris@0
|
397 },
|
Chris@0
|
398
|
Chris@0
|
399 set_target : function () {
|
Chris@0
|
400 var cl = settings.$li.attr('data-class'),
|
Chris@0
|
401 id = settings.$li.attr('data-id'),
|
Chris@0
|
402 $sel = function () {
|
Chris@0
|
403 if (id) {
|
Chris@0
|
404 return $(settings.document.getElementById(id));
|
Chris@0
|
405 } else if (cl) {
|
Chris@0
|
406 return $('.' + cl).filter(":visible").first();
|
Chris@0
|
407 } else {
|
Chris@0
|
408 return $('body');
|
Chris@0
|
409 }
|
Chris@0
|
410 };
|
Chris@0
|
411
|
Chris@0
|
412 settings.$target = $sel();
|
Chris@0
|
413 },
|
Chris@0
|
414
|
Chris@0
|
415 scroll_to : function () {
|
Chris@0
|
416 var window_half, tipOffset;
|
Chris@0
|
417
|
Chris@0
|
418 window_half = settings.$window.height() / 2;
|
Chris@0
|
419 tipOffset = Math.ceil(settings.$target.offset().top - window_half + settings.$next_tip.outerHeight());
|
Chris@0
|
420
|
Chris@0
|
421 $("html, body").stop().animate({
|
Chris@0
|
422 scrollTop: tipOffset
|
Chris@0
|
423 }, settings.scrollSpeed);
|
Chris@0
|
424 },
|
Chris@0
|
425
|
Chris@0
|
426 paused : function () {
|
Chris@0
|
427 if (($.inArray((settings.$li.index() + 1), settings.pauseAfter) === -1)) {
|
Chris@0
|
428 return true;
|
Chris@0
|
429 }
|
Chris@0
|
430
|
Chris@0
|
431 return false;
|
Chris@0
|
432 },
|
Chris@0
|
433
|
Chris@0
|
434 destroy : function () {
|
Chris@0
|
435 if(!$.isEmptyObject(settings)){
|
Chris@0
|
436 settings.$document.off('.joyride');
|
Chris@0
|
437 }
|
Chris@0
|
438
|
Chris@0
|
439 $(window).off('.joyride');
|
Chris@0
|
440 $('.joyride-close-tip, .joyride-next-tip, .joyride-modal-bg').off('.joyride');
|
Chris@0
|
441 $('.joyride-tip-guide, .joyride-modal-bg').remove();
|
Chris@0
|
442 clearTimeout(settings.automate);
|
Chris@0
|
443 settings = {};
|
Chris@0
|
444 },
|
Chris@0
|
445
|
Chris@0
|
446 restart : function () {
|
Chris@0
|
447 if(!settings.autoStart)
|
Chris@0
|
448 {
|
Chris@0
|
449 if (!settings.startTimerOnClick && settings.timer > 0) {
|
Chris@0
|
450 methods.show('init');
|
Chris@0
|
451 methods.startTimer();
|
Chris@0
|
452 } else {
|
Chris@0
|
453 methods.show('init');
|
Chris@0
|
454 }
|
Chris@0
|
455 settings.autoStart = true;
|
Chris@0
|
456 }
|
Chris@0
|
457 else
|
Chris@0
|
458 {
|
Chris@0
|
459 methods.hide();
|
Chris@0
|
460 settings.$li = undefined;
|
Chris@0
|
461 methods.show('init');
|
Chris@0
|
462 }
|
Chris@0
|
463 },
|
Chris@0
|
464
|
Chris@0
|
465 pos_default : function (init) {
|
Chris@0
|
466 var half_fold = Math.ceil(settings.$window.height() / 2),
|
Chris@0
|
467 tip_position = settings.$next_tip.offset(),
|
Chris@0
|
468 $nub = $('.joyride-nub', settings.$next_tip),
|
Chris@0
|
469 nub_width = Math.ceil($nub.outerWidth() / 2),
|
Chris@0
|
470 nub_height = Math.ceil($nub.outerHeight() / 2),
|
Chris@0
|
471 toggle = init || false;
|
Chris@0
|
472
|
Chris@0
|
473 // tip must not be "display: none" to calculate position
|
Chris@0
|
474 if (toggle) {
|
Chris@0
|
475 settings.$next_tip.css('visibility', 'hidden');
|
Chris@0
|
476 settings.$next_tip.show();
|
Chris@0
|
477 }
|
Chris@0
|
478
|
Chris@0
|
479 if (!settings.$target.is("body")) {
|
Chris@0
|
480 var
|
Chris@0
|
481 topAdjustment = settings.tipSettings.tipAdjustmentY ? parseInt(settings.tipSettings.tipAdjustmentY) : 0,
|
Chris@0
|
482 leftAdjustment = settings.tipSettings.tipAdjustmentX ? parseInt(settings.tipSettings.tipAdjustmentX) : 0;
|
Chris@0
|
483
|
Chris@0
|
484 if (methods.bottom()) {
|
Chris@0
|
485 settings.$next_tip.css({
|
Chris@0
|
486 top: (settings.$target.offset().top + nub_height + settings.$target.outerHeight() + topAdjustment),
|
Chris@0
|
487 left: settings.$target.offset().left + leftAdjustment});
|
Chris@0
|
488
|
Chris@0
|
489 if (/right/i.test(settings.tipSettings.nubPosition)) {
|
Chris@0
|
490 settings.$next_tip.css('left', settings.$target.offset().left - settings.$next_tip.outerWidth() + settings.$target.outerWidth());
|
Chris@0
|
491 }
|
Chris@0
|
492
|
Chris@0
|
493 methods.nub_position($nub, settings.tipSettings.nubPosition, 'top');
|
Chris@0
|
494
|
Chris@0
|
495 } else if (methods.top()) {
|
Chris@0
|
496
|
Chris@0
|
497 settings.$next_tip.css({
|
Chris@0
|
498 top: (settings.$target.offset().top - settings.$next_tip.outerHeight() - nub_height + topAdjustment),
|
Chris@0
|
499 left: settings.$target.offset().left + leftAdjustment});
|
Chris@0
|
500
|
Chris@0
|
501 methods.nub_position($nub, settings.tipSettings.nubPosition, 'bottom');
|
Chris@0
|
502
|
Chris@0
|
503 } else if (methods.right()) {
|
Chris@0
|
504
|
Chris@0
|
505 settings.$next_tip.css({
|
Chris@0
|
506 top: settings.$target.offset().top + topAdjustment,
|
Chris@0
|
507 left: (settings.$target.outerWidth() + settings.$target.offset().left + nub_width) + leftAdjustment});
|
Chris@0
|
508
|
Chris@0
|
509 methods.nub_position($nub, settings.tipSettings.nubPosition, 'left');
|
Chris@0
|
510
|
Chris@0
|
511 } else if (methods.left()) {
|
Chris@0
|
512
|
Chris@0
|
513 settings.$next_tip.css({
|
Chris@0
|
514 top: settings.$target.offset().top + topAdjustment,
|
Chris@0
|
515 left: (settings.$target.offset().left - settings.$next_tip.outerWidth() - nub_width) + leftAdjustment});
|
Chris@0
|
516
|
Chris@0
|
517 methods.nub_position($nub, settings.tipSettings.nubPosition, 'right');
|
Chris@0
|
518
|
Chris@0
|
519 }
|
Chris@0
|
520
|
Chris@0
|
521 if (!methods.visible(methods.corners(settings.$next_tip)) && settings.attempts < settings.tipSettings.tipLocationPattern.length) {
|
Chris@0
|
522
|
Chris@0
|
523 $nub.removeClass('bottom')
|
Chris@0
|
524 .removeClass('top')
|
Chris@0
|
525 .removeClass('right')
|
Chris@0
|
526 .removeClass('left');
|
Chris@0
|
527
|
Chris@0
|
528 settings.tipSettings.tipLocation = settings.tipSettings.tipLocationPattern[settings.attempts];
|
Chris@0
|
529
|
Chris@0
|
530 settings.attempts++;
|
Chris@0
|
531
|
Chris@0
|
532 methods.pos_default(true);
|
Chris@0
|
533
|
Chris@0
|
534 }
|
Chris@0
|
535
|
Chris@0
|
536 } else if (settings.$li.length) {
|
Chris@0
|
537
|
Chris@0
|
538 methods.pos_modal($nub);
|
Chris@0
|
539
|
Chris@0
|
540 }
|
Chris@0
|
541
|
Chris@0
|
542 if (toggle) {
|
Chris@0
|
543 settings.$next_tip.hide();
|
Chris@0
|
544 settings.$next_tip.css('visibility', 'visible');
|
Chris@0
|
545 }
|
Chris@0
|
546
|
Chris@0
|
547 },
|
Chris@0
|
548
|
Chris@0
|
549 pos_phone : function (init) {
|
Chris@0
|
550 var tip_height = settings.$next_tip.outerHeight(),
|
Chris@0
|
551 tip_offset = settings.$next_tip.offset(),
|
Chris@0
|
552 target_height = settings.$target.outerHeight(),
|
Chris@0
|
553 $nub = $('.joyride-nub', settings.$next_tip),
|
Chris@0
|
554 nub_height = Math.ceil($nub.outerHeight() / 2),
|
Chris@0
|
555 toggle = init || false;
|
Chris@0
|
556
|
Chris@0
|
557 $nub.removeClass('bottom')
|
Chris@0
|
558 .removeClass('top')
|
Chris@0
|
559 .removeClass('right')
|
Chris@0
|
560 .removeClass('left');
|
Chris@0
|
561
|
Chris@0
|
562 if (toggle) {
|
Chris@0
|
563 settings.$next_tip.css('visibility', 'hidden');
|
Chris@0
|
564 settings.$next_tip.show();
|
Chris@0
|
565 }
|
Chris@0
|
566
|
Chris@0
|
567 if (!settings.$target.is("body")) {
|
Chris@0
|
568
|
Chris@0
|
569 if (methods.top()) {
|
Chris@0
|
570
|
Chris@0
|
571 settings.$next_tip.offset({top: settings.$target.offset().top - tip_height - nub_height});
|
Chris@0
|
572 $nub.addClass('bottom');
|
Chris@0
|
573
|
Chris@0
|
574 } else {
|
Chris@0
|
575
|
Chris@0
|
576 settings.$next_tip.offset({top: settings.$target.offset().top + target_height + nub_height});
|
Chris@0
|
577 $nub.addClass('top');
|
Chris@0
|
578
|
Chris@0
|
579 }
|
Chris@0
|
580
|
Chris@0
|
581 } else if (settings.$li.length) {
|
Chris@0
|
582
|
Chris@0
|
583 methods.pos_modal($nub);
|
Chris@0
|
584
|
Chris@0
|
585 }
|
Chris@0
|
586
|
Chris@0
|
587 if (toggle) {
|
Chris@0
|
588 settings.$next_tip.hide();
|
Chris@0
|
589 settings.$next_tip.css('visibility', 'visible');
|
Chris@0
|
590 }
|
Chris@0
|
591 },
|
Chris@0
|
592
|
Chris@0
|
593 pos_modal : function ($nub) {
|
Chris@0
|
594 methods.center();
|
Chris@0
|
595 $nub.hide();
|
Chris@0
|
596
|
Chris@0
|
597 methods.show_modal();
|
Chris@0
|
598
|
Chris@0
|
599 },
|
Chris@0
|
600
|
Chris@0
|
601 show_modal : function() {
|
Chris@0
|
602 if ($('.joyride-modal-bg').length < 1) {
|
Chris@0
|
603 $('body').append(settings.template.modal).show();
|
Chris@0
|
604 }
|
Chris@0
|
605
|
Chris@0
|
606 if (/pop/i.test(settings.tipAnimation)) {
|
Chris@0
|
607 $('.joyride-modal-bg').show();
|
Chris@0
|
608 } else {
|
Chris@0
|
609 $('.joyride-modal-bg').fadeIn(settings.tipAnimationFadeSpeed);
|
Chris@0
|
610 }
|
Chris@0
|
611 },
|
Chris@0
|
612
|
Chris@0
|
613 expose: function(){
|
Chris@0
|
614 var expose,
|
Chris@0
|
615 exposeCover,
|
Chris@0
|
616 el,
|
Chris@0
|
617 origCSS,
|
Chris@0
|
618 randId = 'expose-'+Math.floor(Math.random()*10000);
|
Chris@0
|
619 if (arguments.length>0 && arguments[0] instanceof $){
|
Chris@0
|
620 el = arguments[0];
|
Chris@0
|
621 } else if(settings.$target && !settings.$target.is("body")){
|
Chris@0
|
622 el = settings.$target;
|
Chris@0
|
623 } else {
|
Chris@0
|
624 return false;
|
Chris@0
|
625 }
|
Chris@0
|
626 if(el.length < 1){
|
Chris@0
|
627 if(window.console){
|
Chris@0
|
628 console.error('element not valid', el);
|
Chris@0
|
629 }
|
Chris@0
|
630 return false;
|
Chris@0
|
631 }
|
Chris@0
|
632 expose = $(settings.template.expose);
|
Chris@0
|
633 settings.$body.append(expose);
|
Chris@0
|
634 expose.css({
|
Chris@0
|
635 top: el.offset().top,
|
Chris@0
|
636 left: el.offset().left,
|
Chris@0
|
637 width: el.outerWidth(true),
|
Chris@0
|
638 height: el.outerHeight(true)
|
Chris@0
|
639 });
|
Chris@0
|
640 exposeCover = $(settings.template.exposeCover);
|
Chris@0
|
641 origCSS = {
|
Chris@0
|
642 zIndex: el.css('z-index'),
|
Chris@0
|
643 position: el.css('position')
|
Chris@0
|
644 };
|
Chris@0
|
645 el.css('z-index',expose.css('z-index')*1+1);
|
Chris@0
|
646 if(origCSS.position == 'static'){
|
Chris@0
|
647 el.css('position','relative');
|
Chris@0
|
648 }
|
Chris@0
|
649 el.data('expose-css',origCSS);
|
Chris@0
|
650 exposeCover.css({
|
Chris@0
|
651 top: el.offset().top,
|
Chris@0
|
652 left: el.offset().left,
|
Chris@0
|
653 width: el.outerWidth(true),
|
Chris@0
|
654 height: el.outerHeight(true)
|
Chris@0
|
655 });
|
Chris@0
|
656 settings.$body.append(exposeCover);
|
Chris@0
|
657 expose.addClass(randId);
|
Chris@0
|
658 exposeCover.addClass(randId);
|
Chris@0
|
659 if(settings.tipSettings['exposeClass']){
|
Chris@0
|
660 expose.addClass(settings.tipSettings['exposeClass']);
|
Chris@0
|
661 exposeCover.addClass(settings.tipSettings['exposeClass']);
|
Chris@0
|
662 }
|
Chris@0
|
663 el.data('expose', randId);
|
Chris@0
|
664 settings.postExposeCallback(settings.$li.index(), settings.$next_tip, el);
|
Chris@0
|
665 methods.add_exposed(el);
|
Chris@0
|
666 },
|
Chris@0
|
667
|
Chris@0
|
668 un_expose: function(){
|
Chris@0
|
669 var exposeId,
|
Chris@0
|
670 el,
|
Chris@0
|
671 expose ,
|
Chris@0
|
672 origCSS,
|
Chris@0
|
673 clearAll = false;
|
Chris@0
|
674 if (arguments.length>0 && arguments[0] instanceof $){
|
Chris@0
|
675 el = arguments[0];
|
Chris@0
|
676 } else if(settings.$target && !settings.$target.is("body")){
|
Chris@0
|
677 el = settings.$target;
|
Chris@0
|
678 } else {
|
Chris@0
|
679 return false;
|
Chris@0
|
680 }
|
Chris@0
|
681 if(el.length < 1){
|
Chris@0
|
682 if(window.console){
|
Chris@0
|
683 console.error('element not valid', el);
|
Chris@0
|
684 }
|
Chris@0
|
685 return false;
|
Chris@0
|
686 }
|
Chris@0
|
687 exposeId = el.data('expose');
|
Chris@0
|
688 expose = $('.'+exposeId);
|
Chris@0
|
689 if(arguments.length>1){
|
Chris@0
|
690 clearAll = arguments[1];
|
Chris@0
|
691 }
|
Chris@0
|
692 if(clearAll === true){
|
Chris@0
|
693 $('.joyride-expose-wrapper,.joyride-expose-cover').remove();
|
Chris@0
|
694 } else {
|
Chris@0
|
695 expose.remove();
|
Chris@0
|
696 }
|
Chris@0
|
697 origCSS = el.data('expose-css');
|
Chris@0
|
698 if(origCSS.zIndex == 'auto'){
|
Chris@0
|
699 el.css('z-index', '');
|
Chris@0
|
700 } else {
|
Chris@0
|
701 el.css('z-index',origCSS.zIndex);
|
Chris@0
|
702 }
|
Chris@0
|
703 if(origCSS.position != el.css('position')){
|
Chris@0
|
704 if(origCSS.position == 'static'){// this is default, no need to set it.
|
Chris@0
|
705 el.css('position', '');
|
Chris@0
|
706 } else {
|
Chris@0
|
707 el.css('position',origCSS.position);
|
Chris@0
|
708 }
|
Chris@0
|
709 }
|
Chris@0
|
710 el.removeData('expose');
|
Chris@0
|
711 el.removeData('expose-z-index');
|
Chris@0
|
712 methods.remove_exposed(el);
|
Chris@0
|
713 },
|
Chris@0
|
714
|
Chris@0
|
715 add_exposed: function(el){
|
Chris@0
|
716 settings.exposed = settings.exposed || [];
|
Chris@0
|
717 if(el instanceof $){
|
Chris@0
|
718 settings.exposed.push(el[0]);
|
Chris@0
|
719 } else if(typeof el == 'string'){
|
Chris@0
|
720 settings.exposed.push(el);
|
Chris@0
|
721 }
|
Chris@0
|
722 },
|
Chris@0
|
723
|
Chris@0
|
724 remove_exposed: function(el){
|
Chris@0
|
725 var search;
|
Chris@0
|
726 if(el instanceof $){
|
Chris@0
|
727 search = el[0]
|
Chris@0
|
728 } else if (typeof el == 'string'){
|
Chris@0
|
729 search = el;
|
Chris@0
|
730 }
|
Chris@0
|
731 settings.exposed = settings.exposed || [];
|
Chris@0
|
732 for(var i=0; i<settings.exposed.length; i++){
|
Chris@0
|
733 if(settings.exposed[i] == search){
|
Chris@0
|
734 settings.exposed.splice(i,1);
|
Chris@0
|
735 return;
|
Chris@0
|
736 }
|
Chris@0
|
737 }
|
Chris@0
|
738 },
|
Chris@0
|
739
|
Chris@0
|
740 center : function () {
|
Chris@0
|
741 var $w = settings.$window;
|
Chris@0
|
742
|
Chris@0
|
743 settings.$next_tip.css({
|
Chris@0
|
744 top : ((($w.height() - settings.$next_tip.outerHeight()) / 2) + $w.scrollTop()),
|
Chris@0
|
745 left : ((($w.width() - settings.$next_tip.outerWidth()) / 2) + $w.scrollLeft())
|
Chris@0
|
746 });
|
Chris@0
|
747
|
Chris@0
|
748 return true;
|
Chris@0
|
749 },
|
Chris@0
|
750
|
Chris@0
|
751 bottom : function () {
|
Chris@0
|
752 return /bottom/i.test(settings.tipSettings.tipLocation);
|
Chris@0
|
753 },
|
Chris@0
|
754
|
Chris@0
|
755 top : function () {
|
Chris@0
|
756 return /top/i.test(settings.tipSettings.tipLocation);
|
Chris@0
|
757 },
|
Chris@0
|
758
|
Chris@0
|
759 right : function () {
|
Chris@0
|
760 return /right/i.test(settings.tipSettings.tipLocation);
|
Chris@0
|
761 },
|
Chris@0
|
762
|
Chris@0
|
763 left : function () {
|
Chris@0
|
764 return /left/i.test(settings.tipSettings.tipLocation);
|
Chris@0
|
765 },
|
Chris@0
|
766
|
Chris@0
|
767 corners : function (el) {
|
Chris@0
|
768 var w = settings.$window,
|
Chris@0
|
769 window_half = w.height() / 2,
|
Chris@0
|
770 tipOffset = Math.ceil(settings.$target.offset().top - window_half + settings.$next_tip.outerHeight()),//using this to calculate since scroll may not have finished yet.
|
Chris@0
|
771 right = w.width() + w.scrollLeft(),
|
Chris@0
|
772 offsetBottom = w.height() + tipOffset,
|
Chris@0
|
773 bottom = w.height() + w.scrollTop(),
|
Chris@0
|
774 top = w.scrollTop();
|
Chris@0
|
775
|
Chris@0
|
776 if(tipOffset < top){
|
Chris@0
|
777 if (tipOffset <0 ){
|
Chris@0
|
778 top = 0;
|
Chris@0
|
779 } else {
|
Chris@0
|
780 top = tipOffset;
|
Chris@0
|
781 }
|
Chris@0
|
782 }
|
Chris@0
|
783
|
Chris@0
|
784 if(offsetBottom > bottom){
|
Chris@0
|
785 bottom = offsetBottom;
|
Chris@0
|
786 }
|
Chris@0
|
787
|
Chris@0
|
788 return [
|
Chris@0
|
789 el.offset().top < top,
|
Chris@0
|
790 right < el.offset().left + el.outerWidth(),
|
Chris@0
|
791 bottom < el.offset().top + el.outerHeight(),
|
Chris@0
|
792 w.scrollLeft() > el.offset().left
|
Chris@0
|
793 ];
|
Chris@0
|
794 },
|
Chris@0
|
795
|
Chris@0
|
796 visible : function (hidden_corners) {
|
Chris@0
|
797 var i = hidden_corners.length;
|
Chris@0
|
798
|
Chris@0
|
799 while (i--) {
|
Chris@0
|
800 if (hidden_corners[i]) return false;
|
Chris@0
|
801 }
|
Chris@0
|
802
|
Chris@0
|
803 return true;
|
Chris@0
|
804 },
|
Chris@0
|
805
|
Chris@0
|
806 nub_position : function (nub, pos, def) {
|
Chris@0
|
807 if (pos === 'auto') {
|
Chris@0
|
808 nub.addClass(def);
|
Chris@0
|
809 } else {
|
Chris@0
|
810 nub.addClass(pos);
|
Chris@0
|
811 }
|
Chris@0
|
812 },
|
Chris@0
|
813
|
Chris@0
|
814 startTimer : function () {
|
Chris@0
|
815 if (settings.$li.length) {
|
Chris@0
|
816 settings.automate = setTimeout(function () {
|
Chris@0
|
817 methods.hide();
|
Chris@0
|
818 methods.show();
|
Chris@0
|
819 methods.startTimer();
|
Chris@0
|
820 }, settings.timer);
|
Chris@0
|
821 } else {
|
Chris@0
|
822 clearTimeout(settings.automate);
|
Chris@0
|
823 }
|
Chris@0
|
824 },
|
Chris@0
|
825
|
Chris@0
|
826 end : function (isAborted) {
|
Chris@0
|
827 isAborted = isAborted || false;
|
Chris@0
|
828
|
Chris@0
|
829 // Unbind resize events.
|
Chris@0
|
830 if (isAborted) {
|
Chris@0
|
831 settings.$window.off('resize.joyride');
|
Chris@0
|
832 }
|
Chris@0
|
833
|
Chris@0
|
834 if (settings.cookieMonster) {
|
Chris@0
|
835 $.cookie(settings.cookieName, 'ridden', { expires: 365, domain: settings.cookieDomain, path: settings.cookiePath });
|
Chris@0
|
836 }
|
Chris@0
|
837
|
Chris@0
|
838 if (settings.localStorage) {
|
Chris@0
|
839 localStorage.setItem(settings.localStorageKey, true);
|
Chris@0
|
840 }
|
Chris@0
|
841
|
Chris@0
|
842 if (settings.timer > 0) {
|
Chris@0
|
843 clearTimeout(settings.automate);
|
Chris@0
|
844 }
|
Chris@0
|
845 if(settings.modal && settings.expose){
|
Chris@0
|
846 methods.un_expose();
|
Chris@0
|
847 }
|
Chris@0
|
848 if (settings.$current_tip) {
|
Chris@0
|
849 settings.$current_tip.hide();
|
Chris@0
|
850 }
|
Chris@0
|
851 if (settings.$li) {
|
Chris@0
|
852 settings.postStepCallback(settings.$li.index(), settings.$current_tip, isAborted);
|
Chris@0
|
853 settings.postRideCallback(settings.$li.index(), settings.$current_tip, isAborted);
|
Chris@0
|
854 }
|
Chris@0
|
855 $('.joyride-modal-bg').hide();
|
Chris@0
|
856 },
|
Chris@0
|
857
|
Chris@0
|
858 jquery_check : function () {
|
Chris@0
|
859 // define on() and off() for older jQuery
|
Chris@0
|
860 if (!$.isFunction($.fn.on)) {
|
Chris@0
|
861
|
Chris@0
|
862 $.fn.on = function (types, sel, fn) {
|
Chris@0
|
863
|
Chris@0
|
864 return this.delegate(sel, types, fn);
|
Chris@0
|
865
|
Chris@0
|
866 };
|
Chris@0
|
867
|
Chris@0
|
868 $.fn.off = function (types, sel, fn) {
|
Chris@0
|
869
|
Chris@0
|
870 return this.undelegate(sel, types, fn);
|
Chris@0
|
871
|
Chris@0
|
872 };
|
Chris@0
|
873
|
Chris@0
|
874 return false;
|
Chris@0
|
875 }
|
Chris@0
|
876
|
Chris@0
|
877 return true;
|
Chris@0
|
878 },
|
Chris@0
|
879
|
Chris@0
|
880 outerHTML : function (el) {
|
Chris@0
|
881 // support FireFox < 11
|
Chris@0
|
882 return el.outerHTML || new XMLSerializer().serializeToString(el);
|
Chris@0
|
883 },
|
Chris@0
|
884
|
Chris@0
|
885 version : function () {
|
Chris@0
|
886 return settings.version;
|
Chris@0
|
887 },
|
Chris@0
|
888
|
Chris@0
|
889 tabbable : function (el) {
|
Chris@0
|
890 $(el).on('keydown', function( event ) {
|
Chris@0
|
891 if (!event.isDefaultPrevented() && event.keyCode &&
|
Chris@0
|
892 // Escape key.
|
Chris@0
|
893 event.keyCode === 27 ) {
|
Chris@0
|
894 event.preventDefault();
|
Chris@0
|
895 methods.end(true /* isAborted */);
|
Chris@0
|
896 return;
|
Chris@0
|
897 }
|
Chris@0
|
898
|
Chris@0
|
899 // Prevent tabbing out of tour items.
|
Chris@0
|
900 if ( event.keyCode !== 9 ) {
|
Chris@0
|
901 return;
|
Chris@0
|
902 }
|
Chris@0
|
903 var tabbables = $(el).find(":tabbable"),
|
Chris@0
|
904 first = tabbables.filter(":first"),
|
Chris@0
|
905 last = tabbables.filter(":last");
|
Chris@0
|
906 if ( event.target === last[0] && !event.shiftKey ) {
|
Chris@0
|
907 first.focus( 1 );
|
Chris@0
|
908 event.preventDefault();
|
Chris@0
|
909 } else if ( event.target === first[0] && event.shiftKey ) {
|
Chris@0
|
910 last.focus( 1 );
|
Chris@0
|
911 event.preventDefault();
|
Chris@0
|
912 }
|
Chris@0
|
913 });
|
Chris@0
|
914 }
|
Chris@0
|
915
|
Chris@0
|
916 };
|
Chris@0
|
917
|
Chris@0
|
918 $.fn.joyride = function (method) {
|
Chris@0
|
919 if (methods[method]) {
|
Chris@0
|
920 return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
|
Chris@0
|
921 } else if (typeof method === 'object' || !method) {
|
Chris@0
|
922 return methods.init.apply(this, arguments);
|
Chris@0
|
923 } else {
|
Chris@0
|
924 $.error('Method ' + method + ' does not exist on jQuery.joyride');
|
Chris@0
|
925 }
|
Chris@0
|
926 };
|
Chris@0
|
927
|
Chris@0
|
928 }(jQuery, this));
|