vendor: 7,199 bytes, lines 1-2
1/*! jQuery Migrate v1.2.1 | (c) 2005, 2013 jQuery Foundation, Inc. and other contributors | jquery.org/license */ 2jQuery.migrateMute===void 0&&(jQuery.migrateMute=!0),function(e,t,n){function r(n){var r=t.console;i[n]||(i[n]=!0,e.migrateWarnings.push(n),r&&r.warn&&!e.migrateMute&&(r.warn("JQMIGRATE: "+n),e.migrateTrace&&r.trace&&r.trace()))}function a(t,a,i,o){if(Object.defineProperty)try{return Object.defineProperty(t,a,{configurable:!0,enumerable:!0,get:function(){return r(o),i},set:function(e){r(o),i=e}}),n}catch(s){}e._definePropertyBroken=!0,t[a]=i}var i={};e.migrateWarnings=[],!e.migrateMute&&t.console&&t.console.log&&t.console.log("JQMIGRATE: Logging is active"),e.migrateTrace===n&&(e.migrateTrace=!0),e.migrateReset=function(){i={},e.migrateWarnings.length=0},"BackCompat"===document.compatMode&&r("jQuery is not compatible with Quirks Mode");var o=e("<input/>",{size:1}).attr("size")&&e.attrFn,s=e.attr,u=e.attrHooks.value&&e.attrHooks.value.get||function(){return null},c=e.attrHooks.value&&e.attrHooks.value.set||function(){return n},l=/^(?:input|button)$/i,d=/^[238]$/,p=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,f=/^(?:checked|selected)$/i;a(e,"attrFn",o||{},"jQuery.attrFn is deprecated"),e.attr=function(t,a,i,u){var c=a.toLowerCase(),g=t&&t.nodeType;return u&&(4>s.length&&r("jQuery.fn.attr( props, pass ) is deprecated"),t&&!d.test(g)&&(o?a in o:e.isFunction(e.fn[a])))?e(t)[a](i):("type"===a&&i!==n&&l.test(t.nodeName)&&t.parentNode&&r("Can't change the 'type' of an input or button in IE 6/7/8"),!e.attrHooks[c]&&p.test(c)&&(e.attrHooks[c]={get:function(t,r){var a,i=e.prop(t,r);return i===!0||"boolean"!=typeof i&&(a=t.getAttributeNode(r))&&a.nodeValue!==!1?r.toLowerCase():n},set:function(t,n,r){var a;return n===!1?e.removeAttr(t,r):(a=e.propFix[r]||r,a in t&&(t[a]=!0),t.setAttribute(r,r.toLowerCase())),r}},f.test(c)&&r("jQuery.fn.attr('"+c+"') may use property instead of attribute")),s.call(e,t,a,i))},e.attrHooks.value={get:function(e,t){var n=(e.nodeName||"").toLowerCase();return"button"===n?u.apply(this,arguments):("input"!==n&&"option"!==n&&r("jQuery.fn.attr('value') no longer gets properties"),t in e?e.value:null)},set:function(e,t){var a=(e.nodeName||"").toLowerCase();return"button"===a?c.apply(this,arguments):("input"!==a&&"option"!==a&&r("jQuery.fn.attr('value', val) no longer sets properties"),e.value=t,n)}};var g,h,v=e.fn.init,m=e.parseJSON,y=/^([^<]*)(<[\w\W]+>)([^>]*)$/;e.fn.init=function(t,n,a){var i;return t&&"string"==typeof t&&!e.isPlainObject(n)&&(i=y.exec(e.trim(t)))&&i[0]&&("<"!==t.charAt(0)&&r("$(html) HTML strings must start with '<' character"),i[3]&&r("$(html) HTML text after last tag is ignored"),"#"===i[0].charAt(0)&&(r("HTML string cannot start with a '#' character"),e.error("JQMIGRATE: Invalid selector string (XSS)")),n&&n.context&&(n=n.context),e.parseHTML)?v.call(this,e.parseHTML(i[2],n,!0),n,a):v.apply(this,arguments)},e.fn.init.prototype=e.fn,e.parseJSON=function(e){return e||null===e?m.apply(this,arguments):(r("jQuery.parseJSON requires a valid JSON string"),null)},e.uaMatch=function(e){e=e.toLowerCase();var t=/(chrome)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||0>e.indexOf("compatible")&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(e)||[];return{browser:t[1]||"",version:t[2]||"0"}},e.browser||(g=e.uaMatch(navigator.userAgent),h={},g.browser&&(h[g.browser]=!0,h.version=g.version),h.chrome?h.webkit=!0:h.webkit&&(h.safari=!0),e.browser=h),a(e,"browser",e.browser,"jQuery.browser is deprecated"),e.sub=function(){function t(e,n){return new t.fn.init(e,n)}e.extend(!0,t,this),t.superclass=this,t.fn=t.prototype=this(),t.fn.constructor=t,t.sub=this.sub,t.fn.init=function(r,a){return a&&a instanceof e&&!(a instanceof t)&&(a=t(a)),e.fn.init.call(this,r,a,n)},t.fn.init.prototype=t.fn;var n=t(document);return r("jQuery.sub() is deprecated"),t},e.ajaxSetup({converters:{"text json":e.parseJSON}});var b=e.fn.data;e.fn.data=function(t){var a,i,o=this[0];return!o||"events"!==t||1!==arguments.length||(a=e.data(o,t),i=e._data(o,t),a!==n&&a!==i||i===n)?b.apply(this,arguments):(r("Use of jQuery.fn.data('events') is deprecated"),i)};var j=/\/(java|ecma)script/i,w=e.fn.andSelf||e.fn.addBack;e.fn.andSelf=function(){return r("jQuery.fn.andSelf() replaced by jQuery.fn.addBack()"),w.apply(this,arguments)},e.clean||(e.clean=function(t,a,i,o){a=a||document,a=!a.nodeType&&a[0]||a,a=a.ownerDocument||a,r("jQuery.clean() is deprecated");var s,u,c,l,d=[];if(e.merge(d,e.buildFragment(t,a).childNodes),i)for(c=function(e){return!e.type||j.test(e.type)?o?o.push(e.parentNode?e.parentNode.removeChild(e):e):i.appendChild(e):n},s=0;null!=(u=d[s]);s++)e.nodeName(u,"script")&&c(u)||(i.appendChild(u),u.getElementsByTagName!==n&&(l=e.grep(e.merge([],u.getElementsByTagName("script")),c),d.splice.apply(d,[s+1,0].concat(l)),s+=l.length));return d});var Q=e.event.add,x=e.event.remove,k=e.event.trigger,N=e.fn.toggle,T=e.fn.live,M=e.fn.die,S="ajaxStart|ajaxStop|ajaxSend|ajaxComplete|ajaxError|ajaxSuccess",C=RegExp("\\b(?:"+S+")\\b"),H=/(?:^|\s)hover(\.\S+|)\b/,A=function(t){return"string"!=typeof t||e.event.special.hover?t:(H.test(t)&&r("'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'"),t&&t.replace(H,"mouseenter$1 mouseleave$1"))};e.event.props&&"attrChange"!==e.event.props[0]&&e.event.props.unshift("attrChange","attrName","relatedNode","srcElement"),e.event.dispatch&&a(e.event,"handle",e.event.dispatch,"jQuery.event.handle is undocumented and deprecated"),e.event.add=function(e,t,n,a,i){e!==document&&C.test(t)&&r("AJAX events should be attached to document: "+t),Q.call(this,e,A(t||""),n,a,i)},e.event.remove=function(e,t,n,r,a){x.call(this,e,A(t)||"",n,r,a)},e.fn.error=function(){var e=Array.prototype.slice.call(arguments,0);return r("jQuery.fn.error() is deprecated"),e.splice(0,0,"error"),arguments.length?this.bind.apply(this,e):(this.triggerHandler.apply(this,e),this)},e.fn.toggle=function(t,n){if(!e.isFunction(t)||!e.isFunction(n))return N.apply(this,arguments);r("jQuery.fn.toggle(handler, handler...) is deprecated");var a=arguments,i=t.guid||e.guid++,o=0,s=function(n){var r=(e._data(this,"lastToggle"+t.guid)||0)%o;return e._data(this,"lastToggle"+t.guid,r+1),n.preventDefault(),a[r].apply(this,arguments)||!1};for(s.guid=i;a.length>o;)a[o++].guid=i;return this.click(s)},e.fn.live=function(t,n,a){return r("jQuery.fn.live() is deprecated"),T?T.apply(this,arguments):(e(this.context).on(t,this.selector,n,a),this)},e.fn.die=function(t,n){return r("jQuery.fn.die() is deprecated"),M?M.apply(this,arguments):(e(this.context).off(t,this.selector||"**",n),this)},e.event.trigger=function(e,t,n,a){return n||C.test(e)||r("Global events are undocumented and deprecated"),k.call(this,e,t,n||document,a)},e.each(S.split("|"),function(t,n){e.event.special[n]={setup:function(){var t=this;return t!==document&&(e.event.add(document,n+"."+e.guid,function(){e.event.trigger(n,null,t,!0)}),e._data(this,n,e.guid++)),!1},teardown:function(){return this!==document&&e.event.remove(document,n+"."+e._data(this,n)),!1}}})}(jQuery,window);
2 3var stacks = {}; 4stacks.jQuery = jQuery.noConflict(true); 5stacks.com_elixir_stacks_Animagic = {}; 6stacks.com_elixir_stacks_Animagic = (function(stack) { 7var jQuery = stacks.jQuery;var $ = jQuery; 8(function() { 9 var Util, WeakMap, 10 __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; 11 12 Util = (function() { 13 function Util() {} 14 15 Util.prototype.extend = function(custom, defaults) { 16 var key, value; 17 for (key in custom) { 18 value = custom[key]; 19 if (value != null) { 20 defaults[key] = value; 21 } 22 } 23 return defaults; 24 }; 25 26 Util.prototype.isMobile = function(agent) { 27 return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(agent); 28 }; 29 30 return Util; 31 32 })(); 33 34 WeakMap = this.WeakMap || (WeakMap = (function() { 35 function WeakMap() { 36 this.keys = []; 37 this.values = []; 38 } 39 40 WeakMap.prototype.get = function(key) { 41 var i, item, _i, _len, _ref; 42 _ref = this.keys; 43 for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { 44 item = _ref[i]; 45 if (item === key) { 46 return this.values[i]; 47 } 48 } 49 }; 50 51 WeakMap.prototype.set = function(key, value) { 52 var i, item, _i, _len, _ref; 53 _ref = this.keys; 54 for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { 55 item = _ref[i]; 56 if (item === key) { 57 this.values[i] = value; 58 return; 59 } 60 } 61 this.keys.push(key); 62 return this.values.push(value); 63 }; 64 65 return WeakMap; 66 67 })()); 68 69 this.WOW = (function() { 70 WOW.prototype.defaults = { 71 boxClass: 'wow', 72 animateClass: 'animated', 73 offset: 0, 74 mobile: true 75 }; 76 77 function WOW(options) { 78 if (options == null) { 79 options = {}; 80 } 81 this.scrollCallback = __bind(this.scrollCallback, this); 82 this.scrollHandler = __bind(this.scrollHandler, this); 83 this.start = __bind(this.start, this); 84 this.scrolled = true; 85 this.config = this.util().extend(options, this.defaults); 86 this.animationNameCache = new WeakMap(); 87 } 88 89 WOW.prototype.init = function() { 90 var _ref; 91 this.element = window.document.documentElement; 92 if ((_ref = document.readyState) === "interactive" || _ref === "complete") { 93 return this.start(); 94 } else { 95 return document.addEventListener('DOMContentLoaded', this.start); 96 } 97 }; 98 99 WOW.prototype.start = function() { 100 var box, _i, _len, _ref; 101 this.boxes = this.element.getElementsByClassName(this.config.boxClass); 102 if (this.boxes.length) { 103 if (this.disabled()) { 104 return this.resetStyle(); 105 } else { 106 _ref = this.boxes; 107 for (_i = 0, _len = _ref.length; _i < _len; _i++) { 108 box = _ref[_i]; 109 this.applyStyle(box, true); 110 } 111 window.addEventListener('scroll', this.scrollHandler, false); 112 window.addEventListener('resize', this.scrollHandler, false); 113 return this.interval = setInterval(this.scrollCallback, 50); 114 } 115 } 116 }; 117 118 WOW.prototype.stop = function() { 119 window.removeEventListener('scroll', this.scrollHandler, false); 120 window.removeEventListener('resize', this.scrollHandler, false); 121 if (this.interval != null) { 122 return clearInterval(this.interval); 123 } 124 }; 125 126 WOW.prototype.show = function(box) { 127 this.applyStyle(box); 128 return box.className = "" + box.className + " " + this.config.animateClass; 129 }; 130 131 WOW.prototype.applyStyle = function(box, hidden) { 132 var delay, duration, iteration; 133 duration = box.getAttribute('data-wow-duration');
vendor: 4,541 bytes, lines 134-291
134 delay = box.getAttribute('data-wow-delay'); 135 iteration = box.getAttribute('data-wow-iteration'); 136 return this.animate((function(_this) { 137 return function() { 138 return _this.customStyle(box, hidden, duration, delay, iteration); 139 }; 140 })(this)); 141 }; 142 143 WOW.prototype.animate = (function() { 144 if ('requestAnimationFrame' in window) { 145 return function(callback) { 146 return window.requestAnimationFrame(callback); 147 }; 148 } else { 149 return function(callback) { 150 return callback(); 151 }; 152 } 153 })(); 154 155 WOW.prototype.resetStyle = function() { 156 var box, _i, _len, _ref, _results; 157 _ref = this.boxes; 158 _results = []; 159 for (_i = 0, _len = _ref.length; _i < _len; _i++) { 160 box = _ref[_i]; 161 _results.push(box.setAttribute('style', 'visibility: visible;')); 162 } 163 return _results; 164 }; 165 166 WOW.prototype.customStyle = function(box, hidden, duration, delay, iteration) { 167 if (hidden) { 168 this.cacheAnimationName(box); 169 } 170 box.style.visibility = hidden ? 'hidden' : 'visible'; 171 if (duration) { 172 this.vendorSet(box.style, { 173 animationDuration: duration 174 }); 175 } 176 if (delay) { 177 this.vendorSet(box.style, { 178 animationDelay: delay 179 }); 180 } 181 if (iteration) { 182 this.vendorSet(box.style, { 183 animationIterationCount: iteration 184 }); 185 } 186 this.vendorSet(box.style, { 187 animationName: hidden ? 'none' : this.cachedAnimationName(box) 188 }); 189 return box; 190 }; 191 192 WOW.prototype.vendors = ["moz", "webkit"]; 193 194 WOW.prototype.vendorSet = function(elem, properties) { 195 var name, value, vendor, _results; 196 _results = []; 197 for (name in properties) { 198 value = properties[name]; 199 elem["" + name] = value; 200 _results.push((function() { 201 var _i, _len, _ref, _results1; 202 _ref = this.vendors; 203 _results1 = []; 204 for (_i = 0, _len = _ref.length; _i < _len; _i++) { 205 vendor = _ref[_i]; 206 _results1.push(elem["" + vendor + (name.charAt(0).toUpperCase()) + (name.substr(1))] = value); 207 } 208 return _results1; 209 }).call(this)); 210 } 211 return _results; 212 }; 213 214 WOW.prototype.vendorCSS = function(elem, property) { 215 var result, style, vendor, _i, _len, _ref; 216 style = window.getComputedStyle(elem); 217 result = style.getPropertyCSSValue(property); 218 _ref = this.vendors; 219 for (_i = 0, _len = _ref.length; _i < _len; _i++) { 220 vendor = _ref[_i]; 221 result = result || style.getPropertyCSSValue("-" + vendor + "-" + property); 222 } 223 return result; 224 }; 225 226 WOW.prototype.animationName = function(box) { 227 var animationName; 228 try { 229 animationName = this.vendorCSS(box, 'animation-name').cssText; 230 } catch (_error) { 231 animationName = window.getComputedStyle(box).getPropertyValue('animation-name'); 232 } 233 if (animationName === 'none') { 234 return ''; 235 } else { 236 return animationName; 237 } 238 }; 239 240 WOW.prototype.cacheAnimationName = function(box) { 241 return this.animationNameCache.set(box, this.animationName(box)); 242 }; 243 244 WOW.prototype.cachedAnimationName = function(box) { 245 return this.animationNameCache.get(box); 246 }; 247 248 WOW.prototype.scrollHandler = function() { 249 return this.scrolled = true; 250 }; 251 252 WOW.prototype.scrollCallback = function() { 253 var box; 254 if (this.scrolled) { 255 this.scrolled = false; 256 this.boxes = (function() { 257 var _i, _len, _ref, _results; 258 _ref = this.boxes; 259 _results = []; 260 for (_i = 0, _len = _ref.length; _i < _len; _i++) { 261 box = _ref[_i]; 262 if (!(box)) { 263 continue; 264 } 265 if (this.isVisible(box)) { 266 this.show(box); 267 continue; 268 } 269 _results.push(box); 270 } 271 return _results; 272 }).call(this); 273 if (!this.boxes.length) { 274 return this.stop(); 275 } 276 } 277 }; 278 279 WOW.prototype.offsetTop = function(element) { 280 var top; 281 while (element.offsetTop === void 0) { 282 element = element.parentNode; 283 } 284 top = element.offsetTop; 285 while (element = element.offsetParent) { 286 top += element.offsetTop; 287 } 288 return top; 289 }; 290 291 WOW.prototype.isVisible = function(box) {
292 var bottom, offset, top, viewBottom, viewTop; 293 offset = box.getAttribute('data-wow-offset') || this.config.offset; 294 viewTop = window.pageYOffset; 295 viewBottom = viewTop + this.element.clientHeight - offset; 296 top = this.offsetTop(box); 297 bottom = top + box.clientHeight; 298 return top <= viewBottom && bottom >= viewTop; 299 }; 300 301 WOW.prototype.util = function() { 302 return this._util || (this._util = new Util()); 303 }; 304 305 WOW.prototype.disabled = function() { 306 return !this.config.mobile && this.util().isMobile(navigator.userAgent); 307 }; 308 309 return WOW; 310 311 })(); 312 313}).call(this); 314 315 316 317$(window).load(function(){ 318 new WOW().init(); 319}); 320 321return stack;})(stacks.com_elixir_stacks_Animagic); 322stacks.com_stacks4stacks_stacks_topbox4 = {}; 323stacks.com_stacks4stacks_stacks_topbox4 = (function(stack) { 324var jQuery = stacks.jQuery;var $ = jQuery;/** 325* Cookie plugin 326* 327* Copyright (c) 2006 Klaus Hartl (stilbuero.de) 328* Dual licensed under the MIT and GPL licenses: 329* http://www.opensource.org/licenses/mit-license.php 330* http://www.gnu.org/licenses/gpl.html 331* 332*/ 333 334/** 335* Create a cookie with the given name and value and other optional parameters. 336* 337* @example $.cookie('the_cookie', 'the_value'); 338* @desc Set the value of a cookie. 339* @example $.cookie('the_cookie', 'the_value', { expires: 7, path: '/', domain: 'jquery.com', secure: true }); 340* @desc Create a cookie with all available options. 341* @example $.cookie('the_cookie', 'the_value'); 342* @desc Create a session cookie. 343* @example $.cookie('the_cookie', null); 344* @desc Delete a cookie by passing null as value. Keep in mind that you have to use the same path and domain 345* used when the cookie was set. 346* 347* @param String name The name of the cookie. 348* @param String value The value of the cookie. 349* @param Object options An object literal containing key/value pairs to provide optional cookie attributes. 350* @option Number|Date expires Either an integer specifying the expiration date from now on in days or a Date object. 351* If a negative value is specified (e.g. a date in the past), the cookie will be deleted. 352* If set to null or omitted, the cookie will be a session cookie and will not be retained 353* when the the browser exits. 354* @option String path The value of the path atribute of the cookie (default: path of page that created the cookie). 355* @option String domain The value of the domain attribute of the cookie (default: domain of page that created the cookie). 356* @option Boolean secure If true, the secure attribute of the cookie will be set and the cookie transmission will 357* require a secure protocol (like HTTPS). 358* @type undefined 359* 360* @name $.cookie 361* @cat Plugins/Cookie 362* @author Klaus Hartl/[email protected] 363*/ 364 365/** 366* Get the value of a cookie with the given name. 367* 368* @example $.cookie('the_cookie'); 369* @desc Get the value of a cookie. 370* 371* @param String name The name of the cookie. 372* @return The value of the cookie. 373* @type String 374* 375* @name $.cookie 376* @cat Plugins/Cookie 377* @author Klaus Hartl/[email protected] 378*/ 379jQuery.cookie = function(name, value, options) { 380 if (typeof value != 'undefined') { // name and value given, set cookie 381 options = options || {}; 382 if (value === null) { 383 value = ''; 384 options.expires = -1; 385 } 386 var expires = ''; 387 if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) { 388 var date; 389 if (typeof options.expires == 'number') { 390 date = new Date(); 391 date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000)); 392 } else { 393 date = options.expires; 394 } 395 expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE 396 } 397 // CAUTION: Needed to parenthesize options.path and options.domain 398 // in the following expressions, otherwise they evaluate to undefined 399 // in the packed version for some reason... 400 var path = options.path ? '; path=' + (options.path) : ''; 401 var domain = options.domain ? '; domain=' + (options.domain) : ''; 402 var secure = options.secure ? '; secure' : ''; 403 document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join(''); 404 } else { // only name given, get cookie 405 var cookieValue = null; 406 if (document.cookie && document.cookie != '') { 407 var cookies = document.cookie.split(';'); 408 for (var i = 0; i < cookies.length; i++) { 409 var cookie = jQuery.trim(cookies[i]); 410 // Does this cookie string begin with the name we want? 411 if (cookie.substring(0, name.length + 1) == (name + '=')) { 412 cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); 413 break; 414 } 415 } 416 } 417 return cookieValue; 418 } 419 }; 420 421
422/* 423 * Nivo Lightbox v1.3.1 424 * http://dev7studios.com/nivo-lightbox 425 * 426 * Copyright 2013, Dev7studios 427 * Free to use and abuse under the MIT license. 428 * http://www.opensource.org/licenses/mit-license.php 429 */ 430 431;(function($, window, document, undefined){ 432 433 var pluginName = 'nivoLightbox', 434 defaults = { 435 effect: 'fade', 436 theme: 'default', 437 keyboardNav: true, 438 clickImgToClose: false, 439 clickOverlayToClose: true, 440 onInit: function(){}, 441 beforeShowLightbox: function(){}, 442 afterShowLightbox: function(lightbox){}, 443 beforeHideLightbox: function(){}, 444 afterHideLightbox: function(){}, 445 beforePrev: function(element){}, 446 onPrev: function(element){}, 447 beforeNext: function(element){}, 448 onNext: function(element){}, 449 errorMessage: 'The requested content cannot be loaded. Please try again later.' 450 }; 451 452 function NivoLightbox(element, options){ 453 this.el = element; 454 this.$el = $(this.el); 455 456 this.options = $.extend({}, defaults, options); 457 458 this._defaults = defaults; 459 this._name = pluginName; 460 461 this.init(); 462 } 463 464 NivoLightbox.prototype = { 465 466 init: function(){ 467 var $this = this; 468 469 // Need this so we don't use CSS transitions in mobile 470 if(!$('html').hasClass('nivo-lightbox-notouch')) $('html').addClass('nivo-lightbox-notouch'); 471 if('ontouchstart' in document) $('html').removeClass('nivo-lightbox-notouch'); 472 473 // Setup the click 474 this.$el.on('click', function(e){ 475 $this.showLightbox(e); 476 }); 477 478 // keyboardNav 479 if(this.options.keyboardNav){ 480 $('body').off('keyup').on('keyup', function(e){ 481 var code = (e.keyCode ? e.keyCode : e.which); 482 // Escape 483 if(code == 27) $this.destructLightbox(); 484 // Left 485 if(code == 37) $('.nivo-lightbox-prev').trigger('click'); 486 // Right 487 if(code == 39) $('.nivo-lightbox-next').trigger('click'); 488 }); 489 } 490 491 this.options.onInit.call(this); 492 493 }, 494 495 showLightbox: function(e){ 496 var $this = this, 497 currentLink = this.$el; 498 499 // Check content 500 var check = this.checkContent(currentLink); 501 if(!check) return; 502 503 e.preventDefault(); 504 this.options.beforeShowLightbox.call(this); 505 var lightbox = this.constructLightbox(); 506 if(!lightbox) return; 507 var content = lightbox.find('.nivo-lightbox-content'); 508 if(!content) return; 509 510 $('body').addClass('nivo-lightbox-body-effect-'+ this.options.effect); 511 512 this.processContent( content, currentLink ); 513 514 // Nav 515 if(this.$el.attr('data-lightbox-gallery')){ 516 var galleryItems = $('[data-lightbox-gallery="'+ this.$el.attr('data-lightbox-gallery') +'"]'); 517 518 $('.nivo-lightbox-nav').show(); 519 520 // Prev 521 $('.nivo-lightbox-prev').off('click').on('click', function(e){ 522 e.preventDefault(); 523 var index = galleryItems.index(currentLink); 524 currentLink = galleryItems.eq(index - 1); 525 if(!$(currentLink).length) currentLink = galleryItems.last(); 526 $.when($this.options.beforePrev.call(this, [ currentLink ])).done(function(){ 527 $this.processContent(content, currentLink); 528 $this.options.onPrev.call(this, [ currentLink ]); 529 }); 530 }); 531 532 // Next 533 $('.nivo-lightbox-next').off('click').on('click', function(e){ 534 e.preventDefault(); 535 var index = galleryItems.index(currentLink); 536 currentLink = galleryItems.eq(index + 1); 537 if(!$(currentLink).length) currentLink = galleryItems.first(); 538 $.when($this.options.beforeNext.call(this, [ currentLink ])).done(function(){ 539 $this.processContent(content, currentLink); 540 $this.options.onNext.call(this, [ currentLink ]); 541 }); 542 }); 543 } 544 545 setTimeout(function(){ 546 lightbox.addClass('nivo-lightbox-open'); 547 $this.options.afterShowLightbox.call(this, [ lightbox ]); 548 }, 1); // For CSS transitions 549 }, 550 551 checkContent: function( link ) { 552 var $this = this, 553 href = link.attr('href'), 554 video = href.match(/(youtube|youtube-nocookie|youtu|vimeo)\.(com|be)\/(watch\?v=([\w-]+)|([\w-]+))/); 555 556 if(href.match(/\.(jpeg|jpg|gif|png)$/i) !== null){ 557 return true; 558 } 559 // HTML5 Audio 560 else if(link.attr('data-lightbox-type') == 'html5audio'){ 561 return true; 562 } 563 // HTML5 Video 564 else if(link.attr('data-lightbox-type') == 'html5video'){ 565 return true; 566 } 567 // Video (Youtube/Vimeo) 568 else if(video){ 569 return true; 570 } 571 // AJAX 572 else if(link.attr('data-lightbox-type') == 'ajax'){ 573 return true; 574 } 575 // Inline HTML 576 else if(href.substring(0, 1) == '#' && link.attr('data-lightbox-type') == 'inline'){ 577 return true; 578 } 579 // iFrame (default) 580 else if(link.attr('data-lightbox-type') == 'iframe'){ 581 return true; 582 } 583 584 return false;
585 }, 586 587 processContent: function(content, link){ 588 var $this = this, 589 href = link.attr('href'), 590 video = href.match(/(youtube|youtube-nocookie|youtu|vimeo)\.(com|be)\/(watch\?v=([\w-]+)|([\w-]+))/); 591 592 content.html('').addClass('nivo-lightbox-loading'); 593 594 // Is HiDPI? 595 if(this.isHidpi() && link.attr('data-lightbox-hidpi')){ 596 href = link.attr('data-lightbox-hidpi'); 597 } 598 599 // Image 600 if(href.match(/\.(jpeg|jpg|gif|png)$/i) !== null){ 601 var img = $('<img>', { src: href, 'class': 'nivo-lightbox-image-display' }); 602 img.one('load', function() { 603 var wrap = $('<div class="nivo-lightbox-image" />'); 604 wrap.append(img); 605 content.html(wrap).removeClass('nivo-lightbox-loading'); 606 607 // Vertically center images 608 wrap.css({ 609 'line-height': $('.nivo-lightbox-content').height() +'px', 610 'height': $('.nivo-lightbox-content').height() +'px' // For Firefox 611 }); 612 $(window).resize(function() { 613 wrap.css({ 614 'line-height': $('.nivo-lightbox-content').height() +'px', 615 'height': $('.nivo-lightbox-content').height() +'px' // For Firefox 616 }); 617 }); 618 }).each(function() { 619 if(this.complete) $(this).load(); 620 }); 621 622 img.error(function() { 623 var wrap = $('<div class="nivo-lightbox-error"><p>'+ $this.options.errorMessage +'</p></div>'); 624 content.html(wrap).removeClass('nivo-lightbox-loading'); 625 }); 626 } 627 628 // Video (Youtube/Vimeo) 629 else if(video){ 630 var src = '', 631 classTerm = 'nivo-lightbox-video'; 632 633 if(video[1] == 'youtube'){ 634 src = 'https://www.youtube.com/embed/'+ video[4]+'?autoplay=1&rel=0'; 635 classTerm = 'nivo-lightbox-youtube'; 636 } 637 if(video[1] == 'youtube-nocookie'){ 638 src = href; //https://www.youtube-nocookie.com/embed/... 639 classTerm = 'nivo-lightbox-youtube'; 640 } 641 if(video[1] == 'youtu'){ 642 src = 'https://www.youtube.com/embed/'+ video[3]+'?autoplay=1&rel=0'; 643 classTerm = 'nivo-lightbox-youtube'; 644 } 645 if(video[1] == 'vimeo'){ 646 src = 'https://player.vimeo.com/video/'+ video[3]+'?autoplay=1&rel=0&playsinline=0'; 647 classTerm = 'nivo-lightbox-vimeo'; 648 } 649 650 if(src){ 651 var iframeVideo = $('<iframe>', { 652 src: src, 653 'class': classTerm, 654 frameborder: 0, 655 vspace: 0, 656 hspace: 0, 657 scrolling: 'auto', 658 allowfullscreen: 'true' 659 }); 660 content.html(iframeVideo); 661 iframeVideo.load(function(){ content.removeClass('nivo-lightbox-loading'); }); 662 } 663 } 664 // AJAX 665 else if(link.attr('data-lightbox-type') == 'ajax'){ 666 $.ajax({ 667 url: href, 668 cache: false, 669 success: function(data) { 670 var wrap = $('<div class="nivo-lightbox-ajax" />'); 671 wrap.append(data); 672 content.html(wrap).removeClass('nivo-lightbox-loading'); 673 674 // Vertically center html 675 if(wrap.outerHeight() < content.height()){ 676 wrap.css({ 677 'position': 'relative', 678 'top': '50%', 679 'margin-top': -(wrap.outerHeight()/2) +'px' 680 }); 681 } 682 $(window).resize(function() { 683 if(wrap.outerHeight() < content.height()){ 684 wrap.css({ 685 'position': 'relative', 686 'top': '50%', 687 'margin-top': -(wrap.outerHeight()/2) +'px' 688 }); 689 } 690 }); 691 }, 692 error: function(){ 693 var wrap = $('<div class="nivo-lightbox-error"><p>'+ $this.options.errorMessage +'</p></div>'); 694 content.html(wrap).removeClass('nivo-lightbox-loading'); 695 } 696 }); 697 } 698 // Inline HTML 699 else if(href.substring(0, 1) == '#' && link.attr('data-lightbox-type') == 'inline'){ 700 if($(href).length){ 701 var wrap = $('<div class="nivo-lightbox-inline" />'); 702 wrap.append($(href).clone().show()); 703 content.html(wrap).removeClass('nivo-lightbox-loading'); 704 705 // Vertically center html 706 if(wrap.outerHeight() < content.height()){ 707 wrap.css({ 708 'position': 'relative', 709 'top': '50%', 710 'margin-top': -(wrap.outerHeight()/2) +'px' 711 }); 712 } 713 $(window).resize(function() { 714 if(wrap.outerHeight() < content.height()){ 715 wrap.css({ 716 'position': 'relative', 717 'top': '50%', 718 'margin-top': -(wrap.outerHeight()/2) +'px' 719 }); 720 } 721 }); 722 } else { 723 var wrapError = $('<div class="nivo-lightbox-error"><p>'+ $this.options.errorMessage +'</p></div>'); 724 content.html(wrapError).removeClass('nivo-lightbox-loading'); 725 } 726 } 727 728 // HTML5 audio 729 else if(link.attr('data-lightbox-type') == 'html5audio'){ 730 var vidframe = $('<audio>', { 731 src: href, 732 'class': 'nivo-lightbox-html5audio', 733 'controls': 'true', 734 'playsinline': 'true', 735 'preload': 'auto', 736 'autoplay': 'true' 737 }); 738 content.html(vidframe); 739 vidframe.load(function(){ content.removeClass('nivo-lightbox-loading'); }); 740 } 741 742 // HTML5 video 743 else if(link.attr('data-lightbox-type') == 'html5video'){ 744 var vidframe = $('<video>', { 745 src: href, 746 'class': 'nivo-lightbox-html5video', 747 'controls': 'true', 748 'playsinline': 'true', 749 'preload': 'auto', 750 'autoplay': 'true' 751 }); 752 content.html(vidframe); 753 vidframe.load(function(){ content.removeClass('nivo-lightbox-loading'); }); 754 } 755 756 // iFrame (default) 757 else if(link.attr('data-lightbox-type') == 'iframe'){ 758 var iframe = $('<iframe>', { 759 src: href, 760 'class': 'nivo-lightbox-item', 761 frameborder: 0, 762 vspace: 0, 763 hspace: 0, 764 scrolling: 'auto' 765 }); 766 content.html(iframe); 767 iframe.load(function(){ content.removeClass('nivo-lightbox-loading'); }); 768 } else { 769 return false;
770 } 771 772 // Set the title 773 if(link.attr('title')){ 774 var titleWrap = $('<span>', { 'class': 'nivo-lightbox-title' }); 775 titleWrap.text(link.attr('title')); 776 $('.nivo-lightbox-title-wrap').html(titleWrap); 777 } else { 778 $('.nivo-lightbox-title-wrap').html(''); 779 } 780 }, 781 782 constructLightbox: function(){ 783 if($('.nivo-lightbox-overlay').length) return $('.nivo-lightbox-overlay'); 784 785 var overlay = $('<div>', { 'class': 'nivo-lightbox-overlay nivo-lightbox-theme-'+ this.options.theme +' nivo-lightbox-effect-'+ this.options.effect }); 786 var wrap = $('<div>', { 'class': 'nivo-lightbox-wrap' }); 787 var content = $('<div>', { 'class': 'nivo-lightbox-content' }); 788 var nav = $('<a href="#" class="nivo-lightbox-nav nivo-lightbox-prev"><i class="fa fa-chevron-left"></i></a><a href="#" class="nivo-lightbox-nav nivo-lightbox-next"><i class="fa fa-chevron-right"></i></a>'); 789 var close = $('<a href="#" class="nivo-lightbox-close" title="Close">Close</a>'); 790 var title = $('<div>', { 'class': 'nivo-lightbox-title-wrap' }); 791 792 var isMSIE = /*@cc_on!@*/0; 793 if(isMSIE) overlay.addClass('nivo-lightbox-ie'); 794 795 wrap.append(content); 796 wrap.append(title); 797 overlay.append(wrap); 798 overlay.append(nav); 799 overlay.append(close); 800 $('body').append(overlay); 801 802 var $this = this; 803 if($this.options.clickOverlayToClose){ 804 overlay.on('click', function(e){ 805 if(e.target === this || $(e.target).hasClass('nivo-lightbox-content') || $(e.target).hasClass('nivo-lightbox-image')){ 806 $this.destructLightbox(); 807 } 808 }); 809 } 810 if($this.options.clickImgToClose){ 811 overlay.on('click', function(e){ 812 if(e.target === this || $(e.target).hasClass('nivo-lightbox-image-display')){ 813 $this.destructLightbox(); 814 } 815 }); 816 } 817 818 close.on('click', function(e){ 819 e.preventDefault(); 820 $this.destructLightbox(); 821 }); 822 823 return overlay; 824 }, 825 826 destructLightbox: function(){ 827 var $this = this; 828 this.options.beforeHideLightbox.call(this); 829 830 $('.nivo-lightbox-overlay').removeClass('nivo-lightbox-open'); 831 $('.nivo-lightbox-nav').hide(); 832 $('body').removeClass('nivo-lightbox-body-effect-'+ $this.options.effect); 833 834 // For IE 835 var isMSIE = /*@cc_on!@*/0; 836 if(isMSIE){ 837 $('.nivo-lightbox-overlay iframe').attr("src", " "); 838 $('.nivo-lightbox-overlay iframe').remove(); 839 } 840 841 // Remove click handlers 842 $('.nivo-lightbox-prev').off('click'); 843 $('.nivo-lightbox-next').off('click'); 844 845 // Empty content (for videos) 846 $('.nivo-lightbox-content').empty(); 847 848 this.options.afterHideLightbox.call(this); 849 }, 850 851 isHidpi: function(){ 852 var mediaQuery = "(-webkit-min-device-pixel-ratio: 1.5),\ 853 (min--moz-device-pixel-ratio: 1.5),\ 854 (-o-min-device-pixel-ratio: 3/2),\ 855 (min-resolution: 1.5dppx)"; 856 if(window.devicePixelRatio > 1) return true; 857 if(window.matchMedia && window.matchMedia(mediaQuery).matches) return true; 858 return false; 859 } 860 861 }; 862 863 $.fn[pluginName] = function(options){ 864 return this.each(function(){ 865 if(!$.data(this, pluginName)){ 866 $.data(this, pluginName, new NivoLightbox(this, options)); 867 } 868 }); 869 }; 870 871})(jQuery, window, document); 872 873 874 875/* 876WHW changes 877- Replace '<a href="#" class="nivo-lightbox-nav nivo-lightbox-prev">Previous</a>' with '<a href="#" class="nivo-lightbox-nav nivo-lightbox-prev"><i class="fa fa-chevron-left"></i></a>' 878- Replace '<a href="#" class="nivo-lightbox-nav nivo-lightbox-next">Next</a>' with '<a href="#" class="nivo-lightbox-nav nivo-lightbox-next"><i class="fa fa-chevron-right"></i></a>' 879- Replace '<a href="#" class="nivo-lightbox-close" title="Close">Close</a>' with '<a href="#" class="nivo-lightbox-close"></a>' 880- Replace 'http://player.vimeo.com' with 'https://player.vimeo.com' 881- Replace 'http://www.youtube.com/embed/' with 'https://www.youtube.com/embed/' 882- Replace '[4]' with '[4]+'?autoplay=1&rel=0'' 883- Replace '[3]' with '[3]+'?autoplay=1&rel=0'' 884- Replace 'scrolling:"auto"' with 'scrolling:"auto",allowfullscreen:"true"' 885*/ 886 887return stack;})(stacks.com_stacks4stacks_stacks_topbox4); 888stacks.com_bigwhiteduck_stacks_headerpro = {}; 889stacks.com_bigwhiteduck_stacks_headerpro = (function(stack) { 890var jQuery = stacks.jQuery;var $ = jQuery; var elements=document.getElementsByClassName('hp-slice');while(elements.length>0){elements[0].parentNode.removeChild(elements[0]);} 891 892return stack;})(stacks.com_bigwhiteduck_stacks_headerpro); 893stacks.stacks_in_662 = {}; 894stacks.stacks_in_662 = (function(stack) { 895var jQuery = stacks.jQuery;var $ = jQuery;$(window).load(function(){ 896 $('#topBoxTriggerstacks_in_662').nivoLightbox({ 897 effect: 'fade', 898 theme: 'default', 899 keyboardNav: true, 900 clickImgToClose: false, 901 clickOverlayToClose: true, 902 onInit: function(){ 903 904 }, 905 beforeShowLightbox: function(){ 906 907 }, 908 afterShowLightbox: function(){ 909 $('.nivo-lightbox-close').html('<i class="fa fa-times"></i>'); 910 $('.nivo-lightbox-prev').html('<i class="fa fa-chevron-left"></i>'); 911 $('.nivo-lightbox-next').html('<i class="fa fa-chevron-right"></i>'); 912 913 // Close a TopBox by clicking a custom close button 914 $(".topBoxClose, .closeTopBox").click(function(){ 915 $('.nivo-lightbox-close').trigger('click'); 916 }); 917 918 919 }, 920 afterHideLightbox: function(){ 921 922 923 924 925 926 }, 927 onPrev: function(element){ 928 929 }, 930 onNext: function(element){ 931 932 }, 933 errorMessage: 'The requested content cannot be loaded. Please try again later.' // Error message when content can't be loaded 934 }); 935 936 937 938 // If auto open is enabled 939 940 941 // Custom triggers 942 $(".myTopBox_Map").click(function(event){ 943 event.preventDefault(); 944 $('#topBoxTriggerstacks_in_662').trigger('click'); 945 }); 946}); 947return stack;})(stacks.stacks_in_662); 948stacks.stacks_in_682 = {}; 949stacks.stacks_in_682 = (function(stack) { 950var jQuery = stacks.jQuery;var $ = jQuery;$(document).ready(function() { 951 $("#stacks_in_682").closest(".stacks_out").css("overflow", "visible"); 952 $("#stacks_in_682").closest(".stacks_in").css("overflow", "visible");
953 if(!(/Android|iPhone|iPad|iPod|BlackBerry|Windows Phone/i).test(navigator.userAgent || navigator.vendor || window.opera)){ 954 $(".stacks_top").css("overflow", "visible"); 955 } 956 957// 958// Disable animation on mobile devices if the user opts for it ... 959// 960 961 if((/Android|iPhone|iPad|iPod|BlackBerry|Windows Phone/i).test(navigator.userAgent || navigator.vendor || window.opera)){ 962 $("#stacks_in_682 > .wow").removeAttr('class').removeAttr('data-wow-duration').removeAttr('data-wow-delay').removeAttr(' data-wow-offset').removeAttr('data-wow-iteration'); 963 } 964}); 965 966 967return stack;})(stacks.stacks_in_682); 968stacks.stacks_in_559 = {}; 969stacks.stacks_in_559 = (function(stack) { 970var jQuery = stacks.jQuery;var $ = jQuery;// This javascript will be created for each instance of our stack 971 972$(document).ready(function() { 973 974 975 // Helpers 976 var url = window.location; 977 var img = $('#imageWizardstacks_in_559 img').attr('src'); 978 var alt = $('#imageWizardstacks_in_559 img').attr('alt'); 979 980 // Pinterest helper 981 $("#socialButtonsstacks_in_559 .pinterestHelper").click(function(e){ 982 e.preventDefault(); 983 window.open('http://pinterest.com/pin/create/button/?url='+url+img+'&media='+url+img+'&description='+alt); 984 }); 985 986}); 987 988return stack;})(stacks.stacks_in_559); 989stacks.stacks_in_684 = {}; 990stacks.stacks_in_684 = (function(stack) { 991var jQuery = stacks.jQuery;var $ = jQuery;$(document).ready(function() { 992 $("#stacks_in_684").closest(".stacks_out").css("overflow", "visible"); 993 $("#stacks_in_684").closest(".stacks_in").css("overflow", "visible"); 994 if(!(/Android|iPhone|iPad|iPod|BlackBerry|Windows Phone/i).test(navigator.userAgent || navigator.vendor || window.opera)){ 995 $(".stacks_top").css("overflow", "visible"); 996 } 997 998// 999// Disable animation on mobile devices if the user opts for it ... 1000// 1001 1002 if((/Android|iPhone|iPad|iPod|BlackBerry|Windows Phone/i).test(navigator.userAgent || navigator.vendor || window.opera)){ 1003 $("#stacks_in_684 > .wow").removeAttr('class').removeAttr('data-wow-duration').removeAttr('data-wow-delay').removeAttr(' data-wow-offset').removeAttr('data-wow-iteration'); 1004 } 1005}); 1006 1007 1008return stack;})(stacks.stacks_in_684); 1009stacks.stacks_in_231 = {}; 1010stacks.stacks_in_231 = (function(stack) { 1011var jQuery = stacks.jQuery;var $ = jQuery;// This javascript will be created for each instance of our stack 1012 1013$(document).ready(function() { 1014 1015 1016 // Helpers 1017 var url = window.location; 1018 var img = $('#imageWizardstacks_in_231 img').attr('src'); 1019 var alt = $('#imageWizardstacks_in_231 img').attr('alt'); 1020 1021 // Pinterest helper 1022 $("#socialButtonsstacks_in_231 .pinterestHelper").click(function(e){ 1023 e.preventDefault(); 1024 window.open('http://pinterest.com/pin/create/button/?url='+url+img+'&media='+url+img+'&description='+alt); 1025 }); 1026 1027}); 1028 1029return stack;})(stacks.stacks_in_231); 1030stacks.stacks_in_883 = {}; 1031stacks.stacks_in_883 = (function(stack) { 1032var jQuery = stacks.jQuery;var $ = jQuery;let TimedContentstacks_in_883 = {}; 1033TimedContentstacks_in_883.init = function() { 1034 1035 //Inline countdown 1036 $("#stacks_in_883 countdown").replaceWith($("#stacks_in_883 .timed-content-countdown-wrap")); 1037 1038 this.timedContentTime = [ 1039 ['Year',null], 1040 ['Month',null], 1041 ['Day',null], 1042 ['Hour',null], 1043 ['Minute',null], 1044 ['Second',null] 1045 ]; 1046 this.nowDate = new Date(), 1047 this.daysOfWeek = [], 1048 this.countWeek = [], 1049 this.contentBefore = $("#stacks_in_883 .timed-content-before").clone(), 1050 this.contentDuring = $("#stacks_in_883 .timed-content-during").clone(), 1051 this.contentAfter = $("#stacks_in_883 .timed-content-after").clone(), 1052 this.isLocal = false;
1053 1054 //Add padding to elements that have greater than 2 digits 1055 if(this.timedContentTime.length < 6) { 1056 $("#stacks_in_883 .timed-content-countdown ."+this.timedContentTime[0][0].toLowerCase()).addClass("tc-digit-padding"); 1057 } 1058 1059 this.tcTimeZone = 'America/Chicago'; 1060 this.tcTimeZone = this.tcTimeZone.replace(/\s/g,''); 1061 // 1062 try { 1063 new Date(this.nowDate.toLocaleString('en-US', { timeZone: this.tcTimeZone })); 1064 } catch (e) { 1065 $("#stacks_in_883 .timed-content-wrap").attr("data-timezone","invalid: " + this.tcTimeZone); 1066 $("#stacks_in_883 .timed-content-wrap").addClass("invalid-timezone"); 1067 this.isLocal = true; 1068 console.log(e); 1069 } 1070 // 1071 // 1072 1073 this.localDate = new Date(); 1074 if(!this.isLocal) { 1075 this.localDate = toTzNow(this.localDate,this.tcTimeZone); 1076 } 1077 1078 this.startDate = dateTimeUtc('2020-08-09T04:00:00CDT', this.isLocal), 1079 this.endDate = dateTimeUtc('9999-08-09T15:30:00CDT', this.isLocal), 1080 this.initDate = dateTimeUtc('2020-08-09T04:00:00CDT', this.isLocal); 1081 1082 // 1083 // 1084 // 1085 // 1086 // 1087 // 1088 this.daysOfWeek.push(0); 1089 // 1090 // 1091 // 1092 // 1093 // 1094 // 1095 // 1096 this.daysOfWeek.push(6); 1097 // 1098 // 1099 // 1100 //Repeat weekly 1101 $("#stacks_in_883 .timed-content-wrap").attr("data-repeat","every week"); 1102 this.today = dateFns[`getDay`](this.localDate), 1103 this.startTime = dailyTime('2020-08-09T04:00:00CDT',this.isLocal), 1104 this.stopTime = dailyTime('9999-08-09T15:30:00CDT',this.isLocal); 1105 if(!this.daysOfWeek.includes(this.today)) { 1106 this.startTime = daysTillNext(this.today,this.daysOfWeek,this.startTime); 1107 this.hasStopped = -1; 1108 } 1109 // 1110 // 1111 1112 if(!this.isLocal) { 1113 $("#stacks_in_883 .timed-content-wrap").attr("data-timezone",this.tcTimeZone); 1114 this.startDate = convertToTimeZone(this.startDate,this.tcTimeZone), 1115 this.endDate = convertToTimeZone(this.endDate,this.tcTimeZone), 1116 this.initDate = convertToTimeZone(this.initDate,this.tcTimeZone); 1117 this.startTime = convertToTimeZone(this.startTime,this.tcTimeZone); 1118 this.stopTime = convertToTimeZone(this.stopTime,this.tcTimeZone); 1119 } else { 1120 $("#stacks_in_883 .tc-details.timed-content-wrap .tc-timezone-notice").html(Intl.DateTimeFormat().resolvedOptions().timeZone); 1121 } 1122 // 1123 this.hasInitialized = this.startDate.getTime() - this.nowDate.getTime(), 1124 this.hasStarted = this.startTime.getTime() - this.nowDate.getTime(), 1125 this.hasStopped = this.stopTime.getTime() - this.nowDate.getTime(), 1126 this.hasEnded = this.endDate.getTime() - this.nowDate.getTime(); 1127 1128 if(this.hasEnded < 0 || this.daysOfWeek.length == 0) { 1129 //After 1130 $("#stacks_in_883 .timed-content-before,#stacks_in_883 .timed-content-during, #stacks_in_883 .timed-content-countdown-wrap").remove(); 1131 $("#stacks_in_883 .timed-content-wrap").addClass("tc-loaded"); 1132 } else if (this.hasStarted < 0 && this.hasStopped > 0 && this.hasInitialized < 0) { 1133 //During 1134 $("#stacks_in_883 .timed-content-before,#stacks_in_883 .timed-content-after").remove(); 1135 timedContentStartCountDown("stacks_in_883","default","False",this.initDate,this.startTime,this.stopTime,this.endDate,"repeat-before","stop",this.contentBefore,this.contentDuring,this.contentAfter,this.timedContentTime,this.daysOfWeek,this.countWeek,'False','False',this.localDate); 1136 } else if (this.hasStarted < 0 && this.hasStopped < 0 && this.hasInitialized < 0) { 1137 //Before 1138 $("#stacks_in_883 .timed-content-during,#stacks_in_883 .timed-content-after").remove(); 1139 timedContentStartCountDown("stacks_in_883","default","False",this.initDate,this.startTime,this.stopTime,this.endDate,"repeat-during","start-loop",this.contentBefore,this.contentDuring,this.contentAfter,this.timedContentTime,this.daysOfWeek,this.countWeek,'False','False',this.localDate); 1140 } else { 1141 //Before 1142 $("#stacks_in_883 .timed-content-during,#stacks_in_883 .timed-content-after").remove(); 1143 timedContentStartCountDown("stacks_in_883","default","False",this.initDate,this.startTime,this.stopTime,this.endDate,"repeat-during","start",this.contentBefore,this.contentDuring,this.contentAfter,this.timedContentTime,this.daysOfWeek,this.countWeek,'False','False',this.localDate); 1144 } 1145 // 1146 1147 // 1148 $("#stacks_in_883 .timed-content-wrap").attr("data-init",this.initDate.toString()); 1149 $("#stacks_in_883 .timed-content-wrap").attr("data-current-start",this.startTime.toString()); 1150 $("#stacks_in_883 .timed-content-wrap").attr("data-current-stop",this.stopTime.toString()); 1151 // 1152 $("#stacks_in_883 .timed-content-wrap").attr("data-end",this.endDate.toString()); 1153 $("#stacks_in_883 .timed-content-wrap").attr("data-now",this.nowDate.toString()); 1154} 1155$(document).ready(function() {
1156 TimedContentstacks_in_883.init(); 1157}); 1158 1159return stack;})(stacks.stacks_in_883); 1160stacks.stacks_in_739 = {}; 1161stacks.stacks_in_739 = (function(stack) { 1162var jQuery = stacks.jQuery;var $ = jQuery; 1163( function($) { 1164 1165 $.easytabs = function(container, options) { 1166 1167 // Attach to plugin anything that should be available via 1168 // the $container.data('easytabs') object 1169 var plugin = this, 1170 $container = $(container), 1171 1172 defaults = { 1173 animate: true, 1174 panelActiveClass: "active", 1175 tabActiveClass: "active", 1176 defaultTab: "li:first-child", 1177 animationSpeed: "normal", 1178 tabs: "> ul > li", 1179 updateHash: true, 1180 cycle: false, 1181 collapsible: false, 1182 collapsedClass: "collapsed", 1183 collapsedByDefault: true, 1184 uiTabs: false, 1185 transitionIn: 'fadeIn', 1186 transitionOut: 'fadeOut', 1187 transitionInEasing: 'swing', 1188 transitionOutEasing: 'swing', 1189 transitionCollapse: 'slideUp', 1190 transitionUncollapse: 'slideDown', 1191 transitionCollapseEasing: 'swing', 1192 transitionUncollapseEasing: 'swing', 1193 containerClass: "", 1194 tabsClass: "", 1195 tabClass: "", 1196 panelClass: "", 1197 cache: true, 1198 panelContext: $container 1199 }, 1200 1201 // Internal instance variables 1202 // (not available via easytabs object) 1203 $defaultTab, 1204 $defaultTabLink, 1205 transitions, 1206 lastHash, 1207 skipUpdateToHash, 1208 animationSpeeds = { 1209 fast: 200, 1210 normal: 400, 1211 slow: 600 1212 }, 1213 1214 // Shorthand variable so that we don't need to call 1215 // plugin.settings throughout the plugin code 1216 settings; 1217 1218 // ============================================================= 1219 // Functions available via easytabs object 1220 // ============================================================= 1221 1222 plugin.init = function() { 1223 1224 plugin.settings = settings = $.extend({}, defaults, options); 1225 1226 // Add jQuery UI's crazy class names to markup, 1227 // so that markup will match theme CSS 1228 if ( settings.uiTabs ) { 1229 settings.tabActiveClass = 'ui-tabs-selected'; 1230 settings.containerClass = 'ui-tabs ui-widget ui-widget-content ui-corner-all'; 1231 settings.tabsClass = 'ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all'; 1232 settings.tabClass = 'ui-state-default ui-corner-top'; 1233 settings.panelClass = 'ui-tabs-panel ui-widget-content ui-corner-bottom'; 1234 } 1235 1236 // If collapsible is true and defaultTab specified, assume user wants defaultTab showing (not collapsed) 1237 if ( settings.collapsible && options.defaultTab !== undefined && options.collpasedByDefault === undefined ) { 1238 settings.collapsedByDefault = false;
1239 } 1240 1241 // Convert 'normal', 'fast', and 'slow' animation speed settings to their respective speed in milliseconds 1242 if ( typeof(settings.animationSpeed) === 'string' ) { 1243 settings.animationSpeed = animationSpeeds[settings.animationSpeed]; 1244 } 1245 1246 $('a.anchor').remove().prependTo('body'); 1247 1248 // Store easytabs object on container so we can easily set 1249 // properties throughout 1250 $container.data('easytabs', {}); 1251 1252 plugin.setTransitions(); 1253 1254 plugin.getTabs(); 1255 1256 addClasses(); 1257 1258 setDefaultTab(); 1259 1260 bindToTabClicks(); 1261 1262 initHashChange(); 1263 1264 initCycle(); 1265 1266 // Append data-easytabs HTML attribute to make easy to query for 1267 // easytabs instances via CSS pseudo-selector 1268 $container.attr('data-easytabs', true); 1269 }; 1270 1271 // Set transitions for switching between tabs based on options. 1272 // Could be used to update transitions if settings are changes. 1273 plugin.setTransitions = function() { 1274 transitions = ( settings.animate ) ? { 1275 show: settings.transitionIn, 1276 hide: settings.transitionOut, 1277 speed: settings.animationSpeed, 1278 collapse: settings.transitionCollapse, 1279 uncollapse: settings.transitionUncollapse, 1280 halfSpeed: settings.animationSpeed / 2 1281 } : 1282 { 1283 show: "show", 1284 hide: "hide", 1285 speed: 0, 1286 collapse: "hide", 1287 uncollapse: "show", 1288 halfSpeed: 0 1289 }; 1290 }; 1291 1292 // Find and instantiate tabs and panels. 1293 // Could be used to reset tab and panel collection if markup is 1294 // modified. 1295 plugin.getTabs = function() { 1296 var $matchingPanel; 1297 1298 // Find the initial set of elements matching the setting.tabs 1299 // CSS selector within the container 1300 plugin.tabs = $container.find(settings.tabs), 1301 1302 // Instantiate panels as empty jquery object 1303 plugin.panels = $(), 1304 1305 plugin.tabs.each(function(){ 1306 var $tab = $(this), 1307 $a = $tab.children('a'), 1308 1309 // targetId is the ID of the panel, which is either the 1310 // `href` attribute for non-ajax tabs, or in the 1311 // `data-target` attribute for ajax tabs since the `href` is 1312 // the ajax URL 1313 targetId = $tab.children('a').data('target'); 1314 1315 $tab.data('easytabs', {}); 1316 1317 // If the tab has a `data-target` attribute, and is thus an ajax tab 1318 if ( targetId !== undefined && targetId !== null ) { 1319 $tab.data('easytabs').ajax = $a.attr('href'); 1320 } else { 1321 targetId = $a.attr('href'); 1322 } 1323 targetId = targetId.match(/#([^\?]+)/)[0].substr(1); 1324 1325 $matchingPanel = settings.panelContext.find("#" + targetId); 1326 1327 // If tab has a matching panel, add it to panels 1328 if ( $matchingPanel.length ) { 1329 1330 // Store panel height before hiding 1331 $matchingPanel.data('easytabs', { 1332 position: $matchingPanel.css('position'), 1333 visibility: $matchingPanel.css('visibility') 1334 }); 1335 1336 // Don't hide panel if it's active (allows `getTabs` to be called manually to re-instantiate tab collection) 1337 $matchingPanel.not(settings.panelActiveClass).hide(); 1338 1339 plugin.panels = plugin.panels.add($matchingPanel); 1340 1341 $tab.data('easytabs').panel = $matchingPanel; 1342 1343 // Otherwise, remove tab from tabs collection 1344 } else { 1345 plugin.tabs = plugin.tabs.not($tab); 1346 } 1347 }); 1348 }; 1349 1350 // Select tab and fire callback 1351 plugin.selectTab = function($clicked, callback) { 1352 var url = window.location, 1353 hash = url.hash.match(/^[^\?]*/)[0], 1354 $targetPanel = $clicked.parent().data('easytabs').panel, 1355 ajaxUrl = $clicked.parent().data('easytabs').ajax; 1356 1357 // Tab is collapsible and active => toggle collapsed state 1358 if( settings.collapsible && ! skipUpdateToHash && ($clicked.hasClass(settings.tabActiveClass) || $clicked.hasClass(settings.collapsedClass)) ) { 1359 plugin.toggleTabCollapse($clicked, $targetPanel, ajaxUrl, callback); 1360 1361 // Tab is not active and panel is not active => select tab 1362 } else if( ! $clicked.hasClass(settings.tabActiveClass) || ! $targetPanel.hasClass(settings.panelActiveClass) ){ 1363 activateTab($clicked, $targetPanel, ajaxUrl, callback); 1364 1365 // Cache is disabled => reload (e.g reload an ajax tab). 1366 } else if ( ! settings.cache ){ 1367 activateTab($clicked, $targetPanel, ajaxUrl, callback); 1368 } 1369 1370 }; 1371
1372 // Toggle tab collapsed state and fire callback 1373 plugin.toggleTabCollapse = function($clicked, $targetPanel, ajaxUrl, callback) { 1374 plugin.panels.stop(true,true); 1375 1376 if( fire($container,"easytabs:before", [$clicked, $targetPanel, settings]) ){ 1377 plugin.tabs.filter("." + settings.tabActiveClass).removeClass(settings.tabActiveClass).children().removeClass(settings.tabActiveClass); 1378 1379 // If panel is collapsed, uncollapse it 1380 if( $clicked.hasClass(settings.collapsedClass) ){ 1381 1382 // If ajax panel and not already cached 1383 if( ajaxUrl && (!settings.cache || !$clicked.parent().data('easytabs').cached) ) { 1384 $container.trigger('easytabs:ajax:beforeSend', [$clicked, $targetPanel]); 1385 1386 $targetPanel.load(ajaxUrl, function(response, status, xhr){ 1387 $clicked.parent().data('easytabs').cached = true; 1388 $container.trigger('easytabs:ajax:complete', [$clicked, $targetPanel, response, status, xhr]); 1389 }); 1390 } 1391 1392 // Update CSS classes of tab and panel 1393 $clicked.parent() 1394 .removeClass(settings.collapsedClass) 1395 .addClass(settings.tabActiveClass) 1396 .children() 1397 .removeClass(settings.collapsedClass) 1398 .addClass(settings.tabActiveClass); 1399 1400 $targetPanel 1401 .addClass(settings.panelActiveClass) 1402 [transitions.uncollapse](transitions.speed, settings.transitionUncollapseEasing, function(){ 1403 $container.trigger('easytabs:midTransition', [$clicked, $targetPanel, settings]); 1404 if(typeof callback == 'function') callback(); 1405 }); 1406 1407 // Otherwise, collapse it 1408 } else { 1409 1410 // Update CSS classes of tab and panel 1411 $clicked.addClass(settings.collapsedClass) 1412 .parent() 1413 .addClass(settings.collapsedClass); 1414 1415 $targetPanel 1416 .removeClass(settings.panelActiveClass) 1417 [transitions.collapse](transitions.speed, settings.transitionCollapseEasing, function(){ 1418 $container.trigger("easytabs:midTransition", [$clicked, $targetPanel, settings]); 1419 if(typeof callback == 'function') callback(); 1420 }); 1421 } 1422 } 1423 }; 1424 1425 1426 // Find tab with target panel matching value 1427 plugin.matchTab = function(hash) { 1428 return plugin.tabs.find("[href='" + hash + "'],[data-target='" + hash + "']").first(); 1429 }; 1430 1431 // Find panel with `id` matching value 1432 plugin.matchInPanel = function(hash) { 1433 return ( hash ? plugin.panels.filter(':has(' + hash + ')').first() : [] ); 1434 }; 1435 1436 // Select matching tab when URL hash changes 1437 plugin.selectTabFromHashChange = function() { 1438 var hash = window.location.hash.match(/^[^\?]*/)[0], 1439 $tab = plugin.matchTab(hash), 1440 $panel; 1441 1442 if ( settings.updateHash ) { 1443 1444 // If hash directly matches tab 1445 if( $tab.length ){ 1446 skipUpdateToHash = true; 1447 plugin.selectTab( $tab ); 1448 1449 } else { 1450 $panel = plugin.matchInPanel(hash); 1451 1452 // If panel contains element matching hash 1453 if ( $panel.length ) { 1454 hash = '#' + $panel.attr('id'); 1455 $tab = plugin.matchTab(hash); 1456 skipUpdateToHash = true; 1457 plugin.selectTab( $tab ); 1458 1459 // If default tab is not active... 1460 } else if ( ! $defaultTab.hasClass(settings.tabActiveClass) && ! settings.cycle ) { 1461 1462 // ...and hash is blank or matches a parent of the tab container or 1463 // if the last tab (before the hash updated) was one of the other tabs in this container. 1464 if ( hash === '' || plugin.matchTab(lastHash).length || $container.closest(hash).length ) { 1465 skipUpdateToHash = true; 1466 plugin.selectTab( $defaultTabLink ); 1467 } 1468 } 1469 } 1470 } 1471 }; 1472 1473 // Cycle through tabs 1474 plugin.cycleTabs = function(tabNumber){ 1475 if(settings.cycle){ 1476 tabNumber = tabNumber % plugin.tabs.length; 1477 $tab = $( plugin.tabs[tabNumber] ).children("a").first(); 1478 skipUpdateToHash = true; 1479 plugin.selectTab( $tab, function() { 1480 setTimeout(function(){ plugin.cycleTabs(tabNumber + 1); }, settings.cycle); 1481 }); 1482 } 1483 }; 1484 1485 // Convenient public methods 1486 plugin.publicMethods = { 1487 select: function(tabSelector){ 1488 var $tab; 1489 1490 // Find tab container that matches selector (like 'li#tab-one' which contains tab link) 1491 if ( ($tab = plugin.tabs.filter(tabSelector)).length === 0 ) { 1492 1493 // Find direct tab link that matches href (like 'a[href="#panel-1"]') 1494 if ( ($tab = plugin.tabs.find("a[href='" + tabSelector + "']")).length === 0 ) { 1495 1496 // Find direct tab link that matches selector (like 'a#tab-1') 1497 if ( ($tab = plugin.tabs.find("a" + tabSelector)).length === 0 ) { 1498 1499 // Find direct tab link that matches data-target (lik 'a[data-target="#panel-1"]') 1500 if ( ($tab = plugin.tabs.find("[data-target='" + tabSelector + "']")).length === 0 ) { 1501 1502 // Find direct tab link that ends in the matching href (like 'a[href$="#panel-1"]', which would also match http://example.com/currentpage/#panel-1) 1503 if ( ($tab = plugin.tabs.find("a[href$='" + tabSelector + "']")).length === 0 ) { 1504 1505 $.error('Tab \'' + tabSelector + '\' does not exist in tab set'); 1506 } 1507 } 1508 } 1509 } 1510 } else { 1511 // Select the child tab link, since the first option finds the tab container (like <li>) 1512 $tab = $tab.children("a").first(); 1513 } 1514 plugin.selectTab($tab); 1515 } 1516 }; 1517 1518 // ============================================================= 1519 // Private functions 1520 // ============================================================= 1521 1522 // Triggers an event on an element and returns the event result 1523 var fire = function(obj, name, data) { 1524 var event = $.Event(name); 1525 obj.trigger(event, data); 1526 return event.result !== false; 1527 } 1528 1529 // Add CSS classes to markup (if specified), called by init 1530 var addClasses = function() { 1531 $container.addClass(settings.containerClass); 1532 plugin.tabs.parent().addClass(settings.tabsClass); 1533 plugin.tabs.addClass(settings.tabClass); 1534 plugin.panels.addClass(settings.panelClass); 1535 }; 1536 1537 // Set the default tab, whether from hash (bookmarked) or option, 1538 // called by init 1539 var setDefaultTab = function(){ 1540 var hash = window.location.hash.match(/^[^\?]*/)[0], 1541 $selectedTab = plugin.matchTab(hash).parent(), 1542 $panel; 1543 1544 // If hash directly matches one of the tabs, active on page-load 1545 if( $selectedTab.length === 1 ){ 1546 $defaultTab = $selectedTab; 1547 settings.cycle = false;
1548 1549 } else { 1550 $panel = plugin.matchInPanel(hash); 1551 1552 // If one of the panels contains the element matching the hash, 1553 // make it active on page-load 1554 if ( $panel.length ) { 1555 hash = '#' + $panel.attr('id'); 1556 $defaultTab = plugin.matchTab(hash).parent(); 1557 1558 // Otherwise, make the default tab the one that's active on page-load 1559 } else { 1560 $defaultTab = plugin.tabs.parent().find(settings.defaultTab); 1561 if ( $defaultTab.length === 0 ) { 1562 $.error("The specified default tab ('" + settings.defaultTab + "') could not be found in the tab set."); 1563 } 1564 } 1565 } 1566 1567 $defaultTabLink = $defaultTab.children("a").first(); 1568 1569 activateDefaultTab($selectedTab); 1570 }; 1571 1572 // Activate defaultTab (or collapse by default), called by setDefaultTab 1573 var activateDefaultTab = function($selectedTab) { 1574 var defaultPanel, 1575 defaultAjaxUrl; 1576 1577 if ( settings.collapsible && $selectedTab.length === 0 && settings.collapsedByDefault ) { 1578 $defaultTab 1579 .addClass(settings.collapsedClass) 1580 .children() 1581 .addClass(settings.collapsedClass); 1582 1583 } else { 1584 1585 defaultPanel = $( $defaultTab.data('easytabs').panel ); 1586 defaultAjaxUrl = $defaultTab.data('easytabs').ajax; 1587 1588 if ( defaultAjaxUrl && (!settings.cache || !$defaultTab.data('easytabs').cached) ) { 1589 $container.trigger('easytabs:ajax:beforeSend', [$defaultTabLink, defaultPanel]); 1590 defaultPanel.load(defaultAjaxUrl, function(response, status, xhr){ 1591 $defaultTab.data('easytabs').cached = true; 1592 $container.trigger('easytabs:ajax:complete', [$defaultTabLink, defaultPanel, response, status, xhr]); 1593 }); 1594 } 1595 1596 $defaultTab.data('easytabs').panel 1597 .show() 1598 .addClass(settings.panelActiveClass); 1599 1600 $defaultTab 1601 .addClass(settings.tabActiveClass) 1602 .children() 1603 .addClass(settings.tabActiveClass); 1604 } 1605 }; 1606 1607 // Bind tab-select funtionality to namespaced click event, called by 1608 // init 1609 var bindToTabClicks = function() { 1610 plugin.tabs.children("a").bind("click.easytabs", function(e) { 1611 1612 // Stop cycling when a tab is clicked 1613 settings.cycle = false; 1614 1615 // Hash will be updated when tab is clicked, 1616 // don't cause tab to re-select when hash-change event is fired 1617 skipUpdateToHash = false; 1618 1619 // Select the panel for the clicked tab 1620 plugin.selectTab( $(this) ); 1621 1622 // Don't follow the link to the anchor 1623 e.preventDefault(); 1624 }); 1625 }; 1626 1627 // Activate a given tab/panel, called from plugin.selectTab: 1628 // 1629 // * fire `easytabs:before` hook 1630 // * get ajax if new tab is an uncached ajax tab 1631 // * animate out previously-active panel 1632 // * fire `easytabs:midTransition` hook 1633 // * update URL hash 1634 // * animate in newly-active panel 1635 // * update CSS classes for inactive and active tabs/panels 1636 // 1637 // TODO: This could probably be broken out into many more modular 1638 // functions 1639 var activateTab = function($clicked, $targetPanel, ajaxUrl, callback) { 1640 plugin.panels.stop(true,true); 1641 1642 if( fire($container,"easytabs:before", [$clicked, $targetPanel, settings]) ){ 1643 var $visiblePanel = plugin.panels.filter(":visible"), 1644 $panelContainer = $targetPanel.parent(), 1645 targetHeight, 1646 visibleHeight, 1647 heightDifference, 1648 showPanel, 1649 hash = window.location.hash.match(/^[^\?]*/)[0]; 1650 1651 if (settings.animate) { 1652 targetHeight = getHeightForHidden($targetPanel); 1653 visibleHeight = $visiblePanel.length ? setAndReturnHeight($visiblePanel) : 0; 1654 heightDifference = targetHeight - visibleHeight; 1655 } 1656 1657 // Set lastHash to help indicate if defaultTab should be 1658 // activated across multiple tab instances. 1659 lastHash = hash; 1660 1661 // TODO: Move this function elsewhere 1662 showPanel = function() { 1663 // At this point, the previous panel is hidden, and the new one will be selected 1664 $container.trigger("easytabs:midTransition", [$clicked, $targetPanel, settings]); 1665 1666 // Gracefully animate between panels of differing heights, start height change animation *after* panel change if panel needs to contract, 1667 // so that there is no chance of making the visible panel overflowing the height of the target panel 1668 if (settings.animate && settings.transitionIn == 'fadeIn') { 1669 if (heightDifference < 0) 1670 $panelContainer.animate({ 1671 height: $panelContainer.height() + heightDifference 1672 }, transitions.halfSpeed ).css({ 'min-height': '' }); 1673 } 1674 1675 if ( settings.updateHash && ! skipUpdateToHash ) { 1676 //window.location = url.toString().replace((url.pathname + hash), (url.pathname + $clicked.attr("href"))); 1677 // Not sure why this behaves so differently, but it's more straight forward and seems to have less side-effects 1678 window.location.hash = '#' + $targetPanel.attr('id'); 1679 } else { 1680 skipUpdateToHash = false;
1681 } 1682 1683 $targetPanel 1684 [transitions.show](transitions.speed, settings.transitionInEasing, function(){ 1685 $panelContainer.css({height: '', 'min-height': ''}); // After the transition, unset the height 1686 $container.trigger("easytabs:after", [$clicked, $targetPanel, settings]); 1687 // callback only gets called if selectTab actually does something, since it's inside the if block 1688 if(typeof callback == 'function'){ 1689 callback(); 1690 } 1691 }); 1692 }; 1693 1694 if ( ajaxUrl && (!settings.cache || !$clicked.parent().data('easytabs').cached) ) { 1695 $container.trigger('easytabs:ajax:beforeSend', [$clicked, $targetPanel]); 1696 $targetPanel.load(ajaxUrl, function(response, status, xhr){ 1697 $clicked.parent().data('easytabs').cached = true; 1698 $container.trigger('easytabs:ajax:complete', [$clicked, $targetPanel, response, status, xhr]); 1699 }); 1700 } 1701 1702 // Gracefully animate between panels of differing heights, start height change animation *before* panel change if panel needs to expand, 1703 // so that there is no chance of making the target panel overflowing the height of the visible panel 1704 if( settings.animate && settings.transitionOut == 'fadeOut' ) { 1705 if( heightDifference > 0 ) { 1706 $panelContainer.animate({ 1707 height: ( $panelContainer.height() + heightDifference ) 1708 }, transitions.halfSpeed ); 1709 } else { 1710 // Prevent height jumping before height transition is triggered at midTransition 1711 $panelContainer.css({ 'min-height': $panelContainer.height() }); 1712 } 1713 } 1714 1715 // Change the active tab *first* to provide immediate feedback when the user clicks 1716 plugin.tabs.filter("." + settings.tabActiveClass).removeClass(settings.tabActiveClass).children().removeClass(settings.tabActiveClass); 1717 plugin.tabs.filter("." + settings.collapsedClass).removeClass(settings.collapsedClass).children().removeClass(settings.collapsedClass); 1718 $clicked.parent().addClass(settings.tabActiveClass).children().addClass(settings.tabActiveClass); 1719 1720 plugin.panels.filter("." + settings.panelActiveClass).removeClass(settings.panelActiveClass); 1721 $targetPanel.addClass(settings.panelActiveClass); 1722 1723 if( $visiblePanel.length ) { 1724 $visiblePanel 1725 [transitions.hide](transitions.speed, settings.transitionOutEasing, showPanel); 1726 } else { 1727 $targetPanel 1728 [transitions.uncollapse](transitions.speed, settings.transitionUncollapseEasing, showPanel); 1729 } 1730 } 1731 }; 1732 1733 // Get heights of panels to enable animation between panels of 1734 // differing heights, called by activateTab 1735 var getHeightForHidden = function($targetPanel){ 1736 1737 if ( $targetPanel.data('easytabs') && $targetPanel.data('easytabs').lastHeight ) { 1738 return $targetPanel.data('easytabs').lastHeight; 1739 } 1740 1741 // this is the only property easytabs changes, so we need to grab its value on each tab change 1742 var display = $targetPanel.css('display'), 1743 1744 // Workaround, because firefox returns wrong height if element itself has absolute positioning 1745 height = $targetPanel 1746 .wrap($('<div>', {position: 'absolute', 'visibility': 'hidden', 'overflow': 'hidden'})) 1747 .css({'position':'relative','visibility':'hidden','display':'block'}) 1748 .outerHeight(); 1749 1750 $targetPanel.unwrap(); 1751 1752 // Return element to previous state 1753 $targetPanel.css({ 1754 position: $targetPanel.data('easytabs').position, 1755 visibility: $targetPanel.data('easytabs').visibility, 1756 display: display 1757 }); 1758 1759 // Cache height 1760 $targetPanel.data('easytabs').lastHeight = height; 1761 1762 return height; 1763 }; 1764 1765 // Since the height of the visible panel may have been manipulated due to interaction, 1766 // we want to re-cache the visible height on each tab change, called 1767 // by activateTab 1768 var setAndReturnHeight = function($visiblePanel) { 1769 var height = $visiblePanel.outerHeight(); 1770 1771 if( $visiblePanel.data('easytabs') ) { 1772 $visiblePanel.data('easytabs').lastHeight = height; 1773 } else { 1774 $visiblePanel.data('easytabs', {lastHeight: height}); 1775 } 1776 return height; 1777 }; 1778
1779 // Setup hash-change callback for forward- and back-button 1780 // functionality, called by init 1781 var initHashChange = function(){ 1782 1783 // enabling back-button with jquery.hashchange plugin 1784 // http://benalman.com/projects/jquery-hashchange-plugin/ 1785 if(typeof $(window).hashchange === 'function'){ 1786 $(window).hashchange( function(){ 1787 plugin.selectTabFromHashChange(); 1788 }); 1789 } else if ($.address && typeof $.address.change === 'function') { // back-button with jquery.address plugin http://www.asual.com/jquery/address/docs/ 1790 $.address.change( function(){ 1791 plugin.selectTabFromHashChange(); 1792 }); 1793 } 1794 }; 1795 1796 // Begin cycling if set in options, called by init 1797 var initCycle = function(){ 1798 var tabNumber; 1799 if (settings.cycle) { 1800 tabNumber = plugin.tabs.index($defaultTab); 1801 setTimeout( function(){ plugin.cycleTabs(tabNumber + 1); }, settings.cycle); 1802 } 1803 }; 1804 1805 1806 plugin.init(); 1807 1808 }; 1809 1810 $.fn.easytabs = function(options) { 1811 var args = arguments; 1812 1813 return this.each(function() { 1814 var $this = $(this), 1815 plugin = $this.data('easytabs'); 1816 1817 // Initialization was called with $(el).easytabs( { options } ); 1818 if (undefined === plugin) { 1819 plugin = new $.easytabs(this, options); 1820 $this.data('easytabs', plugin); 1821 } 1822 1823 // User called public method 1824 if ( plugin.publicMethods[options] ){ 1825 return plugin.publicMethods[options](Array.prototype.slice.call( args, 1 )); 1826 } 1827 }); 1828 }; 1829 1830})(jQuery); 1831 1832$(document).ready( function() { 1833 $('#tabs_stacks_in_739').easytabs({ 1834 animationSpeed: 300, 1835 1836 animate: true, 1837 defaultTab: "li:nth-child(1)", 1838 cycle: false 1839 }); 1840 }); 1841 1842return stack;})(stacks.stacks_in_739); 1843stacks.stacks_in_887 = {}; 1844stacks.stacks_in_887 = (function(stack) { 1845var jQuery = stacks.jQuery;var $ = jQuery; 1846( function($) { 1847 1848 $.easytabs = function(container, options) { 1849 1850 // Attach to plugin anything that should be available via 1851 // the $container.data('easytabs') object 1852 var plugin = this, 1853 $container = $(container), 1854 1855 defaults = { 1856 animate: true, 1857 panelActiveClass: "active", 1858 tabActiveClass: "active", 1859 defaultTab: "li:first-child", 1860 animationSpeed: "normal", 1861 tabs: "> ul > li", 1862 updateHash: true, 1863 cycle: false, 1864 collapsible: false, 1865 collapsedClass: "collapsed", 1866 collapsedByDefault: true, 1867 uiTabs: false, 1868 transitionIn: 'fadeIn', 1869 transitionOut: 'fadeOut', 1870 transitionInEasing: 'swing', 1871 transitionOutEasing: 'swing', 1872 transitionCollapse: 'slideUp', 1873 transitionUncollapse: 'slideDown', 1874 transitionCollapseEasing: 'swing', 1875 transitionUncollapseEasing: 'swing', 1876 containerClass: "", 1877 tabsClass: "", 1878 tabClass: "", 1879 panelClass: "", 1880 cache: true, 1881 panelContext: $container 1882 }, 1883 1884 // Internal instance variables 1885 // (not available via easytabs object) 1886 $defaultTab, 1887 $defaultTabLink, 1888 transitions, 1889 lastHash, 1890 skipUpdateToHash, 1891 animationSpeeds = { 1892 fast: 200, 1893 normal: 400, 1894 slow: 600 1895 }, 1896 1897 // Shorthand variable so that we don't need to call 1898 // plugin.settings throughout the plugin code 1899 settings; 1900 1901 // ============================================================= 1902 // Functions available via easytabs object 1903 // ============================================================= 1904 1905 plugin.init = function() { 1906 1907 plugin.settings = settings = $.extend({}, defaults, options); 1908 1909 // Add jQuery UI's crazy class names to markup, 1910 // so that markup will match theme CSS 1911 if ( settings.uiTabs ) { 1912 settings.tabActiveClass = 'ui-tabs-selected'; 1913 settings.containerClass = 'ui-tabs ui-widget ui-widget-content ui-corner-all'; 1914 settings.tabsClass = 'ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all'; 1915 settings.tabClass = 'ui-state-default ui-corner-top'; 1916 settings.panelClass = 'ui-tabs-panel ui-widget-content ui-corner-bottom'; 1917 } 1918 1919 // If collapsible is true and defaultTab specified, assume user wants defaultTab showing (not collapsed) 1920 if ( settings.collapsible && options.defaultTab !== undefined && options.collpasedByDefault === undefined ) { 1921 settings.collapsedByDefault = false;
1922 } 1923 1924 // Convert 'normal', 'fast', and 'slow' animation speed settings to their respective speed in milliseconds 1925 if ( typeof(settings.animationSpeed) === 'string' ) { 1926 settings.animationSpeed = animationSpeeds[settings.animationSpeed]; 1927 } 1928 1929 $('a.anchor').remove().prependTo('body'); 1930 1931 // Store easytabs object on container so we can easily set 1932 // properties throughout 1933 $container.data('easytabs', {}); 1934 1935 plugin.setTransitions(); 1936 1937 plugin.getTabs(); 1938 1939 addClasses(); 1940 1941 setDefaultTab(); 1942 1943 bindToTabClicks(); 1944 1945 initHashChange(); 1946 1947 initCycle(); 1948 1949 // Append data-easytabs HTML attribute to make easy to query for 1950 // easytabs instances via CSS pseudo-selector 1951 $container.attr('data-easytabs', true); 1952 }; 1953 1954 // Set transitions for switching between tabs based on options. 1955 // Could be used to update transitions if settings are changes. 1956 plugin.setTransitions = function() { 1957 transitions = ( settings.animate ) ? { 1958 show: settings.transitionIn, 1959 hide: settings.transitionOut, 1960 speed: settings.animationSpeed, 1961 collapse: settings.transitionCollapse, 1962 uncollapse: settings.transitionUncollapse, 1963 halfSpeed: settings.animationSpeed / 2 1964 } : 1965 { 1966 show: "show", 1967 hide: "hide", 1968 speed: 0, 1969 collapse: "hide", 1970 uncollapse: "show", 1971 halfSpeed: 0 1972 }; 1973 }; 1974 1975 // Find and instantiate tabs and panels. 1976 // Could be used to reset tab and panel collection if markup is 1977 // modified. 1978 plugin.getTabs = function() { 1979 var $matchingPanel; 1980 1981 // Find the initial set of elements matching the setting.tabs 1982 // CSS selector within the container 1983 plugin.tabs = $container.find(settings.tabs), 1984 1985 // Instantiate panels as empty jquery object 1986 plugin.panels = $(), 1987 1988 plugin.tabs.each(function(){ 1989 var $tab = $(this), 1990 $a = $tab.children('a'), 1991 1992 // targetId is the ID of the panel, which is either the 1993 // `href` attribute for non-ajax tabs, or in the 1994 // `data-target` attribute for ajax tabs since the `href` is 1995 // the ajax URL 1996 targetId = $tab.children('a').data('target'); 1997 1998 $tab.data('easytabs', {}); 1999 2000 // If the tab has a `data-target` attribute, and is thus an ajax tab 2001 if ( targetId !== undefined && targetId !== null ) { 2002 $tab.data('easytabs').ajax = $a.attr('href'); 2003 } else { 2004 targetId = $a.attr('href'); 2005 } 2006 targetId = targetId.match(/#([^\?]+)/)[0].substr(1); 2007 2008 $matchingPanel = settings.panelContext.find("#" + targetId); 2009 2010 // If tab has a matching panel, add it to panels 2011 if ( $matchingPanel.length ) { 2012 2013 // Store panel height before hiding 2014 $matchingPanel.data('easytabs', { 2015 position: $matchingPanel.css('position'), 2016 visibility: $matchingPanel.css('visibility') 2017 }); 2018 2019 // Don't hide panel if it's active (allows `getTabs` to be called manually to re-instantiate tab collection) 2020 $matchingPanel.not(settings.panelActiveClass).hide(); 2021 2022 plugin.panels = plugin.panels.add($matchingPanel); 2023 2024 $tab.data('easytabs').panel = $matchingPanel; 2025 2026 // Otherwise, remove tab from tabs collection 2027 } else { 2028 plugin.tabs = plugin.tabs.not($tab); 2029 } 2030 }); 2031 }; 2032 2033 // Select tab and fire callback 2034 plugin.selectTab = function($clicked, callback) { 2035 var url = window.location, 2036 hash = url.hash.match(/^[^\?]*/)[0], 2037 $targetPanel = $clicked.parent().data('easytabs').panel, 2038 ajaxUrl = $clicked.parent().data('easytabs').ajax; 2039 2040 // Tab is collapsible and active => toggle collapsed state 2041 if( settings.collapsible && ! skipUpdateToHash && ($clicked.hasClass(settings.tabActiveClass) || $clicked.hasClass(settings.collapsedClass)) ) { 2042 plugin.toggleTabCollapse($clicked, $targetPanel, ajaxUrl, callback); 2043 2044 // Tab is not active and panel is not active => select tab 2045 } else if( ! $clicked.hasClass(settings.tabActiveClass) || ! $targetPanel.hasClass(settings.panelActiveClass) ){ 2046 activateTab($clicked, $targetPanel, ajaxUrl, callback); 2047 2048 // Cache is disabled => reload (e.g reload an ajax tab). 2049 } else if ( ! settings.cache ){ 2050 activateTab($clicked, $targetPanel, ajaxUrl, callback); 2051 } 2052 2053 }; 2054
2055 // Toggle tab collapsed state and fire callback 2056 plugin.toggleTabCollapse = function($clicked, $targetPanel, ajaxUrl, callback) { 2057 plugin.panels.stop(true,true); 2058 2059 if( fire($container,"easytabs:before", [$clicked, $targetPanel, settings]) ){ 2060 plugin.tabs.filter("." + settings.tabActiveClass).removeClass(settings.tabActiveClass).children().removeClass(settings.tabActiveClass); 2061 2062 // If panel is collapsed, uncollapse it 2063 if( $clicked.hasClass(settings.collapsedClass) ){ 2064 2065 // If ajax panel and not already cached 2066 if( ajaxUrl && (!settings.cache || !$clicked.parent().data('easytabs').cached) ) { 2067 $container.trigger('easytabs:ajax:beforeSend', [$clicked, $targetPanel]); 2068 2069 $targetPanel.load(ajaxUrl, function(response, status, xhr){ 2070 $clicked.parent().data('easytabs').cached = true; 2071 $container.trigger('easytabs:ajax:complete', [$clicked, $targetPanel, response, status, xhr]); 2072 }); 2073 } 2074 2075 // Update CSS classes of tab and panel 2076 $clicked.parent() 2077 .removeClass(settings.collapsedClass) 2078 .addClass(settings.tabActiveClass) 2079 .children() 2080 .removeClass(settings.collapsedClass) 2081 .addClass(settings.tabActiveClass); 2082 2083 $targetPanel 2084 .addClass(settings.panelActiveClass) 2085 [transitions.uncollapse](transitions.speed, settings.transitionUncollapseEasing, function(){ 2086 $container.trigger('easytabs:midTransition', [$clicked, $targetPanel, settings]); 2087 if(typeof callback == 'function') callback(); 2088 }); 2089 2090 // Otherwise, collapse it 2091 } else { 2092 2093 // Update CSS classes of tab and panel 2094 $clicked.addClass(settings.collapsedClass) 2095 .parent() 2096 .addClass(settings.collapsedClass); 2097 2098 $targetPanel 2099 .removeClass(settings.panelActiveClass) 2100 [transitions.collapse](transitions.speed, settings.transitionCollapseEasing, function(){ 2101 $container.trigger("easytabs:midTransition", [$clicked, $targetPanel, settings]); 2102 if(typeof callback == 'function') callback(); 2103 }); 2104 } 2105 } 2106 }; 2107 2108 2109 // Find tab with target panel matching value 2110 plugin.matchTab = function(hash) { 2111 return plugin.tabs.find("[href='" + hash + "'],[data-target='" + hash + "']").first(); 2112 }; 2113 2114 // Find panel with `id` matching value 2115 plugin.matchInPanel = function(hash) { 2116 return ( hash ? plugin.panels.filter(':has(' + hash + ')').first() : [] ); 2117 }; 2118 2119 // Select matching tab when URL hash changes 2120 plugin.selectTabFromHashChange = function() { 2121 var hash = window.location.hash.match(/^[^\?]*/)[0], 2122 $tab = plugin.matchTab(hash), 2123 $panel; 2124 2125 if ( settings.updateHash ) { 2126 2127 // If hash directly matches tab 2128 if( $tab.length ){ 2129 skipUpdateToHash = true; 2130 plugin.selectTab( $tab ); 2131 2132 } else { 2133 $panel = plugin.matchInPanel(hash); 2134 2135 // If panel contains element matching hash 2136 if ( $panel.length ) { 2137 hash = '#' + $panel.attr('id'); 2138 $tab = plugin.matchTab(hash); 2139 skipUpdateToHash = true; 2140 plugin.selectTab( $tab ); 2141 2142 // If default tab is not active... 2143 } else if ( ! $defaultTab.hasClass(settings.tabActiveClass) && ! settings.cycle ) { 2144 2145 // ...and hash is blank or matches a parent of the tab container or 2146 // if the last tab (before the hash updated) was one of the other tabs in this container. 2147 if ( hash === '' || plugin.matchTab(lastHash).length || $container.closest(hash).length ) { 2148 skipUpdateToHash = true; 2149 plugin.selectTab( $defaultTabLink ); 2150 } 2151 } 2152 } 2153 } 2154 }; 2155 2156 // Cycle through tabs 2157 plugin.cycleTabs = function(tabNumber){ 2158 if(settings.cycle){ 2159 tabNumber = tabNumber % plugin.tabs.length; 2160 $tab = $( plugin.tabs[tabNumber] ).children("a").first(); 2161 skipUpdateToHash = true; 2162 plugin.selectTab( $tab, function() { 2163 setTimeout(function(){ plugin.cycleTabs(tabNumber + 1); }, settings.cycle); 2164 }); 2165 } 2166 }; 2167 2168 // Convenient public methods 2169 plugin.publicMethods = { 2170 select: function(tabSelector){ 2171 var $tab; 2172 2173 // Find tab container that matches selector (like 'li#tab-one' which contains tab link) 2174 if ( ($tab = plugin.tabs.filter(tabSelector)).length === 0 ) { 2175 2176 // Find direct tab link that matches href (like 'a[href="#panel-1"]') 2177 if ( ($tab = plugin.tabs.find("a[href='" + tabSelector + "']")).length === 0 ) { 2178 2179 // Find direct tab link that matches selector (like 'a#tab-1') 2180 if ( ($tab = plugin.tabs.find("a" + tabSelector)).length === 0 ) { 2181 2182 // Find direct tab link that matches data-target (lik 'a[data-target="#panel-1"]') 2183 if ( ($tab = plugin.tabs.find("[data-target='" + tabSelector + "']")).length === 0 ) { 2184 2185 // Find direct tab link that ends in the matching href (like 'a[href$="#panel-1"]', which would also match http://example.com/currentpage/#panel-1) 2186 if ( ($tab = plugin.tabs.find("a[href$='" + tabSelector + "']")).length === 0 ) { 2187 2188 $.error('Tab \'' + tabSelector + '\' does not exist in tab set'); 2189 } 2190 } 2191 } 2192 } 2193 } else { 2194 // Select the child tab link, since the first option finds the tab container (like <li>) 2195 $tab = $tab.children("a").first(); 2196 } 2197 plugin.selectTab($tab); 2198 } 2199 }; 2200 2201 // ============================================================= 2202 // Private functions 2203 // ============================================================= 2204 2205 // Triggers an event on an element and returns the event result 2206 var fire = function(obj, name, data) { 2207 var event = $.Event(name); 2208 obj.trigger(event, data); 2209 return event.result !== false; 2210 } 2211 2212 // Add CSS classes to markup (if specified), called by init 2213 var addClasses = function() { 2214 $container.addClass(settings.containerClass); 2215 plugin.tabs.parent().addClass(settings.tabsClass); 2216 plugin.tabs.addClass(settings.tabClass); 2217 plugin.panels.addClass(settings.panelClass); 2218 }; 2219 2220 // Set the default tab, whether from hash (bookmarked) or option, 2221 // called by init 2222 var setDefaultTab = function(){ 2223 var hash = window.location.hash.match(/^[^\?]*/)[0], 2224 $selectedTab = plugin.matchTab(hash).parent(), 2225 $panel; 2226 2227 // If hash directly matches one of the tabs, active on page-load 2228 if( $selectedTab.length === 1 ){ 2229 $defaultTab = $selectedTab; 2230 settings.cycle = false;
2231 2232 } else { 2233 $panel = plugin.matchInPanel(hash); 2234 2235 // If one of the panels contains the element matching the hash, 2236 // make it active on page-load 2237 if ( $panel.length ) { 2238 hash = '#' + $panel.attr('id'); 2239 $defaultTab = plugin.matchTab(hash).parent(); 2240 2241 // Otherwise, make the default tab the one that's active on page-load 2242 } else { 2243 $defaultTab = plugin.tabs.parent().find(settings.defaultTab); 2244 if ( $defaultTab.length === 0 ) { 2245 $.error("The specified default tab ('" + settings.defaultTab + "') could not be found in the tab set."); 2246 } 2247 } 2248 } 2249 2250 $defaultTabLink = $defaultTab.children("a").first(); 2251 2252 activateDefaultTab($selectedTab); 2253 }; 2254 2255 // Activate defaultTab (or collapse by default), called by setDefaultTab 2256 var activateDefaultTab = function($selectedTab) { 2257 var defaultPanel, 2258 defaultAjaxUrl; 2259 2260 if ( settings.collapsible && $selectedTab.length === 0 && settings.collapsedByDefault ) { 2261 $defaultTab 2262 .addClass(settings.collapsedClass) 2263 .children() 2264 .addClass(settings.collapsedClass); 2265 2266 } else { 2267 2268 defaultPanel = $( $defaultTab.data('easytabs').panel ); 2269 defaultAjaxUrl = $defaultTab.data('easytabs').ajax; 2270 2271 if ( defaultAjaxUrl && (!settings.cache || !$defaultTab.data('easytabs').cached) ) { 2272 $container.trigger('easytabs:ajax:beforeSend', [$defaultTabLink, defaultPanel]); 2273 defaultPanel.load(defaultAjaxUrl, function(response, status, xhr){ 2274 $defaultTab.data('easytabs').cached = true; 2275 $container.trigger('easytabs:ajax:complete', [$defaultTabLink, defaultPanel, response, status, xhr]); 2276 }); 2277 } 2278 2279 $defaultTab.data('easytabs').panel 2280 .show() 2281 .addClass(settings.panelActiveClass); 2282 2283 $defaultTab 2284 .addClass(settings.tabActiveClass) 2285 .children() 2286 .addClass(settings.tabActiveClass); 2287 } 2288 }; 2289 2290 // Bind tab-select funtionality to namespaced click event, called by 2291 // init 2292 var bindToTabClicks = function() { 2293 plugin.tabs.children("a").bind("click.easytabs", function(e) { 2294 2295 // Stop cycling when a tab is clicked 2296 settings.cycle = false; 2297 2298 // Hash will be updated when tab is clicked, 2299 // don't cause tab to re-select when hash-change event is fired 2300 skipUpdateToHash = false; 2301 2302 // Select the panel for the clicked tab 2303 plugin.selectTab( $(this) ); 2304 2305 // Don't follow the link to the anchor 2306 e.preventDefault(); 2307 }); 2308 }; 2309 2310 // Activate a given tab/panel, called from plugin.selectTab: 2311 // 2312 // * fire `easytabs:before` hook 2313 // * get ajax if new tab is an uncached ajax tab 2314 // * animate out previously-active panel 2315 // * fire `easytabs:midTransition` hook 2316 // * update URL hash 2317 // * animate in newly-active panel 2318 // * update CSS classes for inactive and active tabs/panels 2319 // 2320 // TODO: This could probably be broken out into many more modular 2321 // functions 2322 var activateTab = function($clicked, $targetPanel, ajaxUrl, callback) { 2323 plugin.panels.stop(true,true); 2324 2325 if( fire($container,"easytabs:before", [$clicked, $targetPanel, settings]) ){ 2326 var $visiblePanel = plugin.panels.filter(":visible"), 2327 $panelContainer = $targetPanel.parent(), 2328 targetHeight, 2329 visibleHeight, 2330 heightDifference, 2331 showPanel, 2332 hash = window.location.hash.match(/^[^\?]*/)[0]; 2333 2334 if (settings.animate) { 2335 targetHeight = getHeightForHidden($targetPanel); 2336 visibleHeight = $visiblePanel.length ? setAndReturnHeight($visiblePanel) : 0; 2337 heightDifference = targetHeight - visibleHeight; 2338 } 2339 2340 // Set lastHash to help indicate if defaultTab should be 2341 // activated across multiple tab instances. 2342 lastHash = hash; 2343 2344 // TODO: Move this function elsewhere 2345 showPanel = function() { 2346 // At this point, the previous panel is hidden, and the new one will be selected 2347 $container.trigger("easytabs:midTransition", [$clicked, $targetPanel, settings]); 2348 2349 // Gracefully animate between panels of differing heights, start height change animation *after* panel change if panel needs to contract, 2350 // so that there is no chance of making the visible panel overflowing the height of the target panel 2351 if (settings.animate && settings.transitionIn == 'fadeIn') { 2352 if (heightDifference < 0) 2353 $panelContainer.animate({ 2354 height: $panelContainer.height() + heightDifference 2355 }, transitions.halfSpeed ).css({ 'min-height': '' }); 2356 } 2357 2358 if ( settings.updateHash && ! skipUpdateToHash ) { 2359 //window.location = url.toString().replace((url.pathname + hash), (url.pathname + $clicked.attr("href"))); 2360 // Not sure why this behaves so differently, but it's more straight forward and seems to have less side-effects 2361 window.location.hash = '#' + $targetPanel.attr('id'); 2362 } else { 2363 skipUpdateToHash = false;
2364 } 2365 2366 $targetPanel 2367 [transitions.show](transitions.speed, settings.transitionInEasing, function(){ 2368 $panelContainer.css({height: '', 'min-height': ''}); // After the transition, unset the height 2369 $container.trigger("easytabs:after", [$clicked, $targetPanel, settings]); 2370 // callback only gets called if selectTab actually does something, since it's inside the if block 2371 if(typeof callback == 'function'){ 2372 callback(); 2373 } 2374 }); 2375 }; 2376 2377 if ( ajaxUrl && (!settings.cache || !$clicked.parent().data('easytabs').cached) ) { 2378 $container.trigger('easytabs:ajax:beforeSend', [$clicked, $targetPanel]); 2379 $targetPanel.load(ajaxUrl, function(response, status, xhr){ 2380 $clicked.parent().data('easytabs').cached = true; 2381 $container.trigger('easytabs:ajax:complete', [$clicked, $targetPanel, response, status, xhr]); 2382 }); 2383 } 2384 2385 // Gracefully animate between panels of differing heights, start height change animation *before* panel change if panel needs to expand, 2386 // so that there is no chance of making the target panel overflowing the height of the visible panel 2387 if( settings.animate && settings.transitionOut == 'fadeOut' ) { 2388 if( heightDifference > 0 ) { 2389 $panelContainer.animate({ 2390 height: ( $panelContainer.height() + heightDifference ) 2391 }, transitions.halfSpeed ); 2392 } else { 2393 // Prevent height jumping before height transition is triggered at midTransition 2394 $panelContainer.css({ 'min-height': $panelContainer.height() }); 2395 } 2396 } 2397 2398 // Change the active tab *first* to provide immediate feedback when the user clicks 2399 plugin.tabs.filter("." + settings.tabActiveClass).removeClass(settings.tabActiveClass).children().removeClass(settings.tabActiveClass); 2400 plugin.tabs.filter("." + settings.collapsedClass).removeClass(settings.collapsedClass).children().removeClass(settings.collapsedClass); 2401 $clicked.parent().addClass(settings.tabActiveClass).children().addClass(settings.tabActiveClass); 2402 2403 plugin.panels.filter("." + settings.panelActiveClass).removeClass(settings.panelActiveClass); 2404 $targetPanel.addClass(settings.panelActiveClass); 2405 2406 if( $visiblePanel.length ) { 2407 $visiblePanel 2408 [transitions.hide](transitions.speed, settings.transitionOutEasing, showPanel); 2409 } else { 2410 $targetPanel 2411 [transitions.uncollapse](transitions.speed, settings.transitionUncollapseEasing, showPanel); 2412 } 2413 } 2414 }; 2415 2416 // Get heights of panels to enable animation between panels of 2417 // differing heights, called by activateTab 2418 var getHeightForHidden = function($targetPanel){ 2419 2420 if ( $targetPanel.data('easytabs') && $targetPanel.data('easytabs').lastHeight ) { 2421 return $targetPanel.data('easytabs').lastHeight; 2422 } 2423 2424 // this is the only property easytabs changes, so we need to grab its value on each tab change 2425 var display = $targetPanel.css('display'), 2426 2427 // Workaround, because firefox returns wrong height if element itself has absolute positioning 2428 height = $targetPanel 2429 .wrap($('<div>', {position: 'absolute', 'visibility': 'hidden', 'overflow': 'hidden'})) 2430 .css({'position':'relative','visibility':'hidden','display':'block'}) 2431 .outerHeight(); 2432 2433 $targetPanel.unwrap(); 2434 2435 // Return element to previous state 2436 $targetPanel.css({ 2437 position: $targetPanel.data('easytabs').position, 2438 visibility: $targetPanel.data('easytabs').visibility, 2439 display: display 2440 }); 2441 2442 // Cache height 2443 $targetPanel.data('easytabs').lastHeight = height; 2444 2445 return height; 2446 }; 2447 2448 // Since the height of the visible panel may have been manipulated due to interaction, 2449 // we want to re-cache the visible height on each tab change, called 2450 // by activateTab 2451 var setAndReturnHeight = function($visiblePanel) { 2452 var height = $visiblePanel.outerHeight(); 2453 2454 if( $visiblePanel.data('easytabs') ) { 2455 $visiblePanel.data('easytabs').lastHeight = height; 2456 } else { 2457 $visiblePanel.data('easytabs', {lastHeight: height}); 2458 } 2459 return height; 2460 }; 2461
2462 // Setup hash-change callback for forward- and back-button 2463 // functionality, called by init 2464 var initHashChange = function(){ 2465 2466 // enabling back-button with jquery.hashchange plugin 2467 // http://benalman.com/projects/jquery-hashchange-plugin/ 2468 if(typeof $(window).hashchange === 'function'){ 2469 $(window).hashchange( function(){ 2470 plugin.selectTabFromHashChange(); 2471 }); 2472 } else if ($.address && typeof $.address.change === 'function') { // back-button with jquery.address plugin http://www.asual.com/jquery/address/docs/ 2473 $.address.change( function(){ 2474 plugin.selectTabFromHashChange(); 2475 }); 2476 } 2477 }; 2478 2479 // Begin cycling if set in options, called by init 2480 var initCycle = function(){ 2481 var tabNumber; 2482 if (settings.cycle) { 2483 tabNumber = plugin.tabs.index($defaultTab); 2484 setTimeout( function(){ plugin.cycleTabs(tabNumber + 1); }, settings.cycle); 2485 } 2486 }; 2487 2488 2489 plugin.init(); 2490 2491 }; 2492 2493 $.fn.easytabs = function(options) { 2494 var args = arguments; 2495 2496 return this.each(function() { 2497 var $this = $(this), 2498 plugin = $this.data('easytabs'); 2499 2500 // Initialization was called with $(el).easytabs( { options } ); 2501 if (undefined === plugin) { 2502 plugin = new $.easytabs(this, options); 2503 $this.data('easytabs', plugin); 2504 } 2505 2506 // User called public method 2507 if ( plugin.publicMethods[options] ){ 2508 return plugin.publicMethods[options](Array.prototype.slice.call( args, 1 )); 2509 } 2510 }); 2511 }; 2512 2513})(jQuery); 2514 2515$(document).ready( function() { 2516 $('#tabs_stacks_in_887').easytabs({ 2517 animationSpeed: 300, 2518 2519 animate: true, 2520 defaultTab: "li:nth-child(1)", 2521 cycle: false 2522 }); 2523 }); 2524 2525return stack;})(stacks.stacks_in_887); 2526stacks.stacks_in_221 = {}; 2527stacks.stacks_in_221 = (function(stack) { 2528function scrollToTop(options){const defaults={text:'To Top',min:200,inDelay:600,outDelay:400,containerID:'toTop',scrollSpeed:1200,easingType:'linear',};const settings={...defaults,...options};const containerID=settings.containerID;const containerIDhash=`#${containerID}`;const easing={easeOutQuart:function(x,t,b,c,d){return-c*((t=t/d-1)*t*t*t-1)+b;},};const toTopButton=document.createElement('a');toTopButton.href='#';toTopButton.id=containerID;toTopButton.textContent=settings.text;toTopButton.style.display='none';document.body.appendChild(toTopButton);const scrollAnimation=(duration,easingFunction)=>{const start=document.documentElement.scrollTop||document.body.scrollTop;const startTime=performance.now();function animateScroll(currentTime){const elapsed=currentTime-startTime;const progress=Math.min(elapsed/duration,1);const scrollTo=easingFunction(0,elapsed,start,-start,duration);document.documentElement.scrollTop=document.body.scrollTop=scrollTo;if(elapsed<duration){requestAnimationFrame(animateScroll);}} 2529requestAnimationFrame(animateScroll);};toTopButton.addEventListener('click',(e)=>{e.preventDefault();scrollAnimation(settings.scrollSpeed,easing[settings.easingType]||easing.easeOutQuart);});window.addEventListener('scroll',()=>{const scrollTop=document.documentElement.scrollTop||document.body.scrollTop;if(scrollTop>settings.min){toTopButton.style.display='block';toTopButton.style.opacity=1;}
2529else{toTopButton.style.opacity=0;setTimeout(()=>{if(toTopButton.style.opacity==='0'){toTopButton.style.display='none';}},settings.outDelay);}});} 2530document.addEventListener('DOMContentLoaded',()=>{scrollToTop({easingType:'easeOutQuart',scrollSpeed:1200,min:200});}); 2531 2532return stack;})(stacks.stacks_in_221);
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.