vendor: 6,142 bytes, lines 1-225
1/** 2 * @package SP Page Builder 3 * @author JoomShaper http://www.joomshaper.com 4 * @copyright Copyright (c) 2010 - 2015 JoomShaper 5 * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or later 6*/ 7 8+function ($) { 9 'use strict'; 10 11 // ALERT CLASS DEFINITION 12 // ====================== 13 14 var dismiss = '[data-dismiss="sppb-alert"]' 15 var SPPBAlert = function (el) { 16 $(el).on('click', dismiss, this.close) 17 } 18 19 SPPBAlert.VERSION = '3.2.0' 20 21 SPPBAlert.prototype.close = function (e) { 22 var $this = $(this) 23 var selector = $this.attr('data-target') 24 25 if (!selector) { 26 selector = $this.attr('href') 27 selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 28 } 29 30 var $parent = $(selector) 31 32 if (e) e.preventDefault() 33 34 if (!$parent.length) { 35 $parent = $this.hasClass('sppb-alert') ? $this : $this.parent() 36 } 37 38 $parent.trigger(e = $.Event('close.sppb.alert')) 39 40 if (e.isDefaultPrevented()) return 41 42 $parent.removeClass('in') 43 44 function removeElement() { 45 // detach from parent, fire event then clean up data 46 $parent.detach().trigger('closed.sppb.alert').remove() 47 } 48 49 $.support.transition && $parent.hasClass('sppb-fade') ? 50 $parent 51 .one('bsTransitionEnd', removeElement) 52 .emulateTransitionEnd(150) : 53 removeElement() 54 } 55 56 57 // ALERT PLUGIN DEFINITION 58 // ======================= 59 60 function Plugin(option) { 61 return this.each(function () { 62 var $this = $(this) 63 var data = $this.data('sppb.alert') 64 65 if (!data) $this.data('sppb.alert', (data = new SPPBAlert(this))) 66 if (typeof option == 'string') data[option].call($this) 67 }) 68 } 69 70 var old = $.fn.spbalert 71 72 $.fn.spbalert = Plugin 73 $.fn.spbalert.Constructor = SPPBAlert 74 75 // ALERT NO CONFLICT 76 // ================= 77 78 $.fn.spbalert.noConflict = function () { 79 $.fn.spbalert = old 80 return this 81 } 82 83 84 // ALERT DATA-API 85 // ============== 86 87 $(document).on('click.sppb.alert.data-api', dismiss, SPPBAlert.prototype.close) 88 89}(jQuery); 90 91 92/* ======================================================================== 93 * Bootstrap: carousel.js v3.2.0 94 * http://getbootstrap.com/javascript/#carousel 95 * ======================================================================== 96 * Copyright 2011-2014 Twitter, Inc. 97 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 98 * ======================================================================== */ 99 100 101+function ($) { 102 'use strict'; 103 104 // CAROUSEL CLASS DEFINITION 105 // ========================= 106 107 var SPPBCarousel = function (element, options) { 108 this.$element = $(element).on('keydown.sppb.carousel', $.proxy(this.keydown, this)) 109 this.$indicators = this.$element.find('.sppb-carousel-indicators') 110 this.options = options 111 this.paused = 112 this.sliding = 113 this.interval = 114 this.$active = 115 this.$items = null 116 117 this.options.pause == 'hover' && this.$element 118 .on('mouseenter.sppb.carousel', $.proxy(this.pause, this)) 119 .on('mouseleave.sppb.carousel', $.proxy(this.cycle, this)) 120 } 121 122 SPPBCarousel.VERSION = '3.2.0' 123 124 SPPBCarousel.DEFAULTS = { 125 interval: 5000, 126 pause: 'hover', 127 wrap: true 128 } 129 130 SPPBCarousel.prototype.keydown = function (e) { 131 switch (e.which) { 132 case 37: this.prev(); break 133 case 39: this.next(); break 134 default: return 135 } 136 137 e.preventDefault() 138 } 139 140 SPPBCarousel.prototype.cycle = function (e) { 141 e || (this.paused = false) 142 143 this.interval && clearInterval(this.interval) 144 145 this.options.interval 146 && !this.paused 147 && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) 148 149 return this 150 } 151 152 SPPBCarousel.prototype.getItemIndex = function (item) { 153 this.$items = item.parent().children('.sppb-item') 154 return this.$items.index(item || this.$active) 155 } 156 157 SPPBCarousel.prototype.to = function (pos) { 158 var that = this 159 var activeIndex = this.getItemIndex(this.$active = this.$element.find('.sppb-item.active')) 160 161 if (pos > (this.$items.length - 1) || pos < 0) return 162 163 if (this.sliding) return this.$element.one('slid.sppb.carousel', function () { that.to(pos) }) // yes, "slid" 164 if (activeIndex == pos) return this.pause().cycle() 165 166 return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos])) 167 } 168 169 SPPBCarousel.prototype.pause = function (e) { 170 e || (this.paused = true) 171 172 if (this.$element.find('.next, .prev').length && $.support.transition) { 173 this.$element.trigger($.support.transition.end) 174 this.cycle(true) 175 } 176 177 this.interval = clearInterval(this.interval) 178 179 return this 180 } 181 182 SPPBCarousel.prototype.next = function () { 183 if (this.sliding) return 184 return this.slide('next') 185 } 186 187 SPPBCarousel.prototype.prev = function () { 188 if (this.sliding) return 189 return this.slide('prev') 190 } 191 192 SPPBCarousel.prototype.slide = function (type, next) { 193 var $active = this.$element.find('.sppb-item.active') 194 var $next = next || $active[type]() 195 var isCycling = this.interval 196 var direction = type == 'next' ? 'left' : 'right' 197 var fallback = type == 'next' ? 'first' : 'last' 198 var that = this 199 200 if (!$next.length) { 201 if (!this.options.wrap) return 202 $next = this.$element.find('.sppb-item')[fallback]() 203 } 204 205 if ($next.hasClass('active')) return (this.sliding = false) 206 207 var relatedTarget = $next[0] 208 var slideEvent = $.Event('slide.sppb.carousel', { 209 relatedTarget: relatedTarget, 210 direction: direction 211 }) 212 this.$element.trigger(slideEvent) 213 if (slideEvent.isDefaultPrevented()) return 214 215 this.sliding = true 216 217 isCycling && this.pause() 218 219 if (this.$indicators.length) { 220 this.$indicators.find('.active').removeClass('active') 221 var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)]) 222 $nextIndicator && $nextIndicator.addClass('active') 223 } 224 225 var slidEvent = $.Event('slid.sppb.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid"
226 if ($.support.transition && this.$element.hasClass('sppb-slide')) { 227 $next.addClass(type) 228 $next[0].offsetWidth // force reflow 229 $active.addClass(direction) 230 $next.addClass(direction) 231 $active 232 .one('bsTransitionEnd', function () { 233 $next.removeClass([type, direction].join(' ')).addClass('active') 234 $active.removeClass(['active', direction].join(' ')) 235 that.sliding = false 236 setTimeout(function () { 237 that.$element.trigger(slidEvent) 238 }, 0) 239 }) 240 .emulateTransitionEnd($active.css('transition-duration').slice(0, -1) * 1000) 241 } else { 242 $active.removeClass('active') 243 $next.addClass('active') 244 this.sliding = false 245 this.$element.trigger(slidEvent) 246 } 247 248 isCycling && this.cycle() 249 250 return this 251 } 252 253 254 // CAROUSEL PLUGIN DEFINITION 255 // ========================== 256 257 function Plugin(option) { 258 return this.each(function () { 259 var $this = $(this) 260 var data = $this.data('sppb.carousel') 261 var options = $.extend({}, SPPBCarousel.DEFAULTS, $this.data(), typeof option == 'object' && option) 262 var action = typeof option == 'string' ? option : options.slide 263 264 if (!data) $this.data('sppb.carousel', (data = new SPPBCarousel(this, options))) 265 if (typeof option == 'number') data.to(option) 266 else if (action) data[action]() 267 else if (options.interval) data.pause().cycle() 268 }) 269 } 270 271 var old = $.fn.sppbcarousel 272 273 $.fn.sppbcarousel = Plugin 274 $.fn.sppbcarousel.Constructor = SPPBCarousel 275 276 277 // CAROUSEL NO CONFLICT 278 // ==================== 279 280 $.fn.sppbcarousel.noConflict = function () { 281 $.fn.sppbcarousel = old 282 return this 283 } 284 285 //SP Page Builder 286 $(document).ready(function(){ 287 $('.sppb-carousel').each(function (index) { 288 var items = $(this).find('.sppb-item'); 289 var id = 'sppb-carousel' + (index+1); 290 291 //Set ID 292 $(this).attr('id', id ); 293 294 for (var i = 0; i < items.length; i++) { 295 if(i==0) { 296 $('<li data-sppb-target="#' + id + '" class="active" data-sppb-slide-to="0"></li>').appendTo($(this).find('>.sppb-carousel-indicators')); 297 } else { 298 $('<li data-sppb-target="#' + id + '" data-sppb-slide-to="' + i + '"></li>').appendTo($(this).find('>.sppb-carousel-indicators')); 299 } 300 }; 301 302 $(this).find('.sppb-carousel-control').attr('href', '#' + id); 303 304 $(this).find('.sppb-item').first().addClass('active'); 305 }); 306 }) 307 308 309 // CAROUSEL DATA-API 310 // ================= 311 312 $(document).on('click.sppb.carousel.data-api', '[data-slide], [data-sppb-slide-to]', function (e) { 313 var href 314 var $this = $(this) 315 var $target = $($this.attr('data-sppb-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7 316 if (!$target.hasClass('sppb-carousel')) return 317 var options = $.extend({}, $target.data(), $this.data()) 318 var slideIndex = $this.attr('data-sppb-slide-to') 319 if (slideIndex) options.interval = false 320 321 Plugin.call($target, options) 322 323 if (slideIndex) { 324 $target.data('sppb.carousel').to(slideIndex) 325 } 326 327 e.preventDefault() 328 }) 329 330 $(window).on('load', function () { 331 $('[data-sppb-ride="sppb-carousel"]').each(function () { 332 var $carousel = $(this) 333 Plugin.call($carousel, $carousel.data()) 334 }) 335 }) 336 337}(jQuery); 338 339 340/* ======================================================================== 341 * Bootstrap: collapse.js v3.2.0 342 * http://getbootstrap.com/javascript/#collapse 343 * ======================================================================== 344 * Copyright 2011-2014 Twitter, Inc. 345 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 346 * ======================================================================== */ 347 348+function ($) { 349 'use strict'; 350 351 $.fn.sppbAccordion = function(options){ 352 353 var settings = $.extend({ 354 hidefirst: 0 355 }, options); 356 357 return this.each(function(){ 358 359 var $items = $(this).find('>div'); 360 var $handlers = $items.find('.sppb-panel-heading'); 361 var $panels = $items.find('.sppb-panel-collapse'); 362 $items.first().addClass('active'); 363 $handlers.first().addClass('active'); 364 $panels.hide().first().removeAttr('style'); 365 366 $handlers.on('click', function(){ 367 368 if( $(this).hasClass('active') ) 369 { 370 $(this).removeClass('active'); 371 $panels.slideUp(); 372 } 373 else 374 { 375 $handlers.removeClass('active'); 376 $panels.slideUp(); 377 $(this).addClass('active').next().slideDown(); 378 } 379 }); 380 381 }); 382 }; 383 384 $(document).ready(function(){ 385 $('.sppb-panel-group').sppbAccordion(); 386 }); 387 388}(jQuery); 389 390 391/* ======================================================================== 392 * Bootstrap: tab.js v3.2.0 393 * http://getbootstrap.com/javascript/#tabs 394 * ======================================================================== 395 * Copyright 2011-2014 Twitter, Inc. 396 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 397 * ======================================================================== */ 398 399 400+function ($) { 401 'use strict'; 402 403 // TAB CLASS DEFINITION 404 // ==================== 405 406 var SPPBTab = function (element) { 407 this.element = $(element) 408 } 409 410 SPPBTab.VERSION = '3.2.0' 411 412 SPPBTab.prototype.show = function () { 413 var $this = this.element 414 var $ul = $this.closest('ul:not(.dropdown-menu)') 415 var selector = $this.data('target') 416 417 if (!selector) { 418 selector = $this.attr('href') 419 selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 420 } 421 422 if ($this.parent('li').hasClass('active')) return 423 424 var previous = $ul.find('.active:last a')[0] 425 var e = $.Event('show.sppb.tab', { 426 relatedTarget: previous 427 }) 428 429 $this.trigger(e) 430 431 if (e.isDefaultPrevented()) return 432 433 var $target = $(selector) 434 435 this.activate($this.closest('li'), $ul) 436 this.activate($target, $target.parent(), function () { 437 $this.trigger({ 438 type: 'shown.sppb.tab', 439 relatedTarget: previous 440 }) 441 }) 442 } 443 444 SPPBTab.prototype.activate = function (element, container, callback) { 445 var $active = container.find('> .active') 446 var transition = callback 447 && $.support.transition 448 && $active.hasClass('sppb-fade') 449 450 function next() { 451 $active 452 .removeClass('active') 453 .find('> .dropdown-menu > .active') 454 .removeClass('active') 455 456 element.addClass('active') 457 458 if (transition) { 459 element[0].offsetWidth // reflow for transition 460 element.addClass('in') 461 } else { 462 element.removeClass('sppb-fade') 463 } 464 465 if (element.parent('.dropdown-menu')) { 466 element.closest('li.dropdown').addClass('active') 467 } 468 469 callback && callback() 470 } 471 472 transition ? 473 $active 474 .one('bsTransitionEnd', next) 475 .emulateTransitionEnd(150) : 476 next() 477 478 $active.removeClass('in') 479 } 480 481 482 // TAB PLUGIN DEFINITION 483 // ===================== 484 485 function Plugin(option) { 486 return this.each(function () { 487 var $this = $(this) 488 var data = $this.data('sppb.tab') 489 490 if (!data) $this.data('sppb.tab', (data = new SPPBTab(this))) 491 if (typeof option == 'string') data[option]() 492 }) 493 } 494 495 var old = $.fn.sppbtab 496 497 $.fn.sppbtab = Plugin 498 $.fn.sppbtab.Constructor = SPPBTab 499 500 501 // TAB NO CONFLICT 502 // =============== 503 504 $.fn.sppbtab.noConflict = function () { 505 $.fn.sppbtab = old 506 return this 507 } 508 509 //Dynamic IDS 510 $(document).ready(function () { 511 $('.sppb-tab').each(function (index){ 512 var id = 'sppb-tab' + (index+1); 513 514 $(this).find('>.sppb-nav').children().each(function (index) { 515 $(this).find('>a').attr('href', '#' + id + '-' + (index+1) ) 516 }); 517 518 $(this).find('>.sppb-tab-content').children().each(function (index) { 519 $(this).attr('id', id + '-' + (index+1) ) 520 }); 521 522 }); 523 }); 524 525 // TAB DATA-API 526 // ============ 527 528 $(document).on('click.sppb.tab.data-api', '[data-toggle="sppb-tab"], [data-toggle="sppb-pill"]', function (e) { 529 e.preventDefault() 530 Plugin.call($(this), 'show') 531 }) 532 533}(jQuery); 534 535 536/* ======================================================================== 537 * Bootstrap: tooltip.js v3.2.0 538 * http://getbootstrap.com/javascript/#tooltip 539 * Inspired by the original jQuery.tipsy by Jason Frame 540 * ======================================================================== 541 * Copyright 2011-2014 Twitter, Inc. 542 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 543 * ======================================================================== */ 544 545 546+function ($) { 547 'use strict'; 548 549 // TOOLTIP PUBLIC CLASS DEFINITION 550 // =============================== 551 552 var SPPBTooltip = function (element, options) { 553 this.type = 554 this.options = 555 this.enabled = 556 this.timeout = 557 this.hoverState = 558 this.$element = null 559 560 this.init('sppbtooltip', element, options) 561 } 562 563 SPPBTooltip.VERSION = '3.2.0' 564 565 SPPBTooltip.DEFAULTS = { 566 animation: true, 567 placement: 'top', 568 selector: false, 569 template: '<div class="sppb-tooltip" role="tooltip"><div class="sppb-tooltip-arrow"></div><div class="sppb-tooltip-inner"></div></div>', 570 trigger: 'hover focus', 571 title: '', 572 delay: 0, 573 html: false, 574 container: false, 575 viewport: { 576 selector: 'body', 577 padding: 0 578 } 579 } 580 581 SPPBTooltip.prototype.init = function (type, element, options) { 582 this.enabled = true 583 this.type = type 584 this.$element = $(element) 585 this.options = this.getOptions(options) 586 this.$viewport = this.options.viewport && $(this.options.viewport.selector || this.options.viewport) 587 588 var triggers = this.options.trigger.split(' ') 589 590 for (var i = triggers.length; i--;) { 591 var trigger = triggers[i] 592 593 if (trigger == 'click') { 594 this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this)) 595 } else if (trigger != 'manual') { 596 var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin' 597 var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout' 598 599 this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this)) 600 this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this)) 601 } 602 } 603 604 this.options.selector ? 605 (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : 606 this.fixTitle() 607 } 608 609 SPPBTooltip.prototype.getDefaults = function () { 610 return SPPBTooltip.DEFAULTS 611 } 612 613 SPPBTooltip.prototype.getOptions = function (options) { 614 options = $.extend({}, this.getDefaults(), this.$element.data(), options) 615 616 if (options.delay && typeof options.delay == 'number') { 617 options.delay = { 618 show: options.delay, 619 hide: options.delay 620 } 621 } 622 623 return options 624 } 625 626 SPPBTooltip.prototype.getDelegateOptions = function () { 627 var options = {} 628 var defaults = this.getDefaults() 629 630 this._options && $.each(this._options, function (key, value) { 631 if (defaults[key] != value) options[key] = value 632 }) 633 634 return options 635 } 636 637 SPPBTooltip.prototype.enter = function (obj) { 638 var self = obj instanceof this.constructor ? 639 obj : $(obj.currentTarget).data('sppb.' + this.type) 640 641 if (!self) { 642 self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) 643 $(obj.currentTarget).data('sppb.' + this.type, self) 644 } 645 646 clearTimeout(self.timeout) 647 648 self.hoverState = 'in' 649 650 if (!self.options.delay || !self.options.delay.show) return self.show() 651 652 self.timeout = setTimeout(function () { 653 if (self.hoverState == 'in') self.show() 654 }, self.options.delay.show) 655 } 656 657 SPPBTooltip.prototype.leave = function (obj) { 658 var self = obj instanceof this.constructor ? 659 obj : $(obj.currentTarget).data('sppb.' + this.type) 660 661 if (!self) { 662 self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) 663 $(obj.currentTarget).data('sppb.' + this.type, self) 664 } 665 666 clearTimeout(self.timeout) 667 668 self.hoverState = 'out' 669 670 if (!self.options.delay || !self.options.delay.hide) return self.hide() 671 672 self.timeout = setTimeout(function () { 673 if (self.hoverState == 'out') self.hide() 674 }, self.options.delay.hide) 675 } 676 677 SPPBTooltip.prototype.show = function () { 678 var e = $.Event('show.sppb.' + this.type) 679 680 if (this.hasContent() && this.enabled) { 681 this.$element.trigger(e) 682 683 var inDom = $.contains(document.documentElement, this.$element[0]) 684 if (e.isDefaultPrevented() || !inDom) return 685 var that = this 686 687 var $tip = this.tip() 688 689 var tipId = this.getUID(this.type) 690 691 this.setContent()
692 $tip.attr('id', tipId) 693 this.$element.attr('aria-describedby', tipId) 694 695 if (this.options.animation) $tip.addClass('sppb-fade') 696 697 var placement = typeof this.options.placement == 'function' ? 698 this.options.placement.call(this, $tip[0], this.$element[0]) : 699 this.options.placement 700 701 var autoToken = /\s?auto?\s?/i 702 var autoPlace = autoToken.test(placement) 703 if (autoPlace) placement = placement.replace(autoToken, '') || 'top' 704 705 $tip 706 .detach() 707 .css({ top: 0, left: 0, display: 'block' }) 708 .addClass(placement) 709 .data('sppb.' + this.type, this) 710 711 this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element) 712 713 var pos = this.getPosition() 714 var actualWidth = $tip[0].offsetWidth 715 var actualHeight = $tip[0].offsetHeight 716 717 if (autoPlace) { 718 var orgPlacement = placement 719 var $parent = this.$element.parent() 720 var parentDim = this.getPosition($parent) 721 722 placement = placement == 'bottom' && pos.top + pos.height + actualHeight - parentDim.scroll > parentDim.height ? 'top' : 723 placement == 'top' && pos.top - parentDim.scroll - actualHeight < 0 ? 'bottom' : 724 placement == 'right' && pos.right + actualWidth > parentDim.width ? 'left' : 725 placement == 'left' && pos.left - actualWidth < parentDim.left ? 'right' : 726 placement 727 728 $tip 729 .removeClass(orgPlacement) 730 .addClass(placement) 731 } 732 733 var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight) 734 735 this.applyPlacement(calculatedOffset, placement) 736 737 var complete = function () { 738 that.$element.trigger('shown.sppb.' + that.type) 739 that.hoverState = null 740 } 741 742 $.support.transition && this.$tip.hasClass('sppb-') ? 743 $tip 744 .one('bsTransitionEnd', complete) 745 .emulateTransitionEnd(150) : 746 complete() 747 } 748 } 749 750 SPPBTooltip.prototype.applyPlacement = function (offset, placement) { 751 var $tip = this.tip() 752 var width = $tip[0].offsetWidth 753 var height = $tip[0].offsetHeight 754 755 // manually read margins because getBoundingClientRect includes difference 756 var marginTop = parseInt($tip.css('margin-top'), 10) 757 var marginLeft = parseInt($tip.css('margin-left'), 10) 758 759 // we must check for NaN for ie 8/9 760 if (isNaN(marginTop)) marginTop = 0 761 if (isNaN(marginLeft)) marginLeft = 0 762 763 offset.top = offset.top + marginTop 764 offset.left = offset.left + marginLeft 765 766 // $.fn.offset doesn't round pixel values 767 // so we use setOffset directly with our own function B-0 768 $.offset.setOffset($tip[0], $.extend({ 769 using: function (props) { 770 $tip.css({ 771 top: Math.round(props.top), 772 left: Math.round(props.left) 773 }) 774 } 775 }, offset), 0) 776 777 $tip.addClass('in') 778 779 // check to see if placing tip in new offset caused the tip to resize itself 780 var actualWidth = $tip[0].offsetWidth 781 var actualHeight = $tip[0].offsetHeight 782 783 if (placement == 'top' && actualHeight != height) { 784 offset.top = offset.top + height - actualHeight 785 } 786 787 var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight) 788 789 if (delta.left) offset.left += delta.left 790 else offset.top += delta.top 791 792 var arrowDelta = delta.left ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight 793 var arrowPosition = delta.left ? 'left' : 'top' 794 var arrowOffsetPosition = delta.left ? 'offsetWidth' : 'offsetHeight' 795 796 $tip.offset(offset) 797 this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], arrowPosition) 798 } 799 800 SPPBTooltip.prototype.replaceArrow = function (delta, dimension, position) { 801 this.arrow().css(position, delta ? (50 * (1 - delta / dimension) + '%') : '') 802 } 803 804 SPPBTooltip.prototype.setContent = function () { 805 var $tip = this.tip() 806 var title = this.getTitle() 807 808 $tip.find('.sppb-tooltip-inner')[this.options.html ? 'html' : 'text'](title) 809 $tip.removeClass('sppb-fade in top bottom left right') 810 } 811 812 SPPBTooltip.prototype.hide = function () { 813 var that = this 814 var $tip = this.tip() 815 var e = $.Event('hide.sppb.' + this.type) 816 817 this.$element.removeAttr('aria-describedby') 818 819 function complete() { 820 if (that.hoverState != 'in') $tip.detach() 821 that.$element.trigger('hidden.sppb.' + that.type) 822 } 823 824 this.$element.trigger(e) 825 826 if (e.isDefaultPrevented()) return 827 828 $tip.removeClass('in') 829 830 $.support.transition && this.$tip.hasClass('sppb-fade') ? 831 $tip 832 .one('bsTransitionEnd', complete) 833 .emulateTransitionEnd(150) : 834 complete() 835 836 this.hoverState = null 837 838 return this 839 } 840 841 SPPBTooltip.prototype.fixTitle = function () { 842 var $e = this.$element 843 if ($e.attr('title') || typeof ($e.attr('data-original-title')) != 'string') { 844 $e.attr('data-original-title', $e.attr('title') || '').attr('title', '') 845 } 846 } 847 848 SPPBTooltip.prototype.hasContent = function () { 849 return this.getTitle() 850 } 851 852 SPPBTooltip.prototype.getPosition = function ($element) { 853 $element = $element || this.$element 854 var el = $element[0] 855 var isBody = el.tagName == 'BODY' 856 return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : null, { 857 scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop(), 858 width: isBody ? $(window).width() : $element.outerWidth(), 859 height: isBody ? $(window).height() : $element.outerHeight() 860 }, isBody ? { top: 0, left: 0 } : $element.offset()) 861 } 862 863 SPPBTooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) { 864 return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } : 865 placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } : 866 placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } : 867 /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width } 868 869 } 870 871 SPPBTooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) { 872 var delta = { top: 0, left: 0 } 873 if (!this.$viewport) return delta 874 875 var viewportPadding = this.options.viewport && this.options.viewport.padding || 0 876 var viewportDimensions = this.getPosition(this.$viewport) 877 878 if (/right|left/.test(placement)) { 879 var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll 880 var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight 881 if (topEdgeOffset < viewportDimensions.top) { // top overflow 882 delta.top = viewportDimensions.top - topEdgeOffset 883 } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow 884 delta.top = viewportDimensions.top + viewportDimensions.height - bottom
vendor: 6,728 bytes, lines 884-1123
884EdgeOffset 885 } 886 } else { 887 var leftEdgeOffset = pos.left - viewportPadding 888 var rightEdgeOffset = pos.left + viewportPadding + actualWidth 889 if (leftEdgeOffset < viewportDimensions.left) { // left overflow 890 delta.left = viewportDimensions.left - leftEdgeOffset 891 } else if (rightEdgeOffset > viewportDimensions.width) { // right overflow 892 delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset 893 } 894 } 895 896 return delta 897 } 898 899 SPPBTooltip.prototype.getTitle = function () { 900 var title 901 var $e = this.$element 902 var o = this.options 903 904 title = $e.attr('data-original-title') 905 || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) 906 907 return title 908 } 909 910 SPPBTooltip.prototype.getUID = function (prefix) { 911 do prefix += ~~(Math.random() * 1000000) 912 while (document.getElementById(prefix)) 913 return prefix 914 } 915 916 SPPBTooltip.prototype.tip = function () { 917 return (this.$tip = this.$tip || $(this.options.template)) 918 } 919 920 SPPBTooltip.prototype.arrow = function () { 921 return (this.$arrow = this.$arrow || this.tip().find('.sppb-tooltip-arrow')) 922 } 923 924 SPPBTooltip.prototype.validate = function () { 925 if (!this.$element[0].parentNode) { 926 this.hide() 927 this.$element = null 928 this.options = null 929 } 930 } 931 932 SPPBTooltip.prototype.enable = function () { 933 this.enabled = true 934 } 935 936 SPPBTooltip.prototype.disable = function () { 937 this.enabled = false 938 } 939 940 SPPBTooltip.prototype.toggleEnabled = function () { 941 this.enabled = !this.enabled 942 } 943 944 SPPBTooltip.prototype.toggle = function (e) { 945 var self = this 946 if (e) { 947 self = $(e.currentTarget).data('sppb.' + this.type) 948 if (!self) { 949 self = new this.constructor(e.currentTarget, this.getDelegateOptions()) 950 $(e.currentTarget).data('sppb.' + this.type, self) 951 } 952 } 953 954 self.tip().hasClass('in') ? self.leave(self) : self.enter(self) 955 } 956 957 SPPBTooltip.prototype.destroy = function () { 958 clearTimeout(this.timeout) 959 this.hide().$element.off('.' + this.type).removeData('sppb.' + this.type) 960 } 961 962 963 // TOOLTIP PLUGIN DEFINITION 964 // ========================= 965 966 function Plugin(option) { 967 return this.each(function () { 968 var $this = $(this) 969 var data = $this.data('sppb.tooltip') 970 var options = typeof option == 'object' && option 971 972 if (!data && option == 'destroy') return 973 if (!data) $this.data('sppb.tooltip', (data = new SPPBTooltip(this, options))) 974 if (typeof option == 'string') data[option]() 975 }) 976 } 977 978 var old = $.fn.sppbtooltip 979 980 $.fn.sppbtooltip = Plugin 981 $.fn.sppbtooltip.Constructor = SPPBTooltip 982 983 984 // TOOLTIP NO CONFLICT 985 // =================== 986 987 $.fn.sppbtooltip.noConflict = function () { 988 $.fn.sppbtooltip = old 989 return this 990 } 991 992}(jQuery); 993 994 995 996/* ======================================================================== 997 * Bootstrap: popover.js v3.2.0 998 * http://getbootstrap.com/javascript/#popovers 999 * ======================================================================== 1000 * Copyright 2011-2014 Twitter, Inc. 1001 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 1002 * ======================================================================== */ 1003 1004 1005+function ($) { 1006 'use strict'; 1007 1008 // POPOVER PUBLIC CLASS DEFINITION 1009 // =============================== 1010 1011 var SPPBPopover = function (element, options) { 1012 this.init('sppbpopover', element, options) 1013 } 1014 1015 if (!$.fn.sppbtooltip) throw new Error('Popover requires tooltip.js') 1016 1017 SPPBPopover.VERSION = '3.2.0' 1018 1019 SPPBPopover.DEFAULTS = $.extend({}, $.fn.sppbtooltip.Constructor.DEFAULTS, { 1020 placement: 'right', 1021 trigger: 'click', 1022 content: '', 1023 template: '<div class="sppb-popover" role="tooltip"><div class="arrow"></div><h3 class="sppb-popover-title"></h3><div class="sppb-popover-content"></div></div>' 1024 }) 1025 1026 1027 // NOTE: POPOVER EXTENDS tooltip.js 1028 // ================================ 1029 1030 SPPBPopover.prototype = $.extend({}, $.fn.sppbtooltip.Constructor.prototype) 1031 1032 SPPBPopover.prototype.constructor = SPPBPopover 1033 1034 SPPBPopover.prototype.getDefaults = function () { 1035 return SPPBPopover.DEFAULTS 1036 } 1037 1038 SPPBPopover.prototype.setContent = function () { 1039 var $tip = this.tip() 1040 var title = this.getTitle() 1041 var content = this.getContent() 1042 1043 $tip.find('.sppb-popover-title')[this.options.html ? 'html' : 'text'](title) 1044 $tip.find('.sppb-popover-content').empty()[ // we use append for html objects to maintain js events 1045 this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text' 1046 ](content) 1047 1048 $tip.removeClass('sppb-fade top bottom left right in') 1049 1050 // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do 1051 // this manually by checking the contents. 1052 if (!$tip.find('.sppb-popover-title').html()) $tip.find('.sppb-popover-title').hide() 1053 } 1054 1055 SPPBPopover.prototype.hasContent = function () { 1056 return this.getTitle() || this.getContent() 1057 } 1058 1059 SPPBPopover.prototype.getContent = function () { 1060 var $e = this.$element 1061 var o = this.options 1062 1063 return $e.attr('data-content') 1064 || (typeof o.content == 'function' ? 1065 o.content.call($e[0]) : 1066 o.content) 1067 } 1068 1069 SPPBPopover.prototype.arrow = function () { 1070 return (this.$arrow = this.$arrow || this.tip().find('.arrow')) 1071 } 1072 1073 SPPBPopover.prototype.tip = function () { 1074 if (!this.$tip) this.$tip = $(this.options.template) 1075 return this.$tip 1076 } 1077 1078 1079 // POPOVER PLUGIN DEFINITION 1080 // ========================= 1081 1082 function Plugin(option) { 1083 return this.each(function () { 1084 var $this = $(this) 1085 var data = $this.data('sppb.popover') 1086 var options = typeof option == 'object' && option 1087 1088 if (!data && option == 'destroy') return 1089 if (!data) $this.data('sppb.popover', (data = new SPPBPopover(this, options))) 1090 if (typeof option == 'string') data[option]() 1091 }) 1092 } 1093 1094 var old = $.fn.sppbpopover 1095 1096 $.fn.sppbpopover = Plugin 1097 $.fn.sppbpopover.Constructor = SPPBPopover 1098 1099 1100 // POPOVER NO CONFLICT 1101 // =================== 1102 1103 $.fn.sppbpopover.noConflict = function () { 1104 $.fn.sppbpopover = old 1105 return this 1106 } 1107 1108}(jQuery); 1109 1110 1111 1112/* ======================================================================== 1113 * Bootstrap: transition.js v3.2.0 1114 * http://getbootstrap.com/javascript/#transitions 1115 * ======================================================================== 1116 * Copyright 2011-2014 Twitter, Inc. 1117 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 1118 * ======================================================================== */ 1119 1120 1121+function ($) { 1122 'use strict'; 1123
1124 // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) 1125 // ============================================================ 1126 1127 function transitionEnd() { 1128 var el = document.createElement('bootstrap') 1129 1130 var transEndEventNames = { 1131 WebkitTransition : 'webkitTransitionEnd', 1132 MozTransition : 'transitionend', 1133 OTransition : 'oTransitionEnd otransitionend', 1134 transition : 'transitionend' 1135 } 1136 1137 for (var name in transEndEventNames) { 1138 if (el.style[name] !== undefined) { 1139 return { end: transEndEventNames[name] } 1140 } 1141 } 1142 1143 return false // explicit for ie8 ( ._.) 1144 } 1145 1146 // http://blog.alexmaccaw.com/css-transitions 1147 $.fn.emulateTransitionEnd = function (duration) { 1148 var called = false 1149 var $el = this 1150 $(this).one('bsTransitionEnd', function () { called = true }) 1151 var callback = function () { if (!called) $($el).trigger($.support.transition.end) } 1152 setTimeout(callback, duration) 1153 return this 1154 } 1155 1156 $(function () { 1157 $.support.transition = transitionEnd() 1158 1159 if (!$.support.transition) return 1160 1161 $.event.special.bsTransitionEnd = { 1162 bindType: $.support.transition.end, 1163 delegateType: $.support.transition.end, 1164 handle: function (e) { 1165 if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments) 1166 } 1167 } 1168 }) 1169 1170}(jQuery); 1171 1172//fix carousel issue fr mootools 1173if (typeof jQuery != 'undefined' && typeof MooTools != 'undefined' ) { 1174 (function($) { 1175 $(document).ready(function(){ 1176 $('.sppb-carousel').each(function(index, element) { 1177 $(this)[index].slide = null; 1178 }); 1179 }); 1180 })(jQuery); 1181} 1182 1183 1184/* 1185 * Vide - v0.1.2 1186 * Easy as hell jQuery plugin for video backgrounds. 1187 * http://vodkabears.github.io/vide/ 1188 * 1189 * Made by Ilya Makarov 1190 * Under MIT License 1191 */ 1192;(function ($, window, document, navigator) { 1193 "use strict"; 1194 1195 /** 1196 * Vide settings 1197 */ 1198 var pluginName = "vide", 1199 defaults = { 1200 volume: 1, 1201 playbackRate: 1, 1202 muted: true, 1203 loop: true, 1204 autoplay: true, 1205 position: "50% 50%" 1206 }; 1207 1208 /** 1209 * Is iOs or Android? 1210 */ 1211 var iOS = /iPad|iPhone|iPod/i.test(navigator.userAgent), 1212 android = /Android/i.test(navigator.userAgent); 1213 1214 /** 1215 * Special plugin object for instances. 1216 * @type {Object} 1217 */ 1218 $[pluginName] = { 1219 lookup: [] 1220 }; 1221 1222 /** 1223 * Parse string with options 1224 * @param str 1225 * @returns {Object} 1226 */ 1227 var parseOptions = function (str) { 1228 var obj = {}, clearedStr, arr; 1229 1230 // remove spaces before and after delimiters 1231 clearedStr = str.replace(/\s*:\s*/g, ":").replace(/\s*,\s*/g, ","); 1232 1233 // parse string 1234 arr = clearedStr.split(","); 1235 var i, len, val; 1236 for (i = 0, len = arr.length; i < len; i++) { 1237 arr[i] = arr[i].split(":"); 1238 val = arr[i][1]; 1239 1240 // if val is an empty string, make it undefined 1241 if (!val) { 1242 val = undefined; 1243 } 1244 1245 // convert string value if it is like a boolean 1246 if (typeof val === "string" || val instanceof String) { 1247 val = val === "true" || (val === "false" ? false : val); 1248 } 1249 1250 // convert string value if it is like a number 1251 if (typeof val === "string" || val instanceof String) { 1252 val = !isNaN(val) ? +val : val; 1253 } 1254 1255 obj[arr[i][0]] = val; 1256 } 1257 1258 return obj; 1259 }; 1260 1261 /** 1262 * Parse position option 1263 * @param str 1264 * @returns {{x: *, y: *}} 1265 */ 1266 var parsePosition = function (str) { 1267 // convert anything to the string 1268 str = "" + str; 1269 1270 // default value is a center 1271 var args = str.split(/\s+/), 1272 x = "50%", y = "50%"; 1273 1274 for (var i = 0, len = args.length, arg; i < len; i++) { 1275 arg = args[i]; 1276 1277 // convert values 1278 if (arg === "left") { 1279 x = "0%"; 1280 } else if (arg === "right") { 1281 x = "100%"; 1282 } else if (arg === "top") { 1283 y = "0%"; 1284 } else if (arg === "bottom") { 1285 y = "100%"; 1286 } else if (arg === "center"){ 1287 if (i === 0) { 1288 x = "50%"; 1289 } else { 1290 y = "50%"; 1291 } 1292 } else { 1293 if (i === 0) { 1294 x = arg; 1295 } else { 1296 y = arg;
1297 } 1298 } 1299 } 1300 1301 return { x: x, y: y }; 1302 }; 1303 1304 /** 1305 * Vide constructor 1306 * @param element 1307 * @param path 1308 * @param options 1309 * @constructor 1310 */ 1311 function Vide(element, path, options) { 1312 this.element = $(element); 1313 this._defaults = defaults; 1314 this._name = pluginName; 1315 1316 // remove extension 1317 path = path.replace(/\.\w*$/, ""); 1318 1319 this.settings = $.extend({}, defaults, options); 1320 this.path = path; 1321 1322 this.init(); 1323 } 1324 1325 /** 1326 * Initialization 1327 */ 1328 Vide.prototype.init = function () { 1329 var that = this; 1330 1331 this.wrapper = $("<div>"); 1332 1333 // Set video wrapper styles 1334 var position = parsePosition(this.settings.position); 1335 this.wrapper.css({ 1336 "position": "absolute", 1337 "z-index": -1, 1338 "top": 0, 1339 "left": 0, 1340 "bottom": 0, 1341 "right": 0, 1342 "overflow": "hidden", 1343 "-webkit-background-size": "cover", 1344 "-moz-background-size": "cover", 1345 "-o-background-size": "cover", 1346 "background-size": "cover", 1347 "background-repeat": "no-repeat", 1348 "background-position": position.x + " " + position.y 1349 }); 1350 1351 // Set video poster 1352 if ($(this.element).data('vide-image')) { 1353 this.wrapper.css("background-image", "url(" + $(this.element).data('vide-image') + ")"); 1354 } 1355 1356 // if parent element has a static position, make it relative 1357 if (this.element.css("position") === "static") { 1358 this.element.css("position", "relative"); 1359 } 1360 1361 this.element.prepend(this.wrapper); 1362 1363 if (!iOS && !android) { 1364 1365 var video_src = ''; 1366 1367 if($(this.element).data('vide-mp4')) { 1368 video_src += "<source src='" + $(this.element).data('vide-mp4') + "' type='video/mp4'>"; 1369 } 1370 1371 if($(this.element).data('vide-ogv')) { 1372 video_src += "<source src='" + $(this.element).data('vide-ogv') + "' type='video/ogg'>"; 1373 } 1374 1375 this.video = $("<video>" + video_src + "</video>"); 1376 1377 // Disable visibility, while loading 1378 this.video.css("visibility", "hidden"); 1379 1380 // Set video properties 1381 this.video.prop({ 1382 autoplay: this.settings.autoplay, 1383 loop: this.settings.loop, 1384 volume: this.settings.volume, 1385 muted: this.settings.muted, 1386 playbackRate: this.settings.playbackRate 1387 }); 1388 1389 // Append video 1390 this.wrapper.append(this.video); 1391 1392 // Video alignment 1393 this.video.css({ 1394 "margin": "auto", 1395 "position": "absolute", 1396 "z-index": -1, 1397 "top": position.y, 1398 "left": position.x, 1399 "-webkit-transform": "translate(-" + position.x + ", -" + position.y + ")", 1400 "-ms-transform": "translate(-" + position.x + ", -" + position.y + ")", 1401 "transform": "translate(-" + position.x + ", -" + position.y + ")" 1402 }); 1403 1404 // resize video, when it's loaded 1405 this.video.bind("loadedmetadata." + pluginName, function () { 1406 that.video.css("visibility", "visible"); 1407 that.resize(); 1408 }); 1409 1410 // resize event is available only for 'window', 1411 // use another code solutions to detect DOM elements resizing 1412 $(this.element).bind("resize." + pluginName, function () { 1413 that.resize(); 1414 }); 1415 } 1416 }; 1417 1418 /** 1419 * Get video element of the background 1420 * @returns {HTMLVideoElement} 1421 */ 1422 Vide.prototype.getVideoObject = function () { 1423 return this.video ? this.video[0] : null; 1424 }; 1425 1426 /** 1427 * Resize video background 1428 */ 1429 Vide.prototype.resize = function () { 1430 if (!this.video) { 1431 return; 1432 } 1433 1434 // get native video size 1435 var videoHeight = this.video[0].videoHeight, 1436 videoWidth = this.video[0].videoWidth; 1437 1438 // get wrapper size 1439 var wrapperHeight = this.wrapper.height(),
1440 wrapperWidth = this.wrapper.width(); 1441 1442 if (wrapperWidth / videoWidth > wrapperHeight / videoHeight) { 1443 this.video.css({ 1444 "width": wrapperWidth + 2, // +2 pixels to prevent empty space after transformation 1445 "height": "auto" 1446 }); 1447 } else { 1448 this.video.css({ 1449 "width": "auto", 1450 "height": wrapperHeight + 2 // +2 pixels to prevent empty space after transformation 1451 }); 1452 } 1453 }; 1454 1455 /** 1456 * Destroy video background 1457 */ 1458 Vide.prototype.destroy = function () { 1459 this.element.unbind(pluginName); 1460 if (this.video) { 1461 this.video.unbind(pluginName); 1462 } 1463 1464 delete $[pluginName].lookup[this.index]; 1465 this.element.removeData(pluginName); 1466 this.wrapper.remove(); 1467 }; 1468 1469 /** 1470 * Plugin constructor 1471 * @param path 1472 * @param options 1473 * @returns {*} 1474 */ 1475 $.fn[pluginName] = function (path, options) { 1476 var instance; 1477 this.each(function () { 1478 instance = $.data(this, pluginName); 1479 if (instance) { 1480 // destroy plugin instance if exists 1481 instance.destroy(); 1482 } 1483 // create plugin instance 1484 instance = new Vide(this, path, options); 1485 instance.index = $[pluginName].lookup.push(instance) - 1; 1486 $.data(this, pluginName, instance); 1487 }); 1488 1489 return this; 1490 }; 1491 1492 $(document).ready(function () { 1493 // window resize event listener 1494 $(window).bind("resize." + pluginName, function () { 1495 for (var len = $[pluginName].lookup.length, instance, i = 0; i < len; i++) { 1496 instance = $[pluginName].lookup[i]; 1497 if (instance) { 1498 instance.resize(); 1499 } 1500 } 1501 }); 1502 1503 // Auto initialization. 1504 // Add 'data-vide-bg' attribute with a path to the video without extension. 1505 // Also you can pass options throw the 'data-vide-options' attribute. 1506 // 'data-vide-options' must be like "muted: false, volume: 0.5". 1507 $(document).find("[data-" + pluginName + "-bg]").each(function (i, element) { 1508 var $element = $(element), 1509 options = $element.data(pluginName + "-options"), 1510 path = ''; 1511 1512 if (!options) { 1513 options = {}; 1514 } else { 1515 options = parseOptions(options); 1516 } 1517 1518 $element[pluginName](path, options); 1519 }); 1520 }); 1521})(window.jQuery, window, document, navigator); 1522 1523 1524/*! WOW - v1.0.1 - 2014-08-15 1525 * Copyright (c) 2014 Matthieu Aussaguel; Licensed MIT */ 1526;(function() { 1527 var a, b, c, d = function(a, b) { 1528 return function() { 1529 return a.apply(b, arguments) 1530 } 1531 }, 1532 e = [].indexOf || function(a) { 1533 for (var b = 0, c = this.length; c > b; b++) 1534 if (b in this && this[b] === a) return b; 1535 return -1 1536 }; 1537 b = function() { 1538 function a() {} 1539 return a.prototype.extend = function(a, b) { 1540 var c, d; 1541 for (c in b) d = b[c], null == a[c] && (a[c] = d); 1542 return a 1543 }, a.prototype.isMobile = function(a) { 1544 return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(a) 1545 }, a 1546 }(), c = this.WeakMap || this.MozWeakMap || (c = function() { 1547 function a() { 1548 this.keys = [], this.values = [] 1549 } 1550 return a.prototype.get = function(a) { 1551 var b, c, d, e, f; 1552 for (f = this.keys, b = d = 0, e = f.length; e > d; b = ++d) 1553 if (c = f[b], c === a) return this.values[b] 1554 }, a.prototype.set = function(a, b) { 1555 var c, d, e, f, g; 1556 for (g = this.keys, c = e = 0, f = g.length; f > e; c = ++e) 1557 if (d = g[c], d === a) return void(this.values[c] = b); 1558 return this.keys.push(a), this.values.push(b) 1559 }, a 1560 }()), a = this.MutationObserver || this.WebkitMutationObserver || this.MozMutationObserver || (a = function() { 1561 function a() { 1562 console.warn("MutationObserver is not supported by your browser."), console.warn("WOW.js cannot detect dom mutations, please call .sync() after loading new content.") 1563 } 1564 return a.notSupported = !0, a.prototype.observe = function() {}, a 1565 }()), this.SPPBWOW = function() { 1566 function f(a) { 1567 null == a && (a = {}), this.scrollCallback = d(this.scrollCallback, this), this.scrollHandler = d(this.scrollHandler, this), this.start = d(this.start, this), this.scrolled = !0, this.config = this.util().extend(a, this.defaults), this.animationNameCache = new c 1568 } 1569 return f.prototype.defaults = { 1570 boxClass: "sppb-wow", 1571 animateClass: "sppb-animated", 1572 offset: 0, 1573 mobile: !0, 1574 live: !0 1575 }, f.prototype.init = function() { 1576 var a; 1577 return this.element = window.document.documentElement, "interactive" === (a = document.readyState) || "complete" === a ? this.start() : document.addEventListener("DOMContentLoaded", this.start), this.finished = [] 1578 }, f.prototype.start = function() { 1579 var b, c, d, e; 1580 if (this.stopped = !1, this.boxes = function() { 1581 var a, c, d, e; 1582 for (d = this.element.querySelectorAll("." + this.config.boxClass), e = [], a = 0, c = d.length; c > a; a++) b = d[a], e.push(b); 1583 return e 1584 }.call(this), this.all = function() { 1585 var a, c, d, e; 1586 for (d = this.boxes, e = [], a = 0, c = d.length; c > a; a++) b = d[a], e.push(b); 1587 return e 1588 }.call(this), this.boxes.length) 1589 if (this.disabled()) this.resetStyle(); 1590 else { 1591 for (e = this.boxes, c = 0, d = e.length; d > c; c++) b = e[c], this.applyStyle(b, !0); 1592 window.addEventListener("scroll", this.scrollHandler, !1), window.addEventListener("resize", this.scrollHandler, !1), this.interval = setInterval(this.scrollCallback, 50) 1593 } 1594 return this.config.live ? new a(function(a) { 1595 return function(b) { 1596 var c, d, e, f, g; 1597 for (g = [], e = 0, f = b.length; f > e;
vendor: 6,866 bytes, lines 1597-1734
1597 e++) d = b[e], g.push(function() { 1598 var a, b, e, f; 1599 for (e = d.addedNodes || [], f = [], a = 0, b = e.length; b > a; a++) c = e[a], f.push(this.doSync(c)); 1600 return f 1601 }.call(a)); 1602 return g 1603 } 1604 }(this)).observe(document.body, { 1605 childList: !0, 1606 subtree: !0 1607 }) : void 0 1608 }, f.prototype.stop = function() { 1609 return this.stopped = !0, window.removeEventListener("scroll", this.scrollHandler, !1), window.removeEventListener("resize", this.scrollHandler, !1), null != this.interval ? clearInterval(this.interval) : void 0 1610 }, f.prototype.sync = function() { 1611 return a.notSupported ? this.doSync(this.element) : void 0 1612 }, f.prototype.doSync = function(a) { 1613 var b, c, d, f, g; 1614 if (!this.stopped) { 1615 if (null == a && (a = this.element), 1 !== a.nodeType) return; 1616 for (a = a.parentNode || a, f = a.querySelectorAll("." + this.config.boxClass), g = [], c = 0, d = f.length; d > c; c++) b = f[c], e.call(this.all, b) < 0 ? (this.applyStyle(b, !0), this.boxes.push(b), this.all.push(b), g.push(this.scrolled = !0)) : g.push(void 0); 1617 return g 1618 } 1619 }, f.prototype.show = function(a) { 1620 return this.applyStyle(a), a.className = "" + a.className + " " + this.config.animateClass 1621 }, f.prototype.applyStyle = function(a, b) { 1622 var c, d, e; 1623 return d = a.getAttribute("data-sppb-wow-duration"), c = a.getAttribute("data-sppb-wow-delay"), e = a.getAttribute("data-sppb-wow-iteration"), this.animate(function(f) { 1624 return function() { 1625 return f.customStyle(a, b, d, c, e) 1626 } 1627 }(this)) 1628 }, f.prototype.animate = function() { 1629 return "requestAnimationFrame" in window ? function(a) { 1630 return window.requestAnimationFrame(a) 1631 } : function(a) { 1632 return a() 1633 } 1634 }(), f.prototype.resetStyle = function() { 1635 var a, b, c, d, e; 1636 for (d = this.boxes, e = [], b = 0, c = d.length; c > b; b++) a = d[b], e.push(a.setAttribute("style", "visibility: visible;")); 1637 return e 1638 }, f.prototype.customStyle = function(a, b, c, d, e) { 1639 return b && this.cacheAnimationName(a), a.style.visibility = b ? "hidden" : "visible", c && this.vendorSet(a.style, { 1640 animationDuration: c 1641 }), d && this.vendorSet(a.style, { 1642 animationDelay: d 1643 }), e && this.vendorSet(a.style, { 1644 animationIterationCount: e 1645 }), this.vendorSet(a.style, { 1646 animationName: b ? "none" : this.cachedAnimationName(a) 1647 }), a 1648 }, f.prototype.vendors = ["moz", "webkit"], f.prototype.vendorSet = function(a, b) { 1649 var c, d, e, f; 1650 f = []; 1651 for (c in b) d = b[c], a["" + c] = d, f.push(function() { 1652 var b, f, g, h; 1653 for (g = this.vendors, h = [], b = 0, f = g.length; f > b; b++) e = g[b], h.push(a["" + e + c.charAt(0).toUpperCase() + c.substr(1)] = d); 1654 return h 1655 }.call(this)); 1656 return f 1657 }, f.prototype.vendorCSS = function(a, b) { 1658 var c, d, e, f, g, h; 1659 for (d = window.getComputedStyle(a), c = d.getPropertyCSSValue(b), h = this.vendors, f = 0, g = h.length; g > f; f++) e = h[f], c = c || d.getPropertyCSSValue("-" + e + "-" + b); 1660 return c 1661 }, f.prototype.animationName = function(a) { 1662 var b; 1663 try { 1664 b = this.vendorCSS(a, "animation-name").cssText 1665 } catch (c) { 1666 b = window.getComputedStyle(a).getPropertyValue("animation-name") 1667 } 1668 return "none" === b ? "" : b 1669 }, f.prototype.cacheAnimationName = function(a) { 1670 return this.animationNameCache.set(a, this.animationName(a)) 1671 }, f.prototype.cachedAnimationName = function(a) { 1672 return this.animationNameCache.get(a) 1673 }, f.prototype.scrollHandler = function() { 1674 return this.scrolled = !0 1675 }, f.prototype.scrollCallback = function() { 1676 var a; 1677 return !this.scrolled || (this.scrolled = !1, this.boxes = function() { 1678 var b, c, d, e; 1679 for (d = this.boxes, e = [], b = 0, c = d.length; c > b; b++) a = d[b], a && (this.isVisible(a) ? this.show(a) : e.push(a)); 1680 return e 1681 }.call(this), this.boxes.length || this.config.live) ? void 0 : this.stop() 1682 }, f.prototype.offsetTop = function(a) { 1683 for (var b; void 0 === a.offsetTop;) a = a.parentNode; 1684 for (b = a.offsetTop; a = a.offsetParent;) b += a.offsetTop; 1685 return b 1686 }, f.prototype.isVisible = function(a) { 1687 var b, c, d, e, f; 1688 return c = a.getAttribute("data-sppb-wow-offset") || this.config.offset, f = window.pageYOffset, e = f + Math.min(this.element.clientHeight, innerHeight) - c, d = this.offsetTop(a), b = d + a.clientHeight, e >= d && b >= f 1689 }, f.prototype.util = function() { 1690 return null != this._util ? this._util : this._util = new b 1691 }, f.prototype.disabled = function() { 1692 return !this.config.mobile && this.util().isMobile(navigator.userAgent) 1693 }, f 1694 }() 1695}).call(this); 1696 1697//Initiat WOW JS 1698jQuery(function($){ 1699 new SPPBWOW().init(); 1700}); 1701 1702 1703 1704 1705 1706/** 1707 * author Christopher Blum 1708 * - based on the idea of Remy Sharp, http://remysharp.com/2009/01/26/element-in-view-event-plugin/ 1709 * - forked from http://github.com/zuk/jquery.inview/ 1710 */ 1711(function ($) { 1712 var inviewObjects = {}, viewportSize, viewportOffset, 1713 d = document, w = window, documentElement = d.documentElement, expando = $.expando, timer; 1714 1715 $.event.special.inview = { 1716 add: function(data) { 1717 inviewObjects[data.guid + "-" + this[expando]] = { data: data, $element: $(this) }; 1718 1719 // Use setInterval in order to also make sure this captures elements within 1720 // "overflow:scroll" elements or elements that appeared in the dom tree due to 1721 // dom manipulation and reflow 1722 // old: $(window).scroll(checkInView); 1723 // 1724 // By the way, iOS (iPad, iPhone, ...) seems to not execute, or at least delays 1725 // intervals while the user scrolls. Therefore the inview event might fire a bit late there 1726 // 1727 // Don't waste cycles with an interval until we get at least one element that 1728 // has bound to the inview event. 1729 if (!timer && !$.isEmptyObject(inviewObjects)) { 1730 timer = setInterval(checkInView, 250); 1731 } 1732 }, 1733 1734 remove: function(data) {
1735 try { delete inviewObjects[data.guid + "-" + this[expando]]; } catch(e) {} 1736 1737 // Clear interval when we no longer have any elements listening 1738 if ($.isEmptyObject(inviewObjects)) { 1739 clearInterval(timer); 1740 timer = null; 1741 } 1742 } 1743 }; 1744 1745 function getViewportSize() { 1746 var mode, domObject, size = { height: w.innerHeight, width: w.innerWidth }; 1747 1748 // if this is correct then return it. iPad has compat Mode, so will 1749 // go into check clientHeight/clientWidth (which has the wrong value). 1750 if (!size.height) { 1751 mode = d.compatMode; 1752 if (mode || !$.support.boxModel) { // IE, Gecko 1753 domObject = mode === 'CSS1Compat' ? 1754 documentElement : // Standards 1755 d.body; // Quirks 1756 size = { 1757 height: domObject.clientHeight, 1758 width: domObject.clientWidth 1759 }; 1760 } 1761 } 1762 1763 return size; 1764 } 1765 1766 function getViewportOffset() { 1767 return { 1768 top: w.pageYOffset || documentElement.scrollTop || d.body.scrollTop, 1769 left: w.pageXOffset || documentElement.scrollLeft || d.body.scrollLeft 1770 }; 1771 } 1772 1773 function checkInView() { 1774 var $elements = $(), elementsLength, i = 0; 1775 1776 $.each(inviewObjects, function(i, inviewObject) { 1777 var selector = inviewObject.data.selector, 1778 $element = inviewObject.$element; 1779 $elements = $elements.add(selector ? $element.find(selector) : $element); 1780 }); 1781 1782 elementsLength = $elements.length; 1783 if (elementsLength) { 1784 viewportSize = viewportSize || getViewportSize(); 1785 viewportOffset = viewportOffset || getViewportOffset(); 1786 1787 for (; i<elementsLength; i++) { 1788 // Ignore elements that are not in the DOM tree 1789 if (!$.contains(documentElement, $elements[i])) { 1790 continue; 1791 } 1792 1793 var $element = $($elements[i]), 1794 elementSize = { height: $element.height(), width: $element.width() }, 1795 elementOffset = $element.offset(), 1796 inView = $element.data('inview'), 1797 visiblePartX, 1798 visiblePartY, 1799 visiblePartsMerged; 1800 1801 // Don't ask me why because I haven't figured out yet: 1802 // viewportOffset and viewportSize are sometimes suddenly null in Firefox 5. 1803 // Even though it sounds weird: 1804 // It seems that the execution of this function is interferred by the onresize/onscroll event 1805 // where viewportOffset and viewportSize are unset 1806 if (!viewportOffset || !viewportSize) { 1807 return; 1808 } 1809 1810 if (elementOffset.top + elementSize.height > viewportOffset.top && 1811 elementOffset.top < viewportOffset.top + viewportSize.height && 1812 elementOffset.left + elementSize.width > viewportOffset.left && 1813 elementOffset.left < viewportOffset.left + viewportSize.width) { 1814 visiblePartX = (viewportOffset.left > elementOffset.left ? 1815 'right' : (viewportOffset.left + viewportSize.width) < (elementOffset.left + elementSize.width) ? 1816 'left' : 'both'); 1817 visiblePartY = (viewportOffset.top > elementOffset.top ? 1818 'bottom' : (viewportOffset.top + viewportSize.height) < (elementOffset.top + elementSize.height) ? 1819 'top' : 'both'); 1820 visiblePartsMerged = visiblePartX + "-" + visiblePartY; 1821 if (!inView || inView !== visiblePartsMerged) { 1822 $element.data('inview', visiblePartsMerged).trigger('inview', [true, visiblePartX, visiblePartY]); 1823 } 1824 } else if (inView) { 1825 $element.data('inview', false).trigger('inview', [false]); 1826 } 1827 } 1828 } 1829 } 1830 1831 $(w).bind("scroll resize scrollstop", function() { 1832 viewportSize = viewportOffset = null; 1833 }); 1834 1835 // IE < 9 scrolls to focused elements without firing the "scroll" event 1836 if (!documentElement.addEventListener && documentElement.attachEvent) { 1837 documentElement.attachEvent("onfocusin", function() { 1838 viewportOffset = null; 1839 }); 1840 } 1841 1842 $(document).ready(function() { 1843 //Animated Progress 1844 $('.sppb-progress').bind('inview', function(event, visible, visiblePartX, visiblePartY) { 1845 var $bar = $(this).find('.sppb-progress-bar'); 1846 if (visible) { 1847 $bar.css('width', $bar.data('width')); 1848 $(this).unbind('inview'); 1849 } 1850 }); 1851 1852 //Animated Number 1853 $.fn.sppbanimateNumbers = function(stop, commas, duration, ease) { 1854 return this.each(function() { 1855 var $this = $(this); 1856 var start = parseInt($this.text().replace(/,/g, "")); 1857 commas = (commas === undefined) ? true : commas; 1858 $({value: start}).animate({value: stop}, { 1859 duration: duration == undefined ? 1000 : duration, 1860 easing: ease == undefined ? "swing" : ease, 1861 step: function() { 1862 $this.text(Math.floor(this.value)); 1863 if (commas) { $this.text($this.text().replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,")); } 1864 }, 1865 complete: function() { 1866 if (parseInt($this.text()) !== stop) { 1867 $this.text(stop); 1868 if (commas) { $this.text($this.text().replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,")); } 1869 } 1870 } 1871 }); 1872 }); 1873 }; 1874 1875 $('.sppb-animated-number').bind('inview', function(event, visible, visiblePartX, visiblePartY) { 1876 var $this = $(this); 1877 if (visible) { 1878 $this.sppbanimateNumbers($this.data('digit'), false, $this.data('duration')); 1879 $this.unbind('inview'); 1880 } 1881 }); 1882 1883 }); 1884 1885})(jQuery); 1886 1887 1888//Flickr Photo Stream 1889(function (document, $) { 1890 "use strict"; 1891 1892 var sppbflickrPhotoStream = function ($el, options) { 1893 var url = ['http://api.flickr.com/services/feeds/photos_public.gne?id=' + options.id + '&format=json&jsoncallback=?'].join(''); 1894 1895 return $.getJSON(url).done(function (data) { 1896 1897 for (var i = 0; i < options.count; i = i + 1) { 1898 var pic = data.items[i]; 1899 1900 $("<img class='sppb-img-responsive' alt='"+pic.title+"' />") 1901 .attr("src", pic.media.m) 1902 .appendTo($el) 1903 .wrap(options.container || '') 1904 .wrap(['<a target="_blank" href="' + pic.link + '" title="' + pic.title + '"></a>'].join('')); 1905 } 1906 1907 }); 1908 }; 1909 1910 $.fn.sppbflickrPhotoStream = function (options) { 1911 return sppbflickrPhotoStream($(this).get(), options || {}); 1912 }; 1913 1914 //Instance 1915 $(document).ready(function(){ 1916 $('.sppb-flickr-gallery').each(function(){ 1917 var $this = $(this); 1918 $this.sppbflickrPhotoStream({ 1919 id: $this.data('id'), 1920 count: $this.data('count'), 1921 container: '<li />' 1922 }); 1923 }); 1924 }); 1925 1926})(document, jQuery); 1927 1928//Pie Chart 1929jQuery(function($) { 1930 1931 $('.sppb-pie-chart').bind('inview', function(event, visible, visiblePartX, visiblePartY) { 1932 var $this = $(this); 1933 1934 if (visible) { 1935 1936 $this.easyPieChart({ 1937 barColor: $this.data('barcolor'), 1938 trackColor: $this.data('trackcolor'), 1939 scaleColor: false, 1940 lineWidth: $this.data('width'), 1941 size: $this.data('size'), 1942 onStep: function(from, to, percent) { 1943 $this.find('.sppb-chart-percent > span').text(Math.round(percent) + '%'); 1944 } 1945 }); 1946 1947 $this.unbind('inview'); 1948 } 1949 }); 1950 1951}); 1952 1953//Ajax Contact Form 1954jQuery(function($) { 1955 $('.sppb-ajaxt-contact-form').on('submit', function(event) { 1956 1957 event.preventDefault(); 1958 1959 var $self = $(this); 1960 var value = $(this).serializeArray(); 1961 var request = { 1962 'option' : 'com_sppagebuilder', 1963 'task' : 'ajax', 1964 'addon' : 'ajax_contact', 1965 'data' : value 1966 }; 1967 1968 $.ajax({ 1969 type : 'POST', 1970 data : request, 1971 beforeSend: function(){ 1972 $self.find('.fa').addClass('fa-spinner fa-spin'); 1973 }, 1974 success: function (response) { 1975 $self.find('.fa-spin').removeClass('fa-spinner fa-spin'); 1976 $self.next('.sppb-ajax-contact-status').html($.parseJSON(response).data).fadeIn().delay(2000).fadeOut(500);; 1977 } 1978 }); 1979 1980 return false;
1981 }); 1982}); 1983 1984
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.