annotate core/assets/vendor/jquery-joyride/jquery.joyride-2.1.js @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents 4c8ae668cc8c
children
rev   line source
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));