1(function($) { 2 3 4 var add_nggpl_theme = function() { 5 6 Galleria.addTheme({ 7 name: 'nextgen_pro_lightbox', 8 author: 'Imagely', 9 version: 2.0, 10 defaults: { 11 debug: false, 12 responsive: true, 13 carousel: true, 14 thumbnails: 'lazy', 15 fullscreen: false, 16 trueFullscreen: false, 17 fullscreenDoubleTap: false, 18 maxScaleRatio: 1 19 }, 20 init: function(options) { 21 var self = this; 22 Galleria.requires(1.41, 'This version of the NextGEN Pro Lightbox theme requires Galleria 1.4.1 or later'); 23 24 $.nplModal('log', 'theme initialization', { 25 options: options 26 }); 27 28 // Some objects have aip variables - animation-in-progress - and are used to make jQuery animations smoother 29 var methods = { 30 sidebar: { 31 _is_open: false, 32 _type: '', 33 is_open: function(state) { 34 if (typeof state !== 'undefined') { 35 this._is_open = state; 36 } else { 37 return this._is_open; 38 } 39 }, 40 toggle: function(type) { 41 $.nplModal('log', 'theme sidebar.toggle()', { 42 type: type 43 }); 44 if (this.is_open() && type === this.get_type()) { 45 this.close(); 46 } else { 47 this.open(type); 48 } 49 }, 50 open: function(type) { 51 $.nplModal('log', 'theme sidebar.open()', { 52 type: type 53 }); 54 55 $('#npl_wrapper').addClass('npl-sidebar-open npl-sidebar-overlay-open'); 56 57 this.render(type); 58 methods.sidebar.is_open(true); 59 60 var state = $.nplModal('get_state'); 61 state.sidebar = type; 62 63 $.nplModal( 64 'router.navigate', 65 $.nplModal('get_setting', 'router_slug') 66 + '/' + state.slug 67 + '/' + state.image_id 68 + '/' + type, 69 true 70 ); 71 72 self.resize(); 73 self.trigger('npl_sidebar_opened'); 74 }, 75 close: function() { 76 $.nplModal('log', 'theme sidebar.close()'); 77 78 $('#npl_wrapper').removeClass('npl-sidebar-open npl-sidebar-overlay-open'); 79 80 methods.sidebar.is_open(false); 81 82 var state = $.nplModal('get_state'); 83 state.sidebar = null; 84 $.nplModal( 85 'router.navigate', 86 $.nplModal('get_setting', 'router_slug') 87 + '/' + state.slug 88 + '/' + state.image_id, 89 true 90 ); 91 92 self.resize(); 93 self.trigger('npl_sidebar_closed'); 94 }, 95 render: function(type) { 96 $.nplModal('log', 'theme sidebar.render()', { 97 type: type 98 }); 99 100 // switching to another sidebar type; flash the overlay 101 if (type !== this.get_type()) { 102 this._type = type; 103 $.nplModal('get_state').sidebar = type; 104 } 105 106 methods.sidebars[type].render(methods.galleria.get_current_image_id()); 107 methods.sidebars[type].init(); 108 }, 109 get_type: function() { 110 return this._type; 111 }, 112 events: { 113 bind: function() { 114 $.nplModal('log', 'theme sidebar.events.bind()'); 115 $('#npl_content').on('npl_sidebar_rendered', this.rendered); 116 $('#npl_sidebar_toggle').on('click', function() { 117 methods.sidebar.close(); 118 }); 119 }, 120 rendered: function() { 121 $.nplModal('log', 'theme sidebar.events.rendered()'); 122 123 // This is hidden except for narrow viewports by default, allows phone users to remember what photo they are 'on' 124 $('#nggpl-sidebar-thumbnail-img').attr('src', self.getData(self.getIndex()).image); 125 } 126 } 127 }, 128 sidebars: { 129 datacache: { 130 _cache: [], 131 _current_image_ndx: null, 132 _last_image_ndx: null, 133 134 events: { 135 bind: function() { 136 $.nplModal('log', 'theme sidebars.datacache.events.bind()'); 137 self.bind('loadstart', this.loadstart); 138 }, 139 140 // Used to track which direction users are navigating in so we can intelligently 141 // pre-load sidebar data in advance of the image being selected 142 loadstart: function() { 143 $.nplModal('log', 'theme sidebars.datacache.events.image()'); 144 // Initial value at startup 145 if (methods.sidebars.datacache._current_image_ndx === null) { 146 methods.sidebars.datacache._last_image_ndx = methods.sidebars.datacache._current_image_ndx = self.getIndex(); 147 } else { 148 // Store the current index and shift the old value 149 methods.sidebars.datacache._last_image_ndx = methods.sidebars.datacache._current_image_ndx; 150 methods.sidebars.datacache._current_image_ndx = self.getIndex(); 151 } 152 } 153 }, 154 155 get_carousel_navigation_direction: function() { 156 if (this._current_image_ndx === this._last_image_ndx) { 157 return 'same'; 158 } else { 159 if (this._last_image_ndx === 0 && this._current_image_ndx === (self.getDataLength() - 1)) { 160 return 'left'; 161 } else if (this._current_image_ndx === 0 && this._last_image_ndx === (self.getDataLength() -1)) { 162 return 'right'; 163 } else { 164 return (this._current_image_ndx < this._last_image_ndx) ? 'left' : 'right'; 165 } 166 } 167 }, 168 169 // because the .length operator isn't accurate 170 get_cache_size: function() { 171 var size = this._cache.length; 172 173 $.nplModal('log', 'theme sidebars.comments.get_cache_size()', { 174 result: size 175 }); 176 177 return size; 178 }, 179 180 // returns the image-id field of the first preceeding image found whose comments aren't cached 181 get_prev_uncached_image_id: function(id, step) { 182 step = step || 0; 183 var prev_image_id = self.getData(self.getPrev(methods.galleria.get_index_from_id(id) - step)).image_id; 184 if (this._cache[prev_image_id] && this.get_cache_size() < self.getDataLength()) { 185 prev_image_id = this.get_prev_uncached_image_id(prev_image_id); 186 } 187 188 $.nplModal('log', 'theme sidebars.comments.get_prev_uncached_image_id()', { 189 id: id, 190 result: prev_image_id 191 }); 192 193 return prev_image_id; 194 }, 195 196 // returns the image-id field of the first following image found whose comments aren't cached 197 get_next_uncached_image_id: function(id, step) { 198 step = step || 0; 199 var next_image_id = self.getData(self.getNext(methods.galleria.get_index_from_id(id) + step)).image_id; 200 if (this._cache[next_image_id] && this.get_cache_size() < self.getDataLength()) { 201 next_image_id = this.get_next_uncached_image_id(next_image_id); 202 } 203 204 $.nplModal('log', 'theme sidebars.comments.get_next_uncached_image_id()', { 205 id: id, 206 result: next_image_id 207 }); 208 209 return next_image_id; 210 }, 211 212 // expanded request method: adds first pre-ceding and following uncached id to the request 213 expanded_request: function(id, finished) { 214 $.nplModal('log', 'theme sidebars.comments.expanded_request()', { 215 id: id 216 }); 217 218 var id_array = (id instanceof Array) ? id : id.toString().split(','); 219 220 // a single ID was requested, so inject some extras so they can be cached in advance 221 if (id_array.length === 1) { 222 var key = id_array[0]; 223 var prev = this.get_prev_uncached_image_id(key); 224 var next = this.get_next_uncached_image_id(key); 225 if (!this._cache[prev]) { 226 this._cache[prev] = 'Placeholder stub'; 227 id_array.unshift(prev); 228 } 229 if (!this._cache[next] && prev !== next && id !== next) { 230 this._cache[next] = 'Placeholder stub'; 231 id_array.push(next); 232 } 233 } 234 235 id_array = this.sort_uniq(id_array); 236 this.request(id_array, 0, finished); 237 }, 238 239 // handles the HTTP request to load comments & cache the results 240 request: function(id, page, finished) { 241 $.nplModal('log', 'theme sidebars.comments.request()', { 242 id: id, 243 page: page 244 }); 245 246 var myself = this; // self is taken 247 var postdata = { 248 type: 'image', 249 page: page, 250 id: id.join(','), 251 from: window.parent.location.toString(), 252 }; 253 if ($.nplModal('get_setting', 'lang', false)) { 254 postdata.lang = $.nplModal('get_setting', 'lang'); 255 } 256 257 $.ajax({ 258 url: photocrati_ajax.rest_url + '
258nggpro/v1/Galleria/GetSidebarData', 259 method: 'POST', 260 beforeSend: function (xhr) { 261 xhr.setRequestHeader('X-WP-Nonce', window.nextgen_pro_lightbox_authentication.nonce); 262 }, 263 xhrFields: { 264 withCredentials: true 265 }, 266 data: postdata, 267 success: function(data) { 268 $.nplModal('log', 'theme sidebars.comments.request() response', { 269 response: data 270 }); 271 272 if (typeof(data) !== 'object') { 273 data = JSON.parse(data); 274 } 275 for (var ndx in data) { 276 myself._cache[ndx] = data[ndx]; 277 } 278 if (typeof finished === 'function') { 279 finished(data); 280 } 281 } 282 }); 283 }, 284 285 // find and load the next un-cached results 286 load_more: function(id) { 287 $.nplModal('log', 'theme sidebars.comments.load_more()', { 288 id: id 289 }); 290 291 if (methods.nplModal.is_nextgen_gallery() 292 && $.nplModal('get_setting', 'enable_routing', false) 293 && $.nplModal('get_setting', 'enable_comments', false)) { 294 var precache_ids = []; 295 296 var direction = methods.sidebars.datacache.get_carousel_navigation_direction(); 297 var count = 3; 298 299 // Retrieve X images in the same direction the user is navigating 300 for (var i = 0; i <= count; i++) { 301 if (direction === 'left') { 302 var uncached_id = this.get_prev_uncached_image_id(id, i); 303 } else { 304 var uncached_id = this.get_next_uncached_image_id(id, i); 305 } 306 307 // Push the recently found IDs to this._cache so they can't be included again 308 if (!this._cache[uncached_id]) { 309 this._cache[uncached_id] = 'Placeholder stub'; 310 precache_ids.push(uncached_id); 311 } 312 } 313 314 precache_ids = this.sort_uniq(precache_ids); 315
316 if (precache_ids.length !== 0) { 317 this.expanded_request(precache_ids); 318 } 319 } 320 }, 321 322 sort_uniq: function(ids) { 323 return ids.sort().filter(function(item, pos, ary) { 324 return !pos || item !== ary[pos - 1]; 325 }) 326 }, 327 328 get_cache_by_id: function(id) { 329 return this._cache[id]; 330 } 331 }, 332 comments: { 333 // called after render(), initialize logic & events 334 init: function() { 335 $.nplModal('log', 'theme sidebars.comments.init()'); 336 337 if ($('#nggpl-comments-wrapper').length !== 1) { return; } 338 339 // jquery's .val() fails with hidden fields 340 var origin_url = document.getElementById("ngg_comment_origin_url"); 341 if (typeof origin_url !== 'undefined' && origin_url !== null) { 342 origin_url.value = window.location.href.toString(); 343 } 344 345 // It is much faster to change the target attribute globally here than through WP hooks 346 $('#npl_sidebar').find('a').each(function() { 347 if ($(this).attr('id') === 'nggpl-comment-logout') { 348 $(this).attr('href', $(this).attr('href') + '?redirect_to=' + window.location.toString()); 349 } else { 350 $(this).attr('target', '_blank'); 351 } 352 }); 353 354 $('#nggpl-respond-form').on('submit', function (event) { 355 event.preventDefault(); 356 var commentstatus = $('#nggpl-comment-status'); 357 $('#npl_wrapper').addClass('npl-sidebar-overlay-open'); 358 $.ajax({ 359 type: $(this).attr('method'), 360 url: $(this).attr('action'), 361 data: $(this).serialize(), 362 dataType: 'json', 363 success: function (data) { 364 if (data.success === true) { 365 $('#nggpl-comment').val(''); 366 $('#nggpl-comments-title').val(''); 367 var image_id = methods.galleria.get_current_image_id(); 368 methods.sidebars.datacache.expanded_request(image_id, function() { 369 methods.sidebar.render(methods.sidebars.comments.get_type(), image_id); 370 }); 371 } else { 372 commentstatus.addClass('error') 373 .html(data); 374 $('#npl_wrapper').removeClass('npl-sidebar-overlay-open'); 375 } 376 }, 377 complete: function (jqXHR, status) { 378 }, 379 error: function (jqXHR) { 380 commentstatus.addClass('error').html(jqXHR.responseText); 381 $('#npl_wrapper').removeClass('npl-sidebar-overlay-open'); 382 } 383 }); 384 }); 385 386 $("#npl_sidebar .nggpl-button, #nggpl-comment-form-wrapper input[type='submit']").each(function() { 387 var $this = $(this); 388 $this.css({ 389 'color': $.nplModal('get_setting', 'sidebar_button_color'), 390 'background-color': $.nplModal('get_setting', 'sidebar_button_background') 391 }); 392 }); 393 394 // handles 'Reply' links 395 $('.nggpl-reply-to-comment').on('click', function(event) { 396 event.preventDefault(); 397 // all that wordpress needs is the comment_parent value 398 $('#nggpl-comment_parent').val($(this).data('comment-id')); 399 $('#nggpl-comment-reply-status').removeClass('hidden'); 400 401 // IE has issues setting focus on invisible elements. Be wary 402 $('#nggpl-commentform').find(':input').filter(':visible').first().trigger('focus'); 403 $('#npl_sidebar').scrollTop($('#nggpl-comments-bottom').offset().top); 404 }); 405 406 // handles "cancel reply" link 407 $('#nggpl-comment-reply-status a').on('click', function(event) { 408 event.preventDefault(); 409 $('#nggpl-comment_parent').val('0'); 410 $('#nggpl-comment-reply-status').addClass('hidden'); 411 }); 412 413 // handles comment AJAX pagination 414 $('#nggpl-comment-nav-below a').on('click', function(event) { 415 event.preventDefault(); 416 $('#npl_wrapper').addClass('npl-sidebar-overlay-open'); 417 var page_id = $(this).data('page-id'); 418 methods.sidebars.datacache.request( 419 [methods.galleria.get_current_image_id()], 420 page_id, 421 function() { 422 methods.sidebar.render('comments', methods.galleria.get_current_image_id()); 423 } 424 ); 425 }); 426 427 self.trigger('npl_sidebar_rendered'); 428 429 if (methods.nplModal.is_nextgen_gallery() 430 && $.nplModal('get_setting', 'enable_routing', false) 431 && $.nplModal('get_setting', 'enable_sharing', false)) { 432 $('#nggpl-comments-image-share-icons').removeClass('disabled'); 433 methods.share_icons.create( 434 '#nggpl-comments-image-share-icons', 435 methods.icons.get_overlay_color() 436 ); 437 } 438 439 methods.sidebars.comments.wait_for_image_to_reveal(); 440 }, 441 442 wait_for_image_to_reveal: function() { 443 if (!methods.sidebars.comments.events.between_loadstart_and_finish) { 444 $('#npl_wrapper').removeClass('npl-sidebar-overlay-open'); 445 } else { 446 methods.sidebars.comments.events.waiting_for_image_to_load = true; 447 } 448 }, 449 450 // returns the display area content from cache 451 render: function(id) { 452 $.nplModal('log', 'theme sidebars.comments.render()', { 453 id: id 454 }); 455 456 var cache = methods.sidebars.datacache.get_cache_by_id(id); 457 458 if (!cache) { 459 $('#npl_wrapper').addClass('npl-sidebar-overlay-open'); 460 methods.sidebars.datacache.expanded_request(id, function() { 461 cache = methods.sidebars.datacache.get_cache_by_id(id); 462 $('#npl_sidebar').html(cache.comments['rendered_view']); 463 methods.sidebars.comments.init(); 464 }); 465 } else if (cache === 'Placeholder stub') { 466 $('#npl_wrapper').addClass('npl-sidebar-overlay-open'); 467 var interval = setInterval(function() { 468 cache = methods.sidebars.datacache.get_cache_by_id(id); 469 if (cache !== 'Placeholder stub') { 470 $('#npl_sidebar').html(cache.comments['rendered_view']); 471 methods.sidebars.comments.init(); 472 clearInterval(interval); 473 } 474 }, 250); 475 } else { 476 $('#npl_sidebar').html(cache.comments['rendered_view']); 477 $('#npl_wrapper').removeClass('npl-sidebar-overlay-open'); 478 } 479 }, 480 481 get_type: function() { 482 return 'comments'; 483 }, 484 485 events: { 486 waiting_for_image_to_load: false, 487 between_loadstart_and_finish: false, 488 489 bind: function() { 490 $.nplModal('log', 'theme sidebars.comments.events.bind()'); 491 492 if (methods.nplModal.is_nextgen_gallery() 493 && $.nplModal('get_setting', 'enable_routing', false) 494 && $.nplModal('get_setting', 'enable_comments', false) 495 && !methods.nplModal.is_random_source()) { 496 self.bind('loadstart', this.loadstart); 497 self.bind('npl_init', this.npl_init); 498 self.bind('npl_init_keys', this.npl_init_keys); 499 self.bind('image', this.image); 500 } 501 }, 502 503 npl_init: function() { 504 $.nplModal('log', 'theme sidebars.comments.events.npl_init()'); 505 506 // Adds comment toolbar button 507 var comment_button = $('<i/>') 508 .addClass('nggpl-toolbar-button-comment fa fa-comment') 509 .attr({'title': $.nplModal('get_setting', 'i18n').toggle_social_sidebar}); 510 methods.thumbnails.register_button( 511 comment_button, 512 function(event) { 513 methods.sidebar.toggle(methods.sidebars.comments.get_type()); 514 event.preventDefault(); 515 } 516 ); 517 }, 518 519 image: function() { 520 methods.sidebars.comments.events.between_loadstart_and_finish = false;
521 522 if (methods.sidebars.comments.events.waiting_for_image_to_load) { 523 methods.sidebars.comments.events.waiting_for_image_to_load = false; 524 $('#npl_wrapper').removeClass('npl-sidebar-overlay-open'); 525 } 526 }, 527 528 _loadstart_run_once: false, 529 loadstart: function(e) { 530 $.nplModal('log', 'theme sidebars.comments.events.npl_init_complete()'); 531 532 methods.sidebars.comments.events.between_loadstart_and_finish = true; 533 534 if (methods.nplModal.is_nextgen_gallery() && !methods.sidebars.comments._loadstart_run_once) { 535 // possibly display the comments sidebar at startup 536 if (($.nplModal('get_state').sidebar && $.nplModal('get_state').sidebar === methods.sidebars.comments.get_type()) 537 || $.nplModal('get_setting', 'display_comments')) { 538 methods.sidebar.open(methods.sidebars.comments.get_type()); 539 } 540 methods.sidebars.comments._loadstart_run_once = true; 541 } else if (methods.nplModal.is_nextgen_gallery() 542 && $.nplModal('get_setting', 'enable_routing', false) 543 && $.nplModal('get_setting', 'enable_comments', false)) { 544 // updates the sidebar 545 methods.sidebars.datacache.load_more(methods.galleria.get_current_image_id()); 546 if (methods.sidebar.is_open() && methods.sidebar.get_type() === methods.sidebars.comments.get_type()) { 547 methods.sidebar.render(methods.sidebars.comments.get_type()); 548 } 549 } 550 }, 551 552 npl_init_keys: function() { 553 $.nplModal('log', 'theme sidebars.comments.events.npl_init_keys()'); 554 var input_types = methods.galleria.get_keybinding_exclude_list(); 555 if (methods.nplModal.is_nextgen_gallery() 556 && $.nplModal('get_setting', 'enable_routing', false) 557 && $.nplModal('get_setting', 'enable_comments', false)) 558 { 559 self.attachKeyboard({ 560 // spacebar 561 32: function () { 562 if (!$(document.activeElement).is(input_types)) { 563 methods.sidebar.toggle(methods.sidebars.comments.get_type()); 564 } 565 } 566 }); 567 } 568 } 569 } 570 } 571 }, 572 thumbnails: { 573 is_open: function() { 574 return !$('#npl_wrapper').hasClass('npl-carousel-closed'); 575 }, 576 toggle: function() { 577 $.nplModal('log', 'theme thumbnails.toggle()'); 578 579 if (this.is_open()) { 580 this.close(); 581 } else { 582 this.open(); 583 } 584 }, 585 open: function() { 586 $.nplModal('log', 'theme thumbnails.open()'); 587 588 $('#npl_wrapper').removeClass('npl-carousel-closed'); 589 $('.galleria-dock-toggle-container i').toggleClass('fa-angle-up fa-angle-down'); 590 $('.galleria-dock-toggle-container').find('[data-fa-i2svg]').toggleClass('fa-angle-up fa-angle-down'); 591 $(window).trigger('resize'); 592 }, 593 close: function() { 594 $.nplModal('log', 'theme thumbnails.close()'); 595 596 $('#npl_wrapper').addClass('npl-carousel-closed'); 597 $('.galleria-dock-toggle-container i').toggleClass('fa-angle-up fa-angle-down'); 598 $('.galleria-dock-toggle-container').find('[data-fa-i2svg]').toggleClass('fa-angle-up fa-angle-down'); 599 $(window).trigger('resize'); 600 }, 601 adjust_container: function() { 602 $.nplModal('log', 'theme thumbnails.adjust_container()'); 603 // Important: this must be delayed for a short while after Galleria.resize() is invoked to allow 604 // Galleria to finish repositioning itself and prevent possible race scenario. 605 setTimeout(function() { 606 var available_width = self.$('thumbnails-container').width() 607 - self.$('nextgen-buttons').width() 608 - self.$('thumb-nav-left').width() 609 - self.$('thumb-nav-right').width(); 610 if (available_width <= (70 * 4)) { 611 self.$('container').addClass('nggpl-carousel-too-small'); 612 } else { 613 self.$('container').removeClass('nggpl-carousel-too-small'); 614 } 615 }, 250); 616 }, 617 _buttons: [], 618 register_button: function(button, callback) { 619 $.nplModal('log', 'theme thumbnails.register_button()', { 620 button: button 621 }); 622 623 var wrapper = $('<span class="nggpl-button nggpl-toolbar-button"/>'); 624 if ($.nplModal('get_setting', 'icon_background_enabled', false) 625 && $.nplModal('get_setting', 'icon_background_rounded', false)) { 626 wrapper.addClass('nggpl-rounded'); 627 } 628 wrapper.html(button); 629 this._buttons.push(wrapper); 630 $(self._dom.stage).append(wrapper); 631 632 wrapper.on('click', function(event) { 633 callback(event) 634 }); 635 }, 636 get_registered_buttons: function() { 637 $.nplModal('log', 'theme thumbnails.get_registered_buttons', { 638 buttons: this._buttons 639 }); 640 return this._buttons; 641 }, 642 events: { 643 bind: function() { 644 $.nplModal('log', 'theme thumbnails.events.bind()'); 645 646 self.bind('loadfinish', methods.thumbnails.adjust_container); 647 self.bind('loadfinish', this.loadfinish); 648 self.bind('npl_sidebar_opened', methods.thumbnails.adjust_container); 649 self.bind('npl_sidebar_closed', methods.thumbnails.adjust_container); 650 self.bind('npl_init', this.npl_init); 651 self.bind('npl_init_complete', this.npl_init_complete); 652 653 // This prevents multiple handlers from running simultaneously, and multiple 654 // events pile up when listening to 'resize' - only the last handler is invoked 655 // if 250ms pass after the last triggering. 656 methods.galleria.bind_once('resize', methods.thumbnails.adjust_container, 250); 657 }, 658 npl_init: function() { 659 $.nplModal('log', 'theme thumbnails.events.npl_init()'); 660 661 if ('numbers' === options.thumbnails) { 662 self.$('container').addClass('nggpl-carousel-numbers'); 663 self.$('thumbnails-list').css('color', methods.icons.get_color()); 664 665 // Because numeric entries have a different width than at startup we 666 // must manually invoke updateCarousel() here so that we don't start 667 // with the carousel in the wrong position 668 self.updateCarousel(); 669 670 } else if ('lazy' === options.thumbnails) { 671 // load all thumbnails, 10 at a time, until all have been retrieved 672 self.lazyLoadChunks(10); 673 } 674 675 self.$('thumbnails-container').css({background: $.nplModal('get_setting', 'carousel_background_color')}); 676 677 // create carousel next/prev links 678 var next_thumbs_button = $('<i/>') 679 .addClass('fa fa-angle-right') 680 .css({color: methods.icons.get_color()}); 681 var prev_thumbs_button = $('<i/>') 682 .addClass('fa fa-angle-left') 683 .css({color: methods.icons.get_color()}); 684 $(self._dom.stage).append(next_thumbs_button); 685 $(self._dom.stage).append(prev_thumbs_button); 686 self.append({'thumb-nav-left': prev_thumbs_button}); 687 self.append({'thumb-nav-right': next_thumbs_button}); 688 689 // Create thumbnails-container toggle button 690 self.addElement('dock-toggle-container'); 691 var dock_toggle_container = self.$('dock-toggle-container') 692 .css({background: $.nplModal('get_setting', 'carousel_background_color')}); 693 var dock_toggle_button = $('<i/>').addClass('fa fa-angle-down') 694 .css({color: $.nplModal('get_setting', 'carousel_text_color')}); 695 696 // the container was marked hidden by the parent wrapper, adjust the angle-icon accordingly 697 if (!methods.thumbnails.is_open()) { 698 dock_toggle_button.toggleClass('fa-angle-up fa-angle-down'); 699 } 700 701 $(self._dom.stage).append(dock_toggle_button); 702 self.append({'dock-toggle-container': dock_toggle_button}); 703 dock_toggle_container.on('click', self.proxy(function() { 704 methods.thumbnails.toggle(); 705 })); 706 707 // Add playback controls 708 var play_button = $('<i/>') 709 .addClass('nggpl-toolbar-button-play fa fa-play') 710 .attr({'title': $.nplModal('get_setting', 'i18n').play_pause}); 711 if (this._playing) { 712 play_button.removeClass('fa-play').addClass('fa-pause'); 713 } 714 methods.thumbnails.register_button( 715 play_button, 716 function(event) { 717 event.preventDefault();
718 self.playToggle(); 719 var $target = $(event.currentTarget); 720 $target.find('i').toggleClass('fa-play fa-pause'); 721 $target.find('[data-fa-i2svg]').toggleClass('fa-play fa-pause'); 722 } 723 ); 724 725 // add info controls; handles animation of both the info & dock-toggle-container divs 726 var info_button = $('<i/>') 727 .addClass('nggpl-toolbar-button-info fa fa-info') 728 .attr({'title': $.nplModal('get_setting', 'i18n').toggle_image_info}); 729 methods.thumbnails.register_button( 730 info_button, 731 function(event) { 732 event.preventDefault(); 733 methods.info.toggle(); 734 } 735 ); 736 }, 737 npl_init_complete: function() { 738 $.nplModal('log', 'theme thumbnails.events.npl_init_complete()'); 739 740 var display_buttons = methods.thumbnails.get_registered_buttons(); 741 // assign all of our buttons a (possibly custom) color 742 for (i = 0; i <= (display_buttons.length - 1); i++) { 743 display_buttons[i].css({ 744 'color': methods.icons.get_color(), 745 'background-color': methods.icons.get_background() 746 }); 747 } 748 self.addElement('nextgen-buttons'); 749 self.append({'nextgen-buttons': display_buttons}); 750 self.prependChild('thumbnails-container', 'nextgen-buttons'); 751 self.prependChild('info', 'dock-toggle-container'); 752 753 if (!$.nplModal('mobile.browser.any')) { 754 self.addIdleState(self.get('dock-toggle-button'), {opacity: 0}); 755 } 756 }, 757 // Hide the parent lightbox's spinner 758 _loadfinish_ran_once: false, 759 loadfinish: function() { 760 $.nplModal('log', 'theme thumbnails.events.loadfinish()'); 761 762 if (methods.thumbnails.events._loadfinish_ran_once) { 763 return; 764 } 765 766 $('#npl_spinner_container').addClass('hidden'); 767 methods.thumbnails.events._loadfinish_ran_once = true; 768 } 769 } 770 }, 771 info: { 772 is_open: function() { 773 return $('#npl_wrapper').hasClass('npl-info-open'); 774 }, 775 776 toggle: function() { 777 $.nplModal('log', 'theme info.toggle()'); 778 779 if (this.is_open()) { 780 this.close(); 781 } else { 782 this.open(); 783 } 784 }, 785 786 open: function() { 787 $.nplModal('log', 'theme info.open()'); 788 789 $('#npl_wrapper').addClass('npl-info-open'); 790 }, 791 792 close: function() { 793 $.nplModal('log', 'theme info.close()'); 794 795 $('#npl_wrapper').removeClass('npl-info-open'); 796 }, 797 798 events: { 799 bind: function() { 800 $.nplModal('log', 'theme info.events.bind()'); 801 802 self.bind('npl_init', this.npl_init); 803 self.bind('loadfinish', this.loadfinish); 804 }, 805 806 npl_init: function() { 807 $.nplModal('log', 'theme info.events.npl_init()'); 808 809 var needsnewparent = self.$('info').detach(); 810 self.$('thumbnails-container').append(needsnewparent); 811 812 // Add social share icons to the infobar. ID is important, sidebars could add their own icons 813 self.prependChild( 814 'info-text', 815 $('<div/>') 816 .attr('id', 'galleria-image-share-icons') 817 .attr('class', 'galleria-image-share-icons') 818 ); 819 if (carousel_text_color = $.nplModal('get_setting', 'carousel_text_color')) { 820 self.$('info-title').css({color: carousel_text_color}); 821 self.$('info-description').css({color: carousel_text_color}); 822 } 823 self.$('info, info-text, info-title, info-description').css({background: $.nplModal('get_setting', 'carousel_background_color')}); 824 }, 825 826 _loadfinish_ran_once: false, 827 loadfinish: function() { 828 $.nplModal('log', 'theme info.events.loadfinish()'); 829 // anchors in our image captions / descriptions must have target=_blank 830 self.$('info-title, info-description').find('a').each(function() { 831 $(this).attr('target', '_blank'); 832 $(this).css('color', methods.icons.get_color()); 833 }); 834 835 methods.info.events._loadfinish_ran_once = true; 836 } 837 } 838 }, 839 icons: { 840 get_color: function() { 841 return $.nplModal('get_setting', 'icon_color'); 842 }, 843 get_background: function() { 844 var iconcolor = $.nplModal('get_setting', 'carousel_background_color'); 845 if ($.nplModal('get_setting', 'icon_background_enabled', false)) { 846 iconcolor = $.nplModal('get_setting', 'icon_background'); 847 } 848 return iconcolor; 849 }, 850 get_overlay_color: function() { 851 return $.nplModal('get_setting', 'overlay_icon_color'); 852 } 853 }, 854 nplModal: { 855 close: function() { 856 $.nplModal('close_modal'); 857 }, 858 is_random_source: function() { 859 var gallery = $.nplModal('get_gallery_from_id', $.nplModal('get_state').gallery_id); 860 var result = ($.inArray(gallery.source, ['random', 'random_images']) !== -1); 861 862 $.nplModal('log', 'theme nplModal.is_random_source()', { 863 result: result 864 }); 865 866 return result; 867 }, 868 is_nextgen_gallery: function() { 869 var retval = $.nplModal('get_state').gallery_id !== '!'; 870 871 $.nplModal('log', 'theme nplModal.is_nextgen_gallery()', { 872 result: retval 873 }); 874 875 return retval; 876 }, 877 is_nextgen_widget: function() { 878 var retval = false;
879 var gallery = $.nplModal('get_gallery_from_id', $.nplModal('get_state').gallery_id); 880 var slug = gallery.slug; 881 if (slug) { 882 retval = slug.indexOf('widget-ngg-images') !== -1; 883 } 884 885 $.nplModal('log', 'theme nplModal.is_nextgen_widget()', { 886 result: retval 887 }); 888 889 return retval; 890 }, 891 events: { 892 bind: function() { 893 $.nplModal('log', 'theme nplModal.bind()'); 894 895 if (Galleria.IPAD || Galleria.IPHONE) { 896 self.$('container').addClass('nggpl-ios-browser'); 897 } 898 899 // update the parent url when a new image has been chosen or the slideshow advances 900 if (methods.nplModal.is_nextgen_gallery()) { 901 self.bind('image', this.image); 902 } 903 904 // handle updates to the current url once opened; most likely due to the back/forward button 905 if (methods.nplModal.is_nextgen_gallery() 906 && $.nplModal('get_setting', 'enable_routing', false) 907 && $.nplModal('get_setting', 'enable_comments', false)) { 908 $('#npl_content').on('npl_url_handler', this.unhandled_url_change); 909 } 910 911 if ($.nplModal('get_setting', 'protect_images', false)) { 912 $('.galleria-image').on('dragstart', function(event) { 913 event.preventDefault(); 914 }); 915 self.bind('npl_init', this.npl_init); 916 self.bind('npl_init_complete', this.npl_init_complete); 917 } 918 919 jQuery('#npl_content').on('npl_closing', this.closing); 920 }, 921 npl_init: function() { 922 $.nplModal('log', 'theme nplModal.events.npl_init()'); 923 924 self.addElement('image-protection'); 925 document.oncontextmenu = function(event) { 926 event = event || window.event; 927 event.preventDefault(); 928 }; 929 }, 930 npl_init_complete: function() { 931 $.nplModal('log', 'theme nplModal.events.npl_init_complete()'); 932 self.prependChild('images', 'image-protection'); 933 }, 934 _image_ran_once: false, 935 image: function() { 936 $.nplModal('log', 'theme nplModal.events.image()'); 937 if (methods.nplModal.events._image_ran_once) { 938 if (!methods.nplModal.is_random_source()) { 939 var image_id = self.getData(self.getIndex()).image_id; 940 var sidebar_string = methods.sidebar.is_open() ? '/' + methods.sidebar.get_type() : ''; 941 var state = $.nplModal('get_state'); 942 state.image_id = image_id; 943 $.nplModal('set_state', state); 944 if ($.nplModal('get_setting', 'enable_routing', false)) { 945 $.nplModal( 946 'router.navigate', 947 $.nplModal('get_setting', 'router_slug') + '/' + $.nplModal('get_state').slug + '/' + image_id + sidebar_string, 948 true 949 ); 950 } 951 } 952 } 953 methods.nplModal.events._image_ran_once = true; 954 }, 955 unhandled_url_change: function(event, state) { 956 $.nplModal('log', 'theme nplModal.unhandled_url_change()', { 957 event: event, 958 state: state 959 }); 960 for (var i = 0; i <= (self.getDataLength() - 1); i++) { 961 if (state.image_id === self.getData(i).image_id) { 962 self.show(i); 963 } 964 } 965 if (methods.sidebar.is_open() && state.sidebar == null) { 966 methods.sidebar.close(); 967 } else if (!methods.sidebar.is_open() 968 && typeof state.sidebar !== 'undefined' 969 && state.sidebar !== null) { 970 methods.sidebar.open(state.sidebar); 971 } 972 }, 973 closing: function() { 974 // without this our bound keys will continue to activate even aften 975 // Galleria.destroy() has been called and the container div emptied 976 self.detachKeyboard(); 977 } 978 } 979 }, 980 galleria: { 981 bind_once: function(event, callback, timeout) { 982 var timer_id = undefined; 983 window.addEventListener(event, function() { 984 if (typeof timer_id === 'undefined') { 985 clearTimeout(timer_id); 986 timer_id = undefined; 987 } 988 timer_id = setTimeout(function() { 989 timer_id = undefined; 990 callback(); 991 }, timeout); 992 }); 993 }, 994 get_displayed_gallery_setting: function(name, def) { 995 var tmp = ''; 996 var gallery = $.nplModal('get_gallery_from_id', $.nplModal('get_state').gallery_id); 997 if (gallery && typeof gallery.display_settings[name] !== 'undefined') { 998 tmp = gallery.display_settings[name]; 999 } else { 1000 tmp = def; 1001 } 1002 if (tmp === '1') tmp = true; 1003 if (tmp === '0') tmp = false;
1004 if (tmp === 1) tmp = true; 1005 if (tmp === 0) tmp = false; 1006 1007 $.nplModal('log', 'theme galleria.get_displayed_gallery_setting()', { 1008 name: name, 1009 result: tmp 1010 }); 1011 1012 return tmp; 1013 }, 1014 get_keybinding_exclude_list: function() { 1015 return 'textarea, input'; 1016 }, 1017 get_current_image_id: function() { 1018 return self.getData(self.getIndex()).image_id; 1019 }, 1020 // returns the Galleria image-index based on the provided image id 1021 get_index_from_id: function(id) { 1022 var retval = null; 1023 for (var i = 0; i <= (self.getDataLength() - 1); i++) { 1024 if (id === self.getData(i).image_id) { 1025 retval = i; 1026 } 1027 } 1028 return retval; 1029 }, 1030 events: { 1031 bind: function() { 1032 $.nplModal('log', 'theme galleria.events.bind()'); 1033 self.bind('touchmove', this.touchmove); 1034 self.bind('npl_init', this.npl_init); 1035 self.bind('npl_init_keys', this.npl_init_keys); 1036 self.bind('npl_init_complete', this.npl_init_complete); 1037 self.bind('loadstart', this.loadstart); 1038 self.bind('loadfinish', this.loadfinish); 1039 $(window).on('resize orientationchange', this.browserchanged); 1040 }, 1041 browserchanged: function() { 1042 $.nplModal('log', 'theme galleria.events.browserchanged()'); 1043 setTimeout(function() { 1044 self.rescale(); 1045 }, 200); 1046 }, 1047 npl_init: function() { 1048 $.nplModal('log', 'theme galleria.events.npl_init()'); 1049 // for some reason this isn't an option that can be passed at startup 1050 self.setPlaytime(($.nplModal('get_setting', 'slideshow_speed', 5) * 1000)); 1051 1052 // Create next / back links 1053 var next_image_button = $('<i/>') 1054 .addClass('fa fa-angle-right') 1055 .css({color: methods.icons.get_overlay_color()}); 1056 var prev_image_button = $('<i/>') 1057 .addClass('fa fa-angle-left') 1058 .css({color: methods.icons.get_overlay_color()}); 1059 $(self._dom.stage).append(next_image_button); 1060 $(self._dom.stage).append(prev_image_button); 1061 self.append({'image-nav-left': prev_image_button}); 1062 self.append({'image-nav-right': next_image_button}); 1063 1064 self.$('counter').css({color: methods.icons.get_overlay_color()}); 1065 }, 1066 npl_init_keys: function() { 1067 $.nplModal('log', 'theme galleria.events.npl_init_keys()'); 1068 var input_types = methods.galleria.get_keybinding_exclude_list(); 1069 self.attachKeyboard({ 1070 left: function() { 1071 if (!$(document.activeElement).is(input_types)) { 1072 this.prev(); 1073 } 1074 }, 1075 right: function() { 1076 if (!$(document.activeElement).is(input_types)) { 1077 this.next(); 1078 } 1079 }, 1080 down: function() { 1081 if (!$(document.activeElement).is(input_types)) { 1082 methods.thumbnails.toggle(); 1083 } 1084 }, 1085 up: function() { 1086 if (!$(document.activeElement).is(input_types)) { 1087 methods.info.toggle(); 1088 } 1089 }, 1090 // escape key 1091 27: function(event) { 1092 event.preventDefault(); 1093 methods.nplModal.close(); 1094 } 1095 }); 1096 }, 1097 npl_init_complete: function() { 1098 $.nplModal('log', 'theme galleria.events.npl_init_complete()'); 1099 if (!$.nplModal('mobile.browser.any')) { 1100 self.addIdleState(self.get('counter'), {opacity: 0}); 1101 self.addIdleState(self.get('image-nav-left'), {opacity: 0}); 1102 self.addIdleState(self.get('image-nav-right'), {opacity: 0}); 1103 } 1104 }, 1105 touchmove: function(event) { 1106 // prevent scrolling on elements without the 'scrollable' class 1107 if (!$('.scrollable').has($(event.target)).length) { 1108 $.nplModal('log', 'theme galleria.events.touchmove() prevented scrolling'); 1109 event.preventDefault(); 1110 } 1111 }, 1112 loadstart: function(event) { 1113 $.nplModal('log', 'theme galleria.events.loadstart()', { 1114 event: event 1115 }); 1116 1117 if (!event.cached) { 1118 var button = $('#npl_button_close').find('i'); 1119 button.removeClass('fa-times-circle'); 1120 } 1121 }, 1122 loadfinish: function() { 1123 $.nplModal('log', 'theme galleria.events.loadfinish()'); 1124 1125 var button = $('#npl_button_close').find('i'); 1126 button.addClass('fa-times'); 1127 } 1128 } 1129 }, 1130 share_icons: {
1131 strip_html: function(html) { 1132 var tmp = document.createElement('div'); 1133 tmp.innerHTML = html; 1134 return tmp.textContent || tmp.innerText || ""; 1135 }, 1136 create: function(target, iconcolor) { 1137 $.nplModal('log', 'theme share_icons.create()'); 1138 if (methods.nplModal.is_random_source() 1139 || methods.nplModal.is_nextgen_widget() 1140 || !methods.nplModal.is_nextgen_gallery() 1141 || !$.nplModal('get_setting', 'enable_routing', false)) { 1142 return false; 1143 } 1144 1145 var id = self.getData(self.getIndex()).image_id; 1146 var data = self.getData(self.getIndex()); 1147 var url = encodeURIComponent(window.location.toString()); 1148 1149 var twitter_icon = $('<li/>').html( 1150 $('<a/>', {'href': 'https://twitter.com/share?url=' + methods.share_icons.get_share_url(id, 'full'), 1151 'target': '_blank', 1152 'class': 'nggpl-comment-tweet-button', 1153 'title': $.nplModal('get_setting', 'i18n').share.twitter}) 1154 .css({color: iconcolor}) 1155 .html($('<i/>', {'class': 'fa-brands fa-square-x-twitter'})) 1156 ); 1157 1158 var facebook_icon = $('<li/>').html( 1159 $('<a/>', { 1160 'class': 'nggpl-comment-facebook-button', 1161 'title': $.nplModal('get_setting', 'i18n').share.facebook 1162 }).css({color: iconcolor}) 1163 .html($('<i/>', {'class': 'fa fa-facebook-square'})) 1164 ); 1165 1166 if (typeof $.nplModal('get_setting', 'facebook_app_id') !== 'undefined') { 1167 facebook_icon.on('click', function(event) { 1168 event.preventDefault(); 1169 FB.ui({ 1170 method: 'share', 1171 href: methods.share_icons.get_share_url(id, 'full'), 1172 link: window.location.toString() 1173 }, function(response){ 1174 // Debug response (optional) 1175 }); 1176 }); 1177 } else { 1178 var facebook_url = 'https://www.facebook.com/share.php'; 1179 facebook_url += '?u=' + encodeURIComponent(methods.share_icons.get_share_url(id, 'full')); 1180 var anchor = facebook_icon.find('a'); 1181 anchor.attr('href', facebook_url); 1182 anchor.attr('target', '_blank'); 1183 } 1184 1185 var pinterest_url = encodeURIComponent(methods.share_icons.get_share_url(id, 'full')); 1186 1187 // Pinterest restricts description length, and we must avoid making the request longer than browsers will allow 1188 var summary = methods.share_icons.strip_html(data.description); 1189 if (summary.length >= 446) { 1190 summary = summary.substring(0, 492); 1191 summary += '...'; 1192 } 1193 1194 pinterest_url += '&url=' + url; 1195 pinterest_url += '&media=' + data.image; 1196 pinterest_url += '&description=' + summary; 1197 var pinterest_icon = $('<li/>').html( 1198 $('<a/>', {'href': 'http://pinterest.com/pin/create/button/?s=100' + pinterest_url, 1199 'target': '_blank', 1200 'class': 'nggpl-comment-pinterest-button', 1201 'title': $.nplModal('get_setting', 'i18n').share.pinterest}) 1202 .css({color: iconcolor}) 1203 .html($('<i/>', {'class': 'fa fa-pinterest-square'})) 1204 ); 1205 1206 var icons = [twitter_icon, facebook_icon, pinterest_icon]; 1207 1208 target = $(target); 1209 target.html(''); 1210 $('<ul/>').appendTo(target); 1211 target.find('ul').append(icons); 1212 }, 1213 get_share_url: function(id, named_size) { 1214 if (typeof(named_size) === 'undefined') { 1215 named_size = 'thumb'; 1216 } 1217 1218 var gallery_id = $.nplModal('get_state').gallery_id; 1219 var base_url = $.nplModal('get_setting', 'share_url') 1220 .replace('{gallery_id}', gallery_id) 1221 .replace('{image_id}', id) 1222 .replace('{named_size}', named_size); 1223 var site_url_link = $('<a/>').attr('href', $.nplModal('get_setting', 'wp_site_url'))[0]; 1224 var parent_link = $('<a/>').attr('href', window.location.toString())[0]; 1225 var base_link = $('<a/>').attr('href', base_url)[0]; 1226 1227 // check if site is in a sub-directory and shorten the prefix 1228 if (parent_link.pathname.indexOf(site_url_link.pathname) >= 0) { 1229 parent_link.pathname = parent_link.pathname.substr(site_url_link.pathname.length); 1230 } 1231 // shorten url by removing their common prefix 1232 if (parent_link.pathname.indexOf(base_link.pathname) >= 0) { 1233 parent_link.pathname = parent_link.pathname.substr(parent_link.pathname.length); 1234 } 1235 1236 // this is odd but it's just how the 'share' controller expects it 1237 base_link.search = parent_link.search; 1238 if (base_link.search.length > 0) { 1239 base_link.search += '&'; 1240 } 1241 base_link.search += 'uri=' + parent_link.pathname; 1242 1243 $.nplModal('log', 'theme share_icons.get_share_url() result', { 1244 id: id, 1245 named_size: named_size, 1246 result: base_link.href 1247 }); 1248 1249 return base_link.href; 1250 }, 1251 events: { 1252 bind: function() { 1253 $.nplModal('log', 'theme share_icons.events.bind()'); 1254 self.bind('loadfinish', this.loadfinish); 1255 self.bind('npl_init', this.npl_init); 1256 }, 1257 npl_init: function() { 1258 if (typeof $.nplModal('get_setting', 'facebook_app_id') !== 'undefined') { 1259 if (typeof window.fbAsyncInit === 'undefined') { 1260 window.fbAsyncInit = function() { 1261 FB.init({ 1262 appId: $.nplModal('get_setting', 'facebook_app_id'), 1263 autoLogAppEvents: true, 1264 xfbml: true, 1265 version: 'v2.12' 1266 }); 1267 }; 1268 1269 (function(d, s, id) { 1270 var js, fjs = d.getElementsByTagName(s)[0]; 1271 if (d.getElementById(id)) { return; } 1272 js = d.createElement(s); js.id = id; 1273 js.src = "https://connect.facebook.net/en_US/sdk.js"; 1274 fjs.parentNode.insertBefore(js, fjs); 1275 }(document, 'script', 'facebook-jssdk')); 1276 } 1277 } 1278 }, 1279 loadfinish: function() { 1280 $.nplModal('log', 'theme share_icons.events.loadfinish()'); 1281 if (methods.nplModal.is_nextgen_gallery() 1282 && $.nplModal('get_setting', 'enable_routing', false) 1283 && $.nplModal('get_setting', 'enable_sharing', false)) { 1284 var iconcolor = $.nplModal('get_setting', 'carousel_text_color') ? $.nplModal('get_setting', 'carousel_text_color') : methods.icons.get_color(); 1285 methods.share_icons.create( 1286 '#galleria-image-share-icons', 1287 iconcolor 1288 ); 1289 } 1290 } 1291 } 1292 } 1293 }; 1294 1295 $.nplModal('log', 'theme initialization - about to bind events'); 1296 1297 // Load our modules 1298 methods.galleria.events.bind(); 1299 methods.nplModal.events.bind(); 1300 methods.thumbnails.events.bind(); 1301 methods.info.events.bind(); 1302 methods.share_icons.events.bind(); 1303 methods.sidebar.events.bind(); 1304 methods.sidebars.datacache.events.bind(); 1305 methods.sidebars.comments.events.bind(); 1306 1307 $.nplModal('log', 'theme initialization - done binding events'); 1308 1309 $.nplModal('log', 'theme initialization - about to trigger npl_ready'); 1310 $(self._target).trigger('npl_ready', {galleria_theme: self, methods: methods}); 1311 1312 $.nplModal('log', 'theme initialization - about to trigger npl_init'); 1313 self.trigger('npl_init'); 1314 1315 $.nplModal('log', 'theme initialization - about to trigger npl_init_keys'); 1316 self.trigger('npl_init_keys'); 1317 1318 $.nplModal('log', 'theme initialization - about to trigger npl_init_complete'); 1319 self.trigger('npl_init_complete'); 1320 } 1321 }); 1322 }; 1323 1324 // In case this theme is enqueued before Galleria.js is loaded we 1325 // will periodically check if Galleria exists before calling 1326 // Galleria.addTheme() 1327 var interval = setInterval(function() { 1328 if (typeof window.Galleria !== 'undefined') { 1329 clearInterval(interval); 1330 add_nggpl_theme(); 1331 } 1332 }, 10); 1333 1334}(jQuery));
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.