1/* 2 * jQuery carouFredSel 5.6.1 3 * Demo's and documentation: 4 * caroufredsel.frebsite.nl 5 * 6 * Copyright (c) 2012 Fred Heusschen 7 * www.frebsite.nl 8 * 9 * Dual licensed under the MIT and GPL licenses. 10 * http://en.wikipedia.org/wiki/MIT_License 11 * http://en.wikipedia.org/wiki/GNU_General_Public_License 12 */ 13 14 15(function($) { 16 17 18 19 // LOCAL 20 21 if ($.fn.carouFredSel) return; 22 23 $.fn.carouFredSel = function(options, configs) { 24 if (this.length == 0) { 25 debug(true, 'No element found for "'+this.selector+'".'); 26 return this; 27 } 28 if (this.length > 1) { 29 return this.each(function() { 30 $(this).carouFredSel(options, configs); 31 }); 32 } 33 34 var $cfs = this, 35 $tt0 = this[0]; 36 37 if ($cfs.data('cfs_isCarousel')) { 38 var starting_position = $cfs.triggerHandler('_cfs_triggerEvent', 'currentPosition'); 39 $cfs.trigger('_cfs_triggerEvent', ['destroy', true]); 40 } else { 41 var starting_position = false; 42 } 43 44 $cfs._cfs_init = function(o, setOrig, start) { 45 o = go_getObject($tt0, o); 46 47 var obs = ['items', 'scroll', 'auto', 'prev', 'next', 'pagination']; 48 for (var a = 0, l = obs.length; a < l; a++) { 49 o[obs[a]] = go_getObject($tt0, o[obs[a]]); 50 } 51 52 if (typeof o.scroll == 'number') { 53 if (o.scroll <= 50) o.scroll = { 'items' : o.scroll }; 54 else o.scroll = { 'duration' : o.scroll }; 55 } else { 56 if (typeof o.scroll == 'string') o.scroll = { 'easing' : o.scroll }; 57 } 58 59 if (typeof o.items == 'number') o.items = { 'visible' : o.items }; 60 else if ( o.items == 'variable') o.items = { 'visible' : o.items, 61 'width' : o.items, 62 'height' : o.items }; 63 64 if (typeof o.items != 'object') o.items = {}; 65 if (setOrig) opts_orig = $.extend(true, {}, $.fn.carouFredSel.defaults, o); 66 67 opts = $.extend(true, {}, $.fn.carouFredSel.defaults, o); 68 69 if (typeof opts.items.visibleConf != 'object') opts.items.visibleConf = {}; 70 71 if (opts.items.start == 0 && typeof start == 'number') { 72 opts.items.start = start; 73 } 74 75 crsl.upDateOnWindowResize = (opts.responsive); 76 crsl.direction = (opts.direction == 'up' || opts.direction == 'left') ? 'next' : 'prev'; 77 78 var dims = [ 79 ['width' , 'innerWidth' , 'outerWidth' , 'height' , 'innerHeight' , 'outerHeight' , 'left', 'top' , 'marginRight' , 0, 1, 2, 3], 80 ['height' , 'innerHeight' , 'outerHeight' , 'width' , 'innerWidth' , 'outerWidth' , 'top' , 'left', 'marginBottom', 3, 2, 1, 0] 81 ]; 82 83 var dn = dims[0].length, 84 dx = (opts.direction == 'right' || opts.direction == 'left') ? 0 : 1; 85 86 opts.d = {}; 87 for (var d = 0; d < dn; d++) { 88 opts.d[dims[0][d]] = dims[dx][d]; 89 } 90 91 var all_itm = $cfs.children(); 92 93 94 // check visible items 95 switch (typeof opts.items.visible) { 96 97 // min and max visible items 98 case 'object': 99 opts.items.visibleConf.min = opts.items.visible.min; 100 opts.items.visibleConf.max = opts.items.visible.max; 101 opts.items.visible = false; 102 break; 103 104 case 'string': 105 // variable visible items 106 if (opts.items.visible == 'variable') { 107 opts.items.visibleConf.variable = true; 108 109 // adjust string visible items 110 } else { 111 opts.items.visibleConf.adjust = opts.items.visible; 112 } 113 opts.items.visible = false; 114 break; 115 116 // function visible items 117 case 'function': 118 opts.items.visibleConf.adjust = opts.items.visible; 119 opts.items.visible = false; 120 break; 121 } 122 123 // set items filter 124 if (typeof opts.items.filter == 'undefined') { 125 opts.items.filter = (all_itm.filter(':hidden').length > 0) ? ':visible' : '*'; 126 } 127 128 // primary size set to auto -> measure largest size and set it 129 if (opts[opts.d['width']] == 'auto') { 130 opts[opts.d['width']] = ms_getTrueLargestSize(all_itm, opts, 'outerWidth'); 131 } 132 // primary size percentage 133 if (ms_isPercentage(opts[opts.d['width']]) && !opts.responsive) { 134 opts[opts.d['width']] = ms_getPercentage(ms_getTrueInnerSize($wrp.parent(), opts, 'innerWidth'), opts[opts.d['width']]); 135 crsl.upDateOnWindowResize = true; 136 } 137 138 // secondary size set to auto -> measure largest size and set it 139 if (opts[opts.d['height']] == 'auto') { 140 opts[opts.d['height']] = ms_getTrueLargestSize(all_itm, opts, 'outerHeight'); 141 } 142 143 // primary item-size not set 144 if (!opts.items[opts.d['width']]) { 145// responsive carousel -> set to largest 146if (opts.responsive) { 147 debug(true, 'Set a '+opts.d['width']+' for the items!'); 148 opts.items[opts.d['width']] = ms_getTrueLargestSize(all_itm, opts, 'outerWidth'); 149 // non-responsive -> measure it or set to "variable" 150} else { 151 opts.items[opts.d['width']] = (ms_hasVariableSizes(all_itm, opts, 'outerWidth')) 152 ? 'variable' 153 : all_itm[opts.d['outerWidth']](true); 154} 155 } 156 157 // secondary item-size not set -> measure it or set to "variable" 158 if (!opts.items[opts.d['height']]) { 159 opts.items[opts.d['height']] = (ms_hasVariableSizes(all_itm, opts, 'outerHeight')) 160 ? 'variable' 161 : all_itm[opts.d['outerHeight']](true); 162 } 163 164 // secondary size not set -> set to secondary item-size 165 if (!opts[opts.d['height']]) { 166 opts[opts.d['height']] = opts.items[opts.d['height']]; 167 } 168 169 // visible-items not set 170 if (!opts.items.visible && !opts.responsive) { 171 // primary item-size variable -> set visible items variable 172 if (opts.items[opts.d['width']] == 'variable') { 173 opts.items.visibleConf.variable = true; 174 } 175 if (!opts.items.visibleConf.variable) { 176 // primary size is number -> calculate visible-items 177 if (typeof opts[opts.d['width']] == 'number') { 178 opts.items.visible = Math.floor(opts[opts.d['width']] / opts.items[opts.d['width']]); 179 } else { 180 // measure and calculate primary size and visible-items 181 var maxS = ms_getTrueInnerSize($wrp.parent(), opts, 'innerWidth'); 182 opts.items.visible = Math.floor(maxS / opts.items[opts.d['width']]); 183 opts[opts.d['width']] = opts.items.visible * opts.items[opts.d['width']]; 184 if (!opts.items.visibleConf.adjust) opts.align = false;
185 } 186 if (opts.items.visible == 'Infinity' || opts.items.visible < 1) { 187 debug(true, 'Not a valid number of visible items: Set to "variable".'); 188 opts.items.visibleConf.variable = true; 189 } 190 } 191 } 192 193 // primary size not set -> calculate it or set to "variable" 194 if (!opts[opts.d['width']]) { 195 opts[opts.d['width']] = 'variable'; 196 if (!opts.responsive && opts.items.filter == '*' && !opts.items.visibleConf.variable && opts.items[opts.d['width']] != 'variable') { 197 opts[opts.d['width']] = opts.items.visible * opts.items[opts.d['width']]; 198 opts.align = false; 199 } 200 } 201 202 // variable primary item-sizes with variabe visible-items 203 if (opts.items.visibleConf.variable) { 204 opts.maxDimention = (opts[opts.d['width']] == 'variable') 205 ? ms_getTrueInnerSize($wrp.parent(), opts, 'innerWidth') 206 : opts[opts.d['width']]; 207 if (opts.align === false) { 208 opts[opts.d['width']] = 'variable'; 209 } 210 opts.items.visible = gn_getVisibleItemsNext(all_itm, opts, 0); 211 212 // set visible items by filter 213 } else if (opts.items.filter != '*') { 214 opts.items.visibleConf.org = opts.items.visible; 215 opts.items.visible = gn_getVisibleItemsNextFilter(all_itm, opts, 0); 216 } 217 218 // align not set -> set to center if primary size is number 219 if (typeof opts.align == 'undefined') { 220 opts.align = (opts[opts.d['width']] == 'variable') 221 ? false 222 : 'center'; 223 } 224 225 opts.items.visible = cf_getItemsAdjust(opts.items.visible, opts, opts.items.visibleConf.adjust, $tt0); 226 opts.items.visibleConf.old = opts.items.visible; 227 opts.usePadding = false; 228 229 230if (opts.responsive) { 231 232 if (!opts.items.visibleConf.min) opts.items.visibleConf.min = opts.items.visible; 233 if (!opts.items.visibleConf.max) opts.items.visibleConf.max = opts.items.visible; 234 235 opts.align = false; 236 opts.padding = [0, 0, 0, 0]; 237 238 var isVisible = $wrp.is(':visible'); 239 if (isVisible) $wrp.hide(); 240 var fullS = ms_getPercentage(ms_getTrueInnerSize($wrp.parent(), opts, 'innerWidth'), opts[opts.d['width']]); 241 242 if (typeof opts[opts.d['width']] == 'number' && fullS < opts[opts.d['width']]) { 243 fullS = opts[opts.d['width']]; 244 } 245 if (isVisible) $wrp.show(); 246 247 var visb = cf_getItemAdjustMinMax(Math.ceil(fullS / opts.items[opts.d['width']]), opts.items.visibleConf); 248 if (visb > all_itm.length) { 249 visb = all_itm.length; 250 } 251 252 var newS = Math.floor(fullS/visb), 253 seco = opts[opts.d['height']], 254 secp = ms_isPercentage(seco); 255 256 all_itm.each(function() { 257 var $t = $(this), 258 nw = newS - ms_getPaddingBorderMargin($t, opts, 'Width'); 259 260 $t[opts.d['width']](nw); 261 if (secp) { 262 $t[opts.d['height']](ms_getPercentage(nw, seco)); 263 } 264 }); 265 266 opts.items.visible = visb; 267 opts.items[opts.d['width']] = newS; 268 opts[opts.d['width']] = visb * newS; 269 270} else { 271 272 opts.padding = cf_getPadding(opts.padding); 273 274 if (opts.align == 'top') opts.align = 'left'; 275 if (opts.align == 'bottom') opts.align = 'right'; 276 277 278 switch (opts.align) { 279 // align: center, left or right 280 case 'center': 281 case 'left': 282 case 'right': 283 if (opts[opts.d['width']] != 'variable') { 284 var p = cf_getAlignPadding(gi_getCurrentItems(all_itm, opts), opts); 285 opts.usePadding = true; 286 opts.padding[opts.d[1]] = p[1]; 287 opts.padding[opts.d[3]] = p[0]; 288 } 289 break; 290 291 // padding 292 default: 293 opts.align = false; 294 opts.usePadding = ( 295 opts.padding[0] == 0 && 296 opts.padding[1] == 0 && 297 opts.padding[2] == 0 && 298 opts.padding[3] == 0 299 ) ? false : true; 300 break; 301 } 302} 303 304 if (typeof opts.cookie == 'boolean' && opts.cookie) opts.cookie = 'caroufredsel_cookie_'+$cfs.attr('id'); 305 if (typeof opts.items.minimum != 'number') opts.items.minimum = opts.items.visible; 306 if (typeof opts.scroll.duration != 'number') opts.scroll.duration = 500; 307 if (typeof opts.scroll.items == 'undefined') opts.scroll.items = (opts.items.visibleConf.variable || opts.items.filter != '*') ? 'visible' : opts.items.visible; 308 309 opts.auto = go_getNaviObject($tt0, opts.auto, 'auto'); 310 opts.prev = go_getNaviObject($tt0, opts.prev); 311 opts.next = go_getNaviObject($tt0, opts.next); 312 opts.pagination = go_getNaviObject($tt0, opts.pagination, 'pagination'); 313 314 opts.auto = $.extend(true, {}, opts.scroll, opts.auto); 315 opts.prev = $.extend(true, {}, opts.scroll, opts.prev); 316 opts.next = $.extend(true, {}, opts.scroll, opts.next); 317 opts.pagination = $.extend(true, {}, opts.scroll, opts.pagination); 318 319 if (typeof opts.pagination.keys != 'boolean') opts.pagination.keys = false;
320 if (typeof opts.pagination.anchorBuilder != 'function' 321 && opts.pagination.anchorBuilder !== false) opts.pagination.anchorBuilder = $.fn.carouFredSel.pageAnchorBuilder; 322 if (typeof opts.auto.play != 'boolean') opts.auto.play = true; 323 if (typeof opts.auto.delay != 'number') opts.auto.delay = 0; 324 if (typeof opts.auto.pauseOnEvent == 'undefined') opts.auto.pauseOnEvent = true; 325 if (typeof opts.auto.pauseOnResize != 'boolean') opts.auto.pauseOnResize = true; 326 if (typeof opts.auto.pauseDuration != 'number') opts.auto.pauseDuration = (opts.auto.duration < 10) ? 2500 : opts.auto.duration * 5; 327 328 if (opts.synchronise) { 329 opts.synchronise = cf_getSynchArr(opts.synchronise); 330 } 331 if (conf.debug) { 332 debug(conf, 'Carousel width: '+opts.width); 333 debug(conf, 'Carousel height: '+opts.height); 334 if (opts.maxDimention) debug(conf, 'Available '+opts.d['width']+': '+opts.maxDimention); 335 debug(conf, 'Item widths: '+opts.items.width); 336 debug(conf, 'Item heights: '+opts.items.height); 337 debug(conf, 'Number of items visible: '+opts.items.visible); 338 if (opts.auto.play) debug(conf, 'Number of items scrolled automatically: '+opts.auto.items); 339 if (opts.prev.button) debug(conf, 'Number of items scrolled backward: '+opts.prev.items); 340 if (opts.next.button) debug(conf, 'Number of items scrolled forward: '+opts.next.items); 341 } 342 }; // /init 343 344 $cfs._cfs_build = function() { 345 $cfs.data('cfs_isCarousel', true); 346 347 var orgCSS = { 348 'textAlign' : $cfs.css('textAlign'), 349 'float' : $cfs.css('float'), 350 'position' : $cfs.css('position'), 351 'top' : $cfs.css('top'), 352 'right' : $cfs.css('right'), 353 'bottom' : $cfs.css('bottom'), 354 'left' : $cfs.css('left'), 355 'width' : $cfs.css('width'), 356 'height' : $cfs.css('height'), 357 'marginTop' : $cfs.css('marginTop'), 358 'marginRight' : $cfs.css('marginRight'), 359 'marginBottom' : $cfs.css('marginBottom'), 360 'marginLeft' : $cfs.css('marginLeft') 361 }; 362 363 switch (orgCSS.position) { 364 case 'absolute': 365 var newPosition = 'absolute'; 366 break; 367 case 'fixed': 368 var newPosition = 'fixed'; 369 break; 370 default: 371 var newPosition = 'relative'; 372 } 373 374 $wrp.css(orgCSS).css({ 375 'overflow' : 'hidden', 376 'position' : newPosition 377 }); 378 379 $cfs.data('cfs_origCss', orgCSS).css({ 380 'textAlign' : 'left', 381 'float' : 'none', 382 'position' : 'absolute', 383 'top' : 0, 384 'left' : 0, 385 'marginTop' : 0, 386 'marginRight' : 0, 387 'marginBottom' : 0, 388 'marginLeft' : 0 389 }); 390 391 if (opts.usePadding) { 392 $cfs.children().each(function() { 393 var m = parseInt($(this).css(opts.d['marginRight'])); 394 if (isNaN(m)) m = 0; 395 $(this).data('cfs_origCssMargin', m); 396 }); 397 } 398 399 }; // /build 400 401 $cfs._cfs_bind_events = function() { 402 $cfs._cfs_unbind_events(); 403 404 // stop event 405 $cfs.bind(cf_e('stop', conf), function(e, imm) { 406 e.stopPropagation(); 407 408 // button 409 if (!crsl.isStopped) { 410 if (opts.auto.button) { 411 opts.auto.button.addClass(cf_c('stopped', conf)); 412 } 413 } 414 415 // set stopped 416 crsl.isStopped = true; 417 418 if (opts.auto.play) { 419 opts.auto.play = false; 420 $cfs.trigger(cf_e('pause', conf), imm); 421 } 422 return true; 423 }); 424 425 // finish event 426 $cfs.bind(cf_e('finish', conf), function(e) { 427 e.stopPropagation(); 428 if (crsl.isScrolling) { 429 sc_stopScroll(scrl); 430 } 431 return true; 432 }); 433 434 // pause event 435 $cfs.bind(cf_e('pause', conf), function(e, imm, res) { 436 e.stopPropagation(); 437 tmrs = sc_clearTimers(tmrs); 438 439 // immediately pause 440 if (imm && crsl.isScrolling) { 441 scrl.isStopped = true; 442 var nst = getTime() - scrl.startTime; 443 scrl.duration -= nst; 444 if (scrl.pre) scrl.pre.duration -= nst; 445 if (scrl.post) scrl.post.duration -= nst; 446 sc_stopScroll(scrl, false); 447 } 448 449 // update remaining pause-time 450 if (!crsl.isPaused && !crsl.isScrolling) { 451 if (res) tmrs.timePassed += getTime() - tmrs.startTime; 452 } 453 454 // button 455 if (!crsl.isPaused) { 456 if (opts.auto.button) { 457 opts.auto.button.addClass(cf_c('paused', conf)); 458 } 459 } 460 461 // set paused 462 crsl.isPaused = true; 463 464 // pause pause callback 465 if (opts.auto.onPausePause) { 466 var dur1 = opts.auto.pauseDuration - tmrs.timePassed, 467 perc = 100 - Math.ceil( dur1 * 100 / opts.auto.pauseDuration ); 468 opts.auto.onPausePause.call($tt0, perc, dur1); 469 } 470 return true; 471 }); 472 473 // play event 474 $cfs.bind(cf_e('play', conf), function(e, dir, del, res) { 475 e.stopPropagation(); 476 tmrs = sc_clearTimers(tmrs); 477 478 // sort params 479 var v = [dir, del, res], 480 t = ['string', 'number', 'boolean'], 481 a = cf_sortParams(v, t); 482 483 var dir = a[0], 484 del = a[1], 485 res = a[2]; 486 487 if (dir != 'prev' && dir != 'next') dir = crsl.direction; 488 if (typeof del != 'number') del = 0; 489 if (typeof res != 'boolean') res = false;
vendor: 7,829 bytes, lines 490-757
490 491 // stopped? 492 if (res) { 493 crsl.isStopped = false; 494 opts.auto.play = true; 495 } 496 if (!opts.auto.play) { 497 e.stopImmediatePropagation(); 498 return debug(conf, 'Carousel stopped: Not scrolling.'); 499 } 500 501 // button 502 if (crsl.isPaused) { 503 if (opts.auto.button) { 504 opts.auto.button.removeClass(cf_c('stopped', conf)); 505 opts.auto.button.removeClass(cf_c('paused', conf)); 506 } 507 } 508 509 // set playing 510 crsl.isPaused = false; 511 tmrs.startTime = getTime(); 512 513 // timeout the scrolling 514 var dur1 = opts.auto.pauseDuration + del; 515 dur2 = dur1 - tmrs.timePassed; 516 perc = 100 - Math.ceil(dur2 * 100 / dur1); 517 518 tmrs.auto = setTimeout(function() { 519 if (opts.auto.onPauseEnd) { 520 opts.auto.onPauseEnd.call($tt0, perc, dur2); 521 } 522 if (crsl.isScrolling) { 523 $cfs.trigger(cf_e('play', conf), dir); 524 } else { 525 $cfs.trigger(cf_e(dir, conf), opts.auto); 526 } 527 }, dur2); 528 529 // pause start callback 530 if (opts.auto.onPauseStart) { 531 opts.auto.onPauseStart.call($tt0, perc, dur2); 532 } 533 534 return true; 535 }); 536 537 // resume event 538 $cfs.bind(cf_e('resume', conf), function(e) { 539 e.stopPropagation(); 540 if (scrl.isStopped) { 541 scrl.isStopped = false; 542 crsl.isPaused = false; 543 crsl.isScrolling = true; 544 scrl.startTime = getTime(); 545 sc_startScroll(scrl); 546 } else { 547 $cfs.trigger(cf_e('play', conf)); 548 } 549 return true; 550 }); 551 552 // prev + next events 553 $cfs.bind(cf_e('prev', conf)+' '+cf_e('next', conf), function(e, obj, num, clb) { 554 e.stopPropagation(); 555 556 // stopped or hidden carousel, don't scroll, don't queue 557 if (crsl.isStopped || $cfs.is(':hidden')) { 558 e.stopImmediatePropagation(); 559 return debug(conf, 'Carousel stopped or hidden: Not scrolling.'); 560 } 561 562 // not enough items 563 if (opts.items.minimum >= itms.total) { 564 e.stopImmediatePropagation(); 565 return debug(conf, 'Not enough items ('+itms.total+', '+opts.items.minimum+' needed): Not scrolling.'); 566 } 567 568 // get config 569 var v = [obj, num, clb], 570 t = ['object', 'number/string', 'function'], 571 a = cf_sortParams(v, t); 572 573 var obj = a[0], 574 num = a[1], 575 clb = a[2]; 576 577 var eType = e.type.slice(conf.events.prefix.length); 578 579 if (typeof obj != 'object' || obj == null) obj = opts[eType]; 580 if (typeof clb == 'function') obj.onAfter = clb; 581 582 if (typeof num != 'number') { 583 if (opts.items.filter != '*') { 584 num = 'visible'; 585 } else { 586 var arr = [num, obj.items, opts[eType].items]; 587 for (var a = 0, l = arr.length; a < l; a++) { 588 if (typeof arr[a] == 'number' || arr[a] == 'page' || arr[a] == 'visible') { 589 num = arr[a]; 590 break; 591 } 592 } 593 } 594 switch(num) { 595 case 'page': 596 e.stopImmediatePropagation(); 597 return $cfs.triggerHandler(eType+'Page', [obj, clb]); 598 break; 599 600 case 'visible': 601 if (!opts.items.visibleConf.variable && opts.items.filter == '*') { 602 num = opts.items.visible; 603 } 604 break; 605 } 606 } 607 608 // resume animation, add current to queue 609 if (scrl.isStopped) { 610 $cfs.trigger(cf_e('resume', conf)); 611 $cfs.trigger(cf_e('queue', conf), [eType, [obj, num, clb]]); 612 e.stopImmediatePropagation(); 613 return debug(conf, 'Carousel resumed scrolling.'); 614 } 615 616 // queue if scrolling 617 if (obj.duration > 0) { 618 if (crsl.isScrolling) { 619 if (obj.queue) $cfs.trigger(cf_e('queue', conf), [eType, [obj, num, clb]]); 620 e.stopImmediatePropagation(); 621 return debug(conf, 'Carousel currently scrolling.'); 622 } 623 } 624 625 // test conditions callback 626 if (obj.conditions && !obj.conditions.call($tt0)) { 627 e.stopImmediatePropagation(); 628 return debug(conf, 'Callback "conditions" returned false.'); 629 } 630 631 tmrs.timePassed = 0; 632 $cfs.trigger('_cfs_triggerEvent', ['slide_'+eType, [obj, num]]); 633 634 // synchronise 635 if (opts.synchronise) { 636 var s = opts.synchronise, 637 c = [obj, num]; 638 for (var j = 0, l = s.length; j < l; j++) { 639 var d = eType; 640 641 if (!s[j][1]) c[0] = s[j][0].triggerHandler('_cfs_triggerEvent', ['configuration', d]); 642 if (!s[j][2]) d = (d == 'prev') ? 'next' : 'prev'; 643 c[1] = num + s[j][3]; 644 s[j][0].trigger('_cfs_triggerEvent', ['slide_'+d, c]); 645 } 646 } 647 return true; 648 }); 649 650 // prev event 651 $cfs.bind(cf_e('slide_prev', conf), function(e, sO, nI) { 652 e.stopPropagation(); 653 var a_itm = $cfs.children(); 654 655 // non-circular at start, scroll to end 656 if (!opts.circular) { 657 if (itms.first == 0) { 658 if (opts.infinite) { 659 $cfs.trigger(cf_e('next', conf), itms.total-1); 660 } 661 return e.stopImmediatePropagation(); 662 } 663 } 664 665 if (opts.usePadding) sz_resetMargin(a_itm, opts); 666 667 // find number of items to scroll 668 if (typeof nI != 'number') { 669 if (opts.items.visibleConf.variable) { 670 nI = gn_getVisibleItemsPrev(a_itm, opts, itms.total-1); 671 } else if (opts.items.filter != '*') { 672 var xI = (typeof sO.items == 'number') ? sO.items : gn_getVisibleOrg($cfs, opts); 673 nI = gn_getScrollItemsPrevFilter(a_itm, opts, itms.total-1, xI); 674 } else { 675 nI = opts.items.visible; 676 } 677 nI = cf_getAdjust(nI, opts, sO.items, $tt0); 678 } 679 680 // prevent non-circular from scrolling to far 681 if (!opts.circular) { 682 if (itms.total - nI < itms.first) { 683 nI = itms.total - itms.first; 684 } 685 } 686 687 // set new number of visible items 688 opts.items.visibleConf.old = opts.items.visible; 689 if (opts.items.visibleConf.variable) { 690 var vI = gn_getVisibleItemsNext(a_itm, opts, itms.total-nI); 691 if (opts.items.visible+nI <= vI && nI < itms.total) { 692 nI++; 693 vI = gn_getVisibleItemsNext(a_itm, opts, itms.total-nI); 694 } 695 opts.items.visible = cf_getItemsAdjust(vI, opts, opts.items.visibleConf.adjust, $tt0); 696 } else if (opts.items.filter != '*') { 697 var vI = gn_getVisibleItemsNextFilter(a_itm, opts, itms.total-nI); 698 opts.items.visible = cf_getItemsAdjust(vI, opts, opts.items.visibleConf.adjust, $tt0); 699 } 700 701 if (opts.usePadding) sz_resetMargin(a_itm, opts, true); 702 703 // scroll 0, don't scroll 704 if (nI == 0) { 705 e.stopImmediatePropagation(); 706 return debug(conf, '0 items to scroll: Not scrolling.'); 707 } 708 debug(conf, 'Scrolling '+nI+' items backward.'); 709 710 // save new config 711 itms.first += nI; 712 while (itms.first >= itms.total) { 713 itms.first -= itms.total; 714 } 715 716 // non-circular callback 717 if (!opts.circular) { 718 if (itms.first == 0 && sO.onEnd) sO.onEnd.call($tt0); 719 if (!opts.infinite) nv_enableNavi(opts, itms.first, conf); 720 } 721 722 // rearrange items 723 $cfs.children().slice(itms.total-nI, itms.total).prependTo($cfs); 724 if (itms.total < opts.items.visible + nI) { 725 $cfs.children().slice(0, (opts.items.visible+nI)-itms.total).clone(true).appendTo($cfs); 726 } 727 728 // the needed items 729 var a_itm = $cfs.children(), 730 c_old = gi_getOldItemsPrev(a_itm, opts, nI), 731 c_new = gi_getNewItemsPrev(a_itm, opts), 732 l_cur = a_itm.eq(nI-1), 733 l_old = c_old.last(), 734 l_new = c_new.last(); 735 736 if (opts.usePadding) sz_resetMargin(a_itm, opts); 737 if (opts.align) { 738 var p = cf_getAlignPadding(c_new, opts), 739 pL = p[0], 740 pR = p[1]; 741 } else { 742 var pL = 0, 743 pR = 0; 744 } 745 var oL = (pL < 0) ? opts.padding[opts.d[3]] : 0; 746 747 // hide items for fx directscroll 748 if (sO.fx == 'directscroll' && opts.items.visible < nI) { 749 var hiddenitems = a_itm.slice(opts.items.visibleConf.old, nI), 750 orgW = opts.items[opts.d['width']]; 751 hiddenitems.each(function() { 752 var hi = $(this); 753 hi.data('isHidden', hi.is(':hidden')).hide(); 754 }); 755 opts.items[opts.d['width']] = 'variable'; 756 } else { 757 var hiddenitems = false;
758 } 759 760 // save new sizes 761 var i_siz = ms_getTotalSize(a_itm.slice(0, nI), opts, 'width'), 762 w_siz = cf_mapWrapperSizes(ms_getSizes(c_new, opts, true), opts, !opts.usePadding); 763 764 if (hiddenitems) opts.items[opts.d['width']] = orgW; 765 766 if (opts.usePadding) { 767 sz_resetMargin(a_itm, opts, true); 768 if (pR >= 0) { 769 sz_resetMargin(l_old, opts, opts.padding[opts.d[1]]); 770 } 771 sz_resetMargin(l_cur, opts, opts.padding[opts.d[3]]); 772 } 773 if (opts.align) { 774 opts.padding[opts.d[1]] = pR; 775 opts.padding[opts.d[3]] = pL; 776 } 777 778 // animation configuration 779 var a_cfs = {}, 780 a_dur = sO.duration; 781 782 if (sO.fx == 'none') a_dur = 0; 783 else if (a_dur == 'auto') a_dur = opts.scroll.duration / opts.scroll.items * nI; 784 else if (a_dur <= 0) a_dur = 0; 785 else if (a_dur < 10) a_dur = i_siz / a_dur; 786 787 scrl = sc_setScroll(a_dur, sO.easing); 788 789 // animate wrapper 790 if (opts[opts.d['width']] == 'variable' || opts[opts.d['height']] == 'variable') { 791 scrl.anims.push([$wrp, w_siz]); 792 } 793 794 // animate items 795 if (opts.usePadding) { 796 var new_m = opts.padding[opts.d[3]]; 797 798 if (l_new.not(l_cur).length) { 799 var a_cur = {}; 800 a_cur[opts.d['marginRight']] = l_cur.data('cfs_origCssMargin'); 801 802 if (pL < 0) l_cur.css(a_cur); 803 else scrl.anims.push([l_cur, a_cur]); 804 } 805 806 if (l_new.not(l_old).length) { 807 var a_old = {}; 808 a_old[opts.d['marginRight']] = l_old.data('cfs_origCssMargin'); 809 scrl.anims.push([l_old, a_old]); 810 } 811 812 if (pR >= 0) { 813 var a_new = {}; 814 a_new[opts.d['marginRight']] = l_new.data('cfs_origCssMargin') + opts.padding[opts.d[1]]; 815 scrl.anims.push([l_new, a_new]); 816 } 817 } else { 818 var new_m = 0; 819 } 820 821 // animate carousel 822 a_cfs[opts.d['left']] = new_m; 823 824 // onBefore callback 825 var args = [c_old, c_new, w_siz, a_dur]; 826 if (sO.onBefore) sO.onBefore.apply($tt0, args); 827 clbk.onBefore = sc_callCallbacks(clbk.onBefore, $tt0, args); 828 829 830 831 // ALTERNATIVE EFFECTS 832 833 // extra animation arrays 834 switch(sO.fx) { 835 case 'fade': 836 case 'crossfade': 837 case 'cover': 838 case 'uncover': 839 scrl.pre = sc_setScroll(scrl.duration, scrl.easing); 840 scrl.post = sc_setScroll(scrl.duration, scrl.easing); 841 scrl.duration = 0; 842 break; 843 } 844 845 // create copy 846 switch(sO.fx) { 847 case 'crossfade': 848 case 'cover': 849 case 'uncover': 850 var $cf2 = $cfs.clone().appendTo($wrp); 851 break; 852 } 853 switch(sO.fx) { 854 case 'uncover': 855 $cf2.children().slice(0, nI).remove(); 856 case 'crossfade': 857 case 'cover': 858 $cf2.children().slice(opts.items.visible).remove(); 859 break; 860 } 861 862 // animations 863 switch(sO.fx) { 864 case 'fade': 865 scrl.pre.anims.push([$cfs, { 'opacity': 0 }]); 866 break; 867 case 'crossfade': 868 $cf2.css({ 'opacity': 0 }); 869 scrl.pre.anims.push([$cfs, { 'width': '+=0' }, function() { $cf2.remove(); }]); 870 scrl.post.anims.push([$cf2, { 'opacity': 1 }]); 871 break; 872 case 'cover': 873 scrl = fx_cover(scrl, $cfs, $cf2, opts, true); 874 break; 875 case 'uncover': 876 scrl = fx_uncover(scrl, $cfs, $cf2, opts, true, nI); 877 break; 878 } 879 880 // /ALTERNATIVE EFFECTS 881 882 883 // complete callback 884 var a_complete = function() { 885 886 var overFill = opts.items.visible+nI-itms.total; 887 if (overFill > 0) { 888 $cfs.children().slice(itms.total).remove(); 889 c_old = $( $cfs.children().slice(itms.total-(opts.items.visible-overFill)).get().concat( $cfs.children().slice(0, overFill).get() ) ); 890 } 891 if (hiddenitems) { 892 hiddenitems.each(function() { 893 var hi = $(this); 894 if (!hi.data('isHidden')) hi.show(); 895 }); 896 } 897 if (opts.usePadding) { 898 var l_itm = $cfs.children().eq(opts.items.visible+nI-1); 899 l_itm.css(opts.d['marginRight'], l_itm.data('cfs_origCssMargin')); 900 } 901 902 scrl.anims = []; 903 if (scrl.pre) scrl.pre = sc_setScroll(scrl.orgDuration, scrl.easing); 904 905 var fn = function() { 906 switch(sO.fx) { 907 case 'fade': 908 case 'crossfade': 909 $cfs.css('filter', ''); 910 break; 911 } 912 913 scrl.post = sc_setScroll(0, null); 914 crsl.isScrolling = false;
915 916 var args = [c_old, c_new, w_siz]; 917 if (sO.onAfter) sO.onAfter.apply($tt0, args); 918 clbk.onAfter = sc_callCallbacks(clbk.onAfter, $tt0, args); 919 920 if (queu.length) { 921 $cfs.trigger(cf_e(queu[0][0], conf), queu[0][1]); 922 queu.shift(); 923 } 924 if (!crsl.isPaused) $cfs.trigger(cf_e('play', conf)); 925 }; 926 switch(sO.fx) { 927 case 'fade': 928 scrl.pre.anims.push([$cfs, { 'opacity': 1 }, fn]); 929 sc_startScroll(scrl.pre); 930 break; 931 case 'uncover': 932 scrl.pre.anims.push([$cfs, { 'width': '+=0' }, fn]); 933 sc_startScroll(scrl.pre); 934 break; 935 default: 936 fn(); 937 break; 938 } 939 }; 940 941 scrl.anims.push([$cfs, a_cfs, a_complete]); 942 crsl.isScrolling = true; 943 $cfs.css(opts.d['left'], -(i_siz-oL)); 944 tmrs = sc_clearTimers(tmrs); 945 sc_startScroll(scrl); 946 cf_setCookie(opts.cookie, $cfs.triggerHandler(cf_e('currentPosition', conf))); 947 948 $cfs.trigger(cf_e('updatePageStatus', conf), [false, w_siz]); 949 950 return true; 951 }); 952 953 // next event 954 $cfs.bind(cf_e('slide_next', conf), function(e, sO, nI) { 955 e.stopPropagation(); 956 var a_itm = $cfs.children(); 957 958 // non-circular at end, scroll to start 959 if (!opts.circular) { 960 if (itms.first == opts.items.visible) { 961 if (opts.infinite) { 962 $cfs.trigger(cf_e('prev', conf), itms.total-1); 963 } 964 return e.stopImmediatePropagation(); 965 } 966 } 967 968 if (opts.usePadding) sz_resetMargin(a_itm, opts); 969 970 // find number of items to scroll 971 if (typeof nI != 'number') { 972 if (opts.items.filter != '*') { 973 var xI = (typeof sO.items == 'number') ? sO.items : gn_getVisibleOrg($cfs, opts); 974 nI = gn_getScrollItemsNextFilter(a_itm, opts, 0, xI); 975 } else { 976 nI = opts.items.visible; 977 } 978 nI = cf_getAdjust(nI, opts, sO.items, $tt0); 979 } 980 981 var lastItemNr = (itms.first == 0) ? itms.total : itms.first; 982 983 // prevent non-circular from scrolling to far 984 if (!opts.circular) { 985 if (opts.items.visibleConf.variable) { 986 var vI = gn_getVisibleItemsNext(a_itm, opts, nI), 987 xI = gn_getVisibleItemsPrev(a_itm, opts, lastItemNr-1); 988 } else { 989 var vI = opts.items.visible, 990 xI = opts.items.visible; 991 } 992 993 if (nI + vI > lastItemNr) { 994 nI = lastItemNr - xI; 995 } 996 } 997 998 // set new number of visible items 999 opts.items.visibleConf.old = opts.items.visible; 1000 if (opts.items.visibleConf.variable) { 1001 var vI = gn_getVisibleItemsNextTestCircular(a_itm, opts, nI, lastItemNr); 1002 while (opts.items.visible-nI >= vI && nI < itms.total) { 1003 nI++; 1004 vI = gn_getVisibleItemsNextTestCircular(a_itm, opts, nI, lastItemNr); 1005 } 1006 opts.items.visible = cf_getItemsAdjust(vI, opts, opts.items.visibleConf.adjust, $tt0); 1007 } else if (opts.items.filter != '*') { 1008 var vI = gn_getVisibleItemsNextFilter(a_itm, opts, nI); 1009 opts.items.visible = cf_getItemsAdjust(vI, opts, opts.items.visibleConf.adjust, $tt0); 1010 } 1011 1012 if (opts.usePadding) sz_resetMargin(a_itm, opts, true); 1013 1014 // scroll 0, don't scroll 1015 if (nI == 0) { 1016 e.stopImmediatePropagation(); 1017 return debug(conf, '0 items to scroll: Not scrolling.'); 1018 } 1019 debug(conf, 'Scrolling '+nI+' items forward.'); 1020 1021 // save new config 1022 itms.first -= nI; 1023 while (itms.first < 0) { 1024 itms.first += itms.total; 1025 } 1026 1027 // non-circular callback 1028 if (!opts.circular) { 1029 if (itms.first == opts.items.visible && sO.onEnd) sO.onEnd.call($tt0); 1030 if (!opts.infinite) nv_enableNavi(opts, itms.first, conf); 1031 } 1032 1033 // rearrange items 1034 if (itms.total < opts.items.visible+nI) { 1035 $cfs.children().slice(0, (opts.items.visible+nI)-itms.total).clone(true).appendTo($cfs); 1036 } 1037 1038 // the needed items 1039 var a_itm = $cfs.children(), 1040 c_old = gi_getOldItemsNext(a_itm, opts), 1041 c_new = gi_getNewItemsNext(a_itm, opts, nI), 1042 l_cur = a_itm.eq(nI-1), 1043 l_old = c_old.last(), 1044 l_new = c_new.last(); 1045 1046 if (opts.usePadding) sz_resetMargin(a_itm, opts); 1047 if (opts.align) { 1048 var p = cf_getAlignPadding(c_new, opts), 1049 pL = p[0], 1050 pR = p[1]; 1051 } else { 1052 var pL = 0, 1053 pR = 0; 1054 } 1055 1056 // hide items for fx directscroll 1057 if (sO.fx == 'directscroll' && opts.items.visibleConf.old < nI) { 1058 var hiddenitems = a_itm.slice(opts.items.visibleConf.old, nI), 1059 orgW = opts.items[opts.d['width']]; 1060 hiddenitems.each(function() { 1061 var hi = $(this); 1062 hi.data('isHidden', hi.is(':hidden')).hide(); 1063 }); 1064 opts.items[opts.d['width']] = 'variable'; 1065 } else { 1066 var hiddenitems = false;
1067 } 1068 1069 // save new sizes 1070 var i_siz = ms_getTotalSize(a_itm.slice(0, nI), opts, 'width'), 1071 w_siz = cf_mapWrapperSizes(ms_getSizes(c_new, opts, true), opts, !opts.usePadding); 1072 1073 if (hiddenitems) opts.items[opts.d['width']] = orgW; 1074 1075 if (opts.align) { 1076 if (opts.padding[opts.d[1]] < 0) { 1077 opts.padding[opts.d[1]] = 0; 1078 } 1079 } 1080 if (opts.usePadding) { 1081 sz_resetMargin(a_itm, opts, true); 1082 sz_resetMargin(l_old, opts, opts.padding[opts.d[1]]); 1083 } 1084 if (opts.align) { 1085 opts.padding[opts.d[1]] = pR; 1086 opts.padding[opts.d[3]] = pL; 1087 } 1088 1089 // animation configuration 1090 var a_cfs = {}, 1091 a_dur = sO.duration; 1092 1093 if (sO.fx == 'none') a_dur = 0; 1094 else if (a_dur == 'auto') a_dur = opts.scroll.duration / opts.scroll.items * nI; 1095 else if (a_dur <= 0) a_dur = 0; 1096 else if (a_dur < 10) a_dur = i_siz / a_dur; 1097 1098 scrl = sc_setScroll(a_dur, sO.easing); 1099 1100 // animate wrapper 1101 if (opts[opts.d['width']] == 'variable' || opts[opts.d['height']] == 'variable') { 1102 scrl.anims.push([$wrp, w_siz]); 1103 } 1104 1105 // animate items 1106 if (opts.usePadding) { 1107 var l_new_m = l_new.data('cfs_origCssMargin'); 1108 if (pR >= 0) { 1109 l_new_m += opts.padding[opts.d[1]]; 1110 } 1111 l_new.css(opts.d['marginRight'], l_new_m); 1112 1113 if (l_cur.not(l_old).length) { 1114 var a_old = {}; 1115 a_old[opts.d['marginRight']] = l_old.data('cfs_origCssMargin'); 1116 scrl.anims.push([l_old, a_old]); 1117 } 1118 1119 var c_new_m = l_cur.data('cfs_origCssMargin'); 1120 if (pL >= 0) { 1121 c_new_m += opts.padding[opts.d[3]]; 1122 } 1123 var a_cur = {}; 1124 a_cur[opts.d['marginRight']] = c_new_m; 1125 scrl.anims.push([l_cur, a_cur]); 1126 1127 } 1128 1129 // animate carousel 1130 a_cfs[opts.d['left']] = -i_siz; 1131 if (pL < 0) { 1132 a_cfs[opts.d['left']] += pL; 1133 } 1134 1135 // onBefore callback 1136 var args = [c_old, c_new, w_siz, a_dur]; 1137 if (sO.onBefore) sO.onBefore.apply($tt0, args); 1138 clbk.onBefore = sc_callCallbacks(clbk.onBefore, $tt0, args); 1139 1140 1141 1142 // ALTERNATIVE EFFECTS 1143 1144 // extra animation arrays 1145 switch(sO.fx) { 1146 case 'fade': 1147 case 'crossfade': 1148 case 'cover': 1149 case 'uncover': 1150 scrl.pre = sc_setScroll(scrl.duration, scrl.easing); 1151 scrl.post = sc_setScroll(scrl.duration, scrl.easing); 1152 scrl.duration = 0; 1153 break; 1154 } 1155 1156 // create copy 1157 switch(sO.fx) { 1158 case 'crossfade': 1159 case 'cover': 1160 case 'uncover': 1161 var $cf2 = $cfs.clone().appendTo($wrp); 1162 break; 1163 } 1164 switch(sO.fx) { 1165 case 'uncover': 1166 $cf2.children().slice(opts.items.visibleConf.old).remove(); 1167 break; 1168 case 'crossfade': 1169 case 'cover': 1170 $cf2.children().slice(0, nI).remove(); 1171 $cf2.children().slice(opts.items.visible).remove(); 1172 break; 1173 } 1174 1175 // animations 1176 switch(sO.fx) { 1177 case 'fade': 1178 scrl.pre.anims.push([$cfs, { 'opacity': 0 }]); 1179 break; 1180 case 'crossfade': 1181 $cf2.css({ 'opacity': 0 }); 1182 scrl.pre.anims.push([$cfs, { 'width': '+=0' }, function() { $cf2.remove(); }]); 1183 scrl.post.anims.push([$cf2, { 'opacity': 1 }]); 1184 break; 1185 case 'cover': 1186 scrl = fx_cover(scrl, $cfs, $cf2, opts, false); 1187 break; 1188 case 'uncover': 1189 scrl = fx_uncover(scrl, $cfs, $cf2, opts, false, nI); 1190 break; 1191 } 1192 1193 // /ALTERNATIVE EFFECTS 1194 1195 1196 // complete callback 1197 var a_complete = function() { 1198 1199 var overFill = opts.items.visible+nI-itms.total, 1200 new_m = (opts.usePadding) ? opts.padding[opts.d[3]] : 0; 1201 $cfs.css(opts.d['left'], new_m); 1202 if (overFill > 0) { 1203 $cfs.children().slice(itms.total).remove(); 1204 } 1205 var l_itm = $cfs.children().slice(0, nI).appendTo($cfs).last(); 1206 if (overFill > 0) { 1207 c_new = gi_getCurrentItems(a_itm, opts); 1208 } 1209 if (hiddenitems) { 1210 hiddenitems.each(function() { 1211 var hi = $(this); 1212 if (!hi.data('isHidden')) hi.show(); 1213 }); 1214 } 1215 if (opts.usePadding) { 1216 if (itms.total < opts.items.visible+nI) { 1217 var l_cur = $cfs.children().eq(opts.items.visible-1); 1218 l_cur.css(opts.d['marginRight'], l_cur.data('cfs_origCssMargin') + opts.padding[opts.d[3]]); 1219 } 1220 l_itm.css(opts.d['marginRight'], l_itm.data('cfs_origCssMargin')); 1221 } 1222 1223 scrl.anims = []; 1224 if (scrl.pre) scrl.pre = sc_setScroll(scrl.orgDuration, scrl.easing); 1225 1226 var fn = function() { 1227 switch(sO.fx) { 1228 case 'fade': 1229 case 'crossfade': 1230 $cfs.css('filter', ''); 1231 break; 1232 } 1233 1234 scrl.post = sc_setScroll(0, null); 1235 crsl.isScrolling = false;
1236 1237 var args = [c_old, c_new, w_siz]; 1238 if (sO.onAfter) sO.onAfter.apply($tt0, args); 1239 clbk.onAfter = sc_callCallbacks(clbk.onAfter, $tt0, args); 1240 1241 if (queu.length) { 1242 $cfs.trigger(cf_e(queu[0][0], conf), queu[0][1]); 1243 queu.shift(); 1244 } 1245 if (!crsl.isPaused) $cfs.trigger(cf_e('play', conf)); 1246 }; 1247 switch(sO.fx) { 1248 case 'fade': 1249 scrl.pre.anims.push([$cfs, { 'opacity': 1 }, fn]); 1250 sc_startScroll(scrl.pre); 1251 break; 1252 case 'uncover': 1253 scrl.pre.anims.push([$cfs, { 'width': '+=0' }, fn]); 1254 sc_startScroll(scrl.pre); 1255 break; 1256 default: 1257 fn(); 1258 break; 1259 } 1260 }; 1261 1262 scrl.anims.push([$cfs, a_cfs, a_complete]); 1263 crsl.isScrolling = true; 1264 tmrs = sc_clearTimers(tmrs); 1265 sc_startScroll(scrl); 1266 cf_setCookie(opts.cookie, $cfs.triggerHandler(cf_e('currentPosition', conf))); 1267 1268 $cfs.trigger(cf_e('updatePageStatus', conf), [false, w_siz]); 1269 1270 return true; 1271 }); 1272 1273 // slideTo event 1274 $cfs.bind(cf_e('slideTo', conf), function(e, num, dev, org, obj, dir, clb) { 1275 e.stopPropagation(); 1276 1277 var v = [num, dev, org, obj, dir, clb], 1278 t = ['string/number/object', 'number', 'boolean', 'object', 'string', 'function'], 1279 a = cf_sortParams(v, t); 1280 1281 var obj = a[3], 1282 dir = a[4], 1283 clb = a[5]; 1284 1285 num = gn_getItemIndex(a[0], a[1], a[2], itms, $cfs); 1286 1287 if (num == 0) return; 1288 if (typeof obj != 'object') obj = false; 1289 1290 if (crsl.isScrolling) { 1291 if (typeof obj != 'object' || obj.duration > 0) return false; 1292 } 1293 1294 if (dir != 'prev' && dir != 'next') { 1295 if (opts.circular) { 1296 if (num <= itms.total / 2) dir = 'next'; 1297 else dir = 'prev'; 1298 } else { 1299 if (itms.first == 0 || 1300 itms.first > num) dir = 'next'; 1301 else dir = 'prev'; 1302 } 1303 } 1304 1305 if (dir == 'prev') num = itms.total-num; 1306 $cfs.trigger(cf_e(dir, conf), [obj, num, clb]); 1307 1308 return true; 1309 }); 1310 1311 // prevPage event 1312 $cfs.bind(cf_e('prevPage', conf), function(e, obj, clb) { 1313 e.stopPropagation(); 1314 var cur = $cfs.triggerHandler(cf_e('currentPage', conf)); 1315 return $cfs.triggerHandler(cf_e('slideToPage', conf), [cur-1, obj, 'prev', clb]); 1316 }); 1317 1318 // nextPage event 1319 $cfs.bind(cf_e('nextPage', conf), function(e, obj, clb) { 1320 e.stopPropagation(); 1321 var cur = $cfs.triggerHandler(cf_e('currentPage', conf)); 1322 return $cfs.triggerHandler(cf_e('slideToPage', conf), [cur+1, obj, 'next', clb]); 1323 }); 1324 1325 // slideToPage event 1326 $cfs.bind(cf_e('slideToPage', conf), function(e, pag, obj, dir, clb) { 1327 e.stopPropagation(); 1328 if (typeof pag != 'number') pag = $cfs.triggerHandler(cf_e('currentPage', conf)); 1329 var ipp = opts.pagination.items || opts.items.visible, 1330 max = Math.ceil(itms.total / ipp)-1; 1331 if (pag < 0) pag = max; 1332 if (pag > max) pag = 0; 1333 return $cfs.triggerHandler(cf_e('slideTo', conf), [pag*ipp, 0, true, obj, dir, clb]); 1334 }); 1335 1336 // jumpToStart event 1337 $cfs.bind(cf_e('jumpToStart', conf), function(e, s) { 1338 e.stopPropagation(); 1339 if (s) s = gn_getItemIndex(s, 0, true, itms, $cfs); 1340 else s = 0; 1341 1342 s += itms.first; 1343 if (s != 0) { 1344 while (s > itms.total) s -= itms.total; 1345 $cfs.prepend($cfs.children().slice(s, itms.total)); 1346 } 1347 return true; 1348 }); 1349 1350 // synchronise event 1351 $cfs.bind(cf_e('synchronise', conf), function(e, s) { 1352 e.stopPropagation(); 1353 if (s) s = cf_getSynchArr(s); 1354 else if (opts.synchronise) s = opts.synchronise; 1355 else return debug(conf, 'No carousel to synchronise.'); 1356 1357 var n = $cfs.triggerHandler(cf_e('currentPosition', conf)), 1358 x = true; 1359 for (var j = 0, l = s.length; j < l; j++) { 1360 if (!s[j][0].triggerHandler(cf_e('slideTo', conf), [n, s[j][3], true])) { 1361 x = false; 1362 } 1363 } 1364 return x; 1365 }); 1366 1367 // queue event 1368 $cfs.bind(cf_e('queue', conf), function(e, dir, opt) { 1369 e.stopPropagation(); 1370 if (typeof dir == 'function') { 1371 dir.call($tt0, queu); 1372 } else if (is_array(dir)) { 1373 queu = dir; 1374 } else if (typeof dir != 'undefined') { 1375 queu.push([dir, opt]); 1376 } 1377 return queu; 1378 }); 1379 1380 // insertItem event 1381 $cfs.bind(cf_e('insertItem', conf), function(e, itm, num, org, dev) { 1382 e.stopPropagation(); 1383 1384 var v = [itm, num, org, dev], 1385 t = ['string/object', 'string/number/object', 'boolean', 'number'], 1386 a = cf_sortParams(v, t); 1387 1388 var itm = a[0], 1389 num = a[1], 1390 org = a[2], 1391 dev = a[3]; 1392 1393 if (typeof itm == 'object' && 1394 typeof itm.jquery == 'undefined') itm = $(itm); 1395 if (typeof itm == 'string') itm = $(itm); 1396 if (typeof itm != 'object' || 1397 typeof itm.jquery == 'undefined' || 1398 itm.length == 0) return debug(conf, 'Not a valid object.'); 1399 1400 if (typeof num == 'undefined') num = 'end'; 1401 1402 if (opts.usePadding) { 1403 itm.each(function() { 1404 var m = parseInt($(this).css(opts.d['marginRight'])); 1405 if (isNaN(m)) m = 0; 1406 $(this).data('cfs_origCssMargin', m); 1407 }); 1408 } 1409
1410 var orgNum = num, 1411 before = 'before'; 1412 1413 if (num == 'end') { 1414 if (org) { 1415 if (itms.first == 0) { 1416 num = itms.total-1; 1417 before = 'after'; 1418 } else { 1419 num = itms.first; 1420 itms.first += itm.length 1421 } 1422 if (num < 0) num = 0; 1423 } else { 1424 num = itms.total-1; 1425 before = 'after'; 1426 } 1427 } else { 1428 num = gn_getItemIndex(num, dev, org, itms, $cfs); 1429 } 1430 if (orgNum != 'end' && !org) { 1431 if (num < itms.first) itms.first += itm.length; 1432 } 1433 if (itms.first >= itms.total) itms.first -= itms.total; 1434 1435 var $cit = $cfs.children().eq(num); 1436 if ($cit.length) { 1437 $cit[before](itm); 1438 } else { 1439 $cfs.append(itm); 1440 } 1441 1442 itms.total = $cfs.children().length; 1443 1444 var sz = $cfs.triggerHandler('updateSizes'); 1445 nv_showNavi(opts, itms.total, conf); 1446 nv_enableNavi(opts, itms.first, conf); 1447 $cfs.trigger(cf_e('linkAnchors', conf)); 1448 $cfs.trigger(cf_e('updatePageStatus', conf), [true, sz]); 1449 1450 return true; 1451 }); 1452 1453 // removeItem event 1454 $cfs.bind(cf_e('removeItem', conf), function(e, num, org, dev) { 1455 e.stopPropagation(); 1456 1457 var v = [num, org, dev], 1458 t = ['string/number/object', 'boolean', 'number'], 1459 a = cf_sortParams(v, t); 1460 1461 num = a[0]; 1462 org = a[1]; 1463 dev = a[2]; 1464 1465 var removed = false; 1466 if (num instanceof $ && num.length > 1) 1467 { 1468 $removed = $(); 1469 num.each(function(i, el) { 1470 var $rem = $cfs.trigger(cf_e('removeItem', conf), [$(this), org, dev]); 1471 if ($rem) $removed = $removed.add($rem); 1472 }); 1473 return $removed; 1474 } 1475 1476 if (typeof num == 'undefined' || num == 'end') { 1477 $removed = $cfs.children().last(); 1478 } else { 1479 num = gn_getItemIndex(num, dev, org, itms, $cfs); 1480 var $removed = $cfs.children().eq(num); 1481 if ($removed.length){ 1482 if (num < itms.first) itms.first -= $removed.length; 1483 } 1484 } 1485 if ($removed && $removed.length) { 1486 $removed.detach(); 1487 itms.total = $cfs.children().length; 1488 var sz = $cfs.triggerHandler('updateSizes'); 1489 nv_showNavi(opts, itms.total, conf); 1490 nv_enableNavi(opts, itms.first, conf); 1491 $cfs.trigger(cf_e('updatePageStatus', conf), [true, sz]); 1492 } 1493 1494 return $removed; 1495 }); 1496 1497 // onBefore and onAfter event 1498 $cfs.bind(cf_e('onBefore', conf)+' '+cf_e('onAfter', conf), function(e, fn) { 1499 e.stopPropagation(); 1500 var eType = e.type.slice(conf.events.prefix.length); 1501 if (is_array(fn)) clbk[eType] = fn; 1502 if (typeof fn == 'function') clbk[eType].push(fn); 1503 return clbk[eType]; 1504 }); 1505 1506 // currentPosition event 1507 $cfs.bind(cf_e('currentPosition', conf), function(e, fn) { 1508 e.stopPropagation(); 1509 if (itms.first == 0) var val = 0; 1510 else var val = itms.total - itms.first; 1511 if (typeof fn == 'function') fn.call($tt0, val); 1512 return val; 1513 }); 1514 1515 // currentPage event 1516 $cfs.bind(cf_e('currentPage', conf), function(e, fn) { 1517 e.stopPropagation(); 1518 var ipp = opts.pagination.items || opts.items.visible; 1519 var max = Math.ceil(itms.total/ipp-1); 1520 if (itms.first == 0) var nr = 0; 1521 else if (itms.first < itms.total % ipp) var nr = 0; 1522 else if (itms.first == ipp && !opts.circular) var nr = max; 1523 else var nr = Math.round((itms.total-itms.first)/ipp); 1524 if (nr < 0) nr = 0; 1525 if (nr > max) nr = max; 1526 if (typeof fn == 'function') fn.call($tt0, nr); 1527 return nr; 1528 }); 1529 1530 // currentVisible event 1531 $cfs.bind(cf_e('currentVisible', conf), function(e, fn) { 1532 e.stopPropagation(); 1533 $i = gi_getCurrentItems($cfs.children(), opts); 1534 if (typeof fn == 'function') fn.call($tt0, $i); 1535 return $i; 1536 }); 1537 1538 // slice event 1539 $cfs.bind(cf_e('slice', conf), function(e, f, l, fn) { 1540 e.stopPropagation(); 1541 1542 if (itms.total == 0) return false; 1543 1544 var v = [f, l, fn], 1545 t = ['number', 'number', 'function'], 1546 a = cf_sortParams(v, t); 1547 1548 f = (typeof a[0] == 'number') ? a[0] : 0; 1549 l = (typeof a[1] == 'number') ? a[1] : itms.total; 1550 fn = a[2]; 1551 1552 f += itms.first; 1553 l += itms.first; 1554 1555 while (f > itms.total) { f -= itms.total } 1556 while (l > itms.total) { l -= itms.total } 1557 while (f < 0) { f += itms.total } 1558 while (l < 0) { l += itms.total } 1559 1560 var $iA = $cfs.children(); 1561 1562 if (l > f) { 1563 var $i = $iA.slice(f, l); 1564 } else { 1565 var $i = $( $iA.slice(f, itms.total).get().concat( $iA.slice(0, l).get() ) ); 1566 } 1567 1568 if (typeof fn == 'function') fn.call($tt0, $i); 1569 return $i; 1570 }); 1571 1572 // isPaused, isStopped and isScrolling events 1573 $cfs.bind(cf_e('isPaused', conf)+' '+cf_e('isStopped', conf)+' '+cf_e('isScrolling', conf), function(e, fn) { 1574 e.stopPropagation(); 1575 var eType = e.type.slice(conf.events.prefix.length); 1576 if (typeof fn == 'function') fn.call($tt0, crsl[eType]); 1577 return crsl[eType]; 1578 }); 1579 1580 // configuration event 1581 $cfs.bind(cf_e('configuration', conf), function(e, a, b, c) { 1582 e.stopPropagation(); 1583 var reInit = false;
1584 1585 // return entire configuration-object 1586 if (typeof a == 'function') { 1587 a.call($tt0, opts); 1588 1589 // set multiple options via object 1590 } else if (typeof a == 'object') { 1591 opts_orig = $.extend(true, {}, opts_orig, a); 1592 if (b !== false) reInit = true; 1593 else opts = $.extend(true, {}, opts, a); 1594 1595 } else if (typeof a != 'undefined') { 1596 1597 // callback function for specific option 1598 if (typeof b == 'function') { 1599 var val = eval('opts.'+a); 1600 if (typeof val == 'undefined') val = ''; 1601 b.call($tt0, val); 1602 1603 // set individual option 1604 } else if (typeof b != 'undefined') { 1605 if (typeof c !== 'boolean') c = true; 1606 eval('opts_orig.'+a+' = b'); 1607 if (c !== false) reInit = true; 1608 else eval('opts.'+a+' = b'); 1609 1610 // return value for specific option 1611 } else { 1612 return eval('opts.'+a); 1613 } 1614 } 1615 if (reInit) { 1616 sz_resetMargin($cfs.children(), opts); 1617 $cfs._cfs_init(opts_orig); 1618 $cfs._cfs_bind_buttons(); 1619 var siz = sz_setSizes($cfs, opts, false); 1620 $cfs.trigger(cf_e('updatePageStatus', conf), [true, siz]); 1621 } 1622 return opts; 1623 }); 1624 1625 // linkAnchors event 1626 $cfs.bind(cf_e('linkAnchors', conf), function(e, $con, sel) { 1627 e.stopPropagation(); 1628 if (typeof $con == 'undefined' || $con.length == 0) $con = $('body'); 1629 else if (typeof $con == 'string') $con = $($con); 1630 if (typeof $con != 'object') return debug(conf, 'Not a valid object.'); 1631 if (typeof sel != 'string' || sel.length == 0) sel = 'a.caroufredsel'; 1632 $con.find(sel).each(function() { 1633 var h = this.hash || ''; 1634 if (h.length > 0 && $cfs.children().index($(h)) != -1) { 1635 $(this).unbind('click').click(function(e) { 1636 e.preventDefault(); 1637 $cfs.trigger(cf_e('slideTo', conf), h); 1638 }); 1639 } 1640 }); 1641 return true; 1642 }); 1643 1644 // updatePageStatus event 1645 $cfs.bind(cf_e('updatePageStatus', conf), function(e, build, sizes) { 1646 e.stopPropagation(); 1647 if (!opts.pagination.container) return; 1648 1649 if (build) { 1650 var ipp = opts.pagination.items || opts.items.visible, 1651 l = Math.ceil(itms.total/ipp); 1652 1653 if (opts.pagination.anchorBuilder) { 1654 opts.pagination.container.children().remove(); 1655 opts.pagination.container.each(function() { 1656 for (var a = 0; a < l; a++) { 1657 var i = $cfs.children().eq( gn_getItemIndex(a*ipp, 0, true, itms, $cfs) ); 1658 $(this).append(opts.pagination.anchorBuilder(a+1, i)); 1659 } 1660 }); 1661 } 1662 opts.pagination.container.each(function() { 1663 $(this).children().unbind(opts.pagination.event).each(function(a) { 1664 $(this).bind(opts.pagination.event, function(e) { 1665 e.preventDefault(); 1666 $cfs.trigger(cf_e('slideTo', conf), [a*ipp, 0, true, opts.pagination]); 1667 }); 1668 }); 1669 }); 1670 } 1671 opts.pagination.container.each(function() { 1672 $(this).children().removeClass(cf_c('selected', conf)).eq($cfs.triggerHandler(cf_e('currentPage', conf))).addClass(cf_c('selected', conf)); 1673 }); 1674 return true; 1675 }); 1676 1677 // updateSizes event 1678 $cfs.bind(cf_e('updateSizes', conf), function(e) { 1679 var a_itm = $cfs.children(), 1680 vI = opts.items.visible; 1681 1682 if (opts.items.visibleConf.variable) vI = gn_getVisibleItemsNext(a_itm, opts, 0); 1683 else if (opts.items.filter != '*') vI = gn_getVisibleItemsNextFilter(a_itm, opts, 0); 1684 1685 if (!opts.circular && itms.first != 0 && vI > itms.first) { 1686 if (opts.items.visibleConf.variable) { 1687 var nI = gn_getVisibleItemsPrev(a_itm, opts, itms.first) - itms.first; 1688 } else if (opts.items.filter != '*') { 1689 var nI = gn_getVisibleItemsPrevFilter(a_itm, opts, itms.first) - itms.first; 1690 } else { 1691 nI = opts.items.visible - itms.first; 1692 } 1693 debug(conf, 'Preventing non-circular: sliding '+nI+' items backward.'); 1694 $cfs.trigger('prev', nI); 1695 } 1696 opts.items.visible = cf_getItemsAdjust(vI, opts, opts.items.visibleConf.adjust, $tt0); 1697 return sz_setSizes($cfs, opts); 1698 }); 1699 1700 // destroy event 1701 $cfs.bind(cf_e('destroy', conf), function(e, orgOrder) { 1702 e.stopPropagation(); 1703 tmrs = sc_clearTimers(tmrs); 1704 1705 $cfs.data('cfs_isCarousel', false); 1706 $cfs.trigger(cf_e('finish', conf)); 1707 if (orgOrder) { 1708 $cfs.trigger(cf_e('jumpToStart', conf)); 1709 } 1710 if (opts.usePadding) { 1711 sz_resetMargin($cfs.children(), opts); 1712 } 1713 1714 $cfs.css($cfs.data('cfs_origCss')); 1715 $cfs._cfs_unbind_events(); 1716 $cfs._cfs_unbind_buttons(); 1717 $wrp.replaceWith($cfs); 1718 1719 return true; 1720 }); 1721 1722 // triggerEvent, making prefixed and namespaced events accessible from the outside 1723 $cfs.bind('_cfs_triggerEvent', function(e, n, o) { 1724 e.stopPropagation(); 1725 return $cfs.triggerHandler(cf_e(n, conf), o); 1726 }); 1727 }; // /bind_events 1728 1729 $cfs._cfs_unbind_events = function() { 1730 $cfs.unbind(cf_e('', conf)); 1731 $cfs.unbind(cf_e('', conf, false)); 1732 }; // /unbind_events 1733 1734 $cfs._cfs_bind_buttons = function() { 1735 $cfs._cfs_unbind_buttons(); 1736 nv_showNavi(opts, itms.total, conf); 1737 nv_enableNavi(opts, itms.first, conf); 1738 1739 if (opts.auto.pauseOnHover) { 1740 var pC = bt_pauseOnHoverConfig(opts.auto.pauseOnHover);
1741 $wrp.bind(cf_e('mouseenter', conf, false), function() { $cfs.trigger(cf_e('pause', conf), pC); }) 1742 .bind(cf_e('mouseleave', conf, false), function() { $cfs.trigger(cf_e('resume', conf)); }); 1743 } 1744 1745 if (opts.auto.button) { 1746 opts.auto.button.bind(cf_e(opts.auto.event, conf, false), function(e) { 1747 e.preventDefault(); 1748 var ev = false, 1749 pC = null; 1750 1751 if (crsl.isPaused) { 1752 ev = 'play'; 1753 } else if (opts.auto.pauseOnEvent) { 1754 ev = 'pause'; 1755 pC = bt_pauseOnHoverConfig(opts.auto.pauseOnEvent); 1756 } 1757 if (ev) { 1758 $cfs.trigger(cf_e(ev, conf), pC); 1759 } 1760 }); 1761 } 1762 if (opts.prev.button) { 1763 opts.prev.button.bind(cf_e(opts.prev.event, conf, false), function(e) { 1764 e.preventDefault(); 1765 $cfs.trigger(cf_e('prev', conf)); 1766 }); 1767 if (opts.prev.pauseOnHover) { 1768 var pC = bt_pauseOnHoverConfig(opts.prev.pauseOnHover); 1769 opts.prev.button.bind(cf_e('mouseenter', conf, false), function() { $cfs.trigger(cf_e('pause', conf), pC); }) 1770 .bind(cf_e('mouseleave', conf, false), function() { $cfs.trigger(cf_e('resume', conf)); }); 1771 } 1772 } 1773 1774 if (opts.next.button) { 1775 opts.next.button.bind(cf_e(opts.next.event, conf, false), function(e) { 1776 e.preventDefault(); 1777 $cfs.trigger(cf_e('next', conf)); 1778 }); 1779 if (opts.next.pauseOnHover) { 1780 var pC = bt_pauseOnHoverConfig(opts.next.pauseOnHover); 1781 opts.next.button.bind(cf_e('mouseenter', conf, false), function() { $cfs.trigger(cf_e('pause', conf), pC); }) 1782 .bind(cf_e('mouseleave', conf, false), function() { $cfs.trigger(cf_e('resume', conf)); }); 1783 } 1784 } 1785 if ($.fn.mousewheel) { 1786 if (opts.prev.mousewheel) { 1787 if (!crsl.mousewheelPrev) { 1788 crsl.mousewheelPrev = true; 1789 $wrp.mousewheel(function(e, delta) { 1790 if (delta > 0) { 1791 e.preventDefault(); 1792 var num = bt_mousesheelNumber(opts.prev.mousewheel); 1793 $cfs.trigger(cf_e('prev', conf), num); 1794 } 1795 }); 1796 } 1797 } 1798 if (opts.next.mousewheel) { 1799 if (!crsl.mousewheelNext) { 1800 crsl.mousewheelNext = true; 1801 $wrp.mousewheel(function(e, delta) { 1802 if (delta < 0) { 1803 e.preventDefault(); 1804 var num = bt_mousesheelNumber(opts.next.mousewheel); 1805 $cfs.trigger(cf_e('next', conf), num); 1806 } 1807 }); 1808 } 1809 } 1810 } 1811 if ($.fn.touchwipe) { 1812 var wP = (opts.prev.wipe) ? function() { $cfs.trigger(cf_e('prev', conf)) } : null, 1813 wN = (opts.next.wipe) ? function() { $cfs.trigger(cf_e('next', conf)) } : null; 1814 1815 if (wN || wN) { 1816 if (!crsl.touchwipe) { 1817 crsl.touchwipe = true; 1818 var twOps = { 1819 'min_move_x': 30,
1820 'min_move_y': 30, 1821 'preventDefaultEvents': true 1822 }; 1823 switch (opts.direction) { 1824 case 'up': 1825 case 'down': 1826 twOps.wipeUp = wP; 1827 twOps.wipeDown = wN; 1828 break; 1829 default: 1830 twOps.wipeLeft = wN; 1831 twOps.wipeRight = wP; 1832 } 1833 $wrp.touchwipe(twOps); 1834 } 1835 } 1836 } 1837 if (opts.pagination.container) { 1838 if (opts.pagination.pauseOnHover) { 1839 var pC = bt_pauseOnHoverConfig(opts.pagination.pauseOnHover); 1840 opts.pagination.container.bind(cf_e('mouseenter', conf, false), function() { $cfs.trigger(cf_e('pause', conf), pC); }) 1841 .bind(cf_e('mouseleave', conf, false), function() { $cfs.trigger(cf_e('resume', conf)); }); 1842 } 1843 } 1844 if (opts.prev.key || opts.next.key) { 1845 $(document).bind(cf_e('keyup', conf, false, true, true), function(e) { 1846 var k = e.keyCode; 1847 if (k == opts.next.key) { 1848 e.preventDefault(); 1849 $cfs.trigger(cf_e('next', conf)); 1850 } 1851 if (k == opts.prev.key) { 1852 e.preventDefault(); 1853 $cfs.trigger(cf_e('prev', conf)); 1854 } 1855 }); 1856 } 1857 if (opts.pagination.keys) { 1858 $(document).bind(cf_e('keyup', conf, false, true, true), function(e) { 1859 var k = e.keyCode; 1860 if (k >= 49 && k < 58) { 1861 k = (k-49) * opts.items.visible; 1862 if (k <= itms.total) { 1863 e.preventDefault(); 1864 $cfs.trigger(cf_e('slideTo', conf), [k, 0, true, opts.pagination]); 1865 } 1866 } 1867 }); 1868 } 1869 if (opts.auto.play) { 1870 $cfs.trigger(cf_e('play', conf), opts.auto.delay); 1871 } 1872 1873if (crsl.upDateOnWindowResize) { 1874 var $w = $(window), 1875 _windowWidth = $w.width(), 1876 _windowHeight = $w.height(); 1877 1878 $w.bind(cf_e('resize', conf, false, true, true), function(e) { 1879 if ($w.width() != _windowWidth || $w.height() != _windowHeight) { 1880 $cfs.trigger(cf_e('finish', conf)); 1881 if (opts.auto.pauseOnResize && !crsl.isPaused) { 1882 $cfs.trigger(cf_e('play', conf)); 1883 } 1884 sz_resetMargin($cfs.children(), opts); 1885 $cfs._cfs_init(opts_orig); 1886 var siz = sz_setSizes($cfs, opts, false); 1887 $cfs.trigger(cf_e('updatePageStatus', conf), [true, siz]); 1888 1889 _windowWidth = $w.width(); 1890 _windowHeight = $w.height(); 1891 } 1892 }); 1893} 1894 1895 }; // /bind_buttons 1896 1897 $cfs._cfs_unbind_buttons = function() { 1898 var ns1 = cf_e('', conf), 1899 ns2 = cf_e('', conf, false); 1900 ns3 = cf_e('', conf, false, true, true); 1901 1902 $(document).unbind(ns3); 1903 $(window).unbind(ns3); 1904 $wrp.unbind(ns2); 1905 1906 if (opts.auto.button) opts.auto.button.unbind(ns2); 1907 if (opts.prev.button) opts.prev.button.unbind(ns2); 1908 if (opts.next.button) opts.next.button.unbind(ns2); 1909 if (opts.pagination.container) { 1910 opts.pagination.container.unbind(ns2); 1911 if (opts.pagination.anchorBuilder) { 1912 opts.pagination.container.children().remove(); 1913 } 1914 } 1915 1916 nv_showNavi(opts, 'hide', conf); 1917 nv_enableNavi(opts, 'removeClass', conf); 1918 1919 }; // /unbind_buttons 1920 1921 1922 1923 // START 1924 1925 var crsl = { 1926 'direction' : 'next', 1927 'isPaused' : true, 1928 'isScrolling' : false, 1929 'isStopped' : false, 1930 1931 'mousewheelNext': false, 1932 'mousewheelPrev': false, 1933 'touchwipe' : false 1934 }, 1935 itms = { 1936 'total' : $cfs.children().length, 1937 'first' : 0 1938 }, 1939 tmrs = { 1940 'timer' : null, 1941 'auto' : null, 1942 'queue' : null, 1943 'startTime' : getTime(), 1944 'timePassed' : 0 1945 }, 1946 scrl = { 1947 'isStopped' : false, 1948 'duration' : 0, 1949 'startTime' : 0, 1950 'easing' : '', 1951 'anims' : [] 1952 }, 1953 clbk = { 1954 'onBefore' : [], 1955 'onAfter' : [] 1956 }, 1957 queu = [], 1958 conf = $.extend(true, {}, $.fn.carouFredSel.configs, configs), 1959 opts = {}, 1960 opts_orig = options, 1961 $wrp = $cfs.wrap('<'+conf.wrapper.element+' class="'+conf.wrapper.classname+'" />').parent(); 1962 1963 conf.selector = $cfs.selector; 1964 conf.serialNumber = $.fn.carouFredSel.serialNumber++; 1965 1966 // create carousel 1967 $cfs._cfs_init(opts_orig, true, starting_position); 1968 $cfs._cfs_build(); 1969 $cfs._cfs_bind_events(); 1970 $cfs._cfs_bind_buttons(); 1971 1972 // find item to start 1973 if (is_array(opts.items.start)) { 1974 var start_arr = opts.items.start; 1975 } else { 1976 var start_arr = []; 1977 if (opts.items.start != 0) { 1978 start_arr.push(opts.items.start); 1979 } 1980 } 1981 if (opts.cookie) { 1982 start_arr.unshift(cf_readCookie(opts.cookie)); 1983 } 1984 if (start_arr.length > 0) { 1985 for (var a = 0, l = start_arr.length; a < l; a++) { 1986 var s = start_arr[a]; 1987 if (s == 0) { 1988 continue; 1989 } 1990 if (s === true) { 1991 s = window.location.hash; 1992 if (s.length < 1) { 1993 continue; 1994 } 1995 } else if (s === 'random') { 1996 s = Math.floor(Math.random()*itms.total); 1997 } 1998 if ($cfs.triggerHandler(cf_e('slideTo', conf), [s, 0, true, { fx: 'none' }])) { 1999 break; 2000 } 2001 } 2002 } 2003 var siz = sz_setSizes($cfs, opts, false), 2004 itm = gi_getCurrentItems($cfs.children(), opts); 2005 2006 if (opts.onCreate) { 2007 opts.onCreate.call($tt0, itm, siz); 2008 } 2009 2010 $cfs.trigger(cf_e('updatePageStatus', conf), [true, siz]); 2011 $cfs.trigger(cf_e('linkAnchors', conf)); 2012 2013 return $cfs; 2014 }; 2015 2016 2017 // GLOBAL PUBLIC 2018 2019 $.fn.carouFredSel.serialNumber = 1; 2020 $.fn.carouFredSel.defaults = { 2021 'synchronise' : false, 2022 'infinite' : true, 2023 'circular' : true, 2024 'responsive' : false, 2025 'direction' : 'left', 2026 'items' : { 2027 'start' : 0 2028 }, 2029 'scroll' : { 2030 'easing' : 'swing', 2031 'duration' : 500, 2032 'pauseOnHover' : false, 2033 'mousewheel' : false, 2034 'wipe' : false, 2035 'event' : 'click', 2036 'queue' : false 2037 } 2038 }; 2039 $.fn.carouFredSel.configs = { 2040 'debug' : false, 2041 'events' : { 2042 'prefix' : '', 2043 'namespace' : 'cfs' 2044 }, 2045 'wrapper' : { 2046 'element' : 'div', 2047 'classname' : 'caroufredsel_wrapper' 2048 }, 2049 'classnames' : {} 2050 }; 2051 $.fn.carouFredSel.pageAnchorBuilder = function(nr, itm) { 2052 return '<a href="#"><span>'+nr+'</span></a>'; 2053 }; 2054 2055 2056 // GLOBAL PRIVATE 2057 2058 // scrolling functions 2059 function sc_setScroll(d, e) { 2060 return { 2061 anims : [], 2062 duration : d, 2063 orgDuration : d, 2064 easing : e, 2065 startTime : getTime() 2066 }; 2067 } 2068 function sc_startScroll(s) { 2069 if (typeof s.pre == 'object') { 2070 sc_startScroll(s.pre); 2071 } 2072 for (var a = 0, l = s.anims.length; a < l; a++) { 2073 var b = s.anims[a]; 2074 if (!b) continue; 2075 if (b[3]) b[0].stop(); 2076 b[0].animate(b[1], { 2077 complete: b[2], 2078 duration: s.duration, 2079 easing: s.easing 2080 }); 2081 } 2082 if (typeof s.post == 'object') { 2083 sc_startScroll(s.post); 2084 } 2085 } 2086 function sc_stopScroll(s, finish) { 2087 if (typeof finish != 'boolean') finish = true; 2088 if (typeof s.pre == 'object') { 2089 sc_stopScroll(s.pre, finish); 2090 } 2091 for (var a = 0, l = s.anims.length; a < l; a++) { 2092 var b = s.anims[a]; 2093 b[0].stop(true); 2094 if (finish) { 2095 b[0].css(b[1]); 2096 if (typeof b[2] == 'function') b[2](); 2097 } 2098 } 2099 if (typeof s.post == 'object') { 2100 sc_stopScroll(s.post, finish); 2101 } 2102 } 2103 function sc_clearTimers(t) { 2104 if (t.auto) clearTimeout(t.auto); 2105 return t; 2106 } 2107 function sc_callCallbacks(cbs, t, args) { 2108 if (cbs.length) { 2109 for (var a = 0, l = cbs.length; a < l; a++) {
2110 cbs[a].apply(t, args); 2111 } 2112 } 2113 return []; 2114 } 2115 2116 // fx functions 2117 function fx_fade(sO, c, x, d, f) { 2118 var o = { 2119 'duration' : d, 2120 'easing' : sO.easing 2121 }; 2122 if (typeof f == 'function') o.complete = f; 2123 c.animate({ 2124 opacity: x 2125 }, o); 2126 } 2127 function fx_cover(sc, c1, c2, o, prev) { 2128 var old_w = ms_getSizes(gi_getOldItemsNext(c1.children(), o), o, true)[0], 2129 new_w = ms_getSizes(c2.children(), o, true)[0], 2130 cur_l = (prev) ? -new_w : old_w, 2131 css_o = {}, 2132 ani_o = {}; 2133 2134 css_o[o.d['width']] = new_w; 2135 css_o[o.d['left']] = cur_l; 2136 ani_o[o.d['left']] = 0; 2137 2138 sc.pre.anims.push([c1, { 'opacity': 1 }]); 2139 sc.post.anims.push([c2, ani_o, function() { $(this).remove(); }]); 2140 c2.css(css_o); 2141 return sc; 2142 } 2143 function fx_uncover(sc, c1, c2, o, prev, n) { 2144 var new_w = ms_getSizes(gi_getNewItemsNext(c1.children(), o, n), o, true)[0], 2145 old_w = ms_getSizes(c2.children(), o, true)[0], 2146 cur_l = (prev) ? -old_w : new_w, 2147 css_o = {}, 2148 ani_o = {}; 2149 2150 css_o[o.d['width']] = old_w; 2151 css_o[o.d['left']] = 0; 2152 ani_o[o.d['left']] = cur_l; 2153 sc.post.anims.push([c2, ani_o, function() { $(this).remove(); }]); 2154 c2.css(css_o); 2155 return sc; 2156 } 2157 2158 // navigation functions 2159 function nv_showNavi(o, t, c) { 2160 if (t == 'show' || t == 'hide') { 2161 var f = t; 2162 } else if (o.items.minimum >= t) { 2163 debug(c, 'Not enough items: hiding navigation ('+t+' items, '+o.items.minimum+' needed).'); 2164 var f = 'hide'; 2165 } else { 2166 var f = 'show'; 2167 } 2168 var s = (f == 'show') ? 'removeClass' : 'addClass', 2169 h = cf_c('hidden', c); 2170 if (o.auto.button) o.auto.button[f]()[s](h); 2171 if (o.prev.button) o.prev.button[f]()[s](h); 2172 if (o.next.button) o.next.button[f]()[s](h); 2173 if (o.pagination.container) o.pagination.container[f]()[s](h); 2174 } 2175 function nv_enableNavi(o, f, c) { 2176 if (o.circular || o.infinite) return; 2177 var fx = (f == 'removeClass' || f == 'addClass') ? f : false, 2178 di = cf_c('disabled', c); 2179 if (o.auto.button && fx) { 2180 o.auto.button[fx](di); 2181 } 2182 if (o.prev.button) { 2183 var fn = fx || (f == 0) ? 'addClass' : 'removeClass'; 2184 o.prev.button[fn](di); 2185 } 2186 if (o.next.button) { 2187 var fn = fx || (f == o.items.visible) ? 'addClass' : 'removeClass'; 2188 o.next.button[fn](di); 2189 } 2190 } 2191 2192 // get object functions 2193 function go_getObject($tt, obj) { 2194 if (typeof obj == 'function') obj = obj.call($tt); 2195 if (typeof obj == 'undefined') obj = {}; 2196 return obj; 2197 } 2198 function go_getNaviObject($tt, obj, type) { 2199 if (typeof type != 'string') type = ''; 2200 2201 obj = go_getObject($tt, obj); 2202 if (typeof obj == 'string') { 2203 var temp = cf_getKeyCode(obj); 2204 if (temp == -1) obj = $(obj); 2205 else obj = temp; 2206 } 2207 2208 // pagination 2209 if (type == 'pagination') { 2210 if (typeof obj == 'boolean') obj = { 'keys': obj }; 2211 if (typeof obj.jquery != 'undefined') obj = { 'container': obj }; 2212 if (typeof obj.container == 'function') obj.container = obj.container.call($tt); 2213 if (typeof obj.container == 'string') obj.container = $(obj.container); 2214 if (typeof obj.items != 'number') obj.items = false; 2215 2216 // auto 2217 } else if (type == 'auto') { 2218 if (typeof obj.jquery != 'undefined') obj = { 'button': obj }; 2219 if (typeof obj == 'boolean') obj = { 'play': obj }; 2220 if (typeof obj == 'number') obj = { 'pauseDuration': obj }; 2221 if (typeof obj.button == 'function') obj.button = obj.button.call($tt); 2222 if (typeof obj.button == 'string') obj.button = $(obj.button); 2223 2224 // prev + next 2225 } else { 2226 if (typeof obj.jquery != 'undefined') obj = { 'button': obj }; 2227 if (typeof obj == 'number') obj = { 'key': obj }; 2228 if (typeof obj.button == 'function') obj.button = obj.button.call($tt); 2229 if (typeof obj.button == 'string') obj.button = $(obj.button); 2230 if (typeof obj.key == 'string') obj.key = cf_getKeyCode(obj.key); 2231 } 2232 2233 return obj; 2234 } 2235 2236 // get number functions 2237 function gn_getItemIndex(num, dev, org, items, $cfs) { 2238 if (typeof num == 'string') { 2239 if (isNaN(num)) num = $(num); 2240 else num = parseInt(num); 2241 } 2242 if (typeof num == 'object') { 2243 if (typeof num.jquery == 'undefined') num = $(num); 2244 num = $cfs.children().index(num); 2245 if (num == -1) num = 0; 2246 if (typeof org != 'boolean') org = false;
2247 } else { 2248 if (typeof org != 'boolean') org = true; 2249 } 2250 if (isNaN(num)) num = 0; 2251 else num = parseInt(num); 2252 if (isNaN(dev)) dev = 0; 2253 else dev = parseInt(dev); 2254 2255 if (org) { 2256 num += items.first; 2257 } 2258 num += dev; 2259 if (items.total > 0) { 2260 while (num >= items.total) { num -= items.total; } 2261 while (num < 0) { num += items.total; } 2262 } 2263 return num; 2264 } 2265 2266 // items prev 2267 function gn_getVisibleItemsPrev(i, o, s) { 2268 var t = 0, 2269 x = 0; 2270 2271 for (var a = s; a >= 0; a--) { 2272 var j = i.eq(a); 2273 t += (j.is(':visible')) ? j[o.d['outerWidth']](true) : 0; 2274 if (t > o.maxDimention) return x; 2275 if (a == 0) a = i.length; 2276 x++; 2277 } 2278 } 2279 function gn_getVisibleItemsPrevFilter(i, o, s) { 2280 return gn_getItemsPrevFilter(i, o.items.filter, o.items.visibleConf.org, s); 2281 } 2282 function gn_getScrollItemsPrevFilter(i, o, s, m) { 2283 return gn_getItemsPrevFilter(i, o.items.filter, m, s); 2284 } 2285 function gn_getItemsPrevFilter(i, f, m, s) { 2286 var t = 0, 2287 x = 0; 2288 2289 for (var a = s, l = i.length; a >= 0; a--) { 2290 x++; 2291 if (x == l) return x; 2292 2293 var j = i.eq(a); 2294 if (j.is(f)) { 2295 t++; 2296 if (t == m) return x; 2297 }
2298 if (a == 0) a = l; 2299 } 2300 } 2301 2302 function gn_getVisibleOrg($c, o) { 2303 return o.items.visibleConf.org || $c.children().slice(0, o.items.visible).filter(o.items.filter).length; 2304 } 2305 2306 // items next 2307 function gn_getVisibleItemsNext(i, o, s) { 2308 var t = 0, 2309 x = 0; 2310 2311 for (var a = s, l = i.length-1; a <= l; a++) { 2312 var j = i.eq(a); 2313 2314 t += (j.is(':visible')) ? j[o.d['outerWidth']](true) : 0; 2315 if (t > o.maxDimention) return x; 2316 2317 x++; 2318 if (x == l+1) return x; 2319 if (a == l) a = -1; 2320 } 2321 } 2322 function gn_getVisibleItemsNextTestCircular(i, o, s, l) { 2323 var v = gn_getVisibleItemsNext(i, o, s); 2324 if (!o.circular) { 2325 if (s + v > l) v = l - s; 2326 } 2327 return v; 2328 } 2329 function gn_getVisibleItemsNextFilter(i, o, s) { 2330 return gn_getItemsNextFilter(i, o.items.filter, o.items.visibleConf.org, s, o.circular); 2331 } 2332 function gn_getScrollItemsNextFilter(i, o, s, m) { 2333 return gn_getItemsNextFilter(i, o.items.filter, m+1, s, o.circular) - 1; 2334 } 2335 function gn_getItemsNextFilter(i, f, m, s, c) { 2336 var t = 0, 2337 x = 0; 2338 2339 for (var a = s, l = i.length-1; a <= l; a++) { 2340 x++; 2341 if (x == l) return x; 2342 2343 var j = i.eq(a); 2344 if (j.is(f)) { 2345 t++; 2346 if (t == m) return x; 2347 }
2348 if (a == l) a = -1; 2349 } 2350 } 2351 2352 // get items functions 2353 function gi_getCurrentItems(i, o) { 2354 return i.slice(0, o.items.visible); 2355 } 2356 function gi_getOldItemsPrev(i, o, n) { 2357 return i.slice(n, o.items.visibleConf.old+n); 2358 } 2359 function gi_getNewItemsPrev(i, o) { 2360 return i.slice(0, o.items.visible); 2361 } 2362 function gi_getOldItemsNext(i, o) { 2363 return i.slice(0, o.items.visibleConf.old); 2364 } 2365 function gi_getNewItemsNext(i, o, n) { 2366 return i.slice(n, o.items.visible+n); 2367 } 2368 2369 // sizes functions 2370 function sz_resetMargin(i, o, m) { 2371 var x = (typeof m == 'boolean') ? m : false; 2372 if (typeof m != 'number') m = 0; 2373 i.each(function() { 2374 var j = $(this); 2375 var t = parseInt(j.css(o.d['marginRight'])); 2376 if (isNaN(t)) t = 0; 2377 j.data('cfs_tempCssMargin', t); 2378 j.css(o.d['marginRight'], ((x) ? j.data('cfs_tempCssMargin') : m + j.data('cfs_origCssMargin'))); 2379 }); 2380 } 2381 function sz_setSizes($c, o, p) { 2382 var $w = $c.parent(), 2383 $i = $c.children(), 2384 $v = gi_getCurrentItems($i, o), 2385 sz = cf_mapWrapperSizes(ms_getSizes($v, o, true), o, p); 2386 2387 $w.css(sz); 2388 2389 if (o.usePadding) { 2390 var p = o.padding, 2391 r = p[o.d[1]]; 2392 if (o.align) { 2393 if (r < 0) r = 0; 2394 } 2395 var $l = $v.last(); 2396 $l.css(o.d['marginRight'], $l.data('cfs_origCssMargin') + r); 2397 $c.css(o.d['top'], p[o.d[0]]); 2398 $c.css(o.d['left'], p[o.d[3]]); 2399 } 2400 2401 $c.css(o.d['width'], sz[o.d['width']]+(ms_getTotalSize($i, o, 'width')*2)); 2402 $c.css(o.d['height'], ms_getLargestSize($i, o, 'height')); 2403 return sz; 2404 } 2405 2406 // measuring functions 2407 function ms_getSizes(i, o, wrapper) { 2408 var s1 = ms_getTotalSize(i, o, 'width', wrapper), 2409 s2 = ms_getLargestSize(i, o, 'height', wrapper); 2410 return [s1, s2]; 2411 } 2412 function ms_getLargestSize(i, o, dim, wrapper) { 2413 if (typeof wrapper != 'boolean') wrapper = false;
2414 if (typeof o[o.d[dim]] == 'number' && wrapper) return o[o.d[dim]]; 2415 if (typeof o.items[o.d[dim]] == 'number') return o.items[o.d[dim]]; 2416 var di2 = (dim.toLowerCase().indexOf('width') > -1) ? 'outerWidth' : 'outerHeight'; 2417 return ms_getTrueLargestSize(i, o, di2); 2418 } 2419 function ms_getTrueLargestSize(i, o, dim) { 2420 var s = 0; 2421 2422 for (var a = 0, l = i.length; a < l; a++) { 2423 var j = i.eq(a); 2424 2425 var m = (j.is(':visible')) ? j[o.d[dim]](true) : 0; 2426 if (s < m) s = m; 2427 } 2428 return s; 2429 } 2430 function ms_getTrueInnerSize($el, o, dim) { 2431 if (!$el.is(':visible')) return 0; 2432 2433 var siz = $el[o.d[dim]](), 2434 arr = (o.d[dim].toLowerCase().indexOf('width') > -1) ? ['paddingLeft', 'paddingRight'] : ['paddingTop', 'paddingBottom']; 2435 2436 for (var a = 0, l = arr.length; a < l; a++) { 2437 var m = parseInt($el.css(arr[a])); 2438 siz -= (isNaN(m)) ? 0 : m; 2439 } 2440 return siz; 2441 } 2442 function ms_getTotalSize(i, o, dim, wrapper) { 2443 if (typeof wrapper != 'boolean') wrapper = false; 2444 if (typeof o[o.d[dim]] == 'number' && wrapper) return o[o.d[dim]]; 2445 if (typeof o.items[o.d[dim]] == 'number') return o.items[o.d[dim]] * i.length; 2446 2447 var d = (dim.toLowerCase().indexOf('width') > -1) ? 'outerWidth' : 'outerHeight', 2448 s = 0; 2449 2450 for (var a = 0, l = i.length; a < l; a++) { 2451 var j = i.eq(a); 2452 s += (j.is(':visible')) ? j[o.d[d]](true) : 0; 2453 } 2454 return s; 2455 } 2456 function ms_hasVariableSizes(i, o, dim) { 2457 var s = false, 2458 v = false; 2459 2460 for (var a = 0, l = i.length; a < l; a++) { 2461 var j = i.eq(a); 2462 2463 var c = (j.is(':visible')) ? j[o.d[dim]](true) : 0; 2464 if (s === false) s = c; 2465 else if (s != c) v = true; 2466 if (s == 0) v = true; 2467 } 2468 return v; 2469 } 2470 function ms_getPaddingBorderMargin(i, o, d) { 2471 return i[o.d['outer'+d]](true) - ms_getTrueInnerSize(i, o, 'inner'+d); 2472 } 2473 function ms_isPercentage(x) { 2474 return (typeof x == 'string' && x.slice(-1) == '%'); 2475 } 2476 function ms_getPercentage(s, o) { 2477 if (ms_isPercentage(o)) { 2478 o = o.slice(0, -1); 2479 if (isNaN(o)) return s; 2480 s *= o/100; 2481 } 2482 return s; 2483 } 2484 2485 // config functions 2486 function cf_e(n, c, pf, ns, rd) { 2487 if (typeof pf != 'boolean') pf = true; 2488 if (typeof ns != 'boolean') ns = true; 2489 if (typeof rd != 'boolean') rd = false; 2490 2491 if (pf) n = c.events.prefix + n; 2492 if (ns) n = n +'.'+ c.events.namespace; 2493 if (ns && rd) n += c.serialNumber; 2494 2495 return n; 2496 } 2497 function cf_c(n, c) { 2498 return (typeof c.classnames[n] == 'string') ? c.classnames[n] : n; 2499 } 2500 function cf_mapWrapperSizes(ws, o, p) { 2501 if (typeof p != 'boolean') p = true; 2502 var pad = (o.usePadding && p) ? o.padding : [0, 0, 0, 0]; 2503 var wra = {}; 2504 wra[o.d['width']] = ws[0] + pad[1] + pad[3]; 2505 wra[o.d['height']] = ws[1] + pad[0] + pad[2]; 2506 2507 return wra; 2508 } 2509 function cf_sortParams(vals, typs) { 2510 var arr = []; 2511 for (var a = 0, l1 = vals.length; a < l1; a++) { 2512 for (var b = 0, l2 = typs.length; b < l2; b++) { 2513 if (typs[b].indexOf(typeof vals[a]) > -1 && typeof arr[b] == 'undefined') { 2514 arr[b] = vals[a]; 2515 break; 2516 } 2517 } 2518 } 2519 return arr; 2520 } 2521 function cf_getPadding(p) { 2522 if (typeof p == 'undefined') return [0, 0, 0, 0]; 2523 2524 if (typeof p == 'number') return [p, p, p, p]; 2525 else if (typeof p == 'string') p = p.split('px').join('').split('em').join('').split(' '); 2526 2527 if (!is_array(p)) { 2528 return [0, 0, 0, 0]; 2529 } 2530 for (var i = 0; i < 4; i++) { 2531 p[i] = parseInt(p[i]); 2532 } 2533 switch (p.length) { 2534 case 0: return [0, 0, 0, 0]; 2535 case 1: return [p[0], p[0], p[0], p[0]]; 2536 case 2: return [p[0], p[1], p[0], p[1]]; 2537 case 3: return [p[0], p[1], p[2], p[1]]; 2538 default: return [p[0], p[1], p[2], p[3]]; 2539 } 2540 } 2541 function cf_getAlignPadding(itm, o) { 2542 var x = (typeof o[o.d['width']] == 'number') ? Math.ceil(o[o.d['width']] - ms_getTotalSize(itm, o, 'width')) : 0; 2543 switch (o.align) { 2544 case 'left': return [0, x]; 2545 case 'right': return [x, 0]; 2546 case 'center': 2547 default: 2548 return [Math.ceil(x/2), Math.floor(x/2)]; 2549 } 2550 } 2551 function cf_getAdjust(x, o, a, $t) { 2552 var v = x; 2553 if (typeof a == 'function') { 2554 v = a.call($t, v); 2555 2556 } else if (typeof a == 'string') { 2557 var p = a.split('+'), 2558 m = a.split('-'); 2559 2560 if (m.length > p.length) { 2561 var neg = true, 2562 sta = m[0], 2563 adj = m[1]; 2564 } else { 2565 var neg = false, 2566 sta = p[0], 2567 adj = p[1]; 2568 } 2569 2570 switch(sta) { 2571 case 'even': 2572 v = (x % 2 == 1) ? x-1 : x; 2573 break; 2574 case 'odd': 2575 v = (x % 2 == 0) ? x-1 : x; 2576 break; 2577 default: 2578 v = x; 2579 break; 2580 } 2581 adj = parseInt(adj); 2582 if (!isNaN(adj)) { 2583 if (neg) adj = -adj; 2584 v += adj; 2585 } 2586 } 2587 if (typeof v != 'number') v = 1; 2588 if (v < 1) v = 1; 2589 return v; 2590 } 2591 function cf_getItemsAdjust(x, o, a, $t) { 2592 return cf_getItemAdjustMinMax(cf_getAdjust(x, o, a, $t), o.items.visibleConf); 2593 } 2594 function cf_getItemAdjustMinMax(v, i) { 2595 if (typeof i.min == 'number' && v < i.min) v = i.min; 2596 if (typeof i.max == 'number' && v > i.max) v = i.max; 2597 if (v < 1) v = 1; 2598 return v; 2599 } 2600 function cf_getSynchArr(s) { 2601 if (!is_array(s)) s = [[s]]; 2602 if (!is_array(s[0])) s = [s]; 2603 for (var j = 0, l = s.length; j < l; j++) { 2604 if (typeof s[j][0] == 'string') s[j][0] = $(s[j][0]); 2605 if (typeof s[j][1] != 'boolean') s[j][1] = true; 2606 if (typeof s[j][2] != 'boolean') s[j][2] = true; 2607 if (typeof s[j][3] != 'number') s[j][3] = 0; 2608 } 2609 return s; 2610 } 2611 function cf_getKeyCode(k) { 2612 if (k == 'right') return 39; 2613 if (k == 'left') return 37; 2614 if (k == 'up') return 38; 2615 if (k == 'down') return 40; 2616 return -1; 2617 } 2618 function cf_setCookie(n, v) { 2619 if (n) document.cookie = n+'='+v+'; path=/'; 2620 } 2621 function cf_readCookie(n) { 2622 n += '='; 2623 var ca = document.cookie.split(';'); 2624 for (var a = 0, l = ca.length; a < l; a++) { 2625 var c = ca[a]; 2626 while (c.charAt(0) == ' ') { 2627 c = c.slice(1); 2628 } 2629 if (c.indexOf(n) == 0) { 2630 return c.slice(n.length); 2631 } 2632 } 2633 return 0; 2634 } 2635 2636 // buttons functions 2637 function bt_pauseOnHoverConfig(p) { 2638 if (p && typeof p == 'string') { 2639 var i = (p.indexOf('immediate') > -1) ? true : false, 2640 r = (p.indexOf('resume') > -1) ? true : false;
2641 } else { 2642 var i = r = false; 2643 } 2644 return [i, r]; 2645 } 2646 function bt_mousesheelNumber(mw) { 2647 return (typeof mw == 'number') ? mw : null 2648 } 2649 2650 // helper functions 2651 function is_array(a) { 2652 return typeof(a) == 'object' && (a instanceof Array); 2653 } 2654 2655 function getTime() { 2656 return new Date().getTime(); 2657 } 2658 2659 function debug(d, m) { 2660 if (typeof d == 'object') { 2661 var s = ' ('+d.selector+')'; 2662 d = d.debug; 2663 } else { 2664 var s = ''; 2665 } 2666 if (!d) return false; 2667 2668 if (typeof m == 'string') m = 'carouFredSel'+s+': ' + m; 2669 else m = ['carouFredSel'+s+':', m]; 2670 2671 if (window.console && window.console.log) window.console.log(m); 2672 return false; 2673 } 2674 2675 2676 // CAROUFREDSEL ALL LOWERCASE 2677 2678 $.fn.caroufredsel = function(o, c) { 2679 return this.carouFredSel(o, c); 2680 }; 2681 2682 2683 // EASING FUNCTIONS 2684 2685 $.extend($.easing, { 2686 'quadratic' : function(t) { 2687 var t2 = t * t; 2688 return t * (-t2 * t + 4 * t2 - 6 * t + 4); 2689 }, 2690 'cubic' : function(t) { 2691 return t * (4 * t * t - 9 * t + 6); 2692 }, 2693 'elastic' : function(t) { 2694 var t2 = t * t; 2695 return t * (33 * t2 * t2 - 106 * t2 * t + 126 * t2 - 67 * t + 15); 2696 } 2697 }); 2698 2699 2700})(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.