1/*! (c) Mat Marquis (@wilto). MIT License. http://wil.to/3a */ 2 3(function( $, undefined ) { 4 var inst = 0; 5 6 $.fn.getPercentage = function() { 7 var oPercent = this.attr('style').match(/margin\-left:(.*[0-9])/i) && parseInt(RegExp.$1); 8 9 return oPercent; 10 }; 11 12 $.fn.adjRounding = function(slide) { 13 var $el = $(this), 14 $slides = $el.find( slide ), 15 diff = $el.parent().width() - $($slides[0]).width(); 16 17 if (diff !== 0) { 18 $($slides).css( "position", "relative" ); 19 20 for (var i = 0; i < $slides.length; i++) { 21 $($slides[i]).css( "left", (diff * i) + "px" ); 22 } 23 } 24 25 return this; 26 }; 27 28 $.fn.carousel = function(config) { 29 30 // Prevent re-init: 31 if( this.data( "carousel-initialized" ) ) { return; } 32 33 // Carousel is being initialized: 34 this.data( "carousel-initialized", true ); 35 36 var defaults = { 37 slider : '.slider', 38 slide : '.slide', 39 prevSlide : null, 40 nextSlide : null, 41 slideHed : null, 42 addPagination : false, 43 addNav : ( config != undefined && ( config.prevSlide || config.nextSlide ) ) ? false : true, 44 namespace : 'carousel', 45 speed : 300 46 }, 47 opt = $.extend(defaults, config), 48 $slidewrap = this, 49 dBody = (document.body || document.documentElement), 50 transitionSupport = function() { 51 // Original code from Modernizr : http://www.modernizr.com/ 52 var prop = 'transitionProperty', 53 modElem = document.createElement('tester'), 54 mStyle = modElem.style, 55 prefixes = ' -webkit- -moz- -o- -ms- -khtml- '.split(' '), 56 domPrefixes = 'Webkit Moz O ms Khtml'.split(' '), 57 ucProp = prop.charAt(0).toUpperCase() + prop.substr(1), 58 props = (prop + ' ' + domPrefixes.join(ucProp + ' ') + ucProp).split(' '); 59 60 for ( var i in props ) { 61 if ( mStyle[ props[i] ] !== undefined ) { 62 return true; 63 } 64 } 65 return false; 66 }, 67 carousel = { 68 init : function() { 69 inst++; 70 71 $slidewrap.each(function(carInt) { 72 var $wrap = $(this), 73 $slider = $wrap.find(opt.slider), 74 $slide = $wrap.find(opt.slide), 75 slidenum = $slide.length, 76 transition = "margin-left " + ( opt.speed / 1000 ) + "s ease", 77 tmp = 'carousel-' + inst + '-' + carInt; 78 79 if( $slide.length <= 1 ) { 80 return; /* No sense running all this code if the carousel functionality is unnecessary. */ 81 } 82 83 $wrap 84 .css({ 85 overflow : "hidden", 86 width : "100.2%" 87 }) 88 .attr('role' , 'application'); 89 90 $slider 91 .attr( 'id', ( $slider[0].id || 'carousel-' + inst + '-' + carInt ) ) 92 .css({ 93 "marginLeft" : "0px", 94 "float" : "left", 95 "width" : 100 * slidenum + "%", 96 "-webkit-transition" : transition, 97 "-moz-transition" : transition, 98 "-ms-transition" : transition, 99 "-o-transition" : transition, 100 "transition" : transition 101 }) 102 .bind( 'carouselmove' , carousel.move ) 103 .bind( 'nextprev' , carousel.nextPrev ) 104 .bind( 'navstate' , carousel.navState ); 105 106 $slide 107 .css({ 108 "float": "left", 109 width: (100 / slidenum) + "%" 110 }) 111 .each(function(i) { 112 var $el = $(this); 113 114 $el.attr({ 115 role : "tabpanel document", 116 id : tmp + '-slide' + i 117 });
118 119 if( opt.addPagination ) { 120 $el.attr('aria-labelledby', tmp + '-tab' + i); 121 } 122 }); 123 124 // Build and insert navigation/pagination, if specified in the options: 125 opt.addPagination && carousel.addPagination(); 126 opt.addNav && carousel.addNav(); 127 128 $slider.trigger( "navstate", { current: 0 }); 129 }); 130 }, 131 addNav : function() { 132 $slidewrap.each(function(i) { 133 var $oEl = $(this), 134 $slider = $oEl.find(opt.slider), 135 currentSlider = $slider[0].id, 136 navMarkup = [ 137 '<ul class="slidecontrols" role="navigation">', 138 ' <li role="presentation"><a href="#' + currentSlider + '" class="' + opt.namespace + '-next">Next</a></li>', 139 ' <li role="presentation"><a href="#' + currentSlider + '" class="' + opt.namespace + '-prev">Prev</a></li>', 140 '</ul>' 141 ].join(''), 142 nextprev = { 143 nextSlide : '.' + opt.namespace + '-next', 144 prevSlide : '.' + opt.namespace + '-prev' 145 }; 146 147 opt = $.extend(opt, nextprev); 148 149 $oEl.prepend(navMarkup); 150 }); 151 }, 152 addPagination : function() { 153 $slidewrap.each(function(i) { 154 var $oEl = $(this), 155 $pagination = $('<ol class="' + opt.namespace + '-tabs" role="tablist navigation" />'), 156 $slider = $oEl.find(opt.slider), 157 $slides = $oEl.find(opt.slide) 158 slideNum = $slides.length, 159 associated = 'carousel-' + inst + '-' + i; 160 161 while( slideNum-- ) { 162 var hed = $( $slides[ slideNum ] ).find( opt.slideHed ).text() || 'Page ' + ( slideNum + 1 ), 163 tabMarkup = [ 164 '<li role="presentation">', 165 '<a href="#' + associated + '-slide' + slideNum +'"', 166 ' aria-controls="' + associated + '-slide' + slideNum +'"', 167 ' id="' + associated + '-tab' + slideNum + '" role="tab">' + hed + '</a>', 168 '</li>' 169 ].join(''); 170 171 $pagination.prepend(tabMarkup); 172 }; 173 174 $pagination 175 .appendTo( $oEl ) 176 .find('li').keydown( function(e) { 177 var $el = $(this), 178 $prevTab = $el.prev().find('a'), 179 $nextTab = $el.next().find('a'); 180 181 switch( e.which ) { 182 case 37: 183 case 38: 184 $prevTab.length && $prevTab.trigger('click').focus(); 185 e.preventDefault(); 186 break; 187 case 39: 188 case 40: 189 $nextTab.length && $nextTab.trigger('click').focus(); 190 e.preventDefault(); 191 break; 192 } 193 }) 194 .find('a').click( function(e) { 195 var $el = $(this); 196 197 if( $el.attr('aria-selected') == 'false' ) { 198 var current = $el.parent().index(), 199 move = -( 100 * ( current ) ), 200 $slider = $oEl.find( opt.slider ); 201 202 $slider.trigger( 'carouselmove', { moveTo: move }); 203 } 204 e.preventDefault(); 205 }); 206 }); 207 }, 208 roundDown : function(oVal) { 209 var val = parseInt(oVal, 10); 210 211 return Math.ceil( (val - (val % 100 ) ) / 100) * 100; 212 }, 213 navState : function(e, ui) { 214 var $el = $(this), 215 $slides = $el.find(opt.slide), 216 ind = -(ui.current / 100), 217 $activeSlide = $($slides[ind]); 218 219 $el.attr('aria-activedescendant', $activeSlide[0].id); 220 221 // Update state of active tabpanel: 222 $activeSlide 223 .addClass( opt.namespace + "-active-slide" ) 224 .attr( 'aria-hidden', false ) 225 .siblings() 226 .removeClass( opt.namespace + "-active-slide" ) 227 .attr( 'aria-hidden', true ); 228 229 // Update state of next/prev navigation: 230 if( ( !!opt.prevSlide || !!opt.nextSlide ) ) { 231 var $target = $('[href*="#' + this.id + '"]'); 232 233 $target.removeClass( opt.namespace + '-disabled' ); 234 235 if( ind == 0 ) { 236 $target.filter(opt.prevSlide).addClass( opt.namespace + '-disabled' ); 237 } else if( ind == $slides.length - 1 ) { 238 $target.filter(opt.nextSlide).addClass( opt.namespace + '-disabled' ); 239 } 240 } 241 242 // Update state of pagination tabs: 243 if( !!opt.addPagination ) { 244 var tabId = $activeSlide.attr('aria-labelledby'), 245 $tab = $('#' + tabId ); 246 247 $tab 248 .parent()
249 .addClass(opt.namespace + '-active-tab') 250 .siblings() 251 .removeClass(opt.namespace + '-active-tab') 252 .find('a') 253 .attr({ 254 'aria-selected' : false, 255 'tabindex' : -1 256 }); 257 258 $tab.attr({ 259 'aria-selected' : true, 260 'tabindex' : 0 261 }); 262 } 263 }, 264 move : function(e, ui) { 265 var $el = $(this); 266 267 $el 268 .trigger(opt.namespace + "-beforemove") 269 .trigger("navstate", { current: ui.moveTo }); 270 271 if( transitionSupport() ) { 272 273 $el 274 .adjRounding( opt.slide ) /* Accounts for browser rounding errors. Lookinâ at you, iOS Safari. */ 275 .css('marginLeft', ui.moveTo + "%") 276 .one("transitionend webkitTransitionEnd OTransitionEnd", function() { 277 $(this).trigger( opt.namespace + "-aftermove" ); 278 }); 279 280 } else { 281 $el 282 .adjRounding( opt.slide ) 283 .animate({ marginLeft: ui.moveTo + "%" }, { duration : opt.speed, queue : false }, function() { 284 $(this).trigger( opt.namespace + "-aftermove" ); 285 }); 286 } 287 }, 288 nextPrev : function(e, ui) { 289 var $el = $(this), 290 left = ( $el ) ? $el.getPercentage() : 0, 291 $slide = $el.find(opt.slide), 292 constrain = ui.dir === 'prev' ? left != 0 : -left < ($slide.length - 1) * 100, 293 $target = $( '[href="#' + this.id + '"]'); 294 295 if (!$el.is(":animated") && constrain ) { 296 297 if ( ui.dir === 'prev' ) { 298 left = ( left % 100 != 0 ) ? carousel.roundDown(left) : left + 100; 299 } else { 300 left = ( ( left % 100 ) != 0 ) ? carousel.roundDown(left) - 100 : left - 100; 301 } 302 303 $el.trigger('carouselmove', { moveTo: left }); 304 305 $target 306 .removeClass( opt.namespace + '-disabled') 307 .removeAttr('aria-disabled'); 308 309 switch( left ) { 310 case ( -($slide.length - 1) * 100 ): 311 $target.filter(opt.nextSlide) 312 .addClass( opt.namespace + '-disabled') 313 .attr('aria-disabled', true); 314 break; 315 case 0: 316 $target.filter(opt.prevSlide) 317 .addClass( opt.namespace + '-disabled') 318 .attr('aria-disabled', true); 319 break; 320 } 321 } else { 322 var reset = carousel.roundDown(left); 323 324 $el.trigger('carouselmove', { moveTo: reset }); 325 } 326 327 } 328 }; 329 330 carousel.init(this); 331 332 $(opt.nextSlide + ',' + opt.prevSlide) 333 .bind('click', function(e) { 334 var $el = $(this), 335 link = this.hash, 336 dir = ( $el.is(opt.prevSlide) ) ? 'prev' : 'next', 337 $slider = $(link); 338 339 if ( $el.is('.' + opt.namespace + '-disabled') ) { 340 return false; 341 } 342 343 $slider.trigger('nextprev', { dir: dir }); 344 345 e.preventDefault(); 346 }) 347 .bind('keydown', function(e) { 348 var $el = $(this), 349 link = this.hash; 350 351 switch (e.which) { 352 case 37: 353 case 38: 354 $('#' + link).trigger('nextprev', { dir: 'next' }); 355 e.preventDefault(); 356 break; 357 case 39: 358 case 40: 359 $('#' + link).trigger('nextprev', { dir: 'prev' }); 360 e.preventDefault(); 361 break; 362 } 363 }); 364 365 var setup = { 366 wrap : this, 367 slider : opt.slider 368 }; 369 $slidewrap.bind( "dragSnap", setup, function(e, ui){ 370 var $slider = $(this).find( opt.slider ), 371 dir = ( ui.direction === "left" ) ? 'next' : 'prev'; 372 373 $slider.trigger("nextprev", { dir: dir }); 374 }); 375 376 377// start new code for auto rotate carousel slider 378 379 $slidewrap.filter('[data-autorotate]').each(function() { 380 var auto, 381 $el = $(this), 382 speed = $el.attr('data-autorotate'), 383 $slider = $el.find(opt.slider), 384 slidenum = $el.find(opt.slide).length, 385 forward = true, 386 autoAdvance = function() { 387 var active = -( $slider.getPercentage() / 100 ) + 1; 388 389 switch ( active ) { 390 case slidenum: 391 forward = false; 392 break; 393 case 1: 394 forward = true; 395 break; 396 } 397 398 $slider.trigger("nextprev", { dir: (forward) ? 'next' : 'prev' }); 399 }; 400 401 auto = setInterval(autoAdvance, speed); 402 403 $el 404 .attr('aria-live', 'polite') 405 .bind('mouseenter click touchstart', function() { 406 clearInterval(auto); 407 }); 408 }); 409 410 return this; 411 }; 412})(jQuery); 413 414 415// End new code 416 417 418$.event.special.dragSnap = { 419 setup: function(setup) { 420 421 var $el = $(this), 422 transitionSwap = function($el, tog) { 423 var speed = .3, 424 transition = ( tog ) ? "margin-left " + speed + "s ease" : 'none'; 425 426 $el.css({ 427 "-webkit-transition" : transition, 428 "-moz-transition" : transition, 429 "-ms-transition" : transition, 430 "-o-transition" : transition, 431 "transition" : transition 432 }); 433 },
434 roundDown = function(left) { 435 var left = parseInt(left, 10); 436 437 return Math.ceil( (left - (left % 100 ) ) / 100) * 100; 438 }, 439 snapBack = function(e, ui) { 440 var $el = ui.target, 441 currentPos = ( $el.attr('style') != undefined ) ? $el.getPercentage() : 0, 442 left = (ui.left === false) ? roundDown(currentPos) - 100 : roundDown(currentPos), 443 dStyle = document.body.style, 444 transitionSupport = function() { 445 // Original code from Modernizr : http://www.modernizr.com/ 446 var prop = 'transitionProperty', 447 modElem = document.createElement('tester'), 448 mStyle = modElem.style, 449 prefixes = ' -webkit- -moz- -o- -ms- -khtml- '.split(' '), 450 domPrefixes = 'Webkit Moz O ms Khtml'.split(' '), 451 ucProp = prop.charAt(0).toUpperCase() + prop.substr(1), 452 props = (prop + ' ' + domPrefixes.join(ucProp + ' ') + ucProp).split(' '); 453 454 for ( var i in props ) { 455 if ( mStyle[ props[i] ] !== undefined ) { 456 return true; 457 } 458 } 459 return false; 460 }; 461 462 transitionSwap($el, true); 463 464 if( transitionSupport() ) { 465 $el.css('marginLeft', left + "%"); 466 } else { 467 $el.animate({ marginLeft: left + "%" }, opt.speed); 468 } 469 }; 470 471 $el 472 .bind("snapback", snapBack) 473 .bind("touchstart", function(e) { 474 var data = e.originalEvent.touches ? e.originalEvent.touches[0] : e, 475 start = { 476 time: (new Date).getTime(), 477 coords: [ data.pageX, data.pageY ], 478 origin: $(e.target).closest( setup.wrap ) 479 }, 480 stop, 481 $tEl = $(e.target).closest( setup.slider ), 482 currentPos = ( $tEl.attr('style') != undefined ) ? $tEl.getPercentage() : 0; 483 484 transitionSwap($tEl, false); 485 486 function moveHandler(e) { 487 var data = e.originalEvent.touches ? e.originalEvent.touches[0] : e; 488 stop = { 489 time: (new Date).getTime(), 490 coords: [ data.pageX, data.pageY ] 491 }; 492 493 if(!start || Math.abs(start.coords[0] - stop.coords[0]) < Math.abs(start.coords[1] - stop.coords[1]) ) { 494 return; 495 } 496 497 $tEl.css({"margin-left": currentPos + ( ( (stop.coords[0] - start.coords[0]) / start.origin.width() ) * 100 ) + '%' }); 498 499 // prevent scrolling 500 if (Math.abs(start.coords[0] - stop.coords[0]) > 10) { 501 e.preventDefault(); 502 } 503 504 }; 505 506 $el 507 .bind("gesturestart", function(e) { 508 $el 509 .unbind("touchmove", moveHandler) 510 .unbind("touchend", moveHandler); 511 }) 512 .bind("touchmove", moveHandler) 513 .one("touchend", function(e) { 514 515 $el.unbind("touchmove", moveHandler); 516 517 transitionSwap($tEl, true); 518 519 if (start && stop ) { 520 521 if (Math.abs(start.coords[0] - stop.coords[0]) > 10 522 && Math.abs(start.coords[0] - stop.coords[0]) > Math.abs(start.coords[1] - stop.coords[1])) { 523 e.preventDefault(); 524 } else { 525 $el.trigger('snapback', { target: $tEl, left: true }); 526 return; 527 } 528 529 if (Math.abs(start.coords[0] - stop.coords[0]) > 1 && Math.abs(start.coords[1] - stop.coords[1]) < 75) { 530 var left = start.coords[0] > stop.coords[0]; 531 532 if( -( stop.coords[0] - start.coords[0]) > ( start.origin.width() / 4 ) || ( stop.coords[0] - start.coords[0]) > ( start.origin.width() / 4 ) ) { 533 534 start.origin.trigger("dragSnap", {direction: left ? "left" : "right"}); 535 536 } else { 537 $el.trigger('snapback', { target: $tEl, left: left }); 538 } 539 540 } 541 } 542 start = stop = undefined; 543 }); 544 }); 545 } 546};
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.