1/* 2 * jQuery EasyTabs plugin 3.2.0 3 * 4 * Copyright (c) 2010-2011 Steve Schwartz (JangoSteve) 5 * 6 * Dual licensed under the MIT and GPL licenses: 7 * http://www.opensource.org/licenses/mit-license.php 8 * http://www.gnu.org/licenses/gpl.html 9 * 10 * Date: Thu May 09 17:30:00 2013 -0500 11 */ 12 13 14(function(a) { 15 a.easytabs = function(j, e) { 16 var f = this, 17 q = a(j), 18 i = { 19 animate: true, 20 panelActiveClass: "active", 21 tabActiveClass: "active", 22 defaultTab: "li:first-child", 23 animationSpeed: "normal", 24 tabs: "> ul > li", 25 updateHash: true, 26 cycle: false, 27 collapsible: false, 28 collapsedClass: "collapsed", 29 collapsedByDefault: false, 30 uiTabs: false, 31 transitionIn: "fadeIn", 32 transitionOut: "fadeOut", 33 transitionInEasing: "swing", 34 transitionOutEasing: "swing", 35 transitionCollapse: false, 36 transitionUncollapse: false, 37 transitionCollapseEasing: false, 38 transitionUncollapseEasing: false, 39 containerClass: "", 40 tabsClass: "", 41 tabClass: "", 42 panelClass: "", 43 cache: true, 44 event: "click", 45 panelContext: q 46 }, 47 h, l, v, m, d, t = { 48 fast: 200, 49 normal: 300, 50 slow: 600 51 }, 52 r; 53 f.init = function() { 54 f.settings = r = a.extend({}, i, e); 55 r.bind_str = r.event + ".easytabs"; 56 if (r.uiTabs) { 57 r.tabActiveClass = "ui-tabs-selected"; 58 r.containerClass = "ui-tabs ui-widget ui-widget-content ui-corner-all"; 59 r.tabsClass = "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all"; 60 r.tabClass = "ui-state-default ui-corner-top"; 61 r.panelClass = "ui-tabs-panel ui-widget-content ui-corner-bottom" 62 } 63 if (r.collapsible && e.defaultTab !== undefined && e.collpasedByDefault === undefined) { 64 r.collapsedByDefault = false 65 } 66 if (typeof(r.animationSpeed) === "string") { 67 r.animationSpeed = t[r.animationSpeed] 68 } 69 a("a.anchor").remove().prependTo("body"); 70 q.data("easytabs", {}); 71 f.setTransitions(); 72 f.getTabs(); 73 b(); 74 g(); 75 w(); 76 n(); 77 c(); 78 q.attr("data-easytabs", true) 79 }; 80 f.setTransitions = function() { 81 v = (r.animate) ? { 82 show: r.transitionIn, 83 hide: r.transitionOut, 84 speed: r.animationSpeed, 85 collapse: r.transitionCollapse, 86 uncollapse: r.transitionUncollapse, 87 halfSpeed: r.animationSpeed / 2 88 } : { 89 show: "show", 90 hide: "hide", 91 speed: 0, 92 collapse: "hide", 93 uncollapse: "show", 94 halfSpeed: 0 95 } 96 }; 97 f.getTabs = function() { 98 var x; 99 f.tabs = q.find(r.tabs), f.panels = a(), f.tabs.each(function() { 100 var A = a(this), 101 z = A.children("a"), 102 y = A.children("a").data("target"); 103 A.data("easytabs", {}); 104 if (y !== undefined && y !== null) { 105 A.data("easytabs").ajax = z.attr("href") 106 } else { 107 y = z.attr("href") 108 } 109 y = y.match(/#([^\?]+)/)[1]; 110 x = r.panelContext.find("#" + y); 111 if (x.length) { 112 x.data("easytabs", { 113 position: x.css("position"), 114 visibility: x.css("visibility") 115 }); 116 x.not(r.panelActiveClass).hide(); 117 f.panels = f.panels.add(x); 118 A.data("easytabs").panel = x 119 } else { 120 f.tabs = f.tabs.not(A); 121 if ("console" in window) { 122 console.warn("Warning: tab without matching panel for selector '#" + y + "' removed from set") 123 } 124 } 125 }) 126 }; 127 f.selectTab = function(x, C) { 128 var y = window.location, 129 B = y.hash.match(/^[^\?]*/)[0], 130 z = x.parent().data("easytabs").panel, 131 A = x.parent().data("easytabs").ajax; 132 if (r.collapsible && !d && (x.hasClass(r.tabActiveClass) || x.hasClass(r.collapsedClass))) { 133 f.toggleTabCollapse(x, z, A, C) 134 } else { 135 if (!x.hasClass(r.tabActiveClass) || !z.hasClass(r.panelActiveClass)) { 136 o(x, z, A, C) 137 } else { 138 if (!r.cache) { 139 o(x, z, A, C) 140 } 141 } 142 } 143 }; 144 f.toggleTabCollapse = function(x, y, z, A) { 145 f.panels.stop(true, true); 146 if (u(q, "easytabs:before", [x, y, r])) { 147 f.tabs.filter("." + r.tabActiveClass).removeClass(r.tabActiveClass).children().removeClass(r.tabActiveClass); 148 if (x.hasClass(r.collapsedClass)) { 149 if (z && (!r.cache || !x.parent().data("easytabs").cached)) { 150 q.trigger("easytabs:ajax:beforeSend", [x, y]); 151 y.load(z, function(C, B, D) { 152 x.parent().data("easytabs").cached = true; 153 q.trigger("easytabs:ajax:complete", [x, y, C, B, D]) 154 }) 155 } 156 x.parent().removeClass(r.collapsedClass).addClass(r.tabActiveClass).children().removeClass(r.collapsedClass).addClass(r.tabActiveClass); 157 y.addClass(r.panelActiveClass)[v.uncollapse](v.speed, r.transitionUncollapseEasing, function() { 158 q.trigger("easytabs:midTransition", [x, y, r]); 159 if (typeof A == "function") { 160 A() 161 } 162 }) 163 } else { 164 x.addClass(r.collapsedClass).parent().addClass(r.collapsedClass); 165 y.removeClass(r.panelActiveClass)[v.collapse](v.speed, r.transitionCollapseEasing, function() { 166 q.trigger("easytabs:midTransition", [x, y, r]); 167 if (typeof A == "function") { 168 A() 169 } 170 }) 171 } 172 } 173 }; 174 f.matchTab = function(x) { 175 return f.tabs.find("[href='" + x + "'],[data-target='" + x + "']").first() 176 }; 177 f.matchInPanel = function(x) { 178 return (x && f.validId(x) ? f.panels.filter(":has(" + x + ")").first() : []) 179 }; 180 f.validId = function(x) { 181 return x.substr(1).match(/^[A-Za-z]+[A-Za-z0-9\-_:\.].$/) 182 }; 183 f.selectTabFromHashChange = function() { 184 var y = window.location.hash.match(/^[^\?]*/)[0], 185 x = f.matchTab(y), 186 z; 187 if (r.updateHash) { 188 if (x.length) { 189 d = true; 190 f.selectTab(x) 191 } else { 192 z = f.matchInPanel(y); 193 if (z.length) { 194 y = "#" + z.attr("id"); 195 x = f.matchTab(y); 196 d = true; 197 f.selectTab(x) 198 } else { 199 if (!h.hasClass(r.tabActiveClass) && !r.cycle) { 200 if (y === "" || f.matchTab(m).length || q.closest(y).length) { 201 d = true; 202 f.selectTab(l) 203 } 204 } 205 } 206 } 207 } 208 }; 209 f.cycleTabs = function(x) { 210 if (r.cycle) { 211 x = x % f.tabs.length; 212 $tab = a(f.tabs[x]).children("a").first(); 213 d = true; 214 f.selectTab($tab, function() { 215 setTimeout(function() { 216 f.cycleTabs(x + 1) 217 }, r.cycle) 218 }) 219 } 220 }; 221 f.publicMethods = { 222 select: function(x) { 223 var y; 224 if ((y = f.tabs.filter(x)).length === 0) { 225 if ((y = f.tabs.find("a[href='" + x + "']")).length === 0) { 226 if ((y = f.tabs.find("a" + x)).length === 0) { 227 if ((y = f.tabs.find("[data-target='" + x + "']")).length === 0) { 228 if ((y = f.tabs.find("a[href$='" + x + "']")).length === 0) { 229 a.error("Tab '" + x + "' does not exist in tab set") 230 } 231 } 232 } 233 } 234 } else { 235 y = y.children("a").first() 236 } 237 f.selectTab(y) 238 } 239 }; 240 var u = function(A, x, z) { 241 var y = a.Event(x); 242 A.trigger(y, z); 243 return y.result !== false 244 }; 245 var b = function() { 246 q.addClass(r.containerClass); 247 f.tabs.parent().addClass(r.tabsClass); 248 f.tabs.addClass(r.tabClass); 249 f.panels.addClass(r.panelClass) 250 }; 251 var g = function() { 252 var y = window.location.hash.match(/^[^\?]*/)[0], 253 x = f.matchTab(y).parent(), 254 z; 255 if (x.length === 1) { 256 h = x; 257 r.cycle = false 258 } else { 259 z = f.matchInPanel(y); 260 if (z.length) { 261 y = "#" + z.attr("id"); 262 h = f.matchTab(y).parent() 263 } else { 264 h = f.tabs.parent().find(r.defaultTab); 265 if (h.length === 0) { 266 a.error("The specified default tab ('" + r.defaultTab + "') could not be found in the tab set ('" + r.tabs + "') out of " + f.tabs.length + " tabs.") 267 } 268 } 269 } 270 l = h.children("a").first(); 271 p(x) 272 }; 273 var p = function(z) { 274 var y, x; 275 if (r.collapsible && z.length === 0 && r.collapsedByDefault) { 276 h.addClass(r.collapsedClass).children().addClass(r.collapsedClass) 277 } else { 278 y = a(h.data("easytabs").panel); 279 x = h.data("easytabs").ajax; 280 if (x && (!r.cache || !h.data("easytabs").cached)) { 281 q.trigger("easytabs:ajax:beforeSend", [l, y]); 282 y.load(x, function(B, A, C) { 283 h.data("easytabs").cached = true; 284 q.trigger("easytabs:ajax:complete", [l, y, B, A, C]) 285 }) 286 } 287 h.data("easytabs").panel.show().addClass(r.panelActiveClass); 288 h.addClass(r.tabActiveClass).children().addClass(r.tabActiveClass) 289 } 290 q.trigger("easytabs:initialised", [l, y]) 291 }; 292 var w = function() { 293 f.tabs.children("a").bind(r.bind_str, function(x) { 294 r.cycle = false; 295 d = false; 296 f.selectTab(a(this)); 297 x.preventDefault ? x.preventDefault() : x.returnValue = false 298 }) 299 }; 300 var o = function(z, D, E, H) { 301 f.panels.stop(true, true); 302 if (u(q, "easytabs:before", [z, D, r])) { 303 var A = f.panels.filter(":visible"), 304 y = D.parent(), 305 F, x, C, G, B = window.location.hash.match(/^[^\?]*/)[0]; 306 if (r.animate) { 307 F = s(D); 308 x = A.length ? k(A) : 0; 309 C = F - x 310 } 311 m = B; 312 G = function() { 313 q.trigger("easytabs:midTransition", [z, D, r]); 314 if (r.animate && r.transitionIn == "fadeIn") { 315 if (C < 0) { 316 y.animate({ 317 height: y.height() + C 318 }, v.halfSpeed).css({ 319 "min-height": "" 320 }) 321 } 322 } 323 if (r.updateHash && !d) { 324 window.location.hash = "#" + D.attr("id") 325 } else { 326 d = false 327 } 328 D[v.show](v.speed, r.transitionInEasing, function() { 329 y.css({ 330 height: "", 331 "min-height": "" 332 });
333 q.trigger("easytabs:after", [z, D, r]); 334 if (typeof H == "function") { 335 H() 336 } 337 }) 338 }; 339 if (E && (!r.cache || !z.parent().data("easytabs").cached)) { 340 q.trigger("easytabs:ajax:beforeSend", [z, D]); 341 D.load(E, function(J, I, K) { 342 z.parent().data("easytabs").cached = true; 343 q.trigger("easytabs:ajax:complete", [z, D, J, I, K]) 344 }) 345 } 346 if (r.animate && r.transitionOut == "fadeOut") { 347 if (C > 0) { 348 y.animate({ 349 height: (y.height() + C) 350 }, v.halfSpeed) 351 } else { 352 y.css({ 353 "min-height": y.height() 354 }) 355 } 356 } 357 f.tabs.filter("." + r.tabActiveClass).removeClass(r.tabActiveClass).children().removeClass(r.tabActiveClass); 358 f.tabs.filter("." + r.collapsedClass).removeClass(r.collapsedClass).children().removeClass(r.collapsedClass); 359 z.parent().addClass(r.tabActiveClass).children().addClass(r.tabActiveClass); 360 f.panels.filter("." + r.panelActiveClass).removeClass(r.panelActiveClass); 361 D.addClass(r.panelActiveClass); 362 if (A.length) { 363 A[v.hide](v.speed, r.transitionOutEasing, G) 364 } else { 365 D[v.uncollapse](v.speed, r.transitionUncollapseEasing, G) 366 } 367 } 368 }; 369 var s = function(z) { 370 if (z.data("easytabs") && z.data("easytabs").lastHeight) { 371 return z.data("easytabs").lastHeight 372 } 373 var B = z.css("display"), 374 y, x; 375 try { 376 y = a("<div></div>", { 377 position: "absolute", 378 visibility: "hidden", 379 overflow: "hidden" 380 }) 381 } catch (A) { 382 y = a("<div></div>", { 383 visibility: "hidden", 384 overflow: "hidden" 385 }) 386 } 387 x = z.wrap(y).css({ 388 position: "relative", 389 visibility: "hidden", 390 display: "block" 391 }).outerHeight(); 392 z.unwrap(); 393 z.css({ 394 position: z.data("easytabs").position, 395 visibility: z.data("easytabs").visibility, 396 display: B 397 }); 398 z.data("easytabs").lastHeight = x; 399 return x 400 }; 401 var k = function(y) { 402 var x = y.outerHeight(); 403 if (y.data("easytabs")) { 404 y.data("easytabs").lastHeight = x 405 } else { 406 y.data("easytabs", { 407 lastHeight: x 408 }) 409 } 410 return x 411 }; 412 var n = function() { 413 if (typeof a(window).hashchange === "function") { 414 a(window).hashchange(function() { 415 f.selectTabFromHashChange() 416 }) 417 } else { 418 if (a.address && typeof a.address.change === "function") { 419 a.address.change(function() { 420 f.selectTabFromHashChange() 421 }) 422 } 423 } 424 }; 425 var c = function() { 426 var x; 427 if (r.cycle) { 428 x = f.tabs.index(h); 429 setTimeout(function() { 430 f.cycleTabs(x + 1) 431 }, r.cycle) 432 } 433 }; 434 f.init() 435 }; 436 a.fn.easytabs = function(c) { 437 var b = arguments; 438 return this.each(function() { 439 var e = a(this), 440 d = e.data("easytabs"); 441 if (undefined === d) { 442 d = new a.easytabs(this, c); 443 e.data("easytabs", d) 444 } 445 if (d.publicMethods[c]) { 446 return d.publicMethods[c](Array.prototype.slice.call(b, 1)) 447 } 448 }) 449 } 450})(jQuery);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.