1/* 2 * jQuery EasyTabs plugin 3.1.1 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 : Tue Jan 26 16 : 30 : 00 2012 - 0500 11 */ 12(function(a) 13{ 14 a.easytabs = function(j, e) 15 { 16 var f = this, q = a(j), i = 17 { 18 animate : true, panelActiveClass : "active", tabActiveClass : "active", defaultTab : "li:first-child", animationSpeed : "normal", tabs : "> ul > li", updateHash : true, cycle : false, collapsible : false, collapsedClass : "collapsed", collapsedByDefault : true, uiTabs : false, transitionIn : "fadeIn", transitionOut : "fadeOut", transitionInEasing : "swing", transitionOutEasing : "swing", transitionCollapse : "slideUp", transitionUncollapse : "slideDown", transitionCollapseEasing : "swing", transitionUncollapseEasing : "swing", containerClass : "", tabsClass : "", tabClass : "", panelClass : "", cache : true, panelContext : q 19 } 20 , h, l, v, m, d, t = 21 { 22 fast : 200, normal : 400, slow : 600 23 } 24 , r; 25 f.init = function() 26 { 27 f.settings = r = a.extend( 28 { 29 } 30 , i, e); 31 if(r.uiTabs) 32 { 33 r.tabActiveClass = "ui-tabs-selected"; 34 r.containerClass = "ui-tabs ui-widget ui-widget-content ui-corner-all"; 35 r.tabsClass = "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all"; 36 r.tabClass = "ui-state-default ui-corner-top"; 37 r.panelClass = "ui-tabs-panel ui-widget-content ui-corner-bottom" 38 } 39 if(r.collapsible && e.defaultTab !== undefined && e.collpasedByDefault === undefined) 40 { 41 r.collapsedByDefault = false 42 } 43 if(typeof(r.animationSpeed) === "string") 44 { 45 r.animationSpeed = t[r.animationSpeed] 46 } 47 a("a.anchor").remove().prependTo("body"); 48 q.data("easytabs", 49 { 50 } 51 ); 52 f.setTransitions(); 53 f.getTabs(); 54 b(); 55 g(); 56 w(); 57 n(); 58 c(); 59 q.attr("data-easytabs", true) 60 } 61 ; 62 f.setTransitions = function() 63 { 64 v = (r.animate) ? 65 { 66 show : r.transitionIn, hide : r.transitionOut, speed : r.animationSpeed, collapse : r.transitionCollapse, uncollapse : r.transitionUncollapse, halfSpeed : r.animationSpeed / 2 67 } 68 : 69 { 70 show : "show", hide : "hide", speed : 0, collapse : "hide", uncollapse : "show", halfSpeed : 0 71 } 72 } 73 ; 74 f.getTabs = function() 75 { 76 var x; 77 f.tabs = q.find(r.tabs), f.panels = a(), f.tabs.each(function() 78 { 79 var A = a(this), z = A.children("a"), y = A.children("a").data("target"); 80 A.data("easytabs", 81 { 82 } 83 ); 84 if(y !== undefined && y !== null) 85 { 86 A.data("easytabs").ajax = z.attr("href") 87 } 88 else 89 { 90 y = z.attr("href") 91 } 92 y = y.match(/#([^\?]+)/)[0].substr(1); 93 x = r.panelContext.find("#" + y); 94 if(x.length) 95 { 96 x.data("easytabs", 97 { 98 position : x.css("position"), visibility : x.css("visibility") 99 } 100 ); 101 x.not(r.panelActiveClass).hide(); 102 f.panels = f.panels.add(x); 103 A.data("easytabs").panel = x 104 } 105 else 106 { 107 f.tabs = f.tabs.not(A) 108 } 109 } 110 ) 111 } 112 ; 113 f.selectTab = function(x, C) 114 { 115 var y = window.location, B = y.hash.match(/^[^\?]*/)[0], z = x.parent().data("easytabs").panel, A = x.parent().data("easytabs").ajax; 116 if(r.collapsible && ! d && (x.hasClass(r.tabActiveClass) || x.hasClass(r.collapsedClass))) 117 { 118 f.toggleTabCollapse(x, z, A, C) 119 } 120 else 121 { 122 if( ! x.hasClass(r.tabActiveClass) || ! z.hasClass(r.panelActiveClass)) 123 { 124 o(x, z, A, C) 125 } 126 else 127 { 128 if( ! r.cache) 129 { 130 o(x, z, A, C) 131 } 132 } 133 } 134 } 135 ; 136 f.toggleTabCollapse = function(x, y, z, A) 137 { 138 f.panels.stop(true, true); 139 if(u(q, "easytabs:before", [x, y, r])) 140 { 141 f.tabs.filter("." + r.tabActiveClass).removeClass(r.tabActiveClass).children().removeClass(r.tabActiveClass); 142 if(x.hasClass(r.collapsedClass)) 143 { 144 if(z && ( ! r.cache || ! x.parent().data("easytabs").cached)) 145 { 146 q.trigger("easytabs:ajax:beforeSend", [x, y]); y.load(z, function(C, B, D) 147 { 148 x.parent().data("easytabs").cached = true; 149 q.trigger("easytabs:ajax:complete", [x, y, C, B, D]) 150 } 151 ) 152 } 153 x.parent().removeClass(r.collapsedClass).addClass(r.tabActiveClass).children().removeClass(r.collapsedClass).addClass(r.tabActiveClass); 154 y.addClass(r.panelActiveClass)[v.uncollapse](v.speed, r.transitionUncollapseEasing, function() 155 { 156 q.trigger("easytabs:midTransition", [x, y, r]); 157 if(typeof A == "function") 158 { 159 A() 160 } 161 } 162 ) 163 } 164 else 165 { 166 x.addClass(r.collapsedClass).parent().addClass(r.collapsedClass); 167 y.removeClass(r.panelActiveClass)[v.collapse](v.speed, r.transitionCollapseEasing, function() 168 { 169 q.trigger("easytabs:midTransition", [x, y, r]); 170 if(typeof A == "function") 171 { 172 A() 173 } 174 } 175 ) 176 } 177 } 178 } 179 ; 180 f.matchTab = function(x) 181 { 182 return f.tabs.find("[href='"+x+"'],[data-target='"+x+"']").first() 183 } 184 ; 185 f.matchInPanel = function(x) 186 { 187 return(x ? f.panels.filter(":has(" + x + ")").first() : []) 188 } 189 ; 190 f.selectTabFromHashChange = function() 191 { 192 var y = window.location.hash.match(/^[^\?]*/)[0], x = f.matchTab(y), z; 193 if(r.updateHash) 194 { 195 if(x.length) 196 { 197 d = true; 198 f.selectTab(x) 199 } 200 else 201 { 202 z = f.matchInPanel(y); 203 if(z.length) 204 { 205 y = "#" + z.attr("id"); 206 x = f.matchTab(y); 207 d = true; 208 f.selectTab(x) 209 } 210 else 211 { 212 if( ! h.hasClass(r.tabActiveClass) && ! r.cycle) 213 { 214 if(y === "" || f.matchTab(m).length || q.closest(y).length) 215 { 216 d = true; 217 f.selectTab(l) 218 } 219 } 220 } 221 } 222 } 223 } 224 ; 225 f.cycleTabs = function(x) 226 { 227 if(r.cycle) 228 { 229 x = x % f.tabs.length; 230 $tab = a(f.tabs[x]).children("a").first(); 231 d = true; 232 f.selectTab($tab, function() 233 { 234 setTimeout(function() 235 { 236 f.cycleTabs(x + 1) 237 } 238 , r.cycle) 239 } 240 ) 241 } 242 } 243 ; 244 f.publicMethods = 245 { 246 select : function(x) 247 { 248 var y; 249 if((y = f.tabs.filter(x)).length === 0) 250 { 251 if((y = f.tabs.find("a[href='"+x+"']")).length === 0) 252 { 253 if((y = f.tabs.find("a" + x)).length === 0) 254 { 255 if((y = f.tabs.find("[data-target='"+x+"']")).length === 0) 256 { 257 if((y = f.tabs.find("a[href$='"+x+"']")).length === 0) 258 { 259 a.error("Tab '"+x+"' does not exist in tab set") 260 } 261 } 262 } 263 } 264 } 265 else 266 { 267 y = y.children("a").first() 268 } 269 f.selectTab(y) 270 } 271 } 272 ; 273 var u = function(A, x, z) 274 { 275 var y = a.Event(x); 276 A.trigger(y, z); 277 return y.result !== false 278 } 279 ; 280 var b = function() 281 { 282 q.addClass(r.containerClass); 283 f.tabs.parent().addClass(r.tabsClass); 284 f.tabs.addClass(r.tabClass); 285 f.panels.addClass(r.panelClass) 286 } 287 ; 288 var g = function() 289 { 290 var y = window.location.hash.match(/^[^\?]*/)[0], x = f.matchTab(y).parent(), z; 291 if(x.length === 1) 292 { 293 h = x; 294 r.cycle = false 295 } 296 else 297 { 298 z = f.matchInPanel(y); 299 if(z.length) 300 { 301 y = "#" + z.attr("id"); 302 h = f.matchTab(y).parent() 303 } 304 else 305 { 306 h = f.tabs.parent().find(r.defaultTab); 307 if(h.length === 0) 308 { 309 a.error("The specified default tab ('"+r.defaultTab+"') could not be found in the tab set.") 310 } 311 } 312 } 313 l = h.children("a").first(); 314 p(x) 315 } 316 ; 317 var p = function(z) 318 { 319 var y, x; 320 if(r.collapsible && z.length === 0 && r.collapsedByDefault) 321 { 322 h.addClass(r.collapsedClass).children().addClass(r.collapsedClass) 323 } 324 else 325 { 326 y = a(h.data("easytabs").panel); 327 x = h.data("easytabs").ajax; 328 if(x && ( ! r.cache || ! h.data("easytabs").cached)) 329 { 330 q.trigger("easytabs:ajax:beforeSend", [l, y]); y.load(x, function(B, A, C) 331 { 332 h.data("easytabs").cached = true; 333 q.trigger("easytabs:ajax:complete", [l, y, B, A, C]) 334 } 335 ) 336 } 337 h.data("easytabs").panel.show().addClass(r.panelActiveClass); 338 h.addClass(r.tabActiveClass).children().addClass(r.tabActiveClass) 339 } 340 } 341 ; 342 var w = function() 343 { 344 f.tabs.children("a").bind("click.easytabs", function(x) 345 { 346 r.cycle = false; 347 d = false; 348 f.selectTab(a(this)); 349 x.preventDefault() 350 } 351 ) 352 } 353 ; 354 var o = function(z, D, E, H) 355 { 356 f.panels.stop(true, true); 357 if(u(q, "easytabs:before", [z, D, r])) 358 { 359 var A = f.panels.filter(":visible"), y = D.parent(), F, x, C, G, B = window.location.hash.match(/^[^\?]*/)[0]; 360 if(r.animate) 361 { 362 F = s(D); 363 x = A.length ? k(A) : 0; 364 C = F - x 365 } 366 m = B; 367 G = function() 368 { 369 q.trigger("easytabs:midTransition", [z, D, r]); 370 if(r.animate && r.transitionIn == "fadeIn") 371 { 372 if(C < 0) 373 { 374 y.animate( 375 { 376 height : y.height() + C 377 } 378 , v.halfSpeed).css( 379 { 380 "min-height" : "" 381 } 382 ) 383 } 384 } 385 if(r.updateHash && ! d) 386 { 387 window.location.hash = "#" + D.attr("id") 388 } 389 else 390 { 391 d = false 392 } 393 D[v.show](v.speed, r.transitionInEasing, function() 394 { 395 y.css( 396 { 397 height : "", "min-height" : "" 398 } 399 ); 400 q.trigger("easytabs:after", [z, D, r]);
401 if(typeof H == "function") 402 { 403 H() 404 } 405 } 406 ) 407 } 408 ; 409 if(E && ( ! r.cache || ! z.parent().data("easytabs").cached)) 410 { 411 q.trigger("easytabs:ajax:beforeSend", [z, D]); D.load(E, function(J, I, K) 412 { 413 z.parent().data("easytabs").cached = true; 414 q.trigger("easytabs:ajax:complete", [z, D, J, I, K]) 415 } 416 ) 417 } 418 if(r.animate && r.transitionOut == "fadeOut") 419 { 420 if(C > 0) 421 { 422 y.animate( 423 { 424 height : (y.height() + C) 425 } 426 , v.halfSpeed) 427 } 428 else 429 { 430 y.css( 431 { 432 "min-height" : y.height() 433 } 434 ) 435 } 436 } 437 f.tabs.filter("." + r.tabActiveClass).removeClass(r.tabActiveClass).children().removeClass(r.tabActiveClass); 438 f.tabs.filter("." + r.collapsedClass).removeClass(r.collapsedClass).children().removeClass(r.collapsedClass); 439 z.parent().addClass(r.tabActiveClass).children().addClass(r.tabActiveClass); 440 f.panels.filter("." + r.panelActiveClass).removeClass(r.panelActiveClass); 441 D.addClass(r.panelActiveClass); 442 if(A.length) 443 { 444 A[v.hide](v.speed, r.transitionOutEasing, G) 445 } 446 else 447 { 448 D[v.uncollapse](v.speed, r.transitionUncollapseEasing, G) 449 } 450 } 451 } 452 ; 453 var s = function(y) 454 { 455 if(y.data("easytabs") && y.data("easytabs").lastHeight) 456 { 457 return y.data("easytabs").lastHeight 458 } 459 var z = y.css("display"), x = y.wrap(a("<div>", 460 { 461 position : "absolute", visibility : "hidden", overflow : "hidden" 462 } 463 )).css( 464 { 465 position : "relative", visibility : "hidden", display : "block" 466 } 467 ).outerHeight(); 468 y.unwrap(); 469 y.css( 470 { 471 position : y.data("easytabs").position, visibility : y.data("easytabs").visibility, display : z 472 } 473 ); 474 y.data("easytabs").lastHeight = x; 475 return x 476 } 477 ; 478 var k = function(y) 479 { 480 var x = y.outerHeight(); 481 if(y.data("easytabs")) 482 { 483 y.data("easytabs").lastHeight = x 484 } 485 else 486 { 487 y.data("easytabs", 488 { 489 lastHeight : x 490 } 491 ) 492 } 493 return x 494 } 495 ; 496 var n = function() 497 { 498 if(typeof a(window).hashchange === "function") 499 { 500 a(window).hashchange(function() 501 { 502 f.selectTabFromHashChange() 503 } 504 ) 505 } 506 else 507 { 508 if(a.address && typeof a.address.change === "function") 509 { 510 a.address.change(function() 511 { 512 f.selectTabFromHashChange() 513 } 514 ) 515 } 516 } 517 } 518 ; 519 var c = function() 520 { 521 var x; 522 if(r.cycle) 523 { 524 x = f.tabs.index(h); 525 setTimeout(function() 526 { 527 f.cycleTabs(x + 1) 528 } 529 , r.cycle) 530 } 531 } 532 ; 533 f.init() 534 } 535 ; 536 a.fn.easytabs = function(c) 537 { 538 var b = arguments; 539 return this.each(function() 540 { 541 var e = a(this), d = e.data("easytabs"); 542 if(undefined === d) 543 { 544 d = new a.easytabs(this, c); 545 e.data("easytabs", d) 546 } 547 if(d.publicMethods[c]) 548 { 549 return d.publicMethods[c](Array.prototype.slice.call(b, 1)) 550 } 551 } 552 ) 553 } 554} 555)(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.