PageSourceSearch

https://greekcathedral.com/wp-content/themes/evangelist-parent/js/jquery.carouFredSel.js?ver=7.0.5

js greekcathedral.com collected 2026-09-25 00:10:09 UTC 91,090 bytes, 4,255 lines download raw bytes

1/*
2 *	jQuery carouFredSel 6.2.1
3 *	Demo's and documentation:
4 *	caroufredsel.dev7studios.com
5 *
6 *	Copyright (c) 2013 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	//	LOCAL
19
20	if ( $.fn.carouFredSel )
21	{
22		return;
23	}
24
25	$.fn.caroufredsel = $.fn.carouFredSel = function(options, configs)
26	{
27
28		//	no element
29		if (this.length == 0)
30		{
31			debug( true, 'No element found for "' + this.selector + '".' );
32			return this;
33		}
34
35		//	multiple elements
36		if (this.length > 1)
37		{
38			return this.each(function() {
39				$(this).carouFredSel(options, configs);
40			});
41		}
42
43
44		var $cfs = this,
45			$tt0 = this[0],
46			starting_position = false;
47
48		if ($cfs.data('_cfs_isCarousel'))
49		{
50			starting_position = $cfs.triggerHandler('_cfs_triggerEvent', 'currentPosition');
51			$cfs.trigger('_cfs_triggerEvent', ['destroy', true]);
52		}
53
54		var FN = {};
55
56		FN._init = function(o, setOrig, start)
57		{
58			o = go_getObject($tt0, o);
59
60			o.items = go_getItemsObject($tt0, o.items);
61			o.scroll = go_getScrollObject($tt0, o.scroll);
62			o.auto = go_getAutoObject($tt0, o.auto);
63			o.prev = go_getPrevNextObject($tt0, o.prev);
64			o.next = go_getPrevNextObject($tt0, o.next);
65			o.pagination = go_getPaginationObject($tt0, o.pagination);
66			o.swipe = go_getSwipeObject($tt0, o.swipe);
67			o.mousewheel = go_getMousewheelObject($tt0, o.mousewheel);
68
69			if (setOrig)
70			{
71				opts_orig = $.extend(true, {}, $.fn.carouFredSel.defaults, o);
72			}
73
74			opts = $.extend(true, {}, $.fn.carouFredSel.defaults, o);
75			opts.d = cf_getDimensions(opts);
76
77			crsl.direction = (opts.direction == 'up' || opts.direction == 'left') ? 'next' : 'prev';
78
79			var	a_itm = $cfs.children(),
80				avail_primary = ms_getParentSize($wrp, opts, 'width');
81
82			if (is_true(opts.cookie))
83			{
84				opts.cookie = 'caroufredsel_cookie_' + conf.serialNumber;
85			}
86
87			opts.maxDimension = ms_getMaxDimension(opts, avail_primary);
88
89			//	complement items and sizes
90			opts.items = in_complementItems(opts.items, opts, a_itm, start);
91			opts[opts.d['width']] = in_complementPrimarySize(opts[opts.d['width']], opts, a_itm);
92			opts[opts.d['height']] = in_complementSecondarySize(opts[opts.d['height']], opts, a_itm);
93
94			//	primary size not set for a responsive carousel
95			if (opts.responsive)
96			{
97				if (!is_percentage(opts[opts.d['width']]))
98				{
99					opts[opts.d['width']] = '100%';
100				}
101			}
102
103			//	primary size is percentage
104			if (is_percentage(opts[opts.d['width']]))
105			{
106				crsl.upDateOnWindowResize = true;
107				crsl.primarySizePercentage = opts[opts.d['width']];
108				opts[opts.d['width']] = ms_getPercentage(avail_primary, crsl.primarySizePercentage);
109				if (!opts.items.visible)
110				{
111					opts.items.visibleConf.variable = true;
112				}
113			}
114
115			if (opts.responsive)
116			{
117				opts.usePadding = false;
118				opts.padding = [0, 0, 0, 0];
119				opts.align = false;
120				opts.items.visibleConf.variable = false;
121			}
122			else
123			{
124				//	visible-items not set
125				if (!opts.items.visible)
126				{
127					opts = in_complementVisibleItems(opts, avail_primary);
128				}
129
130				//	primary size not set -> calculate it or set to "variable"
131				if (!opts[opts.d['width']])
132				{
133					if (!opts.items.visibleConf.variable && is_number(opts.items[opts.d['width']]) && opts.items.filter == '*')
134					{
135						opts[opts.d['width']] = opts.items.visible * opts.items[opts.d['width']];
136						opts.align = false;
137					}
138					else
139					{
140						opts[opts.d['width']] = 'variable';
141					}
142				}
143				//	align not set -> set to center if primary size is number
144				if (is_undefined(opts.align))
145				{
146					opts.align = (is_number(opts[opts.d['width']]))
147						? 'center'
148						: false;
149				}
150				//	set variabe visible-items
151				if (opts.items.visibleConf.variable)
152				{
153					opts.items.visible = gn_getVisibleItemsNext(a_itm, opts, 0);
154				}
155			}
156
157			//	set visible items by filter
158			if (opts.items.filter != '*' && !opts.items.visibleConf.variable)
159			{
160				opts.items.visibleConf.org = opts.items.visible;
161				opts.items.visible = gn_getVisibleItemsNextFilter(a_itm, opts, 0);
162			}
163
164			opts.items.visible = cf_getItemsAdjust(opts.items.visible, opts, opts.items.visibleConf.adjust, $tt0);
165			opts.items.visibleConf.old = opts.items.visible;
166
167			if (opts.responsive)
168			{
169				if (!opts.items.visibleConf.min)
170				{
171					opts.items.visibleConf.min = opts.items.visible;
172				}
173				if (!opts.items.visibleConf.max)
174				{
175					opts.items.visibleConf.max = opts.items.visible;
176				}
177				opts = in_getResponsiveValues(opts, a_itm, avail_primary);
178			}
179			else
180			{
181				opts.padding = cf_getPadding(opts.padding);
182
183				if (opts.align == 'top')
184				{
185					opts.align = 'left';
186				}
187				else if (opts.align == 'bottom')
188				{
189					opts.align = 'right';
190				}
191
192				switch (opts.align)
193				{
194					//	align: center, left or right
195					case 'center':
196					case 'left':
197					case 'right':
198						if (opts[opts.d['width']] != 'variable')
199						{
200							opts = in_getAlignPadding(opts, a_itm);
201							opts.usePadding = true;
202						}
203						break;
204
205					//	padding
206					default:
207						opts.align = false;
208						opts.usePadding = (
209							opts.padding[0] == 0 && 
210							opts.padding[1] == 0 && 
211							opts.padding[2] == 0 && 
212							opts.padding[3] == 0
213						) ? false : true;
214						break;
215				}
216			}
217
218			if (!is_number(opts.scroll.duration))
219			{
220				opts.scroll.duration = 500;
221			}
222			if (is_undefined(opts.scroll.items))
223			{
224				opts.scroll.items = (opts.responsive || opts.items.visibleConf.variable || opts.items.filter != '*') 
225					? 'visible'
226					: opts.items.visible;
227			}
228
229			opts.auto = $.extend(true, {}, opts.scroll, opts.auto);
230			opts.prev = $.extend(true, {}, opts.scroll, opts.prev);
231			opts.next = $.extend(true, {}, opts.scroll, opts.next);
232			opts.pagination = $.extend(true, {}, opts.scroll, opts.pagination);
233			//	swipe and mousewheel extend later on, per direction
234
235			opts.auto = go_complementAutoObject($tt0, opts.auto);
236			opts.prev = go_complementPrevNextObject($tt0, opts.prev);
237			opts.next = go_complementPrevNextObject($tt0, opts.next);
238			opts.pagination = go_complementPaginationObject($tt0, opts.pagination);
239			opts.swipe = go_complementSwipeObject($tt0, opts.swipe);
240			opts.mousewheel = go_complementMousewheelObject($tt0, opts.mousewheel);
241
242			if (opts.synchronise)
243			{
244				opts.synchronise = cf_getSynchArr(opts.synchronise);
245			}
246
247
248			//	DEPRECATED
249			if (opts.auto.onPauseStart)
250			{
251				opts.auto.onTimeoutStart = opts.auto.onPauseStart;
252				deprecated('auto.onPauseStart', 'auto.onTimeoutStart');
253			}
254			if (opts.auto.onPausePause)
255			{
256				opts.auto.onTimeoutPause = opts.auto.onPausePause;
257				deprecated('auto.onPausePause', 'auto.onTimeoutPause');
258			}
259			if (opts.auto.onPauseEnd)
260			{
261				opts.auto.onTimeoutEnd = opts.auto.onPauseEnd;
262				deprecated('auto.onPauseEnd', 'auto.onTimeoutEnd');
263			}
264			if (opts.auto.pauseDuration)
265			{
266				opts.auto.timeoutDuration = opts.auto.pauseDuration;
267				deprecated('auto.pauseDuration', 'auto.timeoutDuration');
268			}
269			//	/DEPRECATED
270
271
272		};	//	/init
273
274
275		FN._build = function() {
276			$cfs.data('_cfs_isCarousel', true);
277
278			var a_itm = $cfs.children(),
279				orgCSS = in_mapCss($cfs, ['textAlign', 'float', 'position', 'top', 'right', 'bottom', 'left', 'zIndex', 'width', 'height', 'marginTop', 'marginRight', 'marginBottom', 'marginLeft']),
280				newPosition = 'relative';
281
282			switch (orgCSS.position)
283			{
284				case 'absolute':
285				case 'fixed':
286					newPosition = orgCSS.position;
287					break;
288			}
289
290			if (conf.wrapper == 'parent')
291			{
292				sz_storeOrigCss($wrp);
293			}
294			else
295			{
296				$wrp.css(orgCSS);
297			}
298			$wrp.css({
299				'overflow'		: 'hidden',
300				'position'		: newPosition
301			});
302
303			sz_storeOrigCss($cfs);
304			$cfs.data('_cfs_origCssZindex', orgCSS.zIndex);
305			$cfs.css({
306				'textAlign'		: 'left',
307				'float'			: 'none',
308				'position'		: 'absolute',
309				'top'			: 0,
310				'right'			: 'auto',
311				'bottom'		: 'auto',
312				'left'			: 0,
313				'marginTop'		: 0,
314				'marginRight'	: 0,
315				'marginBottom'	: 0,
316				'marginLeft'	: 0
317			});
318
319			sz_storeMargin(a_itm, opts);
320			sz_storeOrigCss(a_itm);
321			if (opts.responsive)
322			{
323				sz_setResponsiveSizes(opts, a_itm);
324			}
325
326		};	//	/build
327
328
329		FN._bind_events = function() {
330			FN._unbind_events();
331
332
333			//	stop event
334			$cfs.bind(cf_e('stop', conf), function(e, imm) {
335				e.stopPropagation();
336
337				//	button
338				if (!crsl.isStopped)
339				{
340					if (opts.auto.button)
341					{
342						opts.auto.button.addClass(cf_c('stopped', conf));
343					}
344				}
345
346				//	set stopped
347				crsl.isStopped = true;
348
349				if (opts.auto.play)
350				{
351					opts.auto.play = false;
352					$cfs.trigger(cf_e('pause', conf), imm);
353				}
354				return true;
355			});
356
357
358			//	finish event
359			$cfs.bind(cf_e('finish', conf), function(e) {
360				e.stopPropagation();
361				if (crsl.isScrolling)
362				{
363					sc_stopScroll(scrl);
364				}
365				return true;
366			});
367
368
369			//	pause event
370			$cfs.bind(cf_e('pause', conf), function(e, imm, res) {
371				e.stopPropagation();
372				tmrs = sc_clearTimers(tmrs);
373
374				//	immediately pause
375				if (imm && crsl.isScrolling)
376				{
377					scrl.isStopped = true;
378					var nst = getTime() - scrl.startTime;
379					scrl.duration -= nst;
380					if (scrl.pre)
381					{
382						scrl.pre.duration -= nst;
383					}
384					if (scrl.post)
385					{
386						scrl.post.duration -= nst;
387					}
388					sc_stopScroll(scrl, false);
389				}
390
391				//	update remaining pause-time
392				if (!crsl.isPaused && !crsl.isScrolling)
393				{
394					if (res)
395					{
396						tmrs.timePassed += getTime() - tmrs.startTime;
397					}
398				}
399
400				//	button
401				if (!crsl.isPaused)
402				{
403					if (opts.auto.button)
404					{
405						opts.auto.button.addClass(cf_c('paused', conf));
406					}
407				}
408
409				//	set paused
410				crsl.isPaused = true;
411
412				//	pause pause callback
413				if (opts.auto.onTimeoutPause)
414				{
415					var dur1 = opts.auto.timeoutDuration - tmrs.timePassed,
416						perc = 100 - Math.ceil( dur1 * 100 / opts.auto.timeoutDuration );
417
418					opts.auto.onTimeoutPause.call($tt0, perc, dur1);
419				}
420				return true;
421			});
422
423
424			//	play event
425			$cfs.bind(cf_e('play', conf), function(e, dir, del, res) {
426				e.stopPropagation();
427				tmrs = sc_clearTimers(tmrs);
428
429				//	sort params
430				var v = [dir, del, res],
431					t = ['string', 'number', 'boolean'],
432					a = cf_sortParams(v, t);
433
434				dir = a[0];
435				del = a[1];
436				res = a[2];
437
438				if (dir != 'prev' && dir != 'next')
439				{
440					dir = crsl.direction;
441				}
442				if (!is_number(del))
443				{
444					del = 0;
445				}
446				if (!is_boolean(res))
447				{
448					res = false;
449				}
450
451				//	stopped?
452				if (res)
453				{
454					crsl.isStopped = false;
455					opts.auto.play = true;
456				}
457				if (!opts.auto.play)
458				{
459					e.stopImmediatePropagation();
460					return debug(conf, 'Carousel stopped: Not scrolling.');
461				}
462
463				//	button
464				if (crsl.isPaused)
465				{
466					if (opts.auto.button)
467					{
468						opts.auto.button.removeClass(cf_c('stopped', conf));
469						opts.auto.button.removeClass(cf_c('paused', conf));
470					}
471				}
472
473				//	set playing
474				crsl.isPaused = false;
475				tmrs.startTime = getTime();
476
477				//	timeout the scrolling
478				var dur1 = opts.auto.timeoutDuration + del;
479					dur2 = dur1 - tmrs.timePassed;
480					perc = 100 - Math.ceil(dur2 * 100 / dur1);
481
482				if (opts.auto.progress)
483				{
484					tmrs.progress = setInterval(function() {
485						var pasd = getTime() - tmrs.startTime + tmrs.timePassed,
486							perc = Math.ceil(pasd * 100 / dur1);
487						opts.auto.progress.updater.call(opts.auto.progress.bar[0], perc);
488					}, opts.auto.progress.interval);
489				}
490
491				tmrs.auto = setTimeout(function() {
492					if (opts.auto.progress)
493					{
494						opts.auto.progress.updater.call(opts.auto.progress.bar[0], 100);
495					}
496					if (opts.auto.onTimeoutEnd)
497					{
498						opts.auto.onTimeoutEnd.call($tt0, perc, dur2);
499					}
500					if (crsl.isScrolling)
501					{
502						$cfs.trigger(cf_e('play', conf), dir);
503					}
504					else
505					{
506						$cfs.trigger(cf_e(dir, conf), opts.auto);
507					}
508				}, dur2);
509
510				//	pause start callback
511				if (opts.auto.onTimeoutStart)
512				{
513					opts.auto.onTimeoutStart.call($tt0, perc, dur2);
514				}
515
516				return true;
517			});
518
519
520			//	resume event
521			$cfs.bind(cf_e('resume', conf), function(e) {
522				e.stopPropagation();
523				if (scrl.isStopped)
524				{
525					scrl.isStopped = false;
526					crsl.isPaused = false;
527					crsl.isScrolling = true;
528					scrl.startTime = getTime();
529					sc_startScroll(scrl, conf);
530				}
531				else
532				{
533					$cfs.trigger(cf_e('play', conf));
534				}
535				return true;
536			});
537
538
539			//	prev + next events
540			$cfs.bind(cf_e('prev', conf)+' '+cf_e('next', conf), function(e, obj, num, clb, que) {
541				e.stopPropagation();
542
543				//	stopped or hidden carousel, don't scroll, don't queue
544				if (crsl.isStopped || $cfs.is(':hidden'))
545				{
546					e.stopImmediatePropagation();
547					return debug(conf, 'Carousel stopped or hidden: Not scrolling.');
548				}
549
550				//	not enough items
551				var minimum = (is_number(opts.items.minimum)) ? opts.items.minimum : opts.items.visible + 1;
552				if (minimum > itms.total)
553				{
554					e.stopImmediatePropagation();
555					return debug(conf, 'Not enough items ('+itms.total+' total, '+minimum+' needed): Not scrolling.');
556				}
557
558				//	get config
559				var v = [obj, num, clb, que],
560					t = ['object', 'number/string', 'function', 'boolean'],
561					a = cf_sortParams(v, t);
562
563				obj = a[0];
564				num = a[1];
565				clb = a[2];
566				que = a[3];
567
568				var eType = e.type.slice(conf.events.prefix.length);
569
570				if (!is_object(obj))
571				{
572					obj = {};
573				}
574				if (is_function(clb))
575				{
576					obj.onAfter = clb;
577				}
578				if (is_boolean(que))
579				{
580					obj.queue = que;
581				}
582				obj = $.extend(true, {}, opts[eType], obj);
583
584				//	test conditions callback
585				if (obj.conditions && !obj.conditions.call($tt0, eType))
586				{
587					e.stopImmediatePropagation();
588					return debug(conf, 'Callback "conditions" returned false.');
589				}
590
591				if (!is_number(num))
592				{
593					if (opts.items.filter != '*')
594					{
595						num = 'visible';
596					}
597					else
598					{
599						var arr = [num, obj.items, opts[eType].items];
600						for (var a = 0, l = arr.length; a < l; a++)
601						{
602							if (is_number(arr[a]) || arr[a] == 'page' || arr[a] == 'visible') {
603								num = arr[a];
604								break;
605							}
606						}
607					}
608					switch(num) {
609						case 'page':
610							e.stopImmediatePropagation();
611							return $cfs.triggerHandler(cf_e(eType+'Page', conf), [obj, clb]);
612							break;
613
614						case 'visible':
615							if (!opts.items.visibleConf.variable && opts.items.filter == '*')
616							{
617								num = opts.items.visible;
618							}
619							break;
620					}
621				}
622
623				//	resume animation, add current to queue
624				if (scrl.isStopped)
625				{
626					$cfs.trigger(cf_e('resume', conf));
627					$cfs.trigger(cf_e('queue', conf), [eType, [obj, num, clb]]);
628					e.stopImmediatePropagation();
629					return debug(conf, 'Carousel resumed scrolling.');
630				}
631
632				//	queue if scrolling
633				if (obj.duration > 0)
634				{
635					if (crsl.isScrolling)
636					{
637						if (obj.queue)
638						{
639							if (obj.queue == 'last')
640							{
641								queu = [];
642							}
643							if (obj.queue != 'first' || queu.length == 0)
644							{
645								$cfs.trigger(cf_e('queue', conf), [eType, [obj, num, clb]]);
646							}
647						}
648						e.stopImmediatePropagation();
649						return debug(conf, 'Carousel currently scrolling.');
650					}
651				}
652
653				tmrs.timePassed = 0;
654				$cfs.trigger(cf_e('slide_'+eType, conf), [obj, num]);
655
656				//	synchronise
657				if (opts.synchronise)
658				{
659					var s = opts.synchronise,
660						c = [obj, num];
661
662					for (var j = 0, l = s.length; j < l; j++) {
663						var d = eType;
664						if (!s[j][2])
665						{
666							d = (d == 'prev') ? 'next' : 'prev';
667						}
668						if (!s[j][1])
669						{
670							c[0] = s[j][0].triggerHandler('_cfs_triggerEvent', ['configuration', d]);
671						}
672						c[1] = num + s[j][3];
673						s[j][0].trigger('_cfs_triggerEvent', ['slide_'+d, c]);
674					}
675				}
676				return true;
677			});
678
679
680			//	prev event
681			$cfs.bind(cf_e('slide_prev', conf), function(e, sO, nI) {
682				e.stopPropagation();
683				var a_itm = $cfs.children();
684
685				//	non-circular at start, scroll to end
686				if (!opts.circular)
687				{
688					if (itms.first == 0)
689					{
690						if (opts.infinite)
691						{
692							$cfs.trigger(cf_e('next', conf), itms.total-1);
693						}
694						return e.stopImmediatePropagation();
695					}
696				}
697
698				sz_resetMargin(a_itm, opts);
699
700				//	find number of items to scroll
701				if (!is_number(nI))
702				{
703					if (opts.items.visibleConf.variable)
704					{
705						nI = gn_getVisibleItemsPrev(a_itm, opts, itms.total-1);
706					}
707					else if (opts.items.filter != '*')
708					{
709						var xI = (is_number(sO.items)) ? sO.items : gn_getVisibleOrg($cfs, opts);
710						nI = gn_getScrollItemsPrevFilter(a_itm, opts, itms.total-1, xI);
711					}
712					else
713					{
714						nI = opts.items.visible;
715					}
716					nI = cf_getAdjust(nI, opts, sO.items, $tt0);
717				}
718
719				//	prevent non-circular from scrolling to far
720				if (!opts.circular)
721				{
722					if (itms.total - nI < itms.first)
723					{
724						nI = itms.total - itms.first;
725					}
726				}
727
728				//	set new number of visible items
729				opts.items.visibleConf.old = opts.items.visible;
730				if (opts.items.visibleConf.variable)
731				{
732					var vI = cf_getItemsAdjust(gn_getVisibleItemsNext(a_itm, opts, itms.total-nI), opts, opts.items.visibleConf.adjust, $tt0);
733					if (opts.items.visible+nI <= vI && nI < itms.total)
734					{
735						nI++;
736						vI = cf_getItemsAdjust(gn_getVisibleItemsNext(a_itm, opts, itms.total-nI), opts, opts.items.visibleConf.adjust, $tt0);
737					}
738					opts.items.visible = vI;
739				}
740				else if (opts.items.filter != '*')
741				{
742					var vI = gn_getVisibleItemsNextFilter(a_itm, opts, itms.total-nI);
743					opts.items.visible = cf_getItemsAdjust(vI, opts, opts.items.visibleConf.adjust, $tt0);
744				}
745
746				sz_resetMargin(a_itm, opts, true);
747
748				//	scroll 0, don't scroll
749				if (nI == 0)
750				{
751					e.stopImmediatePropagation();
752					return debug(conf, '0 items to scroll: Not scrolling.');
753				}
754				debug(conf, 'Scrolling '+nI+' items backward.');
755
756
757				//	save new config
758				itms.first += nI;
759				while (itms.first >= itms.total)
760				{
761					itms.first -= itms.total;
762				}
763
764				//	non-circular callback
765				if (!opts.circular)
766				{
767					if (itms.first == 0 && sO.onEnd)
768					{
769						sO.onEnd.call($tt0, 'prev');
770					}
771					if (!opts.infinite)
772					{
773						nv_enableNavi(opts, itms.first, conf);
774					}
775				}
776
777				//	rearrange items
778				$cfs.children().slice(itms.total-nI, itms.total).prependTo($cfs);
779				if (itms.total < opts.items.visible + nI)
780				{
781					$cfs.children().slice(0, (opts.items.visible+nI)-itms.total).clone(true).appendTo($cfs);
782				}
783
784				//	the needed items
785				var a_itm = $cfs.children(),
786					i_old = gi_getOldItemsPrev(a_itm, opts, nI),
787					i_new = gi_getNewItemsPrev(a_itm, opts),
788					i_cur_l = a_itm.eq(nI-1),
789					i_old_l = i_old.last(),
790					i_new_l = i_new.last();
791
792				sz_resetMargin(a_itm, opts);
793
794				var pL = 0,
795					pR = 0;
796
797				if (opts.align)
798				{
799					var p = cf_getAlignPadding(i_new, opts);
800					pL = p[0];
801					pR = p[1];
802				}
803				var oL = (pL < 0) ? opts.padding[opts.d[3]] : 0;
804
805				//	hide items for fx directscroll
806				var hiddenitems = false,
807					i_skp = $();
808				if (opts.items.visible < nI)
809				{
810					i_skp = a_itm.slice(opts.items.visibleConf.old, nI);
811					if (sO.fx == 'directscroll')
812					{
813						var orgW = opts.items[opts.d['width']];
814						hiddenitems = i_skp;
815						i_cur_l = i_new_l;
816						sc_hideHiddenItems(hiddenitems);
817						opts.items[opts.d['width']] = 'variable';
818					}
819				}
820
821				//	save new sizes
822				var $cf2 = false,
823					i_siz = ms_getTotalSize(a_itm.slice(0, nI), opts, 'width'),
824					w_siz = cf_mapWrapperSizes(ms_getSizes(i_new, opts, true), opts, !opts.usePadding),
825					i_siz_vis = 0,
826					a_cfs = {},
827					a_wsz = {},
828					a_cur = {},
829					a_old = {},
830					a_new = {},
831					a_lef = {},
832					a_lef_vis = {},
833					a_dur = sc_getDuration(sO, opts, nI, i_siz);
834
835				switch(sO.fx)
836				{
837					case 'cover':
838					case 'cover-fade':
839						i_siz_vis = ms_getTotalSize(a_itm.slice(0, opts.items.visible), opts, 'width');
840						break;
841				}
842
843				if (hiddenitems)
844				{
845					opts.items[opts.d['width']] = orgW;
846				}
847
848				sz_resetMargin(a_itm, opts, true);
849				if (pR >= 0)
850				{
851					sz_resetMargin(i_old_l, opts, opts.padding[opts.d[1]]);
852				}
853				if (pL >= 0)
854				{
855					sz_resetMargin(i_cur_l, opts, opts.padding[opts.d[3]]);
856				}
857
858				if (opts.align)
859				{
860					opts.padding[opts.d[1]] = pR;
861					opts.padding[opts.d[3]] = pL;
862				}
863
864				a_lef[opts.d['left']] = -(i_siz - oL);
865				a_lef_vis[opts.d['left']] = -(i_siz_vis - oL);
866				a_wsz[opts.d['left']] = w_siz[opts.d['width']];
867
868				//	scrolling functions
869				var _s_wrapper = function() {},
870					_a_wrapper = function() {},
871					_s_paddingold = function() {},
872					_a_paddingold = function() {},
873					_s_paddingnew = function() {},
874					_a_paddingnew = function() {},
875					_s_paddingcur = function() {},
876					_a_paddingcur = function() {},
877					_onafter = function() {},
878					_moveitems = function() {},
879					_position = function() {};
880
881				//	clone carousel
882				switch(sO.fx)
883				{
884					case 'crossfade':
885					case 'cover':
886					case 'cover-fade':
887					case 'uncover':
888					case 'uncover-fade':
889						$cf2 = $cfs.clone(true).appendTo($wrp);
890						break;
891				}
892				switch(sO.fx)
893				{
894					case 'crossfade':
895					case 'uncover':
896					case 'uncover-fade':
897						$cf2.children().slice(0, nI).remove();
898						$cf2.children().slice(opts.items.visibleConf.old).remove();
899						break;
900
901					case 'cover':
902					case 'cover-fade':
903						$cf2.children().slice(opts.items.visible).remove();
904						$cf2.css(a_lef_vis);
905						break;
906				}
907
908				$cfs.css(a_lef);
909
910				//	reset all scrolls
911				scrl = sc_setScroll(a_dur, sO.easing, conf);
912
913				//	animate / set carousel
914				a_cfs[opts.d['left']] = (opts.usePadding) ? opts.padding[opts.d[3]] : 0;
915
916				//	animate / set wrapper
917				if (opts[opts.d['width']] == 'variable' || opts[opts.d['height']] == 'variable')
918				{
919					_s_wrapper = function() {
920						$wrp.css(w_siz);
921					};
922					_a_wrapper = function() {
923						scrl.anims.push([$wrp, w_siz]);
924					};
925				}
926
927				//	animate / set items
928				if (opts.usePadding)
929				{
930					if (i_new_l.not(i_cur_l).length)
931					{
932			 			a_cur[opts.d['marginRight']] = i_cur_l.data('_cfs_origCssMargin');
933
934						if (pL < 0)
935						{
936							i_cur_l.css(a_cur);
937						}
938						else
939						{
940							_s_paddingcur = function() {
941								i_cur_l.css(a_cur);
942							};
943							_a_paddingcur = function() {
944								scrl.anims.push([i_cur_l, a_cur]);
945							};
946						}
947					}
948					switch(sO.fx)
949					{
950						case 'cover':
951						case 'cover-fade':
952							$cf2.children().eq(nI-1).css(a_cur);
953							break;
954					}
955
956					if (i_new_l.not(i_old_l).length)
957					{
958						a_old[opts.d['marginRight']] = i_old_l.data('_cfs_origCssMargin');
959						_s_paddingold = function() {
960							i_old_l.css(a_old);
961						};
962						_a_paddingold = function() {
963							scrl.anims.push([i_old_l, a_old]);
964						};
965					}
966
967					if (pR >= 0)
968					{
969						a_new[opts.d['marginRight']] = i_new_l.data('_cfs_origCssMargin') + opts.padding[opts.d[1]];
970						_s_paddingnew = function() {
971							i_new_l.css(a_new);
972						};
973						_a_paddingnew = function() {
974							scrl.anims.push([i_new_l, a_new]);
975						};
976					}
977				}
978
979				//	set position
980				_position = function() {
981					$cfs.css(a_cfs);
982				};
983
984
985				var overFill = opts.items.visible+nI-itms.total;
986
987				//	rearrange items
988				_moveitems = function() {
989					if (overFill > 0)
990					{
991						$cfs.children().slice(itms.total).remove();
992						i_old = $( $cfs.children().slice(itms.total-(opts.items.visible-overFill)).get().concat( $cfs.children().slice(0, overFill).get() ) );
993					}
994					sc_showHiddenItems(hiddenitems);
995
996					if (opts.usePadding)
997					{
998						var l_itm = $cfs.children().eq(opts.items.visible+nI-1);
999						l_itm.css(opts.d['marginRight'], l_itm.data('_cfs_origCssMargin'));
1000					}
1001				};
1002
1003
1004				var cb_arguments = sc_mapCallbackArguments(i_old, i_skp, i_new, nI, 'prev', a_dur, w_siz);
1005
1006				//	fire onAfter callbacks
1007				_onafter = function() {
1008					sc_afterScroll($cfs, $cf2, sO);
1009					crsl.isScrolling = false;
1010					clbk.onAfter = sc_fireCallbacks($tt0, sO, 'onAfter', cb_arguments, clbk);
1011					queu = sc_fireQueue($cfs, queu, conf);
1012
1013					if (!crsl.isPaused)
1014					{
1015						$cfs.trigger(cf_e('play', conf));
1016					}
1017				};
1018
1019				//	fire onBefore callback
1020				crsl.isScrolling = true;
1021				tmrs = sc_clearTimers(tmrs);
1022				clbk.onBefore = sc_fireCallbacks($tt0, sO, 'onBefore', cb_arguments, clbk);
1023
1024				switch(sO.fx)
1025				{
1026					case 'none':
1027						$cfs.css(a_cfs);
1028						_s_wrapper();
1029						_s_paddingold();
1030						_s_paddingnew();
1031						_s_paddingcur();
1032						_position();
1033						_moveitems();
1034						_onafter();
1035						break;
1036
1037					case 'fade':
1038						scrl.anims.push([$cfs, { 'opacity': 0 }, function() {
1039							_s_wrapper();
1040							_s_paddingold();
1041							_s_paddingnew();
1042							_s_paddingcur();
1043							_position();
1044							_moveitems();
1045							scrl = sc_setScroll(a_dur, sO.easing, conf);
1046							scrl.anims.push([$cfs, { 'opacity': 1 }, _onafter]);
1047							sc_startScroll(scrl, conf);
1048						}]);
1049						break;
1050
1051					case 'crossfade':
1052						$cfs.css({ 'opacity': 0 });
1053						scrl.anims.push([$cf2, { 'opacity': 0 }]);
1054						scrl.anims.push([$cfs, { 'opacity': 1 }, _onafter]);
1055						_a_wrapper();
1056						_s_paddingold();
1057						_s_paddingnew();
1058						_s_paddingcur();
1059						_position();
1060						_moveitems();
1061						break;
1062
1063					case 'cover':
1064						scrl.anims.push([$cf2, a_cfs, function() {
1065							_s_paddingold();
1066							_s_paddingnew();
1067							_s_paddingcur();
1068							_position();
1069							_moveitems();
1070							_onafter();
1071						}]);
1072						_a_wrapper();
1073						break;
1074
1075					case 'cover-fade':
1076						scrl.anims.push([$cfs, { 'opacity': 0 }]);
1077						scrl.anims.push([$cf2, a_cfs, function() {
1078							_s_paddingold();
1079							_s_paddingnew();
1080							_s_paddingcur();
1081							_position();
1082							_moveitems();
1083							_onafter();
1084						}]);
1085						_a_wrapper();
1086						break;
1087
1088					case 'uncover':
1089						scrl.anims.push([$cf2, a_wsz, _onafter]);
1090						_a_wrapper();
1091						_s_paddingold();
1092						_s_paddingnew();
1093						_s_paddingcur();
1094						_position();
1095						_moveitems();
1096						break;
1097
1098					case 'uncover-fade':
1099						$cfs.css({ 'opacity': 0 });
1100						scrl.anims.push([$cfs, { 'opacity': 1 }]);
1101						scrl.anims.push([$cf2, a_wsz, _onafter]);
1102						_a_wrapper();
1103						_s_paddingold();
1104						_s_paddingnew();
1105						_s_paddingcur();
1106						_position();
1107						_moveitems();
1108						break;
1109
1110					default:
1111						scrl.anims.push([$cfs, a_cfs, function() {
1112							_moveitems();
1113							_onafter();
1114						}]);
1115						_a_wrapper();
1116						_a_paddingold();
1117						_a_paddingnew();
1118						_a_paddingcur();
1119						break;
1120				}
1121
1122				sc_startScroll(scrl, conf);
1123				cf_setCookie(opts.cookie, $cfs, conf);
1124
1125				$cfs.trigger(cf_e('updatePageStatus', conf), [false, w_siz]);
1126
1127				return true;
1128			});
1129
1130
1131			//	next event
1132			$cfs.bind(cf_e('slide_next', conf), function(e, sO, nI) {
1133				e.stopPropagation();
1134				var a_itm = $cfs.children();
1135
1136				//	non-circular at end, scroll to start
1137				if (!opts.circular)
1138				{
1139					if (itms.first == opts.items.visible)
1140					{
1141						if (opts.infinite)
1142						{
1143							$cfs.trigger(cf_e('prev', conf), itms.total-1);
1144						}
1145						return e.stopImmediatePropagation();
1146					}
1147				}
1148
1149				sz_resetMargin(a_itm, opts);
1150
1151				//	find number of items to scroll
1152				if (!is_number(nI))
1153				{
1154					if (opts.items.filter != '*')
1155					{
1156						var xI = (is_number(sO.items)) ? sO.items : gn_getVisibleOrg($cfs, opts);
1157						nI = gn_getScrollItemsNextFilter(a_itm, opts, 0, xI);
1158					}
1159					else
1160					{
1161						nI = opts.items.visible;
1162					}
1163					nI = cf_getAdjust(nI, opts, sO.items, $tt0);
1164				}
1165
1166				var lastItemNr = (itms.first == 0) ? itms.total : itms.first;
1167
1168				//	prevent non-circular from scrolling to far
1169				if (!opts.circular)
1170				{
1171					if (opts.items.visibleConf.variable)
1172					{
1173						var vI = gn_getVisibleItemsNext(a_itm, opts, nI),
1174							xI = gn_getVisibleItemsPrev(a_itm, opts, lastItemNr-1);
1175					}
1176					else
1177					{
1178						var vI = opts.items.visible,
1179							xI = opts.items.visible;
1180					}
1181
1182					if (nI + vI > lastItemNr)
1183					{
1184						nI = lastItemNr - xI;
1185					}
1186				}
1187
1188				//	set new number of visible items
1189				opts.items.visibleConf.old = opts.items.visible;
1190				if (opts.items.visibleConf.variable)
1191				{
1192					var vI = cf_getItemsAdjust(gn_getVisibleItemsNextTestCircular(a_itm, opts, nI, lastItemNr), opts, opts.items.visibleConf.adjust, $tt0);
1193					while (opts.items.visible-nI >= vI && nI < itms.total)
1194					{
1195						nI++;
1196						vI = cf_getItemsAdjust(gn_getVisibleItemsNextTestCircular(a_itm, opts, nI, lastItemNr), opts, opts.items.visibleConf.adjust, $tt0);
1197					}
1198					opts.items.visible = vI;
1199				}
1200				else if (opts.items.filter != '*')
1201				{
1202					var vI = gn_getVisibleItemsNextFilter(a_itm, opts, nI);
1203					opts.items.visible = cf_getItemsAdjust(vI, opts, opts.items.visibleConf.adjust, $tt0);
1204				}
1205
1206				sz_resetMargin(a_itm, opts, true);
1207
1208				//	scroll 0, don't scroll
1209				if (nI == 0)
1210				{
1211					e.stopImmediatePropagation();
1212					return debug(conf, '0 items to scroll: Not scrolling.');
1213				}
1214				debug(conf, 'Scrolling '+nI+' items forward.');
1215
1216
1217				//	save new config
1218				itms.first -= nI;
1219				while (itms.first < 0)
1220				{
1221					itms.first += itms.total;
1222				}
1223
1224				//	non-circular callback
1225				if (!opts.circular)
1226				{
1227					if (itms.first == opts.items.visible && sO.onEnd)
1228					{
1229						sO.onEnd.call($tt0, 'next');
1230					}
1231					if (!opts.infinite)
1232					{
1233						nv_enableNavi(opts, itms.first, conf);
1234					}
1235				}
1236
1237				//	rearrange items
1238				if (itms.total < opts.items.visible+nI)
1239				{
1240					$cfs.children().slice(0, (opts.items.visible+nI)-itms.total).clone(true).appendTo($cfs);
1241				}
1242
1243				//	the needed items
1244				var a_itm = $cfs.children(),
1245					i_old = gi_getOldItemsNext(a_itm, opts),
1246					i_new = gi_getNewItemsNext(a_itm, opts, nI),
1247					i_cur_l = a_itm.eq(nI-1),
1248					i_old_l = i_old.last(),
1249					i_new_l = i_new.last();
1250
1251				sz_resetMargin(a_itm, opts);
1252
1253				var pL = 0,
1254					pR = 0;
1255
1256				if (opts.align)
1257				{
1258					var p = cf_getAlignPadding(i_new, opts);
1259					pL = p[0];
1260					pR = p[1];
1261				}
1262
1263				//	hide items for fx directscroll
1264				var hiddenitems = false,
1265					i_skp = $();
1266				if (opts.items.visibleConf.old < nI)
1267				{
1268					i_skp = a_itm.slice(opts.items.visibleConf.old, nI);
1269					if (sO.fx == 'directscroll')
1270					{
1271						var orgW = opts.items[opts.d['width']];
1272						hiddenitems = i_skp;
1273						i_cur_l = i_old_l;
1274						sc_hideHiddenItems(hiddenitems);
1275						opts.items[opts.d['width']] = 'variable';
1276					}
1277				}
1278
1279				//	save new sizes
1280				var $cf2 = false,
1281					i_siz = ms_getTotalSize(a_itm.slice(0, nI), opts, 'width'),
1282					w_siz = cf_mapWrapperSizes(ms_getSizes(i_new, opts, true), opts, !opts.usePadding),
1283					i_siz_vis = 0,
1284					a_cfs = {},
1285					a_cfs_vis = {},
1286					a_cur = {},
1287					a_old = {},
1288					a_lef = {},
1289					a_dur = sc_getDuration(sO, opts, nI, i_siz);
1290
1291				switch(sO.fx)
1292				{
1293					case 'uncover':
1294					case 'uncover-fade':
1295						i_siz_vis = ms_getTotalSize(a_itm.slice(0, opts.items.visibleConf.old), opts, 'width');
1296						break;
1297				}
1298
1299				if (hiddenitems)
1300				{
1301					opts.items[opts.d['width']] = orgW;
1302				}
1303
1304				if (opts.align)
1305				{
1306					if (opts.padding[opts.d[1]] < 0)
1307					{
1308						opts.padding[opts.d[1]] = 0;
1309					}
1310				}
1311				sz_resetMargin(a_itm, opts, true);
1312				sz_resetMargin(i_old_l, opts, opts.padding[opts.d[1]]);
1313
1314				if (opts.align)
1315				{
1316					opts.padding[opts.d[1]] = pR;
1317					opts.padding[opts.d[3]] = pL;
1318				}
1319
1320				a_lef[opts.d['left']] = (opts.usePadding) ? opts.padding[opts.d[3]] : 0;
1321
1322				//	scrolling functions
1323				var _s_wrapper = function() {},
1324					_a_wrapper = function() {},
1325					_s_paddingold = function() {},
1326					_a_paddingold = function() {},
1327					_s_paddingcur = function() {},
1328					_a_paddingcur = function() {},
1329					_onafter = function() {},
1330					_moveitems = function() {},
1331					_position = function() {};
1332
1333				//	clone carousel
1334				switch(sO.fx)
1335				{
1336					case 'crossfade':
1337					case 'cover':
1338					case 'cover-fade':
1339					case 'uncover':
1340					case 'uncover-fade':
1341						$cf2 = $cfs.clone(true).appendTo($wrp);
1342						$cf2.children().slice(opts.items.visibleConf.old).remove();
1343						break;
1344				}
1345				switch(sO.fx)
1346				{
1347					case 'crossfade':
1348					case 'cover':
1349					case 'cover-fade':
1350						$cfs.css('zIndex', 1);
1351						$cf2.css('zIndex', 0);
1352						break;
1353				}
1354
1355				//	reset all scrolls
1356				scrl = sc_setScroll(a_dur, sO.easing, conf);
1357
1358				//	animate / set carousel
1359				a_cfs[opts.d['left']] = -i_siz;
1360				a_cfs_vis[opts.d['left']] = -i_siz_vis;
1361
1362				if (pL < 0)
1363				{
1364					a_cfs[opts.d['left']] += pL;
1365				}
1366
1367				//	animate / set wrapper
1368				if (opts[opts.d['width']] == 'variable' || opts[opts.d['height']] == 'variable')
1369				{
1370					_s_wrapper = function() {
1371						$wrp.css(w_siz);
1372					};
1373					_a_wrapper = function() {
1374						scrl.anims.push([$wrp, w_siz]);
1375					};
1376				}
1377
1378				//	animate / set items
1379				if (opts.usePadding)
1380				{
1381					var i_new_l_m = i_new_l.data('_cfs_origCssMargin');
1382
1383					if (pR >= 0)
1384					{
1385						i_new_l_m += opts.padding[opts.d[1]];
1386					}
1387					i_new_l.css(opts.d['marginRight'], i_new_l_m);
1388
1389					if (i_cur_l.not(i_old_l).length)
1390					{
1391						a_old[opts.d['marginRight']] = i_old_l.data('_cfs_origCssMargin');
1392					}
1393					_s_paddingold = function() {
1394						i_old_l.css(a_old);
1395					};
1396					_a_paddingold = function() {
1397						scrl.anims.push([i_old_l, a_old]);
1398					};
1399
1400					var i_cur_l_m = i_cur_l.data('_cfs_origCssMargin');
1401					if (pL > 0)
1402					{
1403						i_cur_l_m += opts.padding[opts.d[3]];
1404					}
1405
1406					a_cur[opts.d['marginRight']] = i_cur_l_m;
1407
1408					_s_paddingcur = function() {
1409						i_cur_l.css(a_cur);
1410					};
1411					_a_paddingcur = function() {
1412						scrl.anims.push([i_cur_l, a_cur]);
1413					};
1414				}
1415
1416				//	set position
1417				_position = function() {
1418					$cfs.css(a_lef);
1419				};
1420
1421
1422				var overFill = opts.items.visible+nI-itms.total;
1423
1424				//	rearrange items
1425				_moveitems = function() {
1426					if (overFill > 0)
1427					{
1428						$cfs.children().slice(itms.total).remove();
1429					}
1430					var l_itm = $cfs.children().slice(0, nI).appendTo($cfs).last();
1431					if (overFill > 0)
1432					{
1433						i_new = gi_getCurrentItems(a_itm, opts);
1434					}
1435					sc_showHiddenItems(hiddenitems);
1436
1437					if (opts.usePadding)
1438					{
1439						if (itms.total < opts.items.visible+nI) {
1440							var i_cur_l = $cfs.children().eq(opts.items.visible-1);
1441							i_cur_l.css(opts.d['marginRight'], i_cur_l.data('_cfs_origCssMargin') + opts.padding[opts.d[1]]);
1442						}
1443						l_itm.css(opts.d['marginRight'], l_itm.data('_cfs_origCssMargin'));
1444					}
1445				};
1446
1447
1448				var cb_arguments = sc_mapCallbackArguments(i_old, i_skp, i_new, nI, 'next', a_dur, w_siz);
1449
1450				//	fire onAfter callbacks
1451				_onafter = function() {
1452					$cfs.css('zIndex', $cfs.data('_cfs_origCssZindex'));
1453					sc_afterScroll($cfs, $cf2, sO);
1454					crsl.isScrolling = false;
1455					clbk.onAfter = sc_fireCallbacks($tt0, sO, 'onAfter', cb_arguments, clbk);
1456					queu = sc_fireQueue($cfs, queu, conf);
1457					
1458					if (!crsl.isPaused)
1459					{
1460						$cfs.trigger(cf_e('play', conf));
1461					}
1462				};
1463
1464				//	fire onBefore callbacks
1465				crsl.isScrolling = true;
1466				tmrs = sc_clearTimers(tmrs);
1467				clbk.onBefore = sc_fireCallbacks($tt0, sO, 'onBefore', cb_arguments, clbk);
1468
1469				switch(sO.fx)
1470				{
1471					case 'none':
1472						$cfs.css(a_cfs);
1473						_s_wrapper();
1474						_s_paddingold();
1475						_s_paddingcur();
1476						_position();
1477						_moveitems();
1478						_onafter();
1479						break;
1480
1481					case 'fade':
1482						scrl.anims.push([$cfs, { 'opacity': 0 }, function() {
1483							_s_wrapper();
1484							_s_paddingold();
1485							_s_paddingcur();
1486							_position();
1487							_moveitems();
1488							scrl = sc_setScroll(a_dur, sO.easing, conf);
1489							scrl.anims.push([$cfs, { 'opacity': 1 }, _onafter]);
1490							sc_startScroll(scrl, conf);
1491						}]);
1492						break;
1493
1494					case 'crossfade':
1495						$cfs.css({ 'opacity': 0 });
1496						scrl.anims.push([$cf2, { 'opacity': 0 }]);
1497						scrl.anims.push([$cfs, { 'opacity': 1 }, _onafter]);
1498						_a_wrapper();
1499						_s_paddingold();
1500						_s_paddingcur();
1501						_position();
1502						_moveitems();
1503						break;
1504
1505					case 'cover':
1506						$cfs.css(opts.d['left'], $wrp[opts.d['width']]());
1507						scrl.anims.push([$cfs, a_lef, _onafter]);
1508						_a_wrapper();
1509						_s_paddingold();
1510						_s_paddingcur();
1511						_moveitems();
1512						break;
1513
1514					case 'cover-fade':
1515						$cfs.css(opts.d['left'], $wrp[opts.d['width']]());
1516						scrl.anims.push([$cf2, { 'opacity': 0 }]);
1517						scrl.anims.push([$cfs, a_lef, _onafter]);
1518						_a_wrapper();
1519						_s_paddingold();
1520						_s_paddingcur();
1521						_moveitems();
1522						break;
1523
1524					case 'uncover':
1525						scrl.anims.push([$cf2, a_cfs_vis, _onafter]);
1526						_a_wrapper();
1527						_s_paddingold();
1528						_s_paddingcur();
1529						_position();
1530						_moveitems();
1531						break;
1532
1533					case 'uncover-fade':
1534						$cfs.css({ 'opacity': 0 });
1535						scrl.anims.push([$cfs, { 'opacity': 1 }]);
1536						scrl.anims.push([$cf2, a_cfs_vis, _onafter]);
1537						_a_wrapper();
1538						_s_paddingold();
1539						_s_paddingcur();
1540						_position();
1541						_moveitems();
1542						break;
1543
1544					default:
1545						scrl.anims.push([$cfs, a_cfs, function() {
1546							_position();
1547							_moveitems();
1548							_onafter();
1549						}]);
1550						_a_wrapper();
1551						_a_paddingold();
1552						_a_paddingcur();
1553						break;
1554				}
1555
1556				sc_startScroll(scrl, conf);
1557				cf_setCookie(opts.cookie, $cfs, conf);
1558
1559				$cfs.trigger(cf_e('updatePageStatus', conf), [false, w_siz]);
1560
1561				return true;
1562			});
1563
1564
1565			//	slideTo event
1566			$cfs.bind(cf_e('slideTo', conf), function(e, num, dev, org, obj, dir, clb) {
1567				e.stopPropagation();
1568
1569				var v = [num, dev, org, obj, dir, clb],
1570					t = ['string/number/object', 'number', 'boolean', 'object', 'string', 'function'],
1571					a = cf_sortParams(v, t);
1572
1573				obj = a[3];
1574				dir = a[4];
1575				clb = a[5];
1576
1577				num = gn_getItemIndex(a[0], a[1], a[2], itms, $cfs);
1578
1579				if (num == 0)
1580				{
1581					return false;
1582				}
1583				if (!is_object(obj))
1584				{
1585					obj = false;
1586				}
1587
1588				if (dir != 'prev' && dir != 'next')
1589				{
1590					if (opts.circular)
1591					{
1592						dir = (num <= itms.total / 2) ? 'next' : 'prev';
1593					}
1594					else
1595					{
1596						dir = (itms.first == 0 || itms.first > num) ? 'next' : 'prev';
1597					}
1598				}
1599
1600				if (dir == 'prev')
1601				{
1602					num = itms.total-num;
1603				}
1604				$cfs.trigger(cf_e(dir, conf), [obj, num, clb]);
1605
1606				return true;
1607			});
1608
1609
1610			//	prevPage event
1611			$cfs.bind(cf_e('prevPage', conf), function(e, obj, clb) {
1612				e.stopPropagation();
1613				var cur = $cfs.triggerHandler(cf_e('currentPage', conf));
1614				return $cfs.triggerHandler(cf_e('slideToPage', conf), [cur-1, obj, 'prev', clb]);
1615			});
1616
1617
1618			//	nextPage event
1619			$cfs.bind(cf_e('nextPage', conf), function(e, obj, clb) {
1620				e.stopPropagation();
1621				var cur = $cfs.triggerHandler(cf_e('currentPage', conf));
1622				return $cfs.triggerHandler(cf_e('slideToPage', conf), [cur+1, obj, 'next', clb]);
1623			});
1624
1625
1626			//	slideToPage event
1627			$cfs.bind(cf_e('slideToPage', conf), function(e, pag, obj, dir, clb) {
1628				e.stopPropagation();
1629				if (!is_number(pag))
1630				{
1631					pag = $cfs.triggerHandler(cf_e('currentPage', conf));
1632				}
1633				var ipp = opts.pagination.items || opts.items.visible,
1634					max = Math.ceil(itms.total / ipp)-1;
1635
1636				if (pag < 0)
1637				{
1638					pag = max;
1639				}
1640				if (pag > max)
1641				{
1642					pag = 0;
1643				}
1644				return $cfs.triggerHandler(cf_e('slideTo', conf), [pag*ipp, 0, true, obj, dir, clb]);
1645			});
1646
1647			//	jumpToStart event
1648			$cfs.bind(cf_e('jumpToStart', conf), function(e, s) {
1649				e.stopPropagation();
1650				if (s)
1651				{
1652					s = gn_getItemIndex(s, 0, true, itms, $cfs);
1653				}
1654				else
1655				{
1656					s = 0;
1657				}
1658
1659				s += itms.first;
1660				if (s != 0)
1661				{
1662					if (itms.total > 0)
1663					{
1664						while (s > itms.total)
1665						{
1666							s -= itms.total;
1667						}
1668					}
1669					$cfs.prepend($cfs.children().slice(s, itms.total));
1670				}
1671				return true;
1672			});
1673
1674
1675			//	synchronise event
1676			$cfs.bind(cf_e('synchronise', conf), function(e, s) {
1677				e.stopPropagation();
1678				if (s)
1679				{
1680					s = cf_getSynchArr(s);
1681				}
1682				else if (opts.synchronise)
1683				{
1684					s = opts.synchronise;
1685				}
1686				else
1687				{
1688					return debug(conf, 'No carousel to synchronise.');
1689				}
1690
1691				var n = $cfs.triggerHandler(cf_e('currentPosition', conf)),
1692					x = true;
1693
1694				for (var j = 0, l = s.length; j < l; j++)
1695				{
1696					if (!s[j][0].triggerHandler(cf_e('slideTo', conf), [n, s[j][3], true]))
1697					{
1698						x = false;
1699					}
1700				}
1701				return x;
1702			});
1703
1704
1705			//	queue event
1706			$cfs.bind(cf_e('queue', conf), function(e, dir, opt) {
1707				e.stopPropagation();
1708				if (is_function(dir))
1709				{
1710					dir.call($tt0, queu);
1711				}
1712				else if (is_array(dir))
1713				{
1714					queu = dir;
1715				}
1716				else if (!is_undefined(dir))
1717				{
1718					queu.push([dir, opt]);
1719				}
1720				return queu;
1721			});
1722
1723
1724			//	insertItem event
1725			$cfs.bind(cf_e('insertItem', conf), function(e, itm, num, org, dev) {
1726				e.stopPropagation();
1727
1728				var v = [itm, num, org, dev],
1729					t = ['string/object', 'string/number/object', 'boolean', 'number'],
1730					a = cf_sortParams(v, t);
1731
1732				itm = a[0];
1733				num = a[1];
1734				org = a[2];
1735				dev = a[3];
1736
1737				if (is_object(itm) && !is_jquery(itm))
1738				{ 
1739					itm = $(itm);
1740				}
1741				else if (is_string(itm))
1742				{
1743					itm = $(itm);
1744				}
1745				if (!is_jquery(itm) || itm.length == 0)
1746				{
1747					return debug(conf, 'Not a valid object.');
1748				}
1749
1750				if (is_undefined(num))
1751				{
1752					num = 'end';
1753				}
1754
1755				sz_storeMargin(itm, opts);
1756				sz_storeOrigCss(itm);
1757
1758				var orgNum = num,
1759					before = 'before';
1760
1761				if (num == 'end')
1762				{
1763					if (org)
1764					{
1765						if (itms.first == 0)
1766						{
1767							num = itms.total-1;
1768							before = 'after';
1769						}
1770						else
1771						{
1772							num = itms.first;
1773							itms.first += itm.length;
1774						}
1775						if (num < 0)
1776						{
1777							num = 0;
1778						}
1779					}
1780					else
1781					{
1782						num = itms.total-1;
1783						before = 'after';
1784					}
1785				}
1786				else
1787				{
1788					num = gn_getItemIndex(num, dev, org, itms, $cfs);
1789				}
1790
1791				var $cit = $cfs.children().eq(num);
1792				if ($cit.length)
1793				{
1794					$cit[before](itm);
1795				}
1796				else
1797				{
1798					debug(conf, 'Correct insert-position not found! Appending item to the end.');
1799					$cfs.append(itm);
1800				}
1801
1802				if (orgNum != 'end' && !org)
1803				{
1804					if (num < itms.first)
1805					{
1806						itms.first += itm.length;
1807					}
1808				}
1809				itms.total = $cfs.children().length;
1810				if (itms.first >= itms.total)
1811				{
1812					itms.first -= itms.total;
1813				}
1814
1815				$cfs.trigger(cf_e('updateSizes', conf));
1816				$cfs.trigger(cf_e('linkAnchors', conf));
1817
1818				return true;
1819			});
1820
1821
1822			//	removeItem event
1823			$cfs.bind(cf_e('removeItem', conf), function(e, num, org, dev) {
1824				e.stopPropagation();
1825
1826				var v = [num, org, dev],
1827					t = ['string/number/object', 'boolean', 'number'],
1828					a = cf_sortParams(v, t);
1829
1830				num = a[0];
1831				org = a[1];
1832				dev = a[2];
1833
1834				var removed = false;
1835
1836				if (num instanceof $ && num.length > 1)
1837				{
1838					$removed = $();
1839					num.each(function(i, el) {
1840						var $rem = $cfs.trigger(cf_e('removeItem', conf), [$(this), org, dev]);
1841						if ( $rem ) 
1842						{
1843							$removed = $removed.add($rem);
1844						}
1845					});
1846					return $removed;
1847				}
1848
1849				if (is_undefined(num) || num == 'end')
1850				{
1851					$removed = $cfs.children().last();
1852				}
1853				else
1854				{
1855					num = gn_getItemIndex(num, dev, org, itms, $cfs);
1856					var $removed = $cfs.children().eq(num);
1857					if ( $removed.length )
1858					{
1859						if (num < itms.first)
1860						{
1861							itms.first -= $removed.length;
1862						}
1863					}
1864				}
1865				if ( $removed && $removed.length )
1866				{
1867					$removed.detach();
1868					itms.total = $cfs.children().length;
1869					$cfs.trigger(cf_e('updateSizes', conf));
1870				}
1871
1872				return $removed;
1873			});
1874
1875
1876			//	onBefore and onAfter event
1877			$cfs.bind(cf_e('onBefore', conf)+' '+cf_e('onAfter', conf), function(e, fn) {
1878				e.stopPropagation();
1879				var eType = e.type.slice(conf.events.prefix.length);
1880				if (is_array(fn))
1881				{
1882					clbk[eType] = fn;
1883				}
1884				if (is_function(fn))
1885				{
1886					clbk[eType].push(fn);
1887				}
1888				return clbk[eType];
1889			});
1890
1891
1892			//	currentPosition event
1893			$cfs.bind(cf_e('currentPosition', conf), function(e, fn) {
1894				e.stopPropagation();
1895				if (itms.first == 0)
1896				{
1897					var val = 0;
1898				}
1899				else
1900				{
1901					var val = itms.total - itms.first;
1902				}
1903				if (is_function(fn))
1904				{
1905					fn.call($tt0, val);
1906				}
1907				return val;
1908			});
1909
1910
1911			//	currentPage event
1912			$cfs.bind(cf_e('currentPage', conf), function(e, fn) {
1913				e.stopPropagation();
1914				var ipp = opts.pagination.items || opts.items.visible,
1915					max = Math.ceil(itms.total/ipp-1),
1916					nr;
1917				if (itms.first == 0)
1918				{
1919					nr = 0;
1920				}
1921				else if (itms.first < itms.total % ipp)
1922				{
1923					nr = 0;
1924				}
1925				else if (itms.first == ipp && !opts.circular)
1926				{
1927					nr = max;
1928				}
1929				else 
1930				{
1931					 nr = Math.round((itms.total-itms.first)/ipp);
1932				}
1933				if (nr < 0)
1934				{
1935					nr = 0;
1936				}
1937				if (nr > max)
1938				{
1939					nr = max;
1940				}
1941				if (is_function(fn))
1942				{
1943					fn.call($tt0, nr);
1944				}
1945				return nr;
1946			});
1947
1948
1949			//	currentVisible event
1950			$cfs.bind(cf_e('currentVisible', conf), function(e, fn) {
1951				e.stopPropagation();
1952				var $i = gi_getCurrentItems($cfs.children(), opts);
1953				if (is_function(fn))
1954				{
1955					fn.call($tt0, $i);
1956				}
1957				return $i;
1958			});
1959
1960
1961			//	slice event
1962			$cfs.bind(cf_e('slice', conf), function(e, f, l, fn) {
1963				e.stopPropagation();
1964
1965				if (itms.total == 0)
1966				{
1967					return false;
1968				}
1969
1970				var v = [f, l, fn],
1971					t = ['number', 'number', 'function'],
1972					a = cf_sortParams(v, t);
1973
1974				f = (is_number(a[0])) ? a[0] : 0;
1975				l = (is_number(a[1])) ? a[1] : itms.total;
1976				fn = a[2];
1977
1978				f += itms.first;
1979				l += itms.first;
1980
1981				if (items.total > 0)
1982				{
1983					while (f > itms.total)
1984					{
1985						f -= itms.total;
1986					}
1987					while (l > itms.total)
1988					{
1989						l -= itms.total;
1990					}
1991					while (f < 0)
1992					{
1993						f += itms.total;
1994					}
1995					while (l < 0)
1996					{
1997						l += itms.total;
1998					}
1999				}
2000				var $iA = $cfs.children(),
2001					$i;
2002
2003				if (l > f)
2004				{
2005					$i = $iA.slice(f, l);
2006				}
2007				else
2008				{
2009					$i = $( $iA.slice(f, itms.total).get().concat( $iA.slice(0, l).get() ) );
2010				}
2011
2012				if (is_function(fn))
2013				{
2014					fn.call($tt0, $i);
2015				}
2016				return $i;
2017			});
2018
2019
2020			//	isPaused, isStopped and isScrolling events
2021			$cfs.bind(cf_e('isPaused', conf)+' '+cf_e('isStopped', conf)+' '+cf_e('isScrolling', conf), function(e, fn) {
2022				e.stopPropagation();
2023				var eType = e.type.slice(conf.events.prefix.length),
2024					value = crsl[eType];
2025				if (is_function(fn))
2026				{
2027					fn.call($tt0, value);
2028				}
2029				return value;
2030			});
2031
2032
2033			//	configuration event
2034			$cfs.bind(cf_e('configuration', conf), function(e, a, b, c) {
2035				e.stopPropagation();
2036				var reInit = false;
2037
2038				//	return entire configuration-object
2039				if (is_function(a))
2040				{
2041					a.call($tt0, opts);
2042				}
2043				//	set multiple options via object
2044				else if (is_object(a))
2045				{
2046					opts_orig = $.extend(true, {}, opts_orig, a);
2047					if (b !== false) reInit = true;
2048					else opts = $.extend(true, {}, opts, a);
2049
2050				}
2051				else if (!is_undefined(a))
2052				{
2053
2054					//	callback function for specific option
2055					if (is_function(b))
2056					{
2057						var val = eval('opts.'+a);
2058						if (is_undefined(val))
2059						{
2060							val = '';
2061						}
2062						b.call($tt0, val);
2063					}
2064					//	set individual option
2065					else if (!is_undefined(b))
2066					{
2067						if (typeof c !== 'boolean') c = true;
2068						eval('opts_orig.'+a+' = b');
2069						if (c !== false) reInit = true;
2070						else eval('opts.'+a+' = b');
2071					}
2072					//	return value for specific option
2073					else
2074					{
2075						return eval('opts.'+a);
2076					}
2077				}
2078				if (reInit)
2079				{
2080					sz_resetMargin($cfs.children(), opts);
2081					FN._init(opts_orig);
2082					FN._bind_buttons();
2083					var sz = sz_setSizes($cfs, opts);
2084					$cfs.trigger(cf_e('updatePageStatus', conf), [true, sz]);
2085				}
2086				return opts;
2087			});
2088
2089
2090			//	linkAnchors event
2091			$cfs.bind(cf_e('linkAnchors', conf), function(e, $con, sel) {
2092				e.stopPropagation();
2093
2094				if (is_undefined($con))
2095				{
2096					$con = $('body');
2097				}
2098				else if (is_string($con))
2099				{
2100					$con = $($con);
2101				}
2102				if (!is_jquery($con) || $con.length == 0)
2103				{
2104					return debug(conf, 'Not a valid object.');
2105				}
2106				if (!is_string(sel))
2107				{
2108					sel = 'a.caroufredsel';
2109				}
2110
2111				$con.find(sel).each(function() {
2112					var h = this.hash || '';
2113					if (h.length > 0 && $cfs.children().index($(h)) != -1)
2114					{
2115						$(this).unbind('click').click(function(e) {
2116							e.preventDefault();
2117							$cfs.trigger(cf_e('slideTo', conf), h);
2118						});
2119					}
2120				});
2121				return true;
2122			});
2123
2124
2125			//	updatePageStatus event
2126			$cfs.bind(cf_e('updatePageStatus', conf), function(e, build, sizes) {
2127				e.stopPropagation();
2128				if (!opts.pagination.container)
2129				{
2130					return;
2131				}
2132
2133				var ipp = opts.pagination.items || opts.items.visible,
2134					pgs = Math.ceil(itms.total/ipp);
2135
2136				if (build)
2137				{
2138					if (opts.pagination.anchorBuilder)
2139					{
2140						opts.pagination.container.children().remove();
2141						opts.pagination.container.each(function() {
2142							for (var a = 0; a < pgs; a++)
2143							{
2144								var i = $cfs.children().eq( gn_getItemIndex(a*ipp, 0, true, itms, $cfs) );
2145								$(this).append(opts.pagination.anchorBuilder.call(i[0], a+1));
2146							}
2147						});
2148					}
2149					opts.pagination.container.each(function() {
2150						$(this).children().unbind(opts.pagination.event).each(function(a) {
2151							$(this).bind(opts.pagination.event, function(e) {
2152								e.preventDefault();
2153								$cfs.trigger(cf_e('slideTo', conf), [a*ipp, -opts.pagination.deviation, true, opts.pagination]);
2154							});
2155						});
2156					});
2157				}
2158
2159				var selected = $cfs.triggerHandler(cf_e('currentPage', conf)) + opts.pagination.deviation;
2160				if (selected >= pgs)
2161				{
2162					selected = 0;
2163				}
2164				if (selected < 0)
2165				{
2166					selected = pgs-1;
2167				}
2168				opts.pagination.container.each(function() {
2169					$(this).children().removeClass(cf_c('selected', conf)).eq(selected).addClass(cf_c('selected', conf));
2170				});
2171				return true;
2172			});
2173
2174
2175			//	updateSizes event
2176			$cfs.bind(cf_e('updateSizes', conf), function(e) {
2177				var vI = opts.items.visible,
2178					a_itm = $cfs.children(),
2179					avail_primary = ms_getParentSize($wrp, opts, 'width');
2180
2181				itms.total = a_itm.length;
2182
2183				if (crsl.primarySizePercentage)
2184				{
2185					opts.maxDimension = avail_primary;
2186					opts[opts.d['width']] = ms_getPercentage(avail_primary, crsl.primarySizePercentage);
2187				}
2188				else
2189				{
2190					opts.maxDimension = ms_getMaxDimension(opts, avail_primary);
2191				}
2192
2193				if (opts.responsive)
2194				{
2195					opts.items.width = opts.items.sizesConf.width;
2196					opts.items.height = opts.items.sizesConf.height;
2197					opts = in_getResponsiveValues(opts, a_itm, avail_primary);
2198					vI = opts.items.visible;
2199					sz_setResponsiveSizes(opts, a_itm);
2200				}
2201				else if (opts.items.visibleConf.variable)
2202				{
2203					vI = gn_getVisibleItemsNext(a_itm, opts, 0);
2204				}
2205				else if (opts.items.filter != '*')
2206				{
2207					vI = gn_getVisibleItemsNextFilter(a_itm, opts, 0);
2208				}
2209
2210				if (!opts.circular && itms.first != 0 && vI > itms.first) {
2211					if (opts.items.visibleConf.variable)
2212					{
2213						var nI = gn_getVisibleItemsPrev(a_itm, opts, itms.first) - itms.first;
2214					}
2215					else if (opts.items.filter != '*')
2216					{
2217						var nI = gn_getVisibleItemsPrevFilter(a_itm, opts, itms.first) - itms.first;
2218					}
2219					else
2220					{
2221						var nI = opts.items.visible - itms.first;
2222					}
2223					debug(conf, 'Preventing non-circular: sliding '+nI+' items backward.');
2224					$cfs.trigger(cf_e('prev', conf), nI);
2225				}
2226
2227				opts.items.visible = cf_getItemsAdjust(vI, opts, opts.items.visibleConf.adjust, $tt0);
2228				opts.items.visibleConf.old = opts.items.visible;
2229				opts = in_getAlignPadding(opts, a_itm);
2230
2231				var sz = sz_setSizes($cfs, opts);
2232				$cfs.trigger(cf_e('updatePageStatus', conf), [true, sz]);
2233				nv_showNavi(opts, itms.total, conf);
2234				nv_enableNavi(opts, itms.first, conf);
2235
2236				return sz;
2237			});
2238
2239
2240			//	destroy event
2241			$cfs.bind(cf_e('destroy', conf), function(e, orgOrder) {
2242				e.stopPropagation();
2243				tmrs = sc_clearTimers(tmrs);
2244
2245				$cfs.data('_cfs_isCarousel', false);
2246				$cfs.trigger(cf_e('finish', conf));
2247				if (orgOrder)
2248				{
2249					$cfs.trigger(cf_e('jumpToStart', conf));
2250				}
2251				sz_restoreOrigCss($cfs.children());
2252				sz_restoreOrigCss($cfs);
2253				FN._unbind_events();
2254				FN._unbind_buttons();
2255				if (conf.wrapper == 'parent')
2256				{
2257					sz_restoreOrigCss($wrp);
2258				}
2259				else
2260				{
2261					$wrp.replaceWith($cfs);
2262				}
2263
2264				return true;
2265			});
2266
2267
2268			//	debug event
2269			$cfs.bind(cf_e('debug', conf), function(e) {
2270				debug(conf, 'Carousel width: ' + opts.width);
2271				debug(conf, 'Carousel height: ' + opts.height);
2272				debug(conf, 'Item widths: ' + opts.items.width);
2273				debug(conf, 'Item heights: ' + opts.items.height);
2274				debug(conf, 'Number of items visible: ' + opts.items.visible);
2275				if (opts.auto.play)
2276				{
2277					debug(conf, 'Number of items scrolled automatically: ' + opts.auto.items);
2278				}
2279				if (opts.prev.button)
2280				{
2281					debug(conf, 'Number of items scrolled backward: ' + opts.prev.items);
2282				}
2283				if (opts.next.button)
2284				{
2285					debug(conf, 'Number of items scrolled forward: ' + opts.next.items);
2286				}
2287				return conf.debug;
2288			});
2289
2290
2291			//	triggerEvent, making prefixed and namespaced events accessible from outside
2292			$cfs.bind('_cfs_triggerEvent', function(e, n, o) {
2293				e.stopPropagation();
2294				return $cfs.triggerHandler(cf_e(n, conf), o);
2295			});
2296		};	//	/bind_events
2297
2298
2299		FN._unbind_events = function() {
2300			$cfs.unbind(cf_e('', conf));
2301			$cfs.unbind(cf_e('', conf, false));
2302			$cfs.unbind('_cfs_triggerEvent');
2303		};	//	/unbind_events
2304
2305
2306		FN._bind_buttons = function() {
2307			FN._unbind_buttons();
2308			nv_showNavi(opts, itms.total, conf);
2309			nv_enableNavi(opts, itms.first, conf);
2310
2311			if (opts.auto.pauseOnHover)
2312			{
2313				var pC = bt_pauseOnHoverConfig(opts.auto.pauseOnHover);
2314				$wrp.bind(cf_e('mouseenter', conf, false), function() { $cfs.trigger(cf_e('pause', conf), pC);	})
2315					.bind(cf_e('mouseleave', conf, false), function() { $cfs.trigger(cf_e('resume', conf));		});
2316			}
2317
2318			//	play button
2319			if (opts.auto.button)
2320			{
2321				opts.auto.button.bind(cf_e(opts.auto.event, conf, false), function(e) {
2322					e.preventDefault();
2323					var ev = false,
2324						pC = null;
2325
2326					if (crsl.isPaused)
2327					{
2328						ev = 'play';
2329					}
2330					else if (opts.auto.pauseOnEvent)
2331					{
2332						ev = 'pause';
2333						pC = bt_pauseOnHoverConfig(opts.auto.pauseOnEvent);
2334					}
2335					if (ev)
2336					{
2337						$cfs.trigger(cf_e(ev, conf), pC);
2338					}
2339				});
2340			}
2341
2342			//	prev button
2343			if (opts.prev.button)
2344			{
2345				opts.prev.button.bind(cf_e(opts.prev.event, conf, false), function(e) {
2346					e.preventDefault();
2347					$cfs.trigger(cf_e('prev', conf));
2348				});
2349				if (opts.prev.pauseOnHover)
2350				{
2351					var pC = bt_pauseOnHoverConfig(opts.prev.pauseOnHover);
2352					opts.prev.button.bind(cf_e('mouseenter', conf, false), function() { $cfs.trigger(cf_e('pause', conf), pC);	})
2353									.bind(cf_e('mouseleave', conf, false), function() { $cfs.trigger(cf_e('resume', conf));		});
2354				}
2355			}
2356
2357			//	next butotn
2358			if (opts.next.button)
2359			{
2360				opts.next.button.bind(cf_e(opts.next.event, conf, false), function(e) {
2361					e.preventDefault();
2362					$cfs.trigger(cf_e('next', conf));
2363				});
2364				if (opts.next.pauseOnHover)
2365				{
2366					var pC = bt_pauseOnHoverConfig(opts.next.pauseOnHover);
2367					opts.next.button.bind(cf_e('mouseenter', conf, false), function() { $cfs.trigger(cf_e('pause', conf), pC); 	})
2368									.bind(cf_e('mouseleave', conf, false), function() { $cfs.trigger(cf_e('resume', conf));		});
2369				}
2370			}
2371
2372			//	pagination
2373			if (opts.pagination.container)
2374			{
2375				if (opts.pagination.pauseOnHover)
2376				{
2377					var pC = bt_pauseOnHoverConfig(opts.pagination.pauseOnHover);
2378					opts.pagination.container.bind(cf_e('mouseenter', conf, false), function() { $cfs.trigger(cf_e('pause', conf), pC);	})
2379											 .bind(cf_e('mouseleave', conf, false), function() { $cfs.trigger(cf_e('resume', conf));	});
2380				}
2381			}
2382
2383			//	prev/next keys
2384			if (opts.prev.key || opts.next.key)
2385			{
2386				$(document).bind(cf_e('keyup', conf, false, true, true), function(e) {
2387					var k = e.keyCode;
2388					if (k == opts.next.key)
2389					{
2390						e.preventDefault();
2391						$cfs.trigger(cf_e('next', conf));
2392					}
2393					if (k == opts.prev.key)
2394					{
2395						e.preventDefault();
2396						$cfs.trigger(cf_e('prev', conf));
2397					}
2398				});
2399			}
2400
2401			//	pagination keys
2402			if (opts.pagination.keys)
2403			{
2404				$(document).bind(cf_e('keyup', conf, false, true, true), function(e) {
2405					var k = e.keyCode;
2406					if (k >= 49 && k < 58)
2407					{
2408						k = (k-49) * opts.items.visible;
2409						if (k <= itms.total)
2410						{
2411							e.preventDefault();
2412							$cfs.trigger(cf_e('slideTo', conf), [k, 0, true, opts.pagination]);
2413						}
2414					}
2415				});
2416			}
2417
2418			//	swipe
2419			if ($.fn.swipe)
2420			{
2421				var isTouch = 'ontouchstart' in window;
2422				if ((isTouch && opts.swipe.onTouch) || (!isTouch && opts.swipe.onMouse))
2423				{
2424					var scP = $.extend(true, {}, opts.prev, opts.swipe),
2425						scN = $.extend(true, {}, opts.next, opts.swipe),
2426						swP = function() { $cfs.trigger(cf_e('prev', conf), [scP]) },
2427						swN = function() { $cfs.trigger(cf_e('next', conf), [scN]) };
2428
2429					switch (opts.direction)
2430					{
2431						case 'up':
2432						case 'down':
2433							opts.swipe.options.swipeUp = swN;
2434							opts.swipe.options.swipeDown = swP;
2435							break;
2436						default:
2437							opts.swipe.options.swipeLeft = swN;
2438							opts.swipe.options.swipeRight = swP;
2439					}
2440					if (crsl.swipe)
2441					{
2442						$cfs.swipe('destroy');
2443					}
2444					$wrp.swipe(opts.swipe.options);
2445					$wrp.css('cursor', 'move');
2446					crsl.swipe = true;
2447				}
2448			}
2449
2450			//	mousewheel
2451			if ($.fn.mousewheel)
2452			{
2453
2454				if (opts.mousewheel)
2455				{
2456					var mcP = $.extend(true, {}, opts.prev, opts.mousewheel),
2457						mcN = $.extend(true, {}, opts.next, opts.mousewheel);
2458
2459					if (crsl.mousewheel)
2460					{
2461						$wrp.unbind(cf_e('mousewheel', conf, false));
2462					}
2463					$wrp.bind(cf_e('mousewheel', conf, false), function(e, delta) { 
2464						e.preventDefault();
2465						if (delta > 0)
2466						{
2467							$cfs.trigger(cf_e('prev', conf), [mcP]);
2468						}
2469						else
2470						{
2471							$cfs.trigger(cf_e('next', conf), [mcN]);
2472						}
2473					});
2474					crsl.mousewheel = true;
2475				}
2476			}
2477
2478			if (opts.auto.play)
2479			{
2480				$cfs.trigger(cf_e('play', conf), opts.auto.delay);
2481			}
2482
2483			if (crsl.upDateOnWindowResize)
2484			{
2485				var resizeFn = function(e) {
2486					$cfs.trigger(cf_e('finish', conf));
2487					if (opts.auto.pauseOnResize && !crsl.isPaused)
2488					{
2489						$cfs.trigger(cf_e('play', conf));
2490					}
2491					sz_resetMargin($cfs.children(), opts);
2492					$cfs.trigger(cf_e('updateSizes', conf));
2493				};
2494
2495				var $w = $(window),
2496					onResize = null;
2497
2498				if ($.debounce && conf.onWindowResize == 'debounce')
2499				{
2500					onResize = $.debounce(200, resizeFn);
2501				}
2502				else if ($.throttle && conf.onWindowResize == 'throttle')
2503				{
2504					onResize = $.throttle(300, resizeFn);
2505				}
2506				else
2507				{
2508					var _windowWidth = 0,
2509						_windowHeight = 0;
2510
2511					onResize = function() {
2512						var nw = $w.width(),
2513							nh = $w.height();
2514
2515						if (nw != _windowWidth || nh != _windowHeight)
2516						{
2517							resizeFn();
2518							_windowWidth = nw;
2519							_windowHeight = nh;
2520						}
2521					};
2522				}
2523				$w.bind(cf_e('resize', conf, false, true, true), onResize);
2524			}
2525		};	//	/bind_buttons
2526
2527
2528		FN._unbind_buttons = function() {
2529			var ns1 = cf_e('', conf),
2530				ns2 = cf_e('', conf, false);
2531				ns3 = cf_e('', conf, false, true, true);
2532
2533			$(document).unbind(ns3);
2534			$(window).unbind(ns3);
2535			$wrp.unbind(ns2);
2536
2537			if (opts.auto.button)
2538			{
2539				opts.auto.button.unbind(ns2);
2540			}
2541			if (opts.prev.button)
2542			{
2543				opts.prev.button.unbind(ns2);
2544			}
2545			if (opts.next.button)
2546			{
2547				opts.next.button.unbind(ns2);
2548			}
2549			if (opts.pagination.container)
2550			{
2551				opts.pagination.container.unbind(ns2);
2552				if (opts.pagination.anchorBuilder)
2553				{
2554					opts.pagination.container.children().remove();
2555				}
2556			}
2557			if (crsl.swipe)
2558			{
2559				$cfs.swipe('destroy');
2560				$wrp.css('cursor', 'default');
2561				crsl.swipe = false;
2562			}
2563			if (crsl.mousewheel)
2564			{
2565				crsl.mousewheel = false;
2566			}
2567
2568			nv_showNavi(opts, 'hide', conf);
2569			nv_enableNavi(opts, 'removeClass', conf);
2570
2571		};	//	/unbind_buttons
2572
2573
2574
2575		//	START
2576
2577		if (is_boolean(configs))
2578		{
2579			configs = {
2580				'debug': configs
2581			};
2582		}
2583
2584		//	set vars
2585		var crsl = {
2586				'direction'		: 'next',
2587				'isPaused'		: true,
2588				'isScrolling'	: false,
2589				'isStopped'		: false,
2590				'mousewheel'	: false,
2591				'swipe'			: false
2592			},
2593			itms = {
2594				'total'			: $cfs.children().length,
2595				'first'			: 0
2596			},
2597			tmrs = {
2598				'auto'			: null,
2599				'progress'		: null,
2600				'startTime'		: getTime(),
2601				'timePassed'	: 0
2602			},
2603			scrl = {
2604				'isStopped'		: false,
2605				'duration'		: 0,
2606				'startTime'		: 0,
2607				'easing'		: '',
2608				'anims'			: []
2609			},
2610			clbk = {
2611				'onBefore'		: [],
2612				'onAfter'		: []
2613			},
2614			queu = [],
2615			conf = $.extend(true, {}, $.fn.carouFredSel.configs, configs),
2616			opts = {},
2617			opts_orig = $.extend(true, {}, options),
2618			$wrp = (conf.wrapper == 'parent')
2619				? $cfs.parent()
2620				: $cfs.wrap('<'+conf.wrapper.element+' class="'+conf.wrapper.classname+'" />').parent();
2621
2622
2623		conf.selector		= $cfs.selector;
2624		conf.serialNumber	= $.fn.carouFredSel.serialNumber++;
2625
2626		conf.transition = (conf.transition && $.fn.transition) ? 'transition' : 'animate';
2627
2628		//	create carousel
2629		FN._init(opts_orig, true, starting_position);
2630		FN._build();
2631		FN._bind_events();
2632		FN._bind_buttons();
2633
2634		//	find item to start
2635		if (is_array(opts.items.start))
2636		{
2637			var start_arr = opts.items.start;
2638		}
2639		else
2640		{
2641			var start_arr = [];
2642			if (opts.items.start != 0)
2643			{
2644				start_arr.push(opts.items.start);
2645			}
2646		}
2647		if (opts.cookie)
2648		{
2649			start_arr.unshift(parseInt(cf_getCookie(opts.cookie), 10));
2650		}
2651
2652		if (start_arr.length > 0)
2653		{
2654			for (var a = 0, l = start_arr.length; a < l; a++)
2655			{
2656				var s = start_arr[a];
2657				if (s == 0)
2658				{
2659					continue;
2660				}
2661				if (s === true)
2662				{
2663					s = window.location.hash;
2664					if (s.length < 1)
2665					{
2666						continue;
2667					}
2668				}
2669				else if (s === 'random')
2670				{
2671					s = Math.floor(Math.random()*itms.total);
2672				}
2673				if ($cfs.triggerHandler(cf_e('slideTo', conf), [s, 0, true, { fx: 'none' }]))
2674				{
2675					break;
2676				}
2677			}
2678		}
2679		var siz = sz_setSizes($cfs, opts),
2680			itm = gi_getCurrentItems($cfs.children(), opts);
2681
2682		if (opts.onCreate)
2683		{
2684			opts.onCreate.call($tt0, {
2685				'width': siz.width,
2686				'height': siz.height,
2687				'items': itm
2688			});
2689		}
2690
2691		$cfs.trigger(cf_e('updatePageStatus', conf), [true, siz]);
2692		$cfs.trigger(cf_e('linkAnchors', conf));
2693
2694		if (conf.debug)
2695		{
2696			$cfs.trigger(cf_e('debug', conf));
2697		}
2698
2699		return $cfs;
2700	};
2701
2702
2703
2704	//	GLOBAL PUBLIC
2705
2706	$.fn.carouFredSel.serialNumber = 1;
2707	$.fn.carouFredSel.defaults = {
2708		'synchronise'	: false,
2709		'infinite'		: true,
2710		'circular'		: true,
2711		'responsive'	: false,
2712		'direction'		: 'left',
2713		'items'			: {
2714			'start'			: 0
2715		},
2716		'scroll'		: {
2717			'easing'		: 'swing',
2718			'duration'		: 500,
2719			'pauseOnHover'	: false,
2720			'event'			: 'click',
2721			'queue'			: false
2722		}
2723	};
2724	$.fn.carouFredSel.configs = {
2725		'debug'			: false,
2726		'transition'	: false,
2727		'onWindowResize': 'throttle',
2728		'events'		: {
2729			'prefix'		: '',
2730			'namespace'		: 'cfs'
2731		},
2732		'wrapper'		: {
2733			'element'		: 'div',
2734			'classname'		: 'caroufredsel_wrapper'
2735		},
2736		'classnames'	: {}
2737	};
2738	$.fn.carouFredSel.pageAnchorBuilder = function(nr) {
2739		return '<a href="#"><span>'+nr+'</span></a>';
2740	};
2741	$.fn.carouFredSel.progressbarUpdater = function(perc) {
2742		$(this).css('width', perc+'%');
2743	};
2744
2745	$.fn.carouFredSel.cookie = {
2746		get: function(n) {
2747			n += '=';
2748			var ca = document.cookie.split(';');
2749			for (var a = 0, l = ca.length; a < l; a++)
2750			{
2751				var c = ca[a];
2752				while (c.charAt(0) == ' ')
2753				{
2754					c = c.slice(1);
2755				}
2756				if (c.indexOf(n) == 0)
2757				{
2758					return c.slice(n.length);
2759				}
2760			}
2761			return 0;
2762		},
2763		set: function(n, v, d) {
2764			var e = "";
2765			if (d)
2766			{
2767				var date = new Date();
2768				date.setTime(date.getTime() + (d * 24 * 60 * 60 * 1000));
2769				e = "; expires=" + date.toGMTString();
2770			}
2771			document.cookie = n + '=' + v + e + '; path=/';
2772		},
2773		remove: function(n) {
2774			$.fn.carouFredSel.cookie.set(n, "", -1);
2775		}
2776	};
2777
2778
2779	//	GLOBAL PRIVATE
2780
2781	//	scrolling functions
2782	function sc_setScroll(d, e, c) {
2783		if (c.transition == 'transition')
2784		{
2785			if (e == 'swing')
2786			{
2787				e = 'ease';
2788			}
2789		}
2790		return {
2791			anims: [],
2792			duration: d,
2793			orgDuration: d,
2794			easing: e,
2795			startTime: getTime()
2796		};
2797	}
2798	function sc_startScroll(s, c) {
2799		for (var a = 0, l = s.anims.length; a < l; a++)
2800		{
2801			var b = s.anims[a];
2802			if (!b)
2803			{
2804				continue;
2805			}
2806			b[0][c.transition](b[1], s.duration, s.easing, b[2]);
2807		}
2808	}
2809	function sc_stopScroll(s, finish) {
2810		if (!is_boolean(finish))
2811		{
2812			finish = true;
2813		}
2814		if (is_object(s.pre))
2815		{
2816			sc_stopScroll(s.pre, finish);
2817		}
2818		for (var a = 0, l = s.anims.length; a < l; a++)
2819		{
2820			var b = s.anims[a];
2821			b[0].stop(true);
2822			if (finish)
2823			{
2824				b[0].css(b[1]);
2825				if (is_function(b[2]))
2826				{
2827					b[2]();
2828				}
2829			}
2830		}
2831		if (is_object(s.post))
2832		{
2833			sc_stopScroll(s.post, finish);
2834		}
2835	}
2836	function sc_afterScroll( $c, $c2, o ) {
2837		if ($c2)
2838		{
2839			$c2.remove();
2840		}
2841
2842		switch(o.fx) {
2843			case 'fade':
2844			case 'crossfade':
2845			case 'cover-fade':
2846			case 'uncover-fade':
2847				$c.css('opacity', 1);
2848				$c.css('filter', '');
2849				break;
2850		}
2851	}
2852	function sc_fireCallbacks($t, o, b, a, c) {
2853		if (o[b])
2854		{
2855			o[b].call($t, a);
2856		}
2857		if (c[b].length)
2858		{
2859			for (var i = 0, l = c[b].length; i < l; i++)
2860			{
2861				c[b][i].call($t, a);
2862			}
2863		}
2864		return [];
2865	}
2866	function sc_fireQueue($c, q, c) {
2867
2868		if (q.length)
2869		{
2870			$c.trigger(cf_e(q[0][0], c), q[0][1]);
2871			q.shift();
2872		}
2873		return q;
2874	}
2875	function sc_hideHiddenItems(hiddenitems) {
2876		hiddenitems.each(function() {
2877			var hi = $(this);
2878			hi.data('_cfs_isHidden', hi.is(':hidden')).hide();
2879		});
2880	}
2881	function sc_showHiddenItems(hiddenitems) {
2882		if (hiddenitems)
2883		{
2884			hiddenitems.each(function() {
2885				var hi = $(this);
2886				if (!hi.data('_cfs_isHidden'))
2887				{
2888					hi.show();
2889				}
2890			});
2891		}
2892	}
2893	function sc_clearTimers(t) {
2894		if (t.auto)
2895		{
2896			clearTimeout(t.auto);
2897		}
2898		if (t.progress)
2899		{
2900			clearInterval(t.progress);
2901		}
2902		return t;
2903	}
2904	function sc_mapCallbackArguments(i_old, i_skp, i_new, s_itm, s_dir, s_dur, w_siz) {
2905		return {
2906			'width': w_siz.width,
2907			'height': w_siz.height,
2908			'items': {
2909				'old': i_old,
2910				'skipped': i_skp,
2911				'visible': i_new
2912			},
2913			'scroll': {
2914				'items': s_itm,
2915				'direction': s_dir,
2916				'duration': s_dur
2917			}
2918		};
2919	}
2920	function sc_getDuration( sO, o, nI, siz ) {
2921		var dur = sO.duration;
2922		if (sO.fx == 'none')
2923		{
2924			return 0;
2925		}
2926		if (dur == 'auto')
2927		{
2928			dur = o.scroll.duration / o.scroll.items * nI;
2929		}
2930		else if (dur < 10)
2931		{
2932			dur = siz / dur;
2933		}
2934		if (dur < 1)
2935		{
2936			return 0;
2937		}
2938		if (sO.fx == 'fade')
2939		{
2940			dur = dur / 2;
2941		}
2942		return Math.round(dur);
2943	}
2944
2945	//	navigation functions
2946	function nv_showNavi(o, t, c) {
2947		var minimum = (is_number(o.items.minimum)) ? o.items.minimum : o.items.visible + 1;
2948		if (t == 'show' || t == 'hide')
2949		{
2950			var f = t;
2951		}
2952		else if (minimum > t)
2953		{
2954			debug(c, 'Not enough items ('+t+' total, '+minimum+' needed): Hiding navigation.');
2955			var f = 'hide';
2956		}
2957		else
2958		{
2959			var f = 'show';
2960		}
2961		var s = (f == 'show') ? 'removeClass' : 'addClass',
2962			h = cf_c('hidden', c);
2963
2964		if (o.auto.button)
2965		{
2966			o.auto.button[f]()[s](h);
2967		}
2968		if (o.prev.button)
2969		{
2970			o.prev.button[f]()[s](h);
2971		}
2972		if (o.next.button)
2973		{
2974			o.next.button[f]()[s](h);
2975		}
2976		if (o.pagination.container)
2977		{
2978			o.pagination.container[f]()[s](h);
2979		}
2980	}
2981	function nv_enableNavi(o, f, c) {
2982		if (o.circular || o.infinite) return;
2983		var fx = (f == 'removeClass' || f == 'addClass') ? f : false,
2984			di = cf_c('disabled', c);
2985
2986		if (o.auto.button && fx)
2987		{
2988			o.auto.button[fx](di);
2989		}
2990		if (o.prev.button)
2991		{
2992			var fn = fx || (f == 0) ? 'addClass' : 'removeClass';
2993			o.prev.button[fn](di);
2994		}
2995		if (o.next.button)
2996		{
2997			var fn = fx || (f == o.items.visible) ? 'addClass' : 'removeClass';
2998			o.next.button[fn](di);
2999		}
3000	}
3001
3002	//	get object functions
3003	function go_getObject($tt, obj) {
3004		if (is_function(obj))
3005		{
3006			obj = obj.call($tt);
3007		}
3008		else if (is_undefined(obj))
3009		{
3010			obj = {};
3011		}
3012		return obj;
3013	}
3014	function go_getItemsObject($tt, obj) {
3015		obj = go_getObject($tt, obj);
3016		if (is_number(obj))
3017		{
3018			obj	= {
3019				'visible': obj
3020			};
3021		}
3022		else if (obj == 'variable')
3023		{
3024			obj = {
3025				'visible': obj,
3026				'width': obj, 
3027				'height': obj
3028			};
3029		}
3030		else if (!is_object(obj))
3031		{
3032			obj = {};
3033		}
3034		return obj;
3035	}
3036	function go_getScrollObject($tt, obj) {
3037		obj = go_getObject($tt, obj);
3038		if (is_number(obj))
3039		{
3040			if (obj <= 50)
3041			{
3042				obj = {
3043					'items': obj
3044				};
3045			}
3046			else
3047			{
3048				obj = {
3049					'duration': obj
3050				};
3051			}
3052		}
3053		else if (is_string(obj))
3054		{
3055			obj = {
3056				'easing': obj
3057			};
3058		}
3059		else if (!is_object(obj))
3060		{
3061			obj = {};
3062		}
3063		return obj;
3064	}
3065	function go_getNaviObject($tt, obj) {
3066		obj = go_getObject($tt, obj);
3067		if (is_string(obj))
3068		{
3069			var temp = cf_getKeyCode(obj);
3070			if (temp == -1)
3071			{
3072				obj = $(obj);
3073			}
3074			else
3075			{
3076				obj = temp;
3077			}
3078		}
3079		return obj;
3080	}
3081
3082	function go_getAutoObject($tt, obj) {
3083		obj = go_getNaviObject($tt, obj);
3084		if (is_jquery(obj))
3085		{
3086			obj = {
3087				'button': obj
3088			};
3089		}
3090		else if (is_boolean(obj))
3091		{
3092			obj = {
3093				'play': obj
3094			};
3095		}
3096		else if (is_number(obj))
3097		{
3098			obj = {
3099				'timeoutDuration': obj
3100			};
3101		}
3102		if (obj.progress)
3103		{
3104			if (is_string(obj.progress) || is_jquery(obj.progress))
3105			{
3106				obj.progress = {
3107					'bar': obj.progress
3108				};
3109			}
3110		}
3111		return obj;
3112	}
3113	function go_complementAutoObject($tt, obj) {
3114		if (is_function(obj.button))
3115		{
3116			obj.button = obj.button.call($tt);
3117		}
3118		if (is_string(obj.button))
3119		{
3120			obj.button = $(obj.button);
3121		}
3122		if (!is_boolean(obj.play))
3123		{
3124			obj.play = true;
3125		}
3126		if (!is_number(obj.delay))
3127		{
3128			obj.delay = 0;
3129		}
3130		if (is_undefined(obj.pauseOnEvent))
3131		{
3132			obj.pauseOnEvent = true;
3133		}
3134		if (!is_boolean(obj.pauseOnResize))
3135		{
3136			obj.pauseOnResize = true;
3137		}
3138		if (!is_number(obj.timeoutDuration))
3139		{
3140			obj.timeoutDuration = (obj.duration < 10)
3141				? 2500
3142				: obj.duration * 5;
3143		}
3144		if (obj.progress)
3145		{
3146			if (is_function(obj.progress.bar))
3147			{
3148				obj.progress.bar = obj.progress.bar.call($tt);
3149			}
3150			if (is_string(obj.progress.bar))
3151			{
3152				obj.progress.bar = $(obj.progress.bar);
3153			}
3154			if (obj.progress.bar)
3155			{
3156				if (!is_function(obj.progress.updater))
3157				{
3158					obj.progress.updater = $.fn.carouFredSel.progressbarUpdater;
3159				}
3160				if (!is_number(obj.progress.interval))
3161				{
3162					obj.progress.interval = 50;
3163				}
3164			}
3165			else
3166			{
3167				obj.progress = false;
3168			}
3169		}
3170		return obj;
3171	}
3172
3173	function go_getPrevNextObject($tt, obj) {
3174		obj = go_getNaviObject($tt, obj);
3175		if (is_jquery(obj))
3176		{
3177			obj = {
3178				'button': obj
3179			};
3180		}
3181		else if (is_number(obj))
3182		{
3183			obj = {
3184				'key': obj
3185			};
3186		}
3187		return obj;
3188	}
3189	function go_complementPrevNextObject($tt, obj) {
3190		if (is_function(obj.button))
3191		{
3192			obj.button = obj.button.call($tt);
3193		}
3194		if (is_string(obj.button))
3195		{
3196			obj.button = $(obj.button);
3197		}
3198		if (is_string(obj.key))
3199		{
3200			obj.key = cf_getKeyCode(obj.key);
3201		}
3202		return obj;
3203	}
3204
3205	function go_getPaginationObject($tt, obj) {
3206		obj = go_getNaviObject($tt, obj);
3207		if (is_jquery(obj))
3208		{
3209			obj = {
3210				'container': obj
3211			};
3212		}
3213		else if (is_boolean(obj))
3214		{
3215			obj = {
3216				'keys': obj
3217			};
3218		}
3219		return obj;
3220	}
3221	function go_complementPaginationObject($tt, obj) {
3222		if (is_function(obj.container))
3223		{
3224			obj.container = obj.container.call($tt);
3225		}
3226		if (is_string(obj.container))
3227		{
3228			obj.container = $(obj.container);
3229		}
3230		if (!is_number(obj.items))
3231		{
3232			obj.items = false;
3233		}
3234		if (!is_boolean(obj.keys))
3235		{
3236			obj.keys = false;
3237		}
3238		if (!is_function(obj.anchorBuilder) && !is_false(obj.anchorBuilder))
3239		{
3240			obj.anchorBuilder = $.fn.carouFredSel.pageAnchorBuilder;
3241		}
3242		if (!is_number(obj.deviation))
3243		{
3244			obj.deviation = 0;
3245		}
3246		return obj;
3247	}
3248
3249	function go_getSwipeObject($tt, obj) {
3250		if (is_function(obj))
3251		{
3252			obj = obj.call($tt);
3253		}
3254		if (is_undefined(obj))
3255		{
3256			obj = {
3257				'onTouch': false
3258			};
3259		}
3260		if (is_true(obj))
3261		{
3262			obj = {
3263				'onTouch': obj
3264			};
3265		}
3266		else if (is_number(obj))
3267		{
3268			obj = {
3269				'items': obj
3270			};
3271		}
3272		return obj;
3273	}
3274	function go_complementSwipeObject($tt, obj) {
3275		if (!is_boolean(obj.onTouch))
3276		{
3277			obj.onTouch = true;
3278		}
3279		if (!is_boolean(obj.onMouse))
3280		{
3281			obj.onMouse = false;
3282		}
3283		if (!is_object(obj.options))
3284		{
3285			obj.options = {};
3286		}
3287		if (!is_boolean(obj.options.triggerOnTouchEnd))
3288		{
3289			obj.options.triggerOnTouchEnd = false;
3290		}
3291		return obj;
3292	}
3293	function go_getMousewheelObject($tt, obj) {
3294		if (is_function(obj))
3295		{
3296			obj = obj.call($tt);
3297		}
3298		if (is_true(obj))
3299		{
3300			obj = {};
3301		}
3302		else if (is_number(obj))
3303		{
3304			obj = {
3305				'items': obj
3306			};
3307		}
3308		else if (is_undefined(obj))
3309		{
3310			obj = false;
3311		}
3312		return obj;
3313	}
3314	function go_complementMousewheelObject($tt, obj) {
3315		return obj;
3316	}
3317
3318	//	get number functions
3319	function gn_getItemIndex(num, dev, org, items, $cfs) {
3320		if (is_string(num))
3321		{
3322			num = $(num, $cfs);
3323		}
3324
3325		if (is_object(num))
3326		{
3327			num = $(num, $cfs);
3328		}
3329		if (is_jquery(num))
3330		{
3331			num = $cfs.children().index(num);
3332			if (!is_boolean(org))
3333			{
3334				org = false;
3335			}
3336		}
3337		else
3338		{
3339			if (!is_boolean(org))
3340			{
3341				org = true;
3342			}
3343		}
3344		if (!is_number(num))
3345		{
3346			num = 0;
3347		}
3348		if (!is_number(dev))
3349		{
3350			dev = 0;
3351		}
3352
3353		if (org)
3354		{
3355			num += items.first;
3356		}
3357		num += dev;
3358		if (items.total > 0)
3359		{
3360			while (num >= items.total)
3361			{
3362				num -= items.total;
3363			}
3364			while (num < 0)
3365			{
3366				num += items.total;
3367			}
3368		}
3369		return num;
3370	}
3371
3372	//	items prev
3373	function gn_getVisibleItemsPrev(i, o, s) {
3374		var t = 0,
3375			x = 0;
3376
3377		for (var a = s; a >= 0; a--)
3378		{
3379			var j = i.eq(a);
3380			t += (j.is(':visible')) ? j[o.d['outerWidth']](true) : 0;
3381			if (t > o.maxDimension)
3382			{
3383				return x;
3384			}
3385			if (a == 0)
3386			{
3387				a = i.length;
3388			}
3389			x++;
3390		}
3391	}
3392	function gn_getVisibleItemsPrevFilter(i, o, s) {
3393		return gn_getItemsPrevFilter(i, o.items.filter, o.items.visibleConf.org, s);
3394	}
3395	function gn_getScrollItemsPrevFilter(i, o, s, m) {
3396		return gn_getItemsPrevFilter(i, o.items.filter, m, s);
3397	}
3398	function gn_getItemsPrevFilter(i, f, m, s) {
3399		var t = 0,
3400			x = 0;
3401
3402		for (var a = s, l = i.length; a >= 0; a--)
3403		{
3404			x++;
3405			if (x == l)
3406			{
3407				return x;
3408			}
3409
3410			var j = i.eq(a);
3411			if (j.is(f))
3412			{
3413				t++;
3414				if (t == m)
3415				{
3416					return x;
3417				}
3418			}
3419			if (a == 0)
3420			{
3421				a = l;
3422			}
3423		}
3424	}
3425
3426	function gn_getVisibleOrg($c, o) {
3427		return o.items.visibleConf.org || $c.children().slice(0, o.items.visible).filter(o.items.filter).length;
3428	}
3429
3430	//	items next
3431	function gn_getVisibleItemsNext(i, o, s) {
3432		var t = 0,
3433			x = 0;
3434
3435		for (var a = s, l = i.length-1; a <= l; a++)
3436		{
3437			var j = i.eq(a);
3438
3439			t += (j.is(':visible')) ? j[o.d['outerWidth']](true) : 0;
3440			if (t > o.maxDimension)
3441			{
3442				return x;
3443			}
3444
3445			x++;
3446			if (x == l+1)
3447			{
3448				return x;
3449			}
3450			if (a == l)
3451			{
3452				a = -1;
3453			}
3454		}
3455	}
3456	function gn_getVisibleItemsNextTestCircular(i, o, s, l) {
3457		var v = gn_getVisibleItemsNext(i, o, s);
3458		if (!o.circular)
3459		{
3460			if (s + v > l)
3461			{
3462				v = l - s;
3463			}
3464		}
3465		return v;
3466	}
3467	function gn_getVisibleItemsNextFilter(i, o, s) {
3468		return gn_getItemsNextFilter(i, o.items.filter, o.items.visibleConf.org, s, o.circular);
3469	}
3470	function gn_getScrollItemsNextFilter(i, o, s, m) {
3471		return gn_getItemsNextFilter(i, o.items.filter, m+1, s, o.circular) - 1;
3472	}
3473	function gn_getItemsNextFilter(i, f, m, s, c) {
3474		var t = 0,
3475			x = 0;
3476
3477		for (var a = s, l = i.length-1; a <= l; a++)
3478		{
3479			x++;
3480			if (x >= l)
3481			{
3482				return x;
3483			}
3484
3485			var j = i.eq(a);
3486			if (j.is(f))
3487			{
3488				t++;
3489				if (t == m)
3490				{
3491					return x;
3492				}
3493			}
3494			if (a == l)
3495			{
3496				a = -1;
3497			}
3498		}
3499	}
3500
3501	//	get items functions
3502	function gi_getCurrentItems(i, o) {
3503		return i.slice(0, o.items.visible);
3504	}
3505	function gi_getOldItemsPrev(i, o, n) {
3506		return i.slice(n, o.items.visibleConf.old+n);
3507	}
3508	function gi_getNewItemsPrev(i, o) {
3509		return i.slice(0, o.items.visible);
3510	}
3511	function gi_getOldItemsNext(i, o) {
3512		return i.slice(0, o.items.visibleConf.old);
3513	}
3514	function gi_getNewItemsNext(i, o, n) {
3515		return i.slice(n, o.items.visible+n);
3516	}
3517
3518	//	sizes functions
3519	function sz_storeMargin(i, o, d) {
3520		if (o.usePadding)
3521		{
3522			if (!is_string(d))
3523			{
3524				d = '_cfs_origCssMargin';
3525			}
3526			i.each(function() {
3527				var j = $(this),
3528					m = parseInt(j.css(o.d['marginRight']), 10);
3529				if (!is_number(m)) 
3530				{
3531					m = 0;
3532				}
3533				j.data(d, m);
3534			});
3535		}
3536	}
3537	function sz_resetMargin(i, o, m) {
3538		if (o.usePadding)
3539		{
3540			var x = (is_boolean(m)) ? m : false;
3541			if (!is_number(m))
3542			{
3543				m = 0;
3544			}
3545			sz_storeMargin(i, o, '_cfs_tempCssMargin');
3546			i.each(function() {
3547				var j = $(this);
3548				j.css(o.d['marginRight'], ((x) ? j.data('_cfs_tempCssMargin') : m + j.data('_cfs_origCssMargin')));
3549			});
3550		}
3551	}
3552	function sz_storeOrigCss(i) {
3553		i.each(function() {
3554			var j = $(this);
3555			j.data('_cfs_origCss', j.attr('style') || '');
3556		});
3557	}
3558	function sz_restoreOrigCss(i) {
3559		i.each(function() {
3560			var j = $(this);
3561			j.attr('style', j.data('_cfs_origCss') || '');
3562		});
3563	}
3564	function sz_setResponsiveSizes(o, all) {
3565		var visb = o.items.visible,
3566			newS = o.items[o.d['width']],
3567			seco = o[o.d['height']],
3568			secp = is_percentage(seco);
3569
3570		all.each(function() {
3571			var $t = $(this),
3572				nw = newS - ms_getPaddingBorderMargin($t, o, 'Width');
3573
3574			$t[o.d['width']](nw);
3575			if (secp)
3576			{
3577				$t[o.d['height']](ms_getPercentage(nw, seco));
3578			}
3579		});
3580	}
3581	function sz_setSizes($c, o) {
3582		var $w = $c.parent(),
3583			$i = $c.children(),
3584			$v = gi_getCurrentItems($i, o),
3585			sz = cf_mapWrapperSizes(ms_getSizes($v, o, true), o, false);
3586
3587		$w.css(sz);
3588
3589		if (o.usePadding)
3590		{
3591			var p = o.padding,
3592				r = p[o.d[1]];
3593
3594			if (o.align && r < 0)
3595			{
3596				r = 0;
3597			}
3598			var $l = $v.last();
3599			$l.css(o.d['marginRight'], $l.data('_cfs_origCssMargin') + r);
3600			$c.css(o.d['top'], p[o.d[0]]);
3601			$c.css(o.d['left'], p[o.d[3]]);
3602		}
3603
3604		$c.css(o.d['width'], sz[o.d['width']]+(ms_getTotalSize($i, o, 'width')*2));
3605		$c.css(o.d['height'], ms_getLargestSize($i, o, 'height'));
3606		return sz;
3607	}
3608
3609	//	measuring functions
3610	function ms_getSizes(i, o, wrapper) {
3611		return [ms_getTotalSize(i, o, 'width', wrapper), ms_getLargestSize(i, o, 'height', wrapper)];
3612	}
3613	function ms_getLargestSize(i, o, dim, wrapper) {
3614		if (!is_boolean(wrapper))
3615		{
3616			wrapper = false;
3617		}
3618		if (is_number(o[o.d[dim]]) && wrapper)
3619		{
3620			return o[o.d[dim]];
3621		}
3622		if (is_number(o.items[o.d[dim]]))
3623		{
3624			return o.items[o.d[dim]];
3625		}
3626		dim = (dim.toLowerCase().indexOf('width') > -1) ? 'outerWidth' : 'outerHeight';
3627		return ms_getTrueLargestSize(i, o, dim);
3628	}
3629	function ms_getTrueLargestSize(i, o, dim) {
3630		var s = 0;
3631
3632		for (var a = 0, l = i.length; a < l; a++)
3633		{
3634			var j = i.eq(a);
3635
3636			var m = (j.is(':visible')) ? j[o.d[dim]](true) : 0;
3637			if (s < m)
3638			{
3639				s = m;
3640			}
3641		}
3642		return s;
3643	}
3644
3645	function ms_getTotalSize(i, o, dim, wrapper) {
3646		if (!is_boolean(wrapper))
3647		{
3648			wrapper = false;
3649		}
3650		if (is_number(o[o.d[dim]]) && wrapper)
3651		{
3652			return o[o.d[dim]];
3653		}
3654		if (is_number(o.items[o.d[dim]]))
3655		{
3656			return o.items[o.d[dim]] * i.length;
3657		}
3658
3659		var d = (dim.toLowerCase().indexOf('width') > -1) ? 'outerWidth' : 'outerHeight',
3660			s = 0;
3661
3662		for (var a = 0, l = i.length; a < l; a++)
3663		{
3664			var j = i.eq(a);
3665			s += (j.is(':visible')) ? j[o.d[d]](true) : 0;
3666		}
3667		return s;
3668	}
3669	function ms_getParentSize($w, o, d) {
3670		var isVisible = $w.is(':visible');
3671		if (isVisible)
3672		{
3673			$w.hide();
3674		}
3675		var s = $w.parent()[o.d[d]]();
3676		if (isVisible)
3677		{
3678			$w.show();
3679		}
3680		return s;
3681	}
3682	function ms_getMaxDimension(o, a) {
3683		return (is_number(o[o.d['width']])) ? o[o.d['width']] : a;
3684	}
3685	function ms_hasVariableSizes(i, o, dim) {
3686		var s = false,
3687			v = false;
3688
3689		for (var a = 0, l = i.length; a < l; a++)
3690		{
3691			var j = i.eq(a);
3692
3693			var c = (j.is(':visible')) ? j[o.d[dim]](true) : 0;
3694			if (s === false)
3695			{
3696				s = c;
3697			}
3698			else if (s != c)
3699			{
3700				v = true;
3701			}
3702			if (s == 0)
3703			{
3704				v = true;
3705			}
3706		}
3707		return v;
3708	}
3709	function ms_getPaddingBorderMargin(i, o, d) {
3710		return i[o.d['outer'+d]](true) - i[o.d[d.toLowerCase()]]();
3711	}
3712	function ms_getPercentage(s, o) {
3713		if (is_percentage(o))
3714		{
3715			o = parseInt( o.slice(0, -1), 10 );
3716			if (!is_number(o))
3717			{
3718				return s;
3719			}
3720			s *= o/100;
3721		}
3722		return s;
3723	}
3724
3725	//	config functions
3726	function cf_e(n, c, pf, ns, rd) {
3727		if (!is_boolean(pf))
3728		{
3729			pf = true;
3730		}
3731		if (!is_boolean(ns))
3732		{
3733			ns = true;
3734		}
3735		if (!is_boolean(rd))
3736		{
3737			rd = false;
3738		}
3739
3740		if (pf)
3741		{
3742			n = c.events.prefix + n;
3743		}
3744		if (ns)
3745		{
3746			n = n +'.'+ c.events.namespace;
3747		}
3748		if (ns && rd)
3749		{
3750			n += c.serialNumber;
3751		}
3752
3753		return n;
3754	}
3755	function cf_c(n, c) {
3756		return (is_string(c.classnames[n])) ? c.classnames[n] : n;
3757	}
3758	function cf_mapWrapperSizes(ws, o, p) {
3759		if (!is_boolean(p))
3760		{
3761			p = true;
3762		}
3763		var pad = (o.usePadding && p) ? o.padding : [0, 0, 0, 0];
3764		var wra = {};
3765
3766		wra[o.d['width']] = ws[0] + pad[1] + pad[3];
3767		wra[o.d['height']] = ws[1] + pad[0] + pad[2];
3768
3769		return wra;
3770	}
3771	function cf_sortParams(vals, typs) {
3772		var arr = [];
3773		for (var a = 0, l1 = vals.length; a < l1; a++)
3774		{
3775			for (var b = 0, l2 = typs.length; b < l2; b++)
3776			{
3777				if (typs[b].indexOf(typeof vals[a]) > -1 && is_undefined(arr[b]))
3778				{
3779					arr[b] = vals[a];
3780					break;
3781				}
3782			}
3783		}
3784		return arr;
3785	}
3786	function cf_getPadding(p) {
3787		if (is_undefined(p))
3788		{
3789			return [0, 0, 0, 0];
3790		}
3791		if (is_number(p))
3792		{
3793			return [p, p, p, p];
3794		}
3795		if (is_string(p))
3796		{
3797			p = p.split('px').join('').split('em').join('').split(' ');
3798		}
3799
3800		if (!is_array(p))
3801		{
3802			return [0, 0, 0, 0];
3803		}
3804		for (var i = 0; i < 4; i++)
3805		{
3806			p[i] = parseInt(p[i], 10);
3807		}
3808		switch (p.length)
3809		{
3810			case 0:
3811				return [0, 0, 0, 0];
3812			case 1:
3813				return [p[0], p[0], p[0], p[0]];
3814			case 2:
3815				return [p[0], p[1], p[0], p[1]];
3816			case 3:
3817				return [p[0], p[1], p[2], p[1]];
3818			default:
3819				return [p[0], p[1], p[2], p[3]];
3820		}
3821	}
3822	function cf_getAlignPadding(itm, o) {
3823		var x = (is_number(o[o.d['width']])) ? Math.ceil(o[o.d['width']] - ms_getTotalSize(itm, o, 'width')) : 0;
3824		switch (o.align)
3825		{
3826			case 'left': 
3827				return [0, x];
3828			case 'right':
3829				return [x, 0];
3830			case 'center':
3831			default:
3832				return [Math.ceil(x/2), Math.floor(x/2)];
3833		}
3834	}
3835	function cf_getDimensions(o) {
3836		var dm = [
3837				['width'	, 'innerWidth'	, 'outerWidth'	, 'height'	, 'innerHeight'	, 'outerHeight'	, 'left', 'top'	, 'marginRight'	, 0, 1, 2, 3],
3838				['height'	, 'innerHeight'	, 'outerHeight'	, 'width'	, 'innerWidth'	, 'outerWidth'	, 'top'	, 'left', 'marginBottom', 3, 2, 1, 0]
3839			];
3840
3841		var dl = dm[0].length,
3842			dx = (o.direction == 'right' || o.direction == 'left') ? 0 : 1;
3843
3844		var dimensions = {};
3845		for (var d = 0; d < dl; d++)
3846		{
3847			dimensions[dm[0][d]] = dm[dx][d];
3848		}
3849		return dimensions;
3850	}
3851	function cf_getAdjust(x, o, a, $t) {
3852		var v = x;
3853		if (is_function(a))
3854		{
3855			v = a.call($t, v);
3856
3857		}
3858		else if (is_string(a))
3859		{
3860			var p = a.split('+'),
3861				m = a.split('-');
3862
3863			if (m.length > p.length)
3864			{
3865				var neg = true,
3866					sta = m[0],
3867					adj = m[1];
3868			}
3869			else
3870			{
3871				var neg = false,
3872					sta = p[0],
3873					adj = p[1];
3874			}
3875
3876			switch(sta)
3877			{
3878				case 'even':
3879					v = (x % 2 == 1) ? x-1 : x;
3880					break;
3881				case 'odd':
3882					v = (x % 2 == 0) ? x-1 : x;
3883					break;
3884				default:
3885					v = x;
3886					break;
3887			}
3888			adj = parseInt(adj, 10);
3889			if (is_number(adj))
3890			{
3891				if (neg)
3892				{
3893					adj = -adj;
3894				}
3895				v += adj;
3896			}
3897		}
3898		if (!is_number(v) || v < 1)
3899		{
3900			v = 1;
3901		}
3902		return v;
3903	}
3904	function cf_getItemsAdjust(x, o, a, $t) {
3905		return cf_getItemAdjustMinMax(cf_getAdjust(x, o, a, $t), o.items.visibleConf);
3906	}
3907	function cf_getItemAdjustMinMax(v, i) {
3908		if (is_number(i.min) && v < i.min)
3909		{
3910			v = i.min;
3911		}
3912		if (is_number(i.max) && v > i.max)
3913		{
3914			v = i.max;
3915		}
3916		if (v < 1)
3917		{
3918			v = 1;
3919		}
3920		return v;
3921	}
3922	function cf_getSynchArr(s) {
3923		if (!is_array(s))
3924		{
3925			s = [[s]];
3926		}
3927		if (!is_array(s[0]))
3928		{
3929			s = [s];
3930		}
3931		for (var j = 0, l = s.length; j < l; j++)
3932		{
3933			if (is_string(s[j][0]))
3934			{
3935				s[j][0] = $(s[j][0]);
3936			}
3937			if (!is_boolean(s[j][1]))
3938			{
3939				s[j][1] = true;
3940			}
3941			if (!is_boolean(s[j][2]))
3942			{
3943				s[j][2] = true;
3944			}
3945			if (!is_number(s[j][3]))
3946			{
3947				s[j][3] = 0;
3948			}
3949		}
3950		return s;
3951	}
3952	function cf_getKeyCode(k) {
3953		if (k == 'right')
3954		{
3955			return 39;
3956		}
3957		if (k == 'left')
3958		{
3959			return 37;
3960		}
3961		if (k == 'up')
3962		{
3963			return 38;
3964		}
3965		if (k == 'down')
3966		{
3967			return 40;
3968		}
3969		return -1;
3970	}
3971	function cf_setCookie(n, $c, c) {
3972		if (n)
3973		{
3974			var v = $c.triggerHandler(cf_e('currentPosition', c));
3975			$.fn.carouFredSel.cookie.set(n, v);
3976		}
3977	}
3978	function cf_getCookie(n) {
3979		var c = $.fn.carouFredSel.cookie.get(n);
3980		return (c == '') ? 0 : c;
3981	}
3982
3983	//	init function
3984	function in_mapCss($elem, props) {
3985		var css = {};
3986		for (var p = 0, l = props.length; p < l; p++)
3987		{
3988			css[props[p]] = $elem.css(props[p]);
3989		}
3990		return css;
3991	}
3992	function in_complementItems(obj, opt, itm, sta) {
3993		if (!is_object(obj.visibleConf))
3994		{
3995			obj.visibleConf = {};
3996		}
3997		if (!is_object(obj.sizesConf))
3998		{
3999			obj.sizesConf = {};
4000		}
4001
4002		if (obj.start == 0 && is_number(sta))
4003		{
4004			obj.start = sta;
4005		}
4006
4007		//	visible items
4008		if (is_object(obj.visible))
4009		{
4010			obj.visibleConf.min = obj.visible.min;
4011			obj.visibleConf.max = obj.visible.max;
4012			obj.visible = false;
4013		}
4014		else if (is_string(obj.visible))
4015		{
4016			//	variable visible items
4017			if (obj.visible == 'variable')
4018			{
4019				obj.visibleConf.variable = true;
4020			}
4021			//	adjust string visible items
4022			else
4023			{
4024				obj.visibleConf.adjust = obj.visible;
4025			}
4026			obj.visible = false;
4027		}
4028		else if (is_function(obj.visible))
4029		{
4030			obj.visibleConf.adjust = obj.visible;
4031			obj.visible = false;
4032		}
4033
4034		//	set items filter
4035		if (!is_string(obj.filter))
4036		{
4037			obj.filter = (itm.filter(':hidden').length > 0) ? ':visible' : '*';
4038		}
4039
4040		//	primary item-size not set
4041		if (!obj[opt.d['width']])
4042		{
4043			//	responsive carousel -> set to largest
4044			if (opt.responsive)
4045			{
4046				debug(true, 'Set a '+opt.d['width']+' for the items!');
4047				obj[opt.d['width']] = ms_getTrueLargestSize(itm, opt, 'outerWidth');
4048			}
4049			//	 non-responsive -> measure it or set to "variable"
4050			else
4051			{
4052				obj[opt.d['width']] = (ms_hasVariableSizes(itm, opt, 'outerWidth')) 
4053					? 'variable' 
4054					: itm[opt.d['outerWidth']](true);
4055			}
4056		}
4057
4058		//	secondary item-size not set -> measure it or set to "variable"
4059		if (!obj[opt.d['height']])
4060		{
4061			obj[opt.d['height']] = (ms_hasVariableSizes(itm, opt, 'outerHeight')) 
4062				? 'variable' 
4063				: itm[opt.d['outerHeight']](true);
4064		}
4065
4066		obj.sizesConf.width = obj.width;
4067		obj.sizesConf.height = obj.height;
4068		return obj;
4069	}
4070	function in_complementVisibleItems(opt, avl) {
4071		//	primary item-size variable -> set visible items variable
4072		if (opt.items[opt.d['width']] == 'variable')
4073		{
4074			opt.items.visibleConf.variable = true;
4075		}
4076		if (!opt.items.visibleConf.variable) {
4077			//	primary size is number -> calculate visible-items
4078			if (is_number(opt[opt.d['width']]))
4079			{
4080				opt.items.visible = Math.floor(opt[opt.d['width']] / opt.items[opt.d['width']]);
4081			}
4082			//	measure and calculate primary size and visible-items
4083			else
4084			{
4085				opt.items.visible = Math.floor(avl / opt.items[opt.d['width']]);
4086				opt[opt.d['width']] = opt.items.visible * opt.items[opt.d['width']];
4087				if (!opt.items.visibleConf.adjust)
4088				{
4089					opt.align = false;
4090				}
4091			}
4092			if (opt.items.visible == 'Infinity' || opt.items.visible < 1)
4093			{
4094				debug(true, 'Not a valid number of visible items: Set to "variable".');
4095				opt.items.visibleConf.variable = true;
4096			}
4097		}
4098		return opt;
4099	}
4100	function in_complementPrimarySize(obj, opt, all) {
4101		//	primary size set to auto -> measure largest item-size and set it
4102		if (obj == 'auto')
4103		{
4104			obj = ms_getTrueLargestSize(all, opt, 'outerWidth');
4105		}
4106		return obj;
4107	}
4108	function in_complementSecondarySize(obj, opt, all) {
4109		//	secondary size set to auto -> measure largest item-size and set it
4110		if (obj == 'auto')
4111		{
4112			obj = ms_getTrueLargestSize(all, opt, 'outerHeight');
4113		}
4114		//	secondary size not set -> set to secondary item-size
4115		if (!obj)
4116		{
4117			obj = opt.items[opt.d['height']];
4118		}
4119		return obj;
4120	}
4121	function in_getAlignPadding(o, all) {
4122		var p = cf_getAlignPadding(gi_getCurrentItems(all, o), o);
4123		o.padding[o.d[1]] = p[1];
4124		o.padding[o.d[3]] = p[0];
4125		return o;
4126	}
4127	function in_getResponsiveValues(o, all, avl) {
4128
4129		var visb = cf_getItemAdjustMinMax(Math.ceil(o[o.d['width']] / o.items[o.d['width']]), o.items.visibleConf);
4130		if (visb > all.length)
4131		{
4132			visb = all.length;
4133		}
4134
4135		var newS = Math.floor(o[o.d['width']]/visb);
4136
4137		o.items.visible = visb;
4138		o.items[o.d['width']] = newS;
4139		o[o.d['width']] = visb * newS;
4140		return o;
4141	}
4142
4143
4144	//	buttons functions
4145	function bt_pauseOnHoverConfig(p) {
4146		if (is_string(p))
4147		{
4148			var i = (p.indexOf('immediate') > -1) ? true : false,
4149				r = (p.indexOf('resume') 	> -1) ? true : false;
4150		}
4151		else
4152		{
4153			var i = r = false;
4154		}
4155		return [i, r];
4156	}
4157	function bt_mousesheelNumber(mw) {
4158		return (is_number(mw)) ? mw : null
4159	}
4160
4161	//	helper functions
4162	function is_null(a) {
4163		return (a === null);
4164	}
4165	function is_undefined(a) {
4166		return (is_null(a) || typeof a == 'undefined' || a === '' || a === 'undefined');
4167	}
4168	function is_array(a) {
4169		return (a instanceof Array);
4170	}
4171	function is_jquery(a) {
4172		return (a instanceof jQuery);
4173	}
4174	function is_object(a) {
4175		return ((a instanceof Object || typeof a == 'object') && !is_null(a) && !is_jquery(a) && !is_array(a) && !is_function(a));
4176	}
4177	function is_number(a) {
4178		return ((a instanceof Number || typeof a == 'number') && !isNaN(a));
4179	}
4180	function is_string(a) {
4181		return ((a instanceof String || typeof a == 'string') && !is_undefined(a) && !is_true(a) && !is_false(a));
4182	}
4183	function is_function(a) {
4184		return (a instanceof Function || typeof a == 'function');
4185	}
4186	function is_boolean(a) {
4187		return (a instanceof Boolean || typeof a == 'boolean' || is_true(a) || is_false(a));
4188	}
4189	function is_true(a) {
4190		return (a === true || a === 'true');
4191	}
4192	function is_false(a) {
4193		return (a === false || a === 'false');
4194	}
4195	function is_percentage(x) {
4196		return (is_string(x) && x.slice(-1) == '%');
4197	}
4198
4199
4200	function getTime() {
4201		return new Date().getTime();
4202	}
4203
4204	function deprecated( o, n ) {
4205		debug(true, o+' is DEPRECATED, support for it will be removed. Use '+n+' instead.');
4206	}
4207	function debug(d, m) {
4208		if (!is_undefined(window.console) && !is_undefined(window.console.log))
4209		{
4210			if (is_object(d))
4211			{
4212				var s = ' ('+d.selector+')';
4213				d = d.debug;
4214			}
4215			else
4216			{
4217				var s = '';
4218			}
4219			if (!d)
4220			{
4221				return false;
4222			}
4223	
4224			if (is_string(m))
4225			{
4226				m = 'carouFredSel'+s+': ' + m;
4227			}
4228			else
4229			{
4230				m = ['carouFredSel'+s+':', m];
4231			}
4232			window.console.log(m);
4233		}
4234		return false;
4235	}
4236
4237
4238
4239	//	EASING FUNCTIONS
4240	$.extend($.easing, {
4241		'quadratic': function(t) {
4242			var t2 = t * t;
4243			return t * (-t2 * t + 4 * t2 - 6 * t + 4);
4244		},
4245		'cubic': function(t) {
4246			return t * (4 * t * t - 9 * t + 6);
4247		},
4248		'elastic': function(t) {
4249			var t2 = t * t;
4250			return t * (33 * t2 * t2 - 106 * t2 * t + 126 * t2 - 67 * t + 15);
4251		}
4252	});
4253
4254
4255})(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.